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
package/dist/api/learn.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
// Git auto-learn: fix/revert/bug commit subjects become memories. `hippo learn`, init, sleep and MCP hippo_learn share it.
|
|
2
|
-
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
-
import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../autolearn.js';
|
|
4
|
-
import { loadConfig } from '../config.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
2
|
+
import { ForbiddenError } from '../core/api-errors.js';
|
|
3
|
+
import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../learn/autolearn.js';
|
|
4
|
+
import { loadConfig } from '../core/config.js';
|
|
5
|
+
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
6
|
+
import { embedMemory } from '../store/embeddings/index.js';
|
|
7
|
+
import { extractInvalidationTarget, invalidateMatchingAmong } from '../learn/invalidation.js';
|
|
8
|
+
import { computeSchemaFit, createMemory, Layer } from '../core/memory.js';
|
|
9
|
+
import { extractPathTags } from '../search/path-context.js';
|
|
10
|
+
import { canReadScope, personalScopeOf, touchableScopeSql } from '../store/recall-scope.js';
|
|
11
|
+
import { RejectedValueError } from '../store/rejection.js';
|
|
12
|
+
import { duplicateKey, longestWord, storedTextKeys } from '../util/same-text.js';
|
|
12
13
|
import { loadTextsHoldingWords } from '../store/candidates.js';
|
|
13
14
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
14
15
|
import { writeEntry } from '../store/entry-writes.js';
|
|
@@ -38,53 +39,60 @@ export function learn(ctx, opts) {
|
|
|
38
39
|
function writeLessons(ctx, lessons, opts, config) {
|
|
39
40
|
const { hippoRoot, tenantId } = ctx;
|
|
40
41
|
const { profile } = opts;
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const { invalidated } = invalidateMatching(hippoRoot, target, tenantId);
|
|
55
|
-
if (invalidated > 0)
|
|
56
|
-
counts.invalidations.push({ from: target.from, count: invalidated });
|
|
57
|
-
}
|
|
58
|
-
const entry = createMemory(lesson, {
|
|
59
|
-
layer: Layer.Episodic,
|
|
60
|
-
tags: [...profile.tags],
|
|
61
|
-
source: profile.source,
|
|
62
|
-
confidence: 'observed',
|
|
63
|
-
schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
|
|
64
|
-
tenantId,
|
|
65
|
-
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
66
|
-
});
|
|
67
|
-
for (const tag of pathTags)
|
|
68
|
-
if (!entry.tags.includes(tag))
|
|
69
|
-
entry.tags.push(tag);
|
|
70
|
-
// A refused lesson must not abort the rest of the git-log scan.
|
|
71
|
-
try {
|
|
72
|
-
writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
if (err instanceof RejectedValueError) {
|
|
76
|
-
counts.rejected++;
|
|
42
|
+
// `hippo init` calls this outside any request, so the batch brings its own scope: every read and write below shares one handle.
|
|
43
|
+
return withRequestStoresSync(() => {
|
|
44
|
+
// One read serves the batch: invalidation matches against `live`, which follows every write below, as a reload per lesson did.
|
|
45
|
+
const live = profile.full ? loadAllEntries(hippoRoot, tenantId) : [];
|
|
46
|
+
// Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy. Learn is host-admin only, so both read what an admin can.
|
|
47
|
+
const existing = profile.full ? live.filter((e) => e.scope == null || canReadScope(ctx.actor, e.scope)) : undefined;
|
|
48
|
+
const readable = touchableScopeSql('', personalScopeOf(ctx.actor));
|
|
49
|
+
const keys = storedTextKeys(existing ?? loadTextsHoldingWords(hippoRoot, tenantId, lessons.map(longestWord), undefined, readable));
|
|
50
|
+
const pathTags = profile.full ? extractPathTags(opts.repoPath) : [];
|
|
51
|
+
const counts = { added: 0, skipped: 0, rejected: 0, invalidations: [] };
|
|
52
|
+
for (const lesson of lessons) {
|
|
53
|
+
if (keys.has(duplicateKey(lesson))) {
|
|
54
|
+
counts.skipped++;
|
|
77
55
|
continue;
|
|
78
56
|
}
|
|
79
|
-
|
|
57
|
+
const target = profile.full ? extractInvalidationTarget(lesson) : null;
|
|
58
|
+
if (target) {
|
|
59
|
+
const { invalidated } = invalidateMatchingAmong(hippoRoot, live, target, tenantId);
|
|
60
|
+
if (invalidated > 0)
|
|
61
|
+
counts.invalidations.push({ from: target.from, count: invalidated });
|
|
62
|
+
}
|
|
63
|
+
const entry = createMemory(lesson, {
|
|
64
|
+
layer: Layer.Episodic,
|
|
65
|
+
tags: [...profile.tags],
|
|
66
|
+
source: profile.source,
|
|
67
|
+
confidence: 'observed',
|
|
68
|
+
schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
|
|
69
|
+
tenantId,
|
|
70
|
+
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
71
|
+
});
|
|
72
|
+
for (const tag of pathTags)
|
|
73
|
+
if (!entry.tags.includes(tag))
|
|
74
|
+
entry.tags.push(tag);
|
|
75
|
+
// A refused lesson must not abort the rest of the git-log scan.
|
|
76
|
+
try {
|
|
77
|
+
writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (err instanceof RejectedValueError) {
|
|
81
|
+
counts.rejected++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
if (profile.full) {
|
|
87
|
+
updateStats(hippoRoot, { remembered: 1 });
|
|
88
|
+
live.push(entry);
|
|
89
|
+
}
|
|
90
|
+
keys.add(duplicateKey(lesson));
|
|
91
|
+
if (profile.full)
|
|
92
|
+
void embedMemory(hippoRoot, entry);
|
|
93
|
+
counts.added++;
|
|
80
94
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
keys.add(duplicateKey(lesson));
|
|
84
|
-
if (profile.full)
|
|
85
|
-
void embedMemory(hippoRoot, entry);
|
|
86
|
-
counts.added++;
|
|
87
|
-
}
|
|
88
|
-
return counts;
|
|
95
|
+
return counts;
|
|
96
|
+
});
|
|
89
97
|
}
|
|
90
98
|
//# sourceMappingURL=learn.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type openHippoDb } from '../db/index.js';
|
|
2
|
+
import { type LedgerTurn } from '../store/ledger-turn.js';
|
|
3
|
+
import type { LastSent, TokenSurface, TokenUse } from '../store/token-ledger.js';
|
|
4
|
+
export interface LedgerRootOpts {
|
|
5
|
+
/** The store serves many people, so the global store of the user running it belongs to none of them. */
|
|
6
|
+
readonly sharedStore?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
|
|
9
|
+
export declare function ledgerRoot(hippoRoot: string, opts?: LedgerRootOpts): string | null;
|
|
10
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
11
|
+
export declare function noteLedgerRowSkipped<E>(error: E): void;
|
|
12
|
+
/** Books one row in ledgerRoot's store, best-effort. */
|
|
13
|
+
export declare function bookTokenUse(hippoRoot: string, use: TokenUse, opts?: LedgerRootOpts): void;
|
|
14
|
+
/** Books a turn's rows and then its delivery event on one connection of ledgerRoot's store, best-effort. */
|
|
15
|
+
export declare function bookLedgerTurn(hippoRoot: string, turn: LedgerTurn, opts?: LedgerRootOpts): void;
|
|
16
|
+
/** What the session last sent on `surface` in ledgerRoot's store; undefined with no ledger or a failed read. */
|
|
17
|
+
export declare function ledgerLastSent(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface, opts?: LedgerRootOpts): LastSent | null | undefined;
|
|
18
|
+
/** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
|
|
19
|
+
export declare function withLedgerDb<T>(hippoRoot: string, fn: (db: ReturnType<typeof openHippoDb>) => T, opts?: LedgerRootOpts): T | undefined;
|
|
20
|
+
//# sourceMappingURL=ledger-db.d.ts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// The store the token ledger writes to for a caller's root; context, recall and the session hooks share it.
|
|
2
|
+
import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
|
|
3
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
4
|
+
import { getGlobalRoot } from '../sharing/shared.js';
|
|
5
|
+
import { lastSentOnSurface, recordLedgerTurn } from '../store/ledger-turn.js';
|
|
6
|
+
import { isInitialized, onHandle } from '../store/open.js';
|
|
7
|
+
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
8
|
+
/** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
|
|
9
|
+
export function ledgerRoot(hippoRoot, opts) {
|
|
10
|
+
if (isInitialized(hippoRoot))
|
|
11
|
+
return hippoRoot;
|
|
12
|
+
if (opts?.sharedStore)
|
|
13
|
+
return null;
|
|
14
|
+
const globalRoot = getGlobalRoot();
|
|
15
|
+
return isInitialized(globalRoot) ? globalRoot : null;
|
|
16
|
+
}
|
|
17
|
+
// SQLite's result codes for a hippo.db it cannot read: a corrupt image, and a file that is no database.
|
|
18
|
+
const SQLITE_CORRUPT = 11;
|
|
19
|
+
const SQLITE_NOTADB = 26;
|
|
20
|
+
/** The one rule for a skipped ledger row. `absent` is a store with no token_ledger table or a hippo.db SQLite cannot read; the command that owns the store reports that, and a hook must stay quiet about it. */
|
|
21
|
+
function ledgerSkipClass(error) {
|
|
22
|
+
if (isSqliteBusy(error))
|
|
23
|
+
return 'busy';
|
|
24
|
+
const code = error instanceof Error && 'errcode' in error ? error.errcode : undefined;
|
|
25
|
+
if (code === SQLITE_CORRUPT || code === SQLITE_NOTADB)
|
|
26
|
+
return 'absent';
|
|
27
|
+
return errorMessage(error).includes('no such table: token_ledger') ? 'absent' : 'unexpected';
|
|
28
|
+
}
|
|
29
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
30
|
+
export function noteLedgerRowSkipped(error) {
|
|
31
|
+
const skip = ledgerSkipClass(error);
|
|
32
|
+
if (skip === 'busy') {
|
|
33
|
+
noteStoreBusy('token ledger row skipped');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const message = `token ledger row skipped: ${errorMessage(error)}`;
|
|
37
|
+
if (skip === 'absent')
|
|
38
|
+
log.debug(message);
|
|
39
|
+
else
|
|
40
|
+
log.warnThenDebug('token-ledger-row', message, errorFields(error));
|
|
41
|
+
}
|
|
42
|
+
/** Runs `call` on ledgerRoot's store root. Best-effort: undefined on any failure, because a ledger failure must not break context or recall. */
|
|
43
|
+
function onLedgerRoot(hippoRoot, opts, call) {
|
|
44
|
+
let root = null;
|
|
45
|
+
try {
|
|
46
|
+
root = ledgerRoot(hippoRoot, opts);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// An unreadable store root means no ledger write; the ledger must never break context or recall.
|
|
50
|
+
log.debug(`token ledger skipped, store root unreadable: ${errorMessage(error)}`);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
if (root === null)
|
|
54
|
+
return undefined;
|
|
55
|
+
try {
|
|
56
|
+
return call(root);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
noteLedgerRowSkipped(error);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Books one row in ledgerRoot's store, best-effort. */
|
|
64
|
+
export function bookTokenUse(hippoRoot, use, opts) {
|
|
65
|
+
onLedgerRoot(hippoRoot, opts, (root) => sqliteSyncStore(root).recordTokens(use));
|
|
66
|
+
}
|
|
67
|
+
/** Books a turn's rows and then its delivery event on one connection of ledgerRoot's store, best-effort. */
|
|
68
|
+
export function bookLedgerTurn(hippoRoot, turn, opts) {
|
|
69
|
+
onLedgerRoot(hippoRoot, opts, (root) => recordLedgerTurn(root, turn));
|
|
70
|
+
}
|
|
71
|
+
/** What the session last sent on `surface` in ledgerRoot's store; undefined with no ledger or a failed read. */
|
|
72
|
+
export function ledgerLastSent(hippoRoot, tenantId, sessionId, surface, opts) {
|
|
73
|
+
return onLedgerRoot(hippoRoot, opts, (root) => lastSentOnSurface(root, tenantId, sessionId, surface));
|
|
74
|
+
}
|
|
75
|
+
/** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
|
|
76
|
+
export function withLedgerDb(hippoRoot, fn, opts) {
|
|
77
|
+
return onLedgerRoot(hippoRoot, opts, (root) => onHandle(root, fn));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ledger-db.js.map
|
|
@@ -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,53 +1,16 @@
|
|
|
1
1
|
import type { Context, StoreReply } 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
|
-
*/
|
|
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
|
}
|
|
8
|
+
/** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
|
|
30
9
|
export declare function outcome<C extends Context>(ctx: C, ids: ReadonlyArray<string>, good: boolean, opts?: {
|
|
31
10
|
traceId?: number;
|
|
32
11
|
}): StoreReply<C, 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
|
-
*/
|
|
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[];
|
package/dist/api/outcome.js
CHANGED
|
@@ -1,86 +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 { entryAfterOutcome } from '../memory.js';
|
|
8
|
-
import { appendAuditEvent } from '../audit.js';
|
|
9
|
-
import { recordTraceOutcome } from '../recall-trace.js';
|
|
10
|
-
import { canTouchScope, personalScopeOf } from '../recall-scope.js';
|
|
11
|
-
import { SqliteBlockedError } from '../db/sqlite-blocked.js';
|
|
12
|
-
import { requireGroup } from '../store-port.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. */
|
|
13
5
|
export function outcome(ctx, ids, good, opts) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
throw new Error('an outcome links its recall trace on hippo.db only, never through a store');
|
|
23
|
-
const appliedIds = await entryWrites.applyOutcome({ tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), ids, good });
|
|
24
|
-
return { applied: appliedIds.length, appliedIds };
|
|
25
|
-
}
|
|
26
|
-
function outcomeOnHippoDb(ctx, ids, good, opts) {
|
|
27
|
-
const appliedIds = [];
|
|
28
|
-
const db = openStore(ctx.hippoRoot);
|
|
29
|
-
try {
|
|
30
|
-
const live = selectEntriesByIds(db, ids, ctx.tenantId);
|
|
31
|
-
for (const id of ids) {
|
|
32
|
-
const entry = live.get(id);
|
|
33
|
-
if (!entry || !canTouchScope(ctx.actor, entry.scope ?? null))
|
|
34
|
-
continue;
|
|
35
|
-
const updated = entryAfterOutcome(entry, good);
|
|
36
|
-
writeEntryOn(db, ctx.hippoRoot, updated, { actor: ctx.actor.subject });
|
|
37
|
-
live.set(id, updated); // a repeated id builds on its first outcome, as a fresh read would
|
|
38
|
-
appendAuditEvent(db, {
|
|
39
|
-
tenantId: ctx.tenantId,
|
|
40
|
-
actor: ctx.actor.subject,
|
|
41
|
-
op: 'outcome',
|
|
42
|
-
targetId: id,
|
|
43
|
-
metadata: { good },
|
|
44
|
-
});
|
|
45
|
-
appliedIds.push(id);
|
|
46
|
-
}
|
|
47
|
-
// Link the outcome to its trace, recording only the ids actually
|
|
48
|
-
// credited (post tenant-filtering, matches appliedIds). Lives in its own
|
|
49
|
-
// append-only table so audit_log pruning can never erase training data.
|
|
50
|
-
if (opts?.traceId !== undefined && appliedIds.length > 0) {
|
|
51
|
-
recordTraceOutcome(db, {
|
|
52
|
-
traceId: opts.traceId,
|
|
53
|
-
tenantId: ctx.tenantId,
|
|
54
|
-
outcome: good ? 'positive' : 'negative',
|
|
55
|
-
memoryIds: appliedIds,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
closeHippoDb(db);
|
|
61
|
-
}
|
|
62
|
-
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
|
+
});
|
|
63
14
|
}
|
|
64
15
|
export function outcomeForLastRecall(ctx, good) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
/** The last recall's ids and trace sit in hippo.db's meta table, which only the CLI and context write, so no other store holds them. */
|
|
70
|
-
async function lastRecallUnderStore(ctx, store, good) {
|
|
71
|
-
if (store.kind !== 'sqlite')
|
|
72
|
-
throw new SqliteBlockedError(store.kind);
|
|
73
|
-
return outcomeForLastRecallOnHippoDb({ ...ctx, store: undefined }, good);
|
|
74
|
-
}
|
|
75
|
-
function outcomeForLastRecallOnHippoDb(ctx, good) {
|
|
76
|
-
const idx = loadIndex(ctx.hippoRoot);
|
|
77
|
-
const ids = idx.last_retrieval_ids;
|
|
78
|
-
if (ids.length === 0)
|
|
79
|
-
return { applied: 0, ids: [] };
|
|
80
|
-
// Same `loadIndex` snapshot as the ids; buildIndexFromDb already strict-parses it to a
|
|
81
|
-
// positive-integer string or null, so no trace_id=0/NaN reaches outcome().
|
|
82
|
-
const traceId = idx.last_trace_id !== null ? Number(idx.last_trace_id) : null;
|
|
83
|
-
const { applied, appliedIds } = outcome(ctx, ids, good, traceId !== null ? { traceId } : undefined);
|
|
84
|
-
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
|
+
});
|
|
85
20
|
}
|
|
86
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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ConnectorEvent } from '../store/port.js';
|
|
2
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:
|
|
@@ -27,21 +27,10 @@ export interface SupersedeResult {
|
|
|
27
27
|
newId: string;
|
|
28
28
|
}
|
|
29
29
|
export declare function supersede<C extends Context>(ctx: C, oldId: string, newContent: string): StoreReply<C, SupersedeResult>;
|
|
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
|
-
*/
|
|
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;
|