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
package/dist/graph/recall.js
CHANGED
|
@@ -1,40 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* READ-ONLY consumer of the graph substrate (entities/relations built by graph-extract,
|
|
5
|
-
* guarded by the graph-on-consolidated triggers). Given the lexical recall seeds, walk the relations graph up to N
|
|
6
|
-
* hops and surface the memories of reached entities that the lexical search did not
|
|
7
|
-
* already return.
|
|
8
|
-
*
|
|
9
|
-
* Relation-type-AGNOSTIC: it walks whatever edges exist. Today the graph holds only
|
|
10
|
-
* `supersedes` edges (so a 1-hop walk surfaces a supersession-linked predecessor/
|
|
11
|
-
* successor a lexical search may miss); the moment extraction emits cross-object edges
|
|
12
|
-
* (owns/depends-on/blocked-by/references) the SAME traversal lights up cross-entity
|
|
13
|
-
* multi-hop with zero rework here.
|
|
14
|
-
*
|
|
15
|
-
* Design points:
|
|
16
|
-
* 1. Graph-reached memories are loaded DIRECTLY by id (tenant-scoped PK fetch), NOT
|
|
17
|
-
* intersected with the recall handler's candidate set — that set is lexically
|
|
18
|
-
* prefiltered (loadSearchRows filters by query tokens), so intersecting would exclude
|
|
19
|
-
* exactly the lexically-orthogonal neighbours graph recall exists to surface. We
|
|
20
|
-
* re-apply the recall HARD filters to the directly-loaded rows: the FULL bi-temporal
|
|
21
|
-
* as-of rule (valid_from <= asOf AND, for a superseded row, successor.valid_from >
|
|
22
|
-
* asOf — same as cmdRecall) and the default superseded-drop. SCOPE is intentionally
|
|
23
|
-
* NOT re-applied: the CLI caller (cmdRecall) does not hard-filter scope either (it
|
|
24
|
-
* only soft-boosts it). Rows are tenant-scoped + archived-excluded (loadEntriesByIds).
|
|
25
|
-
* 2. A graph hit inherits its origin seed's relevance (minus a per-hop discount) and is
|
|
26
|
-
* placed adjacent to that seed; budget selection is by score so a high-value hit wins
|
|
27
|
-
* a token slot over a noise distractor. Dead-last appending made the feature do
|
|
28
|
-
* nothing at realistic budgets.
|
|
29
|
-
* 3. BOTH the local and global stores are expanded — a global seed's entities/relations
|
|
30
|
-
* live under the global root, so graph recall must traverse each seed in the store its
|
|
31
|
-
* graph lives in.
|
|
32
|
-
* 4. By-id loads are chunked at 500 (loadEntriesByIds caps at 500/call), so a high-fanout
|
|
33
|
-
* traversal (--hops 3 --max-neighbors 200 -> up to 600 ids) loses none.
|
|
34
|
-
*
|
|
35
|
-
* No graph writes (only SELECTs via graph.ts read helpers + store reads), so the
|
|
36
|
-
* check-graph-writes lint permits this module living outside graph.ts.
|
|
37
|
-
*/
|
|
1
|
+
/** Multi-hop graph recall: a READ-ONLY walk of the relations graph from the lexical seeds, surfacing reached entities' memories the lexical search missed.
|
|
2
|
+
* Reached rows load by id (not intersected with the lexically prefiltered candidates), then the recall hard filters are re-applied.
|
|
3
|
+
* Hits inherit their seed's score minus a per-hop discount; both stores are expanded; no writes, so check-graph-writes permits it outside graph.ts. */
|
|
38
4
|
import { loadEntriesByIds } from '../store/entry-reads.js';
|
|
39
5
|
import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
40
6
|
import { estimateTokens } from '../util/token-text.js';
|
|
@@ -63,14 +29,10 @@ function loadByIdsChunked(root, tenantId, ids) {
|
|
|
63
29
|
}
|
|
64
30
|
/** BFS, both directions, up to `hops`: each reached entity's via, and the base memory it descends from. */
|
|
65
31
|
function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
|
|
66
|
-
// `visited`
|
|
67
|
-
// `originMemByEntityId` propagates the base-result memory id each reached node descends
|
|
68
|
-
// from (for adjacency placement + score inheritance).
|
|
32
|
+
// `visited` makes expansion cycle-safe; `originMemByEntityId` carries each node's base-result memory id for adjacency placement and score inheritance.
|
|
69
33
|
const visitedEntityIds = new Set(seedEntities.map((e) => e.id));
|
|
70
34
|
const reached = new Map();
|
|
71
|
-
// A seed/reached entity whose mirror was forgotten
|
|
72
|
-
// tolerates null so traversal still propagates origin, and the null is dropped before
|
|
73
|
-
// any memory load below (a mirror-less node has no memory to surface).
|
|
35
|
+
// A seed/reached entity whose mirror was forgotten or pruned has a null memoryId; traversal still propagates origin and the null is dropped before any load.
|
|
74
36
|
const originMemByEntityId = new Map();
|
|
75
37
|
for (const se of seedEntities)
|
|
76
38
|
originMemByEntityId.set(se.id, se.memoryId);
|
|
@@ -117,11 +79,8 @@ function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
|
|
|
117
79
|
/** The recall hard filters (as-of, superseded, scope) re-applied to a directly loaded graph-reached row. */
|
|
118
80
|
function passesRecallFilters(mem, via, successorValidFrom, opts) {
|
|
119
81
|
const { includeSuperseded, asOfDate, recallScope } = opts;
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
// `superseded_by` is NOT set by `hippo decide`, only the decisions table is). By
|
|
123
|
-
// default recall shows current truth, so drop it unless --include-superseded; the
|
|
124
|
-
// `from` endpoint (the newer successor) is always kept.
|
|
82
|
+
// The `to` endpoint of a `supersedes` edge IS the superseded version; the graph is authoritative because `hippo decide` does not set `superseded_by`.
|
|
83
|
+
// Drop it unless --include-superseded; the newer `from` endpoint is always kept.
|
|
125
84
|
const isSupersededEndpoint = via.relType === 'supersedes' && via.direction === 'to';
|
|
126
85
|
if (asOfDate) {
|
|
127
86
|
if (new Date(mem.valid_from) > asOfDate)
|
|
@@ -187,10 +146,8 @@ function buildGraphHit(mem, via, originScore) {
|
|
|
187
146
|
graphVia: via,
|
|
188
147
|
};
|
|
189
148
|
}
|
|
190
|
-
// Reached entities -> source memory ids -> load
|
|
191
|
-
//
|
|
192
|
-
// id BEFORE it reaches loadByIdsChunked / the Set<string> (it cannot be recall-surfaced;
|
|
193
|
-
// it stays in entities/relations for graph extract / visualization).
|
|
149
|
+
// Reached entities -> source memory ids -> load by id (chunked). A mirror-less entity (memoryId === null) has no memory to surface,
|
|
150
|
+
// so drop its null id before it reaches loadByIdsChunked.
|
|
194
151
|
function loadReachedMemories(root, tenantId, reachedEntities, seenMemoryIds) {
|
|
195
152
|
const needLoad = [...new Set(reachedEntities
|
|
196
153
|
.map((e) => e.memoryId)
|
|
@@ -205,16 +162,8 @@ function loadSuccessorValidFrom(root, tenantId, loadedById, asOfDate) {
|
|
|
205
162
|
const succIds = [...new Set([...loadedById.values()].map((m) => m.superseded_by).filter((id) => !!id))];
|
|
206
163
|
return new Map(loadByIdsChunked(root, tenantId, succIds).map((m) => [m.id, m.valid_from]));
|
|
207
164
|
}
|
|
208
|
-
/**
|
|
209
|
-
*
|
|
210
|
-
* the seed results' entities (across the local AND global stores). Each graph hit is
|
|
211
|
-
* inserted directly after the base result it descends from, scored just below that seed;
|
|
212
|
-
* the base list's own order is preserved. Token-budget-bounded; deduped against the base
|
|
213
|
-
* set and across stores.
|
|
214
|
-
*
|
|
215
|
-
* No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
|
|
216
|
-
* graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
|
|
217
|
-
*/
|
|
165
|
+
/** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
|
|
166
|
+
* Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
|
|
218
167
|
export function graphExpandRecall(baseResults, opts) {
|
|
219
168
|
const { hops, hippoRoot, globalRoot, tenantId } = opts;
|
|
220
169
|
if (hops <= 0 || baseResults.length === 0)
|
|
@@ -242,9 +191,7 @@ export function graphExpandRecall(baseResults, opts) {
|
|
|
242
191
|
return mergeKeptHits(baseResults, hitsByOrigin, keep);
|
|
243
192
|
}
|
|
244
193
|
function sortHitsWithinOrigin(hitsByOrigin) {
|
|
245
|
-
// Closer hops first within each origin group, then by inherited score.
|
|
246
|
-
// Hops asc and score desc are both true primary keys (unchanged);
|
|
247
|
-
// compareEntryIdentity is only the TAIL for a same-hop, same-score tie.
|
|
194
|
+
// Closer hops first within each origin group, then by inherited score; compareEntryIdentity only breaks same-hop, same-score ties.
|
|
248
195
|
for (const hits of hitsByOrigin.values()) {
|
|
249
196
|
hits.sort((a, b) => {
|
|
250
197
|
const byHops = a.graphVia.hops - b.graphVia.hops;
|
|
@@ -258,17 +205,8 @@ function sortHitsWithinOrigin(hitsByOrigin) {
|
|
|
258
205
|
function selectWithinBudget(baseResults, allHits, opts) {
|
|
259
206
|
const budget = opts.budget ?? DEFAULT_RECALL_BUDGET;
|
|
260
207
|
const minResults = opts.minResults ?? 1;
|
|
261
|
-
// Budget
|
|
262
|
-
//
|
|
263
|
-
// distractor — otherwise a tight --budget keeps the noise and drops the memory --hops
|
|
264
|
-
// surfaced. The greedy pack uses `continue` (not `break`), so a hit's origin seed is
|
|
265
|
-
// NOT guaranteed kept just because the hit is; the DISPLAY loop guards that (a hit is
|
|
266
|
-
// emitted ONLY under a kept seed, never orphaned). At least one result is always kept.
|
|
267
|
-
// (NOTE: at a tight budget a new graph hit can displace a weakly-scored base result;
|
|
268
|
-
// aggregate recall stays >= baseline, the displaced item is the lowest-value one.)
|
|
269
|
-
// Protect the top --min-results base rows from eviction (graph expansion must not
|
|
270
|
-
// violate the recall min-results floor). They are kept regardless of budget;
|
|
271
|
-
// baseResults is score-ordered, so slice(0, N) is the top N.
|
|
208
|
+
// Budget selection is by score, not position, so a high-value graph hit can beat a low-score lexical distractor; the greedy pack uses `continue`,
|
|
209
|
+
// so the DISPLAY loop emits a hit only under a kept seed. The top --min-results base rows are never evicted; at least one result is kept.
|
|
272
210
|
const protectedCount = Math.min(Math.max(minResults, 1), baseResults.length);
|
|
273
211
|
const keep = new Set(baseResults.slice(0, protectedCount));
|
|
274
212
|
const price = opts.cost ?? ((r) => r.tokens);
|
package/dist/graph/stream.d.ts
CHANGED
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* READ-ONLY consumer of the entity/relation graph. Produces a ranked list of
|
|
5
|
-
* `entries[]` indices ordered by graph
|
|
6
|
-
* proximity to the strong lexical seeds, for use as a 3rd fusion input to `rrfFuse`
|
|
7
|
-
* beside BM25 + dense (src/search.ts hybridSearch, scoring:'rrf').
|
|
8
|
-
*
|
|
9
|
-
* DISTINCT from graph-recall.ts: that INJECTS out-of-pool neighbours post-hoc; this
|
|
10
|
-
* RE-RANKS within the already-filtered candidate pool. It only assigns ranks to
|
|
11
|
-
* entries that are (a) graph-reached from a seed AND (b) present in `entries[]`. Seeds
|
|
12
|
-
* themselves are never scored (they already rank via BM25/dense; scoring them would
|
|
13
|
-
* double-count and dilute the orthogonal graph signal).
|
|
14
|
-
*
|
|
15
|
-
* Reuses the BFS traversal shape from graph-recall.ts (loadEntitiesByMemoryId
|
|
16
|
-
* seeds -> loadNeighborRelations BFS both directions, per-hop fanout cap, visited set
|
|
17
|
-
* -> loadEntitiesByIds to resolve reached -> memoryId). Expands across the local AND
|
|
18
|
-
* global stores. Pure reads (SELECTs only via graph.ts helpers), so the
|
|
19
|
-
* check-graph-writes lint permits this module living outside graph.ts.
|
|
20
|
-
*
|
|
21
|
-
* The graph stream's score scale (1/lexRank seed strength x decay^hops) only sets the
|
|
22
|
-
* WITHIN-graph-stream ORDERING; RRF then re-ranks the list by 1/(k + graphRank), so the
|
|
23
|
-
* absolute magnitude is washed out by fusion. Do not tune the scale expecting a
|
|
24
|
-
* fused-score effect — only the induced order matters.
|
|
25
|
-
*/
|
|
1
|
+
/** Graph-retrieval ranked-list stream for RRF fusion: READ-ONLY, ranks `entries[]` indices by graph proximity to the strong lexical seeds.
|
|
2
|
+
* Unlike graph recall it only re-ranks in-pool, graph-reached, non-seed entries; scoring seeds would double-count BM25/dense.
|
|
3
|
+
* The score scale only sets the order inside this stream (RRF re-ranks by 1/(k + graphRank)), so do not tune it for a fused-score effect. */
|
|
26
4
|
import type { MemoryEntry } from '../core/memory.js';
|
|
27
|
-
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph
|
|
5
|
+
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
|
|
28
6
|
export declare const DEFAULT_GRAPH_HOPS = 2;
|
|
29
7
|
/** Default per-hop multiplicative decay applied to the seed strength. */
|
|
30
8
|
export declare const DEFAULT_GRAPH_DECAY = 0.5;
|
|
@@ -52,19 +30,9 @@ export interface GraphStreamOpts {
|
|
|
52
30
|
/** Per-hop fanout cap. Default DEFAULT_MAX_NEIGHBORS. */
|
|
53
31
|
maxNeighbors?: number;
|
|
54
32
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Pick the top `seedCount` candidates by best lexical rank (lowest position across the
|
|
57
|
-
* BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
|
|
58
|
-
* direct unit testing. A candidate present in either ranked list is eligible.
|
|
59
|
-
*/
|
|
33
|
+
/** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
|
|
60
34
|
export declare function selectGraphSeeds(bm25Ranked: ReadonlyArray<number>, cosineRanked: ReadonlyArray<number>, seedCount: number): GraphSeed[];
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
* proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
|
|
64
|
-
* indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
|
|
65
|
-
*
|
|
66
|
-
* Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
|
|
67
|
-
* entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
|
|
68
|
-
*/
|
|
35
|
+
/** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
|
|
36
|
+
* Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
|
|
69
37
|
export declare function graphRankStream(entries: ReadonlyArray<MemoryEntry>, seeds: ReadonlyArray<GraphSeed>, opts: GraphStreamOpts): number[];
|
|
70
38
|
//# sourceMappingURL=stream.d.ts.map
|
package/dist/graph/stream.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
|
|
2
2
|
import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './recall.js';
|
|
3
|
-
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph
|
|
3
|
+
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
|
|
4
4
|
export const DEFAULT_GRAPH_HOPS = 2;
|
|
5
5
|
/** Default per-hop multiplicative decay applied to the seed strength. */
|
|
6
6
|
export const DEFAULT_GRAPH_DECAY = 0.5;
|
|
@@ -9,11 +9,7 @@ export const DEFAULT_GRAPH_SEED_COUNT = 10;
|
|
|
9
9
|
/** Recommended RRF weight for the graph stream — a CLI-only convenience default. The
|
|
10
10
|
* library `graphStream.weight` option stays REQUIRED (opt-in is explicit). */
|
|
11
11
|
export const DEFAULT_GRAPH_STREAM_WEIGHT = 0.5;
|
|
12
|
-
/**
|
|
13
|
-
* Pick the top `seedCount` candidates by best lexical rank (lowest position across the
|
|
14
|
-
* BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
|
|
15
|
-
* direct unit testing. A candidate present in either ranked list is eligible.
|
|
16
|
-
*/
|
|
12
|
+
/** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
|
|
17
13
|
export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
|
|
18
14
|
if (seedCount <= 0)
|
|
19
15
|
return [];
|
|
@@ -33,11 +29,8 @@ export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
|
|
|
33
29
|
.slice(0, seedCount)
|
|
34
30
|
.map(([index, best]) => ({ index, strength: 1 / (best + 1) }));
|
|
35
31
|
}
|
|
36
|
-
// Pass 1:
|
|
37
|
-
//
|
|
38
|
-
// visited mid-loop would lock it to whichever relation SQLite returned first, so a later
|
|
39
|
-
// edge from a STRONGER lexical seed would be dropped and the neighbour mis-scored. A node
|
|
40
|
-
// already in `visited` was committed at an earlier (shorter) depth and keeps that score.
|
|
32
|
+
// Pass 1: take the STRONGEST reaching-seed strength per new neighbour across ALL relations at this depth before committing any to `visited`;
|
|
33
|
+
// marking mid-loop would lock a node to whichever relation SQLite returned first and drop a stronger seed's later edge.
|
|
41
34
|
function bestStrengthAtDepth(rels, frontierSet, visited, frontierStrength, originStrength) {
|
|
42
35
|
const bestStrengthThisDepth = new Map();
|
|
43
36
|
for (const rel of rels) {
|
|
@@ -98,13 +91,8 @@ function reachedEntityScores(root, tenantId, seedIds, originStrength, options) {
|
|
|
98
91
|
}
|
|
99
92
|
return reachedScore;
|
|
100
93
|
}
|
|
101
|
-
/**
|
|
102
|
-
*
|
|
103
|
-
* `graphScore`. Pure reads. `seeds` are the lexical seeds (index + strength); only the
|
|
104
|
-
* seeds whose entities live in THIS store are expanded. The origin seed strength is
|
|
105
|
-
* carried UNCHANGED along each BFS path; the per-hop decay is applied as decay^depth so
|
|
106
|
-
* a neighbour's score = originSeedStrength x decay^(graph distance).
|
|
107
|
-
*/
|
|
94
|
+
/** Accumulate per-entryIndex graph-proximity scores from ONE store's graph into `graphScore`; only seeds whose entities live in THIS store are expanded.
|
|
95
|
+
* A neighbour's score = originSeedStrength x decay^(graph distance); the seed strength is carried unchanged along each BFS path. */
|
|
108
96
|
function accumulateForRoot(root, seeds, entries, options) {
|
|
109
97
|
const { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId } = options;
|
|
110
98
|
if (seeds.length === 0)
|
|
@@ -119,9 +107,7 @@ function accumulateForRoot(root, seeds, entries, options) {
|
|
|
119
107
|
const seedEntities = loadEntitiesByMemoryId(root, tenantId, [...strengthByMemId.keys()]);
|
|
120
108
|
if (seedEntities.length === 0)
|
|
121
109
|
return;
|
|
122
|
-
// entityId -> origin seed strength
|
|
123
|
-
// loaded by memory id, so its memoryId is non-null here; the guard keeps the widened
|
|
124
|
-
// (string | null) type honest (a null-memory entity is not a lexical seed).
|
|
110
|
+
// entityId -> origin seed strength. Seeds load by memory id so memoryId is non-null here; the guard keeps the widened (string | null) type honest.
|
|
125
111
|
const originStrength = new Map();
|
|
126
112
|
for (const e of seedEntities) {
|
|
127
113
|
if (e.memoryId === null)
|
|
@@ -146,14 +132,8 @@ function accumulateForRoot(root, seeds, entries, options) {
|
|
|
146
132
|
graphScore.set(idx, Math.max(graphScore.get(idx) ?? 0, score));
|
|
147
133
|
}
|
|
148
134
|
}
|
|
149
|
-
/**
|
|
150
|
-
*
|
|
151
|
-
* proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
|
|
152
|
-
* indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
|
|
153
|
-
*
|
|
154
|
-
* Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
|
|
155
|
-
* entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
|
|
156
|
-
*/
|
|
135
|
+
/** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
|
|
136
|
+
* Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
|
|
157
137
|
export function graphRankStream(entries, seeds, opts) {
|
|
158
138
|
if (seeds.length === 0 || entries.length === 0)
|
|
159
139
|
return [];
|
|
@@ -170,11 +150,8 @@ export function graphRankStream(entries, seeds, opts) {
|
|
|
170
150
|
for (const root of roots) {
|
|
171
151
|
accumulateForRoot(root, seeds, entries, { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId: opts.tenantId });
|
|
172
152
|
}
|
|
173
|
-
// Seed-exclusion guard: graphScore is keyed by entryIndex
|
|
174
|
-
//
|
|
175
|
-
// is a seed in one store could be reached as a neighbour in the other store and pick up
|
|
176
|
-
// a score via max(). Drop every seed index so the "seeds are never scored by the graph
|
|
177
|
-
// stream" invariant holds across roots, not just within a single store's traversal.
|
|
153
|
+
// Seed-exclusion guard: graphScore is keyed by entryIndex across roots but each root's visited-set is per-root, so a seed in one store
|
|
154
|
+
// could score as a neighbour in the other; drop every seed index so "seeds are never graph-scored" holds across roots.
|
|
178
155
|
for (const s of seeds)
|
|
179
156
|
graphScore.delete(s.index);
|
|
180
157
|
if (graphScore.size === 0)
|
package/dist/graph/view.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* graph.
|
|
4
|
-
*
|
|
5
|
-
* This module only READS the graph (through the store's graph reads) and renders
|
|
6
|
-
* view-models; it issues no INSERT/UPDATE/DELETE, so `scripts/check-graph-writes.mjs`
|
|
7
|
-
* stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
|
|
8
|
-
* HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
|
|
9
|
-
*/
|
|
1
|
+
/** Graph observability and visualization, READ-ONLY over the entity/relation graph (no writes, so `scripts/check-graph-writes.mjs` stays green).
|
|
2
|
+
* Shared by `hippo graph show|view` and the HTTP `GET /v1/graph` route, which all build the same `GraphModel`. */
|
|
10
3
|
import type { GraphRows } from '../store/port.js';
|
|
11
4
|
import type { EntityType, RelationType } from '../store/graph-rows.js';
|
|
12
5
|
export interface GraphNode {
|
|
@@ -28,12 +21,8 @@ export interface GraphModel {
|
|
|
28
21
|
}
|
|
29
22
|
/** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
|
|
30
23
|
export declare const DEFAULT_VIEW_LIMIT = 500;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
33
|
-
* focus subgraph: every entity whose name === entity, plus their 1-hop neighbours,
|
|
34
|
-
* plus the edges among that union. Dangling edges (an endpoint outside the node
|
|
35
|
-
* set) are always dropped.
|
|
36
|
-
*/
|
|
24
|
+
/** Build the view-model (reads only); with `opts.entity`, a focus subgraph of the entities named so plus their 1-hop neighbours.
|
|
25
|
+
* Dangling edges (an endpoint outside the node set) are always dropped. */
|
|
37
26
|
export declare function buildGraphModel(hippoRoot: string, tenantId: string, opts?: {
|
|
38
27
|
entity?: string;
|
|
39
28
|
limit?: number;
|
|
@@ -41,12 +30,8 @@ export declare function buildGraphModel(hippoRoot: string, tenantId: string, opt
|
|
|
41
30
|
}): GraphModel;
|
|
42
31
|
/** The reply model of the rows a store read: an edge with an endpoint outside the node set is dropped. */
|
|
43
32
|
export declare function graphModelOf({ entities, relations, truncated }: GraphRows): GraphModel;
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* fixed iterations, NO `Math.random`, so the same model always yields the same
|
|
47
|
-
* positions (testable, stable output). Non-finite coordinates from a degenerate
|
|
48
|
-
* step are clamped to the viewport centre; all positions are clamped in-bounds.
|
|
49
|
-
*/
|
|
33
|
+
/** Deterministic Fruchterman-Reingold-style force layout: seeded circular init, fixed iterations, no `Math.random`, so one model gives the same positions.
|
|
34
|
+
* Non-finite coordinates are clamped to the viewport centre and all positions to the bounds. */
|
|
50
35
|
export declare function layoutGraph(model: GraphModel, opts?: {
|
|
51
36
|
width?: number;
|
|
52
37
|
height?: number;
|
|
@@ -57,20 +42,9 @@ export declare function layoutGraph(model: GraphModel, opts?: {
|
|
|
57
42
|
}>;
|
|
58
43
|
/** HTML-escape for SVG text / title / markup content (XSS guard). */
|
|
59
44
|
export declare function escapeHtml(s: string): string;
|
|
60
|
-
/**
|
|
61
|
-
*
|
|
62
|
-
* node-link diagram. Positions are computed server-side (deterministic). User
|
|
63
|
-
* strings are escaped per sink: SVG `<text>`/`<title>` via `escapeHtml`; the model
|
|
64
|
-
* is inlined in a `<script type="application/json">` block with `<`/`>`/`&`
|
|
65
|
-
* unicode-escaped so a `</script>` inside an entity name cannot break out (the
|
|
66
|
-
* client `JSON.parse`s it back and never `innerHTML`s a user string).
|
|
67
|
-
*/
|
|
45
|
+
/** Render the model as a self-contained, offline interactive HTML node-link diagram with server-side deterministic positions.
|
|
46
|
+
* The model is inlined as `<script type="application/json">` with `<`, `>`, `&` unicode-escaped so a `</script>` in an entity name cannot break out. */
|
|
68
47
|
export declare function renderGraphHtml(model: GraphModel): string;
|
|
69
|
-
/**
|
|
70
|
-
* Render the model as a JSON Canvas (jsoncanvas.org) document — `nodes[]` of
|
|
71
|
-
* type `text` positioned by the same deterministic layout, `edges[]` linking
|
|
72
|
-
* them by id. Opens natively in Obsidian. Pure JSON; entity names live in the
|
|
73
|
-
* `text` field (Obsidian renders/sanitizes them).
|
|
74
|
-
*/
|
|
48
|
+
/** Render the model as a JSON Canvas (jsoncanvas.org) document: `text` nodes at the same deterministic layout positions, `edges[]` linking them by id. */
|
|
75
49
|
export declare function renderGraphCanvas(model: GraphModel): string;
|
|
76
50
|
//# sourceMappingURL=view.d.ts.map
|
package/dist/graph/view.js
CHANGED
|
@@ -1,24 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* graph.
|
|
4
|
-
*
|
|
5
|
-
* This module only READS the graph (through the store's graph reads) and renders
|
|
6
|
-
* view-models; it issues no INSERT/UPDATE/DELETE, so `scripts/check-graph-writes.mjs`
|
|
7
|
-
* stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
|
|
8
|
-
* HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
|
|
9
|
-
*/
|
|
1
|
+
/** Graph observability and visualization, READ-ONLY over the entity/relation graph (no writes, so `scripts/check-graph-writes.mjs` stays green).
|
|
2
|
+
* Shared by `hippo graph show|view` and the HTTP `GET /v1/graph` route, which all build the same `GraphModel`. */
|
|
10
3
|
import { withGraphReadSnapshot } from '../store/graph-reads.js';
|
|
11
4
|
import { graphViewRows } from '../store/graph-view-rows.js';
|
|
12
5
|
const DEFAULT_LAYOUT_ITERATIONS = 300;
|
|
13
6
|
const NODE_LABEL_MAX_CHARS = 22;
|
|
14
7
|
/** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
|
|
15
8
|
export const DEFAULT_VIEW_LIMIT = 500;
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
* focus subgraph: every entity whose name === entity, plus their 1-hop neighbours,
|
|
19
|
-
* plus the edges among that union. Dangling edges (an endpoint outside the node
|
|
20
|
-
* set) are always dropped.
|
|
21
|
-
*/
|
|
9
|
+
/** Build the view-model (reads only); with `opts.entity`, a focus subgraph of the entities named so plus their 1-hop neighbours.
|
|
10
|
+
* Dangling edges (an endpoint outside the node set) are always dropped. */
|
|
22
11
|
export function buildGraphModel(hippoRoot, tenantId, opts = {}) {
|
|
23
12
|
const limit = opts.limit ?? DEFAULT_VIEW_LIMIT;
|
|
24
13
|
// One read snapshot, so a concurrent graph rebuild cannot make the model mix old entity ids with new relation ids.
|
|
@@ -105,12 +94,8 @@ function applyDisplacement(nodes, pos, disp, temp, width, height) {
|
|
|
105
94
|
p.y = Math.max(20, Math.min(height - 20, ny));
|
|
106
95
|
});
|
|
107
96
|
}
|
|
108
|
-
/**
|
|
109
|
-
*
|
|
110
|
-
* fixed iterations, NO `Math.random`, so the same model always yields the same
|
|
111
|
-
* positions (testable, stable output). Non-finite coordinates from a degenerate
|
|
112
|
-
* step are clamped to the viewport centre; all positions are clamped in-bounds.
|
|
113
|
-
*/
|
|
97
|
+
/** Deterministic Fruchterman-Reingold-style force layout: seeded circular init, fixed iterations, no `Math.random`, so one model gives the same positions.
|
|
98
|
+
* Non-finite coordinates are clamped to the viewport centre and all positions to the bounds. */
|
|
114
99
|
export function layoutGraph(model, opts = {}) {
|
|
115
100
|
const width = opts.width ?? LAYOUT_W;
|
|
116
101
|
const height = opts.height ?? LAYOUT_H;
|
|
@@ -150,10 +135,8 @@ const NODE_COLORS = {
|
|
|
150
135
|
person: '#3b82f6',
|
|
151
136
|
system: '#64748b',
|
|
152
137
|
};
|
|
153
|
-
// Client script: pan
|
|
154
|
-
//
|
|
155
|
-
// strings never reach an HTML sink here. No template literals / `${}` so it nests
|
|
156
|
-
// safely inside this module's own template strings.
|
|
138
|
+
// Client script: pan, zoom, click-to-highlight. It reads the inlined model via JSON.parse (never innerHTML)
|
|
139
|
+
// and uses no template literals or `${}`, so it nests in this module's template strings.
|
|
157
140
|
const CLIENT_JS = [
|
|
158
141
|
"(function(){",
|
|
159
142
|
" var svg=document.getElementById('g');",
|
|
@@ -231,14 +214,8 @@ function renderLegend(model) {
|
|
|
231
214
|
.map((t) => `<span style="color:${nodeColor(t)}">●</span> ${escapeHtml(t)}`)
|
|
232
215
|
.join(' ');
|
|
233
216
|
}
|
|
234
|
-
/**
|
|
235
|
-
*
|
|
236
|
-
* node-link diagram. Positions are computed server-side (deterministic). User
|
|
237
|
-
* strings are escaped per sink: SVG `<text>`/`<title>` via `escapeHtml`; the model
|
|
238
|
-
* is inlined in a `<script type="application/json">` block with `<`/`>`/`&`
|
|
239
|
-
* unicode-escaped so a `</script>` inside an entity name cannot break out (the
|
|
240
|
-
* client `JSON.parse`s it back and never `innerHTML`s a user string).
|
|
241
|
-
*/
|
|
217
|
+
/** Render the model as a self-contained, offline interactive HTML node-link diagram with server-side deterministic positions.
|
|
218
|
+
* The model is inlined as `<script type="application/json">` with `<`, `>`, `&` unicode-escaped so a `</script>` in an entity name cannot break out. */
|
|
242
219
|
export function renderGraphHtml(model) {
|
|
243
220
|
const pos = layoutGraph(model);
|
|
244
221
|
const edgeSvg = renderEdgeSvg(model, pos);
|
|
@@ -262,12 +239,7 @@ export function renderGraphHtml(model) {
|
|
|
262
239
|
'</body></html>',
|
|
263
240
|
].join('\n');
|
|
264
241
|
}
|
|
265
|
-
/**
|
|
266
|
-
* Render the model as a JSON Canvas (jsoncanvas.org) document — `nodes[]` of
|
|
267
|
-
* type `text` positioned by the same deterministic layout, `edges[]` linking
|
|
268
|
-
* them by id. Opens natively in Obsidian. Pure JSON; entity names live in the
|
|
269
|
-
* `text` field (Obsidian renders/sanitizes them).
|
|
270
|
-
*/
|
|
242
|
+
/** Render the model as a JSON Canvas (jsoncanvas.org) document: `text` nodes at the same deterministic layout positions, `edges[]` linking them by id. */
|
|
271
243
|
export function renderGraphCanvas(model) {
|
|
272
244
|
const pos = layoutGraph(model, { width: 2400, height: 1600 });
|
|
273
245
|
const nodes = model.nodes.map((node) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { envPath } from '../util/env.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import {
|
|
4
|
+
import { PACKAGE_ROOT } from '../core/package-root.js';
|
|
5
5
|
import { errorMessage, log } from '../util/log.js';
|
|
6
6
|
import { HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
|
|
7
7
|
import { isJsonString } from '../util/json.js';
|
|
@@ -68,7 +68,7 @@ function isCodexWrapperMetadataValid(metadata) {
|
|
|
68
68
|
isHippoCodexWrapperFile(metadata.commandPath));
|
|
69
69
|
}
|
|
70
70
|
function resolveHippoCliPath() {
|
|
71
|
-
return
|
|
71
|
+
return path.join(PACKAGE_ROOT, 'bin', 'hippo.js');
|
|
72
72
|
}
|
|
73
73
|
function quoteForShell(value) {
|
|
74
74
|
return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
|
package/dist/hooks/copilot.js
CHANGED
|
@@ -77,7 +77,8 @@ function hippoCommand() {
|
|
|
77
77
|
export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'local', command: hippoCommand(), args: ['mcp'], env: {}, tools: ['*'] }) };
|
|
78
78
|
/** VS Code's mcp.json keeps stdio servers under "servers"; it has no "mcpServers" key. */
|
|
79
79
|
export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
|
|
80
|
-
/** Only a server hippo wrote counts as hippo's: another command, other args, or
|
|
80
|
+
/** Only a server hippo wrote counts as hippo's: another command, other args, or
|
|
81
|
+
* any key or value setup does not write (an env you added) makes it the user's. */
|
|
81
82
|
function isHipposServer(entry, host) {
|
|
82
83
|
if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
|
|
83
84
|
return false;
|
|
@@ -2,11 +2,15 @@ export declare const HOOK_MARKERS: {
|
|
|
2
2
|
start: string;
|
|
3
3
|
end: string;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
5
|
+
export interface HookSpec {
|
|
6
6
|
file: string;
|
|
7
7
|
content: string;
|
|
8
8
|
description: string;
|
|
9
|
-
}
|
|
9
|
+
}
|
|
10
|
+
export interface HookTable {
|
|
11
|
+
[agent: string]: HookSpec;
|
|
12
|
+
}
|
|
13
|
+
export declare const HOOKS: HookTable;
|
|
10
14
|
/** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
|
|
11
15
|
export declare function hippoBlock(text: string): {
|
|
12
16
|
start: number;
|