hippo-memory 1.70.0 → 1.71.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 +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +1 -1
- 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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
|
@@ -4,16 +4,10 @@ import type { HippoIndex, LegacyStats } from './rows.js';
|
|
|
4
4
|
export declare function loadIndex(hippoRoot: string): HippoIndex;
|
|
5
5
|
/** The last recall's ids and its trace alone, for a caller that needs no index entry. */
|
|
6
6
|
export declare function loadLastRecall(hippoRoot: string): Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>;
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
|
|
11
|
-
* into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
|
|
12
|
-
*/
|
|
7
|
+
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
|
|
8
|
+
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
13
9
|
export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
|
|
14
|
-
/**
|
|
15
|
-
* Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
|
|
16
|
-
*/
|
|
10
|
+
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
17
11
|
export declare function rebuildIndex(hippoRoot: string): HippoIndex;
|
|
18
12
|
export declare function updateStats(hippoRoot: string, delta: {
|
|
19
13
|
remembered?: number;
|
|
@@ -32,9 +26,7 @@ export declare function appendConsolidationRun(hippoRoot: string, run: {
|
|
|
32
26
|
}): void;
|
|
33
27
|
/** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
|
|
34
28
|
export declare function countCreatedSinceLastSleep(hippoRoot: string, tenantId: string, now?: Date): number;
|
|
35
|
-
/**
|
|
36
|
-
* Session decay context: provides the data needed for session-based and adaptive decay.
|
|
37
|
-
*/
|
|
29
|
+
/** Session decay context: the data needed for session-based and adaptive decay. */
|
|
38
30
|
export interface SessionDecayContext {
|
|
39
31
|
/** Total number of sleep (consolidation) cycles completed. */
|
|
40
32
|
sleepCount: number;
|
|
@@ -43,13 +35,8 @@ export interface SessionDecayContext {
|
|
|
43
35
|
}
|
|
44
36
|
/** Timestamp of the latest consolidation run, or undefined when there is none. */
|
|
45
37
|
export declare function lastConsolidationAt(db: DatabaseSyncLike): string | undefined;
|
|
46
|
-
/**
|
|
47
|
-
* Load the session decay context from the store.
|
|
48
|
-
* Uses consolidation_runs timestamps to compute session intervals.
|
|
49
|
-
*/
|
|
38
|
+
/** Load the session decay context; session intervals come from consolidation_runs timestamps. */
|
|
50
39
|
export declare function loadSessionDecayContext(hippoRoot: string): SessionDecayContext;
|
|
51
|
-
/**
|
|
52
|
-
* Increment the sleep counter. Called after each consolidation run.
|
|
53
|
-
*/
|
|
40
|
+
/** Increment the sleep counter after each consolidation run. */
|
|
54
41
|
export declare function incrementSleepCount(hippoRoot: string): void;
|
|
55
42
|
//# sourceMappingURL=index-and-stats.d.ts.map
|
|
@@ -1,55 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
|
|
2
2
|
import { RejectedValueError } from './rejection.js';
|
|
3
3
|
import { log } from '../util/log.js';
|
|
4
4
|
import { audit } from './audit-event.js';
|
|
5
5
|
import { stampOriginProjectForImport, upsertEntryRow } from './entry-row.js';
|
|
6
6
|
import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb } from './mirrors.js';
|
|
7
|
-
import { openStore, loadLegacyEntriesFromMarkdown } from './open.js';
|
|
7
|
+
import { onHandle, openStore, loadLegacyEntriesFromMarkdown } from './open.js';
|
|
8
8
|
import { DAY_MS } from '../util/time.js';
|
|
9
9
|
/** Load the derived index from SQLite. Read-only: index.json is only ever written by `rebuildIndex`. */
|
|
10
10
|
export function loadIndex(hippoRoot) {
|
|
11
|
-
|
|
12
|
-
try {
|
|
11
|
+
return onHandle(hippoRoot, (db) => {
|
|
13
12
|
return buildIndexFromDb(db);
|
|
14
|
-
}
|
|
15
|
-
finally {
|
|
16
|
-
closeHippoDb(db);
|
|
17
|
-
}
|
|
13
|
+
}, openStore);
|
|
18
14
|
}
|
|
19
15
|
/** The last recall's ids and its trace alone, for a caller that needs no index entry. */
|
|
20
16
|
export function loadLastRecall(hippoRoot) {
|
|
21
|
-
|
|
22
|
-
try {
|
|
17
|
+
return onHandle(hippoRoot, (db) => {
|
|
23
18
|
return readLastRecall(db);
|
|
24
|
-
}
|
|
25
|
-
finally {
|
|
26
|
-
closeHippoDb(db);
|
|
27
|
-
}
|
|
19
|
+
}, openStore);
|
|
28
20
|
}
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
|
|
33
|
-
* into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
|
|
34
|
-
*/
|
|
21
|
+
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
|
|
22
|
+
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
35
23
|
export function saveIndex(hippoRoot, index) {
|
|
36
|
-
|
|
37
|
-
try {
|
|
24
|
+
onHandle(hippoRoot, (db) => {
|
|
38
25
|
withWriteScope(db, 'save_index', () => {
|
|
39
26
|
setMeta(db, 'last_retrieval_ids', JSON.stringify(index.last_retrieval_ids ?? []));
|
|
40
27
|
setMeta(db, 'last_trace_id', index.last_trace_id ?? '');
|
|
41
28
|
});
|
|
42
|
-
}
|
|
43
|
-
finally {
|
|
44
|
-
closeHippoDb(db);
|
|
45
|
-
}
|
|
29
|
+
}, openStore);
|
|
46
30
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
|
|
49
|
-
*/
|
|
31
|
+
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
50
32
|
export function rebuildIndex(hippoRoot) {
|
|
51
|
-
|
|
52
|
-
try {
|
|
33
|
+
return onHandle(hippoRoot, (db) => {
|
|
53
34
|
// SAFETY: rows' shape matches the single `id` column selected above.
|
|
54
35
|
const existingIds = new Set(db.prepare(`SELECT id FROM memories`).all().map((row) => row.id));
|
|
55
36
|
const legacyEntries = loadLegacyEntriesFromMarkdown(hippoRoot).filter((entry) => !existingIds.has(entry.id));
|
|
@@ -67,7 +48,12 @@ export function rebuildIndex(hippoRoot) {
|
|
|
67
48
|
catch (err) {
|
|
68
49
|
if (err instanceof RejectedValueError) {
|
|
69
50
|
rejectedCount++;
|
|
70
|
-
audit(db, 'reject_refusal', {
|
|
51
|
+
audit(db, 'reject_refusal', {
|
|
52
|
+
targetId: err.entryId,
|
|
53
|
+
metadata: { digest: err.digest, reason: err.reason },
|
|
54
|
+
actor: 'cli',
|
|
55
|
+
tenantId: err.tenantId
|
|
56
|
+
});
|
|
71
57
|
continue;
|
|
72
58
|
}
|
|
73
59
|
throw err;
|
|
@@ -82,25 +68,16 @@ export function rebuildIndex(hippoRoot) {
|
|
|
82
68
|
const index = buildIndexFromDb(db);
|
|
83
69
|
writeIndexMirror(hippoRoot, index);
|
|
84
70
|
return index;
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
closeHippoDb(db);
|
|
88
|
-
}
|
|
71
|
+
}, openStore);
|
|
89
72
|
}
|
|
90
73
|
export function updateStats(hippoRoot, delta) {
|
|
91
|
-
|
|
92
|
-
try {
|
|
74
|
+
onHandle(hippoRoot, (db) => {
|
|
93
75
|
updateStatsOn(db, hippoRoot, delta);
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
closeHippoDb(db);
|
|
97
|
-
}
|
|
76
|
+
}, openStore);
|
|
98
77
|
}
|
|
99
78
|
/** updateStats on the caller's open store, so a loop of writes opens the store once. */
|
|
100
79
|
export function updateStatsOn(db, hippoRoot, delta) {
|
|
101
|
-
// One atomic statement per counter
|
|
102
|
-
// named: the read-modify-write this replaces both lost increments to a
|
|
103
|
-
// concurrent writer and stamped stale values over the untouched two.
|
|
80
|
+
// One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values over the untouched two.
|
|
104
81
|
const increments = [
|
|
105
82
|
['total_remembered', delta.remembered ?? 0],
|
|
106
83
|
['total_recalled', delta.recalled ?? 0],
|
|
@@ -129,37 +106,25 @@ export function updateStatsUnlessBusy(hippoRoot, delta, committed) {
|
|
|
129
106
|
}
|
|
130
107
|
}
|
|
131
108
|
export function loadStats(hippoRoot) {
|
|
132
|
-
|
|
133
|
-
try {
|
|
109
|
+
return onHandle(hippoRoot, (db) => {
|
|
134
110
|
return buildStatsFromDb(db);
|
|
135
|
-
}
|
|
136
|
-
finally {
|
|
137
|
-
closeHippoDb(db);
|
|
138
|
-
}
|
|
111
|
+
}, openStore);
|
|
139
112
|
}
|
|
140
113
|
export function appendConsolidationRun(hippoRoot, run) {
|
|
141
|
-
|
|
142
|
-
try {
|
|
114
|
+
onHandle(hippoRoot, (db) => {
|
|
143
115
|
db.prepare(`INSERT INTO consolidation_runs(timestamp, decayed, merged, removed) VALUES (?, ?, ?, ?)`).run(run.timestamp, run.decayed, run.merged, run.removed);
|
|
144
116
|
pruneConsolidationRuns(db, 50);
|
|
145
117
|
writeStatsMirror(hippoRoot, buildStatsFromDb(db));
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
closeHippoDb(db);
|
|
149
|
-
}
|
|
118
|
+
}, openStore);
|
|
150
119
|
}
|
|
151
120
|
/** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
|
|
152
121
|
export function countCreatedSinceLastSleep(hippoRoot, tenantId, now = new Date()) {
|
|
153
|
-
|
|
154
|
-
try {
|
|
122
|
+
return onHandle(hippoRoot, (db) => {
|
|
155
123
|
const dayAgo = new Date(now.getTime() - DAY_MS).toISOString();
|
|
156
124
|
const row = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE tenant_id = ?
|
|
157
125
|
AND created > MAX(?, COALESCE((SELECT MAX(timestamp) FROM consolidation_runs), ''))`).get(tenantId, dayAgo);
|
|
158
126
|
return row.n;
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
closeHippoDb(db);
|
|
162
|
-
}
|
|
127
|
+
}, openStore);
|
|
163
128
|
}
|
|
164
129
|
/** Timestamp of the latest consolidation run, or undefined when there is none. */
|
|
165
130
|
export function lastConsolidationAt(db) {
|
|
@@ -167,13 +132,9 @@ export function lastConsolidationAt(db) {
|
|
|
167
132
|
const row = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 1`).get();
|
|
168
133
|
return row?.timestamp;
|
|
169
134
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Load the session decay context from the store.
|
|
172
|
-
* Uses consolidation_runs timestamps to compute session intervals.
|
|
173
|
-
*/
|
|
135
|
+
/** Load the session decay context; session intervals come from consolidation_runs timestamps. */
|
|
174
136
|
export function loadSessionDecayContext(hippoRoot) {
|
|
175
|
-
|
|
176
|
-
try {
|
|
137
|
+
return onHandle(hippoRoot, (db) => {
|
|
177
138
|
// Get recent consolidation timestamps (last 20)
|
|
178
139
|
// SAFETY: rows' shape matches the single `timestamp` column above.
|
|
179
140
|
const rows = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 20`).all();
|
|
@@ -190,22 +151,13 @@ export function loadSessionDecayContext(hippoRoot) {
|
|
|
190
151
|
const avgMs = totalInterval / (timestamps.length - 1);
|
|
191
152
|
const avgDays = avgMs / DAY_MS;
|
|
192
153
|
return { sleepCount, avgSessionIntervalDays: Math.max(0, avgDays) };
|
|
193
|
-
}
|
|
194
|
-
finally {
|
|
195
|
-
closeHippoDb(db);
|
|
196
|
-
}
|
|
154
|
+
}, openStore);
|
|
197
155
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Increment the sleep counter. Called after each consolidation run.
|
|
200
|
-
*/
|
|
156
|
+
/** Increment the sleep counter after each consolidation run. */
|
|
201
157
|
export function incrementSleepCount(hippoRoot) {
|
|
202
|
-
|
|
203
|
-
try {
|
|
158
|
+
onHandle(hippoRoot, (db) => {
|
|
204
159
|
const current = Number(getMeta(db, 'sleep_count', '0')) || 0;
|
|
205
160
|
setMeta(db, 'sleep_count', String(current + 1));
|
|
206
|
-
}
|
|
207
|
-
finally {
|
|
208
|
-
closeHippoDb(db);
|
|
209
|
-
}
|
|
161
|
+
}, openStore);
|
|
210
162
|
}
|
|
211
163
|
//# sourceMappingURL=index-and-stats.js.map
|
package/dist/store/markdown.d.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
-
/**
|
|
3
|
-
* Serialize a MemoryEntry to markdown with YAML frontmatter.
|
|
4
|
-
*/
|
|
2
|
+
/** Serialize a MemoryEntry to markdown with YAML frontmatter. */
|
|
5
3
|
export declare function serializeEntry(entry: MemoryEntry): string;
|
|
6
|
-
/**
|
|
7
|
-
* Deserialize a markdown file to a MemoryEntry.
|
|
8
|
-
*/
|
|
4
|
+
/** Deserialize a markdown file to a MemoryEntry. */
|
|
9
5
|
export declare function deserializeEntry(raw: string): MemoryEntry | null;
|
|
10
6
|
//# sourceMappingURL=markdown.d.ts.map
|
package/dist/store/markdown.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
|
|
2
3
|
import { dumpFrontmatter, parseFrontmatter } from './yaml.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export function serializeEntry(entry) {
|
|
7
|
-
const frontmatter = {
|
|
4
|
+
/** The fields every mirror file carries; serializeEntry adds the optional ones. */
|
|
5
|
+
function entryFrontmatter(entry) {
|
|
6
|
+
return {
|
|
8
7
|
id: entry.id,
|
|
9
8
|
created: entry.created,
|
|
10
9
|
last_retrieved: entry.last_retrieved,
|
|
@@ -30,11 +29,21 @@ export function serializeEntry(entry) {
|
|
|
30
29
|
scope: entry.scope ?? null,
|
|
31
30
|
owner: entry.owner ?? null,
|
|
32
31
|
artifact_ref: entry.artifact_ref ?? null,
|
|
32
|
+
// A rebuild from these files must keep supersession and the DAG; deserializeEntry reads all five.
|
|
33
|
+
valid_from: entry.valid_from,
|
|
34
|
+
superseded_by: entry.superseded_by,
|
|
35
|
+
extracted_from: entry.extracted_from,
|
|
36
|
+
dag_level: entry.dag_level,
|
|
37
|
+
dag_parent_id: entry.dag_parent_id,
|
|
33
38
|
};
|
|
39
|
+
}
|
|
40
|
+
/** Serialize a MemoryEntry to markdown with YAML frontmatter. */
|
|
41
|
+
export function serializeEntry(entry) {
|
|
42
|
+
const frontmatter = entryFrontmatter(entry);
|
|
34
43
|
// Emit tenant_id only when not 'default' to keep diffs clean for the dominant
|
|
35
44
|
// single-tenant case (mirrors the plan's task 7 guidance).
|
|
36
|
-
const tenantId = entry.tenantId ??
|
|
37
|
-
if (tenantId !==
|
|
45
|
+
const tenantId = entry.tenantId ?? DEFAULT_TENANT_ID;
|
|
46
|
+
if (tenantId !== DEFAULT_TENANT_ID) {
|
|
38
47
|
frontmatter['tenant_id'] = tenantId;
|
|
39
48
|
}
|
|
40
49
|
// v39: '' (user-global) and null (unknown, hidden by default) must both round-trip;
|
|
@@ -42,25 +51,17 @@ export function serializeEntry(entry) {
|
|
|
42
51
|
if (entry.origin_project !== undefined) {
|
|
43
52
|
frontmatter['origin_project'] = entry.origin_project;
|
|
44
53
|
}
|
|
45
|
-
// Spread into a fresh
|
|
46
|
-
// YamlValue> parameter needs an index signature, which a named interface
|
|
47
|
-
// reference (EntryFrontmatterFields) doesn't structurally provide even
|
|
48
|
-
// though every property's value type already matches.
|
|
54
|
+
// Spread into a fresh literal: dumpFrontmatter's Record<string, YamlValue> needs an index signature, which the named interface does not structurally provide.
|
|
49
55
|
const fm = dumpFrontmatter({ ...frontmatter });
|
|
50
56
|
return `${fm}\n\n${entry.content}\n`;
|
|
51
57
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Deserialize a markdown file to a MemoryEntry.
|
|
54
|
-
*/
|
|
58
|
+
/** Deserialize a markdown file to a MemoryEntry. */
|
|
55
59
|
export function deserializeEntry(raw) {
|
|
56
60
|
const { data, content } = parseFrontmatter(raw);
|
|
57
61
|
if (!data['id'] || !data['layer'])
|
|
58
62
|
return null;
|
|
59
|
-
// SAFETY:
|
|
60
|
-
//
|
|
61
|
-
// serializeEntry (whose own fields are typed), so out-of-range values here
|
|
62
|
-
// would indicate hand-edited files, which this parser is not required to
|
|
63
|
-
// reject — matches the pre-existing permissive-parse behavior.
|
|
63
|
+
// SAFETY: each `as X` narrows a raw YAML field to a MemoryEntry union member; frontmatter is only written by serializeEntry,
|
|
64
|
+
// so out-of-range values mean hand-edited files, which this parser may accept (permissive parse).
|
|
64
65
|
return {
|
|
65
66
|
id: String(data['id']),
|
|
66
67
|
created: String(data['created'] ?? new Date().toISOString()),
|
|
@@ -97,7 +98,7 @@ export function deserializeEntry(raw) {
|
|
|
97
98
|
scope: data['scope'] === null || data['scope'] === undefined ? null : String(data['scope']),
|
|
98
99
|
owner: data['owner'] === null || data['owner'] === undefined ? null : String(data['owner']),
|
|
99
100
|
artifact_ref: data['artifact_ref'] === null || data['artifact_ref'] === undefined ? null : String(data['artifact_ref']),
|
|
100
|
-
tenantId: data['tenant_id'] === null || data['tenant_id'] === undefined ?
|
|
101
|
+
tenantId: data['tenant_id'] === null || data['tenant_id'] === undefined ? DEFAULT_TENANT_ID : String(data['tenant_id']),
|
|
101
102
|
origin_project: !('origin_project' in data) ? undefined : data['origin_project'] === null ? null : String(data['origin_project']),
|
|
102
103
|
};
|
|
103
104
|
}
|
package/dist/store/mirrors.d.ts
CHANGED
|
@@ -9,12 +9,8 @@ export declare function removeActiveTaskMirror(hippoRoot: string, tenantId: stri
|
|
|
9
9
|
export declare function writeRecentSessionMirror(hippoRoot: string, tenantId: string, events: SessionEvent[]): void;
|
|
10
10
|
export declare function writeMarkdownMirror(hippoRoot: string, entry: MemoryEntry): void;
|
|
11
11
|
export declare function removeEntryMirrors(hippoRoot: string, id: string): void;
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
* scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
|
|
15
|
-
*
|
|
16
|
-
* Returns true if the mirror ended up purged (first or second attempt).
|
|
17
|
-
*/
|
|
12
|
+
/** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
|
|
13
|
+
* so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
|
|
18
14
|
export declare function purgeMirrorBestEffort(hippoRoot: string, id: string, isRaw: boolean, logPrefix: string): boolean;
|
|
19
15
|
/** Derive the current `HippoIndex` from SQLite. Exported for `rebuildIndex`
|
|
20
16
|
* (the only index.json writer) and the longmemeval benchmark. */
|
package/dist/store/mirrors.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import * as fs from 'fs';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import { Layer } from '../core/memory.js';
|
|
4
5
|
import { dumpFrontmatter } from './yaml.js';
|
|
5
6
|
import { getMeta } from '../db/index.js';
|
|
6
7
|
import { oncePerStore } from '../db/connect.js';
|
|
7
|
-
import { errorMessage, log } from '../util/log.js';
|
|
8
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
8
9
|
import { parseJsonArray, INDEX_VERSION, parseLastTraceId, MEMORY_SELECT_COLUMNS, rowToEntry, rowToMemoryConflict, } from './rows.js';
|
|
9
10
|
import { serializeEntry } from './markdown.js';
|
|
10
11
|
const SCORE_DECIMALS = 3;
|
|
@@ -21,16 +22,14 @@ export function ensureMirrorDirectories(hippoRoot) {
|
|
|
21
22
|
}
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
|
-
// Tenant-scoped mirror
|
|
25
|
-
//
|
|
26
|
-
// on-disk back-compat; multi-tenant deployments get a `.<tenantId>` suffix
|
|
27
|
-
// so tenant B saving cannot overwrite tenant A's mirror file.
|
|
25
|
+
// Tenant-scoped mirror paths: the 'default' tenant keeps the original `active-task.md` / `recent-session.md` names;
|
|
26
|
+
// other tenants get a `.<tenantId>` suffix so one cannot overwrite another's mirror.
|
|
28
27
|
function activeTaskMirrorPath(hippoRoot, tenantId) {
|
|
29
|
-
const file = tenantId ===
|
|
28
|
+
const file = tenantId === DEFAULT_TENANT_ID ? 'active-task.md' : `active-task.${tenantId}.md`;
|
|
30
29
|
return path.join(hippoRoot, 'buffer', file);
|
|
31
30
|
}
|
|
32
31
|
function recentSessionMirrorPath(hippoRoot, tenantId) {
|
|
33
|
-
const file = tenantId ===
|
|
32
|
+
const file = tenantId === DEFAULT_TENANT_ID ? 'recent-session.md' : `recent-session.${tenantId}.md`;
|
|
34
33
|
return path.join(hippoRoot, 'buffer', file);
|
|
35
34
|
}
|
|
36
35
|
export function writeActiveTaskMirror(hippoRoot, tenantId, snapshot) {
|
|
@@ -155,22 +154,15 @@ export function removeEntryMirrors(hippoRoot, id) {
|
|
|
155
154
|
}
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge
|
|
160
|
-
* with no reaper to retry it can name the stuck file.
|
|
161
|
-
*/
|
|
157
|
+
/** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it can name the stuck file. */
|
|
162
158
|
function getExistingEntryMirrorPaths(hippoRoot, id) {
|
|
163
159
|
// Layer list kept in lockstep with removeEntryMirrors.
|
|
164
160
|
return [Layer.Buffer, Layer.Episodic, Layer.Semantic, Layer.Trace]
|
|
165
161
|
.map((layer) => path.join(layerDir(hippoRoot, layer), `${id}.md`))
|
|
166
162
|
.filter((file) => fs.existsSync(file));
|
|
167
163
|
}
|
|
168
|
-
/**
|
|
169
|
-
*
|
|
170
|
-
* scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
|
|
171
|
-
*
|
|
172
|
-
* Returns true if the mirror ended up purged (first or second attempt).
|
|
173
|
-
*/
|
|
164
|
+
/** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
|
|
165
|
+
* so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
|
|
174
166
|
export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
|
|
175
167
|
try {
|
|
176
168
|
removeEntryMirrors(hippoRoot, id);
|
|
@@ -184,13 +176,13 @@ export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
|
|
|
184
176
|
catch (secondErr) {
|
|
185
177
|
const msg = errorMessage(secondErr);
|
|
186
178
|
if (isRaw) {
|
|
187
|
-
log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}
|
|
179
|
+
log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`, errorFields(secondErr));
|
|
188
180
|
}
|
|
189
181
|
else {
|
|
190
182
|
const leftover = getExistingEntryMirrorPaths(hippoRoot, id);
|
|
191
183
|
const pathsNote = leftover.length > 0 ? leftover.join(', ') : `${id}.md (path unresolved)`;
|
|
192
184
|
log.error(`${logPrefix}: mirror cleanup failed for ${id} - no automatic retry exists for this file, ` +
|
|
193
|
-
`delete it manually: ${pathsNote} (${msg})
|
|
185
|
+
`delete it manually: ${pathsNote} (${msg})`, errorFields(secondErr));
|
|
194
186
|
}
|
|
195
187
|
return false;
|
|
196
188
|
}
|
|
@@ -211,7 +203,7 @@ export function buildIndexFromDb(db) {
|
|
|
211
203
|
file: path.join(layer, `${row.id}.md`),
|
|
212
204
|
layer,
|
|
213
205
|
strength: Number(row.strength ?? 0),
|
|
214
|
-
tags: parseJsonArray(row.tags_json),
|
|
206
|
+
tags: parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' }),
|
|
215
207
|
created: row.created,
|
|
216
208
|
last_retrieved: row.last_retrieved,
|
|
217
209
|
pinned: Boolean(row.pinned),
|
|
@@ -221,13 +213,12 @@ export function buildIndexFromDb(db) {
|
|
|
221
213
|
}
|
|
222
214
|
/** The last recall's ids and its trace, the two meta keys saveIndex writes together. */
|
|
223
215
|
export function readLastRecall(db) {
|
|
224
|
-
// Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent
|
|
225
|
-
// saveIndex and hand back a mismatched last_retrieval_ids / last_trace_id pair.
|
|
216
|
+
// Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a mismatched pair.
|
|
226
217
|
// SAFETY: lockstepRows' shape matches the key/value columns named above.
|
|
227
218
|
const lockstepRows = db.prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`).all();
|
|
228
219
|
const lockstep = new Map(lockstepRows.map((r) => [r.key, r.value]));
|
|
229
220
|
return {
|
|
230
|
-
last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]'),
|
|
221
|
+
last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', { table: 'meta', id: 'last_retrieval_ids', column: 'value' }),
|
|
231
222
|
last_trace_id: parseLastTraceId(lockstep.get('last_trace_id') ?? ''),
|
|
232
223
|
};
|
|
233
224
|
}
|
package/dist/store/open.js
CHANGED
|
@@ -70,12 +70,8 @@ export const HALF_LIFE_BASE_META_KEY = 'default_half_life_base';
|
|
|
70
70
|
export const TYPED_HALF_LIFE_META_KEY = 'typed_half_life_on_default';
|
|
71
71
|
/** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
|
|
72
72
|
export const LEGACY_TYPED_HALF_LIFE = 90;
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
* `hippo sleep` never migrates it. A store that already holds memories and
|
|
76
|
-
* no recorded base predates the record, and keeps reading as the legacy
|
|
77
|
-
* 7-day base until sleep migrates it.
|
|
78
|
-
*/
|
|
73
|
+
/** A store with no memories starts on the current default half-life base so `hippo sleep` never migrates it; one that holds memories but no recorded base
|
|
74
|
+
* predates the record and keeps the legacy 7-day base until sleep migrates it. */
|
|
79
75
|
function recordHalfLifeBaseForNewStore(db) {
|
|
80
76
|
if (getMeta(db, HALF_LIFE_BASE_META_KEY, '') !== '')
|
|
81
77
|
return;
|
|
@@ -170,9 +166,8 @@ function loadLegacyIndexFile(hippoRoot) {
|
|
|
170
166
|
return { version: 1, entries: {}, last_retrieval_ids: [], last_trace_id: null };
|
|
171
167
|
}
|
|
172
168
|
try {
|
|
173
|
-
// SAFETY: index.json is only
|
|
174
|
-
//
|
|
175
|
-
// that violates the shape falls through to the catch block's fallback.
|
|
169
|
+
// SAFETY: index.json is only written by writeIndexMirror below, which serializes a HippoIndex;
|
|
170
|
+
// a hand-edited file that violates the shape falls through to the catch block's fallback.
|
|
176
171
|
return JSON.parse(fs.readFileSync(indexPath, 'utf8'));
|
|
177
172
|
}
|
|
178
173
|
catch (err) {
|
|
@@ -191,10 +186,8 @@ function loadLegacyStatsFile(hippoRoot) {
|
|
|
191
186
|
};
|
|
192
187
|
}
|
|
193
188
|
try {
|
|
194
|
-
// SAFETY: stats.json is only
|
|
195
|
-
//
|
|
196
|
-
// guard every read with `?? 0` / `Array.isArray`, tolerating a
|
|
197
|
-
// hand-edited or corrupted file even if this optimistic cast is wrong.
|
|
189
|
+
// SAFETY: stats.json is only written by writeStatsMirror below with exactly these four fields; callers also guard every read with `?? 0` / `Array.isArray`,
|
|
190
|
+
// so a hand-edited file is tolerated even if this cast is wrong.
|
|
198
191
|
return JSON.parse(fs.readFileSync(statsPath, 'utf8'));
|
|
199
192
|
}
|
|
200
193
|
catch (err) {
|
|
@@ -1,42 +1,14 @@
|
|
|
1
1
|
import { type PredictionBaserate } from './predictions.js';
|
|
2
2
|
export interface ClassResolution {
|
|
3
3
|
classTag: string | null;
|
|
4
|
-
/** True when
|
|
5
|
-
*
|
|
6
|
-
* null hint (silent — prevents the "show wrong class half the time"
|
|
7
|
-
* failure mode the alphabetical-tiebreak alternative would create). */
|
|
4
|
+
/** True when >=2 classes tied at the best overlap score AND best >= 1. Caller emits `recall_autodebias_hint_tiebreak` and returns a null hint
|
|
5
|
+
* (silent: an alphabetical tiebreak would show the wrong class half the time). */
|
|
8
6
|
tiebreak: boolean;
|
|
9
7
|
}
|
|
10
8
|
/** The prediction class a forward claim resolves to, and that class's closed-prediction stats when one resolved. */
|
|
11
9
|
export interface PlanningFallacyEvidence extends ClassResolution {
|
|
12
10
|
readonly baserate: PredictionBaserate | null;
|
|
13
11
|
}
|
|
14
|
-
/**
|
|
15
|
-
* Resolve a query-token set to a unique best-matching class_tag for the
|
|
16
|
-
* tenant. Scores by lower-cased token overlap; requires best score ≥ 1
|
|
17
|
-
* AND strictly greater than the 2nd-best score.
|
|
18
|
-
*
|
|
19
|
-
* Indexed via idx_predictions_tenant_class (db.ts:1015) → O(log n) seek
|
|
20
|
-
* plus a small DISTINCT scan over the per-tenant class-tag set.
|
|
21
|
-
*
|
|
22
|
-
* Scope behaviour (deliberate): class_tag selection is TENANT-GLOBAL,
|
|
23
|
-
* NOT scope-filtered against
|
|
24
|
-
* the recall's opts.scope. The class_tag is an aggregator label across
|
|
25
|
-
* historical predictions in the class, not a per-memory scope-bound
|
|
26
|
-
* property. A no-scope recall CAN surface a class_tag from a privately-
|
|
27
|
-
* scoped prediction's class in PlanningFallacyHint.classTag — by design,
|
|
28
|
-
* because base-rate reasoning needs the full historical sample.
|
|
29
|
-
* Implications:
|
|
30
|
-
* - The hint payload itself carries no memory content (only the aggregate
|
|
31
|
-
* summary string + numeric stats), so memory bodies do not leak.
|
|
32
|
-
* - The class_tag NAME is the side-channel. If sensitive labels are a
|
|
33
|
-
* concern, callers should either use opaque class names (e.g. hashes
|
|
34
|
-
* or numeric tokens) or set HIPPO_AUTODEBIAS=off.
|
|
35
|
-
* - tests/api-recall-autodebias.test.ts locks this with an explicit
|
|
36
|
-
* test asserting that scope-set predictions surface via no-scope
|
|
37
|
-
* recalls (so future "fix" attempts that scope-filter trip CI).
|
|
38
|
-
*/
|
|
39
|
-
export declare function resolveClassFromTokens(hippoRoot: string, tenantId: string, queryTokens: readonly string[]): ClassResolution;
|
|
40
12
|
/** Resolves a claim's tokens to one class and reads its baserate, writing no audit row. */
|
|
41
13
|
export declare function planningFallacyEvidenceAt(hippoRoot: string, tenantId: string, classQueryTokens: readonly string[]): PlanningFallacyEvidence;
|
|
42
14
|
//# sourceMappingURL=planning-fallacy-evidence.d.ts.map
|
|
@@ -1,35 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { onHandle } from './open.js';
|
|
2
2
|
import { computePredictionBaserate } from './predictions.js';
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
* AND strictly greater than the 2nd-best score.
|
|
7
|
-
*
|
|
8
|
-
* Indexed via idx_predictions_tenant_class (db.ts:1015) → O(log n) seek
|
|
9
|
-
* plus a small DISTINCT scan over the per-tenant class-tag set.
|
|
10
|
-
*
|
|
11
|
-
* Scope behaviour (deliberate): class_tag selection is TENANT-GLOBAL,
|
|
12
|
-
* NOT scope-filtered against
|
|
13
|
-
* the recall's opts.scope. The class_tag is an aggregator label across
|
|
14
|
-
* historical predictions in the class, not a per-memory scope-bound
|
|
15
|
-
* property. A no-scope recall CAN surface a class_tag from a privately-
|
|
16
|
-
* scoped prediction's class in PlanningFallacyHint.classTag — by design,
|
|
17
|
-
* because base-rate reasoning needs the full historical sample.
|
|
18
|
-
* Implications:
|
|
19
|
-
* - The hint payload itself carries no memory content (only the aggregate
|
|
20
|
-
* summary string + numeric stats), so memory bodies do not leak.
|
|
21
|
-
* - The class_tag NAME is the side-channel. If sensitive labels are a
|
|
22
|
-
* concern, callers should either use opaque class names (e.g. hashes
|
|
23
|
-
* or numeric tokens) or set HIPPO_AUTODEBIAS=off.
|
|
24
|
-
* - tests/api-recall-autodebias.test.ts locks this with an explicit
|
|
25
|
-
* test asserting that scope-set predictions surface via no-scope
|
|
26
|
-
* recalls (so future "fix" attempts that scope-filter trip CI).
|
|
27
|
-
*/
|
|
28
|
-
export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
|
|
3
|
+
/** Resolve a query-token set to a unique best-matching class_tag for the tenant: lower-cased token overlap, best score >= 1 AND above the 2nd-best.
|
|
4
|
+
* TENANT-GLOBAL by design, not scope-filtered (base rates need the full sample): class_tag NAMES can cross scopes; use opaque names or HIPPO_AUTODEBIAS=off. */
|
|
5
|
+
function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
|
|
29
6
|
if (queryTokens.length === 0)
|
|
30
7
|
return { classTag: null, tiebreak: false };
|
|
31
|
-
|
|
32
|
-
try {
|
|
8
|
+
return onHandle(hippoRoot, (db) => {
|
|
33
9
|
// SAFETY: rows' shape matches the single `class_tag` column named in the SELECT above.
|
|
34
10
|
const rows = db.prepare(`SELECT DISTINCT class_tag FROM predictions WHERE tenant_id = ?`).all(tenantId);
|
|
35
11
|
const querySet = new Set(queryTokens);
|
|
@@ -51,10 +27,8 @@ export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
|
|
|
51
27
|
bestClass = class_tag;
|
|
52
28
|
}
|
|
53
29
|
else if (score === bestScore && score > 0) {
|
|
54
|
-
// Tie at current best
|
|
55
|
-
//
|
|
56
|
-
// like "migration will take 3 days" between migration-effort vs
|
|
57
|
-
// migration-risk; silent on tie instead).
|
|
30
|
+
// Tie at current best: bump secondBest, do NOT update bestClass (an alphabetical tiebreak would pick the wrong class on ambiguous queries; stay silent
|
|
31
|
+
// on tie).
|
|
58
32
|
secondBest = score;
|
|
59
33
|
}
|
|
60
34
|
else if (score > secondBest) {
|
|
@@ -66,10 +40,7 @@ export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
|
|
|
66
40
|
if (bestScore === secondBest)
|
|
67
41
|
return { classTag: null, tiebreak: true };
|
|
68
42
|
return { classTag: bestClass, tiebreak: false };
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
closeHippoDb(db);
|
|
72
|
-
}
|
|
43
|
+
});
|
|
73
44
|
}
|
|
74
45
|
/** Resolves a claim's tokens to one class and reads its baserate, writing no audit row. */
|
|
75
46
|
export function planningFallacyEvidenceAt(hippoRoot, tenantId, classQueryTokens) {
|