hippo-memory 1.70.0 → 1.71.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/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
|
@@ -1,41 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The local `@huggingface/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
|
|
5
|
-
* API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
|
|
6
|
-
* (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
|
|
7
|
-
* `fetch` global (Node >= 22.16, see package.json engines; NO new dependency) and
|
|
8
|
-
* read their key from a conventional env var. The provider is selected by
|
|
9
|
-
* `config.embeddings.provider` (default `'local'`).
|
|
10
|
-
*
|
|
11
|
-
* Design contract:
|
|
12
|
-
* - Local provider `id` is the BARE model string; the STORED identity adds a `#t<N>`
|
|
13
|
-
* embed-text-format suffix (`embeddingIndexIdentity`), so older stores reindex once:
|
|
14
|
-
* their vectors were computed over path-contaminated text.
|
|
15
|
-
* - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
|
|
16
|
-
* (or a dimension change) flips the identity and triggers the existing
|
|
17
|
-
* reindex-on-change path.
|
|
18
|
-
* - `resolveEmbeddingProvider` throws on an invalid config (unknown provider,
|
|
19
|
-
* bad apiBaseUrl); `embedMemory` turns that into a warning. `isAvailable()` is provider-aware
|
|
20
|
-
* (local -> dependency installed; api -> key present). `embed()` MAY throw on
|
|
21
|
-
* a hard transport/auth failure so a reindex can abort atomically; hot paths
|
|
22
|
-
* wrap it and fall back to BM25.
|
|
23
|
-
*
|
|
24
|
-
* The exact request/response shapes for the API providers are documented from each
|
|
25
|
-
* vendor's public embeddings API; they are unit-tested here against a mocked
|
|
26
|
-
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
27
|
-
* egress-blocked in the build sandbox).
|
|
28
|
-
*/
|
|
1
|
+
/** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
|
|
2
|
+
* Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
|
|
3
|
+
* `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
|
|
29
4
|
import { type EmbeddingRole } from './local.js';
|
|
30
5
|
export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
|
|
31
6
|
export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
|
|
7
|
+
export interface EmbedCallOptions {
|
|
8
|
+
/** Ends the whole call when it aborts, every batch and retry included. The local provider runs in process and ignores it. */
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
}
|
|
32
11
|
export interface EmbeddingProvider {
|
|
33
12
|
readonly kind: EmbeddingProviderKind;
|
|
34
13
|
readonly model: string;
|
|
35
|
-
/**
|
|
36
|
-
* Identity recorded in DB meta to drive reindex-on-change.
|
|
37
|
-
* local -> bare model string (back-compat); api -> `${kind}:${model}`.
|
|
38
|
-
*/
|
|
14
|
+
/** Identity recorded in DB meta to drive reindex-on-change: bare model string for local, `${kind}:${model}` for api. */
|
|
39
15
|
readonly id: string;
|
|
40
16
|
/** Known fixed output dimension, if any (undefined for local / unknown). */
|
|
41
17
|
readonly dimensions?: number;
|
|
@@ -43,12 +19,9 @@ export interface EmbeddingProvider {
|
|
|
43
19
|
readonly keyEnv?: string;
|
|
44
20
|
/** local -> dependency installed; api -> key present. NEVER throws. */
|
|
45
21
|
isAvailable(): boolean;
|
|
46
|
-
/**
|
|
47
|
-
*
|
|
48
|
-
|
|
49
|
-
* failure (so a reindex aborts before saving a partial index).
|
|
50
|
-
*/
|
|
51
|
-
embed(texts: string[], role?: EmbeddingRole): Promise<number[][]>;
|
|
22
|
+
/** Batch-embed: one row per input in order, `[]` when that item could not be embedded.
|
|
23
|
+
* MAY throw on a hard transport/auth failure so a reindex aborts before saving a partial index. */
|
|
24
|
+
embed(texts: string[], role?: EmbeddingRole, call?: EmbedCallOptions): Promise<number[][]>;
|
|
52
25
|
}
|
|
53
26
|
export interface ResolveProviderOptions {
|
|
54
27
|
/** Explicit model override (mirrors resolveEmbeddingModel's explicitModel). */
|
|
@@ -56,22 +29,12 @@ export interface ResolveProviderOptions {
|
|
|
56
29
|
/** Explicit provider override (mainly for tests). */
|
|
57
30
|
provider?: EmbeddingProviderKind;
|
|
58
31
|
}
|
|
59
|
-
/**
|
|
60
|
-
*
|
|
61
|
-
* Never throws for a missing key — that surfaces via `isAvailable()` on the hot
|
|
62
|
-
* paths and as a hard error only from the explicit `hippo embed` command. The
|
|
63
|
-
* only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
|
|
64
|
-
* deliberate loud failure; hot-path callers (search) wrap this in try/catch.
|
|
65
|
-
*/
|
|
32
|
+
/** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
|
|
33
|
+
* only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
|
|
66
34
|
export declare function resolveEmbeddingProvider(hippoRoot: string, opts?: ResolveProviderOptions): EmbeddingProvider;
|
|
67
|
-
/**
|
|
68
|
-
*
|
|
69
|
-
* everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
|
|
70
|
-
*/
|
|
35
|
+
/** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
|
|
36
|
+
* happen. */
|
|
71
37
|
export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: ResolveProviderOptions): string;
|
|
72
|
-
/**
|
|
73
|
-
* Provider-aware availability for a store: local -> dependency installed;
|
|
74
|
-
* api -> key present. Use at the call sites that decide whether to embed.
|
|
75
|
-
*/
|
|
38
|
+
/** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
|
|
76
39
|
export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
|
|
77
40
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1,38 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The local `@huggingface/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
|
|
5
|
-
* API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
|
|
6
|
-
* (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
|
|
7
|
-
* `fetch` global (Node >= 22.16, see package.json engines; NO new dependency) and
|
|
8
|
-
* read their key from a conventional env var. The provider is selected by
|
|
9
|
-
* `config.embeddings.provider` (default `'local'`).
|
|
10
|
-
*
|
|
11
|
-
* Design contract:
|
|
12
|
-
* - Local provider `id` is the BARE model string; the STORED identity adds a `#t<N>`
|
|
13
|
-
* embed-text-format suffix (`embeddingIndexIdentity`), so older stores reindex once:
|
|
14
|
-
* their vectors were computed over path-contaminated text.
|
|
15
|
-
* - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
|
|
16
|
-
* (or a dimension change) flips the identity and triggers the existing
|
|
17
|
-
* reindex-on-change path.
|
|
18
|
-
* - `resolveEmbeddingProvider` throws on an invalid config (unknown provider,
|
|
19
|
-
* bad apiBaseUrl); `embedMemory` turns that into a warning. `isAvailable()` is provider-aware
|
|
20
|
-
* (local -> dependency installed; api -> key present). `embed()` MAY throw on
|
|
21
|
-
* a hard transport/auth failure so a reindex can abort atomically; hot paths
|
|
22
|
-
* wrap it and fall back to BM25.
|
|
23
|
-
*
|
|
24
|
-
* The exact request/response shapes for the API providers are documented from each
|
|
25
|
-
* vendor's public embeddings API; they are unit-tested here against a mocked
|
|
26
|
-
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
27
|
-
* egress-blocked in the build sandbox).
|
|
28
|
-
*/
|
|
1
|
+
/** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
|
|
2
|
+
* Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
|
|
3
|
+
* `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
|
|
29
4
|
import { envByName } from '../../util/env.js';
|
|
30
5
|
import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local.js';
|
|
31
6
|
import { loadConfig } from '../../core/config.js';
|
|
32
7
|
import { errorMessage, log } from '../../util/log.js';
|
|
33
8
|
import { redactSecretsStrict } from '../../util/secret-detect.js';
|
|
34
9
|
import { fetchWithRetry } from '../../util/http-retry.js';
|
|
10
|
+
import { readCappedJson, readCappedText } from '../../util/capped-json.js';
|
|
35
11
|
const ERROR_DETAIL_CHARS = 300;
|
|
12
|
+
// An error body is read for its first lines only; 4x leaves room for multi-byte text.
|
|
13
|
+
const ERROR_BODY_MAX_BYTES = ERROR_DETAIL_CHARS * 4;
|
|
14
|
+
// 16,384 dimensions at 32 bytes a number: four times a 4,096-dimension model.
|
|
15
|
+
const EMBED_REPLY_BYTES_PER_INPUT = 512 * 1024;
|
|
16
|
+
const EMBED_REPLY_BASE_BYTES = 64 * 1024;
|
|
36
17
|
export const API_PROVIDER_KINDS = ['openai', 'voyage', 'cohere'];
|
|
37
18
|
function isApiProviderKind(x) {
|
|
38
19
|
return x === 'openai' || x === 'voyage' || x === 'cohere';
|
|
@@ -41,9 +22,8 @@ const DEFAULT_API_BATCH_SIZE = 64;
|
|
|
41
22
|
/** Per-request timeout for API embedding calls. A provider/proxy that accepts
|
|
42
23
|
* the connection but never responds must not hang embed/recall indefinitely. */
|
|
43
24
|
const REQUEST_TIMEOUT_MS = 30_000;
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
25
|
+
// Under a caller's deadline a longer Retry-After hands the reply back at once; the remote rerankers use the same cap.
|
|
26
|
+
const DEADLINE_RETRY_WAIT_CAP_MS = 2_000;
|
|
47
27
|
class LocalEmbeddingProvider {
|
|
48
28
|
model;
|
|
49
29
|
enabled;
|
|
@@ -78,8 +58,7 @@ const API_PROVIDER_SPECS = {
|
|
|
78
58
|
// OpenAI has no asymmetric query/passage input type for embeddings.
|
|
79
59
|
buildBody: (model, texts) => ({ model, input: texts }),
|
|
80
60
|
extractVectors: (json) => {
|
|
81
|
-
// SAFETY: OpenAI's documented embeddings
|
|
82
|
-
// validates vector count/non-emptiness against the request afterward,
|
|
61
|
+
// SAFETY: OpenAI's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
|
|
83
62
|
// so a malformed response degrades to [] here and throws there.
|
|
84
63
|
const data = json.data ?? [];
|
|
85
64
|
return data.map((d) => d.embedding ?? []);
|
|
@@ -97,8 +76,7 @@ const API_PROVIDER_SPECS = {
|
|
|
97
76
|
return body;
|
|
98
77
|
},
|
|
99
78
|
extractVectors: (json) => {
|
|
100
|
-
// SAFETY: Voyage's documented embeddings
|
|
101
|
-
// validates vector count/non-emptiness against the request afterward,
|
|
79
|
+
// SAFETY: Voyage's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
|
|
102
80
|
// so a malformed response degrades to [] here and throws there.
|
|
103
81
|
const data = json.data ?? [];
|
|
104
82
|
return data.map((d) => d.embedding ?? []);
|
|
@@ -116,10 +94,8 @@ const API_PROVIDER_SPECS = {
|
|
|
116
94
|
embedding_types: ['float'],
|
|
117
95
|
}),
|
|
118
96
|
extractVectors: (json) => {
|
|
119
|
-
// Cohere v2: { embeddings: { float: number[][] } }
|
|
120
|
-
// SAFETY:
|
|
121
|
-
// validates vector count/non-emptiness against the request afterward,
|
|
122
|
-
// so a malformed response degrades to [] here and throws there.
|
|
97
|
+
// Cohere v2 shape: { embeddings: { float: number[][] } }
|
|
98
|
+
// SAFETY: documented v2 envelope; embedChunk validates the vectors afterward, so a malformed response degrades to [] here and throws there.
|
|
123
99
|
const emb = json.embeddings;
|
|
124
100
|
return emb?.float ?? [];
|
|
125
101
|
},
|
|
@@ -169,7 +145,7 @@ class ApiEmbeddingProvider {
|
|
|
169
145
|
isAvailable() {
|
|
170
146
|
return this.enabled && !!envByName(this.keyEnv)?.trim();
|
|
171
147
|
}
|
|
172
|
-
async embed(texts, role) {
|
|
148
|
+
async embed(texts, role, call = {}) {
|
|
173
149
|
if (texts.length === 0)
|
|
174
150
|
return [];
|
|
175
151
|
const key = envByName(this.keyEnv)?.trim();
|
|
@@ -181,21 +157,19 @@ class ApiEmbeddingProvider {
|
|
|
181
157
|
const out = [];
|
|
182
158
|
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
183
159
|
const chunk = texts.slice(i, i + this.batchSize);
|
|
184
|
-
const vecs = await this.embedChunk(chunk, key, role);
|
|
160
|
+
const vecs = await this.embedChunk(chunk, key, role, call.signal);
|
|
185
161
|
for (const v of vecs)
|
|
186
162
|
out.push(v.length > 0 ? l2normalize(v) : v);
|
|
187
163
|
}
|
|
188
164
|
return out;
|
|
189
165
|
}
|
|
190
|
-
async embedChunk(chunk, key, role) {
|
|
166
|
+
async embedChunk(chunk, key, role, signal) {
|
|
191
167
|
const spec = API_PROVIDER_SPECS[this.kind];
|
|
192
|
-
const resp = await this.postChunk(chunk, key, role);
|
|
193
|
-
const json = await this.responseJson(resp, key);
|
|
168
|
+
const resp = await this.postChunk(chunk, key, role, signal);
|
|
169
|
+
const json = await this.responseJson(resp, key, chunk.length);
|
|
194
170
|
const vectors = spec.extractVectors(json);
|
|
195
|
-
// A 200
|
|
196
|
-
//
|
|
197
|
-
// so a reindex aborts atomically (preserving the prior usable index) and the
|
|
198
|
-
// explicit backfill surfaces it, instead of silently saving []-padded rows.
|
|
171
|
+
// A 200 with the wrong vector count (or any empty/malformed vector) is a provider contract violation, not a per-item miss:
|
|
172
|
+
// throw so a reindex aborts atomically and the explicit backfill surfaces it, instead of saving []-padded rows.
|
|
199
173
|
if (vectors.length !== chunk.length) {
|
|
200
174
|
throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
|
|
201
175
|
}
|
|
@@ -206,7 +180,7 @@ class ApiEmbeddingProvider {
|
|
|
206
180
|
}
|
|
207
181
|
return vectors;
|
|
208
182
|
}
|
|
209
|
-
async postChunk(chunk, key, role) {
|
|
183
|
+
async postChunk(chunk, key, role, signal) {
|
|
210
184
|
const spec = API_PROVIDER_SPECS[this.kind];
|
|
211
185
|
const url = `${this.baseUrl.replace(/\/$/, '')}/${spec.path}`;
|
|
212
186
|
try {
|
|
@@ -217,7 +191,13 @@ class ApiEmbeddingProvider {
|
|
|
217
191
|
authorization: `Bearer ${key}`,
|
|
218
192
|
},
|
|
219
193
|
body: JSON.stringify(spec.buildBody(this.model, chunk.map(redactSecretsStrict), role)),
|
|
220
|
-
|
|
194
|
+
signal,
|
|
195
|
+
}, {
|
|
196
|
+
timeoutMs: REQUEST_TIMEOUT_MS,
|
|
197
|
+
// Embedding the same text twice changes nothing on the far side, so a dropped connection or a stalled attempt is replayed.
|
|
198
|
+
retryTransport: true,
|
|
199
|
+
maxDelayMs: signal ? DEADLINE_RETRY_WAIT_CAP_MS : undefined,
|
|
200
|
+
});
|
|
221
201
|
}
|
|
222
202
|
catch (err) {
|
|
223
203
|
const msg = errorMessage(err);
|
|
@@ -225,11 +205,11 @@ class ApiEmbeddingProvider {
|
|
|
225
205
|
}
|
|
226
206
|
}
|
|
227
207
|
/** The body of an OK reply; any other status, or a body that is not JSON, throws with the key cut out. */
|
|
228
|
-
async responseJson(resp, key) {
|
|
208
|
+
async responseJson(resp, key, inputs) {
|
|
229
209
|
if (!resp.ok) {
|
|
230
210
|
let detail = '';
|
|
231
211
|
try {
|
|
232
|
-
detail = await resp
|
|
212
|
+
detail = await readCappedText(resp, ERROR_BODY_MAX_BYTES);
|
|
233
213
|
}
|
|
234
214
|
catch {
|
|
235
215
|
/* ignore body read error */
|
|
@@ -237,11 +217,13 @@ class ApiEmbeddingProvider {
|
|
|
237
217
|
throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
|
|
238
218
|
}
|
|
239
219
|
try {
|
|
240
|
-
return await resp
|
|
220
|
+
return await readCappedJson(resp, EMBED_REPLY_BASE_BYTES + inputs * EMBED_REPLY_BYTES_PER_INPUT);
|
|
241
221
|
}
|
|
242
222
|
catch (err) {
|
|
243
223
|
const msg = errorMessage(err);
|
|
244
|
-
throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), {
|
|
224
|
+
throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), {
|
|
225
|
+
cause: redactedCause(err instanceof Error && err.cause ? err.cause : err, key)
|
|
226
|
+
});
|
|
245
227
|
}
|
|
246
228
|
}
|
|
247
229
|
}
|
|
@@ -273,13 +255,8 @@ function validateBaseUrl(url, fallback) {
|
|
|
273
255
|
}
|
|
274
256
|
return candidate;
|
|
275
257
|
}
|
|
276
|
-
/**
|
|
277
|
-
*
|
|
278
|
-
* Never throws for a missing key — that surfaces via `isAvailable()` on the hot
|
|
279
|
-
* paths and as a hard error only from the explicit `hippo embed` command. The
|
|
280
|
-
* only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
|
|
281
|
-
* deliberate loud failure; hot-path callers (search) wrap this in try/catch.
|
|
282
|
-
*/
|
|
258
|
+
/** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
|
|
259
|
+
* only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
|
|
283
260
|
export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
|
|
284
261
|
const cfg = readEmbeddingsConfig(hippoRoot);
|
|
285
262
|
const requested = opts.provider ?? cfg.provider ?? 'local';
|
|
@@ -306,17 +283,12 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
|
|
|
306
283
|
: DEFAULT_API_BATCH_SIZE;
|
|
307
284
|
return new ApiEmbeddingProvider(kind, model, baseUrl, batchSize, enabled);
|
|
308
285
|
}
|
|
309
|
-
/**
|
|
310
|
-
*
|
|
311
|
-
* everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
|
|
312
|
-
*/
|
|
286
|
+
/** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
|
|
287
|
+
* happen. */
|
|
313
288
|
export function resolveEmbeddingIdentity(hippoRoot, opts = {}) {
|
|
314
289
|
return resolveEmbeddingProvider(hippoRoot, opts).id;
|
|
315
290
|
}
|
|
316
|
-
/**
|
|
317
|
-
* Provider-aware availability for a store: local -> dependency installed;
|
|
318
|
-
* api -> key present. Use at the call sites that decide whether to embed.
|
|
319
|
-
*/
|
|
291
|
+
/** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
|
|
320
292
|
export function isEmbeddingConfigured(hippoRoot) {
|
|
321
293
|
try {
|
|
322
294
|
return resolveEmbeddingProvider(hippoRoot).isAvailable();
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
3
|
export declare const TENANT_IS = "+tenant_id = ?";
|
|
4
|
-
/**
|
|
5
|
-
* Read a memory entry by ID.
|
|
6
|
-
*
|
|
7
|
-
* When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
|
|
8
|
-
* lookups return null). When omitted, no tenant filter is applied — preserves
|
|
9
|
-
* legacy single-tenant callers and the writeEntry/readEntry round-trip.
|
|
10
|
-
*/
|
|
4
|
+
/** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
|
|
11
5
|
export declare function readEntry(hippoRoot: string, id: string, tenantId?: string): MemoryEntry | null;
|
|
12
6
|
/** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
|
|
13
7
|
export declare const ID_CHUNK = 500;
|
|
@@ -19,60 +13,29 @@ export declare function heldIdLookup(hippoRoot: string, tenantId: string, ids: r
|
|
|
19
13
|
export declare function selectEntriesByIds(db: DatabaseSyncLike, ids: readonly string[], tenantId?: string): Map<string, MemoryEntry>;
|
|
20
14
|
/** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
|
|
21
15
|
export declare function selectChildrenByParent(db: DatabaseSyncLike, parentIds: readonly string[], tenantId?: string): Map<string, MemoryEntry[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
|
|
24
|
-
* within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
|
|
25
|
-
* Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
|
|
26
|
-
*/
|
|
16
|
+
/** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
|
|
27
17
|
export declare function loadEntriesByIds(hippoRoot: string, ids: readonly string[], tenantId?: string): MemoryEntry[];
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* oldest-first. Used by `api.assemble` to walk a session's chronological
|
|
31
|
-
* context. Excludes superseded rows.
|
|
32
|
-
*
|
|
33
|
-
* Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
|
|
34
|
-
* reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
|
|
35
|
-
*
|
|
36
|
-
* Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
|
|
37
|
-
*/
|
|
18
|
+
/** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
|
|
19
|
+
* With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and break fresh-tail in assemble. */
|
|
38
20
|
export declare function loadSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, cap?: number, origins?: readonly string[]): MemoryEntry[];
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* the full session size even when `rowCap` truncates the loaded window,
|
|
42
|
-
* WITHOUT leaking rows the caller wouldn't have been allowed to load.
|
|
43
|
-
*
|
|
44
|
-
* An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
|
|
45
|
-
* against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
|
|
46
|
-
* - explicit scope passed: exact-match
|
|
47
|
-
* - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
|
|
48
|
-
*
|
|
49
|
-
* `tenantId` is optional for back-compat. Pass `undefined` only when
|
|
50
|
-
* intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
|
|
51
|
-
*/
|
|
21
|
+
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
|
|
22
|
+
* `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
|
|
52
23
|
export declare function countSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, scope?: string, ownScope?: string, origins?: readonly string[]): number;
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
* `sessionId` is supplied, also constrains to a specific session — that
|
|
56
|
-
* is the correct shape for "what did I just see in THIS session."
|
|
57
|
-
*
|
|
58
|
-
* Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
|
|
59
|
-
* pass undefined only for "anything new across the whole tenant".
|
|
60
|
-
*
|
|
61
|
-
* Bounded count cap at 200 — beyond that the caller should filter via
|
|
62
|
-
* tags/scope rather than time-windowed recall.
|
|
63
|
-
*
|
|
64
|
-
* The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
|
|
65
|
-
* `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
|
|
66
|
-
*/
|
|
24
|
+
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
|
|
25
|
+
* The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
|
|
67
26
|
export declare function loadFreshRawMemories(hippoRoot: string, count: number, tenantId?: string, sessionId?: string, origins?: readonly string[]): MemoryEntry[];
|
|
68
|
-
/**
|
|
69
|
-
* Load all entries from SQLite.
|
|
70
|
-
*
|
|
71
|
-
* When `tenantId` is provided, results are scoped to that tenant. Omitting it
|
|
72
|
-
* yields all rows (legacy behavior used by consolidate/autolearn etc.). Recall
|
|
73
|
-
* paths that surface results to a user MUST pass a resolved tenant.
|
|
74
|
-
*/
|
|
27
|
+
/** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
|
|
75
28
|
export declare function loadAllEntries(hippoRoot: string, tenantId?: string): MemoryEntry[];
|
|
29
|
+
/** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
|
|
30
|
+
export declare function loadAllEntryIds(hippoRoot: string): string[];
|
|
31
|
+
export interface EntriesWithBase {
|
|
32
|
+
entries: MemoryEntry[];
|
|
33
|
+
base: {
|
|
34
|
+
get(id: string): MemoryEntry | undefined;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the store is kept. */
|
|
38
|
+
export declare function loadAllEntriesWithBase(hippoRoot: string): EntriesWithBase;
|
|
76
39
|
/** Every memory row on an open connection, so a caller can read inside its own transaction. */
|
|
77
40
|
export declare function selectAllEntries(db: DatabaseSyncLike, tenantId?: string): MemoryEntry[];
|
|
78
41
|
/** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
@@ -115,7 +78,8 @@ export declare function selectRowsOutsideSourcePrefixAt(db: DatabaseSyncLike, te
|
|
|
115
78
|
content: string;
|
|
116
79
|
source: string;
|
|
117
80
|
}>;
|
|
118
|
-
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
81
|
+
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
82
|
+
* in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
|
|
119
83
|
export declare function loadLiveContentsBySourceAndTag(hippoRoot: string, tenantId: string, source: string, tag: string, exceptSessionId: string): string[];
|
|
120
84
|
/** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
121
85
|
export declare function loadCurrentDistilledEntries(hippoRoot: string): MemoryEntry[];
|