hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible
|
|
1
|
+
// `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible
|
|
2
|
+
// pass.
|
|
2
3
|
import * as fs from 'node:fs';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
5
|
import { transcriptNotesProject } from '../agent-memories/claude-code.js';
|
|
@@ -41,13 +42,17 @@ export function listProjects(store) {
|
|
|
41
42
|
}
|
|
42
43
|
/** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
|
|
43
44
|
export function validateMergeNames(from, into) {
|
|
44
|
-
if (from.trim() === '' || into.trim() === '')
|
|
45
|
+
if (from.trim() === '' || into.trim() === '') {
|
|
45
46
|
return 'both project names are required; user-global and unknown rows cannot be merged';
|
|
47
|
+
}
|
|
46
48
|
if (from === into)
|
|
47
49
|
return `${from} is already ${into}`;
|
|
48
50
|
return null;
|
|
49
51
|
}
|
|
50
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Folds project `from` into `into` for one tenant in one transaction; a dry run rolls back and writes nothing, mirrors
|
|
54
|
+
* included.
|
|
55
|
+
*/
|
|
51
56
|
export function mergeProjects(store, opts) {
|
|
52
57
|
const refusal = validateMergeNames(opts.from, opts.into);
|
|
53
58
|
if (refusal)
|
|
@@ -62,7 +67,8 @@ export function mergeProjects(store, opts) {
|
|
|
62
67
|
function foldInTx(tx, from, into) {
|
|
63
68
|
const all = tx.entries();
|
|
64
69
|
const rows = all.filter((e) => e.origin_project === from);
|
|
65
|
-
// The sync renames the rest to `into`'s prefix and keeps their ids; only a note `into` already holds would show
|
|
70
|
+
// The sync renames the rest to `into`'s prefix and keeps their ids; only a note `into` already holds would show
|
|
71
|
+
// twice.
|
|
66
72
|
const held = new Set(all.filter((e) => e.origin_project === into && !e.superseded_by && isImport(e)).map(noteKey));
|
|
67
73
|
const setAside = [];
|
|
68
74
|
for (const row of rows) {
|
|
@@ -90,11 +96,18 @@ function noteKey(entry) {
|
|
|
90
96
|
const rest = entry.source.slice(AGENT_MEMORY_SOURCE_PREFIX.length);
|
|
91
97
|
return `${rest.split(':')[0]}:${rest.slice(rest.indexOf('/') + 1)}`;
|
|
92
98
|
}
|
|
93
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* Live imports under a project name whose exact text a user-global import holds: a session folder's notes stamped with
|
|
101
|
+
* the folder it ended in.
|
|
102
|
+
*/
|
|
94
103
|
function importCopies(store) {
|
|
95
104
|
const live = store.entries().filter((e) => !e.superseded_by && isImport(e));
|
|
96
105
|
const userGlobal = new Set(live.filter((e) => e.origin_project === '').map((e) => duplicateKey(e.content)));
|
|
97
|
-
return live.filter((e) => e.origin_project &&
|
|
106
|
+
return live.filter((e) => e.origin_project &&
|
|
107
|
+
e.kind !== 'raw' &&
|
|
108
|
+
!e.pinned &&
|
|
109
|
+
toolTag(e.source) !== null &&
|
|
110
|
+
userGlobal.has(duplicateKey(e.content)));
|
|
98
111
|
}
|
|
99
112
|
/** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
|
|
100
113
|
* notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
|
|
@@ -123,28 +136,35 @@ function strayImports(store, hippoRoot) {
|
|
|
123
136
|
for (const [dir, ids] of owners) {
|
|
124
137
|
if (ids.size !== 1)
|
|
125
138
|
continue;
|
|
126
|
-
// Its names before the id, and names folded into it, are the owner's too: the next sync moves those prefixes under
|
|
139
|
+
// Its names before the id, and names folded into it, are the owner's too: the next sync moves those prefixes under
|
|
140
|
+
// the id.
|
|
127
141
|
const [names] = ids.values();
|
|
128
142
|
const own = new Set([...names, ...foldedInto(edges, names)]);
|
|
129
|
-
for (const origin of new Set([...origins, ...own]))
|
|
143
|
+
for (const origin of new Set([...origins, ...own])) {
|
|
130
144
|
(own.has(origin) ? right : wrong).add(containerPrefix('claude-code', containerId(dir, 'project', platform, origin)));
|
|
145
|
+
}
|
|
131
146
|
}
|
|
132
147
|
const prefix = (e) => e.source.slice(0, e.source.indexOf('/', tool.length) + 1);
|
|
133
148
|
const misfiled = live.filter((e) => wrong.has(prefix(e)));
|
|
134
149
|
const seen = new Set(misfiled.map((e) => e.id));
|
|
135
150
|
return [...misfiled, ...copies.filter((e) => !seen.has(e.id) && !right.has(prefix(e)))];
|
|
136
151
|
}
|
|
137
|
-
/**
|
|
152
|
+
/**
|
|
153
|
+
* The global store reads each name's recorded session folders, where a compaction's name came from its cwd; a project
|
|
154
|
+
* store folds only its own folder name.
|
|
155
|
+
*/
|
|
138
156
|
function planFolds(store, hippoRoot, globalFolds) {
|
|
139
157
|
// A name someone merged into by hand stays: undoing their choice would rest on the resolver alone.
|
|
140
158
|
const chosen = new Set(store.auditEvents('project_merge').map((e) => e.metadata.into));
|
|
141
|
-
if (!isGlobalStoreRoot(hippoRoot))
|
|
159
|
+
if (!isGlobalStoreRoot(hippoRoot)) {
|
|
142
160
|
return { folds: ownLegacyFold(store, hippoRoot).filter((f) => !chosen.has(f.from)), collisions: [] };
|
|
161
|
+
}
|
|
143
162
|
const rows = store.compactionOriginsWithCwd();
|
|
144
163
|
const today = new Map();
|
|
145
164
|
for (const { origin, cwd } of rows) {
|
|
146
|
-
if (fs.existsSync(cwd))
|
|
165
|
+
if (fs.existsSync(cwd)) {
|
|
147
166
|
today.set(origin, (today.get(origin) ?? new Set()).add(resolveProjectIdentity(cwd).name));
|
|
167
|
+
}
|
|
148
168
|
}
|
|
149
169
|
const folds = [];
|
|
150
170
|
const collisions = [];
|
|
@@ -161,9 +181,12 @@ function planFolds(store, hippoRoot, globalFolds) {
|
|
|
161
181
|
const sources = new Set(folds.map((f) => f.from));
|
|
162
182
|
return { folds: globalFolds ? folds.filter((f) => !sources.has(f.into)) : [], collisions };
|
|
163
183
|
}
|
|
164
|
-
/**
|
|
184
|
+
/**
|
|
185
|
+
* A project store's rows, dormant snapshots and compaction records written before its id existed carry its folder name.
|
|
186
|
+
*/
|
|
165
187
|
function ownLegacyFold(store, hippoRoot) {
|
|
166
|
-
// A shared store's rows carry their callers' names, so one matching its folder's is a member's project, not a legacy
|
|
188
|
+
// A shared store's rows carry their callers' names, so one matching its folder's is a member's project, not a legacy
|
|
189
|
+
// tag.
|
|
167
190
|
if (isSharedStore(hippoRoot))
|
|
168
191
|
return [];
|
|
169
192
|
const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
|
|
@@ -174,16 +197,24 @@ function ownLegacyFold(store, hippoRoot) {
|
|
|
174
197
|
|| store.dormant().some((s) => s.entry.origin_project === legacyName);
|
|
175
198
|
return held ? [{ from: legacyName, into: name }] : [];
|
|
176
199
|
}
|
|
177
|
-
/**
|
|
200
|
+
/**
|
|
201
|
+
* 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
|
|
202
|
+
* differently once folds apply.
|
|
203
|
+
*/
|
|
178
204
|
export function planProjectRepair(store, hippoRoot, globalFolds = true) {
|
|
179
205
|
const { folds, collisions } = planFolds(store, hippoRoot, globalFolds);
|
|
180
|
-
return {
|
|
206
|
+
return {
|
|
207
|
+
copies: strayImports(store, hippoRoot).map((e) => e.id),
|
|
208
|
+
folds,
|
|
209
|
+
collisions,
|
|
210
|
+
...planUserGlobalRepair(store, folds),
|
|
211
|
+
};
|
|
181
212
|
}
|
|
182
213
|
/** Parents read with `folds` already applied, so a plan matches what apply does after folding. */
|
|
183
214
|
function planUserGlobalRepair(store, folds) {
|
|
184
215
|
const all = store.entries();
|
|
185
216
|
const renamed = new Map(folds.map((f) => [f.from, f.into]));
|
|
186
|
-
const after = (origin) => (origin ? renamed.get(origin) ?? origin : origin ?? null);
|
|
217
|
+
const after = (origin) => (origin ? (renamed.get(origin) ?? origin) : (origin ?? null));
|
|
187
218
|
const origins = new Map(store.dormant().map((s) => [s.entry.id, after(s.entry.origin_project)]));
|
|
188
219
|
for (const e of all)
|
|
189
220
|
origins.set(e.id, after(e.origin_project));
|
|
@@ -240,7 +271,8 @@ function repairIsEmpty(r) {
|
|
|
240
271
|
return r.copies.length + r.folds.length + r.toProject.length + r.setAside.length === 0;
|
|
241
272
|
}
|
|
242
273
|
/** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
|
|
243
|
-
*
|
|
274
|
+
* with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
|
|
275
|
+
*/
|
|
244
276
|
export function repairOnceOnSleep(store) {
|
|
245
277
|
if (store.repairedOnce())
|
|
246
278
|
return null;
|
|
@@ -33,11 +33,15 @@ export interface HybridSearchOptions extends SearchOptions {
|
|
|
33
33
|
summaryDeboost?: number;
|
|
34
34
|
/** Propagated. Default true (1.05 boost if rebuilt within 7d). */
|
|
35
35
|
summaryFreshness?: boolean;
|
|
36
|
-
/** Optional admission predicate applied to the loaded candidates of BOTH stores before ranking, cross-store dedupe
|
|
37
|
-
*
|
|
36
|
+
/** Optional admission predicate applied to the loaded candidates of BOTH stores before ranking, cross-store dedupe
|
|
37
|
+
* and budgeting,
|
|
38
|
+
* so an excluded row cannot shadow its admitted duplicate or saturate the budget. Undefined (recall paths never
|
|
39
|
+
* set it) means no filter. */
|
|
38
40
|
entryFilter?: (entry: MemoryEntry) => boolean;
|
|
39
|
-
/** Recall scope filter for `searchBothHybrid`: absent is the only unfiltered mode; present uses
|
|
40
|
-
*
|
|
41
|
+
/** Recall scope filter for `searchBothHybrid`: absent is the only unfiltered mode; present uses
|
|
42
|
+
* `loadRecallSearchEntries` plus a JS post-filter.
|
|
43
|
+
* `{}` = default-deny (legacy and `<source>:private:*` excluded); `{ requested: 'X' }` = exact; `{ requested: 'X',
|
|
44
|
+
* additive: true }` = default plus X.
|
|
41
45
|
* An object, not `string | null`, because the sibling `scope` option already gives null a different meaning.
|
|
42
46
|
* Do not pass `{}` casually from non-recall paths. */
|
|
43
47
|
recallScope?: {
|
|
@@ -10,10 +10,10 @@ import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from '../core/search-types.
|
|
|
10
10
|
import { startQueryEmbedDeadline } from '../search/vector.js';
|
|
11
11
|
import { evalNow } from '../core/ablation.js';
|
|
12
12
|
import { duplicateKey } from '../util/same-text.js';
|
|
13
|
-
import { errorMessage, log } from '../util/log.js';
|
|
13
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
14
14
|
// The rows are already copied; a failed background embed only delays vectors, so it warns instead of throwing.
|
|
15
15
|
export function logEmbedAllFailure(caller, err) {
|
|
16
|
-
log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill
|
|
16
|
+
log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`, errorFields(err));
|
|
17
17
|
}
|
|
18
18
|
/** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
|
|
19
19
|
* Returns results sorted by adjusted score within the combined token budget. */
|
|
@@ -71,9 +71,11 @@ function dedupeByContent(tagged) {
|
|
|
71
71
|
* Async version of searchBoth that calls hybridSearch instead of search. */
|
|
72
72
|
export async function searchBothHybrid(query, localRoot, globalRoot, options = {}) {
|
|
73
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
|
|
74
|
+
// With an admission filter, lift the per-store candidate cap (default 200) to a bounded 5000: excluded rows could
|
|
75
|
+
// otherwise fill the window first.
|
|
75
76
|
const searchWindow = entryFilter ? 5000 : undefined;
|
|
76
|
-
// Recall mode: push the scope predicate into SQL like api.recall, so quarantine/private rows never enter the
|
|
77
|
+
// Recall mode: push the scope predicate into SQL like api.recall, so quarantine/private rows never enter the
|
|
78
|
+
// candidates, shadow duplicates or use budget.
|
|
77
79
|
// The JS post-filter below is the regex-only `<source>:private:*` half plus defense in depth on exact match.
|
|
78
80
|
const loadEntries = (root) => {
|
|
79
81
|
if (!fs.existsSync(root))
|
|
@@ -89,30 +91,35 @@ export async function searchBothHybrid(query, localRoot, globalRoot, options = {
|
|
|
89
91
|
})
|
|
90
92
|
: loadSearchEntries(root, query, searchWindow, tenantId);
|
|
91
93
|
};
|
|
92
|
-
const passesScope = (e) => !recallScope ||
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
const passesScope = (e) => !recallScope ||
|
|
95
|
+
(recallScope.additive
|
|
96
|
+
? passesCliRecallScopeFilter(e.scope ?? null, recallScope.requested) ||
|
|
97
|
+
passesScopeFilterForRecall(e.scope ?? null, undefined, recallScope.ownScope)
|
|
98
|
+
: passesScopeFilterForRecall(e.scope ?? null, recallScope.requested, recallScope.ownScope));
|
|
95
99
|
const admit = (e) => passesScope(e) && (!entryFilter || entryFilter(e));
|
|
96
100
|
const localEntries = loadEntries(localRoot).filter(admit);
|
|
97
101
|
const globalEntries = loadEntries(globalRoot).filter(admit);
|
|
98
102
|
// The vector arm loads under the same SQL rules as loadEntries, then the same JS admission.
|
|
99
103
|
const vectorCandidates = {
|
|
100
104
|
tenantId,
|
|
101
|
-
scope: recallScope
|
|
105
|
+
scope: recallScope
|
|
106
|
+
? recallScopeFilter(recallScope.requested, recallScope.additive ? 'additive' : 'exact', recallScope.ownScope)
|
|
107
|
+
: undefined,
|
|
102
108
|
includeSuperseded: !recallScope || Boolean(includeSuperseded) || Boolean(asOf),
|
|
103
109
|
admit,
|
|
104
110
|
};
|
|
105
|
-
|
|
111
|
+
const roots = { local: localRoot, global: globalRoot };
|
|
112
|
+
return rankBothStores(query, roots, { local: localEntries, global: globalEntries }, vectorCandidates, options);
|
|
106
113
|
}
|
|
107
114
|
/** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
|
|
108
115
|
export async function rankBothStores(query, roots, entries, vectorCandidates, options = {}) {
|
|
109
|
-
const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness } = options;
|
|
116
|
+
const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness, } = options;
|
|
110
117
|
if (entries.local.length === 0 && entries.global.length === 0)
|
|
111
118
|
return [];
|
|
112
119
|
// One deadline for both stores, so a provider that stalls on the first is not waited on again for the second.
|
|
113
120
|
const shared = {
|
|
114
|
-
budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf,
|
|
115
|
-
vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
|
|
121
|
+
budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf,
|
|
122
|
+
summaryDeboost, summaryFreshness, vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
|
|
116
123
|
};
|
|
117
124
|
const localResults = await hybridSearch(query, entries.local, { ...shared, hippoRoot: roots.local });
|
|
118
125
|
const globalResults = await hybridSearch(query, entries.global, { ...shared, hippoRoot: roots.global });
|
package/dist/sharing/share.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import { MemoryEntry } from '../core/memory.js';
|
|
|
2
2
|
/** Tags whose rows only a hand-run share or promote may copy to the global store; derived rows inherit them. */
|
|
3
3
|
export declare const NEVER_AUTO_SHARE_TAGS: ReadonlySet<string>;
|
|
4
4
|
export declare function neverAutoShareTags(sources: readonly MemoryEntry[]): string[];
|
|
5
|
-
/** Tags whose rows sleep keeps as written: never merged, never
|
|
5
|
+
/** Tags whose rows sleep keeps as written: never merged, never
|
|
6
|
+
* sent to LLM extraction. Conflict detection keeps its own list. */
|
|
6
7
|
export declare const NO_MERGE_TAGS: ReadonlySet<string>;
|
|
7
8
|
/** The transfer score a memory needs before sleep or `hippo share --auto` copies it to the global store. */
|
|
8
9
|
export declare const AUTO_SHARE_MIN_SCORE = 0.6;
|
|
@@ -16,7 +17,8 @@ export declare function shareMemory(localRoot: string, id: string, options?: {
|
|
|
16
17
|
tenantId?: string;
|
|
17
18
|
skipEmbed?: boolean;
|
|
18
19
|
}): MemoryEntry | null;
|
|
19
|
-
/** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
|
|
20
|
+
/** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
|
|
21
|
+
* 'promoted:<path>' sources.
|
|
20
22
|
* `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
|
|
21
23
|
export declare function listPeers(globalRoot?: string, tenantId?: string): Array<{
|
|
22
24
|
project: string;
|
|
@@ -28,8 +30,10 @@ type AutoShareStats = {
|
|
|
28
30
|
rejectedSkipped?: number;
|
|
29
31
|
neverAutoShareSkipped?: number;
|
|
30
32
|
};
|
|
31
|
-
/** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
|
|
32
|
-
*
|
|
33
|
+
/** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
|
|
34
|
+
* `options.tenantId` scopes the LOCAL read.
|
|
35
|
+
* `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped`
|
|
36
|
+
* rejection refusals (0 under `dryRun`). */
|
|
33
37
|
export declare function autoShare(localRoot: string, options?: {
|
|
34
38
|
minScore?: number;
|
|
35
39
|
dryRun?: boolean;
|
package/dist/sharing/share.js
CHANGED
|
@@ -5,7 +5,7 @@ import * as path from 'path';
|
|
|
5
5
|
import { generateId, COMPACTION_MEMORY_TAG } from '../core/memory.js';
|
|
6
6
|
import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TAGS } from '../core/agent-memory-tools.js';
|
|
7
7
|
import { writeEntriesSkippingRejected, writeEntry } from '../store/entry-writes.js';
|
|
8
|
-
import { loadAllEntries, loadEntryTextKeys, readEntry } from '../store/entry-reads.js';
|
|
8
|
+
import { loadAllEntries, loadEntriesWithSignals, loadEntryTextKeys, readEntry, } from '../store/entry-reads.js';
|
|
9
9
|
import { tallySources } from '../store/candidates.js';
|
|
10
10
|
import { isPersonalScope } from '../core/recall-scope.js';
|
|
11
11
|
import { fallbackOrigin } from '../core/project-identity.js';
|
|
@@ -37,7 +37,8 @@ export const NEVER_AUTO_SHARE_TAGS = new Set([
|
|
|
37
37
|
export function neverAutoShareTags(sources) {
|
|
38
38
|
return [...NEVER_AUTO_SHARE_TAGS].filter((tag) => sources.some((s) => s.tags.includes(tag)));
|
|
39
39
|
}
|
|
40
|
-
/** Tags whose rows sleep keeps as written: never merged, never
|
|
40
|
+
/** Tags whose rows sleep keeps as written: never merged, never
|
|
41
|
+
* sent to LLM extraction. Conflict detection keeps its own list. */
|
|
41
42
|
export const NO_MERGE_TAGS = new Set([
|
|
42
43
|
'extracted',
|
|
43
44
|
'session-digest',
|
|
@@ -46,6 +47,13 @@ export const NO_MERGE_TAGS = new Set([
|
|
|
46
47
|
]);
|
|
47
48
|
/** The transfer score a memory needs before sleep or `hippo share --auto` copies it to the global store. */
|
|
48
49
|
export const AUTO_SHARE_MIN_SCORE = 0.6;
|
|
50
|
+
/** Every trait that lifts transferScore above 0.5 or makes autoShare skip a row before scoring it. */
|
|
51
|
+
const AUTO_SHARE_SIGNALS = {
|
|
52
|
+
tags: [...TRANSFERABLE_TAGS, ...NEVER_AUTO_SHARE_TAGS],
|
|
53
|
+
sourcePrefix: AGENT_MEMORY_SOURCE_PREFIX,
|
|
54
|
+
minRetrievals: 3,
|
|
55
|
+
valences: ['negative', 'critical'],
|
|
56
|
+
};
|
|
49
57
|
/** Estimate how well a memory would transfer to other projects.
|
|
50
58
|
* Returns 0..1 where >0.5 = good candidate for sharing. */
|
|
51
59
|
export function transferScore(entry) {
|
|
@@ -70,7 +78,8 @@ export function transferScore(entry) {
|
|
|
70
78
|
/** Share a memory to the global store with attribution (source enriched with project path and timestamp).
|
|
71
79
|
* Returns the new entry, or null if the transfer score is too low. */
|
|
72
80
|
export function shareMemory(localRoot, id, options = {}) {
|
|
73
|
-
// tenantId is optional for single-tenant callers (autoShare passes only `{ force: true }`); MCP/REST hosts MUST pass
|
|
81
|
+
// tenantId is optional for single-tenant callers (autoShare passes only `{ force: true }`); MCP/REST hosts MUST pass
|
|
82
|
+
// it so tenant A cannot share
|
|
74
83
|
// tenant B's memory to global (readEntry returns null on a cross-tenant lookup).
|
|
75
84
|
const entry = readEntry(localRoot, id, options.tenantId);
|
|
76
85
|
if (!entry)
|
|
@@ -81,19 +90,22 @@ export function shareMemory(localRoot, id, options = {}) {
|
|
|
81
90
|
initGlobal();
|
|
82
91
|
const globalRoot = getGlobalRoot();
|
|
83
92
|
writeEntry(globalRoot, globalEntry);
|
|
84
|
-
// Embed here unless the caller opts out: autoShare sets skipEmbed to batch one embedAll(), since embedMemory rewrites
|
|
93
|
+
// Embed here unless the caller opts out: autoShare sets skipEmbed to batch one embedAll(), since embedMemory rewrites
|
|
94
|
+
// the whole index per call.
|
|
85
95
|
if (!options.skipEmbed) {
|
|
86
96
|
void embedMemory(globalRoot, globalEntry);
|
|
87
97
|
}
|
|
88
98
|
return globalEntry;
|
|
89
99
|
}
|
|
90
|
-
/** The global copy of a local row, or null when its transfer score is too low and `force` is off; throws when the
|
|
100
|
+
/** The global copy of a local row, or null when its transfer score is too low and `force` is off; throws when the
|
|
101
|
+
* row may not be shared. */
|
|
91
102
|
function toGlobalEntry(localRoot, entry, force) {
|
|
92
103
|
assertShareable(entry, entry.id);
|
|
93
104
|
const score = transferScore(entry);
|
|
94
105
|
if (score < 0.3 && !force)
|
|
95
106
|
return null;
|
|
96
|
-
// The label keeps the folder name for a user-global row; a NULL
|
|
107
|
+
// The label keeps the folder name for a user-global row; a NULL
|
|
108
|
+
// row gets `shared::`, which originFromSource reads as no project.
|
|
97
109
|
const fallbackName = path.basename(path.resolve(localRoot, '..'));
|
|
98
110
|
const originName = entry.origin_project ?? fallbackOrigin(localRoot);
|
|
99
111
|
const label = originName === '' ? fallbackName : (originName ?? '');
|
|
@@ -105,7 +117,8 @@ function toGlobalEntry(localRoot, entry, force) {
|
|
|
105
117
|
};
|
|
106
118
|
}
|
|
107
119
|
function assertShareable(entry, id) {
|
|
108
|
-
// Secret veto: secrets never reach the global store, even with --force; throw loudly, since a silent null reads as
|
|
120
|
+
// Secret veto: secrets never reach the global store, even with --force; throw loudly, since a silent null reads as
|
|
121
|
+
// "low transfer score" and invites retries.
|
|
109
122
|
const secret = detectSecret(entry);
|
|
110
123
|
if (secret.flagged) {
|
|
111
124
|
throw new BadRequestError(`Refusing to share ${id} to the global store: content matches secret material (${secret.reason}). ` +
|
|
@@ -113,13 +126,15 @@ function assertShareable(entry, id) {
|
|
|
113
126
|
}
|
|
114
127
|
// A quarantined row is unreviewed input, not a lesson; sharing it would spread poison globally.
|
|
115
128
|
if (isQuarantineScope(entry.scope)) {
|
|
116
|
-
throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review.
|
|
129
|
+
throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review. ` +
|
|
130
|
+
`Approve it first via 'hippo quarantine approve ${id}'.`);
|
|
117
131
|
}
|
|
118
132
|
if (isPersonalScope(entry.scope ?? null)) {
|
|
119
133
|
throw new BadRequestError(`Refusing to share ${id}: it is a personal memory and stays with its owner on this server.`);
|
|
120
134
|
}
|
|
121
135
|
}
|
|
122
|
-
/** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
|
|
136
|
+
/** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
|
|
137
|
+
* 'promoted:<path>' sources.
|
|
123
138
|
* `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
|
|
124
139
|
export function listPeers(globalRoot, tenantId) {
|
|
125
140
|
const root = globalRoot ?? getGlobalRoot();
|
|
@@ -158,8 +173,9 @@ export function listPeers(globalRoot, tenantId) {
|
|
|
158
173
|
}
|
|
159
174
|
function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
|
|
160
175
|
// shareMemory refuses quarantined and personal rows; filtering here keeps sleep from aborting on one.
|
|
161
|
-
if (isQuarantineScope(entry.scope ?? null) || isPersonalScope(entry.scope ?? null) || !isReusable(entry))
|
|
176
|
+
if (isQuarantineScope(entry.scope ?? null) || isPersonalScope(entry.scope ?? null) || !isReusable(entry)) {
|
|
162
177
|
return false;
|
|
178
|
+
}
|
|
163
179
|
// Before the score: these rows describe one project only, and a git seed's 'error' tag clears the bar.
|
|
164
180
|
if (entry.tags.some((t) => NEVER_AUTO_SHARE_TAGS.has(t)) || entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX)) {
|
|
165
181
|
if (stats)
|
|
@@ -172,7 +188,8 @@ function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
|
|
|
172
188
|
// Skip if already shared (same text apart from spacing)
|
|
173
189
|
if (globalContentSet.has(duplicateKey(entry.content)))
|
|
174
190
|
return false;
|
|
175
|
-
// Secret veto, checked LAST so the stats counter only counts rows it withheld (a row failing the score or dedupe gate
|
|
191
|
+
// Secret veto, checked LAST so the stats counter only counts rows it withheld (a row failing the score or dedupe gate
|
|
192
|
+
// was never going to share).
|
|
176
193
|
// shareMemory would throw here; filtering keeps the sleep pipeline fail-safe.
|
|
177
194
|
if (detectSecret(entry).flagged) {
|
|
178
195
|
if (stats)
|
|
@@ -181,7 +198,8 @@ function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
|
|
|
181
198
|
}
|
|
182
199
|
return true;
|
|
183
200
|
}
|
|
184
|
-
// A row the GLOBAL store's rejection tombstones refuse is audited and skipped, so it cannot abort the autoShare sleep
|
|
201
|
+
// A row the GLOBAL store's rejection tombstones refuse is audited and skipped, so it cannot abort the autoShare sleep
|
|
202
|
+
// phase.
|
|
185
203
|
// The candidates are rows already held, written in one transaction; the caller embeds once via embedAll() afterwards.
|
|
186
204
|
function shareCandidates(localRoot, globalRoot, candidates, stats) {
|
|
187
205
|
const shared = [];
|
|
@@ -205,11 +223,17 @@ function shareCandidates(localRoot, globalRoot, candidates, stats) {
|
|
|
205
223
|
}
|
|
206
224
|
return shared;
|
|
207
225
|
}
|
|
208
|
-
/** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
|
|
209
|
-
*
|
|
226
|
+
/** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
|
|
227
|
+
* `options.tenantId` scopes the LOCAL read.
|
|
228
|
+
* `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped`
|
|
229
|
+
* rejection refusals (0 under `dryRun`). */
|
|
210
230
|
export function autoShare(localRoot, options = {}) {
|
|
211
231
|
const { minScore = AUTO_SHARE_MIN_SCORE, dryRun = false } = options;
|
|
212
|
-
|
|
232
|
+
// A row with none of these signals scores at most 0.5, so above that
|
|
233
|
+
// bar only signal rows can share or count as never-auto-share skips.
|
|
234
|
+
const localEntries = minScore > 0.5
|
|
235
|
+
? loadEntriesWithSignals(localRoot, AUTO_SHARE_SIGNALS, options.tenantId)
|
|
236
|
+
: loadAllEntries(localRoot, options.tenantId);
|
|
213
237
|
initGlobal();
|
|
214
238
|
const globalRoot = getGlobalRoot();
|
|
215
239
|
// Host-wide read. The global store IS the union across all tenants;
|
package/dist/store/ambient.js
CHANGED
|
@@ -4,9 +4,11 @@ import { SECRET_TAGS } from '../util/secret-detect.js';
|
|
|
4
4
|
import { onHandle, openStore } from './open.js';
|
|
5
5
|
import { jsonList } from './candidates.js';
|
|
6
6
|
import { originInSql } from '../core/project-identity.js';
|
|
7
|
-
import { AMBIENT_FRESH_WINDOW_MS,
|
|
7
|
+
import { AMBIENT_FRESH_WINDOW_MS, isErrorTagged } from '../core/ambient.js';
|
|
8
|
+
import { HIGH_SCHEMA_FIT } from '../core/memory.js';
|
|
8
9
|
import { placeholders } from '../util/sql.js';
|
|
9
|
-
// SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is
|
|
10
|
+
// SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is
|
|
11
|
+
// split.
|
|
10
12
|
function contextRowsWhere(tenantId, filter) {
|
|
11
13
|
const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
|
|
12
14
|
const params = [tenantId];
|
|
@@ -25,12 +27,14 @@ function contextRowsWhere(tenantId, filter) {
|
|
|
25
27
|
}
|
|
26
28
|
return { where, params };
|
|
27
29
|
}
|
|
28
|
-
/** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot
|
|
30
|
+
/** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot
|
|
31
|
+
* match. */
|
|
29
32
|
function secretTaggedSql() {
|
|
30
33
|
const tags = [...SECRET_TAGS];
|
|
31
34
|
return {
|
|
32
35
|
sql: `((${tags.map(() => 'tags_json LIKE ?').join(' OR ')})
|
|
33
|
-
AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN
|
|
36
|
+
AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN
|
|
37
|
+
(${placeholders(tags.length)})))`,
|
|
34
38
|
params: [...tags.map((t) => `%"${t}"%`), ...tags],
|
|
35
39
|
};
|
|
36
40
|
}
|
|
@@ -57,7 +61,7 @@ export function loadAmbientTallies(hippoRoot, tenantId, filter) {
|
|
|
57
61
|
'[' || COALESCE(group_concat(${jsonList('tags_json')}, ','), '') || ']' AS tagLists
|
|
58
62
|
FROM memories
|
|
59
63
|
WHERE ${where.join(' AND ')}
|
|
60
|
-
AND ((${originInSql(filter.currentProject)} AND origin_project != '') OR NOT ${secret.sql})`).get(freshAfter,
|
|
64
|
+
AND ((${originInSql(filter.currentProject)} AND origin_project != '') OR NOT ${secret.sql})`).get(freshAfter, HIGH_SCHEMA_FIT, ...params, ...filter.currentProject, ...secret.params);
|
|
61
65
|
const tagCounts = new Map();
|
|
62
66
|
let errors = 0;
|
|
63
67
|
const lists = /* SAFETY: jsonList yields an array per row, joined into one array */ JSON.parse(row.tagLists);
|
|
@@ -11,7 +11,7 @@ export interface AuditOptions {
|
|
|
11
11
|
/** Emit an audit event for a mutation. Never throws: the SQLite store stays the source of truth,
|
|
12
12
|
* and a failed audit write shows up as missing rows. */
|
|
13
13
|
export declare function audit(db: ReturnType<typeof openHippoDb>, op: AuditOp, options?: AuditOptions): void;
|
|
14
|
-
/** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
|
|
15
|
-
* Best-effort like `audit()`: never throws. */
|
|
14
|
+
/** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
|
|
15
|
+
* rollback cannot claw it back. Best-effort like `audit()`: never throws. */
|
|
16
16
|
export declare function auditRejectionRefusal(db: ReturnType<typeof openHippoDb>, err: RejectedValueError, actor: string): void;
|
|
17
17
|
//# sourceMappingURL=audit-event.d.ts.map
|
|
@@ -18,9 +18,14 @@ export function audit(db, op, options = {}) {
|
|
|
18
18
|
reportAuditWriteFailure(op, String(error), targetId);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
/** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
|
|
22
|
-
* Best-effort like `audit()`: never throws. */
|
|
21
|
+
/** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
|
|
22
|
+
* rollback cannot claw it back. Best-effort like `audit()`: never throws. */
|
|
23
23
|
export function auditRejectionRefusal(db, err, actor) {
|
|
24
|
-
audit(db, 'reject_refusal', {
|
|
24
|
+
audit(db, 'reject_refusal', {
|
|
25
|
+
targetId: err.entryId,
|
|
26
|
+
metadata: { digest: err.digest, reason: err.reason },
|
|
27
|
+
actor,
|
|
28
|
+
tenantId: err.tenantId,
|
|
29
|
+
});
|
|
25
30
|
}
|
|
26
31
|
//# sourceMappingURL=audit-event.js.map
|
package/dist/store/audit.d.ts
CHANGED
|
@@ -53,14 +53,16 @@ export interface ListAuditAfterOpts {
|
|
|
53
53
|
/** Cursor read: events with id > afterId, ascending. Retention prune leaves gaps in the ids,
|
|
54
54
|
* so resume from the last id returned, never from a count. */
|
|
55
55
|
export declare function listAuditEventsAfter(db: DatabaseSyncLike, opts: ListAuditAfterOpts): AuditEvent[];
|
|
56
|
-
/** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
|
|
56
|
+
/** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
|
|
57
|
+
* queryAuditEvents it has no row cap. */
|
|
57
58
|
export declare function confirmedOutcomeTimes(hippoRoot: string, tenantId: string): Map<string, string>;
|
|
58
59
|
/** An audit row that did not land, with what its write threw. */
|
|
59
60
|
export interface FailedAuditEvent {
|
|
60
61
|
event: AppendAuditOpts;
|
|
61
62
|
error: unknown;
|
|
62
63
|
}
|
|
63
|
-
/** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
|
|
64
|
+
/** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
|
|
65
|
+
* failed, for the caller to report. */
|
|
64
66
|
export declare function recordAuditEventsRowByRow(hippoRoot: string, events: readonly AppendAuditOpts[]): FailedAuditEvent[];
|
|
65
67
|
export interface AuditPrune {
|
|
66
68
|
tenantId: string;
|
|
@@ -71,6 +73,7 @@ export interface AuditPrune {
|
|
|
71
73
|
/** Count the rows and delete nothing. */
|
|
72
74
|
dryRun: boolean;
|
|
73
75
|
}
|
|
74
|
-
/** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
|
|
76
|
+
/** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
|
|
77
|
+
* alone; returns the row count. */
|
|
75
78
|
export declare function pruneAuditRows(hippoRoot: string, prune: AuditPrune): number;
|
|
76
79
|
//# sourceMappingURL=audit.d.ts.map
|
package/dist/store/audit.js
CHANGED
|
@@ -27,7 +27,8 @@ export const AUDIT_OPS = [
|
|
|
27
27
|
'recall_autodebias_hint_no_class_match', // telemetry: forward-claim detected, no class scored
|
|
28
28
|
'recall_autodebias_hint_tiebreak', // telemetry: forward-claim detected, two or more classes tied
|
|
29
29
|
'recall_anchor_detected_query_repeat', // emitted by the anchoring detector when the same query returns the same top-1
|
|
30
|
-
|
|
30
|
+
// emitted by the anchoring detector when one memory wins top-1 across distinct queries
|
|
31
|
+
'recall_anchor_detected_memory_dominance',
|
|
31
32
|
'recall_anchor_skipped_no_session', // telemetry: no sessionId, so ring tracking was skipped
|
|
32
33
|
'recall_availability_detected', // emitted when the availability/recency-bias hint fires
|
|
33
34
|
'decision_create', // emitted by saveDecision
|
|
@@ -124,7 +125,8 @@ export function queryAuditEvents(db, opts) {
|
|
|
124
125
|
const limit = Math.max(1, Math.min(opts.limit ?? DEFAULT_LIST_LIMIT, 10001));
|
|
125
126
|
// SAFETY: AUDIT_COLUMNS names exactly the AuditRow columns, in this order.
|
|
126
127
|
const rows = db
|
|
127
|
-
.prepare(`SELECT ${AUDIT_COLUMNS} FROM audit_log WHERE ${where.join(' AND ')}${after.sql} ORDER BY ts DESC, id DESC
|
|
128
|
+
.prepare(`SELECT ${AUDIT_COLUMNS} FROM audit_log WHERE ${where.join(' AND ')}${after.sql} ORDER BY ts DESC, id DESC ` +
|
|
129
|
+
`LIMIT ?`)
|
|
128
130
|
.all(...params, ...after.params, limit);
|
|
129
131
|
return rows.map(rowToAuditEvent);
|
|
130
132
|
}
|
|
@@ -166,7 +168,8 @@ function deleteAuditBefore(db, tenantId, cutoff) {
|
|
|
166
168
|
.run(tenantId, cutoff);
|
|
167
169
|
return Number(result.changes ?? 0);
|
|
168
170
|
}
|
|
169
|
-
/** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
|
|
171
|
+
/** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
|
|
172
|
+
* queryAuditEvents it has no row cap. */
|
|
170
173
|
export function confirmedOutcomeTimes(hippoRoot, tenantId) {
|
|
171
174
|
const db = openHippoDb(hippoRoot);
|
|
172
175
|
try {
|
|
@@ -208,7 +211,8 @@ function safeJsonParse(raw, id) {
|
|
|
208
211
|
return {};
|
|
209
212
|
}
|
|
210
213
|
}
|
|
211
|
-
/** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
|
|
214
|
+
/** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
|
|
215
|
+
* failed, for the caller to report. */
|
|
212
216
|
export function recordAuditEventsRowByRow(hippoRoot, events) {
|
|
213
217
|
const db = openHippoDb(hippoRoot);
|
|
214
218
|
try {
|
|
@@ -227,7 +231,8 @@ export function recordAuditEventsRowByRow(hippoRoot, events) {
|
|
|
227
231
|
closeHippoDb(db);
|
|
228
232
|
}
|
|
229
233
|
}
|
|
230
|
-
/** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
|
|
234
|
+
/** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
|
|
235
|
+
* alone; returns the row count. */
|
|
231
236
|
export function pruneAuditRows(hippoRoot, prune) {
|
|
232
237
|
const { tenantId, cutoff, actor, olderThanDays } = prune;
|
|
233
238
|
const db = openHippoDb(hippoRoot);
|
|
@@ -237,7 +242,12 @@ export function pruneAuditRows(hippoRoot, prune) {
|
|
|
237
242
|
return withWriteScope(db, 'audit_prune', () => {
|
|
238
243
|
const count = deleteAuditBefore(db, tenantId, cutoff);
|
|
239
244
|
// Written after the delete with ts = now, so the cutoff just applied cannot take it.
|
|
240
|
-
appendAuditEvent(db, {
|
|
245
|
+
appendAuditEvent(db, {
|
|
246
|
+
tenantId,
|
|
247
|
+
actor,
|
|
248
|
+
op: 'audit_prune',
|
|
249
|
+
metadata: { cutoff, count, dryRun: false, olderThanDays },
|
|
250
|
+
});
|
|
241
251
|
return count;
|
|
242
252
|
});
|
|
243
253
|
}
|
package/dist/store/auth.d.ts
CHANGED
|
@@ -62,7 +62,8 @@ export interface VerifiedApiKey {
|
|
|
62
62
|
scopes: string[];
|
|
63
63
|
ownerSubject?: string | null;
|
|
64
64
|
}
|
|
65
|
-
/** One api_keys row and its scope grants as a store returns it, revoked or not; the core checks the secret, the role
|
|
65
|
+
/** One api_keys row and its scope grants as a store returns it, revoked or not; the core checks the secret, the role
|
|
66
|
+
* and the expiry. */
|
|
66
67
|
export interface ApiKeyRecord {
|
|
67
68
|
keyHash: string;
|
|
68
69
|
tenantId: string;
|
|
@@ -87,7 +88,8 @@ export declare class VerifiedKeyCache {
|
|
|
87
88
|
has(keyHash: string, plaintext: string): boolean;
|
|
88
89
|
add(keyHash: string, plaintext: string): void;
|
|
89
90
|
}
|
|
90
|
-
/** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a
|
|
91
|
+
/** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a
|
|
92
|
+
* queue. */
|
|
91
93
|
type DerivationBound = (keyId: string, derive: () => Promise<Buffer>) => Promise<Buffer>;
|
|
92
94
|
/** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
|
|
93
95
|
* call, so a revoke, expiry, role or scope change by any process applies on the next one. */
|