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
|
@@ -20,24 +20,11 @@ export interface InvalidationOptions {
|
|
|
20
20
|
/** Consider ONLY this memory id (no content/tag matching). */
|
|
21
21
|
onlyId?: string;
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
*
|
|
25
|
-
* Returns null if the commit isn't a breaking/migration change.
|
|
26
|
-
*/
|
|
23
|
+
/** Extract what was replaced/removed from a commit message.
|
|
24
|
+
* Returns null if the commit isn't a breaking/migration change. */
|
|
27
25
|
export declare function extractInvalidationTarget(message: string): InvalidationTarget | null;
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* - Halves half_life_days
|
|
31
|
-
* - Sets confidence to 'stale'
|
|
32
|
-
* - Adds 'invalidated' tag
|
|
33
|
-
* - Skips pinned memories (reported in skippedPinned)
|
|
34
|
-
*
|
|
35
|
-
* Tag matching is EXACT (2026-06-09 incident): the FULL pattern must equal a
|
|
36
|
-
* tag. Token-level matching applies to content only, so a pattern that merely
|
|
37
|
-
* CONTAINS a common tag word ("hippo") can no longer mass-weaken every memory
|
|
38
|
-
* carrying that tag. Both callers (the CLI `invalidate` command and the
|
|
39
|
-
* auto-learn-from-git path) inherit this contract.
|
|
40
|
-
*/
|
|
26
|
+
/** Find memories that reference the invalidated pattern and weaken them (halve half_life_days, confidence 'stale', add 'invalidated' tag; pinned are skipped).
|
|
27
|
+
* Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
|
|
41
28
|
export declare function invalidateMatching(hippoRoot: string, target: InvalidationTarget, tenantId?: string, options?: InvalidationOptions): InvalidationResult;
|
|
42
29
|
/** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
|
|
43
30
|
* Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
|
|
@@ -73,6 +60,7 @@ export interface ChurnStaleResult {
|
|
|
73
60
|
preview: ChurnStalePreviewRow[];
|
|
74
61
|
error?: string;
|
|
75
62
|
}
|
|
76
|
-
/** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
|
|
63
|
+
/** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
|
|
64
|
+
* confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
|
|
77
65
|
export declare function detectChurnStale(hippoRoot: string, repoRoot: string, opts: DetectChurnStaleOptions): ChurnStaleResult;
|
|
78
66
|
//# sourceMappingURL=invalidation.d.ts.map
|
|
@@ -4,10 +4,8 @@ import { chunked, loadAllEntries, loadEntriesByIds } from '../store/entry-reads.
|
|
|
4
4
|
import { CHURN_STALE_TAG } from '../core/memory.js';
|
|
5
5
|
import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
|
|
6
6
|
const HEADLINE_CHARS = 60;
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* Returns null if the commit isn't a breaking/migration change.
|
|
10
|
-
*/
|
|
7
|
+
/** Extract what was replaced/removed from a commit message.
|
|
8
|
+
* Returns null if the commit isn't a breaking/migration change. */
|
|
11
9
|
export function extractInvalidationTarget(message) {
|
|
12
10
|
// Strip conventional commit prefix (e.g., "feat(scope): ")
|
|
13
11
|
const body = message.replace(/^[a-z]+(\([^)]*\))?:\s*/i, '').trim();
|
|
@@ -44,25 +42,11 @@ export function extractInvalidationTarget(message) {
|
|
|
44
42
|
}
|
|
45
43
|
return null;
|
|
46
44
|
}
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
49
|
-
* - Halves half_life_days
|
|
50
|
-
* - Sets confidence to 'stale'
|
|
51
|
-
* - Adds 'invalidated' tag
|
|
52
|
-
* - Skips pinned memories (reported in skippedPinned)
|
|
53
|
-
*
|
|
54
|
-
* Tag matching is EXACT (2026-06-09 incident): the FULL pattern must equal a
|
|
55
|
-
* tag. Token-level matching applies to content only, so a pattern that merely
|
|
56
|
-
* CONTAINS a common tag word ("hippo") can no longer mass-weaken every memory
|
|
57
|
-
* carrying that tag. Both callers (the CLI `invalidate` command and the
|
|
58
|
-
* auto-learn-from-git path) inherit this contract.
|
|
59
|
-
*/
|
|
45
|
+
/** Find memories that reference the invalidated pattern and weaken them (halve half_life_days, confidence 'stale', add 'invalidated' tag; pinned are skipped).
|
|
46
|
+
* Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
|
|
60
47
|
export function invalidateMatching(hippoRoot, target, tenantId, options) {
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
// (host-wide invalidation across all tenants in the store).
|
|
64
|
-
// options.onlyId resolves by FILTERING this tenant-scoped list — never a
|
|
65
|
-
// direct id lookup — so an id from another tenant is invisible here.
|
|
48
|
+
// tenantId opt-in: when set, only that tenant's memories are weakened; undefined is host-wide.
|
|
49
|
+
// options.onlyId filters this tenant-scoped list rather than looking up an id directly, so another tenant's id is invisible here.
|
|
66
50
|
const { result, weakened } = weakenMatches(loadAllEntries(hippoRoot, tenantId), target, options);
|
|
67
51
|
writeEntriesSeparately(hippoRoot, weakened);
|
|
68
52
|
return result;
|
|
@@ -381,7 +365,8 @@ function recordChurnEvidence(git, candidates, anchorOf, result) {
|
|
|
381
365
|
}
|
|
382
366
|
return toTag;
|
|
383
367
|
}
|
|
384
|
-
/** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
|
|
368
|
+
/** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
|
|
369
|
+
* confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
|
|
385
370
|
export function detectChurnStale(hippoRoot, repoRoot, opts) {
|
|
386
371
|
const dryRun = opts.dryRun === true;
|
|
387
372
|
if (!opts.projectName)
|
|
@@ -408,9 +393,7 @@ export function detectChurnStale(hippoRoot, repoRoot, opts) {
|
|
|
408
393
|
const result = { checked: 0, marked: 0, alreadyMarked: 0, skippedPinned, dryRun, preview: [] };
|
|
409
394
|
try {
|
|
410
395
|
const git = loadChurnGitView(repoRoot, opts.legacyName ?? opts.projectName, candidates, anchorOf, needs);
|
|
411
|
-
// Collected here
|
|
412
|
-
// computed: a GitReadError thrown mid-loop must never leave an earlier
|
|
413
|
-
// candidate tagged while a later one aborts the run untagged.
|
|
396
|
+
// Collected here and written only after every candidate's evidence is computed, so a GitReadError mid-loop cannot leave an earlier candidate tagged.
|
|
414
397
|
const toTag = recordChurnEvidence(git, candidates, anchorOf, result);
|
|
415
398
|
if (!dryRun && toTag.length > 0)
|
|
416
399
|
tagChurnStale(hippoRoot, opts.tenantId, toTag, confirmedAt);
|
package/dist/mcp/admin-tools.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { evalNow } from '../core/ablation.js';
|
|
3
3
|
import { loadStrengthTallies } from '../store/candidates.js';
|
|
4
4
|
import { countOpenConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
|
-
import { shareMemory, listPeers } from '../sharing/
|
|
5
|
+
import { shareMemory, listPeers } from '../sharing/share.js';
|
|
6
6
|
import { requireGroup, storeFor } from '../store/index.js';
|
|
7
7
|
import { NotFoundError } from '../core/api-errors.js';
|
|
8
8
|
import { classifyOriginProject } from '../core/project-identity.js';
|
|
@@ -106,10 +106,8 @@ export function runShareTool({ args, ctx, hippoRoot, tenantId }) {
|
|
|
106
106
|
// Checked before shareMemory, whose personal-row refusal would tell another person the id exists.
|
|
107
107
|
if (!canTouchScope(mcpActor(ctx), memoryScope(hippoRoot, shareId)))
|
|
108
108
|
throw new NotFoundError(`Memory not found: ${shareId}`);
|
|
109
|
-
// Pass tenantId so shareMemory's readEntry filters by tenant.
|
|
110
|
-
//
|
|
111
|
-
// id and copy the row to the global store. The 'Memory not found'
|
|
112
|
-
// error matches the cross-tenant deny shape elsewhere in the code.
|
|
109
|
+
// Pass tenantId so shareMemory's readEntry filters by tenant; otherwise a Bearer for tenant A could share tenant B's id to the global store.
|
|
110
|
+
// The 'Memory not found' error matches the cross-tenant deny shape elsewhere.
|
|
113
111
|
const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
|
|
114
112
|
if (!shared)
|
|
115
113
|
return 'Transfer score too low. Use force=true to override.';
|
package/dist/mcp/memory-tools.js
CHANGED
|
@@ -13,11 +13,8 @@ export async function runRememberTool({ args, ctx, hippoRoot, config, tenantId }
|
|
|
13
13
|
tags.push('error');
|
|
14
14
|
if (args.tag)
|
|
15
15
|
tags.push(String(args.tag));
|
|
16
|
-
// Route through api.ts so audit_log captures the caller identity
|
|
17
|
-
//
|
|
18
|
-
// 'mcp' for stdio (no ctx). api.ts.remember writes the memory + audit
|
|
19
|
-
// row in one transaction-friendly path; we re-read the entry to surface
|
|
20
|
-
// the half-life used in the MCP human-readable response.
|
|
16
|
+
// Route through api/index.ts so audit_log captures the caller identity like CLI/REST: the auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio.
|
|
17
|
+
// The entry is re-read to surface the half-life used in the MCP response.
|
|
21
18
|
const apiCtx = {
|
|
22
19
|
hippoRoot,
|
|
23
20
|
tenantId,
|
|
@@ -44,10 +41,8 @@ export async function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
|
|
|
44
41
|
const ids = lastRecalledIds.get(clientKey) ?? [];
|
|
45
42
|
if (ids.length === 0)
|
|
46
43
|
return 'No recent recalls to apply outcome to.';
|
|
47
|
-
// Route through src/api/index.ts so audit_log captures the caller identity
|
|
48
|
-
// (
|
|
49
|
-
// scoping is enforced uniformly (same surface as recall/remember).
|
|
50
|
-
// outcome() also handles cross-tenant id skip silently.
|
|
44
|
+
// Route through src/api/index.ts so audit_log captures the caller identity (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant scoping is
|
|
45
|
+
// uniform; outcome() also skips cross-tenant ids silently.
|
|
51
46
|
const apiCtx = {
|
|
52
47
|
hippoRoot,
|
|
53
48
|
tenantId,
|
package/dist/mcp/protocol.d.ts
CHANGED
|
@@ -27,25 +27,14 @@ interface McpResponse {
|
|
|
27
27
|
/** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
|
|
28
28
|
export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string): McpResponse;
|
|
29
29
|
export type { McpRequest, McpResponse };
|
|
30
|
-
/**
|
|
31
|
-
*
|
|
32
|
-
* HTTP transport in src/server.ts calls handleMcpRequest, it knows the
|
|
33
|
-
* server's bound hippoRoot and the auth-resolved tenantId/actor. Passing
|
|
34
|
-
* those through here lets executeTool skip the findHippoRoot() walk and
|
|
35
|
-
* the env-based resolveTenantId({}) fallback — both of which would
|
|
36
|
-
* otherwise produce the wrong store and the wrong tenant for HTTP callers.
|
|
37
|
-
*
|
|
38
|
-
* Stdio callers pass nothing; behavior stays unchanged for that path.
|
|
39
|
-
*/
|
|
30
|
+
/** Optional context from a non-stdio transport (the HTTP server's bound hippoRoot and auth-resolved tenantId/actor), so executeTool skips the
|
|
31
|
+
* findHippoRoot() walk and the env-based resolveTenantId({}) fallback, which would pick the wrong store and tenant for HTTP callers. Stdio passes nothing. */
|
|
40
32
|
export interface McpContext {
|
|
41
33
|
hippoRoot: string;
|
|
42
34
|
tenantId: string;
|
|
43
35
|
actor: string;
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* is the local operator and runs as admin. Tools must use this rather than
|
|
47
|
-
* assuming admin, or a member key over HTTP-MCP would act as admin.
|
|
48
|
-
*/
|
|
36
|
+
/** The caller's role from the HTTP transport's auth; absent for stdio (the local operator, admin). Tools must use this, or a member key over HTTP-MCP
|
|
37
|
+
* would act as admin. */
|
|
49
38
|
role?: 'admin' | 'member';
|
|
50
39
|
/** Scope grants for the HTTP-MCP caller's key. Absent for stdio (admin, needs none). */
|
|
51
40
|
scopes?: readonly string[];
|
|
@@ -56,19 +45,12 @@ export interface McpContext {
|
|
|
56
45
|
project?: CallerProject;
|
|
57
46
|
store?: HippoStore;
|
|
58
47
|
autoSleep?: false;
|
|
59
|
-
/**
|
|
60
|
-
*
|
|
61
|
-
* (one process = one client). For HTTP-SSE / HTTP MCP: hash(bearer + remoteAddr)
|
|
62
|
-
* built by src/server.ts when constructing McpContext for the request.
|
|
63
|
-
* Optional for backwards compatibility; defaults to `${tenantId}:default`.
|
|
64
|
-
*/
|
|
48
|
+
/** Per-client key for state isolation under HTTP-MCP: 'stdio-${pid}' for stdio, hash(bearer + remoteAddr) for HTTP (built in src/server/mcp-http.ts);
|
|
49
|
+
* defaults to `${tenantId}:default`. */
|
|
65
50
|
clientKey?: string;
|
|
66
51
|
}
|
|
67
|
-
/**
|
|
68
|
-
*
|
|
69
|
-
* and runs as admin; over HTTP the transport's authenticated role is used, so
|
|
70
|
-
* a member key never acts as admin through MCP.
|
|
71
|
-
*/
|
|
52
|
+
/** The api-layer actor for a tool call: stdio (no ctx) is the local operator and runs as admin; over HTTP the authenticated role is used, so a member key
|
|
53
|
+
* never acts as admin. */
|
|
72
54
|
export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
|
|
73
55
|
/** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
|
|
74
56
|
export interface ToolCall {
|
package/dist/mcp/protocol.js
CHANGED
|
@@ -4,7 +4,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
4
4
|
import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../util/http-util.js';
|
|
5
5
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
6
6
|
import { currentRequestId } from '../util/request-scope.js';
|
|
7
|
-
import { getGlobalRoot } from '../sharing/
|
|
7
|
+
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
8
8
|
import { findHippoStoreDir } from '../core/project-identity.js';
|
|
9
9
|
import { isStoreBusy, STORE_BUSY_MESSAGE } from '../db/index.js';
|
|
10
10
|
// ── Find hippo root ──
|
|
@@ -31,11 +31,8 @@ export function mcpErrorResponse(id, err, requestId = currentRequestId() ?? rand
|
|
|
31
31
|
error: { code: -32603, message: `${INTERNAL_ERROR_MESSAGE} (request id ${requestId})`, data: { requestId } },
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
* and runs as admin; over HTTP the transport's authenticated role is used, so
|
|
37
|
-
* a member key never acts as admin through MCP.
|
|
38
|
-
*/
|
|
34
|
+
/** The api-layer actor for a tool call: stdio (no ctx) is the local operator and runs as admin; over HTTP the authenticated role is used, so a member key
|
|
35
|
+
* never acts as admin. */
|
|
39
36
|
export function mcpActor(ctx) {
|
|
40
37
|
const actor = { subject: ctx?.actor ?? 'mcp', role: ctx?.role ?? 'admin', scopes: ctx?.scopes };
|
|
41
38
|
if (ctx?.viaAuthResolver)
|
package/dist/mcp/recall-tools.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { fitBudget } from '../search/finalize.js';
|
|
4
4
|
import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.js';
|
|
5
|
-
import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext
|
|
5
|
+
import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext } from '../api/index.js';
|
|
6
6
|
import { autoDetectContext } from '../api/context-auto.js';
|
|
7
7
|
import { resolveProjectIdentity } from '../core/project-identity.js';
|
|
8
8
|
import { isSharedStore } from '../core/config.js';
|
|
@@ -85,14 +85,14 @@ function recallPresenter(budget, options) {
|
|
|
85
85
|
const tail = showTail
|
|
86
86
|
? dropHeldCopies(tailRows.filter((r) => !shownIds.has(r.id) && !shownKeys.has(duplicateKey(r.content))), (r) => r)
|
|
87
87
|
: [];
|
|
88
|
-
const s =
|
|
88
|
+
const s = {
|
|
89
89
|
totalCandidates: pool.length + droppedByScope,
|
|
90
90
|
droppedPreRank: droppedByScope + cut.length - list.length, // the bucket CLI and API recall put hidden copies in
|
|
91
91
|
droppedByBudget: Math.max(0, pool.length - cut.length), // an upper bound: rows that never matched count too
|
|
92
92
|
summarySubstitutionsAdded: tail.filter((r) => r.isSummary).length,
|
|
93
93
|
freshTailAdded: tail.filter((r) => r.isFreshTail && !r.isSummary).length,
|
|
94
94
|
suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0,
|
|
95
|
-
}
|
|
95
|
+
};
|
|
96
96
|
// Anchoring is the stronger pull, so it prints first; the Cutoff block sits above the list, where the agent reads it.
|
|
97
97
|
let text = biasHintSections(anchoring, availability);
|
|
98
98
|
if (showPlan)
|
package/dist/mcp/request.d.ts
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { type McpContext, type McpRequest, type McpResponse } from './protocol.js';
|
|
2
|
-
/**
|
|
3
|
-
* Record the memory text a recall or context tool returned. Best-effort: a
|
|
4
|
-
* ledger failure never fails the tool call. Other tools are not recorded.
|
|
5
|
-
*/
|
|
2
|
+
/** Records the memory text a recall or context tool returned; best-effort (a ledger failure never fails the call), other tools are not recorded. */
|
|
6
3
|
export declare function recordMcpTokens(toolName: string, output: string, ctx?: McpContext): Promise<void>;
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
|
|
10
|
-
* through this single function. Returns null for notifications (no response
|
|
11
|
-
* expected) and a McpResponse otherwise. Errors thrown by `executeTool` are
|
|
12
|
-
* the caller's problem — wrap with try/catch on the transport side.
|
|
13
|
-
*/
|
|
4
|
+
/** Transport-agnostic MCP dispatcher: the stdio loop and the HTTP/SSE transport route every JSON-RPC message through it. Returns null for notifications.
|
|
5
|
+
* Errors thrown by `executeTool` are the caller's problem: wrap with try/catch on the transport side. */
|
|
14
6
|
export declare function handleMcpRequest(req: McpRequest, ctx?: McpContext): Promise<McpResponse | null>;
|
|
15
7
|
//# sourceMappingURL=request.d.ts.map
|
package/dist/mcp/request.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Transport-agnostic request handling: tool dispatch table, tool execution and the JSON-RPC method switch.
|
|
2
2
|
import { errorMessage, log } from '../util/log.js';
|
|
3
3
|
import { STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
|
|
4
|
-
import { getGlobalRoot, initGlobal } from '../sharing/
|
|
4
|
+
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
5
5
|
import { loadConfig } from '../core/config.js';
|
|
6
6
|
import { resolveTenantId } from '../store/tenant.js';
|
|
7
7
|
import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db/index.js';
|
|
@@ -17,12 +17,8 @@ import { runRememberTool, runOutcomeTool, runLearnTool } from './memory-tools.js
|
|
|
17
17
|
import { runPredictBaserateTool, runStatusTool, runConflictsTool, runResolveTool, runShareTool, runPeersTool } from './admin-tools.js';
|
|
18
18
|
import { sharedStoreRefusal } from './shared-gate.js';
|
|
19
19
|
import { isJsonString, isJsonObject } from '../util/json.js';
|
|
20
|
-
/**
|
|
21
|
-
*
|
|
22
|
-
* create the global store instead of failing every tool call, and say so on
|
|
23
|
-
* stderr (stdout carries the protocol). `hippo init` in a project later adds
|
|
24
|
-
* a project store, which then takes precedence.
|
|
25
|
-
*/
|
|
20
|
+
/** Zero-install first run (`npx -y hippo-memory mcp`, no store anywhere): create the global store instead of failing every tool call, and say so on stderr
|
|
21
|
+
* (stdout carries the protocol). A later `hippo init` project store takes precedence. */
|
|
26
22
|
function createGlobalStoreOnFirstRun() {
|
|
27
23
|
initGlobal();
|
|
28
24
|
const root = getGlobalRoot();
|
|
@@ -34,10 +30,7 @@ const MCP_TOKEN_SURFACES = new Map([
|
|
|
34
30
|
['hippo_recall', 'mcp_recall'],
|
|
35
31
|
['hippo_context', 'mcp_context'],
|
|
36
32
|
]);
|
|
37
|
-
/**
|
|
38
|
-
* Record the memory text a recall or context tool returned. Best-effort: a
|
|
39
|
-
* ledger failure never fails the tool call. Other tools are not recorded.
|
|
40
|
-
*/
|
|
33
|
+
/** Records the memory text a recall or context tool returned; best-effort (a ledger failure never fails the call), other tools are not recorded. */
|
|
41
34
|
export async function recordMcpTokens(toolName, output, ctx) {
|
|
42
35
|
const surface = MCP_TOKEN_SURFACES.get(toolName);
|
|
43
36
|
if (!surface || !output)
|
|
@@ -84,16 +77,12 @@ function runsOn(store, toolName) {
|
|
|
84
77
|
return group !== undefined && hasGroup(store, group);
|
|
85
78
|
}
|
|
86
79
|
async function executeTool(name, args, ctx) {
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
// from the Bearer token (or the loopback fallback). The stdio path
|
|
90
|
-
// continues to walk from cwd / fall back to the global root, and to
|
|
91
|
-
// resolve tenant from HIPPO_TENANT.
|
|
80
|
+
// With a transport context (HTTP), trust it: hippoRoot comes from the server's bound opts and tenantId from the Bearer (or loopback fallback).
|
|
81
|
+
// Stdio walks from cwd / the global root and resolves tenant from HIPPO_TENANT.
|
|
92
82
|
const hippoRoot = ctx?.hippoRoot ?? findHippoRoot() ?? createGlobalStoreOnFirstRun();
|
|
93
83
|
const config = loadConfig(hippoRoot);
|
|
94
|
-
// Every store read
|
|
95
|
-
//
|
|
96
|
-
// ctx.tenantId so an HTTP Bearer for tenant B doesn't drop to HIPPO_TENANT.
|
|
84
|
+
// Every store read here is tenant-isolated, resolved once per tool call; prefer the transport's ctx.tenantId so an HTTP Bearer for tenant B
|
|
85
|
+
// does not drop to HIPPO_TENANT.
|
|
97
86
|
const tenantId = ctx?.tenantId ?? resolveTenantId({});
|
|
98
87
|
const handler = TOOL_HANDLERS.get(name)?.handler;
|
|
99
88
|
// handleMcpRequest rejects names missing from TOOLS, so reaching here means TOOLS and this table drifted apart.
|
|
@@ -155,13 +144,8 @@ async function callTool(id, params, ctx) {
|
|
|
155
144
|
},
|
|
156
145
|
};
|
|
157
146
|
}
|
|
158
|
-
/**
|
|
159
|
-
*
|
|
160
|
-
* HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
|
|
161
|
-
* through this single function. Returns null for notifications (no response
|
|
162
|
-
* expected) and a McpResponse otherwise. Errors thrown by `executeTool` are
|
|
163
|
-
* the caller's problem — wrap with try/catch on the transport side.
|
|
164
|
-
*/
|
|
147
|
+
/** Transport-agnostic MCP dispatcher: the stdio loop and the HTTP/SSE transport route every JSON-RPC message through it. Returns null for notifications.
|
|
148
|
+
* Errors thrown by `executeTool` are the caller's problem: wrap with try/catch on the transport side. */
|
|
165
149
|
export async function handleMcpRequest(req, ctx) {
|
|
166
150
|
const { id, method, params } = req;
|
|
167
151
|
switch (method) {
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
* Exposes hippo memory as MCP tools over stdio transport.
|
|
6
|
-
* Uses the programmatic API directly (no child process spawning).
|
|
7
|
-
*
|
|
8
|
-
* Usage: hippo mcp (or npx hippo-memory mcp)
|
|
9
|
-
*/
|
|
10
|
-
export { __resetSessionRecallHistoryMcp } from './session-state.js';
|
|
2
|
+
/** Hippo Memory MCP server: exposes hippo memory as MCP tools over stdio via the programmatic API (no child process). Usage: hippo mcp (or npx hippo-memory
|
|
3
|
+
* mcp). */
|
|
4
|
+
export { _resetSessionRecallHistoryMcpForTests } from './session-state.js';
|
|
11
5
|
export { findHippoRoot, mcpErrorResponse, type McpRequest, type McpResponse, type McpContext } from './protocol.js';
|
|
12
6
|
export { handleMcpRequest } from './request.js';
|
|
13
7
|
export { startStdioLoop } from './stdio.js';
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
* Exposes hippo memory as MCP tools over stdio transport.
|
|
6
|
-
* Uses the programmatic API directly (no child process spawning).
|
|
7
|
-
*
|
|
8
|
-
* Usage: hippo mcp (or npx hippo-memory mcp)
|
|
9
|
-
*/
|
|
10
|
-
export { __resetSessionRecallHistoryMcp } from './session-state.js';
|
|
2
|
+
/** Hippo Memory MCP server: exposes hippo memory as MCP tools over stdio via the programmatic API (no child process). Usage: hippo mcp (or npx hippo-memory
|
|
3
|
+
* mcp). */
|
|
4
|
+
export { _resetSessionRecallHistoryMcpForTests } from './session-state.js';
|
|
11
5
|
export { findHippoRoot, mcpErrorResponse } from './protocol.js';
|
|
12
6
|
export { handleMcpRequest } from './request.js';
|
|
13
7
|
export { startStdioLoop } from './stdio.js';
|
|
14
8
|
import { envMcpStdio } from '../util/env.js';
|
|
15
9
|
import { startStdioLoop } from './stdio.js';
|
|
16
|
-
// Auto-start
|
|
17
|
-
//
|
|
18
|
-
// module (e.g. src/server.ts wiring up the HTTP/SSE transport) will NOT
|
|
19
|
-
// trigger the stdio loop. The cli imports this file specifically to start
|
|
20
|
-
// stdio; that import is also `import.meta.url === main`-equivalent because
|
|
21
|
-
// it's executed as the program, so we keep a fallback: if HIPPO_MCP_STDIO=1
|
|
22
|
-
// or argv1 ends in /mcp/server.js we start.
|
|
10
|
+
// Auto-start only as the main module (node dist/mcp/server.js or the cli's import('./mcp/server.js')); importing it elsewhere (the HTTP/SSE wiring) must not
|
|
11
|
+
// start stdio. Fallback: HIPPO_MCP_STDIO=1 or argv1 ending in /mcp/server.js also starts it.
|
|
23
12
|
const isMainModule = (() => {
|
|
24
13
|
try {
|
|
25
14
|
const argv1 = process.argv[1] ?? '';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Test-only: reset the MCP recall rings. Call from beforeEach. */
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function _resetSessionRecallHistoryMcpForTests(): void;
|
|
3
3
|
export declare const lastRecalledIds: Map<string, string[]>;
|
|
4
4
|
export { autoSleepInFlight } from '../api/auto-sleep.js';
|
|
5
5
|
export declare function resolveClientKey(ctx: {
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
// Per-process state the MCP tools share across calls: recall rings, last recalled ids, auto-sleep runs.
|
|
2
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
2
3
|
import { resetSessionRings } from '../api/recall-record.js';
|
|
3
4
|
/** Test-only: reset the MCP recall rings. Call from beforeEach. */
|
|
4
|
-
export function
|
|
5
|
+
export function _resetSessionRecallHistoryMcpForTests() {
|
|
5
6
|
resetSessionRings('mcp');
|
|
6
7
|
}
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// Keyed per-client so two HTTP-MCP clients hitting the same tenant cannot
|
|
10
|
-
// poison each other's outcome feedback. The key is `ctx.clientKey` when the
|
|
11
|
-
// transport supplies one (HTTP-MCP via src/server.ts builds
|
|
12
|
-
// hash(bearer+remoteAddr)); stdio and any caller without a clientKey falls
|
|
13
|
-
// back to `'stdio-${pid}'` (one process = one client) or
|
|
14
|
-
// `${tenantId}:default` if a McpContext is constructed in tests without a
|
|
15
|
-
// pid-bound transport.
|
|
8
|
+
// Last recalled IDs per client for outcome feedback, so two HTTP-MCP clients on one tenant cannot poison each other: key is `ctx.clientKey` (hash of
|
|
9
|
+
// bearer+remoteAddr over HTTP), else 'stdio-${pid}', else `${tenantId}:default` for a McpContext built in tests.
|
|
16
10
|
const MAX_RECALL_CLIENTS = 4096;
|
|
17
11
|
// The caller names the project half of each key, so a set past the cap drops the client that recalled longest ago.
|
|
18
12
|
class RecentRecalls extends Map {
|
|
@@ -28,7 +22,7 @@ class RecentRecalls extends Map {
|
|
|
28
22
|
export const lastRecalledIds = new RecentRecalls();
|
|
29
23
|
export { autoSleepInFlight } from '../api/auto-sleep.js';
|
|
30
24
|
export function resolveClientKey(ctx) {
|
|
31
|
-
const base = ctx?.clientKey ? ctx.clientKey : `stdio-${process.pid}:${ctx?.tenantId ||
|
|
25
|
+
const base = ctx?.clientKey ? ctx.clientKey : `stdio-${process.pid}:${ctx?.tenantId || DEFAULT_TENANT_ID}`;
|
|
32
26
|
return ctx?.project ? `${base}:${ctx.project.name}` : base;
|
|
33
27
|
}
|
|
34
28
|
//# sourceMappingURL=session-state.js.map
|
package/dist/mcp/stdio.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* (cli.ts `hippo mcp`, or running this file directly) should call this.
|
|
4
|
-
* src/server.ts imports `handleMcpRequest` without invoking this, so the
|
|
5
|
-
* HTTP daemon does not steal stdin or exit when its parent closes a pipe.
|
|
6
|
-
*/
|
|
1
|
+
/** Wires stdin/stdout to the dispatcher; idempotent. Only the entrypoint (cli.ts `hippo mcp`, or this file run directly) should call it, so the HTTP daemon
|
|
2
|
+
* (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
|
|
7
3
|
export declare function startStdioLoop(): void;
|
|
8
4
|
//# sourceMappingURL=stdio.d.ts.map
|
package/dist/mcp/stdio.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// Stdio transport: newline-delimited JSON-RPC frames in on stdin, replies out on stdout.
|
|
2
2
|
import { exitAfterFlush, installCrashHandlers } from '../util/crash-handlers.js';
|
|
3
|
-
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
4
|
+
import { requestDeadlineMs } from '../server/deadline.js';
|
|
4
5
|
import { parseFrame } from './framing.js';
|
|
5
6
|
import { mcpErrorResponse } from './protocol.js';
|
|
6
7
|
import { handleMcpRequest } from './request.js';
|
|
7
8
|
import { isJsonNumber, isJsonString, isJsonObject } from '../util/json.js';
|
|
8
9
|
import { randomUUID } from 'node:crypto';
|
|
9
|
-
import { runWithRequestId } from '../util/request-scope.js';
|
|
10
|
+
import { currentRequestId, runWithRequestId } from '../util/request-scope.js';
|
|
10
11
|
// MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
|
|
11
12
|
// https://modelcontextprotocol.io/specification/.../basic/transports#stdio
|
|
12
13
|
function send(msg) {
|
|
@@ -61,6 +62,39 @@ async function exitWhenDrained() {
|
|
|
61
62
|
}
|
|
62
63
|
exitAfterFlush(0);
|
|
63
64
|
}
|
|
65
|
+
// The code the MCP SDKs give a request that timed out.
|
|
66
|
+
const REQUEST_TIMEOUT_CODE = -32001;
|
|
67
|
+
/** The method, with the tool's name for a tool call, so a timeout names what ran. */
|
|
68
|
+
function callName(req) {
|
|
69
|
+
const tool = req.params?.name;
|
|
70
|
+
return isJsonString(tool) ? `${req.method} ${tool.slice(0, 128)}` : req.method;
|
|
71
|
+
}
|
|
72
|
+
/** Answers `req` with one timeout error at the deadline a served request has. The returned function stops the timer and says whether that answer went out, so a later reply is dropped. */
|
|
73
|
+
function watchDeadline(req, owedReply) {
|
|
74
|
+
const ms = requestDeadlineMs();
|
|
75
|
+
if (ms === 0)
|
|
76
|
+
return () => false;
|
|
77
|
+
let expired = false;
|
|
78
|
+
const timer = setTimeout(() => {
|
|
79
|
+
expired = true;
|
|
80
|
+
const name = callName(req);
|
|
81
|
+
log.warn(`mcp: ${name} did not answer within ${ms} ms; it keeps running and its reply will be dropped`, { method: req.method });
|
|
82
|
+
if (!owedReply)
|
|
83
|
+
return;
|
|
84
|
+
const requestId = currentRequestId();
|
|
85
|
+
const message = `Request timed out: ${name} did not finish within ${ms} ms; a write it started may or may not be saved`;
|
|
86
|
+
const error = { code: REQUEST_TIMEOUT_CODE, message };
|
|
87
|
+
if (requestId !== undefined)
|
|
88
|
+
error.data = { requestId };
|
|
89
|
+
send({ jsonrpc: '2.0', id: req.id, error });
|
|
90
|
+
}, ms);
|
|
91
|
+
// Stdin and the call keep the process alive; this timer alone must not.
|
|
92
|
+
timer.unref();
|
|
93
|
+
return () => {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
return expired;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
64
98
|
function dispatch(body) {
|
|
65
99
|
let parsed;
|
|
66
100
|
try {
|
|
@@ -77,22 +111,24 @@ function dispatch(body) {
|
|
|
77
111
|
}
|
|
78
112
|
const req = parsed;
|
|
79
113
|
if (req.method.startsWith('notifications/')) {
|
|
114
|
+
const stopWatching = watchDeadline(req, false);
|
|
80
115
|
track(req.method, handleMcpRequest(req).then(() => { }).catch((err) => {
|
|
81
|
-
log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}
|
|
82
|
-
}));
|
|
116
|
+
log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}`, errorFields(err));
|
|
117
|
+
}).finally(stopWatching));
|
|
83
118
|
return;
|
|
84
119
|
}
|
|
85
|
-
|
|
120
|
+
// A frame with no id is a notification under any method name, and JSON-RPC forbids answering one.
|
|
121
|
+
const timedOut = watchDeadline(req, isJsonString(req.id) || isJsonNumber(req.id));
|
|
122
|
+
track(req.method, handleMcpRequest(req).then((resp) => { if (!timedOut() && resp)
|
|
86
123
|
send(resp); }).catch((err) => {
|
|
87
|
-
|
|
124
|
+
if (timedOut())
|
|
125
|
+
log.debug(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`);
|
|
126
|
+
else
|
|
127
|
+
send(mcpErrorResponse(req.id, err));
|
|
88
128
|
}));
|
|
89
129
|
}
|
|
90
|
-
/**
|
|
91
|
-
*
|
|
92
|
-
* (cli.ts `hippo mcp`, or running this file directly) should call this.
|
|
93
|
-
* src/server.ts imports `handleMcpRequest` without invoking this, so the
|
|
94
|
-
* HTTP daemon does not steal stdin or exit when its parent closes a pipe.
|
|
95
|
-
*/
|
|
130
|
+
/** Wires stdin/stdout to the dispatcher; idempotent. Only the entrypoint (cli.ts `hippo mcp`, or this file run directly) should call it, so the HTTP daemon
|
|
131
|
+
* (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
|
|
96
132
|
export function startStdioLoop() {
|
|
97
133
|
process.stdin.on('data', (chunk) => {
|
|
98
134
|
buffer = Buffer.concat([buffer, withoutRefused(chunk)]);
|
package/dist/mcp/tools.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
3
3
|
import { DEFAULT_ASSEMBLE_BUDGET } from '../api/assemble.js';
|
|
4
4
|
import { MAX_ID_LEN } from '../util/http-util.js';
|
|
5
|
+
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
|
|
6
|
+
import { DEFAULT_CONFIG } from '../core/config.js';
|
|
5
7
|
// ── Tool definitions ──
|
|
6
8
|
// HTTP sets no budget cap; 25x the recall default leaves room for large-context clients while bounding one call's work.
|
|
7
9
|
const MAX_BUDGET_TOKENS = 25 * DEFAULT_RECALL_BUDGET;
|
|
@@ -43,7 +45,7 @@ export const TOOLS = [
|
|
|
43
45
|
},
|
|
44
46
|
scorer_window: {
|
|
45
47
|
type: 'number',
|
|
46
|
-
description:
|
|
48
|
+
description: `How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. The main list ranks the whole tenant store, so scorer_window does not narrow it. Default ${DEFAULT_SEARCH_CANDIDATE_LIMIT}. Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.`,
|
|
47
49
|
},
|
|
48
50
|
session_id: {
|
|
49
51
|
type: 'string',
|
|
@@ -138,7 +140,7 @@ export const TOOLS = [
|
|
|
138
140
|
},
|
|
139
141
|
{
|
|
140
142
|
name: 'hippo_outcome',
|
|
141
|
-
description:
|
|
143
|
+
description: "Report whether recalled memories were useful. Good outcomes slow a memory's decay and bad ones speed it up, in proportion to its record. Call after completing work.",
|
|
142
144
|
inputSchema: {
|
|
143
145
|
type: 'object',
|
|
144
146
|
properties: {
|
|
@@ -160,7 +162,7 @@ export const TOOLS = [
|
|
|
160
162
|
type: 'number',
|
|
161
163
|
minimum: 0,
|
|
162
164
|
maximum: MAX_BUDGET_TOKENS,
|
|
163
|
-
description: `Max tokens (default: config.defaultContextBudget,
|
|
165
|
+
description: `Max tokens (default: config.defaultContextBudget, ${DEFAULT_CONFIG.defaultContextBudget}; max ${MAX_BUDGET_TOKENS})`,
|
|
164
166
|
},
|
|
165
167
|
scope: {
|
|
166
168
|
type: 'string',
|