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/store/candidates.js
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { schemaFitFrom, strengthSql } from '../core/memory.js';
|
|
2
|
+
import { closeHippoDb, withReadSnapshot } from '../db/index.js';
|
|
3
|
+
import { scopeAdmitSql } from './recall-scope.js';
|
|
3
4
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
4
5
|
import { openStore } from './open.js';
|
|
5
|
-
import { originInSql } from '../project-identity.js';
|
|
6
|
+
import { originInSql } from '../core/project-identity.js';
|
|
6
7
|
import { pickRarestFtsQuery, loadRecallSearchEntriesFromDb } from './search-rows.js';
|
|
7
8
|
const AMBIENT_SCOPED = 'superseded_by IS NULL AND tenant_id = ?';
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
9
|
+
/** idx_memories_pinned (db.ts v51) serves it. */
|
|
10
|
+
const AMBIENT_PINNED_WHERE = `pinned = 1 AND ${AMBIENT_SCOPED} ORDER BY created ASC, id ASC`;
|
|
11
|
+
/** idx_memories_created_drift (db.ts v51) serves it. */
|
|
12
|
+
const AMBIENT_DRIFT_SQL = `SELECT 1 FROM memories WHERE ${AMBIENT_SCOPED} AND (length(created) <> 24 OR created NOT LIKE '%Z') LIMIT 1`;
|
|
12
13
|
function inOrigins(e, origins) {
|
|
13
14
|
const origin = e.origin_project ?? null;
|
|
14
15
|
return origin === '' ? origins.userGlobal : origin !== null && origins.names.includes(origin);
|
|
15
16
|
}
|
|
16
17
|
// The newest rows `admit` keeps, newest first. The first window stays unfiltered so admit still sees, and the
|
|
17
18
|
// delivery ledger still counts, the other-project rows it refuses; past it, the reads narrow to the caller's origins.
|
|
18
|
-
function loadRecentRows(run, drifted, tenantId,
|
|
19
|
+
function loadRecentRows(run, drifted, tenantId, options) {
|
|
20
|
+
const { needed, admit, origins } = options;
|
|
19
21
|
const keep = origins ? (e) => admit(e) && inOrigins(e, origins) : admit;
|
|
20
22
|
// `id DESC` mirrors getContext's comparator, not loadFreshRawMemories'
|
|
21
23
|
// cross-ingest-stable order: that would change what the hook injects.
|
|
@@ -56,7 +58,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
56
58
|
}
|
|
57
59
|
if (needed > 0) {
|
|
58
60
|
const drifted = db.prepare(AMBIENT_DRIFT_SQL).get(tenantId) !== undefined;
|
|
59
|
-
for (const e of loadRecentRows(run, drifted, tenantId, needed, admit, origins))
|
|
61
|
+
for (const e of loadRecentRows(run, drifted, tenantId, { needed, admit, origins }))
|
|
60
62
|
byId.set(e.id, e);
|
|
61
63
|
}
|
|
62
64
|
// loadAllEntries' order: rankedPinned's comparator can tie and Array.sort
|
|
@@ -69,7 +71,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
69
71
|
return { entries };
|
|
70
72
|
const ftsQuery = pickRarestFtsQuery(db, recall.terms);
|
|
71
73
|
const recallEntries = ftsQuery
|
|
72
|
-
? loadRecallSearchEntriesFromDb(db, ftsQuery, recall.limit, tenantId,
|
|
74
|
+
? loadRecallSearchEntriesFromDb(db, ftsQuery, { limit: recall.limit, tenantId, includeSuperseded: false, ownScope: recall.ownScope })
|
|
73
75
|
: [];
|
|
74
76
|
return { entries, recall: recallEntries };
|
|
75
77
|
}
|
|
@@ -112,36 +114,17 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
112
114
|
closeHippoDb(db);
|
|
113
115
|
}
|
|
114
116
|
}
|
|
115
|
-
/** Every tenant row as a StrengthRow, for whole-store health numbers; defaults match rowToEntry's. */
|
|
116
|
-
export function loadStrengthRows(hippoRoot, tenantId) {
|
|
117
|
-
const db = openStore(hippoRoot);
|
|
118
|
-
try {
|
|
119
|
-
// SAFETY: rows' shape matches the columns named in the SELECT below.
|
|
120
|
-
const rows = db.prepare(`SELECT pinned, created, last_retrieved, half_life_days, retrieval_count, emotional_valence, outcome_positive, outcome_negative, tags_json
|
|
121
|
-
FROM memories WHERE tenant_id = ?`).all(tenantId);
|
|
122
|
-
return rows.map((row) => ({
|
|
123
|
-
pinned: Boolean(row.pinned),
|
|
124
|
-
created: row.created,
|
|
125
|
-
last_retrieved: row.last_retrieved,
|
|
126
|
-
half_life_days: Number(row.half_life_days ?? 7),
|
|
127
|
-
retrieval_count: Number(row.retrieval_count ?? 0),
|
|
128
|
-
emotional_valence: row.emotional_valence ?? 'neutral',
|
|
129
|
-
outcome_positive: Number(row.outcome_positive ?? 0),
|
|
130
|
-
outcome_negative: Number(row.outcome_negative ?? 0),
|
|
131
|
-
tags: parseJsonArray(row.tags_json),
|
|
132
|
-
}));
|
|
133
|
-
}
|
|
134
|
-
finally {
|
|
135
|
-
closeHippoDb(db);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
117
|
// No owner: for session capture, a personal or connector-private row must never stop a team copy being written.
|
|
139
118
|
const TEAM_VISIBLE = scopeAdmitSql('');
|
|
119
|
+
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
120
|
+
export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
|
|
140
121
|
/** Text, source and origin of tenant rows holding any of `words` that `admit` passes, by default the team-visible ones; a row equal to a text apart from spacing holds its every word.
|
|
141
|
-
* With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. */
|
|
122
|
+
* With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
142
123
|
export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
|
|
143
124
|
const unique = [...new Set(words)];
|
|
144
125
|
const out = [];
|
|
126
|
+
const tenantWhere = tenantId === undefined ? '1' : 'tenant_id = ?';
|
|
127
|
+
const tenantParams = tenantId === undefined ? [] : [tenantId];
|
|
145
128
|
const originWhere = project === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(project)})`;
|
|
146
129
|
const db = openStore(hippoRoot);
|
|
147
130
|
try {
|
|
@@ -149,7 +132,7 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
149
132
|
for (let i = 0; i < unique.length; i += 200) {
|
|
150
133
|
const chunk = unique.slice(i, i + 200);
|
|
151
134
|
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
152
|
-
const rows = db.prepare(`SELECT content, source, origin_project FROM memories WHERE
|
|
135
|
+
const rows = db.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ${admit.sql} AND (${chunk.map(() => 'instr(content, ?) > 0').join(' OR ')})`).all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
|
|
153
136
|
for (const row of rows)
|
|
154
137
|
out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
|
|
155
138
|
}
|
|
@@ -159,6 +142,47 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
159
142
|
closeHippoDb(db);
|
|
160
143
|
}
|
|
161
144
|
}
|
|
145
|
+
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
|
|
146
|
+
export function loadNewestEntries(hippoRoot, tenantId, limit) {
|
|
147
|
+
const db = openStore(hippoRoot);
|
|
148
|
+
try {
|
|
149
|
+
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
150
|
+
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created DESC, id DESC LIMIT ?`).all(tenantId, limit);
|
|
151
|
+
return rows.reverse().map(rowToEntry);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
closeHippoDb(db);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function* contentsOf(rows) {
|
|
158
|
+
for (const row of rows)
|
|
159
|
+
yield row.content;
|
|
160
|
+
}
|
|
161
|
+
/** computeSchemaFit against every row of a tenant: tag counts come from one aggregate and texts stream one column, so no row is loaded. */
|
|
162
|
+
export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
163
|
+
const db = openStore(hippoRoot);
|
|
164
|
+
try {
|
|
165
|
+
// One read transaction, so the row count and the texts come from the same snapshot.
|
|
166
|
+
return withReadSnapshot(db, () => {
|
|
167
|
+
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
168
|
+
const groups = db.prepare('SELECT tags_json, COUNT(*) AS n FROM memories WHERE tenant_id = ? GROUP BY tags_json').all(tenantId);
|
|
169
|
+
let rows = 0;
|
|
170
|
+
const tagCounts = new Map();
|
|
171
|
+
for (const group of groups) {
|
|
172
|
+
rows += group.n;
|
|
173
|
+
for (const tag of parseJsonArray(group.tags_json))
|
|
174
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + group.n);
|
|
175
|
+
}
|
|
176
|
+
// SHORTCUT: the text walk visits rows until a tenth of the tenant matches; a stored token count per tenant is the upgrade.
|
|
177
|
+
// SAFETY: the SELECT names exactly the one column read.
|
|
178
|
+
const texts = db.prepare('SELECT content FROM memories WHERE tenant_id = ?').iterate(tenantId);
|
|
179
|
+
return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
closeHippoDb(db);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
162
186
|
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
|
|
163
187
|
export function tallySources(hippoRoot, tenantId) {
|
|
164
188
|
const db = openStore(hippoRoot);
|
|
@@ -172,4 +196,32 @@ export function tallySources(hippoRoot, tenantId) {
|
|
|
172
196
|
closeHippoDb(db);
|
|
173
197
|
}
|
|
174
198
|
}
|
|
199
|
+
// A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
|
|
200
|
+
export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
|
|
201
|
+
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
202
|
+
export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
|
|
203
|
+
// An unparseable date scores NULL in SQL and 0 in calculateStrength.
|
|
204
|
+
const strength = `COALESCE(${strengthSql(now)}, 0)`;
|
|
205
|
+
const db = openStore(hippoRoot);
|
|
206
|
+
try {
|
|
207
|
+
// SAFETY: one aggregate row whose columns are the aliases named below.
|
|
208
|
+
const row = db.prepare(`SELECT
|
|
209
|
+
COUNT(*) AS total,
|
|
210
|
+
COALESCE(SUM(pinned != 0), 0) AS pinned,
|
|
211
|
+
COALESCE(SUM(EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE value = 'error')), 0) AS errors,
|
|
212
|
+
COALESCE(SUM(${strength}), 0) AS strengthSum,
|
|
213
|
+
COALESCE(SUM(COALESCE(pinned, 0) = 0 AND ${strength} < ?), 0) AS atRisk
|
|
214
|
+
FROM memories WHERE tenant_id = ?`).get(atRiskBelow, tenantId);
|
|
215
|
+
return {
|
|
216
|
+
total: Number(row.total),
|
|
217
|
+
pinned: Number(row.pinned),
|
|
218
|
+
errors: Number(row.errors),
|
|
219
|
+
strengthSum: Number(row.strengthSum),
|
|
220
|
+
atRisk: Number(row.atRisk),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
closeHippoDb(db);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
175
227
|
//# sourceMappingURL=candidates.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Card, CardComment, CardRun } from '
|
|
2
|
-
import type { SessionHandoff } from '
|
|
3
|
-
import { loadCardDeps } from './
|
|
1
|
+
import type { Card, CardComment, CardRun } from '../core/card.js';
|
|
2
|
+
import type { SessionHandoff } from '../core/handoff.js';
|
|
3
|
+
import { loadCardDeps } from './cards.js';
|
|
4
4
|
/** A card plus everything `hippo card show` prints about it. */
|
|
5
5
|
export interface CardDetail {
|
|
6
6
|
card: Card;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadCard, loadCardComments, loadCardDeps, loadCardRuns, loadLatestHandoffForCard } from './
|
|
1
|
+
import { loadCard, loadCardComments, loadCardDeps, loadCardRuns, loadLatestHandoffForCard } from './cards.js';
|
|
2
2
|
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card); five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
|
|
3
3
|
export function loadCardDetail(hippoRoot, tenantId, id) {
|
|
4
4
|
const card = loadCard(hippoRoot, tenantId, id);
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { type DatabaseSyncLike } from '
|
|
2
|
-
import { SessionHandoff, HandoffOutcome } from '
|
|
3
|
-
import { Card, CardStatus, CardRun, CardComment } from '
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { SessionHandoff, HandoffOutcome } from '../core/handoff.js';
|
|
3
|
+
import { Card, CardStatus, CardRun, CardComment } from '../core/card.js';
|
|
4
|
+
export interface TransitionCardOptions {
|
|
5
|
+
readonly from: CardStatus[];
|
|
6
|
+
readonly to: CardStatus;
|
|
7
|
+
readonly extra?: {
|
|
8
|
+
setSql?: string;
|
|
9
|
+
whereSql?: string;
|
|
10
|
+
params?: unknown[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function transitionCard(db: DatabaseSyncLike, tenantId: string, cardId: string, options: TransitionCardOptions): number;
|
|
9
14
|
/** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog. An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
|
|
10
15
|
export declare function createCard(hippoRoot: string, tenantId: string, input: {
|
|
11
16
|
title: string;
|
|
@@ -50,4 +55,4 @@ export declare function completeCard(hippoRoot: string, tenantId: string, id: st
|
|
|
50
55
|
export declare function reclaimExpiredCards(hippoRoot: string, tenantId: string): string[];
|
|
51
56
|
/** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
|
|
52
57
|
export declare function addCardComment(hippoRoot: string, tenantId: string, cardId: string, author: string, body: string): CardComment;
|
|
53
|
-
//# sourceMappingURL=
|
|
58
|
+
//# sourceMappingURL=cards.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { generateId } from '
|
|
2
|
-
import { closeHippoDb } from '
|
|
3
|
-
import { rowToSessionHandoff, isHandoffOutcome } from '
|
|
4
|
-
import { CARD_TRANSITIONS, CARD_LEASE_MS } from '
|
|
1
|
+
import { generateId } from '../core/memory.js';
|
|
2
|
+
import { closeHippoDb, withWriteScope, withWriteScopeOr } from '../db/index.js';
|
|
3
|
+
import { rowToSessionHandoff, isHandoffOutcome } from '../core/handoff.js';
|
|
4
|
+
import { CARD_TRANSITIONS, CARD_LEASE_MS } from '../core/card.js';
|
|
5
5
|
import { assertTenantId } from './tenant.js';
|
|
6
|
-
import { openStore } from './
|
|
7
|
-
import { HANDOFF_COLUMNS } from './
|
|
6
|
+
import { openStore } from './open.js';
|
|
7
|
+
import { HANDOFF_COLUMNS } from './handoffs.js';
|
|
8
8
|
const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at, tenant_id, scope';
|
|
9
9
|
function rowToCard(row) {
|
|
10
10
|
return {
|
|
@@ -77,9 +77,8 @@ function closeLiveRun(db, tenantId, cardId, outcome, now) {
|
|
|
77
77
|
WHERE card = ? AND tenant_id = ? AND ended IS NULL
|
|
78
78
|
`).run(now, outcome, now, cardId, tenantId);
|
|
79
79
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
export function transitionCard(db, tenantId, cardId, from, to, extra) {
|
|
80
|
+
export function transitionCard(db, tenantId, cardId, options) {
|
|
81
|
+
const { from, to, extra } = options;
|
|
83
82
|
for (const status of from) {
|
|
84
83
|
if (!CARD_TRANSITIONS[status].includes(to)) {
|
|
85
84
|
throw new Error(`illegal card transition: ${status} -> ${to}`);
|
|
@@ -110,24 +109,10 @@ export function createCard(hippoRoot, tenantId, input) {
|
|
|
110
109
|
try {
|
|
111
110
|
const dependsOn = [...new Set(input.dependsOn ?? [])];
|
|
112
111
|
let id = '';
|
|
113
|
-
db
|
|
114
|
-
try {
|
|
112
|
+
withWriteScope(db, 'create_card', () => {
|
|
115
113
|
// Probe runs inside the transaction (mirrors batchWriteAndDelete): a parent
|
|
116
114
|
// completing between an outside-the-lock read and the INSERT would strand the child.
|
|
117
|
-
|
|
118
|
-
if (dependsOn.length > 0) {
|
|
119
|
-
const placeholders = dependsOn.map(() => '?').join(', ');
|
|
120
|
-
// SAFETY: rows' shape matches the two columns named in the SELECT below.
|
|
121
|
-
const rows = db.prepare(`SELECT id, status FROM cards WHERE tenant_id = ? AND id IN (${placeholders})`).all(tenantId, ...dependsOn);
|
|
122
|
-
const found = new Map(rows.map((r) => [r.id, r.status]));
|
|
123
|
-
// Pre-check before any write: a typo'd --depends-on can never commit a card row.
|
|
124
|
-
for (const parentId of dependsOn) {
|
|
125
|
-
if (!found.has(parentId)) {
|
|
126
|
-
throw new Error(`unknown parent card id: ${parentId}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
allParentsDone = dependsOn.every((pid) => found.get(pid) === 'done');
|
|
130
|
-
}
|
|
115
|
+
const allParentsDone = everyParentDone(db, tenantId, dependsOn);
|
|
131
116
|
id = generateId('card');
|
|
132
117
|
const now = new Date().toISOString();
|
|
133
118
|
const status = dependsOn.length === 0 || allParentsDone ? 'ready' : 'backlog';
|
|
@@ -140,21 +125,29 @@ export function createCard(hippoRoot, tenantId, input) {
|
|
|
140
125
|
INSERT INTO card_deps (parent, child, tenant_id, created_at) VALUES (?, ?, ?, ?)
|
|
141
126
|
`).run(parentId, id, tenantId, now);
|
|
142
127
|
}
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
try {
|
|
147
|
-
db.exec('ROLLBACK');
|
|
148
|
-
}
|
|
149
|
-
catch { /* commit may have already rolled back */ }
|
|
150
|
-
throw error;
|
|
151
|
-
}
|
|
128
|
+
});
|
|
152
129
|
return loadCardRow(db, tenantId, id);
|
|
153
130
|
}
|
|
154
131
|
finally {
|
|
155
132
|
closeHippoDb(db);
|
|
156
133
|
}
|
|
157
134
|
}
|
|
135
|
+
/** Whether every dependsOn card is done, true for none; throws on an id that is no card of the tenant. Call inside the write scope. */
|
|
136
|
+
function everyParentDone(db, tenantId, dependsOn) {
|
|
137
|
+
if (dependsOn.length === 0)
|
|
138
|
+
return true;
|
|
139
|
+
const placeholders = dependsOn.map(() => '?').join(', ');
|
|
140
|
+
// SAFETY: rows' shape matches the two columns named in the SELECT below.
|
|
141
|
+
const rows = db.prepare(`SELECT id, status FROM cards WHERE tenant_id = ? AND id IN (${placeholders})`).all(tenantId, ...dependsOn);
|
|
142
|
+
const found = new Map(rows.map((r) => [r.id, r.status]));
|
|
143
|
+
// Pre-check before any write: a typo'd --depends-on can never commit a card row.
|
|
144
|
+
for (const parentId of dependsOn) {
|
|
145
|
+
if (!found.has(parentId)) {
|
|
146
|
+
throw new Error(`unknown parent card id: ${parentId}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return dependsOn.every((pid) => found.get(pid) === 'done');
|
|
150
|
+
}
|
|
158
151
|
/** Returns the card row for id, or null if it does not exist under this tenant. */
|
|
159
152
|
export function loadCard(hippoRoot, tenantId, id) {
|
|
160
153
|
assertTenantId('loadCard', tenantId);
|
|
@@ -258,37 +251,26 @@ export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
|
|
|
258
251
|
}
|
|
259
252
|
const db = openStore(hippoRoot);
|
|
260
253
|
try {
|
|
261
|
-
db
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
setSql: 'assignee_runtime = ?',
|
|
266
|
-
whereSql: 'assignee_runtime IS NULL',
|
|
267
|
-
params: [runtime],
|
|
254
|
+
const runId = withWriteScopeOr(db, 'claim_card', (rollback) => {
|
|
255
|
+
const changes = transitionCard(db, tenantId, id, {
|
|
256
|
+
from: ['ready', 'blocked'],
|
|
257
|
+
to: 'running',
|
|
258
|
+
extra: { setSql: 'assignee_runtime = ?', whereSql: 'assignee_runtime IS NULL', params: [runtime] },
|
|
268
259
|
});
|
|
269
260
|
if (changes === 0) {
|
|
270
261
|
if (!loadCardRow(db, tenantId, id)) {
|
|
271
262
|
throw new Error(`unknown card id: ${id}`);
|
|
272
263
|
}
|
|
273
|
-
|
|
274
|
-
return null;
|
|
264
|
+
return rollback(null);
|
|
275
265
|
}
|
|
276
266
|
const now = new Date().toISOString();
|
|
277
267
|
const insert = db.prepare(`
|
|
278
268
|
INSERT INTO card_runs (card, runtime, session_id, started, created_at, updated_at, tenant_id)
|
|
279
269
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
280
270
|
`).run(id, runtime, sessionId ?? null, now, now, now, tenantId);
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
try {
|
|
286
|
-
db.exec('ROLLBACK');
|
|
287
|
-
}
|
|
288
|
-
catch { /* commit may have already rolled back */ }
|
|
289
|
-
throw error;
|
|
290
|
-
}
|
|
291
|
-
return { ...loadCardRow(db, tenantId, id), runId };
|
|
271
|
+
return Number(insert.lastInsertRowid ?? 0);
|
|
272
|
+
});
|
|
273
|
+
return runId === null ? null : { ...loadCardRow(db, tenantId, id), runId };
|
|
292
274
|
}
|
|
293
275
|
finally {
|
|
294
276
|
closeHippoDb(db);
|
|
@@ -300,29 +282,20 @@ export function heartbeatCard(hippoRoot, tenantId, id, runId) {
|
|
|
300
282
|
assertRunId(runId);
|
|
301
283
|
const db = openStore(hippoRoot);
|
|
302
284
|
try {
|
|
303
|
-
db
|
|
304
|
-
try {
|
|
285
|
+
const beat = withWriteScopeOr(db, 'heartbeat_card', (rollback) => {
|
|
305
286
|
const card = loadCardRow(db, tenantId, id);
|
|
306
287
|
if (!card) {
|
|
307
288
|
throw new Error(`unknown card id: ${id}`);
|
|
308
289
|
}
|
|
309
290
|
if (card.status !== 'running' || !isLiveRun(db, tenantId, id, runId)) {
|
|
310
|
-
|
|
311
|
-
return null;
|
|
291
|
+
return rollback(false);
|
|
312
292
|
}
|
|
313
293
|
const now = new Date().toISOString();
|
|
314
294
|
db.prepare(`UPDATE cards SET lease_until = ?, heartbeat_at = ? WHERE id = ? AND tenant_id = ?`)
|
|
315
295
|
.run(leaseUntilFrom(now), now, id, tenantId);
|
|
316
|
-
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
try {
|
|
320
|
-
db.exec('ROLLBACK');
|
|
321
|
-
}
|
|
322
|
-
catch { /* commit may have already rolled back */ }
|
|
323
|
-
throw error;
|
|
324
|
-
}
|
|
325
|
-
return loadCardRow(db, tenantId, id);
|
|
296
|
+
return true;
|
|
297
|
+
});
|
|
298
|
+
return beat ? loadCardRow(db, tenantId, id) : null;
|
|
326
299
|
}
|
|
327
300
|
finally {
|
|
328
301
|
closeHippoDb(db);
|
|
@@ -338,31 +311,22 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
|
338
311
|
assertRunId(runId);
|
|
339
312
|
const db = openStore(hippoRoot);
|
|
340
313
|
try {
|
|
341
|
-
db
|
|
342
|
-
try {
|
|
314
|
+
const blocked = withWriteScopeOr(db, 'block_card', (rollback) => {
|
|
343
315
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
344
|
-
const changes = allowed ? transitionCard(db, tenantId, id, ['running'], 'blocked', { setSql: 'assignee_runtime = NULL' }) : 0;
|
|
316
|
+
const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'blocked', extra: { setSql: 'assignee_runtime = NULL' } }) : 0;
|
|
345
317
|
if (changes === 0) {
|
|
346
318
|
if (!loadCardRow(db, tenantId, id)) {
|
|
347
319
|
throw new Error(`unknown card id: ${id}`);
|
|
348
320
|
}
|
|
349
|
-
|
|
350
|
-
return null;
|
|
321
|
+
return rollback(false);
|
|
351
322
|
}
|
|
352
323
|
const now = new Date().toISOString();
|
|
353
324
|
// Close the interrupted run here so completeCard's ended IS NULL scope only ever matches the live run.
|
|
354
325
|
closeLiveRun(db, tenantId, id, 'blocked', now);
|
|
355
326
|
insertCardComment(db, tenantId, id, 'system', reason);
|
|
356
|
-
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
try {
|
|
360
|
-
db.exec('ROLLBACK');
|
|
361
|
-
}
|
|
362
|
-
catch { /* commit may have already rolled back */ }
|
|
363
|
-
throw error;
|
|
364
|
-
}
|
|
365
|
-
return loadCardRow(db, tenantId, id);
|
|
327
|
+
return true;
|
|
328
|
+
});
|
|
329
|
+
return blocked ? loadCardRow(db, tenantId, id) : null;
|
|
366
330
|
}
|
|
367
331
|
finally {
|
|
368
332
|
closeHippoDb(db);
|
|
@@ -375,27 +339,18 @@ export function reviewCard(hippoRoot, tenantId, id, runId) {
|
|
|
375
339
|
assertRunId(runId);
|
|
376
340
|
const db = openStore(hippoRoot);
|
|
377
341
|
try {
|
|
378
|
-
db
|
|
379
|
-
try {
|
|
342
|
+
const moved = withWriteScopeOr(db, 'review_card', (rollback) => {
|
|
380
343
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
381
|
-
const changes = allowed ? transitionCard(db, tenantId, id, ['running'], 'review') : 0;
|
|
344
|
+
const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'review' }) : 0;
|
|
382
345
|
if (changes === 0) {
|
|
383
346
|
if (!loadCardRow(db, tenantId, id)) {
|
|
384
347
|
throw new Error(`unknown card id: ${id}`);
|
|
385
348
|
}
|
|
386
|
-
|
|
387
|
-
return null;
|
|
388
|
-
}
|
|
389
|
-
db.exec('COMMIT');
|
|
390
|
-
}
|
|
391
|
-
catch (error) {
|
|
392
|
-
try {
|
|
393
|
-
db.exec('ROLLBACK');
|
|
349
|
+
return rollback(false);
|
|
394
350
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
return loadCardRow(db, tenantId, id);
|
|
351
|
+
return true;
|
|
352
|
+
});
|
|
353
|
+
return moved ? loadCardRow(db, tenantId, id) : null;
|
|
399
354
|
}
|
|
400
355
|
finally {
|
|
401
356
|
closeHippoDb(db);
|
|
@@ -411,64 +366,56 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
|
411
366
|
assertRunId(runId);
|
|
412
367
|
const db = openStore(hippoRoot);
|
|
413
368
|
try {
|
|
414
|
-
db
|
|
415
|
-
let promotedChildren = [];
|
|
416
|
-
try {
|
|
369
|
+
const promoted = withWriteScopeOr(db, 'complete_card', (rollback) => {
|
|
417
370
|
const target = outcome === 'success' ? 'done' : 'shelved';
|
|
418
371
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
419
|
-
const changes = allowed ? transitionCard(db, tenantId, id, ['review'], target) : 0;
|
|
372
|
+
const changes = allowed ? transitionCard(db, tenantId, id, { from: ['review'], to: target }) : 0;
|
|
420
373
|
if (changes === 0) {
|
|
421
374
|
if (!loadCardRow(db, tenantId, id)) {
|
|
422
375
|
throw new Error(`unknown card id: ${id}`);
|
|
423
376
|
}
|
|
424
|
-
|
|
425
|
-
return null;
|
|
377
|
+
return rollback(null);
|
|
426
378
|
}
|
|
427
379
|
const now = new Date().toISOString();
|
|
428
380
|
closeLiveRun(db, tenantId, id, outcome, now);
|
|
429
381
|
// Not best-effort (rule 12): promotion runs in this same transaction, so a
|
|
430
382
|
// card can never be `done` with an un-evaluated child.
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
for (const childId of children) {
|
|
435
|
-
// SAFETY: row's shape matches the single `status` column named in the SELECT below.
|
|
436
|
-
const child = db.prepare(`SELECT status FROM cards WHERE tenant_id = ? AND id = ?`).get(tenantId, childId);
|
|
437
|
-
if (!child || child.status !== 'backlog')
|
|
438
|
-
continue;
|
|
439
|
-
// SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
|
|
440
|
-
const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, childId).map((r) => r.parent);
|
|
441
|
-
const placeholders = parents.map(() => '?').join(', ');
|
|
442
|
-
// SAFETY: row's shape matches the single `c` column named in the SELECT below.
|
|
443
|
-
const doneCount = db.prepare(`SELECT COUNT(*) as c FROM cards WHERE tenant_id = ? AND id IN (${placeholders}) AND status = 'done'`).get(tenantId, ...parents).c;
|
|
444
|
-
if (doneCount === parents.length) {
|
|
445
|
-
transitionCard(db, tenantId, childId, ['backlog'], 'ready');
|
|
446
|
-
promotedChildren.push(childId);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
db.exec('COMMIT');
|
|
451
|
-
}
|
|
452
|
-
catch (error) {
|
|
453
|
-
try {
|
|
454
|
-
db.exec('ROLLBACK');
|
|
455
|
-
}
|
|
456
|
-
catch { /* commit may have already rolled back */ }
|
|
457
|
-
throw error;
|
|
458
|
-
}
|
|
459
|
-
return { card: loadCardRow(db, tenantId, id), promotedChildren };
|
|
383
|
+
return target === 'done' ? promoteUnblockedChildren(db, tenantId, id) : [];
|
|
384
|
+
});
|
|
385
|
+
return promoted === null ? null : { card: loadCardRow(db, tenantId, id), promotedChildren: promoted };
|
|
460
386
|
}
|
|
461
387
|
finally {
|
|
462
388
|
closeHippoDb(db);
|
|
463
389
|
}
|
|
464
390
|
}
|
|
391
|
+
/** Moves to ready each backlog child of `parentId` whose parents are all done, and returns their ids. Call inside the write scope. */
|
|
392
|
+
function promoteUnblockedChildren(db, tenantId, parentId) {
|
|
393
|
+
const promotedChildren = [];
|
|
394
|
+
// SAFETY: rows' shape matches the single `child` column named in the SELECT below.
|
|
395
|
+
const children = db.prepare(`SELECT child FROM card_deps WHERE tenant_id = ? AND parent = ?`).all(tenantId, parentId).map((r) => r.child);
|
|
396
|
+
for (const childId of children) {
|
|
397
|
+
// SAFETY: row's shape matches the single `status` column named in the SELECT below.
|
|
398
|
+
const child = db.prepare(`SELECT status FROM cards WHERE tenant_id = ? AND id = ?`).get(tenantId, childId);
|
|
399
|
+
if (!child || child.status !== 'backlog')
|
|
400
|
+
continue;
|
|
401
|
+
// SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
|
|
402
|
+
const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, childId).map((r) => r.parent);
|
|
403
|
+
const placeholders = parents.map(() => '?').join(', ');
|
|
404
|
+
// SAFETY: row's shape matches the single `c` column named in the SELECT below.
|
|
405
|
+
const doneCount = db.prepare(`SELECT COUNT(*) as c FROM cards WHERE tenant_id = ? AND id IN (${placeholders}) AND status = 'done'`).get(tenantId, ...parents).c;
|
|
406
|
+
if (doneCount === parents.length) {
|
|
407
|
+
transitionCard(db, tenantId, childId, { from: ['backlog'], to: 'ready' });
|
|
408
|
+
promotedChildren.push(childId);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return promotedChildren;
|
|
412
|
+
}
|
|
465
413
|
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
|
|
466
414
|
export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
467
415
|
assertTenantId('reclaimExpiredCards', tenantId);
|
|
468
416
|
const db = openStore(hippoRoot);
|
|
469
417
|
try {
|
|
470
|
-
db
|
|
471
|
-
try {
|
|
418
|
+
return withWriteScope(db, 'reclaim_expired_cards', () => {
|
|
472
419
|
// Read lease times under the write lock, so a heartbeat that committed while we waited wins.
|
|
473
420
|
const now = new Date().toISOString();
|
|
474
421
|
// SAFETY: rows' shape matches the single `id` column named in the SELECT below.
|
|
@@ -478,19 +425,11 @@ export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
|
478
425
|
ORDER BY id
|
|
479
426
|
`).all(tenantId, now).map((r) => r.id);
|
|
480
427
|
for (const id of ids) {
|
|
481
|
-
transitionCard(db, tenantId, id, ['running'], 'ready', { setSql: 'assignee_runtime = NULL' });
|
|
428
|
+
transitionCard(db, tenantId, id, { from: ['running'], to: 'ready', extra: { setSql: 'assignee_runtime = NULL' } });
|
|
482
429
|
closeLiveRun(db, tenantId, id, 'reclaimed', now);
|
|
483
430
|
}
|
|
484
|
-
db.exec('COMMIT');
|
|
485
431
|
return ids;
|
|
486
|
-
}
|
|
487
|
-
catch (error) {
|
|
488
|
-
try {
|
|
489
|
-
db.exec('ROLLBACK');
|
|
490
|
-
}
|
|
491
|
-
catch { /* commit may have already rolled back */ }
|
|
492
|
-
throw error;
|
|
493
|
-
}
|
|
432
|
+
});
|
|
494
433
|
}
|
|
495
434
|
finally {
|
|
496
435
|
closeHippoDb(db);
|
|
@@ -510,4 +449,4 @@ export function addCardComment(hippoRoot, tenantId, cardId, author, body) {
|
|
|
510
449
|
closeHippoDb(db);
|
|
511
450
|
}
|
|
512
451
|
}
|
|
513
|
-
//# sourceMappingURL=
|
|
452
|
+
//# sourceMappingURL=cards.js.map
|