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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { biasHintEnabled } from './recall-history.js';
|
|
2
|
+
import { anchorSkippedRows, callerOf, noteRecall, peekSessionRing, sessionRing } from './recall-record.js';
|
|
3
|
+
import { recordTokens } from './tokens.js';
|
|
4
|
+
/** The surfaces `retrieve` records in full. MCP is pending: src/mcp still feeds its own ring and books its own ledger row, and counts no stats. */
|
|
5
|
+
export const RECALL_RECORDING = {
|
|
6
|
+
http: { ring: 'http', ledger: 'http_recall', stats: 'every' },
|
|
7
|
+
cli: { ring: 'cli', ledger: 'recall', stats: 'shown' },
|
|
8
|
+
};
|
|
9
|
+
/** For a surface whose hint `retrieve` judges: the session's history, or the row saying the recall named no session. */
|
|
10
|
+
export function recallLead(ctx, how, query, sessionId) {
|
|
11
|
+
return {
|
|
12
|
+
// Peeked, never created: a recall that then fails must not LRU-evict a live session.
|
|
13
|
+
recallHistory: sessionId && biasHintEnabled('anchoring') ? peekSessionRing(how.ring, ctx.tenantId, sessionId) : undefined,
|
|
14
|
+
// Written first in the recall's own write, so a recall that fails leaves no row.
|
|
15
|
+
leadingAudit: sessionId ? [] : anchorSkippedRows(callerOf(ctx), query),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Runs after the recall's own write, in this order: the ring, then the counter, then the ledger. */
|
|
19
|
+
export async function recordShownRecall(ctx, store, how, shown) {
|
|
20
|
+
// A surface that only peeked has its ring created here, after the write, so a recall that fails cannot LRU-evict a live session.
|
|
21
|
+
const ring = sessionRing(how.ring, ctx.tenantId, shown.sessionId);
|
|
22
|
+
if (ring)
|
|
23
|
+
noteRecall(ring, shown.query, shown.topId, shown.anchoredOn);
|
|
24
|
+
// A recall with no audit row counts nothing, as it strengthens and traces nothing.
|
|
25
|
+
if (shown.written && (how.stats === 'every' || shown.items > 0))
|
|
26
|
+
await store.bumpRecallStats(shown.items);
|
|
27
|
+
// The ledger books text that was sent, so its row does not wait on the audit write.
|
|
28
|
+
await recordTokens(ctx, how.ledger, { items: shown.items, tokens: shown.tokens, sessionId: shown.ledgerSessionId });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=recall-finish.js.map
|
|
@@ -1,22 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Implements two detection rules:
|
|
5
|
-
* query_repeat: same queryHash within recentRepeatWindow returned
|
|
6
|
-
* same topMemoryId (caller is re-asking the same question).
|
|
7
|
-
* memory_dominance: same topMemoryId across >= minDominance distinct
|
|
8
|
-
* queryHashes (memory acts as a fixed-point anchor regardless of what
|
|
9
|
-
* the agent asks).
|
|
10
|
-
*
|
|
11
|
-
* Each pipeline (api.recall via
|
|
12
|
-
* HTTP, cmdRecall, MCP hippo_recall) owns its OWN ring buffer Map keyed
|
|
13
|
-
* by (tenant, session). No cross-pipeline sharing (the typical multi-
|
|
14
|
-
* process deployment makes IPC ring-sharing impractical; per-pipeline
|
|
15
|
-
* is correct because each pipeline has its own top-1 ranking anyway).
|
|
16
|
-
*
|
|
17
|
-
* AnchoringHint + PlanningFallacyHint are independent
|
|
18
|
-
* signals; both can fire on the same recall.
|
|
19
|
-
*/
|
|
1
|
+
/** Anchoring detector (recall-recurrence), pure module: `query_repeat` (a queryHash re-asked within the window returns the same topMemoryId) and
|
|
2
|
+
* `memory_dominance` (the same topMemoryId across >= minDominance distinct queryHashes). Each pipeline keeps its OWN ring Map keyed by (tenant, session),
|
|
3
|
+
* because its top-1 ranking differs. AnchoringHint and PlanningFallacyHint are independent signals. */
|
|
20
4
|
export type AnchoringReason = 'query_repeat' | 'memory_dominance';
|
|
21
5
|
export interface AnchoringHint {
|
|
22
6
|
reason: AnchoringReason;
|
|
@@ -37,10 +21,8 @@ export interface RecallHistoryEntry {
|
|
|
37
21
|
topMemoryId: string | null;
|
|
38
22
|
/** ISO-8601 timestamp; advisory, not used by the detection rules. */
|
|
39
23
|
ts: string;
|
|
40
|
-
/** Memory id of the AnchoringHint that fired on this recall, if any
|
|
41
|
-
*
|
|
42
|
-
* consecutive recalls within the dominance window. Caller-written
|
|
43
|
-
* AFTER detectAnchoring returns; reads next time detectAnchoring runs. */
|
|
24
|
+
/** Memory id of the AnchoringHint that fired on this recall, if any; the caller writes it after detectAnchoring returns, and the cooldown reads it next
|
|
25
|
+
* time. */
|
|
44
26
|
anchoredOn?: string;
|
|
45
27
|
}
|
|
46
28
|
export type RecallHistorySnapshot = readonly RecallHistoryEntry[];
|
|
@@ -51,81 +33,32 @@ export interface DetectAnchoringOpts {
|
|
|
51
33
|
/** query_repeat window: how many recent history entries to scan for query repeat.
|
|
52
34
|
* Default 5. */
|
|
53
35
|
recentRepeatWindow?: number;
|
|
54
|
-
/** Cooldown:
|
|
55
|
-
* the same topMemoryId within this many history entries, suppress.
|
|
56
|
-
* Default 3. */
|
|
36
|
+
/** Cooldown: suppress when the prior fire (per `anchoredOn`) was for the same topMemoryId within this many history entries. Default 3. */
|
|
57
37
|
cooldown?: number;
|
|
58
38
|
}
|
|
59
|
-
/**
|
|
60
|
-
*
|
|
61
|
-
* Lowercase → strip non-alphanumeric → split → drop empty + short tokens →
|
|
62
|
-
* sort tokens → join → FNV-1a 32-bit.
|
|
63
|
-
*
|
|
64
|
-
* Token sort + dedup means semantically-equivalent queries with reordered
|
|
65
|
-
* words collide intentionally ("semantically-distinct" is approximated by
|
|
66
|
-
* textual normalization, not embeddings).
|
|
67
|
-
*
|
|
68
|
-
* Deterministic across processes; stable across Node + V8 versions.
|
|
69
|
-
*/
|
|
39
|
+
/** Normalizes a query (lowercase, strip non-alphanumerics, drop short tokens, sort, dedup, join) and hashes it with 32-bit FNV-1a.
|
|
40
|
+
* Reordered words collide intentionally; deterministic across processes and V8 versions. */
|
|
70
41
|
export declare function hashQueryText(query: string): number;
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
* recall's (queryHash, topMemoryId).
|
|
74
|
-
*
|
|
75
|
-
* Rule precedence: memory_dominance wins on tie. When both rules fire on the
|
|
76
|
-
* same recall, return only memory_dominance, the stronger signal (a memory
|
|
77
|
-
* dominating multiple DIFFERENT queries is a fixed-point anchor; query_repeat
|
|
78
|
-
* alone is just a literal re-ask).
|
|
79
|
-
*
|
|
80
|
-
* Cooldown: if the immediately-prior recall fired a hint on the SAME
|
|
81
|
-
* topMemoryId within `cooldown=3` history entries, suppress. Prevents
|
|
82
|
-
* spam when the agent repeatedly recalls within the dominance window.
|
|
83
|
-
* Cooldown is per-memory, not per-rule: if memory_dominance fired on M
|
|
84
|
-
* (cooldown engaged for M), and the next recall has top=N + repeated query,
|
|
85
|
-
* query_repeat fires on N (different memory, not in cooldown).
|
|
86
|
-
*
|
|
87
|
-
* @returns AnchoringHint when a pattern fires; null otherwise.
|
|
88
|
-
*/
|
|
42
|
+
/** Detects anchoring against the current (queryHash, topMemoryId); memory_dominance wins when both rules fire, since it spans DIFFERENT queries.
|
|
43
|
+
* Cooldown is per memory: a hint on the SAME topMemoryId within `cooldown=3` history entries is suppressed. Returns an AnchoringHint or null. */
|
|
89
44
|
export declare function detectAnchoring(history: RecallHistorySnapshot, currentQueryHash: number, currentTopMemoryId: string | null, opts?: DetectAnchoringOpts): AnchoringHint | null;
|
|
90
|
-
/**
|
|
91
|
-
* Bounded FIFO ring of RecallHistoryEntry. Newest entries pushed via
|
|
92
|
-
* append; oldest evicted when the ring is full. The class is intentionally
|
|
93
|
-
* a thin wrapper around an array so snapshotRing returns a readonly view
|
|
94
|
-
* without copying on the hot path.
|
|
95
|
-
*/
|
|
45
|
+
/** Bounded FIFO ring of RecallHistoryEntry (oldest evicted when full); a thin array wrapper so snapshotRing returns a readonly view without copying. */
|
|
96
46
|
export declare class RingBuffer {
|
|
97
47
|
private entries;
|
|
98
48
|
append(entry: RecallHistoryEntry): void;
|
|
99
49
|
snapshot(): RecallHistorySnapshot;
|
|
100
50
|
size(): number;
|
|
101
51
|
}
|
|
102
|
-
/**
|
|
103
|
-
*
|
|
104
|
-
* (`\x00`) byte as delimiter because tenant ids and session ids are
|
|
105
|
-
* validated elsewhere to reject NUL chars — guarantees collision-free
|
|
106
|
-
* concatenation regardless of what `:` or other delimiters might appear
|
|
107
|
-
* inside either field (notably API-key-derived subjects can contain `:`).
|
|
108
|
-
*/
|
|
52
|
+
/** Builds the (tenant, session) key with a NUL delimiter: tenant and session ids are validated elsewhere to reject NUL,
|
|
53
|
+
* so concatenation cannot collide even though API-key-derived subjects can contain `:`. */
|
|
109
54
|
export declare function buildSessionKey(tenantId: string, sessionId: string): string;
|
|
110
|
-
/**
|
|
111
|
-
*
|
|
112
|
-
* at `maxSessions` (default 1000) with LRU eviction — when the cap is
|
|
113
|
-
* hit, deletes the oldest-inserted key before inserting the new one.
|
|
114
|
-
* Map iteration order preserves insertion order per ECMA-262 spec, so
|
|
115
|
-
* "oldest" = first key returned by Map.prototype.keys().
|
|
116
|
-
*/
|
|
55
|
+
/** Get-or-create a RingBuffer per session key, capped at `maxSessions` (default 1000); at the cap the oldest-inserted key (first from Map.keys()) is
|
|
56
|
+
* evicted. */
|
|
117
57
|
export declare function getOrCreateRing(map: Map<string, RingBuffer>, key: string, maxSessions?: number): RingBuffer;
|
|
118
|
-
/**
|
|
119
|
-
* Append a recall to a ring. The `anchoredOn` argument carries the
|
|
120
|
-
* memoryId of the AnchoringHint that fired on THIS recall (or undefined
|
|
121
|
-
* if no hint). detectAnchoring reads it next time for cooldown gating.
|
|
122
|
-
*/
|
|
58
|
+
/** Appends a recall to a ring; `anchoredOn` is the memoryId of the hint that fired on THIS recall (or undefined), read by detectAnchoring for cooldown. */
|
|
123
59
|
export declare function appendRecall(ring: RingBuffer, queryHash: number, topMemoryId: string | null, anchoredOn?: string): void;
|
|
124
60
|
/** Snapshot a ring as a readonly RecallHistorySnapshot. */
|
|
125
61
|
export declare function snapshotRing(ring: RingBuffer): RecallHistorySnapshot;
|
|
126
|
-
/**
|
|
127
|
-
* Whether a recall bias hint is enabled. Reads the env at call time, so
|
|
128
|
-
* `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind.
|
|
129
|
-
*/
|
|
62
|
+
/** Whether a recall bias hint is enabled; reads env at call time, so `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind. */
|
|
130
63
|
export declare function biasHintEnabled(kind: 'anchoring' | 'availability'): boolean;
|
|
131
64
|
//# sourceMappingURL=recall-history.d.ts.map
|
|
@@ -1,46 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Implements two detection rules:
|
|
5
|
-
* query_repeat: same queryHash within recentRepeatWindow returned
|
|
6
|
-
* same topMemoryId (caller is re-asking the same question).
|
|
7
|
-
* memory_dominance: same topMemoryId across >= minDominance distinct
|
|
8
|
-
* queryHashes (memory acts as a fixed-point anchor regardless of what
|
|
9
|
-
* the agent asks).
|
|
10
|
-
*
|
|
11
|
-
* Each pipeline (api.recall via
|
|
12
|
-
* HTTP, cmdRecall, MCP hippo_recall) owns its OWN ring buffer Map keyed
|
|
13
|
-
* by (tenant, session). No cross-pipeline sharing (the typical multi-
|
|
14
|
-
* process deployment makes IPC ring-sharing impractical; per-pipeline
|
|
15
|
-
* is correct because each pipeline has its own top-1 ranking anyway).
|
|
16
|
-
*
|
|
17
|
-
* AnchoringHint + PlanningFallacyHint are independent
|
|
18
|
-
* signals; both can fire on the same recall.
|
|
19
|
-
*/
|
|
1
|
+
/** Anchoring detector (recall-recurrence), pure module: `query_repeat` (a queryHash re-asked within the window returns the same topMemoryId) and
|
|
2
|
+
* `memory_dominance` (the same topMemoryId across >= minDominance distinct queryHashes). Each pipeline keeps its OWN ring Map keyed by (tenant, session),
|
|
3
|
+
* because its top-1 ranking differs. AnchoringHint and PlanningFallacyHint are independent signals. */
|
|
20
4
|
import { envAnchoringOff, envAvailabilityOff } from '../util/env.js';
|
|
21
5
|
const DEFAULT_MIN_DOMINANCE = 3;
|
|
22
6
|
const DEFAULT_RECENT_REPEAT_WINDOW = 5;
|
|
23
7
|
const DEFAULT_COOLDOWN = 3;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
/**
|
|
28
|
-
* Normalize + hash a query text into a 32-bit integer.
|
|
29
|
-
* Lowercase → strip non-alphanumeric → split → drop empty + short tokens →
|
|
30
|
-
* sort tokens → join → FNV-1a 32-bit.
|
|
31
|
-
*
|
|
32
|
-
* Token sort + dedup means semantically-equivalent queries with reordered
|
|
33
|
-
* words collide intentionally ("semantically-distinct" is approximated by
|
|
34
|
-
* textual normalization, not embeddings).
|
|
35
|
-
*
|
|
36
|
-
* Deterministic across processes; stable across Node + V8 versions.
|
|
37
|
-
*/
|
|
8
|
+
/** Normalizes a query (lowercase, strip non-alphanumerics, drop short tokens, sort, dedup, join) and hashes it with 32-bit FNV-1a.
|
|
9
|
+
* Reordered words collide intentionally; deterministic across processes and V8 versions. */
|
|
38
10
|
export function hashQueryText(query) {
|
|
39
11
|
if (!query)
|
|
40
12
|
return 0;
|
|
41
13
|
// Tokens are deduped before join so `foo foo bar` and `foo bar` count as one query for memory_dominance.
|
|
42
|
-
// Unicode classes (\p{L}
|
|
43
|
-
// non-Latin queries from collapsing to an empty token set and colliding at hash 0.
|
|
14
|
+
// Unicode classes (\p{L}, \p{N}, \p{M}; need /u) keep non-Latin queries from collapsing to an empty token set and colliding at hash 0.
|
|
44
15
|
const normalized = query
|
|
45
16
|
.toLowerCase()
|
|
46
17
|
.replace(/[^\p{L}\p{N}\p{M}\s]/gu, ' ')
|
|
@@ -66,27 +37,8 @@ function fnv1a32(text) {
|
|
|
66
37
|
// Coerce to unsigned 32-bit for stable comparison.
|
|
67
38
|
return hash >>> 0;
|
|
68
39
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// ---------------------------------------------------------------------------
|
|
72
|
-
/**
|
|
73
|
-
* Detect anchoring patterns in the recall history against the current
|
|
74
|
-
* recall's (queryHash, topMemoryId).
|
|
75
|
-
*
|
|
76
|
-
* Rule precedence: memory_dominance wins on tie. When both rules fire on the
|
|
77
|
-
* same recall, return only memory_dominance, the stronger signal (a memory
|
|
78
|
-
* dominating multiple DIFFERENT queries is a fixed-point anchor; query_repeat
|
|
79
|
-
* alone is just a literal re-ask).
|
|
80
|
-
*
|
|
81
|
-
* Cooldown: if the immediately-prior recall fired a hint on the SAME
|
|
82
|
-
* topMemoryId within `cooldown=3` history entries, suppress. Prevents
|
|
83
|
-
* spam when the agent repeatedly recalls within the dominance window.
|
|
84
|
-
* Cooldown is per-memory, not per-rule: if memory_dominance fired on M
|
|
85
|
-
* (cooldown engaged for M), and the next recall has top=N + repeated query,
|
|
86
|
-
* query_repeat fires on N (different memory, not in cooldown).
|
|
87
|
-
*
|
|
88
|
-
* @returns AnchoringHint when a pattern fires; null otherwise.
|
|
89
|
-
*/
|
|
40
|
+
/** Detects anchoring against the current (queryHash, topMemoryId); memory_dominance wins when both rules fire, since it spans DIFFERENT queries.
|
|
41
|
+
* Cooldown is per memory: a hint on the SAME topMemoryId within `cooldown=3` history entries is suppressed. Returns an AnchoringHint or null. */
|
|
90
42
|
export function detectAnchoring(history, currentQueryHash, currentTopMemoryId, opts = {}) {
|
|
91
43
|
if (currentTopMemoryId === null)
|
|
92
44
|
return null;
|
|
@@ -141,17 +93,9 @@ function isRecentRepeat(history, recentRepeatWindow, currentQueryHash, currentTo
|
|
|
141
93
|
.slice(-recentRepeatWindow)
|
|
142
94
|
.some((entry) => entry.queryHash === currentQueryHash && entry.topMemoryId === currentTopMemoryId);
|
|
143
95
|
}
|
|
144
|
-
// ---------------------------------------------------------------------------
|
|
145
|
-
// RingBuffer + caller-side state helpers
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
96
|
const MAX_HISTORY = 10;
|
|
148
97
|
const DEFAULT_MAX_SESSIONS = 1000;
|
|
149
|
-
/**
|
|
150
|
-
* Bounded FIFO ring of RecallHistoryEntry. Newest entries pushed via
|
|
151
|
-
* append; oldest evicted when the ring is full. The class is intentionally
|
|
152
|
-
* a thin wrapper around an array so snapshotRing returns a readonly view
|
|
153
|
-
* without copying on the hot path.
|
|
154
|
-
*/
|
|
98
|
+
/** Bounded FIFO ring of RecallHistoryEntry (oldest evicted when full); a thin array wrapper so snapshotRing returns a readonly view without copying. */
|
|
155
99
|
export class RingBuffer {
|
|
156
100
|
entries = [];
|
|
157
101
|
append(entry) {
|
|
@@ -167,23 +111,13 @@ export class RingBuffer {
|
|
|
167
111
|
return this.entries.length;
|
|
168
112
|
}
|
|
169
113
|
}
|
|
170
|
-
/**
|
|
171
|
-
*
|
|
172
|
-
* (`\x00`) byte as delimiter because tenant ids and session ids are
|
|
173
|
-
* validated elsewhere to reject NUL chars — guarantees collision-free
|
|
174
|
-
* concatenation regardless of what `:` or other delimiters might appear
|
|
175
|
-
* inside either field (notably API-key-derived subjects can contain `:`).
|
|
176
|
-
*/
|
|
114
|
+
/** Builds the (tenant, session) key with a NUL delimiter: tenant and session ids are validated elsewhere to reject NUL,
|
|
115
|
+
* so concatenation cannot collide even though API-key-derived subjects can contain `:`. */
|
|
177
116
|
export function buildSessionKey(tenantId, sessionId) {
|
|
178
117
|
return `${tenantId}\x00${sessionId}`;
|
|
179
118
|
}
|
|
180
|
-
/**
|
|
181
|
-
*
|
|
182
|
-
* at `maxSessions` (default 1000) with LRU eviction — when the cap is
|
|
183
|
-
* hit, deletes the oldest-inserted key before inserting the new one.
|
|
184
|
-
* Map iteration order preserves insertion order per ECMA-262 spec, so
|
|
185
|
-
* "oldest" = first key returned by Map.prototype.keys().
|
|
186
|
-
*/
|
|
119
|
+
/** Get-or-create a RingBuffer per session key, capped at `maxSessions` (default 1000); at the cap the oldest-inserted key (first from Map.keys()) is
|
|
120
|
+
* evicted. */
|
|
187
121
|
export function getOrCreateRing(map, key, maxSessions = DEFAULT_MAX_SESSIONS) {
|
|
188
122
|
const existing = map.get(key);
|
|
189
123
|
if (existing) {
|
|
@@ -201,11 +135,7 @@ export function getOrCreateRing(map, key, maxSessions = DEFAULT_MAX_SESSIONS) {
|
|
|
201
135
|
map.set(key, ring);
|
|
202
136
|
return ring;
|
|
203
137
|
}
|
|
204
|
-
/**
|
|
205
|
-
* Append a recall to a ring. The `anchoredOn` argument carries the
|
|
206
|
-
* memoryId of the AnchoringHint that fired on THIS recall (or undefined
|
|
207
|
-
* if no hint). detectAnchoring reads it next time for cooldown gating.
|
|
208
|
-
*/
|
|
138
|
+
/** Appends a recall to a ring; `anchoredOn` is the memoryId of the hint that fired on THIS recall (or undefined), read by detectAnchoring for cooldown. */
|
|
209
139
|
export function appendRecall(ring, queryHash, topMemoryId, anchoredOn) {
|
|
210
140
|
const entry = {
|
|
211
141
|
queryHash,
|
|
@@ -220,10 +150,7 @@ export function appendRecall(ring, queryHash, topMemoryId, anchoredOn) {
|
|
|
220
150
|
export function snapshotRing(ring) {
|
|
221
151
|
return ring.snapshot();
|
|
222
152
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Whether a recall bias hint is enabled. Reads the env at call time, so
|
|
225
|
-
* `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind.
|
|
226
|
-
*/
|
|
153
|
+
/** Whether a recall bias hint is enabled; reads env at call time, so `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind. */
|
|
227
154
|
export function biasHintEnabled(kind) {
|
|
228
155
|
return kind === 'anchoring'
|
|
229
156
|
? !envAnchoringOff()
|
|
@@ -94,8 +94,7 @@ export interface RankRecallResult {
|
|
|
94
94
|
/** True when ranking stopped at `haltBefore`. */
|
|
95
95
|
halted: boolean;
|
|
96
96
|
}
|
|
97
|
-
/** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and
|
|
98
|
-
*
|
|
99
|
-
* function and reranker in `opts`, and persists the returned goal-log rows. */
|
|
97
|
+
/** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
|
|
98
|
+
* (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned goal-log rows. */
|
|
100
99
|
export declare function rankRecall(ctx: RankRecallCtx, opts: RankRecallOpts): Promise<RankRecallResult>;
|
|
101
100
|
//# sourceMappingURL=recall-pipeline.d.ts.map
|
|
@@ -4,7 +4,8 @@ import { evalNow } from '../core/ablation.js';
|
|
|
4
4
|
import { oneCopyPerMemory } from './context-select.js';
|
|
5
5
|
import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
|
|
6
6
|
import { isEmbeddingAvailable } from '../store/embeddings/local.js';
|
|
7
|
-
import { activeGoalsWithPolicies
|
|
7
|
+
import { activeGoalsWithPolicies } from '../store/goals.js';
|
|
8
|
+
import { boostByGoals } from '../search/goal-boost.js';
|
|
8
9
|
import { graphExpandRecall } from '../graph/recall.js';
|
|
9
10
|
import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../graph/stream.js';
|
|
10
11
|
import { Layer } from '../core/memory.js';
|
|
@@ -14,12 +15,12 @@ import { currentEntries } from '../search/as-of.js';
|
|
|
14
15
|
import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../search/boosts.js';
|
|
15
16
|
import { hybridSearch } from '../search/hybrid.js';
|
|
16
17
|
import { physicsSearch } from '../search/physics-search.js';
|
|
17
|
-
import { searchBothHybrid } from '../sharing/
|
|
18
|
+
import { searchBothHybrid } from '../sharing/search-both.js';
|
|
18
19
|
import { loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
|
|
20
|
+
import { isJsonNumber } from '../util/json.js';
|
|
19
21
|
import { textOverlap, tokenize as tokenizeQuery } from '../util/tokenize.js';
|
|
20
|
-
/** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and
|
|
21
|
-
*
|
|
22
|
-
* function and reranker in `opts`, and persists the returned goal-log rows. */
|
|
22
|
+
/** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
|
|
23
|
+
* (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned goal-log rows. */
|
|
23
24
|
export async function rankRecall(ctx, opts) {
|
|
24
25
|
const pool = loadRecallPool(ctx, opts);
|
|
25
26
|
const state = { results: [], droppedPreRank: pool.dropped, graphAdded: 0, goalRecallLog: [] };
|
|
@@ -111,7 +112,9 @@ async function searchPool(ctx, opts, pool) {
|
|
|
111
112
|
if (search.usePhysics && !globalRoot) {
|
|
112
113
|
// Explain leaves minResults and includeSuperseded out to hold its output steady; asOf must reach physics or later rows leak.
|
|
113
114
|
const temporal = explain ? { asOf } : { minResults, includeSuperseded, asOf };
|
|
114
|
-
return physicsSearch(query, pool.local, {
|
|
115
|
+
return physicsSearch(query, pool.local, {
|
|
116
|
+
budget, cost, hippoRoot: ctx.hippoRoot, physicsConfig: search.physicsConfig, scope, explain, vectorCandidates, ...temporal
|
|
117
|
+
});
|
|
115
118
|
}
|
|
116
119
|
if (globalRoot) {
|
|
117
120
|
// searchBothHybrid reloads candidates itself, so the scope rule is passed in rather than inherited from the pool.
|
|
@@ -121,7 +124,9 @@ async function searchPool(ctx, opts, pool) {
|
|
|
121
124
|
recallScope: opts.explicitScope ? { requested: opts.explicitScope, additive: true } : {},
|
|
122
125
|
});
|
|
123
126
|
}
|
|
124
|
-
return hybridSearch(query, pool.local, {
|
|
127
|
+
return hybridSearch(query, pool.local, {
|
|
128
|
+
budget, cost, hippoRoot: ctx.hippoRoot, explain, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf, vectorCandidates
|
|
129
|
+
});
|
|
125
130
|
}
|
|
126
131
|
/** Adds memories reached by walking the entity graph out from the lexical seeds. */
|
|
127
132
|
function expandGraph(ctx, opts, graph, state) {
|
|
@@ -187,7 +192,7 @@ function applyPfcRerankers(opts, state) {
|
|
|
187
192
|
if (opts.rerankUtility) {
|
|
188
193
|
// utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for length.
|
|
189
194
|
state.results = byScore(state.results.map((r) => {
|
|
190
|
-
const strength =
|
|
195
|
+
const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
|
|
191
196
|
const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) * (1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
|
|
192
197
|
const utility = r.score * utilityMult;
|
|
193
198
|
return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
|
|
@@ -263,7 +268,9 @@ function applyGoalBoosts(ctx, opts, state) {
|
|
|
263
268
|
if (!r.entry.tags?.includes(goalTag))
|
|
264
269
|
return r;
|
|
265
270
|
const boosted = { ...r, score: r.score * GOAL_TAG_BOOST };
|
|
266
|
-
return traced(opts, r, boosted, {
|
|
271
|
+
return traced(opts, r, boosted, {
|
|
272
|
+
stage: 'goal', multiplier: GOAL_TAG_BOOST, scoreBefore: r.score, scoreAfter: r.score * GOAL_TAG_BOOST, note: `--goal ${goalTag}`
|
|
273
|
+
});
|
|
267
274
|
}));
|
|
268
275
|
return;
|
|
269
276
|
}
|