hippo-memory 1.71.0 → 1.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +1 -1
- package/dist/api/audit.d.ts +29 -1
- package/dist/api/audit.js +44 -5
- package/dist/api/auth.d.ts +7 -4
- package/dist/api/auth.js +12 -8
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +9 -11
- package/dist/api/context.js +17 -8
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +1 -1
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +6 -2
- package/dist/api/forget.js +18 -7
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +19 -1
- package/dist/api/memories.js +39 -0
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +6 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.js +1 -1
- package/dist/api/prompt-hook.d.ts +15 -2
- package/dist/api/prompt-hook.js +44 -4
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +3 -3
- package/dist/api/recall-pipeline.js +6 -7
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +19 -44
- package/dist/api/remember-local.js +1 -1
- package/dist/api/remember.d.ts +2 -1
- package/dist/api/remember.js +3 -2
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +13 -9
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +1 -1
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +4 -2
- package/dist/capture/compaction-spool.js +20 -6
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +13 -13
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +12 -13
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +5 -0
- package/dist/cli/client.js +24 -8
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +12 -12
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +1 -1
- package/dist/cli/curate.js +23 -27
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +4 -281
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +3 -5
- package/dist/cli/hook-runtime.js +7 -34
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +17 -17
- package/dist/cli/remember.js +12 -12
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +3 -3
- package/dist/cli/session-hooks.d.ts +1 -1
- package/dist/cli/session-hooks.js +45 -115
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +33 -31
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -695
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +23 -313
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +3 -28
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +33 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +2 -27
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +1 -1
- package/dist/consolidate/dag.js +15 -9
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +5 -3
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +2 -1
- package/dist/consolidate/merge.js +2 -2
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +8 -5
- package/dist/consolidate/traces.js +3 -3
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +7 -2
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +2 -2
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +10 -4
- package/dist/core/memory.js +25 -18
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.js +6 -16
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +10 -1
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +0 -1
- package/dist/db/connect.js +5 -6
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.js +3 -3
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +17 -4
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +11 -8
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +18 -15
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +11 -4
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +4 -2
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +1 -1
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.js +7 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/learn/autolearn.d.ts +10 -2
- package/dist/learn/autolearn.js +32 -12
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +6 -4
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.js +10 -6
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +3 -1
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +2 -1
- package/dist/mcp/stdio.js +24 -8
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +63 -97
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +10 -13
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.js +17 -7
- package/dist/server/boot.js +7 -66
- package/dist/server/client-ip.d.ts +0 -2
- package/dist/server/client-ip.js +3 -2
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -132
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +15 -38
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/types.d.ts +22 -10
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +5 -4
- package/dist/server.js +5 -4
- package/dist/sharing/global-store.js +2 -2
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +1 -1
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +37 -34
- package/dist/store/ambient.js +5 -6
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +42 -23
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +1 -1
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.js +7 -4
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +30 -53
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +7 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +36 -3
- package/dist/store/delivery-recorder.d.ts +10 -3
- package/dist/store/delivery-recorder.js +12 -5
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +3 -1
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +13 -4
- package/dist/store/entry-reads.js +47 -11
- package/dist/store/entry-writes.d.ts +5 -5
- package/dist/store/entry-writes.js +32 -12
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +20 -18
- package/dist/store/graph-reads.js +4 -2
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +6 -6
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +10 -6
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +40 -53
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +9 -3
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +18 -2
- package/dist/store/rejected-values.js +2 -1
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rule-sql.d.ts +9 -0
- package/dist/store/rule-sql.js +21 -2
- package/dist/store/search-rows.js +9 -4
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +1 -1
- package/dist/store/sqlite/store.js +14 -12
- package/dist/store/summaries.d.ts +3 -3
- package/dist/store/summaries.js +5 -4
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +3 -2
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +22 -5
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +2 -1
- package/dist/util/env.js +2 -1
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +3 -1
- package/dist/util/request-scope.js +11 -6
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
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 } from '../api/index.js';
|
|
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';
|
|
@@ -10,12 +10,14 @@ import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '.
|
|
|
10
10
|
import { detectAvailabilityBias } from '../api/availability.js';
|
|
11
11
|
import { estimateTokens } from '../util/token-text.js';
|
|
12
12
|
import { assembleCost, assembleText, drillCost, drillText } from '../api/context-render.js';
|
|
13
|
-
import { mcpActor } from './protocol.js';
|
|
13
|
+
import { mcpActor, ownsServerCwd } from './protocol.js';
|
|
14
14
|
import { lastRecalledIds, resolveClientKey } from './session-state.js';
|
|
15
15
|
import { formatContinuityBlock, formatMemories, memoryCost, memoriesReserve, snapshotPiece, handoffPiece, trailPiece, contextCost, tailSection, planningSection, } from './format.js';
|
|
16
16
|
import { isJsonString } from '../util/json.js';
|
|
17
17
|
import { parseContextRequest, parseRecallRequest, toolParams } from '../api/recall-request.js';
|
|
18
18
|
import { noteRecall, sessionRing, shownRecallRows } from '../api/recall-record.js';
|
|
19
|
+
// Candidate pool the MCP recall ranks before the token budget trims what is shown.
|
|
20
|
+
const MCP_RECALL_LIMIT = 50;
|
|
19
21
|
function detectBiasHints(list, pool, anchorRing, queryHash) {
|
|
20
22
|
const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
|
|
21
23
|
const availability = biasHintEnabled('availability')
|
|
@@ -126,7 +128,7 @@ export async function runRecallTool(call) {
|
|
|
126
128
|
// RecallContractError throws reach the MCP caller raw, as mcp-recall-fresh-tail-policy.test.ts pins.
|
|
127
129
|
await apiRetrieve(apiCtx, {
|
|
128
130
|
...recallOpts,
|
|
129
|
-
limit:
|
|
131
|
+
limit: MCP_RECALL_LIMIT,
|
|
130
132
|
mode: config.physics?.enabled !== false ? 'physics' : 'hybrid',
|
|
131
133
|
// The hint is computed below over the list MCP shows; the window band's copy would emit its audit row twice.
|
|
132
134
|
suppressAvailabilityHint: true,
|
|
@@ -211,10 +213,10 @@ export async function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
|
|
|
211
213
|
}
|
|
212
214
|
return drillText(r);
|
|
213
215
|
}
|
|
214
|
-
// The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so
|
|
215
|
-
function localProject(hippoRoot) {
|
|
216
|
+
// The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so only an owner of the server cwd falls back to it.
|
|
217
|
+
function localProject(hippoRoot, ownsCwd) {
|
|
216
218
|
const storeProject = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
|
|
217
|
-
return storeProject.name !== '' ? storeProject : resolveProjectIdentity(process.cwd());
|
|
219
|
+
return storeProject.name !== '' || !ownsCwd ? storeProject : resolveProjectIdentity(process.cwd());
|
|
218
220
|
}
|
|
219
221
|
export async function runContextTool({ args, ctx, hippoRoot, config, tenantId }) {
|
|
220
222
|
// Stdio names no project, and the store's folder or the launch cwd is no caller's; HTTP sends X-Hippo-Project.
|
|
@@ -226,12 +228,13 @@ export async function runContextTool({ args, ctx, hippoRoot, config, tenantId })
|
|
|
226
228
|
return '';
|
|
227
229
|
if (budget < memoriesReserve(budget))
|
|
228
230
|
return ''; // not even the heading fits, so nothing prints, as at budget 0
|
|
231
|
+
const ownsCwd = ownsServerCwd(ctx);
|
|
229
232
|
const result = await apiGetContext({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, {
|
|
230
|
-
// The server's git state is no caller's, so a
|
|
231
|
-
q: ctx?.project ? undefined : autoDetectContext(),
|
|
233
|
+
// The server's git state is no remote caller's, so a project or remote caller gets rows by strength without a query.
|
|
234
|
+
q: ctx?.project || !ownsCwd ? undefined : autoDetectContext(),
|
|
232
235
|
budget,
|
|
233
236
|
exactScope,
|
|
234
|
-
currentProject: ctx?.project ?? localProject(hippoRoot),
|
|
237
|
+
currentProject: ctx?.project ?? localProject(hippoRoot, ownsCwd),
|
|
235
238
|
cost: contextCost,
|
|
236
239
|
});
|
|
237
240
|
lastRecalledIds.set(resolveClientKey(ctx), result.entries.map((r) => r.entry.id));
|
package/dist/mcp/request.js
CHANGED
|
@@ -4,7 +4,8 @@ import { STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
|
|
|
4
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
|
-
import {
|
|
7
|
+
import { runWithRequestStores } from '../db/index.js';
|
|
8
|
+
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
8
9
|
import { hasGroup, storeFor } from '../store/index.js';
|
|
9
10
|
import { estimateTokens } from '../util/token-text.js';
|
|
10
11
|
import { PACKAGE_VERSION } from '../util/version.js';
|
package/dist/mcp/stdio.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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
3
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
4
|
-
import { requestDeadlineMs } from '../
|
|
4
|
+
import { requestDeadlineMs } from '../util/request-scope.js';
|
|
5
|
+
import { MAX_BODY_BYTES } from '../util/http-util.js';
|
|
5
6
|
import { parseFrame } from './framing.js';
|
|
6
7
|
import { mcpErrorResponse } from './protocol.js';
|
|
7
8
|
import { handleMcpRequest } from './request.js';
|
|
@@ -14,7 +15,10 @@ function send(msg) {
|
|
|
14
15
|
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
15
16
|
}
|
|
16
17
|
// ── Stdio transport ──
|
|
17
|
-
let
|
|
18
|
+
let pending = [];
|
|
19
|
+
let pendingBytes = 0;
|
|
20
|
+
// Set when the pending bytes hold a Content-Length header whose body has not fully arrived.
|
|
21
|
+
let needs;
|
|
18
22
|
// The part of a refused frame still on its way, dropped as it arrives so it is never buffered or read as a new frame.
|
|
19
23
|
let refused = 0;
|
|
20
24
|
function withoutRefused(chunk) {
|
|
@@ -69,7 +73,8 @@ function callName(req) {
|
|
|
69
73
|
const tool = req.params?.name;
|
|
70
74
|
return isJsonString(tool) ? `${req.method} ${tool.slice(0, 128)}` : req.method;
|
|
71
75
|
}
|
|
72
|
-
/** Answers `req` with one timeout error at the deadline a served request has. The returned function stops the timer and says whether that
|
|
76
|
+
/** Answers `req` with one timeout error at the deadline a served request has. The returned function stops the timer and says whether that
|
|
77
|
+
* answer went out, so a later reply is dropped. */
|
|
73
78
|
function watchDeadline(req, owedReply) {
|
|
74
79
|
const ms = requestDeadlineMs();
|
|
75
80
|
if (ms === 0)
|
|
@@ -122,20 +127,29 @@ function dispatch(body) {
|
|
|
122
127
|
track(req.method, handleMcpRequest(req).then((resp) => { if (!timedOut() && resp)
|
|
123
128
|
send(resp); }).catch((err) => {
|
|
124
129
|
if (timedOut())
|
|
125
|
-
log.
|
|
130
|
+
log.error(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`, errorFields(err));
|
|
126
131
|
else
|
|
127
|
-
send(mcpErrorResponse(req.id, err));
|
|
132
|
+
send(mcpErrorResponse(req.id, err, undefined, callName(req)));
|
|
128
133
|
}));
|
|
129
134
|
}
|
|
130
135
|
/** 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
136
|
* (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
|
|
132
137
|
export function startStdioLoop() {
|
|
133
|
-
process.stdin.on('data', (
|
|
134
|
-
|
|
138
|
+
process.stdin.on('data', (raw) => {
|
|
139
|
+
const chunk = withoutRefused(raw);
|
|
140
|
+
pending.push(chunk);
|
|
141
|
+
pendingBytes += chunk.length;
|
|
142
|
+
// Joining on every chunk would copy the whole pending frame each time; wait until a frame can have ended.
|
|
143
|
+
if (needs === undefined ? !chunk.includes(0x0a) && pendingBytes <= MAX_BODY_BYTES : pendingBytes < needs)
|
|
144
|
+
return;
|
|
145
|
+
let buffer = Buffer.concat(pending, pendingBytes);
|
|
146
|
+
needs = undefined;
|
|
135
147
|
while (true) {
|
|
136
148
|
const result = parseFrame(buffer);
|
|
137
|
-
if (result.kind === 'incomplete')
|
|
149
|
+
if (result.kind === 'incomplete') {
|
|
150
|
+
needs = result.needs;
|
|
138
151
|
break;
|
|
152
|
+
}
|
|
139
153
|
buffer = result.rest;
|
|
140
154
|
if (result.kind === 'oversize') {
|
|
141
155
|
refused = result.remainder;
|
|
@@ -147,6 +161,8 @@ export function startStdioLoop() {
|
|
|
147
161
|
if (result.kind === 'message')
|
|
148
162
|
runWithRequestId(randomUUID(), () => dispatch(result.body));
|
|
149
163
|
}
|
|
164
|
+
pending = buffer.length > 0 ? [buffer] : [];
|
|
165
|
+
pendingBytes = buffer.length;
|
|
150
166
|
});
|
|
151
167
|
process.stdin.on('end', () => { void exitWhenDrained(); });
|
|
152
168
|
installCrashHandlers('mcp');
|
package/dist/mcp/tool-args.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Hand-written for the JSON Schema subset the hippo tool definitions use, so the MCP server needs no validator dependency.
|
|
2
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
2
3
|
const ARG_PREVIEW_CHARS = 40;
|
|
3
4
|
function isArgString(v) {
|
|
4
5
|
return typeof v === 'string';
|
|
@@ -24,7 +25,7 @@ function describeValue(v) {
|
|
|
24
25
|
if (Array.isArray(v))
|
|
25
26
|
return 'array';
|
|
26
27
|
if (isArgString(v))
|
|
27
|
-
return JSON.stringify(v
|
|
28
|
+
return JSON.stringify(truncateWithEllipsis(v, ARG_PREVIEW_CHARS));
|
|
28
29
|
if (isArgNumber(v) || isArgBoolean(v))
|
|
29
30
|
return String(v);
|
|
30
31
|
return 'object';
|
package/dist/mcp/tools.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// Tool definitions and input schemas served by tools/list.
|
|
2
2
|
import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
3
3
|
import { DEFAULT_ASSEMBLE_BUDGET } from '../api/assemble.js';
|
|
4
|
-
import { MAX_ID_LEN } from '../util/
|
|
4
|
+
import { MAX_ID_LEN, MAX_LIST_LIMIT } from '../util/limits.js';
|
|
5
5
|
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
|
|
6
6
|
import { DEFAULT_CONFIG } from '../core/config.js';
|
|
7
7
|
// ── Tool definitions ──
|
|
8
8
|
// HTTP sets no budget cap; 25x the recall default leaves room for large-context clients while bounding one call's work.
|
|
9
9
|
const MAX_BUDGET_TOKENS = 25 * DEFAULT_RECALL_BUDGET;
|
|
10
|
-
// Same ceiling as the HTTP list routes' parseListLimit.
|
|
11
|
-
const MAX_LIST_LIMIT = 1000;
|
|
12
10
|
export const TOOLS = [
|
|
13
11
|
{
|
|
14
12
|
name: 'hippo_recall',
|
|
15
|
-
description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use
|
|
13
|
+
description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use ' +
|
|
14
|
+
'at session start or when you need context about a topic. Pass include_continuity=true to also surface the active task snapshot, latest matching ' +
|
|
15
|
+
'session handoff, and recent session events as a "## Continuity" appendix.',
|
|
16
16
|
inputSchema: {
|
|
17
17
|
type: 'object',
|
|
18
18
|
properties: {
|
|
@@ -29,28 +29,37 @@ export const TOOLS = [
|
|
|
29
29
|
},
|
|
30
30
|
scope: {
|
|
31
31
|
type: 'string',
|
|
32
|
-
description: 'Restrict results and continuity to memories/rows matching this scope exactly. When omitted, default-deny applies to ANY
|
|
32
|
+
description: 'Restrict results and continuity to memories/rows matching this scope exactly. When omitted, default-deny applies to ANY ' +
|
|
33
|
+
'<source>:private:* (slack, github, ...) and unknown-legacy rows.',
|
|
33
34
|
},
|
|
34
35
|
fresh_tail_count: {
|
|
35
36
|
type: 'number',
|
|
36
|
-
description: 'When > 0, surface the last N kind=raw rows tagged isFreshTail=true regardless of query match. Useful for "what did I just see"
|
|
37
|
+
description: 'When > 0, surface the last N kind=raw rows tagged isFreshTail=true regardless of query match. Useful for "what did I just see" ' +
|
|
38
|
+
'continuity. Capped at 200.',
|
|
37
39
|
},
|
|
38
40
|
fresh_tail_session_id: {
|
|
39
41
|
type: 'string',
|
|
40
|
-
description: 'Restrict the fresh-tail window to a specific session. Without this, fresh-tail is tenant-wide (legacy v1.5.2 behaviour, pre-v1.6.3
|
|
42
|
+
description: 'Restrict the fresh-tail window to a specific session. Without this, fresh-tail is tenant-wide (legacy v1.5.2 behaviour, pre-v1.6.3 ' +
|
|
43
|
+
'default).',
|
|
41
44
|
},
|
|
42
45
|
summarize_overflow: {
|
|
43
46
|
type: 'boolean',
|
|
44
|
-
description: 'When true (default), entries that overflow the limit and share a level-2 parent summary cause that summary to be appended in their
|
|
47
|
+
description: 'When true (default), entries that overflow the limit and share a level-2 parent summary cause that summary to be appended in their ' +
|
|
48
|
+
'place. Set false for strict-limit behaviour.',
|
|
45
49
|
},
|
|
46
50
|
scorer_window: {
|
|
47
51
|
type: 'number',
|
|
48
|
-
description: `How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against.
|
|
52
|
+
description: `How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. ` +
|
|
53
|
+
`The main list ranks the whole tenant store, so scorer_window does not narrow it. ` +
|
|
54
|
+
`Default ${DEFAULT_SEARCH_CANDIDATE_LIMIT}. ` +
|
|
55
|
+
`Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.`,
|
|
49
56
|
},
|
|
50
57
|
session_id: {
|
|
51
58
|
type: 'string',
|
|
52
59
|
maxLength: MAX_ID_LEN,
|
|
53
|
-
description: `Optional session id (v1.7.4). When set AND (tenant, session) has active goals,
|
|
60
|
+
description: `Optional session id (v1.7.4). When set AND (tenant, session) has active goals, ` +
|
|
61
|
+
`applies the dlPFC goal-stack boost to the ranked memories before formatting. ` +
|
|
62
|
+
`Mirrors fresh_tail_session_id shape (${MAX_ID_LEN}-char cap).`,
|
|
54
63
|
},
|
|
55
64
|
},
|
|
56
65
|
required: ['query'],
|
|
@@ -58,7 +67,9 @@ export const TOOLS = [
|
|
|
58
67
|
},
|
|
59
68
|
{
|
|
60
69
|
name: 'hippo_assemble',
|
|
61
|
-
description: 'Build a chronologically-ordered context window for a session. Returns ordered items: fresh-tail raw rows + level-2 summary substitutions for older
|
|
70
|
+
description: 'Build a chronologically-ordered context window for a session. Returns ordered items: fresh-tail raw rows + level-2 summary substitutions for older ' +
|
|
71
|
+
'rows + budget-fit. Hippo-additive vs lossless-claw: eviction picks lowest-strength non-fresh-tail items first instead of oldest-first. ' +
|
|
72
|
+
'Tenant-scoped; default-deny on private scopes.',
|
|
62
73
|
inputSchema: {
|
|
63
74
|
type: 'object',
|
|
64
75
|
properties: {
|
|
@@ -82,7 +93,8 @@ export const TOOLS = [
|
|
|
82
93
|
},
|
|
83
94
|
scope: {
|
|
84
95
|
type: 'string',
|
|
85
|
-
description: 'Restrict to memories whose scope matches exactly. When omitted, default-deny applies to ANY <source>:private:* scope and
|
|
96
|
+
description: 'Restrict to memories whose scope matches exactly. When omitted, default-deny applies to ANY <source>:private:* scope and ' +
|
|
97
|
+
'unknown:legacy rows. Pass an explicit scope to assemble a private session with consent.',
|
|
86
98
|
},
|
|
87
99
|
},
|
|
88
100
|
required: ['session_id'],
|
|
@@ -90,7 +102,8 @@ export const TOOLS = [
|
|
|
90
102
|
},
|
|
91
103
|
{
|
|
92
104
|
name: 'hippo_drill',
|
|
93
|
-
description: 'Walk one step down the DAG from a level-2+ topic summary to its direct children. Companion to hippo_recall: when recall returns an item with
|
|
105
|
+
description: 'Walk one step down the DAG from a level-2+ topic summary to its direct children. Companion to hippo_recall: when recall returns an item with ' +
|
|
106
|
+
'isSummary=true and substitutedFor=[ids], pass the summary id here to recover the original detail. Tenant-scoped; default-deny on private scopes.',
|
|
94
107
|
inputSchema: {
|
|
95
108
|
type: 'object',
|
|
96
109
|
properties: {
|
|
@@ -114,7 +127,8 @@ export const TOOLS = [
|
|
|
114
127
|
type: 'integer',
|
|
115
128
|
minimum: 1,
|
|
116
129
|
maximum: 10,
|
|
117
|
-
description: 'v0.30 / E5: walk N levels down (default 1 = direct children only). Higher values include children of children. Token budget remains
|
|
130
|
+
description: 'v0.30 / E5: walk N levels down (default 1 = direct children only). Higher values include children of children. Token budget remains ' +
|
|
131
|
+
'GLOBAL across levels. Hard cap 10.',
|
|
118
132
|
},
|
|
119
133
|
},
|
|
120
134
|
required: ['summary_id'],
|
|
@@ -122,7 +136,8 @@ export const TOOLS = [
|
|
|
122
136
|
},
|
|
123
137
|
{
|
|
124
138
|
name: 'hippo_remember',
|
|
125
|
-
description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved.
|
|
139
|
+
description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved. ' +
|
|
140
|
+
'Errors get 2x half-life.',
|
|
126
141
|
inputSchema: {
|
|
127
142
|
type: 'object',
|
|
128
143
|
properties: {
|
|
@@ -133,14 +148,16 @@ export const TOOLS = [
|
|
|
133
148
|
error: { type: 'boolean', description: 'Mark as error memory (doubles half-life)' },
|
|
134
149
|
pin: { type: 'boolean', description: 'Pin memory (never decays)' },
|
|
135
150
|
tag: { type: 'string', description: 'Optional tag for categorization' },
|
|
136
|
-
personal: { type: 'boolean', description: 'Store it as your own private memory: only you can recall it, in every project. Needs a key you minted or
|
|
151
|
+
personal: { type: 'boolean', description: 'Store it as your own private memory: only you can recall it, in every project. Needs a key you minted or ' +
|
|
152
|
+
'a sign-in.' },
|
|
137
153
|
},
|
|
138
154
|
required: ['text'],
|
|
139
155
|
},
|
|
140
156
|
},
|
|
141
157
|
{
|
|
142
158
|
name: 'hippo_outcome',
|
|
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
|
|
159
|
+
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 " +
|
|
160
|
+
"completing work.",
|
|
144
161
|
inputSchema: {
|
|
145
162
|
type: 'object',
|
|
146
163
|
properties: {
|
|
@@ -154,7 +171,9 @@ export const TOOLS = [
|
|
|
154
171
|
},
|
|
155
172
|
{
|
|
156
173
|
name: 'hippo_context',
|
|
157
|
-
description: 'Smart context injection: auto-detects current task from git state and returns relevant memories plus the active task snapshot, session handoff and
|
|
174
|
+
description: 'Smart context injection: auto-detects current task from git state and returns relevant memories plus the active task snapshot, session handoff and ' +
|
|
175
|
+
'recent session trail (the same bundle as GET /v1/context). Use at the start of any session. Memories and those sections are scope-filtered: a ' +
|
|
176
|
+
'no-scope caller does NOT see ANY <source>:private:* (slack, github, ...) or legacy-quarantine rows.',
|
|
158
177
|
inputSchema: {
|
|
159
178
|
type: 'object',
|
|
160
179
|
properties: {
|
|
@@ -166,7 +185,8 @@ export const TOOLS = [
|
|
|
166
185
|
},
|
|
167
186
|
scope: {
|
|
168
187
|
type: 'string',
|
|
169
|
-
description: 'Restrict memories, snapshot, handoff and trail to this scope exactly. When omitted, default-deny applies to ANY <source>:private:*
|
|
188
|
+
description: 'Restrict memories, snapshot, handoff and trail to this scope exactly. When omitted, default-deny applies to ANY <source>:private:* ' +
|
|
189
|
+
'(slack, github, ...) and unknown-legacy rows.',
|
|
170
190
|
},
|
|
171
191
|
},
|
|
172
192
|
},
|
|
@@ -234,13 +254,16 @@ export const TOOLS = [
|
|
|
234
254
|
},
|
|
235
255
|
{
|
|
236
256
|
name: 'hippo_predict_baserate',
|
|
237
|
-
description: 'J3 reference-class / planning-fallacy detector. Get base-rate stats for closed predictions in a class. Call this when you make a forward-looking
|
|
257
|
+
description: 'J3 reference-class / planning-fallacy detector. Get base-rate stats for closed predictions in a class. Call this when you make a forward-looking ' +
|
|
258
|
+
'claim (effort estimate, rollout risk, deadline) to anchor on the past track record rather than the inside view. Returns count + mean estimate + ' +
|
|
259
|
+
'mean actual + mean ratio + median ratio + MAE + a human-readable summary. Tenant-scoped.',
|
|
238
260
|
inputSchema: {
|
|
239
261
|
type: 'object',
|
|
240
262
|
properties: {
|
|
241
263
|
class_tag: {
|
|
242
264
|
type: 'string',
|
|
243
|
-
description: 'Cohort label, e.g. "migration-effort", "rollout-risk", "deadline-week". Must match the class_tag used when the predictions were
|
|
265
|
+
description: 'Cohort label, e.g. "migration-effort", "rollout-risk", "deadline-week". Must match the class_tag used when the predictions were ' +
|
|
266
|
+
'created via hippo_predict (or `hippo predict ...`).',
|
|
244
267
|
},
|
|
245
268
|
},
|
|
246
269
|
required: ['class_tag'],
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
3
3
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
4
4
|
import type { SavableDescriptor } from './descriptor.js';
|
|
5
|
-
import type { CustomerNote, NoteStatus } from '../
|
|
6
|
-
export type { CustomerNote, NoteStatus } from '../
|
|
5
|
+
import type { CustomerNote, NoteStatus } from '../core/object-types.js';
|
|
6
|
+
export type { CustomerNote, NoteStatus } from '../core/object-types.js';
|
|
7
7
|
export declare const VALID_NOTE_STATES: ReadonlySet<NoteStatus>;
|
|
8
8
|
/** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
|
|
9
9
|
* than the 4096 short-field convention. */
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import type { MemoryEntry } from '../core/memory.js';
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
6
|
-
import type { Decision, DecisionStatus } from '../
|
|
7
|
-
export type { Decision, DecisionStatus } from '../
|
|
6
|
+
import type { Decision, DecisionStatus } from '../core/object-types.js';
|
|
7
|
+
export type { Decision, DecisionStatus } from '../core/object-types.js';
|
|
8
8
|
export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
|
|
9
9
|
export interface SaveDecisionOpts {
|
|
10
10
|
decisionText: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
2
|
-
import type { ObjectByKind, ObjectFields, ObjectKind, SavableKind } from '../
|
|
2
|
+
import type { ObjectByKind, ObjectFields, ObjectKind, SavableKind } from '../core/object-types.js';
|
|
3
3
|
export interface ObjectDescriptor<K extends ObjectKind> {
|
|
4
4
|
readonly kind: K;
|
|
5
5
|
/** The nouns error text uses: "brief 3 not found", "only active briefs". */
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import type { ObjectDescriptor } from './descriptor.js';
|
|
6
|
-
import type { Incident, IncidentStatus } from '../
|
|
6
|
+
import type { Incident, IncidentStatus } from '../core/object-types.js';
|
|
7
7
|
import { type Objects } from '../store/port.js';
|
|
8
|
-
export type { Incident, IncidentStatus } from '../
|
|
8
|
+
export type { Incident, IncidentStatus } from '../core/object-types.js';
|
|
9
9
|
export declare const VALID_INCIDENT_STATES: ReadonlySet<IncidentStatus>;
|
|
10
10
|
export interface SaveIncidentOpts {
|
|
11
11
|
incidentText: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
-
import type { ObjectByKind, ObjectKind, SavableKind } from '../
|
|
2
|
+
import type { ObjectByKind, ObjectKind, SavableKind } from '../core/object-types.js';
|
|
3
3
|
import { type Objects } from '../store/port.js';
|
|
4
4
|
import type { ObjectDescriptor, ObjectListOpts, SavableDescriptor } from './descriptor.js';
|
|
5
5
|
/** Newest first. */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Save, close, load-by-id and list for every typed object: the checks, the mirror memory and the error text, over the `objects` store group.
|
|
2
2
|
// Each flow is written twice over the same steps: `...At` answers at once on hippo.db for the CLI, and the other awaits a served store's group for the routes.
|
|
3
3
|
// The tenant, the fields and the list status are checked first, so a bad request fails before a store is asked.
|
|
4
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
4
5
|
import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
5
6
|
import { loadConfig } from '../core/config.js';
|
|
6
7
|
import { createMemory, Layer } from '../core/memory.js';
|
|
@@ -13,7 +14,7 @@ function listQuery(d, tenantId, opts) {
|
|
|
13
14
|
if (opts.status && !d.states.has(opts.status)) {
|
|
14
15
|
throw new BadRequestError(`${d.fn.list}: status must be one of ${Array.from(d.states).join('|')}; got ${opts.status}`);
|
|
15
16
|
}
|
|
16
|
-
return { status: opts.status || undefined, filter: opts.filter || undefined, limit: opts.limit ??
|
|
17
|
+
return { status: opts.status || undefined, filter: opts.filter || undefined, limit: opts.limit ?? DEFAULT_LIST_LIMIT, after: opts.after };
|
|
17
18
|
}
|
|
18
19
|
/** Newest first. */
|
|
19
20
|
export function listObjectsAt(hippoRoot, d, tenantId, opts) {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
6
|
-
import type { Policy, PolicyStatus } from '../
|
|
6
|
+
import type { Policy, PolicyStatus } from '../core/object-types.js';
|
|
7
7
|
import type { Objects } from '../store/port.js';
|
|
8
|
-
export type { Policy, PolicyStatus } from '../
|
|
8
|
+
export type { Policy, PolicyStatus } from '../core/object-types.js';
|
|
9
9
|
export declare const VALID_POLICY_STATES: ReadonlySet<PolicyStatus>;
|
|
10
10
|
export interface SavePolicyOpts {
|
|
11
11
|
policyName: string;
|
package/dist/objects/policies.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Policy object: a rule in force over a valid-time range [valid_from, valid_to), evolving via supersession; `loadPoliciesAsOf` queries it.
|
|
2
2
|
* Transaction-time travel (what we believed at past system time T) is deferred. Superseding keeps the predecessor's valid-time range.
|
|
3
3
|
* All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
|
|
4
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
4
5
|
import { BadRequestError } from '../core/api-errors.js';
|
|
5
6
|
import { assertTenantId } from '../store/tenant.js';
|
|
6
7
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
@@ -97,6 +98,6 @@ function inForceQuery(tenantId, asOfDate, opts) {
|
|
|
97
98
|
const asOf = /^\d{4}-\d{2}-\d{2}$/.test(asOfDate.trim())
|
|
98
99
|
? normalizePolicyDate(`${asOfDate.trim()}T23:59:59.999Z`, 'asOfDate')
|
|
99
100
|
: normalizePolicyDate(asOfDate, 'asOfDate');
|
|
100
|
-
return { asOf, name: opts.name, limit: opts.limit ??
|
|
101
|
+
return { asOf, name: opts.name, limit: opts.limit ?? DEFAULT_LIST_LIMIT };
|
|
101
102
|
}
|
|
102
103
|
//# sourceMappingURL=policies.js.map
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import { type JsonValue } from '../util/json.js';
|
|
6
6
|
import type { SavableDescriptor } from './descriptor.js';
|
|
7
|
-
import type { Process, ProcessStatus } from '../
|
|
8
|
-
export type { Process, ProcessStatus } from '../
|
|
7
|
+
import type { Process, ProcessStatus } from '../core/object-types.js';
|
|
8
|
+
export type { Process, ProcessStatus } from '../core/object-types.js';
|
|
9
9
|
export declare const VALID_PROCESS_STATES: ReadonlySet<ProcessStatus>;
|
|
10
10
|
/** DoS / abuse caps on the steps body (untrusted at the HTTP/SDK boundary). */
|
|
11
11
|
export declare const MAX_PROCESS_STEPS = 200;
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
6
6
|
import { type ObjectSaveSite } from './lifecycle.js';
|
|
7
|
-
import type { BriefStatus, ProjectBrief } from '../
|
|
7
|
+
import type { BriefStatus, ProjectBrief } from '../core/object-types.js';
|
|
8
8
|
import type { Objects } from '../store/port.js';
|
|
9
|
-
export type { BriefStatus, ProjectBrief } from '../
|
|
9
|
+
export type { BriefStatus, ProjectBrief } from '../core/object-types.js';
|
|
10
10
|
export declare const VALID_BRIEF_STATES: ReadonlySet<BriefStatus>;
|
|
11
11
|
/** Field caps (untrusted at the HTTP/SDK boundary). summary is a body, so a larger
|
|
12
12
|
* cap than the 4096 short-field convention. */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Project_brief object: the living, repo-scoped `summary` of a repository, evolving via supersession.
|
|
2
2
|
* `refreshBrief` assembles recent `path:<repo>` receipts with a deterministic (no-LLM) assembler; an LLM pipeline is deferred.
|
|
3
3
|
* The `project_briefs` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
4
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
4
5
|
import { BadRequestError } from '../core/api-errors.js';
|
|
5
6
|
import { assertTenantId } from '../store/tenant.js';
|
|
6
7
|
import { checkText, requireLine } from './fields.js';
|
|
@@ -87,9 +88,7 @@ function newestActive(repo) {
|
|
|
87
88
|
function receiptHeadline(content) {
|
|
88
89
|
const firstLine = (content ?? '').split(/\r?\n/).find((l) => l.trim().length > 0) ?? '';
|
|
89
90
|
const trimmed = firstLine.trim();
|
|
90
|
-
return trimmed
|
|
91
|
-
? `${trimmed.slice(0, MAX_RECEIPT_HEADLINE_LEN)}...`
|
|
92
|
-
: trimmed;
|
|
91
|
+
return truncateWithEllipsis(trimmed, MAX_RECEIPT_HEADLINE_LEN);
|
|
93
92
|
}
|
|
94
93
|
/** The tag a memory of the repo carries; the store matches it whole, so `path:hip` never matches `path:hippo`. */
|
|
95
94
|
function receiptTag(normalizedRepo) {
|
package/dist/objects/skills.d.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* `trigger` is stored in `trigger_text` because it is a SQLite reserved keyword. */
|
|
4
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
5
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
6
|
-
import type { Skill, SkillStatus } from '../
|
|
6
|
+
import type { Skill, SkillStatus } from '../core/object-types.js';
|
|
7
7
|
import type { Objects } from '../store/port.js';
|
|
8
|
-
export type { Skill, SkillStatus } from '../
|
|
8
|
+
export type { Skill, SkillStatus } from '../core/object-types.js';
|
|
9
9
|
export declare const VALID_SKILL_STATES: ReadonlySet<SkillStatus>;
|
|
10
10
|
/** Field caps (untrusted at the HTTP/SDK boundary). instructions is a body, so a
|
|
11
11
|
* larger cap than the 4096 short-field convention. */
|
package/dist/postinstall.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as fs from 'node:fs';
|
|
|
3
3
|
import * as os from 'node:os';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
|
|
6
|
-
import { claudeConfigDir } from './
|
|
6
|
+
import { claudeConfigDir } from './util/agent-homes.js';
|
|
7
7
|
import { errorMessage, log } from './util/log.js';
|
|
8
8
|
function main() {
|
|
9
9
|
if (envSkipPostinstall())
|
package/dist/rerankers/clef.js
CHANGED
|
@@ -3,7 +3,7 @@ import { buildRelevanceRequest, JEV_DEFAULT_TOP_K, rankByScores } from './jev.js
|
|
|
3
3
|
import { createOutageWarning } from './outage-warning.js';
|
|
4
4
|
import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
|
|
5
5
|
import { readCappedJson } from '../util/capped-json.js';
|
|
6
|
-
import { isJsonObject } from '../util/json.js';
|
|
6
|
+
import { isJsonObject, isJsonString } from '../util/json.js';
|
|
7
7
|
import { errorMessage } from '../util/log.js';
|
|
8
8
|
const RAY_ID_MAX_CHARS = 64;
|
|
9
9
|
const CLEF_MODELS = ['clef-flash', 'clef'];
|
|
@@ -23,9 +23,6 @@ function isLoopback(hostname) {
|
|
|
23
23
|
function isNumber(v) {
|
|
24
24
|
return Number.isFinite(v);
|
|
25
25
|
}
|
|
26
|
-
function isString(v) {
|
|
27
|
-
return v !== undefined && v !== null && v.constructor === String;
|
|
28
|
-
}
|
|
29
26
|
function isRejection(v) {
|
|
30
27
|
return v.constructor === String;
|
|
31
28
|
}
|
|
@@ -83,7 +80,7 @@ export function parseClefReply(body, n, model, requireModel) {
|
|
|
83
80
|
if (!isJsonObject(reply))
|
|
84
81
|
return 'reply has no result object';
|
|
85
82
|
const actual = reply.model;
|
|
86
|
-
if (actual !== undefined && (!
|
|
83
|
+
if (actual !== undefined && (!isJsonString(actual) || actual.trim() !== model))
|
|
87
84
|
return 'reply names a different model';
|
|
88
85
|
if (actual === undefined && requireModel)
|
|
89
86
|
return 'reply does not name its model';
|
|
@@ -105,7 +102,7 @@ export function parseClefReply(body, n, model, requireModel) {
|
|
|
105
102
|
const usage = isJsonObject(reply.usage) ? reply.usage : {};
|
|
106
103
|
return {
|
|
107
104
|
scores,
|
|
108
|
-
actualModel:
|
|
105
|
+
actualModel: isJsonString(actual) ? actual.trim() : undefined,
|
|
109
106
|
inputTokens: isNumber(usage.input_tokens) ? usage.input_tokens : undefined,
|
|
110
107
|
outputTokens: isNumber(usage.output_tokens) ? usage.output_tokens : undefined,
|
|
111
108
|
};
|
|
@@ -1,4 +1,33 @@
|
|
|
1
1
|
import type { RerankerFn } from './types.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
interface Tokenized {
|
|
3
|
+
readonly input_ids: object;
|
|
4
|
+
readonly attention_mask: object;
|
|
5
|
+
}
|
|
6
|
+
type TokenizerFn = (text: string, opts: {
|
|
7
|
+
text_pair: string;
|
|
8
|
+
padding: boolean;
|
|
9
|
+
truncation: boolean;
|
|
10
|
+
}) => Promise<Tokenized>;
|
|
11
|
+
type SeqClsModel = (inputs: Tokenized) => Promise<{
|
|
12
|
+
logits: {
|
|
13
|
+
data: ArrayLike<number>;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
interface FromPretrained<T> {
|
|
17
|
+
from_pretrained: (model: string) => Promise<T>;
|
|
18
|
+
}
|
|
19
|
+
interface TransformersExports {
|
|
20
|
+
AutoTokenizer?: FromPretrained<TokenizerFn>;
|
|
21
|
+
AutoModelForSequenceClassification?: FromPretrained<SeqClsModel>;
|
|
22
|
+
}
|
|
23
|
+
interface TransformersModuleNamespace extends TransformersExports {
|
|
24
|
+
default?: TransformersExports;
|
|
25
|
+
}
|
|
26
|
+
type ImportModule = () => Promise<{
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly mod: TransformersModuleNamespace;
|
|
29
|
+
} | null>;
|
|
30
|
+
/** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
|
|
31
|
+
export declare function createCrossEncoderReranker(importModule?: ImportModule): RerankerFn;
|
|
32
|
+
export {};
|
|
4
33
|
//# sourceMappingURL=cross-encoder.d.ts.map
|