hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- 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/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -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/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- 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 +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- 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 +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- 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/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- 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 +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- 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 +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- 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 +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- 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 +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- 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 +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- 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 +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- 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 +49 -40
- 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 +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- 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 +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -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 +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- 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 +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- 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/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -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 +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- 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 -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/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- 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 +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- 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 +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- 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 +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- 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 +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- 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 +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- 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/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- 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.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -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 +24 -53
- 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 +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- 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 +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- 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/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- 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 +24 -60
- 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 +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- 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 +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- 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 +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- 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 +11 -63
- package/dist/store/summaries.js +37 -148
- 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 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- 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/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- 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/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- 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 +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/eval/judgment.js
CHANGED
|
@@ -2,14 +2,26 @@
|
|
|
2
2
|
* Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
|
|
3
3
|
* every captured memory currently lands on a flat schema_fit of 0.5. */
|
|
4
4
|
import { fetchWithRetry } from '../util/http-retry.js';
|
|
5
|
-
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { readCappedJson } from '../util/capped-json.js';
|
|
7
|
+
import { isJsonNumber, isJsonObject, isJsonString } from '../util/json.js';
|
|
6
8
|
const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
|
|
7
9
|
const DEFAULT_MODEL = 'jev-1.13.0';
|
|
8
10
|
const MAX_CONCURRENCY = 8;
|
|
11
|
+
// An honest reply is three short answers, a few hundred bytes; 1 MiB leaves room for a verbose envelope.
|
|
12
|
+
const JUDGE_MAX_REPLY_BYTES = 1024 * 1024;
|
|
13
|
+
/** One named answer of a Jev reply `{ answers: { <name>: Answer } }`; an empty object when the reply has none of that shape. */
|
|
14
|
+
function answerNamed(reply, name) {
|
|
15
|
+
const answers = isJsonObject(reply) ? reply.answers : undefined;
|
|
16
|
+
const answer = isJsonObject(answers) ? answers[name] : undefined;
|
|
17
|
+
return isJsonObject(answer) ? answer : {};
|
|
18
|
+
}
|
|
9
19
|
const QUESTIONS = {
|
|
10
20
|
durable: {
|
|
11
21
|
type: 'noul',
|
|
12
|
-
instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to
|
|
22
|
+
instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to ' +
|
|
23
|
+
'a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. ' +
|
|
24
|
+
'Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
|
|
13
25
|
},
|
|
14
26
|
kind: {
|
|
15
27
|
type: 'choice',
|
|
@@ -36,7 +48,7 @@ const QUESTIONS = {
|
|
|
36
48
|
const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
|
|
37
49
|
const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
|
|
38
50
|
function oneOf(value, allowed) {
|
|
39
|
-
return allowed.find((option) => option === value) ?? null;
|
|
51
|
+
return isJsonString(value) ? allowed.find((option) => option === value) ?? null : null;
|
|
40
52
|
}
|
|
41
53
|
/** `verified` is unreachable: that tier means a human or a test confirmed it. */
|
|
42
54
|
function toConfidenceTier(kindConfidence) {
|
|
@@ -63,14 +75,19 @@ async function post(content, opts) {
|
|
|
63
75
|
}, { timeoutMs: JUDGE_TIMEOUT_MS, fetchFn: opts.fetcher });
|
|
64
76
|
}
|
|
65
77
|
catch (err) {
|
|
66
|
-
log.
|
|
78
|
+
log.warn(`judge: request failed: ${errorMessage(err)}`, errorFields(err));
|
|
67
79
|
return null;
|
|
68
80
|
}
|
|
69
|
-
|
|
81
|
+
if (res.ok)
|
|
82
|
+
return res;
|
|
83
|
+
// The body is the server's reply, never the request, so it cannot hold the key.
|
|
84
|
+
const snippet = (await res.text().catch(() => '')).slice(0, 200);
|
|
85
|
+
log.warn('judge: non-2xx reply', { status: res.status, body: snippet });
|
|
86
|
+
return null;
|
|
70
87
|
}
|
|
71
88
|
/** `null` on any failure, so a Jev outage degrades capture to today's
|
|
72
89
|
* behaviour instead of blocking the write. */
|
|
73
|
-
|
|
90
|
+
async function judge(content, opts) {
|
|
74
91
|
const trimmed = content.trim();
|
|
75
92
|
if (trimmed.length < 3)
|
|
76
93
|
return null;
|
|
@@ -79,21 +96,19 @@ export async function judge(content, opts) {
|
|
|
79
96
|
return null;
|
|
80
97
|
let data;
|
|
81
98
|
try {
|
|
82
|
-
|
|
83
|
-
// keyed by the question names posted above; every field read below is
|
|
84
|
-
// optional-chained and range-checked before use, so a lie here returns null.
|
|
85
|
-
data = await res.json();
|
|
99
|
+
data = await readCappedJson(res, JUDGE_MAX_REPLY_BYTES);
|
|
86
100
|
}
|
|
87
101
|
catch (err) {
|
|
88
102
|
log.debug(`judge: unreadable response: ${errorMessage(err)}`);
|
|
89
103
|
return null;
|
|
90
104
|
}
|
|
91
|
-
const durable = data.
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
105
|
+
const durable = answerNamed(data, 'durable').noul;
|
|
106
|
+
const kindAnswer = answerNamed(data, 'kind');
|
|
107
|
+
const kind = oneOf(kindAnswer.choice, KINDS);
|
|
108
|
+
const valence = oneOf(answerNamed(data, 'valence').choice, VALENCES);
|
|
109
|
+
if (!isJsonNumber(durable) || durable < 0 || durable > 1 || !kind || !valence)
|
|
95
110
|
return null;
|
|
96
|
-
const kindConfidence =
|
|
111
|
+
const kindConfidence = isJsonNumber(kindAnswer.confidence) ? kindAnswer.confidence : 0;
|
|
97
112
|
return { durable, kind, valence, confidence: toConfidenceTier(kindConfidence), kindConfidence };
|
|
98
113
|
}
|
|
99
114
|
/** Judge many candidates under a bounded concurrency pool, order preserved. */
|
|
@@ -280,7 +280,7 @@ export default function register(api) {
|
|
|
280
280
|
// --- Tool: hippo_outcome ---
|
|
281
281
|
api.registerTool((ctx) => ({
|
|
282
282
|
name: 'hippo_outcome',
|
|
283
|
-
description:
|
|
283
|
+
description: "Report whether recalled memories were useful. Good outcomes slow a memory's decay and bad ones speed it up, in proportion to its record. Call after completing work.",
|
|
284
284
|
parameters: {
|
|
285
285
|
type: 'object',
|
|
286
286
|
properties: {
|
package/dist/graph/extract.d.ts
CHANGED
|
@@ -1,34 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Populates the graph from the already-structured consolidated first-class object tables -
|
|
5
|
-
* NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
|
|
6
|
-
* function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
|
|
7
|
-
* entities + `supersedes` relations from decisions /
|
|
8
|
-
* policies / customer_notes / project_briefs (the four object types whose kind maps to the
|
|
9
|
-
* `entity_type` enum), then write only their difference from the stored rows. All writes go
|
|
10
|
-
* through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
|
|
11
|
-
*
|
|
12
|
-
* Pass 3 adds the
|
|
13
|
-
* first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
|
|
14
|
-
* `references` edge when one consolidated object's text contains another entity's name.
|
|
15
|
-
* It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
|
|
16
|
-
* capped); its precision is measured + reported, not assumed.
|
|
17
|
-
*
|
|
18
|
-
* Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
|
|
19
|
-
* skill/incident/process entities (not in the entity_type enum - needs a migration); the
|
|
20
|
-
* `hippo sleep` enqueue-hook.
|
|
21
|
-
*/
|
|
1
|
+
/** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
|
|
2
|
+
* Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
|
|
22
3
|
import { type EntityType } from '../store/graph-rows.js';
|
|
23
4
|
import { type DesiredGraph } from './delta.js';
|
|
24
5
|
import { type WriteBudget } from '../util/write-budget.js';
|
|
25
|
-
/** Per-type load cap (the loaders default to 100)
|
|
26
|
-
* set exceeds this is truncated; `ExtractResult.truncated` records it so the
|
|
27
|
-
* incompleteness is observable rather than silent. */
|
|
6
|
+
/** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
|
|
28
7
|
export declare const MAX_EXTRACT_PER_TYPE = 10000;
|
|
29
|
-
/** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short
|
|
30
|
-
*
|
|
31
|
-
* source). */
|
|
8
|
+
/** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
|
|
9
|
+
* (a decision's prose name is never a target, only a source). */
|
|
32
10
|
export declare const MIN_REF_NAME_LEN = 4;
|
|
33
11
|
export declare const MAX_REF_NAME_LEN = 80;
|
|
34
12
|
/** Per-source cap so one object cannot explode the graph with references edges. */
|
package/dist/graph/extract.js
CHANGED
|
@@ -1,24 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Populates the graph from the already-structured consolidated first-class object tables -
|
|
5
|
-
* NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
|
|
6
|
-
* function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
|
|
7
|
-
* entities + `supersedes` relations from decisions /
|
|
8
|
-
* policies / customer_notes / project_briefs (the four object types whose kind maps to the
|
|
9
|
-
* `entity_type` enum), then write only their difference from the stored rows. All writes go
|
|
10
|
-
* through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
|
|
11
|
-
*
|
|
12
|
-
* Pass 3 adds the
|
|
13
|
-
* first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
|
|
14
|
-
* `references` edge when one consolidated object's text contains another entity's name.
|
|
15
|
-
* It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
|
|
16
|
-
* capped); its precision is measured + reported, not assumed.
|
|
17
|
-
*
|
|
18
|
-
* Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
|
|
19
|
-
* skill/incident/process entities (not in the entity_type enum - needs a migration); the
|
|
20
|
-
* `hippo sleep` enqueue-hook.
|
|
21
|
-
*/
|
|
1
|
+
/** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
|
|
2
|
+
* Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
|
|
22
3
|
import { applyGraphOps } from './write.js';
|
|
23
4
|
import { runGraphRebuildTransaction } from '../store/graph-writes.js';
|
|
24
5
|
import { MAX_ENTITY_NAME_LEN } from '../store/graph-rows.js';
|
|
@@ -31,14 +12,10 @@ import { loadCustomerNotes } from '../objects/customer-notes.js';
|
|
|
31
12
|
import { loadProjectBriefs } from '../objects/project-briefs.js';
|
|
32
13
|
import { assertTenantId } from '../store/tenant.js';
|
|
33
14
|
import { escapeRegex } from '../util/escape.js';
|
|
34
|
-
/** Per-type load cap (the loaders default to 100)
|
|
35
|
-
* set exceeds this is truncated; `ExtractResult.truncated` records it so the
|
|
36
|
-
* incompleteness is observable rather than silent. */
|
|
15
|
+
/** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
|
|
37
16
|
export const MAX_EXTRACT_PER_TYPE = 10000;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
* generic words; MAX skips prose (a decision's prose name is never a target, only a
|
|
41
|
-
* source). */
|
|
17
|
+
/** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
|
|
18
|
+
* (a decision's prose name is never a target, only a source). */
|
|
42
19
|
export const MIN_REF_NAME_LEN = 4;
|
|
43
20
|
export const MAX_REF_NAME_LEN = 80;
|
|
44
21
|
/** Per-source cap so one object cannot explode the graph with references edges. */
|
|
@@ -72,11 +49,8 @@ function sourceObjectOf(entityType, e2Id) {
|
|
|
72
49
|
function pairKey(a, b) {
|
|
73
50
|
return a < b ? `${a}:${b}` : `${b}:${a}`;
|
|
74
51
|
}
|
|
75
|
-
/**
|
|
76
|
-
*
|
|
77
|
-
* Loads ACTIVE + SUPERSEDED rows (excluding `closed` = retired) in one call per status, so
|
|
78
|
-
* MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full.
|
|
79
|
-
*/
|
|
52
|
+
/** Close over one loader's row type so the table below holds uniform functions. Loads ACTIVE and SUPERSEDED rows (not `closed`),
|
|
53
|
+
* one call per status, so MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full. */
|
|
80
54
|
function source(entityType, load, nameOf, textOf) {
|
|
81
55
|
return (hippoRoot, tenantId) => {
|
|
82
56
|
const rows = [];
|
|
@@ -127,7 +101,7 @@ function deriveEntities(loaded) {
|
|
|
127
101
|
pass.byType[entityType] = 0;
|
|
128
102
|
for (const row of rows) {
|
|
129
103
|
pass.allRows.push(row);
|
|
130
|
-
// Names are uncapped at source; trimming on both sides of the cap gives the exact name
|
|
104
|
+
// Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntityRow stores.
|
|
131
105
|
const name = (row.name ?? '').trim().slice(0, MAX_ENTITY_NAME_LEN).trim();
|
|
132
106
|
const key = keyOf(row.entityType, row.e2Id);
|
|
133
107
|
// A row seen twice was superseded between the two status loads; its first sighting stands.
|
|
@@ -246,7 +220,7 @@ export function extractGraph(hippoRoot, tenantId) {
|
|
|
246
220
|
// Loaded first: opening a second connection under the rebuild's BEGIN IMMEDIATE dead-locks ('database is locked').
|
|
247
221
|
const derived = deriveGraph(loadGraphSources(hippoRoot, tenantId));
|
|
248
222
|
// Diffed and applied under one lock, so two concurrent rebuilds serialize instead of both inserting a missing row.
|
|
249
|
-
const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb,
|
|
223
|
+
const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
|
|
250
224
|
return resultOf(derived, skipped);
|
|
251
225
|
}
|
|
252
226
|
/** extractGraph for sleep: diffs outside the lock, then applies in transactions of about `budget.holdMs` with a pause
|
|
@@ -263,7 +237,7 @@ export async function extractGraphChunked(hippoRoot, tenantId, budget = WRITE_BU
|
|
|
263
237
|
await budget.pause(committedAt);
|
|
264
238
|
const from = next;
|
|
265
239
|
// Sleep's wait, not a server request's 250 ms: each chunk is a fresh BEGIN IMMEDIATE a hook's write could otherwise fail.
|
|
266
|
-
const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb,
|
|
240
|
+
const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
|
|
267
241
|
committedAt = budget.clock();
|
|
268
242
|
next = chunk.next;
|
|
269
243
|
skipped += chunk.skipped;
|
package/dist/graph/recall.d.ts
CHANGED
|
@@ -17,9 +17,8 @@ export interface GraphExpandOpts {
|
|
|
17
17
|
tenantId: string;
|
|
18
18
|
/** Mirror the recall handler's hard filters when re-loading graph-reached rows. */
|
|
19
19
|
includeSuperseded?: boolean;
|
|
20
|
-
/** ISO date; bi-temporal as-of filter applied to graph-reached rows
|
|
21
|
-
*
|
|
22
|
-
* was not yet valid at asOf). */
|
|
20
|
+
/** ISO date; bi-temporal as-of filter applied to graph-reached rows, matching cmdRecall:
|
|
21
|
+
* visible if valid_from <= asOf and, when superseded, its successor was not yet valid at asOf. */
|
|
23
22
|
asOf?: string;
|
|
24
23
|
/** Token budget for the augmented set (defaults to DEFAULT_RECALL_BUDGET, matching recall). */
|
|
25
24
|
budget?: number;
|
|
@@ -28,28 +27,16 @@ export interface GraphExpandOpts {
|
|
|
28
27
|
/** The recall --min-results floor: this many top base rows are kept regardless of
|
|
29
28
|
* budget, so graph expansion never violates the floor. Defaults to 1. */
|
|
30
29
|
minResults?: number;
|
|
31
|
-
/** Recall-side
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* bare/SDK callers. { requested, additive: true } = CLI --scope unlock semantics
|
|
35
|
-
* (passesCliRecallScopeFilter); additive false/absent with requested set = api
|
|
36
|
-
* exact-narrowing semantics (passesScopeFilterForRecall). Base results are the
|
|
37
|
-
* caller's responsibility (they passed through the caller's own scope filter). */
|
|
30
|
+
/** Recall-side scope rule applied to graph-REACHED memories only (base results already passed the caller), mirroring HybridSearchOptions.recallScope.
|
|
31
|
+
* Omitted = default-deny (private and quarantine excluded, NULL passes), the fail-closed default for SDK callers.
|
|
32
|
+
* { requested, additive: true } is CLI --scope unlock (passesCliRecallScopeFilter); otherwise exact narrowing (passesScopeFilterForRecall). */
|
|
38
33
|
recallScope?: {
|
|
39
34
|
requested?: string;
|
|
40
35
|
additive?: boolean;
|
|
41
36
|
ownScope?: string;
|
|
42
37
|
};
|
|
43
38
|
}
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* the seed results' entities (across the local AND global stores). Each graph hit is
|
|
47
|
-
* inserted directly after the base result it descends from, scored just below that seed;
|
|
48
|
-
* the base list's own order is preserved. Token-budget-bounded; deduped against the base
|
|
49
|
-
* set and across stores.
|
|
50
|
-
*
|
|
51
|
-
* No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
|
|
52
|
-
* graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
|
|
53
|
-
*/
|
|
39
|
+
/** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
|
|
40
|
+
* Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
|
|
54
41
|
export declare function graphExpandRecall(baseResults: SearchResult[], opts: GraphExpandOpts): SearchResult[];
|
|
55
42
|
//# sourceMappingURL=recall.d.ts.map
|
package/dist/graph/recall.js
CHANGED
|
@@ -1,46 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* READ-ONLY consumer of the graph substrate (entities/relations built by graph-extract,
|
|
5
|
-
* guarded by the graph-on-consolidated triggers). Given the lexical recall seeds, walk the relations graph up to N
|
|
6
|
-
* hops and surface the memories of reached entities that the lexical search did not
|
|
7
|
-
* already return.
|
|
8
|
-
*
|
|
9
|
-
* Relation-type-AGNOSTIC: it walks whatever edges exist. Today the graph holds only
|
|
10
|
-
* `supersedes` edges (so a 1-hop walk surfaces a supersession-linked predecessor/
|
|
11
|
-
* successor a lexical search may miss); the moment extraction emits cross-object edges
|
|
12
|
-
* (owns/depends-on/blocked-by/references) the SAME traversal lights up cross-entity
|
|
13
|
-
* multi-hop with zero rework here.
|
|
14
|
-
*
|
|
15
|
-
* Design points:
|
|
16
|
-
* 1. Graph-reached memories are loaded DIRECTLY by id (tenant-scoped PK fetch), NOT
|
|
17
|
-
* intersected with the recall handler's candidate set — that set is lexically
|
|
18
|
-
* prefiltered (loadSearchRows filters by query tokens), so intersecting would exclude
|
|
19
|
-
* exactly the lexically-orthogonal neighbours graph recall exists to surface. We
|
|
20
|
-
* re-apply the recall HARD filters to the directly-loaded rows: the FULL bi-temporal
|
|
21
|
-
* as-of rule (valid_from <= asOf AND, for a superseded row, successor.valid_from >
|
|
22
|
-
* asOf — same as cmdRecall) and the default superseded-drop. SCOPE is intentionally
|
|
23
|
-
* NOT re-applied: the CLI caller (cmdRecall) does not hard-filter scope either (it
|
|
24
|
-
* only soft-boosts it). Rows are tenant-scoped + archived-excluded (loadEntriesByIds).
|
|
25
|
-
* 2. A graph hit inherits its origin seed's relevance (minus a per-hop discount) and is
|
|
26
|
-
* placed adjacent to that seed; budget selection is by score so a high-value hit wins
|
|
27
|
-
* a token slot over a noise distractor. Dead-last appending made the feature do
|
|
28
|
-
* nothing at realistic budgets.
|
|
29
|
-
* 3. BOTH the local and global stores are expanded — a global seed's entities/relations
|
|
30
|
-
* live under the global root, so graph recall must traverse each seed in the store its
|
|
31
|
-
* graph lives in.
|
|
32
|
-
* 4. By-id loads are chunked at 500 (loadEntriesByIds caps at 500/call), so a high-fanout
|
|
33
|
-
* traversal (--hops 3 --max-neighbors 200 -> up to 600 ids) loses none.
|
|
34
|
-
*
|
|
35
|
-
* No graph writes (only SELECTs via graph.ts read helpers + store reads), so the
|
|
36
|
-
* check-graph-writes lint permits this module living outside graph.ts.
|
|
37
|
-
*/
|
|
1
|
+
/** Multi-hop graph recall: a READ-ONLY walk of the relations graph from the lexical seeds, surfacing reached entities' memories the lexical search missed.
|
|
2
|
+
* Reached rows load by id (not intersected with the lexically prefiltered candidates), then the recall hard filters are re-applied.
|
|
3
|
+
* Hits inherit their seed's score minus a per-hop discount; both stores are expanded; no writes, so check-graph-writes permits it outside graph.ts. */
|
|
38
4
|
import { loadEntriesByIds } from '../store/entry-reads.js';
|
|
39
5
|
import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
40
6
|
import { estimateTokens } from '../util/token-text.js';
|
|
41
7
|
import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
|
|
42
8
|
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
|
|
43
|
-
import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../
|
|
9
|
+
import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../core/recall-scope.js';
|
|
44
10
|
/** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
|
|
45
11
|
* worst-case work and keeps the flag honest). */
|
|
46
12
|
export const MAX_HOPS = 3;
|
|
@@ -63,14 +29,10 @@ function loadByIdsChunked(root, tenantId, ids) {
|
|
|
63
29
|
}
|
|
64
30
|
/** BFS, both directions, up to `hops`: each reached entity's via, and the base memory it descends from. */
|
|
65
31
|
function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
|
|
66
|
-
// `visited`
|
|
67
|
-
// `originMemByEntityId` propagates the base-result memory id each reached node descends
|
|
68
|
-
// from (for adjacency placement + score inheritance).
|
|
32
|
+
// `visited` makes expansion cycle-safe; `originMemByEntityId` carries each node's base-result memory id for adjacency placement and score inheritance.
|
|
69
33
|
const visitedEntityIds = new Set(seedEntities.map((e) => e.id));
|
|
70
34
|
const reached = new Map();
|
|
71
|
-
// A seed/reached entity whose mirror was forgotten
|
|
72
|
-
// tolerates null so traversal still propagates origin, and the null is dropped before
|
|
73
|
-
// any memory load below (a mirror-less node has no memory to surface).
|
|
35
|
+
// A seed/reached entity whose mirror was forgotten or pruned has a null memoryId; traversal still propagates origin and the null is dropped before any load.
|
|
74
36
|
const originMemByEntityId = new Map();
|
|
75
37
|
for (const se of seedEntities)
|
|
76
38
|
originMemByEntityId.set(se.id, se.memoryId);
|
|
@@ -117,11 +79,8 @@ function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
|
|
|
117
79
|
/** The recall hard filters (as-of, superseded, scope) re-applied to a directly loaded graph-reached row. */
|
|
118
80
|
function passesRecallFilters(mem, via, successorValidFrom, opts) {
|
|
119
81
|
const { includeSuperseded, asOfDate, recallScope } = opts;
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
// `superseded_by` is NOT set by `hippo decide`, only the decisions table is). By
|
|
123
|
-
// default recall shows current truth, so drop it unless --include-superseded; the
|
|
124
|
-
// `from` endpoint (the newer successor) is always kept.
|
|
82
|
+
// The `to` endpoint of a `supersedes` edge IS the superseded version; the graph is authoritative because `hippo decide` does not set `superseded_by`.
|
|
83
|
+
// Drop it unless --include-superseded; the newer `from` endpoint is always kept.
|
|
125
84
|
const isSupersededEndpoint = via.relType === 'supersedes' && via.direction === 'to';
|
|
126
85
|
if (asOfDate) {
|
|
127
86
|
if (new Date(mem.valid_from) > asOfDate)
|
|
@@ -187,10 +146,8 @@ function buildGraphHit(mem, via, originScore) {
|
|
|
187
146
|
graphVia: via,
|
|
188
147
|
};
|
|
189
148
|
}
|
|
190
|
-
// Reached entities -> source memory ids -> load
|
|
191
|
-
//
|
|
192
|
-
// id BEFORE it reaches loadByIdsChunked / the Set<string> (it cannot be recall-surfaced;
|
|
193
|
-
// it stays in entities/relations for graph extract / visualization).
|
|
149
|
+
// Reached entities -> source memory ids -> load by id (chunked). A mirror-less entity (memoryId === null) has no memory to surface,
|
|
150
|
+
// so drop its null id before it reaches loadByIdsChunked.
|
|
194
151
|
function loadReachedMemories(root, tenantId, reachedEntities, seenMemoryIds) {
|
|
195
152
|
const needLoad = [...new Set(reachedEntities
|
|
196
153
|
.map((e) => e.memoryId)
|
|
@@ -205,16 +162,8 @@ function loadSuccessorValidFrom(root, tenantId, loadedById, asOfDate) {
|
|
|
205
162
|
const succIds = [...new Set([...loadedById.values()].map((m) => m.superseded_by).filter((id) => !!id))];
|
|
206
163
|
return new Map(loadByIdsChunked(root, tenantId, succIds).map((m) => [m.id, m.valid_from]));
|
|
207
164
|
}
|
|
208
|
-
/**
|
|
209
|
-
*
|
|
210
|
-
* the seed results' entities (across the local AND global stores). Each graph hit is
|
|
211
|
-
* inserted directly after the base result it descends from, scored just below that seed;
|
|
212
|
-
* the base list's own order is preserved. Token-budget-bounded; deduped against the base
|
|
213
|
-
* set and across stores.
|
|
214
|
-
*
|
|
215
|
-
* No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
|
|
216
|
-
* graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
|
|
217
|
-
*/
|
|
165
|
+
/** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
|
|
166
|
+
* Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
|
|
218
167
|
export function graphExpandRecall(baseResults, opts) {
|
|
219
168
|
const { hops, hippoRoot, globalRoot, tenantId } = opts;
|
|
220
169
|
if (hops <= 0 || baseResults.length === 0)
|
|
@@ -242,9 +191,7 @@ export function graphExpandRecall(baseResults, opts) {
|
|
|
242
191
|
return mergeKeptHits(baseResults, hitsByOrigin, keep);
|
|
243
192
|
}
|
|
244
193
|
function sortHitsWithinOrigin(hitsByOrigin) {
|
|
245
|
-
// Closer hops first within each origin group, then by inherited score.
|
|
246
|
-
// Hops asc and score desc are both true primary keys (unchanged);
|
|
247
|
-
// compareEntryIdentity is only the TAIL for a same-hop, same-score tie.
|
|
194
|
+
// Closer hops first within each origin group, then by inherited score; compareEntryIdentity only breaks same-hop, same-score ties.
|
|
248
195
|
for (const hits of hitsByOrigin.values()) {
|
|
249
196
|
hits.sort((a, b) => {
|
|
250
197
|
const byHops = a.graphVia.hops - b.graphVia.hops;
|
|
@@ -258,17 +205,8 @@ function sortHitsWithinOrigin(hitsByOrigin) {
|
|
|
258
205
|
function selectWithinBudget(baseResults, allHits, opts) {
|
|
259
206
|
const budget = opts.budget ?? DEFAULT_RECALL_BUDGET;
|
|
260
207
|
const minResults = opts.minResults ?? 1;
|
|
261
|
-
// Budget
|
|
262
|
-
//
|
|
263
|
-
// distractor — otherwise a tight --budget keeps the noise and drops the memory --hops
|
|
264
|
-
// surfaced. The greedy pack uses `continue` (not `break`), so a hit's origin seed is
|
|
265
|
-
// NOT guaranteed kept just because the hit is; the DISPLAY loop guards that (a hit is
|
|
266
|
-
// emitted ONLY under a kept seed, never orphaned). At least one result is always kept.
|
|
267
|
-
// (NOTE: at a tight budget a new graph hit can displace a weakly-scored base result;
|
|
268
|
-
// aggregate recall stays >= baseline, the displaced item is the lowest-value one.)
|
|
269
|
-
// Protect the top --min-results base rows from eviction (graph expansion must not
|
|
270
|
-
// violate the recall min-results floor). They are kept regardless of budget;
|
|
271
|
-
// baseResults is score-ordered, so slice(0, N) is the top N.
|
|
208
|
+
// Budget selection is by score, not position, so a high-value graph hit can beat a low-score lexical distractor; the greedy pack uses `continue`,
|
|
209
|
+
// so the DISPLAY loop emits a hit only under a kept seed. The top --min-results base rows are never evicted; at least one result is kept.
|
|
272
210
|
const protectedCount = Math.min(Math.max(minResults, 1), baseResults.length);
|
|
273
211
|
const keep = new Set(baseResults.slice(0, protectedCount));
|
|
274
212
|
const price = opts.cost ?? ((r) => r.tokens);
|
package/dist/graph/stream.d.ts
CHANGED
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* READ-ONLY consumer of the entity/relation graph. Produces a ranked list of
|
|
5
|
-
* `entries[]` indices ordered by graph
|
|
6
|
-
* proximity to the strong lexical seeds, for use as a 3rd fusion input to `rrfFuse`
|
|
7
|
-
* beside BM25 + dense (src/search.ts hybridSearch, scoring:'rrf').
|
|
8
|
-
*
|
|
9
|
-
* DISTINCT from graph-recall.ts: that INJECTS out-of-pool neighbours post-hoc; this
|
|
10
|
-
* RE-RANKS within the already-filtered candidate pool. It only assigns ranks to
|
|
11
|
-
* entries that are (a) graph-reached from a seed AND (b) present in `entries[]`. Seeds
|
|
12
|
-
* themselves are never scored (they already rank via BM25/dense; scoring them would
|
|
13
|
-
* double-count and dilute the orthogonal graph signal).
|
|
14
|
-
*
|
|
15
|
-
* Reuses the BFS traversal shape from graph-recall.ts (loadEntitiesByMemoryId
|
|
16
|
-
* seeds -> loadNeighborRelations BFS both directions, per-hop fanout cap, visited set
|
|
17
|
-
* -> loadEntitiesByIds to resolve reached -> memoryId). Expands across the local AND
|
|
18
|
-
* global stores. Pure reads (SELECTs only via graph.ts helpers), so the
|
|
19
|
-
* check-graph-writes lint permits this module living outside graph.ts.
|
|
20
|
-
*
|
|
21
|
-
* The graph stream's score scale (1/lexRank seed strength x decay^hops) only sets the
|
|
22
|
-
* WITHIN-graph-stream ORDERING; RRF then re-ranks the list by 1/(k + graphRank), so the
|
|
23
|
-
* absolute magnitude is washed out by fusion. Do not tune the scale expecting a
|
|
24
|
-
* fused-score effect — only the induced order matters.
|
|
25
|
-
*/
|
|
1
|
+
/** Graph-retrieval ranked-list stream for RRF fusion: READ-ONLY, ranks `entries[]` indices by graph proximity to the strong lexical seeds.
|
|
2
|
+
* Unlike graph recall it only re-ranks in-pool, graph-reached, non-seed entries; scoring seeds would double-count BM25/dense.
|
|
3
|
+
* The score scale only sets the order inside this stream (RRF re-ranks by 1/(k + graphRank)), so do not tune it for a fused-score effect. */
|
|
26
4
|
import type { MemoryEntry } from '../core/memory.js';
|
|
27
|
-
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph
|
|
5
|
+
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
|
|
28
6
|
export declare const DEFAULT_GRAPH_HOPS = 2;
|
|
29
7
|
/** Default per-hop multiplicative decay applied to the seed strength. */
|
|
30
8
|
export declare const DEFAULT_GRAPH_DECAY = 0.5;
|
|
@@ -52,19 +30,9 @@ export interface GraphStreamOpts {
|
|
|
52
30
|
/** Per-hop fanout cap. Default DEFAULT_MAX_NEIGHBORS. */
|
|
53
31
|
maxNeighbors?: number;
|
|
54
32
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Pick the top `seedCount` candidates by best lexical rank (lowest position across the
|
|
57
|
-
* BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
|
|
58
|
-
* direct unit testing. A candidate present in either ranked list is eligible.
|
|
59
|
-
*/
|
|
33
|
+
/** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
|
|
60
34
|
export declare function selectGraphSeeds(bm25Ranked: ReadonlyArray<number>, cosineRanked: ReadonlyArray<number>, seedCount: number): GraphSeed[];
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
* proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
|
|
64
|
-
* indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
|
|
65
|
-
*
|
|
66
|
-
* Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
|
|
67
|
-
* entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
|
|
68
|
-
*/
|
|
35
|
+
/** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
|
|
36
|
+
* Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
|
|
69
37
|
export declare function graphRankStream(entries: ReadonlyArray<MemoryEntry>, seeds: ReadonlyArray<GraphSeed>, opts: GraphStreamOpts): number[];
|
|
70
38
|
//# sourceMappingURL=stream.d.ts.map
|
package/dist/graph/stream.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
|
|
2
2
|
import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './recall.js';
|
|
3
|
-
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph
|
|
3
|
+
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
|
|
4
4
|
export const DEFAULT_GRAPH_HOPS = 2;
|
|
5
5
|
/** Default per-hop multiplicative decay applied to the seed strength. */
|
|
6
6
|
export const DEFAULT_GRAPH_DECAY = 0.5;
|
|
@@ -9,11 +9,7 @@ export const DEFAULT_GRAPH_SEED_COUNT = 10;
|
|
|
9
9
|
/** Recommended RRF weight for the graph stream — a CLI-only convenience default. The
|
|
10
10
|
* library `graphStream.weight` option stays REQUIRED (opt-in is explicit). */
|
|
11
11
|
export const DEFAULT_GRAPH_STREAM_WEIGHT = 0.5;
|
|
12
|
-
/**
|
|
13
|
-
* Pick the top `seedCount` candidates by best lexical rank (lowest position across the
|
|
14
|
-
* BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
|
|
15
|
-
* direct unit testing. A candidate present in either ranked list is eligible.
|
|
16
|
-
*/
|
|
12
|
+
/** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
|
|
17
13
|
export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
|
|
18
14
|
if (seedCount <= 0)
|
|
19
15
|
return [];
|
|
@@ -33,11 +29,8 @@ export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
|
|
|
33
29
|
.slice(0, seedCount)
|
|
34
30
|
.map(([index, best]) => ({ index, strength: 1 / (best + 1) }));
|
|
35
31
|
}
|
|
36
|
-
// Pass 1:
|
|
37
|
-
//
|
|
38
|
-
// visited mid-loop would lock it to whichever relation SQLite returned first, so a later
|
|
39
|
-
// edge from a STRONGER lexical seed would be dropped and the neighbour mis-scored. A node
|
|
40
|
-
// already in `visited` was committed at an earlier (shorter) depth and keeps that score.
|
|
32
|
+
// Pass 1: take the STRONGEST reaching-seed strength per new neighbour across ALL relations at this depth before committing any to `visited`;
|
|
33
|
+
// marking mid-loop would lock a node to whichever relation SQLite returned first and drop a stronger seed's later edge.
|
|
41
34
|
function bestStrengthAtDepth(rels, frontierSet, visited, frontierStrength, originStrength) {
|
|
42
35
|
const bestStrengthThisDepth = new Map();
|
|
43
36
|
for (const rel of rels) {
|
|
@@ -98,13 +91,8 @@ function reachedEntityScores(root, tenantId, seedIds, originStrength, options) {
|
|
|
98
91
|
}
|
|
99
92
|
return reachedScore;
|
|
100
93
|
}
|
|
101
|
-
/**
|
|
102
|
-
*
|
|
103
|
-
* `graphScore`. Pure reads. `seeds` are the lexical seeds (index + strength); only the
|
|
104
|
-
* seeds whose entities live in THIS store are expanded. The origin seed strength is
|
|
105
|
-
* carried UNCHANGED along each BFS path; the per-hop decay is applied as decay^depth so
|
|
106
|
-
* a neighbour's score = originSeedStrength x decay^(graph distance).
|
|
107
|
-
*/
|
|
94
|
+
/** Accumulate per-entryIndex graph-proximity scores from ONE store's graph into `graphScore`; only seeds whose entities live in THIS store are expanded.
|
|
95
|
+
* A neighbour's score = originSeedStrength x decay^(graph distance); the seed strength is carried unchanged along each BFS path. */
|
|
108
96
|
function accumulateForRoot(root, seeds, entries, options) {
|
|
109
97
|
const { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId } = options;
|
|
110
98
|
if (seeds.length === 0)
|
|
@@ -119,9 +107,7 @@ function accumulateForRoot(root, seeds, entries, options) {
|
|
|
119
107
|
const seedEntities = loadEntitiesByMemoryId(root, tenantId, [...strengthByMemId.keys()]);
|
|
120
108
|
if (seedEntities.length === 0)
|
|
121
109
|
return;
|
|
122
|
-
// entityId -> origin seed strength
|
|
123
|
-
// loaded by memory id, so its memoryId is non-null here; the guard keeps the widened
|
|
124
|
-
// (string | null) type honest (a null-memory entity is not a lexical seed).
|
|
110
|
+
// entityId -> origin seed strength. Seeds load by memory id so memoryId is non-null here; the guard keeps the widened (string | null) type honest.
|
|
125
111
|
const originStrength = new Map();
|
|
126
112
|
for (const e of seedEntities) {
|
|
127
113
|
if (e.memoryId === null)
|
|
@@ -146,14 +132,8 @@ function accumulateForRoot(root, seeds, entries, options) {
|
|
|
146
132
|
graphScore.set(idx, Math.max(graphScore.get(idx) ?? 0, score));
|
|
147
133
|
}
|
|
148
134
|
}
|
|
149
|
-
/**
|
|
150
|
-
*
|
|
151
|
-
* proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
|
|
152
|
-
* indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
|
|
153
|
-
*
|
|
154
|
-
* Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
|
|
155
|
-
* entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
|
|
156
|
-
*/
|
|
135
|
+
/** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
|
|
136
|
+
* Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
|
|
157
137
|
export function graphRankStream(entries, seeds, opts) {
|
|
158
138
|
if (seeds.length === 0 || entries.length === 0)
|
|
159
139
|
return [];
|
|
@@ -170,11 +150,8 @@ export function graphRankStream(entries, seeds, opts) {
|
|
|
170
150
|
for (const root of roots) {
|
|
171
151
|
accumulateForRoot(root, seeds, entries, { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId: opts.tenantId });
|
|
172
152
|
}
|
|
173
|
-
// Seed-exclusion guard: graphScore is keyed by entryIndex
|
|
174
|
-
//
|
|
175
|
-
// is a seed in one store could be reached as a neighbour in the other store and pick up
|
|
176
|
-
// a score via max(). Drop every seed index so the "seeds are never scored by the graph
|
|
177
|
-
// stream" invariant holds across roots, not just within a single store's traversal.
|
|
153
|
+
// Seed-exclusion guard: graphScore is keyed by entryIndex across roots but each root's visited-set is per-root, so a seed in one store
|
|
154
|
+
// could score as a neighbour in the other; drop every seed index so "seeds are never graph-scored" holds across roots.
|
|
178
155
|
for (const s of seeds)
|
|
179
156
|
graphScore.delete(s.index);
|
|
180
157
|
if (graphScore.size === 0)
|