@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
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual-API E2E test — verify messaging across both SignalDock endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Tests that agents can exchange messages on:
|
|
5
|
+
* 1. api.signaldock.io (canonical)
|
|
6
|
+
* 2. api.clawmsgr.com (legacy)
|
|
7
|
+
* 3. Local signaldock.db (offline)
|
|
8
|
+
*
|
|
9
|
+
* These tests hit real APIs and require valid credentials.
|
|
10
|
+
* Set SKIP_E2E=1 to skip when running in CI without network.
|
|
11
|
+
*
|
|
12
|
+
* @task T226
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { describe, expect, it } from 'vitest';
|
|
18
|
+
import { HttpTransport } from '../http-transport.js';
|
|
19
|
+
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Config helpers
|
|
22
|
+
// ============================================================================
|
|
23
|
+
|
|
24
|
+
const CLEO_DIR = join(process.cwd(), '.cleo');
|
|
25
|
+
const SKIP_E2E = process.env['SKIP_E2E'] === '1';
|
|
26
|
+
|
|
27
|
+
/** Load a ClawMsgr/SignalDock config file. */
|
|
28
|
+
function loadConfig(
|
|
29
|
+
filename: string,
|
|
30
|
+
): { agentId: string; apiKey: string; apiBaseUrl: string } | null {
|
|
31
|
+
const path = join(CLEO_DIR, filename);
|
|
32
|
+
if (!existsSync(path)) return null;
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(readFileSync(path, 'utf-8')) as {
|
|
35
|
+
agentId: string;
|
|
36
|
+
apiKey: string;
|
|
37
|
+
apiBaseUrl: string;
|
|
38
|
+
};
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Send a test message and verify it arrives. */
|
|
45
|
+
async function testMessageExchange(
|
|
46
|
+
apiBaseUrl: string,
|
|
47
|
+
senderConfig: { agentId: string; apiKey: string },
|
|
48
|
+
receiverAgentId: string,
|
|
49
|
+
): Promise<{ sent: boolean; messageId: string | null; error: string | null }> {
|
|
50
|
+
const transport = new HttpTransport();
|
|
51
|
+
try {
|
|
52
|
+
await transport.connect({
|
|
53
|
+
agentId: senderConfig.agentId,
|
|
54
|
+
apiKey: senderConfig.apiKey,
|
|
55
|
+
apiBaseUrl,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const testContent = `/info @${receiverAgentId} #e2e-test T226 verification at ${new Date().toISOString()}`;
|
|
59
|
+
const result = await transport.push(receiverAgentId, testContent);
|
|
60
|
+
|
|
61
|
+
await transport.disconnect();
|
|
62
|
+
return { sent: true, messageId: result.messageId, error: null };
|
|
63
|
+
} catch (err) {
|
|
64
|
+
await transport.disconnect();
|
|
65
|
+
return { sent: false, messageId: null, error: String(err) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Test suite
|
|
71
|
+
// ============================================================================
|
|
72
|
+
|
|
73
|
+
describe('Dual-API E2E', () => {
|
|
74
|
+
// --------------------------------------------------------------------------
|
|
75
|
+
// Config verification
|
|
76
|
+
// --------------------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
describe('config files exist', () => {
|
|
79
|
+
it('has clawmsgr configs (legacy)', () => {
|
|
80
|
+
const config = loadConfig('clawmsgr-cleo-rust-lead.json');
|
|
81
|
+
if (!config) {
|
|
82
|
+
console.log('SKIP: clawmsgr config not found');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
expect(config.agentId).toBe('cleo-rust-lead');
|
|
86
|
+
expect(config.apiBaseUrl).toContain('clawmsgr.com');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('has signaldock configs (canonical)', () => {
|
|
90
|
+
const config = loadConfig('signaldock-cleo-rust-lead.json');
|
|
91
|
+
if (!config) {
|
|
92
|
+
console.log('SKIP: signaldock config not found');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
expect(config.agentId).toBe('cleo-rust-lead');
|
|
96
|
+
expect(config.apiBaseUrl).toContain('signaldock.io');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// --------------------------------------------------------------------------
|
|
101
|
+
// API health checks
|
|
102
|
+
// --------------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
describe('API health', () => {
|
|
105
|
+
it('api.signaldock.io is healthy', async () => {
|
|
106
|
+
if (SKIP_E2E) return;
|
|
107
|
+
const response = await fetch('https://api.signaldock.io/health', {
|
|
108
|
+
signal: AbortSignal.timeout(10_000),
|
|
109
|
+
});
|
|
110
|
+
expect(response.ok).toBe(true);
|
|
111
|
+
const data = (await response.json()) as { data?: { status?: string } };
|
|
112
|
+
expect(data.data?.status).toBe('ok');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('api.clawmsgr.com is healthy', async () => {
|
|
116
|
+
if (SKIP_E2E) return;
|
|
117
|
+
const response = await fetch('https://api.clawmsgr.com/health', {
|
|
118
|
+
signal: AbortSignal.timeout(10_000),
|
|
119
|
+
});
|
|
120
|
+
expect(response.ok).toBe(true);
|
|
121
|
+
const data = (await response.json()) as { data?: { status?: string } };
|
|
122
|
+
expect(data.data?.status).toBe('ok');
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// --------------------------------------------------------------------------
|
|
127
|
+
// Message exchange on api.signaldock.io
|
|
128
|
+
// --------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
describe('api.signaldock.io messaging', () => {
|
|
131
|
+
it('can send a message via signaldock.io', async () => {
|
|
132
|
+
if (SKIP_E2E) return;
|
|
133
|
+
const config = loadConfig('signaldock-cleo-rust-lead.json');
|
|
134
|
+
if (!config) {
|
|
135
|
+
console.log('SKIP: no signaldock config');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const result = await testMessageExchange(
|
|
139
|
+
'https://api.signaldock.io',
|
|
140
|
+
{ agentId: config.agentId, apiKey: config.apiKey },
|
|
141
|
+
'cleo-dev',
|
|
142
|
+
);
|
|
143
|
+
expect(result.sent).toBe(true);
|
|
144
|
+
expect(result.messageId).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// --------------------------------------------------------------------------
|
|
149
|
+
// Message exchange on api.clawmsgr.com
|
|
150
|
+
// --------------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
describe('api.clawmsgr.com messaging', () => {
|
|
153
|
+
it('can send a message via clawmsgr.com', async () => {
|
|
154
|
+
if (SKIP_E2E) return;
|
|
155
|
+
const config = loadConfig('clawmsgr-cleo-rust-lead.json');
|
|
156
|
+
if (!config) {
|
|
157
|
+
console.log('SKIP: no clawmsgr config');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const result = await testMessageExchange(
|
|
161
|
+
'https://api.clawmsgr.com',
|
|
162
|
+
{ agentId: config.agentId, apiKey: config.apiKey },
|
|
163
|
+
'cleo-dev',
|
|
164
|
+
);
|
|
165
|
+
expect(result.sent).toBe(true);
|
|
166
|
+
expect(result.messageId).toBeDefined();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// --------------------------------------------------------------------------
|
|
171
|
+
// Cross-API metadata consistency
|
|
172
|
+
// --------------------------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
describe('cross-API consistency', () => {
|
|
175
|
+
it('agent profile exists on both APIs', async () => {
|
|
176
|
+
if (SKIP_E2E) return;
|
|
177
|
+
const clawConfig = loadConfig('clawmsgr-cleo-rust-lead.json');
|
|
178
|
+
const sdConfig = loadConfig('signaldock-cleo-rust-lead.json');
|
|
179
|
+
if (!clawConfig || !sdConfig) {
|
|
180
|
+
console.log('SKIP: missing configs');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Check agent exists on clawmsgr
|
|
185
|
+
const clawResp = await fetch('https://api.clawmsgr.com/agents/cleo-rust-lead', {
|
|
186
|
+
headers: {
|
|
187
|
+
Authorization: `Bearer ${clawConfig.apiKey}`,
|
|
188
|
+
'X-Agent-Id': 'cleo-rust-lead',
|
|
189
|
+
},
|
|
190
|
+
signal: AbortSignal.timeout(10_000),
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Check agent exists on signaldock
|
|
194
|
+
const sdResp = await fetch('https://api.signaldock.io/agents/cleo-rust-lead', {
|
|
195
|
+
headers: {
|
|
196
|
+
Authorization: `Bearer ${sdConfig.apiKey}`,
|
|
197
|
+
'X-Agent-Id': 'cleo-rust-lead',
|
|
198
|
+
},
|
|
199
|
+
signal: AbortSignal.timeout(10_000),
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
expect(clawResp.ok).toBe(true);
|
|
203
|
+
expect(sdResp.ok).toBe(true);
|
|
204
|
+
|
|
205
|
+
const clawData = (await clawResp.json()) as { data?: { agent?: { agentId?: string } } };
|
|
206
|
+
const sdData = (await sdResp.json()) as { data?: { agent?: { agentId?: string } } };
|
|
207
|
+
|
|
208
|
+
expect(clawData.data?.agent?.agentId).toBe('cleo-rust-lead');
|
|
209
|
+
expect(sdData.data?.agent?.agentId).toBe('cleo-rust-lead');
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-credential-flow.test.d.ts","sourceRoot":"","sources":["local-credential-flow.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local credential flow — end-to-end validation.
|
|
3
|
+
*
|
|
4
|
+
* Tests the full lifecycle: signaldock.db creation → agent register →
|
|
5
|
+
* credential encryption/decryption → LocalTransport connect →
|
|
6
|
+
* push/poll/ack messaging.
|
|
7
|
+
*
|
|
8
|
+
* @task T227
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
14
|
+
import { ensureSignaldockDb, getSignaldockDbPath } from '../../store/signaldock-sqlite.js';
|
|
15
|
+
import { LocalTransport } from '../local-transport.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Test helpers
|
|
18
|
+
// ============================================================================
|
|
19
|
+
let testDir;
|
|
20
|
+
let originalCwd;
|
|
21
|
+
async function setupTestEnvironment() {
|
|
22
|
+
const dir = join(tmpdir(), `credential-flow-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
23
|
+
mkdirSync(join(dir, '.cleo'), { recursive: true });
|
|
24
|
+
// Create a minimal .cleo/project-context.json so paths resolve
|
|
25
|
+
writeFileSync(join(dir, '.cleo', 'project-context.json'), JSON.stringify({ schemaVersion: '1.0.0', projectTypes: ['node'], primaryType: 'node' }));
|
|
26
|
+
return dir;
|
|
27
|
+
}
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Test suite
|
|
30
|
+
// ============================================================================
|
|
31
|
+
describe('Local Credential Flow E2E', () => {
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
originalCwd = process.cwd();
|
|
34
|
+
testDir = await setupTestEnvironment();
|
|
35
|
+
process.chdir(testDir);
|
|
36
|
+
});
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
process.chdir(originalCwd);
|
|
39
|
+
if (testDir && existsSync(testDir)) {
|
|
40
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// --------------------------------------------------------------------------
|
|
44
|
+
// Step 1: cleo init creates signaldock.db
|
|
45
|
+
// --------------------------------------------------------------------------
|
|
46
|
+
describe('Step 1: signaldock.db creation', () => {
|
|
47
|
+
it('ensureSignaldockDb creates the database file', async () => {
|
|
48
|
+
const result = await ensureSignaldockDb(testDir);
|
|
49
|
+
expect(result.action).toBe('created');
|
|
50
|
+
expect(existsSync(result.path)).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it('ensureSignaldockDb is idempotent', async () => {
|
|
53
|
+
const first = await ensureSignaldockDb(testDir);
|
|
54
|
+
const second = await ensureSignaldockDb(testDir);
|
|
55
|
+
expect(first.action).toBe('created');
|
|
56
|
+
expect(second.action).toBe('exists');
|
|
57
|
+
expect(first.path).toBe(second.path);
|
|
58
|
+
});
|
|
59
|
+
it('signaldock.db has the messages table', async () => {
|
|
60
|
+
await ensureSignaldockDb(testDir);
|
|
61
|
+
const dbPath = getSignaldockDbPath(testDir);
|
|
62
|
+
expect(existsSync(dbPath)).toBe(true);
|
|
63
|
+
// Verify by connecting LocalTransport (which checks for messages table)
|
|
64
|
+
const transport = new LocalTransport();
|
|
65
|
+
await transport.connect({
|
|
66
|
+
agentId: 'test',
|
|
67
|
+
apiKey: 'sk_test',
|
|
68
|
+
apiBaseUrl: 'http://localhost',
|
|
69
|
+
});
|
|
70
|
+
await transport.disconnect();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
// --------------------------------------------------------------------------
|
|
74
|
+
// Step 2: LocalTransport availability
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
describe('Step 2: LocalTransport availability', () => {
|
|
77
|
+
it('isAvailable returns false before init', () => {
|
|
78
|
+
const emptyDir = join(tmpdir(), `no-init-${Date.now()}`);
|
|
79
|
+
mkdirSync(join(emptyDir, '.cleo'), { recursive: true });
|
|
80
|
+
expect(LocalTransport.isAvailable(emptyDir)).toBe(false);
|
|
81
|
+
rmSync(emptyDir, { recursive: true, force: true });
|
|
82
|
+
});
|
|
83
|
+
it('isAvailable returns true after init', async () => {
|
|
84
|
+
await ensureSignaldockDb(testDir);
|
|
85
|
+
expect(LocalTransport.isAvailable(testDir)).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
// --------------------------------------------------------------------------
|
|
89
|
+
// Step 3: Full messaging lifecycle
|
|
90
|
+
// --------------------------------------------------------------------------
|
|
91
|
+
describe('Step 3: messaging lifecycle', () => {
|
|
92
|
+
it('complete flow: init → connect → push → poll → ack', async () => {
|
|
93
|
+
// 1. Init signaldock.db
|
|
94
|
+
await ensureSignaldockDb(testDir);
|
|
95
|
+
// 2. Connect two agents
|
|
96
|
+
const agent1 = new LocalTransport();
|
|
97
|
+
const agent2 = new LocalTransport();
|
|
98
|
+
await agent1.connect({
|
|
99
|
+
agentId: 'cleo-rust-lead',
|
|
100
|
+
apiKey: 'sk_live_fake1',
|
|
101
|
+
apiBaseUrl: 'http://localhost',
|
|
102
|
+
});
|
|
103
|
+
await agent2.connect({
|
|
104
|
+
agentId: 'cleo-dev',
|
|
105
|
+
apiKey: 'sk_live_fake2',
|
|
106
|
+
apiBaseUrl: 'http://localhost',
|
|
107
|
+
});
|
|
108
|
+
// 3. Agent 1 sends a message to Agent 2
|
|
109
|
+
const sendResult = await agent1.push('cleo-dev', '/action @cleo-dev #test Hello from rust-lead');
|
|
110
|
+
expect(sendResult.messageId).toBeDefined();
|
|
111
|
+
// 4. Agent 2 polls and receives the message
|
|
112
|
+
const messages = await agent2.poll();
|
|
113
|
+
expect(messages).toHaveLength(1);
|
|
114
|
+
expect(messages[0].from).toBe('cleo-rust-lead');
|
|
115
|
+
expect(messages[0].content).toContain('Hello from rust-lead');
|
|
116
|
+
// 5. Agent 2 acknowledges the message
|
|
117
|
+
await agent2.ack([messages[0].id]);
|
|
118
|
+
// 6. Subsequent poll returns empty (message was acked)
|
|
119
|
+
const afterAck = await agent2.poll();
|
|
120
|
+
expect(afterAck).toHaveLength(0);
|
|
121
|
+
// 7. Agent 2 replies
|
|
122
|
+
const replyResult = await agent2.push('cleo-rust-lead', '/ack Received.');
|
|
123
|
+
expect(replyResult.messageId).toBeDefined();
|
|
124
|
+
// 8. Agent 1 receives the reply
|
|
125
|
+
const replies = await agent1.poll();
|
|
126
|
+
expect(replies).toHaveLength(1);
|
|
127
|
+
expect(replies[0].from).toBe('cleo-dev');
|
|
128
|
+
expect(replies[0].content).toBe('/ack Received.');
|
|
129
|
+
// Cleanup
|
|
130
|
+
await agent1.disconnect();
|
|
131
|
+
await agent2.disconnect();
|
|
132
|
+
});
|
|
133
|
+
it('messages persist across transport reconnections', async () => {
|
|
134
|
+
await ensureSignaldockDb(testDir);
|
|
135
|
+
// Send a message
|
|
136
|
+
const sender = new LocalTransport();
|
|
137
|
+
await sender.connect({
|
|
138
|
+
agentId: 'sender',
|
|
139
|
+
apiKey: 'sk_test',
|
|
140
|
+
apiBaseUrl: 'http://localhost',
|
|
141
|
+
});
|
|
142
|
+
await sender.push('receiver', 'persistent message');
|
|
143
|
+
await sender.disconnect();
|
|
144
|
+
// New transport instance reads the same DB
|
|
145
|
+
const receiver = new LocalTransport();
|
|
146
|
+
await receiver.connect({
|
|
147
|
+
agentId: 'receiver',
|
|
148
|
+
apiKey: 'sk_test',
|
|
149
|
+
apiBaseUrl: 'http://localhost',
|
|
150
|
+
});
|
|
151
|
+
const messages = await receiver.poll();
|
|
152
|
+
expect(messages).toHaveLength(1);
|
|
153
|
+
expect(messages[0].content).toBe('persistent message');
|
|
154
|
+
await receiver.disconnect();
|
|
155
|
+
});
|
|
156
|
+
it('multiple agents can communicate in the same conversation', async () => {
|
|
157
|
+
await ensureSignaldockDb(testDir);
|
|
158
|
+
const prime = new LocalTransport();
|
|
159
|
+
const rustLead = new LocalTransport();
|
|
160
|
+
const dbLead = new LocalTransport();
|
|
161
|
+
await prime.connect({ agentId: 'prime', apiKey: 'sk1', apiBaseUrl: 'http://localhost' });
|
|
162
|
+
await rustLead.connect({
|
|
163
|
+
agentId: 'rust-lead',
|
|
164
|
+
apiKey: 'sk2',
|
|
165
|
+
apiBaseUrl: 'http://localhost',
|
|
166
|
+
});
|
|
167
|
+
await dbLead.connect({ agentId: 'db-lead', apiKey: 'sk3', apiBaseUrl: 'http://localhost' });
|
|
168
|
+
// Prime sends to rust-lead
|
|
169
|
+
await prime.push('rust-lead', 'Fix cant-lsp');
|
|
170
|
+
// Prime sends to db-lead
|
|
171
|
+
await prime.push('db-lead', 'Review schemas');
|
|
172
|
+
// Each agent only sees their own messages
|
|
173
|
+
const rustMessages = await rustLead.poll();
|
|
174
|
+
const dbMessages = await dbLead.poll();
|
|
175
|
+
expect(rustMessages).toHaveLength(1);
|
|
176
|
+
expect(rustMessages[0].content).toBe('Fix cant-lsp');
|
|
177
|
+
expect(dbMessages).toHaveLength(1);
|
|
178
|
+
expect(dbMessages[0].content).toBe('Review schemas');
|
|
179
|
+
await prime.disconnect();
|
|
180
|
+
await rustLead.disconnect();
|
|
181
|
+
await dbLead.disconnect();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=local-credential-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-credential-flow.test.js","sourceRoot":"","sources":["local-credential-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local credential flow — end-to-end validation.
|
|
3
|
+
*
|
|
4
|
+
* Tests the full lifecycle: signaldock.db creation → agent register →
|
|
5
|
+
* credential encryption/decryption → LocalTransport connect →
|
|
6
|
+
* push/poll/ack messaging.
|
|
7
|
+
*
|
|
8
|
+
* @task T227
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
15
|
+
import { ensureSignaldockDb, getSignaldockDbPath } from '../../store/signaldock-sqlite.js';
|
|
16
|
+
import { LocalTransport } from '../local-transport.js';
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Test helpers
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
let testDir: string;
|
|
23
|
+
let originalCwd: string;
|
|
24
|
+
|
|
25
|
+
async function setupTestEnvironment(): Promise<string> {
|
|
26
|
+
const dir = join(
|
|
27
|
+
tmpdir(),
|
|
28
|
+
`credential-flow-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
29
|
+
);
|
|
30
|
+
mkdirSync(join(dir, '.cleo'), { recursive: true });
|
|
31
|
+
// Create a minimal .cleo/project-context.json so paths resolve
|
|
32
|
+
writeFileSync(
|
|
33
|
+
join(dir, '.cleo', 'project-context.json'),
|
|
34
|
+
JSON.stringify({ schemaVersion: '1.0.0', projectTypes: ['node'], primaryType: 'node' }),
|
|
35
|
+
);
|
|
36
|
+
return dir;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Test suite
|
|
41
|
+
// ============================================================================
|
|
42
|
+
|
|
43
|
+
describe('Local Credential Flow E2E', () => {
|
|
44
|
+
beforeEach(async () => {
|
|
45
|
+
originalCwd = process.cwd();
|
|
46
|
+
testDir = await setupTestEnvironment();
|
|
47
|
+
process.chdir(testDir);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
process.chdir(originalCwd);
|
|
52
|
+
if (testDir && existsSync(testDir)) {
|
|
53
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// --------------------------------------------------------------------------
|
|
58
|
+
// Step 1: cleo init creates signaldock.db
|
|
59
|
+
// --------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
describe('Step 1: signaldock.db creation', () => {
|
|
62
|
+
it('ensureSignaldockDb creates the database file', async () => {
|
|
63
|
+
const result = await ensureSignaldockDb(testDir);
|
|
64
|
+
expect(result.action).toBe('created');
|
|
65
|
+
expect(existsSync(result.path)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('ensureSignaldockDb is idempotent', async () => {
|
|
69
|
+
const first = await ensureSignaldockDb(testDir);
|
|
70
|
+
const second = await ensureSignaldockDb(testDir);
|
|
71
|
+
expect(first.action).toBe('created');
|
|
72
|
+
expect(second.action).toBe('exists');
|
|
73
|
+
expect(first.path).toBe(second.path);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('signaldock.db has the messages table', async () => {
|
|
77
|
+
await ensureSignaldockDb(testDir);
|
|
78
|
+
const dbPath = getSignaldockDbPath(testDir);
|
|
79
|
+
expect(existsSync(dbPath)).toBe(true);
|
|
80
|
+
|
|
81
|
+
// Verify by connecting LocalTransport (which checks for messages table)
|
|
82
|
+
const transport = new LocalTransport();
|
|
83
|
+
await transport.connect({
|
|
84
|
+
agentId: 'test',
|
|
85
|
+
apiKey: 'sk_test',
|
|
86
|
+
apiBaseUrl: 'http://localhost',
|
|
87
|
+
});
|
|
88
|
+
await transport.disconnect();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// --------------------------------------------------------------------------
|
|
93
|
+
// Step 2: LocalTransport availability
|
|
94
|
+
// --------------------------------------------------------------------------
|
|
95
|
+
|
|
96
|
+
describe('Step 2: LocalTransport availability', () => {
|
|
97
|
+
it('isAvailable returns false before init', () => {
|
|
98
|
+
const emptyDir = join(tmpdir(), `no-init-${Date.now()}`);
|
|
99
|
+
mkdirSync(join(emptyDir, '.cleo'), { recursive: true });
|
|
100
|
+
expect(LocalTransport.isAvailable(emptyDir)).toBe(false);
|
|
101
|
+
rmSync(emptyDir, { recursive: true, force: true });
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('isAvailable returns true after init', async () => {
|
|
105
|
+
await ensureSignaldockDb(testDir);
|
|
106
|
+
expect(LocalTransport.isAvailable(testDir)).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// --------------------------------------------------------------------------
|
|
111
|
+
// Step 3: Full messaging lifecycle
|
|
112
|
+
// --------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
describe('Step 3: messaging lifecycle', () => {
|
|
115
|
+
it('complete flow: init → connect → push → poll → ack', async () => {
|
|
116
|
+
// 1. Init signaldock.db
|
|
117
|
+
await ensureSignaldockDb(testDir);
|
|
118
|
+
|
|
119
|
+
// 2. Connect two agents
|
|
120
|
+
const agent1 = new LocalTransport();
|
|
121
|
+
const agent2 = new LocalTransport();
|
|
122
|
+
|
|
123
|
+
await agent1.connect({
|
|
124
|
+
agentId: 'cleo-rust-lead',
|
|
125
|
+
apiKey: 'sk_live_fake1',
|
|
126
|
+
apiBaseUrl: 'http://localhost',
|
|
127
|
+
});
|
|
128
|
+
await agent2.connect({
|
|
129
|
+
agentId: 'cleo-dev',
|
|
130
|
+
apiKey: 'sk_live_fake2',
|
|
131
|
+
apiBaseUrl: 'http://localhost',
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// 3. Agent 1 sends a message to Agent 2
|
|
135
|
+
const sendResult = await agent1.push(
|
|
136
|
+
'cleo-dev',
|
|
137
|
+
'/action @cleo-dev #test Hello from rust-lead',
|
|
138
|
+
);
|
|
139
|
+
expect(sendResult.messageId).toBeDefined();
|
|
140
|
+
|
|
141
|
+
// 4. Agent 2 polls and receives the message
|
|
142
|
+
const messages = await agent2.poll();
|
|
143
|
+
expect(messages).toHaveLength(1);
|
|
144
|
+
expect(messages[0].from).toBe('cleo-rust-lead');
|
|
145
|
+
expect(messages[0].content).toContain('Hello from rust-lead');
|
|
146
|
+
|
|
147
|
+
// 5. Agent 2 acknowledges the message
|
|
148
|
+
await agent2.ack([messages[0].id]);
|
|
149
|
+
|
|
150
|
+
// 6. Subsequent poll returns empty (message was acked)
|
|
151
|
+
const afterAck = await agent2.poll();
|
|
152
|
+
expect(afterAck).toHaveLength(0);
|
|
153
|
+
|
|
154
|
+
// 7. Agent 2 replies
|
|
155
|
+
const replyResult = await agent2.push('cleo-rust-lead', '/ack Received.');
|
|
156
|
+
expect(replyResult.messageId).toBeDefined();
|
|
157
|
+
|
|
158
|
+
// 8. Agent 1 receives the reply
|
|
159
|
+
const replies = await agent1.poll();
|
|
160
|
+
expect(replies).toHaveLength(1);
|
|
161
|
+
expect(replies[0].from).toBe('cleo-dev');
|
|
162
|
+
expect(replies[0].content).toBe('/ack Received.');
|
|
163
|
+
|
|
164
|
+
// Cleanup
|
|
165
|
+
await agent1.disconnect();
|
|
166
|
+
await agent2.disconnect();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('messages persist across transport reconnections', async () => {
|
|
170
|
+
await ensureSignaldockDb(testDir);
|
|
171
|
+
|
|
172
|
+
// Send a message
|
|
173
|
+
const sender = new LocalTransport();
|
|
174
|
+
await sender.connect({
|
|
175
|
+
agentId: 'sender',
|
|
176
|
+
apiKey: 'sk_test',
|
|
177
|
+
apiBaseUrl: 'http://localhost',
|
|
178
|
+
});
|
|
179
|
+
await sender.push('receiver', 'persistent message');
|
|
180
|
+
await sender.disconnect();
|
|
181
|
+
|
|
182
|
+
// New transport instance reads the same DB
|
|
183
|
+
const receiver = new LocalTransport();
|
|
184
|
+
await receiver.connect({
|
|
185
|
+
agentId: 'receiver',
|
|
186
|
+
apiKey: 'sk_test',
|
|
187
|
+
apiBaseUrl: 'http://localhost',
|
|
188
|
+
});
|
|
189
|
+
const messages = await receiver.poll();
|
|
190
|
+
expect(messages).toHaveLength(1);
|
|
191
|
+
expect(messages[0].content).toBe('persistent message');
|
|
192
|
+
|
|
193
|
+
await receiver.disconnect();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('multiple agents can communicate in the same conversation', async () => {
|
|
197
|
+
await ensureSignaldockDb(testDir);
|
|
198
|
+
|
|
199
|
+
const prime = new LocalTransport();
|
|
200
|
+
const rustLead = new LocalTransport();
|
|
201
|
+
const dbLead = new LocalTransport();
|
|
202
|
+
|
|
203
|
+
await prime.connect({ agentId: 'prime', apiKey: 'sk1', apiBaseUrl: 'http://localhost' });
|
|
204
|
+
await rustLead.connect({
|
|
205
|
+
agentId: 'rust-lead',
|
|
206
|
+
apiKey: 'sk2',
|
|
207
|
+
apiBaseUrl: 'http://localhost',
|
|
208
|
+
});
|
|
209
|
+
await dbLead.connect({ agentId: 'db-lead', apiKey: 'sk3', apiBaseUrl: 'http://localhost' });
|
|
210
|
+
|
|
211
|
+
// Prime sends to rust-lead
|
|
212
|
+
await prime.push('rust-lead', 'Fix cant-lsp');
|
|
213
|
+
// Prime sends to db-lead
|
|
214
|
+
await prime.push('db-lead', 'Review schemas');
|
|
215
|
+
|
|
216
|
+
// Each agent only sees their own messages
|
|
217
|
+
const rustMessages = await rustLead.poll();
|
|
218
|
+
const dbMessages = await dbLead.poll();
|
|
219
|
+
|
|
220
|
+
expect(rustMessages).toHaveLength(1);
|
|
221
|
+
expect(rustMessages[0].content).toBe('Fix cant-lsp');
|
|
222
|
+
expect(dbMessages).toHaveLength(1);
|
|
223
|
+
expect(dbMessages[0].content).toBe('Review schemas');
|
|
224
|
+
|
|
225
|
+
await prime.disconnect();
|
|
226
|
+
await rustLead.disconnect();
|
|
227
|
+
await dbLead.disconnect();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-transport.test.d.ts","sourceRoot":"","sources":["local-transport.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|