hippo-memory 1.44.0 → 1.46.0
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/README.md +68 -24
- package/bin/hippo.js +3 -1
- package/dist/ablation.d.ts +10 -1
- package/dist/ablation.js +17 -1
- package/dist/api.d.ts +81 -22
- package/dist/api.js +258 -49
- package/dist/audit.d.ts +2 -2
- package/dist/audit.js +9 -0
- package/dist/autolearn.d.ts +1 -1
- package/dist/autolearn.js +2 -1
- package/dist/capture-error.d.ts +20 -0
- package/dist/capture-error.js +82 -0
- package/dist/capture.d.ts +25 -8
- package/dist/capture.js +100 -5
- package/dist/cli.d.ts +9 -1
- package/dist/cli.js +531 -119
- package/dist/client.d.ts +4 -21
- package/dist/client.js +3 -112
- package/dist/config.d.ts +20 -0
- package/dist/config.js +37 -1
- package/dist/consolidate.d.ts +9 -0
- package/dist/consolidate.js +133 -46
- package/dist/dag.d.ts +1 -0
- package/dist/dag.js +10 -5
- package/dist/dashboard.js +7 -3
- package/dist/db.js +69 -24
- package/dist/dedupe.d.ts +1 -0
- package/dist/dedupe.js +4 -7
- package/dist/doctor.d.ts +34 -0
- package/dist/doctor.js +174 -0
- package/dist/dormant.d.ts +91 -0
- package/dist/dormant.js +121 -0
- package/dist/embedding-provider.js +2 -1
- package/dist/embeddings.js +81 -8
- package/dist/eval-stats.d.ts +123 -0
- package/dist/eval-stats.js +187 -0
- package/dist/extract.d.ts +2 -0
- package/dist/extract.js +9 -4
- package/dist/half-life-migration.d.ts +55 -0
- package/dist/half-life-migration.js +111 -0
- package/dist/hooks.d.ts +4 -0
- package/dist/hooks.js +47 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +90 -48
- package/dist/memory.d.ts +18 -1
- package/dist/memory.js +33 -5
- package/dist/physics-config.js +5 -1
- package/dist/recall-scope.d.ts +24 -0
- package/dist/recall-scope.js +41 -0
- package/dist/refine-llm.js +3 -2
- package/dist/reject-flow.d.ts +3 -3
- package/dist/reject-flow.js +10 -3
- package/dist/rerankers/jev.js +3 -2
- package/dist/rerankers/llm.js +3 -2
- package/dist/search.d.ts +4 -4
- package/dist/search.js +26 -21
- package/dist/server.d.ts +5 -0
- package/dist/server.js +49 -29
- package/dist/shared.js +1 -1
- package/dist/store.d.ts +29 -11
- package/dist/store.js +197 -70
- package/dist/token-ledger.d.ts +119 -0
- package/dist/token-ledger.js +181 -0
- package/dist/version.d.ts +4 -6
- package/dist/version.js +4 -7
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +7 -3
- package/dist/ablation.d.ts.map +0 -1
- package/dist/ablation.js.map +0 -1
- package/dist/ambient.d.ts.map +0 -1
- package/dist/ambient.js.map +0 -1
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/audit-prune.d.ts.map +0 -1
- package/dist/audit-prune.js.map +0 -1
- package/dist/audit.d.ts.map +0 -1
- package/dist/audit.js.map +0 -1
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/autolearn.d.ts.map +0 -1
- package/dist/autolearn.js.map +0 -1
- package/dist/availability.d.ts.map +0 -1
- package/dist/availability.js.map +0 -1
- package/dist/benchmarks/e1.3/incident-recall-eval.js +0 -78
- package/dist/benchmarks/e1.3/incident-recall-eval.js.map +0 -1
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +0 -103
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +0 -1
- package/dist/capture.d.ts.map +0 -1
- package/dist/capture.js.map +0 -1
- package/dist/card-detail.d.ts.map +0 -1
- package/dist/card-detail.js.map +0 -1
- package/dist/card.d.ts.map +0 -1
- package/dist/card.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/compare.d.ts.map +0 -1
- package/dist/compare.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/connectors/github/backfill.d.ts.map +0 -1
- package/dist/connectors/github/backfill.js.map +0 -1
- package/dist/connectors/github/cli-impl.d.ts.map +0 -1
- package/dist/connectors/github/cli-impl.js.map +0 -1
- package/dist/connectors/github/deletion.d.ts.map +0 -1
- package/dist/connectors/github/deletion.js.map +0 -1
- package/dist/connectors/github/dlq.d.ts.map +0 -1
- package/dist/connectors/github/dlq.js.map +0 -1
- package/dist/connectors/github/idempotency.d.ts.map +0 -1
- package/dist/connectors/github/idempotency.js.map +0 -1
- package/dist/connectors/github/ingest.d.ts.map +0 -1
- package/dist/connectors/github/ingest.js.map +0 -1
- package/dist/connectors/github/octokit-client.d.ts.map +0 -1
- package/dist/connectors/github/octokit-client.js.map +0 -1
- package/dist/connectors/github/ratelimit.d.ts.map +0 -1
- package/dist/connectors/github/ratelimit.js.map +0 -1
- package/dist/connectors/github/scope.d.ts.map +0 -1
- package/dist/connectors/github/scope.js.map +0 -1
- package/dist/connectors/github/signature.d.ts.map +0 -1
- package/dist/connectors/github/signature.js.map +0 -1
- package/dist/connectors/github/tenant-routing.d.ts.map +0 -1
- package/dist/connectors/github/tenant-routing.js.map +0 -1
- package/dist/connectors/github/transform.d.ts.map +0 -1
- package/dist/connectors/github/transform.js.map +0 -1
- package/dist/connectors/github/types.d.ts.map +0 -1
- package/dist/connectors/github/types.js.map +0 -1
- package/dist/connectors/slack/backfill.d.ts.map +0 -1
- package/dist/connectors/slack/backfill.js.map +0 -1
- package/dist/connectors/slack/deletion.d.ts.map +0 -1
- package/dist/connectors/slack/deletion.js.map +0 -1
- package/dist/connectors/slack/dlq.d.ts.map +0 -1
- package/dist/connectors/slack/dlq.js.map +0 -1
- package/dist/connectors/slack/idempotency.d.ts.map +0 -1
- package/dist/connectors/slack/idempotency.js.map +0 -1
- package/dist/connectors/slack/ingest.d.ts.map +0 -1
- package/dist/connectors/slack/ingest.js.map +0 -1
- package/dist/connectors/slack/ratelimit.d.ts.map +0 -1
- package/dist/connectors/slack/ratelimit.js.map +0 -1
- package/dist/connectors/slack/scope.d.ts.map +0 -1
- package/dist/connectors/slack/scope.js.map +0 -1
- package/dist/connectors/slack/signature.d.ts.map +0 -1
- package/dist/connectors/slack/signature.js.map +0 -1
- package/dist/connectors/slack/tenant-routing.d.ts.map +0 -1
- package/dist/connectors/slack/tenant-routing.js.map +0 -1
- package/dist/connectors/slack/transform.d.ts.map +0 -1
- package/dist/connectors/slack/transform.js.map +0 -1
- package/dist/connectors/slack/types.d.ts.map +0 -1
- package/dist/connectors/slack/types.js.map +0 -1
- package/dist/connectors/slack/web-client.d.ts.map +0 -1
- package/dist/connectors/slack/web-client.js.map +0 -1
- package/dist/connectors/slack/workspaces.d.ts.map +0 -1
- package/dist/connectors/slack/workspaces.js.map +0 -1
- package/dist/consolidate.d.ts.map +0 -1
- package/dist/consolidate.js.map +0 -1
- package/dist/correction-latency.d.ts.map +0 -1
- package/dist/correction-latency.js.map +0 -1
- package/dist/customer-notes.d.ts.map +0 -1
- package/dist/customer-notes.js.map +0 -1
- package/dist/dag.d.ts.map +0 -1
- package/dist/dag.js.map +0 -1
- package/dist/dashboard.d.ts.map +0 -1
- package/dist/dashboard.js.map +0 -1
- package/dist/db.d.ts.map +0 -1
- package/dist/db.js.map +0 -1
- package/dist/decisions.d.ts.map +0 -1
- package/dist/decisions.js.map +0 -1
- package/dist/dedupe.d.ts.map +0 -1
- package/dist/dedupe.js.map +0 -1
- package/dist/embedding-provider.d.ts.map +0 -1
- package/dist/embedding-provider.js.map +0 -1
- package/dist/embeddings.d.ts.map +0 -1
- package/dist/embeddings.js.map +0 -1
- package/dist/eval-suite.d.ts.map +0 -1
- package/dist/eval-suite.js.map +0 -1
- package/dist/eval.d.ts.map +0 -1
- package/dist/eval.js.map +0 -1
- package/dist/extensions/openclaw-plugin/index.js.map +0 -1
- package/dist/extract.d.ts.map +0 -1
- package/dist/extract.js.map +0 -1
- package/dist/forward-claim-detector.d.ts.map +0 -1
- package/dist/forward-claim-detector.js.map +0 -1
- package/dist/goals.d.ts.map +0 -1
- package/dist/goals.js.map +0 -1
- package/dist/graph-extract.d.ts.map +0 -1
- package/dist/graph-extract.js.map +0 -1
- package/dist/graph-recall.d.ts.map +0 -1
- package/dist/graph-recall.js.map +0 -1
- package/dist/graph-stream.d.ts.map +0 -1
- package/dist/graph-stream.js.map +0 -1
- package/dist/graph-view.d.ts.map +0 -1
- package/dist/graph-view.js.map +0 -1
- package/dist/graph.d.ts.map +0 -1
- package/dist/graph.js.map +0 -1
- package/dist/handoff.d.ts.map +0 -1
- package/dist/handoff.js.map +0 -1
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/importers.d.ts.map +0 -1
- package/dist/importers.js.map +0 -1
- package/dist/incidents.d.ts.map +0 -1
- package/dist/incidents.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/invalidation.d.ts.map +0 -1
- package/dist/invalidation.js.map +0 -1
- package/dist/mcp/framing.d.ts.map +0 -1
- package/dist/mcp/framing.js.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js.map +0 -1
- package/dist/memory-value-weights.d.ts.map +0 -1
- package/dist/memory-value-weights.js.map +0 -1
- package/dist/memory-value.d.ts.map +0 -1
- package/dist/memory-value.js.map +0 -1
- package/dist/memory.d.ts.map +0 -1
- package/dist/memory.js.map +0 -1
- package/dist/multihop.d.ts.map +0 -1
- package/dist/multihop.js.map +0 -1
- package/dist/owner-validation.d.ts.map +0 -1
- package/dist/owner-validation.js.map +0 -1
- package/dist/path-context.d.ts.map +0 -1
- package/dist/path-context.js.map +0 -1
- package/dist/physics-config.d.ts.map +0 -1
- package/dist/physics-config.js.map +0 -1
- package/dist/physics-state.d.ts.map +0 -1
- package/dist/physics-state.js.map +0 -1
- package/dist/physics.d.ts.map +0 -1
- package/dist/physics.js.map +0 -1
- package/dist/policies.d.ts.map +0 -1
- package/dist/policies.js.map +0 -1
- package/dist/postinstall.d.ts.map +0 -1
- package/dist/postinstall.js.map +0 -1
- package/dist/predictions.d.ts.map +0 -1
- package/dist/predictions.js.map +0 -1
- package/dist/processes.d.ts.map +0 -1
- package/dist/processes.js.map +0 -1
- package/dist/project-briefs.d.ts.map +0 -1
- package/dist/project-briefs.js.map +0 -1
- package/dist/project-identity.d.ts.map +0 -1
- package/dist/project-identity.js.map +0 -1
- package/dist/provenance-coverage.d.ts.map +0 -1
- package/dist/provenance-coverage.js.map +0 -1
- package/dist/rate-limit.d.ts.map +0 -1
- package/dist/rate-limit.js.map +0 -1
- package/dist/raw-archive-mirror-cleanup.d.ts.map +0 -1
- package/dist/raw-archive-mirror-cleanup.js.map +0 -1
- package/dist/raw-archive.d.ts.map +0 -1
- package/dist/raw-archive.js.map +0 -1
- package/dist/recall-history.d.ts.map +0 -1
- package/dist/recall-history.js.map +0 -1
- package/dist/recall-scope.d.ts.map +0 -1
- package/dist/recall-scope.js.map +0 -1
- package/dist/recall-trace.d.ts.map +0 -1
- package/dist/recall-trace.js.map +0 -1
- package/dist/refine-llm.d.ts.map +0 -1
- package/dist/refine-llm.js.map +0 -1
- package/dist/reject-flow.d.ts.map +0 -1
- package/dist/reject-flow.js.map +0 -1
- package/dist/rejection.d.ts.map +0 -1
- package/dist/rejection.js.map +0 -1
- package/dist/replay.d.ts.map +0 -1
- package/dist/replay.js.map +0 -1
- package/dist/rerankers/cross-encoder.d.ts.map +0 -1
- package/dist/rerankers/cross-encoder.js.map +0 -1
- package/dist/rerankers/index.d.ts.map +0 -1
- package/dist/rerankers/index.js.map +0 -1
- package/dist/rerankers/jev.d.ts.map +0 -1
- package/dist/rerankers/jev.js.map +0 -1
- package/dist/rerankers/llm.d.ts.map +0 -1
- package/dist/rerankers/llm.js.map +0 -1
- package/dist/rerankers/types.d.ts.map +0 -1
- package/dist/rerankers/types.js.map +0 -1
- package/dist/rrf.d.ts.map +0 -1
- package/dist/rrf.js.map +0 -1
- package/dist/salience.d.ts.map +0 -1
- package/dist/salience.js.map +0 -1
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js.map +0 -1
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js.map +0 -1
- package/dist/search.d.ts.map +0 -1
- package/dist/search.js.map +0 -1
- package/dist/secret-detect.d.ts.map +0 -1
- package/dist/secret-detect.js.map +0 -1
- package/dist/server-detect.d.ts.map +0 -1
- package/dist/server-detect.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/shared.d.ts.map +0 -1
- package/dist/shared.js.map +0 -1
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js.map +0 -1
- package/dist/sleep-redact.d.ts +0 -58
- package/dist/sleep-redact.d.ts.map +0 -1
- package/dist/sleep-redact.js +0 -80
- package/dist/sleep-redact.js.map +0 -1
- package/dist/src/ablation.js +0 -138
- package/dist/src/ablation.js.map +0 -1
- package/dist/src/ambient.js +0 -148
- package/dist/src/ambient.js.map +0 -1
- package/dist/src/api.js +0 -2109
- package/dist/src/api.js.map +0 -1
- package/dist/src/audit-prune.js +0 -109
- package/dist/src/audit-prune.js.map +0 -1
- package/dist/src/audit.js +0 -213
- package/dist/src/audit.js.map +0 -1
- package/dist/src/auth.js +0 -97
- package/dist/src/auth.js.map +0 -1
- package/dist/src/autolearn.js +0 -174
- package/dist/src/autolearn.js.map +0 -1
- package/dist/src/availability.js +0 -94
- package/dist/src/availability.js.map +0 -1
- package/dist/src/capture.js +0 -1346
- package/dist/src/capture.js.map +0 -1
- package/dist/src/card-detail.js +0 -15
- package/dist/src/card-detail.js.map +0 -1
- package/dist/src/card.js +0 -19
- package/dist/src/card.js.map +0 -1
- package/dist/src/cli.js +0 -9387
- package/dist/src/cli.js.map +0 -1
- package/dist/src/client.js +0 -237
- package/dist/src/client.js.map +0 -1
- package/dist/src/compare.js +0 -122
- package/dist/src/compare.js.map +0 -1
- package/dist/src/config.js +0 -135
- package/dist/src/config.js.map +0 -1
- package/dist/src/connectors/github/backfill.js +0 -281
- package/dist/src/connectors/github/backfill.js.map +0 -1
- package/dist/src/connectors/github/cli-impl.js +0 -234
- package/dist/src/connectors/github/cli-impl.js.map +0 -1
- package/dist/src/connectors/github/deletion.js +0 -85
- package/dist/src/connectors/github/deletion.js.map +0 -1
- package/dist/src/connectors/github/dlq.js +0 -190
- package/dist/src/connectors/github/dlq.js.map +0 -1
- package/dist/src/connectors/github/idempotency.js +0 -27
- package/dist/src/connectors/github/idempotency.js.map +0 -1
- package/dist/src/connectors/github/ingest.js +0 -156
- package/dist/src/connectors/github/ingest.js.map +0 -1
- package/dist/src/connectors/github/octokit-client.js +0 -70
- package/dist/src/connectors/github/octokit-client.js.map +0 -1
- package/dist/src/connectors/github/ratelimit.js +0 -31
- package/dist/src/connectors/github/ratelimit.js.map +0 -1
- package/dist/src/connectors/github/scope.js +0 -13
- package/dist/src/connectors/github/scope.js.map +0 -1
- package/dist/src/connectors/github/signature.js +0 -81
- package/dist/src/connectors/github/signature.js.map +0 -1
- package/dist/src/connectors/github/tenant-routing.js +0 -69
- package/dist/src/connectors/github/tenant-routing.js.map +0 -1
- package/dist/src/connectors/github/transform.js +0 -103
- package/dist/src/connectors/github/transform.js.map +0 -1
- package/dist/src/connectors/github/types.js +0 -100
- package/dist/src/connectors/github/types.js.map +0 -1
- package/dist/src/connectors/slack/backfill.js +0 -78
- package/dist/src/connectors/slack/backfill.js.map +0 -1
- package/dist/src/connectors/slack/deletion.js +0 -59
- package/dist/src/connectors/slack/deletion.js.map +0 -1
- package/dist/src/connectors/slack/dlq.js +0 -224
- package/dist/src/connectors/slack/dlq.js.map +0 -1
- package/dist/src/connectors/slack/idempotency.js +0 -31
- package/dist/src/connectors/slack/idempotency.js.map +0 -1
- package/dist/src/connectors/slack/ingest.js +0 -109
- package/dist/src/connectors/slack/ingest.js.map +0 -1
- package/dist/src/connectors/slack/ratelimit.js +0 -18
- package/dist/src/connectors/slack/ratelimit.js.map +0 -1
- package/dist/src/connectors/slack/scope.js +0 -13
- package/dist/src/connectors/slack/scope.js.map +0 -1
- package/dist/src/connectors/slack/signature.js +0 -27
- package/dist/src/connectors/slack/signature.js.map +0 -1
- package/dist/src/connectors/slack/tenant-routing.js +0 -41
- package/dist/src/connectors/slack/tenant-routing.js.map +0 -1
- package/dist/src/connectors/slack/transform.js +0 -47
- package/dist/src/connectors/slack/transform.js.map +0 -1
- package/dist/src/connectors/slack/types.js +0 -35
- package/dist/src/connectors/slack/types.js.map +0 -1
- package/dist/src/connectors/slack/web-client.js +0 -43
- package/dist/src/connectors/slack/web-client.js.map +0 -1
- package/dist/src/connectors/slack/workspaces.js +0 -62
- package/dist/src/connectors/slack/workspaces.js.map +0 -1
- package/dist/src/consolidate.js +0 -978
- package/dist/src/consolidate.js.map +0 -1
- package/dist/src/correction-latency.js +0 -74
- package/dist/src/correction-latency.js.map +0 -1
- package/dist/src/customer-notes.js +0 -325
- package/dist/src/customer-notes.js.map +0 -1
- package/dist/src/dag.js +0 -352
- package/dist/src/dag.js.map +0 -1
- package/dist/src/dashboard.js +0 -258
- package/dist/src/dashboard.js.map +0 -1
- package/dist/src/db.js +0 -2731
- package/dist/src/db.js.map +0 -1
- package/dist/src/decisions.js +0 -304
- package/dist/src/decisions.js.map +0 -1
- package/dist/src/dedupe.js +0 -141
- package/dist/src/dedupe.js.map +0 -1
- package/dist/src/embedding-provider.js +0 -314
- package/dist/src/embedding-provider.js.map +0 -1
- package/dist/src/embeddings.js +0 -543
- package/dist/src/embeddings.js.map +0 -1
- package/dist/src/eval-suite.js +0 -294
- package/dist/src/eval-suite.js.map +0 -1
- package/dist/src/eval.js +0 -187
- package/dist/src/eval.js.map +0 -1
- package/dist/src/extract.js +0 -117
- package/dist/src/extract.js.map +0 -1
- package/dist/src/forward-claim-detector.js +0 -117
- package/dist/src/forward-claim-detector.js.map +0 -1
- package/dist/src/goals.js +0 -399
- package/dist/src/goals.js.map +0 -1
- package/dist/src/graph-extract.js +0 -314
- package/dist/src/graph-extract.js.map +0 -1
- package/dist/src/graph-recall.js +0 -277
- package/dist/src/graph-recall.js.map +0 -1
- package/dist/src/graph-stream.js +0 -176
- package/dist/src/graph-stream.js.map +0 -1
- package/dist/src/graph-view.js +0 -310
- package/dist/src/graph-view.js.map +0 -1
- package/dist/src/graph.js +0 -762
- package/dist/src/graph.js.map +0 -1
- package/dist/src/handoff.js +0 -65
- package/dist/src/handoff.js.map +0 -1
- package/dist/src/hooks.js +0 -926
- package/dist/src/hooks.js.map +0 -1
- package/dist/src/importers.js +0 -881
- package/dist/src/importers.js.map +0 -1
- package/dist/src/incidents.js +0 -336
- package/dist/src/incidents.js.map +0 -1
- package/dist/src/index.js +0 -32
- package/dist/src/index.js.map +0 -1
- package/dist/src/invalidation.js +0 -129
- package/dist/src/invalidation.js.map +0 -1
- package/dist/src/mcp/framing.js +0 -45
- package/dist/src/mcp/framing.js.map +0 -1
- package/dist/src/mcp/server.js +0 -1298
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/src/memory-value-weights.js +0 -31
- package/dist/src/memory-value-weights.js.map +0 -1
- package/dist/src/memory-value.js +0 -261
- package/dist/src/memory-value.js.map +0 -1
- package/dist/src/memory.js +0 -425
- package/dist/src/memory.js.map +0 -1
- package/dist/src/multihop.js +0 -35
- package/dist/src/multihop.js.map +0 -1
- package/dist/src/owner-validation.js +0 -56
- package/dist/src/owner-validation.js.map +0 -1
- package/dist/src/path-context.js +0 -48
- package/dist/src/path-context.js.map +0 -1
- package/dist/src/physics-config.js +0 -26
- package/dist/src/physics-config.js.map +0 -1
- package/dist/src/physics-state.js +0 -172
- package/dist/src/physics-state.js.map +0 -1
- package/dist/src/physics.js +0 -378
- package/dist/src/physics.js.map +0 -1
- package/dist/src/policies.js +0 -414
- package/dist/src/policies.js.map +0 -1
- package/dist/src/postinstall.js +0 -101
- package/dist/src/postinstall.js.map +0 -1
- package/dist/src/predictions.js +0 -629
- package/dist/src/predictions.js.map +0 -1
- package/dist/src/processes.js +0 -349
- package/dist/src/processes.js.map +0 -1
- package/dist/src/project-briefs.js +0 -492
- package/dist/src/project-briefs.js.map +0 -1
- package/dist/src/project-identity.js +0 -200
- package/dist/src/project-identity.js.map +0 -1
- package/dist/src/provenance-coverage.js +0 -23
- package/dist/src/provenance-coverage.js.map +0 -1
- package/dist/src/rate-limit.js +0 -60
- package/dist/src/rate-limit.js.map +0 -1
- package/dist/src/raw-archive-mirror-cleanup.js +0 -55
- package/dist/src/raw-archive-mirror-cleanup.js.map +0 -1
- package/dist/src/raw-archive.js +0 -91
- package/dist/src/raw-archive.js.map +0 -1
- package/dist/src/recall-history.js +0 -235
- package/dist/src/recall-history.js.map +0 -1
- package/dist/src/recall-scope.js +0 -89
- package/dist/src/recall-scope.js.map +0 -1
- package/dist/src/recall-trace.js +0 -186
- package/dist/src/recall-trace.js.map +0 -1
- package/dist/src/refine-llm.js +0 -156
- package/dist/src/refine-llm.js.map +0 -1
- package/dist/src/reject-flow.js +0 -209
- package/dist/src/reject-flow.js.map +0 -1
- package/dist/src/rejection.js +0 -160
- package/dist/src/rejection.js.map +0 -1
- package/dist/src/replay.js +0 -122
- package/dist/src/replay.js.map +0 -1
- package/dist/src/rerankers/cross-encoder.js +0 -137
- package/dist/src/rerankers/cross-encoder.js.map +0 -1
- package/dist/src/rerankers/index.js +0 -20
- package/dist/src/rerankers/index.js.map +0 -1
- package/dist/src/rerankers/jev.js +0 -119
- package/dist/src/rerankers/jev.js.map +0 -1
- package/dist/src/rerankers/llm.js +0 -80
- package/dist/src/rerankers/llm.js.map +0 -1
- package/dist/src/rerankers/types.js +0 -2
- package/dist/src/rerankers/types.js.map +0 -1
- package/dist/src/rrf.js +0 -61
- package/dist/src/rrf.js.map +0 -1
- package/dist/src/salience.js +0 -74
- package/dist/src/salience.js.map +0 -1
- package/dist/src/scheduler.js +0 -77
- package/dist/src/scheduler.js.map +0 -1
- package/dist/src/scope.js +0 -35
- package/dist/src/scope.js.map +0 -1
- package/dist/src/search.js +0 -1003
- package/dist/src/search.js.map +0 -1
- package/dist/src/secret-detect.js +0 -95
- package/dist/src/secret-detect.js.map +0 -1
- package/dist/src/server-detect.js +0 -231
- package/dist/src/server-detect.js.map +0 -1
- package/dist/src/server.js +0 -3255
- package/dist/src/server.js.map +0 -1
- package/dist/src/shared.js +0 -502
- package/dist/src/shared.js.map +0 -1
- package/dist/src/skills.js +0 -346
- package/dist/src/skills.js.map +0 -1
- package/dist/src/sleep-redact.js +0 -80
- package/dist/src/sleep-redact.js.map +0 -1
- package/dist/src/sso.js +0 -22
- package/dist/src/sso.js.map +0 -1
- package/dist/src/stdin.js +0 -41
- package/dist/src/stdin.js.map +0 -1
- package/dist/src/store.js +0 -3749
- package/dist/src/store.js.map +0 -1
- package/dist/src/tenant.js +0 -17
- package/dist/src/tenant.js.map +0 -1
- package/dist/src/trace.js +0 -72
- package/dist/src/trace.js.map +0 -1
- package/dist/src/version.js +0 -40
- package/dist/src/version.js.map +0 -1
- package/dist/src/working-memory.js +0 -157
- package/dist/src/working-memory.js.map +0 -1
- package/dist/src/yaml.js +0 -107
- package/dist/src/yaml.js.map +0 -1
- package/dist/sso.d.ts +0 -13
- package/dist/sso.d.ts.map +0 -1
- package/dist/sso.js +0 -22
- package/dist/sso.js.map +0 -1
- package/dist/stdin.d.ts.map +0 -1
- package/dist/stdin.js.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/tenant.d.ts.map +0 -1
- package/dist/tenant.js.map +0 -1
- package/dist/trace.d.ts.map +0 -1
- package/dist/trace.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js.map +0 -1
- package/dist/working-memory.d.ts.map +0 -1
- package/dist/working-memory.js.map +0 -1
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js.map +0 -1
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* J1 anchoring detector (recall-recurrence) — pure module.
|
|
3
|
-
*
|
|
4
|
-
* Implements two detection rules from ROADMAP-RESEARCH.md L546:
|
|
5
|
-
* R1 query_repeat: same queryHash within recentRepeatWindow returned
|
|
6
|
-
* same topMemoryId (caller is re-asking the same question).
|
|
7
|
-
* R2 memory_dominance: same topMemoryId across >= minDominance distinct
|
|
8
|
-
* queryHashes (memory acts as a fixed-point anchor regardless of what
|
|
9
|
-
* the agent asks).
|
|
10
|
-
*
|
|
11
|
-
* Per the plan v3 architectural decision: each pipeline (api.recall via
|
|
12
|
-
* HTTP, cmdRecall, MCP hippo_recall) owns its OWN ring buffer Map keyed
|
|
13
|
-
* by (tenant, session). No cross-pipeline sharing (the typical multi-
|
|
14
|
-
* process deployment makes IPC ring-sharing impractical; per-pipeline
|
|
15
|
-
* is correct because each pipeline has its own top-1 ranking anyway).
|
|
16
|
-
*
|
|
17
|
-
* Plan: docs/plans/2026-05-26-j1-anchoring-detector.md.
|
|
18
|
-
* Composes with J3.2: AnchoringHint + PlanningFallacyHint are independent
|
|
19
|
-
* signals; both can fire on the same recall.
|
|
20
|
-
*/
|
|
21
|
-
const DEFAULT_MIN_DOMINANCE = 3;
|
|
22
|
-
const DEFAULT_RECENT_REPEAT_WINDOW = 5;
|
|
23
|
-
const DEFAULT_COOLDOWN = 3;
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Query text normalization + hashing
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
/**
|
|
28
|
-
* Normalize + hash a query text into a 32-bit integer.
|
|
29
|
-
* Lowercase → strip non-alphanumeric → split → drop empty + short tokens →
|
|
30
|
-
* sort tokens → join → FNV-1a 32-bit.
|
|
31
|
-
*
|
|
32
|
-
* Token sort + dedup means semantically-equivalent queries with reordered
|
|
33
|
-
* words collide intentionally (the roadmap's "semantically-distinct" v1
|
|
34
|
-
* uses textual normalization; embedding-based distinctness is J1-v2).
|
|
35
|
-
*
|
|
36
|
-
* Deterministic across processes; stable across Node + V8 versions.
|
|
37
|
-
*/
|
|
38
|
-
export function hashQueryText(query) {
|
|
39
|
-
if (!query)
|
|
40
|
-
return 0;
|
|
41
|
-
// Token dedup before join: the R2 contract says "distinct queries"
|
|
42
|
-
// means semantically distinct, so `foo bar` and `foo foo bar` should
|
|
43
|
-
// collapse to the same hash. Without dedup, simple phrasing
|
|
44
|
-
// variations (typos, doubled tokens, intensifiers) would inflate
|
|
45
|
-
// distinct-query counts and trip R2 on essentially the same question.
|
|
46
|
-
// Codex round-1 catch.
|
|
47
|
-
// Unicode-aware tokenization (codex round-3 P2 catch): the prior
|
|
48
|
-
// ASCII-only [^a-z0-9\s] pattern stripped every non-Latin letter, so
|
|
49
|
-
// Japanese, Arabic, Cyrillic, accented-Latin etc. queries collapsed
|
|
50
|
-
// to empty token set -> hash 0 -> false R1 collisions across distinct
|
|
51
|
-
// non-English queries. \p{L} = any Unicode letter, \p{N} = any Unicode
|
|
52
|
-
// number, \p{M} = combining marks (preserve composed accented chars).
|
|
53
|
-
// Requires the /u flag and Node >= 12.
|
|
54
|
-
const normalized = query
|
|
55
|
-
.toLowerCase()
|
|
56
|
-
.replace(/[^\p{L}\p{N}\p{M}\s]/gu, ' ')
|
|
57
|
-
.split(/\s+/)
|
|
58
|
-
.filter((t) => t.length > 0);
|
|
59
|
-
// Drop tokens shorter than 3 chars to match the normalizer contract
|
|
60
|
-
// (filler / stop words). Without this, `a login bug` vs `login bug`
|
|
61
|
-
// hash differently and inflate R2 distinct-query counts, firing
|
|
62
|
-
// memory_dominance on repeated phrasings of the same question.
|
|
63
|
-
// Codex round-4 P2 catch. Matches the same >=3 filter in
|
|
64
|
-
// src/forward-claim-detector.ts for class-resolver tokens.
|
|
65
|
-
const filtered = normalized.filter((t) => t.length >= 3);
|
|
66
|
-
// Fallback when the >=3 filter would collapse the entire query to
|
|
67
|
-
// empty: CJK queries like `测试` / `环境` are 2-char tokens; English
|
|
68
|
-
// acronyms like `AI` / `UI` are 2 chars. Without this fallback they
|
|
69
|
-
// all hash to fnv1a32(''), producing false R1 collisions across
|
|
70
|
-
// distinct short-token queries. Codex round-5 P2 catch.
|
|
71
|
-
const tokens = filtered.length > 0 ? filtered : normalized;
|
|
72
|
-
const deduped = Array.from(new Set(tokens)).sort();
|
|
73
|
-
return fnv1a32(deduped.join(' '));
|
|
74
|
-
}
|
|
75
|
-
function fnv1a32(text) {
|
|
76
|
-
// FNV-1a 32-bit. Offset basis 2166136261, prime 16777619.
|
|
77
|
-
let hash = 2166136261;
|
|
78
|
-
for (let i = 0; i < text.length; i++) {
|
|
79
|
-
hash ^= text.charCodeAt(i);
|
|
80
|
-
// 32-bit multiply via Math.imul — handles overflow correctly.
|
|
81
|
-
hash = Math.imul(hash, 16777619);
|
|
82
|
-
}
|
|
83
|
-
// Coerce to unsigned 32-bit for stable comparison.
|
|
84
|
-
return hash >>> 0;
|
|
85
|
-
}
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
// Anchoring detection
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
/**
|
|
90
|
-
* Detect anchoring patterns in the recall history against the current
|
|
91
|
-
* recall's (queryHash, topMemoryId).
|
|
92
|
-
*
|
|
93
|
-
* Rule precedence: R2 (memory_dominance) wins on tie. When both R1 and R2
|
|
94
|
-
* fire on the same recall, return only the R2 hint — R2's signal is the
|
|
95
|
-
* cognitively stronger one (a memory dominating multiple DIFFERENT queries
|
|
96
|
-
* is a fixed-point anchor; R1 alone is just a literal re-ask).
|
|
97
|
-
*
|
|
98
|
-
* Cooldown: if the immediately-prior recall fired a hint on the SAME
|
|
99
|
-
* topMemoryId within `cooldown=3` history entries, suppress. Prevents
|
|
100
|
-
* spam when the agent repeatedly recalls within the dominance window.
|
|
101
|
-
* Cooldown is per-memory, not per-rule: if R2 fired on M (cooldown
|
|
102
|
-
* engaged for M), and the next recall has top=N + repeated query →
|
|
103
|
-
* R1 fires on N (different memory, not in cooldown).
|
|
104
|
-
*
|
|
105
|
-
* @returns AnchoringHint when a pattern fires; null otherwise.
|
|
106
|
-
*/
|
|
107
|
-
export function detectAnchoring(history, currentQueryHash, currentTopMemoryId, opts = {}) {
|
|
108
|
-
if (currentTopMemoryId === null)
|
|
109
|
-
return null;
|
|
110
|
-
const minDominance = opts.minDominance ?? DEFAULT_MIN_DOMINANCE;
|
|
111
|
-
const recentRepeatWindow = opts.recentRepeatWindow ?? DEFAULT_RECENT_REPEAT_WINDOW;
|
|
112
|
-
const cooldown = opts.cooldown ?? DEFAULT_COOLDOWN;
|
|
113
|
-
// Cooldown gate: was the most-recent hint (across the last `cooldown`
|
|
114
|
-
// entries) for THIS memory? If yes, suppress regardless of rule.
|
|
115
|
-
const cooldownSlice = history.slice(-cooldown);
|
|
116
|
-
for (const entry of cooldownSlice) {
|
|
117
|
-
if (entry.anchoredOn === currentTopMemoryId) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// R2 check FIRST (wins on tie). Count distinct queryHashes in history
|
|
122
|
-
// where topMemoryId === currentTopMemoryId (excluding null tops).
|
|
123
|
-
const matchingQueryHashes = new Set();
|
|
124
|
-
for (const entry of history) {
|
|
125
|
-
if (entry.topMemoryId === currentTopMemoryId) {
|
|
126
|
-
matchingQueryHashes.add(entry.queryHash);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// Include current query in the count.
|
|
130
|
-
matchingQueryHashes.add(currentQueryHash);
|
|
131
|
-
const queryCount = matchingQueryHashes.size;
|
|
132
|
-
if (queryCount >= minDominance) {
|
|
133
|
-
return {
|
|
134
|
-
reason: 'memory_dominance',
|
|
135
|
-
memoryId: currentTopMemoryId,
|
|
136
|
-
queryCount,
|
|
137
|
-
summary: `Memory ${currentTopMemoryId} has been the top result for ${queryCount} distinct queries in this session and may be anchoring your reasoning.`,
|
|
138
|
-
source: 'j1-recurrence',
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
// R1 check: is currentQueryHash present in the last `recentRepeatWindow`
|
|
142
|
-
// entries AND was that entry's topMemoryId === currentTopMemoryId?
|
|
143
|
-
const r1Slice = history.slice(-recentRepeatWindow);
|
|
144
|
-
for (const entry of r1Slice) {
|
|
145
|
-
if (entry.queryHash === currentQueryHash && entry.topMemoryId === currentTopMemoryId) {
|
|
146
|
-
return {
|
|
147
|
-
reason: 'query_repeat',
|
|
148
|
-
memoryId: currentTopMemoryId,
|
|
149
|
-
summary: `Same query phrasing as a recent recall returned the same top result (${currentTopMemoryId}); you may be re-asking the same question.`,
|
|
150
|
-
source: 'j1-recurrence',
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
// RingBuffer + caller-side state helpers
|
|
158
|
-
// ---------------------------------------------------------------------------
|
|
159
|
-
const MAX_HISTORY = 10;
|
|
160
|
-
const DEFAULT_MAX_SESSIONS = 1000;
|
|
161
|
-
/**
|
|
162
|
-
* Bounded FIFO ring of RecallHistoryEntry. Newest entries pushed via
|
|
163
|
-
* append; oldest evicted when the ring is full. The class is intentionally
|
|
164
|
-
* a thin wrapper around an array so snapshotRing returns a readonly view
|
|
165
|
-
* without copying on the hot path.
|
|
166
|
-
*/
|
|
167
|
-
export class RingBuffer {
|
|
168
|
-
entries = [];
|
|
169
|
-
append(entry) {
|
|
170
|
-
this.entries.push(entry);
|
|
171
|
-
if (this.entries.length > MAX_HISTORY) {
|
|
172
|
-
this.entries.shift();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
snapshot() {
|
|
176
|
-
return this.entries;
|
|
177
|
-
}
|
|
178
|
-
size() {
|
|
179
|
-
return this.entries.length;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Build the (tenant, session) key for a per-session ring Map. Uses a NUL
|
|
184
|
-
* (`\x00`) byte as delimiter because tenant ids and session ids are
|
|
185
|
-
* validated elsewhere to reject NUL chars — guarantees collision-free
|
|
186
|
-
* concatenation regardless of what `:` or other delimiters might appear
|
|
187
|
-
* inside either field (notably API-key-derived subjects can contain `:`).
|
|
188
|
-
*/
|
|
189
|
-
export function buildSessionKey(tenantId, sessionId) {
|
|
190
|
-
return `${tenantId}\x00${sessionId}`;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Get-or-create a RingBuffer for a session key. Caps total tracked keys
|
|
194
|
-
* at `maxSessions` (default 1000) with LRU eviction — when the cap is
|
|
195
|
-
* hit, deletes the oldest-inserted key before inserting the new one.
|
|
196
|
-
* Map iteration order preserves insertion order per ECMA-262 spec, so
|
|
197
|
-
* "oldest" = first key returned by Map.prototype.keys().
|
|
198
|
-
*/
|
|
199
|
-
export function getOrCreateRing(map, key, maxSessions = DEFAULT_MAX_SESSIONS) {
|
|
200
|
-
const existing = map.get(key);
|
|
201
|
-
if (existing) {
|
|
202
|
-
// LRU touch: delete + re-insert to move to back of iteration order.
|
|
203
|
-
map.delete(key);
|
|
204
|
-
map.set(key, existing);
|
|
205
|
-
return existing;
|
|
206
|
-
}
|
|
207
|
-
if (map.size >= maxSessions) {
|
|
208
|
-
const oldest = map.keys().next().value;
|
|
209
|
-
if (oldest !== undefined)
|
|
210
|
-
map.delete(oldest);
|
|
211
|
-
}
|
|
212
|
-
const ring = new RingBuffer();
|
|
213
|
-
map.set(key, ring);
|
|
214
|
-
return ring;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Append a recall to a ring. The `anchoredOn` argument carries the
|
|
218
|
-
* memoryId of the AnchoringHint that fired on THIS recall (or undefined
|
|
219
|
-
* if no hint). detectAnchoring reads it next time for cooldown gating.
|
|
220
|
-
*/
|
|
221
|
-
export function appendRecall(ring, queryHash, topMemoryId, anchoredOn) {
|
|
222
|
-
const entry = {
|
|
223
|
-
queryHash,
|
|
224
|
-
topMemoryId,
|
|
225
|
-
ts: new Date().toISOString(),
|
|
226
|
-
};
|
|
227
|
-
if (anchoredOn !== undefined)
|
|
228
|
-
entry.anchoredOn = anchoredOn;
|
|
229
|
-
ring.append(entry);
|
|
230
|
-
}
|
|
231
|
-
/** Snapshot a ring as a readonly RecallHistorySnapshot. */
|
|
232
|
-
export function snapshotRing(ring) {
|
|
233
|
-
return ring.snapshot();
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=recall-history.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recall-history.js","sourceRoot":"","sources":["../../src/recall-history.ts"],"names":[],"mappings":"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"}
|
package/dist/src/recall-scope.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v1.25.0 — recall-side scope predicates, extracted from api.ts into a leaf
|
|
3
|
-
* module so shared.ts (which api.ts imports) can apply the same default-deny
|
|
4
|
-
* rule to searchBothHybrid's internal candidate loads without an import
|
|
5
|
-
* cycle. Mirrors the v39 `project-identity.ts` precedent. api.ts imports
|
|
6
|
-
* these for its own call sites AND re-exports them for back-compat
|
|
7
|
-
* (`api.isPrivateScope`, test imports of `passesScopeFilterForRecall`).
|
|
8
|
-
*/
|
|
9
|
-
import { RECALL_DEFAULT_DENY_SCOPES } from './store.js';
|
|
10
|
-
/**
|
|
11
|
-
* v1.2.1: source-agnostic private-scope detector. A scope string is treated
|
|
12
|
-
* as private when it has the shape `<lowercase-source>:private:<rest>`.
|
|
13
|
-
*
|
|
14
|
-
* Examples that match:
|
|
15
|
-
* slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
|
|
16
|
-
* Examples that DO NOT match:
|
|
17
|
-
* slack:public:Cgeneral, acme:public:my-private-channel, null, '',
|
|
18
|
-
* 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
|
|
19
|
-
*
|
|
20
|
-
* Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
|
|
21
|
-
* cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
|
|
22
|
-
* recall mode). Keep these in sync — the export is the single source of
|
|
23
|
-
* truth so connector work cannot drift.
|
|
24
|
-
*/
|
|
25
|
-
export const PRIVATE_SCOPE_RE = /^[a-z][a-z0-9_-]*:private:/;
|
|
26
|
-
function isScopeString(value) {
|
|
27
|
-
return typeof value === 'string';
|
|
28
|
-
}
|
|
29
|
-
/** True when `scope` matches the `<source>:private:*` shape. */
|
|
30
|
-
export function isPrivateScope(scope) {
|
|
31
|
-
if (!isScopeString(scope))
|
|
32
|
-
return false;
|
|
33
|
-
return PRIVATE_SCOPE_RE.test(scope);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Recall-side scope filter — the canonical JS half of the recall default-deny
|
|
37
|
-
* rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
|
|
38
|
-
*
|
|
39
|
-
* - When `requested` is set and non-empty: exact match required.
|
|
40
|
-
* - When `requested` is undefined/empty: default-deny on any
|
|
41
|
-
* `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
|
|
42
|
-
* quarantine buckets. `null` and public scopes pass.
|
|
43
|
-
*
|
|
44
|
-
* @internal v1.7.2 — exported for test parity with
|
|
45
|
-
* `RECALL_DEFAULT_DENY_SCOPES` (single-source-of-truth verification). NOT part
|
|
46
|
-
* of the public API surface; not re-exported from `src/index.ts`. Subject to
|
|
47
|
-
* change without semver bump.
|
|
48
|
-
*/
|
|
49
|
-
export function passesScopeFilterForRecall(scope, requested) {
|
|
50
|
-
if (requested !== undefined && requested !== '') {
|
|
51
|
-
return scope === requested;
|
|
52
|
-
}
|
|
53
|
-
if (scope === null)
|
|
54
|
-
return true;
|
|
55
|
-
if (isPrivateScope(scope))
|
|
56
|
-
return false;
|
|
57
|
-
// SAFETY: RECALL_DEFAULT_DENY_SCOPES (v1.7.2, single source of truth
|
|
58
|
-
// shared with the SQL clause in loadSearchRows) is a readonly tuple of
|
|
59
|
-
// string literals. Cast the array to readonly string[] so .includes()
|
|
60
|
-
// accepts arbitrary string scopes without a cast on the input (codex
|
|
61
|
-
// P0-2: casting `scope` would defeat the constant's safety).
|
|
62
|
-
if (RECALL_DEFAULT_DENY_SCOPES.includes(scope))
|
|
63
|
-
return false;
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* v1.25.0 — the CLI `--scope` variant of the recall filter (JS half of the
|
|
68
|
-
* SQL 'default-deny-or-exact' mode in loadSearchRows).
|
|
69
|
-
*
|
|
70
|
-
* The CLI flag predates the envelope column as a TAG-boost ranking hint
|
|
71
|
-
* (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
|
|
72
|
-
* UNLOCKS envelope scope X in addition to the default-admitted set — it does
|
|
73
|
-
* NOT narrow the result to X (that would return zero rows for every
|
|
74
|
-
* tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
|
|
75
|
-
* narrowing 'exact' semantics via `passesScopeFilterForRecall`.
|
|
76
|
-
*
|
|
77
|
-
* Note the unlock applies to whatever scope was explicitly named — including
|
|
78
|
-
* a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
|
|
79
|
-
* deliberate owner access, identical in reach to api.recall's exact-match
|
|
80
|
-
* for the same input; only NON-requested private/quarantine scopes stay
|
|
81
|
-
* denied.
|
|
82
|
-
*/
|
|
83
|
-
export function passesCliRecallScopeFilter(scope, requested) {
|
|
84
|
-
if (requested !== undefined && requested !== '' && scope === requested) {
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
return passesScopeFilterForRecall(scope, undefined);
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=recall-scope.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recall-scope.js","sourceRoot":"","sources":["../../src/recall-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D,SAAS,aAAa,CAAC,KAAgC;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,KAAgC;IAC7D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAoB,EACpB,SAA6B;IAE7B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QAChD,OAAO,KAAK,KAAK,SAAS,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,6DAA6D;IAC7D,IAAK,0BAAgD,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAoB,EACpB,SAA6B;IAE7B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/src/recall-trace.js
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LC1 — retrieval-trace persistence
|
|
3
|
-
* (docs/plans/2026-08-02-lc1-recall-trace-persistence.md).
|
|
4
|
-
*
|
|
5
|
-
* Single producer for the `recall_traces` / `recall_trace_results` /
|
|
6
|
-
* `recall_trace_outcomes` tables (schema v40). Every recall on the three
|
|
7
|
-
* wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
|
|
8
|
-
* row: the ids + ranks + scores actually returned. Outcome events that
|
|
9
|
-
* resolve their targets from last-retrieval state link back to the trace
|
|
10
|
-
* they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
|
|
11
|
-
* training triple every Track LC learned component needs.
|
|
12
|
-
*
|
|
13
|
-
* All writes here are fail-soft: a broken trace write must never break the
|
|
14
|
-
* surrounding recall or outcome call. Failures are logged to stderr and
|
|
15
|
-
* swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
|
|
16
|
-
* new debug env var).
|
|
17
|
-
*/
|
|
18
|
-
import { createHash } from 'node:crypto';
|
|
19
|
-
import { openHippoDb, closeHippoDb } from './db.js';
|
|
20
|
-
/**
|
|
21
|
-
* Strip a RerankStep down to {stage, multiplier, scoreBefore, scoreAfter}
|
|
22
|
-
* before persisting (F3 privacy fix, codex cross-model finding). `note` is
|
|
23
|
-
* free-form human text — the CLI's goal-boost step embeds matched goal tag
|
|
24
|
-
* text there, so persisting it verbatim would leak raw user content into
|
|
25
|
-
* training data via `rerank_json`. Only the four structured fields survive;
|
|
26
|
-
* any other/future free-form field is dropped by construction (allowlist,
|
|
27
|
-
* not a denylist).
|
|
28
|
-
*/
|
|
29
|
-
function sanitizeRerankSteps(steps) {
|
|
30
|
-
return steps.map((s) => ({
|
|
31
|
-
stage: s.stage,
|
|
32
|
-
multiplier: s.multiplier,
|
|
33
|
-
scoreBefore: s.scoreBefore,
|
|
34
|
-
scoreAfter: s.scoreAfter,
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Insert a `recall_traces` row + its `recall_trace_results` rows in ONE
|
|
39
|
-
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
40
|
-
* logs to stderr and returns null on any failure.
|
|
41
|
-
*
|
|
42
|
-
* Connection policy (per the plan): api.recall calls this directly on its
|
|
43
|
-
* own already-open handle. api.getContext and CLI cmdRecall go through
|
|
44
|
-
* `writeRecallTraceAtRoot` instead, since their audit handles are already
|
|
45
|
-
* closed by the time tracing runs.
|
|
46
|
-
*/
|
|
47
|
-
export function writeRecallTrace(db, input) {
|
|
48
|
-
try {
|
|
49
|
-
const queryHash = createHash('sha256').update(input.query).digest('hex').slice(0, 16);
|
|
50
|
-
const ts = new Date().toISOString();
|
|
51
|
-
db.exec('BEGIN');
|
|
52
|
-
try {
|
|
53
|
-
const insertTrace = db.prepare(`
|
|
54
|
-
INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count, explain_mode)
|
|
55
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
56
|
-
`);
|
|
57
|
-
const traceResult = insertTrace.run(ts, input.tenantId, input.sessionId ?? null, input.pipeline, queryHash, input.query.length, input.results.length, input.explainMode ? 1 : 0);
|
|
58
|
-
const traceId = Number(traceResult.lastInsertRowid);
|
|
59
|
-
const insertResult = db.prepare(`
|
|
60
|
-
INSERT INTO recall_trace_results (trace_id, tenant_id, memory_id, result_rank, score, rerank_json)
|
|
61
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
62
|
-
`);
|
|
63
|
-
input.results.forEach((r, i) => {
|
|
64
|
-
insertResult.run(traceId, input.tenantId, r.memoryId, i + 1, r.score, r.rerankSteps && r.rerankSteps.length > 0 ? JSON.stringify(sanitizeRerankSteps(r.rerankSteps)) : null);
|
|
65
|
-
});
|
|
66
|
-
db.exec('COMMIT');
|
|
67
|
-
return traceId;
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
try {
|
|
71
|
-
db.exec('ROLLBACK');
|
|
72
|
-
}
|
|
73
|
-
catch { /* already rolled back; keep the original error */ }
|
|
74
|
-
throw error;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
// eslint-disable-next-line no-console
|
|
79
|
-
console.error(`[hippo] recall trace write failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Convenience wrapper: opens a fresh short-lived connection at `root`,
|
|
85
|
-
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
86
|
-
* failure (fail-soft).
|
|
87
|
-
*
|
|
88
|
-
* Used at api.getContext and CLI cmdRecall — sites where the block's own
|
|
89
|
-
* convention is per-call handles (writeEntry, saveIndex) and the earlier
|
|
90
|
-
* audit handles are already closed. NOT used by api.recall, which must
|
|
91
|
-
* reuse the caller's open handle (v1.11.5 no-side-effects contract,
|
|
92
|
-
* tests/api-recall-no-side-effects.test.ts).
|
|
93
|
-
*
|
|
94
|
-
* F1 structural fix (replaces the earlier stamp-then-clear design): this
|
|
95
|
-
* function does NOT touch the `last_trace_id` meta key. Stamping lived here
|
|
96
|
-
* originally, on its own connection, separate from the `last_retrieval_ids`
|
|
97
|
-
* write in `saveIndex` — two connections meant two commits, so a crash or
|
|
98
|
-
* a failed second write could advance one without the other. LOCKSTEP
|
|
99
|
-
* INVARIANT: `last_trace_id` must only ever advance in the SAME write as
|
|
100
|
-
* `last_retrieval_ids`. The caller now does: call this function FIRST, set
|
|
101
|
-
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
102
|
-
* once — `saveIndex` persists both meta keys in one transaction
|
|
103
|
-
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
104
|
-
* (CLI cmdRecall's zero-result path, getContext's empty-result path) simply
|
|
105
|
-
* never touch `localIndex` at all — they can't desync by construction.
|
|
106
|
-
*
|
|
107
|
-
* Fail-soft: never throws, including on connection failure.
|
|
108
|
-
*/
|
|
109
|
-
export function writeRecallTraceAtRoot(root, input) {
|
|
110
|
-
let db;
|
|
111
|
-
try {
|
|
112
|
-
db = openHippoDb(root);
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
// eslint-disable-next-line no-console
|
|
116
|
-
console.error(`[hippo] recall trace connection failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
try {
|
|
120
|
-
return writeRecallTrace(db, input);
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
closeHippoDb(db);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Record an outcome event against a trace, linking the (query, shown,
|
|
128
|
-
* outcome) triple. Called ONLY where the credited ids actually come from
|
|
129
|
-
* the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
|
|
130
|
-
* flow that resolves its targets from last-retrieval state) or from an
|
|
131
|
-
* SDK caller's explicit `traceId` opt — never unconditionally from
|
|
132
|
-
* api.outcome, which would mislink an explicit-id caller to a stale,
|
|
133
|
-
* unrelated trace.
|
|
134
|
-
*
|
|
135
|
-
* Lives in its own append-only table, not audit_log metadata: audit_log is
|
|
136
|
-
* pruned by `pruneAuditLog`, and pruning must never erase training data.
|
|
137
|
-
*
|
|
138
|
-
* F4 validation (codex cross-model finding): `traceId`/`memoryIds` reach
|
|
139
|
-
* this function from caller-side state (`last_trace_id` / applied outcome
|
|
140
|
-
* ids) that can go stale relative to the trace it names — a forgotten
|
|
141
|
-
* memory, a tenant switch mid-session, or a race between two callers. Two
|
|
142
|
-
* checks run before the insert, both skip silently (console.error one
|
|
143
|
-
* line) rather than throw:
|
|
144
|
-
* 1. The named trace must exist and belong to `input.tenantId` — a
|
|
145
|
-
* tenant mismatch or a dangling id (deleted trace) skips.
|
|
146
|
-
* 2. `input.memoryIds` is intersected against the trace's OWN
|
|
147
|
-
* `recall_trace_results.memory_id` set — only ids that trace actually
|
|
148
|
-
* returned are recorded. An id that was never in this trace's result
|
|
149
|
-
* set (stale caller state) is silently dropped rather than recorded
|
|
150
|
-
* as a false credit. If the intersection is empty, no row is written.
|
|
151
|
-
*
|
|
152
|
-
* Fail-soft: never throws.
|
|
153
|
-
*/
|
|
154
|
-
export function recordTraceOutcome(db, input) {
|
|
155
|
-
try {
|
|
156
|
-
// SAFETY: row shape matches the single `tenant_id` column named in the
|
|
157
|
-
// SELECT above; sqlite returns undefined when no row matches.
|
|
158
|
-
const trace = db.prepare(`SELECT tenant_id FROM recall_traces WHERE id = ?`).get(input.traceId);
|
|
159
|
-
if (!trace || trace.tenant_id !== input.tenantId) {
|
|
160
|
-
// eslint-disable-next-line no-console
|
|
161
|
-
console.error(`[hippo] recall trace outcome skipped: trace ${input.traceId} missing or tenant mismatch`);
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
// SAFETY: row shape matches the single `memory_id` column named in the
|
|
165
|
-
// SELECT above.
|
|
166
|
-
const memberRows = db
|
|
167
|
-
.prepare(`SELECT memory_id FROM recall_trace_results WHERE trace_id = ?`)
|
|
168
|
-
.all(input.traceId);
|
|
169
|
-
const members = new Set(memberRows.map((r) => r.memory_id));
|
|
170
|
-
const credited = input.memoryIds.filter((id) => members.has(id));
|
|
171
|
-
if (credited.length === 0) {
|
|
172
|
-
// eslint-disable-next-line no-console
|
|
173
|
-
console.error(`[hippo] recall trace outcome skipped: no credited ids intersect trace ${input.traceId}'s results`);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
db.prepare(`
|
|
177
|
-
INSERT INTO recall_trace_outcomes (trace_id, ts, tenant_id, outcome, memory_ids_json)
|
|
178
|
-
VALUES (?, ?, ?, ?, ?)
|
|
179
|
-
`).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
// eslint-disable-next-line no-console
|
|
183
|
-
console.error(`[hippo] recall trace outcome write failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=recall-trace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recall-trace.js","sourceRoot":"","sources":["../../src/recall-trace.ts"],"names":[],"mappings":"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"}
|