@cleocode/core 2026.3.76 → 2026.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/agent-schema.d.ts.map +1 -1
- package/dist/audit.d.ts +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/bootstrap.d.ts +2 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/caamp/adapter.d.ts +6 -49
- package/dist/caamp/adapter.d.ts.map +1 -1
- package/dist/caamp/index.d.ts +2 -2
- package/dist/caamp/index.d.ts.map +1 -1
- package/dist/code/index.d.ts +10 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/outline.d.ts +51 -0
- package/dist/code/outline.d.ts.map +1 -0
- package/dist/code/parser.d.ts +32 -0
- package/dist/code/parser.d.ts.map +1 -0
- package/dist/code/search.d.ts +42 -0
- package/dist/code/search.d.ts.map +1 -0
- package/dist/code/unfold.d.ts +44 -0
- package/dist/code/unfold.d.ts.map +1 -0
- package/dist/compliance/protocol-enforcement.d.ts +1 -1
- package/dist/compliance/protocol-rules.d.ts +1 -1
- package/dist/compliance/protocol-types.d.ts +2 -3
- package/dist/compliance/protocol-types.d.ts.map +1 -1
- package/dist/conduit/conduit-client.d.ts +14 -0
- package/dist/conduit/conduit-client.d.ts.map +1 -1
- package/dist/conduit/factory.d.ts +11 -1
- package/dist/conduit/factory.d.ts.map +1 -1
- package/dist/conduit/http-transport.d.ts +17 -5
- package/dist/conduit/http-transport.d.ts.map +1 -1
- package/dist/conduit/index.d.ts +5 -2
- package/dist/conduit/index.d.ts.map +1 -1
- package/dist/conduit/local-transport.d.ts +91 -0
- package/dist/conduit/local-transport.d.ts.map +1 -0
- package/dist/conduit/sse-transport.d.ts +68 -0
- package/dist/conduit/sse-transport.d.ts.map +1 -0
- package/dist/crypto/credentials.d.ts.map +1 -1
- package/dist/error-catalog.d.ts +3 -3
- package/dist/error-catalog.d.ts.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/hooks/handlers/index.d.ts +2 -2
- package/dist/hooks/handlers/index.d.ts.map +1 -1
- package/dist/hooks/handlers/notification-hooks.d.ts +31 -0
- package/dist/hooks/handlers/notification-hooks.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4646 -3476
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts +6 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/injection.d.ts.map +1 -1
- package/dist/internal.d.ts +7 -5
- package/dist/internal.d.ts.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/tree-sitter-languages.d.ts +29 -0
- package/dist/lib/tree-sitter-languages.d.ts.map +1 -0
- package/dist/logger.d.ts +3 -3
- package/dist/memory/brain-links.d.ts.map +1 -1
- package/dist/memory/brain-maintenance.d.ts +13 -0
- package/dist/memory/brain-maintenance.d.ts.map +1 -1
- package/dist/memory/brain-retrieval.d.ts +1 -1
- package/dist/memory/brain-retrieval.d.ts.map +1 -1
- package/dist/memory/decisions.d.ts.map +1 -1
- package/dist/memory/engine-compat.d.ts +392 -25
- package/dist/memory/engine-compat.d.ts.map +1 -1
- package/dist/memory/index.d.ts +416 -3
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/metrics/token-service.d.ts +3 -3
- package/dist/metrics/token-service.d.ts.map +1 -1
- package/dist/orchestration/hierarchy.d.ts +32 -0
- package/dist/orchestration/hierarchy.d.ts.map +1 -0
- package/dist/orchestration/index.d.ts +1 -0
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/paths.d.ts +335 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/routing/capability-matrix.d.ts +3 -3
- package/dist/routing/capability-matrix.d.ts.map +1 -1
- package/dist/scaffold.d.ts +422 -11
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/security/input-sanitization.d.ts +2 -2
- package/dist/skills/dynamic-skill-generator.d.ts +3 -2
- package/dist/skills/dynamic-skill-generator.d.ts.map +1 -1
- package/dist/skills/routing-table.d.ts +4 -4
- package/dist/skills/routing-table.d.ts.map +1 -1
- package/dist/store/agent-registry-accessor.d.ts +10 -433
- package/dist/store/agent-registry-accessor.d.ts.map +1 -1
- package/dist/store/cross-db-cleanup.d.ts +34 -0
- package/dist/store/cross-db-cleanup.d.ts.map +1 -1
- package/dist/store/provider.d.ts +1 -1
- package/dist/store/signaldock-sqlite.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite.d.ts +1 -1
- package/dist/store/task-store.d.ts.map +1 -1
- package/dist/store/tasks-schema.d.ts +4 -228
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/validation-schemas.d.ts +4 -5
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/system/archive-analytics.d.ts +1 -1
- package/dist/system/health.d.ts +2 -2
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/runtime.d.ts +2 -1
- package/dist/system/runtime.d.ts.map +1 -1
- package/dist/tasks/list.d.ts +1 -1
- package/dist/tasks/list.d.ts.map +1 -1
- package/dist/tasks/task-ops.d.ts +415 -3
- package/dist/tasks/task-ops.d.ts.map +1 -1
- package/dist/templates/parser.d.ts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/upgrade.d.ts +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/validation/operation-gate-validators.d.ts +1 -1
- package/dist/validation/operation-verification-gates.d.ts +3 -3
- package/dist/validation/param-utils.d.ts +6 -5
- package/dist/validation/param-utils.d.ts.map +1 -1
- package/dist/validation/validate-ops.d.ts +1 -1
- package/dist/validation/validate-ops.d.ts.map +1 -1
- package/package.json +19 -7
- package/src/__tests__/caamp-skill-install.test.js +0 -15
- package/src/__tests__/caamp-skill-install.test.js.map +1 -1
- package/src/__tests__/caamp-skill-install.test.ts +0 -16
- package/src/__tests__/injection-mvi-tiers.test.js +7 -7
- package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
- package/src/__tests__/injection-mvi-tiers.test.ts +55 -103
- package/src/agents/agent-schema.ts +2 -5
- package/src/audit.ts +2 -2
- package/src/bootstrap.ts +5 -39
- package/src/caamp/adapter.ts +3 -219
- package/src/caamp/index.ts +1 -13
- package/src/cant/__tests__/cant-agent-parse.test.d.ts.map +1 -0
- package/src/cant/__tests__/cant-agent-parse.test.js +77 -0
- package/src/cant/__tests__/cant-agent-parse.test.js.map +1 -0
- package/src/code/index.ts +10 -0
- package/src/code/outline.ts +214 -0
- package/src/code/parser.ts +331 -0
- package/src/code/search.ts +173 -0
- package/src/code/unfold.ts +204 -0
- package/src/codebase-map/analyzers/architecture.ts +2 -2
- package/src/compliance/protocol-enforcement.ts +1 -1
- package/src/compliance/protocol-rules.ts +1 -1
- package/src/compliance/protocol-types.ts +2 -3
- package/src/conduit/__tests__/dual-api-e2e.test.d.ts.map +1 -0
- package/src/conduit/__tests__/dual-api-e2e.test.js +178 -0
- package/src/conduit/__tests__/dual-api-e2e.test.js.map +1 -0
- package/src/conduit/__tests__/dual-api-e2e.test.ts +212 -0
- package/src/conduit/__tests__/local-credential-flow.test.d.ts.map +1 -0
- package/src/conduit/__tests__/local-credential-flow.test.js +185 -0
- package/src/conduit/__tests__/local-credential-flow.test.js.map +1 -0
- package/src/conduit/__tests__/local-credential-flow.test.ts +230 -0
- package/src/conduit/__tests__/local-transport.test.d.ts.map +1 -0
- package/src/conduit/__tests__/local-transport.test.js +404 -0
- package/src/conduit/__tests__/local-transport.test.js.map +1 -0
- package/src/conduit/__tests__/local-transport.test.ts +509 -0
- package/src/conduit/__tests__/sse-transport.test.d.ts.map +1 -0
- package/src/conduit/__tests__/sse-transport.test.js +291 -0
- package/src/conduit/__tests__/sse-transport.test.js.map +1 -0
- package/src/conduit/__tests__/sse-transport.test.ts +344 -0
- package/src/conduit/conduit-client.ts +14 -0
- package/src/conduit/factory.ts +29 -8
- package/src/conduit/http-transport.ts +78 -16
- package/src/conduit/index.ts +5 -2
- package/src/conduit/local-transport.ts +309 -0
- package/src/conduit/sse-transport.ts +382 -0
- package/src/crypto/credentials.ts +59 -13
- package/src/error-catalog.ts +3 -3
- package/src/errors.ts +1 -1
- package/src/hooks/__tests__/provider-hooks.test.js +4 -4
- package/src/hooks/__tests__/provider-hooks.test.js.map +1 -1
- package/src/hooks/__tests__/provider-hooks.test.ts +4 -4
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +2 -2
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +1 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +6 -4
- package/src/hooks/handlers/index.ts +2 -6
- package/src/hooks/handlers/notification-hooks.ts +65 -0
- package/src/index.ts +2 -1
- package/src/init.ts +14 -54
- package/src/injection.ts +4 -3
- package/src/internal.ts +7 -5
- package/src/lib/index.ts +8 -0
- package/src/lib/tree-sitter-languages.ts +88 -0
- package/src/logger.ts +5 -5
- package/src/memory/__tests__/brain-links.test.js +13 -0
- package/src/memory/__tests__/brain-links.test.js.map +1 -1
- package/src/memory/__tests__/brain-links.test.ts +14 -0
- package/src/memory/__tests__/brain-retrieval.test.js +9 -0
- package/src/memory/__tests__/brain-retrieval.test.js.map +1 -1
- package/src/memory/__tests__/brain-retrieval.test.ts +10 -0
- package/src/memory/__tests__/session-memory.test.js +16 -0
- package/src/memory/__tests__/session-memory.test.js.map +1 -1
- package/src/memory/__tests__/session-memory.test.ts +17 -0
- package/src/memory/brain-links.ts +17 -0
- package/src/memory/brain-maintenance.ts +33 -1
- package/src/memory/brain-retrieval.ts +19 -3
- package/src/memory/decisions.ts +18 -2
- package/src/memory/engine-compat.ts +392 -25
- package/src/memory/index.ts +417 -4
- package/src/metrics/token-service.ts +4 -4
- package/src/migration/index.ts +1 -1
- package/src/orchestration/hierarchy.ts +202 -0
- package/src/orchestration/index.ts +1 -0
- package/src/paths.ts +340 -5
- package/src/routing/capability-matrix.ts +49 -49
- package/src/scaffold.ts +428 -70
- package/src/security/input-sanitization.ts +4 -4
- package/src/sessions/__tests__/session-grade.integration.test.js +9 -9
- package/src/sessions/__tests__/session-grade.integration.test.ts +9 -9
- package/src/sessions/__tests__/session-grade.test.js +10 -10
- package/src/sessions/__tests__/session-grade.test.js.map +1 -1
- package/src/sessions/__tests__/session-grade.test.ts +10 -10
- package/src/sessions/session-grade.ts +4 -4
- package/src/skills/__tests__/dynamic-skill-generator.test.js +24 -26
- package/src/skills/__tests__/dynamic-skill-generator.test.js.map +1 -1
- package/src/skills/__tests__/dynamic-skill-generator.test.ts +24 -26
- package/src/skills/__tests__/routing-table.test.js +22 -22
- package/src/skills/__tests__/routing-table.test.js.map +1 -1
- package/src/skills/__tests__/routing-table.test.ts +23 -23
- package/src/skills/dynamic-skill-generator.ts +13 -24
- package/src/skills/routing-table.ts +4 -4
- package/src/store/__tests__/data-safety-central.test.js +8 -0
- package/src/store/__tests__/data-safety-central.test.js.map +1 -1
- package/src/store/__tests__/data-safety-central.test.ts +8 -0
- package/src/store/__tests__/safety-accessor.test.js +8 -0
- package/src/store/__tests__/safety-accessor.test.js.map +1 -1
- package/src/store/__tests__/safety-accessor.test.ts +8 -0
- package/src/store/agent-registry-accessor.ts +284 -108
- package/src/store/cross-db-cleanup.ts +175 -1
- package/src/store/provider.ts +2 -2
- package/src/store/signaldock-sqlite.ts +262 -60
- package/src/store/sqlite-data-accessor.ts +3 -0
- package/src/store/sqlite.ts +2 -2
- package/src/store/task-store.ts +8 -1
- package/src/store/tasks-schema.ts +5 -40
- package/src/system/__tests__/health.test.js +2 -2
- package/src/system/__tests__/health.test.js.map +1 -1
- package/src/system/__tests__/health.test.ts +2 -2
- package/src/system/archive-analytics.ts +1 -1
- package/src/system/health.ts +43 -19
- package/src/system/inject-generate.ts +20 -20
- package/src/system/runtime.ts +5 -4
- package/src/tasks/atomicity.ts +1 -1
- package/src/tasks/list.ts +1 -1
- package/src/tasks/task-ops.ts +415 -3
- package/src/templates/parser.ts +1 -1
- package/src/ui/index.ts +4 -4
- package/src/upgrade.ts +3 -14
- package/src/validation/operation-gate-validators.ts +1 -1
- package/src/validation/operation-verification-gates.ts +3 -3
- package/src/validation/param-utils.ts +11 -10
- package/src/validation/validate-ops.ts +6 -6
- package/templates/CLEO-INJECTION.md +38 -110
- package/dist/hooks/handlers/mcp-hooks.d.ts +0 -48
- package/dist/hooks/handlers/mcp-hooks.d.ts.map +0 -1
- package/dist/mcp/index.d.ts +0 -42
- package/dist/mcp/index.d.ts.map +0 -1
- package/src/__tests__/audit-prune.test.d.ts +0 -2
- package/src/__tests__/caamp-skill-install.test.d.ts +0 -14
- package/src/__tests__/cli-mcp-parity.integration.test.d.ts +0 -34
- package/src/__tests__/cli-mcp-parity.integration.test.d.ts.map +0 -1
- package/src/__tests__/cli-mcp-parity.integration.test.js +0 -898
- package/src/__tests__/cli-mcp-parity.integration.test.js.map +0 -1
- package/src/__tests__/cli-parity.test.d.ts +0 -9
- package/src/__tests__/config.test.d.ts +0 -7
- package/src/__tests__/core-parity.test.d.ts +0 -17
- package/src/__tests__/error-catalog.test.d.ts +0 -2
- package/src/__tests__/golden-parity.test.d.ts +0 -12
- package/src/__tests__/hooks.test.d.ts +0 -5
- package/src/__tests__/human-output.test.d.ts +0 -12
- package/src/__tests__/index-api-compat.test.d.ts +0 -2
- package/src/__tests__/init-e2e.test.d.ts +0 -12
- package/src/__tests__/injection-chain.test.d.ts +0 -18
- package/src/__tests__/injection-mvi-tiers.test.d.ts +0 -14
- package/src/__tests__/injection-shared.test.d.ts +0 -10
- package/src/__tests__/lafs-conformance.test.d.ts +0 -18
- package/src/__tests__/logger.test.d.ts +0 -2
- package/src/__tests__/mcp-install-verify.test.d.ts +0 -13
- package/src/__tests__/mcp-install-verify.test.d.ts.map +0 -1
- package/src/__tests__/mcp-install-verify.test.js +0 -177
- package/src/__tests__/mcp-install-verify.test.js.map +0 -1
- package/src/__tests__/mcp-install-verify.test.ts +0 -217
- package/src/__tests__/paths.test.d.ts +0 -7
- package/src/__tests__/project-info.test.d.ts +0 -2
- package/src/__tests__/rcsd-pipeline-e2e.test.d.ts +0 -14
- package/src/__tests__/remote.test.d.ts +0 -6
- package/src/__tests__/scaffold.test.d.ts +0 -6
- package/src/__tests__/schema-management.test.d.ts +0 -5
- package/src/__tests__/schema.test.d.ts +0 -2
- package/src/__tests__/sharing.test.d.ts +0 -6
- package/src/__tests__/snapshot.test.d.ts +0 -6
- package/src/__tests__/upgrade.test.d.ts +0 -7
- package/src/adapters/__tests__/discovery.test.d.ts +0 -6
- package/src/adapters/__tests__/manager.test.d.ts +0 -6
- package/src/agents/__tests__/agent-registry.test.d.ts +0 -12
- package/src/agents/__tests__/capacity.test.d.ts +0 -7
- package/src/agents/__tests__/execution-learning.test.d.ts +0 -14
- package/src/agents/__tests__/health-monitor.test.d.ts +0 -10
- package/src/agents/__tests__/registry.test.d.ts +0 -8
- package/src/agents/__tests__/retry.test.d.ts +0 -7
- package/src/compliance/__tests__/sync.test.d.ts +0 -5
- package/src/hooks/__tests__/provider-hooks.test.d.ts +0 -2
- package/src/hooks/__tests__/registry.test.d.ts +0 -2
- package/src/hooks/handlers/__tests__/error-hooks.test.d.ts +0 -2
- package/src/hooks/handlers/__tests__/file-hooks.test.d.ts +0 -2
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts +0 -13
- package/src/hooks/handlers/__tests__/mcp-hooks.test.d.ts +0 -2
- package/src/hooks/handlers/__tests__/mcp-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/mcp-hooks.test.js +0 -119
- package/src/hooks/handlers/__tests__/mcp-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/mcp-hooks.test.ts +0 -150
- package/src/hooks/handlers/__tests__/session-hooks.test.d.ts +0 -2
- package/src/hooks/handlers/__tests__/task-hooks.test.d.ts +0 -2
- package/src/hooks/handlers/mcp-hooks.ts +0 -162
- package/src/intelligence/__tests__/adaptive-validation.test.d.ts +0 -11
- package/src/intelligence/__tests__/impact.test.d.ts +0 -16
- package/src/intelligence/__tests__/patterns.test.d.ts +0 -8
- package/src/intelligence/__tests__/prediction.test.d.ts +0 -8
- package/src/lib/__tests__/retry.test.d.ts +0 -7
- package/src/lifecycle/__tests__/chain-store.test.d.ts +0 -10
- package/src/lifecycle/__tests__/consolidate-rcasd.test.d.ts +0 -7
- package/src/lifecycle/__tests__/default-chain.test.d.ts +0 -7
- package/src/lifecycle/__tests__/frontmatter.test.d.ts +0 -7
- package/src/lifecycle/__tests__/lifecycle.test.d.ts +0 -7
- package/src/lifecycle/__tests__/pipeline.integration.test.d.ts +0 -19
- package/src/lifecycle/__tests__/rcasd-paths.test.d.ts +0 -7
- package/src/lifecycle/__tests__/resume-schema-contract.test.d.ts +0 -16
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.d.ts +0 -7
- package/src/lifecycle/__tests__/tessera-engine.test.d.ts +0 -10
- package/src/mcp/index.ts +0 -163
- package/src/memory/__tests__/auto-extract.test.d.ts +0 -7
- package/src/memory/__tests__/brain-automation.test.d.ts +0 -11
- package/src/memory/__tests__/brain-embedding.test.d.ts +0 -2
- package/src/memory/__tests__/brain-links.test.d.ts +0 -8
- package/src/memory/__tests__/brain-migration.test.d.ts +0 -8
- package/src/memory/__tests__/brain-retrieval.test.d.ts +0 -10
- package/src/memory/__tests__/brain-search.test.d.ts +0 -8
- package/src/memory/__tests__/claude-mem-migration.test.d.ts +0 -12
- package/src/memory/__tests__/decisions.test.d.ts +0 -8
- package/src/memory/__tests__/engine-compat.test.d.ts +0 -12
- package/src/memory/__tests__/memory-bridge.test.d.ts +0 -10
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.d.ts +0 -13
- package/src/memory/__tests__/session-memory.test.d.ts +0 -9
- package/src/metrics/__tests__/model-provider-registry.test.d.ts +0 -2
- package/src/metrics/__tests__/provider-detection.test.d.ts +0 -2
- package/src/migration/__tests__/checksum.test.d.ts +0 -8
- package/src/migration/__tests__/logger.test.d.ts +0 -5
- package/src/migration/__tests__/migration-failure.integration.test.d.ts +0 -15
- package/src/migration/__tests__/migration.test.d.ts +0 -13
- package/src/migration/__tests__/state.test.d.ts +0 -8
- package/src/migration/__tests__/validate.test.d.ts +0 -8
- package/src/nexus/__tests__/deps.test.d.ts +0 -7
- package/src/nexus/__tests__/nexus-e2e.test.d.ts +0 -12
- package/src/nexus/__tests__/permissions.test.d.ts +0 -7
- package/src/nexus/__tests__/query.test.d.ts +0 -7
- package/src/nexus/__tests__/reconcile.test.d.ts +0 -7
- package/src/nexus/__tests__/registry.test.d.ts +0 -7
- package/src/nexus/__tests__/transfer.test.d.ts +0 -8
- package/src/observability/__tests__/index.test.d.ts +0 -7
- package/src/observability/__tests__/log-filter.test.d.ts +0 -7
- package/src/observability/__tests__/log-parser.test.d.ts +0 -7
- package/src/observability/__tests__/log-reader.test.d.ts +0 -7
- package/src/orchestration/__tests__/autonomous-spec.test.d.ts +0 -9
- package/src/orchestration/__tests__/orchestration.test.d.ts +0 -7
- package/src/orchestration/__tests__/protocol-validators.test.d.ts +0 -9
- package/src/phases/__tests__/deps.test.d.ts +0 -7
- package/src/phases/__tests__/phases.test.d.ts +0 -7
- package/src/release/__tests__/artifacts.test.d.ts +0 -7
- package/src/release/__tests__/cancel-release.test.d.ts +0 -10
- package/src/release/__tests__/changelog-writer.test.d.ts +0 -6
- package/src/release/__tests__/push-policy.test.d.ts +0 -14
- package/src/release/__tests__/release.test.d.ts +0 -11
- package/src/sequence/__tests__/allocate.test.d.ts +0 -6
- package/src/sessions/__tests__/briefing-blocked.test.d.ts +0 -6
- package/src/sessions/__tests__/briefing.test.d.ts +0 -11
- package/src/sessions/__tests__/handoff-integration.test.d.ts +0 -8
- package/src/sessions/__tests__/handoff.test.d.ts +0 -11
- package/src/sessions/__tests__/index.test.d.ts +0 -2
- package/src/sessions/__tests__/session-cleanup.test.d.ts +0 -7
- package/src/sessions/__tests__/session-edge-cases.test.d.ts +0 -9
- package/src/sessions/__tests__/session-find.test.d.ts +0 -9
- package/src/sessions/__tests__/session-grade.integration.test.d.ts +0 -11
- package/src/sessions/__tests__/session-grade.test.d.ts +0 -6
- package/src/sessions/__tests__/session-memory-bridge.test.d.ts +0 -2
- package/src/sessions/__tests__/sessions.test.d.ts +0 -7
- package/src/skills/__tests__/discovery.test.d.ts +0 -6
- package/src/skills/__tests__/dispatch.test.d.ts +0 -6
- package/src/skills/__tests__/dynamic-skill-generator.test.d.ts +0 -2
- package/src/skills/__tests__/manifests.test.d.ts +0 -6
- package/src/skills/__tests__/precedence.test.d.ts +0 -6
- package/src/skills/__tests__/routing-table.test.d.ts +0 -2
- package/src/skills/__tests__/skill-paths.test.d.ts +0 -7
- package/src/skills/__tests__/test-utility.test.d.ts +0 -7
- package/src/skills/__tests__/token.test.d.ts +0 -6
- package/src/skills/__tests__/validation.test.d.ts +0 -6
- package/src/skills/__tests__/version.test.d.ts +0 -5
- package/src/skills/injection/__tests__/subagent.test.d.ts +0 -2
- package/src/skills/orchestrator/__tests__/spawn-tier.test.d.ts +0 -2
- package/src/spawn/__tests__/adapter-registry.test.d.ts +0 -2
- package/src/stats/__tests__/stats.test.d.ts +0 -7
- package/src/sticky/__tests__/purge.test.d.ts +0 -9
- package/src/store/__tests__/atomic.test.d.ts +0 -7
- package/src/store/__tests__/backup.test.d.ts +0 -7
- package/src/store/__tests__/brain-accessor-pageindex.test.d.ts +0 -12
- package/src/store/__tests__/brain-accessor.test.d.ts +0 -10
- package/src/store/__tests__/brain-pageindex.test.d.ts +0 -11
- package/src/store/__tests__/brain-schema.test.d.ts +0 -11
- package/src/store/__tests__/brain-vec.test.d.ts +0 -11
- package/src/store/__tests__/collision-detection.test.d.ts +0 -11
- package/src/store/__tests__/data-safety-central.test.d.ts +0 -20
- package/src/store/__tests__/db-helpers.test.d.ts +0 -7
- package/src/store/__tests__/e2e-safety-integration.test.d.ts +0 -13
- package/src/store/__tests__/git-checkpoint.test.d.ts +0 -7
- package/src/store/__tests__/idempotent-migration.test.d.ts +0 -5
- package/src/store/__tests__/import-logging.test.d.ts +0 -7
- package/src/store/__tests__/import-sort.test.d.ts +0 -7
- package/src/store/__tests__/json.test.d.ts +0 -7
- package/src/store/__tests__/lifecycle-schema-parity.test.d.ts +0 -2
- package/src/store/__tests__/migration-integration.test.d.ts +0 -15
- package/src/store/__tests__/migration-retry.test.d.ts +0 -10
- package/src/store/__tests__/migration-safety.test.d.ts +0 -21
- package/src/store/__tests__/migration-sqlite.test.d.ts +0 -11
- package/src/store/__tests__/performance-safety.test.d.ts +0 -17
- package/src/store/__tests__/project-detect.test.d.ts +0 -6
- package/src/store/__tests__/project-registry.test.d.ts +0 -7
- package/src/store/__tests__/provider.test.d.ts +0 -9
- package/src/store/__tests__/relations.test.d.ts +0 -9
- package/src/store/__tests__/safety-accessor.test.d.ts +0 -18
- package/src/store/__tests__/sequence-validation.test.d.ts +0 -11
- package/src/store/__tests__/session-store.test.d.ts +0 -11
- package/src/store/__tests__/sqlite-backup.test.d.ts +0 -14
- package/src/store/__tests__/sqlite.test.d.ts +0 -11
- package/src/store/__tests__/task-store.test.d.ts +0 -11
- package/src/store/__tests__/test-db-helper.d.ts +0 -61
- package/src/store/__tests__/write-verification.test.d.ts +0 -11
- package/src/system/__tests__/cleanup.test.d.ts +0 -2
- package/src/system/__tests__/health.test.d.ts +0 -2
- package/src/task-work/__tests__/start-deps.test.d.ts +0 -6
- package/src/tasks/__tests__/add.test.d.ts +0 -7
- package/src/tasks/__tests__/archive.test.d.ts +0 -7
- package/src/tasks/__tests__/assignee.test.d.ts +0 -14
- package/src/tasks/__tests__/atomicity.test.d.ts +0 -6
- package/src/tasks/__tests__/cancel-ops.test.d.ts +0 -7
- package/src/tasks/__tests__/complete-unblocks.test.d.ts +0 -6
- package/src/tasks/__tests__/complete.test.d.ts +0 -7
- package/src/tasks/__tests__/delete.test.d.ts +0 -7
- package/src/tasks/__tests__/dependency-check.test.d.ts +0 -7
- package/src/tasks/__tests__/deps-ready.test.d.ts +0 -6
- package/src/tasks/__tests__/epic-enforcement.test.d.ts +0 -15
- package/src/tasks/__tests__/find.test.d.ts +0 -7
- package/src/tasks/__tests__/graph-ops.test.d.ts +0 -7
- package/src/tasks/__tests__/hierarchy-policy.test.d.ts +0 -6
- package/src/tasks/__tests__/hierarchy.test.d.ts +0 -7
- package/src/tasks/__tests__/id-generator.test.d.ts +0 -2
- package/src/tasks/__tests__/labels.test.d.ts +0 -7
- package/src/tasks/__tests__/list.test.d.ts +0 -7
- package/src/tasks/__tests__/minimal-test.test.d.ts +0 -2
- package/src/tasks/__tests__/phase-tracking.test.d.ts +0 -7
- package/src/tasks/__tests__/pipeline-stage.test.d.ts +0 -14
- package/src/tasks/__tests__/plan-priority.test.d.ts +0 -10
- package/src/tasks/__tests__/priority-normalization.test.d.ts +0 -7
- package/src/tasks/__tests__/relates.test.d.ts +0 -9
- package/src/tasks/__tests__/show-deps.test.d.ts +0 -6
- package/src/tasks/__tests__/show.test.d.ts +0 -7
- package/src/tasks/__tests__/staleness.test.d.ts +0 -7
- package/src/tasks/__tests__/task-ops-depends.test.d.ts +0 -6
- package/src/tasks/__tests__/update.test.d.ts +0 -7
- package/src/validation/__tests__/chain-validation.test.d.ts +0 -7
- package/src/validation/__tests__/compliance.test.d.ts +0 -7
- package/src/validation/__tests__/docs-sync.test.d.ts +0 -7
- package/src/validation/__tests__/doctor-gitignore.test.d.ts +0 -7
- package/src/validation/__tests__/doctor-injection.test.d.ts +0 -11
- package/src/validation/__tests__/doctor.test.d.ts +0 -7
- package/src/validation/__tests__/engine.test.d.ts +0 -7
- package/src/validation/__tests__/manifest.test.d.ts +0 -7
- package/src/validation/__tests__/protocol-common.test.d.ts +0 -7
- package/src/validation/__tests__/verification.test.d.ts +0 -7
|
@@ -13,11 +13,10 @@
|
|
|
13
13
|
* @task T223
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { existsSync, mkdirSync
|
|
16
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
17
17
|
import { createRequire } from 'node:module';
|
|
18
18
|
import { dirname, join } from 'node:path';
|
|
19
19
|
import type { DatabaseSync } from 'node:sqlite';
|
|
20
|
-
import { fileURLToPath } from 'node:url';
|
|
21
20
|
import { getCleoDirAbsolute } from '../paths.js';
|
|
22
21
|
|
|
23
22
|
const _require = createRequire(import.meta.url);
|
|
@@ -39,45 +38,245 @@ export function getSignaldockDbPath(cwd?: string): string {
|
|
|
39
38
|
return join(cleoDir, DB_FILENAME);
|
|
40
39
|
}
|
|
41
40
|
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Embedded migration SQL — bundled so signaldock.db works in ANY project,
|
|
43
|
+
// not just the monorepo where crates/signaldock-storage/ exists.
|
|
44
|
+
// Source: crates/signaldock-storage/migrations/
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
|
|
42
47
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* The migration lives in the signaldock-storage crate at:
|
|
46
|
-
* crates/signaldock-storage/migrations/2026-03-28-000000_initial/up.sql
|
|
47
|
-
*
|
|
48
|
-
* We resolve it relative to the project root (monorepo layout).
|
|
48
|
+
* Ordered migration entries. Each has a name (for tracking) and SQL.
|
|
49
|
+
* Add new migrations to the END of this array.
|
|
49
50
|
*/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
'
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
'
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
'
|
|
74
|
-
'
|
|
75
|
-
'
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
51
|
+
const EMBEDDED_MIGRATIONS: Array<{ name: string; sql: string }> = [
|
|
52
|
+
{
|
|
53
|
+
name: '2026-03-28-000000_initial',
|
|
54
|
+
sql: `-- Consolidated initial migration for SignalDock storage (19 sqlx migrations merged).
|
|
55
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
56
|
+
id TEXT PRIMARY KEY, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL,
|
|
57
|
+
name TEXT, slug TEXT, default_agent_id TEXT, username TEXT, display_username TEXT,
|
|
58
|
+
email_verified INTEGER NOT NULL DEFAULT 0, image TEXT, role TEXT NOT NULL DEFAULT 'user',
|
|
59
|
+
banned INTEGER NOT NULL DEFAULT 0, ban_reason TEXT, ban_expires TEXT,
|
|
60
|
+
two_factor_enabled INTEGER NOT NULL DEFAULT 0, metadata TEXT,
|
|
61
|
+
created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
62
|
+
);
|
|
63
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_slug ON users(slug);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS organization (
|
|
66
|
+
id TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, slug TEXT, logo TEXT, metadata TEXT,
|
|
67
|
+
owner_id TEXT, created_at INTEGER NOT NULL DEFAULT (strftime('%s','now')),
|
|
68
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
|
|
69
|
+
);
|
|
70
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_organization_slug ON organization(slug);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
73
|
+
id TEXT PRIMARY KEY, agent_id TEXT NOT NULL UNIQUE, name TEXT NOT NULL,
|
|
74
|
+
description TEXT, class TEXT NOT NULL DEFAULT 'custom',
|
|
75
|
+
privacy_tier TEXT NOT NULL DEFAULT 'public', owner_id TEXT REFERENCES users(id),
|
|
76
|
+
endpoint TEXT, webhook_secret TEXT, capabilities TEXT NOT NULL DEFAULT '[]',
|
|
77
|
+
skills TEXT NOT NULL DEFAULT '[]', avatar TEXT, messages_sent INTEGER NOT NULL DEFAULT 0,
|
|
78
|
+
messages_received INTEGER NOT NULL DEFAULT 0, conversation_count INTEGER NOT NULL DEFAULT 0,
|
|
79
|
+
friend_count INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'online',
|
|
80
|
+
last_seen INTEGER, payment_config TEXT, api_key_hash TEXT,
|
|
81
|
+
organization_id TEXT REFERENCES organization(id) ON DELETE SET NULL,
|
|
82
|
+
created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
83
|
+
);
|
|
84
|
+
CREATE UNIQUE INDEX IF NOT EXISTS agents_agent_id_idx ON agents(agent_id);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS agents_owner_idx ON agents(owner_id);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS agents_class_idx ON agents(class);
|
|
87
|
+
CREATE INDEX IF NOT EXISTS agents_privacy_idx ON agents(privacy_tier);
|
|
88
|
+
CREATE INDEX IF NOT EXISTS agents_org_idx ON agents(organization_id);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
91
|
+
id TEXT PRIMARY KEY, participants TEXT NOT NULL,
|
|
92
|
+
visibility TEXT NOT NULL DEFAULT 'private', message_count INTEGER NOT NULL DEFAULT 0,
|
|
93
|
+
last_message_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
97
|
+
id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
98
|
+
from_agent_id TEXT NOT NULL, to_agent_id TEXT NOT NULL, content TEXT NOT NULL,
|
|
99
|
+
content_type TEXT NOT NULL DEFAULT 'text', status TEXT NOT NULL DEFAULT 'pending',
|
|
100
|
+
attachments TEXT NOT NULL DEFAULT '[]', group_id TEXT, metadata TEXT DEFAULT '{}',
|
|
101
|
+
reply_to TEXT, created_at INTEGER NOT NULL, delivered_at INTEGER, read_at INTEGER
|
|
102
|
+
);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS messages_from_agent_idx ON messages(from_agent_id);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS messages_to_agent_idx ON messages(to_agent_id);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS messages_created_at_idx ON messages(created_at);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_messages_group_id ON messages(group_id) WHERE group_id IS NOT NULL;
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_messages_reply_to ON messages(reply_to) WHERE reply_to IS NOT NULL;
|
|
109
|
+
|
|
110
|
+
CREATE TABLE IF NOT EXISTS claim_codes (
|
|
111
|
+
id TEXT PRIMARY KEY, agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
112
|
+
code TEXT NOT NULL UNIQUE, expires_at INTEGER NOT NULL, used_at INTEGER,
|
|
113
|
+
used_by TEXT REFERENCES users(id), created_at INTEGER NOT NULL
|
|
114
|
+
);
|
|
115
|
+
CREATE UNIQUE INDEX IF NOT EXISTS claim_codes_code_idx ON claim_codes(code);
|
|
116
|
+
CREATE INDEX IF NOT EXISTS claim_codes_agent_idx ON claim_codes(agent_id);
|
|
117
|
+
|
|
118
|
+
CREATE TABLE IF NOT EXISTS connections (
|
|
119
|
+
id TEXT PRIMARY KEY, agent_a TEXT NOT NULL REFERENCES agents(id),
|
|
120
|
+
agent_b TEXT NOT NULL REFERENCES agents(id), status TEXT NOT NULL DEFAULT 'pending',
|
|
121
|
+
initiated_by TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
122
|
+
);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS connections_agent_a_idx ON connections(agent_a);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS connections_agent_b_idx ON connections(agent_b);
|
|
125
|
+
|
|
126
|
+
CREATE TABLE IF NOT EXISTS delivery_jobs (
|
|
127
|
+
id TEXT PRIMARY KEY, message_id TEXT NOT NULL, payload TEXT NOT NULL,
|
|
128
|
+
status TEXT NOT NULL DEFAULT 'pending', attempts INTEGER NOT NULL DEFAULT 0,
|
|
129
|
+
max_attempts INTEGER NOT NULL DEFAULT 6, next_attempt_at INTEGER NOT NULL,
|
|
130
|
+
last_error TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
131
|
+
);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_delivery_jobs_status ON delivery_jobs(status, next_attempt_at);
|
|
133
|
+
|
|
134
|
+
CREATE TABLE IF NOT EXISTS dead_letters (
|
|
135
|
+
id TEXT PRIMARY KEY, message_id TEXT NOT NULL, job_id TEXT NOT NULL,
|
|
136
|
+
reason TEXT NOT NULL, attempts INTEGER NOT NULL, created_at INTEGER NOT NULL
|
|
137
|
+
);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_dead_letters_message ON dead_letters(message_id);
|
|
139
|
+
|
|
140
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(content, from_agent_id, content='messages', content_rowid='rowid');
|
|
141
|
+
INSERT INTO messages_fts(messages_fts) VALUES('rebuild');
|
|
142
|
+
CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN
|
|
143
|
+
INSERT INTO messages_fts(rowid, content, from_agent_id) VALUES (new.rowid, new.content, new.from_agent_id);
|
|
144
|
+
END;
|
|
145
|
+
CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN
|
|
146
|
+
INSERT INTO messages_fts(messages_fts, rowid, content, from_agent_id) VALUES('delete', old.rowid, old.content, old.from_agent_id);
|
|
147
|
+
END;
|
|
148
|
+
CREATE TRIGGER IF NOT EXISTS messages_au AFTER UPDATE ON messages BEGIN
|
|
149
|
+
INSERT INTO messages_fts(messages_fts, rowid, content, from_agent_id) VALUES('delete', old.rowid, old.content, old.from_agent_id);
|
|
150
|
+
INSERT INTO messages_fts(rowid, content, from_agent_id) VALUES (new.rowid, new.content, new.from_agent_id);
|
|
151
|
+
END;
|
|
152
|
+
|
|
153
|
+
CREATE TABLE IF NOT EXISTS message_pins (
|
|
154
|
+
id TEXT PRIMARY KEY, message_id TEXT NOT NULL, conversation_id TEXT NOT NULL,
|
|
155
|
+
pinned_by TEXT NOT NULL, note TEXT, created_at INTEGER NOT NULL, UNIQUE(message_id, pinned_by)
|
|
156
|
+
);
|
|
157
|
+
CREATE INDEX IF NOT EXISTS idx_pins_conversation ON message_pins(conversation_id);
|
|
158
|
+
CREATE INDEX IF NOT EXISTS idx_pins_agent ON message_pins(pinned_by);
|
|
159
|
+
|
|
160
|
+
CREATE TABLE IF NOT EXISTS attachments (
|
|
161
|
+
slug TEXT PRIMARY KEY, conversation_id TEXT NOT NULL, from_agent_id TEXT NOT NULL,
|
|
162
|
+
content BLOB NOT NULL, original_size INTEGER NOT NULL, compressed_size INTEGER NOT NULL,
|
|
163
|
+
content_hash TEXT NOT NULL, format TEXT NOT NULL DEFAULT 'text', title TEXT,
|
|
164
|
+
tokens INTEGER NOT NULL DEFAULT 0, expires_at INTEGER NOT NULL DEFAULT 0,
|
|
165
|
+
storage_key TEXT, mode TEXT NOT NULL DEFAULT 'draft',
|
|
166
|
+
version_count INTEGER NOT NULL DEFAULT 1, current_version INTEGER NOT NULL DEFAULT 1,
|
|
167
|
+
created_at INTEGER NOT NULL
|
|
168
|
+
);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS attachments_conversation_idx ON attachments(conversation_id);
|
|
170
|
+
CREATE INDEX IF NOT EXISTS attachments_agent_idx ON attachments(from_agent_id);
|
|
171
|
+
|
|
172
|
+
CREATE TABLE IF NOT EXISTS capabilities (
|
|
173
|
+
id TEXT PRIMARY KEY, slug TEXT NOT NULL UNIQUE, name TEXT NOT NULL,
|
|
174
|
+
description TEXT NOT NULL, category TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
175
|
+
);
|
|
176
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
177
|
+
id TEXT PRIMARY KEY, slug TEXT NOT NULL UNIQUE, name TEXT NOT NULL,
|
|
178
|
+
description TEXT NOT NULL, category TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
179
|
+
);
|
|
180
|
+
CREATE TABLE IF NOT EXISTS agent_capabilities (
|
|
181
|
+
agent_id TEXT NOT NULL REFERENCES agents(id), capability_id TEXT NOT NULL REFERENCES capabilities(id),
|
|
182
|
+
PRIMARY KEY (agent_id, capability_id)
|
|
183
|
+
);
|
|
184
|
+
CREATE TABLE IF NOT EXISTS agent_skills (
|
|
185
|
+
agent_id TEXT NOT NULL REFERENCES agents(id), skill_id TEXT NOT NULL REFERENCES skills(id),
|
|
186
|
+
PRIMARY KEY (agent_id, skill_id)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE TABLE IF NOT EXISTS accounts (
|
|
190
|
+
id TEXT PRIMARY KEY NOT NULL, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
191
|
+
account_id TEXT NOT NULL, provider_id TEXT NOT NULL, access_token TEXT, refresh_token TEXT,
|
|
192
|
+
id_token TEXT, access_token_expires_at TEXT, refresh_token_expires_at TEXT, scope TEXT,
|
|
193
|
+
password TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
194
|
+
);
|
|
195
|
+
CREATE INDEX IF NOT EXISTS idx_accounts_user_id ON accounts(user_id);
|
|
196
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_provider ON accounts(provider_id, account_id);
|
|
197
|
+
|
|
198
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
199
|
+
id TEXT PRIMARY KEY NOT NULL, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
200
|
+
token TEXT NOT NULL UNIQUE, ip_address TEXT, user_agent TEXT, expires_at TEXT NOT NULL,
|
|
201
|
+
active_organization_id TEXT, impersonated_by TEXT, active INTEGER NOT NULL DEFAULT 1,
|
|
202
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
203
|
+
);
|
|
204
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token);
|
|
205
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
|
206
|
+
|
|
207
|
+
CREATE TABLE IF NOT EXISTS verifications (
|
|
208
|
+
id TEXT PRIMARY KEY NOT NULL, identifier TEXT NOT NULL, value TEXT NOT NULL,
|
|
209
|
+
expires_at TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
210
|
+
);
|
|
211
|
+
CREATE INDEX IF NOT EXISTS idx_verifications_identifier ON verifications(identifier);
|
|
212
|
+
|
|
213
|
+
CREATE TABLE IF NOT EXISTS org_agent_keys (
|
|
214
|
+
id TEXT PRIMARY KEY NOT NULL, organization_id TEXT NOT NULL REFERENCES organization(id) ON DELETE CASCADE,
|
|
215
|
+
agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
216
|
+
created_by TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
217
|
+
);
|
|
218
|
+
CREATE INDEX IF NOT EXISTS org_agent_keys_org_idx ON org_agent_keys(organization_id);
|
|
219
|
+
CREATE INDEX IF NOT EXISTS org_agent_keys_agent_idx ON org_agent_keys(agent_id);
|
|
220
|
+
|
|
221
|
+
CREATE TABLE IF NOT EXISTS attachment_versions (
|
|
222
|
+
id TEXT PRIMARY KEY, slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,
|
|
223
|
+
version_number INTEGER NOT NULL, author_agent_id TEXT NOT NULL,
|
|
224
|
+
change_type TEXT NOT NULL DEFAULT 'patch', patch_text TEXT, storage_key TEXT NOT NULL,
|
|
225
|
+
content_hash TEXT NOT NULL, original_size INTEGER NOT NULL, compressed_size INTEGER NOT NULL,
|
|
226
|
+
tokens INTEGER NOT NULL, change_summary TEXT, sections_modified TEXT NOT NULL DEFAULT '[]',
|
|
227
|
+
tokens_added INTEGER NOT NULL DEFAULT 0, tokens_removed INTEGER NOT NULL DEFAULT 0,
|
|
228
|
+
created_at INTEGER NOT NULL, UNIQUE(slug, version_number)
|
|
229
|
+
);
|
|
230
|
+
CREATE INDEX IF NOT EXISTS idx_attachment_versions_slug ON attachment_versions(slug);
|
|
231
|
+
CREATE INDEX IF NOT EXISTS idx_attachment_versions_author ON attachment_versions(author_agent_id);
|
|
232
|
+
|
|
233
|
+
CREATE TABLE IF NOT EXISTS attachment_approvals (
|
|
234
|
+
id TEXT PRIMARY KEY, slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,
|
|
235
|
+
reviewer_agent_id TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending', comment TEXT,
|
|
236
|
+
version_reviewed INTEGER NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,
|
|
237
|
+
UNIQUE(slug, reviewer_agent_id)
|
|
238
|
+
);
|
|
239
|
+
CREATE INDEX IF NOT EXISTS idx_attachment_approvals_slug ON attachment_approvals(slug);
|
|
240
|
+
|
|
241
|
+
CREATE TABLE IF NOT EXISTS attachment_contributors (
|
|
242
|
+
slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,
|
|
243
|
+
agent_id TEXT NOT NULL, version_count INTEGER NOT NULL DEFAULT 0,
|
|
244
|
+
total_tokens_added INTEGER NOT NULL DEFAULT 0, total_tokens_removed INTEGER NOT NULL DEFAULT 0,
|
|
245
|
+
first_contribution_at INTEGER NOT NULL, last_contribution_at INTEGER NOT NULL,
|
|
246
|
+
PRIMARY KEY (slug, agent_id)
|
|
247
|
+
);`,
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: '2026-03-30-000001_agent_connections',
|
|
251
|
+
sql: `-- Add transport_type to agents table for connection mode classification.
|
|
252
|
+
ALTER TABLE agents ADD COLUMN transport_type TEXT NOT NULL DEFAULT 'http';
|
|
253
|
+
CREATE INDEX idx_agents_transport_type ON agents(transport_type);
|
|
254
|
+
|
|
255
|
+
CREATE TABLE agent_connections (
|
|
256
|
+
id TEXT PRIMARY KEY NOT NULL, agent_id TEXT NOT NULL,
|
|
257
|
+
transport_type TEXT NOT NULL DEFAULT 'http', connection_id TEXT,
|
|
258
|
+
connected_at BIGINT NOT NULL, last_heartbeat BIGINT NOT NULL,
|
|
259
|
+
connection_metadata TEXT, created_at BIGINT NOT NULL,
|
|
260
|
+
FOREIGN KEY (agent_id) REFERENCES agents(agent_id) ON DELETE CASCADE,
|
|
261
|
+
UNIQUE(agent_id, connection_id)
|
|
262
|
+
);
|
|
263
|
+
CREATE INDEX idx_agent_connections_agent ON agent_connections(agent_id);
|
|
264
|
+
CREATE INDEX idx_agent_connections_transport ON agent_connections(transport_type);
|
|
265
|
+
CREATE INDEX idx_agent_connections_heartbeat ON agent_connections(last_heartbeat);`,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
name: '2026-03-31-000001_agent_credentials',
|
|
269
|
+
sql: `-- Move agent credentials into signaldock.db agents table (T234 clean-cut).
|
|
270
|
+
ALTER TABLE agents ADD COLUMN api_key_encrypted TEXT;
|
|
271
|
+
ALTER TABLE agents ADD COLUMN api_base_url TEXT NOT NULL DEFAULT 'https://api.signaldock.io';
|
|
272
|
+
ALTER TABLE agents ADD COLUMN classification TEXT;
|
|
273
|
+
ALTER TABLE agents ADD COLUMN transport_config TEXT NOT NULL DEFAULT '{}';
|
|
274
|
+
ALTER TABLE agents ADD COLUMN is_active INTEGER NOT NULL DEFAULT 1;
|
|
275
|
+
ALTER TABLE agents ADD COLUMN last_used_at INTEGER;
|
|
276
|
+
CREATE INDEX IF NOT EXISTS idx_agents_is_active ON agents(is_active);
|
|
277
|
+
CREATE INDEX IF NOT EXISTS idx_agents_last_used ON agents(last_used_at);`,
|
|
278
|
+
},
|
|
279
|
+
];
|
|
81
280
|
|
|
82
281
|
/**
|
|
83
282
|
* Ensure signaldock.db exists and has the full schema applied.
|
|
@@ -119,23 +318,33 @@ export async function ensureSignaldockDb(
|
|
|
119
318
|
}
|
|
120
319
|
})();
|
|
121
320
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
321
|
+
// Ensure migration tracking tables exist
|
|
322
|
+
db.exec(`
|
|
323
|
+
CREATE TABLE IF NOT EXISTS _signaldock_meta (
|
|
324
|
+
key TEXT PRIMARY KEY,
|
|
325
|
+
value TEXT NOT NULL,
|
|
326
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
327
|
+
)
|
|
328
|
+
`);
|
|
329
|
+
db.exec(`
|
|
330
|
+
CREATE TABLE IF NOT EXISTS _signaldock_migrations (
|
|
331
|
+
name TEXT PRIMARY KEY,
|
|
332
|
+
applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
333
|
+
)
|
|
334
|
+
`);
|
|
130
335
|
|
|
131
|
-
|
|
336
|
+
// Apply embedded migrations (works in ANY project, not just monorepo)
|
|
337
|
+
for (const migration of EMBEDDED_MIGRATIONS) {
|
|
338
|
+
// Skip already-applied migrations
|
|
339
|
+
const applied = db
|
|
340
|
+
.prepare('SELECT name FROM _signaldock_migrations WHERE name = ?')
|
|
341
|
+
.get(migration.name) as { name: string } | undefined;
|
|
342
|
+
if (applied) continue;
|
|
132
343
|
|
|
133
|
-
// Execute the full migration SQL in one shot.
|
|
134
|
-
// node:sqlite's exec() handles multiple statements natively.
|
|
135
|
-
// We wrap in a transaction for atomicity.
|
|
136
344
|
db.exec('BEGIN TRANSACTION');
|
|
137
345
|
try {
|
|
138
|
-
db.exec(
|
|
346
|
+
db.exec(migration.sql);
|
|
347
|
+
db.prepare('INSERT INTO _signaldock_migrations (name) VALUES (?)').run(migration.name);
|
|
139
348
|
db.exec('COMMIT');
|
|
140
349
|
} catch (err) {
|
|
141
350
|
db.exec('ROLLBACK');
|
|
@@ -143,14 +352,7 @@ export async function ensureSignaldockDb(
|
|
|
143
352
|
}
|
|
144
353
|
}
|
|
145
354
|
|
|
146
|
-
// Record schema version
|
|
147
|
-
db.exec(`
|
|
148
|
-
CREATE TABLE IF NOT EXISTS _signaldock_meta (
|
|
149
|
-
key TEXT PRIMARY KEY,
|
|
150
|
-
value TEXT NOT NULL,
|
|
151
|
-
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
152
|
-
)
|
|
153
|
-
`);
|
|
355
|
+
// Record schema version
|
|
154
356
|
db.exec(`
|
|
155
357
|
INSERT OR REPLACE INTO _signaldock_meta (key, value, updated_at)
|
|
156
358
|
VALUES ('schema_version', '${SIGNALDOCK_SCHEMA_VERSION}', strftime('%s', 'now'))
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import type { Session, Task, TaskStatus } from '@cleocode/contracts';
|
|
15
15
|
import { and, eq, inArray, isNull, like, ne, notInArray, or, sql } from 'drizzle-orm';
|
|
16
16
|
import { archivedTaskToRow, rowToSession, rowToTask, taskToRow } from './converters.js';
|
|
17
|
+
import { cleanupBrainRefsOnSessionDelete } from './cross-db-cleanup.js';
|
|
17
18
|
import type {
|
|
18
19
|
ArchiveFile,
|
|
19
20
|
DataAccessor,
|
|
@@ -380,6 +381,8 @@ export async function createSqliteDataAccessor(cwd?: string): Promise<DataAccess
|
|
|
380
381
|
async removeSingleSession(sessionId: string): Promise<void> {
|
|
381
382
|
const db = await getDb(cwd);
|
|
382
383
|
await db.delete(schema.sessions).where(eq(schema.sessions.id, sessionId)).run();
|
|
384
|
+
// Best-effort cross-db cleanup: nullify brain.db references to this session
|
|
385
|
+
void cleanupBrainRefsOnSessionDelete(sessionId, cwd);
|
|
383
386
|
},
|
|
384
387
|
|
|
385
388
|
// ---- Targeted query methods (Phase 2 modernization) ----
|
package/src/store/sqlite.ts
CHANGED
|
@@ -50,7 +50,7 @@ import * as schema from './tasks-schema.js';
|
|
|
50
50
|
*
|
|
51
51
|
* CRITICAL: WAL mode is verified, not just requested. If another process holds
|
|
52
52
|
* an EXCLUSIVE lock in DELETE mode, PRAGMA journal_mode=WAL silently returns
|
|
53
|
-
* 'delete'. This caused data loss (T5173) when concurrent
|
|
53
|
+
* 'delete'. This caused data loss (T5173) when concurrent processes opened
|
|
54
54
|
* the same database — writes were silently dropped under lock contention.
|
|
55
55
|
*/
|
|
56
56
|
export function openNativeDatabase(
|
|
@@ -112,7 +112,7 @@ export function openNativeDatabase(
|
|
|
112
112
|
`CRITICAL: Failed to set WAL journal mode after ${MAX_WAL_RETRIES} attempts. ` +
|
|
113
113
|
`Database is in '${finalMode}' mode. Another process likely holds an EXCLUSIVE lock ` +
|
|
114
114
|
`on ${path}. Refusing to open — concurrent writes in DELETE mode cause data loss. ` +
|
|
115
|
-
`Kill other cleo
|
|
115
|
+
`Kill other cleo processes and retry. (T5173)`,
|
|
116
116
|
);
|
|
117
117
|
}
|
|
118
118
|
}
|
package/src/store/task-store.ts
CHANGED
|
@@ -78,7 +78,14 @@ export async function updateTask(
|
|
|
78
78
|
|
|
79
79
|
if (updates.title !== undefined) updateRow.title = updates.title;
|
|
80
80
|
if (updates.description !== undefined) updateRow.description = updates.description;
|
|
81
|
-
if (updates.status !== undefined)
|
|
81
|
+
if (updates.status !== undefined) {
|
|
82
|
+
updateRow.status = updates.status;
|
|
83
|
+
// Clear stale timestamps when status resets to non-terminal state
|
|
84
|
+
if (updates.status === 'pending' || updates.status === 'active') {
|
|
85
|
+
if (updates.cancelledAt === undefined) updateRow.cancelledAt = null;
|
|
86
|
+
if (updates.completedAt === undefined) updateRow.completedAt = null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
82
89
|
if (updates.priority !== undefined) updateRow.priority = updates.priority;
|
|
83
90
|
if (updates.type !== undefined) updateRow.type = updates.type;
|
|
84
91
|
if (updates.parentId !== undefined) updateRow.parentId = updates.parentId;
|
|
@@ -110,7 +110,7 @@ export const TOKEN_USAGE_METHODS = ['otel', 'provider_api', 'tokenizer', 'heuris
|
|
|
110
110
|
export const TOKEN_USAGE_CONFIDENCE = ['real', 'high', 'estimated', 'coarse'] as const;
|
|
111
111
|
|
|
112
112
|
/** Transport types for token telemetry. */
|
|
113
|
-
export const TOKEN_USAGE_TRANSPORTS = ['cli', '
|
|
113
|
+
export const TOKEN_USAGE_TRANSPORTS = ['cli', 'api', 'agent', 'unknown'] as const;
|
|
114
114
|
|
|
115
115
|
/** Task relation types matching DB CHECK constraint on task_relations.relation_type. */
|
|
116
116
|
export const TASK_RELATION_TYPES = [
|
|
@@ -608,7 +608,7 @@ export const auditLog = sqliteTable(
|
|
|
608
608
|
// === TOKEN USAGE ===
|
|
609
609
|
|
|
610
610
|
/**
|
|
611
|
-
* Central provider-aware token telemetry for CLI
|
|
611
|
+
* Central provider-aware token telemetry for CLI and external adapters.
|
|
612
612
|
* Stores measured request/response token counts plus method/confidence metadata.
|
|
613
613
|
*/
|
|
614
614
|
export const tokenUsage = sqliteTable(
|
|
@@ -854,41 +854,6 @@ export type NewReleaseManifestRow = typeof releaseManifests.$inferInsert;
|
|
|
854
854
|
export type ExternalTaskLinkRow = typeof externalTaskLinks.$inferSelect;
|
|
855
855
|
export type NewExternalTaskLinkRow = typeof externalTaskLinks.$inferInsert;
|
|
856
856
|
|
|
857
|
-
//
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
* Agent credentials for the unified agent registry.
|
|
861
|
-
* Stores encrypted API keys and transport configuration for registered agents.
|
|
862
|
-
* Replaces loose clawmsgr-*.json config files.
|
|
863
|
-
*
|
|
864
|
-
* @see docs/specs/SIGNALDOCK-UNIFIED-AGENT-REGISTRY.md Section 3.1
|
|
865
|
-
*/
|
|
866
|
-
export const agentCredentials = sqliteTable(
|
|
867
|
-
'agent_credentials',
|
|
868
|
-
{
|
|
869
|
-
agentId: text('agent_id').primaryKey(),
|
|
870
|
-
displayName: text('display_name').notNull(),
|
|
871
|
-
/** API key encrypted at rest using AES-256-GCM with machine-bound key. */
|
|
872
|
-
apiKeyEncrypted: text('api_key_encrypted').notNull(),
|
|
873
|
-
apiBaseUrl: text('api_base_url').notNull().default('https://api.signaldock.io'),
|
|
874
|
-
classification: text('classification'),
|
|
875
|
-
privacyTier: text('privacy_tier').notNull().default('public'),
|
|
876
|
-
/** JSON array of capability slugs. */
|
|
877
|
-
capabilities: text('capabilities').notNull().default('[]'),
|
|
878
|
-
/** JSON array of skill slugs. */
|
|
879
|
-
skills: text('skills').notNull().default('[]'),
|
|
880
|
-
/** JSON object with transport-specific settings. */
|
|
881
|
-
transportConfig: text('transport_config').notNull().default('{}'),
|
|
882
|
-
isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),
|
|
883
|
-
lastUsedAt: integer('last_used_at'),
|
|
884
|
-
createdAt: integer('created_at').notNull(),
|
|
885
|
-
updatedAt: integer('updated_at').notNull(),
|
|
886
|
-
},
|
|
887
|
-
(table) => [
|
|
888
|
-
index('idx_agent_credentials_active').on(table.isActive),
|
|
889
|
-
index('idx_agent_credentials_last_used').on(table.lastUsedAt),
|
|
890
|
-
],
|
|
891
|
-
);
|
|
892
|
-
|
|
893
|
-
export type AgentCredentialRow = typeof agentCredentials.$inferSelect;
|
|
894
|
-
export type NewAgentCredentialRow = typeof agentCredentials.$inferInsert;
|
|
857
|
+
// agent_credentials REMOVED from tasks.db — T234 clean-cut.
|
|
858
|
+
// Agent data (identity, credentials, capabilities, skills) now lives
|
|
859
|
+
// exclusively in signaldock.db. See AgentRegistryAccessor.
|
|
@@ -21,7 +21,7 @@ describe('system health audit_log checks', () => {
|
|
|
21
21
|
const { getDb, closeDb } = await import('../../store/sqlite.js');
|
|
22
22
|
await getDb(projectRoot);
|
|
23
23
|
closeDb();
|
|
24
|
-
const result = getSystemHealth(projectRoot);
|
|
24
|
+
const result = await getSystemHealth(projectRoot);
|
|
25
25
|
const auditLog = result.checks.find((c) => c.name === 'audit_log');
|
|
26
26
|
expect(auditLog).toBeDefined();
|
|
27
27
|
expect(auditLog?.status).toBe('pass');
|
|
@@ -35,7 +35,7 @@ describe('system health audit_log checks', () => {
|
|
|
35
35
|
db.exec('CREATE TABLE tasks(id TEXT PRIMARY KEY)');
|
|
36
36
|
db.close();
|
|
37
37
|
expect(existsSync(dbPath)).toBe(true);
|
|
38
|
-
const result = getSystemHealth(projectRoot);
|
|
38
|
+
const result = await getSystemHealth(projectRoot);
|
|
39
39
|
const auditLog = result.checks.find((c) => c.name === 'audit_log');
|
|
40
40
|
expect(auditLog).toBeDefined();
|
|
41
41
|
expect(auditLog?.status).toBe('fail');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.test.js","sourceRoot":"","sources":["health.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAiC,CAAC;AAEjF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACjE,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC;QAEV,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"health.test.js","sourceRoot":"","sources":["health.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ describe('system health audit_log checks', () => {
|
|
|
27
27
|
await getDb(projectRoot);
|
|
28
28
|
closeDb();
|
|
29
29
|
|
|
30
|
-
const result = getSystemHealth(projectRoot);
|
|
30
|
+
const result = await getSystemHealth(projectRoot);
|
|
31
31
|
const auditLog = result.checks.find((c) => c.name === 'audit_log');
|
|
32
32
|
|
|
33
33
|
expect(auditLog).toBeDefined();
|
|
@@ -45,7 +45,7 @@ describe('system health audit_log checks', () => {
|
|
|
45
45
|
db.close();
|
|
46
46
|
expect(existsSync(dbPath)).toBe(true);
|
|
47
47
|
|
|
48
|
-
const result = getSystemHealth(projectRoot);
|
|
48
|
+
const result = await getSystemHealth(projectRoot);
|
|
49
49
|
const auditLog = result.checks.find((c) => c.name === 'audit_log');
|
|
50
50
|
|
|
51
51
|
expect(auditLog).toBeDefined();
|
package/src/system/health.ts
CHANGED
|
@@ -145,7 +145,10 @@ export interface DiagnosticsResult {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
/** Run system health checks (SQLite-first per ADR-006). */
|
|
148
|
-
export function getSystemHealth(
|
|
148
|
+
export async function getSystemHealth(
|
|
149
|
+
projectRoot: string,
|
|
150
|
+
opts?: { detailed?: boolean },
|
|
151
|
+
): Promise<HealthResult> {
|
|
149
152
|
const cleoDir = join(projectRoot, '.cleo');
|
|
150
153
|
const checks: HealthCheck[] = [];
|
|
151
154
|
|
|
@@ -181,29 +184,50 @@ export function getSystemHealth(projectRoot: string, opts?: { detailed?: boolean
|
|
|
181
184
|
checks.push(checkAuditLogAvailability(dbPath));
|
|
182
185
|
}
|
|
183
186
|
|
|
184
|
-
// Check signaldock.db (local agent messaging per T225)
|
|
187
|
+
// Check signaldock.db with schema health (local agent messaging per T225)
|
|
185
188
|
const sdDbPath = join(cleoDir, 'signaldock.db');
|
|
186
189
|
if (existsSync(sdDbPath)) {
|
|
187
190
|
try {
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
}
|
|
191
|
+
const { DatabaseSync: SdDb } = _require('node:sqlite') as {
|
|
192
|
+
DatabaseSync: new (
|
|
193
|
+
path: string,
|
|
194
|
+
) => {
|
|
195
|
+
prepare(sql: string): { get(...args: unknown[]): unknown };
|
|
196
|
+
close(): void;
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
const sdDb = new SdDb(sdDbPath);
|
|
200
|
+
try {
|
|
201
|
+
const tables = sdDb
|
|
202
|
+
.prepare(
|
|
203
|
+
"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_signaldock%'",
|
|
204
|
+
)
|
|
205
|
+
.get() as { count: number };
|
|
206
|
+
const journalMode = sdDb.prepare('PRAGMA journal_mode').get() as {
|
|
207
|
+
journal_mode: string;
|
|
208
|
+
};
|
|
209
|
+
let schemaVersion = 'unknown';
|
|
210
|
+
try {
|
|
211
|
+
const meta = sdDb
|
|
212
|
+
.prepare("SELECT value FROM _signaldock_meta WHERE key = 'schema_version'")
|
|
213
|
+
.get() as { value: string } | undefined;
|
|
214
|
+
schemaVersion = meta?.value ?? 'unknown';
|
|
215
|
+
} catch {
|
|
216
|
+
/* meta table may not exist */
|
|
217
|
+
}
|
|
196
218
|
checks.push({
|
|
197
219
|
name: 'signaldock_db',
|
|
198
|
-
status: 'warn',
|
|
199
|
-
message:
|
|
220
|
+
status: tables.count >= 20 ? 'pass' : 'warn',
|
|
221
|
+
message: `signaldock.db: ${tables.count} tables, ${journalMode.journal_mode}, v${schemaVersion}`,
|
|
200
222
|
});
|
|
223
|
+
} finally {
|
|
224
|
+
sdDb.close();
|
|
201
225
|
}
|
|
202
226
|
} catch {
|
|
203
227
|
checks.push({
|
|
204
228
|
name: 'signaldock_db',
|
|
205
|
-
status: '
|
|
206
|
-
message:
|
|
229
|
+
status: 'pass',
|
|
230
|
+
message: `signaldock.db: ${statSync(sdDbPath).size} bytes`,
|
|
207
231
|
});
|
|
208
232
|
}
|
|
209
233
|
} else {
|
|
@@ -297,7 +321,7 @@ export async function getSystemDiagnostics(
|
|
|
297
321
|
projectRoot: string,
|
|
298
322
|
opts?: { checks?: string[] },
|
|
299
323
|
): Promise<DiagnosticsResult> {
|
|
300
|
-
const healthResult = getSystemHealth(projectRoot, { detailed: true });
|
|
324
|
+
const healthResult = await getSystemHealth(projectRoot, { detailed: true });
|
|
301
325
|
|
|
302
326
|
const diagChecks: DiagnosticsCheck[] = healthResult.checks.map((c) => ({
|
|
303
327
|
name: c.name,
|
|
@@ -901,8 +925,8 @@ export async function runDoctorFixes(projectRoot: string): Promise<FixResult[]>
|
|
|
901
925
|
};
|
|
902
926
|
},
|
|
903
927
|
contributor_channel: async () => {
|
|
904
|
-
const { ensureContributorMcp } = await import('../scaffold.js');
|
|
905
|
-
const r = await
|
|
928
|
+
const { ensureContributorMcp: ensureContributorDev } = await import('../scaffold.js');
|
|
929
|
+
const r = await ensureContributorDev(projectRoot);
|
|
906
930
|
return {
|
|
907
931
|
check: 'contributor_channel',
|
|
908
932
|
action: r.action === 'skipped' ? 'skipped' : 'fixed',
|
|
@@ -989,7 +1013,7 @@ export async function runDoctorFixes(projectRoot: string): Promise<FixResult[]>
|
|
|
989
1013
|
}
|
|
990
1014
|
|
|
991
1015
|
// ============================================================================
|
|
992
|
-
// Startup Health Check (
|
|
1016
|
+
// Startup Health Check (CLI unified entry point)
|
|
993
1017
|
// ============================================================================
|
|
994
1018
|
|
|
995
1019
|
/**
|
|
@@ -1021,7 +1045,7 @@ export interface StartupHealthResult {
|
|
|
1021
1045
|
}
|
|
1022
1046
|
|
|
1023
1047
|
/**
|
|
1024
|
-
* Unified startup health check for
|
|
1048
|
+
* Unified startup health check for CLI entry points.
|
|
1025
1049
|
*
|
|
1026
1050
|
* This is the single entry point for startup diagnostics. It follows a
|
|
1027
1051
|
* three-phase approach:
|