@cleocode/core 2026.4.6 → 2026.4.7
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/package.json +7 -7
- package/dist/cant/approval.d.ts +0 -110
- package/dist/cant/approval.d.ts.map +0 -1
- package/dist/cant/context-builder.d.ts +0 -79
- package/dist/cant/context-builder.d.ts.map +0 -1
- package/dist/cant/discretion.d.ts +0 -95
- package/dist/cant/discretion.d.ts.map +0 -1
- package/dist/cant/index.d.ts +0 -25
- package/dist/cant/index.d.ts.map +0 -1
- package/dist/cant/parallel-runner.d.ts +0 -38
- package/dist/cant/parallel-runner.d.ts.map +0 -1
- package/dist/cant/types.d.ts +0 -127
- package/dist/cant/types.d.ts.map +0 -1
- package/dist/cant/workflow-executor.d.ts +0 -105
- package/dist/cant/workflow-executor.d.ts.map +0 -1
- package/src/__tests__/audit-prune.test.d.ts.map +0 -1
- package/src/__tests__/audit-prune.test.js +0 -162
- package/src/__tests__/audit-prune.test.js.map +0 -1
- package/src/__tests__/caamp-skill-install.test.d.ts.map +0 -1
- package/src/__tests__/caamp-skill-install.test.js +0 -147
- package/src/__tests__/caamp-skill-install.test.js.map +0 -1
- package/src/__tests__/cli-parity.test.d.ts.map +0 -1
- package/src/__tests__/cli-parity.test.js +0 -209
- package/src/__tests__/cli-parity.test.js.map +0 -1
- package/src/__tests__/config.test.d.ts.map +0 -1
- package/src/__tests__/config.test.js +0 -144
- package/src/__tests__/config.test.js.map +0 -1
- package/src/__tests__/core-parity.test.d.ts.map +0 -1
- package/src/__tests__/core-parity.test.js +0 -645
- package/src/__tests__/core-parity.test.js.map +0 -1
- package/src/__tests__/error-catalog.test.d.ts.map +0 -1
- package/src/__tests__/error-catalog.test.js +0 -127
- package/src/__tests__/error-catalog.test.js.map +0 -1
- package/src/__tests__/golden-parity.test.d.ts.map +0 -1
- package/src/__tests__/golden-parity.test.js +0 -212
- package/src/__tests__/golden-parity.test.js.map +0 -1
- package/src/__tests__/hooks.test.d.ts.map +0 -1
- package/src/__tests__/hooks.test.js +0 -201
- package/src/__tests__/hooks.test.js.map +0 -1
- package/src/__tests__/human-output.test.d.ts.map +0 -1
- package/src/__tests__/human-output.test.js +0 -158
- package/src/__tests__/human-output.test.js.map +0 -1
- package/src/__tests__/index-api-compat.test.d.ts.map +0 -1
- package/src/__tests__/index-api-compat.test.js +0 -16
- package/src/__tests__/index-api-compat.test.js.map +0 -1
- package/src/__tests__/init-e2e.test.d.ts.map +0 -1
- package/src/__tests__/init-e2e.test.js +0 -221
- package/src/__tests__/init-e2e.test.js.map +0 -1
- package/src/__tests__/injection-chain.test.d.ts.map +0 -1
- package/src/__tests__/injection-chain.test.js +0 -234
- package/src/__tests__/injection-chain.test.js.map +0 -1
- package/src/__tests__/injection-mvi-tiers.test.d.ts.map +0 -1
- package/src/__tests__/injection-mvi-tiers.test.js +0 -116
- package/src/__tests__/injection-mvi-tiers.test.js.map +0 -1
- package/src/__tests__/injection-shared.test.d.ts.map +0 -1
- package/src/__tests__/injection-shared.test.js +0 -194
- package/src/__tests__/injection-shared.test.js.map +0 -1
- package/src/__tests__/lafs-conformance.test.d.ts.map +0 -1
- package/src/__tests__/lafs-conformance.test.js +0 -786
- package/src/__tests__/lafs-conformance.test.js.map +0 -1
- package/src/__tests__/logger.test.d.ts.map +0 -1
- package/src/__tests__/logger.test.js +0 -75
- package/src/__tests__/logger.test.js.map +0 -1
- package/src/__tests__/paths.test.d.ts.map +0 -1
- package/src/__tests__/paths.test.js +0 -327
- package/src/__tests__/paths.test.js.map +0 -1
- package/src/__tests__/project-info.test.d.ts.map +0 -1
- package/src/__tests__/project-info.test.js +0 -156
- package/src/__tests__/project-info.test.js.map +0 -1
- package/src/__tests__/rcsd-pipeline-e2e.test.d.ts.map +0 -1
- package/src/__tests__/rcsd-pipeline-e2e.test.js +0 -263
- package/src/__tests__/rcsd-pipeline-e2e.test.js.map +0 -1
- package/src/__tests__/remote.test.d.ts.map +0 -1
- package/src/__tests__/remote.test.js +0 -149
- package/src/__tests__/remote.test.js.map +0 -1
- package/src/__tests__/scaffold.test.d.ts.map +0 -1
- package/src/__tests__/scaffold.test.js +0 -474
- package/src/__tests__/scaffold.test.js.map +0 -1
- package/src/__tests__/schema-management.test.d.ts.map +0 -1
- package/src/__tests__/schema-management.test.js +0 -287
- package/src/__tests__/schema-management.test.js.map +0 -1
- package/src/__tests__/schema.test.d.ts.map +0 -1
- package/src/__tests__/schema.test.js +0 -51
- package/src/__tests__/schema.test.js.map +0 -1
- package/src/__tests__/sharing.test.d.ts.map +0 -1
- package/src/__tests__/sharing.test.js +0 -160
- package/src/__tests__/sharing.test.js.map +0 -1
- package/src/__tests__/snapshot.test.d.ts.map +0 -1
- package/src/__tests__/snapshot.test.js +0 -72
- package/src/__tests__/snapshot.test.js.map +0 -1
- package/src/__tests__/upgrade.test.d.ts.map +0 -1
- package/src/__tests__/upgrade.test.js +0 -321
- package/src/__tests__/upgrade.test.js.map +0 -1
- package/src/adapters/__tests__/discovery.test.d.ts.map +0 -1
- package/src/adapters/__tests__/discovery.test.js +0 -56
- package/src/adapters/__tests__/discovery.test.js.map +0 -1
- package/src/adapters/__tests__/manager.test.d.ts.map +0 -1
- package/src/adapters/__tests__/manager.test.js +0 -260
- package/src/adapters/__tests__/manager.test.js.map +0 -1
- package/src/agents/__tests__/agent-registry.test.d.ts.map +0 -1
- package/src/agents/__tests__/agent-registry.test.js +0 -262
- package/src/agents/__tests__/agent-registry.test.js.map +0 -1
- package/src/agents/__tests__/capacity.test.d.ts.map +0 -1
- package/src/agents/__tests__/capacity.test.js +0 -173
- package/src/agents/__tests__/capacity.test.js.map +0 -1
- package/src/agents/__tests__/execution-learning.test.d.ts.map +0 -1
- package/src/agents/__tests__/execution-learning.test.js +0 -533
- package/src/agents/__tests__/execution-learning.test.js.map +0 -1
- package/src/agents/__tests__/health-monitor.test.d.ts.map +0 -1
- package/src/agents/__tests__/health-monitor.test.js +0 -259
- package/src/agents/__tests__/health-monitor.test.js.map +0 -1
- package/src/agents/__tests__/registry.test.d.ts.map +0 -1
- package/src/agents/__tests__/registry.test.js +0 -373
- package/src/agents/__tests__/registry.test.js.map +0 -1
- package/src/agents/__tests__/retry.test.d.ts.map +0 -1
- package/src/agents/__tests__/retry.test.js +0 -225
- package/src/agents/__tests__/retry.test.js.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.d.ts.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.js +0 -77
- package/src/cant/__tests__/cant-agent-parse.test.js.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.ts +0 -94
- package/src/cant/approval.ts +0 -218
- package/src/cant/context-builder.ts +0 -135
- package/src/cant/discretion.ts +0 -149
- package/src/cant/index.ts +0 -58
- package/src/cant/parallel-runner.ts +0 -205
- package/src/cant/types.ts +0 -158
- package/src/cant/workflow-executor.ts +0 -618
- package/src/compliance/__tests__/sync.test.d.ts.map +0 -1
- package/src/compliance/__tests__/sync.test.js +0 -119
- package/src/compliance/__tests__/sync.test.js.map +0 -1
- package/src/conduit/__tests__/local-credential-flow.test.d.ts.map +0 -1
- package/src/conduit/__tests__/local-credential-flow.test.js +0 -185
- package/src/conduit/__tests__/local-credential-flow.test.js.map +0 -1
- package/src/conduit/__tests__/local-transport.test.d.ts.map +0 -1
- package/src/conduit/__tests__/local-transport.test.js +0 -404
- package/src/conduit/__tests__/local-transport.test.js.map +0 -1
- package/src/conduit/__tests__/sse-transport.test.d.ts.map +0 -1
- package/src/conduit/__tests__/sse-transport.test.js +0 -291
- package/src/conduit/__tests__/sse-transport.test.js.map +0 -1
- package/src/hooks/__tests__/provider-hooks.test.d.ts.map +0 -1
- package/src/hooks/__tests__/provider-hooks.test.js +0 -33
- package/src/hooks/__tests__/provider-hooks.test.js.map +0 -1
- package/src/hooks/__tests__/registry.test.d.ts.map +0 -1
- package/src/hooks/__tests__/registry.test.js +0 -37
- package/src/hooks/__tests__/registry.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/error-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/error-hooks.test.js +0 -90
- package/src/hooks/handlers/__tests__/error-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/file-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/file-hooks.test.js +0 -128
- package/src/hooks/handlers/__tests__/file-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +0 -503
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/session-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/session-hooks.test.js +0 -54
- package/src/hooks/handlers/__tests__/session-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/task-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/task-hooks.test.js +0 -77
- package/src/hooks/handlers/__tests__/task-hooks.test.js.map +0 -1
- package/src/intelligence/__tests__/adaptive-validation.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/adaptive-validation.test.js +0 -517
- package/src/intelligence/__tests__/adaptive-validation.test.js.map +0 -1
- package/src/intelligence/__tests__/impact.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/impact.test.js +0 -515
- package/src/intelligence/__tests__/impact.test.js.map +0 -1
- package/src/intelligence/__tests__/patterns.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/patterns.test.js +0 -370
- package/src/intelligence/__tests__/patterns.test.js.map +0 -1
- package/src/intelligence/__tests__/prediction.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/prediction.test.js +0 -314
- package/src/intelligence/__tests__/prediction.test.js.map +0 -1
- package/src/lib/__tests__/retry.test.d.ts.map +0 -1
- package/src/lib/__tests__/retry.test.js +0 -225
- package/src/lib/__tests__/retry.test.js.map +0 -1
- package/src/lifecycle/__tests__/chain-store.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/chain-store.test.js +0 -243
- package/src/lifecycle/__tests__/chain-store.test.js.map +0 -1
- package/src/lifecycle/__tests__/consolidate-rcasd.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/consolidate-rcasd.test.js +0 -210
- package/src/lifecycle/__tests__/consolidate-rcasd.test.js.map +0 -1
- package/src/lifecycle/__tests__/default-chain.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/default-chain.test.js +0 -74
- package/src/lifecycle/__tests__/default-chain.test.js.map +0 -1
- package/src/lifecycle/__tests__/frontmatter.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/frontmatter.test.js +0 -229
- package/src/lifecycle/__tests__/frontmatter.test.js.map +0 -1
- package/src/lifecycle/__tests__/lifecycle.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/lifecycle.test.js +0 -126
- package/src/lifecycle/__tests__/lifecycle.test.js.map +0 -1
- package/src/lifecycle/__tests__/pipeline.integration.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/pipeline.integration.test.js +0 -977
- package/src/lifecycle/__tests__/pipeline.integration.test.js.map +0 -1
- package/src/lifecycle/__tests__/rcasd-paths.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/rcasd-paths.test.js +0 -206
- package/src/lifecycle/__tests__/rcasd-paths.test.js.map +0 -1
- package/src/lifecycle/__tests__/resume-schema-contract.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/resume-schema-contract.test.js +0 -246
- package/src/lifecycle/__tests__/resume-schema-contract.test.js.map +0 -1
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.js +0 -95
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.js.map +0 -1
- package/src/lifecycle/__tests__/tessera-engine.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/tessera-engine.test.js +0 -392
- package/src/lifecycle/__tests__/tessera-engine.test.js.map +0 -1
- package/src/memory/__tests__/auto-extract.test.d.ts.map +0 -1
- package/src/memory/__tests__/auto-extract.test.js +0 -197
- package/src/memory/__tests__/auto-extract.test.js.map +0 -1
- package/src/memory/__tests__/brain-automation.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-automation.test.js +0 -730
- package/src/memory/__tests__/brain-automation.test.js.map +0 -1
- package/src/memory/__tests__/brain-embedding.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-embedding.test.js +0 -92
- package/src/memory/__tests__/brain-embedding.test.js.map +0 -1
- package/src/memory/__tests__/brain-links.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-links.test.js +0 -221
- package/src/memory/__tests__/brain-links.test.js.map +0 -1
- package/src/memory/__tests__/brain-migration.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-migration.test.js +0 -180
- package/src/memory/__tests__/brain-migration.test.js.map +0 -1
- package/src/memory/__tests__/brain-retrieval.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-retrieval.test.js +0 -701
- package/src/memory/__tests__/brain-retrieval.test.js.map +0 -1
- package/src/memory/__tests__/brain-search.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-search.test.js +0 -180
- package/src/memory/__tests__/brain-search.test.js.map +0 -1
- package/src/memory/__tests__/claude-mem-migration.test.d.ts.map +0 -1
- package/src/memory/__tests__/claude-mem-migration.test.js +0 -424
- package/src/memory/__tests__/claude-mem-migration.test.js.map +0 -1
- package/src/memory/__tests__/decisions.test.d.ts.map +0 -1
- package/src/memory/__tests__/decisions.test.js +0 -253
- package/src/memory/__tests__/decisions.test.js.map +0 -1
- package/src/memory/__tests__/engine-compat.test.d.ts.map +0 -1
- package/src/memory/__tests__/engine-compat.test.js +0 -331
- package/src/memory/__tests__/engine-compat.test.js.map +0 -1
- package/src/memory/__tests__/memory-bridge.test.d.ts.map +0 -1
- package/src/memory/__tests__/memory-bridge.test.js +0 -231
- package/src/memory/__tests__/memory-bridge.test.js.map +0 -1
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.d.ts.map +0 -1
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.js +0 -516
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.js.map +0 -1
- package/src/memory/__tests__/session-memory.test.d.ts.map +0 -1
- package/src/memory/__tests__/session-memory.test.js +0 -387
- package/src/memory/__tests__/session-memory.test.js.map +0 -1
- package/src/metrics/__tests__/model-provider-registry.test.d.ts.map +0 -1
- package/src/metrics/__tests__/model-provider-registry.test.js +0 -45
- package/src/metrics/__tests__/model-provider-registry.test.js.map +0 -1
- package/src/metrics/__tests__/provider-detection.test.d.ts.map +0 -1
- package/src/metrics/__tests__/provider-detection.test.js +0 -123
- package/src/metrics/__tests__/provider-detection.test.js.map +0 -1
- package/src/migration/__tests__/checksum.test.d.ts.map +0 -1
- package/src/migration/__tests__/checksum.test.js +0 -216
- package/src/migration/__tests__/checksum.test.js.map +0 -1
- package/src/migration/__tests__/logger.test.d.ts.map +0 -1
- package/src/migration/__tests__/logger.test.js +0 -256
- package/src/migration/__tests__/logger.test.js.map +0 -1
- package/src/migration/__tests__/migration-failure.integration.test.d.ts.map +0 -1
- package/src/migration/__tests__/migration-failure.integration.test.js +0 -515
- package/src/migration/__tests__/migration-failure.integration.test.js.map +0 -1
- package/src/migration/__tests__/migration.test.d.ts.map +0 -1
- package/src/migration/__tests__/migration.test.js +0 -82
- package/src/migration/__tests__/migration.test.js.map +0 -1
- package/src/migration/__tests__/state.test.d.ts.map +0 -1
- package/src/migration/__tests__/state.test.js +0 -330
- package/src/migration/__tests__/state.test.js.map +0 -1
- package/src/migration/__tests__/validate.test.d.ts.map +0 -1
- package/src/migration/__tests__/validate.test.js +0 -258
- package/src/migration/__tests__/validate.test.js.map +0 -1
- package/src/nexus/__tests__/deps.test.d.ts.map +0 -1
- package/src/nexus/__tests__/deps.test.js +0 -283
- package/src/nexus/__tests__/deps.test.js.map +0 -1
- package/src/nexus/__tests__/nexus-e2e.test.d.ts.map +0 -1
- package/src/nexus/__tests__/nexus-e2e.test.js +0 -1220
- package/src/nexus/__tests__/nexus-e2e.test.js.map +0 -1
- package/src/nexus/__tests__/permissions.test.d.ts.map +0 -1
- package/src/nexus/__tests__/permissions.test.js +0 -119
- package/src/nexus/__tests__/permissions.test.js.map +0 -1
- package/src/nexus/__tests__/query.test.d.ts.map +0 -1
- package/src/nexus/__tests__/query.test.js +0 -168
- package/src/nexus/__tests__/query.test.js.map +0 -1
- package/src/nexus/__tests__/reconcile.test.d.ts.map +0 -1
- package/src/nexus/__tests__/reconcile.test.js +0 -135
- package/src/nexus/__tests__/reconcile.test.js.map +0 -1
- package/src/nexus/__tests__/registry.test.d.ts.map +0 -1
- package/src/nexus/__tests__/registry.test.js +0 -229
- package/src/nexus/__tests__/registry.test.js.map +0 -1
- package/src/nexus/__tests__/transfer.test.d.ts.map +0 -1
- package/src/nexus/__tests__/transfer.test.js +0 -372
- package/src/nexus/__tests__/transfer.test.js.map +0 -1
- package/src/observability/__tests__/index.test.d.ts.map +0 -1
- package/src/observability/__tests__/index.test.js +0 -288
- package/src/observability/__tests__/index.test.js.map +0 -1
- package/src/observability/__tests__/log-filter.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-filter.test.js +0 -151
- package/src/observability/__tests__/log-filter.test.js.map +0 -1
- package/src/observability/__tests__/log-parser.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-parser.test.js +0 -170
- package/src/observability/__tests__/log-parser.test.js.map +0 -1
- package/src/observability/__tests__/log-reader.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-reader.test.js +0 -150
- package/src/observability/__tests__/log-reader.test.js.map +0 -1
- package/src/orchestration/__tests__/autonomous-spec.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/autonomous-spec.test.js +0 -419
- package/src/orchestration/__tests__/autonomous-spec.test.js.map +0 -1
- package/src/orchestration/__tests__/orchestration.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/orchestration.test.js +0 -205
- package/src/orchestration/__tests__/orchestration.test.js.map +0 -1
- package/src/orchestration/__tests__/protocol-validators.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/protocol-validators.test.js +0 -602
- package/src/orchestration/__tests__/protocol-validators.test.js.map +0 -1
- package/src/phases/__tests__/deps.test.d.ts.map +0 -1
- package/src/phases/__tests__/deps.test.js +0 -210
- package/src/phases/__tests__/deps.test.js.map +0 -1
- package/src/phases/__tests__/phases.test.d.ts.map +0 -1
- package/src/phases/__tests__/phases.test.js +0 -215
- package/src/phases/__tests__/phases.test.js.map +0 -1
- package/src/release/__tests__/artifacts.test.d.ts.map +0 -1
- package/src/release/__tests__/artifacts.test.js +0 -65
- package/src/release/__tests__/artifacts.test.js.map +0 -1
- package/src/release/__tests__/cancel-release.test.d.ts.map +0 -1
- package/src/release/__tests__/cancel-release.test.js +0 -154
- package/src/release/__tests__/cancel-release.test.js.map +0 -1
- package/src/release/__tests__/changelog-writer.test.d.ts.map +0 -1
- package/src/release/__tests__/changelog-writer.test.js +0 -132
- package/src/release/__tests__/changelog-writer.test.js.map +0 -1
- package/src/release/__tests__/push-policy.test.d.ts.map +0 -1
- package/src/release/__tests__/push-policy.test.js +0 -142
- package/src/release/__tests__/push-policy.test.js.map +0 -1
- package/src/release/__tests__/release.test.d.ts.map +0 -1
- package/src/release/__tests__/release.test.js +0 -25
- package/src/release/__tests__/release.test.js.map +0 -1
- package/src/sequence/__tests__/allocate.test.d.ts.map +0 -1
- package/src/sequence/__tests__/allocate.test.js +0 -113
- package/src/sequence/__tests__/allocate.test.js.map +0 -1
- package/src/sessions/__tests__/briefing-blocked.test.d.ts.map +0 -1
- package/src/sessions/__tests__/briefing-blocked.test.js +0 -117
- package/src/sessions/__tests__/briefing-blocked.test.js.map +0 -1
- package/src/sessions/__tests__/briefing.test.d.ts.map +0 -1
- package/src/sessions/__tests__/briefing.test.js +0 -336
- package/src/sessions/__tests__/briefing.test.js.map +0 -1
- package/src/sessions/__tests__/handoff-integration.test.d.ts.map +0 -1
- package/src/sessions/__tests__/handoff-integration.test.js +0 -264
- package/src/sessions/__tests__/handoff-integration.test.js.map +0 -1
- package/src/sessions/__tests__/handoff.test.d.ts.map +0 -1
- package/src/sessions/__tests__/handoff.test.js +0 -435
- package/src/sessions/__tests__/handoff.test.js.map +0 -1
- package/src/sessions/__tests__/index.test.d.ts.map +0 -1
- package/src/sessions/__tests__/index.test.js +0 -82
- package/src/sessions/__tests__/index.test.js.map +0 -1
- package/src/sessions/__tests__/session-cleanup.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-cleanup.test.js +0 -201
- package/src/sessions/__tests__/session-cleanup.test.js.map +0 -1
- package/src/sessions/__tests__/session-edge-cases.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-edge-cases.test.js +0 -251
- package/src/sessions/__tests__/session-edge-cases.test.js.map +0 -1
- package/src/sessions/__tests__/session-find.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-find.test.js +0 -210
- package/src/sessions/__tests__/session-find.test.js.map +0 -1
- package/src/sessions/__tests__/session-grade.integration.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-grade.integration.test.js +0 -287
- package/src/sessions/__tests__/session-grade.integration.test.js.map +0 -1
- package/src/sessions/__tests__/session-grade.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-grade.test.js +0 -630
- package/src/sessions/__tests__/session-grade.test.js.map +0 -1
- package/src/sessions/__tests__/session-memory-bridge.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-memory-bridge.test.js +0 -52
- package/src/sessions/__tests__/session-memory-bridge.test.js.map +0 -1
- package/src/sessions/__tests__/sessions.test.d.ts.map +0 -1
- package/src/sessions/__tests__/sessions.test.js +0 -113
- package/src/sessions/__tests__/sessions.test.js.map +0 -1
- package/src/skills/__tests__/discovery.test.d.ts.map +0 -1
- package/src/skills/__tests__/discovery.test.js +0 -171
- package/src/skills/__tests__/discovery.test.js.map +0 -1
- package/src/skills/__tests__/dispatch.test.d.ts.map +0 -1
- package/src/skills/__tests__/dispatch.test.js +0 -99
- package/src/skills/__tests__/dispatch.test.js.map +0 -1
- package/src/skills/__tests__/dynamic-skill-generator.test.d.ts.map +0 -1
- package/src/skills/__tests__/dynamic-skill-generator.test.js +0 -77
- package/src/skills/__tests__/dynamic-skill-generator.test.js.map +0 -1
- package/src/skills/__tests__/manifests.test.d.ts.map +0 -1
- package/src/skills/__tests__/manifests.test.js +0 -121
- package/src/skills/__tests__/manifests.test.js.map +0 -1
- package/src/skills/__tests__/precedence.test.d.ts.map +0 -1
- package/src/skills/__tests__/precedence.test.js +0 -325
- package/src/skills/__tests__/precedence.test.js.map +0 -1
- package/src/skills/__tests__/routing-table.test.d.ts.map +0 -1
- package/src/skills/__tests__/routing-table.test.js +0 -91
- package/src/skills/__tests__/routing-table.test.js.map +0 -1
- package/src/skills/__tests__/skill-paths.test.d.ts.map +0 -1
- package/src/skills/__tests__/skill-paths.test.js +0 -71
- package/src/skills/__tests__/skill-paths.test.js.map +0 -1
- package/src/skills/__tests__/test-utility.test.d.ts.map +0 -1
- package/src/skills/__tests__/test-utility.test.js +0 -59
- package/src/skills/__tests__/test-utility.test.js.map +0 -1
- package/src/skills/__tests__/token.test.d.ts.map +0 -1
- package/src/skills/__tests__/token.test.js +0 -135
- package/src/skills/__tests__/token.test.js.map +0 -1
- package/src/skills/__tests__/validation.test.d.ts.map +0 -1
- package/src/skills/__tests__/validation.test.js +0 -108
- package/src/skills/__tests__/validation.test.js.map +0 -1
- package/src/skills/__tests__/version.test.d.ts.map +0 -1
- package/src/skills/__tests__/version.test.js +0 -71
- package/src/skills/__tests__/version.test.js.map +0 -1
- package/src/skills/injection/__tests__/subagent.test.d.ts.map +0 -1
- package/src/skills/injection/__tests__/subagent.test.js +0 -122
- package/src/skills/injection/__tests__/subagent.test.js.map +0 -1
- package/src/skills/orchestrator/__tests__/spawn-tier.test.d.ts.map +0 -1
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js +0 -228
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js.map +0 -1
- package/src/spawn/__tests__/adapter-registry.test.d.ts.map +0 -1
- package/src/spawn/__tests__/adapter-registry.test.js +0 -76
- package/src/spawn/__tests__/adapter-registry.test.js.map +0 -1
- package/src/stats/__tests__/stats.test.d.ts.map +0 -1
- package/src/stats/__tests__/stats.test.js +0 -374
- package/src/stats/__tests__/stats.test.js.map +0 -1
- package/src/sticky/__tests__/purge.test.d.ts.map +0 -1
- package/src/sticky/__tests__/purge.test.js +0 -64
- package/src/sticky/__tests__/purge.test.js.map +0 -1
- package/src/store/__tests__/atomic.test.d.ts.map +0 -1
- package/src/store/__tests__/atomic.test.js +0 -81
- package/src/store/__tests__/atomic.test.js.map +0 -1
- package/src/store/__tests__/backup.test.d.ts.map +0 -1
- package/src/store/__tests__/backup.test.js +0 -131
- package/src/store/__tests__/backup.test.js.map +0 -1
- package/src/store/__tests__/brain-accessor-pageindex.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-accessor-pageindex.test.js +0 -179
- package/src/store/__tests__/brain-accessor-pageindex.test.js.map +0 -1
- package/src/store/__tests__/brain-accessor.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-accessor.test.js +0 -398
- package/src/store/__tests__/brain-accessor.test.js.map +0 -1
- package/src/store/__tests__/brain-pageindex.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-pageindex.test.js +0 -137
- package/src/store/__tests__/brain-pageindex.test.js.map +0 -1
- package/src/store/__tests__/brain-schema.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-schema.test.js +0 -137
- package/src/store/__tests__/brain-schema.test.js.map +0 -1
- package/src/store/__tests__/brain-vec.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-vec.test.js +0 -100
- package/src/store/__tests__/brain-vec.test.js.map +0 -1
- package/src/store/__tests__/collision-detection.test.d.ts.map +0 -1
- package/src/store/__tests__/collision-detection.test.js +0 -165
- package/src/store/__tests__/collision-detection.test.js.map +0 -1
- package/src/store/__tests__/data-safety-central.test.d.ts.map +0 -1
- package/src/store/__tests__/data-safety-central.test.js +0 -408
- package/src/store/__tests__/data-safety-central.test.js.map +0 -1
- package/src/store/__tests__/db-helpers.test.d.ts.map +0 -1
- package/src/store/__tests__/db-helpers.test.js +0 -101
- package/src/store/__tests__/db-helpers.test.js.map +0 -1
- package/src/store/__tests__/e2e-safety-integration.test.d.ts.map +0 -1
- package/src/store/__tests__/e2e-safety-integration.test.js +0 -402
- package/src/store/__tests__/e2e-safety-integration.test.js.map +0 -1
- package/src/store/__tests__/git-checkpoint.test.d.ts.map +0 -1
- package/src/store/__tests__/git-checkpoint.test.js +0 -133
- package/src/store/__tests__/git-checkpoint.test.js.map +0 -1
- package/src/store/__tests__/idempotent-migration.test.d.ts.map +0 -1
- package/src/store/__tests__/idempotent-migration.test.js +0 -172
- package/src/store/__tests__/idempotent-migration.test.js.map +0 -1
- package/src/store/__tests__/import-logging.test.d.ts.map +0 -1
- package/src/store/__tests__/import-logging.test.js +0 -92
- package/src/store/__tests__/import-logging.test.js.map +0 -1
- package/src/store/__tests__/import-sort.test.d.ts.map +0 -1
- package/src/store/__tests__/import-sort.test.js +0 -109
- package/src/store/__tests__/import-sort.test.js.map +0 -1
- package/src/store/__tests__/json.test.d.ts.map +0 -1
- package/src/store/__tests__/json.test.js +0 -98
- package/src/store/__tests__/json.test.js.map +0 -1
- package/src/store/__tests__/lifecycle-schema-parity.test.d.ts.map +0 -1
- package/src/store/__tests__/lifecycle-schema-parity.test.js +0 -90
- package/src/store/__tests__/lifecycle-schema-parity.test.js.map +0 -1
- package/src/store/__tests__/migration-integration.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-integration.test.js +0 -238
- package/src/store/__tests__/migration-integration.test.js.map +0 -1
- package/src/store/__tests__/migration-retry.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-retry.test.js +0 -178
- package/src/store/__tests__/migration-retry.test.js.map +0 -1
- package/src/store/__tests__/migration-safety.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-safety.test.js +0 -756
- package/src/store/__tests__/migration-safety.test.js.map +0 -1
- package/src/store/__tests__/migration-sqlite.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-sqlite.test.js +0 -544
- package/src/store/__tests__/migration-sqlite.test.js.map +0 -1
- package/src/store/__tests__/performance-safety.test.d.ts.map +0 -1
- package/src/store/__tests__/performance-safety.test.js +0 -157
- package/src/store/__tests__/performance-safety.test.js.map +0 -1
- package/src/store/__tests__/project-detect.test.d.ts.map +0 -1
- package/src/store/__tests__/project-detect.test.js +0 -609
- package/src/store/__tests__/project-detect.test.js.map +0 -1
- package/src/store/__tests__/project-registry.test.d.ts.map +0 -1
- package/src/store/__tests__/project-registry.test.js +0 -28
- package/src/store/__tests__/project-registry.test.js.map +0 -1
- package/src/store/__tests__/provider.test.d.ts.map +0 -1
- package/src/store/__tests__/provider.test.js +0 -15
- package/src/store/__tests__/provider.test.js.map +0 -1
- package/src/store/__tests__/relations.test.d.ts.map +0 -1
- package/src/store/__tests__/relations.test.js +0 -318
- package/src/store/__tests__/relations.test.js.map +0 -1
- package/src/store/__tests__/safety-accessor.test.d.ts.map +0 -1
- package/src/store/__tests__/safety-accessor.test.js +0 -219
- package/src/store/__tests__/safety-accessor.test.js.map +0 -1
- package/src/store/__tests__/sequence-validation.test.d.ts.map +0 -1
- package/src/store/__tests__/sequence-validation.test.js +0 -94
- package/src/store/__tests__/sequence-validation.test.js.map +0 -1
- package/src/store/__tests__/session-store.test.d.ts.map +0 -1
- package/src/store/__tests__/session-store.test.js +0 -463
- package/src/store/__tests__/session-store.test.js.map +0 -1
- package/src/store/__tests__/sqlite-backup.test.d.ts.map +0 -1
- package/src/store/__tests__/sqlite-backup.test.js +0 -72
- package/src/store/__tests__/sqlite-backup.test.js.map +0 -1
- package/src/store/__tests__/sqlite.test.d.ts.map +0 -1
- package/src/store/__tests__/sqlite.test.js +0 -256
- package/src/store/__tests__/sqlite.test.js.map +0 -1
- package/src/store/__tests__/task-store.test.d.ts.map +0 -1
- package/src/store/__tests__/task-store.test.js +0 -514
- package/src/store/__tests__/task-store.test.js.map +0 -1
- package/src/store/__tests__/test-db-helper.d.ts.map +0 -1
- package/src/store/__tests__/test-db-helper.js +0 -110
- package/src/store/__tests__/test-db-helper.js.map +0 -1
- package/src/store/__tests__/write-verification.test.d.ts.map +0 -1
- package/src/store/__tests__/write-verification.test.js +0 -185
- package/src/store/__tests__/write-verification.test.js.map +0 -1
- package/src/system/__tests__/cleanup.test.d.ts.map +0 -1
- package/src/system/__tests__/cleanup.test.js +0 -87
- package/src/system/__tests__/cleanup.test.js.map +0 -1
- package/src/system/__tests__/health.test.d.ts.map +0 -1
- package/src/system/__tests__/health.test.js +0 -55
- package/src/system/__tests__/health.test.js.map +0 -1
- package/src/task-work/__tests__/start-deps.test.d.ts.map +0 -1
- package/src/task-work/__tests__/start-deps.test.js +0 -152
- package/src/task-work/__tests__/start-deps.test.js.map +0 -1
- package/src/tasks/__tests__/add.test.d.ts.map +0 -1
- package/src/tasks/__tests__/add.test.js +0 -226
- package/src/tasks/__tests__/add.test.js.map +0 -1
- package/src/tasks/__tests__/archive.test.d.ts.map +0 -1
- package/src/tasks/__tests__/archive.test.js +0 -196
- package/src/tasks/__tests__/archive.test.js.map +0 -1
- package/src/tasks/__tests__/assignee.test.d.ts.map +0 -1
- package/src/tasks/__tests__/assignee.test.js +0 -125
- package/src/tasks/__tests__/assignee.test.js.map +0 -1
- package/src/tasks/__tests__/atomicity.test.d.ts.map +0 -1
- package/src/tasks/__tests__/atomicity.test.js +0 -192
- package/src/tasks/__tests__/atomicity.test.js.map +0 -1
- package/src/tasks/__tests__/cancel-ops.test.d.ts.map +0 -1
- package/src/tasks/__tests__/cancel-ops.test.js +0 -115
- package/src/tasks/__tests__/cancel-ops.test.js.map +0 -1
- package/src/tasks/__tests__/complete-unblocks.test.d.ts.map +0 -1
- package/src/tasks/__tests__/complete-unblocks.test.js +0 -151
- package/src/tasks/__tests__/complete-unblocks.test.js.map +0 -1
- package/src/tasks/__tests__/complete.test.d.ts.map +0 -1
- package/src/tasks/__tests__/complete.test.js +0 -230
- package/src/tasks/__tests__/complete.test.js.map +0 -1
- package/src/tasks/__tests__/delete.test.d.ts.map +0 -1
- package/src/tasks/__tests__/delete.test.js +0 -183
- package/src/tasks/__tests__/delete.test.js.map +0 -1
- package/src/tasks/__tests__/dependency-check.test.d.ts.map +0 -1
- package/src/tasks/__tests__/dependency-check.test.js +0 -293
- package/src/tasks/__tests__/dependency-check.test.js.map +0 -1
- package/src/tasks/__tests__/deps-ready.test.d.ts.map +0 -1
- package/src/tasks/__tests__/deps-ready.test.js +0 -68
- package/src/tasks/__tests__/deps-ready.test.js.map +0 -1
- package/src/tasks/__tests__/epic-enforcement.test.d.ts.map +0 -1
- package/src/tasks/__tests__/epic-enforcement.test.js +0 -669
- package/src/tasks/__tests__/epic-enforcement.test.js.map +0 -1
- package/src/tasks/__tests__/find.test.d.ts.map +0 -1
- package/src/tasks/__tests__/find.test.js +0 -163
- package/src/tasks/__tests__/find.test.js.map +0 -1
- package/src/tasks/__tests__/graph-ops.test.d.ts.map +0 -1
- package/src/tasks/__tests__/graph-ops.test.js +0 -174
- package/src/tasks/__tests__/graph-ops.test.js.map +0 -1
- package/src/tasks/__tests__/hierarchy-policy.test.d.ts.map +0 -1
- package/src/tasks/__tests__/hierarchy-policy.test.js +0 -399
- package/src/tasks/__tests__/hierarchy-policy.test.js.map +0 -1
- package/src/tasks/__tests__/hierarchy.test.d.ts.map +0 -1
- package/src/tasks/__tests__/hierarchy.test.js +0 -302
- package/src/tasks/__tests__/hierarchy.test.js.map +0 -1
- package/src/tasks/__tests__/id-generator.test.d.ts.map +0 -1
- package/src/tasks/__tests__/id-generator.test.js +0 -59
- package/src/tasks/__tests__/id-generator.test.js.map +0 -1
- package/src/tasks/__tests__/labels.test.d.ts.map +0 -1
- package/src/tasks/__tests__/labels.test.js +0 -173
- package/src/tasks/__tests__/labels.test.js.map +0 -1
- package/src/tasks/__tests__/list.test.d.ts.map +0 -1
- package/src/tasks/__tests__/list.test.js +0 -272
- package/src/tasks/__tests__/list.test.js.map +0 -1
- package/src/tasks/__tests__/minimal-test.test.d.ts.map +0 -1
- package/src/tasks/__tests__/minimal-test.test.js +0 -25
- package/src/tasks/__tests__/minimal-test.test.js.map +0 -1
- package/src/tasks/__tests__/phase-tracking.test.d.ts.map +0 -1
- package/src/tasks/__tests__/phase-tracking.test.js +0 -209
- package/src/tasks/__tests__/phase-tracking.test.js.map +0 -1
- package/src/tasks/__tests__/pipeline-stage.test.d.ts.map +0 -1
- package/src/tasks/__tests__/pipeline-stage.test.js +0 -277
- package/src/tasks/__tests__/pipeline-stage.test.js.map +0 -1
- package/src/tasks/__tests__/plan-priority.test.d.ts.map +0 -1
- package/src/tasks/__tests__/plan-priority.test.js +0 -133
- package/src/tasks/__tests__/plan-priority.test.js.map +0 -1
- package/src/tasks/__tests__/priority-normalization.test.d.ts.map +0 -1
- package/src/tasks/__tests__/priority-normalization.test.js +0 -117
- package/src/tasks/__tests__/priority-normalization.test.js.map +0 -1
- package/src/tasks/__tests__/relates.test.d.ts.map +0 -1
- package/src/tasks/__tests__/relates.test.js +0 -84
- package/src/tasks/__tests__/relates.test.js.map +0 -1
- package/src/tasks/__tests__/show-deps.test.d.ts.map +0 -1
- package/src/tasks/__tests__/show-deps.test.js +0 -182
- package/src/tasks/__tests__/show-deps.test.js.map +0 -1
- package/src/tasks/__tests__/show.test.d.ts.map +0 -1
- package/src/tasks/__tests__/show.test.js +0 -126
- package/src/tasks/__tests__/show.test.js.map +0 -1
- package/src/tasks/__tests__/staleness.test.d.ts.map +0 -1
- package/src/tasks/__tests__/staleness.test.js +0 -154
- package/src/tasks/__tests__/staleness.test.js.map +0 -1
- package/src/tasks/__tests__/task-ops-depends.test.d.ts.map +0 -1
- package/src/tasks/__tests__/task-ops-depends.test.js +0 -118
- package/src/tasks/__tests__/task-ops-depends.test.js.map +0 -1
- package/src/tasks/__tests__/update.test.d.ts.map +0 -1
- package/src/tasks/__tests__/update.test.js +0 -320
- package/src/tasks/__tests__/update.test.js.map +0 -1
- package/src/validation/__tests__/chain-validation.test.d.ts.map +0 -1
- package/src/validation/__tests__/chain-validation.test.js +0 -204
- package/src/validation/__tests__/chain-validation.test.js.map +0 -1
- package/src/validation/__tests__/compliance.test.d.ts.map +0 -1
- package/src/validation/__tests__/compliance.test.js +0 -83
- package/src/validation/__tests__/compliance.test.js.map +0 -1
- package/src/validation/__tests__/docs-sync.test.d.ts.map +0 -1
- package/src/validation/__tests__/docs-sync.test.js +0 -243
- package/src/validation/__tests__/docs-sync.test.js.map +0 -1
- package/src/validation/__tests__/doctor-gitignore.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor-gitignore.test.js +0 -154
- package/src/validation/__tests__/doctor-gitignore.test.js.map +0 -1
- package/src/validation/__tests__/doctor-injection.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor-injection.test.js +0 -230
- package/src/validation/__tests__/doctor-injection.test.js.map +0 -1
- package/src/validation/__tests__/doctor.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor.test.js +0 -202
- package/src/validation/__tests__/doctor.test.js.map +0 -1
- package/src/validation/__tests__/engine.test.d.ts.map +0 -1
- package/src/validation/__tests__/engine.test.js +0 -346
- package/src/validation/__tests__/engine.test.js.map +0 -1
- package/src/validation/__tests__/manifest.test.d.ts.map +0 -1
- package/src/validation/__tests__/manifest.test.js +0 -244
- package/src/validation/__tests__/manifest.test.js.map +0 -1
- package/src/validation/__tests__/protocol-common.test.d.ts.map +0 -1
- package/src/validation/__tests__/protocol-common.test.js +0 -112
- package/src/validation/__tests__/protocol-common.test.js.map +0 -1
- package/src/validation/__tests__/verification.test.d.ts.map +0 -1
- package/src/validation/__tests__/verification.test.js +0 -277
- package/src/validation/__tests__/verification.test.js.map +0 -1
|
@@ -1,701 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for BRAIN retrieval operations — 3-layer pattern.
|
|
3
|
-
*
|
|
4
|
-
* Tests: searchBrainCompact, timelineBrain, fetchBrainEntries, observeBrain.
|
|
5
|
-
*
|
|
6
|
-
* @task T5131 T5132 T5133 T5134 T5135
|
|
7
|
-
* @epic T5149
|
|
8
|
-
*/
|
|
9
|
-
import { mkdir, mkdtemp, rm } from 'node:fs/promises';
|
|
10
|
-
import { tmpdir } from 'node:os';
|
|
11
|
-
import { join } from 'node:path';
|
|
12
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
13
|
-
let tempDir;
|
|
14
|
-
let cleoDir;
|
|
15
|
-
describe('Brain Retrieval', () => {
|
|
16
|
-
beforeEach(async () => {
|
|
17
|
-
tempDir = await mkdtemp(join(tmpdir(), 'cleo-brain-retrieval-'));
|
|
18
|
-
cleoDir = join(tempDir, '.cleo');
|
|
19
|
-
await mkdir(cleoDir, { recursive: true });
|
|
20
|
-
process.env['CLEO_DIR'] = cleoDir;
|
|
21
|
-
// Initialize tasks.db with test session for cross-db write-guard validation
|
|
22
|
-
const { getDb } = await import('../../store/sqlite.js');
|
|
23
|
-
const { sessions } = await import('../../store/tasks-schema.js');
|
|
24
|
-
const db = await getDb(tempDir);
|
|
25
|
-
await db
|
|
26
|
-
.insert(sessions)
|
|
27
|
-
.values({ id: 'S-123', name: 'test-session', status: 'active' })
|
|
28
|
-
.onConflictDoNothing()
|
|
29
|
-
.run();
|
|
30
|
-
});
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
try {
|
|
33
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
34
|
-
closeBrainDb();
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
/* may not be loaded */
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
const { closeDb } = await import('../../store/sqlite.js');
|
|
41
|
-
closeDb();
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
/* may not be loaded */
|
|
45
|
-
}
|
|
46
|
-
try {
|
|
47
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
48
|
-
resetFts5Cache();
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
/* may not be loaded */
|
|
52
|
-
}
|
|
53
|
-
delete process.env['CLEO_DIR'];
|
|
54
|
-
// Race rm against an 8s timeout. On Windows, fs.rm can block indefinitely
|
|
55
|
-
// on locked SQLite WAL files — racing prevents the hook from timing out.
|
|
56
|
-
await Promise.race([
|
|
57
|
-
rm(tempDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 300 }).catch(() => { }),
|
|
58
|
-
new Promise((resolve) => setTimeout(resolve, 8_000)),
|
|
59
|
-
]);
|
|
60
|
-
});
|
|
61
|
-
// ==========================================================================
|
|
62
|
-
// searchBrainCompact
|
|
63
|
-
// ==========================================================================
|
|
64
|
-
describe('searchBrainCompact', () => {
|
|
65
|
-
it('should return empty results for empty query', async () => {
|
|
66
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
67
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
68
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
69
|
-
closeBrainDb();
|
|
70
|
-
resetFts5Cache();
|
|
71
|
-
const result = await searchBrainCompact(tempDir, { query: '' });
|
|
72
|
-
expect(result.results).toHaveLength(0);
|
|
73
|
-
expect(result.total).toBe(0);
|
|
74
|
-
expect(result.tokensEstimated).toBe(0);
|
|
75
|
-
});
|
|
76
|
-
it('should return compact results from decisions', async () => {
|
|
77
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
78
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
79
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
80
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
81
|
-
closeBrainDb();
|
|
82
|
-
resetFts5Cache();
|
|
83
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
84
|
-
await accessor.addDecision({
|
|
85
|
-
id: 'D001',
|
|
86
|
-
type: 'architecture',
|
|
87
|
-
decision: 'Use SQLite for persistent storage in BRAIN module',
|
|
88
|
-
rationale: 'Reliable embedded database with FTS5',
|
|
89
|
-
confidence: 'high',
|
|
90
|
-
});
|
|
91
|
-
const result = await searchBrainCompact(tempDir, { query: 'SQLite' });
|
|
92
|
-
expect(result.results.length).toBeGreaterThan(0);
|
|
93
|
-
expect(result.results[0].id).toBe('D001');
|
|
94
|
-
expect(result.results[0].type).toBe('decision');
|
|
95
|
-
expect(result.results[0].title).toBe('Use SQLite for persistent storage in BRAIN module');
|
|
96
|
-
expect(result.results[0].date).toBeTruthy();
|
|
97
|
-
expect(result.tokensEstimated).toBe(result.results.length * 50);
|
|
98
|
-
});
|
|
99
|
-
it('should return compact results from all table types', async () => {
|
|
100
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
101
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
102
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
103
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
104
|
-
closeBrainDb();
|
|
105
|
-
resetFts5Cache();
|
|
106
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
107
|
-
await accessor.addDecision({
|
|
108
|
-
id: 'D001',
|
|
109
|
-
type: 'technical',
|
|
110
|
-
decision: 'Use unified search for memory',
|
|
111
|
-
rationale: 'Better developer experience',
|
|
112
|
-
confidence: 'high',
|
|
113
|
-
});
|
|
114
|
-
await accessor.addPattern({
|
|
115
|
-
id: 'P001',
|
|
116
|
-
type: 'workflow',
|
|
117
|
-
pattern: 'Search then filter pattern for memory',
|
|
118
|
-
context: 'Memory retrieval',
|
|
119
|
-
frequency: 3,
|
|
120
|
-
});
|
|
121
|
-
await accessor.addLearning({
|
|
122
|
-
id: 'L001',
|
|
123
|
-
insight: 'Unified memory search reduces token usage',
|
|
124
|
-
source: 'T5131',
|
|
125
|
-
confidence: 0.9,
|
|
126
|
-
actionable: true,
|
|
127
|
-
});
|
|
128
|
-
await accessor.addObservation({
|
|
129
|
-
id: 'O-test1',
|
|
130
|
-
type: 'discovery',
|
|
131
|
-
title: 'Memory retrieval needs compact search layer',
|
|
132
|
-
narrative: 'Compact search for memory saves tokens',
|
|
133
|
-
sourceType: 'agent',
|
|
134
|
-
});
|
|
135
|
-
const result = await searchBrainCompact(tempDir, { query: 'memory' });
|
|
136
|
-
const types = result.results.map((r) => r.type);
|
|
137
|
-
expect(types).toContain('decision');
|
|
138
|
-
expect(types).toContain('pattern');
|
|
139
|
-
expect(types).toContain('learning');
|
|
140
|
-
expect(types).toContain('observation');
|
|
141
|
-
});
|
|
142
|
-
it('should filter by table type', async () => {
|
|
143
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
144
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
145
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
146
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
147
|
-
closeBrainDb();
|
|
148
|
-
resetFts5Cache();
|
|
149
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
150
|
-
await accessor.addDecision({
|
|
151
|
-
id: 'D001',
|
|
152
|
-
type: 'technical',
|
|
153
|
-
decision: 'Compact format for search results',
|
|
154
|
-
rationale: 'Saves tokens',
|
|
155
|
-
confidence: 'medium',
|
|
156
|
-
});
|
|
157
|
-
await accessor.addPattern({
|
|
158
|
-
id: 'P001',
|
|
159
|
-
type: 'optimization',
|
|
160
|
-
pattern: 'Compact format improves performance',
|
|
161
|
-
context: 'API design',
|
|
162
|
-
frequency: 2,
|
|
163
|
-
});
|
|
164
|
-
const result = await searchBrainCompact(tempDir, {
|
|
165
|
-
query: 'compact',
|
|
166
|
-
tables: ['decisions'],
|
|
167
|
-
});
|
|
168
|
-
expect(result.results.every((r) => r.type === 'decision')).toBe(true);
|
|
169
|
-
});
|
|
170
|
-
it('should apply date filters', async () => {
|
|
171
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
172
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
173
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
174
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
175
|
-
closeBrainDb();
|
|
176
|
-
resetFts5Cache();
|
|
177
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
178
|
-
await accessor.addDecision({
|
|
179
|
-
id: 'D001',
|
|
180
|
-
type: 'technical',
|
|
181
|
-
decision: 'Old date filter test decision',
|
|
182
|
-
rationale: 'Testing date ranges',
|
|
183
|
-
confidence: 'medium',
|
|
184
|
-
createdAt: '2025-01-01 00:00:00',
|
|
185
|
-
});
|
|
186
|
-
await accessor.addDecision({
|
|
187
|
-
id: 'D002',
|
|
188
|
-
type: 'technical',
|
|
189
|
-
decision: 'Recent date filter test decision',
|
|
190
|
-
rationale: 'Testing date ranges',
|
|
191
|
-
confidence: 'medium',
|
|
192
|
-
createdAt: '2026-06-01 00:00:00',
|
|
193
|
-
});
|
|
194
|
-
const result = await searchBrainCompact(tempDir, {
|
|
195
|
-
query: 'date filter test',
|
|
196
|
-
dateStart: '2026-01-01',
|
|
197
|
-
});
|
|
198
|
-
expect(result.results.every((r) => r.date >= '2026-01-01')).toBe(true);
|
|
199
|
-
});
|
|
200
|
-
it('should truncate titles to 80 characters', async () => {
|
|
201
|
-
const { searchBrainCompact } = await import('../brain-retrieval.js');
|
|
202
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
203
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
204
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
205
|
-
closeBrainDb();
|
|
206
|
-
resetFts5Cache();
|
|
207
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
208
|
-
const longDecision = 'This is a very long decision about truncation testing that exceeds eighty characters and should be properly truncated in compact results';
|
|
209
|
-
await accessor.addDecision({
|
|
210
|
-
id: 'D001',
|
|
211
|
-
type: 'technical',
|
|
212
|
-
decision: longDecision,
|
|
213
|
-
rationale: 'Test truncation behavior',
|
|
214
|
-
confidence: 'low',
|
|
215
|
-
});
|
|
216
|
-
const result = await searchBrainCompact(tempDir, { query: 'truncation' });
|
|
217
|
-
expect(result.results.length).toBeGreaterThan(0);
|
|
218
|
-
expect(result.results[0].title.length).toBeLessThanOrEqual(80);
|
|
219
|
-
expect(longDecision.length).toBeGreaterThan(80);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
// ==========================================================================
|
|
223
|
-
// timelineBrain
|
|
224
|
-
// ==========================================================================
|
|
225
|
-
describe('timelineBrain', () => {
|
|
226
|
-
it('should return null anchor for unknown ID', async () => {
|
|
227
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
228
|
-
const { closeBrainDb, getBrainDb } = await import('../../store/brain-sqlite.js');
|
|
229
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
230
|
-
closeBrainDb();
|
|
231
|
-
resetFts5Cache();
|
|
232
|
-
await getBrainDb(tempDir);
|
|
233
|
-
const result = await timelineBrain(tempDir, { anchor: 'D-nonexistent' });
|
|
234
|
-
expect(result.anchor).toBeNull();
|
|
235
|
-
expect(result.before).toHaveLength(0);
|
|
236
|
-
expect(result.after).toHaveLength(0);
|
|
237
|
-
});
|
|
238
|
-
it('should return null anchor for unrecognized ID prefix', async () => {
|
|
239
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
240
|
-
const { closeBrainDb, getBrainDb } = await import('../../store/brain-sqlite.js');
|
|
241
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
242
|
-
closeBrainDb();
|
|
243
|
-
resetFts5Cache();
|
|
244
|
-
await getBrainDb(tempDir);
|
|
245
|
-
const result = await timelineBrain(tempDir, { anchor: 'UNKNOWN-123' });
|
|
246
|
-
expect(result.anchor).toBeNull();
|
|
247
|
-
});
|
|
248
|
-
it('should return anchor data for a decision', async () => {
|
|
249
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
250
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
251
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
252
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
253
|
-
closeBrainDb();
|
|
254
|
-
resetFts5Cache();
|
|
255
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
256
|
-
await accessor.addDecision({
|
|
257
|
-
id: 'D001',
|
|
258
|
-
type: 'architecture',
|
|
259
|
-
decision: 'Use drizzle ORM',
|
|
260
|
-
rationale: 'Type-safe queries',
|
|
261
|
-
confidence: 'high',
|
|
262
|
-
createdAt: '2026-03-01 12:00:00',
|
|
263
|
-
});
|
|
264
|
-
const result = await timelineBrain(tempDir, { anchor: 'D001' });
|
|
265
|
-
expect(result.anchor).not.toBeNull();
|
|
266
|
-
expect(result.anchor.id).toBe('D001');
|
|
267
|
-
expect(result.anchor.type).toBe('decision');
|
|
268
|
-
expect(result.anchor.data).toBeTruthy();
|
|
269
|
-
});
|
|
270
|
-
it('should return before and after entries across tables', async () => {
|
|
271
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
272
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
273
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
274
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
275
|
-
closeBrainDb();
|
|
276
|
-
resetFts5Cache();
|
|
277
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
278
|
-
// Create entries with different timestamps across tables
|
|
279
|
-
await accessor.addDecision({
|
|
280
|
-
id: 'D001',
|
|
281
|
-
type: 'technical',
|
|
282
|
-
decision: 'Early decision',
|
|
283
|
-
rationale: 'First',
|
|
284
|
-
confidence: 'low',
|
|
285
|
-
createdAt: '2026-01-01 10:00:00',
|
|
286
|
-
});
|
|
287
|
-
await accessor.addPattern({
|
|
288
|
-
id: 'P001',
|
|
289
|
-
type: 'workflow',
|
|
290
|
-
pattern: 'Early pattern',
|
|
291
|
-
context: 'Testing',
|
|
292
|
-
frequency: 1,
|
|
293
|
-
extractedAt: '2026-01-15 10:00:00',
|
|
294
|
-
});
|
|
295
|
-
// Anchor
|
|
296
|
-
await accessor.addLearning({
|
|
297
|
-
id: 'L001',
|
|
298
|
-
insight: 'Middle learning (anchor)',
|
|
299
|
-
source: 'T5132',
|
|
300
|
-
confidence: 0.8,
|
|
301
|
-
actionable: true,
|
|
302
|
-
createdAt: '2026-02-01 12:00:00',
|
|
303
|
-
});
|
|
304
|
-
await accessor.addDecision({
|
|
305
|
-
id: 'D002',
|
|
306
|
-
type: 'technical',
|
|
307
|
-
decision: 'Later decision',
|
|
308
|
-
rationale: 'After anchor',
|
|
309
|
-
confidence: 'high',
|
|
310
|
-
createdAt: '2026-03-01 10:00:00',
|
|
311
|
-
});
|
|
312
|
-
await accessor.addObservation({
|
|
313
|
-
id: 'O-after1',
|
|
314
|
-
type: 'discovery',
|
|
315
|
-
title: 'Late observation',
|
|
316
|
-
narrative: 'After anchor',
|
|
317
|
-
sourceType: 'agent',
|
|
318
|
-
createdAt: '2026-03-15 10:00:00',
|
|
319
|
-
});
|
|
320
|
-
const result = await timelineBrain(tempDir, {
|
|
321
|
-
anchor: 'L001',
|
|
322
|
-
depthBefore: 5,
|
|
323
|
-
depthAfter: 5,
|
|
324
|
-
});
|
|
325
|
-
expect(result.anchor).not.toBeNull();
|
|
326
|
-
expect(result.anchor.id).toBe('L001');
|
|
327
|
-
expect(result.anchor.type).toBe('learning');
|
|
328
|
-
// Before: D001 and P001 should appear
|
|
329
|
-
expect(result.before.length).toBeGreaterThanOrEqual(2);
|
|
330
|
-
const beforeIds = result.before.map((e) => e.id);
|
|
331
|
-
expect(beforeIds).toContain('D001');
|
|
332
|
-
expect(beforeIds).toContain('P001');
|
|
333
|
-
// After: D002 and O-after1 should appear
|
|
334
|
-
expect(result.after.length).toBeGreaterThanOrEqual(2);
|
|
335
|
-
const afterIds = result.after.map((e) => e.id);
|
|
336
|
-
expect(afterIds).toContain('D002');
|
|
337
|
-
expect(afterIds).toContain('O-after1');
|
|
338
|
-
});
|
|
339
|
-
it('should respect depth parameters', async () => {
|
|
340
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
341
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
342
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
343
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
344
|
-
closeBrainDb();
|
|
345
|
-
resetFts5Cache();
|
|
346
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
347
|
-
// Create many entries before the anchor
|
|
348
|
-
for (let i = 1; i <= 5; i++) {
|
|
349
|
-
await accessor.addDecision({
|
|
350
|
-
id: `D${String(i).padStart(3, '0')}`,
|
|
351
|
-
type: 'technical',
|
|
352
|
-
decision: `Decision ${i}`,
|
|
353
|
-
rationale: `Rationale ${i}`,
|
|
354
|
-
confidence: 'low',
|
|
355
|
-
createdAt: `2026-01-${String(i).padStart(2, '0')} 10:00:00`,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
// Anchor
|
|
359
|
-
await accessor.addLearning({
|
|
360
|
-
id: 'L001',
|
|
361
|
-
insight: 'Anchor learning',
|
|
362
|
-
source: 'T5132',
|
|
363
|
-
confidence: 0.5,
|
|
364
|
-
actionable: false,
|
|
365
|
-
createdAt: '2026-02-01 12:00:00',
|
|
366
|
-
});
|
|
367
|
-
const result = await timelineBrain(tempDir, {
|
|
368
|
-
anchor: 'L001',
|
|
369
|
-
depthBefore: 2,
|
|
370
|
-
depthAfter: 0,
|
|
371
|
-
});
|
|
372
|
-
expect(result.before.length).toBeLessThanOrEqual(2);
|
|
373
|
-
expect(result.after).toHaveLength(0);
|
|
374
|
-
});
|
|
375
|
-
it('should handle observation anchors with O- prefix', async () => {
|
|
376
|
-
const { timelineBrain } = await import('../brain-retrieval.js');
|
|
377
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
378
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
379
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
380
|
-
closeBrainDb();
|
|
381
|
-
resetFts5Cache();
|
|
382
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
383
|
-
await accessor.addObservation({
|
|
384
|
-
id: 'O-test123',
|
|
385
|
-
type: 'feature',
|
|
386
|
-
title: 'Test observation anchor',
|
|
387
|
-
narrative: 'Testing observation as anchor',
|
|
388
|
-
sourceType: 'agent',
|
|
389
|
-
createdAt: '2026-03-01 12:00:00',
|
|
390
|
-
});
|
|
391
|
-
const result = await timelineBrain(tempDir, { anchor: 'O-test123' });
|
|
392
|
-
expect(result.anchor).not.toBeNull();
|
|
393
|
-
expect(result.anchor.id).toBe('O-test123');
|
|
394
|
-
expect(result.anchor.type).toBe('observation');
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
// ==========================================================================
|
|
398
|
-
// fetchBrainEntries
|
|
399
|
-
// ==========================================================================
|
|
400
|
-
describe('fetchBrainEntries', () => {
|
|
401
|
-
it('should return empty for empty IDs array', async () => {
|
|
402
|
-
const { fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
403
|
-
const { closeBrainDb, getBrainDb } = await import('../../store/brain-sqlite.js');
|
|
404
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
405
|
-
closeBrainDb();
|
|
406
|
-
resetFts5Cache();
|
|
407
|
-
await getBrainDb(tempDir);
|
|
408
|
-
const result = await fetchBrainEntries(tempDir, { ids: [] });
|
|
409
|
-
expect(result.results).toHaveLength(0);
|
|
410
|
-
expect(result.notFound).toHaveLength(0);
|
|
411
|
-
expect(result.tokensEstimated).toBe(0);
|
|
412
|
-
});
|
|
413
|
-
it('should fetch entries by IDs from different tables', async () => {
|
|
414
|
-
const { fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
415
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
416
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
417
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
418
|
-
closeBrainDb();
|
|
419
|
-
resetFts5Cache();
|
|
420
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
421
|
-
await accessor.addDecision({
|
|
422
|
-
id: 'D001',
|
|
423
|
-
type: 'architecture',
|
|
424
|
-
decision: 'Use fetch by ID pattern',
|
|
425
|
-
rationale: 'Direct access',
|
|
426
|
-
confidence: 'high',
|
|
427
|
-
});
|
|
428
|
-
await accessor.addPattern({
|
|
429
|
-
id: 'P001',
|
|
430
|
-
type: 'workflow',
|
|
431
|
-
pattern: 'Batch fetch pattern',
|
|
432
|
-
context: 'API design',
|
|
433
|
-
frequency: 2,
|
|
434
|
-
});
|
|
435
|
-
await accessor.addLearning({
|
|
436
|
-
id: 'L001',
|
|
437
|
-
insight: 'Batch fetching reduces round-trips',
|
|
438
|
-
source: 'T5133',
|
|
439
|
-
confidence: 0.85,
|
|
440
|
-
actionable: true,
|
|
441
|
-
});
|
|
442
|
-
await accessor.addObservation({
|
|
443
|
-
id: 'O-fetch1',
|
|
444
|
-
type: 'discovery',
|
|
445
|
-
title: 'Observation for fetch test',
|
|
446
|
-
narrative: 'Testing batch fetch',
|
|
447
|
-
sourceType: 'agent',
|
|
448
|
-
});
|
|
449
|
-
const result = await fetchBrainEntries(tempDir, {
|
|
450
|
-
ids: ['D001', 'P001', 'L001', 'O-fetch1'],
|
|
451
|
-
});
|
|
452
|
-
expect(result.results).toHaveLength(4);
|
|
453
|
-
expect(result.notFound).toHaveLength(0);
|
|
454
|
-
expect(result.tokensEstimated).toBe(4 * 500);
|
|
455
|
-
const types = result.results.map((r) => r.type);
|
|
456
|
-
expect(types).toContain('decision');
|
|
457
|
-
expect(types).toContain('pattern');
|
|
458
|
-
expect(types).toContain('learning');
|
|
459
|
-
expect(types).toContain('observation');
|
|
460
|
-
});
|
|
461
|
-
it('should report not-found IDs', async () => {
|
|
462
|
-
const { fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
463
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
464
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
465
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
466
|
-
closeBrainDb();
|
|
467
|
-
resetFts5Cache();
|
|
468
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
469
|
-
await accessor.addDecision({
|
|
470
|
-
id: 'D001',
|
|
471
|
-
type: 'technical',
|
|
472
|
-
decision: 'Existing decision',
|
|
473
|
-
rationale: 'Test',
|
|
474
|
-
confidence: 'low',
|
|
475
|
-
});
|
|
476
|
-
const result = await fetchBrainEntries(tempDir, {
|
|
477
|
-
ids: ['D001', 'D999', 'P999', 'UNKNOWN-123'],
|
|
478
|
-
});
|
|
479
|
-
expect(result.results).toHaveLength(1);
|
|
480
|
-
expect(result.results[0].id).toBe('D001');
|
|
481
|
-
expect(result.notFound).toContain('D999');
|
|
482
|
-
expect(result.notFound).toContain('P999');
|
|
483
|
-
expect(result.notFound).toContain('UNKNOWN-123');
|
|
484
|
-
});
|
|
485
|
-
it('should return full data in each entry', async () => {
|
|
486
|
-
const { fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
487
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
488
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
489
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
490
|
-
closeBrainDb();
|
|
491
|
-
resetFts5Cache();
|
|
492
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
493
|
-
await accessor.addDecision({
|
|
494
|
-
id: 'D001',
|
|
495
|
-
type: 'architecture',
|
|
496
|
-
decision: 'Full data test decision',
|
|
497
|
-
rationale: 'Verify all fields returned',
|
|
498
|
-
confidence: 'high',
|
|
499
|
-
});
|
|
500
|
-
const result = await fetchBrainEntries(tempDir, { ids: ['D001'] });
|
|
501
|
-
expect(result.results).toHaveLength(1);
|
|
502
|
-
const entry = result.results[0];
|
|
503
|
-
expect(entry.id).toBe('D001');
|
|
504
|
-
expect(entry.type).toBe('decision');
|
|
505
|
-
const data = entry.data;
|
|
506
|
-
expect(data['decision']).toBe('Full data test decision');
|
|
507
|
-
expect(data['rationale']).toBe('Verify all fields returned');
|
|
508
|
-
expect(data['confidence']).toBe('high');
|
|
509
|
-
});
|
|
510
|
-
});
|
|
511
|
-
// ==========================================================================
|
|
512
|
-
// observeBrain
|
|
513
|
-
// ==========================================================================
|
|
514
|
-
describe('observeBrain', () => {
|
|
515
|
-
it('should create an observation with generated ID', async () => {
|
|
516
|
-
const { observeBrain } = await import('../brain-retrieval.js');
|
|
517
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
518
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
519
|
-
closeBrainDb();
|
|
520
|
-
resetFts5Cache();
|
|
521
|
-
const result = await observeBrain(tempDir, {
|
|
522
|
-
text: 'Test observation for brain module',
|
|
523
|
-
});
|
|
524
|
-
expect(result.id).toMatch(/^O-/);
|
|
525
|
-
expect(result.type).toBeTruthy();
|
|
526
|
-
expect(result.createdAt).toBeTruthy();
|
|
527
|
-
});
|
|
528
|
-
it('should auto-classify type from text keywords', async () => {
|
|
529
|
-
const { observeBrain } = await import('../brain-retrieval.js');
|
|
530
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
531
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
532
|
-
closeBrainDb();
|
|
533
|
-
resetFts5Cache();
|
|
534
|
-
const bugResult = await observeBrain(tempDir, {
|
|
535
|
-
text: 'Found a bug in the search module that causes a crash',
|
|
536
|
-
});
|
|
537
|
-
expect(bugResult.type).toBe('bugfix');
|
|
538
|
-
const featureResult = await observeBrain(tempDir, {
|
|
539
|
-
text: 'Implement new retrieval layer for BRAIN',
|
|
540
|
-
});
|
|
541
|
-
expect(featureResult.type).toBe('feature');
|
|
542
|
-
const refactorResult = await observeBrain(tempDir, {
|
|
543
|
-
text: 'Refactor the engine compatibility layer',
|
|
544
|
-
});
|
|
545
|
-
expect(refactorResult.type).toBe('refactor');
|
|
546
|
-
const changeResult = await observeBrain(tempDir, {
|
|
547
|
-
text: 'Update the timeline query to use UNION ALL',
|
|
548
|
-
});
|
|
549
|
-
expect(changeResult.type).toBe('change');
|
|
550
|
-
const decisionResult = await observeBrain(tempDir, {
|
|
551
|
-
text: 'Decided to use async pattern instead of sync',
|
|
552
|
-
});
|
|
553
|
-
expect(decisionResult.type).toBe('decision');
|
|
554
|
-
const discoveryResult = await observeBrain(tempDir, {
|
|
555
|
-
text: 'Interesting behavior in the database layer',
|
|
556
|
-
});
|
|
557
|
-
expect(discoveryResult.type).toBe('discovery');
|
|
558
|
-
});
|
|
559
|
-
it('should use provided type over auto-classification', async () => {
|
|
560
|
-
const { observeBrain } = await import('../brain-retrieval.js');
|
|
561
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
562
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
563
|
-
closeBrainDb();
|
|
564
|
-
resetFts5Cache();
|
|
565
|
-
// Text has 'bug' keyword but we override with 'feature'
|
|
566
|
-
const result = await observeBrain(tempDir, {
|
|
567
|
-
text: 'This has bug keyword but is a feature',
|
|
568
|
-
type: 'feature',
|
|
569
|
-
});
|
|
570
|
-
expect(result.type).toBe('feature');
|
|
571
|
-
});
|
|
572
|
-
it('should use provided title', async () => {
|
|
573
|
-
const { observeBrain } = await import('../brain-retrieval.js');
|
|
574
|
-
const { fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
575
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
576
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
577
|
-
closeBrainDb();
|
|
578
|
-
resetFts5Cache();
|
|
579
|
-
const result = await observeBrain(tempDir, {
|
|
580
|
-
text: 'Long observation text that describes a discovery in detail',
|
|
581
|
-
title: 'Custom Title',
|
|
582
|
-
});
|
|
583
|
-
// Fetch it back and verify
|
|
584
|
-
const fetched = await fetchBrainEntries(tempDir, { ids: [result.id] });
|
|
585
|
-
expect(fetched.results).toHaveLength(1);
|
|
586
|
-
const data = fetched.results[0].data;
|
|
587
|
-
expect(data['title']).toBe('Custom Title');
|
|
588
|
-
});
|
|
589
|
-
it('should throw on empty text', async () => {
|
|
590
|
-
const { observeBrain } = await import('../brain-retrieval.js');
|
|
591
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
592
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
593
|
-
closeBrainDb();
|
|
594
|
-
resetFts5Cache();
|
|
595
|
-
// Need to init DB first
|
|
596
|
-
const { getBrainDb } = await import('../../store/brain-sqlite.js');
|
|
597
|
-
await getBrainDb(tempDir);
|
|
598
|
-
await expect(observeBrain(tempDir, { text: '' })).rejects.toThrow('Observation text is required');
|
|
599
|
-
await expect(observeBrain(tempDir, { text: ' ' })).rejects.toThrow('Observation text is required');
|
|
600
|
-
});
|
|
601
|
-
it('should store observation searchable via searchBrainCompact', async () => {
|
|
602
|
-
const { observeBrain, searchBrainCompact } = await import('../brain-retrieval.js');
|
|
603
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
604
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
605
|
-
closeBrainDb();
|
|
606
|
-
resetFts5Cache();
|
|
607
|
-
const created = await observeBrain(tempDir, {
|
|
608
|
-
text: 'Unique searchable observation content xyzzy123',
|
|
609
|
-
title: 'Searchable xyzzy123 observation',
|
|
610
|
-
});
|
|
611
|
-
// Search should find it
|
|
612
|
-
const searchResult = await searchBrainCompact(tempDir, {
|
|
613
|
-
query: 'xyzzy123',
|
|
614
|
-
tables: ['observations'],
|
|
615
|
-
});
|
|
616
|
-
expect(searchResult.results.length).toBeGreaterThan(0);
|
|
617
|
-
expect(searchResult.results[0].id).toBe(created.id);
|
|
618
|
-
expect(searchResult.results[0].type).toBe('observation');
|
|
619
|
-
});
|
|
620
|
-
it('should set sourceType and project', async () => {
|
|
621
|
-
const { observeBrain, fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
622
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
623
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
624
|
-
closeBrainDb();
|
|
625
|
-
resetFts5Cache();
|
|
626
|
-
const result = await observeBrain(tempDir, {
|
|
627
|
-
text: 'Observation with metadata',
|
|
628
|
-
sourceType: 'session-debrief',
|
|
629
|
-
project: 'cleo',
|
|
630
|
-
sourceSessionId: 'S-123',
|
|
631
|
-
});
|
|
632
|
-
const fetched = await fetchBrainEntries(tempDir, { ids: [result.id] });
|
|
633
|
-
expect(fetched.results).toHaveLength(1);
|
|
634
|
-
const data = fetched.results[0].data;
|
|
635
|
-
expect(data['sourceType']).toBe('session-debrief');
|
|
636
|
-
expect(data['project']).toBe('cleo');
|
|
637
|
-
expect(data['sourceSessionId']).toBe('S-123');
|
|
638
|
-
});
|
|
639
|
-
});
|
|
640
|
-
// ==========================================================================
|
|
641
|
-
// Integration: search -> timeline -> fetch
|
|
642
|
-
// ==========================================================================
|
|
643
|
-
describe('3-layer integration', () => {
|
|
644
|
-
it('should flow: search -> timeline -> fetch', async () => {
|
|
645
|
-
const { searchBrainCompact, timelineBrain, fetchBrainEntries } = await import('../brain-retrieval.js');
|
|
646
|
-
const { closeBrainDb } = await import('../../store/brain-sqlite.js');
|
|
647
|
-
const { resetFts5Cache } = await import('../brain-search.js');
|
|
648
|
-
const { getBrainAccessor } = await import('../../store/brain-accessor.js');
|
|
649
|
-
closeBrainDb();
|
|
650
|
-
resetFts5Cache();
|
|
651
|
-
const accessor = await getBrainAccessor(tempDir);
|
|
652
|
-
// Seed data
|
|
653
|
-
await accessor.addDecision({
|
|
654
|
-
id: 'D001',
|
|
655
|
-
type: 'architecture',
|
|
656
|
-
decision: 'Integration test architecture decision',
|
|
657
|
-
rationale: 'Testing 3-layer flow',
|
|
658
|
-
confidence: 'high',
|
|
659
|
-
createdAt: '2026-01-15 10:00:00',
|
|
660
|
-
});
|
|
661
|
-
await accessor.addPattern({
|
|
662
|
-
id: 'P001',
|
|
663
|
-
type: 'workflow',
|
|
664
|
-
pattern: 'Integration test workflow pattern',
|
|
665
|
-
context: '3-layer retrieval',
|
|
666
|
-
frequency: 1,
|
|
667
|
-
extractedAt: '2026-02-01 10:00:00',
|
|
668
|
-
});
|
|
669
|
-
await accessor.addLearning({
|
|
670
|
-
id: 'L001',
|
|
671
|
-
insight: 'Integration test learning insight',
|
|
672
|
-
source: 'T5131',
|
|
673
|
-
confidence: 0.9,
|
|
674
|
-
actionable: true,
|
|
675
|
-
createdAt: '2026-03-01 10:00:00',
|
|
676
|
-
});
|
|
677
|
-
// Layer 1: Search
|
|
678
|
-
const searchResult = await searchBrainCompact(tempDir, { query: 'integration test' });
|
|
679
|
-
expect(searchResult.results.length).toBeGreaterThan(0);
|
|
680
|
-
// Layer 2: Timeline around first result
|
|
681
|
-
const firstHit = searchResult.results[0];
|
|
682
|
-
const timelineResult = await timelineBrain(tempDir, {
|
|
683
|
-
anchor: firstHit.id,
|
|
684
|
-
depthBefore: 5,
|
|
685
|
-
depthAfter: 5,
|
|
686
|
-
});
|
|
687
|
-
expect(timelineResult.anchor).not.toBeNull();
|
|
688
|
-
// Layer 3: Fetch full details for anchor + neighbors
|
|
689
|
-
const allIds = [
|
|
690
|
-
timelineResult.anchor.id,
|
|
691
|
-
...timelineResult.before.map((e) => e.id),
|
|
692
|
-
...timelineResult.after.map((e) => e.id),
|
|
693
|
-
];
|
|
694
|
-
const fetchResult = await fetchBrainEntries(tempDir, { ids: allIds });
|
|
695
|
-
expect(fetchResult.results.length).toBeGreaterThan(0);
|
|
696
|
-
expect(fetchResult.notFound).toHaveLength(0);
|
|
697
|
-
expect(fetchResult.tokensEstimated).toBe(fetchResult.results.length * 500);
|
|
698
|
-
});
|
|
699
|
-
});
|
|
700
|
-
});
|
|
701
|
-
//# sourceMappingURL=brain-retrieval.test.js.map
|