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/importers/vault.js
CHANGED
|
@@ -5,10 +5,10 @@ import { createHash } from 'node:crypto';
|
|
|
5
5
|
import { createMemory } from '../core/memory.js';
|
|
6
6
|
import { loadVaultRawRows } from '../store/entry-reads.js';
|
|
7
7
|
import { remember, archiveRaw, isPrivateScope } from '../api/index.js';
|
|
8
|
-
import { assertClientScope } from '../
|
|
9
|
-
import { RejectedValueError } from '../
|
|
8
|
+
import { assertClientScope } from '../core/recall-scope.js';
|
|
9
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
10
10
|
import { rejectionGuardRefuses } from '../store/rejected-values.js';
|
|
11
|
-
import {
|
|
11
|
+
import { runWithRequestStores } from '../db/request-stores.js';
|
|
12
12
|
import { loadConfig } from '../core/config.js';
|
|
13
13
|
import { vetSecrets } from '../util/secret-detect.js';
|
|
14
14
|
import { errorMessage, log } from '../util/log.js';
|
|
@@ -18,7 +18,7 @@ import { isJsonString } from '../util/json.js';
|
|
|
18
18
|
import { escapeLike } from '../util/escape.js';
|
|
19
19
|
/** Import a markdown vault FOLDER as `kind='raw'` memories.
|
|
20
20
|
* NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once, so two concurrent runs over one vault can double-insert. */
|
|
21
|
-
export function importVault(folderPath, options) {
|
|
21
|
+
export async function importVault(folderPath, options) {
|
|
22
22
|
const hippoRoot = options.hippoRoot;
|
|
23
23
|
const identity = vaultIdentityOrThrow(options);
|
|
24
24
|
if (options.global) {
|
|
@@ -34,7 +34,7 @@ export function importVault(folderPath, options) {
|
|
|
34
34
|
}
|
|
35
35
|
return syncVaultFolder(folderPath, options, identity);
|
|
36
36
|
}
|
|
37
|
-
function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
37
|
+
async function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
38
38
|
const hippoRoot = options.hippoRoot;
|
|
39
39
|
const tenantId = options.tenantId ?? DEFAULT_TENANT_ID;
|
|
40
40
|
const extraTags = options.extraTags ?? [];
|
|
@@ -54,15 +54,15 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
|
54
54
|
const run = {
|
|
55
55
|
ctx, folderPath, vaultName, scope, extraTags, dryRun, existing, seen, baseHalfLifeDays, tally,
|
|
56
56
|
};
|
|
57
|
-
const importNotes = () => {
|
|
57
|
+
const importNotes = async () => {
|
|
58
58
|
for (const relpath of relpaths)
|
|
59
|
-
importVaultNote(run, relpath);
|
|
59
|
+
await importVaultNote(run, relpath);
|
|
60
60
|
};
|
|
61
61
|
// A dry run probes the rejection guard once per changed note; one scope lets every probe share a handle.
|
|
62
62
|
if (dryRun)
|
|
63
|
-
|
|
63
|
+
await runWithRequestStores(importNotes);
|
|
64
64
|
else
|
|
65
|
-
importNotes();
|
|
65
|
+
await importNotes();
|
|
66
66
|
// Deletion-sync: an artifactRef in the Map but not seen this run vanished from the source, so archive its raw row.
|
|
67
67
|
// Per-file archiveRaw, no outer SAVEPOINT: there is no cross-file idempotency row to commit atomically.
|
|
68
68
|
for (const [artifactRef, rows] of existing) {
|
|
@@ -71,7 +71,7 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
|
|
|
71
71
|
for (const row of rows) {
|
|
72
72
|
tally.archived++; // count even in dryRun so the preview reflects destructive deletes
|
|
73
73
|
if (!dryRun)
|
|
74
|
-
archiveRaw(ctx, row.id, `source_deleted:${artifactRef}`);
|
|
74
|
+
await archiveRaw(ctx, row.id, `source_deleted:${artifactRef}`);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
const { total, imported, skipped, rejected, archived, redacted, entries } = tally;
|
|
@@ -82,18 +82,20 @@ function vaultIdentityOrThrow(options) {
|
|
|
82
82
|
// sharing a basename collide on the same `vault:<name>:*` prefix and the sync archived the first one's rows.
|
|
83
83
|
const vaultName = options.name?.trim();
|
|
84
84
|
if (!vaultName) {
|
|
85
|
-
throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder
|
|
85
|
+
throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder ' +
|
|
86
|
+
'basename.');
|
|
86
87
|
}
|
|
87
88
|
if (vaultName.includes(':')) {
|
|
88
89
|
// ':' delimits the artifactRef (vault:<name>:<relpath>); a name containing it lets another vault's prefix scan over-match and archive its rows.
|
|
89
90
|
throw new Error(`vault name must not contain ':' (artifactRef delimiter): ${vaultName}`);
|
|
90
91
|
}
|
|
91
92
|
const scope = options.scope ?? null;
|
|
92
|
-
// Privacy guard: recall only default-denies scopes shaped `<source>:private:*` (isPrivateScope in src/
|
|
93
|
+
// Privacy guard: recall only default-denies scopes shaped `<source>:private:*` (isPrivateScope in src/core/recall-scope.ts), so a bare `private`
|
|
93
94
|
// alias would be returned to no-scope callers. Reject any scope naming a `private` segment that is not a valid `<source>:private:*`.
|
|
94
95
|
assertClientScope(scope);
|
|
95
96
|
if (scope !== null && scope.split(':').includes('private') && !isPrivateScope(scope)) {
|
|
96
|
-
throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied).
|
|
97
|
+
throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied). ` +
|
|
98
|
+
`Use a source-prefixed scope such as 'vault:private:${vaultName}'.`);
|
|
97
99
|
}
|
|
98
100
|
return { vaultName, scope };
|
|
99
101
|
}
|
|
@@ -118,7 +120,7 @@ function loadVaultRows(hippoRoot, tenantId, vaultName) {
|
|
|
118
120
|
}
|
|
119
121
|
return existing;
|
|
120
122
|
}
|
|
121
|
-
function importVaultNote(run, relpath) {
|
|
123
|
+
async function importVaultNote(run, relpath) {
|
|
122
124
|
const { tally } = run;
|
|
123
125
|
tally.total++;
|
|
124
126
|
const artifactRef = `vault:${run.vaultName}:${relpath}`;
|
|
@@ -135,7 +137,7 @@ function importVaultNote(run, relpath) {
|
|
|
135
137
|
// Empty or frontmatter-only note: nothing storable, and the content was deleted at source, so archive prior rows (the old body must not stay searchable)
|
|
136
138
|
// and skip the write. Safe because remember() is skipped, so there is no archive-then-throw hazard; the note stays in `seen` so deletion-sync skips it.
|
|
137
139
|
if (body.trim().length < 3) {
|
|
138
|
-
archivePriors(run, priors, `emptied:${artifactRef}`);
|
|
140
|
+
await archivePriors(run, priors, `emptied:${artifactRef}`);
|
|
139
141
|
tally.skipped++;
|
|
140
142
|
return;
|
|
141
143
|
}
|
|
@@ -145,13 +147,13 @@ function importVaultNote(run, relpath) {
|
|
|
145
147
|
tally.skipped++;
|
|
146
148
|
return;
|
|
147
149
|
}
|
|
148
|
-
writeChangedNote(run, artifactRef, priors, body, tags);
|
|
150
|
+
await writeChangedNote(run, artifactRef, priors, body, tags);
|
|
149
151
|
}
|
|
150
|
-
function writeChangedNote(run, artifactRef, priors, body, tags) {
|
|
152
|
+
async function writeChangedNote(run, artifactRef, priors, body, tags) {
|
|
151
153
|
const { ctx, tally } = run;
|
|
152
154
|
// Changed file: archive EVERY old raw row for this ref (>1 only after a concurrent double-insert), then append the new one; NEVER supersede.
|
|
153
155
|
// archiveRaw commits before remember() runs, so no double-live row; a crash between them self-heals on the next import.
|
|
154
|
-
archivePriors(run, priors, `changed:${artifactRef}`);
|
|
156
|
+
await archivePriors(run, priors, `changed:${artifactRef}`);
|
|
155
157
|
// remember() owns the write; the `echo` from createMemory only fills the ImportResult, with its id reconciled to the row that landed.
|
|
156
158
|
const content = vetSecrets(body, tags, true).content;
|
|
157
159
|
const echo = createMemory(content, {
|
|
@@ -163,7 +165,7 @@ function writeChangedNote(run, artifactRef, priors, body, tags) {
|
|
|
163
165
|
tenantId: ctx.tenantId,
|
|
164
166
|
baseHalfLifeDays: run.baseHalfLifeDays,
|
|
165
167
|
});
|
|
166
|
-
if (!storeVaultNote(run, echo, content, tags, artifactRef)) {
|
|
168
|
+
if (!(await storeVaultNote(run, echo, content, tags, artifactRef))) {
|
|
167
169
|
tally.rejected++;
|
|
168
170
|
return;
|
|
169
171
|
}
|
|
@@ -183,11 +185,11 @@ function readVaultNote(run, relpath) {
|
|
|
183
185
|
return null;
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
|
-
function archivePriors(run, priors, reason) {
|
|
188
|
+
async function archivePriors(run, priors, reason) {
|
|
187
189
|
for (const p of priors) {
|
|
188
190
|
run.tally.archived++; // count the would-be archive even in dryRun (true preview)
|
|
189
191
|
if (!run.dryRun)
|
|
190
|
-
archiveRaw(run.ctx, p.id, reason);
|
|
192
|
+
await archiveRaw(run.ctx, p.id, reason);
|
|
191
193
|
}
|
|
192
194
|
}
|
|
193
195
|
function vaultNoteTags(run, hashTag, fm, body) {
|
|
@@ -219,14 +221,14 @@ function vaultEnvelopeUnchanged(priors, tags, scope) {
|
|
|
219
221
|
}));
|
|
220
222
|
}
|
|
221
223
|
/** Returns false when the rejection guard refuses the note; any other error propagates. */
|
|
222
|
-
function storeVaultNote(run, echo, content, tags, artifactRef) {
|
|
224
|
+
async function storeVaultNote(run, echo, content, tags, artifactRef) {
|
|
223
225
|
// A dry run writes nothing; it asks the guard remember() uses, so its `rejected` count matches what a real run would refuse.
|
|
224
226
|
if (run.dryRun)
|
|
225
227
|
return !rejectionGuardRefuses(run.ctx.hippoRoot, run.ctx.tenantId, echo.id, echo.content);
|
|
226
228
|
try {
|
|
227
229
|
// A rejected note must not stop the scan or the deletion sync. Its priors are archived by now, so a rerun meets
|
|
228
230
|
// the same refusal and counts it again.
|
|
229
|
-
const result = remember(run.ctx, {
|
|
231
|
+
const result = await remember(run.ctx, {
|
|
230
232
|
content,
|
|
231
233
|
kind: 'raw',
|
|
232
234
|
artifactRef,
|
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export { initStore } from './store/open.js';
|
|
|
20
20
|
export { writeEntry } from './store/entry-writes.js';
|
|
21
21
|
export { loadAllEntries, readEntry } from './store/entry-reads.js';
|
|
22
22
|
export { deleteEntry } from './store/delete-and-batch.js';
|
|
23
|
-
export { loadSearchEntries,
|
|
23
|
+
export { loadSearchEntries, loadRecallEntries, type RecallSearchEntriesOptions } from './store/search-rows.js';
|
|
24
24
|
export { loadIndex, rebuildIndex, loadSessionDecayContext, SessionDecayContext } from './store/index-and-stats.js';
|
|
25
25
|
export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, type ContinuityKey, } from './store/sessions.js';
|
|
26
26
|
export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
|
|
@@ -32,10 +32,11 @@ export { consolidate } from './consolidate/sleep.js';
|
|
|
32
32
|
export { ConsolidationResult } from './consolidate/run.js';
|
|
33
33
|
export { sleep, type SleepOpts, type SleepResult } from './api/sleep.js';
|
|
34
34
|
export { strengthBucket } from './consolidate/dedupe.js';
|
|
35
|
-
export { isEmbeddingAvailable, getEmbedding } from './
|
|
36
|
-
export { cosineSimilarity
|
|
35
|
+
export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
|
|
36
|
+
export { cosineSimilarity } from './store/embeddings/index.js';
|
|
37
|
+
export { embedMemory, embedAll } from './search/embed-memories.js';
|
|
37
38
|
export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
|
|
38
|
-
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
|
|
39
|
+
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, type RunWatchedOptions, fetchGitLog, } from './learn/autolearn.js';
|
|
39
40
|
export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';
|
|
40
41
|
export { searchBoth, searchBothHybrid, HybridSearchOptions } from './sharing/search-both.js';
|
|
41
42
|
export { syncGlobalToLocal } from './sharing/global-sync.js';
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@ export { initStore } from './store/open.js';
|
|
|
21
21
|
export { writeEntry } from './store/entry-writes.js';
|
|
22
22
|
export { loadAllEntries, readEntry } from './store/entry-reads.js';
|
|
23
23
|
export { deleteEntry } from './store/delete-and-batch.js';
|
|
24
|
-
export { loadSearchEntries,
|
|
24
|
+
export { loadSearchEntries, loadRecallEntries } from './store/search-rows.js';
|
|
25
25
|
export { loadIndex, rebuildIndex, loadSessionDecayContext } from './store/index-and-stats.js';
|
|
26
26
|
export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
|
|
27
27
|
export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
|
|
@@ -36,8 +36,9 @@ export { sleep } from './api/sleep.js';
|
|
|
36
36
|
// Announced public in CHANGELOG 1.26.3 but never re-exported; the rest of dedupe.js stays internal.
|
|
37
37
|
export { strengthBucket } from './consolidate/dedupe.js';
|
|
38
38
|
// Feature 1: Embedding search
|
|
39
|
-
export { isEmbeddingAvailable, getEmbedding } from './
|
|
40
|
-
export { cosineSimilarity
|
|
39
|
+
export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
|
|
40
|
+
export { cosineSimilarity } from './store/embeddings/index.js';
|
|
41
|
+
export { embedMemory, embedAll } from './search/embed-memories.js';
|
|
41
42
|
export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
|
|
42
43
|
// Feature 2: Auto-learn from errors
|
|
43
44
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
|
|
@@ -15,9 +15,21 @@ export declare function partitionLessons(lessons: string[]): {
|
|
|
15
15
|
/** Check if a substantially similar memory already exists: true if overlap > threshold (default 0.7).
|
|
16
16
|
* `tenantId` applies only on the root-string overload; a pre-loaded MemoryEntry[] is already scoped, so it is ignored there. */
|
|
17
17
|
export declare function deduplicateLesson(hippoRootOrEntries: string | MemoryEntry[], lesson: string, threshold?: number, tenantId?: string): boolean;
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
/** A transfer command that has not exited in this long is hung on a prompt or a dead remote. */
|
|
19
|
+
export declare const RUN_WATCHED_DEADLINE_MS: number;
|
|
20
|
+
/** The command passed its deadline and was killed. */
|
|
21
|
+
export declare class RunWatchedTimeoutError extends Error {
|
|
22
|
+
readonly deadlineMs: number;
|
|
23
|
+
readonly stderr: string;
|
|
24
|
+
constructor(deadlineMs: number, stderr: string);
|
|
25
|
+
}
|
|
26
|
+
export interface RunWatchedOptions {
|
|
27
|
+
/** Join argv with spaces and run it as one shell command line; only for text the caller wrote itself. */
|
|
28
|
+
shell?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Run argv[0] with the rest as its arguments and no shell, so `;`, `&` and `$()` reach it literally; stderr streams live.
|
|
31
|
+
* Returns: { exitCode, stderr } with only the last 64 KiB of stderr; rejects with RunWatchedTimeoutError past `deadlineMs`. */
|
|
32
|
+
export declare function runWatched(argv: readonly string[], deadlineMs?: number, opts?: RunWatchedOptions): Promise<{
|
|
21
33
|
exitCode: number;
|
|
22
34
|
stderr: string;
|
|
23
35
|
}>;
|
package/dist/learn/autolearn.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Auto-learn from errors and git history.
|
|
2
2
|
* Agents learn from failures without explicit hippo remember calls. */
|
|
3
|
-
import {
|
|
3
|
+
import { execFileSync, spawn } from 'child_process';
|
|
4
|
+
import { spawnArgv } from '../util/spawn-argv.js';
|
|
4
5
|
import { createMemory, Layer, DEFAULT_HALF_LIFE_DAYS } from '../core/memory.js';
|
|
5
6
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
6
7
|
import { textOverlap } from '../util/tokenize.js';
|
|
@@ -97,25 +98,46 @@ export function deduplicateLesson(hippoRootOrEntries, lesson, threshold = 0.7, t
|
|
|
97
98
|
}
|
|
98
99
|
return false;
|
|
99
100
|
}
|
|
100
|
-
/**
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
101
|
+
/** The most stderr `runWatched` returns; the terminal still gets all of it. */
|
|
102
|
+
const STDERR_TAIL_BYTES = 64 * 1024;
|
|
103
|
+
/** A transfer command that has not exited in this long is hung on a prompt or a dead remote. */
|
|
104
|
+
export const RUN_WATCHED_DEADLINE_MS = 30 * 60_000;
|
|
105
|
+
/** The command passed its deadline and was killed. */
|
|
106
|
+
export class RunWatchedTimeoutError extends Error {
|
|
107
|
+
deadlineMs;
|
|
108
|
+
stderr;
|
|
109
|
+
constructor(deadlineMs, stderr) {
|
|
110
|
+
super(`the command did not exit within ${deadlineMs} ms and was killed`);
|
|
111
|
+
this.deadlineMs = deadlineMs;
|
|
112
|
+
this.stderr = stderr;
|
|
113
|
+
this.name = 'RunWatchedTimeoutError';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Run argv[0] with the rest as its arguments and no shell, so `;`, `&` and `$()` reach it literally; stderr streams live.
|
|
117
|
+
* Returns: { exitCode, stderr } with only the last 64 KiB of stderr; rejects with RunWatchedTimeoutError past `deadlineMs`. */
|
|
118
|
+
export function runWatched(argv, deadlineMs = RUN_WATCHED_DEADLINE_MS, opts = {}) {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
const options = { stdio: ['inherit', 'inherit', 'pipe'], windowsHide: true };
|
|
121
|
+
const child = opts.shell ? spawn(argv.join(' '), { ...options, windowsHide: true, shell: true }) : spawnArgv(argv, options);
|
|
122
|
+
let tail = Buffer.alloc(0);
|
|
123
|
+
child.stderr?.on('data', (chunk) => {
|
|
124
|
+
tail = Buffer.concat([tail, chunk]);
|
|
125
|
+
if (tail.length > STDERR_TAIL_BYTES)
|
|
126
|
+
tail = tail.subarray(tail.length - STDERR_TAIL_BYTES);
|
|
110
127
|
process.stderr.write(chunk);
|
|
111
128
|
});
|
|
129
|
+
// SHORTCUT: kills the direct child only (the shell or cmd.exe when there is one); on Windows a grandchild can outlive it.
|
|
130
|
+
// A process-tree kill is the upgrade path.
|
|
131
|
+
const timer = setTimeout(() => {
|
|
132
|
+
child.kill('SIGKILL');
|
|
133
|
+
reject(new RunWatchedTimeoutError(deadlineMs, tail.toString('utf8')));
|
|
134
|
+
}, deadlineMs);
|
|
112
135
|
child.on('close', (code) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
stderr: Buffer.concat(stderrChunks).toString('utf8'),
|
|
116
|
-
});
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
resolve({ exitCode: code ?? 1, stderr: tail.toString('utf8') });
|
|
117
138
|
});
|
|
118
139
|
child.on('error', (err) => {
|
|
140
|
+
clearTimeout(timer);
|
|
119
141
|
resolve({ exitCode: 1, stderr: err.message });
|
|
120
142
|
});
|
|
121
143
|
});
|
|
@@ -123,7 +145,7 @@ export function runWatched(command) {
|
|
|
123
145
|
/** Check whether a directory is a git work tree. */
|
|
124
146
|
export function isGitRepo(cwd) {
|
|
125
147
|
try {
|
|
126
|
-
const raw =
|
|
148
|
+
const raw = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
|
|
127
149
|
encoding: 'utf8',
|
|
128
150
|
cwd,
|
|
129
151
|
timeout: 10000,
|
package/dist/learn/churn-git.js
CHANGED
|
@@ -3,12 +3,13 @@ import { execFileSync } from 'child_process';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as os from 'os';
|
|
5
5
|
import * as path from 'path';
|
|
6
|
-
import { DAY_MS } from '../util/time.js';
|
|
6
|
+
import { DAY_MS, MINUTE_MS } from '../util/time.js';
|
|
7
7
|
import { errorMessage } from '../util/log.js';
|
|
8
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
8
9
|
// A `git log --name-status` dump can run to tens of MB; default 1MB pipe would truncate it.
|
|
9
10
|
const GIT_MAX_BUFFER = 64 * 1024 * 1024;
|
|
10
11
|
// Longer than the 10 s of one-line git reads because a full log dump on a large repo is slow, yet bounded so a wedged git cannot stall sleep.
|
|
11
|
-
const GIT_TIMEOUT_MS =
|
|
12
|
+
const GIT_TIMEOUT_MS = MINUTE_MS;
|
|
12
13
|
/** A real git failure (not git grep's expected exit-1-no-match). Callers abort the whole run on this. */
|
|
13
14
|
export class GitReadError extends Error {
|
|
14
15
|
}
|
|
@@ -93,9 +94,17 @@ export function packageScriptsAt(repoRoot, rev) {
|
|
|
93
94
|
return {};
|
|
94
95
|
const raw = runGit(['show', `${rev}:package.json`], repoRoot);
|
|
95
96
|
try {
|
|
96
|
-
// SAFETY: optional chaining makes a `null` or scalar package.json read as "no scripts".
|
|
97
97
|
const parsed = JSON.parse(raw);
|
|
98
|
-
|
|
98
|
+
const scripts = isJsonObject(parsed) ? parsed.scripts : undefined;
|
|
99
|
+
if (!isJsonObject(scripts))
|
|
100
|
+
return {};
|
|
101
|
+
const out = {};
|
|
102
|
+
for (const [name, command] of Object.entries(scripts)) {
|
|
103
|
+
if (!isJsonString(command))
|
|
104
|
+
return {};
|
|
105
|
+
out[name] = command;
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
99
108
|
}
|
|
100
109
|
catch (err) {
|
|
101
110
|
if (err instanceof SyntaxError)
|
package/dist/learn/extract.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MemoryEntry, EmotionalValence } from '../core/memory.js';
|
|
2
|
+
import { type AnthropicMessageFailure } from '../util/anthropic-messages.js';
|
|
2
3
|
export interface ExtractedFact {
|
|
3
4
|
content: string;
|
|
4
5
|
tags: string[];
|
|
@@ -8,8 +9,8 @@ export interface ExtractOptions {
|
|
|
8
9
|
apiKey: string;
|
|
9
10
|
model?: string;
|
|
10
11
|
fetcher?: typeof fetch;
|
|
11
|
-
/** Told why a call produced nothing, so callers can surface it instead of guessing. */
|
|
12
|
-
onError?: (msg: string) => void;
|
|
12
|
+
/** Told why a call produced nothing, so callers can surface it instead of guessing; `failure` is set when the API call itself failed. */
|
|
13
|
+
onError?: (msg: string, failure?: AnthropicMessageFailure) => void;
|
|
13
14
|
}
|
|
14
15
|
export declare function extractFacts(text: string, opts: ExtractOptions): Promise<ExtractedFact[]>;
|
|
15
16
|
export declare function storeExtractedFacts(hippoRoot: string, source: MemoryEntry, facts: ExtractedFact[]): MemoryEntry[];
|
package/dist/learn/extract.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { Layer, createMemory } from '../core/memory.js';
|
|
2
2
|
import { writeEntry } from '../store/entry-writes.js';
|
|
3
3
|
import { loadConfig } from '../core/config.js';
|
|
4
|
-
import { RejectedValueError } from '../
|
|
4
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
5
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
6
6
|
import { describeMessageFailure, sendAnthropicMessage } from '../util/anthropic-messages.js';
|
|
7
7
|
import { neverAutoShareTags } from '../sharing/share.js';
|
|
8
8
|
import { errorMessage, log } from '../util/log.js';
|
|
9
9
|
import { isJsonString } from '../util/json.js';
|
|
10
10
|
import { certainDefect } from '../core/memory-quality.js';
|
|
11
|
-
const EXTRACTION_PROMPT = `You are extracting factual statements from a conversation or memory entry.
|
|
11
|
+
const EXTRACTION_PROMPT = `You are extracting factual statements from a conversation or memory entry. ` +
|
|
12
|
+
`Extract 1-8 standalone factual statements that would be useful to remember later.
|
|
12
13
|
|
|
13
14
|
Rules:
|
|
14
15
|
- Each fact must be a complete, standalone sentence
|
|
15
16
|
- Include the speaker's name in every fact (e.g. "Alice prefers..." not "She prefers...")
|
|
16
17
|
- Preserve specific details: names, numbers, dates, paths, IDs
|
|
17
|
-
- Return a JSON array of objects with: content (string), tags (array of "speaker:X" and "topic:Y" strings),
|
|
18
|
+
- Return a JSON array of objects with: content (string), tags (array of "speaker:X" and "topic:Y" strings), ` +
|
|
19
|
+
`valence ("neutral", "positive", "negative", or "critical")
|
|
18
20
|
- Return an empty array [] for small talk with no extractable facts
|
|
19
21
|
- Output ONLY the JSON array, no preamble or explanation
|
|
20
22
|
|
|
@@ -31,7 +33,7 @@ export async function extractFacts(text, opts) {
|
|
|
31
33
|
fetcher: opts.fetcher,
|
|
32
34
|
});
|
|
33
35
|
if (!reply.ok) {
|
|
34
|
-
opts.onError?.(describeMessageFailure(reply.failure));
|
|
36
|
+
opts.onError?.(describeMessageFailure(reply.failure), reply.failure);
|
|
35
37
|
return [];
|
|
36
38
|
}
|
|
37
39
|
try {
|
|
@@ -116,7 +118,7 @@ function buildExtractedEntry(fact, source, inheritedTags, baseHalfLifeDays) {
|
|
|
116
118
|
scope: source.scope,
|
|
117
119
|
// Without it createMemory stamps 'default', and extracted facts leave
|
|
118
120
|
// the tenant of the episodic memory they were extracted from.
|
|
119
|
-
tenantId: source.
|
|
121
|
+
tenantId: source.tenant_id,
|
|
120
122
|
baseHalfLifeDays,
|
|
121
123
|
}), origin_project: source.origin_project };
|
|
122
124
|
}
|
|
@@ -7,7 +7,8 @@ const FORWARD_CLAIM_PATTERNS = [
|
|
|
7
7
|
// Verb + duration tail: requires `<verb> take <N> <unit>`, because a bare `will take` matched `who will take ownership of auth?`.
|
|
8
8
|
new RegExp(String.raw `\b(?:will|should|gonna|going\s+to)\s+take\s+${DURATION_TAIL}`, 'i'),
|
|
9
9
|
// Ship + by/in + duration-or-day: a bare `ship in` matched `how does this ship in Docker?`, so a duration tail or literal day-of-week is required.
|
|
10
|
-
new RegExp(String.raw `\bship(?:ping|s)?\s+(?:by|in)\s+(?:(?:about|around)\s+)?(?:next\s+)
|
|
10
|
+
new RegExp(String.raw `\bship(?:ping|s)?\s+(?:by|in)\s+(?:(?:about|around)\s+)?(?:next\s+)?` +
|
|
11
|
+
String.raw `(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
|
|
11
12
|
/\bestimate(?:d)?\s+(?:at\s+)?(?:~|≈|about|around)?\s*\d+/i,
|
|
12
13
|
/\b(?:by|in|within)\s+(?:about|around|~)?\s*\d+\s*(?:day|week|month|hour)s?\b/i,
|
|
13
14
|
/\bETA\s*(?:is|:)?\s*\d+/i,
|
|
@@ -17,7 +18,8 @@ const FORWARD_CLAIM_PATTERNS = [
|
|
|
17
18
|
/(?<=^|\s)~\s*\d+\s*(?:day|week|month|hour)s?\b/i,
|
|
18
19
|
// Should + verb + duration tail. Same tightening as the leading 'will
|
|
19
20
|
// take' rule: 'should ship by EOD' must include a quantifier.
|
|
20
|
-
new RegExp(String.raw `\bshould\s+(?:be|ship|finish|complete|land)\s+(?:by|in|within)\s+(?:(?:about|around)\s+)?(?:next\s+)
|
|
21
|
+
new RegExp(String.raw `\bshould\s+(?:be|ship|finish|complete|land)\s+(?:by|in|within)\s+(?:(?:about|around)\s+)?(?:next\s+)?` +
|
|
22
|
+
String.raw `(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
|
|
21
23
|
];
|
|
22
24
|
/** Pronouns, function words and modal verbs the regex set already gates on; dropped before class resolution so overlap comes from domain tokens. */
|
|
23
25
|
const STOP_WORDS = new Set([
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type HippoStore } from '../store/port.js';
|
|
1
2
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
3
|
export interface InvalidationTarget {
|
|
3
4
|
from: string;
|
|
@@ -28,7 +29,7 @@ export declare function extractInvalidationTarget(message: string): Invalidation
|
|
|
28
29
|
export declare function invalidateMatching(hippoRoot: string, target: InvalidationTarget, tenantId?: string, options?: InvalidationOptions): InvalidationResult;
|
|
29
30
|
/** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
|
|
30
31
|
* Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
|
|
31
|
-
export declare function invalidateMatchingAmong(
|
|
32
|
+
export declare function invalidateMatchingAmong(store: HippoStore, live: MemoryEntry[], target: InvalidationTarget, tenantId?: string): Promise<InvalidationResult>;
|
|
32
33
|
export interface ChurnRefs {
|
|
33
34
|
paths: string[];
|
|
34
35
|
symbols: string[];
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { addTagToEntries,
|
|
1
|
+
import { addTagToEntries, writeEntriesTogether } from '../store/entry-writes.js';
|
|
2
2
|
import { confirmedOutcomeTimes } from '../store/audit.js';
|
|
3
|
-
import {
|
|
3
|
+
import { loadAllEntries, loadEntriesMentioning, readEntry } from '../store/entry-reads.js';
|
|
4
|
+
import { requireGroup } from '../store/port.js';
|
|
5
|
+
import { chunked } from '../util/chunked.js';
|
|
4
6
|
import { CHURN_STALE_TAG } from '../core/memory.js';
|
|
5
7
|
import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
|
|
6
8
|
const HEADLINE_CHARS = 60;
|
|
@@ -46,20 +48,27 @@ export function extractInvalidationTarget(message) {
|
|
|
46
48
|
* Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
|
|
47
49
|
export function invalidateMatching(hippoRoot, target, tenantId, options) {
|
|
48
50
|
// tenantId opt-in: when set, only that tenant's memories are weakened; undefined is host-wide.
|
|
49
|
-
//
|
|
50
|
-
const
|
|
51
|
-
|
|
51
|
+
// The onlyId read is tenant-scoped too, so another tenant's id is invisible here.
|
|
52
|
+
const entries = options?.onlyId === undefined
|
|
53
|
+
? loadEntriesMentioning(hippoRoot, invalidationTokenize(target.from), target.from.toLowerCase().trim(), tenantId)
|
|
54
|
+
: [readEntry(hippoRoot, options.onlyId, tenantId)].filter((entry) => entry !== null);
|
|
55
|
+
const { result, weakened } = weakenMatches(entries, target, options);
|
|
56
|
+
writeEntriesTogether(hippoRoot, weakened);
|
|
52
57
|
return result;
|
|
53
58
|
}
|
|
54
59
|
/** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
|
|
55
60
|
* Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
|
|
56
|
-
export function invalidateMatchingAmong(
|
|
61
|
+
export async function invalidateMatchingAmong(store, live, target, tenantId) {
|
|
57
62
|
const seen = weakenMatches(live, target, { dryRun: true }).result;
|
|
58
63
|
const ids = [...seen.targets, ...seen.skippedPinned];
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
const fresh = new Map();
|
|
65
|
+
// The port reads at most 500 ids a call.
|
|
66
|
+
for (const chunk of chunked(ids, 500))
|
|
67
|
+
for (const entry of await store.entriesByIds(chunk, tenantId))
|
|
68
|
+
fresh.set(entry.id, entry);
|
|
61
69
|
const { result, weakened } = weakenMatches(ids.flatMap((id) => fresh.get(id) ?? []), target);
|
|
62
|
-
|
|
70
|
+
if (weakened.length > 0)
|
|
71
|
+
await requireGroup(store, 'lessonWrites').writeTogether(weakened);
|
|
63
72
|
const byId = new Map(weakened.map((entry) => [entry.id, entry]));
|
|
64
73
|
for (let i = 0; i < live.length; i++)
|
|
65
74
|
live[i] = byId.get(live[i].id) ?? live[i];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type ToolCall } from './protocol.js';
|
|
2
2
|
export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
|
|
3
|
-
export declare function runStatusTool({ hippoRoot, config, tenantId }: ToolCall): string;
|
|
3
|
+
export declare function runStatusTool({ ctx, hippoRoot, config, tenantId }: ToolCall): string;
|
|
4
4
|
export declare function runConflictsTool(call: ToolCall): string;
|
|
5
5
|
export declare function runResolveTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
6
|
-
export declare function runShareTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string
|
|
6
|
+
export declare function runShareTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
|
|
7
7
|
export declare function runPeersTool({ tenantId }: ToolCall): string;
|
|
8
8
|
//# sourceMappingURL=admin-tools.d.ts.map
|