hippo-memory 2.0.0 → 2.1.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/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
package/dist/store/auth.js
CHANGED
|
@@ -10,6 +10,16 @@ export const API_KEY_PREFIX = 'hk_';
|
|
|
10
10
|
const ID_LEN = 24; // base32 chars after prefix
|
|
11
11
|
const SECRET_LEN = 32; // base32 chars after dot
|
|
12
12
|
const SCRYPT_KEYLEN = 32;
|
|
13
|
+
// Node's defaults, written out so a hash states the cost it was made with.
|
|
14
|
+
const SCRYPT_N = 16384;
|
|
15
|
+
const SCRYPT_R = 8;
|
|
16
|
+
const SCRYPT_P = 1;
|
|
17
|
+
const SCRYPT_MAXMEM = 64 * 1024 * 1024;
|
|
18
|
+
// A stored row must not be able to make verify hang or exhaust memory.
|
|
19
|
+
const SCRYPT_MAX_N = 2 ** 20;
|
|
20
|
+
const SCRYPT_MAX_R = 32;
|
|
21
|
+
const SCRYPT_MAX_P = 16;
|
|
22
|
+
const DEFAULT_SCRYPT = { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P, maxmem: SCRYPT_MAXMEM };
|
|
13
23
|
const BASE32 = 'abcdefghijklmnopqrstuvwxyz234567';
|
|
14
24
|
const MINTED_KEY_PATTERN = new RegExp(`^${API_KEY_PREFIX}[a-z2-7]{${ID_LEN}}\\.[a-z2-7]{${SECRET_LEN}}$`);
|
|
15
25
|
function randBase32(n) {
|
|
@@ -20,24 +30,41 @@ function randBase32(n) {
|
|
|
20
30
|
return out;
|
|
21
31
|
}
|
|
22
32
|
function hashKey(plaintext) {
|
|
23
|
-
// Format:
|
|
33
|
+
// Format: scrypt2$<N>$<r>$<p>$<saltHex>$<hashHex>
|
|
24
34
|
const salt = randomBytes(16);
|
|
25
|
-
const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN);
|
|
26
|
-
return `
|
|
35
|
+
const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN, DEFAULT_SCRYPT);
|
|
36
|
+
return `scrypt2$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}$${salt.toString('hex')}$${hash.toString('hex')}`;
|
|
27
37
|
}
|
|
28
38
|
const verifyStats = { storeLookups: 0, scryptRuns: 0 };
|
|
29
39
|
export function apiKeyVerifyStats() {
|
|
30
40
|
return { ...verifyStats };
|
|
31
41
|
}
|
|
32
|
-
|
|
42
|
+
function validCost(n, r, p) {
|
|
43
|
+
const powerOfTwo = Number.isInteger(n) && n >= 2 && (n & (n - 1)) === 0;
|
|
44
|
+
return powerOfTwo && n <= SCRYPT_MAX_N && Number.isInteger(r) && r >= 1 && r <= SCRYPT_MAX_R
|
|
45
|
+
&& Number.isInteger(p) && p >= 1 && p <= SCRYPT_MAX_P && 128 * n * r <= SCRYPT_MAXMEM;
|
|
46
|
+
}
|
|
47
|
+
/** Null when `stored` has another shape or asks for more work than a verify may do. */
|
|
33
48
|
function storedScrypt(stored) {
|
|
34
49
|
const parts = stored.split('$');
|
|
35
|
-
|
|
50
|
+
let params = DEFAULT_SCRYPT;
|
|
51
|
+
if (parts.length !== 3 && parts.length !== 6)
|
|
52
|
+
return null;
|
|
53
|
+
const hashHex = parts[parts.length - 1];
|
|
54
|
+
const saltHex = parts[parts.length - 2];
|
|
55
|
+
if (parts.length === 3 && parts[0] !== 'scrypt')
|
|
36
56
|
return null;
|
|
37
|
-
|
|
57
|
+
if (parts.length === 6) {
|
|
58
|
+
const [n, r, p] = [Number(parts[1]), Number(parts[2]), Number(parts[3])];
|
|
59
|
+
if (parts[0] !== 'scrypt2' || !validCost(n, r, p))
|
|
60
|
+
return null;
|
|
61
|
+
params = { N: n, r, p, maxmem: SCRYPT_MAXMEM };
|
|
62
|
+
}
|
|
63
|
+
const expected = Buffer.from(hashHex, 'hex');
|
|
38
64
|
return {
|
|
39
|
-
salt: Buffer.from(
|
|
65
|
+
salt: Buffer.from(saltHex, 'hex'),
|
|
40
66
|
keylen: expected.length,
|
|
67
|
+
params,
|
|
41
68
|
matches: (derived) => expected.length === derived.length && timingSafeEqual(expected, derived),
|
|
42
69
|
};
|
|
43
70
|
}
|
|
@@ -46,7 +73,7 @@ function verifyKey(plaintext, stored) {
|
|
|
46
73
|
if (!parsed)
|
|
47
74
|
return false;
|
|
48
75
|
verifyStats.scryptRuns++;
|
|
49
|
-
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen));
|
|
76
|
+
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen, parsed.params));
|
|
50
77
|
}
|
|
51
78
|
const scryptOffLoop = promisify(scrypt);
|
|
52
79
|
/** Days a key lives when its mint names no expiry, so a key nobody remembers stops working by itself. */
|
|
@@ -61,28 +88,40 @@ export function insertApiKey(db, key) {
|
|
|
61
88
|
// so the store shuts it out before the first one exists.
|
|
62
89
|
if (key.expiresAt !== null)
|
|
63
90
|
raiseMinBinary(db, EXPIRING_KEYS_MIN_BINARY);
|
|
64
|
-
db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES
|
|
91
|
+
db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES ` +
|
|
92
|
+
`(?, ?, ?, ?, ?, ?, ?, ?)`).run(key.keyId, key.keyHash, key.tenantId, key.label, key.createdAt, key.role, key.ownerSubject, key.expiresAt);
|
|
65
93
|
}
|
|
66
94
|
export function createApiKey(db, opts) {
|
|
67
95
|
const { keyId, plaintext, keyHash } = mintApiKey();
|
|
68
96
|
insertApiKey(db, {
|
|
69
|
-
keyId,
|
|
70
|
-
|
|
97
|
+
keyId,
|
|
98
|
+
keyHash,
|
|
99
|
+
tenantId: opts.tenantId,
|
|
100
|
+
label: opts.label ?? null,
|
|
101
|
+
role: opts.role ?? 'member',
|
|
102
|
+
createdAt: new Date().toISOString(),
|
|
103
|
+
ownerSubject: opts.ownerSubject ?? null,
|
|
104
|
+
expiresAt: opts.expiresAt ?? new Date(Date.now() + DEFAULT_KEY_TTL_DAYS * DAY_MS).toISOString(),
|
|
71
105
|
});
|
|
72
106
|
return { keyId, plaintext };
|
|
73
107
|
}
|
|
74
108
|
/** The api_keys row for `keyId` with its scope grants; null when no row matches. */
|
|
75
109
|
export function readApiKeyRecord(db, keyId) {
|
|
76
|
-
// SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at,
|
|
77
|
-
// `.get` returns undefined when no row matches key_id.
|
|
110
|
+
// SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at,
|
|
111
|
+
// owner_subject; `.get` returns undefined when no row matches key_id.
|
|
78
112
|
const row = db
|
|
79
113
|
.prepare(`SELECT key_hash, tenant_id, revoked_at, role, expires_at, owner_subject FROM api_keys WHERE key_id = ?`)
|
|
80
114
|
.get(keyId);
|
|
81
115
|
if (!row)
|
|
82
116
|
return null;
|
|
83
117
|
return {
|
|
84
|
-
keyHash: row.key_hash,
|
|
85
|
-
|
|
118
|
+
keyHash: row.key_hash,
|
|
119
|
+
tenantId: row.tenant_id,
|
|
120
|
+
revokedAt: row.revoked_at,
|
|
121
|
+
role: row.role,
|
|
122
|
+
scopes: listScopeGrants(db, keyId),
|
|
123
|
+
expiresAt: row.expires_at,
|
|
124
|
+
ownerSubject: row.owner_subject,
|
|
86
125
|
};
|
|
87
126
|
}
|
|
88
127
|
/** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
|
|
@@ -101,7 +140,8 @@ function mintedKeyId(plaintext) {
|
|
|
101
140
|
}
|
|
102
141
|
/** True for a record that is present, unrevoked and unexpired, before any secret check. */
|
|
103
142
|
function isUsable(record, now) {
|
|
104
|
-
// Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn
|
|
143
|
+
// Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn
|
|
144
|
+
// CPU.
|
|
105
145
|
if (!record)
|
|
106
146
|
return false;
|
|
107
147
|
return !record.revokedAt && now < keyExpiryMs(record.expiresAt);
|
|
@@ -136,7 +176,8 @@ function secretDigest(plaintext) {
|
|
|
136
176
|
* a SHA-256 of the token, never the token, and nothing about the key's state. */
|
|
137
177
|
export class VerifiedKeyCache {
|
|
138
178
|
capacity;
|
|
139
|
-
// Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the
|
|
179
|
+
// Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the
|
|
180
|
+
// least recent.
|
|
140
181
|
proven = new Map();
|
|
141
182
|
constructor(capacity) {
|
|
142
183
|
this.capacity = capacity;
|
|
@@ -166,7 +207,8 @@ export class VerifiedKeyCache {
|
|
|
166
207
|
const verifiedKeys = new VerifiedKeyCache(VERIFIED_KEY_CACHE_CAP);
|
|
167
208
|
// By stored hash and token, so a burst of requests with one unproved key derives once and is charged once.
|
|
168
209
|
const checksInFlight = new Map();
|
|
169
|
-
/** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the
|
|
210
|
+
/** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the
|
|
211
|
+
* thread pool. */
|
|
170
212
|
async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
171
213
|
if (verifiedKeys.has(keyHash, plaintext))
|
|
172
214
|
return true;
|
|
@@ -179,7 +221,7 @@ async function secretMatches(keyId, plaintext, keyHash, bound) {
|
|
|
179
221
|
return running;
|
|
180
222
|
const derive = () => {
|
|
181
223
|
verifyStats.scryptRuns++;
|
|
182
|
-
return scryptOffLoop(plaintext, parsed.salt, parsed.keylen);
|
|
224
|
+
return scryptOffLoop(plaintext, parsed.salt, parsed.keylen, parsed.params);
|
|
183
225
|
};
|
|
184
226
|
const check = (bound ? bound(keyId, derive) : derive()).then((derived) => {
|
|
185
227
|
const matched = parsed.matches(derived);
|
|
@@ -283,7 +325,8 @@ export function listApiKeys(hippoRoot, opts) {
|
|
|
283
325
|
export function listLiveOwnedKeyIds(db, tenantId, ownerSubject, now) {
|
|
284
326
|
// SAFETY: the SELECT names exactly these two columns.
|
|
285
327
|
const rows = db
|
|
286
|
-
.prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL
|
|
328
|
+
.prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL ` +
|
|
329
|
+
`ORDER BY id`)
|
|
287
330
|
.all(tenantId, ownerSubject);
|
|
288
331
|
// Expiry is filtered here, not in SQL, so it follows the same Date.parse rule the key check uses.
|
|
289
332
|
return rows.filter((r) => now < keyExpiryMs(r.expires_at)).map((r) => r.key_id);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
|
|
2
|
+
/** A store behind the port throws this when its lock wait runs
|
|
3
|
+
* out, so the server answers 503 as it does for a busy hippo.db. */
|
|
4
|
+
export declare class StoreBusyError extends Error {
|
|
5
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
8
|
+
export declare function isStoreBusy<E>(error: E): boolean;
|
|
9
|
+
//# sourceMappingURL=busy.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// The busy half of the store port, apart from port.ts so that file stays under the size gate.
|
|
2
|
+
import { isSqliteBusy } from '../db/busy.js';
|
|
3
|
+
export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
|
|
4
|
+
/** A store behind the port throws this when its lock wait runs
|
|
5
|
+
* out, so the server answers 503 as it does for a busy hippo.db. */
|
|
6
|
+
export class StoreBusyError extends Error {
|
|
7
|
+
constructor(message = STORE_BUSY_MESSAGE, options) {
|
|
8
|
+
super(message, options);
|
|
9
|
+
this.name = 'StoreBusyError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
13
|
+
export function isStoreBusy(error) {
|
|
14
|
+
return error instanceof StoreBusyError || isSqliteBusy(error);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=busy.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
3
|
import { type SqlFragment } from './rule-sql.js';
|
|
3
4
|
export interface AmbientRecallRequest {
|
|
4
5
|
terms: string[];
|
|
@@ -32,10 +33,12 @@ export declare function loadContextCandidates(hippoRoot: string, tenantId: strin
|
|
|
32
33
|
export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
|
|
33
34
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
34
35
|
export declare const EVERY_SCOPE: SqlFragment;
|
|
35
|
-
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
36
|
-
* With `project`, only rows carrying one of those names plus user-global rows, as
|
|
36
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
37
|
+
* spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
|
|
38
|
+
* loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
37
39
|
export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
|
|
38
|
-
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
40
|
+
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
41
|
+
* it. */
|
|
39
42
|
export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
|
|
40
43
|
/** computeSchemaFit against a tenant's newest SCHEMA_FIT_WINDOW_ROWS rows: tag counts come from one aggregate
|
|
41
44
|
* and texts stream one column, so no row is loaded. */
|
|
@@ -47,7 +50,8 @@ export interface SourceTally {
|
|
|
47
50
|
/** `created`, a unit separator, then `id` of the source's first row in loadAllEntries' order. */
|
|
48
51
|
first: string;
|
|
49
52
|
}
|
|
50
|
-
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
53
|
+
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
54
|
+
* absent. */
|
|
51
55
|
export declare function tallySources(hippoRoot: string, tenantId?: string): SourceTally[];
|
|
52
56
|
export declare const jsonList: (column: string) => string;
|
|
53
57
|
/** Whole-tenant health numbers: every row counts, superseded and archived ones too. */
|
|
@@ -62,6 +66,8 @@ export interface StrengthTallies {
|
|
|
62
66
|
}
|
|
63
67
|
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
64
68
|
export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
69
|
+
/** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
70
|
+
export declare function strengthTalliesAt(db: DatabaseSyncLike, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
|
|
65
71
|
/** What `hippo status` prints about the whole store: every tenant and superseded rows too. */
|
|
66
72
|
export interface StatusCounts {
|
|
67
73
|
total: number;
|
|
@@ -77,6 +83,7 @@ export interface StatusCounts {
|
|
|
77
83
|
/** Rows that have a stored vector. */
|
|
78
84
|
embedded: number;
|
|
79
85
|
}
|
|
80
|
-
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
86
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
87
|
+
* built. */
|
|
81
88
|
export declare function loadStatusCounts(hippoRoot: string, now: Date, atRiskBelow: number): StatusCounts;
|
|
82
89
|
//# sourceMappingURL=candidates.d.ts.map
|
package/dist/store/candidates.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
|
|
1
|
+
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom, } from '../core/memory.js';
|
|
2
2
|
import { strengthSql } from './rule-sql.js';
|
|
3
3
|
import { withReadSnapshot } from '../db/index.js';
|
|
4
4
|
import { rewardFactorSql, scopeAdmitSql } from './rule-sql.js';
|
|
@@ -24,9 +24,14 @@ function loadRecentRows(run, drifted, tenantId, options) {
|
|
|
24
24
|
const { needed, admit, origins } = options;
|
|
25
25
|
const keep = origins ? (e) => admit(e) && inOrigins(e, origins) : admit;
|
|
26
26
|
const window = Math.max(needed * 4, 32);
|
|
27
|
-
const originSql = origins &&
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const originSql = origins &&
|
|
28
|
+
(origins.userGlobal ? `(origin_project = '' OR ${originInSql(origins.names)})` : originInSql(origins.names));
|
|
29
|
+
const own = {
|
|
30
|
+
where: originSql ? `${AMBIENT_SCOPED} AND ${originSql}` : AMBIENT_SCOPED,
|
|
31
|
+
params: [tenantId, ...(origins?.names ?? [])],
|
|
32
|
+
};
|
|
33
|
+
// Text order is chronological only for standard UTC ISO (memory.ts), so a drifted store is read whole and re-sorted
|
|
34
|
+
// downstream.
|
|
30
35
|
if (drifted)
|
|
31
36
|
return run(`${own.where} ${NEWEST}`, [...own.params]).filter(keep);
|
|
32
37
|
let read = run(`${AMBIENT_SCOPED} ${NEWEST} LIMIT ?`, [tenantId, window]);
|
|
@@ -41,12 +46,19 @@ function loadRecentRows(run, drifted, tenantId, options) {
|
|
|
41
46
|
}
|
|
42
47
|
return [...kept, ...keptPastWindow(run, own, read, needed - kept.length, keep)];
|
|
43
48
|
}
|
|
44
|
-
// A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are
|
|
49
|
+
// A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are
|
|
50
|
+
// kept.
|
|
45
51
|
function keptPastWindow(run, own, read, wanted, keep) {
|
|
46
52
|
const out = [];
|
|
47
53
|
let last = read[read.length - 1];
|
|
48
54
|
for (let size = read.length * 4; out.length < wanted; size *= 4) {
|
|
49
|
-
const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [
|
|
55
|
+
const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [
|
|
56
|
+
...own.params,
|
|
57
|
+
last.created,
|
|
58
|
+
last.created,
|
|
59
|
+
last.id,
|
|
60
|
+
size,
|
|
61
|
+
]);
|
|
50
62
|
out.push(...page.filter(keep));
|
|
51
63
|
if (page.length < size)
|
|
52
64
|
break;
|
|
@@ -83,13 +95,18 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
|
|
|
83
95
|
return { entries };
|
|
84
96
|
const ftsQuery = pickRarestFtsQuery(db, recall.terms);
|
|
85
97
|
const recallEntries = ftsQuery
|
|
86
|
-
? loadRecallSearchEntriesFromDb(db, ftsQuery, {
|
|
98
|
+
? loadRecallSearchEntriesFromDb(db, ftsQuery, {
|
|
99
|
+
limit: recall.limit,
|
|
100
|
+
tenantId,
|
|
101
|
+
includeSuperseded: false,
|
|
102
|
+
ownScope: recall.ownScope,
|
|
103
|
+
})
|
|
87
104
|
: [];
|
|
88
105
|
return { entries, recall: recallEntries };
|
|
89
106
|
}, openStore);
|
|
90
107
|
}
|
|
91
|
-
// calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one
|
|
92
|
-
// A function, not a constant, so the outcome-slow ablation is read per query as strengthSql reads it.
|
|
108
|
+
// calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one
|
|
109
|
+
// in JS. A function, not a constant, so the outcome-slow ablation is read per query as strengthSql reads it.
|
|
93
110
|
const decayRankSql = () => `pinned DESC,
|
|
94
111
|
CASE WHEN half_life_days > 0 THEN (julianday(?) - julianday(last_retrieved))
|
|
95
112
|
/ (half_life_days * ${rewardFactorSql()}) END ASC NULLS LAST,
|
|
@@ -117,14 +134,16 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
117
134
|
// SAFETY: the count row has the one column named.
|
|
118
135
|
const matched = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE ${whereSql}`).get(...params).n;
|
|
119
136
|
// Under the cap every match is returned, so the per-row decay math and the sort are skipped.
|
|
120
|
-
// SHORTCUT: past the cap the rank still scans the tenant; a stored decay rank column needs a schema migration,
|
|
137
|
+
// SHORTCUT: past the cap the rank still scans the tenant; a stored decay rank column needs a schema migration,
|
|
138
|
+
// held until one is approved.
|
|
121
139
|
const ranked = matched > cap;
|
|
122
140
|
const sql = ranked
|
|
123
141
|
? `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (
|
|
124
142
|
SELECT id FROM memories WHERE ${whereSql} ORDER BY ${decayRankSql()} LIMIT ?
|
|
125
143
|
) ORDER BY created ASC, id ASC`
|
|
126
144
|
: `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${whereSql} ORDER BY created ASC, id ASC`;
|
|
127
|
-
// SAFETY: both SELECTs name exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries
|
|
145
|
+
// SAFETY: both SELECTs name exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries
|
|
146
|
+
// ids only.
|
|
128
147
|
const rows = db.prepare(sql).all(...params, ...(ranked ? [filter.now.toISOString(), cap] : []));
|
|
129
148
|
return rows.map(rowToEntry);
|
|
130
149
|
}, openStore);
|
|
@@ -133,8 +152,9 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
|
|
|
133
152
|
const TEAM_VISIBLE = scopeAdmitSql('');
|
|
134
153
|
/** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
|
|
135
154
|
export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
|
|
136
|
-
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
137
|
-
* With `project`, only rows carrying one of those names plus user-global rows, as
|
|
155
|
+
/** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
|
|
156
|
+
* spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
|
|
157
|
+
* loadContextCandidates' filter. No `tenantId` reads every tenant. */
|
|
138
158
|
export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
|
|
139
159
|
const unique = [...new Set(words)];
|
|
140
160
|
const out = [];
|
|
@@ -146,15 +166,21 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
146
166
|
for (let i = 0; i < unique.length; i += 200) {
|
|
147
167
|
const chunk = unique.slice(i, i + 200);
|
|
148
168
|
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
149
|
-
const rows = db
|
|
150
|
-
|
|
151
|
-
|
|
169
|
+
const rows = db
|
|
170
|
+
.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ` +
|
|
171
|
+
`${admit.sql} AND (${chunk
|
|
172
|
+
.map(() => 'instr(content, ?) ' + '> 0')
|
|
173
|
+
.join(' OR ')})`)
|
|
174
|
+
.all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
|
|
175
|
+
for (const row of rows) {
|
|
152
176
|
out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
|
|
177
|
+
}
|
|
153
178
|
}
|
|
154
179
|
return out;
|
|
155
180
|
}, openStore);
|
|
156
181
|
}
|
|
157
|
-
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
182
|
+
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
|
|
183
|
+
* it. */
|
|
158
184
|
export function loadNewestEntries(hippoRoot, tenantId, limit) {
|
|
159
185
|
return onHandle(hippoRoot, (db) => {
|
|
160
186
|
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
@@ -176,7 +202,9 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
176
202
|
// One read transaction, so the row count and the texts come from the same snapshot.
|
|
177
203
|
return withReadSnapshot(db, () => {
|
|
178
204
|
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
179
|
-
const groups = db
|
|
205
|
+
const groups = db
|
|
206
|
+
.prepare(`SELECT tags_json, COUNT(*) AS n FROM (${newest}) GROUP BY tags_json`)
|
|
207
|
+
.all(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
180
208
|
let rows = 0;
|
|
181
209
|
const tagCounts = new Map();
|
|
182
210
|
for (const group of groups) {
|
|
@@ -187,51 +215,61 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
187
215
|
// SHORTCUT: only the newest SCHEMA_FIT_WINDOW_ROWS rows count, so older tags drop out;
|
|
188
216
|
// a stored per-tenant tag and token tally is the upgrade.
|
|
189
217
|
// SAFETY: the SELECT names exactly the one column read.
|
|
190
|
-
const texts = db
|
|
218
|
+
const texts = db
|
|
219
|
+
.prepare(`SELECT content FROM (${newest})`)
|
|
191
220
|
.iterate(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
192
221
|
return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
|
|
193
222
|
});
|
|
194
223
|
}, openStore);
|
|
195
224
|
}
|
|
196
|
-
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
225
|
+
/** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
|
|
226
|
+
* absent. */
|
|
197
227
|
export function tallySources(hippoRoot, tenantId) {
|
|
198
228
|
return onHandle(hippoRoot, (db) => {
|
|
199
229
|
const where = tenantId !== undefined ? 'WHERE tenant_id = ?' : '';
|
|
200
230
|
// SAFETY: rows' shape matches the four aliased columns in the SELECT below.
|
|
201
|
-
return db
|
|
202
|
-
|
|
231
|
+
return db
|
|
232
|
+
.prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || ` +
|
|
233
|
+
`char(31) || id) AS first
|
|
234
|
+
FROM memories ${where} GROUP BY COALESCE(source, 'cli')`)
|
|
235
|
+
.all(...(tenantId !== undefined ? [tenantId] : []));
|
|
203
236
|
}, openStore);
|
|
204
237
|
}
|
|
205
238
|
// A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
|
|
206
239
|
export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
|
|
207
240
|
/** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
|
|
208
241
|
export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
|
|
242
|
+
return onHandle(hippoRoot, (db) => strengthTalliesAt(db, tenantId, now, atRiskBelow), openStore);
|
|
243
|
+
}
|
|
244
|
+
/** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
245
|
+
export function strengthTalliesAt(db, tenantId, now, atRiskBelow) {
|
|
209
246
|
// An unparseable date scores NULL in SQL and 0 in calculateStrength.
|
|
210
247
|
const strength = `COALESCE(${strengthSql(now)}, 0)`;
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
248
|
+
// SAFETY: one aggregate row whose columns are the aliases named below.
|
|
249
|
+
const row = db
|
|
250
|
+
.prepare(`SELECT
|
|
214
251
|
COUNT(*) AS total,
|
|
215
252
|
COALESCE(SUM(pinned != 0), 0) AS pinned,
|
|
216
253
|
COALESCE(SUM(EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE value = 'error')), 0) AS errors,
|
|
217
254
|
COALESCE(SUM(${strength}), 0) AS strengthSum,
|
|
218
255
|
COALESCE(SUM(COALESCE(pinned, 0) = 0 AND ${strength} < ?), 0) AS atRisk
|
|
219
|
-
FROM memories WHERE tenant_id = ?`)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
256
|
+
FROM memories WHERE tenant_id = ?`)
|
|
257
|
+
.get(atRiskBelow, tenantId);
|
|
258
|
+
return {
|
|
259
|
+
total: Number(row.total),
|
|
260
|
+
pinned: Number(row.pinned),
|
|
261
|
+
errors: Number(row.errors),
|
|
262
|
+
strengthSum: Number(row.strengthSum),
|
|
263
|
+
atRisk: Number(row.atRisk),
|
|
264
|
+
};
|
|
228
265
|
}
|
|
229
266
|
// What calculateStrength and facetsOf read, plus the layer: no text and no JSON column.
|
|
230
267
|
const STATUS_ROW_COLUMNS = [
|
|
231
268
|
'layer', 'confidence', 'pinned', 'created', 'last_retrieved', 'half_life_days', 'retrieval_count',
|
|
232
269
|
'emotional_valence', 'outcome_positive', 'outcome_negative',
|
|
233
270
|
];
|
|
234
|
-
// Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would
|
|
271
|
+
// Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would
|
|
272
|
+
// differ.
|
|
235
273
|
function tallyStatusRows(rows, now, atRiskBelow) {
|
|
236
274
|
const byLayer = { [Layer.Buffer]: 0, [Layer.Episodic]: 0, [Layer.Semantic]: 0, [Layer.Trace]: 0 };
|
|
237
275
|
const byConfidence = { verified: 0, observed: 0, inferred: 0, stale: 0 };
|
|
@@ -265,7 +303,8 @@ function tallyStatusRows(rows, now, atRiskBelow) {
|
|
|
265
303
|
const { total, pinned, atRisk, agedOut } = sums;
|
|
266
304
|
return { total, byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength: total > 0 ? sums.strength / total : 0 };
|
|
267
305
|
}
|
|
268
|
-
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
306
|
+
/** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
|
|
307
|
+
* built. */
|
|
269
308
|
export function loadStatusCounts(hippoRoot, now, atRiskBelow) {
|
|
270
309
|
return onHandle(hippoRoot, (db) => {
|
|
271
310
|
// One read transaction, so the row tallies and the two counts describe the same store.
|
|
@@ -12,6 +12,7 @@ export interface CaptureWriteOpts {
|
|
|
12
12
|
/** Called with each captured entry after its write, so the caller can embed it; the store never picks a provider. */
|
|
13
13
|
readonly onCaptured?: (entry: MemoryEntry) => void;
|
|
14
14
|
}
|
|
15
|
-
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
15
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
16
|
+
* the batch is skipped. */
|
|
16
17
|
export declare function writeCapturedItems(hippoRoot: string, items: readonly CaptureItem[], keys: Set<string>, opts: CaptureWriteOpts): CapturedOutcome[];
|
|
17
18
|
//# sourceMappingURL=capture-write.d.ts.map
|
|
@@ -5,7 +5,8 @@ import { stampOriginProject } from './entry-row.js';
|
|
|
5
5
|
import { gatedWrite } from './gated-write.js';
|
|
6
6
|
import { updateStatsOn } from './index-and-stats.js';
|
|
7
7
|
import { openStore } from './open.js';
|
|
8
|
-
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
8
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
|
|
9
|
+
* the batch is skipped. */
|
|
9
10
|
export function writeCapturedItems(hippoRoot, items, keys, opts) {
|
|
10
11
|
const db = openStore(hippoRoot);
|
|
11
12
|
try {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { Card, CardComment, CardRun } from '../core/card.js';
|
|
2
2
|
import type { SessionHandoff } from '../core/handoff.js';
|
|
3
|
-
import {
|
|
3
|
+
import { loadCardDepsAt } from './cards.js';
|
|
4
4
|
/** A card plus everything `hippo card show` prints about it. */
|
|
5
5
|
export interface CardDetail {
|
|
6
6
|
card: Card;
|
|
7
|
-
deps: ReturnType<typeof
|
|
7
|
+
deps: ReturnType<typeof loadCardDepsAt>;
|
|
8
8
|
runs: CardRun[];
|
|
9
9
|
comments: CardComment[];
|
|
10
10
|
handoff: SessionHandoff | null;
|
|
11
11
|
}
|
|
12
|
-
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card)
|
|
13
|
-
*
|
|
12
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
|
|
13
|
+
* reads on one snapshot. */
|
|
14
14
|
export declare function loadCardDetail(hippoRoot: string, tenantId: string, id: string): CardDetail | null;
|
|
15
15
|
//# sourceMappingURL=card-detail.d.ts.map
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { withReadSnapshot } from '../db/index.js';
|
|
2
|
+
import { loadCardCommentsAt, loadCardDepsAt, loadCardRow, loadCardRunsAt, loadLatestHandoffForCardAt, } from './cards.js';
|
|
3
|
+
import { onHandle, openStore } from './open.js';
|
|
4
|
+
import { assertTenantId } from './tenant.js';
|
|
5
|
+
/** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
|
|
6
|
+
* reads on one snapshot. */
|
|
4
7
|
export function loadCardDetail(hippoRoot, tenantId, id) {
|
|
5
|
-
|
|
8
|
+
assertTenantId('loadCardDetail', tenantId);
|
|
9
|
+
return onHandle(hippoRoot, (db) => withReadSnapshot(db, () => cardDetailAt(db, tenantId, id)), openStore);
|
|
10
|
+
}
|
|
11
|
+
function cardDetailAt(db, tenantId, id) {
|
|
12
|
+
const card = loadCardRow(db, tenantId, id);
|
|
6
13
|
if (!card)
|
|
7
14
|
return null;
|
|
8
15
|
return {
|
|
9
16
|
card,
|
|
10
|
-
deps:
|
|
11
|
-
runs:
|
|
12
|
-
comments:
|
|
13
|
-
handoff:
|
|
17
|
+
deps: loadCardDepsAt(db, tenantId, id),
|
|
18
|
+
runs: loadCardRunsAt(db, tenantId, id),
|
|
19
|
+
comments: loadCardCommentsAt(db, tenantId, id),
|
|
20
|
+
handoff: loadLatestHandoffForCardAt(db, tenantId, id),
|
|
14
21
|
};
|
|
15
22
|
}
|
|
16
23
|
//# sourceMappingURL=card-detail.js.map
|
package/dist/store/cards.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
1
2
|
import { SessionHandoff, HandoffOutcome } from '../core/handoff.js';
|
|
2
3
|
import { Card, CardStatus, CardRun, CardComment } from '../core/card.js';
|
|
4
|
+
export declare function loadCardRow(db: DatabaseSyncLike, tenantId: string, id: string): Card | null;
|
|
3
5
|
export interface TransitionCardOptions {
|
|
4
6
|
readonly from: CardStatus[];
|
|
5
7
|
readonly to: CardStatus;
|
|
@@ -29,34 +31,46 @@ export declare function loadCardDeps(hippoRoot: string, tenantId: string, id: st
|
|
|
29
31
|
parents: string[];
|
|
30
32
|
children: string[];
|
|
31
33
|
};
|
|
34
|
+
export declare function loadCardDepsAt(db: DatabaseSyncLike, tenantId: string, id: string): {
|
|
35
|
+
parents: string[];
|
|
36
|
+
children: string[];
|
|
37
|
+
};
|
|
32
38
|
/** Returns this card's run history, most recent first. */
|
|
33
39
|
export declare function loadCardRuns(hippoRoot: string, tenantId: string, id: string): CardRun[];
|
|
40
|
+
export declare function loadCardRunsAt(db: DatabaseSyncLike, tenantId: string, id: string): CardRun[];
|
|
34
41
|
/** Returns this card's comments, most recent first. */
|
|
35
42
|
export declare function loadCardComments(hippoRoot: string, tenantId: string, id: string): CardComment[];
|
|
43
|
+
export declare function loadCardCommentsAt(db: DatabaseSyncLike, tenantId: string, id: string): CardComment[];
|
|
36
44
|
/** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
|
|
37
45
|
export declare function loadLatestHandoffForCard(hippoRoot: string, tenantId: string, cardId: string): SessionHandoff | null;
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
export declare function loadLatestHandoffForCardAt(db: DatabaseSyncLike, tenantId: string, cardId: string): SessionHandoff | null;
|
|
47
|
+
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown
|
|
48
|
+
* card id; returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new
|
|
49
|
+
* run's id as runId. */
|
|
40
50
|
export declare function claimCard(hippoRoot: string, tenantId: string, id: string, runtime: string, sessionId?: string): (Card & {
|
|
41
51
|
runId: number;
|
|
42
52
|
}) | null;
|
|
43
|
-
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws
|
|
44
|
-
* unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId
|
|
53
|
+
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws
|
|
54
|
+
* on an unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId
|
|
55
|
+
* is its live run. */
|
|
45
56
|
export declare function heartbeatCard(hippoRoot: string, tenantId: string, id: string, runId: number): Card | null;
|
|
46
57
|
/** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
|
|
47
58
|
* card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
|
|
48
59
|
export declare function blockCard(hippoRoot: string, tenantId: string, id: string, reason: string, runId?: number): Card | null;
|
|
49
|
-
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When
|
|
50
|
-
* given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card
|
|
60
|
+
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When
|
|
61
|
+
* runId is given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card
|
|
62
|
+
* not running. */
|
|
51
63
|
export declare function reviewCard(hippoRoot: string, tenantId: string, id: string, runId?: number): Card | null;
|
|
52
|
-
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all
|
|
53
|
-
* Throws on an unknown card id; returns null for a card not in review, or when
|
|
64
|
+
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all
|
|
65
|
+
* done; 'failure'/'partial' shelves it. Throws on an unknown card id; returns null for a card not in review, or when
|
|
66
|
+
* `runId` is given and is not the card's live run. */
|
|
54
67
|
export declare function completeCard(hippoRoot: string, tenantId: string, id: string, outcome: HandoffOutcome, runId?: number): {
|
|
55
68
|
card: Card;
|
|
56
69
|
promotedChildren: string[];
|
|
57
70
|
} | null;
|
|
58
|
-
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes
|
|
59
|
-
* run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card
|
|
71
|
+
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes
|
|
72
|
+
* its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card
|
|
73
|
+
* ids in id order. */
|
|
60
74
|
export declare function reclaimExpiredCards(hippoRoot: string, tenantId: string): string[];
|
|
61
75
|
/** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
|
|
62
76
|
export declare function addCardComment(hippoRoot: string, tenantId: string, cardId: string, author: string, body: string): CardComment;
|