hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- 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 +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- 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 +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- 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/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- 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 +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- 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 +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → 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 +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- 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/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// The global store: where it lives, creating it, and copying a local memory into it.
|
|
2
|
+
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { generateId } from '../core/memory.js';
|
|
5
|
+
import { initStore } from '../store/open.js';
|
|
6
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
7
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
8
|
+
import { isPersonalScope } from '../store/recall-scope.js';
|
|
9
|
+
import { fallbackOrigin, resolveGlobalRootDir } from '../core/project-identity.js';
|
|
10
|
+
import { isSharedStore } from '../core/config.js';
|
|
11
|
+
import { detectSecret } from '../util/secret-detect.js';
|
|
12
|
+
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
13
|
+
import { embedMemory } from '../store/embeddings/index.js';
|
|
14
|
+
import { appendAuditEvent } from '../store/audit.js';
|
|
15
|
+
/** Returns the path to the global Hippo store.
|
|
16
|
+
* Resolution order: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/ */
|
|
17
|
+
export function getGlobalRoot() {
|
|
18
|
+
// Single source of truth lives in project-identity.ts (leaf) so db migrations
|
|
19
|
+
// can resolve the same path without a shared.ts import cycle.
|
|
20
|
+
return resolveGlobalRootDir();
|
|
21
|
+
}
|
|
22
|
+
/** Ensure the global store exists. */
|
|
23
|
+
export function initGlobal() {
|
|
24
|
+
const globalRoot = getGlobalRoot();
|
|
25
|
+
if (!fs.existsSync(globalRoot)) {
|
|
26
|
+
initStore(globalRoot);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Ensure subdirectories exist in case partially initialized
|
|
30
|
+
initStore(globalRoot);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The copy's write hook: the `promote` row when asked for, then the caller's own hook, both in the copy's transaction. */
|
|
34
|
+
function promoteHook(sourceId, auditAs, afterWrite) {
|
|
35
|
+
if (!auditAs)
|
|
36
|
+
return afterWrite;
|
|
37
|
+
return (db, globalId) => {
|
|
38
|
+
appendAuditEvent(db, { tenantId: auditAs.tenantId, actor: auditAs.actor, op: 'promote', targetId: globalId, metadata: { sourceId } });
|
|
39
|
+
afterWrite?.(db, globalId);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
|
|
43
|
+
export function promoteToGlobal(localRoot, id, opts) {
|
|
44
|
+
const entry = readEntry(localRoot, id, opts?.tenantId);
|
|
45
|
+
if (!entry)
|
|
46
|
+
throw new NotFoundError(`Memory not found: ${id}`);
|
|
47
|
+
// Same quarantine veto as shareMemory; a promoted copy would have no quarantine record to review.
|
|
48
|
+
if (isQuarantineScope(entry.scope)) {
|
|
49
|
+
throw new BadRequestError(`Refusing to promote ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ${id}'.`);
|
|
50
|
+
}
|
|
51
|
+
if (isPersonalScope(entry.scope ?? null)) {
|
|
52
|
+
throw new BadRequestError(`Refusing to promote ${id}: it is a personal memory and stays with its owner on this server.`);
|
|
53
|
+
}
|
|
54
|
+
// Secret producer veto: promote is a producer path to the global store
|
|
55
|
+
// exactly like shareMemory - same hard rule.
|
|
56
|
+
const promoteSecret = detectSecret(entry);
|
|
57
|
+
if (promoteSecret.flagged) {
|
|
58
|
+
throw new BadRequestError(`Refusing to promote ${id} to the global store: content matches secret material (${promoteSecret.reason}). ` +
|
|
59
|
+
`Secrets stay in their owning project's store.`);
|
|
60
|
+
}
|
|
61
|
+
initGlobal();
|
|
62
|
+
const globalRoot = getGlobalRoot();
|
|
63
|
+
// A project store's NULL row gets its folder back; a shared store's folder is no caller's project, so NULL stays and the label names no path.
|
|
64
|
+
const globalEntry = {
|
|
65
|
+
...entry,
|
|
66
|
+
id: generateId('g'),
|
|
67
|
+
source: isSharedStore(localRoot) ? `shared::${new Date().toISOString()}` : `promoted:${localRoot}`,
|
|
68
|
+
origin_project: entry.origin_project ?? fallbackOrigin(localRoot),
|
|
69
|
+
};
|
|
70
|
+
writeEntry(globalRoot, globalEntry, { actor: opts?.actor, afterWrite: promoteHook(id, opts?.auditAs, opts?.afterWrite) });
|
|
71
|
+
// Fire-and-forget: embedMemory gates on availability and never rejects.
|
|
72
|
+
void embedMemory(globalRoot, globalEntry);
|
|
73
|
+
return globalEntry;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=global-store.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Copy all global memories into the local store, skipping entries that already exist locally by ID or text (promote and share copy under a new ID).
|
|
2
|
+
* Returns the count of newly copied entries. */
|
|
3
|
+
export declare function syncGlobalToLocal(localRoot: string, globalRoot: string, opts?: {
|
|
4
|
+
includeCrossProject?: boolean;
|
|
5
|
+
}): number;
|
|
6
|
+
//# sourceMappingURL=global-sync.d.ts.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Copying the global store's memories down into a local store.
|
|
2
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { AGENT_MEMORY_SOURCE_PREFIX } from '../core/agent-memory-tools.js';
|
|
6
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
7
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
8
|
+
import { classifyOriginProject, resolveProjectIdentity } from '../core/project-identity.js';
|
|
9
|
+
import { isSharedStore } from '../core/config.js';
|
|
10
|
+
import { detectSecret } from '../util/secret-detect.js';
|
|
11
|
+
import { RejectedValueError } from '../store/rejection.js';
|
|
12
|
+
import { embedAll } from '../store/embeddings/index.js';
|
|
13
|
+
import { log } from '../util/log.js';
|
|
14
|
+
import { logEmbedAllFailure } from './search-both.js';
|
|
15
|
+
/** Copy all global memories into the local store, skipping entries that already exist locally by ID or text (promote and share copy under a new ID).
|
|
16
|
+
* Returns the count of newly copied entries. */
|
|
17
|
+
export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
|
|
18
|
+
if (isSharedStore(localRoot)) {
|
|
19
|
+
throw new BadRequestError(`Refusing to sync into ${localRoot}: a shared store takes no copies of a personal global store, whose rows would reach every member.`);
|
|
20
|
+
}
|
|
21
|
+
if (!fs.existsSync(globalRoot))
|
|
22
|
+
return 0;
|
|
23
|
+
// Host-wide read: the global union is copied into a tenant-scoped local store, and writeEntry carries the tenant if the local-root context has one.
|
|
24
|
+
const globalEntries = loadAllEntries(globalRoot);
|
|
25
|
+
const textKey = (e) => `${e.tenantId}\n${e.content}`;
|
|
26
|
+
const localEntries = loadAllEntries(localRoot);
|
|
27
|
+
const localIds = new Set(localEntries.map((e) => e.id));
|
|
28
|
+
const localText = new Set(localEntries.map(textKey));
|
|
29
|
+
// Syncing down must not re-import what ambient context excludes: other-project rows are skipped by default and secret rows never copied.
|
|
30
|
+
// origin_project is preserved on the copy (writeEntry stamps it only when missing).
|
|
31
|
+
const currentProject = resolveProjectIdentity(path.dirname(path.resolve(localRoot)));
|
|
32
|
+
let count = 0;
|
|
33
|
+
// A locally rejected value must not come back through sync down: caught per item, printed as one line.
|
|
34
|
+
let rejected = 0;
|
|
35
|
+
for (const entry of globalEntries) {
|
|
36
|
+
// Skip if already present by ID
|
|
37
|
+
if (localIds.has(entry.id))
|
|
38
|
+
continue;
|
|
39
|
+
// Only the global store's user pass sets an imported note's row aside, so a copy would outlive the note.
|
|
40
|
+
if (entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX))
|
|
41
|
+
continue;
|
|
42
|
+
if (localText.has(textKey(entry)))
|
|
43
|
+
continue;
|
|
44
|
+
if (detectSecret(entry).flagged)
|
|
45
|
+
continue;
|
|
46
|
+
if (!opts.includeCrossProject && classifyOriginProject(entry.origin_project, currentProject) === 'cross-project')
|
|
47
|
+
continue;
|
|
48
|
+
if (!writeUnlessRejected(localRoot, entry)) {
|
|
49
|
+
rejected++;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
localText.add(textKey(entry));
|
|
53
|
+
count++;
|
|
54
|
+
}
|
|
55
|
+
finishSyncDown(localRoot, count, rejected);
|
|
56
|
+
return count;
|
|
57
|
+
}
|
|
58
|
+
/** False when the local store rejects the value; any other failure still throws. */
|
|
59
|
+
function writeUnlessRejected(localRoot, entry) {
|
|
60
|
+
try {
|
|
61
|
+
writeEntry(localRoot, entry);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof RejectedValueError)
|
|
66
|
+
return false;
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function finishSyncDown(localRoot, count, rejected) {
|
|
71
|
+
if (rejected > 0) {
|
|
72
|
+
log.warn(`syncGlobalToLocal: skipped ${rejected} rejected value(s) (run \`hippo unreject\` on the local store to allow).`);
|
|
73
|
+
}
|
|
74
|
+
// Batch producer: one embedAll() on the destination rather than an
|
|
75
|
+
// embedMemory() per copied row (same batching invariant as autoShare).
|
|
76
|
+
if (count > 0) {
|
|
77
|
+
void embedAll(localRoot).catch((err) => logEmbedAllFailure('syncGlobalToLocal', err));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=global-sync.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
export interface ProjectSummary {
|
|
3
3
|
/** '' is user-global, null is unknown; neither can be merged. */
|
|
4
4
|
readonly origin: string | null;
|
|
@@ -59,15 +59,14 @@ export declare function mergeProjects(db: DatabaseSyncLike, hippoRoot: string, o
|
|
|
59
59
|
export declare function namesFoldedInto(db: DatabaseSyncLike, tenantId: string, names: readonly string[]): string[];
|
|
60
60
|
/** Reads only, so doctor and a dry run take no write lock; merged rows are planned before any fold, so a few may re-tag differently once folds apply. */
|
|
61
61
|
export declare function planProjectRepair(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, globalFolds?: boolean): Omit<RepairResult, 'backup'>;
|
|
62
|
-
/** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
|
|
62
|
+
/** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
|
|
63
|
+
* re-tags sleep's user-global merges by their parents; a dry run only plans. */
|
|
63
64
|
export declare function repairProjects(db: DatabaseSyncLike, hippoRoot: string, opts: {
|
|
64
65
|
tenantId: string;
|
|
65
66
|
dryRun: boolean;
|
|
66
67
|
globalFolds?: boolean;
|
|
67
68
|
}): RepairResult;
|
|
68
|
-
/**
|
|
69
|
-
*
|
|
70
|
-
* with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
|
|
71
|
-
*/
|
|
69
|
+
/** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
|
|
70
|
+
* with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted. */
|
|
72
71
|
export declare function repairOnceOnSleep(db: DatabaseSyncLike, hippoRoot: string, tenantId: string): RepairResult | null;
|
|
73
72
|
//# sourceMappingURL=project-merge.d.ts.map
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
// `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible pass.
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
|
-
import { setAsideRow } from '
|
|
5
|
-
import { transcriptNotesProject } from '
|
|
6
|
-
import { containerId, containerPrefix } from '
|
|
7
|
-
import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from '
|
|
8
|
-
import { appendAuditEvent, queryAuditEvents } from '
|
|
9
|
-
import { isSharedStore } from '
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
4
|
+
import { setAsideRow } from '../agent-memories/apply.js';
|
|
5
|
+
import { transcriptNotesProject } from '../agent-memories/claude-code.js';
|
|
6
|
+
import { containerId, containerPrefix } from '../agent-memories/source.js';
|
|
7
|
+
import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from '../core/agent-memory-tools.js';
|
|
8
|
+
import { appendAuditEvent, queryAuditEvents } from '../store/audit.js';
|
|
9
|
+
import { isSharedStore } from '../core/config.js';
|
|
10
|
+
import { withTrialScope, withWriteScope } from '../db/index.js';
|
|
11
|
+
import { withBackup } from '../db/backup.js';
|
|
12
|
+
import { getMeta, setMeta } from '../db/meta.js';
|
|
13
|
+
import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from '../store/dormant.js';
|
|
14
|
+
import { processEnv } from '../util/env.js';
|
|
15
|
+
import { calculateStrength } from '../core/memory.js';
|
|
16
|
+
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
17
|
+
import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
|
|
18
|
+
import { duplicateKey } from '../util/same-text.js';
|
|
19
|
+
import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from '../store/compactions.js';
|
|
20
|
+
import { removeEntryMirrors } from '../store/mirrors.js';
|
|
21
|
+
import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from '../store/entry-writes.js';
|
|
22
|
+
import { selectAllEntries, selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
21
23
|
const ACTOR = 'cli';
|
|
22
24
|
function isImport(entry) {
|
|
23
25
|
return entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX);
|
|
@@ -50,19 +52,7 @@ export function listProjects(db, tenantId) {
|
|
|
50
52
|
}).sort((a, b) => b.newest.localeCompare(a.newest));
|
|
51
53
|
}
|
|
52
54
|
function inTransaction(db, dryRun, body) {
|
|
53
|
-
|
|
54
|
-
try {
|
|
55
|
-
const out = body();
|
|
56
|
-
db.exec(dryRun ? 'ROLLBACK' : 'COMMIT');
|
|
57
|
-
return out;
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
try {
|
|
61
|
-
db.exec('ROLLBACK');
|
|
62
|
-
}
|
|
63
|
-
catch { /* already rolled back; keep the original error */ }
|
|
64
|
-
throw err;
|
|
65
|
-
}
|
|
55
|
+
return dryRun ? withTrialScope(db, 'merge_projects', body) : withWriteScope(db, 'merge_projects', body);
|
|
66
56
|
}
|
|
67
57
|
/** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
|
|
68
58
|
export function validateMergeNames(from, into) {
|
|
@@ -103,8 +93,7 @@ function foldInTx(db, tenantId, from, into) {
|
|
|
103
93
|
}
|
|
104
94
|
const gone = new Set(setAside);
|
|
105
95
|
const restamped = rows.filter((e) => !gone.has(e.id)).map((e) => e.id);
|
|
106
|
-
db
|
|
107
|
-
.run(into, tenantId, from);
|
|
96
|
+
restampOriginProjectAt(db, tenantId, from, into);
|
|
108
97
|
const dormantRestamped = [];
|
|
109
98
|
for (const snap of listDormantSnapshots(db, tenantId)) {
|
|
110
99
|
if (snap.entry.origin_project !== from || gone.has(snap.entry.id))
|
|
@@ -112,8 +101,7 @@ function foldInTx(db, tenantId, from, into) {
|
|
|
112
101
|
replaceDormantEntry(db, tenantId, snap.entry.id, { ...snap.entry, origin_project: into });
|
|
113
102
|
dormantRestamped.push(snap.entry.id);
|
|
114
103
|
}
|
|
115
|
-
const compactions =
|
|
116
|
-
.run(into, tenantId, from).changes ?? 0);
|
|
104
|
+
const compactions = restampCompactionOrigin(db, tenantId, from, into);
|
|
117
105
|
return { setAside, restamped, dormantRestamped, compactions };
|
|
118
106
|
}
|
|
119
107
|
/** Tool, note key and hash of an import, without the container, whose id hashes the project name. */
|
|
@@ -127,16 +115,15 @@ function importCopies(db, tenantId) {
|
|
|
127
115
|
const userGlobal = new Set(live.filter((e) => e.origin_project === '').map((e) => duplicateKey(e.content)));
|
|
128
116
|
return live.filter((e) => e.origin_project && e.kind !== 'raw' && !e.pinned && toolTag(e.source) !== null && userGlobal.has(duplicateKey(e.content)));
|
|
129
117
|
}
|
|
130
|
-
/** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
|
|
118
|
+
/** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
|
|
119
|
+
* notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
|
|
131
120
|
function strayImports(db, hippoRoot, tenantId) {
|
|
132
121
|
const copies = importCopies(db, tenantId);
|
|
133
122
|
if (!isGlobalStoreRoot(hippoRoot))
|
|
134
123
|
return copies;
|
|
135
124
|
const machine = { platform: process.platform, env: processEnv() };
|
|
136
125
|
const { platform } = machine;
|
|
137
|
-
|
|
138
|
-
const sessions = db.prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path IS NOT NULL`)
|
|
139
|
-
.all(tenantId);
|
|
126
|
+
const sessions = compactionTranscripts(db, tenantId);
|
|
140
127
|
const owners = new Map();
|
|
141
128
|
for (const { transcript, cwd } of sessions) {
|
|
142
129
|
const project = transcriptNotesProject(transcript, cwd, machine);
|
|
@@ -172,9 +159,7 @@ function planFolds(db, hippoRoot, tenantId, globalFolds) {
|
|
|
172
159
|
const chosen = new Set(queryAuditEvents(db, { tenantId, op: 'project_merge', limit: 10000 }).map((e) => e.metadata.into));
|
|
173
160
|
if (!isGlobalStoreRoot(hippoRoot))
|
|
174
161
|
return { folds: ownLegacyFold(db, hippoRoot, tenantId).filter((f) => !chosen.has(f.from)), collisions: [] };
|
|
175
|
-
|
|
176
|
-
const rows = db.prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' AND cwd IS NOT NULL`)
|
|
177
|
-
.all(tenantId);
|
|
162
|
+
const rows = compactionOriginsWithCwd(db, tenantId);
|
|
178
163
|
const today = new Map();
|
|
179
164
|
for (const { origin, cwd } of rows) {
|
|
180
165
|
if (fs.existsSync(cwd))
|
|
@@ -203,8 +188,9 @@ function ownLegacyFold(db, hippoRoot, tenantId) {
|
|
|
203
188
|
const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
|
|
204
189
|
if (legacyName === '' || legacyName === name)
|
|
205
190
|
return [];
|
|
206
|
-
const
|
|
207
|
-
|
|
191
|
+
const held = holdsOrigin(db, 'memories', tenantId, legacyName)
|
|
192
|
+
|| holdsOrigin(db, 'compactions', tenantId, legacyName)
|
|
193
|
+
|| listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
|
|
208
194
|
return held ? [{ from: legacyName, into: name }] : [];
|
|
209
195
|
}
|
|
210
196
|
function foldOf(value) {
|
|
@@ -270,7 +256,8 @@ function planUserGlobalRepair(db, tenantId, folds) {
|
|
|
270
256
|
}
|
|
271
257
|
return { toProject, setAside, untraced };
|
|
272
258
|
}
|
|
273
|
-
/** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
|
|
259
|
+
/** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
|
|
260
|
+
* re-tags sleep's user-global merges by their parents; a dry run only plans. */
|
|
274
261
|
export function repairProjects(db, hippoRoot, opts) {
|
|
275
262
|
const { tenantId, dryRun, globalFolds = true } = opts;
|
|
276
263
|
if (dryRun)
|
|
@@ -285,9 +272,7 @@ export function repairProjects(db, hippoRoot, opts) {
|
|
|
285
272
|
const { folds, collisions } = planFolds(db, hippoRoot, tenantId, globalFolds);
|
|
286
273
|
const folded = folds.map((f) => foldInTx(db, tenantId, f.from, f.into));
|
|
287
274
|
const plan = planUserGlobalRepair(db, tenantId, []);
|
|
288
|
-
|
|
289
|
-
for (const { id, origin } of plan.toProject)
|
|
290
|
-
stamp.run(origin, tenantId, id);
|
|
275
|
+
stampOriginProjectsAt(db, tenantId, plan.toProject);
|
|
291
276
|
const aside = new Set(plan.setAside);
|
|
292
277
|
const now = new Date();
|
|
293
278
|
for (const row of selectAllEntries(db, tenantId).filter((e) => aside.has(e.id))) {
|
|
@@ -309,10 +294,8 @@ const AUTO_REPAIR_META_KEY = 'project_repair_auto';
|
|
|
309
294
|
function repairIsEmpty(r) {
|
|
310
295
|
return r.copies.length + r.folds.length + r.toProject.length + r.setAside.length === 0;
|
|
311
296
|
}
|
|
312
|
-
/**
|
|
313
|
-
*
|
|
314
|
-
* with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
|
|
315
|
-
*/
|
|
297
|
+
/** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
|
|
298
|
+
* with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted. */
|
|
316
299
|
export function repairOnceOnSleep(db, hippoRoot, tenantId) {
|
|
317
300
|
if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
|
|
318
301
|
return null;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Detect the current operational scope from env (HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL); returns the name without prefix, or null.
|
|
2
|
+
* Pure env reads, no I/O, so it is safe on hot paths such as the UserPromptSubmit hook. */
|
|
3
|
+
export declare function detectScope(): string | null;
|
|
4
|
+
/** Compute scope match between a memory's scope tags and the active scope.
|
|
5
|
+
* Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side). */
|
|
6
|
+
export declare function scopeMatch(memoryTags: string[], activeScope: string | null): -1 | 0 | 1;
|
|
7
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { envGstackSkill, envOpenclawSkill, envScope } from '
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* Returns a scope name string (no prefix), or null if no scope detected.
|
|
5
|
-
* Priority: HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL.
|
|
6
|
-
*
|
|
7
|
-
* Pure env var reads: no I/O, safe to call from hot paths (e.g. UserPromptSubmit hook).
|
|
8
|
-
*/
|
|
1
|
+
import { envGstackSkill, envOpenclawSkill, envScope } from '../util/env.js';
|
|
2
|
+
/** Detect the current operational scope from env (HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL); returns the name without prefix, or null.
|
|
3
|
+
* Pure env reads, no I/O, so it is safe on hot paths such as the UserPromptSubmit hook. */
|
|
9
4
|
export function detectScope() {
|
|
10
5
|
const explicit = envScope();
|
|
11
6
|
if (explicit && explicit.trim())
|
|
@@ -18,10 +13,8 @@ export function detectScope() {
|
|
|
18
13
|
return openclawSkill.trim();
|
|
19
14
|
return null;
|
|
20
15
|
}
|
|
21
|
-
/**
|
|
22
|
-
*
|
|
23
|
-
* Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side).
|
|
24
|
-
*/
|
|
16
|
+
/** Compute scope match between a memory's scope tags and the active scope.
|
|
17
|
+
* Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side). */
|
|
25
18
|
export function scopeMatch(memoryTags, activeScope) {
|
|
26
19
|
const scopeTags = memoryTags.filter(t => t.startsWith('scope:'));
|
|
27
20
|
if (scopeTags.length === 0)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type SearchResult, type ResultCost } from '../core/search-types.js';
|
|
3
|
+
import { type HybridVectorCandidates } from '../search/vector.js';
|
|
4
|
+
export declare function logEmbedAllFailure<E>(caller: string, err: E): void;
|
|
5
|
+
export interface SearchOptions {
|
|
6
|
+
budget?: number;
|
|
7
|
+
now?: Date;
|
|
8
|
+
minResults?: number;
|
|
9
|
+
/** Tenant scope for both stores. Undefined = no filter (legacy single-tenant). */
|
|
10
|
+
tenantId?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
|
|
13
|
+
* Returns results sorted by adjusted score within the combined token budget. */
|
|
14
|
+
export declare function searchBoth(query: string, localRoot: string, globalRoot: string, options?: SearchOptions): SearchResult[];
|
|
15
|
+
export interface HybridSearchOptions extends SearchOptions {
|
|
16
|
+
embeddingWeight?: number;
|
|
17
|
+
explain?: boolean;
|
|
18
|
+
mmr?: boolean;
|
|
19
|
+
mmrLambda?: number;
|
|
20
|
+
/** Multiplier applied to local-store scores when merging with global.
|
|
21
|
+
* Defaults to 1.2. Use 1.0 to remove the local bias for eval comparisons. */
|
|
22
|
+
localBump?: number;
|
|
23
|
+
/** Active scope for scope-boost scoring. Auto-detected if not provided. */
|
|
24
|
+
scope?: string | null;
|
|
25
|
+
/** Include superseded memories in results. Default false. */
|
|
26
|
+
includeSuperseded?: boolean;
|
|
27
|
+
/** Filter to memories current at this ISO date string. */
|
|
28
|
+
asOf?: string;
|
|
29
|
+
/** Budget cost per result, spent the same way in each store and in the merged list. */
|
|
30
|
+
cost?: ResultCost;
|
|
31
|
+
/** Propagated to underlying hybridSearch calls.
|
|
32
|
+
* Per-call > env HIPPO_SUMMARY_DEBOOST > 0.85 default. */
|
|
33
|
+
summaryDeboost?: number;
|
|
34
|
+
/** Propagated. Default true (1.05 boost if rebuilt within 7d). */
|
|
35
|
+
summaryFreshness?: boolean;
|
|
36
|
+
/** Optional admission predicate applied to the loaded candidates of BOTH stores before ranking, cross-store dedupe and budgeting,
|
|
37
|
+
* so an excluded row cannot shadow its admitted duplicate or saturate the budget. Undefined (recall paths never set it) means no filter. */
|
|
38
|
+
entryFilter?: (entry: MemoryEntry) => boolean;
|
|
39
|
+
/** Recall scope filter for `searchBothHybrid`: absent is the only unfiltered mode; present uses `loadRecallSearchEntries` plus a JS post-filter.
|
|
40
|
+
* `{}` = default-deny (legacy and `<source>:private:*` excluded); `{ requested: 'X' }` = exact; `{ requested: 'X', additive: true }` = default plus X.
|
|
41
|
+
* An object, not `string | null`, because the sibling `scope` option already gives null a different meaning.
|
|
42
|
+
* Do not pass `{}` casually from non-recall paths. */
|
|
43
|
+
recallScope?: {
|
|
44
|
+
requested?: string;
|
|
45
|
+
additive?: boolean;
|
|
46
|
+
ownScope?: string;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Hybrid search across both local and global stores, using embeddings when available.
|
|
50
|
+
* Async version of searchBoth that calls hybridSearch instead of search. */
|
|
51
|
+
export declare function searchBothHybrid(query: string, localRoot: string, globalRoot: string, options?: HybridSearchOptions): Promise<SearchResult[]>;
|
|
52
|
+
/** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
|
|
53
|
+
export declare function rankBothStores(query: string, roots: {
|
|
54
|
+
local: string;
|
|
55
|
+
global: string;
|
|
56
|
+
}, entries: {
|
|
57
|
+
local: MemoryEntry[];
|
|
58
|
+
global: MemoryEntry[];
|
|
59
|
+
}, vectorCandidates: HybridVectorCandidates, options?: HybridSearchOptions): Promise<SearchResult[]>;
|
|
60
|
+
//# sourceMappingURL=search-both.d.ts.map
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Search across the local and global stores, merged into one ranked, budgeted list.
|
|
2
|
+
import { compareScoresDesc } from '../core/compare.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { loadSearchEntries, loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
|
|
5
|
+
import { passesScopeFilterForRecall, passesCliRecallScopeFilter } from '../store/recall-scope.js';
|
|
6
|
+
import { search } from '../search/bm25-search.js';
|
|
7
|
+
import { hybridSearch } from '../search/hybrid.js';
|
|
8
|
+
import { fitBudget } from '../search/finalize.js';
|
|
9
|
+
import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
10
|
+
import { startQueryEmbedDeadline } from '../search/vector.js';
|
|
11
|
+
import { evalNow } from '../core/ablation.js';
|
|
12
|
+
import { duplicateKey } from '../util/same-text.js';
|
|
13
|
+
import { errorMessage, log } from '../util/log.js';
|
|
14
|
+
// The rows are already copied; a failed background embed only delays vectors, so it warns instead of throwing.
|
|
15
|
+
export function logEmbedAllFailure(caller, err) {
|
|
16
|
+
log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`);
|
|
17
|
+
}
|
|
18
|
+
/** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
|
|
19
|
+
* Returns results sorted by adjusted score within the combined token budget. */
|
|
20
|
+
export function searchBoth(query, localRoot, globalRoot, options = {}) {
|
|
21
|
+
const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), minResults, tenantId } = options;
|
|
22
|
+
const effectiveMin = minResults ?? 1;
|
|
23
|
+
const localEntries = fs.existsSync(localRoot) ? loadSearchEntries(localRoot, query, undefined, tenantId) : [];
|
|
24
|
+
const globalEntries = fs.existsSync(globalRoot) ? loadSearchEntries(globalRoot, query, undefined, tenantId) : [];
|
|
25
|
+
if (localEntries.length === 0 && globalEntries.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
// Search each store with full budget, then blend
|
|
28
|
+
const localResults = search(query, localEntries, { budget, now, minResults });
|
|
29
|
+
const globalResults = search(query, globalEntries, { budget, now, minResults });
|
|
30
|
+
const deduped = dedupeByContent(tagLocalAndGlobal(localResults, globalResults));
|
|
31
|
+
// PLAIN stable score sort on purpose: both inputs are deterministically ordered,
|
|
32
|
+
// and an exact tie keeps the LOCAL result ahead of the global one (concat order).
|
|
33
|
+
deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
|
|
34
|
+
// Apply combined token budget (guarantee at least minResults items)
|
|
35
|
+
const results = [];
|
|
36
|
+
let usedTokens = 0;
|
|
37
|
+
for (let i = 0; i < deduped.length; i++) {
|
|
38
|
+
if (results.length >= effectiveMin && usedTokens + deduped[i].tokens > budget)
|
|
39
|
+
continue;
|
|
40
|
+
usedTokens += deduped[i].tokens;
|
|
41
|
+
results.push(deduped[i]);
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
function tagLocalAndGlobal(localResults, globalResults) {
|
|
46
|
+
// Tag global results. Local memories get a configurable priority bump.
|
|
47
|
+
return [
|
|
48
|
+
...localResults.map((r) => ({
|
|
49
|
+
...r,
|
|
50
|
+
isGlobal: false,
|
|
51
|
+
score: r.score * DEFAULT_LOCAL_BUMP,
|
|
52
|
+
breakdown: r.breakdown
|
|
53
|
+
? { ...r.breakdown, sourceBump: DEFAULT_LOCAL_BUMP, final: r.breakdown.final * DEFAULT_LOCAL_BUMP }
|
|
54
|
+
: undefined,
|
|
55
|
+
})),
|
|
56
|
+
...globalResults.map((r) => ({ ...r, isGlobal: true })),
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
function dedupeByContent(tagged) {
|
|
60
|
+
// Remove duplicates by content (local/global IDs differ after promote/share)
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
return tagged.filter((r) => {
|
|
63
|
+
const key = duplicateKey(r.entry.content);
|
|
64
|
+
if (seen.has(key))
|
|
65
|
+
return false;
|
|
66
|
+
seen.add(key);
|
|
67
|
+
return true;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Hybrid search across both local and global stores, using embeddings when available.
|
|
71
|
+
* Async version of searchBoth that calls hybridSearch instead of search. */
|
|
72
|
+
export async function searchBothHybrid(query, localRoot, globalRoot, options = {}) {
|
|
73
|
+
const { includeSuperseded, asOf, tenantId, entryFilter, recallScope } = options;
|
|
74
|
+
// With an admission filter, lift the per-store candidate cap (default 200) to a bounded 5000: excluded rows could otherwise fill the window first.
|
|
75
|
+
const searchWindow = entryFilter ? 5000 : undefined;
|
|
76
|
+
// Recall mode: push the scope predicate into SQL like api.recall, so quarantine/private rows never enter the candidates, shadow duplicates or use budget.
|
|
77
|
+
// The JS post-filter below is the regex-only `<source>:private:*` half plus defense in depth on exact match.
|
|
78
|
+
const loadEntries = (root) => {
|
|
79
|
+
if (!fs.existsSync(root))
|
|
80
|
+
return [];
|
|
81
|
+
return recallScope
|
|
82
|
+
? loadRecallSearchEntries(root, query, searchWindow, tenantId, recallScope.requested, recallScope.additive ? 'additive' : 'exact', Boolean(includeSuperseded) || Boolean(asOf), undefined, recallScope.ownScope)
|
|
83
|
+
: loadSearchEntries(root, query, searchWindow, tenantId);
|
|
84
|
+
};
|
|
85
|
+
const passesScope = (e) => !recallScope || (recallScope.additive
|
|
86
|
+
? passesCliRecallScopeFilter(e.scope ?? null, recallScope.requested) || passesScopeFilterForRecall(e.scope ?? null, undefined, recallScope.ownScope)
|
|
87
|
+
: passesScopeFilterForRecall(e.scope ?? null, recallScope.requested, recallScope.ownScope));
|
|
88
|
+
const admit = (e) => passesScope(e) && (!entryFilter || entryFilter(e));
|
|
89
|
+
const localEntries = loadEntries(localRoot).filter(admit);
|
|
90
|
+
const globalEntries = loadEntries(globalRoot).filter(admit);
|
|
91
|
+
// The vector arm loads under the same SQL rules as loadEntries, then the same JS admission.
|
|
92
|
+
const vectorCandidates = {
|
|
93
|
+
tenantId,
|
|
94
|
+
scope: recallScope ? recallScopeFilter(recallScope.requested, recallScope.additive ? 'additive' : 'exact', recallScope.ownScope) : undefined,
|
|
95
|
+
includeSuperseded: !recallScope || Boolean(includeSuperseded) || Boolean(asOf),
|
|
96
|
+
admit,
|
|
97
|
+
};
|
|
98
|
+
return rankBothStores(query, { local: localRoot, global: globalRoot }, { local: localEntries, global: globalEntries }, vectorCandidates, options);
|
|
99
|
+
}
|
|
100
|
+
/** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
|
|
101
|
+
export async function rankBothStores(query, roots, entries, vectorCandidates, options = {}) {
|
|
102
|
+
const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness } = options;
|
|
103
|
+
if (entries.local.length === 0 && entries.global.length === 0)
|
|
104
|
+
return [];
|
|
105
|
+
// One deadline for both stores, so a provider that stalls on the first is not waited on again for the second.
|
|
106
|
+
const shared = {
|
|
107
|
+
budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness,
|
|
108
|
+
vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
|
|
109
|
+
};
|
|
110
|
+
const localResults = await hybridSearch(query, entries.local, { ...shared, hippoRoot: roots.local });
|
|
111
|
+
const globalResults = await hybridSearch(query, entries.global, { ...shared, hippoRoot: roots.global });
|
|
112
|
+
// Tag global results. Local memories get a configurable priority bump.
|
|
113
|
+
const tagged = [
|
|
114
|
+
...localResults.map((r) => ({
|
|
115
|
+
...r,
|
|
116
|
+
isGlobal: false,
|
|
117
|
+
score: r.score * localBump,
|
|
118
|
+
breakdown: r.breakdown
|
|
119
|
+
? { ...r.breakdown, sourceBump: localBump, final: r.breakdown.final * localBump }
|
|
120
|
+
: undefined,
|
|
121
|
+
})),
|
|
122
|
+
...globalResults.map((r) => ({ ...r, isGlobal: true })),
|
|
123
|
+
];
|
|
124
|
+
// Remove duplicates by content (local/global IDs differ after promote/share)
|
|
125
|
+
const seen = new Set();
|
|
126
|
+
const deduped = tagged.filter((r) => {
|
|
127
|
+
const key = duplicateKey(r.entry.content);
|
|
128
|
+
if (seen.has(key))
|
|
129
|
+
return false;
|
|
130
|
+
seen.add(key);
|
|
131
|
+
return true;
|
|
132
|
+
});
|
|
133
|
+
// PLAIN stable score sort on purpose -- see searchBoth above;
|
|
134
|
+
// same rationale (deterministic inputs + stability; local-first on ties).
|
|
135
|
+
deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
|
|
136
|
+
return fitBudget(deduped, budget, minResults ?? 1, cost);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=search-both.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
/** Tags whose rows only a hand-run share or promote may copy to the global store; derived rows inherit them. */
|
|
3
|
+
export declare const NEVER_AUTO_SHARE_TAGS: ReadonlySet<string>;
|
|
4
|
+
export declare function neverAutoShareTags(sources: readonly MemoryEntry[]): string[];
|
|
5
|
+
/** Tags whose rows sleep keeps as written: never merged, never sent to LLM extraction. Conflict detection keeps its own list. */
|
|
6
|
+
export declare const NO_MERGE_TAGS: ReadonlySet<string>;
|
|
7
|
+
/** Estimate how well a memory would transfer to other projects.
|
|
8
|
+
* Returns 0..1 where >0.5 = good candidate for sharing. */
|
|
9
|
+
export declare function transferScore(entry: MemoryEntry): number;
|
|
10
|
+
/** Share a memory to the global store with attribution (source enriched with project path and timestamp).
|
|
11
|
+
* Returns the new entry, or null if the transfer score is too low. */
|
|
12
|
+
export declare function shareMemory(localRoot: string, id: string, options?: {
|
|
13
|
+
force?: boolean;
|
|
14
|
+
tenantId?: string;
|
|
15
|
+
skipEmbed?: boolean;
|
|
16
|
+
}): MemoryEntry | null;
|
|
17
|
+
/** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or 'promoted:<path>' sources.
|
|
18
|
+
* `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
|
|
19
|
+
export declare function listPeers(globalRoot?: string, tenantId?: string): Array<{
|
|
20
|
+
project: string;
|
|
21
|
+
count: number;
|
|
22
|
+
latest: string;
|
|
23
|
+
}>;
|
|
24
|
+
type AutoShareStats = {
|
|
25
|
+
secretSkipped: number;
|
|
26
|
+
rejectedSkipped?: number;
|
|
27
|
+
neverAutoShareSkipped?: number;
|
|
28
|
+
};
|
|
29
|
+
/** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag; `options.tenantId` scopes the LOCAL read.
|
|
30
|
+
* `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped` rejection refusals (0 under `dryRun`). */
|
|
31
|
+
export declare function autoShare(localRoot: string, options?: {
|
|
32
|
+
minScore?: number;
|
|
33
|
+
dryRun?: boolean;
|
|
34
|
+
tenantId?: string;
|
|
35
|
+
stats?: AutoShareStats;
|
|
36
|
+
}): MemoryEntry[];
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=share.d.ts.map
|