hippo-memory 1.70.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
2
|
+
import { RawAppendOnlyError } from '../core/raw-append-only.js';
|
|
3
|
+
import { AUTO_DELETABLE_SQL } from './rule-sql.js';
|
|
4
|
+
import { closeHippoDb, withWriteScope } from '../db/index.js';
|
|
3
5
|
import { checkRejectionGuard, RejectedValueError } from './rejection.js';
|
|
4
6
|
import { markSummaryDirtyInTx } from './summary-dirty.js';
|
|
5
7
|
import { insertDormantRow } from './dormant.js';
|
|
@@ -8,7 +10,7 @@ import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
|
8
10
|
import { audit } from './audit-event.js';
|
|
9
11
|
import { deleteFtsRow, replaceFtsRows, stampOriginProject, upsertMemoryRow } from './entry-row.js';
|
|
10
12
|
import { purgeMirrorBestEffort, mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
|
|
11
|
-
import { openStore } from './open.js';
|
|
13
|
+
import { onHandle, openStore } from './open.js';
|
|
12
14
|
import { clock } from '../util/write-budget.js';
|
|
13
15
|
/** Tables whose rows keep a first-class object's backing memory in `memory_id` (ON DELETE SET NULL); tests/dormant-memories.test.ts pins it to the schema. */
|
|
14
16
|
export const MEMORY_BACKED_TABLES = ['predictions', 'decisions', 'incidents', 'processes', 'policies', 'skills', 'project_briefs', 'customer_notes'];
|
|
@@ -16,13 +18,9 @@ export const MEMORY_BACKED_TABLES = ['predictions', 'decisions', 'incidents', 'p
|
|
|
16
18
|
const AUTOMATIC_DELETE_SQL = `${AUTO_DELETABLE_SQL}${MEMORY_BACKED_TABLES.map((t) => ` AND NOT EXISTS (SELECT 1 FROM ${t} WHERE ${t}.memory_id = memories.id)`).join('')}`;
|
|
17
19
|
/** Ids of memories that back a first-class object, for passes that plan deletes before making them. A table missing from an older schema is skipped. */
|
|
18
20
|
export function memoriesBackingObjects(hippoRoot) {
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
+
return onHandle(hippoRoot, (db) => {
|
|
21
22
|
return memoriesBackingObjectsOn(db);
|
|
22
|
-
}
|
|
23
|
-
finally {
|
|
24
|
-
closeHippoDb(db);
|
|
25
|
-
}
|
|
23
|
+
});
|
|
26
24
|
}
|
|
27
25
|
/** memoriesBackingObjects on the caller's handle. */
|
|
28
26
|
export function memoriesBackingObjectsOn(db) {
|
|
@@ -42,16 +40,22 @@ export function memoriesBackingObjectsOn(db) {
|
|
|
42
40
|
}
|
|
43
41
|
return ids;
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
// The abort text of trg_memories_raw_append_only (migration v14), the one place src matches it.
|
|
44
|
+
const RAW_TRIGGER_TEXT = 'raw is append-only';
|
|
45
|
+
function isRawTriggerAbort(cause) {
|
|
46
|
+
return cause instanceof Error && cause.message.includes(RAW_TRIGGER_TEXT);
|
|
47
|
+
}
|
|
48
|
+
/** Runs the DELETE and returns the rows it removed; the raw-row trigger's abort becomes RawAppendOnlyError. */
|
|
49
|
+
function deleteMemoryRow(db, sql, id) {
|
|
50
|
+
try {
|
|
51
|
+
return Number(db.prepare(sql).run(id).changes ?? 0);
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
throw isRawTriggerAbort(cause) ? new RawAppendOnlyError(cause) : cause;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** db-scoped delete core, composable inside a caller's transaction; NO filesystem I/O, mirrors are written post-commit. `suppressForgetAudit` is set by
|
|
58
|
+
* rejectValue and resolveConflict (own audit row). Returns `{tenantId, dagParentId}`, or null if absent or `automatic` refused it. */
|
|
55
59
|
export function deleteEntryCore(db, id, opts) {
|
|
56
60
|
// SAFETY: row's shape matches the three columns named in the SELECT above.
|
|
57
61
|
const row = db
|
|
@@ -60,7 +64,7 @@ export function deleteEntryCore(db, id, opts) {
|
|
|
60
64
|
if (!row?.id)
|
|
61
65
|
return null;
|
|
62
66
|
const guard = opts?.automatic ? ` AND ${AUTOMATIC_DELETE_SQL}` : '';
|
|
63
|
-
if (
|
|
67
|
+
if (deleteMemoryRow(db, `DELETE FROM memories WHERE id = ?${guard}`, id) === 0)
|
|
64
68
|
return null;
|
|
65
69
|
deleteFtsRow(db, id);
|
|
66
70
|
if (!opts?.suppressForgetAudit) {
|
|
@@ -69,29 +73,16 @@ export function deleteEntryCore(db, id, opts) {
|
|
|
69
73
|
// Forgetting a child of a summary marks the parent dirty. Not atomic with the DELETE, but
|
|
70
74
|
// markSummaryDirtyInTx is idempotent, so the next child mutation re-marks the parent if this fails.
|
|
71
75
|
if (row.dag_parent_id) {
|
|
72
|
-
markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ??
|
|
76
|
+
markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID, opts?.actor ?? 'cli');
|
|
73
77
|
}
|
|
74
|
-
return { tenantId: row.tenant_id ??
|
|
78
|
+
return { tenantId: row.tenant_id ?? DEFAULT_TENANT_ID, dagParentId: row.dag_parent_id ?? null };
|
|
75
79
|
}
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* `opts.actor` defaults to 'cli'. The api.* layer threads `ctx.actor` so HTTP
|
|
80
|
-
* callers land with `api_key:<key_id>` in the audit log without a duplicate
|
|
81
|
-
* emit from the api wrapper.
|
|
82
|
-
*
|
|
83
|
-
* Thin wrapper over `deleteEntryCore` (open → core → mirrors → close);
|
|
84
|
-
* behavior is byte-identical to the pre-split implementation for every
|
|
85
|
-
* existing caller.
|
|
86
|
-
*/
|
|
80
|
+
/** Delete an entry from SQLite and mirrors; thin wrapper over `deleteEntryCore` (open, core, mirrors, close).
|
|
81
|
+
* `opts.actor` defaults to 'cli'; the api layer threads `ctx.actor` so HTTP callers land as `api_key:<key_id>` in the audit log. */
|
|
87
82
|
export function deleteEntry(hippoRoot, id, opts) {
|
|
88
|
-
|
|
89
|
-
try {
|
|
83
|
+
return onHandle(hippoRoot, (db) => {
|
|
90
84
|
return deleteEntryOn(db, hippoRoot, id, opts);
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
closeHippoDb(db);
|
|
94
|
-
}
|
|
85
|
+
}, openStore);
|
|
95
86
|
}
|
|
96
87
|
/** deleteEntry on the caller's open store, so a loop of deletes opens the store once; each delete still commits alone. */
|
|
97
88
|
function deleteEntryOn(db, hippoRoot, id, opts) {
|
|
@@ -112,26 +103,17 @@ function mergeOwnChanges(base, ours, live) {
|
|
|
112
103
|
}
|
|
113
104
|
return row;
|
|
114
105
|
}
|
|
115
|
-
/** Writes, deletes and dormant moves in one transaction. With `snapshot
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* `dormant` (src/store/dormant.ts): each move's snapshot is inserted into `dormant_memories` and its `memories` row
|
|
119
|
-
* leaves exactly like a delete (FTS row, DAG parent dirty-mark, mirrors), in the same transaction, so a memory
|
|
120
|
-
* is never in both places or in neither. Deletes and moves both skip rows that are no longer auto-deletable
|
|
121
|
-
* (pinned, raw, kept for good or backing an object since the caller decided). Returns the ids that left `memories`, deleted or moved. */
|
|
106
|
+
/** Writes, deletes and dormant moves in one transaction. With `snapshot`, a write keeps only the fields the caller changed and never resurrects a gone row.
|
|
107
|
+
* Dormant moves (src/store/dormant.ts) leave `memories` like a delete; both skip rows no longer auto-deletable. Returns ids that left `memories`. */
|
|
122
108
|
export function batchWriteAndDelete(hippoRoot, toWrite, toDeleteIds, opts) {
|
|
123
109
|
const dormant = opts?.dormant ?? [];
|
|
124
110
|
if (toWrite.length === 0 && toDeleteIds.length === 0 && dormant.length === 0)
|
|
125
111
|
return [];
|
|
126
|
-
|
|
127
|
-
try {
|
|
112
|
+
return onHandle(hippoRoot, (db) => {
|
|
128
113
|
// One component, so every op keeps the statement order this call has always had.
|
|
129
114
|
const all = { writes: toWrite, deletes: toDeleteIds, dormant };
|
|
130
115
|
return batchWriteAndDeleteOn(db, hippoRoot, [all], 0, { snapshot: opts?.snapshot, holdMs: Infinity }).removedIds;
|
|
131
|
-
}
|
|
132
|
-
finally {
|
|
133
|
-
closeHippoDb(db);
|
|
134
|
-
}
|
|
116
|
+
}, openStore);
|
|
135
117
|
}
|
|
136
118
|
const failedUnits = new WeakMap();
|
|
137
119
|
/** Tags a flush error with the ids of the component it stopped at, for the partial sleep audit row; the first tag wins. */
|
|
@@ -149,7 +131,13 @@ export function failedUnitOf(err) {
|
|
|
149
131
|
* first component boundary after `holdMs`. Returns the next component's index and the ids that left `memories`. */
|
|
150
132
|
function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
|
|
151
133
|
const now = opts.clock ?? clock;
|
|
152
|
-
const out = {
|
|
134
|
+
const out = {
|
|
135
|
+
written: [],
|
|
136
|
+
removedIds: [],
|
|
137
|
+
rejectedSkips: 0,
|
|
138
|
+
fts: { rows: [], staleIds: [] },
|
|
139
|
+
dirty: { parents: new Set(), tenantById: new Map() }
|
|
140
|
+
};
|
|
153
141
|
let next = from;
|
|
154
142
|
// IMMEDIATE: the tombstone probes below read before the first write, and under a deferred BEGIN a
|
|
155
143
|
// concurrent `hippo reject` would make the lock upgrade fail with SQLITE_BUSY and roll back the batch.
|
|
@@ -171,7 +159,7 @@ function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
|
|
|
171
159
|
// Fire dirty-mark for every collected parent INSIDE the BEGIN, so the
|
|
172
160
|
// dirty flag commits atomically with the writes + deletes.
|
|
173
161
|
for (const parentId of out.dirty.parents) {
|
|
174
|
-
markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ??
|
|
162
|
+
markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ?? DEFAULT_TENANT_ID, 'batch');
|
|
175
163
|
}
|
|
176
164
|
});
|
|
177
165
|
reportChunk(hippoRoot, out);
|
|
@@ -231,7 +219,7 @@ function selectAutoDeletableRows(db, ids, dirty) {
|
|
|
231
219
|
for (const row of rows) {
|
|
232
220
|
if (row.dag_parent_id) {
|
|
233
221
|
dirty.parents.add(row.dag_parent_id);
|
|
234
|
-
dirty.tenantById.set(row.dag_parent_id, row.tenant_id ??
|
|
222
|
+
dirty.tenantById.set(row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID);
|
|
235
223
|
}
|
|
236
224
|
}
|
|
237
225
|
return rows;
|
|
@@ -272,7 +260,7 @@ function applyBatchWrites(db, stampedWrites, snapshot, out) {
|
|
|
272
260
|
}
|
|
273
261
|
/** True, after auditing the refusal, when the write would introduce a rejected value. */
|
|
274
262
|
function isRejectedBatchWrite(db, row) {
|
|
275
|
-
const entryTenantId = row.tenantId ??
|
|
263
|
+
const entryTenantId = row.tenantId ?? DEFAULT_TENANT_ID;
|
|
276
264
|
// checkRejectionGuard, not a bare tombstone probe: a tombstone can coexist with a live same-content row,
|
|
277
265
|
// and skipping every re-persist would starve it of decay/replay updates; only new or changed content is refused.
|
|
278
266
|
try {
|
|
@@ -291,16 +279,12 @@ function isRejectedBatchWrite(db, row) {
|
|
|
291
279
|
export function deleteEntriesOneByOne(hippoRoot, targets, opts) {
|
|
292
280
|
if (targets.length === 0)
|
|
293
281
|
return [];
|
|
294
|
-
|
|
295
|
-
try {
|
|
282
|
+
return onHandle(hippoRoot, (db) => {
|
|
296
283
|
return targets.map((target) => deleteEntryOn(db, hippoRoot, target.id, { ...opts, reason: target.reason }));
|
|
297
|
-
}
|
|
298
|
-
finally {
|
|
299
|
-
closeHippoDb(db);
|
|
300
|
-
}
|
|
284
|
+
}, openStore);
|
|
301
285
|
}
|
|
302
|
-
/** Commits whole components in transactions of about `budget.holdMs
|
|
303
|
-
*
|
|
286
|
+
/** Commits whole components in transactions of about `budget.holdMs`, letting other writers in between; returns the ids that left `memories`.
|
|
287
|
+
* The snapshot keeps what other writers changed after the caller loaded its rows. */
|
|
304
288
|
export async function commitInChunks(hippoRoot, components, opts) {
|
|
305
289
|
if (components.length === 0)
|
|
306
290
|
return [];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type PromptRecallGate } from '../core/prompt-recall.js';
|
|
3
3
|
export type DeliveryRuntime = 'claude-code' | 'codex' | 'copilot' | 'unknown';
|
|
4
|
-
export type DeliveryEventType = 'prompt-submit' | 'pinned-manual' | 'pre-compact' | 'compact-resume';
|
|
5
|
-
/** True for the
|
|
4
|
+
export type DeliveryEventType = 'prompt-submit' | 'pinned-manual' | 'pre-compact' | 'compact-resume' | 'session-end' | 'context';
|
|
5
|
+
/** True for the boundary types: a compaction's two hooks and the end of a session. */
|
|
6
6
|
export declare const isBoundaryEvent: (type: DeliveryEventType) => boolean;
|
|
7
7
|
export type DeliverySurface = 'hook' | 'context';
|
|
8
8
|
export type DeliveryWriteStore = 'local' | 'global';
|
|
@@ -12,8 +12,8 @@ export type DeliveryPool = 'pin' | 'recent' | 'prompt-recall' | 'strength' | 'se
|
|
|
12
12
|
export type DeliveryStage = 'load' | 'eligible' | 'gate' | 'budget' | 'limit' | 'final';
|
|
13
13
|
export type DeliveryOutcome = 'emitted' | 'reused' | 'rejected';
|
|
14
14
|
export type DeliveryRejectReason = 'budget' | 'gate-below-threshold' | 'gate-max-items' | 'duplicate' | 'scope' | 'quality' | 'limit';
|
|
15
|
-
/** Row format version in `delivery_events.ledger_version`:
|
|
16
|
-
export declare const DELIVERY_LEDGER_VERSION =
|
|
15
|
+
/** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
|
|
16
|
+
export declare const DELIVERY_LEDGER_VERSION = 3;
|
|
17
17
|
/** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
|
|
18
18
|
export declare const DELIVERY_REJECTED_ROW_CAP = 16;
|
|
19
19
|
export interface DeliveryCandidateInput {
|
|
@@ -98,6 +98,10 @@ export interface DeliveryObserver {
|
|
|
98
98
|
};
|
|
99
99
|
}[]): void;
|
|
100
100
|
selected(items: readonly DeliverySelected[]): void;
|
|
101
|
+
/** A searching call's query, `*` for none; kept as its hash, the one the recall trace stores. */
|
|
102
|
+
queried(query: string): void;
|
|
103
|
+
/** The recall trace a call that returned rows wrote; null when the write failed or the store answers no id. */
|
|
104
|
+
traced(traceId: number | null): void;
|
|
101
105
|
}
|
|
102
106
|
/** What the renderer sent, reported once at its exit. */
|
|
103
107
|
export interface DeliveryOutcomeInput {
|
|
@@ -2,11 +2,13 @@ import { evalNow } from '../core/ablation.js';
|
|
|
2
2
|
import { scoreOverlap } from '../core/prompt-recall.js';
|
|
3
3
|
import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from './token-ledger.js';
|
|
4
4
|
import { blockHash, estimateTokens } from '../util/token-text.js';
|
|
5
|
-
import { errorMessage } from '../util/log.js';
|
|
6
|
-
/** True for the
|
|
7
|
-
export const isBoundaryEvent = (type) => type === 'pre-compact' || type === 'compact-resume';
|
|
8
|
-
/**
|
|
9
|
-
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
/** True for the boundary types: a compaction's two hooks and the end of a session. */
|
|
7
|
+
export const isBoundaryEvent = (type) => type === 'pre-compact' || type === 'compact-resume' || type === 'session-end';
|
|
8
|
+
/** Only the per-prompt calls keep prompt facts; a boundary or a `hippo context` run is not a prompt. */
|
|
9
|
+
const carriesPrompt = (type) => type === 'prompt-submit' || type === 'pinned-manual';
|
|
10
|
+
/** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
|
|
11
|
+
export const DELIVERY_LEDGER_VERSION = 3;
|
|
10
12
|
/** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
|
|
11
13
|
export const DELIVERY_REJECTED_ROW_CAP = 16;
|
|
12
14
|
// Deeper stages were closer to being sent, so the row cap keeps them first.
|
|
@@ -46,15 +48,22 @@ function rejectId(state, id, rejection) {
|
|
|
46
48
|
return;
|
|
47
49
|
state.candidates.set(id, { ...held, stage, reason, score, tokens });
|
|
48
50
|
}
|
|
51
|
+
function pickedPool(p, held) {
|
|
52
|
+
if (p.promptRecall)
|
|
53
|
+
return 'prompt-recall';
|
|
54
|
+
// A ranked call's rows keep the ranking that chose them, a pinned hit included.
|
|
55
|
+
if (held?.pool === 'search' || held?.pool === 'strength')
|
|
56
|
+
return held.pool;
|
|
57
|
+
return held?.pool === 'pin' || p.entry.pinned ? 'pin' : 'recent';
|
|
58
|
+
}
|
|
49
59
|
function pickedRows(state) {
|
|
50
60
|
const staticReused = state.outcome.staticReused === true;
|
|
51
61
|
const rows = [];
|
|
52
62
|
for (const p of state.picked.values()) {
|
|
53
|
-
const held = state.candidates.get(p.entry.id);
|
|
54
63
|
rows.push({
|
|
55
64
|
memoryId: p.entry.id,
|
|
56
65
|
sourceStore: p.sourceStore,
|
|
57
|
-
pool: p.
|
|
66
|
+
pool: pickedPool(p, state.candidates.get(p.entry.id)),
|
|
58
67
|
stage: 'final',
|
|
59
68
|
outcome: staticReused && !p.promptRecall ? 'reused' : 'emitted',
|
|
60
69
|
reason: null,
|
|
@@ -92,14 +101,14 @@ function buildEvent(init, payload, state, ts, startedMs) {
|
|
|
92
101
|
const rows = [...picked, ...rejected.rows];
|
|
93
102
|
const emitted = outcome.emittedText ?? null;
|
|
94
103
|
const eventType = init.eventType ?? (payload.hookEvent === 'UserPromptSubmit' ? 'prompt-submit' : 'pinned-manual');
|
|
95
|
-
//
|
|
96
|
-
const prompt =
|
|
104
|
+
// Whatever the payload holds, so a hook-run `hippo context` is never matched to an earlier row by its prompt.
|
|
105
|
+
const prompt = carriesPrompt(eventType) ? payload.prompt : null;
|
|
97
106
|
return {
|
|
98
107
|
ts,
|
|
99
108
|
tenantId: init.tenantId,
|
|
100
109
|
runtime: init.runtime ?? (payload.hostTurnId !== null ? 'codex' : payload.hookEvent !== null ? 'claude-code' : 'unknown'),
|
|
101
110
|
eventType,
|
|
102
|
-
surface: 'hook',
|
|
111
|
+
surface: eventType === 'context' ? 'context' : 'hook',
|
|
103
112
|
storeHash: init.storeHash,
|
|
104
113
|
writeStore: init.writeStore,
|
|
105
114
|
projectHash: facts !== null && facts.projectName !== '' ? blockHash(facts.projectName) : null,
|
|
@@ -108,8 +117,8 @@ function buildEvent(init, payload, state, ts, startedMs) {
|
|
|
108
117
|
hostTurnId: payload.hostTurnId,
|
|
109
118
|
promptHash: prompt !== null ? blockHash(prompt) : null,
|
|
110
119
|
promptLength: prompt?.length ?? 0,
|
|
111
|
-
queryHash:
|
|
112
|
-
recallTraceId:
|
|
120
|
+
queryHash: state.queryHash,
|
|
121
|
+
recallTraceId: state.recallTraceId,
|
|
113
122
|
blockState: state.disabledSeen ? 'disabled' : outcome.state,
|
|
114
123
|
promptRecall: facts?.promptRecall === true,
|
|
115
124
|
consideredCount: new Set([...state.candidates.keys(), ...state.picked.keys()]).size,
|
|
@@ -196,7 +205,7 @@ export function createDeliveryRecorder(init) {
|
|
|
196
205
|
const payload = readPayload(init);
|
|
197
206
|
const state = {
|
|
198
207
|
candidates: new Map(), picked: new Map(), filtered: new Set(), facts: null, shown: 0, dropped: 0,
|
|
199
|
-
disabledSeen: false, outcome: { state: 'empty' }, broken: null, flushed: false,
|
|
208
|
+
disabledSeen: false, outcome: { state: 'empty' }, queryHash: null, recallTraceId: null, broken: null, flushed: false,
|
|
200
209
|
};
|
|
201
210
|
const guard = guardFor(state, fault);
|
|
202
211
|
const { qualityDropped, offer, reject, dropMissing, gated, selected } = candidateMethods(state, guard);
|
|
@@ -217,14 +226,15 @@ export function createDeliveryRecorder(init) {
|
|
|
217
226
|
dropMissing,
|
|
218
227
|
gated,
|
|
219
228
|
selected,
|
|
229
|
+
queried: (query) => guard(() => { state.queryHash = blockHash(query); }),
|
|
230
|
+
traced: (traceId) => guard(() => { state.recallTraceId = traceId; }),
|
|
220
231
|
delivered: (o) => guard(() => { state.outcome = { ...o }; }),
|
|
221
232
|
flush: (write) => {
|
|
222
233
|
if (state.flushed)
|
|
223
234
|
return;
|
|
224
235
|
state.flushed = true;
|
|
225
236
|
if (state.broken !== null) {
|
|
226
|
-
|
|
227
|
-
console.error(`[hippo] delivery ledger skipped: recorder failed: ${state.broken}`);
|
|
237
|
+
log.warn(`delivery ledger skipped: recorder failed: ${state.broken}`);
|
|
228
238
|
return;
|
|
229
239
|
}
|
|
230
240
|
if (fault === 'build')
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// What `hippo doctor` and `hippo support-bundle` read from a store: one read-only open each, plain data out.
|
|
2
|
-
import {
|
|
2
|
+
import { countTableRows, ftsRowCounts, getMeta, getSchemaVersion, openHippoDbReadOnly } from '../db/index.js';
|
|
3
|
+
import { onHandle } from './open.js';
|
|
3
4
|
import { listTableNames } from '../db/tables.js';
|
|
4
5
|
import { errorMessage } from '../util/log.js';
|
|
5
6
|
import { compactionCountsAt, tokenTallySince } from './doctor-reads.js';
|
|
@@ -16,8 +17,7 @@ function attempt(read) {
|
|
|
16
17
|
}
|
|
17
18
|
/** Everything `hippo doctor` reads from one store; throws when it cannot be opened or its schema version read. */
|
|
18
19
|
export function readStoreHealth(hippoRoot, cutoffs) {
|
|
19
|
-
|
|
20
|
-
try {
|
|
20
|
+
return onHandle(hippoRoot, (db) => {
|
|
21
21
|
return {
|
|
22
22
|
schemaVersion: getSchemaVersion(db),
|
|
23
23
|
memories: countTableRows(db, 'memories'),
|
|
@@ -28,24 +28,17 @@ export function readStoreHealth(hippoRoot, cutoffs) {
|
|
|
28
28
|
lastSleep: attempt(() => lastConsolidationAt(db)),
|
|
29
29
|
compactions: attempt(() => compactionCountsAt(db, cutoffs.stuckBefore, cutoffs.transcriptFloor)),
|
|
30
30
|
};
|
|
31
|
-
}
|
|
32
|
-
finally {
|
|
33
|
-
closeHippoDb(db);
|
|
34
|
-
}
|
|
31
|
+
}, openHippoDbReadOnly);
|
|
35
32
|
}
|
|
36
33
|
/** Schema version, oldest allowed binary and row count of every table, for a support bundle; never reads a memory column. */
|
|
37
34
|
export function readStoreInventory(hippoRoot) {
|
|
38
|
-
|
|
39
|
-
try {
|
|
35
|
+
return onHandle(hippoRoot, (db) => {
|
|
40
36
|
const schemaVersion = getSchemaVersion(db);
|
|
41
37
|
const minCompatibleBinary = getMeta(db, 'min_compatible_binary', '') || null;
|
|
42
38
|
const tables = {};
|
|
43
39
|
for (const name of listTableNames(db))
|
|
44
40
|
tables[name] = countTableRows(db, name);
|
|
45
41
|
return { schemaVersion, minCompatibleBinary, tables };
|
|
46
|
-
}
|
|
47
|
-
finally {
|
|
48
|
-
closeHippoDb(db);
|
|
49
|
-
}
|
|
42
|
+
}, openHippoDbReadOnly);
|
|
50
43
|
}
|
|
51
44
|
//# sourceMappingURL=diagnostics.js.map
|
package/dist/store/dormant.d.ts
CHANGED
|
@@ -1,27 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* long one is kept).
|
|
5
|
-
*
|
|
6
|
-
* A dormant memory keeps its full content in `dormant_memories` (schema v44)
|
|
7
|
-
* but is no longer a `memories` row, so recall, context, every sleep pass and
|
|
8
|
-
* every other reader of `memories` stop seeing it exactly as if it had been
|
|
9
|
-
* deleted. `hippo dormant` lists and searches them, `hippo dormant restore`
|
|
10
|
-
* brings one back, `hippo dormant forget` deletes one for good.
|
|
11
|
-
*
|
|
12
|
-
* Not to be confused with the raw archive (`raw_archive`, `archiveRawMemory`,
|
|
13
|
-
* `hippo forget --archive`): that path removes a raw receipt's content and
|
|
14
|
-
* keeps only its metadata. A dormant memory keeps its content.
|
|
15
|
-
*
|
|
16
|
-
* The db-taking helpers leave the handle and any transaction to the caller.
|
|
17
|
-
* The hippoRoot-taking functions at the end open one of their own, for
|
|
18
|
-
* api.listDormant / restoreDormant / forgetDormant / isDormant.
|
|
19
|
-
*/
|
|
1
|
+
/** Dormant memories: what sleep does with a faded memory instead of deleting it (config `dormant.enabled`; `retentionDays` bounds how long one is kept).
|
|
2
|
+
* Content stays in `dormant_memories` (schema v44) and the `memories` row goes, so every reader of `memories` stops seeing it, as if deleted.
|
|
3
|
+
* Not the raw archive (`raw_archive`, `archiveRawMemory`), which keeps metadata only. db-taking helpers leave the handle and transaction to the caller. */
|
|
20
4
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
21
5
|
import type { MemoryEntry } from '../core/memory.js';
|
|
22
6
|
import type { SqlFragment } from './recall-scope.js';
|
|
23
7
|
import type { WriteBudget } from '../util/write-budget.js';
|
|
24
|
-
/** Why a memory went dormant: sleep's decay pass, an imported agent memory whose note was deleted, `hippo projects repair`
|
|
8
|
+
/** Why a memory went dormant: sleep's decay pass, an imported agent memory whose note was deleted, `hippo projects repair`
|
|
9
|
+
* splitting a two-project merge, or `hippo audit repair` setting aside an automatic memory with a certain defect. */
|
|
25
10
|
export type DormantReason = 'decay' | 'source-deleted' | 'project-repair' | 'quality-repair';
|
|
26
11
|
/** One memory that sleep is moving out of active memory into the dormant store. */
|
|
27
12
|
export interface DormantMove {
|
|
@@ -53,11 +38,7 @@ export interface ListDormantOpts {
|
|
|
53
38
|
/** Maximum rows returned, newest first. Default 20. */
|
|
54
39
|
limit?: number;
|
|
55
40
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Insert (or refresh) the dormant snapshot for `move.entry`. Does not touch
|
|
58
|
-
* the `memories` row: the caller deletes it in the same transaction, so the
|
|
59
|
-
* memory is never in both places or in neither.
|
|
60
|
-
*/
|
|
41
|
+
/** Insert (or refresh) the dormant snapshot for `move.entry`; the caller deletes the `memories` row in the same transaction. */
|
|
61
42
|
export declare function insertDormantRow(db: DatabaseSyncLike, move: DormantMove): void;
|
|
62
43
|
/** A dormant memory's stored snapshot plus when and why it went dormant. */
|
|
63
44
|
export interface DormantSnapshot {
|
|
@@ -66,10 +47,7 @@ export interface DormantSnapshot {
|
|
|
66
47
|
strength: number;
|
|
67
48
|
dormantAt: string;
|
|
68
49
|
}
|
|
69
|
-
/**
|
|
70
|
-
* The stored snapshot for a tenant's dormant memory, or null when the tenant
|
|
71
|
-
* has no dormant memory with that id (another tenant's id reads as absent).
|
|
72
|
-
*/
|
|
50
|
+
/** A tenant's stored dormant snapshot, or null when it has none with that id (another tenant's id reads as absent). */
|
|
73
51
|
export declare function readDormantSnapshot(db: DatabaseSyncLike, tenantId: string, id: string): DormantSnapshot | null;
|
|
74
52
|
/** Every dormant memory of a tenant whose snapshot still reads back. */
|
|
75
53
|
export declare function listDormantSnapshots(db: DatabaseSyncLike, tenantId: string): DormantSnapshot[];
|
package/dist/store/dormant.js
CHANGED
|
@@ -1,23 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* long one is kept).
|
|
5
|
-
*
|
|
6
|
-
* A dormant memory keeps its full content in `dormant_memories` (schema v44)
|
|
7
|
-
* but is no longer a `memories` row, so recall, context, every sleep pass and
|
|
8
|
-
* every other reader of `memories` stop seeing it exactly as if it had been
|
|
9
|
-
* deleted. `hippo dormant` lists and searches them, `hippo dormant restore`
|
|
10
|
-
* brings one back, `hippo dormant forget` deletes one for good.
|
|
11
|
-
*
|
|
12
|
-
* Not to be confused with the raw archive (`raw_archive`, `archiveRawMemory`,
|
|
13
|
-
* `hippo forget --archive`): that path removes a raw receipt's content and
|
|
14
|
-
* keeps only its metadata. A dormant memory keeps its content.
|
|
15
|
-
*
|
|
16
|
-
* The db-taking helpers leave the handle and any transaction to the caller.
|
|
17
|
-
* The hippoRoot-taking functions at the end open one of their own, for
|
|
18
|
-
* api.listDormant / restoreDormant / forgetDormant / isDormant.
|
|
19
|
-
*/
|
|
1
|
+
/** Dormant memories: what sleep does with a faded memory instead of deleting it (config `dormant.enabled`; `retentionDays` bounds how long one is kept).
|
|
2
|
+
* Content stays in `dormant_memories` (schema v44) and the `memories` row goes, so every reader of `memories` stops seeing it, as if deleted.
|
|
3
|
+
* Not the raw archive (`raw_archive`, `archiveRawMemory`), which keeps metadata only. db-taking helpers leave the handle and transaction to the caller. */
|
|
20
4
|
import { closeHippoDb, openHippoDb, withWriteScope, withWriteScopeOr } from '../db/index.js';
|
|
5
|
+
import { onHandle } from './open.js';
|
|
21
6
|
import { RejectedValueError, rejectionDigest } from './rejection.js';
|
|
22
7
|
import { escapeLike } from '../util/escape.js';
|
|
23
8
|
import { warnDamagedColumn } from '../util/stored-json.js';
|
|
@@ -27,11 +12,7 @@ import { audit, auditRejectionRefusal } from './audit-event.js';
|
|
|
27
12
|
import { entryIdTakenAt } from './entry-reads.js';
|
|
28
13
|
import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
|
|
29
14
|
const DEFAULT_LIST_LIMIT = 20;
|
|
30
|
-
/**
|
|
31
|
-
* Insert (or refresh) the dormant snapshot for `move.entry`. Does not touch
|
|
32
|
-
* the `memories` row: the caller deletes it in the same transaction, so the
|
|
33
|
-
* memory is never in both places or in neither.
|
|
34
|
-
*/
|
|
15
|
+
/** Insert (or refresh) the dormant snapshot for `move.entry`; the caller deletes the `memories` row in the same transaction. */
|
|
35
16
|
export function insertDormantRow(db, move) {
|
|
36
17
|
db.prepare(`
|
|
37
18
|
INSERT INTO dormant_memories (tenant_id, id, content, entry_json, reason, strength, dormant_at)
|
|
@@ -44,10 +25,7 @@ export function insertDormantRow(db, move) {
|
|
|
44
25
|
dormant_at = excluded.dormant_at
|
|
45
26
|
`).run(move.entry.tenantId, move.entry.id, move.entry.content, JSON.stringify(move.entry), move.reason, move.strength, move.dormantAt);
|
|
46
27
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Parse a stored snapshot back into a MemoryEntry, or null when the row no
|
|
49
|
-
* longer matches the snapshot it carries (edited by hand, or truncated).
|
|
50
|
-
*/
|
|
28
|
+
/** Parse a stored snapshot back into a MemoryEntry, or null when the row no longer matches it (edited by hand, or truncated). */
|
|
51
29
|
function parseSnapshot(row) {
|
|
52
30
|
try {
|
|
53
31
|
// SAFETY: entry_json is only written by insertDormantRow from a MemoryEntry;
|
|
@@ -94,10 +72,7 @@ function listDormantRows(db, tenantId, opts = {}, admit = EVERY_SCOPE) {
|
|
|
94
72
|
LIMIT ?`).all(tenantId, ...admit.params, ...terms.map((t) => `%${escapeLike(t)}%`), limit);
|
|
95
73
|
return rows.map(rowToDormantMemory);
|
|
96
74
|
}
|
|
97
|
-
/**
|
|
98
|
-
* The stored snapshot for a tenant's dormant memory, or null when the tenant
|
|
99
|
-
* has no dormant memory with that id (another tenant's id reads as absent).
|
|
100
|
-
*/
|
|
75
|
+
/** A tenant's stored dormant snapshot, or null when it has none with that id (another tenant's id reads as absent). */
|
|
101
76
|
export function readDormantSnapshot(db, tenantId, id) {
|
|
102
77
|
// SAFETY: row's shape matches the seven columns named in the SELECT.
|
|
103
78
|
const row = db.prepare(`SELECT tenant_id, id, content, entry_json, reason, strength, dormant_at
|
|
@@ -193,23 +168,15 @@ export async function expireDormantBefore(hippoRoot, cutoffIso, opts) {
|
|
|
193
168
|
}
|
|
194
169
|
/** A tenant's dormant memories whose scope `admit` passes, newest first, read on a handle of its own. */
|
|
195
170
|
export function loadDormantMemories(hippoRoot, tenantId, opts = {}, admit = EVERY_SCOPE) {
|
|
196
|
-
|
|
197
|
-
try {
|
|
171
|
+
return onHandle(hippoRoot, (db) => {
|
|
198
172
|
return listDormantRows(db, tenantId, opts, admit);
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
closeHippoDb(db);
|
|
202
|
-
}
|
|
173
|
+
});
|
|
203
174
|
}
|
|
204
175
|
/** Whether a tenant holds a dormant memory with this id whose scope `admit` passes, read on a handle of its own. */
|
|
205
176
|
export function holdsDormantMemory(hippoRoot, tenantId, id, admit = EVERY_SCOPE) {
|
|
206
|
-
|
|
207
|
-
try {
|
|
177
|
+
return onHandle(hippoRoot, (db) => {
|
|
208
178
|
return hasDormantRow(db, tenantId, id, admit);
|
|
209
|
-
}
|
|
210
|
-
finally {
|
|
211
|
-
closeHippoDb(db);
|
|
212
|
-
}
|
|
179
|
+
});
|
|
213
180
|
}
|
|
214
181
|
function auditDormantRestore(db, restore, snapshot, now) {
|
|
215
182
|
appendAuditEvent(db, {
|
|
@@ -244,8 +211,7 @@ function restoreInWriteScope(db, restore) {
|
|
|
244
211
|
}
|
|
245
212
|
/** Brings one dormant memory back on a single handle: the live row, the dormant delete and the audit row commit together, then its mirrors are written. */
|
|
246
213
|
export function restoreDormantMemory(hippoRoot, restore) {
|
|
247
|
-
|
|
248
|
-
try {
|
|
214
|
+
return onHandle(hippoRoot, (db) => {
|
|
249
215
|
let outcome;
|
|
250
216
|
try {
|
|
251
217
|
outcome = restoreInWriteScope(db, restore);
|
|
@@ -259,24 +225,17 @@ export function restoreDormantMemory(hippoRoot, restore) {
|
|
|
259
225
|
if (outcome.status === 'restored')
|
|
260
226
|
writeEntryMirrors(hippoRoot, outcome.entry);
|
|
261
227
|
return outcome;
|
|
262
|
-
}
|
|
263
|
-
finally {
|
|
264
|
-
closeHippoDb(db);
|
|
265
|
-
}
|
|
228
|
+
});
|
|
266
229
|
}
|
|
267
230
|
/** Deletes a tenant's dormant memory for good and writes its `forget` audit row, on a single handle; false when it holds none `admit` passes. */
|
|
268
231
|
export function forgetDormantMemory(hippoRoot, forget) {
|
|
269
232
|
const { tenantId, id, actor, admit } = forget;
|
|
270
|
-
|
|
271
|
-
try {
|
|
233
|
+
return onHandle(hippoRoot, (db) => {
|
|
272
234
|
if (!hasDormantRow(db, tenantId, id, admit) || !deleteDormantRow(db, tenantId, id))
|
|
273
235
|
return false;
|
|
274
236
|
// Best-effort, like every other forget audit row: the delete stands.
|
|
275
237
|
audit(db, 'forget', { tenantId, actor, targetId: id, metadata: { dormant: true } });
|
|
276
238
|
return true;
|
|
277
|
-
}
|
|
278
|
-
finally {
|
|
279
|
-
closeHippoDb(db);
|
|
280
|
-
}
|
|
239
|
+
});
|
|
281
240
|
}
|
|
282
241
|
//# sourceMappingURL=dormant.js.map
|