hippo-memory 1.71.0 → 1.72.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/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +1 -1
- package/dist/api/audit.d.ts +29 -1
- package/dist/api/audit.js +44 -5
- package/dist/api/auth.d.ts +7 -4
- package/dist/api/auth.js +12 -8
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +9 -11
- package/dist/api/context.js +17 -8
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +1 -1
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +6 -2
- package/dist/api/forget.js +18 -7
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +19 -1
- package/dist/api/memories.js +39 -0
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +6 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.js +1 -1
- package/dist/api/prompt-hook.d.ts +15 -2
- package/dist/api/prompt-hook.js +44 -4
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +3 -3
- package/dist/api/recall-pipeline.js +6 -7
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +19 -44
- package/dist/api/remember-local.js +1 -1
- package/dist/api/remember.d.ts +2 -1
- package/dist/api/remember.js +3 -2
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +13 -9
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +1 -1
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +4 -2
- package/dist/capture/compaction-spool.js +20 -6
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +13 -13
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +12 -13
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +5 -0
- package/dist/cli/client.js +24 -8
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +12 -12
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +1 -1
- package/dist/cli/curate.js +23 -27
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +4 -281
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +3 -5
- package/dist/cli/hook-runtime.js +7 -34
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +17 -17
- package/dist/cli/remember.js +12 -12
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +3 -3
- package/dist/cli/session-hooks.d.ts +1 -1
- package/dist/cli/session-hooks.js +45 -115
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +33 -31
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -695
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +23 -313
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +3 -28
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +33 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +2 -27
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +1 -1
- package/dist/consolidate/dag.js +15 -9
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +5 -3
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +2 -1
- package/dist/consolidate/merge.js +2 -2
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +8 -5
- package/dist/consolidate/traces.js +3 -3
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +7 -2
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +2 -2
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +10 -4
- package/dist/core/memory.js +25 -18
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.js +6 -16
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +10 -1
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +0 -1
- package/dist/db/connect.js +5 -6
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.js +3 -3
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +17 -4
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +11 -8
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +18 -15
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +11 -4
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +4 -2
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +1 -1
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.js +7 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/learn/autolearn.d.ts +10 -2
- package/dist/learn/autolearn.js +32 -12
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +6 -4
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.js +10 -6
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +3 -1
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +2 -1
- package/dist/mcp/stdio.js +24 -8
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +63 -97
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +10 -13
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.js +17 -7
- package/dist/server/boot.js +7 -66
- package/dist/server/client-ip.d.ts +0 -2
- package/dist/server/client-ip.js +3 -2
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -132
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +15 -38
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/types.d.ts +22 -10
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +5 -4
- package/dist/server.js +5 -4
- package/dist/sharing/global-store.js +2 -2
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +1 -1
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +37 -34
- package/dist/store/ambient.js +5 -6
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +42 -23
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +1 -1
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.js +7 -4
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +30 -53
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +7 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +36 -3
- package/dist/store/delivery-recorder.d.ts +10 -3
- package/dist/store/delivery-recorder.js +12 -5
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +3 -1
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +13 -4
- package/dist/store/entry-reads.js +47 -11
- package/dist/store/entry-writes.d.ts +5 -5
- package/dist/store/entry-writes.js +32 -12
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +20 -18
- package/dist/store/graph-reads.js +4 -2
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +6 -6
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +10 -6
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +40 -53
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +9 -3
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +18 -2
- package/dist/store/rejected-values.js +2 -1
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rule-sql.d.ts +9 -0
- package/dist/store/rule-sql.js +21 -2
- package/dist/store/search-rows.js +9 -4
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +1 -1
- package/dist/store/sqlite/store.js +14 -12
- package/dist/store/summaries.d.ts +3 -3
- package/dist/store/summaries.js +5 -4
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +3 -2
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +22 -5
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +2 -1
- package/dist/util/env.js +2 -1
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +3 -1
- package/dist/util/request-scope.js +11 -6
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +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 +2 -2
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
package/README.md
CHANGED
|
@@ -137,7 +137,7 @@ hippo init
|
|
|
137
137
|
# Scheduled machine-level daily runner (6:15am) via crontab
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
To leave parts out: `--no-hooks` skips the instruction files and hooks, `--no-schedule` the daily run, and `--no-learn` the git history and agent memory import. `HIPPO_SKIP_AUTO_INTEGRATIONS=1` skips the same files and hooks that `--no-hooks` does.
|
|
140
|
+
To leave parts out: `--no-hooks` skips the instruction files and hooks, `--no-schedule` the daily run, and `--no-learn` the git history and agent memory import. `HIPPO_SKIP_AUTO_INTEGRATIONS=1` skips the same files and hooks that `--no-hooks` does, and `HIPPO_SKIP_SCHEDULE=1` skips the daily run as `--no-schedule` does.
|
|
141
141
|
|
|
142
142
|
### Agent memories
|
|
143
143
|
|
|
@@ -3,7 +3,6 @@ import { type MemoryEntry } from '../core/memory.js';
|
|
|
3
3
|
import { type Tally } from './report.js';
|
|
4
4
|
import type { AgentMemoryTool } from '../core/agent-memory-tools.js';
|
|
5
5
|
import type { Container } from './types.js';
|
|
6
|
-
export declare const SYNC_ACTOR = "agent-memories";
|
|
7
6
|
export interface StoreSession {
|
|
8
7
|
readonly db: DatabaseSyncLike;
|
|
9
8
|
readonly hippoRoot: string;
|
|
@@ -36,14 +35,4 @@ export interface ContainerOutcome {
|
|
|
36
35
|
}
|
|
37
36
|
/** Throws SQLITE_BUSY when another writer holds the store past its busy timeout; nothing is written then. */
|
|
38
37
|
export declare function syncContainer(s: StoreSession, work: ContainerWork): ContainerOutcome;
|
|
39
|
-
export type SetAsideWhy = 'note-gone' | 'note-changed' | 'handover' | 'project-merge' | 'project-repair';
|
|
40
|
-
export type SetAsideResult = {
|
|
41
|
-
readonly kind: 'untagged';
|
|
42
|
-
readonly entry: MemoryEntry;
|
|
43
|
-
} | {
|
|
44
|
-
readonly kind: 'dormant';
|
|
45
|
-
readonly id: string;
|
|
46
|
-
};
|
|
47
|
-
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
48
|
-
export declare function setAsideRow(db: DatabaseSyncLike, tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
|
|
49
38
|
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -1,41 +1,26 @@
|
|
|
1
1
|
// One container's sync in one transaction on the caller's handle: lookup, plan, then every write (plan designs 6 to 8).
|
|
2
2
|
import { appendAuditEvent } from '../store/audit.js';
|
|
3
3
|
import { withTrialScope, withWriteScope } from '../db/index.js';
|
|
4
|
-
import { deleteDormantRow, dormantSnapshotsBySourcePrefix,
|
|
5
|
-
import { gatedWrite } from '../
|
|
4
|
+
import { deleteDormantRow, dormantSnapshotsBySourcePrefix, readDormantSnapshot, replaceDormantEntry } from '../store/dormant.js';
|
|
5
|
+
import { gatedWrite } from '../store/gated-write.js';
|
|
6
|
+
import { strengthAblation } from '../core/ablation.js';
|
|
6
7
|
import { Layer, calculateStrength, createMemory } from '../core/memory.js';
|
|
7
8
|
import { findRejectedValue, rejectionDigest } from '../store/rejection.js';
|
|
8
9
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
9
10
|
import { stampOriginProject } from '../store/entry-row.js';
|
|
10
|
-
import {
|
|
11
|
+
import { renameEntrySourceAndOriginAt, renameEntrySourceAt, setEntryTagsInTx, supersedeEntryAt } from '../store/entry-writes.js';
|
|
12
|
+
import { SYNC_ACTOR, setAsideRow } from '../store/set-aside.js';
|
|
11
13
|
import { entryIdTakenAt, selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
12
14
|
import { markSummaryDirtyInTx } from '../store/summary-dirty.js';
|
|
13
15
|
import { itemHash } from './keys.js';
|
|
14
16
|
import { planContainer } from './plan.js';
|
|
15
17
|
import { emptyTally } from './report.js';
|
|
16
18
|
import { MIN_ITEM_CHARS, itemSource, splitSource, storedText } from './source.js';
|
|
17
|
-
export const SYNC_ACTOR = 'agent-memories';
|
|
18
19
|
/** Throws SQLITE_BUSY when another writer holds the store past its busy timeout; nothing is written then. */
|
|
19
20
|
export function syncContainer(s, work) {
|
|
20
21
|
const run = () => new ContainerRun(s, work).run();
|
|
21
22
|
return s.dryRun ? withTrialScope(s.db, 'sync_container', run) : withWriteScope(s.db, 'sync_container', run);
|
|
22
23
|
}
|
|
23
|
-
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
24
|
-
export function setAsideRow(db, tag, row, why) {
|
|
25
|
-
const untagged = { ...row, tags: row.tags.filter((t) => t !== tag) };
|
|
26
|
-
const audit = (metadata) => appendAuditEvent(db, { tenantId: row.tenantId, actor: SYNC_ACTOR, op: 'agent_memory_set_aside', targetId: row.id, metadata });
|
|
27
|
-
if (row.pinned) {
|
|
28
|
-
setEntryTagsInTx(db, untagged);
|
|
29
|
-
audit({ why, untagged: true });
|
|
30
|
-
return { kind: 'untagged', entry: untagged };
|
|
31
|
-
}
|
|
32
|
-
const now = new Date();
|
|
33
|
-
// Sleep's dormant move skips kept rows, so the steps are written out here without its filter.
|
|
34
|
-
insertDormantRow(db, { entry: untagged, strength: calculateStrength(row, now), reason: 'source-deleted', dormantAt: now.toISOString() });
|
|
35
|
-
deleteEntryRowInTx(db, row, SYNC_ACTOR);
|
|
36
|
-
audit({ why });
|
|
37
|
-
return { kind: 'dormant', id: row.id };
|
|
38
|
-
}
|
|
39
24
|
class ContainerRun {
|
|
40
25
|
s;
|
|
41
26
|
w;
|
|
@@ -223,7 +208,7 @@ class ContainerRun {
|
|
|
223
208
|
tags: [...tags, this.tag],
|
|
224
209
|
last_retrieved: now.toISOString(),
|
|
225
210
|
};
|
|
226
|
-
if (!this.gated(stampOriginProject(this.s.hippoRoot, { ...revived, strength: calculateStrength(revived, now) })))
|
|
211
|
+
if (!this.gated(stampOriginProject(this.s.hippoRoot, { ...revived, strength: calculateStrength(revived, now, { ablation: strengthAblation() }) })))
|
|
227
212
|
return;
|
|
228
213
|
deleteDormantRow(this.s.db, this.s.tenantId, dormantId);
|
|
229
214
|
appendAuditEvent(this.s.db, {
|
|
@@ -4,7 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import { resolveProjectIdentity } from '../core/project-identity.js';
|
|
5
5
|
import { realpathOrResolve } from '../util/real-path.js';
|
|
6
6
|
import { isStringValue } from '../core/capture-contract.js';
|
|
7
|
-
import { claudeConfigDir } from '../
|
|
7
|
+
import { claudeConfigDir } from '../util/agent-homes.js';
|
|
8
8
|
import { expandHome, frontmatterField, itemTime, readTextFile, splitFrontmatter } from './files.js';
|
|
9
9
|
import { markdownNotes, readFolderStore, uniqueFolders } from './folder-store.js';
|
|
10
10
|
import { gitLayout } from './git.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Codex CLI's memory_summary.md, the one memory file Codex puts in its prompt, read as a single text-keyed file.
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { codexHomeDir } from '../
|
|
4
|
+
import { codexHomeDir } from '../util/agent-homes.js';
|
|
5
5
|
import { readTextFile } from './files.js';
|
|
6
6
|
import { textItemKeys } from './keys.js';
|
|
7
7
|
import { splitMarkdownItems } from './markdown.js';
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { Adapter
|
|
2
|
-
/** VS Code's user-data resolution: portable install first, then the app-data override, then the platform default. */
|
|
3
|
-
export declare function vscodeDataFolders(ctx: Pick<AdapterContext, 'env' | 'home' | 'platform'>): string[];
|
|
1
|
+
import type { Adapter } from './types.js';
|
|
4
2
|
export declare const copilotAdapter: Adapter;
|
|
5
3
|
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -5,24 +5,8 @@ import { readTextFile } from './files.js';
|
|
|
5
5
|
import { readFolderStore } from './folder-store.js';
|
|
6
6
|
import { gitLayout } from './git.js';
|
|
7
7
|
import { errorMessage } from '../util/log.js';
|
|
8
|
-
|
|
8
|
+
import { vscodeDataFolders } from '../util/agent-homes.js';
|
|
9
9
|
const MEMORY_TOOL = ['github.copilot-chat', 'memory-tool', 'memories'];
|
|
10
|
-
/** VS Code's user-data resolution: portable install first, then the app-data override, then the platform default. */
|
|
11
|
-
export function vscodeDataFolders(ctx) {
|
|
12
|
-
const { env, home, platform } = ctx;
|
|
13
|
-
if (env.VSCODE_PORTABLE)
|
|
14
|
-
return [path.join(env.VSCODE_PORTABLE, 'user-data')];
|
|
15
|
-
let appData;
|
|
16
|
-
if (env.VSCODE_APPDATA)
|
|
17
|
-
appData = env.VSCODE_APPDATA;
|
|
18
|
-
else if (platform === 'win32')
|
|
19
|
-
appData = env.APPDATA || path.join(home, 'AppData', 'Roaming');
|
|
20
|
-
else if (platform === 'darwin')
|
|
21
|
-
appData = path.join(home, 'Library', 'Application Support');
|
|
22
|
-
else
|
|
23
|
-
appData = env.XDG_CONFIG_HOME || path.join(home, '.config');
|
|
24
|
-
return PRODUCTS.map((product) => path.join(appData, product));
|
|
25
|
-
}
|
|
26
10
|
/** A `file:` URI as a local path; null for any other scheme or a URI with a host part. */
|
|
27
11
|
function fileUriToPath(uri, platform) {
|
|
28
12
|
if (!uri.startsWith('file://'))
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectTagReads } from '../store/project-tags.js';
|
|
2
|
+
export interface ProjectFold {
|
|
3
|
+
readonly from: string;
|
|
4
|
+
readonly into: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function foldEdges(store: Pick<ProjectTagReads, 'auditEvents'>): ProjectFold[];
|
|
7
|
+
export declare function foldedInto(edges: readonly ProjectFold[], names: readonly string[]): string[];
|
|
8
|
+
/** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
|
|
9
|
+
export declare function namesFoldedInto(store: Pick<ProjectTagReads, 'auditEvents'>, names: readonly string[]): string[];
|
|
10
|
+
//# sourceMappingURL=project-folds.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Project names folded into others, read from the audit trail: the sync files imports under the surviving name, and `hippo projects` repair agrees.
|
|
2
|
+
import { isObjectLike, isStringValue } from '../core/capture-contract.js';
|
|
3
|
+
function foldOf(value) {
|
|
4
|
+
if (!isObjectLike(value) || Array.isArray(value))
|
|
5
|
+
return [];
|
|
6
|
+
const { from, into } = value;
|
|
7
|
+
return isStringValue(from) && isStringValue(into) ? [{ from, into }] : [];
|
|
8
|
+
}
|
|
9
|
+
export function foldEdges(store) {
|
|
10
|
+
return [
|
|
11
|
+
...store.auditEvents('project_merge').flatMap((e) => foldOf(e.metadata)),
|
|
12
|
+
...store.auditEvents('project_repair')
|
|
13
|
+
.flatMap((e) => (Array.isArray(e.metadata.folds) ? e.metadata.folds.flatMap(foldOf) : [])),
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
export function foldedInto(edges, names) {
|
|
17
|
+
const seen = new Set(names);
|
|
18
|
+
let grew = true;
|
|
19
|
+
while (grew) {
|
|
20
|
+
grew = false;
|
|
21
|
+
for (const { from, into } of edges) {
|
|
22
|
+
if (!seen.has(into) || seen.has(from))
|
|
23
|
+
continue;
|
|
24
|
+
seen.add(from);
|
|
25
|
+
grew = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return [...seen].filter((n) => !names.includes(n));
|
|
29
|
+
}
|
|
30
|
+
/** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
|
|
31
|
+
export function namesFoldedInto(store, names) {
|
|
32
|
+
return foldedInto(foldEdges(store), names);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=project-folds.js.map
|
|
@@ -6,16 +6,18 @@ import path from 'node:path';
|
|
|
6
6
|
import { errorMessage } from '../util/log.js';
|
|
7
7
|
import { loadConfig } from '../core/config.js';
|
|
8
8
|
import { closeHippoDb, isSqliteBusy, openHippoDb, outsideRequestStores, withWriteScope } from '../db/index.js';
|
|
9
|
-
import { namesFoldedInto } from '
|
|
10
|
-
import {
|
|
9
|
+
import { namesFoldedInto } from './project-folds.js';
|
|
10
|
+
import { projectTagReads } from '../store/project-tags.js';
|
|
11
|
+
import { isGlobalStoreRoot, isInitialized, projectNames, resolveGlobalRootDir, resolveProjectIdentity, } from '../core/project-identity.js';
|
|
11
12
|
import { duplicateKey, heldTextKeys } from '../util/same-text.js';
|
|
12
13
|
import { removeEntryMirrors } from '../store/mirrors.js';
|
|
13
|
-
import { initStore
|
|
14
|
+
import { initStore } from '../store/open.js';
|
|
14
15
|
import { writeEntryMirrors } from '../store/entry-writes.js';
|
|
15
16
|
import { selectLiveEntriesBySourcePrefix, selectRowsOutsideSourcePrefixAt } from '../store/entry-reads.js';
|
|
16
17
|
import { updateStats } from '../store/index-and-stats.js';
|
|
17
18
|
import { resolveTenantId } from '../store/tenant.js';
|
|
18
|
-
import { setAsideRow
|
|
19
|
+
import { setAsideRow } from '../store/set-aside.js';
|
|
20
|
+
import { syncContainer } from './apply.js';
|
|
19
21
|
import { claudeCodeAdapter, claudeTranscriptListing, transcriptNotesProject } from './claude-code.js';
|
|
20
22
|
import { codexAdapter } from './codex.js';
|
|
21
23
|
import { copilotAdapter } from './copilot.js';
|
|
@@ -230,7 +232,7 @@ function syncStore(pass, listings, store, opts, report) {
|
|
|
230
232
|
/** The legacy names plus every name a merge or repair folded into the project; the audit read runs once per pass. */
|
|
231
233
|
function earlierNames(db, tenantId, id, legacyOrigins) {
|
|
232
234
|
const names = [id, ...legacyOrigins];
|
|
233
|
-
return [...legacyOrigins, ...namesFoldedInto(db, tenantId, names)].filter((n) => n !== '' && n !== id);
|
|
235
|
+
return [...legacyOrigins, ...namesFoldedInto(projectTagReads(db, tenantId), names)].filter((n) => n !== '' && n !== id);
|
|
234
236
|
}
|
|
235
237
|
function containerWork(tool, container, options) {
|
|
236
238
|
const { platform, legacy, origin, earlier } = options;
|
|
@@ -316,7 +318,7 @@ function handOver(synced, projectRoot, opts, report) {
|
|
|
316
318
|
// A folder with no git and no marker wrote as '' before its store existed, and as its own name after.
|
|
317
319
|
// Names folded into this project's in the global store were its rows too.
|
|
318
320
|
const names = projectNames(resolveProjectIdentity(projectRoot));
|
|
319
|
-
const origins = [...new Set([...names, ...namesFoldedInto(db, tenantId, names), ''])];
|
|
321
|
+
const origins = [...new Set([...names, ...namesFoldedInto(projectTagReads(db, tenantId), names), ''])];
|
|
320
322
|
for (const work of synced)
|
|
321
323
|
handOverContainer(db, globalRoot, tenantId, work, { origins, platform: opts.machine.platform, report });
|
|
322
324
|
}
|
package/dist/api/assemble.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Session context assembly under a token budget.
|
|
2
2
|
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
3
|
import { estimateTokens } from '../util/token-text.js';
|
|
4
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../
|
|
4
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
5
5
|
import { classifyOriginProject, projectNames } from '../core/project-identity.js';
|
|
6
6
|
const DEFAULT_FRESH_TAIL_COUNT = 10;
|
|
7
7
|
const DEFAULT_ROW_CAP = 5000;
|
package/dist/api/audit.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AuditEvent, type AuditOp } from '../store/audit.js';
|
|
2
|
+
import { type AuditIssue, type AuditResult } from '../core/memory-audit.js';
|
|
3
|
+
import { type QualityRepairResult } from '../store/quality-repair.js';
|
|
2
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
3
5
|
import type { Context } from './types.js';
|
|
4
6
|
export interface AuditListOpts {
|
|
@@ -15,4 +17,30 @@ export declare function auditList(ctx: Context, opts: AuditListOpts): Promise<Au
|
|
|
15
17
|
export type AuditPass = 'audit --fix' | 'sleep-audit';
|
|
16
18
|
/** Delete the memories an audit marked as errors, each with its own forget row, and answer the ids that went: a pinned or raw row stays. */
|
|
17
19
|
export declare function removeAuditErrors(ctx: Context, pass: AuditPass, issues: readonly AuditIssue[]): string[];
|
|
20
|
+
/** The caller's memories run through the quality audit; a memory that backs an object is never marked for removal. */
|
|
21
|
+
export declare function auditMemoryQuality(ctx: Context): AuditResult;
|
|
22
|
+
/** Audit repair for the caller's tenant: a preview, or with `apply` the moves of certain defects to dormant storage behind a backup. */
|
|
23
|
+
export declare function repairMemoryQuality(ctx: Context, apply: boolean): QualityRepairResult;
|
|
24
|
+
/** The repair sleep and the daily runner apply once per store after an upgrade; null when it already ran there. */
|
|
25
|
+
export declare function repairMemoryQualityOnce(ctx: Context): QualityRepairResult | null;
|
|
26
|
+
export interface PruneAuditOpts {
|
|
27
|
+
/** Cutoff in days. Rows with `ts < (now - N days)` are deleted. */
|
|
28
|
+
olderThanDays: number;
|
|
29
|
+
/** When true, count matching rows but do NOT delete. Default false. */
|
|
30
|
+
dryRun?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface PruneAuditResult {
|
|
33
|
+
/** ISO timestamp of the cutoff. Rows with ts strictly less than this were deleted. */
|
|
34
|
+
cutoff: string;
|
|
35
|
+
/** Number of audit_log rows deleted (or that would be deleted, if dryRun). */
|
|
36
|
+
count: number;
|
|
37
|
+
/** Echo back whether this was a dry run. */
|
|
38
|
+
dryRun: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
|
|
41
|
+
export declare function computeCutoff(days: number, now?: Date): string;
|
|
42
|
+
/** Delete the caller's tenant's audit_log rows older than `olderThanDays`, then record an `audit_prune` row as `ctx.actor`; opt-in, since
|
|
43
|
+
* retention floors (HIPAA, SOX, GDPR) apply. The row is written after the DELETE, so a call never prunes its own record.
|
|
44
|
+
* Throws on non-positive days or an empty tenant. */
|
|
45
|
+
export declare function pruneAuditLog(ctx: Context, opts: PruneAuditOpts): PruneAuditResult;
|
|
18
46
|
//# sourceMappingURL=audit.d.ts.map
|
package/dist/api/audit.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
// Audit log queries
|
|
2
|
-
import {
|
|
1
|
+
// Audit log queries and retention, and the memory-quality audit with its repair passes.
|
|
2
|
+
import { pruneAuditRows } from '../store/audit.js';
|
|
3
|
+
import { auditMemories } from '../core/memory-audit.js';
|
|
4
|
+
import { deleteEntriesAutomatically, memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
5
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
6
|
+
import { repairAutomaticMemories, repairQualityOnce } from '../store/quality-repair.js';
|
|
7
|
+
import { DAY_MS } from '../util/time.js';
|
|
3
8
|
import { requireGroup, storeFor } from '../store/index.js';
|
|
4
9
|
/** Read audit events scoped to `ctx.tenantId` on the store the request runs on. Read-only, no audit emit. */
|
|
5
10
|
export async function auditList(ctx, opts) {
|
|
@@ -9,9 +14,43 @@ export async function auditList(ctx, opts) {
|
|
|
9
14
|
}
|
|
10
15
|
/** Delete the memories an audit marked as errors, each with its own forget row, and answer the ids that went: a pinned or raw row stays. */
|
|
11
16
|
export function removeAuditErrors(ctx, pass, issues) {
|
|
12
|
-
|
|
17
|
+
const removals = issues
|
|
13
18
|
.filter((issue) => issue.severity === 'error')
|
|
14
|
-
.
|
|
15
|
-
|
|
19
|
+
.map((issue) => ({ id: issue.memoryId, reason: `${pass}: ${issue.reason}` }));
|
|
20
|
+
return deleteEntriesAutomatically(ctx.hippoRoot, removals, ctx.actor.subject);
|
|
21
|
+
}
|
|
22
|
+
// SHORTCUT: hippo.db only, as the port has no whole-tenant read, backing-object read or automatic delete with a reason; another store kind
|
|
23
|
+
// answers 501 at the open. Port groups for them once a served store must audit.
|
|
24
|
+
/** The caller's memories run through the quality audit; a memory that backs an object is never marked for removal. */
|
|
25
|
+
export function auditMemoryQuality(ctx) {
|
|
26
|
+
return auditMemories(loadAllEntries(ctx.hippoRoot, ctx.tenantId), memoriesBackingObjects(ctx.hippoRoot));
|
|
27
|
+
}
|
|
28
|
+
/** Audit repair for the caller's tenant: a preview, or with `apply` the moves of certain defects to dormant storage behind a backup. */
|
|
29
|
+
export function repairMemoryQuality(ctx, apply) {
|
|
30
|
+
return repairAutomaticMemories(ctx.hippoRoot, { tenantId: ctx.tenantId, apply });
|
|
31
|
+
}
|
|
32
|
+
/** The repair sleep and the daily runner apply once per store after an upgrade; null when it already ran there. */
|
|
33
|
+
export function repairMemoryQualityOnce(ctx) {
|
|
34
|
+
return repairQualityOnce(ctx.hippoRoot, ctx.tenantId);
|
|
35
|
+
}
|
|
36
|
+
/** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
|
|
37
|
+
export function computeCutoff(days, now = new Date()) {
|
|
38
|
+
const cutoff = new Date(now.getTime() - days * DAY_MS);
|
|
39
|
+
return cutoff.toISOString();
|
|
40
|
+
}
|
|
41
|
+
/** Delete the caller's tenant's audit_log rows older than `olderThanDays`, then record an `audit_prune` row as `ctx.actor`; opt-in, since
|
|
42
|
+
* retention floors (HIPAA, SOX, GDPR) apply. The row is written after the DELETE, so a call never prunes its own record.
|
|
43
|
+
* Throws on non-positive days or an empty tenant. */
|
|
44
|
+
export function pruneAuditLog(ctx, opts) {
|
|
45
|
+
if (!Number.isFinite(opts.olderThanDays) || opts.olderThanDays <= 0) {
|
|
46
|
+
throw new Error(`pruneAuditLog: olderThanDays must be a positive number, got ${opts.olderThanDays}`);
|
|
47
|
+
}
|
|
48
|
+
if (!ctx.tenantId) {
|
|
49
|
+
throw new Error('pruneAuditLog: tenantId is required');
|
|
50
|
+
}
|
|
51
|
+
const dryRun = opts.dryRun === true;
|
|
52
|
+
const cutoff = computeCutoff(opts.olderThanDays);
|
|
53
|
+
const count = pruneAuditRows(ctx.hippoRoot, { tenantId: ctx.tenantId, cutoff, actor: ctx.actor.subject, olderThanDays: opts.olderThanDays, dryRun });
|
|
54
|
+
return { cutoff, count, dryRun };
|
|
16
55
|
}
|
|
17
56
|
//# sourceMappingURL=audit.js.map
|
package/dist/api/auth.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type ApiKeyListRow } from '../store/auth.js';
|
|
1
|
+
import { DEFAULT_KEY_TTL_DAYS, type ApiKeyListItem, type ApiKeyListRow } from '../store/auth.js';
|
|
2
2
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
3
|
-
import type
|
|
3
|
+
import { type Context, type StoreReply } from './types.js';
|
|
4
4
|
export interface AuthCreateOpts {
|
|
5
5
|
label?: string;
|
|
6
6
|
/** Defaults to `'member'`, which admin-gated routes such as `POST /v1/sleep` refuse; an admin key has to be asked for by name. */
|
|
@@ -22,6 +22,8 @@ export interface AuthCreateResult {
|
|
|
22
22
|
/** Mints a key always bound to `ctx.tenantId`; opts cannot override the tenant, or tenant A could mint a key for tenant B.
|
|
23
23
|
* Admin only (ForbiddenError otherwise), and a key never outranks its minter: a resolver admin is tenant-only, so it mints members. */
|
|
24
24
|
export declare function authCreate<C extends Context>(ctx: C, opts: AuthCreateOpts): StoreReply<C, AuthCreateResult>;
|
|
25
|
+
export { DEFAULT_KEY_TTL_DAYS };
|
|
26
|
+
export declare const MAX_TTL_DAYS = 3650;
|
|
25
27
|
export interface AuthCreateSelfOpts {
|
|
26
28
|
label?: string;
|
|
27
29
|
/** Days until the new key expires. */
|
|
@@ -43,6 +45,8 @@ type KeyListOpts = {
|
|
|
43
45
|
};
|
|
44
46
|
/** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from. */
|
|
45
47
|
export declare function authListRows<C extends Context>(ctx: C, opts: KeyListOpts): StoreReply<C, ApiKeyListRow[]>;
|
|
48
|
+
/** Every tenant's keys in the store, live ones only unless `active` is false; the host's own view, so the host admin only. */
|
|
49
|
+
export declare function authListAllTenants(ctx: Context, active: boolean): ApiKeyListItem[];
|
|
46
50
|
export interface AuthRevokeResult {
|
|
47
51
|
ok: true;
|
|
48
52
|
revokedAt: string;
|
|
@@ -53,7 +57,7 @@ export type AuthRevokeReply<C extends Context> = StoreReply<C, AuthRevokeResult>
|
|
|
53
57
|
export declare function authRevoke<C extends Context>(ctx: C, keyId: string): AuthRevokeReply<C>;
|
|
54
58
|
/** The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
|
|
55
59
|
* so the local CLI can run revoke and grant in the key's own tenant. */
|
|
56
|
-
export declare function authKeyTenant(ctx: Context, keyId: string): string | undefined
|
|
60
|
+
export declare function authKeyTenant(ctx: Context, keyId: string): Promise<string | undefined>;
|
|
57
61
|
/** Shared result shape for authGrant/authUngrant, named per the file's oxlint anti-slop rule. */
|
|
58
62
|
export interface AuthGrantResult {
|
|
59
63
|
ok: true;
|
|
@@ -62,5 +66,4 @@ export interface AuthGrantResult {
|
|
|
62
66
|
export declare function authGrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
|
|
63
67
|
/** Revoke `keyId`'s grant on `scope`. Same authorization and lookup rules as authGrant. */
|
|
64
68
|
export declare function authUngrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
|
|
65
|
-
export {};
|
|
66
69
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/api/auth.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// API key management: create, list, revoke, and grant or ungrant restricted scopes.
|
|
2
2
|
import { BadRequestError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
3
|
-
import { mintApiKey, } from '../store/auth.js';
|
|
3
|
+
import { DEFAULT_KEY_TTL_DAYS, listApiKeys, mintApiKey, } from '../store/auth.js';
|
|
4
|
+
import { storeFor } from '../store/index.js';
|
|
4
5
|
import { changeScopeGrant } from '../store/sqlite/local.js';
|
|
5
|
-
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
6
6
|
import { DAY_MS } from '../util/time.js';
|
|
7
7
|
import { andThen, notPorted, onStore } from './on-store.js';
|
|
8
|
+
import { requireHostAdmin } from './types.js';
|
|
8
9
|
const API_KEY_SUBJECT = 'api_key:';
|
|
9
10
|
/** The key id an API-key actor's subject names, or null for any other actor. */
|
|
10
11
|
function keyIdOfSubject(subject) {
|
|
@@ -25,10 +26,9 @@ function newKey(ctx, fields) {
|
|
|
25
26
|
const { keyId, plaintext, keyHash } = mintApiKey();
|
|
26
27
|
return { plaintext, key: { ...fields, keyId, keyHash, tenantId: ctx.tenantId, createdAt: new Date().toISOString() } };
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
const DEFAULT_KEY_TTL_DAYS = 90;
|
|
29
|
+
export { DEFAULT_KEY_TTL_DAYS };
|
|
30
30
|
// The ceiling keeps toISOString in range.
|
|
31
|
-
const MAX_TTL_DAYS = 3650;
|
|
31
|
+
export const MAX_TTL_DAYS = 3650;
|
|
32
32
|
/** A 400, not a RangeError, since the caller of the mint chose these. */
|
|
33
33
|
function mintExpiry({ ttlDays, noExpiry }) {
|
|
34
34
|
if (noExpiry && ttlDays !== undefined) {
|
|
@@ -100,6 +100,11 @@ function selfResult({ key }, plaintext) {
|
|
|
100
100
|
export function authListRows(ctx, opts) {
|
|
101
101
|
return onStore(ctx, (port) => listRows(ctx, port, opts));
|
|
102
102
|
}
|
|
103
|
+
/** Every tenant's keys in the store, live ones only unless `active` is false; the host's own view, so the host admin only. */
|
|
104
|
+
export function authListAllTenants(ctx, active) {
|
|
105
|
+
requireHostAdmin(ctx, "Listing every tenant's keys");
|
|
106
|
+
return listApiKeys(ctx.hippoRoot, { active });
|
|
107
|
+
}
|
|
103
108
|
function listRows(ctx, port, opts) {
|
|
104
109
|
const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
|
|
105
110
|
const keyId = memberKeyIdOf(ctx.actor);
|
|
@@ -160,12 +165,11 @@ function keyOwnerOf(record) {
|
|
|
160
165
|
}
|
|
161
166
|
/** The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
|
|
162
167
|
* so the local CLI can run revoke and grant in the key's own tenant. */
|
|
163
|
-
export function authKeyTenant(ctx, keyId) {
|
|
168
|
+
export async function authKeyTenant(ctx, keyId) {
|
|
164
169
|
if (!ctx.actor.hostAdmin) {
|
|
165
170
|
throw new ForbiddenError('Only the host admin can look up a key across tenants');
|
|
166
171
|
}
|
|
167
|
-
|
|
168
|
-
return sqliteSyncStore(ctx.hippoRoot).findApiKey(keyId)?.tenantId;
|
|
172
|
+
return (await storeFor(ctx).findApiKey(keyId))?.tenantId;
|
|
169
173
|
}
|
|
170
174
|
/** Grant `keyId` read access to one restricted `scope`. Admin only. */
|
|
171
175
|
export function authGrant(ctx, keyId, scope) {
|
package/dist/api/auto-sleep.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { HippoConfig } from '../core/config.js';
|
|
2
2
|
export declare const autoSleepInFlight: Set<string>;
|
|
3
|
+
/** Runs one auto-sleep consolidation of `hippoRoot`: the HTTP server passes one that runs it off its event loop, in a child process. */
|
|
4
|
+
export type AutoSleepRunner = (hippoRoot: string) => Promise<void>;
|
|
3
5
|
export interface AutoSleepDue {
|
|
4
6
|
enabled: boolean;
|
|
5
7
|
count: number;
|
|
@@ -8,6 +10,7 @@ export interface AutoSleepDue {
|
|
|
8
10
|
}
|
|
9
11
|
/** Counts only when enabled: the count opens the store. */
|
|
10
12
|
export declare function autoSleepDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep']): AutoSleepDue;
|
|
11
|
-
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
|
|
12
|
-
|
|
13
|
+
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
|
|
14
|
+
* Without `run`, it runs in process. */
|
|
15
|
+
export declare function startAutoSleepIfDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep'], allowed: boolean, run?: AutoSleepRunner): void;
|
|
13
16
|
//# sourceMappingURL=auto-sleep.d.ts.map
|
package/dist/api/auto-sleep.js
CHANGED
|
@@ -11,8 +11,9 @@ export function autoSleepDue(hippoRoot, tenantId, config) {
|
|
|
11
11
|
const count = enabled ? countCreatedSinceLastSleep(hippoRoot, tenantId) : 0;
|
|
12
12
|
return { enabled, count, threshold, due: enabled && count >= threshold };
|
|
13
13
|
}
|
|
14
|
-
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
|
|
15
|
-
|
|
14
|
+
/** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
|
|
15
|
+
* Without `run`, it runs in process. */
|
|
16
|
+
export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed, run) {
|
|
16
17
|
if (!allowed ||
|
|
17
18
|
!config.enabled ||
|
|
18
19
|
tenantId !== resolveTenantId({}) ||
|
|
@@ -23,7 +24,10 @@ export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed) {
|
|
|
23
24
|
// Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
|
|
24
25
|
// Its own scope: the call's closes a handle the sleep still holds across its pauses, but the caller's lock wait carries over.
|
|
25
26
|
const busyWaitMs = scopedBusyWait();
|
|
26
|
-
|
|
27
|
+
const started = run
|
|
28
|
+
? run(hippoRoot)
|
|
29
|
+
: outsideRequestStores(() => runWithRequestStores(() => consolidate(hippoRoot), { busyWaitMs }));
|
|
30
|
+
started
|
|
27
31
|
.catch((err) => {
|
|
28
32
|
log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${errorMessage(err)}`, errorFields(err));
|
|
29
33
|
})
|
package/dist/api/availability.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { DAY_MS } from '../util/time.js';
|
|
1
|
+
import { DAY_MS, HOUR_MS } from '../util/time.js';
|
|
2
2
|
export const DEFAULT_RECENCY_WINDOW_MS = DAY_MS;
|
|
3
3
|
export const DEFAULT_RECENT_FRACTION_THRESHOLD = 0.7;
|
|
4
4
|
export const DEFAULT_MIN_RETURNED = 3;
|
|
5
5
|
export const DEFAULT_MIN_POOL = 10;
|
|
6
6
|
export const DEFAULT_MIN_OLDER_PASSED_OVER = 3;
|
|
7
|
-
const MS_PER_HOUR = 60 * 60 * 1000;
|
|
8
7
|
function median(nums) {
|
|
9
8
|
if (nums.length === 0)
|
|
10
9
|
return 0;
|
|
@@ -43,7 +42,7 @@ export function detectAvailabilityBias(opts) {
|
|
|
43
42
|
if (olderCandidatesPassedOver < minOlderPassedOver)
|
|
44
43
|
return null;
|
|
45
44
|
const pct = Math.round(recentFraction * 100);
|
|
46
|
-
const windowHours = Math.round(recencyWindowMs /
|
|
45
|
+
const windowHours = Math.round(recencyWindowMs / HOUR_MS);
|
|
47
46
|
const summary = `Availability bias risk: ${recentCount} of ${topK.length} returned results are from the ` +
|
|
48
47
|
`last ${windowHours}h (${pct}%), but ${olderCandidatesPassedOver} older matched memories ` +
|
|
49
48
|
`were passed over. Returned median age ${topKMedianAgeDays.toFixed(1)}d vs pool median ` +
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Card, CardComment, CardRun, CardStatus } from '../core/card.js';
|
|
2
|
+
import type { HandoffOutcome } from '../core/handoff.js';
|
|
3
|
+
import { type CardDetail } from '../store/card-detail.js';
|
|
4
|
+
import type { Context } from './types.js';
|
|
5
|
+
/** Create a card in the caller's tenant. Throws on an empty title or an unknown dependency. */
|
|
6
|
+
export declare function cardCreate(ctx: Context, input: {
|
|
7
|
+
title: string;
|
|
8
|
+
repo?: string;
|
|
9
|
+
contract?: string;
|
|
10
|
+
budget?: number;
|
|
11
|
+
dependsOn?: string[];
|
|
12
|
+
}): Card;
|
|
13
|
+
/** One card by id, or null when the caller's tenant has none. */
|
|
14
|
+
export declare function cardLoad(ctx: Context, id: string): Card | null;
|
|
15
|
+
/** The card with its dependencies, runs, comments and latest handoff, or null when unknown. */
|
|
16
|
+
export declare function cardDetail(ctx: Context, id: string): CardDetail | null;
|
|
17
|
+
/** The caller's cards, newest-updated first, optionally filtered to one status. */
|
|
18
|
+
export declare function cardList(ctx: Context, opts?: {
|
|
19
|
+
status?: CardStatus;
|
|
20
|
+
}): Card[];
|
|
21
|
+
/** Every run of a card, newest first. */
|
|
22
|
+
export declare function cardRuns(ctx: Context, id: string): CardRun[];
|
|
23
|
+
/** Claim a ready or blocked card for a runtime; null when it cannot be claimed. */
|
|
24
|
+
export declare function cardClaim(ctx: Context, id: string, runtime: string, sessionId?: string): (Card & {
|
|
25
|
+
runId: number;
|
|
26
|
+
}) | null;
|
|
27
|
+
/** Extend a live run's lease; null when the run is not live. */
|
|
28
|
+
export declare function cardHeartbeat(ctx: Context, id: string, runId: number): Card | null;
|
|
29
|
+
/** Block a running card with a reason; null when it is not running. */
|
|
30
|
+
export declare function cardBlock(ctx: Context, id: string, reason: string, runId?: number): Card | null;
|
|
31
|
+
/** Move a running card to review; null when it is not running. */
|
|
32
|
+
export declare function cardReview(ctx: Context, id: string, runId?: number): Card | null;
|
|
33
|
+
/** Complete a card in review and promote the children it unblocks; null when not in review. */
|
|
34
|
+
export declare function cardComplete(ctx: Context, id: string, outcome: HandoffOutcome, runId?: number): {
|
|
35
|
+
card: Card;
|
|
36
|
+
promotedChildren: string[];
|
|
37
|
+
} | null;
|
|
38
|
+
/** Return every card with an expired lease to ready; yields the reclaimed ids. */
|
|
39
|
+
export declare function cardReclaimExpired(ctx: Context): string[];
|
|
40
|
+
/** Add a comment to a card. Throws on an empty body. */
|
|
41
|
+
export declare function cardComment(ctx: Context, cardId: string, author: string, body: string): CardComment;
|
|
42
|
+
//# sourceMappingURL=cards.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// The agent work board: create, claim, review and complete cards, scoped to the caller's tenant.
|
|
2
|
+
import { addCardComment, blockCard, claimCard, completeCard, createCard, heartbeatCard, listCards, loadCard, loadCardRuns, reclaimExpiredCards, reviewCard, } from '../store/cards.js';
|
|
3
|
+
import { loadCardDetail } from '../store/card-detail.js';
|
|
4
|
+
/** Create a card in the caller's tenant. Throws on an empty title or an unknown dependency. */
|
|
5
|
+
export function cardCreate(ctx, input) {
|
|
6
|
+
return createCard(ctx.hippoRoot, ctx.tenantId, input);
|
|
7
|
+
}
|
|
8
|
+
/** One card by id, or null when the caller's tenant has none. */
|
|
9
|
+
export function cardLoad(ctx, id) {
|
|
10
|
+
return loadCard(ctx.hippoRoot, ctx.tenantId, id);
|
|
11
|
+
}
|
|
12
|
+
/** The card with its dependencies, runs, comments and latest handoff, or null when unknown. */
|
|
13
|
+
export function cardDetail(ctx, id) {
|
|
14
|
+
return loadCardDetail(ctx.hippoRoot, ctx.tenantId, id);
|
|
15
|
+
}
|
|
16
|
+
/** The caller's cards, newest-updated first, optionally filtered to one status. */
|
|
17
|
+
export function cardList(ctx, opts = {}) {
|
|
18
|
+
return listCards(ctx.hippoRoot, ctx.tenantId, opts);
|
|
19
|
+
}
|
|
20
|
+
/** Every run of a card, newest first. */
|
|
21
|
+
export function cardRuns(ctx, id) {
|
|
22
|
+
return loadCardRuns(ctx.hippoRoot, ctx.tenantId, id);
|
|
23
|
+
}
|
|
24
|
+
/** Claim a ready or blocked card for a runtime; null when it cannot be claimed. */
|
|
25
|
+
export function cardClaim(ctx, id, runtime, sessionId) {
|
|
26
|
+
return claimCard(ctx.hippoRoot, ctx.tenantId, id, runtime, sessionId);
|
|
27
|
+
}
|
|
28
|
+
/** Extend a live run's lease; null when the run is not live. */
|
|
29
|
+
export function cardHeartbeat(ctx, id, runId) {
|
|
30
|
+
return heartbeatCard(ctx.hippoRoot, ctx.tenantId, id, runId);
|
|
31
|
+
}
|
|
32
|
+
/** Block a running card with a reason; null when it is not running. */
|
|
33
|
+
export function cardBlock(ctx, id, reason, runId) {
|
|
34
|
+
return blockCard(ctx.hippoRoot, ctx.tenantId, id, reason, runId);
|
|
35
|
+
}
|
|
36
|
+
/** Move a running card to review; null when it is not running. */
|
|
37
|
+
export function cardReview(ctx, id, runId) {
|
|
38
|
+
return reviewCard(ctx.hippoRoot, ctx.tenantId, id, runId);
|
|
39
|
+
}
|
|
40
|
+
/** Complete a card in review and promote the children it unblocks; null when not in review. */
|
|
41
|
+
export function cardComplete(ctx, id, outcome, runId) {
|
|
42
|
+
return completeCard(ctx.hippoRoot, ctx.tenantId, id, outcome, runId);
|
|
43
|
+
}
|
|
44
|
+
/** Return every card with an expired lease to ready; yields the reclaimed ids. */
|
|
45
|
+
export function cardReclaimExpired(ctx) {
|
|
46
|
+
return reclaimExpiredCards(ctx.hippoRoot, ctx.tenantId);
|
|
47
|
+
}
|
|
48
|
+
/** Add a comment to a card. Throws on an empty body. */
|
|
49
|
+
export function cardComment(ctx, cardId, author, body) {
|
|
50
|
+
return addCardComment(ctx.hippoRoot, ctx.tenantId, cardId, author, body);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MemoryConflict } from '../store/rows.js';
|
|
2
|
+
import type { CallerProject } from './prompt-hook.js';
|
|
3
|
+
import { type Context } from './types.js';
|
|
4
|
+
import type { TenantReach } from './memories.js';
|
|
5
|
+
export interface ResolveMemoryConflictOpts {
|
|
6
|
+
/** One of the conflict's two memories; the other is the loser. */
|
|
7
|
+
keepId: string;
|
|
8
|
+
/** Delete the loser instead of halving its half-life. */
|
|
9
|
+
forget?: boolean;
|
|
10
|
+
/** Tombstone the loser's value as well, which removes it whatever `forget` says. */
|
|
11
|
+
rejectLoser?: boolean;
|
|
12
|
+
/** Kept on the tombstone; a conflict-context reason when unset. */
|
|
13
|
+
reason?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ResolveMemoryConflictResult {
|
|
16
|
+
conflictId: number;
|
|
17
|
+
keptId: string;
|
|
18
|
+
loserId: string;
|
|
19
|
+
}
|
|
20
|
+
/** Keeps `keepId` and weakens, deletes or rejects the other side of an open conflict in the caller's tenant, auditing as `ctx.actor`.
|
|
21
|
+
* NotFound: missing, untouchable or no longer live. Conflict: already resolved. BadRequest: `keepId` outside the pair. */
|
|
22
|
+
export declare function resolveMemoryConflict(ctx: Context, conflictId: number, opts: ResolveMemoryConflictOpts): ResolveMemoryConflictResult;
|
|
23
|
+
/** Open conflicts whose two rows the caller may touch; with `project`, only pairs it could also recall:
|
|
24
|
+
* its repo or user-global, and no scope it was not asked for. */
|
|
25
|
+
export declare function listOpenConflicts(ctx: Context, project?: CallerProject): MemoryConflict[];
|
|
26
|
+
/** Conflicts with `status` ('*' for any) in reach, with no scope filter: the host's own view, so the host admin only. */
|
|
27
|
+
export declare function listConflicts(ctx: Context, status: string, reach?: TenantReach): MemoryConflict[];
|
|
28
|
+
//# sourceMappingURL=conflicts.d.ts.map
|