hippo-memory 2.0.0 → 2.1.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/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -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 +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
// Ranking core shared by `hippo recall` and `hippo explain`: load, search, expand, re-rank and filter, with no
|
|
2
2
|
// writes and no direct output. Callers own flag parsing, printing, budget fitting and persistence.
|
|
3
|
-
import { evalNow } from '
|
|
4
|
-
import { oneCopyPerMemory } from '
|
|
5
|
-
import { compareEntryIdentity, compareScoresDesc } from '
|
|
6
|
-
import { isEmbeddingAvailable } from '
|
|
7
|
-
import { activeGoalsWithPolicies } from '
|
|
8
|
-
import { boostByGoals } from '
|
|
9
|
-
import { graphExpandRecall } from '
|
|
10
|
-
import { DEFAULT_GRAPH_STREAM_WEIGHT } from '
|
|
11
|
-
import { Layer } from '
|
|
12
|
-
import { multihopSearch } from '
|
|
13
|
-
import { passesCliRecallScopeFilter } from '
|
|
14
|
-
import { currentEntries } from '
|
|
15
|
-
import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '
|
|
16
|
-
import { hybridSearch, vectorSourceOf } from '
|
|
17
|
-
import { searchByEngine } from '
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
3
|
+
import { evalNow } from '../../core/ablation.js';
|
|
4
|
+
import { oneCopyPerMemory } from '../context-select.js';
|
|
5
|
+
import { compareEntryIdentity, compareScoresDesc } from '../../core/compare.js';
|
|
6
|
+
import { isEmbeddingAvailable } from '../../embeddings/local.js';
|
|
7
|
+
import { activeGoalsWithPolicies } from '../../store/goals.js';
|
|
8
|
+
import { boostByGoals } from '../../search/goal-boost.js';
|
|
9
|
+
import { graphExpandRecall } from '../../graph/recall.js';
|
|
10
|
+
import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../../graph/stream.js';
|
|
11
|
+
import { Layer } from '../../core/memory.js';
|
|
12
|
+
import { multihopSearch } from '../../search/multihop.js';
|
|
13
|
+
import { passesCliRecallScopeFilter } from '../../core/recall-scope.js';
|
|
14
|
+
import { currentEntries } from '../../search/as-of.js';
|
|
15
|
+
import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../../search/boosts.js';
|
|
16
|
+
import { hybridSearch, vectorSourceOf } from '../../search/hybrid.js';
|
|
17
|
+
import { searchByEngine } from '../../search/engine.js';
|
|
18
|
+
import { CONFLICT_PEER_MULTIPLIER, SALIENCE_MIN_MULTIPLIER, UTILITY_LENGTH_PENALTY_CAP, UTILITY_LENGTH_TOKENS, VALUE_MULT_MAX, VALUE_MULT_MIN, VALUE_MULT_SLOPE, } from '../../core/search-types.js';
|
|
19
|
+
import { rankBothStores } from '../../sharing/search-both.js';
|
|
20
|
+
import { loadRecallEntries, recallScopeFilter } from '../../store/search-rows.js';
|
|
21
|
+
import { isJsonNumber } from '../../util/json.js';
|
|
22
|
+
import { currentSignal } from '../../util/request-scope.js';
|
|
23
|
+
import { textOverlap, tokenize as tokenizeQuery } from '../../util/tokenize.js';
|
|
24
|
+
/**
|
|
25
|
+
* Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics
|
|
26
|
+
* state; writes and prints nothing
|
|
27
|
+
* (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned
|
|
28
|
+
* goal-log rows.
|
|
29
|
+
*/
|
|
24
30
|
export async function rankRecall(ctx, opts) {
|
|
25
31
|
const pool = loadRecallPool(ctx, opts);
|
|
26
32
|
const state = { results: [], droppedPreRank: pool.dropped, graphAdded: 0, goalRecallLog: [] };
|
|
@@ -35,6 +41,8 @@ export async function rankRecall(ctx, opts) {
|
|
|
35
41
|
halted,
|
|
36
42
|
});
|
|
37
43
|
state.results = await searchPool(ctx, opts, pool);
|
|
44
|
+
// A request past its deadline during the search has no caller left for the later stages.
|
|
45
|
+
currentSignal()?.throwIfAborted();
|
|
38
46
|
if (opts.haltBefore === 'expand')
|
|
39
47
|
return done(true);
|
|
40
48
|
if (opts.graphHops)
|
|
@@ -65,7 +73,12 @@ function loadRecallPool(ctx, opts) {
|
|
|
65
73
|
// An explicit --scope unlocks that envelope scope; the regex-only `<source>:private:*` deny is the JS half below.
|
|
66
74
|
const requested = opts.explicitScope || undefined;
|
|
67
75
|
const loadSuperseded = opts.includeSuperseded || Boolean(opts.asOf);
|
|
68
|
-
const load = {
|
|
76
|
+
const load = {
|
|
77
|
+
tenantId: ctx.tenantId,
|
|
78
|
+
requestedScope: requested,
|
|
79
|
+
explicitScopeMode: 'additive',
|
|
80
|
+
includeSuperseded: loadSuperseded,
|
|
81
|
+
};
|
|
69
82
|
let local = loadRecallEntries(ctx.hippoRoot, opts.query, load);
|
|
70
83
|
let global = ctx.globalRoot ? loadRecallEntries(ctx.globalRoot, opts.query, load) : [];
|
|
71
84
|
// SQL-excluded rows are pre-candidate, so the total is taken before the JS filters, which normally drop nothing.
|
|
@@ -78,47 +91,95 @@ function loadRecallPool(ctx, opts) {
|
|
|
78
91
|
global = currentEntries(global, currentness);
|
|
79
92
|
return { local, global, total, dropped: total - (local.length + global.length) };
|
|
80
93
|
}
|
|
81
|
-
|
|
94
|
+
function graphStreamSearch(ctx, opts, graphStream, pool) {
|
|
82
95
|
const { query, budget, cost, includeSuperseded, asOf, activeScope: scope, search } = opts;
|
|
83
|
-
const { mmr, mmrLambda, minResults
|
|
96
|
+
const { mmr, mmrLambda, minResults } = search;
|
|
84
97
|
const globalRoot = pool.global.length > 0 ? ctx.globalRoot : undefined;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
if (globalRoot)
|
|
91
|
-
ctx.note?.('[note] --graph-stream searches the local store only; global graph fusion is a follow-up.');
|
|
92
|
-
// With seedCount or fewer candidates every one is a seed and the stream degrades to the 2-list fusion.
|
|
93
|
-
return hybridSearch(query, pool.local, {
|
|
94
|
-
budget, cost, hippoRoot: ctx.hippoRoot, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf,
|
|
95
|
-
scoring: 'rrf',
|
|
96
|
-
graphStream: { weight: DEFAULT_GRAPH_STREAM_WEIGHT, tenantId: ctx.tenantId, hops: search.graphStream.hops, seedCount: search.graphStream.seeds },
|
|
97
|
-
});
|
|
98
|
+
// Without embeddings hybridSearch falls back to BM25-only and the stream is inert; say so rather than no-op.
|
|
99
|
+
if (!isEmbeddingAvailable()) {
|
|
100
|
+
ctx.note?.('[note] --graph-stream needs embeddings (rrf fusion); none available, so the graph stream is inert. Run ' +
|
|
101
|
+
'`hippo embed` first.');
|
|
98
102
|
}
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
|
|
102
|
-
return multihopSearch(query, allEntries, { budget, cost, hippoRoot: ctx.hippoRoot, minResults, includeSuperseded, asOf });
|
|
103
|
+
if (globalRoot) {
|
|
104
|
+
ctx.note?.('[note] --graph-stream searches the local store only; global graph fusion is a follow-up.');
|
|
103
105
|
}
|
|
106
|
+
// With seedCount or fewer candidates every one is a seed and the stream degrades to the 2-list fusion.
|
|
107
|
+
return hybridSearch(query, pool.local, {
|
|
108
|
+
budget, cost, hippoRoot: ctx.hippoRoot, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf,
|
|
109
|
+
scoring: 'rrf',
|
|
110
|
+
graphStream: {
|
|
111
|
+
weight: DEFAULT_GRAPH_STREAM_WEIGHT,
|
|
112
|
+
tenantId: ctx.tenantId,
|
|
113
|
+
hops: graphStream.hops,
|
|
114
|
+
seedCount: graphStream.seeds,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function multihopPoolSearch(ctx, opts, pool) {
|
|
119
|
+
const { query, budget, cost, includeSuperseded, asOf, search } = opts;
|
|
120
|
+
const { minResults } = search;
|
|
121
|
+
// Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
|
|
122
|
+
const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
|
|
123
|
+
return multihopSearch(query, allEntries, {
|
|
124
|
+
budget,
|
|
125
|
+
cost,
|
|
126
|
+
hippoRoot: ctx.hippoRoot,
|
|
127
|
+
minResults,
|
|
128
|
+
includeSuperseded,
|
|
129
|
+
asOf,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function poolVectorCandidates(ctx, opts) {
|
|
104
133
|
const requested = opts.explicitScope || undefined;
|
|
105
|
-
|
|
134
|
+
return {
|
|
106
135
|
tenantId: ctx.tenantId,
|
|
107
136
|
scope: recallScopeFilter(requested, 'additive'),
|
|
108
|
-
includeSuperseded: includeSuperseded || Boolean(asOf),
|
|
137
|
+
includeSuperseded: opts.includeSuperseded || Boolean(opts.asOf),
|
|
109
138
|
admit: (e) => passesCliRecallScopeFilter(e.scope ?? null, requested),
|
|
110
139
|
};
|
|
140
|
+
}
|
|
141
|
+
async function searchPool(ctx, opts, pool) {
|
|
142
|
+
const { query, budget, cost, includeSuperseded, asOf, activeScope: scope, search } = opts;
|
|
143
|
+
const { mmr, mmrLambda, minResults, explain } = search;
|
|
144
|
+
const globalRoot = pool.global.length > 0 ? ctx.globalRoot : undefined;
|
|
145
|
+
if (search.graphStream)
|
|
146
|
+
return graphStreamSearch(ctx, opts, search.graphStream, pool);
|
|
147
|
+
if (search.multihop)
|
|
148
|
+
return multihopPoolSearch(ctx, opts, pool);
|
|
149
|
+
const vectorCandidates = poolVectorCandidates(ctx, opts);
|
|
111
150
|
if (globalRoot) {
|
|
112
|
-
// The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both
|
|
151
|
+
// The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both
|
|
152
|
+
// stores again.
|
|
113
153
|
return rankBothStores(query, { local: ctx.hippoRoot, global: globalRoot }, { local: pool.local, global: pool.global }, vectorCandidates, {
|
|
114
|
-
budget,
|
|
115
|
-
|
|
154
|
+
budget,
|
|
155
|
+
cost,
|
|
156
|
+
explain,
|
|
157
|
+
mmr,
|
|
158
|
+
mmrLambda,
|
|
159
|
+
localBump: search.localBump,
|
|
160
|
+
minResults,
|
|
161
|
+
scope,
|
|
162
|
+
tenantId: ctx.tenantId,
|
|
163
|
+
includeSuperseded,
|
|
164
|
+
asOf,
|
|
116
165
|
});
|
|
117
166
|
}
|
|
118
167
|
const physics = search.usePhysics ? search.physicsConfig : null;
|
|
119
|
-
// Physics takes no MMR; explain drops minResults and includeSuperseded to hold its output steady; asOf must reach
|
|
120
|
-
|
|
121
|
-
|
|
168
|
+
// Physics takes no MMR; explain drops minResults and includeSuperseded to hold its output steady; asOf must reach
|
|
169
|
+
// physics or later rows leak.
|
|
170
|
+
const tuning = !physics
|
|
171
|
+
? { mmr, mmrLambda, minResults, includeSuperseded, asOf }
|
|
172
|
+
: explain
|
|
173
|
+
? { asOf }
|
|
174
|
+
: { minResults, includeSuperseded, asOf };
|
|
175
|
+
return searchByEngine(hippoDbSource(ctx.hippoRoot), query, pool.local, physics, {
|
|
176
|
+
budget,
|
|
177
|
+
cost,
|
|
178
|
+
scope,
|
|
179
|
+
explain,
|
|
180
|
+
vectorCandidates,
|
|
181
|
+
...tuning,
|
|
182
|
+
});
|
|
122
183
|
}
|
|
123
184
|
/** The CLI core holds no store: it ranks on hippo.db under its root, as its loads above do. */
|
|
124
185
|
function hippoDbSource(hippoRoot) {
|
|
@@ -161,57 +222,67 @@ function traced(opts, prev, next, step) {
|
|
|
161
222
|
function byScore(results) {
|
|
162
223
|
return results.sort((a, b) => compareScoresDesc(a.score, b.score));
|
|
163
224
|
}
|
|
225
|
+
function demoteConflictPeers(opts, state) {
|
|
226
|
+
// Recorded conflicts only: a lexical-overlap gate once wrecked benchmark recall. Down-rank, never delete.
|
|
227
|
+
const presentIds = new Set(state.results.map((r) => r.entry.id));
|
|
228
|
+
state.results = byScore(state.results.map((r) => {
|
|
229
|
+
const hasPeerInResults = (r.entry.conflicts_with || []).some((peerId) => presentIds.has(peerId));
|
|
230
|
+
if (!hasPeerInResults)
|
|
231
|
+
return r;
|
|
232
|
+
const next = { ...r, score: r.score * CONFLICT_PEER_MULTIPLIER };
|
|
233
|
+
return traced(opts, r, next, {
|
|
234
|
+
stage: 'interference',
|
|
235
|
+
multiplier: CONFLICT_PEER_MULTIPLIER,
|
|
236
|
+
scoreBefore: r.score,
|
|
237
|
+
scoreAfter: next.score,
|
|
238
|
+
});
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
241
|
+
function applyValueAware(opts, state) {
|
|
242
|
+
// Wider clamp than the always-on outcome boost, so outcome history can decide the order.
|
|
243
|
+
state.results = byScore(state.results.map((r) => {
|
|
244
|
+
const pos = r.entry.outcome_positive ?? 0;
|
|
245
|
+
const neg = r.entry.outcome_negative ?? 0;
|
|
246
|
+
if (pos === 0 && neg === 0)
|
|
247
|
+
return r;
|
|
248
|
+
const valueMult = Math.max(VALUE_MULT_MIN, Math.min(VALUE_MULT_MAX, 1 + VALUE_MULT_SLOPE * Math.tanh(pos - neg)));
|
|
249
|
+
const next = { ...r, score: r.score * valueMult };
|
|
250
|
+
return traced(opts, r, next, {
|
|
251
|
+
stage: 'value',
|
|
252
|
+
multiplier: valueMult,
|
|
253
|
+
scoreBefore: r.score,
|
|
254
|
+
scoreAfter: next.score,
|
|
255
|
+
});
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
function applyUtilityRank(opts, state) {
|
|
259
|
+
// utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for
|
|
260
|
+
// length.
|
|
261
|
+
state.results = byScore(state.results.map((r) => {
|
|
262
|
+
const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
|
|
263
|
+
const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) *
|
|
264
|
+
(1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
|
|
265
|
+
const utility = r.score * utilityMult;
|
|
266
|
+
return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
164
269
|
function applyPfcRerankers(opts, state) {
|
|
165
270
|
if (opts.evcAdaptive && state.results.length >= 2)
|
|
166
271
|
state.results = evcAdaptive(opts.query, state.results);
|
|
167
272
|
if (opts.filterConflicts) {
|
|
168
273
|
dropUnless(state, (r) => !r.entry.superseded_by);
|
|
169
|
-
|
|
170
|
-
const presentIds = new Set(state.results.map((r) => r.entry.id));
|
|
171
|
-
state.results = byScore(state.results.map((r) => {
|
|
172
|
-
const hasPeerInResults = (r.entry.conflicts_with || []).some((peerId) => presentIds.has(peerId));
|
|
173
|
-
if (!hasPeerInResults)
|
|
174
|
-
return r;
|
|
175
|
-
const next = { ...r, score: r.score * CONFLICT_PEER_MULTIPLIER };
|
|
176
|
-
return traced(opts, r, next, { stage: 'interference', multiplier: CONFLICT_PEER_MULTIPLIER, scoreBefore: r.score, scoreAfter: next.score });
|
|
177
|
-
}));
|
|
178
|
-
}
|
|
179
|
-
if (opts.valueAware && state.results.length >= 1) {
|
|
180
|
-
// Wider clamp than the always-on outcome boost, so outcome history can decide the order.
|
|
181
|
-
state.results = byScore(state.results.map((r) => {
|
|
182
|
-
const pos = r.entry.outcome_positive ?? 0;
|
|
183
|
-
const neg = r.entry.outcome_negative ?? 0;
|
|
184
|
-
if (pos === 0 && neg === 0)
|
|
185
|
-
return r;
|
|
186
|
-
const valueMult = Math.max(VALUE_MULT_MIN, Math.min(VALUE_MULT_MAX, 1 + VALUE_MULT_SLOPE * Math.tanh(pos - neg)));
|
|
187
|
-
const next = { ...r, score: r.score * valueMult };
|
|
188
|
-
return traced(opts, r, next, { stage: 'value', multiplier: valueMult, scoreBefore: r.score, scoreAfter: next.score });
|
|
189
|
-
}));
|
|
190
|
-
}
|
|
191
|
-
if (opts.rerankUtility) {
|
|
192
|
-
// utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for length.
|
|
193
|
-
state.results = byScore(state.results.map((r) => {
|
|
194
|
-
const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
|
|
195
|
-
const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) * (1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
|
|
196
|
-
const utility = r.score * utilityMult;
|
|
197
|
-
return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
|
|
198
|
-
}));
|
|
274
|
+
demoteConflictPeers(opts, state);
|
|
199
275
|
}
|
|
276
|
+
if (opts.valueAware && state.results.length >= 1)
|
|
277
|
+
applyValueAware(opts, state);
|
|
278
|
+
if (opts.rerankUtility)
|
|
279
|
+
applyUtilityRank(opts, state);
|
|
200
280
|
}
|
|
201
|
-
// A recorded conflict peer in the same result list is cut to this share of its score.
|
|
202
|
-
const CONFLICT_PEER_MULTIPLIER = 0.3;
|
|
203
|
-
// The value-aware clamp is wider than the always-on outcome nudge, so outcome history can decide the order.
|
|
204
|
-
const VALUE_MULT_SLOPE = 0.3;
|
|
205
|
-
const VALUE_MULT_MIN = 0.7;
|
|
206
|
-
const VALUE_MULT_MAX = 1.3;
|
|
207
|
-
const UTILITY_LENGTH_PENALTY_CAP = 0.3;
|
|
208
|
-
const UTILITY_LENGTH_TOKENS = 10000;
|
|
209
281
|
// evcAdaptive acts when the top hits overlap this much; it keeps rows near the best score or covering the query.
|
|
210
282
|
const NEAR_DUPLICATE_OVERLAP_MIN = 0.4;
|
|
211
283
|
const SCORE_FLOOR_FRACTION = 0.5;
|
|
212
284
|
const QUERY_COVERAGE_MIN = 0.6;
|
|
213
285
|
const GOAL_TAG_BOOST = 1.5;
|
|
214
|
-
const SALIENCE_MIN_MULTIPLIER = 0.5;
|
|
215
286
|
/** When the top hits are near-duplicates (same topic, different facts), surface the newest on-topic row first. */
|
|
216
287
|
function evcAdaptive(query, results) {
|
|
217
288
|
const slice = results.slice(0, Math.min(3, results.length));
|
|
@@ -268,7 +339,11 @@ function applyGoalBoosts(ctx, opts, state) {
|
|
|
268
339
|
return r;
|
|
269
340
|
const boosted = { ...r, score: r.score * GOAL_TAG_BOOST };
|
|
270
341
|
return traced(opts, r, boosted, {
|
|
271
|
-
stage: 'goal',
|
|
342
|
+
stage: 'goal',
|
|
343
|
+
multiplier: GOAL_TAG_BOOST,
|
|
344
|
+
scoreBefore: r.score,
|
|
345
|
+
scoreAfter: r.score * GOAL_TAG_BOOST,
|
|
346
|
+
note: `--goal ${goalTag}`,
|
|
272
347
|
});
|
|
273
348
|
}));
|
|
274
349
|
return;
|
|
@@ -279,7 +354,11 @@ function applyGoalBoosts(ctx, opts, state) {
|
|
|
279
354
|
const goalBoostTrace = opts.why ? new Map() : undefined;
|
|
280
355
|
const session = { sessionId: opts.sessionId, tenantId: ctx.tenantId };
|
|
281
356
|
// The log may name global rows; the store drops those when it writes, as it does for api.recall.
|
|
282
|
-
const boost = boostByGoals(state.results, activeGoalsWithPolicies(ctx.hippoRoot, session), {
|
|
357
|
+
const boost = boostByGoals(state.results, activeGoalsWithPolicies(ctx.hippoRoot, session), {
|
|
358
|
+
...session,
|
|
359
|
+
limit: opts.limit,
|
|
360
|
+
trace: goalBoostTrace,
|
|
361
|
+
});
|
|
283
362
|
state.results = boost.results;
|
|
284
363
|
state.goalRecallLog = boost.log;
|
|
285
364
|
if (goalBoostTrace && goalBoostTrace.size > 0) {
|
|
@@ -297,7 +376,12 @@ function applySalience(opts, threshold, results) {
|
|
|
297
376
|
return r;
|
|
298
377
|
const mult = Math.max(SALIENCE_MIN_MULTIPLIER, count / threshold);
|
|
299
378
|
const next = { ...r, score: r.score * mult };
|
|
300
|
-
return traced(opts, r, next, {
|
|
379
|
+
return traced(opts, r, next, {
|
|
380
|
+
stage: 'retrieval-count-downweight',
|
|
381
|
+
multiplier: mult,
|
|
382
|
+
scoreBefore: r.score,
|
|
383
|
+
scoreAfter: next.score,
|
|
384
|
+
});
|
|
301
385
|
}));
|
|
302
386
|
}
|
|
303
387
|
function dropUnless(state, keep) {
|
|
@@ -305,4 +389,4 @@ function dropUnless(state, keep) {
|
|
|
305
389
|
state.results = state.results.filter(keep);
|
|
306
390
|
state.droppedPreRank += before - state.results.length;
|
|
307
391
|
}
|
|
308
|
-
//# sourceMappingURL=
|
|
392
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RecallOpts, RecallResult } from './types.js';
|
|
2
|
+
import { type StoreContext } from '../types.js';
|
|
3
|
+
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a
|
|
4
|
+
* surface that sets `recordAs`. Only the CLI core ranker writes last_retrieval_ids (contract lock). */
|
|
5
|
+
export declare function retrieve(ctx: StoreContext, opts: RecallOpts): Promise<RecallResult>;
|
|
6
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
// Read path: retrieve, the one recall entry.
|
|
2
|
-
import { envRequireSessionScopedFreshTail } from '
|
|
3
|
-
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '
|
|
4
|
-
import { recallScopeFilter } from '
|
|
5
|
-
import { estimateTokens } from '
|
|
6
|
-
import { formatHandoffEvidenceLine } from '
|
|
7
|
-
import { boostByGoals } from '
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { classifyOriginProject, projectNames } from '
|
|
15
|
-
import { decidePlanningFallacy, detectPlanningClaim } from '
|
|
16
|
-
import { detectAnchoring, hashQueryText, biasHintEnabled } from './
|
|
17
|
-
import { detectAvailabilityBias } from '
|
|
18
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '
|
|
19
|
-
import { ownerOrSubject, RecallContractError } from '
|
|
20
|
-
import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './
|
|
21
|
-
import { retrieveWithCliCore } from './
|
|
22
|
-
import { recallLead, recordShownRecall } from './
|
|
2
|
+
import { envRequireSessionScopedFreshTail } from '../../util/env.js';
|
|
3
|
+
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../../store/rows.js';
|
|
4
|
+
import { recallScopeFilter } from '../../store/search-rows.js';
|
|
5
|
+
import { estimateTokens } from '../../util/token-text.js';
|
|
6
|
+
import { formatHandoffEvidenceLine } from '../../core/handoff.js';
|
|
7
|
+
import { boostByGoals } from '../../search/goal-boost.js';
|
|
8
|
+
import { searchByEngine } from '../../search/engine.js';
|
|
9
|
+
import { churnStaleFactor } from '../../search/boosts.js';
|
|
10
|
+
import { compareEntryIdentity } from '../../core/compare.js';
|
|
11
|
+
import { dropHeldCopies, duplicateKey, storedTextKeys } from '../../util/same-text.js';
|
|
12
|
+
import { isSharedStore } from '../../core/config.js';
|
|
13
|
+
import { configOf } from '../config-of.js';
|
|
14
|
+
import { classifyOriginProject, projectNames } from '../../core/project-identity.js';
|
|
15
|
+
import { decidePlanningFallacy, detectPlanningClaim } from '../../predictions/planning-fallacy.js';
|
|
16
|
+
import { detectAnchoring, hashQueryText, biasHintEnabled } from './finish.js';
|
|
17
|
+
import { detectAvailabilityBias } from '../availability.js';
|
|
18
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../../core/recall-scope.js';
|
|
19
|
+
import { ownerOrSubject, RecallContractError } from '../types.js';
|
|
20
|
+
import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf, } from './finish.js';
|
|
21
|
+
import { retrieveWithCliCore } from './request.js';
|
|
22
|
+
import { recallLead, recordShownRecall } from './finish.js';
|
|
23
23
|
const DEFAULT_RECALL_LIMIT = 10;
|
|
24
24
|
function recallOrigin(opts) {
|
|
25
25
|
return opts.project ? projectNames(opts.project) : undefined;
|
|
@@ -27,8 +27,8 @@ function recallOrigin(opts) {
|
|
|
27
27
|
function inCallerProject(entry, opts) {
|
|
28
28
|
return !opts.project || classifyOriginProject(entry.origin_project, opts.project) !== 'cross-project';
|
|
29
29
|
}
|
|
30
|
-
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a
|
|
31
|
-
*
|
|
30
|
+
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a
|
|
31
|
+
* surface that sets `recordAs`. Only the CLI core ranker writes last_retrieval_ids (contract lock). */
|
|
32
32
|
export async function retrieve(ctx, opts) {
|
|
33
33
|
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
34
34
|
if (opts.cliCore)
|
|
@@ -38,7 +38,7 @@ export async function retrieve(ctx, opts) {
|
|
|
38
38
|
const own = personalScopeOf(ctx.actor) ?? undefined;
|
|
39
39
|
if (opts.showRanked)
|
|
40
40
|
return retrieveFromStore(ctx, opts, windowSize, opts.showRanked, own);
|
|
41
|
-
const store =
|
|
41
|
+
const store = ctx.store;
|
|
42
42
|
const how = opts.recordAs;
|
|
43
43
|
if (!how)
|
|
44
44
|
return retrieveBand(ctx, store, opts, windowSize, own);
|
|
@@ -46,7 +46,8 @@ export async function retrieve(ctx, opts) {
|
|
|
46
46
|
await recordShownRecall(ctx, store, how, shownBand(opts, result));
|
|
47
47
|
return result;
|
|
48
48
|
}
|
|
49
|
-
/** What the band ranker hands to the record: the rows it returns,
|
|
49
|
+
/** What the band ranker hands to the record: the rows it returns,
|
|
50
|
+
* and the continuity block the reply carries beside them. */
|
|
50
51
|
function shownBand(opts, result) {
|
|
51
52
|
return {
|
|
52
53
|
query: opts.query,
|
|
@@ -56,14 +57,19 @@ function shownBand(opts, result) {
|
|
|
56
57
|
items: result.results.length,
|
|
57
58
|
tokens: result.tokens + (result.continuityTokens ?? 0),
|
|
58
59
|
ledgerSessionId: opts.sessionId ?? null,
|
|
59
|
-
|
|
60
|
+
// A failed audit write throws out of the band ranker, so this point is never reached without the rows.
|
|
61
|
+
written: true,
|
|
60
62
|
};
|
|
61
63
|
}
|
|
62
64
|
/** The default ranker: the SQL BM25 band, reordered by hybrid or physics search when `mode` asks. */
|
|
63
65
|
async function retrieveBand(ctx, store, opts, windowSize, own) {
|
|
64
66
|
let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
|
|
65
67
|
if (opts.mode === 'hybrid' || opts.mode === 'physics') {
|
|
66
|
-
const searchOpts = {
|
|
68
|
+
const searchOpts = {
|
|
69
|
+
budget: Infinity,
|
|
70
|
+
scope: opts.scope ?? null,
|
|
71
|
+
vectorCandidates: recallVectorSpec(ctx, opts, own),
|
|
72
|
+
};
|
|
67
73
|
const ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, candidates, physicsFor(ctx, opts), searchOpts);
|
|
68
74
|
const rankedIds = new Set(ranked.map((r) => r.entry.id));
|
|
69
75
|
candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
|
|
@@ -84,7 +90,7 @@ async function finishBandRecall(store, ctx, opts, writes, shownIds) {
|
|
|
84
90
|
}
|
|
85
91
|
/** `mode` names the engine: physics with the store's config, hybrid otherwise. */
|
|
86
92
|
function physicsFor(ctx, opts) {
|
|
87
|
-
return opts.mode === 'physics' ?
|
|
93
|
+
return opts.mode === 'physics' ? configOf(ctx).physics : null;
|
|
88
94
|
}
|
|
89
95
|
/** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
|
|
90
96
|
function recallSearchArgs(ctx, opts, limit, own) {
|
|
@@ -110,40 +116,23 @@ function recallVectorSpec(ctx, opts, own) {
|
|
|
110
116
|
}
|
|
111
117
|
// Tag, pin and recency boosts can lift a row from deep in the BM25 order, so MCP ranks a wide lexical window.
|
|
112
118
|
const SHOW_RANKED_LEXICAL_WINDOW = 1000;
|
|
113
|
-
/** `retrieve` under `showRanked`: physics when `mode` says so, hybrid
|
|
119
|
+
/** `retrieve` under `showRanked`: physics when `mode` says so, hybrid
|
|
120
|
+
* otherwise, over a wide lexical window plus the nearest vectors. */
|
|
114
121
|
async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
115
|
-
const store =
|
|
122
|
+
const store = ctx.store;
|
|
116
123
|
const loaded = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, Math.max(windowSize, SHOW_RANKED_LEXICAL_WINDOW), own));
|
|
117
124
|
const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
|
|
118
125
|
// No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
|
|
119
126
|
const searchOpts = { budget: Infinity, vectorCandidates: recallVectorSpec(ctx, opts, own) };
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
|
|
123
|
-
let rankedLog = [];
|
|
124
|
-
if (goals && opts.sessionId) {
|
|
125
|
-
const boost = boostByGoals(ranked, goals, { sessionId: opts.sessionId, tenantId: ctx.tenantId, limit: ranked.length });
|
|
126
|
-
ranked = boost.results;
|
|
127
|
-
rankedLog = boost.log;
|
|
128
|
-
}
|
|
127
|
+
const searched = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, pool, physicsFor(ctx, opts), searchOpts);
|
|
128
|
+
const { ranked, goals, rankedLog } = await boostRankedByGoals(ctx, opts, searched);
|
|
129
129
|
const window = ranked.slice(0, windowSize).map((r) => r.entry);
|
|
130
130
|
const bandOpts = { ...opts, suppressRecallTrace: true };
|
|
131
131
|
const plan = planRecall(ctx, bandOpts, window, own);
|
|
132
132
|
const reads = await readRecall(store, ctx, bandOpts, plan, goals);
|
|
133
133
|
const { result, writes } = composeRecall(ctx, bandOpts, { windowSize, all: window, plan, reads, auditBand: false });
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
|
|
137
|
-
const shown = show({ ranked, pool: candidates, droppedByScope: loaded.length - pool.length }, result);
|
|
138
|
-
const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
|
|
139
|
-
const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shown.ids.length));
|
|
140
|
-
const trace = opts.suppressRecallTrace ? undefined : {
|
|
141
|
-
tenantId: ctx.tenantId,
|
|
142
|
-
sessionId: opts.sessionId ?? null,
|
|
143
|
-
pipeline: 'mcp',
|
|
144
|
-
query: opts.query,
|
|
145
|
-
results: shown.ids.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
|
|
146
|
-
};
|
|
134
|
+
const shown = show({ ranked, pool: withVectorCandidates(pool, ranked), droppedByScope: loaded.length - pool.length }, result);
|
|
135
|
+
const { shownRow, trace } = shownAuditAndTrace(ctx, opts, shown.ids, ranked);
|
|
147
136
|
await finishBandRecall(store, ctx, opts, {
|
|
148
137
|
goalLog: [...rankedLog, ...writes.goalLog],
|
|
149
138
|
audit: [...writes.audit, shownRow, ...shown.audit],
|
|
@@ -151,6 +140,40 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
|
151
140
|
}, shown.ids);
|
|
152
141
|
return result;
|
|
153
142
|
}
|
|
143
|
+
// One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
|
|
144
|
+
async function boostRankedByGoals(ctx, opts, ranked) {
|
|
145
|
+
const noLog = [];
|
|
146
|
+
const goals = opts.sessionId && !opts.goalTag
|
|
147
|
+
? await ctx.store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId })
|
|
148
|
+
: null;
|
|
149
|
+
if (!goals || !opts.sessionId)
|
|
150
|
+
return { ranked, goals, rankedLog: noLog };
|
|
151
|
+
const boost = boostByGoals(ranked, goals, {
|
|
152
|
+
sessionId: opts.sessionId,
|
|
153
|
+
tenantId: ctx.tenantId,
|
|
154
|
+
limit: ranked.length,
|
|
155
|
+
});
|
|
156
|
+
return { ranked: boost.results, goals, rankedLog: boost.log };
|
|
157
|
+
}
|
|
158
|
+
// Rows the vector arm added count as candidates too.
|
|
159
|
+
function withVectorCandidates(pool, ranked) {
|
|
160
|
+
const inPool = new Set(pool.map((e) => e.id));
|
|
161
|
+
return [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
|
|
162
|
+
}
|
|
163
|
+
function shownAuditAndTrace(ctx, opts, shownIds, ranked) {
|
|
164
|
+
const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
|
|
165
|
+
const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shownIds.length));
|
|
166
|
+
const trace = opts.suppressRecallTrace
|
|
167
|
+
? undefined
|
|
168
|
+
: {
|
|
169
|
+
tenantId: ctx.tenantId,
|
|
170
|
+
sessionId: opts.sessionId ?? null,
|
|
171
|
+
pipeline: 'mcp',
|
|
172
|
+
query: opts.query,
|
|
173
|
+
results: shownIds.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
|
|
174
|
+
};
|
|
175
|
+
return { shownRow, trace };
|
|
176
|
+
}
|
|
154
177
|
/** Contract preflight: throws before any store-touching work. */
|
|
155
178
|
function recallWindowSize(opts) {
|
|
156
179
|
// Throw before loadSearchEntries, which runs initStore and migrates legacy state on first call.
|
|
@@ -193,16 +216,22 @@ async function readRecall(store, ctx, opts, plan, goals) {
|
|
|
193
216
|
const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
|
|
194
217
|
const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
|
|
195
218
|
return {
|
|
196
|
-
goals: goals !== undefined
|
|
219
|
+
goals: goals !== undefined
|
|
220
|
+
? goals
|
|
221
|
+
: plan.goalBoost
|
|
222
|
+
? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId })
|
|
223
|
+
: null,
|
|
197
224
|
parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
|
|
198
|
-
freshRaws: freshCount > 0
|
|
225
|
+
freshRaws: freshCount > 0
|
|
226
|
+
? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null)
|
|
227
|
+
: [],
|
|
199
228
|
continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
|
|
200
229
|
planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
|
|
201
230
|
};
|
|
202
231
|
}
|
|
203
232
|
// On a shared store the tenant's newest row is another developer's; no project keys to nothing, so the block is empty.
|
|
204
233
|
function continuityKey(ctx, opts) {
|
|
205
|
-
if (!isSharedStore(ctx.hippoRoot))
|
|
234
|
+
if (!(ctx.reach ? ctx.reach.shared : isSharedStore(ctx.hippoRoot)))
|
|
206
235
|
return null;
|
|
207
236
|
return { owner: ownerOrSubject(ctx.actor), project: opts.project ? projectNames(opts.project) : [] };
|
|
208
237
|
}
|
|
@@ -213,7 +242,9 @@ function composeRecall(ctx, opts, options) {
|
|
|
213
242
|
const rankedOut = bands.rankedOut;
|
|
214
243
|
const continuity = reads.continuity ? scopeContinuity(reads.continuity, opts, plan.own) : undefined;
|
|
215
244
|
// Query-derived, so MCP and CLI read this one hint instead of recomputing; HIPPO_AUTODEBIAS=off disables it.
|
|
216
|
-
const planning = plan.claim && reads.planning
|
|
245
|
+
const planning = plan.claim && reads.planning
|
|
246
|
+
? decidePlanningFallacy(plan.claim, reads.planning, ctx.tenantId, ctx.actor.subject)
|
|
247
|
+
: null;
|
|
217
248
|
const { anchoringHint, suppressedByInterference } = detectRecallAnchoring(opts, rankedOut[0]?.id ?? null);
|
|
218
249
|
const availabilityHint = detectRecallAvailability(opts, bands.baseSlice, window.entries);
|
|
219
250
|
const result = {
|
|
@@ -242,7 +273,9 @@ function composeRecall(ctx, opts, options) {
|
|
|
242
273
|
if (availabilityHint)
|
|
243
274
|
result.availabilityHint = availabilityHint;
|
|
244
275
|
const who = callerOf(ctx);
|
|
245
|
-
const audit = auditBand
|
|
276
|
+
const audit = auditBand
|
|
277
|
+
? [recallAuditRow(who, 'recall', undefined, recallAuditMetadata(opts.query, rankedOut.length))]
|
|
278
|
+
: [];
|
|
246
279
|
if (planning?.audit)
|
|
247
280
|
audit.push(planning.audit);
|
|
248
281
|
audit.push(...anchoringRows(who, anchoringHint), ...availabilityRows(who, availabilityHint));
|
|
@@ -297,7 +330,11 @@ function rankBands(opts, plan, reads) {
|
|
|
297
330
|
const summaryRanked = substituted.map((s) => summaryItem(s, opts));
|
|
298
331
|
const freshRanked = (opts.freshTailCount ?? 0) > 0
|
|
299
332
|
? freshTailBand(opts, {
|
|
300
|
-
recent: reads.freshRaws,
|
|
333
|
+
recent: reads.freshRaws,
|
|
334
|
+
baseRanked,
|
|
335
|
+
summaryRanked,
|
|
336
|
+
shownEntries: opts.keepHeldCopies ? [] : [...baseSlice, ...substituted.map((s) => s.entry)],
|
|
337
|
+
own,
|
|
301
338
|
})
|
|
302
339
|
: [];
|
|
303
340
|
return {
|
|
@@ -312,7 +349,10 @@ function rankBands(opts, plan, reads) {
|
|
|
312
349
|
// When the overflow holds 2+ children of one level-2 summary, that summary stands in for them, capped at 30% of
|
|
313
350
|
// `limit`. Each one is tenant-scoped and re-checked against the scope filter; drillDown recovers the children.
|
|
314
351
|
function substituteOverflow(opts, overflowByParent, parents, limit, own) {
|
|
315
|
-
const eligibleParents = parents.filter((p) => (p.dag_level ?? 0) === 2 &&
|
|
352
|
+
const eligibleParents = parents.filter((p) => (p.dag_level ?? 0) === 2 &&
|
|
353
|
+
!p.superseded_by &&
|
|
354
|
+
passesScopeFilterForRecall(p.scope ?? null, opts.scope, own) &&
|
|
355
|
+
inCallerProject(p, opts));
|
|
316
356
|
const maxSub = Math.max(1, Math.ceil(limit * SUMMARY_SUB_FRACTION));
|
|
317
357
|
// Most overflowed children first; compareEntryIdentity only breaks a tie, which used to fall to scan order.
|
|
318
358
|
eligibleParents.sort((a, b) => {
|
|
@@ -325,7 +365,8 @@ function substituteOverflow(opts, overflowByParent, parents, limit, own) {
|
|
|
325
365
|
childIds: (overflowByParent.get(p.id) ?? []).map((e) => e.id),
|
|
326
366
|
}));
|
|
327
367
|
}
|
|
328
|
-
/** Overflowed leaf rows by summary parent, kept only for a
|
|
368
|
+
/** Overflowed leaf rows by summary parent, kept only for a
|
|
369
|
+
* parent with 2+ of them that is not already in the base band. */
|
|
329
370
|
function overflowGroups(window, limit) {
|
|
330
371
|
// The goal boost only re-scores the base band, so its ids are known before the boost runs.
|
|
331
372
|
const baseIds = new Set(window.baseSlice.map((e) => e.id));
|