coreci-chat-po
754222083c
feat(app): minimal root-layout shell - theme + env-config session providers
...
ci / test-pglite (PGlite, default) (push) Successful in 3m53s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Successful in 2m21s
ci / test-pglite (PGlite, default) (pull_request) Successful in 3m44s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Successful in 2m3s
M3 slice 1 (coreci-chat#16): wrap the root layout's children with a theme
provider (light/dark/system, persisted, no external dep) and a session
wrapper over @coreci/auth's session lane (identity via GET /api/me, client
config from NEXT_PUBLIC_API_BASE_URL, default same-origin). Additive only:
no redirects or gates, SSR pages keep server-side session resolution, and
no boot-time DDL (deploy owns DDL, app boots schema-check only). Pure
logic extracted to app/shell/_lib.ts + unit tests, repo Wave-J convention.
2026-11-03 18:57:24 +00:00
coreci-chat-po
410e62bd30
fix(app): teach the bundler the repo's .js -> .ts import convention
...
ci / test-pglite (PGlite, default) (push) Successful in 3m16s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Successful in 1m55s
ci / test-pglite (PGlite, default) (pull_request) Successful in 3m12s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Successful in 1m58s
The control-plane app follows the repo-wide ESM convention - a './x.js'
specifier for a './x.ts' source - in all 79 of its relative imports.
TypeScript resolves that (moduleResolution: bundler), webpack does not, so
the new `next build` gate step failed with "Module not found: Can't resolve
'../../../../lib/db.js'" on the first app build this repo ever ran.
resolve.extensionAlias maps a '.js' request to the '.ts'/'.tsx' source
behind it, so the bundler honours the same convention the type-checker and
the packages already do. One resolver-level change, no import churn.
Evidence: run 69747, job 72065 - the app-build step fails to compile with
5 module-not-found errors across 4 route files.
2026-10-31 01:14:05 +00:00
coreci-chat-po
b17e009dd5
fix(control-plane): drop the phantom @coreci/audit from transpilePackages
...
ci / test-pglite (PGlite, default) (push) Failing after 1m16s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Successful in 1m57s
ci / test-pglite (PGlite, default) (pull_request) Failing after 1m18s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Successful in 1m57s
`@coreci/audit` names a package that does not exist in this repo: the audit
code ships as @coreci/db/audit (packages/db/src/audit.ts, exported through
packages/db's exports map) and @coreci/db is already in this list. Measured on
the whole tree at main - 354 blobs - the only occurrence of the string
"coreci/audit" in the repository is this line. Next.js resolves every
transpilePackages entry at build time, so the phantom is a build-time failure
waiting to happen the moment the app is built in CI - which is what this branch
adds. Removing it costs nothing: no import anywhere references it.
2026-10-31 00:27:32 +00:00
coreci-chat-po
1c75282736
fix(test): add back the tenant-scoped DELETE that wipes mcp_adapters (coreci-chat#12)
ci / test-pglite (PGlite, default) (push) Failing after 1m51s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Failing after 1m34s
2026-10-27 06:58:48 +00:00
coreci-chat-po
05df13bf55
fix(test): wipe mcp_adapters with a tenant-scoped DELETE, not an ALTER (coreci-chat#12)
ci / test-pglite (PGlite, default) (push) Failing after 1m11s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Failing after 1m24s
ci / test-pglite (PGlite, default) (pull_request) Failing after 1m10s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Failing after 1m23s
2026-10-27 06:58:14 +00:00
coreci-chat-po
311dfe5ac0
fix(app): add the App Router root layout so the control-plane app can build (coreci-chat#10)
ci / test-pglite (PGlite, default) (push) Failing after 1m51s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Failing after 1m24s
ci / test-pglite (PGlite, default) (pull_request) Failing after 1m50s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Failing after 1m25s
2026-10-27 05:54:02 +00:00
coreci-chat-po
4b6ac59637
fix(app): skip the boot-time migration re-run when the schema is already migrated
...
ci / test-pglite (PGlite, default) (push) Failing after 1m49s
ci / test-postgres (Postgres 16, G-022 RLS) (push) Failing after 1m25s
ci / test-pglite (PGlite, default) (pull_request) Failing after 1m51s
ci / test-postgres (Postgres 16, G-022 RLS) (pull_request) Failing after 1m24s
The control-plane boot path re-runs the migrations as the connected role. In the CI
postgres job that role is coreci_app (NOBYPASSRLS, owns no tables), so the migration
DDL died with 'permission denied for schema public' and four control-plane suites
errored out (run 55485, job 57737). The migrations are applied by the migrator role
(`pnpm migrate` in CI, the deploy step in prod); the app role cannot DDL. The
boot-time re-run now skips when the schema is already there, which keeps it the dev
convenience it was meant to be (a fresh PGlite database has no schema yet).
2026-10-27 05:26:35 +00:00
CIAgent
0c15d3d0b2
docs(milestone): complete M2 — MCP Layer & Day 1 Adapters (v0.2)
...
M2 delivers the read-only MCP capability broker gateway and four Day-1
infrastructure adapters (Proxmox, SSH/Linux, GitHub, Gitea). 13 REQs (015-027)
all pass. 656 tests green. M1 non-regression verified.
MCP spec 2025-06-18 conformance verified (PROTOCOL.md + 7 tests).
Defense-in-depth SSH (broker layer 1 + Relay Agent layer 2 + no-shell exec).
Two-track LLM smoke (Track A mock-path P0 gate passes).
CI: Gitea Actions (.gitea/workflows/ci.yml) with Postgres 16 + RLS verification.
Phases shipped:
P0 pre-execution v0.1.0
P1 Wave F — MCP gateway v0.1.1
P2 Wave G — Proxmox v0.1.2
P3 Wave H — SSH/Linux v0.1.3
P4 Wave I — Git adapters v0.1.4
P5 Wave J — SSE+smoke+UI v0.1.5
P6 Final — review+ship v0.1.6 ← milestone release
---ci---
phase: 6
milestone: v0.2
status: complete
phase_role: final
milestone_complete: true
requirements:
covered: [REQ-015, REQ-016, REQ-017, REQ-018, REQ-019, REQ-020, REQ-021, REQ-022, REQ-023, REQ-024, REQ-025, REQ-026, REQ-027]
partial: []
---/ci---
2026-08-25 06:14:21 +00:00
CIAgent
dfc6b8ff76
feat(P5): Wave E dashboard surfacing — agent status, health, logs, audit export
...
REQ-014: surface relay agent health (green/yellow/red), target hostname,
last 100 log lines in admin dashboard. Per-tenant view under RLS.
---ci---
phase: 5
milestone: v0.1
status: execute
---/ci---
2026-08-25 02:21:51 +00:00
CIAgent
d0465a4c71
Merge phase/04-relay-agent into milestone/v0.1-bootstrap
...
Wave D (relay agent) complete.
---ci---
phase: 4
milestone: v0.1
status: complete
---/ci---
# Conflicts:
# apps/control-plane/lib/auth.ts
# apps/control-plane/lib/db.ts
# apps/control-plane/tsconfig.json
# apps/control-plane/vitest.config.ts
# pnpm-lock.yaml
2026-08-25 02:04:35 +00:00
CIAgent
a7bce7e44a
Merge phase/03-byom into milestone/v0.1-bootstrap
...
Wave C (BYOM) complete.
---ci---
phase: 3
milestone: v0.1
status: complete
---/ci---
# Conflicts:
# apps/control-plane/package.json
# apps/control-plane/tsconfig.json
# pnpm-lock.yaml
2026-08-25 02:04:16 +00:00
CIAgent
86f7dcc10b
feat(P4): Wave D relay agent — Go binary, install script, WebSocket, SSH whitelist hook
...
REQ-010: modular install script (detect_os/install_binary/write_systemd_unit/register_target)
REQ-011: outbound WebSocket from relay agent to SaaS
REQ-012: register with tenant + target metadata
REQ-013: heartbeat + exponential backoff reconnect (max 5 → alert)
REQ-026 partial: SSH whitelist file + CheckCommand hook (G-004 contract lock,
G-007 shadow exec.Cmd test, G-008 scope statement)
G-009: unsupported-OS abort with actionable error
---ci---
phase: 4
milestone: v0.1
status: execute
---/ci---
2026-08-25 02:03:04 +00:00
CIAgent
3b8345dfe0
feat(P3): Wave C BYOM — endpoint registry, validate-on-save, routing shim
...
REQ-006: configure BYOM endpoint (URL in DB, key in secret manager)
REQ-007: validate-on-save test inference call (OpenAI-compatible)
REQ-008: route all inference to BYOM (G-001: test-inference proxy endpoint)
REQ-009: reject when unconfigured/unreachable (ByomUnconfiguredError/ByomUnreachableError)
---ci---
phase: 3
milestone: v0.1
status: execute
---/ci---
2026-08-25 01:54:20 +00:00
CIAgent
bcca7686ee
feat(P2): Wave B identity & RBAC — WorkOS SSO, tenant provisioning, RBAC at gateway
...
REQ-001: SSO session via WorkOS (getAuthorizationUrl + exchangeCodeForSession)
REQ-002: tenant provisioning on first signup (admin role)
REQ-003: invitations via single-use acceptance link
REQ-004: RBAC role assignment (admin/operator/viewer)
REQ-005: RBAC enforcement at API gateway from first endpoint (/api/me)
---ci---
phase: 2
milestone: v0.1
status: execute
---/ci---
2026-08-25 01:47:56 +00:00
CIAgent
be70f56657
feat(P1): Wave A foundations — monorepo, DB+RLS, audit, secrets, runtime
...
Wave A (Phase 1) implements the M1 foundations for REQ-038, REQ-039, REQ-040:
Monorepo scaffold (pnpm workspaces, TS strict, NodeNext):
- apps/control-plane (Next.js App Router scaffold — Wave B adds routes)
- apps/relay-agent (Go module scaffold — Wave D adds WebSocket + install)
- packages/db, packages/secrets, packages/runtime, packages/config
packages/db (REQ-038, REQ-039):
- 0001_init.sql: tenants, users, tenant_memberships, targets, byom_endpoints,
invitations, audit_log (append-only hash-chain), runtime_health (not audited)
- RLS policies on all tenant-scoped tables + FORCE ROW LEVEL SECURITY
- withTenant(tenantId, fn): SET LOCAL app.tenant_id + transaction
- audit.ts: appendAudit with sha256(prev_hash || canonical(payload)) chain;
AuditWriteHaltError on write failure (Edge 7 — halts + rolls back)
- BEFORE INSERT trigger enforces chain integrity (G-006: per-tenant
concurrent-write serialization documented; M3 mitigation noted)
- create-db.ts: PGlite (dev/test) + pg Pool (prod) behind DbClient interface
- pen-test scaffold: cross-tenant isolation (PGlite RLS limitation documented;
prod RLS test runs at M1 review)
- 12 tests, 98% coverage
packages/secrets (REQ-040, G-005, G-010):
- SecretProvider interface: get/put/delete + SecretRef + SecretValue
(toString returns [REDACTED]; unwrap is the only read path)
- AwsSecretsManagerProvider (prod): coreci/<tenantId>/<name>, KMS-backed
- LocalEncryptedProvider (dev): AES-256-GCM, PBKDF2 from SECRET_MASTER_KEY_DEV
- relay-token.ts: JWT HS256 sign/verify/issue (G-005 contract — locked so
Wave B + Wave D parallelize without blocking)
- 24 tests (14 provider + 10 relay-token)
packages/runtime (G-002, G-003):
- Trigger.dev bootstrap (initRuntime) — pre-investment for M3 (G-003)
- runtimeHealthCheck task: writes to runtime_health, NOT audit_log (G-002)
- 6 tests
packages/config (G-010):
- Two-tier credential taxonomy: infra env vars (tier a) vs tenant creds
(SecretProvider only, tier b). PO's 'no env vars' applies to tenant creds.
Coverage: db 98%, secrets/runtime/config typecheck clean.
All 45 tests passing. Go relay-agent builds.
---ci---
phase: 1
milestone: v0.1
status: verify
---/ci---
2026-08-25 01:29:25 +00:00