hippo-memory 1.68.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 +6 -3
- 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.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- 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 +4 -13
- package/dist/api/forget.js +13 -35
- 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 +9 -46
- package/dist/api/outcome.js +15 -57
- 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 +7 -18
- package/dist/api/promote.js +30 -152
- 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 +12 -13
- package/dist/api/remember.js +38 -27
- 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 +59 -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.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- 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 +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- 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 +8 -3
- 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 -82
- 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 -48
- 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 -90
- 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} +16 -3
- package/dist/core/capture-contract.js +149 -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} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -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.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -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 +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- 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 +65 -63
- 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 +21 -20
- 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} +3 -2
- 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 +41 -50
- package/dist/server.js +26 -560
- 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 +12 -6
- package/dist/store/audit-event.js +6 -5
- 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 +6 -3
- package/dist/store/handoffs.js +70 -31
- 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 +8 -4
- package/dist/store/open.js +34 -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} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- 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 +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- 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} +17 -2
- package/dist/{env.js → util/env.js} +22 -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/capture-contract.js +0 -49
- 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-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { HippoStore, StoreGroups } from '../store/port.js';
|
|
2
|
+
import { type SqliteLocal } from '../store/sqlite/local.js';
|
|
3
|
+
import { type SqliteSyncStore } from '../store/sqlite/store.js';
|
|
4
|
+
import type { Context, StoreReply } from './types.js';
|
|
5
|
+
/** What a port call answers: a Promise from a served store, the value itself from hippo.db. */
|
|
6
|
+
export type Reply<T> = T | Promise<T>;
|
|
7
|
+
/** The port one body is written against: a served store, or hippo.db answering the same methods at once. */
|
|
8
|
+
export type StorePort = HippoStore | SqliteSyncStore;
|
|
9
|
+
/** `next` on the reply's value, at once for a value, so hippo.db's path never becomes a Promise. */
|
|
10
|
+
export declare function andThen<T, U>(reply: Reply<T>, next: (value: T) => Reply<U>): Reply<U>;
|
|
11
|
+
/** Stands in for a group the store lacks, as `port.keyAudit ?? notPorted(port, 'keyAudit')`; it answers 501 as any unported path does. */
|
|
12
|
+
export declare function notPorted(port: StorePort, group: keyof StoreGroups): never;
|
|
13
|
+
/** Runs `run` on `ctx.store`, where a throw rejects, else on hippo.db under `ctx.hippoRoot`, where it throws. The store path never reads `hippoRoot`.
|
|
14
|
+
* `local` runs what needs hippo.db's own handle or meta table; a served store refuses it, or does without where the write allows. */
|
|
15
|
+
export declare function onStore<C extends Context, R>(ctx: C, run: (port: StorePort, local: SqliteLocal) => Reply<R>): StoreReply<C, R>;
|
|
16
|
+
//# sourceMappingURL=on-store.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// The one place an api function picks between a served store and hippo.db, so each operation has one body.
|
|
2
|
+
// Only functions published as StoreReply use this carrier (see "Sync core, async port" in docs/ARCHITECTURE.md);
|
|
3
|
+
// a new operation is async and goes through storeFor(ctx).
|
|
4
|
+
import { SqliteBlockedError, StoreNotPortedError } from '../util/sqlite-blocked.js';
|
|
5
|
+
import { REFUSED_ON_A_STORE, sqliteLocal } from '../store/sqlite/local.js';
|
|
6
|
+
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
7
|
+
/** `next` on the reply's value, at once for a value, so hippo.db's path never becomes a Promise. */
|
|
8
|
+
export function andThen(reply, next) {
|
|
9
|
+
return reply instanceof Promise ? reply.then(next) : next(reply);
|
|
10
|
+
}
|
|
11
|
+
/** Stands in for a group the store lacks, as `port.keyAudit ?? notPorted(port, 'keyAudit')`; it answers 501 as any unported path does. */
|
|
12
|
+
export function notPorted(port, group) {
|
|
13
|
+
throw new StoreNotPortedError(port.kind, group);
|
|
14
|
+
}
|
|
15
|
+
/** A served store's stand-in for SqliteLocal. The last recall sits in hippo.db's meta table, so only a store that is hippo.db keeps and reads it, on `hippoRoot`. */
|
|
16
|
+
function servedLocal(store, hippoRoot) {
|
|
17
|
+
if (store.kind === 'sqlite')
|
|
18
|
+
return { ...sqliteLocal(hippoRoot), ...REFUSED_ON_A_STORE };
|
|
19
|
+
return {
|
|
20
|
+
...REFUSED_ON_A_STORE,
|
|
21
|
+
applyOutcomeToLastRecall() {
|
|
22
|
+
throw new SqliteBlockedError(store.kind);
|
|
23
|
+
},
|
|
24
|
+
finishLastRecall: (writes) => store.finishRecall(writes),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Runs `run` on `ctx.store`, where a throw rejects, else on hippo.db under `ctx.hippoRoot`, where it throws. The store path never reads `hippoRoot`.
|
|
28
|
+
* `local` runs what needs hippo.db's own handle or meta table; a served store refuses it, or does without where the write allows. */
|
|
29
|
+
export function onStore(ctx, run) {
|
|
30
|
+
const { store } = ctx;
|
|
31
|
+
// No await before `run`: an add-on relies on the first port call starting inside this call.
|
|
32
|
+
const reply = store ? (async () => run(store, servedLocal(store, ctx.hippoRoot)))() : run(sqliteSyncStore(ctx.hippoRoot), sqliteLocal(ctx.hippoRoot));
|
|
33
|
+
// SAFETY: the store path is an async function's Promise and hippo.db's port calls answer values, so the Promise comes back exactly when ctx has a store, as StoreReply says.
|
|
34
|
+
return reply;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=on-store.js.map
|
package/dist/api/outcome.d.ts
CHANGED
|
@@ -1,56 +1,19 @@
|
|
|
1
|
-
import type { Context } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* Used by the MCP `hippo_outcome` tool and the HTTP `POST /v1/outcome` route.
|
|
5
|
-
* Tenant-scoped: ids outside ctx.tenantId, or in someone else's personal scope, are silently skipped
|
|
6
|
-
* (matches the prior MCP semantics — a stale id from another tenant doesn't
|
|
7
|
-
* crash the call). Each successful outcome emits one audit_log row with
|
|
8
|
-
* op='outcome' tagged with ctx.actor.subject.
|
|
9
|
-
*
|
|
10
|
-
* Returns `{applied, appliedIds}`. `appliedIds` is the tenant-filtered subset
|
|
11
|
-
* of input ids that actually had `applyOutcome` run on them (i.e. ids found
|
|
12
|
-
* in ctx.tenantId). Callers that surface the id list
|
|
13
|
-
* over a multi-tenant boundary (HTTP /v1/outcome last-recall path, Python SDK)
|
|
14
|
-
* MUST return `appliedIds` instead of the raw input list — otherwise the
|
|
15
|
-
* non-applied (cross-tenant) ids leak to the caller.
|
|
16
|
-
*
|
|
17
|
-
* `opts.traceId`:
|
|
18
|
-
* OPTIONAL additive opt so a programmatic caller can link this outcome to
|
|
19
|
-
* the recall_traces row it judges. NOT applied unconditionally — an SDK
|
|
20
|
-
* caller passing explicit ids with no preceding CLI/context recall would
|
|
21
|
-
* otherwise get linked to a stale, unrelated trace. `outcomeForLastRecall`
|
|
22
|
-
* supplies this automatically from `last_trace_id`; every other caller
|
|
23
|
-
* (server.ts explicit-ids path, MCP hippo_outcome) omits it and gets no
|
|
24
|
-
* linkage, which is correct.
|
|
25
|
-
*/
|
|
1
|
+
import type { Context, StoreReply } from './types.js';
|
|
2
|
+
/** An id outside ctx.tenantId, or in someone else's personal scope, is skipped, so a stale id never fails the call.
|
|
3
|
+
* `appliedIds` holds only the ids applied: a caller that answers across tenants returns it, never the ids it was sent. */
|
|
26
4
|
export interface OutcomeResult {
|
|
27
5
|
applied: number;
|
|
28
6
|
appliedIds: string[];
|
|
29
7
|
}
|
|
30
|
-
|
|
8
|
+
/** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
|
|
9
|
+
export declare function outcome<C extends Context>(ctx: C, ids: ReadonlyArray<string>, good: boolean, opts?: {
|
|
31
10
|
traceId?: number;
|
|
32
|
-
}): OutcomeResult
|
|
33
|
-
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* Reads `loadIndex(ctx.hippoRoot).last_retrieval_ids` (per-hippoRoot local
|
|
37
|
-
* state; not tenant-scoped at the index layer) and forwards to `outcome()`,
|
|
38
|
-
* which DOES tenant-filter its read by `ctx.tenantId`. Cross-tenant
|
|
39
|
-
* ids in `last_retrieval_ids` are silently skipped, matching the MCP
|
|
40
|
-
* `hippo_outcome` semantics.
|
|
41
|
-
*
|
|
42
|
-
* **Tenant-safe response shape:** the returned `ids`
|
|
43
|
-
* field contains ONLY the tenant-filtered subset that actually had outcomes
|
|
44
|
-
* applied (i.e. `appliedIds` from the inner `outcome()` call). It lives in this
|
|
45
|
-
* helper so every caller (CLI, HTTP /v1/outcome, MCP) inherits the contract.
|
|
46
|
-
*
|
|
47
|
-
* Do NOT tighten `loadIndex` with `tenantId` inside this helper — doing so
|
|
48
|
-
* would break the (correct) cross-tenant-silent-skip behavior covered by
|
|
49
|
-
* the test in `tests/api-outcome-for-last-recall.test.ts`.
|
|
50
|
-
*/
|
|
11
|
+
}): StoreReply<C, OutcomeResult>;
|
|
12
|
+
/** The last recall's ids and its trace sit in hippo.db's meta table, which only the CLI and context write, so a store of another kind is refused.
|
|
13
|
+
* `ids` holds only the ids applied in ctx.tenantId: the index is not tenant-scoped, so the ids read from it are never returned. */
|
|
51
14
|
export interface OutcomeForLastRecallResult {
|
|
52
15
|
applied: number;
|
|
53
16
|
ids: string[];
|
|
54
17
|
}
|
|
55
|
-
export declare function outcomeForLastRecall(ctx:
|
|
18
|
+
export declare function outcomeForLastRecall<C extends Context>(ctx: C, good: boolean): StoreReply<C, OutcomeForLastRecallResult>;
|
|
56
19
|
//# sourceMappingURL=outcome.d.ts.map
|
package/dist/api/outcome.js
CHANGED
|
@@ -1,63 +1,21 @@
|
|
|
1
1
|
// Outcome feedback on recalled memories.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { selectEntriesByIds } from '../store/entry-reads.js';
|
|
6
|
-
import { loadIndex } from '../store/index-and-stats.js';
|
|
7
|
-
import { applyOutcome, CHURN_STALE_TAG } from '../memory.js';
|
|
8
|
-
import { appendAuditEvent } from '../audit.js';
|
|
9
|
-
import { recordTraceOutcome } from '../recall-trace.js';
|
|
10
|
-
import { canTouchScope } from '../recall-scope.js';
|
|
2
|
+
import { personalScopeOf } from '../store/recall-scope.js';
|
|
3
|
+
import { andThen, notPorted, onStore } from './on-store.js';
|
|
4
|
+
/** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
|
|
11
5
|
export function outcome(ctx, ids, good, opts) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
let updated = applyOutcome(entry, good);
|
|
21
|
-
if (good && updated.tags.includes(CHURN_STALE_TAG)) { // a good outcome reconfirms the entry
|
|
22
|
-
updated = { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
|
|
23
|
-
}
|
|
24
|
-
writeEntryOn(db, ctx.hippoRoot, updated, { actor: ctx.actor.subject });
|
|
25
|
-
live.set(id, updated); // a repeated id builds on its first outcome, as a fresh read would
|
|
26
|
-
appendAuditEvent(db, {
|
|
27
|
-
tenantId: ctx.tenantId,
|
|
28
|
-
actor: ctx.actor.subject,
|
|
29
|
-
op: 'outcome',
|
|
30
|
-
targetId: id,
|
|
31
|
-
metadata: { good },
|
|
32
|
-
});
|
|
33
|
-
appliedIds.push(id);
|
|
34
|
-
}
|
|
35
|
-
// Link the outcome to its trace, recording only the ids actually
|
|
36
|
-
// credited (post tenant-filtering, matches appliedIds). Lives in its own
|
|
37
|
-
// append-only table so audit_log pruning can never erase training data.
|
|
38
|
-
if (opts?.traceId !== undefined && appliedIds.length > 0) {
|
|
39
|
-
recordTraceOutcome(db, {
|
|
40
|
-
traceId: opts.traceId,
|
|
41
|
-
tenantId: ctx.tenantId,
|
|
42
|
-
outcome: good ? 'positive' : 'negative',
|
|
43
|
-
memoryIds: appliedIds,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
finally {
|
|
48
|
-
closeHippoDb(db);
|
|
49
|
-
}
|
|
50
|
-
return { applied: appliedIds.length, appliedIds };
|
|
6
|
+
return onStore(ctx, (port, local) => {
|
|
7
|
+
const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
|
|
8
|
+
const write = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), ids, good };
|
|
9
|
+
const traceId = opts?.traceId;
|
|
10
|
+
// The trace link is written on hippo.db's own handle after the commit, so a served store refuses a traceId.
|
|
11
|
+
const applied = traceId === undefined ? entryWrites.applyOutcome(write) : local.applyOutcome(write, traceId);
|
|
12
|
+
return andThen(applied, (appliedIds) => ({ applied: appliedIds.length, appliedIds }));
|
|
13
|
+
});
|
|
51
14
|
}
|
|
52
15
|
export function outcomeForLastRecall(ctx, good) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// Same `loadIndex` snapshot as the ids; buildIndexFromDb already strict-parses it to a
|
|
58
|
-
// positive-integer string or null, so no trace_id=0/NaN reaches outcome().
|
|
59
|
-
const traceId = idx.last_trace_id !== null ? Number(idx.last_trace_id) : null;
|
|
60
|
-
const { applied, appliedIds } = outcome(ctx, ids, good, traceId !== null ? { traceId } : undefined);
|
|
61
|
-
return { applied, ids: appliedIds };
|
|
16
|
+
return onStore(ctx, (_port, local) => {
|
|
17
|
+
const ids = local.applyOutcomeToLastRecall({ tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor) }, good);
|
|
18
|
+
return { applied: ids.length, ids };
|
|
19
|
+
});
|
|
62
20
|
}
|
|
63
21
|
//# sourceMappingURL=outcome.js.map
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Pilot arm: one token_ledger row per session names its arm, `hippo` or `holdout`, so a pilot can compare them.
|
|
2
2
|
// `items` holds the holdout rate in basis points; readers outside this repo depend on these rows, so their shape is fixed.
|
|
3
3
|
import { createHash } from 'node:crypto';
|
|
4
|
-
import { loadConfig } from '
|
|
5
|
-
import {
|
|
4
|
+
import { loadConfig } from '../core/config.js';
|
|
5
|
+
import { HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
|
|
6
6
|
import { ledgerRoot, withLedgerDb } from './ledger-db.js';
|
|
7
|
-
import {
|
|
7
|
+
import { errorMessage, log } from '../util/log.js';
|
|
8
|
+
import { firstPilotArmHash } from '../store/token-ledger-rows.js';
|
|
9
|
+
import { recordTokenUse } from '../store/token-ledger.js';
|
|
8
10
|
/** Deterministic split: the same session and rate always land in the same arm. */
|
|
9
11
|
export function hashArm(sessionId, rateBp) {
|
|
10
12
|
const bucket = parseInt(createHash('sha256').update(sessionId).digest('hex').slice(0, 8), 16) % 10000;
|
|
@@ -12,10 +14,7 @@ export function hashArm(sessionId, rateBp) {
|
|
|
12
14
|
}
|
|
13
15
|
/** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
|
|
14
16
|
export function readPilotArm(db, sessionId, tenantId) {
|
|
15
|
-
const
|
|
16
|
-
// SAFETY: the SELECT names exactly this one column.
|
|
17
|
-
const row = db.prepare(`SELECT block_hash FROM token_ledger WHERE session_id = ?${tenantId === undefined ? '' : ' AND tenant_id = ?'}
|
|
18
|
-
AND surface = 'pilot' AND event = 'arm' ORDER BY id LIMIT 1`).get(...params);
|
|
17
|
+
const row = firstPilotArmHash(db, sessionId, tenantId);
|
|
19
18
|
return row?.block_hash === 'holdout' || row?.block_hash === 'hippo' ? row.block_hash : null;
|
|
20
19
|
}
|
|
21
20
|
/** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
|
|
@@ -23,29 +22,22 @@ export function readPilotArm(db, sessionId, tenantId) {
|
|
|
23
22
|
export function ensurePilotArm(db, tenantId, sessionId, rateBp, opts = {}) {
|
|
24
23
|
const hashed = hashArm(sessionId, rateBp);
|
|
25
24
|
const readTenant = opts.ownTenantOnly ? tenantId : undefined;
|
|
26
|
-
let began = false;
|
|
27
25
|
try {
|
|
28
26
|
// A stored row is the common case after the first prompt, so it must not take the write lock.
|
|
29
27
|
const existing = readPilotArm(db, sessionId, readTenant);
|
|
30
28
|
if (existing !== null)
|
|
31
29
|
return existing;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return stored ?? hashed;
|
|
30
|
+
return withWriteScope(db, 'pilot_arm', () => {
|
|
31
|
+
const stored = readPilotArm(db, sessionId, readTenant);
|
|
32
|
+
if (stored === null) {
|
|
33
|
+
recordTokenUse(db, { tenantId, sessionId, surface: 'pilot', event: 'arm', items: rateBp, tokens: 0, hash: hashed, now: opts.now });
|
|
34
|
+
}
|
|
35
|
+
return stored ?? hashed;
|
|
36
|
+
}, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
|
|
40
37
|
}
|
|
41
|
-
catch {
|
|
38
|
+
catch (err) {
|
|
42
39
|
// A prompt hook must not fail on pilot bookkeeping; concurrent callers still agree on the hash arm.
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
db.exec('ROLLBACK');
|
|
46
|
-
}
|
|
47
|
-
catch { /* keep the hash arm */ }
|
|
48
|
-
}
|
|
40
|
+
log.debug(`pilot arm not stored, using the hash arm: ${errorMessage(err)}`);
|
|
49
41
|
return hashed;
|
|
50
42
|
}
|
|
51
43
|
}
|
package/dist/api/promote.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { Context } from './types.js';
|
|
1
|
+
import type { ConnectorEvent } from '../store/port.js';
|
|
2
|
+
import type { Context, StoreReply } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
|
|
5
5
|
* the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
|
|
@@ -26,26 +26,15 @@ export interface SupersedeResult {
|
|
|
26
26
|
oldId: string;
|
|
27
27
|
newId: string;
|
|
28
28
|
}
|
|
29
|
-
export declare function supersede(ctx:
|
|
30
|
-
/**
|
|
31
|
-
* Archive a kind='raw' memory: snapshot into raw_archive, mark archived, delete.
|
|
32
|
-
*
|
|
33
|
-
* `archiveRawMemory` audits the operation internally (op='archive_raw') using the
|
|
34
|
-
* row's own tenant_id. We DO NOT emit a second audit event here to avoid double-
|
|
35
|
-
* emitting the archive_raw op. Instead we pass `ctx.actor.subject` through as `who`,
|
|
36
|
-
* and raw-archive.ts uses that for the audit row.
|
|
37
|
-
*/
|
|
29
|
+
export declare function supersede<C extends Context>(ctx: C, oldId: string, newContent: string): StoreReply<C, SupersedeResult>;
|
|
30
|
+
/** Archive a kind='raw' memory: its metadata moves to raw_archive and the row is deleted. The store writes the one archive_raw audit row, under the caller's subject. */
|
|
38
31
|
export interface ArchiveRawOpts {
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
* SAVEPOINT as the archive — throwing rolls the archive back. Used by the
|
|
42
|
-
* Slack deletion connector to mark the deletion event seen atomically.
|
|
43
|
-
*/
|
|
44
|
-
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
32
|
+
/** The connector event this archive answers. The store logs it in the archive's own transaction, so a redelivery finds it logged. */
|
|
33
|
+
event?: ConnectorEvent;
|
|
45
34
|
}
|
|
46
35
|
export interface ArchiveRawResult {
|
|
47
36
|
ok: true;
|
|
48
37
|
archivedAt: string;
|
|
49
38
|
}
|
|
50
|
-
export declare function archiveRaw(ctx:
|
|
39
|
+
export declare function archiveRaw<C extends Context>(ctx: C, id: string, reason: string, opts?: ArchiveRawOpts): StoreReply<C, ArchiveRawResult>;
|
|
51
40
|
//# sourceMappingURL=promote.d.ts.map
|
package/dist/api/promote.js
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
// Promote to the global store, supersede with a successor, and archive raw memories.
|
|
2
|
-
import { openHippoDb, closeHippoDb
|
|
3
|
-
import { ConflictError, NotFoundError } from '../api-errors.js';
|
|
4
|
-
import { auditRejectionRefusal } from '../store/audit-event.js';
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db/index.js';
|
|
3
|
+
import { ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
5
4
|
import { stampOriginProject } from '../store/entry-row.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { markSummaryDirtyInTx } from '../summary-dirty.js';
|
|
11
|
-
import { RejectedValueError } from '../rejection.js';
|
|
12
|
-
import { log } from '../log.js';
|
|
13
|
-
import { createSuccessor } from '../memory.js';
|
|
14
|
-
import { appendAuditEvent } from '../audit.js';
|
|
15
|
-
import { promoteToGlobal } from '../shared.js';
|
|
16
|
-
import { archiveRawMemory } from '../raw-archive.js';
|
|
17
|
-
import { loadConfig } from '../config.js';
|
|
5
|
+
import { createSuccessor } from '../core/memory.js';
|
|
6
|
+
import { promoteToGlobal } from '../sharing/shared.js';
|
|
7
|
+
import { loadConfig } from '../core/config.js';
|
|
8
|
+
import { andThen, notPorted, onStore } from './on-store.js';
|
|
18
9
|
import { selectMemoryReach } from '../store/tenant-lookup.js';
|
|
19
|
-
import { canTouchScope } from '../recall-scope.js';
|
|
10
|
+
import { canTouchScope, personalScopeOf } from '../store/recall-scope.js';
|
|
20
11
|
export function promote(ctx, id) {
|
|
21
12
|
// Tenant scope: promoteToGlobal reads the entry from the local root via
|
|
22
13
|
// readEntry without a tenant filter, so a Bearer for tenant A could
|
|
@@ -38,51 +29,27 @@ export function promote(ctx, id) {
|
|
|
38
29
|
const globalEntry = promoteToGlobal(ctx.hippoRoot, id, {
|
|
39
30
|
actor: ctx.actor.subject,
|
|
40
31
|
tenantId: ctx.tenantId,
|
|
41
|
-
|
|
42
|
-
tenantId: ctx.tenantId,
|
|
43
|
-
actor: ctx.actor.subject,
|
|
44
|
-
op: 'promote',
|
|
45
|
-
targetId: globalId,
|
|
46
|
-
metadata: { sourceId: id },
|
|
47
|
-
}),
|
|
32
|
+
auditAs: { tenantId: ctx.tenantId, actor: ctx.actor.subject },
|
|
48
33
|
});
|
|
49
34
|
return { ok: true, sourceId: id, globalId: globalEntry.id };
|
|
50
35
|
}
|
|
51
36
|
export function supersede(ctx, oldId, newContent) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
37
|
+
return onStore(ctx, (port) => {
|
|
38
|
+
const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
|
|
39
|
+
return andThen(port.entriesByIds([oldId], ctx.tenantId), ([old]) => {
|
|
40
|
+
const newEntry = createSuccessor(assertSupersedable(ctx, oldId, old ?? null), newContent, {
|
|
41
|
+
tenantId: ctx.tenantId,
|
|
42
|
+
baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
|
|
43
|
+
});
|
|
44
|
+
// A store writes origin_project as given, so the served folder's fallback is stamped here.
|
|
45
|
+
const successor = stampOriginProject(ctx.hippoRoot, newEntry);
|
|
46
|
+
const write = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), oldId, successor };
|
|
47
|
+
return andThen(entryWrites.supersede(write), () => ({ ok: true, oldId, newId: successor.id }));
|
|
48
|
+
});
|
|
56
49
|
});
|
|
57
|
-
// Race-safe transition: open a fresh db handle, BEGIN IMMEDIATE, run all
|
|
58
|
-
// three steps (CAS on old + writeEntryDbOnly(new) + supersede audit row)
|
|
59
|
-
// inside the same transaction. Two concurrent supersedes: exactly one CAS
|
|
60
|
-
// wins (changes=1), the other gets changes=0 and throws CONFLICT. No
|
|
61
|
-
// dangling-pointer window: the new memory's row commits atomically with
|
|
62
|
-
// the old.superseded_by pointer.
|
|
63
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
64
|
-
try {
|
|
65
|
-
commitSupersede(db, ctx, oldId, old, newEntry);
|
|
66
|
-
// Mirrors after COMMIT, while the db handle is still open. Same
|
|
67
|
-
// invariant as the original writeEntry: a mirror failure leaves disk
|
|
68
|
-
// MISSING the markdown for the new memory (rebuildIndex rewrites every
|
|
69
|
-
// markdown mirror from the DB) but DOES NOT desync the DB or
|
|
70
|
-
// roll back the supersede. Logged + swallowed, non-fatal.
|
|
71
|
-
try {
|
|
72
|
-
writeEntryMirrors(ctx.hippoRoot, newEntry);
|
|
73
|
-
}
|
|
74
|
-
catch (mirrorErr) {
|
|
75
|
-
log.error(`supersede: mirror write failed (non-fatal, will self-heal): ${mirrorErr instanceof Error ? mirrorErr.message : String(mirrorErr)}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
closeHippoDb(db);
|
|
80
|
-
}
|
|
81
|
-
return { ok: true, oldId, newId: newEntry.id };
|
|
82
50
|
}
|
|
83
51
|
/** The tenant-scoped row to supersede; another tenant's id, or someone else's personal row, reads as not found. */
|
|
84
|
-
function
|
|
85
|
-
const old = readEntry(ctx.hippoRoot, oldId, ctx.tenantId);
|
|
52
|
+
function assertSupersedable(ctx, oldId, old) {
|
|
86
53
|
if (!old || !canTouchScope(ctx.actor, old.scope ?? null)) {
|
|
87
54
|
throw new NotFoundError(`Memory not found: ${oldId}`);
|
|
88
55
|
}
|
|
@@ -92,104 +59,15 @@ function readSupersedable(ctx, oldId) {
|
|
|
92
59
|
}
|
|
93
60
|
return old;
|
|
94
61
|
}
|
|
95
|
-
/** CAS on the old row, the successor's insert and the 'supersede' audit row, in one BEGIN IMMEDIATE transaction. */
|
|
96
|
-
function commitSupersede(db, ctx, oldId, old, newEntry) {
|
|
97
|
-
db.exec('BEGIN IMMEDIATE');
|
|
98
|
-
try {
|
|
99
|
-
// The tenant filter repeats readEntry's check at no cost, closing an ownership change between read and update.
|
|
100
|
-
const result = db.prepare(`
|
|
101
|
-
UPDATE memories
|
|
102
|
-
SET superseded_by = ?
|
|
103
|
-
WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL
|
|
104
|
-
`).run(newEntry.id, oldId, ctx.tenantId);
|
|
105
|
-
if ((result.changes ?? 0) === 0) {
|
|
106
|
-
db.exec('ROLLBACK');
|
|
107
|
-
throw new ConflictError(`Memory ${oldId} already superseded by another writer`);
|
|
108
|
-
}
|
|
109
|
-
// After the CAS guard, so a lost race throws before the old parent is marked for rebuild.
|
|
110
|
-
if (old.dag_parent_id) {
|
|
111
|
-
markSummaryDirtyInTx(db, old.dag_parent_id, ctx.tenantId, ctx.actor.subject);
|
|
112
|
-
}
|
|
113
|
-
// Emits its own 'remember' audit row inside the same transaction.
|
|
114
|
-
writeEntryDbOnly(db, stampOriginProject(ctx.hippoRoot, newEntry), { actor: ctx.actor.subject });
|
|
115
|
-
appendAuditEvent(db, {
|
|
116
|
-
tenantId: ctx.tenantId,
|
|
117
|
-
actor: ctx.actor.subject,
|
|
118
|
-
op: 'supersede',
|
|
119
|
-
targetId: oldId,
|
|
120
|
-
metadata: { newId: newEntry.id },
|
|
121
|
-
});
|
|
122
|
-
db.exec('COMMIT');
|
|
123
|
-
}
|
|
124
|
-
catch (err) {
|
|
125
|
-
try {
|
|
126
|
-
db.exec('ROLLBACK');
|
|
127
|
-
}
|
|
128
|
-
catch { /* already rolled back */ }
|
|
129
|
-
// The refusal audit lands after ROLLBACK, in a fresh implicit transaction the aborted one cannot undo.
|
|
130
|
-
if (err instanceof RejectedValueError) {
|
|
131
|
-
auditRejectionRefusal(db, err, ctx.actor.subject);
|
|
132
|
-
}
|
|
133
|
-
throw err;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
62
|
export function archiveRaw(ctx, id, reason, opts = {}) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (reach?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, reach.scope)) {
|
|
147
|
-
throw new NotFoundError(`memory not found: ${id}`);
|
|
148
|
-
}
|
|
149
|
-
archiveRawMemory(db, id, {
|
|
150
|
-
reason,
|
|
151
|
-
who: ctx.actor.subject,
|
|
152
|
-
afterArchive: opts.afterArchive,
|
|
153
|
-
});
|
|
154
|
-
// archiveRawMemory deletes the memories row but leaves any legacy markdown
|
|
155
|
-
// mirror in <root>/{buffer,episodic,semantic}/<id>.md untouched. If we left
|
|
156
|
-
// the mirror in place, a subsequent initStore() on an empty memories table
|
|
157
|
-
// would silently re-import the row via bootstrapLegacyStore — defeating the
|
|
158
|
-
// archive (and the GDPR right-to-be-forgotten promise on raw rows). Mirror
|
|
159
|
-
// forget() at src/store.ts:1046, which uses the same removeEntryMirrors call.
|
|
160
|
-
// The DB transaction has already committed; if filesystem unlink fails here
|
|
161
|
-
// we log and continue. The mirror reaper in openHippoDb will catch it on
|
|
162
|
-
// next DB open: raw_archive.mirror_cleaned_at stays NULL until every layer
|
|
163
|
-
// mirror for this id is gone, so the reaper genuinely retries.
|
|
164
|
-
try {
|
|
165
|
-
removeEntryMirrors(ctx.hippoRoot, id);
|
|
166
|
-
mirrorOk = true;
|
|
167
|
-
}
|
|
168
|
-
catch (mirrorErr) {
|
|
169
|
-
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${mirrorErr instanceof Error ? mirrorErr.message : String(mirrorErr)}`);
|
|
170
|
-
}
|
|
171
|
-
if (mirrorOk) {
|
|
172
|
-
// Stamp mirror_cleaned_at now so the next openHippoDb reaper SELECT
|
|
173
|
-
// returns empty for this row. NULL stays untouched on failure -> retry.
|
|
174
|
-
try {
|
|
175
|
-
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), id);
|
|
176
|
-
}
|
|
177
|
-
catch (err) {
|
|
178
|
-
if (!isSqliteBusy(err))
|
|
179
|
-
throw err;
|
|
180
|
-
log.warnThenDebug('archive-mirror-stamp-busy', `archived ${id}; the store was busy, so the mirror reaper will re-check it on the next open`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
finally {
|
|
185
|
-
closeHippoDb(db);
|
|
186
|
-
}
|
|
187
|
-
// Counted here rather than in the CLI: the HTTP archive route calls this too,
|
|
188
|
-
// so a routed archive would otherwise never reach the forgotten counter.
|
|
189
|
-
updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
|
|
190
|
-
// archiveRawMemory does not return the archive_at timestamp it wrote. We
|
|
191
|
-
// emit a fresh ISO timestamp here for the API response. Within a millisecond
|
|
192
|
-
// of the actual write, fine for a server response shape.
|
|
193
|
-
return { ok: true, archivedAt: new Date().toISOString() };
|
|
63
|
+
return onStore(ctx, (port) => {
|
|
64
|
+
const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
|
|
65
|
+
const archive = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), id, reason };
|
|
66
|
+
const { event } = opts;
|
|
67
|
+
const archived = event
|
|
68
|
+
? (port.connectorWrites ?? notPorted(port, 'connectorWrites')).archiveConnectorEntry({ ...archive, event })
|
|
69
|
+
: entryWrites.archiveRaw(archive);
|
|
70
|
+
return andThen(archived, (archivedAt) => ({ ok: true, archivedAt }));
|
|
71
|
+
});
|
|
194
72
|
}
|
|
195
73
|
//# sourceMappingURL=promote.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { type Context, type ContextResult, type ContextResultEntry } from './
|
|
2
|
-
import {
|
|
3
|
-
import type
|
|
4
|
-
import {
|
|
5
|
-
import type { MemoryEntry } from './memory.js';
|
|
1
|
+
import { type Context, type ContextResult, type ContextResultEntry } from './index.js';
|
|
2
|
+
import type { DeliveryRecorder } from '../store/delivery-recorder.js';
|
|
3
|
+
import { type JsonValue } from '../util/json.js';
|
|
4
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
6
5
|
import { type PilotArm } from './pilot-arm.js';
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import type { DeliveryWrite } from '../store/ledger-turn.js';
|
|
7
|
+
/** With `write`, stores on the token ledger's connection (same store); without it, opens its own. A second flush is a no-op. */
|
|
8
|
+
export declare function flushDeliveryRecorder(rec: DeliveryRecorder | null, write?: DeliveryWrite): void;
|
|
9
9
|
/** What one render needs once api.getContext has answered. */
|
|
10
10
|
export interface ContextView {
|
|
11
11
|
readonly hippoRoot: string;
|