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,29 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Canonical store for ex-ante claims that can be closed against ex-post
|
|
5
|
-
* outcomes. The `predictions` table holds every field (including
|
|
6
|
-
* `claim_text`); a memory row mirrors the claim for recall/inspect surfaces
|
|
7
|
-
* but is NOT the source of truth — ON DELETE SET NULL on memory_id means
|
|
8
|
-
* memory deletion gracefully orphans the prediction without losing data.
|
|
9
|
-
*
|
|
10
|
-
* Tenant scoping: every helper requires tenantId. The schema's BEFORE INSERT
|
|
11
|
-
* + BEFORE UPDATE triggers (`trg_predictions_tenant_match_*`) enforce that
|
|
12
|
-
* `predictions.tenant_id` matches the referenced memory's tenant_id when
|
|
13
|
-
* `memory_id IS NOT NULL`. Cross-tenant references are unrepresentable at
|
|
14
|
-
* the schema level.
|
|
15
|
-
*
|
|
16
|
-
* Dual-write atomicity: `savePrediction` writes the memory + predictions
|
|
17
|
-
* row inside `writeEntry`'s SAVEPOINT 'write_entry' (store/entry-writes.ts). The
|
|
18
|
-
* afterWrite hook (store/entry-writes.ts) runs inside the same SAVEPOINT, so
|
|
19
|
-
* a failure in either step rolls back both. Pattern matches supersede
|
|
20
|
-
* (api.ts:1486) and the Slack/GitHub connectors.
|
|
21
|
-
*
|
|
22
|
-
* The planning-fallacy detector reads `loadPredictionsByClass` and computes
|
|
23
|
-
* per-class base rates from (estimate_value, actual_value) at query time.
|
|
24
|
-
*/
|
|
1
|
+
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth; the memory row only mirrors the claim.
|
|
2
|
+
* Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers enforce the prediction's tenant matches the referenced memory's.
|
|
3
|
+
* `savePrediction` writes memory and prediction inside `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
|
|
25
4
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
26
|
-
import {
|
|
5
|
+
import { withWriteScope } from '../db/index.js';
|
|
6
|
+
import { onHandle } from './open.js';
|
|
27
7
|
import { writeEntryAt } from './sqlite/entry-writes-group.js';
|
|
28
8
|
import { assertTenantId } from './tenant.js';
|
|
29
9
|
import { createMemory, Layer } from '../core/memory.js';
|
|
@@ -31,6 +11,9 @@ import { appendAuditEvent } from './audit.js';
|
|
|
31
11
|
import { loadConfig } from '../core/config.js';
|
|
32
12
|
import { keysetAfter } from '../util/keyset.js';
|
|
33
13
|
const DEFAULT_PREDICTION_PAGE_SIZE = 100;
|
|
14
|
+
const SELECT_COLUMNS = `id, memory_id, tenant_id, class_tag, claim_text,
|
|
15
|
+
estimate_value, estimate_unit, target_date,
|
|
16
|
+
actual_value, closure_state, closed_at, closure_note, created_at`;
|
|
34
17
|
export const VALID_CLOSURE_STATES = new Set([
|
|
35
18
|
'open',
|
|
36
19
|
'closed',
|
|
@@ -55,20 +38,8 @@ function rowToPrediction(row) {
|
|
|
55
38
|
createdAt: row.created_at,
|
|
56
39
|
};
|
|
57
40
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
|
-
/**
|
|
62
|
-
* Create a new prediction. Writes a memory mirror + a predictions table
|
|
63
|
-
* row atomically inside `writeEntry`'s SAVEPOINT 'write_entry'. On any
|
|
64
|
-
* failure (audit write, predictions INSERT, trigger ABORT), the SAVEPOINT
|
|
65
|
-
* rolls back — neither the memory row nor the predictions row lands.
|
|
66
|
-
*
|
|
67
|
-
* The memory is tagged `['prediction', classTag]` with `source='prediction'`
|
|
68
|
-
* and `kind='distilled'`. It surfaces in `hippo recall` so the agent can
|
|
69
|
-
* see open predictions naturally; the predictions table is the canonical
|
|
70
|
-
* structured store used by the planning-fallacy detector.
|
|
71
|
-
*/
|
|
41
|
+
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure rolls back both.
|
|
42
|
+
* The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the predictions table feeds the planning-fallacy detector. */
|
|
72
43
|
export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
73
44
|
assertTenantId('savePrediction', tenantId);
|
|
74
45
|
if (!opts.classTag)
|
|
@@ -91,7 +62,8 @@ export function predictionMirror(tenantId, claim, baseHalfLifeDays) {
|
|
|
91
62
|
tenantId,
|
|
92
63
|
});
|
|
93
64
|
}
|
|
94
|
-
/** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
|
|
65
|
+
/** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
|
|
66
|
+
* check included, and its predictions row shares that write scope, so neither lands alone. */
|
|
95
67
|
export function writePrediction(hippoRoot, tenantId, save, actor) {
|
|
96
68
|
assertTenantId('savePrediction', tenantId);
|
|
97
69
|
const now = new Date().toISOString();
|
|
@@ -120,9 +92,7 @@ function insertPredictionRow(db, memoryId, tenantId, opts, stamp) {
|
|
|
120
92
|
const predictionId = Number(result.lastInsertRowid ?? 0);
|
|
121
93
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
122
94
|
const row = db.prepare(`
|
|
123
|
-
SELECT
|
|
124
|
-
estimate_value, estimate_unit, target_date,
|
|
125
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
95
|
+
SELECT ${SELECT_COLUMNS}
|
|
126
96
|
FROM predictions WHERE id = ?
|
|
127
97
|
`).get(predictionId);
|
|
128
98
|
if (!row) {
|
|
@@ -147,25 +117,18 @@ function auditPredictionCreate(db, who, opts) {
|
|
|
147
117
|
},
|
|
148
118
|
});
|
|
149
119
|
}
|
|
150
|
-
/**
|
|
151
|
-
*
|
|
152
|
-
* the memory mirror is NOT mutated in v1 (predictions table is canonical).
|
|
153
|
-
* Accuracy is computed from (estimateValue, actualValue) at query time.
|
|
154
|
-
*/
|
|
120
|
+
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table is the source of truth).
|
|
121
|
+
* Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
155
122
|
export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
|
|
156
123
|
assertTenantId('closePrediction', tenantId);
|
|
157
124
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
158
125
|
throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
|
|
159
126
|
}
|
|
160
127
|
const now = new Date().toISOString();
|
|
161
|
-
|
|
162
|
-
try {
|
|
128
|
+
return onHandle(hippoRoot, (db) => {
|
|
163
129
|
const row = withWriteScope(db, 'close_prediction', () => closeOpenPredictionRow(db, tenantId, id, opts, { now, actor }));
|
|
164
130
|
return rowToPrediction(row);
|
|
165
|
-
}
|
|
166
|
-
finally {
|
|
167
|
-
closeHippoDb(db);
|
|
168
|
-
}
|
|
131
|
+
});
|
|
169
132
|
}
|
|
170
133
|
/** Closes the row, reloads it and audits the close; the caller owns the transaction. */
|
|
171
134
|
function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
@@ -181,9 +144,7 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
|
181
144
|
throwCloseMiss(db, tenantId, id);
|
|
182
145
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
183
146
|
const row = db.prepare(`
|
|
184
|
-
SELECT
|
|
185
|
-
estimate_value, estimate_unit, target_date,
|
|
186
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
147
|
+
SELECT ${SELECT_COLUMNS}
|
|
187
148
|
FROM predictions WHERE id = ? AND tenant_id = ?
|
|
188
149
|
`).get(id, tenantId);
|
|
189
150
|
if (!row) {
|
|
@@ -203,10 +164,8 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
|
203
164
|
return row;
|
|
204
165
|
}
|
|
205
166
|
function throwCloseMiss(db, tenantId, id) {
|
|
206
|
-
// Distinguish
|
|
207
|
-
//
|
|
208
|
-
// SAFETY: row shape matches the single `closure_state` column named
|
|
209
|
-
// in the SELECT above.
|
|
167
|
+
// Distinguish 'not found' from 'already closed' so callers (CLI, HTTP) surface the right error.
|
|
168
|
+
// SAFETY: row shape matches the single `closure_state` column named in the SELECT above.
|
|
210
169
|
const existing = db.prepare(`
|
|
211
170
|
SELECT closure_state FROM predictions WHERE id = ? AND tenant_id = ?
|
|
212
171
|
`).get(id, tenantId);
|
|
@@ -218,27 +177,20 @@ function throwCloseMiss(db, tenantId, id) {
|
|
|
218
177
|
}
|
|
219
178
|
export function loadPredictionById(hippoRoot, tenantId, id) {
|
|
220
179
|
assertTenantId('loadPredictionById', tenantId);
|
|
221
|
-
|
|
222
|
-
try {
|
|
180
|
+
return onHandle(hippoRoot, (db) => {
|
|
223
181
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
224
182
|
const row = db.prepare(`
|
|
225
|
-
SELECT
|
|
226
|
-
estimate_value, estimate_unit, target_date,
|
|
227
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
183
|
+
SELECT ${SELECT_COLUMNS}
|
|
228
184
|
FROM predictions WHERE id = ? AND tenant_id = ?
|
|
229
185
|
`).get(id, tenantId);
|
|
230
186
|
return row ? rowToPrediction(row) : null;
|
|
231
|
-
}
|
|
232
|
-
finally {
|
|
233
|
-
closeHippoDb(db);
|
|
234
|
-
}
|
|
187
|
+
});
|
|
235
188
|
}
|
|
236
189
|
export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {}) {
|
|
237
190
|
assertTenantId('loadPredictionsByClass', tenantId);
|
|
238
191
|
const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
|
|
239
192
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
240
|
-
|
|
241
|
-
try {
|
|
193
|
+
return onHandle(hippoRoot, (db) => {
|
|
242
194
|
let rows;
|
|
243
195
|
if (opts.closureState) {
|
|
244
196
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
@@ -246,9 +198,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
246
198
|
}
|
|
247
199
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
248
200
|
rows = db.prepare(`
|
|
249
|
-
SELECT
|
|
250
|
-
estimate_value, estimate_unit, target_date,
|
|
251
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
201
|
+
SELECT ${SELECT_COLUMNS}
|
|
252
202
|
FROM predictions
|
|
253
203
|
WHERE tenant_id = ? AND class_tag = ? AND closure_state = ?${after.sql}
|
|
254
204
|
ORDER BY created_at DESC, id DESC
|
|
@@ -258,9 +208,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
258
208
|
else {
|
|
259
209
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
260
210
|
rows = db.prepare(`
|
|
261
|
-
SELECT
|
|
262
|
-
estimate_value, estimate_unit, target_date,
|
|
263
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
211
|
+
SELECT ${SELECT_COLUMNS}
|
|
264
212
|
FROM predictions
|
|
265
213
|
WHERE tenant_id = ? AND class_tag = ?${after.sql}
|
|
266
214
|
ORDER BY created_at DESC, id DESC
|
|
@@ -268,43 +216,26 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
268
216
|
`).all(tenantId, classTag, ...after.params, limit);
|
|
269
217
|
}
|
|
270
218
|
return rows.map(rowToPrediction);
|
|
271
|
-
}
|
|
272
|
-
finally {
|
|
273
|
-
closeHippoDb(db);
|
|
274
|
-
}
|
|
219
|
+
});
|
|
275
220
|
}
|
|
276
221
|
/** Every prediction in the tenant, open and closed, across all classes: the `status=all` list without a class. */
|
|
277
222
|
export function loadAllPredictions(hippoRoot, tenantId, opts = {}) {
|
|
278
223
|
assertTenantId('loadAllPredictions', tenantId);
|
|
279
224
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
280
|
-
|
|
281
|
-
try {
|
|
225
|
+
return onHandle(hippoRoot, (db) => {
|
|
282
226
|
// SAFETY: rows' shape matches the columns named in the SELECT.
|
|
283
227
|
const rows = db.prepare(`
|
|
284
|
-
SELECT
|
|
285
|
-
estimate_value, estimate_unit, target_date,
|
|
286
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
228
|
+
SELECT ${SELECT_COLUMNS}
|
|
287
229
|
FROM predictions
|
|
288
230
|
WHERE tenant_id = ?${after.sql}
|
|
289
231
|
ORDER BY created_at DESC, id DESC
|
|
290
232
|
LIMIT ?
|
|
291
233
|
`).all(tenantId, ...after.params, opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE);
|
|
292
234
|
return rows.map(rowToPrediction);
|
|
293
|
-
}
|
|
294
|
-
finally {
|
|
295
|
-
closeHippoDb(db);
|
|
296
|
-
}
|
|
235
|
+
});
|
|
297
236
|
}
|
|
298
|
-
/**
|
|
299
|
-
*
|
|
300
|
-
* planning-fallacy detector: Lovallo-Kahneman (2003) inside-vs-outside view.
|
|
301
|
-
*
|
|
302
|
-
* Filter: closure_state='closed' AND estimate_value IS NOT NULL AND
|
|
303
|
-
* actual_value IS NOT NULL. Excludes closed-unknown (no actual to
|
|
304
|
-
* compare against) and open (not yet resolved).
|
|
305
|
-
*
|
|
306
|
-
* Audit-emit is built in here, not at the 3 call sites, so callers cannot drift.
|
|
307
|
-
*/
|
|
237
|
+
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed' with estimate and actual non-null;
|
|
238
|
+
* closed-unknown and open are excluded. Audit-emit is built in here, not at the 3 call sites, so callers cannot drift. */
|
|
308
239
|
export function computePredictionBaserate(hippoRoot, tenantId, classTag, actor = 'cli',
|
|
309
240
|
/** False skips the predict_baserate audit so that channel only records deliberate
|
|
310
241
|
* baserate calls, not every recall the planning-fallacy orchestrator inspects. */
|
|
@@ -312,8 +243,7 @@ emitAudit = true) {
|
|
|
312
243
|
assertTenantId('computePredictionBaserate', tenantId);
|
|
313
244
|
if (!classTag)
|
|
314
245
|
throw new BadRequestError('computePredictionBaserate: classTag is required');
|
|
315
|
-
|
|
316
|
-
try {
|
|
246
|
+
return onHandle(hippoRoot, (db) => {
|
|
317
247
|
// Ordered by id because the float sums differ with row order, and another store must reach the same figures.
|
|
318
248
|
// SAFETY: rows' shape matches the two columns named in the SELECT above.
|
|
319
249
|
const rows = db.prepare(`
|
|
@@ -331,10 +261,7 @@ emitAudit = true) {
|
|
|
331
261
|
if (emitAudit)
|
|
332
262
|
auditBaserateRead(db, tenantId, actor, classTag, baserate.nClosed);
|
|
333
263
|
return baserate;
|
|
334
|
-
}
|
|
335
|
-
finally {
|
|
336
|
-
closeHippoDb(db);
|
|
337
|
-
}
|
|
264
|
+
});
|
|
338
265
|
}
|
|
339
266
|
function auditBaserateRead(db, tenantId, actor, classTag, nClosed) {
|
|
340
267
|
appendAuditEvent(db, {
|
|
@@ -386,15 +313,12 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
386
313
|
assertTenantId('loadOpenPredictions', tenantId);
|
|
387
314
|
const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
|
|
388
315
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
389
|
-
|
|
390
|
-
try {
|
|
316
|
+
return onHandle(hippoRoot, (db) => {
|
|
391
317
|
let rows;
|
|
392
318
|
if (opts.classTag) {
|
|
393
319
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
394
320
|
rows = db.prepare(`
|
|
395
|
-
SELECT
|
|
396
|
-
estimate_value, estimate_unit, target_date,
|
|
397
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
321
|
+
SELECT ${SELECT_COLUMNS}
|
|
398
322
|
FROM predictions
|
|
399
323
|
WHERE tenant_id = ? AND class_tag = ? AND closure_state = 'open'${after.sql}
|
|
400
324
|
ORDER BY created_at DESC, id DESC
|
|
@@ -404,9 +328,7 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
404
328
|
else {
|
|
405
329
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
406
330
|
rows = db.prepare(`
|
|
407
|
-
SELECT
|
|
408
|
-
estimate_value, estimate_unit, target_date,
|
|
409
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
331
|
+
SELECT ${SELECT_COLUMNS}
|
|
410
332
|
FROM predictions
|
|
411
333
|
WHERE tenant_id = ? AND closure_state = 'open'${after.sql}
|
|
412
334
|
ORDER BY created_at DESC, id DESC
|
|
@@ -414,9 +336,6 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
414
336
|
`).all(tenantId, ...after.params, limit);
|
|
415
337
|
}
|
|
416
338
|
return rows.map(rowToPrediction);
|
|
417
|
-
}
|
|
418
|
-
finally {
|
|
419
|
-
closeHippoDb(db);
|
|
420
|
-
}
|
|
339
|
+
});
|
|
421
340
|
}
|
|
422
341
|
//# sourceMappingURL=predictions.js.map
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { appendAuditEvent } from '../store/audit.js';
|
|
1
|
+
import { appendAuditEvent } from './audit.js';
|
|
4
2
|
import { withBackup } from '../db/backup.js';
|
|
5
3
|
import { withTrialScope, withWriteScope } from '../db/busy.js';
|
|
6
|
-
import {
|
|
7
|
-
import { DatabaseSync } from '../db/sqlite.js';
|
|
4
|
+
import { withUnmigratedDb } from '../db/open.js';
|
|
8
5
|
import { getMeta, pragmaUserVersion, setMeta } from '../db/meta.js';
|
|
9
6
|
import { tableColumns } from '../db/tables.js';
|
|
10
7
|
import { assertBinaryCompatible } from '../db/migrate.js';
|
|
11
|
-
import { insertDormantRow, listDormantSnapshots } from '
|
|
8
|
+
import { insertDormantRow, listDormantSnapshots } from './dormant.js';
|
|
12
9
|
import { calculateStrength, canAutoDelete } from '../core/memory.js';
|
|
13
10
|
import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason } from '../core/memory-quality.js';
|
|
14
11
|
import { heldTexts } from '../util/same-text.js';
|
|
15
|
-
import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from '
|
|
16
|
-
import { selectAllEntries, selectPreviewRows } from '
|
|
17
|
-
import { ftsRowExists } from '
|
|
18
|
-
import { MEMORY_SELECT_COLUMNS, parseJsonArray } from '
|
|
19
|
-
import { purgeMirrorBestEffort } from '
|
|
12
|
+
import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from './delete-and-batch.js';
|
|
13
|
+
import { selectAllEntries, selectPreviewRows } from './entry-reads.js';
|
|
14
|
+
import { ftsRowExists } from './entry-row.js';
|
|
15
|
+
import { MEMORY_SELECT_COLUMNS, parseJsonArray } from './rows.js';
|
|
16
|
+
import { purgeMirrorBestEffort } from './mirrors.js';
|
|
20
17
|
const REQUIRED_COLUMNS = {
|
|
21
18
|
memories: MEMORY_SELECT_COLUMNS.split(',').map((s) => s.trim()),
|
|
22
19
|
meta: ['key', 'value'],
|
|
@@ -108,7 +105,8 @@ function unsupportedPreview(db, tenantId) {
|
|
|
108
105
|
return { total: 0, issues: [] };
|
|
109
106
|
const rows = selectPreviewRows(db, columns, tenantId);
|
|
110
107
|
const issues = rows.flatMap((row) => {
|
|
111
|
-
const
|
|
108
|
+
const tags = parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' });
|
|
109
|
+
const provenance = { ...row, source: row.source ?? '', confidence: row.confidence ?? 'observed', dag_level: row.dag_level ?? 0, tags };
|
|
112
110
|
if (!isAutomaticEntry(provenance))
|
|
113
111
|
return [];
|
|
114
112
|
const { reason } = assessAutomaticMemory(row.content);
|
|
@@ -168,34 +166,20 @@ function repairOn(db, root, opts) {
|
|
|
168
166
|
const result = withBackup(db, root, 'before-quality-repair', (backup) => applyPlan(db, root, opts.tenantId, backup, opts.doneKey));
|
|
169
167
|
const warnings = [...result.warnings];
|
|
170
168
|
for (const id of result.appliedIds) {
|
|
171
|
-
if (
|
|
172
|
-
|
|
169
|
+
if (purgeMirrorBestEffort(root, id, false, 'quality repair'))
|
|
170
|
+
continue;
|
|
171
|
+
warnings.push(`Mirror cleanup failed for ${id}; remove its stale mirror before rebuilding the index.`);
|
|
173
172
|
}
|
|
174
173
|
return { ...result, warnings };
|
|
175
174
|
}
|
|
176
|
-
function openForRepair(root, readOnly, fn) {
|
|
177
|
-
// Opens without openHippoDb to skip migrations, so it takes the same refusal itself.
|
|
178
|
-
assertSqliteAllowed(root);
|
|
179
|
-
const file = path.join(root, 'hippo.db');
|
|
180
|
-
if (!fs.existsSync(file))
|
|
181
|
-
throw new Error(`No existing Hippo database at ${file}`);
|
|
182
|
-
const db = new DatabaseSync(file, { readOnly });
|
|
183
|
-
try {
|
|
184
|
-
db.exec('PRAGMA busy_timeout = 5000');
|
|
185
|
-
return fn(db);
|
|
186
|
-
}
|
|
187
|
-
finally {
|
|
188
|
-
db.close();
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
175
|
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running migrations. */
|
|
192
176
|
export function repairAutomaticMemories(root, opts) {
|
|
193
|
-
return
|
|
177
|
+
return withUnmigratedDb(root, !opts.apply, (db) => repairOn(db, root, opts));
|
|
194
178
|
}
|
|
195
179
|
const AUTO_REPAIR_META_KEY = 'quality_repair_auto';
|
|
196
180
|
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command; null once done. */
|
|
197
181
|
export function repairQualityOnce(root, tenantId) {
|
|
198
|
-
return
|
|
182
|
+
return withUnmigratedDb(root, false, (db) => {
|
|
199
183
|
if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
|
|
200
184
|
return null;
|
|
201
185
|
// The apply commits the flag with the moves, so a lock taken between them cannot hide what moved.
|
|
@@ -2,25 +2,13 @@ import type { DatabaseSyncLike } from '../db/index.js';
|
|
|
2
2
|
export interface ArchiveOpts {
|
|
3
3
|
reason: string;
|
|
4
4
|
who: string;
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* after the audit row is appended and before RELEASE. Used by the Slack
|
|
8
|
-
* deletion connector to mark the deletion event seen atomically — a crash
|
|
9
|
-
* mid-archive must not leave the deletion event untracked. Throwing rolls
|
|
10
|
-
* back the entire archive (including the audit row).
|
|
11
|
-
*/
|
|
5
|
+
/** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks the event seen atomically);
|
|
6
|
+
* throwing rolls back the whole archive, audit row included. */
|
|
12
7
|
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
13
8
|
}
|
|
14
9
|
/** Stamps the archived copy of `memoryId` as having its markdown mirror cleaned at `at`. */
|
|
15
10
|
export declare function markMirrorCleaned(db: DatabaseSyncLike, memoryId: string, at: string): void;
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
|
|
20
|
-
* append-only trigger lets the delete through, then deletes the row. All in one
|
|
21
|
-
* write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
|
|
22
|
-
*
|
|
23
|
-
* Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
|
|
24
|
-
*/
|
|
11
|
+
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
|
|
12
|
+
* all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
|
|
25
13
|
export declare function archiveRawMemory(db: DatabaseSyncLike, id: string, opts: ArchiveOpts): string;
|
|
26
14
|
//# sourceMappingURL=raw-archive.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
2
3
|
import { isFtsAvailable, withWriteScope } from '../db/index.js';
|
|
3
4
|
import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
|
|
@@ -7,9 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
|
|
|
7
8
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
|
|
8
9
|
}
|
|
9
10
|
function loadRawRow(db, id) {
|
|
10
|
-
// SAFETY: SELECT *
|
|
11
|
-
//
|
|
12
|
-
// null) by the memories schema.
|
|
11
|
+
// SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all guaranteed present (possibly null) by the
|
|
12
|
+
// schema.
|
|
13
13
|
const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
|
|
14
14
|
if (!row)
|
|
15
15
|
throw new NotFoundError(`memory not found: ${id}`);
|
|
@@ -19,15 +19,13 @@ function loadRawRow(db, id) {
|
|
|
19
19
|
return row;
|
|
20
20
|
}
|
|
21
21
|
function moveRowToArchive(db, id, row, opts) {
|
|
22
|
-
// GDPR: raw_archive stores ONLY metadata,
|
|
23
|
-
//
|
|
24
|
-
// for the compliance audit trail. True right-to-be-forgotten — the original
|
|
25
|
-
// content is unrecoverable from raw_archive after this point.
|
|
22
|
+
// GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance trail,
|
|
23
|
+
// so the content is unrecoverable from here on.
|
|
26
24
|
const archivedAt = new Date().toISOString();
|
|
27
25
|
const redactedPayload = JSON.stringify({
|
|
28
26
|
redacted: true,
|
|
29
27
|
archived_at: archivedAt,
|
|
30
|
-
tenant_id: row.tenant_id ??
|
|
28
|
+
tenant_id: row.tenant_id ?? DEFAULT_TENANT_ID,
|
|
31
29
|
kind: row.kind,
|
|
32
30
|
reason: opts.reason,
|
|
33
31
|
});
|
|
@@ -40,15 +38,12 @@ function moveRowToArchive(db, id, row, opts) {
|
|
|
40
38
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
41
39
|
return archivedAt;
|
|
42
40
|
}
|
|
43
|
-
// Emit the archive_raw audit
|
|
44
|
-
//
|
|
45
|
-
// (fetched above as part of SELECT *), not the env. Archives must be
|
|
46
|
-
// attributed to the tenant that owns the row, not whatever HIPPO_TENANT
|
|
47
|
-
// happens to be set to in the calling shell.
|
|
41
|
+
// Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the row's own tenant_id,
|
|
42
|
+
// not whatever HIPPO_TENANT the calling shell has set.
|
|
48
43
|
function auditArchive(db, id, row, opts) {
|
|
49
44
|
try {
|
|
50
45
|
appendAuditEvent(db, {
|
|
51
|
-
tenantId: String(row.tenant_id ??
|
|
46
|
+
tenantId: String(row.tenant_id ?? DEFAULT_TENANT_ID),
|
|
52
47
|
actor: opts.who || 'cli',
|
|
53
48
|
op: 'archive_raw',
|
|
54
49
|
targetId: id,
|
|
@@ -60,15 +55,8 @@ function auditArchive(db, id, row, opts) {
|
|
|
60
55
|
reportAuditWriteFailure('archive_raw', String(error), id);
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
|
|
67
|
-
* append-only trigger lets the delete through, then deletes the row. All in one
|
|
68
|
-
* write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
|
|
69
|
-
*
|
|
70
|
-
* Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
|
|
71
|
-
*/
|
|
58
|
+
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
|
|
59
|
+
* all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
|
|
72
60
|
export function archiveRawMemory(db, id, opts) {
|
|
73
61
|
const row = loadRawRow(db, id);
|
|
74
62
|
// A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
|
|
@@ -79,13 +67,10 @@ export function archiveRawMemory(db, id, opts) {
|
|
|
79
67
|
// Archiving a child under a level-2 summary marks the parent dirty, inside the
|
|
80
68
|
// SAVEPOINT so the dirty-mark commits atomically with the archive.
|
|
81
69
|
if (row.dag_parent_id) {
|
|
82
|
-
markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ??
|
|
70
|
+
markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
|
|
83
71
|
}
|
|
84
|
-
// afterArchive hook: connector
|
|
85
|
-
//
|
|
86
|
-
// Throwing here rolls back the entire SAVEPOINT — both the archive and any
|
|
87
|
-
// hook side effects. The hook runs INSIDE the SAVEPOINT so its writes
|
|
88
|
-
// share the archive's transactional fate.
|
|
72
|
+
// afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive, so it runs INSIDE the SAVEPOINT;
|
|
73
|
+
// throwing rolls back both.
|
|
89
74
|
if (opts.afterArchive) {
|
|
90
75
|
opts.afterArchive(db, id);
|
|
91
76
|
}
|
|
@@ -1,48 +1,14 @@
|
|
|
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 { ForbiddenError } from '../core/api-errors.js';
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
* caller passes no `scope`. The SQL clause in `loadSearchRows` and the JS
|
|
12
|
-
* helper `passesScopeFilterForRecall` (src/api/index.ts) both read from this
|
|
13
|
-
* constant. Adding a deny scope is a one-place change.
|
|
14
|
-
*
|
|
15
|
-
* Regex-based denies (e.g. `<source>:private:*`) stay in
|
|
16
|
-
* `passesScopeFilterForRecall` as a separate JS step — they don't translate
|
|
17
|
-
* cleanly to SQL.
|
|
18
|
-
*
|
|
19
|
-
* Invariant: never empty. An empty array would silently allow quarantine
|
|
20
|
-
* scopes through both paths (SQL clause omitted, JS check vacuous). The
|
|
21
|
-
* module-load assertion below pins this loudly.
|
|
22
|
-
*/
|
|
4
|
+
/** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
|
|
5
|
+
* `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
|
|
23
6
|
export declare const RECALL_DEFAULT_DENY_SCOPES: readonly ["unknown:legacy"];
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
* load-bearing literal array. Extracted from the inline guard so the throw
|
|
27
|
-
* path is directly testable. `as const` arrays widen via `readonly T[]` at
|
|
28
|
-
* the call site so the empty case is reachable at runtime.
|
|
29
|
-
*/
|
|
7
|
+
/** @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
|
|
8
|
+
* is reachable and testable. */
|
|
30
9
|
export declare function assertNonEmpty<T>(arr: readonly T[], name: string): void;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
33
|
-
* as private when it has the shape `<lowercase-source>:private:<rest>`.
|
|
34
|
-
*
|
|
35
|
-
* Examples that match:
|
|
36
|
-
* slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
|
|
37
|
-
* Examples that DO NOT match:
|
|
38
|
-
* slack:public:Cgeneral, acme:public:my-private-channel, null, '',
|
|
39
|
-
* 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
|
|
40
|
-
*
|
|
41
|
-
* Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
|
|
42
|
-
* cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
|
|
43
|
-
* recall mode). Keep these in sync — the export is the single source of
|
|
44
|
-
* truth so connector work cannot drift.
|
|
45
|
-
*/
|
|
10
|
+
/** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
|
|
11
|
+
* 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
|
|
46
12
|
export declare const PRIVATE_SCOPE_RE: RegExp;
|
|
47
13
|
/** True when `scope` matches the `<source>:private:*` shape. */
|
|
48
14
|
export declare function isPrivateScope(scope: string | null | undefined): boolean;
|
|
@@ -62,15 +28,8 @@ export declare function canTouchScope(actor: {
|
|
|
62
28
|
}, scope: string | null): boolean;
|
|
63
29
|
/** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
|
|
64
30
|
export declare function ownScopeTouches(ownScope: string | null, scope: string | null): boolean;
|
|
65
|
-
/**
|
|
66
|
-
*
|
|
67
|
-
* rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
|
|
68
|
-
*
|
|
69
|
-
* - When `requested` is set and non-empty: exact match required.
|
|
70
|
-
* - When `requested` is undefined/empty: default-deny on any
|
|
71
|
-
* `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
|
|
72
|
-
* quarantine buckets. `null` and public scopes pass, and so does `ownScope`, the caller's own personal scope.
|
|
73
|
-
*/
|
|
31
|
+
/** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
|
|
32
|
+
* otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
|
|
74
33
|
export declare function passesScopeFilterForRecall(scope: string | null, requested: string | undefined, ownScope?: string | null): boolean;
|
|
75
34
|
export interface SqlFragment {
|
|
76
35
|
sql: string;
|
|
@@ -78,39 +37,19 @@ export interface SqlFragment {
|
|
|
78
37
|
}
|
|
79
38
|
/** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or `_` in an owner match nothing extra. */
|
|
80
39
|
export declare function scopeAdmitSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
|
|
81
|
-
/** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
|
|
40
|
+
/** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
|
|
41
|
+
* another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
|
|
82
42
|
export declare function touchableScopeSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
* SQL 'default-deny-or-exact' mode in loadSearchRows).
|
|
86
|
-
*
|
|
87
|
-
* The CLI flag predates the envelope column as a TAG-boost ranking hint
|
|
88
|
-
* (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
|
|
89
|
-
* UNLOCKS envelope scope X in addition to the default-admitted set — it does
|
|
90
|
-
* NOT narrow the result to X (that would return zero rows for every
|
|
91
|
-
* tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
|
|
92
|
-
* narrowing 'exact' semantics via `passesScopeFilterForRecall`.
|
|
93
|
-
*
|
|
94
|
-
* Note the unlock applies to whatever scope was explicitly named — including
|
|
95
|
-
* a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
|
|
96
|
-
* deliberate owner access, identical in reach to api.recall's exact-match
|
|
97
|
-
* for the same input; only NON-requested private/quarantine scopes stay
|
|
98
|
-
* denied. A named personal scope never unlocks: the CLI has no caller identity to check it against.
|
|
99
|
-
*/
|
|
43
|
+
/** 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').
|
|
44
|
+
* Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
|
|
100
45
|
export declare function passesCliRecallScopeFilter(scope: string | null, requested: string | undefined): boolean;
|
|
101
|
-
/**
|
|
102
|
-
* Thrown when a caller requests a scope its role may not read. The HTTP layer
|
|
103
|
-
* maps it to 403.
|
|
104
|
-
*/
|
|
46
|
+
/** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
|
|
105
47
|
export declare class ScopeForbiddenError extends ForbiddenError {
|
|
106
48
|
readonly scope: string;
|
|
107
49
|
constructor(scope: string);
|
|
108
50
|
}
|
|
109
|
-
/**
|
|
110
|
-
*
|
|
111
|
-
* quarantine buckets. Naming one explicitly is what unlocks it, so naming one
|
|
112
|
-
* is the act that needs authorization.
|
|
113
|
-
*/
|
|
51
|
+
/** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
|
|
52
|
+
* authorization. */
|
|
114
53
|
export declare function isRestrictedScope(scope: string | null | undefined): boolean;
|
|
115
54
|
/** The identity a scope check runs against: a role, any scope grants, and the person who owns the key. */
|
|
116
55
|
export interface ScopeActor {
|
|
@@ -118,7 +57,8 @@ export interface ScopeActor {
|
|
|
118
57
|
scopes?: readonly string[];
|
|
119
58
|
owner?: string;
|
|
120
59
|
}
|
|
121
|
-
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
60
|
+
/** Personal rows answer to their owner alone: role, key grants and resolver scopes never
|
|
61
|
+
* open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
|
|
122
62
|
export declare function canReadScope(actor: ScopeActor, scope: string): boolean;
|
|
123
63
|
/** Authorize an explicitly requested scope before any read honours it (member scope grants). */
|
|
124
64
|
export declare function assertScopeRequestAllowed(actor: ScopeActor, requested: string | undefined): void;
|