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,89 @@
|
|
|
1
|
+
// The optional Transformers.js package, and a bounded load of a model from it, shared by the local embedder and the cross-encoder.
|
|
2
|
+
import { MINUTE_MS } from '../util/time.js';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
import { errorCode, errorMessage } from '../util/log.js';
|
|
6
|
+
const _require = createRequire(import.meta.url);
|
|
7
|
+
// Importing both loads two onnxruntime-node builds whose finalizers can double-free on exit, so one is picked:
|
|
8
|
+
// the maintained package hippo ships, with Xenova only as a fallback a user installed.
|
|
9
|
+
const TRANSFORMERS_PACKAGES = ['@huggingface/transformers', '@xenova/transformers'];
|
|
10
|
+
/** The installed package to import, or null when neither is installed. */
|
|
11
|
+
export function resolveTransformersPackage() {
|
|
12
|
+
for (const name of TRANSFORMERS_PACKAGES) {
|
|
13
|
+
const url = entryUrl(name);
|
|
14
|
+
if (url)
|
|
15
|
+
return { name, url };
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function entryUrl(name) {
|
|
20
|
+
try {
|
|
21
|
+
return import.meta.resolve(name);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// import.meta.resolve is missing under some module runners (vitest's included), so the require-based resolve stands in there.
|
|
25
|
+
try {
|
|
26
|
+
return pathToFileURL(_require.resolve(name)).href;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null; // not installed; the caller tries the next package
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The package's module namespace, typed by the parts the caller reads; null when neither package is installed. */
|
|
34
|
+
export async function importTransformers() {
|
|
35
|
+
const pkg = resolveTransformersPackage();
|
|
36
|
+
if (!pkg)
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
return { name: pkg.name, mod: await import(/* @vite-ignore */ pkg.url) };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
// A Node error's code (ERR_MODULE_NOT_FOUND and the like) says more than its message alone.
|
|
43
|
+
const code = errorCode(err);
|
|
44
|
+
throw new Error(`transformers import failed (${pkg.name}): ${code ? `${code} ` : ''}${errorMessage(err)}`, { cause: err });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// A quantized MiniLM is about 23 MB, so two minutes is a 1.5 Mbit/s link; a load from disk takes about a second.
|
|
48
|
+
// The backoff matches the reranker outage warning's repeat window, so each window has one attempt and one warning.
|
|
49
|
+
export const MODEL_LOAD_POLICY = { timeoutMs: 2 * MINUTE_MS, backoffMs: 5 * MINUTE_MS };
|
|
50
|
+
/** One load per key at a time, bounded by the policy's timeout; `onFailure` hears each failed attempt, so once per backoff window. */
|
|
51
|
+
export function createModelLoads(policy, onFailure) {
|
|
52
|
+
const loaded = new Map();
|
|
53
|
+
const inFlight = new Map();
|
|
54
|
+
const failed = new Map();
|
|
55
|
+
const attempt = (key, start) => new Promise((resolve, reject) => {
|
|
56
|
+
const timer = setTimeout(() => reject(new Error(`${key} did not load within ${policy.timeoutMs / 1000} s`)), policy.timeoutMs);
|
|
57
|
+
timer.unref();
|
|
58
|
+
Promise.resolve().then(start).then((model) => {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
loaded.set(key, model);
|
|
61
|
+
failed.delete(key);
|
|
62
|
+
resolve(model);
|
|
63
|
+
}, (err) => {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
reject(err instanceof Error ? err : new Error(errorMessage(err)));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
load(key, start) {
|
|
70
|
+
const model = loaded.get(key);
|
|
71
|
+
if (model !== undefined)
|
|
72
|
+
return Promise.resolve(model);
|
|
73
|
+
const pending = inFlight.get(key);
|
|
74
|
+
if (pending)
|
|
75
|
+
return pending;
|
|
76
|
+
const failure = failed.get(key);
|
|
77
|
+
if (failure && Date.now() < failure.until)
|
|
78
|
+
return Promise.reject(failure.error);
|
|
79
|
+
const next = attempt(key, start).catch((err) => {
|
|
80
|
+
failed.set(key, { error: err, until: Date.now() + policy.backoffMs });
|
|
81
|
+
onFailure?.(key, err);
|
|
82
|
+
throw err;
|
|
83
|
+
}).finally(() => inFlight.delete(key));
|
|
84
|
+
inFlight.set(key, next);
|
|
85
|
+
return next;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=transformers.js.map
|
|
@@ -3,5 +3,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
|
|
|
3
3
|
export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
|
|
4
4
|
export { lessonFromFailure, failureReport, type FailureReport } from '../capture/failure-reading.js';
|
|
5
5
|
export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
|
|
6
|
-
export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../
|
|
6
|
+
export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
|
|
7
7
|
//# sourceMappingURL=session-text.d.ts.map
|
|
@@ -5,5 +5,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
|
|
|
5
5
|
export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
|
|
6
6
|
export { lessonFromFailure, failureReport } from '../capture/failure-reading.js';
|
|
7
7
|
export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
|
|
8
|
-
export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../
|
|
8
|
+
export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
|
|
9
9
|
//# sourceMappingURL=session-text.js.map
|
package/dist/eval/eval-suite.js
CHANGED
|
@@ -5,6 +5,7 @@ import { search } from '../search/bm25-search.js';
|
|
|
5
5
|
import { multihopSearch } from '../search/multihop.js';
|
|
6
6
|
import { mrr, recallAtK, ndcgAtK } from './eval.js';
|
|
7
7
|
import { DAY_MS } from '../util/time.js';
|
|
8
|
+
import { pct } from '../util/format.js';
|
|
8
9
|
const BASE_DATE = new Date('2026-01-15T10:00:00Z');
|
|
9
10
|
function dateOffset(days) {
|
|
10
11
|
const d = new Date(BASE_DATE.getTime() + days * DAY_MS);
|
|
@@ -51,19 +52,24 @@ function addDirectRecall(entries, cases) {
|
|
|
51
52
|
}
|
|
52
53
|
/** Extraction preference: extracted facts should rank above raw source. */
|
|
53
54
|
function addExtractionPreference(entries, cases) {
|
|
54
|
-
entries.push(mem('ep-src-1', 'speaker:Alice: So we had this big meeting yesterday about the deployment pipeline and Bob mentioned that the staging environment is
|
|
55
|
+
entries.push(mem('ep-src-1', 'speaker:Alice: So we had this big meeting yesterday about the deployment pipeline and Bob mentioned that the staging environment is ' +
|
|
56
|
+
'using Kubernetes 1.28 and we should upgrade to 1.30 before the end of Q2 because of the security patches', {
|
|
55
57
|
created: dateOffset(10), tags: ['speaker:Alice', 'topic:infrastructure', 'session:meeting-1'],
|
|
56
58
|
}), mem('ep-ext-1', 'The staging environment runs Kubernetes 1.28 and needs to be upgraded to 1.30 before end of Q2 for security patches', {
|
|
57
59
|
created: dateOffset(10), layer: Layer.Semantic, tags: ['speaker:Alice', 'topic:infrastructure', 'extracted'],
|
|
58
60
|
extracted_from: 'ep-src-1',
|
|
59
|
-
}), mem('ep-src-2', 'speaker:Bob: Yeah and the thing about the monitoring is that we switched from Datadog to Grafana last month and the alerting rules
|
|
61
|
+
}), mem('ep-src-2', 'speaker:Bob: Yeah and the thing about the monitoring is that we switched from Datadog to Grafana last month and the alerting rules ' +
|
|
62
|
+
'still need to be migrated, Carol was supposed to handle that but she has been busy with the frontend rewrite', {
|
|
60
63
|
created: dateOffset(11), tags: ['speaker:Bob', 'topic:monitoring', 'session:meeting-1'],
|
|
61
|
-
}), mem('ep-ext-2', 'The team switched from Datadog to Grafana last month but alerting rules have not been migrated yet. Carol is responsible but blocked
|
|
64
|
+
}), mem('ep-ext-2', 'The team switched from Datadog to Grafana last month but alerting rules have not been migrated yet. Carol is responsible but blocked ' +
|
|
65
|
+
'by the frontend rewrite.', {
|
|
62
66
|
created: dateOffset(11), layer: Layer.Semantic, tags: ['speaker:Bob', 'topic:monitoring', 'extracted'],
|
|
63
67
|
extracted_from: 'ep-src-2',
|
|
64
|
-
}), mem('ep-src-3', 'speaker:Carol: The login page redesign is almost done, I just need to wire up the OAuth2 PKCE flow with the new identity provider and
|
|
68
|
+
}), mem('ep-src-3', 'speaker:Carol: The login page redesign is almost done, I just need to wire up the OAuth2 PKCE flow with the new identity provider and ' +
|
|
69
|
+
'write the integration tests', {
|
|
65
70
|
created: dateOffset(12), tags: ['speaker:Carol', 'topic:auth', 'session:meeting-2'],
|
|
66
|
-
}), mem('ep-ext-3', 'Carol is nearly done with the login page redesign. Remaining work: wire up OAuth2 PKCE flow with the new identity provider and write
|
|
71
|
+
}), mem('ep-ext-3', 'Carol is nearly done with the login page redesign. Remaining work: wire up OAuth2 PKCE flow with the new identity provider and write ' +
|
|
72
|
+
'integration tests.', {
|
|
67
73
|
created: dateOffset(12), layer: Layer.Semantic, tags: ['speaker:Carol', 'topic:auth', 'extracted'],
|
|
68
74
|
extracted_from: 'ep-src-3',
|
|
69
75
|
}));
|
|
@@ -89,7 +95,8 @@ function addDagDrilldown(entries, cases) {
|
|
|
89
95
|
}), mem('dag-child-3', 'Batch API endpoint /reports/generate takes 8 seconds because it runs synchronously instead of using a job queue', {
|
|
90
96
|
created: dateOffset(15), layer: Layer.Semantic, tags: ['topic:api-performance', 'extracted'],
|
|
91
97
|
dag_level: 1,
|
|
92
|
-
}), mem('dag-summary-1', 'API performance issues: /users degraded to 300ms (permissions check), /orders spiked to 500ms (missing index), /reports takes 8s
|
|
98
|
+
}), mem('dag-summary-1', 'API performance issues: /users degraded to 300ms (permissions check), /orders spiked to 500ms (missing index), /reports takes 8s ' +
|
|
99
|
+
'(needs job queue)', {
|
|
93
100
|
created: dateOffset(16), layer: Layer.Semantic, tags: ['topic:api-performance'],
|
|
94
101
|
dag_level: 2, dag_parent_id: undefined,
|
|
95
102
|
}));
|
|
@@ -171,7 +178,8 @@ function addMultiHop(entries, cases) {
|
|
|
171
178
|
created: dateOffset(26), tags: ['speaker:Bob', 'topic:payments'],
|
|
172
179
|
}), mem('mh-3', 'speaker:Alice fixed the Stripe webhook by switching to the production secret key. Payment confirmations now arrive within 2 seconds.', {
|
|
173
180
|
created: dateOffset(27), tags: ['speaker:Alice', 'topic:payments'],
|
|
174
|
-
}), mem('mh-4', 'speaker:Carol reported that the billing dashboard shows incorrect revenue numbers because it reads from the payments_raw table instead of
|
|
181
|
+
}), mem('mh-4', 'speaker:Carol reported that the billing dashboard shows incorrect revenue numbers because it reads from the payments_raw table instead of ' +
|
|
182
|
+
'payments_reconciled.', {
|
|
175
183
|
created: dateOffset(28), tags: ['speaker:Carol', 'topic:billing'],
|
|
176
184
|
}));
|
|
177
185
|
cases.push({
|
|
@@ -286,9 +294,6 @@ export function resultToBaseline(result) {
|
|
|
286
294
|
overall: result.overall,
|
|
287
295
|
};
|
|
288
296
|
}
|
|
289
|
-
function pct(n) {
|
|
290
|
-
return (n * 100).toFixed(1) + '%';
|
|
291
|
-
}
|
|
292
297
|
function pad(s, w) {
|
|
293
298
|
return s.padEnd(w);
|
|
294
299
|
}
|
|
@@ -315,7 +320,8 @@ export function formatResult(result, baseline) {
|
|
|
315
320
|
vsBaseline = deltaStr(delta);
|
|
316
321
|
verdict = delta < -REGRESSION_THRESHOLD ? 'REGRESS' : 'PASS';
|
|
317
322
|
}
|
|
318
|
-
|
|
323
|
+
const cells = [pad(feat.category, 24), pad(pct(feat.mrr), 8), pad(pct(feat.recallAt5), 8), pad(pct(feat.ndcgAt5), 8), pad(vsBaseline, 12), verdict];
|
|
324
|
+
lines.push(cells.join(' | '));
|
|
319
325
|
}
|
|
320
326
|
lines.push('');
|
|
321
327
|
lines.push(`Overall: MRR ${pct(result.overall.mrr)} | R@5 ${pct(result.overall.recallAt5)} | NDCG@5 ${pct(result.overall.ndcgAt5)}`);
|
package/dist/eval/eval.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* It exists so MMR lambda, embedding weights and scoring tweaks are tuned against evidence instead of intuition. */
|
|
3
3
|
import { hybridSearch } from '../search/hybrid.js';
|
|
4
4
|
import { searchBothHybrid } from '../sharing/search-both.js';
|
|
5
|
-
import { isInitialized } from '../
|
|
5
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
6
6
|
// Generous so metrics are not truncated.
|
|
7
7
|
const DEFAULT_EVAL_BUDGET = 100_000;
|
|
8
8
|
const QUERY_WORDS = 8;
|
package/dist/eval/judgment.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
|
|
3
3
|
* every captured memory currently lands on a flat schema_fit of 0.5. */
|
|
4
4
|
import { fetchWithRetry } from '../util/http-retry.js';
|
|
5
|
-
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
6
6
|
import { readCappedJson } from '../util/capped-json.js';
|
|
7
7
|
import { isJsonNumber, isJsonObject, isJsonString } from '../util/json.js';
|
|
8
8
|
const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
|
|
@@ -19,7 +19,9 @@ function answerNamed(reply, name) {
|
|
|
19
19
|
const QUESTIONS = {
|
|
20
20
|
durable: {
|
|
21
21
|
type: 'noul',
|
|
22
|
-
instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to
|
|
22
|
+
instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to ' +
|
|
23
|
+
'a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. ' +
|
|
24
|
+
'Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
|
|
23
25
|
},
|
|
24
26
|
kind: {
|
|
25
27
|
type: 'choice',
|
|
@@ -73,10 +75,15 @@ async function post(content, opts) {
|
|
|
73
75
|
}, { timeoutMs: JUDGE_TIMEOUT_MS, fetchFn: opts.fetcher });
|
|
74
76
|
}
|
|
75
77
|
catch (err) {
|
|
76
|
-
log.
|
|
78
|
+
log.warn(`judge: request failed: ${errorMessage(err)}`, errorFields(err));
|
|
77
79
|
return null;
|
|
78
80
|
}
|
|
79
|
-
|
|
81
|
+
if (res.ok)
|
|
82
|
+
return res;
|
|
83
|
+
// The body is the server's reply, never the request, so it cannot hold the key.
|
|
84
|
+
const snippet = (await res.text().catch(() => '')).slice(0, 200);
|
|
85
|
+
log.warn('judge: non-2xx reply', { status: res.status, body: snippet });
|
|
86
|
+
return null;
|
|
80
87
|
}
|
|
81
88
|
/** `null` on any failure, so a Jev outage degrades capture to today's
|
|
82
89
|
* behaviour instead of blocking the write. */
|
package/dist/graph/extract.js
CHANGED
|
@@ -101,7 +101,7 @@ function deriveEntities(loaded) {
|
|
|
101
101
|
pass.byType[entityType] = 0;
|
|
102
102
|
for (const row of rows) {
|
|
103
103
|
pass.allRows.push(row);
|
|
104
|
-
// Names are uncapped at source; trimming on both sides of the cap gives the exact name
|
|
104
|
+
// Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntityRow stores.
|
|
105
105
|
const name = (row.name ?? '').trim().slice(0, MAX_ENTITY_NAME_LEN).trim();
|
|
106
106
|
const key = keyOf(row.entityType, row.e2Id);
|
|
107
107
|
// A row seen twice was superseded between the two status loads; its first sighting stands.
|
|
@@ -220,7 +220,7 @@ export function extractGraph(hippoRoot, tenantId) {
|
|
|
220
220
|
// Loaded first: opening a second connection under the rebuild's BEGIN IMMEDIATE dead-locks ('database is locked').
|
|
221
221
|
const derived = deriveGraph(loadGraphSources(hippoRoot, tenantId));
|
|
222
222
|
// Diffed and applied under one lock, so two concurrent rebuilds serialize instead of both inserting a missing row.
|
|
223
|
-
const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb,
|
|
223
|
+
const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
|
|
224
224
|
return resultOf(derived, skipped);
|
|
225
225
|
}
|
|
226
226
|
/** extractGraph for sleep: diffs outside the lock, then applies in transactions of about `budget.holdMs` with a pause
|
|
@@ -237,7 +237,7 @@ export async function extractGraphChunked(hippoRoot, tenantId, budget = WRITE_BU
|
|
|
237
237
|
await budget.pause(committedAt);
|
|
238
238
|
const from = next;
|
|
239
239
|
// Sleep's wait, not a server request's 250 ms: each chunk is a fresh BEGIN IMMEDIATE a hook's write could otherwise fail.
|
|
240
|
-
const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb,
|
|
240
|
+
const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
|
|
241
241
|
committedAt = budget.clock();
|
|
242
242
|
next = chunk.next;
|
|
243
243
|
skipped += chunk.skipped;
|
package/dist/graph/recall.js
CHANGED
|
@@ -6,7 +6,7 @@ import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
|
6
6
|
import { estimateTokens } from '../util/token-text.js';
|
|
7
7
|
import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
|
|
8
8
|
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
|
|
9
|
-
import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../
|
|
9
|
+
import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../core/recall-scope.js';
|
|
10
10
|
/** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
|
|
11
11
|
* worst-case work and keeps the flag honest). */
|
|
12
12
|
export const MAX_HOPS = 3;
|
package/dist/graph/view.js
CHANGED
|
@@ -146,15 +146,23 @@ const CLIENT_JS = [
|
|
|
146
146
|
" var panning=false,sx=0,sy=0;",
|
|
147
147
|
" svg.addEventListener('mousedown',function(e){if(e.target.closest('.node'))return;panning=true;sx=e.clientX;sy=e.clientY;});",
|
|
148
148
|
" window.addEventListener('mouseup',function(){panning=false;});",
|
|
149
|
-
" window.addEventListener('mousemove',function(e){if(!panning)return;var r=svg.getBoundingClientRect();var
|
|
150
|
-
|
|
151
|
-
" var
|
|
149
|
+
" window.addEventListener('mousemove',function(e){if(!panning)return;var r=svg.getBoundingClientRect();var " +
|
|
150
|
+
"k=view.w/r.width;view.x-=(e.clientX-sx)*k;view.y-=(e.clientY-sy)*k;sx=e.clientX;sy=e.clientY;apply();});",
|
|
151
|
+
" svg.addEventListener('wheel',function(e){e.preventDefault();var r=svg.getBoundingClientRect();var mx=view.x+(e.clientX-r.left)/r.width*view.w;var " +
|
|
152
|
+
"my=view.y+(e.clientY-r.top)/r.height*view.h;var " +
|
|
153
|
+
"f=e.deltaY<0?0.9:1.1;view.x=mx-(mx-view.x)*f;view.y=my-(my-view.y)*f;view.w*=f;view.h*=f;apply();},{passive:false});",
|
|
154
|
+
" var data={};try{data=JSON.parse(document.getElementById('graph-data').textContent);}",
|
|
155
|
+
" catch(e){console.error('hippo graph: embedded model is not valid JSON',e);}",
|
|
152
156
|
" var adj={};(data.edges||[]).forEach(function(e){(adj[e.from]=adj[e.from]||[]).push(e.to);(adj[e.to]=adj[e.to]||[]).push(e.from);});",
|
|
153
157
|
" var active=null;",
|
|
154
|
-
" document.querySelectorAll('.node').forEach(function(g){g.addEventListener('click',function(ev){ev.stopPropagation();var
|
|
158
|
+
" document.querySelectorAll('.node').forEach(function(g){g.addEventListener('click',function(ev){ev.stopPropagation();var " +
|
|
159
|
+
"id=g.getAttribute('data-id');if(active===id){clearHi();active=null;return;}active=id;highlight(id);});});",
|
|
155
160
|
" svg.addEventListener('click',function(){clearHi();active=null;});",
|
|
156
161
|
" function clearHi(){svg.classList.remove('focused');document.querySelectorAll('.hi').forEach(function(el){el.classList.remove('hi');});}",
|
|
157
|
-
" function highlight(id){clearHi();svg.classList.add('focused');var
|
|
162
|
+
" function highlight(id){clearHi();svg.classList.add('focused');var " +
|
|
163
|
+
"keep={};keep[id]=1;(adj[id]||[]).forEach(function(n){keep[n]=1;});document.querySelectorAll('.node').forEach(" +
|
|
164
|
+
"function(g){if(keep[g.getAttribute('data-id')])g.classList.add('hi');});document.querySelectorAll('.edge').forEach(" +
|
|
165
|
+
"function(l){if(l.getAttribute('data-from')===id||l.getAttribute('data-to')===id)l.classList.add('hi');});}",
|
|
158
166
|
"})();",
|
|
159
167
|
].join("\n");
|
|
160
168
|
const STYLE = [
|
package/dist/graph/write.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface ApplyGraphOpsResult {
|
|
|
6
6
|
}
|
|
7
7
|
/** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
|
|
8
8
|
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
9
|
-
export declare function applyGraphOps(db: DatabaseSyncLike,
|
|
9
|
+
export declare function applyGraphOps(db: DatabaseSyncLike, tenantId: string, ops: readonly GraphOp[], opts: {
|
|
10
10
|
readonly from: number;
|
|
11
11
|
readonly holdMs: number;
|
|
12
12
|
readonly clock?: () => number;
|
package/dist/graph/write.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
|
|
2
2
|
import { assertTenantId } from '../store/tenant.js';
|
|
3
3
|
import { clock } from '../util/write-budget.js';
|
|
4
|
-
import { deleteEntityRow, deleteRelationRow, entityIdBySource,
|
|
5
|
-
function insertDesiredRelation(db,
|
|
4
|
+
import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntityRow, insertRelationRow, objectInForce, relationPresent, updateEntityRow } from '../store/graph-writes.js';
|
|
5
|
+
function insertDesiredRelation(db, tenantId, rel) {
|
|
6
6
|
const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
|
|
7
7
|
const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
|
|
8
8
|
if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
|
|
9
9
|
return false;
|
|
10
10
|
if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
|
|
11
11
|
return false;
|
|
12
|
-
|
|
12
|
+
insertRelationRow(db, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject });
|
|
13
13
|
return true;
|
|
14
14
|
}
|
|
15
15
|
/** Applies one op; false when a writer since the diff made it stale, which the next run's diff repairs. */
|
|
16
|
-
function applyGraphOp(db,
|
|
16
|
+
function applyGraphOp(db, tenantId, op) {
|
|
17
17
|
switch (op.op) {
|
|
18
18
|
case 'deleteEntity':
|
|
19
19
|
deleteEntityRow(db, tenantId, op.id);
|
|
@@ -24,27 +24,27 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
|
|
|
24
24
|
case 'updateEntity':
|
|
25
25
|
if (!objectInForce(db, tenantId, op.entity.sourceObject))
|
|
26
26
|
return false;
|
|
27
|
-
return
|
|
27
|
+
return updateEntityRow(db, tenantId, op.id, op.entity) !== null;
|
|
28
28
|
case 'insertEntity':
|
|
29
29
|
// A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
|
|
30
30
|
if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined)
|
|
31
31
|
return false;
|
|
32
|
-
|
|
32
|
+
insertEntityRow(db, tenantId, op.entity);
|
|
33
33
|
return true;
|
|
34
34
|
case 'insertRelation':
|
|
35
|
-
return insertDesiredRelation(db,
|
|
35
|
+
return insertDesiredRelation(db, tenantId, op.relation);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
/** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
|
|
39
39
|
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
40
|
-
export function applyGraphOps(db,
|
|
40
|
+
export function applyGraphOps(db, tenantId, ops, opts) {
|
|
41
41
|
assertTenantId('applyGraphOps', tenantId);
|
|
42
42
|
const now = opts.clock ?? clock;
|
|
43
43
|
const begunAt = now();
|
|
44
44
|
let next = opts.from;
|
|
45
45
|
let skipped = 0;
|
|
46
46
|
while (next < ops.length) {
|
|
47
|
-
if (!applyGraphOp(db,
|
|
47
|
+
if (!applyGraphOp(db, tenantId, ops[next]))
|
|
48
48
|
skipped += 1;
|
|
49
49
|
next += 1;
|
|
50
50
|
if (now() - begunAt >= opts.holdMs)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { isJsonString } from '../util/json.js';
|
|
4
|
+
import { errorMessage, log } from '../util/log.js';
|
|
4
5
|
function collectFiles(dir) {
|
|
5
6
|
if (!fs.existsSync(dir))
|
|
6
7
|
return [];
|
|
@@ -42,8 +43,8 @@ function readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes) {
|
|
|
42
43
|
ordered.push(sessionId);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
catch {
|
|
46
|
-
|
|
46
|
+
catch (err) {
|
|
47
|
+
log.warn(`codex history ${historyPath}: skipped a malformed JSONL line (${errorMessage(err)})`);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
return ordered;
|
|
@@ -3,7 +3,8 @@ import * as fs from 'fs';
|
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { PACKAGE_ROOT } from '../core/package-root.js';
|
|
5
5
|
import { errorMessage, log } from '../util/log.js';
|
|
6
|
-
import { HIPPO_CODEX_WRAPPER_MARKER,
|
|
6
|
+
import { HIPPO_CODEX_WRAPPER_MARKER, ensureDir } from './shared.js';
|
|
7
|
+
import { homeDir, codexHomeDir } from '../util/agent-homes.js';
|
|
7
8
|
import { isJsonString } from '../util/json.js';
|
|
8
9
|
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
9
10
|
export function resolveCodexWrapperPaths() {
|
package/dist/hooks/json-hooks.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* OpenCode rejects the JSON-hook schema (no `hooks` key), so it gets a TS plugin (OPENCODE_PLUGIN_SOURCE); see installCodexHooks, installCopilotHooks. */
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
-
import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER,
|
|
5
|
+
import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, copilotHooksFile, defaultPreCompactLogPath } from './shared.js';
|
|
6
|
+
import { claudeConfigDir, codexHomeDir, homeDir } from '../util/agent-homes.js';
|
|
6
7
|
import { isJsonString, readJsonFile, isJsonObjectLiteral } from '../util/json.js';
|
|
7
8
|
import { escapeRegex } from '../util/escape.js';
|
|
8
9
|
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
@@ -348,7 +349,8 @@ function warnKeptHippoHandlers(settingsPath, hooks) {
|
|
|
348
349
|
});
|
|
349
350
|
if (kept.length === 0)
|
|
350
351
|
return;
|
|
351
|
-
process.stderr.write(`hippo kept these hook handlers in ${settingsPath} because they do not start with a hippo command;
|
|
352
|
+
process.stderr.write(`hippo kept these hook handlers in ${settingsPath} because they do not start with a hippo command; ` +
|
|
353
|
+
`remove any that are hippo's by hand: ${kept.map((c) => JSON.stringify(c)).join(', ')}\n`);
|
|
352
354
|
}
|
|
353
355
|
/** Removes hippo's own hook handlers from `target`'s settings file and keeps every other handler; true when the file changed. */
|
|
354
356
|
export function uninstallJsonHooks(target) {
|
package/dist/hooks/opencode.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { homeDir } from '
|
|
3
|
+
import { homeDir } from '../util/agent-homes.js';
|
|
4
4
|
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
5
5
|
import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
|
|
6
6
|
const HIPPO_OPENCODE_PLUGIN_MARKER = 'HIPPO_OPENCODE_PLUGIN_V1';
|
|
@@ -20,12 +20,15 @@ export const HippoPlugin = async ({ $ }) => {
|
|
|
20
20
|
if (typeof $ !== "function") return;
|
|
21
21
|
try {
|
|
22
22
|
if (event.type === "session.idle") {
|
|
23
|
-
await $\`hippo session-end\`.quiet().nothrow();
|
|
23
|
+
const r = await $\`hippo session-end\`.quiet().nothrow();
|
|
24
|
+
if (r && r.exitCode !== 0) console.error("[hippo] session-end exited " + r.exitCode);
|
|
24
25
|
} else if (event.type === "session.created") {
|
|
25
|
-
await $\`hippo last-sleep\`.quiet().nothrow();
|
|
26
|
+
const r = await $\`hippo last-sleep\`.quiet().nothrow();
|
|
27
|
+
if (r && r.exitCode !== 0) console.error("[hippo] last-sleep exited " + r.exitCode);
|
|
26
28
|
}
|
|
27
|
-
} catch {
|
|
28
|
-
// hippo CLI not on PATH or other failure
|
|
29
|
+
} catch (err) {
|
|
30
|
+
// hippo CLI not on PATH or other failure: never crash the host session.
|
|
31
|
+
console.error("[hippo] plugin hook failed: " + (err && err.message ? err.message : err));
|
|
29
32
|
}
|
|
30
33
|
},
|
|
31
34
|
};
|
package/dist/hooks/shared.d.ts
CHANGED
|
@@ -17,15 +17,9 @@ export declare const HIPPO_PRE_COMPACT_MARKER = "hippo pre-compact";
|
|
|
17
17
|
export declare const HIPPO_COMPACT_RESUME_MARKER = "hippo compact-resume";
|
|
18
18
|
export declare const HIPPO_CAPTURE_ERROR_MARKER = "hippo capture-error";
|
|
19
19
|
export declare const HIPPO_POST_COMPACT_MARKER = "hippo post-compact";
|
|
20
|
-
export declare function homeDir(): string;
|
|
21
|
-
/** Codex's config folder: $CODEX_HOME, else ~/.codex, as the Codex hooks docs describe. */
|
|
22
|
-
export declare function codexHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
23
20
|
/** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
|
|
24
21
|
* Copilot apps resolve it (a HOME that differs from the profile must not move it). */
|
|
25
22
|
export declare function copilotHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
26
|
-
/** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
|
|
27
|
-
* ~/.claude under os.homedir(), as Claude Code does (a HOME that differs from the profile must not move it). */
|
|
28
|
-
export declare function claudeConfigDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
29
23
|
/** Codex counts as installed only when its config folder exists: Codex itself refuses a CODEX_HOME that is not a folder. */
|
|
30
24
|
export declare function isCodexPresent(home?: string): boolean;
|
|
31
25
|
/** hippo's own hooks file, in the hooks folder the Copilot CLI reads. */
|
package/dist/hooks/shared.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { processEnv } from '../util/env.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
-
import { vscodeDataFolders } from '../agent-
|
|
5
|
+
import { claudeConfigDir, codexHomeDir, homeDir, vscodeDataFolders } from '../util/agent-homes.js';
|
|
6
6
|
export const HIPPO_SLEEP_MARKER = 'hippo sleep';
|
|
7
7
|
export const HIPPO_LAST_SLEEP_MARKER = 'hippo last-sleep';
|
|
8
8
|
export const HIPPO_CAPTURE_MARKER = 'hippo capture --last-session';
|
|
@@ -14,23 +14,11 @@ export const HIPPO_PRE_COMPACT_MARKER = 'hippo pre-compact';
|
|
|
14
14
|
export const HIPPO_COMPACT_RESUME_MARKER = 'hippo compact-resume';
|
|
15
15
|
export const HIPPO_CAPTURE_ERROR_MARKER = 'hippo capture-error';
|
|
16
16
|
export const HIPPO_POST_COMPACT_MARKER = 'hippo post-compact';
|
|
17
|
-
export function homeDir() {
|
|
18
|
-
return envHomeDir() || os.homedir();
|
|
19
|
-
}
|
|
20
|
-
/** Codex's config folder: $CODEX_HOME, else ~/.codex, as the Codex hooks docs describe. */
|
|
21
|
-
export function codexHomeDir(home = homeDir(), env = processEnv()) {
|
|
22
|
-
return env.CODEX_HOME || path.join(home, '.codex');
|
|
23
|
-
}
|
|
24
17
|
/** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
|
|
25
18
|
* Copilot apps resolve it (a HOME that differs from the profile must not move it). */
|
|
26
19
|
export function copilotHomeDir(home = os.homedir(), env = processEnv()) {
|
|
27
20
|
return env.COPILOT_HOME || path.join(home, '.copilot');
|
|
28
21
|
}
|
|
29
|
-
/** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
|
|
30
|
-
* ~/.claude under os.homedir(), as Claude Code does (a HOME that differs from the profile must not move it). */
|
|
31
|
-
export function claudeConfigDir(home = os.homedir(), env = processEnv()) {
|
|
32
|
-
return env.CLAUDE_CONFIG_DIR || path.join(home, '.claude');
|
|
33
|
-
}
|
|
34
22
|
/** Codex counts as installed only when its config folder exists: Codex itself refuses a CODEX_HOME that is not a folder. */
|
|
35
23
|
export function isCodexPresent(home = homeDir()) {
|
|
36
24
|
return fs.statSync(codexHomeDir(home), { throwIfNoEntry: false })?.isDirectory() === true;
|
|
@@ -90,7 +78,8 @@ export function detectInstalledTools() {
|
|
|
90
78
|
kind: 'wrapper',
|
|
91
79
|
notes: 'memory hooks in hooks.json, and wraps the detected codex launcher for session-end consolidation'
|
|
92
80
|
},
|
|
93
|
-
{ name: 'copilot', configDir: copilotHomeDir(), detected: isCopilotPresent(), kind: 'json-hook', notes: 'hooks in hooks/hippo.json, the MCP server in
|
|
81
|
+
{ name: 'copilot', configDir: copilotHomeDir(), detected: isCopilotPresent(), kind: 'json-hook', notes: 'hooks in hooks/hippo.json, the MCP server in ' +
|
|
82
|
+
'mcp-config.json and a block in copilot-instructions.md; for VS Code, the server in each User mcp.json and prompts/hippo.instructions.md' },
|
|
94
83
|
{
|
|
95
84
|
name: 'cursor',
|
|
96
85
|
configDir: '~/.cursor',
|
package/dist/importers/core.js
CHANGED
|
@@ -7,7 +7,7 @@ import { loadAllEntries } from '../store/entry-reads.js';
|
|
|
7
7
|
import { duplicateKey, storedTextKeys } from '../util/same-text.js';
|
|
8
8
|
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
9
9
|
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
10
|
-
import { RejectedValueError } from '../
|
|
10
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
11
11
|
import { rejectionGuardRefuses } from '../store/rejected-values.js';
|
|
12
12
|
import { loadConfig } from '../core/config.js';
|
|
13
13
|
import { vetSecrets } from '../util/secret-detect.js';
|
|
@@ -2,6 +2,7 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { importEntries } from './core.js';
|
|
4
4
|
import { splitMarkdownFrontmatter, collectMarkdownFiles } from './markdown-parse.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
6
|
import { isJsonString, isJsonObject } from '../util/json.js';
|
|
6
7
|
/** Coerce one imported record (string, `{content|text: ...}` object, or
|
|
7
8
|
* anything else) into the plain-text memory chunk it represents. */
|
|
@@ -29,8 +30,8 @@ function parseChatGPTFile(filePath) {
|
|
|
29
30
|
return parsed.map(extractMemoryText).filter(Boolean);
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
catch {
|
|
33
|
-
|
|
33
|
+
catch (err) {
|
|
34
|
+
log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as plain text`);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
// Plain text: one memory per line
|
|
@@ -116,8 +117,8 @@ function parseClaudeFile(filePath) {
|
|
|
116
117
|
return parsed.map(extractMemoryText).filter(Boolean);
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
|
-
catch {
|
|
120
|
-
|
|
120
|
+
catch (err) {
|
|
121
|
+
log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as markdown`);
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
// Markdown file: strip hippo block and split
|
package/dist/importers/vault.js
CHANGED
|
@@ -5,8 +5,8 @@ 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
11
|
import { withRequestStoresSync } from '../db/request-stores.js';
|
|
12
12
|
import { loadConfig } from '../core/config.js';
|
|
@@ -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
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -32,8 +32,9 @@ 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
39
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
|
|
39
40
|
export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';
|