@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,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalTransport test suite.
|
|
3
|
+
*
|
|
4
|
+
* Tests the in-process SQLite transport for fully offline agent messaging.
|
|
5
|
+
* Uses a temporary signaldock.db created via ensureSignaldockDb().
|
|
6
|
+
*
|
|
7
|
+
* @see packages/core/src/conduit/local-transport.ts
|
|
8
|
+
* @task T213
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, mkdirSync, rmSync } 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 } 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
|
+
/** Create a temporary directory with a valid signaldock.db for testing. */
|
|
26
|
+
async function setupTestDb(): Promise<string> {
|
|
27
|
+
const dir = join(
|
|
28
|
+
tmpdir(),
|
|
29
|
+
`local-transport-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
30
|
+
);
|
|
31
|
+
mkdirSync(join(dir, '.cleo'), { recursive: true });
|
|
32
|
+
await ensureSignaldockDb(dir);
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Standard connect config for tests. */
|
|
37
|
+
function testConfig(agentId = 'test-agent') {
|
|
38
|
+
return {
|
|
39
|
+
agentId,
|
|
40
|
+
apiKey: 'sk_test_fake',
|
|
41
|
+
apiBaseUrl: 'http://localhost:4000',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Test suite
|
|
47
|
+
// ============================================================================
|
|
48
|
+
|
|
49
|
+
describe('LocalTransport', () => {
|
|
50
|
+
beforeEach(async () => {
|
|
51
|
+
originalCwd = process.cwd();
|
|
52
|
+
testDir = await setupTestDb();
|
|
53
|
+
process.chdir(testDir);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
process.chdir(originalCwd);
|
|
58
|
+
if (testDir && existsSync(testDir)) {
|
|
59
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// --------------------------------------------------------------------------
|
|
64
|
+
// Connection
|
|
65
|
+
// --------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
describe('connect', () => {
|
|
68
|
+
it('connects when signaldock.db exists', async () => {
|
|
69
|
+
const transport = new LocalTransport();
|
|
70
|
+
await transport.connect(testConfig());
|
|
71
|
+
await transport.disconnect();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('throws when signaldock.db is missing', async () => {
|
|
75
|
+
const emptyDir = join(tmpdir(), `empty-${Date.now()}`);
|
|
76
|
+
mkdirSync(join(emptyDir, '.cleo'), { recursive: true });
|
|
77
|
+
process.chdir(emptyDir);
|
|
78
|
+
|
|
79
|
+
const transport = new LocalTransport();
|
|
80
|
+
await expect(transport.connect(testConfig())).rejects.toThrow('signaldock.db not found');
|
|
81
|
+
|
|
82
|
+
rmSync(emptyDir, { recursive: true, force: true });
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('has name "local"', () => {
|
|
86
|
+
const transport = new LocalTransport();
|
|
87
|
+
expect(transport.name).toBe('local');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// --------------------------------------------------------------------------
|
|
92
|
+
// Push
|
|
93
|
+
// --------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
describe('push', () => {
|
|
96
|
+
it('stores a direct message and returns a message ID', async () => {
|
|
97
|
+
const transport = new LocalTransport();
|
|
98
|
+
await transport.connect(testConfig('sender'));
|
|
99
|
+
|
|
100
|
+
const result = await transport.push('receiver', 'hello from sender');
|
|
101
|
+
expect(result.messageId).toBeDefined();
|
|
102
|
+
expect(typeof result.messageId).toBe('string');
|
|
103
|
+
expect(result.messageId.length).toBeGreaterThan(0);
|
|
104
|
+
|
|
105
|
+
await transport.disconnect();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('stores a message in a conversation', async () => {
|
|
109
|
+
const sender = new LocalTransport();
|
|
110
|
+
const receiver = new LocalTransport();
|
|
111
|
+
await sender.connect(testConfig('sender'));
|
|
112
|
+
await receiver.connect(testConfig('receiver'));
|
|
113
|
+
|
|
114
|
+
// First push creates a DM conversation, then use that ID
|
|
115
|
+
const dm = await sender.push('receiver', 'setup');
|
|
116
|
+
const messages = await receiver.poll();
|
|
117
|
+
expect(messages).toHaveLength(1);
|
|
118
|
+
const convId = messages[0].threadId;
|
|
119
|
+
expect(convId).toBeDefined();
|
|
120
|
+
|
|
121
|
+
// Now send within that conversation
|
|
122
|
+
const result = await sender.push('receiver', 'group msg', {
|
|
123
|
+
conversationId: convId,
|
|
124
|
+
});
|
|
125
|
+
expect(result.messageId).toBeDefined();
|
|
126
|
+
|
|
127
|
+
await sender.disconnect();
|
|
128
|
+
await receiver.disconnect();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('throws when not connected', async () => {
|
|
132
|
+
const transport = new LocalTransport();
|
|
133
|
+
await expect(transport.push('to', 'content')).rejects.toThrow('not connected');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// --------------------------------------------------------------------------
|
|
138
|
+
// Poll
|
|
139
|
+
// --------------------------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
describe('poll', () => {
|
|
142
|
+
it('returns messages addressed to the connected agent', async () => {
|
|
143
|
+
const sender = new LocalTransport();
|
|
144
|
+
const receiver = new LocalTransport();
|
|
145
|
+
|
|
146
|
+
await sender.connect(testConfig('sender'));
|
|
147
|
+
await receiver.connect(testConfig('receiver'));
|
|
148
|
+
|
|
149
|
+
await sender.push('receiver', 'message 1');
|
|
150
|
+
await sender.push('receiver', 'message 2');
|
|
151
|
+
|
|
152
|
+
const messages = await receiver.poll();
|
|
153
|
+
expect(messages).toHaveLength(2);
|
|
154
|
+
expect(messages[0].from).toBe('sender');
|
|
155
|
+
expect(messages[0].content).toBe('message 1');
|
|
156
|
+
expect(messages[1].content).toBe('message 2');
|
|
157
|
+
|
|
158
|
+
await sender.disconnect();
|
|
159
|
+
await receiver.disconnect();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('returns empty array when no messages', async () => {
|
|
163
|
+
const transport = new LocalTransport();
|
|
164
|
+
await transport.connect(testConfig('lonely'));
|
|
165
|
+
|
|
166
|
+
const messages = await transport.poll();
|
|
167
|
+
expect(messages).toHaveLength(0);
|
|
168
|
+
|
|
169
|
+
await transport.disconnect();
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('respects limit parameter', async () => {
|
|
173
|
+
const sender = new LocalTransport();
|
|
174
|
+
const receiver = new LocalTransport();
|
|
175
|
+
|
|
176
|
+
await sender.connect(testConfig('sender'));
|
|
177
|
+
await receiver.connect(testConfig('receiver'));
|
|
178
|
+
|
|
179
|
+
for (let i = 0; i < 5; i++) {
|
|
180
|
+
await sender.push('receiver', `msg ${i}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const messages = await receiver.poll({ limit: 2 });
|
|
184
|
+
expect(messages).toHaveLength(2);
|
|
185
|
+
|
|
186
|
+
await sender.disconnect();
|
|
187
|
+
await receiver.disconnect();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('returns messages oldest first', async () => {
|
|
191
|
+
const sender = new LocalTransport();
|
|
192
|
+
const receiver = new LocalTransport();
|
|
193
|
+
|
|
194
|
+
await sender.connect(testConfig('sender'));
|
|
195
|
+
await receiver.connect(testConfig('receiver'));
|
|
196
|
+
|
|
197
|
+
await sender.push('receiver', 'first');
|
|
198
|
+
await sender.push('receiver', 'second');
|
|
199
|
+
await sender.push('receiver', 'third');
|
|
200
|
+
|
|
201
|
+
const messages = await receiver.poll();
|
|
202
|
+
expect(messages[0].content).toBe('first');
|
|
203
|
+
expect(messages[2].content).toBe('third');
|
|
204
|
+
|
|
205
|
+
await sender.disconnect();
|
|
206
|
+
await receiver.disconnect();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// --------------------------------------------------------------------------
|
|
211
|
+
// Ack
|
|
212
|
+
// --------------------------------------------------------------------------
|
|
213
|
+
|
|
214
|
+
describe('ack', () => {
|
|
215
|
+
it('marks messages as delivered so they are not re-polled', async () => {
|
|
216
|
+
const sender = new LocalTransport();
|
|
217
|
+
const receiver = new LocalTransport();
|
|
218
|
+
|
|
219
|
+
await sender.connect(testConfig('sender'));
|
|
220
|
+
await receiver.connect(testConfig('receiver'));
|
|
221
|
+
|
|
222
|
+
await sender.push('receiver', 'ack me');
|
|
223
|
+
const before = await receiver.poll();
|
|
224
|
+
expect(before).toHaveLength(1);
|
|
225
|
+
|
|
226
|
+
await receiver.ack([before[0].id]);
|
|
227
|
+
|
|
228
|
+
const after = await receiver.poll();
|
|
229
|
+
expect(after).toHaveLength(0);
|
|
230
|
+
|
|
231
|
+
await sender.disconnect();
|
|
232
|
+
await receiver.disconnect();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('handles empty messageIds array', async () => {
|
|
236
|
+
const transport = new LocalTransport();
|
|
237
|
+
await transport.connect(testConfig());
|
|
238
|
+
await transport.ack([]);
|
|
239
|
+
await transport.disconnect();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// --------------------------------------------------------------------------
|
|
244
|
+
// Subscribe
|
|
245
|
+
// --------------------------------------------------------------------------
|
|
246
|
+
|
|
247
|
+
describe('subscribe', () => {
|
|
248
|
+
it('notifies subscribers on push', async () => {
|
|
249
|
+
const transport = new LocalTransport();
|
|
250
|
+
await transport.connect(testConfig('agent'));
|
|
251
|
+
|
|
252
|
+
const received: string[] = [];
|
|
253
|
+
const unsub = transport.subscribe((msg) => {
|
|
254
|
+
received.push(msg.content);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
await transport.push('someone', 'hello');
|
|
258
|
+
expect(received).toContain('hello');
|
|
259
|
+
|
|
260
|
+
unsub();
|
|
261
|
+
await transport.disconnect();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('returns unsubscribe function that stops notifications', async () => {
|
|
265
|
+
const transport = new LocalTransport();
|
|
266
|
+
await transport.connect(testConfig('agent'));
|
|
267
|
+
|
|
268
|
+
const received: string[] = [];
|
|
269
|
+
const unsub = transport.subscribe((msg) => {
|
|
270
|
+
received.push(msg.content);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
await transport.push('someone', 'before');
|
|
274
|
+
unsub();
|
|
275
|
+
await transport.push('someone', 'after');
|
|
276
|
+
|
|
277
|
+
expect(received).toContain('before');
|
|
278
|
+
expect(received).not.toContain('after');
|
|
279
|
+
|
|
280
|
+
await transport.disconnect();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// --------------------------------------------------------------------------
|
|
285
|
+
// Disconnect
|
|
286
|
+
// --------------------------------------------------------------------------
|
|
287
|
+
|
|
288
|
+
describe('disconnect', () => {
|
|
289
|
+
it('clears state and is safe to call twice', async () => {
|
|
290
|
+
const transport = new LocalTransport();
|
|
291
|
+
await transport.connect(testConfig());
|
|
292
|
+
await transport.disconnect();
|
|
293
|
+
await transport.disconnect(); // Should not throw
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('makes subsequent operations throw', async () => {
|
|
297
|
+
const transport = new LocalTransport();
|
|
298
|
+
await transport.connect(testConfig());
|
|
299
|
+
await transport.disconnect();
|
|
300
|
+
await expect(transport.poll()).rejects.toThrow('not connected');
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// --------------------------------------------------------------------------
|
|
305
|
+
// Concurrent writes (DB locking regression)
|
|
306
|
+
// --------------------------------------------------------------------------
|
|
307
|
+
|
|
308
|
+
describe('concurrent writes', () => {
|
|
309
|
+
it('handles parallel pushes from multiple transports without locking', async () => {
|
|
310
|
+
const agents = ['alpha', 'beta', 'gamma', 'delta', 'epsilon'];
|
|
311
|
+
const transports: LocalTransport[] = [];
|
|
312
|
+
|
|
313
|
+
for (const id of agents) {
|
|
314
|
+
const t = new LocalTransport();
|
|
315
|
+
await t.connect(testConfig(id));
|
|
316
|
+
transports.push(t);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// All 5 agents send messages to each other simultaneously
|
|
320
|
+
const sends = agents.flatMap((sender, i) =>
|
|
321
|
+
agents
|
|
322
|
+
.filter((_, j) => i !== j)
|
|
323
|
+
.map((receiver) => transports[i].push(receiver, `msg from ${sender} to ${receiver}`)),
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
// 20 concurrent sends (5 agents * 4 targets each)
|
|
327
|
+
const results = await Promise.all(sends);
|
|
328
|
+
expect(results).toHaveLength(20);
|
|
329
|
+
for (const r of results) {
|
|
330
|
+
expect(r.messageId).toBeDefined();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Each agent should have 4 pending messages
|
|
334
|
+
for (let i = 0; i < agents.length; i++) {
|
|
335
|
+
const messages = await transports[i].poll();
|
|
336
|
+
expect(messages).toHaveLength(4);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
for (const t of transports) await t.disconnect();
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it('handles rapid sequential push+poll+ack cycles without locking', async () => {
|
|
343
|
+
const sender = new LocalTransport();
|
|
344
|
+
const receiver = new LocalTransport();
|
|
345
|
+
await sender.connect(testConfig('rapid-sender'));
|
|
346
|
+
await receiver.connect(testConfig('rapid-receiver'));
|
|
347
|
+
|
|
348
|
+
// 50 rapid cycles of push → poll → ack
|
|
349
|
+
for (let i = 0; i < 50; i++) {
|
|
350
|
+
await sender.push('rapid-receiver', `cycle-${i}`);
|
|
351
|
+
const msgs = await receiver.poll({ limit: 1 });
|
|
352
|
+
expect(msgs).toHaveLength(1);
|
|
353
|
+
expect(msgs[0].content).toBe(`cycle-${i}`);
|
|
354
|
+
await receiver.ack([msgs[0].id]);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Queue should be empty
|
|
358
|
+
const remaining = await receiver.poll();
|
|
359
|
+
expect(remaining).toHaveLength(0);
|
|
360
|
+
|
|
361
|
+
await sender.disconnect();
|
|
362
|
+
await receiver.disconnect();
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('handles concurrent push and poll from different transports', async () => {
|
|
366
|
+
const writer = new LocalTransport();
|
|
367
|
+
const reader = new LocalTransport();
|
|
368
|
+
await writer.connect(testConfig('writer'));
|
|
369
|
+
await reader.connect(testConfig('reader'));
|
|
370
|
+
|
|
371
|
+
// Push 100 messages as fast as possible
|
|
372
|
+
const pushPromises = Array.from({ length: 100 }, (_, i) =>
|
|
373
|
+
writer.push('reader', `burst-${i}`),
|
|
374
|
+
);
|
|
375
|
+
await Promise.all(pushPromises);
|
|
376
|
+
|
|
377
|
+
// Poll all at once
|
|
378
|
+
const messages = await reader.poll({ limit: 100 });
|
|
379
|
+
expect(messages).toHaveLength(100);
|
|
380
|
+
|
|
381
|
+
// Ack all at once
|
|
382
|
+
await reader.ack(messages.map((m) => m.id));
|
|
383
|
+
|
|
384
|
+
// Should be empty now
|
|
385
|
+
const remaining = await reader.poll();
|
|
386
|
+
expect(remaining).toHaveLength(0);
|
|
387
|
+
|
|
388
|
+
await writer.disconnect();
|
|
389
|
+
await reader.disconnect();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it('handles simultaneous push and poll operations (race condition test)', async () => {
|
|
393
|
+
const a = new LocalTransport();
|
|
394
|
+
const b = new LocalTransport();
|
|
395
|
+
await a.connect(testConfig('agent-a'));
|
|
396
|
+
await b.connect(testConfig('agent-b'));
|
|
397
|
+
|
|
398
|
+
// Simultaneously: A sends to B, B sends to A, both poll
|
|
399
|
+
const [sendAB, sendBA, pollA, pollB] = await Promise.allSettled([
|
|
400
|
+
a.push('agent-b', 'a-to-b'),
|
|
401
|
+
b.push('agent-a', 'b-to-a'),
|
|
402
|
+
a.poll(),
|
|
403
|
+
b.poll(),
|
|
404
|
+
]);
|
|
405
|
+
|
|
406
|
+
// All operations should succeed (no DB locking errors)
|
|
407
|
+
expect(sendAB.status).toBe('fulfilled');
|
|
408
|
+
expect(sendBA.status).toBe('fulfilled');
|
|
409
|
+
expect(pollA.status).toBe('fulfilled');
|
|
410
|
+
expect(pollB.status).toBe('fulfilled');
|
|
411
|
+
|
|
412
|
+
await a.disconnect();
|
|
413
|
+
await b.disconnect();
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// --------------------------------------------------------------------------
|
|
418
|
+
// Multi-agent communication (daemon scenario)
|
|
419
|
+
// --------------------------------------------------------------------------
|
|
420
|
+
|
|
421
|
+
describe('multi-agent communication', () => {
|
|
422
|
+
it('simulates full daemon message flow: prime → agents → prime', async () => {
|
|
423
|
+
const prime = new LocalTransport();
|
|
424
|
+
const core = new LocalTransport();
|
|
425
|
+
const dev = new LocalTransport();
|
|
426
|
+
await prime.connect(testConfig('cleo-prime'));
|
|
427
|
+
await core.connect(testConfig('signaldock-core'));
|
|
428
|
+
await dev.connect(testConfig('cleo-dev'));
|
|
429
|
+
|
|
430
|
+
// Prime sends task assignments to both agents
|
|
431
|
+
await prime.push('signaldock-core', '/action #task-assignment T001');
|
|
432
|
+
await prime.push('cleo-dev', '/action #task-assignment T002');
|
|
433
|
+
|
|
434
|
+
// Both agents receive their assignments
|
|
435
|
+
const coreMessages = await core.poll();
|
|
436
|
+
const devMessages = await dev.poll();
|
|
437
|
+
expect(coreMessages).toHaveLength(1);
|
|
438
|
+
expect(devMessages).toHaveLength(1);
|
|
439
|
+
expect(coreMessages[0].content).toContain('T001');
|
|
440
|
+
expect(devMessages[0].content).toContain('T002');
|
|
441
|
+
|
|
442
|
+
// Agents ack and respond
|
|
443
|
+
await core.ack([coreMessages[0].id]);
|
|
444
|
+
await dev.ack([devMessages[0].id]);
|
|
445
|
+
await core.push('cleo-prime', 'T001 complete');
|
|
446
|
+
await dev.push('cleo-prime', 'T002 complete');
|
|
447
|
+
|
|
448
|
+
// Prime collects results
|
|
449
|
+
const results = await prime.poll();
|
|
450
|
+
expect(results).toHaveLength(2);
|
|
451
|
+
expect(results.map((m) => m.content).sort()).toEqual(['T001 complete', 'T002 complete']);
|
|
452
|
+
|
|
453
|
+
// Prime acks
|
|
454
|
+
await prime.ack(results.map((m) => m.id));
|
|
455
|
+
const empty = await prime.poll();
|
|
456
|
+
expect(empty).toHaveLength(0);
|
|
457
|
+
|
|
458
|
+
await prime.disconnect();
|
|
459
|
+
await core.disconnect();
|
|
460
|
+
await dev.disconnect();
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
it('group conversation: multiple agents in one thread', async () => {
|
|
464
|
+
const prime = new LocalTransport();
|
|
465
|
+
const agent1 = new LocalTransport();
|
|
466
|
+
const agent2 = new LocalTransport();
|
|
467
|
+
await prime.connect(testConfig('prime'));
|
|
468
|
+
await agent1.connect(testConfig('agent-1'));
|
|
469
|
+
await agent2.connect(testConfig('agent-2'));
|
|
470
|
+
|
|
471
|
+
// Prime sends to agent-1 to establish a conversation
|
|
472
|
+
await prime.push('agent-1', 'all-hands meeting');
|
|
473
|
+
const a1msgs = await agent1.poll();
|
|
474
|
+
const convId = a1msgs[0].threadId!;
|
|
475
|
+
|
|
476
|
+
// Now all agents can post to the same conversation
|
|
477
|
+
await prime.push('agent-1', 'status check', { conversationId: convId });
|
|
478
|
+
await prime.push('agent-2', 'status check', { conversationId: convId });
|
|
479
|
+
|
|
480
|
+
const a1status = await agent1.poll();
|
|
481
|
+
const a2status = await agent2.poll();
|
|
482
|
+
// agent-1 gets the second message (first was acked conceptually by reading convId)
|
|
483
|
+
expect(a1status.length).toBeGreaterThanOrEqual(1);
|
|
484
|
+
expect(a2status).toHaveLength(1);
|
|
485
|
+
expect(a2status[0].content).toBe('status check');
|
|
486
|
+
|
|
487
|
+
await prime.disconnect();
|
|
488
|
+
await agent1.disconnect();
|
|
489
|
+
await agent2.disconnect();
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
// --------------------------------------------------------------------------
|
|
494
|
+
// Static
|
|
495
|
+
// --------------------------------------------------------------------------
|
|
496
|
+
|
|
497
|
+
describe('isAvailable', () => {
|
|
498
|
+
it('returns true when signaldock.db exists', () => {
|
|
499
|
+
expect(LocalTransport.isAvailable(testDir)).toBe(true);
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
it('returns false when signaldock.db is missing', () => {
|
|
503
|
+
const emptyDir = join(tmpdir(), `no-db-${Date.now()}`);
|
|
504
|
+
mkdirSync(emptyDir, { recursive: true });
|
|
505
|
+
expect(LocalTransport.isAvailable(emptyDir)).toBe(false);
|
|
506
|
+
rmSync(emptyDir, { recursive: true, force: true });
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-transport.test.d.ts","sourceRoot":"","sources":["sse-transport.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|