hippo-memory 1.69.0 → 1.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +2 -11
- package/dist/api/forget.js +13 -46
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +4 -15
- package/dist/api/promote.js +29 -106
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +10 -12
- package/dist/api/remember.js +29 -45
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +40 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +4 -2
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -83
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -91
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +7 -27
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +62 -60
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +12 -14
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +1 -1
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +39 -61
- package/dist/server.js +24 -568
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +11 -5
- package/dist/store/audit-event.js +5 -4
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +39 -30
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +24 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +15 -2
- package/dist/{env.js → util/env.js} +20 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
* new debug env var).
|
|
16
16
|
*/
|
|
17
17
|
import { createHash } from 'node:crypto';
|
|
18
|
-
import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked } from '
|
|
19
|
-
import { DELIVERY_LEDGER_VERSION } from './delivery-recorder.js';
|
|
20
|
-
import { log } from '
|
|
18
|
+
import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked, withWriteScope } from '../db/index.js';
|
|
19
|
+
import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
|
|
20
|
+
import { errorMessage, log } from '../util/log.js';
|
|
21
|
+
import { DAY_MS } from '../util/time.js';
|
|
21
22
|
/**
|
|
22
23
|
* Strip a RerankStep down to {stage, multiplier, scoreBefore, scoreAfter}
|
|
23
24
|
* before persisting. `note` is
|
|
@@ -40,17 +41,16 @@ function sanitizeRerankSteps(steps) {
|
|
|
40
41
|
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
41
42
|
* logs to stderr and returns null on any failure.
|
|
42
43
|
*
|
|
43
|
-
* Connection policy
|
|
44
|
-
*
|
|
45
|
-
* `writeRecallTraceAtRoot` instead, since
|
|
46
|
-
* closed by the time tracing runs.
|
|
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.
|
|
47
48
|
*/
|
|
48
49
|
export function writeRecallTrace(db, input) {
|
|
49
50
|
try {
|
|
50
51
|
const queryHash = createHash('sha256').update(input.query).digest('hex').slice(0, 16);
|
|
51
52
|
const ts = new Date().toISOString();
|
|
52
|
-
db
|
|
53
|
-
try {
|
|
53
|
+
return withWriteScope(db, 'write_recall_trace', () => {
|
|
54
54
|
const insertTrace = db.prepare(`
|
|
55
55
|
INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count, explain_mode)
|
|
56
56
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -64,19 +64,11 @@ export function writeRecallTrace(db, input) {
|
|
|
64
64
|
input.results.forEach((r, i) => {
|
|
65
65
|
insertResult.run(traceId, input.tenantId, r.memoryId, i + 1, r.score, r.rerankSteps && r.rerankSteps.length > 0 ? JSON.stringify(sanitizeRerankSteps(r.rerankSteps)) : null);
|
|
66
66
|
});
|
|
67
|
-
db.exec('COMMIT');
|
|
68
67
|
return traceId;
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
try {
|
|
72
|
-
db.exec('ROLLBACK');
|
|
73
|
-
}
|
|
74
|
-
catch { /* already rolled back; keep the original error */ }
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
68
|
+
});
|
|
77
69
|
}
|
|
78
70
|
catch (error) {
|
|
79
|
-
log.error(`recall trace write failed: ${
|
|
71
|
+
log.error(`recall trace write failed: ${errorMessage(error)}`);
|
|
80
72
|
return null;
|
|
81
73
|
}
|
|
82
74
|
}
|
|
@@ -85,11 +77,10 @@ export function writeRecallTrace(db, input) {
|
|
|
85
77
|
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
86
78
|
* failure (fail-soft).
|
|
87
79
|
*
|
|
88
|
-
* Used at
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* tests/api-recall-no-side-effects.test.ts).
|
|
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).
|
|
93
84
|
*
|
|
94
85
|
* This function does NOT touch the `last_trace_id` meta key: its own connection
|
|
95
86
|
* would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
|
|
@@ -98,8 +89,8 @@ export function writeRecallTrace(db, input) {
|
|
|
98
89
|
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
99
90
|
* once — `saveIndex` persists both meta keys in one transaction
|
|
100
91
|
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
101
|
-
* (CLI cmdRecall's zero-result path
|
|
102
|
-
*
|
|
92
|
+
* (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
|
|
93
|
+
* all, so they can't desync by construction.
|
|
103
94
|
*
|
|
104
95
|
* Fail-soft: never throws, including on connection failure.
|
|
105
96
|
*/
|
|
@@ -110,7 +101,7 @@ export function writeRecallTraceAtRoot(root, input) {
|
|
|
110
101
|
}
|
|
111
102
|
catch (error) {
|
|
112
103
|
rethrowIfSqliteBlocked(error);
|
|
113
|
-
log.error(`recall trace connection failed: ${
|
|
104
|
+
log.error(`recall trace connection failed: ${errorMessage(error)}`);
|
|
114
105
|
return null;
|
|
115
106
|
}
|
|
116
107
|
try {
|
|
@@ -174,14 +165,14 @@ export function recordTraceOutcome(db, input) {
|
|
|
174
165
|
`).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
|
|
175
166
|
}
|
|
176
167
|
catch (error) {
|
|
177
|
-
log.error(`recall trace outcome write failed: ${
|
|
168
|
+
log.error(`recall trace outcome write failed: ${errorMessage(error)}`);
|
|
178
169
|
}
|
|
179
170
|
}
|
|
180
171
|
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
|
|
181
172
|
export const DELIVERY_LEDGER_RETENTION_DAYS = 90;
|
|
182
173
|
/** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
|
|
183
174
|
export const DELIVERY_LEDGER_WAIT_MS = 50;
|
|
184
|
-
/** Two prompt-identical events without a host turn id this close
|
|
175
|
+
/** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire twice. */
|
|
185
176
|
export const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
|
|
186
177
|
const DELIVERY_EVENT_COLUMNS = [
|
|
187
178
|
'ts', 'ledger_version', 'tenant_id', 'runtime', 'event_type', 'surface', 'store_hash', 'write_store', 'project_hash',
|
|
@@ -190,7 +181,20 @@ const DELIVERY_EVENT_COLUMNS = [
|
|
|
190
181
|
'rejected_count', 'rejected_unlisted', 'sections_shown', 'sections_dropped', 'budget_tokens', 'selected_tokens',
|
|
191
182
|
'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms',
|
|
192
183
|
];
|
|
184
|
+
function findDuplicateBoundary(db, input) {
|
|
185
|
+
// SAFETY: rows carry exactly the `id` and `ts` columns selected.
|
|
186
|
+
const rows = db.prepare(`
|
|
187
|
+
SELECT id, ts FROM delivery_events
|
|
188
|
+
WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND turn_seq IS NOT NULL
|
|
189
|
+
ORDER BY id
|
|
190
|
+
`).all(input.tenantId, input.sessionId, input.eventType);
|
|
191
|
+
const at = Date.parse(input.ts);
|
|
192
|
+
return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
|
|
193
|
+
}
|
|
193
194
|
function findDuplicateTurn(db, input) {
|
|
195
|
+
// A boundary has no prompt, and two compactions of one session never start within the window, so time alone decides.
|
|
196
|
+
if (isBoundaryEvent(input.eventType))
|
|
197
|
+
return findDuplicateBoundary(db, input);
|
|
194
198
|
if (input.hostTurnId !== null) {
|
|
195
199
|
// SAFETY: a single `id` column, undefined when no row matches.
|
|
196
200
|
const row = db.prepare(`
|
|
@@ -223,8 +227,7 @@ function nextTurnSeq(db, input) {
|
|
|
223
227
|
/** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
|
|
224
228
|
export function writeDeliveryEvent(db, input) {
|
|
225
229
|
try {
|
|
226
|
-
db
|
|
227
|
-
try {
|
|
230
|
+
return withWriteScope(db, 'write_delivery_event', () => {
|
|
228
231
|
// Missing-session and sub-agent events are not turns of a session, so they get no number and no duplicate check.
|
|
229
232
|
const isTurn = input.sessionId !== null && (input.sessionState === 'payload' || input.sessionState === 'env');
|
|
230
233
|
const duplicateOf = isTurn ? findDuplicateTurn(db, input) : null;
|
|
@@ -249,22 +252,14 @@ export function writeDeliveryEvent(db, input) {
|
|
|
249
252
|
insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
|
|
250
253
|
}
|
|
251
254
|
const pruneFrom = Math.min(Date.parse(input.ts), Date.now());
|
|
252
|
-
const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS *
|
|
255
|
+
const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
|
|
253
256
|
db.prepare(`DELETE FROM delivery_events WHERE ts < ?`).run(cutoff);
|
|
254
|
-
db.exec('COMMIT');
|
|
255
257
|
return eventId;
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
try {
|
|
259
|
-
db.exec('ROLLBACK');
|
|
260
|
-
}
|
|
261
|
-
catch { /* SQLite may already have rolled back (SQLITE_FULL, IOERR); keep the original error */ }
|
|
262
|
-
throw error;
|
|
263
|
-
}
|
|
258
|
+
});
|
|
264
259
|
}
|
|
265
260
|
catch (error) {
|
|
266
261
|
// The prompt hook's stderr shows this exact `[hippo] delivery ledger` line, so it stays off the logger's format.
|
|
267
|
-
console.error(`[hippo] delivery ledger write failed: ${
|
|
262
|
+
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
268
263
|
return null;
|
|
269
264
|
}
|
|
270
265
|
}
|
|
@@ -276,7 +271,7 @@ export function writeDeliveryEventAtRoot(root, input) {
|
|
|
276
271
|
}
|
|
277
272
|
catch (error) {
|
|
278
273
|
// Same hook stderr line as writeDeliveryEvent above.
|
|
279
|
-
console.error(`[hippo] delivery ledger write failed: ${
|
|
274
|
+
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
280
275
|
return null;
|
|
281
276
|
}
|
|
282
277
|
try {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { entryRejectRowAt } from './entry-reads.js';
|
|
3
|
+
import { type RejectedValueRow } from './rejection.js';
|
|
4
|
+
type HoldsValue = (text: string) => boolean;
|
|
5
|
+
/** The text, tenant and scope of the memory a rejection names. */
|
|
6
|
+
export type RejectionSource = NonNullable<ReturnType<typeof entryRejectRowAt>>;
|
|
7
|
+
/** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed the handle. */
|
|
8
|
+
export interface Rejection {
|
|
9
|
+
readonly tenantId: string;
|
|
10
|
+
readonly actor: string;
|
|
11
|
+
readonly reason: string;
|
|
12
|
+
/** The memory whose row `textOf` is given; unset when the caller supplies the text itself. */
|
|
13
|
+
readonly memoryId?: string;
|
|
14
|
+
/** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any write. */
|
|
15
|
+
readonly textOf: (source: RejectionSource | undefined) => string;
|
|
16
|
+
/** False for a row this caller may not remove. */
|
|
17
|
+
readonly inReach: (scope: string | null | undefined) => boolean;
|
|
18
|
+
/** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else is left. */
|
|
19
|
+
readonly successorOf: (row: MemoryEntry, holdsValue: HoldsValue, removedIds: ReadonlySet<string>) => MemoryEntry | null | undefined;
|
|
20
|
+
}
|
|
21
|
+
export interface AppliedRejection {
|
|
22
|
+
digest: string;
|
|
23
|
+
/** The rejected text: the stored row keeps only its digest, so no later read can return it. */
|
|
24
|
+
content: string;
|
|
25
|
+
/** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row holding the text. */
|
|
26
|
+
removedIds: string[];
|
|
27
|
+
/** The removedIds of kind 'raw', archived instead of deleted. */
|
|
28
|
+
removedRawIds: string[];
|
|
29
|
+
/** The rows that carry a live merged row's other texts; dormantSuccessorIds is the same for a dormant one. */
|
|
30
|
+
successorIds: string[];
|
|
31
|
+
dormantSuccessorIds: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
|
|
34
|
+
* text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
|
|
35
|
+
export declare function applyRejection(hippoRoot: string, rejection: Rejection): AppliedRejection;
|
|
36
|
+
export type LiftedRejection = {
|
|
37
|
+
status: 'ok';
|
|
38
|
+
digest: string;
|
|
39
|
+
reason: string | null;
|
|
40
|
+
} | {
|
|
41
|
+
status: 'not_found';
|
|
42
|
+
} | {
|
|
43
|
+
status: 'ambiguous';
|
|
44
|
+
candidates: RejectedValueRow[];
|
|
45
|
+
};
|
|
46
|
+
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
|
|
47
|
+
* No match, or more than one, writes nothing. */
|
|
48
|
+
export declare function liftRejection(hippoRoot: string, tenantId: string, digestPrefix: string, actor: string): LiftedRejection;
|
|
49
|
+
/** The tenant's rejected values, newest first. */
|
|
50
|
+
export declare function loadRejectedValues(hippoRoot: string, tenantId: string): RejectedValueRow[];
|
|
51
|
+
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
|
|
52
|
+
* and writes nothing, so a dry run counts the values a real run refuses. */
|
|
53
|
+
export declare function rejectionGuardRefuses(hippoRoot: string, tenantId: string, entryId: string, content: string): boolean;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=rejected-values.d.ts.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Reject, unreject and list rejected values, each on one handle of its own.
|
|
2
|
+
// A file apart from rejection.ts: store/open.ts imports that one, so an open there would be an import cycle.
|
|
3
|
+
import { closeHippoDb, openHippoDb, withWriteScope } from '../db/index.js';
|
|
4
|
+
import { heldTexts } from '../util/same-text.js';
|
|
5
|
+
import { audit } from './audit-event.js';
|
|
6
|
+
import { deleteEntryCore } from './delete-and-batch.js';
|
|
7
|
+
import { deleteDormantRow, listDormantSnapshots, purgeDormantByDigest, replaceDormantEntry } from './dormant.js';
|
|
8
|
+
import { entryRejectRowAt, selectAllEntries } from './entry-reads.js';
|
|
9
|
+
import { stampOriginProject } from './entry-row.js';
|
|
10
|
+
import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
|
|
11
|
+
import { purgeMirrorBestEffort } from './mirrors.js';
|
|
12
|
+
import { openStore } from './open.js';
|
|
13
|
+
import { archiveRawMemory, markMirrorCleaned } from './raw-archive.js';
|
|
14
|
+
import { RejectedValueError, checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
|
|
15
|
+
function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
|
|
16
|
+
const { tenantId, actor, reason } = rejection;
|
|
17
|
+
const { removedIds, removedRawIds, successors } = removal;
|
|
18
|
+
const merged = [];
|
|
19
|
+
for (const row of selectAllEntries(db, tenantId)) {
|
|
20
|
+
if (!rejection.inReach(row.scope))
|
|
21
|
+
continue;
|
|
22
|
+
if (!holdsValue(row.content)) {
|
|
23
|
+
if (heldTexts(row).some(holdsValue))
|
|
24
|
+
merged.push(row);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (row.kind === 'raw') {
|
|
28
|
+
// A raw row is append-only: archiving is its one removal path, and its savepoint nests in this write scope.
|
|
29
|
+
archiveRawMemory(db, row.id, { reason, who: actor });
|
|
30
|
+
removedRawIds.push(row.id);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// The one reject_value row is the trail for these removals, so no forget row each.
|
|
34
|
+
deleteEntryCore(db, row.id, { actor, suppressForgetAudit: true });
|
|
35
|
+
}
|
|
36
|
+
removedIds.push(row.id);
|
|
37
|
+
}
|
|
38
|
+
for (const row of merged) {
|
|
39
|
+
const successor = rejection.successorOf(row, holdsValue, new Set(removedIds));
|
|
40
|
+
deleteEntryCore(db, row.id, { actor, suppressForgetAudit: true });
|
|
41
|
+
removedIds.push(row.id);
|
|
42
|
+
if (!successor)
|
|
43
|
+
continue;
|
|
44
|
+
const kept = stampOriginProject(hippoRoot, successor);
|
|
45
|
+
writeEntryDbOnly(db, kept, { actor });
|
|
46
|
+
successors.push(kept);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror to purge.
|
|
50
|
+
function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
|
|
51
|
+
const { tenantId } = rejection;
|
|
52
|
+
const { removedIds, dormantSuccessorIds } = removal;
|
|
53
|
+
removedIds.push(...purgeDormantByDigest(db, tenantId, digest, rejection.inReach));
|
|
54
|
+
for (const dormant of listDormantSnapshots(db, tenantId)) {
|
|
55
|
+
if (!rejection.inReach(dormant.entry.scope))
|
|
56
|
+
continue;
|
|
57
|
+
const successor = rejection.successorOf(dormant.entry, holdsValue, new Set(removedIds));
|
|
58
|
+
if (successor === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
removedIds.push(dormant.entry.id);
|
|
61
|
+
if (!successor) {
|
|
62
|
+
deleteDormantRow(db, tenantId, dormant.entry.id);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
replaceDormantEntry(db, tenantId, dormant.entry.id, successor);
|
|
66
|
+
dormantSuccessorIds.push(successor.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is logged.
|
|
70
|
+
function purgeRemovedMirrors(db, hippoRoot, removal) {
|
|
71
|
+
for (const id of removal.removedIds) {
|
|
72
|
+
const isRaw = removal.removedRawIds.includes(id);
|
|
73
|
+
const mirrorOk = purgeMirrorBestEffort(hippoRoot, id, isRaw, 'hippo reject');
|
|
74
|
+
if (mirrorOk && isRaw)
|
|
75
|
+
markMirrorCleaned(db, id, new Date().toISOString());
|
|
76
|
+
}
|
|
77
|
+
for (const successor of removal.successors)
|
|
78
|
+
writeEntryMirrors(hippoRoot, successor);
|
|
79
|
+
}
|
|
80
|
+
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
|
|
81
|
+
* text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
|
|
82
|
+
export function applyRejection(hippoRoot, rejection) {
|
|
83
|
+
const { tenantId, actor, reason, memoryId } = rejection;
|
|
84
|
+
const db = openStore(hippoRoot);
|
|
85
|
+
try {
|
|
86
|
+
const content = rejection.textOf(memoryId === undefined ? undefined : entryRejectRowAt(db, memoryId));
|
|
87
|
+
const digest = rejectionDigest(content);
|
|
88
|
+
const rejectedAt = new Date().toISOString();
|
|
89
|
+
const removal = { removedIds: [], removedRawIds: [], successors: [], dormantSuccessorIds: [] };
|
|
90
|
+
withWriteScope(db, 'reject_value', () => {
|
|
91
|
+
insertRejectedValue(db, {
|
|
92
|
+
tenantId,
|
|
93
|
+
digest,
|
|
94
|
+
reason,
|
|
95
|
+
rejectedBy: actor,
|
|
96
|
+
rejectedAt,
|
|
97
|
+
sourceMemoryId: memoryId ?? null,
|
|
98
|
+
normalizedChars: normalizeValueForRejection(content).length,
|
|
99
|
+
});
|
|
100
|
+
// SHORTCUT: scans every row of the tenant, fine for a human-run command; a digest column on memories if stores grow a hundredfold.
|
|
101
|
+
const holdsValue = (text) => rejectionDigest(text) === digest;
|
|
102
|
+
removeLiveRows(db, hippoRoot, rejection, holdsValue, removal);
|
|
103
|
+
removeDormantCopies(db, rejection, digest, holdsValue, removal);
|
|
104
|
+
// Still inside the write scope: a failed audit row is reported and the reject commits without it.
|
|
105
|
+
const { removedIds } = removal;
|
|
106
|
+
audit(db, 'reject_value', { tenantId, actor, targetId: memoryId, metadata: { digest, removedIds, count: removedIds.length } });
|
|
107
|
+
});
|
|
108
|
+
purgeRemovedMirrors(db, hippoRoot, removal);
|
|
109
|
+
const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
|
|
110
|
+
return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
closeHippoDb(db);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
|
|
117
|
+
* No match, or more than one, writes nothing. */
|
|
118
|
+
export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
119
|
+
const db = openStore(hippoRoot);
|
|
120
|
+
try {
|
|
121
|
+
const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
|
|
122
|
+
const target = matches[0];
|
|
123
|
+
if (target === undefined)
|
|
124
|
+
return { status: 'not_found' };
|
|
125
|
+
if (matches.length > 1)
|
|
126
|
+
return { status: 'ambiguous', candidates: matches };
|
|
127
|
+
deleteRejectedValue(db, tenantId, target.digest);
|
|
128
|
+
audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
|
|
129
|
+
return { status: 'ok', digest: target.digest, reason: target.reason };
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
closeHippoDb(db);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** The tenant's rejected values, newest first. */
|
|
136
|
+
export function loadRejectedValues(hippoRoot, tenantId) {
|
|
137
|
+
const db = openStore(hippoRoot);
|
|
138
|
+
try {
|
|
139
|
+
return listRejectedValues(db, tenantId);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
closeHippoDb(db);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
|
|
146
|
+
* and writes nothing, so a dry run counts the values a real run refuses. */
|
|
147
|
+
export function rejectionGuardRefuses(hippoRoot, tenantId, entryId, content) {
|
|
148
|
+
const db = openHippoDb(hippoRoot);
|
|
149
|
+
try {
|
|
150
|
+
checkRejectionGuard(db, tenantId, entryId, content);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
if (err instanceof RejectedValueError)
|
|
155
|
+
return true;
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
closeHippoDb(db);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=rejected-values.js.map
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* import from store.ts — store.ts imports from here, and the reverse would
|
|
11
11
|
* be a cycle.
|
|
12
12
|
*/
|
|
13
|
-
import type { DatabaseSyncLike } from '
|
|
14
|
-
import { BadRequestError } from '
|
|
13
|
+
import type { DatabaseSyncLike } from '../db/index.js';
|
|
14
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
15
15
|
/**
|
|
16
16
|
* Normalize content for rejection-digest comparisons: Unicode NFC →
|
|
17
17
|
* lowercase → collapse whitespace runs to a single space → trim. No
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* be a cycle.
|
|
12
12
|
*/
|
|
13
13
|
import { createHash } from 'node:crypto';
|
|
14
|
-
import { BadRequestError } from '
|
|
14
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
15
|
+
import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
|
|
15
16
|
/**
|
|
16
17
|
* Normalize content for rejection-digest comparisons: Unicode NFC →
|
|
17
18
|
* lowercase → collapse whitespace runs to a single space → trim. No
|
|
@@ -44,7 +45,7 @@ export class RejectedValueError extends BadRequestError {
|
|
|
44
45
|
reason;
|
|
45
46
|
rejectedAt;
|
|
46
47
|
constructor(opts) {
|
|
47
|
-
super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0,
|
|
48
|
+
super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0, DIGEST_DISPLAY_CHARS)}..., ` +
|
|
48
49
|
`reason: ${opts.reason ?? 'none given'}). Run "hippo unreject" to allow it again.`);
|
|
49
50
|
this.name = 'RejectedValueError';
|
|
50
51
|
this.digest = opts.digest;
|
package/dist/store/rows.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Layer, type MemoryEntry, type ConfidenceLevel } from '../memory.js';
|
|
2
|
-
import type
|
|
1
|
+
import { Layer, type MemoryEntry, type ConfidenceLevel } from '../core/memory.js';
|
|
2
|
+
import { type JsonValue } from '../util/json.js';
|
|
3
3
|
export interface IndexEntry {
|
|
4
4
|
id: string;
|
|
5
5
|
file: string;
|
|
@@ -156,7 +156,6 @@ export declare function parseJsonArray(raw: string | null | undefined): string[]
|
|
|
156
156
|
* re-parses the raw meta string itself.
|
|
157
157
|
*/
|
|
158
158
|
export declare function parseLastTraceId(raw: string | null | undefined): string | null;
|
|
159
|
-
export declare function isPlainJsonObject(x: JsonValue): x is Record<string, JsonValue>;
|
|
160
159
|
export declare function rowToTaskSnapshot(row: TaskSnapshotRow): TaskSnapshot;
|
|
161
160
|
export declare function rowToMemoryConflict(row: MemoryConflictRow): MemoryConflict;
|
|
162
161
|
export declare function rowToSessionEvent(row: SessionEventRow): SessionEvent;
|
package/dist/store/rows.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
|
|
2
|
+
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { isJsonObject } from '../util/json.js';
|
|
2
4
|
export const INDEX_VERSION = 3;
|
|
3
5
|
export const MEMORY_SELECT_COLUMNS = `id, created, last_retrieved, retrieval_count, strength, half_life_days, layer, tags_json, emotional_valence, schema_fit, source, outcome_score, outcome_positive, outcome_negative, conflicts_with_json, pinned, confidence, content, parents_json, starred, trace_outcome, source_session_id, valid_from, superseded_by, extracted_from, dag_level, dag_parent_id, kind, scope, owner, artifact_ref, tenant_id, origin_project, descendant_count, earliest_at, latest_at, summary_dirty, last_rebuilt_at, rebuild_count, dag_level_3_built_at`;
|
|
4
6
|
// FTS-join columns for loadSearchRows: each is `m.<col> AS <col>` so rowToEntry's unqualified
|
|
@@ -10,22 +12,22 @@ export const MEMORY_SEARCH_COLUMNS = `m.id AS id, m.created AS created, m.last_r
|
|
|
10
12
|
* this for `RecallResult.windowSize` reporting so the two cannot drift.
|
|
11
13
|
*/
|
|
12
14
|
export const DEFAULT_SEARCH_CANDIDATE_LIMIT = 200;
|
|
13
|
-
|
|
15
|
+
function rowToRetrievalFields(row) {
|
|
14
16
|
// SAFETY: every `as X` below narrows a SQLite column value to an
|
|
15
17
|
// enum/union member of MemoryEntry; `row` comes from MEMORY_SELECT_COLUMNS
|
|
16
18
|
// / MEMORY_SEARCH_COLUMNS, which are the only queries producing MemoryRow,
|
|
17
19
|
// and the DB layer only ever writes these columns from the same enums.
|
|
18
|
-
|
|
20
|
+
return {
|
|
19
21
|
id: row.id,
|
|
20
22
|
created: row.created,
|
|
21
23
|
last_retrieved: row.last_retrieved,
|
|
22
24
|
retrieval_count: Number(row.retrieval_count ?? 0),
|
|
23
25
|
strength: Number(row.strength ?? 1),
|
|
24
|
-
half_life_days: Number(row.half_life_days ??
|
|
26
|
+
half_life_days: Number(row.half_life_days ?? FALLBACK_HALF_LIFE_DAYS),
|
|
25
27
|
layer: row.layer,
|
|
26
28
|
tags: parseJsonArray(row.tags_json),
|
|
27
29
|
emotional_valence: row.emotional_valence ?? 'neutral',
|
|
28
|
-
schema_fit: Number(row.schema_fit ??
|
|
30
|
+
schema_fit: Number(row.schema_fit ?? DEFAULT_SCHEMA_FIT),
|
|
29
31
|
source: row.source ?? 'cli',
|
|
30
32
|
outcome_score: row.outcome_score === null || row.outcome_score === undefined ? null : Number(row.outcome_score),
|
|
31
33
|
outcome_positive: Number(row.outcome_positive ?? 0),
|
|
@@ -37,6 +39,11 @@ export function rowToEntry(row) {
|
|
|
37
39
|
parents: parseJsonArray(row.parents_json),
|
|
38
40
|
starred: Boolean(row.starred),
|
|
39
41
|
trace_outcome: row.trace_outcome ?? null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function rowToPlacementFields(row) {
|
|
45
|
+
// SAFETY: the `as MemoryKind` narrows a column the DB layer only writes from that enum.
|
|
46
|
+
return {
|
|
40
47
|
source_session_id: row.source_session_id ?? null,
|
|
41
48
|
valid_from: row.valid_from ?? row.created,
|
|
42
49
|
superseded_by: row.superseded_by ?? null,
|
|
@@ -57,6 +64,9 @@ export function rowToEntry(row) {
|
|
|
57
64
|
rebuild_count: Number(row.rebuild_count ?? 0),
|
|
58
65
|
dag_level_3_built_at: row.dag_level_3_built_at ?? null,
|
|
59
66
|
};
|
|
67
|
+
}
|
|
68
|
+
export function rowToEntry(row) {
|
|
69
|
+
const entry = { ...rowToRetrievalFields(row), ...rowToPlacementFields(row) };
|
|
60
70
|
// Preserve bm25_score from the FTS path; `'bm25_score' in row` tells an absent column
|
|
61
71
|
// (non-FTS path) from a present one.
|
|
62
72
|
if ('bm25_score' in row && row.bm25_score !== undefined && row.bm25_score !== null) {
|
|
@@ -72,7 +82,7 @@ export function parseJsonArray(raw) {
|
|
|
72
82
|
return Array.isArray(parsed) ? parsed.map((item) => String(item)) : [];
|
|
73
83
|
}
|
|
74
84
|
catch (err) {
|
|
75
|
-
log.debug(`store: corrupt JSON array column read as empty: ${
|
|
85
|
+
log.debug(`store: corrupt JSON array column read as empty: ${errorMessage(err)}`);
|
|
76
86
|
return [];
|
|
77
87
|
}
|
|
78
88
|
}
|
|
@@ -93,21 +103,18 @@ export function parseLastTraceId(raw) {
|
|
|
93
103
|
return null;
|
|
94
104
|
return trimmed;
|
|
95
105
|
}
|
|
96
|
-
export function isPlainJsonObject(x) {
|
|
97
|
-
return x !== null && typeof x === 'object' && !Array.isArray(x);
|
|
98
|
-
}
|
|
99
106
|
function parseJsonObject(raw) {
|
|
100
107
|
if (!raw)
|
|
101
108
|
return {};
|
|
102
109
|
try {
|
|
103
110
|
const parsed = JSON.parse(raw);
|
|
104
|
-
if (
|
|
111
|
+
if (isJsonObject(parsed)) {
|
|
105
112
|
return parsed;
|
|
106
113
|
}
|
|
107
114
|
return {};
|
|
108
115
|
}
|
|
109
116
|
catch (err) {
|
|
110
|
-
log.debug(`store: corrupt JSON object column read as empty: ${
|
|
117
|
+
log.debug(`store: corrupt JSON object column read as empty: ${errorMessage(err)}`);
|
|
111
118
|
return {};
|
|
112
119
|
}
|
|
113
120
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MemoryEntry } from '../memory.js';
|
|
2
|
-
import { type DatabaseSyncLike } from '../db.js';
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Recall-mode scope filter shape, exported so callers and tests can name it. Three modes:
|
|
5
5
|
* - 'default-deny': exclude scopes in `RECALL_DEFAULT_DENY_SCOPES`.
|
|
@@ -28,6 +28,8 @@ export type RecallScopeFilter = {
|
|
|
28
28
|
export type OriginFilter = string | readonly string[];
|
|
29
29
|
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal, which only `ownScope` opens. */
|
|
30
30
|
export declare function recallScopeFilter(requestedScope: string | undefined, mode: 'exact' | 'additive', ownScope?: string): RecallScopeFilter;
|
|
31
|
+
/** Sends term queries down the LIKE path on a build that has FTS. Only tests call it. */
|
|
32
|
+
export declare function _forceLikePathForTests(on: boolean): void;
|
|
31
33
|
/**
|
|
32
34
|
* Load likely search candidates directly from SQLite.
|
|
33
35
|
* Uses FTS5 when available, falls back to LIKE matching, then full-store fallback.
|
|
@@ -54,7 +56,16 @@ export declare function loadSearchEntries(hippoRoot: string, query: string, limi
|
|
|
54
56
|
* `tenantId` is optional because searchBothHybrid's is; undefined means no tenant filter.
|
|
55
57
|
*/
|
|
56
58
|
export declare function loadRecallSearchEntries(hippoRoot: string, query: string, limit?: number, tenantId?: string, requestedScope?: string, explicitScopeMode?: 'exact' | 'additive', includeSuperseded?: boolean, originProjects?: OriginFilter, ownScope?: string): MemoryEntry[];
|
|
57
|
-
export
|
|
59
|
+
export interface RecallSearchEntriesOptions {
|
|
60
|
+
readonly limit?: number;
|
|
61
|
+
readonly tenantId?: string;
|
|
62
|
+
readonly requestedScope?: string;
|
|
63
|
+
readonly explicitScopeMode?: 'exact' | 'additive';
|
|
64
|
+
readonly includeSuperseded?: boolean;
|
|
65
|
+
readonly originProjects?: OriginFilter;
|
|
66
|
+
readonly ownScope?: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function loadRecallSearchEntriesFromDb(db: DatabaseSyncLike, query: string, options?: RecallSearchEntriesOptions): MemoryEntry[];
|
|
58
69
|
/** Which rows the vector arm of hybrid search may add: the same tenant, scope and superseded rules as the lexical load. */
|
|
59
70
|
export interface VectorCandidateSpec {
|
|
60
71
|
tenantId?: string;
|
|
@@ -65,7 +76,7 @@ export interface VectorCandidateSpec {
|
|
|
65
76
|
origin?: OriginFilter;
|
|
66
77
|
}
|
|
67
78
|
/** The rows nearest `queryVector` that pass `spec`, nearest first. */
|
|
68
|
-
export declare function loadVectorCandidateEntries(hippoRoot: string, queryVector: readonly number[], spec: VectorCandidateSpec): MemoryEntry[]
|
|
79
|
+
export declare function loadVectorCandidateEntries(hippoRoot: string, queryVector: readonly number[], spec: VectorCandidateSpec): Promise<MemoryEntry[]>;
|
|
69
80
|
/** Rarest-K prompt terms for this connection's FTS index, as a space-joined query string.
|
|
70
81
|
* Without FTS, returns the first 32 terms, as before rarest-term selection. */
|
|
71
82
|
export declare function pickRarestFtsQuery(db: DatabaseSyncLike, terms: readonly string[], maxTerms?: number): string;
|