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,54 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* imports) can apply the same default-deny rule to searchBothHybrid's internal
|
|
4
|
-
* candidate loads without an import cycle. api.ts imports
|
|
5
|
-
* these for its own call sites AND re-exports them for back-compat
|
|
6
|
-
* (`api.isPrivateScope`, test imports of `passesScopeFilterForRecall`).
|
|
7
|
-
*/
|
|
1
|
+
/** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
|
|
2
|
+
* import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
|
|
8
3
|
import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
|
|
9
4
|
import { MAX_ID_LEN } from '../util/http-util.js';
|
|
10
|
-
/**
|
|
11
|
-
*
|
|
12
|
-
* caller passes no `scope`. The SQL clause in `loadSearchRows` and the JS
|
|
13
|
-
* helper `passesScopeFilterForRecall` (src/api/index.ts) both read from this
|
|
14
|
-
* constant. Adding a deny scope is a one-place change.
|
|
15
|
-
*
|
|
16
|
-
* Regex-based denies (e.g. `<source>:private:*`) stay in
|
|
17
|
-
* `passesScopeFilterForRecall` as a separate JS step — they don't translate
|
|
18
|
-
* cleanly to SQL.
|
|
19
|
-
*
|
|
20
|
-
* Invariant: never empty. An empty array would silently allow quarantine
|
|
21
|
-
* scopes through both paths (SQL clause omitted, JS check vacuous). The
|
|
22
|
-
* module-load assertion below pins this loudly.
|
|
23
|
-
*/
|
|
5
|
+
/** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
|
|
6
|
+
* `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
|
|
24
7
|
export const RECALL_DEFAULT_DENY_SCOPES = ['unknown:legacy'];
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
27
|
-
* load-bearing literal array. Extracted from the inline guard so the throw
|
|
28
|
-
* path is directly testable. `as const` arrays widen via `readonly T[]` at
|
|
29
|
-
* the call site so the empty case is reachable at runtime.
|
|
30
|
-
*/
|
|
8
|
+
/** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
|
|
9
|
+
* is reachable and testable. */
|
|
31
10
|
export function assertNonEmpty(arr, name) {
|
|
32
11
|
if (arr.length === 0) {
|
|
33
12
|
throw new Error(`${name} cannot be empty — would silently allow quarantine scopes`);
|
|
34
13
|
}
|
|
35
14
|
}
|
|
36
15
|
assertNonEmpty(RECALL_DEFAULT_DENY_SCOPES, 'RECALL_DEFAULT_DENY_SCOPES');
|
|
37
|
-
/**
|
|
38
|
-
*
|
|
39
|
-
* as private when it has the shape `<lowercase-source>:private:<rest>`.
|
|
40
|
-
*
|
|
41
|
-
* Examples that match:
|
|
42
|
-
* slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
|
|
43
|
-
* Examples that DO NOT match:
|
|
44
|
-
* slack:public:Cgeneral, acme:public:my-private-channel, null, '',
|
|
45
|
-
* 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
|
|
46
|
-
*
|
|
47
|
-
* Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
|
|
48
|
-
* cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
|
|
49
|
-
* recall mode). Keep these in sync — the export is the single source of
|
|
50
|
-
* truth so connector work cannot drift.
|
|
51
|
-
*/
|
|
16
|
+
/** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
|
|
17
|
+
* 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
|
|
52
18
|
export const PRIVATE_SCOPE_RE = /^[a-z][a-z0-9_-]*:private:/;
|
|
53
19
|
function isScopeString(value) {
|
|
54
20
|
return typeof value === 'string';
|
|
@@ -89,15 +55,8 @@ export function canTouchScope(actor, scope) {
|
|
|
89
55
|
export function ownScopeTouches(ownScope, scope) {
|
|
90
56
|
return !isPersonalScope(scope) || scope === ownScope;
|
|
91
57
|
}
|
|
92
|
-
/**
|
|
93
|
-
*
|
|
94
|
-
* rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
|
|
95
|
-
*
|
|
96
|
-
* - When `requested` is set and non-empty: exact match required.
|
|
97
|
-
* - When `requested` is undefined/empty: default-deny on any
|
|
98
|
-
* `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
|
|
99
|
-
* quarantine buckets. `null` and public scopes pass, and so does `ownScope`, the caller's own personal scope.
|
|
100
|
-
*/
|
|
58
|
+
/** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
|
|
59
|
+
* otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
|
|
101
60
|
export function passesScopeFilterForRecall(scope, requested, ownScope) {
|
|
102
61
|
if (requested !== undefined && requested !== '') {
|
|
103
62
|
return scope === requested;
|
|
@@ -113,40 +72,23 @@ export function scopeAdmitSql(col, ownScope) {
|
|
|
113
72
|
// The own arm sits inside the outer parentheses so a caller's `AND ${sql}` cannot split it off.
|
|
114
73
|
return { sql: `(${admitted} OR ${col}scope = ?)`, params: [...RECALL_DEFAULT_DENY_SCOPES, ownScope] };
|
|
115
74
|
}
|
|
116
|
-
/** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
|
|
75
|
+
/** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
|
|
76
|
+
* another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
|
|
117
77
|
export function touchableScopeSql(col, ownScope) {
|
|
118
78
|
const notPersonal = `${col}scope IS NULL OR ${col}scope NOT LIKE '${PERSONAL_SCOPE_PREFIX}%'`;
|
|
119
79
|
if (ownScope == null)
|
|
120
80
|
return { sql: `(${notPersonal})`, params: [] };
|
|
121
81
|
return { sql: `(${notPersonal} OR ${col}scope = ?)`, params: [ownScope] };
|
|
122
82
|
}
|
|
123
|
-
/**
|
|
124
|
-
*
|
|
125
|
-
* SQL 'default-deny-or-exact' mode in loadSearchRows).
|
|
126
|
-
*
|
|
127
|
-
* The CLI flag predates the envelope column as a TAG-boost ranking hint
|
|
128
|
-
* (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
|
|
129
|
-
* UNLOCKS envelope scope X in addition to the default-admitted set — it does
|
|
130
|
-
* NOT narrow the result to X (that would return zero rows for every
|
|
131
|
-
* tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
|
|
132
|
-
* narrowing 'exact' semantics via `passesScopeFilterForRecall`.
|
|
133
|
-
*
|
|
134
|
-
* Note the unlock applies to whatever scope was explicitly named — including
|
|
135
|
-
* a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
|
|
136
|
-
* deliberate owner access, identical in reach to api.recall's exact-match
|
|
137
|
-
* for the same input; only NON-requested private/quarantine scopes stay
|
|
138
|
-
* denied. A named personal scope never unlocks: the CLI has no caller identity to check it against.
|
|
139
|
-
*/
|
|
83
|
+
/** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
|
|
84
|
+
* Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
|
|
140
85
|
export function passesCliRecallScopeFilter(scope, requested) {
|
|
141
86
|
if (requested !== undefined && requested !== '' && !isPersonalScope(requested) && scope === requested) {
|
|
142
87
|
return true;
|
|
143
88
|
}
|
|
144
89
|
return passesScopeFilterForRecall(scope, undefined);
|
|
145
90
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Thrown when a caller requests a scope its role may not read. The HTTP layer
|
|
148
|
-
* maps it to 403.
|
|
149
|
-
*/
|
|
91
|
+
/** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
|
|
150
92
|
export class ScopeForbiddenError extends ForbiddenError {
|
|
151
93
|
scope;
|
|
152
94
|
constructor(scope) {
|
|
@@ -155,20 +97,17 @@ export class ScopeForbiddenError extends ForbiddenError {
|
|
|
155
97
|
this.scope = scope;
|
|
156
98
|
}
|
|
157
99
|
}
|
|
158
|
-
/**
|
|
159
|
-
*
|
|
160
|
-
* quarantine buckets. Naming one explicitly is what unlocks it, so naming one
|
|
161
|
-
* is the act that needs authorization.
|
|
162
|
-
*/
|
|
100
|
+
/** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
|
|
101
|
+
* authorization. */
|
|
163
102
|
export function isRestrictedScope(scope) {
|
|
164
103
|
if (!isScopeString(scope))
|
|
165
104
|
return false;
|
|
166
|
-
// SAFETY: RECALL_DEFAULT_DENY_SCOPES is a readonly tuple of string
|
|
167
|
-
//
|
|
168
|
-
// `:private:` anywhere, any case, matches the store's SQL default-deny (store/search-rows.ts) so JS never admits what SQL hides.
|
|
105
|
+
// SAFETY: RECALL_DEFAULT_DENY_SCOPES is a readonly tuple of string literals; widening the array lets .includes() take any scope.
|
|
106
|
+
// `:private:` anywhere, any case, matches the SQL default-deny in src/store/search-rows.ts so JS never admits what SQL hides.
|
|
169
107
|
return isPrivateScope(scope) || /:private:/i.test(scope) || RECALL_DEFAULT_DENY_SCOPES.includes(scope);
|
|
170
108
|
}
|
|
171
|
-
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
109
|
+
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
110
|
+
* open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
|
|
172
111
|
export function canReadScope(actor, scope) {
|
|
173
112
|
if (isPersonalScope(scope))
|
|
174
113
|
return scope === personalScopeOf(actor);
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Single producer for the `recall_traces` / `recall_trace_results` /
|
|
5
|
-
* `recall_trace_outcomes` tables (schema v40). Every recall on the three
|
|
6
|
-
* wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
|
|
7
|
-
* row: the ids + ranks + scores actually returned. Outcome events that
|
|
8
|
-
* resolve their targets from last-retrieval state link back to the trace
|
|
9
|
-
* they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
|
|
10
|
-
* training triple every Track LC learned component needs.
|
|
11
|
-
*
|
|
12
|
-
* All writes here are fail-soft: a broken trace write must never break the
|
|
13
|
-
* surrounding recall or outcome call. Failures are logged to stderr and
|
|
14
|
-
* swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
|
|
15
|
-
* new debug env var).
|
|
16
|
-
*/
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
|
|
2
|
+
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
|
|
3
|
+
* All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
|
|
17
4
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
18
5
|
import type { RerankStep } from '../core/search-types.js';
|
|
19
6
|
import { type DeliveryEventInput } from './delivery-recorder.js';
|
|
@@ -31,7 +18,7 @@ export interface RecallTraceInput {
|
|
|
31
18
|
sessionId?: string | null;
|
|
32
19
|
pipeline: 'api' | 'cli' | 'context' | 'mcp';
|
|
33
20
|
/** Raw query text. NEVER persisted — only its sha256/16 hash + length are
|
|
34
|
-
* stored (GDPR Path A / audit convention,
|
|
21
|
+
* stored (GDPR Path A / audit convention, CLI). */
|
|
35
22
|
query: string;
|
|
36
23
|
/** True when the caller ran with explain/--why (per-result rerank steps
|
|
37
24
|
* may be present). Defaults to false. */
|
|
@@ -39,39 +26,11 @@ export interface RecallTraceInput {
|
|
|
39
26
|
/** Results in returned rank order (index 0 = rank 1). */
|
|
40
27
|
results: RecallTraceResultInput[];
|
|
41
28
|
}
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
45
|
-
* logs to stderr and returns null on any failure.
|
|
46
|
-
*
|
|
47
|
-
* Connection policy: api.recall and api.getContext reach this through
|
|
48
|
-
* `finishRecallAt`, on the handle that recall's other writes use. CLI
|
|
49
|
-
* cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
|
|
50
|
-
* handle is already closed by the time tracing runs.
|
|
51
|
-
*/
|
|
29
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
|
|
30
|
+
* api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
|
|
52
31
|
export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
56
|
-
* failure (fail-soft).
|
|
57
|
-
*
|
|
58
|
-
* Used at CLI cmdRecall, where the block's own convention is per-call
|
|
59
|
-
* handles (writeEntry, saveIndex) and the earlier audit handle is already
|
|
60
|
-
* closed. NOT used by api.recall, which must reuse the caller's open handle
|
|
61
|
-
* (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
|
|
62
|
-
*
|
|
63
|
-
* This function does NOT touch the `last_trace_id` meta key: its own connection
|
|
64
|
-
* would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
|
|
65
|
-
* INVARIANT: `last_trace_id` must only ever advance in the SAME write as
|
|
66
|
-
* `last_retrieval_ids`. The caller now does: call this function FIRST, set
|
|
67
|
-
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
68
|
-
* once — `saveIndex` persists both meta keys in one transaction
|
|
69
|
-
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
70
|
-
* (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
|
|
71
|
-
* all, so they can't desync by construction.
|
|
72
|
-
*
|
|
73
|
-
* Fail-soft: never throws, including on connection failure.
|
|
74
|
-
*/
|
|
32
|
+
/** Short-lived connection at `root`: writes the trace, closes; returns the id or null (fail-soft). For CLI cmdRecall; api.recall must reuse its open handle.
|
|
33
|
+
* LOCKSTEP: never touches `last_trace_id`, which advances only in the same `saveIndex` write as `last_retrieval_ids`; the caller sets it from the id. */
|
|
75
34
|
export declare function writeRecallTraceAtRoot(root: string, input: RecallTraceInput): number | null;
|
|
76
35
|
/** Input to `recordTraceOutcome`. */
|
|
77
36
|
export interface RecordTraceOutcomeInput {
|
|
@@ -81,34 +40,8 @@ export interface RecordTraceOutcomeInput {
|
|
|
81
40
|
/** Ids actually credited by this outcome event (post tenant-filtering). */
|
|
82
41
|
memoryIds: string[];
|
|
83
42
|
}
|
|
84
|
-
/**
|
|
85
|
-
*
|
|
86
|
-
* outcome) triple. Called ONLY where the credited ids actually come from
|
|
87
|
-
* the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
|
|
88
|
-
* flow that resolves its targets from last-retrieval state) or from an
|
|
89
|
-
* SDK caller's explicit `traceId` opt — never unconditionally from
|
|
90
|
-
* api.outcome, which would mislink an explicit-id caller to a stale,
|
|
91
|
-
* unrelated trace.
|
|
92
|
-
*
|
|
93
|
-
* Lives in its own append-only table, not audit_log metadata: audit_log is
|
|
94
|
-
* pruned by `pruneAuditLog`, and pruning must never erase training data.
|
|
95
|
-
*
|
|
96
|
-
* Validation: `traceId`/`memoryIds` reach
|
|
97
|
-
* this function from caller-side state (`last_trace_id` / applied outcome
|
|
98
|
-
* ids) that can go stale relative to the trace it names — a forgotten
|
|
99
|
-
* memory, a tenant switch mid-session, or a race between two callers. Two
|
|
100
|
-
* checks run before the insert, both skip with one log.warn line
|
|
101
|
-
* rather than throw:
|
|
102
|
-
* 1. The named trace must exist and belong to `input.tenantId` — a
|
|
103
|
-
* tenant mismatch or a dangling id (deleted trace) skips.
|
|
104
|
-
* 2. `input.memoryIds` is intersected against the trace's OWN
|
|
105
|
-
* `recall_trace_results.memory_id` set — only ids that trace actually
|
|
106
|
-
* returned are recorded. An id that was never in this trace's result
|
|
107
|
-
* set (stale caller state) is silently dropped rather than recorded
|
|
108
|
-
* as a false credit. If the intersection is empty, no row is written.
|
|
109
|
-
*
|
|
110
|
-
* Fail-soft: never throws.
|
|
111
|
-
*/
|
|
43
|
+
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from api.outcome (stale-trace mislink).
|
|
44
|
+
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
112
45
|
export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTraceOutcomeInput): void;
|
|
113
46
|
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
|
|
114
47
|
export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
|
|
@@ -1,33 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Single producer for the `recall_traces` / `recall_trace_results` /
|
|
5
|
-
* `recall_trace_outcomes` tables (schema v40). Every recall on the three
|
|
6
|
-
* wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
|
|
7
|
-
* row: the ids + ranks + scores actually returned. Outcome events that
|
|
8
|
-
* resolve their targets from last-retrieval state link back to the trace
|
|
9
|
-
* they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
|
|
10
|
-
* training triple every Track LC learned component needs.
|
|
11
|
-
*
|
|
12
|
-
* All writes here are fail-soft: a broken trace write must never break the
|
|
13
|
-
* surrounding recall or outcome call. Failures are logged to stderr and
|
|
14
|
-
* swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
|
|
15
|
-
* new debug env var).
|
|
16
|
-
*/
|
|
17
|
-
import { createHash } from 'node:crypto';
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
|
|
2
|
+
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
|
|
3
|
+
* All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
|
|
18
4
|
import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked, withWriteScope } from '../db/index.js';
|
|
19
5
|
import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
|
|
20
|
-
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
21
7
|
import { DAY_MS } from '../util/time.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*
|
|
25
|
-
* free-form human text — the CLI's goal-boost step embeds matched goal tag
|
|
26
|
-
* text there, so persisting it verbatim would leak raw user content into
|
|
27
|
-
* training data via `rerank_json`. Only the four structured fields survive;
|
|
28
|
-
* any other/future free-form field is dropped by construction (allowlist,
|
|
29
|
-
* not a denylist).
|
|
30
|
-
*/
|
|
8
|
+
import { blockHash } from '../util/token-text.js';
|
|
9
|
+
/** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step embeds goal tag text) and would leak
|
|
10
|
+
* user content into `rerank_json`; an allowlist, so any future free-form field is dropped too. */
|
|
31
11
|
function sanitizeRerankSteps(steps) {
|
|
32
12
|
return steps.map((s) => ({
|
|
33
13
|
stage: s.stage,
|
|
@@ -36,19 +16,11 @@ function sanitizeRerankSteps(steps) {
|
|
|
36
16
|
scoreAfter: s.scoreAfter,
|
|
37
17
|
}));
|
|
38
18
|
}
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
42
|
-
* logs to stderr and returns null on any failure.
|
|
43
|
-
*
|
|
44
|
-
* Connection policy: api.recall and api.getContext reach this through
|
|
45
|
-
* `finishRecallAt`, on the handle that recall's other writes use. CLI
|
|
46
|
-
* cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
|
|
47
|
-
* handle is already closed by the time tracing runs.
|
|
48
|
-
*/
|
|
19
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
|
|
20
|
+
* api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
|
|
49
21
|
export function writeRecallTrace(db, input) {
|
|
50
22
|
try {
|
|
51
|
-
const queryHash =
|
|
23
|
+
const queryHash = blockHash(input.query);
|
|
52
24
|
const ts = new Date().toISOString();
|
|
53
25
|
return withWriteScope(db, 'write_recall_trace', () => {
|
|
54
26
|
const insertTrace = db.prepare(`
|
|
@@ -68,32 +40,12 @@ export function writeRecallTrace(db, input) {
|
|
|
68
40
|
});
|
|
69
41
|
}
|
|
70
42
|
catch (error) {
|
|
71
|
-
log.error(`recall trace write failed: ${errorMessage(error)}
|
|
43
|
+
log.error(`recall trace write failed: ${errorMessage(error)}`, errorFields(error));
|
|
72
44
|
return null;
|
|
73
45
|
}
|
|
74
46
|
}
|
|
75
|
-
/**
|
|
76
|
-
*
|
|
77
|
-
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
78
|
-
* failure (fail-soft).
|
|
79
|
-
*
|
|
80
|
-
* Used at CLI cmdRecall, where the block's own convention is per-call
|
|
81
|
-
* handles (writeEntry, saveIndex) and the earlier audit handle is already
|
|
82
|
-
* closed. NOT used by api.recall, which must reuse the caller's open handle
|
|
83
|
-
* (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
|
|
84
|
-
*
|
|
85
|
-
* This function does NOT touch the `last_trace_id` meta key: its own connection
|
|
86
|
-
* would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
|
|
87
|
-
* INVARIANT: `last_trace_id` must only ever advance in the SAME write as
|
|
88
|
-
* `last_retrieval_ids`. The caller now does: call this function FIRST, set
|
|
89
|
-
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
90
|
-
* once — `saveIndex` persists both meta keys in one transaction
|
|
91
|
-
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
92
|
-
* (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
|
|
93
|
-
* all, so they can't desync by construction.
|
|
94
|
-
*
|
|
95
|
-
* Fail-soft: never throws, including on connection failure.
|
|
96
|
-
*/
|
|
47
|
+
/** Short-lived connection at `root`: writes the trace, closes; returns the id or null (fail-soft). For CLI cmdRecall; api.recall must reuse its open handle.
|
|
48
|
+
* LOCKSTEP: never touches `last_trace_id`, which advances only in the same `saveIndex` write as `last_retrieval_ids`; the caller sets it from the id. */
|
|
97
49
|
export function writeRecallTraceAtRoot(root, input) {
|
|
98
50
|
let db;
|
|
99
51
|
try {
|
|
@@ -101,7 +53,7 @@ export function writeRecallTraceAtRoot(root, input) {
|
|
|
101
53
|
}
|
|
102
54
|
catch (error) {
|
|
103
55
|
rethrowIfSqliteBlocked(error);
|
|
104
|
-
log.error(`recall trace connection failed: ${errorMessage(error)}
|
|
56
|
+
log.error(`recall trace connection failed: ${errorMessage(error)}`, errorFields(error));
|
|
105
57
|
return null;
|
|
106
58
|
}
|
|
107
59
|
try {
|
|
@@ -111,34 +63,8 @@ export function writeRecallTraceAtRoot(root, input) {
|
|
|
111
63
|
closeHippoDb(db);
|
|
112
64
|
}
|
|
113
65
|
}
|
|
114
|
-
/**
|
|
115
|
-
*
|
|
116
|
-
* outcome) triple. Called ONLY where the credited ids actually come from
|
|
117
|
-
* the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
|
|
118
|
-
* flow that resolves its targets from last-retrieval state) or from an
|
|
119
|
-
* SDK caller's explicit `traceId` opt — never unconditionally from
|
|
120
|
-
* api.outcome, which would mislink an explicit-id caller to a stale,
|
|
121
|
-
* unrelated trace.
|
|
122
|
-
*
|
|
123
|
-
* Lives in its own append-only table, not audit_log metadata: audit_log is
|
|
124
|
-
* pruned by `pruneAuditLog`, and pruning must never erase training data.
|
|
125
|
-
*
|
|
126
|
-
* Validation: `traceId`/`memoryIds` reach
|
|
127
|
-
* this function from caller-side state (`last_trace_id` / applied outcome
|
|
128
|
-
* ids) that can go stale relative to the trace it names — a forgotten
|
|
129
|
-
* memory, a tenant switch mid-session, or a race between two callers. Two
|
|
130
|
-
* checks run before the insert, both skip with one log.warn line
|
|
131
|
-
* rather than throw:
|
|
132
|
-
* 1. The named trace must exist and belong to `input.tenantId` — a
|
|
133
|
-
* tenant mismatch or a dangling id (deleted trace) skips.
|
|
134
|
-
* 2. `input.memoryIds` is intersected against the trace's OWN
|
|
135
|
-
* `recall_trace_results.memory_id` set — only ids that trace actually
|
|
136
|
-
* returned are recorded. An id that was never in this trace's result
|
|
137
|
-
* set (stale caller state) is silently dropped rather than recorded
|
|
138
|
-
* as a false credit. If the intersection is empty, no row is written.
|
|
139
|
-
*
|
|
140
|
-
* Fail-soft: never throws.
|
|
141
|
-
*/
|
|
66
|
+
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from api.outcome (stale-trace mislink).
|
|
67
|
+
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
142
68
|
export function recordTraceOutcome(db, input) {
|
|
143
69
|
try {
|
|
144
70
|
// SAFETY: row shape matches the single `tenant_id` column named in the
|
|
@@ -165,7 +91,7 @@ export function recordTraceOutcome(db, input) {
|
|
|
165
91
|
`).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
|
|
166
92
|
}
|
|
167
93
|
catch (error) {
|
|
168
|
-
log.error(`recall trace outcome write failed: ${errorMessage(error)}
|
|
94
|
+
log.error(`recall trace outcome write failed: ${errorMessage(error)}`, errorFields(error));
|
|
169
95
|
}
|
|
170
96
|
}
|
|
171
97
|
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
|
|
@@ -258,8 +184,7 @@ export function writeDeliveryEvent(db, input) {
|
|
|
258
184
|
});
|
|
259
185
|
}
|
|
260
186
|
catch (error) {
|
|
261
|
-
|
|
262
|
-
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
187
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`);
|
|
263
188
|
return null;
|
|
264
189
|
}
|
|
265
190
|
}
|
|
@@ -270,8 +195,7 @@ export function writeDeliveryEventAtRoot(root, input) {
|
|
|
270
195
|
db = openHippoDb(root);
|
|
271
196
|
}
|
|
272
197
|
catch (error) {
|
|
273
|
-
|
|
274
|
-
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
198
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`);
|
|
275
199
|
return null;
|
|
276
200
|
}
|
|
277
201
|
try {
|
|
@@ -9,7 +9,7 @@ import { entryRejectRowAt, selectAllEntries } from './entry-reads.js';
|
|
|
9
9
|
import { stampOriginProject } from './entry-row.js';
|
|
10
10
|
import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
|
|
11
11
|
import { purgeMirrorBestEffort } from './mirrors.js';
|
|
12
|
-
import { openStore } from './open.js';
|
|
12
|
+
import { onHandle, openStore } from './open.js';
|
|
13
13
|
import { archiveRawMemory, markMirrorCleaned } from './raw-archive.js';
|
|
14
14
|
import { RejectedValueError, checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
|
|
15
15
|
function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
|
|
@@ -81,8 +81,7 @@ function purgeRemovedMirrors(db, hippoRoot, removal) {
|
|
|
81
81
|
* text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
|
|
82
82
|
export function applyRejection(hippoRoot, rejection) {
|
|
83
83
|
const { tenantId, actor, reason, memoryId } = rejection;
|
|
84
|
-
|
|
85
|
-
try {
|
|
84
|
+
return onHandle(hippoRoot, (db) => {
|
|
86
85
|
const content = rejection.textOf(memoryId === undefined ? undefined : entryRejectRowAt(db, memoryId));
|
|
87
86
|
const digest = rejectionDigest(content);
|
|
88
87
|
const rejectedAt = new Date().toISOString();
|
|
@@ -108,16 +107,12 @@ export function applyRejection(hippoRoot, rejection) {
|
|
|
108
107
|
purgeRemovedMirrors(db, hippoRoot, removal);
|
|
109
108
|
const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
|
|
110
109
|
return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
closeHippoDb(db);
|
|
114
|
-
}
|
|
110
|
+
}, openStore);
|
|
115
111
|
}
|
|
116
112
|
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
|
|
117
113
|
* No match, or more than one, writes nothing. */
|
|
118
114
|
export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
119
|
-
|
|
120
|
-
try {
|
|
115
|
+
return onHandle(hippoRoot, (db) => {
|
|
121
116
|
const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
|
|
122
117
|
const target = matches[0];
|
|
123
118
|
if (target === undefined)
|
|
@@ -127,20 +122,13 @@ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
|
127
122
|
deleteRejectedValue(db, tenantId, target.digest);
|
|
128
123
|
audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
|
|
129
124
|
return { status: 'ok', digest: target.digest, reason: target.reason };
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
closeHippoDb(db);
|
|
133
|
-
}
|
|
125
|
+
}, openStore);
|
|
134
126
|
}
|
|
135
127
|
/** The tenant's rejected values, newest first. */
|
|
136
128
|
export function loadRejectedValues(hippoRoot, tenantId) {
|
|
137
|
-
|
|
138
|
-
try {
|
|
129
|
+
return onHandle(hippoRoot, (db) => {
|
|
139
130
|
return listRejectedValues(db, tenantId);
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
closeHippoDb(db);
|
|
143
|
-
}
|
|
131
|
+
}, openStore);
|
|
144
132
|
}
|
|
145
133
|
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
|
|
146
134
|
* and writes nothing, so a dry run counts the values a real run refuses. */
|
|
@@ -1,38 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Exact-normalized-value semantics: a human who rejects a fact can refuse
|
|
5
|
-
* byte-stable re-ingestion of the same value across remember/capture/import/
|
|
6
|
-
* sync surfaces. Paraphrase/semantic matching is explicitly out of scope
|
|
7
|
-
* (documented limitation, plan "Design").
|
|
8
|
-
*
|
|
9
|
-
* Kept db-agnostic (helpers take a `DatabaseSyncLike` handle) and does NOT
|
|
10
|
-
* import from store.ts — store.ts imports from here, and the reverse would
|
|
11
|
-
* be a cycle.
|
|
12
|
-
*/
|
|
1
|
+
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value); paraphrase matching is out of scope.
|
|
2
|
+
* db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the store layer above it, which imports this (the reverse is a cycle). */
|
|
13
3
|
import type { DatabaseSyncLike } from '../db/index.js';
|
|
14
4
|
import { BadRequestError } from '../core/api-errors.js';
|
|
15
|
-
/**
|
|
16
|
-
*
|
|
17
|
-
* lowercase → collapse whitespace runs to a single space → trim. No
|
|
18
|
-
* punctuation stripping — over-normalization creates false refusals, which
|
|
19
|
-
* are worse than misses (plan §1).
|
|
20
|
-
*/
|
|
5
|
+
/** Normalize content for rejection digests: NFC, lowercase, collapse whitespace runs, trim. No punctuation stripping: over-normalizing causes false
|
|
6
|
+
* refusals, worse than misses. */
|
|
21
7
|
export declare function normalizeValueForRejection(content: string): string;
|
|
22
|
-
/**
|
|
23
|
-
* Full sha256 hex (64 chars) of the normalized content. Reuses the strong-
|
|
24
|
-
* identity convention (importers.ts:814 content-hash tag), NOT the privacy-
|
|
25
|
-
* lossy 16-char convention (recall-trace query hashing) — a tombstone lookup
|
|
26
|
-
* key needs collision resistance, not redaction (plan §1).
|
|
27
|
-
*/
|
|
8
|
+
/** Full 64-char sha256 hex of the normalized content: a tombstone key needs collision resistance, not the 16-char redaction hash used for query hashing. */
|
|
28
9
|
export declare function rejectionDigest(content: string): string;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* upsertEntryRow) when an incoming write would introduce a value matching a
|
|
32
|
-
* tombstoned digest. Carries enough context for the transaction-owner catch
|
|
33
|
-
* blocks (writeEntry, api.supersede) to write a post-rollback
|
|
34
|
-
* `reject_refusal` audit row via `auditRejectionRefusal` (plan §3).
|
|
35
|
-
*/
|
|
10
|
+
/** Thrown by the write-path guard (checkRejectionGuard, via upsertEntryRow) when a write would introduce a tombstoned value; carries what the
|
|
11
|
+
* transaction-owner catch blocks (writeEntry, api.supersede) need to write the post-rollback `reject_refusal` audit row via `auditRejectionRefusal`. */
|
|
36
12
|
export declare class RejectedValueError extends BadRequestError {
|
|
37
13
|
readonly digest: string;
|
|
38
14
|
readonly tenantId: string;
|
|
@@ -56,15 +32,9 @@ export interface RejectedValueRow {
|
|
|
56
32
|
sourceMemoryId: string | null;
|
|
57
33
|
normalizedChars: number | null;
|
|
58
34
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Look up a tombstone by tenant + digest. One indexed point query — the
|
|
61
|
-
* guard's common-case cost, a miss ends the guard (plan §3).
|
|
62
|
-
*/
|
|
35
|
+
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the guard. */
|
|
63
36
|
export declare function findRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): RejectedValueRow | null;
|
|
64
|
-
/**
|
|
65
|
-
* Insert (or refresh) a tombstone row. Caller owns the transaction — used by
|
|
66
|
-
* the `reject` verb and `resolveConflict`'s `rejectLoserValue` path.
|
|
67
|
-
*/
|
|
37
|
+
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and `resolveConflict`'s `rejectLoserValue`). */
|
|
68
38
|
export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
69
39
|
tenantId: string;
|
|
70
40
|
digest: string;
|
|
@@ -74,27 +44,11 @@ export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
|
74
44
|
sourceMemoryId?: string | null;
|
|
75
45
|
normalizedChars: number;
|
|
76
46
|
}): void;
|
|
77
|
-
/**
|
|
78
|
-
* Delete a tombstone by tenant + exact digest: the `unreject` verb, the
|
|
79
|
-
* only escape hatch.
|
|
80
|
-
*/
|
|
47
|
+
/** Delete a tombstone by tenant + exact digest: the `unreject` verb, the only escape hatch. */
|
|
81
48
|
export declare function deleteRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): boolean;
|
|
82
49
|
/** List tombstones for a tenant, newest first: the `rejections` verb. */
|
|
83
50
|
export declare function listRejectedValues(db: DatabaseSyncLike, tenantId: string): RejectedValueRow[];
|
|
84
|
-
/**
|
|
85
|
-
*
|
|
86
|
-
* (store.ts). Fires when the incoming content's digest matches a tombstone
|
|
87
|
-
* AND the write *introduces* that content: the row is new, OR the stored
|
|
88
|
-
* row's content digest differs from the incoming one — an UPSERT editing a
|
|
89
|
-
* same-id row TO a rejected value is a content introduction and must be
|
|
90
|
-
* refused. Unchanged same-id re-persists (recall boost, decay, star toggle)
|
|
91
|
-
* are exempt by construction (plan §3).
|
|
92
|
-
*
|
|
93
|
-
* Ordering minimizes queries on the common (miss) path: (a) caller has
|
|
94
|
-
* already computed nothing yet — this does the digest + point lookup first;
|
|
95
|
-
* (b) a miss returns immediately (ONE indexed point query); (c) only on a
|
|
96
|
-
* tombstone hit does it SELECT the stored row's content to classify
|
|
97
|
-
* new-row vs content-introduction (+1 query, rare path).
|
|
98
|
-
*/
|
|
51
|
+
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row, or a same-id UPSERT changing it).
|
|
52
|
+
* Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss costs ONE indexed point query; only a hit SELECTs the stored row. */
|
|
99
53
|
export declare function checkRejectionGuard(db: DatabaseSyncLike, tenantId: string, entryId: string, content: string): void;
|
|
100
54
|
//# sourceMappingURL=rejection.d.ts.map
|