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
|
@@ -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, opts.keepId, opts.forget === true, 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
|
|
@@ -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,19 @@ 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';
|
|
8
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
9
9
|
import { hybridSearch } from '../search/hybrid.js';
|
|
10
|
-
import {
|
|
10
|
+
import { physicsSearchIn } from '../search/physics-search.js';
|
|
11
11
|
import { DEFAULT_LOCAL_BUMP } from '../core/search-types.js';
|
|
12
12
|
import { compareScoredResults } from '../core/compare.js';
|
|
13
|
-
import { scopeMatch } from '../
|
|
13
|
+
import { scopeMatch } from '../core/active-scope.js';
|
|
14
14
|
import { scopeBoostFor } from '../search/boosts.js';
|
|
15
15
|
import { promptTokens, contentTokens, gatePromptRecall, } from '../core/prompt-recall.js';
|
|
16
16
|
const GLOBAL_DISCOUNT = 1 / DEFAULT_LOCAL_BUMP;
|
|
17
17
|
// Share and promote copy a memory to the global store under a new id, so equal content is the only link.
|
|
18
18
|
// A pinned copy wins, then the stronger one after the ranking's own global discount; a tie keeps the local copy.
|
|
19
19
|
export function oneCopyPerMemory(local, global, now) {
|
|
20
|
-
const score = (e, isGlobal) => calculateStrength(e, now) * (isGlobal ? GLOBAL_DISCOUNT : 1);
|
|
20
|
+
const score = (e, isGlobal) => calculateStrength(e, now, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1);
|
|
21
21
|
const best = new Map();
|
|
22
22
|
const offer = (entry, isGlobal) => {
|
|
23
23
|
const held = best.get(entry.content);
|
|
@@ -77,7 +77,7 @@ function rankPinned(plan, pinnedLocal, pinnedGlobal, nowP) {
|
|
|
77
77
|
const scopeBoost = scopeBoostFor(scopeMatch(entry.tags, plan.activeScope));
|
|
78
78
|
return {
|
|
79
79
|
entry,
|
|
80
|
-
score: calculateStrength(entry, nowP) * (isGlobal ? GLOBAL_DISCOUNT : 1) * scopeBoost,
|
|
80
|
+
score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1) * scopeBoost,
|
|
81
81
|
tokens: plan.price(entry, isGlobal),
|
|
82
82
|
isGlobal,
|
|
83
83
|
};
|
|
@@ -200,7 +200,7 @@ function backfillRecent(plan, options) {
|
|
|
200
200
|
.slice(0, plan.includeRecent)
|
|
201
201
|
.map(({ entry, isGlobal }) => ({
|
|
202
202
|
entry,
|
|
203
|
-
score: calculateStrength(entry, nowP) * (isGlobal ? GLOBAL_DISCOUNT : 1),
|
|
203
|
+
score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1),
|
|
204
204
|
tokens: plan.price(entry, isGlobal),
|
|
205
205
|
isGlobal,
|
|
206
206
|
}));
|
|
@@ -213,7 +213,7 @@ export function selectStrongest(plan, left, pools) {
|
|
|
213
213
|
const localRanked = localPool
|
|
214
214
|
.map((e) => ({
|
|
215
215
|
entry: e,
|
|
216
|
-
score: calculateStrength(e, now),
|
|
216
|
+
score: calculateStrength(e, now, { ablation: strengthAblation() }),
|
|
217
217
|
tokens: plan.price(e, plan.primaryIsGlobal),
|
|
218
218
|
isGlobal: plan.primaryIsGlobal,
|
|
219
219
|
}))
|
|
@@ -221,7 +221,7 @@ export function selectStrongest(plan, left, pools) {
|
|
|
221
221
|
const globalRanked = globalPool
|
|
222
222
|
.map((e) => ({
|
|
223
223
|
entry: e,
|
|
224
|
-
score: calculateStrength(e, now) * GLOBAL_DISCOUNT,
|
|
224
|
+
score: calculateStrength(e, now, { ablation: strengthAblation() }) * GLOBAL_DISCOUNT,
|
|
225
225
|
tokens: plan.price(e, true),
|
|
226
226
|
isGlobal: true,
|
|
227
227
|
}))
|
|
@@ -280,15 +280,13 @@ async function searchLocalRows(ctx, plan, options) {
|
|
|
280
280
|
const vectorCandidates = contextVectorSpec(ctx, plan, admit);
|
|
281
281
|
const store = plan.local.store;
|
|
282
282
|
const ctxResults = usePhysicsCtx
|
|
283
|
-
? await
|
|
283
|
+
? await physicsSearchIn({ root: ctx.hippoRoot, store }, query, localEntries, {
|
|
284
284
|
budget: left,
|
|
285
285
|
minResults,
|
|
286
286
|
cost: localCost,
|
|
287
|
-
hippoRoot: ctx.hippoRoot,
|
|
288
287
|
physicsConfig: ctxConfig.physics,
|
|
289
288
|
scope: plan.activeScope,
|
|
290
289
|
vectorCandidates,
|
|
291
|
-
store,
|
|
292
290
|
})
|
|
293
291
|
: await hybridSearch(query, localEntries, {
|
|
294
292
|
budget: left,
|
package/dist/api/context.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
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
19
|
import { requireGroup, sqliteStore, storeFor } from '../store/index.js';
|
|
21
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../
|
|
20
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
22
21
|
import { finiteOr, selectBySearch, selectPinned, selectStrongest, } from './context-select.js';
|
|
23
22
|
import { andThen, onStore } from './on-store.js';
|
|
24
23
|
import { strengthenOf } from './recall-record.js';
|
|
@@ -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: [] };
|
|
@@ -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,
|
|
@@ -399,7 +402,13 @@ async function recordRetrieval(ctx, opts, plan, selected, activeSnapshot) {
|
|
|
399
402
|
return { items, ambientState: plan.config.ambient.enabled ? await readAmbientState(ctx, plan) : undefined };
|
|
400
403
|
}
|
|
401
404
|
async function readAmbientState(ctx, plan) {
|
|
402
|
-
const filter = {
|
|
405
|
+
const filter = {
|
|
406
|
+
exactScope: plan.exactScope,
|
|
407
|
+
ownScope: plan.ownScope,
|
|
408
|
+
project: plan.originProject,
|
|
409
|
+
currentProject: projectNames(plan.currentProject),
|
|
410
|
+
now: evalNow(),
|
|
411
|
+
};
|
|
403
412
|
const sources = [
|
|
404
413
|
...(plan.hasLocal ? [plan.local.reads] : []),
|
|
405
414
|
...(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
|
package/dist/api/dormant.js
CHANGED
|
@@ -3,9 +3,11 @@ import { ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
|
3
3
|
import { stampOriginProject } from '../store/entry-row.js';
|
|
4
4
|
import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
|
|
5
5
|
import { loadDormantMemories, holdsDormantMemory, restoreDormantMemory, forgetDormantMemory, } from '../store/dormant.js';
|
|
6
|
+
import { strengthAblation } from '../core/ablation.js';
|
|
6
7
|
import { createMemory, calculateStrength } from '../core/memory.js';
|
|
7
8
|
import { loadConfig } from '../core/config.js';
|
|
8
|
-
import { canTouchScope, personalScopeOf
|
|
9
|
+
import { canTouchScope, personalScopeOf } from '../core/recall-scope.js';
|
|
10
|
+
import { touchableScopeSql } from '../store/rule-sql.js';
|
|
9
11
|
const touchable = (ctx) => touchableScopeSql('', personalScopeOf(ctx.actor));
|
|
10
12
|
/** A tenant's dormant memories (src/store/dormant.ts): what sleep moved out of active memory when `dormant.enabled` is on. Newest first;
|
|
11
13
|
* `opts.query` keeps rows containing every term (case-insensitive). */
|
|
@@ -39,7 +41,7 @@ function reviveSnapshot(ctx, dormant, now) {
|
|
|
39
41
|
};
|
|
40
42
|
if (dormant.reason === 'quality-repair')
|
|
41
43
|
revived.confidence = 'verified';
|
|
42
|
-
return stampOriginProject(ctx.hippoRoot, { ...revived, strength: calculateStrength(revived, now) });
|
|
44
|
+
return stampOriginProject(ctx.hippoRoot, { ...revived, strength: calculateStrength(revived, now, { ablation: strengthAblation() }) });
|
|
43
45
|
}
|
|
44
46
|
/** Permanently deletes a dormant memory, the explicit "forget it for good"; throws when the tenant has no dormant memory with that id. */
|
|
45
47
|
export function forgetDormant(ctx, id) {
|
package/dist/api/drill-down.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// DAG drill-down from a summary to its children.
|
|
2
2
|
import { requireGroup, storeFor } from '../store/index.js';
|
|
3
3
|
import { estimateTokens } from '../util/token-text.js';
|
|
4
|
-
import { passesScopeFilterForRecall, personalScopeOf } from '../
|
|
4
|
+
import { passesScopeFilterForRecall, personalScopeOf } from '../core/recall-scope.js';
|
|
5
5
|
import { classifyOriginProject } from '../core/project-identity.js';
|
|
6
6
|
const DEFAULT_DRILL_DOWN_LIMIT = 50;
|
|
7
7
|
/** One step down the DAG from a level-2+ summary to its direct children (the way back from `recall(... summarizeOverflow: true)` substitutions). Only
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from '../embeddings/provider.js';
|
|
2
|
+
import { type Context } from './types.js';
|
|
3
|
+
/** Embed every memory that has no vector yet; resolves to how many it embedded. */
|
|
4
|
+
export declare function embedMissingMemories(ctx: Context, provider?: EmbeddingProvider): Promise<number>;
|
|
5
|
+
/** How many vectors the store holds, live memory or not. */
|
|
6
|
+
export declare function storedVectorCount(ctx: Context): number;
|
|
7
|
+
export interface EmbedCoverage {
|
|
8
|
+
/** Every memory id in the store. */
|
|
9
|
+
memoryIds: string[];
|
|
10
|
+
/** Every id with a stored vector, including orphans whose memory is gone. */
|
|
11
|
+
vectorIds: string[];
|
|
12
|
+
}
|
|
13
|
+
/** Memory ids against vector ids, for the embed status and backfill lines. */
|
|
14
|
+
export declare function embedCoverage(ctx: Context): EmbedCoverage;
|
|
15
|
+
/** Re-seed every memory's physics particle from its vector; returns how many it reset. */
|
|
16
|
+
export declare function resetPhysicsFromVectors(ctx: Context): number;
|
|
17
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// The vector side of a store for the embed and import verbs: embed what is missing, count coverage, re-seed physics.
|
|
2
|
+
// Vectors and physics rows carry no tenant, so each op covers the whole store and needs the host admin.
|
|
3
|
+
import { embedAll } from '../search/embed-memories.js';
|
|
4
|
+
import { loadAllEntryIds } from '../store/entry-reads.js';
|
|
5
|
+
import { loadEmbeddingIndex, resetStoredParticles, storedVectorSummary } from '../store/vector-index.js';
|
|
6
|
+
import { requireHostAdmin } from './types.js';
|
|
7
|
+
/** Embed every memory that has no vector yet; resolves to how many it embedded. */
|
|
8
|
+
export async function embedMissingMemories(ctx, provider) {
|
|
9
|
+
requireHostAdmin(ctx, 'Embedding the store');
|
|
10
|
+
return embedAll(ctx.hippoRoot, undefined, provider);
|
|
11
|
+
}
|
|
12
|
+
/** How many vectors the store holds, live memory or not. */
|
|
13
|
+
export function storedVectorCount(ctx) {
|
|
14
|
+
requireHostAdmin(ctx, 'Reading the vector index');
|
|
15
|
+
return storedVectorSummary(ctx.hippoRoot).ids.size;
|
|
16
|
+
}
|
|
17
|
+
/** Memory ids against vector ids, for the embed status and backfill lines. */
|
|
18
|
+
export function embedCoverage(ctx) {
|
|
19
|
+
requireHostAdmin(ctx, 'Reading the vector index');
|
|
20
|
+
return { memoryIds: loadAllEntryIds(ctx.hippoRoot), vectorIds: [...storedVectorSummary(ctx.hippoRoot).ids] };
|
|
21
|
+
}
|
|
22
|
+
/** Re-seed every memory's physics particle from its vector; returns how many it reset. */
|
|
23
|
+
export function resetPhysicsFromVectors(ctx) {
|
|
24
|
+
requireHostAdmin(ctx, 'Resetting physics');
|
|
25
|
+
const vectors = loadEmbeddingIndex(ctx.hippoRoot);
|
|
26
|
+
return resetStoredParticles(ctx.hippoRoot, loadAllEntryIds(ctx.hippoRoot), vectors);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The status and client-facing message for one failed request. */
|
|
2
|
+
export interface ApiErrorReply {
|
|
3
|
+
status: number;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
/** Maps by class so rewording a message never moves a status; an untyped error is a 500 whose text stays in the server log. */
|
|
7
|
+
export declare function mapApiError<E>(err: E): ApiErrorReply;
|
|
8
|
+
//# sourceMappingURL=error-reply.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// The one error-to-reply map the HTTP server and the MCP transports share, so a status never depends on which front end caught the error.
|
|
2
|
+
import { ApiError } from '../core/api-errors.js';
|
|
3
|
+
import { BodyTimeoutError, BodyTooLargeError, HttpError, INTERNAL_ERROR_MESSAGE, STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
|
|
4
|
+
import { SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
5
|
+
/** Maps by class so rewording a message never moves a status; an untyped error is a 500 whose text stays in the server log. */
|
|
6
|
+
export function mapApiError(err) {
|
|
7
|
+
// An add-on can build an HttpError from any number, and writeHead throws on one outside 100-999.
|
|
8
|
+
if (err instanceof HttpError && !(Number.isInteger(err.status) && err.status >= 100 && err.status <= 999)) {
|
|
9
|
+
return { status: 500, message: INTERNAL_ERROR_MESSAGE };
|
|
10
|
+
}
|
|
11
|
+
if (err instanceof HttpError || err instanceof ApiError)
|
|
12
|
+
return { status: err.status, message: err.message };
|
|
13
|
+
if (err instanceof BodyTooLargeError)
|
|
14
|
+
return { status: 413, message: err.message };
|
|
15
|
+
if (err instanceof BodyTimeoutError)
|
|
16
|
+
return { status: 408, message: err.message };
|
|
17
|
+
if (err instanceof SqliteBlockedError)
|
|
18
|
+
return { status: 501, message: STORE_NOT_PORTED_MESSAGE };
|
|
19
|
+
return { status: 500, message: INTERNAL_ERROR_MESSAGE };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=error-reply.js.map
|
package/dist/api/forget.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type RejectFlowResult } from '../trust/reject-flow.js';
|
|
2
|
+
import { type Context, type StoreReply } from './types.js';
|
|
2
3
|
/** Delete a memory by id. Reach is checked inside the delete's write scope, and a
|
|
3
4
|
* row out of reach answers as not found, so a caller learns nothing about it. */
|
|
4
5
|
export interface ForgetResult {
|
|
@@ -20,7 +21,10 @@ export interface RejectResult {
|
|
|
20
21
|
}
|
|
21
22
|
/** Tombstones a value's normalized digest so a matching write is refused everywhere until `unreject`; pass exactly one of `memoryId` or `value`.
|
|
22
23
|
* `memoryId` also removes every live tenant row with that digest (not others' personal rows); `reason` is required. Throws on an unknown id or both/neither. */
|
|
23
|
-
export declare function reject(ctx: Context, opts: RejectOpts): RejectResult
|
|
24
|
+
export declare function reject(ctx: Context, opts: RejectOpts): Promise<RejectResult>;
|
|
25
|
+
/** `hippo reject` on the host: every row it removed and the rows that kept their other texts. A personal row by id answers with the
|
|
26
|
+
* personal refusal rather than reject's not-found, as the operator can see that row. */
|
|
27
|
+
export declare function rejectOnHost(ctx: Context, opts: RejectOpts): RejectFlowResult;
|
|
24
28
|
/** Deletes a tombstone by exact digest or unambiguous prefix, restoring writability (the only v1 escape hatch); throws on blank, no match or several. */
|
|
25
29
|
export declare function unreject(ctx: Context, digestOrPrefix: string): {
|
|
26
30
|
ok: boolean;
|
package/dist/api/forget.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
3
3
|
import { rejectValue, unrejectValue } from '../trust/reject-flow.js';
|
|
4
4
|
import { andThen, notPorted, onStore } from './on-store.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { requireHostAdmin } from './types.js';
|
|
6
|
+
import { getMemory } from './memories.js';
|
|
7
|
+
import { canTouchScope, personalScopeOf } from '../core/recall-scope.js';
|
|
7
8
|
export function forget(ctx, id) {
|
|
8
9
|
return onStore(ctx, (port) => {
|
|
9
10
|
const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
|
|
@@ -13,15 +14,26 @@ export function forget(ctx, id) {
|
|
|
13
14
|
}
|
|
14
15
|
/** Tombstones a value's normalized digest so a matching write is refused everywhere until `unreject`; pass exactly one of `memoryId` or `value`.
|
|
15
16
|
* `memoryId` also removes every live tenant row with that digest (not others' personal rows); `reason` is required. Throws on an unknown id or both/neither. */
|
|
16
|
-
export function reject(ctx, opts) {
|
|
17
|
+
export async function reject(ctx, opts) {
|
|
17
18
|
if (opts.memoryId !== undefined) {
|
|
18
19
|
// Tenant scope: same not-found-shaped denial as forget/promote; rejectValue tenant-checks too, but pre-checking keeps the error message consistent.
|
|
19
|
-
const entry =
|
|
20
|
-
if (entry
|
|
20
|
+
const entry = await getMemory(ctx, opts.memoryId);
|
|
21
|
+
if (entry === null || !canTouchScope(ctx.actor, entry.scope)) {
|
|
21
22
|
throw new NotFoundError(`memory not found: ${opts.memoryId}`);
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
const result =
|
|
25
|
+
const result = applyReject(ctx, opts);
|
|
26
|
+
return { digest: result.digest, removedIds: result.removedIds };
|
|
27
|
+
}
|
|
28
|
+
/** `hippo reject` on the host: every row it removed and the rows that kept their other texts. A personal row by id answers with the
|
|
29
|
+
* personal refusal rather than reject's not-found, as the operator can see that row. */
|
|
30
|
+
export function rejectOnHost(ctx, opts) {
|
|
31
|
+
requireHostAdmin(ctx, 'Rejecting with the removal report');
|
|
32
|
+
return applyReject(ctx, opts);
|
|
33
|
+
}
|
|
34
|
+
function applyReject(ctx, opts) {
|
|
35
|
+
// SHORTCUT: the tombstone write is hippo.db only, as the port has no rejection group; one when a served store needs reject.
|
|
36
|
+
return rejectValue({
|
|
25
37
|
hippoRoot: ctx.hippoRoot,
|
|
26
38
|
tenantId: ctx.tenantId,
|
|
27
39
|
actor: ctx.actor.subject,
|
|
@@ -30,7 +42,6 @@ export function reject(ctx, opts) {
|
|
|
30
42
|
value: opts.value,
|
|
31
43
|
ownScope: personalScopeOf(ctx.actor) ?? undefined,
|
|
32
44
|
});
|
|
33
|
-
return { digest: result.digest, removedIds: result.removedIds };
|
|
34
45
|
}
|
|
35
46
|
/** Deletes a tombstone by exact digest or unambiguous prefix, restoring writability (the only v1 escape hatch); throws on blank, no match or several. */
|
|
36
47
|
export function unreject(ctx, digestOrPrefix) {
|
package/dist/api/goals.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../store/goals.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type Context } from './types.js';
|
|
3
3
|
/** What a new goal carries; its tenant is always the caller's. */
|
|
4
4
|
export type GoalPushOpts = Omit<PushGoalOpts, 'tenantId'>;
|
|
5
5
|
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
package/dist/api/goals.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The per-session goal stack that recall boosts: push, list, complete, suspend and resume.
|
|
2
|
-
import { ForbiddenError } from '../core/api-errors.js';
|
|
3
2
|
import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../store/goals.js';
|
|
3
|
+
import { requireHostAdmin } from './types.js';
|
|
4
4
|
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
5
5
|
export function goalPush(ctx, opts) {
|
|
6
6
|
return pushGoal(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
@@ -12,22 +12,18 @@ export function goalList(ctx, opts) {
|
|
|
12
12
|
}
|
|
13
13
|
/** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
|
|
14
14
|
export function goalComplete(ctx, goalId, opts) {
|
|
15
|
-
|
|
15
|
+
// Goal ids are not tenant-scoped in the store, so acting on one by id reaches past the caller's tenant.
|
|
16
|
+
requireHostAdmin(ctx, 'Completing a goal by id');
|
|
16
17
|
completeGoal(ctx.hippoRoot, goalId, opts);
|
|
17
18
|
}
|
|
18
19
|
/** Suspend an active goal by id. Host admin only. */
|
|
19
20
|
export function goalSuspend(ctx, goalId) {
|
|
20
|
-
requireHostAdmin(ctx);
|
|
21
|
+
requireHostAdmin(ctx, 'Suspending a goal by id');
|
|
21
22
|
suspendGoal(ctx.hippoRoot, goalId);
|
|
22
23
|
}
|
|
23
24
|
/** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
|
|
24
25
|
export function goalResume(ctx, goalId) {
|
|
25
|
-
requireHostAdmin(ctx);
|
|
26
|
+
requireHostAdmin(ctx, 'Resuming a goal by id');
|
|
26
27
|
resumeGoal(ctx.hippoRoot, goalId);
|
|
27
28
|
}
|
|
28
|
-
// Goal ids are not tenant-scoped in the store, so acting on one by id is a cross-tenant power.
|
|
29
|
-
function requireHostAdmin(ctx) {
|
|
30
|
-
if (!ctx.actor.hostAdmin)
|
|
31
|
-
throw new ForbiddenError('Only the host admin can change a goal by id');
|
|
32
|
-
}
|
|
33
29
|
//# sourceMappingURL=goals.js.map
|
package/dist/api/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { ApiError, BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
2
|
-
export { isPrivateScope, passesScopeFilterForRecall } from '../
|
|
3
|
-
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../
|
|
2
|
+
export { isPrivateScope, passesScopeFilterForRecall } from '../core/recall-scope.js';
|
|
3
|
+
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../core/recall-scope.js';
|
|
4
4
|
export type { TokenSummary, TokenSurface, TokenSurfaceSummary } from '../store/token-ledger.js';
|
|
5
5
|
export type { FailureSummary } from '../store/failure-log.js';
|
|
6
6
|
export { classifyOriginProject } from '../core/project-identity.js';
|
|
@@ -13,6 +13,8 @@ export * from './assemble.js';
|
|
|
13
13
|
export * from './drill-down.js';
|
|
14
14
|
export * from './outcome.js';
|
|
15
15
|
export * from './forget.js';
|
|
16
|
+
export * from './conflicts.js';
|
|
17
|
+
export * from './projects.js';
|
|
16
18
|
export * from './promote.js';
|
|
17
19
|
export * from './auth.js';
|
|
18
20
|
export * from './audit.js';
|
package/dist/api/index.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// keeps every import path that callers already use.
|
|
4
4
|
export { ApiError, BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
|
|
5
5
|
// The recall-side scope predicates live in recall-scope.ts (leaf) so shared.ts can use them without an import cycle.
|
|
6
|
-
export { isPrivateScope, passesScopeFilterForRecall } from '../
|
|
7
|
-
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../
|
|
6
|
+
export { isPrivateScope, passesScopeFilterForRecall } from '../core/recall-scope.js';
|
|
7
|
+
export { passesCliRecallScopeFilter, ScopeForbiddenError } from '../core/recall-scope.js';
|
|
8
8
|
// classifyOriginProject lives in project-identity.ts (leaf) for the same reason.
|
|
9
9
|
export { classifyOriginProject } from '../core/project-identity.js';
|
|
10
10
|
export * from './types.js';
|
|
@@ -16,6 +16,8 @@ export * from './assemble.js';
|
|
|
16
16
|
export * from './drill-down.js';
|
|
17
17
|
export * from './outcome.js';
|
|
18
18
|
export * from './forget.js';
|
|
19
|
+
export * from './conflicts.js';
|
|
20
|
+
export * from './projects.js';
|
|
19
21
|
export * from './promote.js';
|
|
20
22
|
export * from './auth.js';
|
|
21
23
|
export * from './audit.js';
|
|
@@ -3,7 +3,11 @@ const INSTRUCTION_PATTERNS = [
|
|
|
3
3
|
{ name: 'override-instructions', re: /\b(?:ignore|disregard|forget)\b[^.\n]{0,40}\b(?:previous|prior|above)\b[^.\n]{0,40}\binstructions?\b/i },
|
|
4
4
|
{ name: 'role-reassignment', re: /\b(?:you are now|act as|pretend to be)\b[^.\n]{0,40}\b(?:an?\s+)?(?:ai|assistant|agent|system)\b/i },
|
|
5
5
|
{ name: 'chat-role-markup', re: /<\|im_start\|>|<\|system\|>|\[INST\]|<\/?system>|###\s*system\s*:/i },
|
|
6
|
-
{
|
|
6
|
+
{
|
|
7
|
+
name: 'system-prompt-reference',
|
|
8
|
+
re: new RegExp(String.raw `\b(?:(?:override|ignore|bypass|replace|reveal)\b[^.\n]{0,40}\b(?:system prompt|developer message)|` +
|
|
9
|
+
String.raw `(?:system prompt|developer message)\b[^.\n]{0,40}\b(?:override|ignore|bypass|replace|reveal))\b`, 'i'),
|
|
10
|
+
},
|
|
7
11
|
// "always"/"never" alone (ordinary PR prose) doesn't flag without an agent-facing target nearby too.
|
|
8
12
|
{
|
|
9
13
|
name: 'standing-order',
|