hippo-memory 1.71.0 → 2.0.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 +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- 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 +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- 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-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- 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 +3 -2
- 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 +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- 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 +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- 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 +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- 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 +2 -2
- package/dist/api/types.d.ts +3 -7
- 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 +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- 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 +3 -2
- package/dist/capture/session-worker.js +22 -10
- 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 +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- 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 +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- 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 +7 -285
- 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 +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- 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/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/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- 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 +174 -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 +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- 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 +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -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 +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- 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 +9 -6
- package/dist/consolidate/traces.js +5 -5
- 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 +22 -18
- 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 +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- 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 +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- 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.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- 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 +19 -25
- 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/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- 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 +10 -4
- 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 +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- 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.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- 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 +22 -20
- package/dist/mcp/stdio.js +37 -16
- 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 +71 -98
- 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 +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -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 +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- 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 -133
- 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 +19 -40
- 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/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- 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 +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- 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 +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- 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 +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- 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 +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- 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 +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- 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/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- 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/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- 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 +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- 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 +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -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 +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- 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 +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- 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 +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -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 +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- 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/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -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 +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- 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/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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Conflict resolution for every front end, so the reach, status, pair and liveness checks live in one place.
|
|
2
|
+
// SHORTCUT: hippo.db only, since the store port has no conflict calls; a conflicts group when a served store needs them.
|
|
3
|
+
import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
4
|
+
import { listMemoryConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
|
+
import { loadEntriesByIds } from '../store/entry-reads.js';
|
|
6
|
+
import { chunked } from '../util/chunked.js';
|
|
7
|
+
import { passesScopeFilterForRecall, personalScopeOf } from '../core/recall-scope.js';
|
|
8
|
+
import { classifyOriginProject } from '../core/project-identity.js';
|
|
9
|
+
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
10
|
+
import { requireHostAdmin } from './types.js';
|
|
11
|
+
function isLive(entry) {
|
|
12
|
+
return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
|
|
13
|
+
}
|
|
14
|
+
/** Keeps `keepId` and weakens, deletes or rejects the other side of an open conflict in the caller's tenant, auditing as `ctx.actor`.
|
|
15
|
+
* NotFound: missing, untouchable or no longer live. Conflict: already resolved. BadRequest: `keepId` outside the pair. */
|
|
16
|
+
export function resolveMemoryConflict(ctx, conflictId, opts) {
|
|
17
|
+
// Read with every status, so a resolved conflict answers 409 while one holding another person's personal row stays a 404.
|
|
18
|
+
const conflict = listTouchableConflicts(ctx.hippoRoot, '*', ctx.tenantId, ctx.actor).find((c) => c.id === conflictId);
|
|
19
|
+
if (!conflict)
|
|
20
|
+
throw new NotFoundError(`conflict not found: ${conflictId}`);
|
|
21
|
+
if (conflict.status !== 'open')
|
|
22
|
+
throw new ConflictError(`conflict ${conflictId} is already resolved`);
|
|
23
|
+
const pair = [conflict.memory_a_id, conflict.memory_b_id];
|
|
24
|
+
if (!pair.includes(opts.keepId))
|
|
25
|
+
throw new BadRequestError(`keep must be one of the two memories in conflict ${conflictId}: ${pair.join(', ')}`);
|
|
26
|
+
if (loadEntriesByIds(ctx.hippoRoot, pair, ctx.tenantId).filter(isLive).length < pair.length) {
|
|
27
|
+
throw new NotFoundError(`conflict ${conflictId} names a memory that is superseded, archived or quarantined`);
|
|
28
|
+
}
|
|
29
|
+
const resolved = resolveConflict(ctx.hippoRoot, { conflictId, keepId: opts.keepId, forgetLoser: opts.forget === true, tenantId: ctx.tenantId }, {
|
|
30
|
+
rejectLoserValue: opts.rejectLoser === true,
|
|
31
|
+
reason: opts.reason,
|
|
32
|
+
rejectedBy: ctx.actor.subject,
|
|
33
|
+
});
|
|
34
|
+
// Every check passed above, so null here is another resolver getting there first.
|
|
35
|
+
if (resolved === null)
|
|
36
|
+
throw new ConflictError(`conflict ${conflictId} is already resolved`);
|
|
37
|
+
return { conflictId, keptId: opts.keepId, loserId: resolved.loserId };
|
|
38
|
+
}
|
|
39
|
+
/** Open conflicts whose two rows the caller may touch; with `project`, only pairs it could also recall:
|
|
40
|
+
* its repo or user-global, and no scope it was not asked for. */
|
|
41
|
+
export function listOpenConflicts(ctx, project) {
|
|
42
|
+
const touchable = listTouchableConflicts(ctx.hippoRoot, 'open', ctx.tenantId, ctx.actor);
|
|
43
|
+
if (!project)
|
|
44
|
+
return touchable;
|
|
45
|
+
const own = personalScopeOf(ctx.actor);
|
|
46
|
+
const ids = [...new Set(touchable.flatMap((c) => [c.memory_a_id, c.memory_b_id]))];
|
|
47
|
+
// loadEntriesByIds reads at most one chunk of ids per call.
|
|
48
|
+
const rows = new Map(chunked(ids).flatMap((chunk) => loadEntriesByIds(ctx.hippoRoot, chunk, ctx.tenantId)).map((row) => [row.id, row]));
|
|
49
|
+
const shown = (id) => {
|
|
50
|
+
const row = rows.get(id);
|
|
51
|
+
return row !== undefined && classifyOriginProject(row.origin_project, project) !== 'cross-project'
|
|
52
|
+
&& passesScopeFilterForRecall(row.scope ?? null, undefined, own);
|
|
53
|
+
};
|
|
54
|
+
return touchable.filter((c) => shown(c.memory_a_id) && shown(c.memory_b_id));
|
|
55
|
+
}
|
|
56
|
+
/** Conflicts with `status` ('*' for any) in reach, with no scope filter: the host's own view, so the host admin only. */
|
|
57
|
+
export function listConflicts(ctx, status, reach = {}) {
|
|
58
|
+
requireHostAdmin(ctx, 'Listing conflicts past the scope check');
|
|
59
|
+
return listMemoryConflicts(ctx.hippoRoot, status, reach.everyTenant ? undefined : ctx.tenantId);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=conflicts.js.map
|
package/dist/api/context-auto.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execFileSync } from 'child_process';
|
|
2
|
+
import { errorFields, log } from '../util/log.js';
|
|
2
3
|
const MAX_DIFF_TERMS = 10;
|
|
3
4
|
const SKIPPED_PATH_TERMS = ['src', 'dist', 'test', 'tests', 'node_modules', 'index'];
|
|
4
5
|
// stderr is dropped because git's warnings (line-ending notices, for one) would otherwise become query terms.
|
|
@@ -23,8 +24,9 @@ export function autoDetectContext() {
|
|
|
23
24
|
return branch.replace(/[-_/]/g, ' ');
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
catch {
|
|
27
|
-
// Not a git repo or
|
|
27
|
+
catch (err) {
|
|
28
|
+
// Not a git repo, git missing or a timeout: no query, so the caller lists by strength.
|
|
29
|
+
log.debug('auto context: no git-derived query', errorFields(err));
|
|
28
30
|
}
|
|
29
31
|
return '';
|
|
30
32
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// The strings a context block prints. The budget prices these same strings, so selection and print cannot drift.
|
|
2
|
+
import { MINUTE_MS } from '../util/time.js';
|
|
2
3
|
import { calculateStrength, confidenceFacets, confidenceLabel } from '../core/memory.js';
|
|
3
|
-
import { evalNow } from '../core/ablation.js';
|
|
4
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
4
5
|
import { estimateTokens } from '../util/token-text.js';
|
|
5
6
|
import { renderAmbientSummary } from '../core/ambient.js';
|
|
6
7
|
import { formatHandoffEvidenceLine } from '../core/handoff.js';
|
|
@@ -56,7 +57,7 @@ export function sessionTrailText(events) {
|
|
|
56
57
|
// Each trail event is capped only in the compact-resume block, so other trail prints keep full content.
|
|
57
58
|
export const COMPACT_RESUME_EVENT_CONTENT_CAP = 400;
|
|
58
59
|
// A snapshot older than this was not written for this compaction (pre-compact skipped), so restoring it is stale, not a resume.
|
|
59
|
-
export const COMPACT_RESUME_MAX_AGE_MS = 15 *
|
|
60
|
+
export const COMPACT_RESUME_MAX_AGE_MS = 15 * MINUTE_MS;
|
|
60
61
|
/** The block compact-resume hands the model; events arrive already capped. */
|
|
61
62
|
export function compactResumeText(snapshot, events) {
|
|
62
63
|
return [
|
|
@@ -71,7 +72,7 @@ export function compactResumeText(snapshot, events) {
|
|
|
71
72
|
export function contextHeading(heading, entries, tokens) {
|
|
72
73
|
return `## ${heading} (${entries} entries, ${tokens} tokens)\n`;
|
|
73
74
|
}
|
|
74
|
-
export function contextLine(item, framing, showStrength, now, strengthPct = Math.round(calculateStrength(item.entry) * 100)) {
|
|
75
|
+
export function contextLine(item, framing, showStrength, now, strengthPct = Math.round(calculateStrength(item.entry, undefined, { ablation: strengthAblation() }) * 100)) {
|
|
75
76
|
const e = item.entry;
|
|
76
77
|
const tagStr = e.tags.length > 0 ? ` [${e.tags.join(', ')}]` : '';
|
|
77
78
|
const strengthStr = showStrength ? ` (${strengthPct}%)` : '';
|
|
@@ -5,19 +5,18 @@ import { calculateStrength } from '../core/memory.js';
|
|
|
5
5
|
import { auditQueryFields, recordAuditEvent } from '../store/audit.js';
|
|
6
6
|
import { isWorthSurfacing } from '../core/memory-quality.js';
|
|
7
7
|
import { rankBothStores } from '../sharing/search-both.js';
|
|
8
|
-
import { evalNow } from '../core/ablation.js';
|
|
9
|
-
import {
|
|
10
|
-
import { physicsSearch } from '../search/physics-search.js';
|
|
8
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
9
|
+
import { searchByEngine } from '../search/engine.js';
|
|
11
10
|
import { DEFAULT_LOCAL_BUMP } from '../core/search-types.js';
|
|
12
11
|
import { compareScoredResults } from '../core/compare.js';
|
|
13
|
-
import { scopeMatch } from '../
|
|
12
|
+
import { scopeMatch } from '../core/active-scope.js';
|
|
14
13
|
import { scopeBoostFor } from '../search/boosts.js';
|
|
15
14
|
import { promptTokens, contentTokens, gatePromptRecall, } from '../core/prompt-recall.js';
|
|
16
15
|
const GLOBAL_DISCOUNT = 1 / DEFAULT_LOCAL_BUMP;
|
|
17
16
|
// Share and promote copy a memory to the global store under a new id, so equal content is the only link.
|
|
18
17
|
// A pinned copy wins, then the stronger one after the ranking's own global discount; a tie keeps the local copy.
|
|
19
18
|
export function oneCopyPerMemory(local, global, now) {
|
|
20
|
-
const score = (e, isGlobal) => calculateStrength(e, now) * (isGlobal ? GLOBAL_DISCOUNT : 1);
|
|
19
|
+
const score = (e, isGlobal) => calculateStrength(e, now, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1);
|
|
21
20
|
const best = new Map();
|
|
22
21
|
const offer = (entry, isGlobal) => {
|
|
23
22
|
const held = best.get(entry.content);
|
|
@@ -77,7 +76,7 @@ function rankPinned(plan, pinnedLocal, pinnedGlobal, nowP) {
|
|
|
77
76
|
const scopeBoost = scopeBoostFor(scopeMatch(entry.tags, plan.activeScope));
|
|
78
77
|
return {
|
|
79
78
|
entry,
|
|
80
|
-
score: calculateStrength(entry, nowP) * (isGlobal ? GLOBAL_DISCOUNT : 1) * scopeBoost,
|
|
79
|
+
score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1) * scopeBoost,
|
|
81
80
|
tokens: plan.price(entry, isGlobal),
|
|
82
81
|
isGlobal,
|
|
83
82
|
};
|
|
@@ -200,7 +199,7 @@ function backfillRecent(plan, options) {
|
|
|
200
199
|
.slice(0, plan.includeRecent)
|
|
201
200
|
.map(({ entry, isGlobal }) => ({
|
|
202
201
|
entry,
|
|
203
|
-
score: calculateStrength(entry, nowP) * (isGlobal ? GLOBAL_DISCOUNT : 1),
|
|
202
|
+
score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1),
|
|
204
203
|
tokens: plan.price(entry, isGlobal),
|
|
205
204
|
isGlobal,
|
|
206
205
|
}));
|
|
@@ -213,7 +212,7 @@ export function selectStrongest(plan, left, pools) {
|
|
|
213
212
|
const localRanked = localPool
|
|
214
213
|
.map((e) => ({
|
|
215
214
|
entry: e,
|
|
216
|
-
score: calculateStrength(e, now),
|
|
215
|
+
score: calculateStrength(e, now, { ablation: strengthAblation() }),
|
|
217
216
|
tokens: plan.price(e, plan.primaryIsGlobal),
|
|
218
217
|
isGlobal: plan.primaryIsGlobal,
|
|
219
218
|
}))
|
|
@@ -221,7 +220,7 @@ export function selectStrongest(plan, left, pools) {
|
|
|
221
220
|
const globalRanked = globalPool
|
|
222
221
|
.map((e) => ({
|
|
223
222
|
entry: e,
|
|
224
|
-
score: calculateStrength(e, now) * GLOBAL_DISCOUNT,
|
|
223
|
+
score: calculateStrength(e, now, { ablation: strengthAblation() }) * GLOBAL_DISCOUNT,
|
|
225
224
|
tokens: plan.price(e, true),
|
|
226
225
|
isGlobal: true,
|
|
227
226
|
}))
|
|
@@ -279,26 +278,13 @@ async function searchLocalRows(ctx, plan, options) {
|
|
|
279
278
|
const localCost = cost && ((r) => price(r.entry, primaryIsGlobal));
|
|
280
279
|
const vectorCandidates = contextVectorSpec(ctx, plan, admit);
|
|
281
280
|
const store = plan.local.store;
|
|
282
|
-
const ctxResults = usePhysicsCtx
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
scope: plan.activeScope,
|
|
290
|
-
vectorCandidates,
|
|
291
|
-
store,
|
|
292
|
-
})
|
|
293
|
-
: await hybridSearch(query, localEntries, {
|
|
294
|
-
budget: left,
|
|
295
|
-
minResults,
|
|
296
|
-
cost: localCost,
|
|
297
|
-
hippoRoot: ctx.hippoRoot,
|
|
298
|
-
scope: plan.activeScope,
|
|
299
|
-
vectorCandidates,
|
|
300
|
-
store,
|
|
301
|
-
});
|
|
281
|
+
const ctxResults = await searchByEngine({ root: ctx.hippoRoot, store }, query, localEntries, usePhysicsCtx ? ctxConfig.physics : null, {
|
|
282
|
+
budget: left,
|
|
283
|
+
minResults,
|
|
284
|
+
cost: localCost,
|
|
285
|
+
scope: plan.activeScope,
|
|
286
|
+
vectorCandidates,
|
|
287
|
+
});
|
|
302
288
|
return ctxResults.map((r) => ({
|
|
303
289
|
entry: r.entry,
|
|
304
290
|
score: r.score,
|
package/dist/api/context.js
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
// Ambient context injection: the admission policy and getContext.
|
|
2
|
-
import { isInitialized } from '../store/open.js';
|
|
3
2
|
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
|
|
4
3
|
import { freshActiveSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS } from '../store/sessions.js';
|
|
5
4
|
import { estimateTokens } from '../util/token-text.js';
|
|
6
5
|
import { markRetrieved, COMPACTION_MEMORY_TAG } from '../core/memory.js';
|
|
7
6
|
import { isWorthSurfacing } from '../core/memory-quality.js';
|
|
8
7
|
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
9
|
-
import { evalNow } from '../core/ablation.js';
|
|
8
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
10
9
|
import { dropHeldCopies } from '../util/same-text.js';
|
|
11
10
|
import { BadRequestError } from '../core/api-errors.js';
|
|
12
11
|
import { isSharedStore, loadConfig } from '../core/config.js';
|
|
13
|
-
import { rethrowIfSqliteBlocked } from '../
|
|
12
|
+
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
14
13
|
import { errorMessage, log } from '../util/log.js';
|
|
15
|
-
import { resolveProjectIdentity, classifyOriginProject, isGlobalStoreRoot, projectId, projectNames } from '../core/project-identity.js';
|
|
14
|
+
import { resolveProjectIdentity, classifyOriginProject, isGlobalStoreRoot, isInitialized, projectId, projectNames, } from '../core/project-identity.js';
|
|
16
15
|
import { promptTokens } from '../core/prompt-recall.js';
|
|
17
16
|
import { detectSecret } from '../util/secret-detect.js';
|
|
18
17
|
import { isSessionDigestRow } from '../core/session-digest-row.js';
|
|
19
18
|
import { addAmbientTallies, ambientStateFromTallies } from '../core/ambient.js';
|
|
20
|
-
import { requireGroup, sqliteStore
|
|
21
|
-
import {
|
|
19
|
+
import { hasGroup, requireGroup, sqliteStore } from '../store/index.js';
|
|
20
|
+
import { storeFor } from '../store/sqlite/store.js';
|
|
21
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
22
22
|
import { finiteOr, selectBySearch, selectPinned, selectStrongest, } from './context-select.js';
|
|
23
|
-
import { andThen, onStore } from './on-store.js';
|
|
24
23
|
import { strengthenOf } from './recall-record.js';
|
|
25
24
|
import { ownerOrSubject } from './types.js';
|
|
26
25
|
export { oneCopyPerMemory } from './context-select.js';
|
|
@@ -55,7 +54,7 @@ function sourceOf(store) {
|
|
|
55
54
|
// The pinned-only branch needs pins and recent-N candidates, not the corpus.
|
|
56
55
|
async function loadAmbientEntries(source, tenantId, options) {
|
|
57
56
|
const { pinnedOnly, recent, admit, recheck, window, recall, onQualityDrop } = options;
|
|
58
|
-
const ownTenant = (e) => e.
|
|
57
|
+
const ownTenant = (e) => e.tenant_id === tenantId;
|
|
59
58
|
if (!pinnedOnly) {
|
|
60
59
|
const rows = 'query' in window
|
|
61
60
|
? await source.store.searchRecallEntries(window.query, {
|
|
@@ -140,7 +139,7 @@ function warnIsolationIgnored(hippoRoot) {
|
|
|
140
139
|
}
|
|
141
140
|
/** Which stores this read can draw on, and what kind the primary one is. */
|
|
142
141
|
function storesInReach(ctx, opts, local) {
|
|
143
|
-
const other = local.store
|
|
142
|
+
const other = hasGroup(local.store, 'localFiles') ? undefined : local.store;
|
|
144
143
|
// Global memories do not establish a project boundary for task state.
|
|
145
144
|
const hasLocal = other !== undefined || isInitialized(ctx.hippoRoot);
|
|
146
145
|
const globalRoot = getGlobalRoot();
|
|
@@ -222,7 +221,11 @@ function openBlockBudget(plan, opts, budget) {
|
|
|
222
221
|
if (!pinnedOnly)
|
|
223
222
|
obs?.queried(plan.query);
|
|
224
223
|
return cost
|
|
225
|
-
? Math.max(0, blockBudget - cost.fixed(blockBudget, {
|
|
224
|
+
? Math.max(0, blockBudget - cost.fixed(blockBudget, {
|
|
225
|
+
cross: plan.includeCrossProject,
|
|
226
|
+
promptRecall: promptRecallPending,
|
|
227
|
+
ambient: !pinnedOnly && config.ambient.enabled,
|
|
228
|
+
}))
|
|
226
229
|
: blockBudget;
|
|
227
230
|
}
|
|
228
231
|
const NO_TASK_STATE = { snapshot: null, handoff: null, events: [] };
|
|
@@ -360,7 +363,7 @@ async function traceEmptyContext(ctx, opts, plan) {
|
|
|
360
363
|
};
|
|
361
364
|
// The empty reply is already decided, so a lost trace is logged and the call still answers.
|
|
362
365
|
try {
|
|
363
|
-
await
|
|
366
|
+
await storeFor(ctx).finishRecall({ goalLog: [], audit: [], trace });
|
|
364
367
|
}
|
|
365
368
|
catch (error) {
|
|
366
369
|
rethrowIfSqliteBlocked(error);
|
|
@@ -370,7 +373,7 @@ async function traceEmptyContext(ctx, opts, plan) {
|
|
|
370
373
|
/** Strengthens and marks the returned rows, then writes the trace and index together. */
|
|
371
374
|
async function recordRetrieval(ctx, opts, plan, selected, activeSnapshot) {
|
|
372
375
|
const toUpdate = selected.map((s) => s.entry);
|
|
373
|
-
const updatedEntries = markRetrieved(toUpdate);
|
|
376
|
+
const updatedEntries = markRetrieved(toUpdate, undefined, { ablation: strengthAblation() });
|
|
374
377
|
const retrievedIds = updatedEntries.map((u) => u.id);
|
|
375
378
|
const trace = {
|
|
376
379
|
tenantId: ctx.tenantId,
|
|
@@ -384,11 +387,13 @@ async function recordRetrieval(ctx, opts, plan, selected, activeSnapshot) {
|
|
|
384
387
|
})),
|
|
385
388
|
};
|
|
386
389
|
const writes = { goalLog: [], audit: [], trace, strengthen: strengthenOf(ctx, retrievedIds) };
|
|
387
|
-
//
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
// The last recall feeds only outcomeForLastRecall, so a store that keeps none still finishes the recall without one.
|
|
391
|
+
const store = storeFor(ctx);
|
|
392
|
+
const traceId = store.lastRecall
|
|
393
|
+
? await store.lastRecall.finishRecall(writes, plan.hasGlobal ? plan.globalRoot : undefined)
|
|
394
|
+
: await store.finishRecall(writes).then(() => null);
|
|
395
|
+
plan.obs?.traced(traceId);
|
|
396
|
+
await store.bumpRecallStats(selected.length);
|
|
392
397
|
// Replace selectedItems entries with markRetrieved-updated copies so
|
|
393
398
|
// the returned ContextResult reflects post-recall state.
|
|
394
399
|
const items = selected.map((s) => ({
|
|
@@ -399,7 +404,13 @@ async function recordRetrieval(ctx, opts, plan, selected, activeSnapshot) {
|
|
|
399
404
|
return { items, ambientState: plan.config.ambient.enabled ? await readAmbientState(ctx, plan) : undefined };
|
|
400
405
|
}
|
|
401
406
|
async function readAmbientState(ctx, plan) {
|
|
402
|
-
const filter = {
|
|
407
|
+
const filter = {
|
|
408
|
+
exactScope: plan.exactScope,
|
|
409
|
+
ownScope: plan.ownScope,
|
|
410
|
+
project: plan.originProject,
|
|
411
|
+
currentProject: projectNames(plan.currentProject),
|
|
412
|
+
now: evalNow(),
|
|
413
|
+
};
|
|
403
414
|
const sources = [
|
|
404
415
|
...(plan.hasLocal ? [plan.local.reads] : []),
|
|
405
416
|
...(plan.hasGlobal && !plan.primaryIsGlobal ? [sourceOf(sqliteStore(plan.globalRoot)).reads] : []),
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { HandoffOutcome, SessionHandoff } from '../core/handoff.js';
|
|
2
|
+
import type { SessionEvent, TaskSnapshot } from '../store/rows.js';
|
|
3
|
+
import { appendSessionEvent, listSessionEvents, saveActiveTaskSnapshot } from '../store/sessions.js';
|
|
4
|
+
import { wmClear, wmFlush, wmPush, wmRead, type WorkingMemoryItem } from '../store/working-memory.js';
|
|
5
|
+
import type { Context } from './types.js';
|
|
6
|
+
/** What a snapshot save carries. */
|
|
7
|
+
export type SnapshotSaveInput = Parameters<typeof saveActiveTaskSnapshot>[2];
|
|
8
|
+
/** What a session event append carries. */
|
|
9
|
+
export type SessionEventAppendInput = Parameters<typeof appendSessionEvent>[2];
|
|
10
|
+
/** What a session event listing filters on. */
|
|
11
|
+
export type SessionEventListOpts = NonNullable<Parameters<typeof listSessionEvents>[2]>;
|
|
12
|
+
/** Save the caller's active task snapshot. */
|
|
13
|
+
export declare function snapshotSave(ctx: Context, input: SnapshotSaveInput): TaskSnapshot;
|
|
14
|
+
/** Clear the caller's active task snapshot; false when there was none. */
|
|
15
|
+
export declare function snapshotClear(ctx: Context, status: string): boolean;
|
|
16
|
+
/** The caller's active task snapshot, or null. */
|
|
17
|
+
export declare function snapshotLoad(ctx: Context): TaskSnapshot | null;
|
|
18
|
+
/** Append a session event in the caller's tenant. */
|
|
19
|
+
export declare function sessionEventAppend(ctx: Context, event: SessionEventAppendInput): SessionEvent;
|
|
20
|
+
/** List the caller's session events. */
|
|
21
|
+
export declare function sessionEventList(ctx: Context, opts: SessionEventListOpts): SessionEvent[];
|
|
22
|
+
export interface LatestContinuity {
|
|
23
|
+
snapshot: TaskSnapshot | null;
|
|
24
|
+
events: SessionEvent[];
|
|
25
|
+
}
|
|
26
|
+
/** The active snapshot plus recent events for `sessionId`, falling back to the snapshot's own session. */
|
|
27
|
+
export declare function continuityLatest(ctx: Context, opts: {
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
limit: number;
|
|
30
|
+
}): LatestContinuity;
|
|
31
|
+
/** Stamp the outcome on the caller's handoff for `sessionId`; returns the rows stamped. */
|
|
32
|
+
export declare function handoffStampOutcome(ctx: Context, sessionId: string, outcome: HandoffOutcome): number;
|
|
33
|
+
/** Save a session handoff in the caller's tenant. */
|
|
34
|
+
export declare function handoffSave(ctx: Context, handoff: Omit<SessionHandoff, 'updatedAt'>): SessionHandoff;
|
|
35
|
+
/** The caller's latest handoff, optionally for one session. */
|
|
36
|
+
export declare function handoffLatest(ctx: Context, sessionId?: string): SessionHandoff | null;
|
|
37
|
+
/** The caller's handoff by id, or null. */
|
|
38
|
+
export declare function handoffById(ctx: Context, id: number): SessionHandoff | null;
|
|
39
|
+
/** Push a working memory entry in the caller's tenant; returns its row id. */
|
|
40
|
+
export declare function workingMemoryPush(ctx: Context, opts: Omit<Parameters<typeof wmPush>[1], 'tenantId'>): number;
|
|
41
|
+
/** The caller's working memory entries, most important first. */
|
|
42
|
+
export declare function workingMemoryRead(ctx: Context, opts: Omit<NonNullable<Parameters<typeof wmRead>[1]>, 'tenantId'>): WorkingMemoryItem[];
|
|
43
|
+
/** Delete the caller's working memory entries; returns the count. */
|
|
44
|
+
export declare function workingMemoryClear(ctx: Context, opts: Omit<NonNullable<Parameters<typeof wmClear>[1]>, 'tenantId'>): number;
|
|
45
|
+
/** Flush the caller's working memory at session end; returns the count. */
|
|
46
|
+
export declare function workingMemoryFlush(ctx: Context, opts: Omit<NonNullable<Parameters<typeof wmFlush>[1]>, 'tenantId'>): number;
|
|
47
|
+
//# sourceMappingURL=continuity.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Where-you-left-off ops: task snapshot, session events, handoffs and working memory.
|
|
2
|
+
import { appendSessionEvent, clearActiveTaskSnapshot, listSessionEvents, loadActiveTaskSnapshot, saveActiveTaskSnapshot, } from '../store/sessions.js';
|
|
3
|
+
import { loadHandoffById, loadLatestHandoff, saveSessionHandoff, stampHandoffOutcome } from '../store/handoffs.js';
|
|
4
|
+
import { wmClear, wmFlush, wmPush, wmRead } from '../store/working-memory.js';
|
|
5
|
+
/** Save the caller's active task snapshot. */
|
|
6
|
+
export function snapshotSave(ctx, input) {
|
|
7
|
+
return saveActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, input);
|
|
8
|
+
}
|
|
9
|
+
/** Clear the caller's active task snapshot; false when there was none. */
|
|
10
|
+
export function snapshotClear(ctx, status) {
|
|
11
|
+
return clearActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, status);
|
|
12
|
+
}
|
|
13
|
+
/** The caller's active task snapshot, or null. */
|
|
14
|
+
export function snapshotLoad(ctx) {
|
|
15
|
+
return loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId);
|
|
16
|
+
}
|
|
17
|
+
/** Append a session event in the caller's tenant. */
|
|
18
|
+
export function sessionEventAppend(ctx, event) {
|
|
19
|
+
return appendSessionEvent(ctx.hippoRoot, ctx.tenantId, event);
|
|
20
|
+
}
|
|
21
|
+
/** List the caller's session events. */
|
|
22
|
+
export function sessionEventList(ctx, opts) {
|
|
23
|
+
return listSessionEvents(ctx.hippoRoot, ctx.tenantId, opts);
|
|
24
|
+
}
|
|
25
|
+
/** The active snapshot plus recent events for `sessionId`, falling back to the snapshot's own session. */
|
|
26
|
+
export function continuityLatest(ctx, opts) {
|
|
27
|
+
const snapshot = loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId);
|
|
28
|
+
const events = listSessionEvents(ctx.hippoRoot, ctx.tenantId, {
|
|
29
|
+
session_id: opts.sessionId || snapshot?.session_id || undefined,
|
|
30
|
+
limit: opts.limit,
|
|
31
|
+
});
|
|
32
|
+
return { snapshot, events };
|
|
33
|
+
}
|
|
34
|
+
/** Stamp the outcome on the caller's handoff for `sessionId`; returns the rows stamped. */
|
|
35
|
+
export function handoffStampOutcome(ctx, sessionId, outcome) {
|
|
36
|
+
return stampHandoffOutcome(ctx.hippoRoot, ctx.tenantId, sessionId, outcome);
|
|
37
|
+
}
|
|
38
|
+
/** Save a session handoff in the caller's tenant. */
|
|
39
|
+
export function handoffSave(ctx, handoff) {
|
|
40
|
+
return saveSessionHandoff(ctx.hippoRoot, ctx.tenantId, handoff);
|
|
41
|
+
}
|
|
42
|
+
/** The caller's latest handoff, optionally for one session. */
|
|
43
|
+
export function handoffLatest(ctx, sessionId) {
|
|
44
|
+
return loadLatestHandoff(ctx.hippoRoot, ctx.tenantId, sessionId);
|
|
45
|
+
}
|
|
46
|
+
/** The caller's handoff by id, or null. */
|
|
47
|
+
export function handoffById(ctx, id) {
|
|
48
|
+
return loadHandoffById(ctx.hippoRoot, ctx.tenantId, id);
|
|
49
|
+
}
|
|
50
|
+
/** Push a working memory entry in the caller's tenant; returns its row id. */
|
|
51
|
+
export function workingMemoryPush(ctx, opts) {
|
|
52
|
+
return wmPush(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
53
|
+
}
|
|
54
|
+
/** The caller's working memory entries, most important first. */
|
|
55
|
+
export function workingMemoryRead(ctx, opts) {
|
|
56
|
+
return wmRead(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
57
|
+
}
|
|
58
|
+
/** Delete the caller's working memory entries; returns the count. */
|
|
59
|
+
export function workingMemoryClear(ctx, opts) {
|
|
60
|
+
return wmClear(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
61
|
+
}
|
|
62
|
+
/** Flush the caller's working memory at session end; returns the count. */
|
|
63
|
+
export function workingMemoryFlush(ctx, opts) {
|
|
64
|
+
return wmFlush(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=continuity.js.map
|