hippo-memory 1.43.3 → 1.45.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 +14 -12
- package/bin/hippo.js +3 -1
- package/dist/api.d.ts +21 -21
- package/dist/api.js +69 -42
- package/dist/audit-prune.js +4 -1
- package/dist/audit.d.ts +1 -1
- package/dist/audit.js +9 -0
- package/dist/autolearn.d.ts +1 -1
- package/dist/autolearn.js +2 -1
- package/dist/capture.d.ts +11 -10
- package/dist/capture.js +22 -30
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +309 -171
- package/dist/client.d.ts +4 -21
- package/dist/client.js +3 -112
- package/dist/config.js +2 -1
- package/dist/consolidate.d.ts +3 -0
- package/dist/consolidate.js +44 -42
- package/dist/dag.d.ts +1 -0
- package/dist/dag.js +10 -5
- package/dist/dashboard.js +7 -3
- package/dist/db.js +16 -24
- package/dist/dedupe.d.ts +1 -0
- package/dist/dedupe.js +4 -7
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +3 -2
- package/dist/embeddings.js +81 -8
- package/dist/extract.d.ts +2 -0
- package/dist/extract.js +9 -4
- package/dist/goals.js +12 -3
- package/dist/mcp/server.js +21 -36
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +7 -1
- package/dist/physics-state.js +4 -1
- package/dist/raw-archive.js +5 -2
- package/dist/recall-trace.js +4 -1
- package/dist/refine-llm.js +3 -2
- package/dist/rerankers/jev.js +3 -2
- package/dist/rerankers/llm.js +3 -2
- package/dist/search.js +3 -3
- package/dist/server.d.ts +5 -0
- package/dist/server.js +39 -29
- package/dist/shared.js +1 -1
- package/dist/stdin.d.ts +12 -0
- package/dist/stdin.js +41 -0
- package/dist/store.d.ts +18 -11
- package/dist/store.js +152 -65
- 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 +8 -5
- 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 -106
- 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 -1354
- 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 -9328
- 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 -2728
- 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 -390
- 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 -169
- 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 -88
- 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 -183
- 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/store.js +0 -3743
- 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/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
package/dist/src/policies.js
DELETED
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2 policy first-class object (docs/plans/2026-05-30-e2-policy-object.md).
|
|
3
|
-
*
|
|
4
|
-
* The "bi-temporal-first" object type: a named rule/statement that is in force
|
|
5
|
-
* over an EFFECTIVE-TIME range and evolves via supersession. Two time axes:
|
|
6
|
-
*
|
|
7
|
-
* - Valid time (effective time): when the policy is in force in the real world,
|
|
8
|
-
* as first-class columns `valid_from` (required; defaults to creation time)
|
|
9
|
-
* and `valid_to` (nullable = open-ended). This is the queryable axis: see
|
|
10
|
-
* `loadPoliciesAsOf` (the active policies in force at a given valid-time).
|
|
11
|
-
* - Transaction time (system time): when the row was recorded / retired, via
|
|
12
|
-
* `created_at` + the supersede chain's `superseded_at`. Present, but
|
|
13
|
-
* time-travel ("what did we BELIEVE was in force at past system time T") is
|
|
14
|
-
* deferred to a future version.
|
|
15
|
-
*
|
|
16
|
-
* The delta lifecycle reuses the process/decision supersede machinery verbatim
|
|
17
|
-
* (superseded_by self-FK + CAS + INSERT-preflight + server-derived version +
|
|
18
|
-
* change_summary + supersede tenant-match trigger). It DROPS process's `steps`
|
|
19
|
-
* (a policy has `policy_text`) and ADDS `valid_from`/`valid_to`.
|
|
20
|
-
*
|
|
21
|
-
* The `policies` table is the source of truth (survives memory decay); the
|
|
22
|
-
* memory mirror is for recall only. memory_id is NULLABLE with ON DELETE SET
|
|
23
|
-
* NULL so forget/consolidate/archive gracefully orphans the policy row.
|
|
24
|
-
*
|
|
25
|
-
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
26
|
-
* closed (retired with no successor). Superseding leaves the predecessor's
|
|
27
|
-
* valid-time range intact (it WAS effective then); only the status flips.
|
|
28
|
-
*
|
|
29
|
-
* Date handling: every date input (savePolicy's valid_from/valid_to,
|
|
30
|
-
* loadPoliciesAsOf's asOfDate) is normalized to canonical ISO-8601 datetime
|
|
31
|
-
* (`toISOString`) at the store boundary BEFORE any persist or compare, so the
|
|
32
|
-
* fixed-width values sort lexically and the half-open [valid_from, valid_to)
|
|
33
|
-
* comparison is correct (plan-eng-critic round-1 CRIT fix: a date-only asOf vs a
|
|
34
|
-
* datetime valid_from otherwise made a same-day policy invisible).
|
|
35
|
-
*
|
|
36
|
-
* Dual-write atomicity: `savePolicy` writes the memory + policies row (and, on
|
|
37
|
-
* supersede, the predecessor's UPDATE) inside writeEntry's SAVEPOINT.
|
|
38
|
-
*/
|
|
39
|
-
import { openHippoDb, closeHippoDb } from './db.js';
|
|
40
|
-
import { writeEntry, assertTenantId } from './store.js';
|
|
41
|
-
import { markGraphDirty, removeGraphEntitiesForObject } from './graph.js';
|
|
42
|
-
import { createMemory, Layer, POLICY_HALF_LIFE_DAYS } from './memory.js';
|
|
43
|
-
import { appendAuditEvent } from './audit.js';
|
|
44
|
-
export const VALID_POLICY_STATES = new Set([
|
|
45
|
-
'active',
|
|
46
|
-
'superseded',
|
|
47
|
-
'closed',
|
|
48
|
-
]);
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
// Date normalization + validation (the bi-temporal correctness core)
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
/**
|
|
53
|
-
* Parse + canonicalize a date input to ISO-8601 datetime (`toISOString`). Throws
|
|
54
|
-
* on an unparseable value. Whatever `new Date()` accepts is re-emitted in the
|
|
55
|
-
* single fixed-width canonical form, so date-only and datetime inputs collapse to
|
|
56
|
-
* comparable values and lexical ordering is sound. (Overflow inputs like
|
|
57
|
-
* '2026-02-30' roll forward per JS Date semantics rather than throwing; the
|
|
58
|
-
* stored value is still canonical.)
|
|
59
|
-
*/
|
|
60
|
-
export function normalizePolicyDate(input, label = 'date') {
|
|
61
|
-
const d = new Date(input);
|
|
62
|
-
if (Number.isNaN(d.getTime())) {
|
|
63
|
-
throw new Error(`policy: invalid ${label} "${input}" (expected an ISO-8601 date or datetime)`);
|
|
64
|
-
}
|
|
65
|
-
return d.toISOString();
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Normalize valid_from (defaulting to `nowIso` when undefined) + valid_to (null
|
|
69
|
-
* when undefined), then enforce valid_to > valid_from. Returns the canonical pair.
|
|
70
|
-
*/
|
|
71
|
-
export function validatePolicyDates(validFromRaw, validToRaw, nowIso) {
|
|
72
|
-
const validFrom = validFromRaw !== undefined ? normalizePolicyDate(validFromRaw, 'valid_from') : nowIso;
|
|
73
|
-
const validTo = validToRaw !== undefined && validToRaw !== null
|
|
74
|
-
? normalizePolicyDate(validToRaw, 'valid_to')
|
|
75
|
-
: null;
|
|
76
|
-
if (validTo !== null && validTo <= validFrom) {
|
|
77
|
-
throw new Error(`policy: valid_to (${validTo}) must be strictly after valid_from (${validFrom})`);
|
|
78
|
-
}
|
|
79
|
-
return { validFrom, validTo };
|
|
80
|
-
}
|
|
81
|
-
function rowToPolicy(row) {
|
|
82
|
-
return {
|
|
83
|
-
id: row.id,
|
|
84
|
-
memoryId: row.memory_id,
|
|
85
|
-
tenantId: row.tenant_id,
|
|
86
|
-
policyName: row.policy_name,
|
|
87
|
-
policyText: row.policy_text,
|
|
88
|
-
validFrom: row.valid_from,
|
|
89
|
-
validTo: row.valid_to,
|
|
90
|
-
version: row.version,
|
|
91
|
-
// SAFETY: row.status is DB-constrained to PolicyStatus values; every INSERT/
|
|
92
|
-
// UPDATE in this file writes only the literal 'active' | 'superseded' | 'closed'.
|
|
93
|
-
status: row.status,
|
|
94
|
-
supersededBy: row.superseded_by,
|
|
95
|
-
supersededAt: row.superseded_at,
|
|
96
|
-
changeSummary: row.change_summary,
|
|
97
|
-
closedAt: row.closed_at,
|
|
98
|
-
createdAt: row.created_at,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
const POLICY_COLS = `
|
|
102
|
-
id, memory_id, tenant_id, policy_name, policy_text, valid_from, valid_to,
|
|
103
|
-
version, status, superseded_by, superseded_at, change_summary, closed_at, created_at
|
|
104
|
-
`;
|
|
105
|
-
/** Recall-surface content for the memory mirror: name + rule + effective range. */
|
|
106
|
-
function buildPolicyContent(policyName, policyText, validFrom, validTo) {
|
|
107
|
-
const range = validTo ? `${validFrom} to ${validTo}` : `${validFrom} onward`;
|
|
108
|
-
return `${policyName}\n\n${policyText}\n\nEffective: ${range}`;
|
|
109
|
-
}
|
|
110
|
-
// ---------------------------------------------------------------------------
|
|
111
|
-
// Public API
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
/**
|
|
114
|
-
* Create a policy (or a new version that supersedes an existing one). Writes the
|
|
115
|
-
* memory mirror + the policies row atomically inside writeEntry's SAVEPOINT.
|
|
116
|
-
* valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates).
|
|
117
|
-
* When supersedesPolicyId is given, the referenced ACTIVE row is preflighted
|
|
118
|
-
* (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same
|
|
119
|
-
* SAVEPOINT; the new version = predecessor.version + 1 (server-derived).
|
|
120
|
-
*/
|
|
121
|
-
export function savePolicy(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
122
|
-
assertTenantId('savePolicy', tenantId);
|
|
123
|
-
if (!opts.policyName || opts.policyName.trim().length === 0) {
|
|
124
|
-
throw new Error('savePolicy: policyName is required');
|
|
125
|
-
}
|
|
126
|
-
if (!opts.policyText || opts.policyText.trim().length === 0) {
|
|
127
|
-
throw new Error('savePolicy: policyText is required');
|
|
128
|
-
}
|
|
129
|
-
const now = new Date().toISOString();
|
|
130
|
-
// valid_from defaults to the precise creation instant (the honest effective
|
|
131
|
-
// time). The same-day date-only as-of workflow is handled on the READ side
|
|
132
|
-
// (a date-only asOf resolves to end-of-day in loadPoliciesAsOf), NOT by
|
|
133
|
-
// backdating the stored valid_from - backdating to midnight would make an
|
|
134
|
-
// earlier-same-day as-of wrongly report the policy already in force and would
|
|
135
|
-
// hide a superseded predecessor for that earlier time (codex review
|
|
136
|
-
// 2026-05-30 round 2). An explicit --from is honored as-is.
|
|
137
|
-
const { validFrom, validTo } = validatePolicyDates(opts.validFrom, opts.validTo, now);
|
|
138
|
-
const isSupersede = opts.supersedesPolicyId !== undefined;
|
|
139
|
-
const changeSummary = isSupersede ? (opts.changeSummary ?? null) : null;
|
|
140
|
-
const content = buildPolicyContent(opts.policyName, opts.policyText, validFrom, validTo);
|
|
141
|
-
const tags = ['policy', ...(opts.extraTags ?? [])];
|
|
142
|
-
const mem = createMemory(content, {
|
|
143
|
-
tags,
|
|
144
|
-
layer: Layer.Semantic,
|
|
145
|
-
confidence: 'verified',
|
|
146
|
-
source: 'policy',
|
|
147
|
-
tenantId,
|
|
148
|
-
});
|
|
149
|
-
mem.half_life_days = POLICY_HALF_LIFE_DAYS;
|
|
150
|
-
let savedRow;
|
|
151
|
-
writeEntry(hippoRoot, mem, {
|
|
152
|
-
actor,
|
|
153
|
-
afterWrite: (db, memoryId) => {
|
|
154
|
-
// Preflight the supersede target BEFORE inserting the new row (so the new
|
|
155
|
-
// autoincrement id can never be its own supersede target); read the
|
|
156
|
-
// predecessor version in the same SELECT for server-derived versioning.
|
|
157
|
-
// Mirrors saveProcess / saveDecision (codex P1 2026-05-28).
|
|
158
|
-
let version = 1;
|
|
159
|
-
if (opts.supersedesPolicyId !== undefined) {
|
|
160
|
-
// SAFETY: SELECT projects exactly status, version; .get() returns that
|
|
161
|
-
// shape for the matching row, or undefined when no policy/tenant pair matches.
|
|
162
|
-
const pred = db.prepare(`SELECT status, version FROM policies WHERE id = ? AND tenant_id = ?`).get(opts.supersedesPolicyId, tenantId);
|
|
163
|
-
if (!pred) {
|
|
164
|
-
throw new Error(`savePolicy: policy ${opts.supersedesPolicyId} to supersede not found for tenant ${tenantId}`);
|
|
165
|
-
}
|
|
166
|
-
if (pred.status !== 'active') {
|
|
167
|
-
throw new Error(`savePolicy: policy ${opts.supersedesPolicyId} is not active (status='${pred.status}'); only active policies can be superseded.`);
|
|
168
|
-
}
|
|
169
|
-
version = pred.version + 1;
|
|
170
|
-
}
|
|
171
|
-
const result = db.prepare(`
|
|
172
|
-
INSERT INTO policies(
|
|
173
|
-
memory_id, tenant_id, policy_name, policy_text, valid_from, valid_to,
|
|
174
|
-
version, status, superseded_by, superseded_at, change_summary, closed_at, created_at
|
|
175
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, 'active', NULL, NULL, ?, NULL, ?)
|
|
176
|
-
`).run(memoryId, tenantId, opts.policyName, opts.policyText, validFrom, validTo, version, changeSummary, now);
|
|
177
|
-
const policyId = Number(result.lastInsertRowid ?? 0);
|
|
178
|
-
if (opts.supersedesPolicyId !== undefined) {
|
|
179
|
-
const sup = db.prepare(`
|
|
180
|
-
UPDATE policies
|
|
181
|
-
SET status = 'superseded', superseded_by = ?, superseded_at = ?
|
|
182
|
-
WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
|
|
183
|
-
`).run(policyId, now, opts.supersedesPolicyId, tenantId, policyId);
|
|
184
|
-
if (sup.changes === 0) {
|
|
185
|
-
throw new Error(`savePolicy: policy ${opts.supersedesPolicyId} could not be superseded (no longer active or self-reference).`);
|
|
186
|
-
}
|
|
187
|
-
appendAuditEvent(db, {
|
|
188
|
-
tenantId,
|
|
189
|
-
actor,
|
|
190
|
-
op: 'policy_supersede',
|
|
191
|
-
targetId: String(opts.supersedesPolicyId),
|
|
192
|
-
metadata: {
|
|
193
|
-
policy_id: opts.supersedesPolicyId,
|
|
194
|
-
superseded_by: policyId,
|
|
195
|
-
new_version: version,
|
|
196
|
-
},
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
// SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
|
|
200
|
-
// .get() returns that row, or undefined only if the just-inserted id can't
|
|
201
|
-
// be found.
|
|
202
|
-
const row = db.prepare(`SELECT ${POLICY_COLS} FROM policies WHERE id = ?`)
|
|
203
|
-
.get(policyId);
|
|
204
|
-
if (!row)
|
|
205
|
-
throw new Error('savePolicy: failed to reload saved policy row');
|
|
206
|
-
savedRow = row;
|
|
207
|
-
// GDPR-light metadata: ids + flags only, no policy text.
|
|
208
|
-
appendAuditEvent(db, {
|
|
209
|
-
tenantId,
|
|
210
|
-
actor,
|
|
211
|
-
op: 'policy_create',
|
|
212
|
-
targetId: String(policyId),
|
|
213
|
-
metadata: {
|
|
214
|
-
policy_id: policyId,
|
|
215
|
-
version,
|
|
216
|
-
open_ended: validTo === null,
|
|
217
|
-
},
|
|
218
|
-
});
|
|
219
|
-
},
|
|
220
|
-
afterCommit: () => markGraphDirty(hippoRoot, tenantId, mem.id),
|
|
221
|
-
});
|
|
222
|
-
if (!savedRow) {
|
|
223
|
-
throw new Error('savePolicy: afterWrite did not populate the row');
|
|
224
|
-
}
|
|
225
|
-
return rowToPolicy(savedRow);
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Close (retire) an active policy with no successor. CAS guard WHERE
|
|
229
|
-
* status='active'; 0 changes distinguishes not-found from not-active. A
|
|
230
|
-
* superseded row is terminal and cannot be closed.
|
|
231
|
-
*/
|
|
232
|
-
export function closePolicy(hippoRoot, tenantId, id, actor = 'cli') {
|
|
233
|
-
assertTenantId('closePolicy', tenantId);
|
|
234
|
-
const now = new Date().toISOString();
|
|
235
|
-
const db = openHippoDb(hippoRoot);
|
|
236
|
-
try {
|
|
237
|
-
db.exec('BEGIN IMMEDIATE');
|
|
238
|
-
try {
|
|
239
|
-
const updateResult = db.prepare(`
|
|
240
|
-
UPDATE policies
|
|
241
|
-
SET status = 'closed', closed_at = ?
|
|
242
|
-
WHERE id = ? AND tenant_id = ? AND status = 'active'
|
|
243
|
-
`).run(now, id, tenantId);
|
|
244
|
-
if (updateResult.changes === 0) {
|
|
245
|
-
// SAFETY: SELECT projects exactly the status column; .get() returns that
|
|
246
|
-
// shape, or undefined when the id/tenant pair doesn't exist.
|
|
247
|
-
const existing = db.prepare(`SELECT status FROM policies WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
248
|
-
if (!existing) {
|
|
249
|
-
throw new Error(`closePolicy: policy ${id} not found for tenant ${tenantId}`);
|
|
250
|
-
}
|
|
251
|
-
throw new Error(`closePolicy: policy ${id} is not active (status='${existing.status}'); only active policies can be closed.`);
|
|
252
|
-
}
|
|
253
|
-
// SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
|
|
254
|
-
// .get() returns that row for the just-updated id, or undefined only in an
|
|
255
|
-
// impossible race since the UPDATE above already matched it.
|
|
256
|
-
const row = db.prepare(`SELECT ${POLICY_COLS} FROM policies WHERE id = ? AND tenant_id = ?`)
|
|
257
|
-
.get(id, tenantId);
|
|
258
|
-
if (!row)
|
|
259
|
-
throw new Error(`closePolicy: policy ${id} not found after UPDATE`);
|
|
260
|
-
appendAuditEvent(db, {
|
|
261
|
-
tenantId,
|
|
262
|
-
actor,
|
|
263
|
-
op: 'policy_close',
|
|
264
|
-
targetId: String(id),
|
|
265
|
-
metadata: { policy_id: id },
|
|
266
|
-
});
|
|
267
|
-
db.exec('COMMIT');
|
|
268
|
-
const closed = rowToPolicy(row);
|
|
269
|
-
// Closing removes the object from the graph. Remove its rows DIRECTLY (deterministic),
|
|
270
|
-
// not only via an enqueued rebuild whose queue item is lost if the mirror is later
|
|
271
|
-
// forgotten (the queue row cascade-deletes with the memory), which would leave the closed
|
|
272
|
-
// object stale and could block that forget (codex P1). Still enqueue when a mirror exists
|
|
273
|
-
// so a concurrent rebuild re-derives consistently (harmless if it also runs).
|
|
274
|
-
removeGraphEntitiesForObject(hippoRoot, tenantId, 'policy', closed.id);
|
|
275
|
-
if (closed.memoryId) {
|
|
276
|
-
markGraphDirty(hippoRoot, tenantId, closed.memoryId);
|
|
277
|
-
}
|
|
278
|
-
return closed;
|
|
279
|
-
}
|
|
280
|
-
catch (e) {
|
|
281
|
-
try {
|
|
282
|
-
db.exec('ROLLBACK');
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
// Ignore rollback failures — the throw below is what matters.
|
|
286
|
-
}
|
|
287
|
-
throw e;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
finally {
|
|
291
|
-
closeHippoDb(db);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
export function loadPolicyById(hippoRoot, tenantId, id) {
|
|
295
|
-
assertTenantId('loadPolicyById', tenantId);
|
|
296
|
-
const db = openHippoDb(hippoRoot);
|
|
297
|
-
try {
|
|
298
|
-
// SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
|
|
299
|
-
// .get() returns that row, or undefined when the id/tenant pair doesn't exist.
|
|
300
|
-
const row = db.prepare(`SELECT ${POLICY_COLS} FROM policies WHERE id = ? AND tenant_id = ?`)
|
|
301
|
-
.get(id, tenantId);
|
|
302
|
-
return row ? rowToPolicy(row) : null;
|
|
303
|
-
}
|
|
304
|
-
finally {
|
|
305
|
-
closeHippoDb(db);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
export function loadPolicies(hippoRoot, tenantId, opts = {}) {
|
|
309
|
-
assertTenantId('loadPolicies', tenantId);
|
|
310
|
-
const limit = opts.limit ?? 100;
|
|
311
|
-
const db = openHippoDb(hippoRoot);
|
|
312
|
-
try {
|
|
313
|
-
let rows;
|
|
314
|
-
if (opts.status) {
|
|
315
|
-
if (!VALID_POLICY_STATES.has(opts.status)) {
|
|
316
|
-
throw new Error(`loadPolicies: status must be one of ${Array.from(VALID_POLICY_STATES).join('|')}; got ${opts.status}`);
|
|
317
|
-
}
|
|
318
|
-
// SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
|
|
319
|
-
// .all() returns rows in that shape regardless of the status filter applied.
|
|
320
|
-
rows = db.prepare(`
|
|
321
|
-
SELECT ${POLICY_COLS} FROM policies
|
|
322
|
-
WHERE tenant_id = ? AND status = ?
|
|
323
|
-
ORDER BY created_at DESC, id DESC
|
|
324
|
-
LIMIT ?
|
|
325
|
-
`).all(tenantId, opts.status, limit);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
// SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
|
|
329
|
-
// .all() returns rows in that shape for every tenant-scoped row.
|
|
330
|
-
rows = db.prepare(`
|
|
331
|
-
SELECT ${POLICY_COLS} FROM policies
|
|
332
|
-
WHERE tenant_id = ?
|
|
333
|
-
ORDER BY created_at DESC, id DESC
|
|
334
|
-
LIMIT ?
|
|
335
|
-
`).all(tenantId, limit);
|
|
336
|
-
}
|
|
337
|
-
return rows.map(rowToPolicy);
|
|
338
|
-
}
|
|
339
|
-
finally {
|
|
340
|
-
closeHippoDb(db);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
export function loadActivePolicies(hippoRoot, tenantId, opts = {}) {
|
|
344
|
-
return loadPolicies(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* The bi-temporal as-of query: the policies in force at `asOfDate` (a valid-time)
|
|
348
|
-
* per current knowledge. Half-open interval [valid_from, valid_to): a row covers
|
|
349
|
-
* T when valid_from <= asOf AND (valid_to IS NULL OR asOf < valid_to). asOfDate is
|
|
350
|
-
* normalized to canonical datetime first so the lexical comparison is sound.
|
|
351
|
-
*
|
|
352
|
-
* A row is returned when it covers T AND it is the live answer for T:
|
|
353
|
-
* - `active` rows that cover T, OR
|
|
354
|
-
* - `superseded` rows that cover T BUT whose successor was not yet effective at T
|
|
355
|
-
* (successor.valid_from > asOf) - i.e. an earlier version that was genuinely in
|
|
356
|
-
* force then. This is the core valid-time correctness: a Jan-Jun policy
|
|
357
|
-
* superseded in May is still the answer for `asof March`. (codex review
|
|
358
|
-
* 2026-05-30, P2 #2: filtering on status='active' alone dropped historically-
|
|
359
|
-
* valid superseded versions, conflating transaction-time with valid-time. The
|
|
360
|
-
* successor-aware filter mirrors the existing recall-history.ts asOf pattern.)
|
|
361
|
-
*
|
|
362
|
-
* `closed` rows are EXCLUDED: closing is a deliberate transaction-time retirement,
|
|
363
|
-
* and resurrecting closed policies for a historical valid-time is full
|
|
364
|
-
* transaction-time-travel (deferred). Returns an ARRAY (overlapping same-name
|
|
365
|
-
* ranges are allowed in v1). Optionally filtered to one policy_name.
|
|
366
|
-
*
|
|
367
|
-
* Date-only `asOfDate` (e.g. "2026-05-30", no time component) resolves to the END
|
|
368
|
-
* of that UTC day (23:59:59.999Z), so "as of [day D]" includes a policy that
|
|
369
|
-
* became effective at any instant during D - this is the read-side fix for the
|
|
370
|
-
* common create-then-asof-today workflow, keeping the stored valid_from honest
|
|
371
|
-
* (codex review 2026-05-30). A full datetime asOf is used as the precise instant.
|
|
372
|
-
*/
|
|
373
|
-
export function loadPoliciesAsOf(hippoRoot, tenantId, asOfDate, opts = {}) {
|
|
374
|
-
assertTenantId('loadPoliciesAsOf', tenantId);
|
|
375
|
-
// A bare date means "as of (the whole of) that day" -> end-of-day instant; a
|
|
376
|
-
// datetime is used precisely. normalizePolicyDate validates/canonicalizes both.
|
|
377
|
-
const asOf = /^\d{4}-\d{2}-\d{2}$/.test(asOfDate.trim())
|
|
378
|
-
? normalizePolicyDate(`${asOfDate.trim()}T23:59:59.999Z`, 'asOfDate')
|
|
379
|
-
: normalizePolicyDate(asOfDate, 'asOfDate');
|
|
380
|
-
const limit = opts.limit ?? 100;
|
|
381
|
-
const db = openHippoDb(hippoRoot);
|
|
382
|
-
try {
|
|
383
|
-
// LEFT JOIN the successor so a superseded row is kept only while its
|
|
384
|
-
// successor is not yet effective at asOf. p.status != 'closed' drops retired
|
|
385
|
-
// rows; the OR keeps active heads + still-in-force superseded versions.
|
|
386
|
-
const nameClause = opts.name !== undefined ? 'AND p.policy_name = ?' : '';
|
|
387
|
-
const params = [tenantId, asOf, asOf, asOf];
|
|
388
|
-
if (opts.name !== undefined)
|
|
389
|
-
params.push(opts.name);
|
|
390
|
-
params.push(limit);
|
|
391
|
-
// SAFETY: the SELECT list explicitly aliases p.* to exactly the PolicyRow
|
|
392
|
-
// columns (id, memory_id, tenant_id, policy_name, policy_text, valid_from,
|
|
393
|
-
// valid_to, version, status, superseded_by, superseded_at, change_summary,
|
|
394
|
-
// closed_at, created_at); .all() returns rows in that shape.
|
|
395
|
-
const rows = db.prepare(`
|
|
396
|
-
SELECT p.id, p.memory_id, p.tenant_id, p.policy_name, p.policy_text,
|
|
397
|
-
p.valid_from, p.valid_to, p.version, p.status, p.superseded_by,
|
|
398
|
-
p.superseded_at, p.change_summary, p.closed_at, p.created_at
|
|
399
|
-
FROM policies p
|
|
400
|
-
LEFT JOIN policies s ON s.id = p.superseded_by
|
|
401
|
-
WHERE p.tenant_id = ? AND p.status != 'closed'
|
|
402
|
-
AND p.valid_from <= ? AND (p.valid_to IS NULL OR ? < p.valid_to)
|
|
403
|
-
AND (p.status = 'active' OR (s.id IS NOT NULL AND s.valid_from > ?))
|
|
404
|
-
${nameClause}
|
|
405
|
-
ORDER BY p.valid_from DESC, p.id DESC
|
|
406
|
-
LIMIT ?
|
|
407
|
-
`).all(...params);
|
|
408
|
-
return rows.map(rowToPolicy);
|
|
409
|
-
}
|
|
410
|
-
finally {
|
|
411
|
-
closeHippoDb(db);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
//# sourceMappingURL=policies.js.map
|
package/dist/src/policies.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/policies.ts"],"names":[],"mappings":"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"}
|
package/dist/src/postinstall.js
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as os from 'node:os';
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled, } from './hooks.js';
|
|
5
|
-
function main() {
|
|
6
|
-
if (process.env.HIPPO_SKIP_POSTINSTALL === '1')
|
|
7
|
-
return;
|
|
8
|
-
try {
|
|
9
|
-
// Repair-only: re-ensure the wrapper for users who previously opted in
|
|
10
|
-
// (e.g. a Codex update restored the real binary over our shim). A first
|
|
11
|
-
// install never happens here — swapping the codex binary from a package
|
|
12
|
-
// postinstall is a consent violation and reads as binary hijacking to
|
|
13
|
-
// supply-chain scanners (issue #133). First install is `hippo hook
|
|
14
|
-
// install codex` only.
|
|
15
|
-
repairCodexWrapperIfInstalled();
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
// Never fail package install because auto-integration could not be applied.
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
printClaudeCodeNudge();
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// Never fail package install because the install hint could not be printed.
|
|
25
|
-
}
|
|
26
|
-
try {
|
|
27
|
-
printCodexNudge();
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
// Never fail package install because the install hint could not be printed.
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Read-only nudge: if Claude Code is detected on the machine and the Hippo
|
|
35
|
-
* UserPromptSubmit hook is NOT yet installed, print a short message pointing
|
|
36
|
-
* the user at `hippo init`. No config writes. Silent otherwise.
|
|
37
|
-
*
|
|
38
|
-
* We avoid aggressively auto-patching ~/.claude/settings.json from a package
|
|
39
|
-
* postinstall — that's surprising, breaks the principle of least authority,
|
|
40
|
-
* and trips security scanners. A one-line visible prompt is the friendly
|
|
41
|
-
* middle ground.
|
|
42
|
-
*/
|
|
43
|
-
function printClaudeCodeNudge() {
|
|
44
|
-
const home = os.homedir();
|
|
45
|
-
const claudeDir = path.join(home, '.claude');
|
|
46
|
-
if (!fs.existsSync(claudeDir))
|
|
47
|
-
return; // Claude Code not installed — silent
|
|
48
|
-
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
49
|
-
if (fs.existsSync(settingsPath)) {
|
|
50
|
-
try {
|
|
51
|
-
const raw = fs.readFileSync(settingsPath, 'utf8');
|
|
52
|
-
if (raw.includes('hippo context --pinned-only'))
|
|
53
|
-
return; // already installed
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
// Fall through: on read failure, still show the nudge — a broken
|
|
57
|
-
// settings.json is a bigger problem for the user to see.
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Use stderr so the banner doesn't get piped into scripts reading package
|
|
61
|
-
// output on stdout.
|
|
62
|
-
const line = (s) => process.stderr.write(s + '\n');
|
|
63
|
-
line('');
|
|
64
|
-
line('hippo-memory installed. Claude Code detected on this machine.');
|
|
65
|
-
line('');
|
|
66
|
-
line('To wire Hippo into Claude Code (session hooks + mid-session pinned');
|
|
67
|
-
line('rule re-injection), run ONE of these in your project directory:');
|
|
68
|
-
line('');
|
|
69
|
-
line(' hippo init # initialize + install hooks for this project');
|
|
70
|
-
line(' hippo hook install claude-code # hooks only, no local store');
|
|
71
|
-
line('');
|
|
72
|
-
line('Or machine-wide pinned memories:');
|
|
73
|
-
line('');
|
|
74
|
-
line(' hippo init --global');
|
|
75
|
-
line('');
|
|
76
|
-
line('To skip this message on future installs: export HIPPO_SKIP_POSTINSTALL=1');
|
|
77
|
-
line('');
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Read-only nudge: if the Codex CLI is on PATH and the Hippo session-capture
|
|
81
|
-
* wrapper is NOT installed, print the opt-in command. Mirrors the Claude Code
|
|
82
|
-
* nudge above — same least-authority reasoning: we tell the user what to run,
|
|
83
|
-
* we never swap their binary for them.
|
|
84
|
-
*/
|
|
85
|
-
function printCodexNudge() {
|
|
86
|
-
if (isCodexWrapperInstalled())
|
|
87
|
-
return;
|
|
88
|
-
if (!detectRealCodexPath())
|
|
89
|
-
return; // Codex not installed — silent
|
|
90
|
-
const line = (s) => process.stderr.write(s + '\n');
|
|
91
|
-
line('');
|
|
92
|
-
line('Codex CLI detected on this machine.');
|
|
93
|
-
line('');
|
|
94
|
-
line('To capture Codex sessions into Hippo (wraps the codex launcher;');
|
|
95
|
-
line('undo anytime with `hippo hook uninstall codex`), run:');
|
|
96
|
-
line('');
|
|
97
|
-
line(' hippo hook install codex');
|
|
98
|
-
line('');
|
|
99
|
-
}
|
|
100
|
-
main();
|
|
101
|
-
//# sourceMappingURL=postinstall.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/postinstall.ts"],"names":[],"mappings":"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"}
|