hippo-memory 1.70.0 → 1.71.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 +1 -1
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +1 -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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
package/dist/store/cards.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { generateId } from '../core/memory.js';
|
|
2
|
-
import {
|
|
2
|
+
import { withWriteScope, withWriteScopeOr } from '../db/index.js';
|
|
3
3
|
import { rowToSessionHandoff, isHandoffOutcome } from '../core/handoff.js';
|
|
4
|
-
import {
|
|
4
|
+
import { CARD_LEASE_MS, assertCardTransition } from '../core/card.js';
|
|
5
5
|
import { assertTenantId } from './tenant.js';
|
|
6
|
-
import { openStore } from './open.js';
|
|
6
|
+
import { onHandle, openStore } from './open.js';
|
|
7
|
+
import { chunked } from './entry-reads.js';
|
|
7
8
|
import { HANDOFF_COLUMNS } from './handoffs.js';
|
|
8
9
|
const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at, tenant_id, scope';
|
|
9
10
|
function rowToCard(row) {
|
|
@@ -77,26 +78,27 @@ function closeLiveRun(db, tenantId, cardId, outcome, now) {
|
|
|
77
78
|
WHERE card = ? AND tenant_id = ? AND ended IS NULL
|
|
78
79
|
`).run(now, outcome, now, cardId, tenantId);
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
+
function transitionCard(db, tenantId, cardId, options) {
|
|
82
|
+
return transitionCards(db, tenantId, [cardId], options);
|
|
83
|
+
}
|
|
84
|
+
/** transitionCard for every card in `cardIds`, as one statement with one timestamp; returns how many moved. */
|
|
85
|
+
function transitionCards(db, tenantId, cardIds, options) {
|
|
81
86
|
const { from, to, extra } = options;
|
|
82
|
-
|
|
83
|
-
if (!CARD_TRANSITIONS[status].includes(to)) {
|
|
84
|
-
throw new Error(`illegal card transition: ${status} -> ${to}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
+
assertCardTransition(from, to);
|
|
87
88
|
const now = new Date().toISOString();
|
|
88
89
|
// Lease columns follow status: set on the move to running, cleared on every other move (rule 15).
|
|
89
90
|
const lease = to === 'running' ? [leaseUntilFrom(now), now] : [null, null];
|
|
90
91
|
const fromPlaceholders = from.map(() => '?').join(', ');
|
|
91
92
|
const sql = `
|
|
92
93
|
UPDATE cards SET status = ?, updated_at = ?, lease_until = ?, heartbeat_at = ?${extra?.setSql ? `, ${extra.setSql}` : ''}
|
|
93
|
-
WHERE id
|
|
94
|
+
WHERE id IN (${cardIds.map(() => '?').join(', ')}) AND tenant_id = ? AND status IN (${fromPlaceholders})${extra?.whereSql ? ` AND ${extra.whereSql}` : ''}
|
|
94
95
|
`;
|
|
95
|
-
const params = [to, now, ...lease, ...(extra?.params ?? []),
|
|
96
|
+
const params = [to, now, ...lease, ...(extra?.params ?? []), ...cardIds, tenantId, ...from];
|
|
96
97
|
const result = db.prepare(sql).run(...params);
|
|
97
98
|
return Number(result.changes ?? 0);
|
|
98
99
|
}
|
|
99
|
-
/** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog.
|
|
100
|
+
/** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog.
|
|
101
|
+
* An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
|
|
100
102
|
export function createCard(hippoRoot, tenantId, input) {
|
|
101
103
|
assertTenantId('createCard', tenantId);
|
|
102
104
|
if (input.title.trim() === '') {
|
|
@@ -105,8 +107,7 @@ export function createCard(hippoRoot, tenantId, input) {
|
|
|
105
107
|
if (input.budget !== undefined && !(Number.isSafeInteger(input.budget) && input.budget > 0)) {
|
|
106
108
|
throw new Error(`Invalid budget: ${input.budget} (expected a positive integer)`);
|
|
107
109
|
}
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
+
return onHandle(hippoRoot, (db) => {
|
|
110
111
|
const dependsOn = [...new Set(input.dependsOn ?? [])];
|
|
111
112
|
let id = '';
|
|
112
113
|
withWriteScope(db, 'create_card', () => {
|
|
@@ -120,17 +121,14 @@ export function createCard(hippoRoot, tenantId, input) {
|
|
|
120
121
|
INSERT INTO cards (id, title, status, repo, contract, budget, created_at, updated_at, tenant_id)
|
|
121
122
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
122
123
|
`).run(id, input.title, status, input.repo ?? null, input.contract ?? null, input.budget ?? null, now, now, tenantId);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
const insertDep = db.prepare(`
|
|
125
|
+
INSERT INTO card_deps (parent, child, tenant_id, created_at) VALUES (?, ?, ?, ?)
|
|
126
|
+
`);
|
|
127
|
+
for (const parentId of dependsOn)
|
|
128
|
+
insertDep.run(parentId, id, tenantId, now);
|
|
128
129
|
});
|
|
129
130
|
return loadCardRow(db, tenantId, id);
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
closeHippoDb(db);
|
|
133
|
-
}
|
|
131
|
+
}, openStore);
|
|
134
132
|
}
|
|
135
133
|
/** 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
134
|
function everyParentDone(db, tenantId, dependsOn) {
|
|
@@ -151,19 +149,14 @@ function everyParentDone(db, tenantId, dependsOn) {
|
|
|
151
149
|
/** Returns the card row for id, or null if it does not exist under this tenant. */
|
|
152
150
|
export function loadCard(hippoRoot, tenantId, id) {
|
|
153
151
|
assertTenantId('loadCard', tenantId);
|
|
154
|
-
|
|
155
|
-
try {
|
|
152
|
+
return onHandle(hippoRoot, (db) => {
|
|
156
153
|
return loadCardRow(db, tenantId, id);
|
|
157
|
-
}
|
|
158
|
-
finally {
|
|
159
|
-
closeHippoDb(db);
|
|
160
|
-
}
|
|
154
|
+
}, openStore);
|
|
161
155
|
}
|
|
162
156
|
/** Lists cards for this tenant, optionally filtered to one status, newest-updated first. */
|
|
163
157
|
export function listCards(hippoRoot, tenantId, opts = {}) {
|
|
164
158
|
assertTenantId('listCards', tenantId);
|
|
165
|
-
|
|
166
|
-
try {
|
|
159
|
+
return onHandle(hippoRoot, (db) => {
|
|
167
160
|
const conditions = ['tenant_id = ?'];
|
|
168
161
|
const params = [tenantId];
|
|
169
162
|
if (opts.status) {
|
|
@@ -175,82 +168,63 @@ export function listCards(hippoRoot, tenantId, opts = {}) {
|
|
|
175
168
|
SELECT ${CARD_COLUMNS} FROM cards WHERE ${conditions.join(' AND ')} ORDER BY updated_at DESC, id DESC
|
|
176
169
|
`).all(...params);
|
|
177
170
|
return rows.map(rowToCard);
|
|
178
|
-
}
|
|
179
|
-
finally {
|
|
180
|
-
closeHippoDb(db);
|
|
181
|
-
}
|
|
171
|
+
}, openStore);
|
|
182
172
|
}
|
|
183
173
|
/** Returns this card's parent and child ids from card_deps. */
|
|
184
174
|
export function loadCardDeps(hippoRoot, tenantId, id) {
|
|
185
175
|
assertTenantId('loadCardDeps', tenantId);
|
|
186
|
-
|
|
187
|
-
try {
|
|
176
|
+
return onHandle(hippoRoot, (db) => {
|
|
188
177
|
// SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
|
|
189
178
|
const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, id).map((r) => r.parent);
|
|
190
179
|
// SAFETY: rows' shape matches the single `child` column named in the SELECT below.
|
|
191
180
|
const children = db.prepare(`SELECT child FROM card_deps WHERE tenant_id = ? AND parent = ?`).all(tenantId, id).map((r) => r.child);
|
|
192
181
|
return { parents, children };
|
|
193
|
-
}
|
|
194
|
-
finally {
|
|
195
|
-
closeHippoDb(db);
|
|
196
|
-
}
|
|
182
|
+
}, openStore);
|
|
197
183
|
}
|
|
198
184
|
/** Returns this card's run history, most recent first. */
|
|
199
185
|
export function loadCardRuns(hippoRoot, tenantId, id) {
|
|
200
186
|
assertTenantId('loadCardRuns', tenantId);
|
|
201
|
-
|
|
202
|
-
try {
|
|
187
|
+
return onHandle(hippoRoot, (db) => {
|
|
203
188
|
// SAFETY: rows' shape matches CardRunRow.
|
|
204
189
|
const rows = db.prepare(`
|
|
205
190
|
SELECT id, card, runtime, session_id, started, ended, outcome
|
|
206
191
|
FROM card_runs WHERE tenant_id = ? AND card = ? ORDER BY started DESC, id DESC
|
|
207
192
|
`).all(tenantId, id);
|
|
208
193
|
return rows.map(rowToCardRun);
|
|
209
|
-
}
|
|
210
|
-
finally {
|
|
211
|
-
closeHippoDb(db);
|
|
212
|
-
}
|
|
194
|
+
}, openStore);
|
|
213
195
|
}
|
|
214
196
|
/** Returns this card's comments, most recent first. */
|
|
215
197
|
export function loadCardComments(hippoRoot, tenantId, id) {
|
|
216
198
|
assertTenantId('loadCardComments', tenantId);
|
|
217
|
-
|
|
218
|
-
try {
|
|
199
|
+
return onHandle(hippoRoot, (db) => {
|
|
219
200
|
// SAFETY: rows' shape matches CardCommentRow.
|
|
220
201
|
const rows = db.prepare(`
|
|
221
202
|
SELECT id, card_id, author, body, created_at
|
|
222
203
|
FROM card_comments WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC
|
|
223
204
|
`).all(tenantId, id);
|
|
224
205
|
return rows.map(rowToCardComment);
|
|
225
|
-
}
|
|
226
|
-
finally {
|
|
227
|
-
closeHippoDb(db);
|
|
228
|
-
}
|
|
206
|
+
}, openStore);
|
|
229
207
|
}
|
|
230
208
|
/** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
|
|
231
209
|
export function loadLatestHandoffForCard(hippoRoot, tenantId, cardId) {
|
|
232
210
|
assertTenantId('loadLatestHandoffForCard', tenantId);
|
|
233
|
-
|
|
234
|
-
try {
|
|
211
|
+
return onHandle(hippoRoot, (db) => {
|
|
235
212
|
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
236
213
|
const row = db.prepare(`
|
|
237
214
|
SELECT ${HANDOFF_COLUMNS} FROM session_handoffs
|
|
238
215
|
WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC LIMIT 1
|
|
239
216
|
`).get(tenantId, cardId);
|
|
240
217
|
return row ? rowToSessionHandoff(row) : null;
|
|
241
|
-
}
|
|
242
|
-
finally {
|
|
243
|
-
closeHippoDb(db);
|
|
244
|
-
}
|
|
218
|
+
}, openStore);
|
|
245
219
|
}
|
|
246
|
-
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
|
|
220
|
+
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
|
|
221
|
+
* returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new run's id as runId. */
|
|
247
222
|
export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
|
|
248
223
|
assertTenantId('claimCard', tenantId);
|
|
249
224
|
if (runtime.trim() === '') {
|
|
250
225
|
throw new Error('runtime must not be empty');
|
|
251
226
|
}
|
|
252
|
-
|
|
253
|
-
try {
|
|
227
|
+
return onHandle(hippoRoot, (db) => {
|
|
254
228
|
const runId = withWriteScopeOr(db, 'claim_card', (rollback) => {
|
|
255
229
|
const changes = transitionCard(db, tenantId, id, {
|
|
256
230
|
from: ['ready', 'blocked'],
|
|
@@ -271,17 +245,14 @@ export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
|
|
|
271
245
|
return Number(insert.lastInsertRowid ?? 0);
|
|
272
246
|
});
|
|
273
247
|
return runId === null ? null : { ...loadCardRow(db, tenantId, id), runId };
|
|
274
|
-
}
|
|
275
|
-
finally {
|
|
276
|
-
closeHippoDb(db);
|
|
277
|
-
}
|
|
248
|
+
}, openStore);
|
|
278
249
|
}
|
|
279
|
-
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
|
|
250
|
+
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
|
|
251
|
+
* unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId is its live run. */
|
|
280
252
|
export function heartbeatCard(hippoRoot, tenantId, id, runId) {
|
|
281
253
|
assertTenantId('heartbeatCard', tenantId);
|
|
282
254
|
assertRunId(runId);
|
|
283
|
-
|
|
284
|
-
try {
|
|
255
|
+
return onHandle(hippoRoot, (db) => {
|
|
285
256
|
const beat = withWriteScopeOr(db, 'heartbeat_card', (rollback) => {
|
|
286
257
|
const card = loadCardRow(db, tenantId, id);
|
|
287
258
|
if (!card) {
|
|
@@ -296,12 +267,10 @@ export function heartbeatCard(hippoRoot, tenantId, id, runId) {
|
|
|
296
267
|
return true;
|
|
297
268
|
});
|
|
298
269
|
return beat ? loadCardRow(db, tenantId, id) : null;
|
|
299
|
-
}
|
|
300
|
-
finally {
|
|
301
|
-
closeHippoDb(db);
|
|
302
|
-
}
|
|
270
|
+
}, openStore);
|
|
303
271
|
}
|
|
304
|
-
/** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
|
|
272
|
+
/** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
|
|
273
|
+
* card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
|
|
305
274
|
export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
306
275
|
assertTenantId('blockCard', tenantId);
|
|
307
276
|
if (reason.trim() === '') {
|
|
@@ -309,8 +278,7 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
|
309
278
|
}
|
|
310
279
|
if (runId !== undefined)
|
|
311
280
|
assertRunId(runId);
|
|
312
|
-
|
|
313
|
-
try {
|
|
281
|
+
return onHandle(hippoRoot, (db) => {
|
|
314
282
|
const blocked = withWriteScopeOr(db, 'block_card', (rollback) => {
|
|
315
283
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
316
284
|
const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'blocked', extra: { setSql: 'assignee_runtime = NULL' } }) : 0;
|
|
@@ -327,18 +295,15 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
|
327
295
|
return true;
|
|
328
296
|
});
|
|
329
297
|
return blocked ? loadCardRow(db, tenantId, id) : null;
|
|
330
|
-
}
|
|
331
|
-
finally {
|
|
332
|
-
closeHippoDb(db);
|
|
333
|
-
}
|
|
298
|
+
}, openStore);
|
|
334
299
|
}
|
|
335
|
-
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
|
|
300
|
+
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
|
|
301
|
+
* given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
|
|
336
302
|
export function reviewCard(hippoRoot, tenantId, id, runId) {
|
|
337
303
|
assertTenantId('reviewCard', tenantId);
|
|
338
304
|
if (runId !== undefined)
|
|
339
305
|
assertRunId(runId);
|
|
340
|
-
|
|
341
|
-
try {
|
|
306
|
+
return onHandle(hippoRoot, (db) => {
|
|
342
307
|
const moved = withWriteScopeOr(db, 'review_card', (rollback) => {
|
|
343
308
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
344
309
|
const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'review' }) : 0;
|
|
@@ -351,12 +316,10 @@ export function reviewCard(hippoRoot, tenantId, id, runId) {
|
|
|
351
316
|
return true;
|
|
352
317
|
});
|
|
353
318
|
return moved ? loadCardRow(db, tenantId, id) : null;
|
|
354
|
-
}
|
|
355
|
-
finally {
|
|
356
|
-
closeHippoDb(db);
|
|
357
|
-
}
|
|
319
|
+
}, openStore);
|
|
358
320
|
}
|
|
359
|
-
/**
|
|
321
|
+
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all done; 'failure'/'partial' shelves it.
|
|
322
|
+
* Throws on an unknown card id; returns null for a card not in review, or when `runId` is given and is not the card's live run. */
|
|
360
323
|
export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
361
324
|
assertTenantId('completeCard', tenantId);
|
|
362
325
|
if (!isHandoffOutcome(outcome)) {
|
|
@@ -364,8 +327,7 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
|
364
327
|
}
|
|
365
328
|
if (runId !== undefined)
|
|
366
329
|
assertRunId(runId);
|
|
367
|
-
|
|
368
|
-
try {
|
|
330
|
+
return onHandle(hippoRoot, (db) => {
|
|
369
331
|
const promoted = withWriteScopeOr(db, 'complete_card', (rollback) => {
|
|
370
332
|
const target = outcome === 'success' ? 'done' : 'shelved';
|
|
371
333
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
@@ -383,38 +345,29 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
|
383
345
|
return target === 'done' ? promoteUnblockedChildren(db, tenantId, id) : [];
|
|
384
346
|
});
|
|
385
347
|
return promoted === null ? null : { card: loadCardRow(db, tenantId, id), promotedChildren: promoted };
|
|
386
|
-
}
|
|
387
|
-
finally {
|
|
388
|
-
closeHippoDb(db);
|
|
389
|
-
}
|
|
348
|
+
}, openStore);
|
|
390
349
|
}
|
|
391
350
|
/** Moves to ready each backlog child of `parentId` whose parents are all done, and returns their ids. Call inside the write scope. */
|
|
392
351
|
function promoteUnblockedChildren(db, tenantId, parentId) {
|
|
393
|
-
|
|
394
|
-
// SAFETY: rows' shape matches the
|
|
395
|
-
const children = db.prepare(`
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
if (doneCount === parents.length) {
|
|
407
|
-
transitionCard(db, tenantId, childId, { from: ['backlog'], to: 'ready' });
|
|
408
|
-
promotedChildren.push(childId);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
return promotedChildren;
|
|
352
|
+
// The child's status and its open parents are result columns, not joins, so the rows keep the order of a plain read of the parent's children.
|
|
353
|
+
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
354
|
+
const children = db.prepare(`
|
|
355
|
+
SELECT d.child AS child,
|
|
356
|
+
(SELECT c.status FROM cards c WHERE c.tenant_id = ? AND c.id = d.child) AS status,
|
|
357
|
+
(SELECT COUNT(*) FROM card_deps p WHERE p.tenant_id = ? AND p.child = d.child
|
|
358
|
+
AND NOT EXISTS (SELECT 1 FROM cards pc WHERE pc.tenant_id = ? AND pc.id = p.parent AND pc.status = 'done')) AS open_parents
|
|
359
|
+
FROM card_deps d WHERE d.tenant_id = ? AND d.parent = ?
|
|
360
|
+
`).all(tenantId, tenantId, tenantId, tenantId, parentId);
|
|
361
|
+
const unblocked = children.filter((r) => r.status === 'backlog' && r.open_parents === 0).map((r) => r.child);
|
|
362
|
+
for (const ids of chunked(unblocked))
|
|
363
|
+
transitionCards(db, tenantId, ids, { from: ['backlog'], to: 'ready' });
|
|
364
|
+
return unblocked;
|
|
412
365
|
}
|
|
413
|
-
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
|
|
366
|
+
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
|
|
367
|
+
* run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
|
|
414
368
|
export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
415
369
|
assertTenantId('reclaimExpiredCards', tenantId);
|
|
416
|
-
|
|
417
|
-
try {
|
|
370
|
+
return onHandle(hippoRoot, (db) => {
|
|
418
371
|
return withWriteScope(db, 'reclaim_expired_cards', () => {
|
|
419
372
|
// Read lease times under the write lock, so a heartbeat that committed while we waited wins.
|
|
420
373
|
const now = new Date().toISOString();
|
|
@@ -430,10 +383,7 @@ export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
|
430
383
|
}
|
|
431
384
|
return ids;
|
|
432
385
|
});
|
|
433
|
-
}
|
|
434
|
-
finally {
|
|
435
|
-
closeHippoDb(db);
|
|
436
|
-
}
|
|
386
|
+
}, openStore);
|
|
437
387
|
}
|
|
438
388
|
/** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
|
|
439
389
|
export function addCardComment(hippoRoot, tenantId, cardId, author, body) {
|
|
@@ -441,12 +391,8 @@ export function addCardComment(hippoRoot, tenantId, cardId, author, body) {
|
|
|
441
391
|
if (body.trim() === '') {
|
|
442
392
|
throw new Error('body must not be empty');
|
|
443
393
|
}
|
|
444
|
-
|
|
445
|
-
try {
|
|
394
|
+
return onHandle(hippoRoot, (db) => {
|
|
446
395
|
return insertCardComment(db, tenantId, cardId, author, body);
|
|
447
|
-
}
|
|
448
|
-
finally {
|
|
449
|
-
closeHippoDb(db);
|
|
450
|
-
}
|
|
396
|
+
}, openStore);
|
|
451
397
|
}
|
|
452
398
|
//# sourceMappingURL=cards.js.map
|
|
@@ -23,16 +23,12 @@ type DetectedConflict = {
|
|
|
23
23
|
};
|
|
24
24
|
type SameTenant = (a: string, b: string) => boolean;
|
|
25
25
|
export declare function replaceDetectedConflicts(hippoRoot: string, detected: Array<DetectedConflict>, detectedAt?: string): void;
|
|
26
|
-
/**
|
|
26
|
+
/** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read before the refresh takes the write lock. */
|
|
27
27
|
export interface ConflictRefreshReads {
|
|
28
28
|
sameTenant: SameTenant;
|
|
29
29
|
storedRefs: ReadonlyMap<string, string | null>;
|
|
30
30
|
}
|
|
31
|
-
/**
|
|
32
|
-
* AT1 (plan §5): additive-optional opts for resolveConflict.
|
|
33
|
-
* `rejectLoserValue` implies removal of the loser regardless of
|
|
34
|
-
* `forgetLoser` — you cannot tombstone a value and leave it live.
|
|
35
|
-
*/
|
|
31
|
+
/** `rejectLoserValue` implies removal of the loser regardless of `forgetLoser`: a tombstoned value cannot stay live. */
|
|
36
32
|
export interface ResolveConflictOpts {
|
|
37
33
|
/** Tombstone the loser's normalized digest + kind-aware remove it. */
|
|
38
34
|
rejectLoserValue?: boolean;
|
|
@@ -42,21 +38,8 @@ export interface ResolveConflictOpts {
|
|
|
42
38
|
* loser is kind='raw'). Defaults to a conflict-context string. */
|
|
43
39
|
reason?: string;
|
|
44
40
|
}
|
|
45
|
-
/**
|
|
46
|
-
*
|
|
47
|
-
* Sets conflict status to 'resolved' and halves the loser's half-life.
|
|
48
|
-
* If --forget is used, the loser is removed entirely (kind-aware: raw rows
|
|
49
|
-
* are archived via archiveRawMemory, others deleted via deleteEntryCore —
|
|
50
|
-
* AT1 fix for the pre-existing crash where a raw loser aborted the whole
|
|
51
|
-
* resolve transaction against the append-only trigger). `opts.rejectLoserValue`
|
|
52
|
-
* additionally tombstones the loser's normalized digest so it cannot be
|
|
53
|
-
* re-asserted later.
|
|
54
|
-
*
|
|
55
|
-
* Every resolution path (weaken / forget / reject) emits a `conflict_resolve`
|
|
56
|
-
* audit row (AT1 — previously resolveConflict wrote zero audit rows on any path).
|
|
57
|
-
*
|
|
58
|
-
* Returns the resolved conflict, or null if not found.
|
|
59
|
-
*/
|
|
41
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
|
|
42
|
+
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
60
43
|
export declare function resolveConflict(hippoRoot: string, conflictId: number, keepId: string, forgetLoser?: boolean, tenantId?: string, opts?: ResolveConflictOpts): {
|
|
61
44
|
conflict: MemoryConflict;
|
|
62
45
|
loserId: string;
|