hippo-memory 1.70.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- 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/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/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- 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 +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- 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 +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -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/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 +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- 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 +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- 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 +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- 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.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- 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.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- 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.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- 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/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- 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 +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- 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 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- 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 +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- 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 +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- 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 +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- 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 +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- 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 +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- 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 +49 -40
- 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 +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- 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 +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -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 +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- 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 +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- 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/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -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 +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- 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/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- 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 +3 -2
- 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 +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- 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 +24 -44
- 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 +4 -3
- 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 +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- 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 +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- 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 +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- 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 +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- 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/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- 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.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -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 +24 -53
- 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 +16 -19
- 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 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- 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 +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- 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/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.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- 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.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- 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 +24 -60
- 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 +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- 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.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- 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 +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- 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 +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- 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 +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- 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/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- 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 +11 -63
- package/dist/store/summaries.js +37 -148
- 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 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- 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 +35 -6
- 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/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- 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 +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- 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/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/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- 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 +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -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,19 +1,24 @@
|
|
|
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 '../util/request-scope.js';
|
|
5
|
+
import { MAX_BODY_BYTES } from '../util/http-util.js';
|
|
4
6
|
import { parseFrame } from './framing.js';
|
|
5
7
|
import { mcpErrorResponse } from './protocol.js';
|
|
6
8
|
import { handleMcpRequest } from './request.js';
|
|
7
9
|
import { isJsonNumber, isJsonString, isJsonObject } from '../util/json.js';
|
|
8
10
|
import { randomUUID } from 'node:crypto';
|
|
9
|
-
import { runWithRequestId } from '../util/request-scope.js';
|
|
11
|
+
import { currentRequestId, runWithRequestId } from '../util/request-scope.js';
|
|
10
12
|
// MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
|
|
11
13
|
// https://modelcontextprotocol.io/specification/.../basic/transports#stdio
|
|
12
14
|
function send(msg) {
|
|
13
15
|
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
14
16
|
}
|
|
15
17
|
// ── Stdio transport ──
|
|
16
|
-
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;
|
|
17
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.
|
|
18
23
|
let refused = 0;
|
|
19
24
|
function withoutRefused(chunk) {
|
|
@@ -61,6 +66,40 @@ async function exitWhenDrained() {
|
|
|
61
66
|
}
|
|
62
67
|
exitAfterFlush(0);
|
|
63
68
|
}
|
|
69
|
+
// The code the MCP SDKs give a request that timed out.
|
|
70
|
+
const REQUEST_TIMEOUT_CODE = -32001;
|
|
71
|
+
/** The method, with the tool's name for a tool call, so a timeout names what ran. */
|
|
72
|
+
function callName(req) {
|
|
73
|
+
const tool = req.params?.name;
|
|
74
|
+
return isJsonString(tool) ? `${req.method} ${tool.slice(0, 128)}` : req.method;
|
|
75
|
+
}
|
|
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. */
|
|
78
|
+
function watchDeadline(req, owedReply) {
|
|
79
|
+
const ms = requestDeadlineMs();
|
|
80
|
+
if (ms === 0)
|
|
81
|
+
return () => false;
|
|
82
|
+
let expired = false;
|
|
83
|
+
const timer = setTimeout(() => {
|
|
84
|
+
expired = true;
|
|
85
|
+
const name = callName(req);
|
|
86
|
+
log.warn(`mcp: ${name} did not answer within ${ms} ms; it keeps running and its reply will be dropped`, { method: req.method });
|
|
87
|
+
if (!owedReply)
|
|
88
|
+
return;
|
|
89
|
+
const requestId = currentRequestId();
|
|
90
|
+
const message = `Request timed out: ${name} did not finish within ${ms} ms; a write it started may or may not be saved`;
|
|
91
|
+
const error = { code: REQUEST_TIMEOUT_CODE, message };
|
|
92
|
+
if (requestId !== undefined)
|
|
93
|
+
error.data = { requestId };
|
|
94
|
+
send({ jsonrpc: '2.0', id: req.id, error });
|
|
95
|
+
}, ms);
|
|
96
|
+
// Stdin and the call keep the process alive; this timer alone must not.
|
|
97
|
+
timer.unref();
|
|
98
|
+
return () => {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
return expired;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
64
103
|
function dispatch(body) {
|
|
65
104
|
let parsed;
|
|
66
105
|
try {
|
|
@@ -77,29 +116,40 @@ function dispatch(body) {
|
|
|
77
116
|
}
|
|
78
117
|
const req = parsed;
|
|
79
118
|
if (req.method.startsWith('notifications/')) {
|
|
119
|
+
const stopWatching = watchDeadline(req, false);
|
|
80
120
|
track(req.method, handleMcpRequest(req).then(() => { }).catch((err) => {
|
|
81
|
-
log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}
|
|
82
|
-
}));
|
|
121
|
+
log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}`, errorFields(err));
|
|
122
|
+
}).finally(stopWatching));
|
|
83
123
|
return;
|
|
84
124
|
}
|
|
85
|
-
|
|
125
|
+
// A frame with no id is a notification under any method name, and JSON-RPC forbids answering one.
|
|
126
|
+
const timedOut = watchDeadline(req, isJsonString(req.id) || isJsonNumber(req.id));
|
|
127
|
+
track(req.method, handleMcpRequest(req).then((resp) => { if (!timedOut() && resp)
|
|
86
128
|
send(resp); }).catch((err) => {
|
|
87
|
-
|
|
129
|
+
if (timedOut())
|
|
130
|
+
log.error(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`, errorFields(err));
|
|
131
|
+
else
|
|
132
|
+
send(mcpErrorResponse(req.id, err, undefined, callName(req)));
|
|
88
133
|
}));
|
|
89
134
|
}
|
|
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
|
-
*/
|
|
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
|
|
136
|
+
* (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
|
|
96
137
|
export function startStdioLoop() {
|
|
97
|
-
process.stdin.on('data', (
|
|
98
|
-
|
|
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;
|
|
99
147
|
while (true) {
|
|
100
148
|
const result = parseFrame(buffer);
|
|
101
|
-
if (result.kind === 'incomplete')
|
|
149
|
+
if (result.kind === 'incomplete') {
|
|
150
|
+
needs = result.needs;
|
|
102
151
|
break;
|
|
152
|
+
}
|
|
103
153
|
buffer = result.rest;
|
|
104
154
|
if (result.kind === 'oversize') {
|
|
105
155
|
refused = result.remainder;
|
|
@@ -111,6 +161,8 @@ export function startStdioLoop() {
|
|
|
111
161
|
if (result.kind === 'message')
|
|
112
162
|
runWithRequestId(randomUUID(), () => dispatch(result.body));
|
|
113
163
|
}
|
|
164
|
+
pending = buffer.length > 0 ? [buffer] : [];
|
|
165
|
+
pendingBytes = buffer.length;
|
|
114
166
|
});
|
|
115
167
|
process.stdin.on('end', () => { void exitWhenDrained(); });
|
|
116
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,16 +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
|
+
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;
|
|
8
|
-
// Same ceiling as the HTTP list routes' parseListLimit.
|
|
9
|
-
const MAX_LIST_LIMIT = 1000;
|
|
10
10
|
export const TOOLS = [
|
|
11
11
|
{
|
|
12
12
|
name: 'hippo_recall',
|
|
13
|
-
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.',
|
|
14
16
|
inputSchema: {
|
|
15
17
|
type: 'object',
|
|
16
18
|
properties: {
|
|
@@ -27,28 +29,37 @@ export const TOOLS = [
|
|
|
27
29
|
},
|
|
28
30
|
scope: {
|
|
29
31
|
type: 'string',
|
|
30
|
-
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.',
|
|
31
34
|
},
|
|
32
35
|
fresh_tail_count: {
|
|
33
36
|
type: 'number',
|
|
34
|
-
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.',
|
|
35
39
|
},
|
|
36
40
|
fresh_tail_session_id: {
|
|
37
41
|
type: 'string',
|
|
38
|
-
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).',
|
|
39
44
|
},
|
|
40
45
|
summarize_overflow: {
|
|
41
46
|
type: 'boolean',
|
|
42
|
-
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.',
|
|
43
49
|
},
|
|
44
50
|
scorer_window: {
|
|
45
51
|
type: 'number',
|
|
46
|
-
description:
|
|
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.`,
|
|
47
56
|
},
|
|
48
57
|
session_id: {
|
|
49
58
|
type: 'string',
|
|
50
59
|
maxLength: MAX_ID_LEN,
|
|
51
|
-
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).`,
|
|
52
63
|
},
|
|
53
64
|
},
|
|
54
65
|
required: ['query'],
|
|
@@ -56,7 +67,9 @@ export const TOOLS = [
|
|
|
56
67
|
},
|
|
57
68
|
{
|
|
58
69
|
name: 'hippo_assemble',
|
|
59
|
-
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.',
|
|
60
73
|
inputSchema: {
|
|
61
74
|
type: 'object',
|
|
62
75
|
properties: {
|
|
@@ -80,7 +93,8 @@ export const TOOLS = [
|
|
|
80
93
|
},
|
|
81
94
|
scope: {
|
|
82
95
|
type: 'string',
|
|
83
|
-
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.',
|
|
84
98
|
},
|
|
85
99
|
},
|
|
86
100
|
required: ['session_id'],
|
|
@@ -88,7 +102,8 @@ export const TOOLS = [
|
|
|
88
102
|
},
|
|
89
103
|
{
|
|
90
104
|
name: 'hippo_drill',
|
|
91
|
-
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.',
|
|
92
107
|
inputSchema: {
|
|
93
108
|
type: 'object',
|
|
94
109
|
properties: {
|
|
@@ -112,7 +127,8 @@ export const TOOLS = [
|
|
|
112
127
|
type: 'integer',
|
|
113
128
|
minimum: 1,
|
|
114
129
|
maximum: 10,
|
|
115
|
-
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.',
|
|
116
132
|
},
|
|
117
133
|
},
|
|
118
134
|
required: ['summary_id'],
|
|
@@ -120,7 +136,8 @@ export const TOOLS = [
|
|
|
120
136
|
},
|
|
121
137
|
{
|
|
122
138
|
name: 'hippo_remember',
|
|
123
|
-
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.',
|
|
124
141
|
inputSchema: {
|
|
125
142
|
type: 'object',
|
|
126
143
|
properties: {
|
|
@@ -131,14 +148,16 @@ export const TOOLS = [
|
|
|
131
148
|
error: { type: 'boolean', description: 'Mark as error memory (doubles half-life)' },
|
|
132
149
|
pin: { type: 'boolean', description: 'Pin memory (never decays)' },
|
|
133
150
|
tag: { type: 'string', description: 'Optional tag for categorization' },
|
|
134
|
-
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.' },
|
|
135
153
|
},
|
|
136
154
|
required: ['text'],
|
|
137
155
|
},
|
|
138
156
|
},
|
|
139
157
|
{
|
|
140
158
|
name: 'hippo_outcome',
|
|
141
|
-
description:
|
|
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.",
|
|
142
161
|
inputSchema: {
|
|
143
162
|
type: 'object',
|
|
144
163
|
properties: {
|
|
@@ -152,7 +171,9 @@ export const TOOLS = [
|
|
|
152
171
|
},
|
|
153
172
|
{
|
|
154
173
|
name: 'hippo_context',
|
|
155
|
-
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.',
|
|
156
177
|
inputSchema: {
|
|
157
178
|
type: 'object',
|
|
158
179
|
properties: {
|
|
@@ -160,11 +181,12 @@ export const TOOLS = [
|
|
|
160
181
|
type: 'number',
|
|
161
182
|
minimum: 0,
|
|
162
183
|
maximum: MAX_BUDGET_TOKENS,
|
|
163
|
-
description: `Max tokens (default: config.defaultContextBudget,
|
|
184
|
+
description: `Max tokens (default: config.defaultContextBudget, ${DEFAULT_CONFIG.defaultContextBudget}; max ${MAX_BUDGET_TOKENS})`,
|
|
164
185
|
},
|
|
165
186
|
scope: {
|
|
166
187
|
type: 'string',
|
|
167
|
-
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.',
|
|
168
190
|
},
|
|
169
191
|
},
|
|
170
192
|
},
|
|
@@ -232,13 +254,16 @@ export const TOOLS = [
|
|
|
232
254
|
},
|
|
233
255
|
{
|
|
234
256
|
name: 'hippo_predict_baserate',
|
|
235
|
-
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.',
|
|
236
260
|
inputSchema: {
|
|
237
261
|
type: 'object',
|
|
238
262
|
properties: {
|
|
239
263
|
class_tag: {
|
|
240
264
|
type: 'string',
|
|
241
|
-
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 ...`).',
|
|
242
267
|
},
|
|
243
268
|
},
|
|
244
269
|
required: ['class_tag'],
|
|
@@ -1,27 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `customer_note` is a discrete note recorded against an account/customer entity:
|
|
5
|
-
* a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
|
|
7
|
-
* so an FK is deferred). Unlike project_brief's one-summary-per-repo,
|
|
8
|
-
* a customer accrues MANY discrete notes over time, each with its own supersede chain
|
|
9
|
-
* (correct a note -> a new version preserving history; close retires it).
|
|
10
|
-
*
|
|
11
|
-
* Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
|
|
12
|
-
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
13
|
-
* tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
|
|
14
|
-
* contribution is purely the entity-scoping dimension.
|
|
15
|
-
*
|
|
16
|
-
* The `customer_notes` table is the source of truth (survives memory decay); the
|
|
17
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
|
|
20
|
-
*/
|
|
1
|
+
/** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
|
|
2
|
+
* The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
21
3
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
22
4
|
import type { SavableDescriptor } from './descriptor.js';
|
|
23
|
-
import type { CustomerNote, NoteStatus } from '../
|
|
24
|
-
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';
|
|
25
7
|
export declare const VALID_NOTE_STATES: ReadonlySet<NoteStatus>;
|
|
26
8
|
/** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
|
|
27
9
|
* than the 4096 short-field convention. */
|
|
@@ -47,32 +29,15 @@ export interface ListCustomerNotesOpts {
|
|
|
47
29
|
after?: KeysetPosition;
|
|
48
30
|
}
|
|
49
31
|
export declare const CUSTOMER_NOTE: SavableDescriptor<'customer_note', SaveCustomerNoteOpts>;
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
* the memory mirror + the customer_notes row in the `objects` store group's one transaction.
|
|
53
|
-
* When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
|
|
54
|
-
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
|
|
55
|
-
* the new version = predecessor.version + 1 (server-derived).
|
|
56
|
-
*
|
|
57
|
-
* The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
|
|
58
|
-
* + caller extraTags) so scope-aware recall treats the note as entity-local. There is
|
|
59
|
-
* no self-recursion path (customer_note has no receipt-query/refresh).
|
|
60
|
-
*/
|
|
32
|
+
/** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
33
|
+
* The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
|
|
61
34
|
export declare function saveCustomerNote(hippoRoot: string, tenantId: string, opts: SaveCustomerNoteOpts, actor?: string): CustomerNote;
|
|
62
|
-
/**
|
|
63
|
-
* Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
|
|
64
|
-
* distinguishes not-found from not-active. A superseded row is terminal.
|
|
65
|
-
*/
|
|
35
|
+
/** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
|
|
66
36
|
export declare function closeCustomerNote(hippoRoot: string, tenantId: string, id: number, actor?: string): CustomerNote;
|
|
67
37
|
export declare function loadCustomerNoteById(hippoRoot: string, tenantId: string, id: number): CustomerNote | null;
|
|
68
38
|
export declare function loadCustomerNotes(hippoRoot: string, tenantId: string, opts?: ListCustomerNotesOpts): CustomerNote[];
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
* MANY notes) - this deliberately DIVERGES from project_brief's
|
|
72
|
-
* loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
|
|
73
|
-
* evolving summary. A future caller cloning the project_brief shape by analogy must
|
|
74
|
-
* not assume a single-return here; the plural name signals the list contract.
|
|
75
|
-
*/
|
|
39
|
+
/** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
|
|
40
|
+
* loadActiveBriefForRepo: a customer accrues many notes. */
|
|
76
41
|
export declare function loadActiveNotesForCustomer(hippoRoot: string, tenantId: string, customer: string, opts?: {
|
|
77
42
|
limit?: number;
|
|
78
43
|
}): CustomerNote[];
|
|
@@ -1,28 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A `customer_note` is a discrete note recorded against an account/customer entity:
|
|
5
|
-
* a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
|
|
6
|
-
* Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
|
|
7
|
-
* so an FK is deferred). Unlike project_brief's one-summary-per-repo,
|
|
8
|
-
* a customer accrues MANY discrete notes over time, each with its own supersede chain
|
|
9
|
-
* (correct a note -> a new version preserving history; close retires it).
|
|
10
|
-
*
|
|
11
|
-
* Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
|
|
12
|
-
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
13
|
-
* tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
|
|
14
|
-
* contribution is purely the entity-scoping dimension.
|
|
15
|
-
*
|
|
16
|
-
* The `customer_notes` table is the source of truth (survives memory decay); the
|
|
17
|
-
* memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
18
|
-
*
|
|
19
|
-
* Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
|
|
20
|
-
*/
|
|
1
|
+
/** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
|
|
2
|
+
* The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
|
|
21
3
|
import { checkText, requireLine } from './fields.js';
|
|
22
4
|
import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
// Domain types
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
5
|
export const VALID_NOTE_STATES = new Set([
|
|
27
6
|
'active',
|
|
28
7
|
'superseded',
|
|
@@ -69,27 +48,12 @@ export const CUSTOMER_NOTE = {
|
|
|
69
48
|
};
|
|
70
49
|
},
|
|
71
50
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
/**
|
|
76
|
-
* Create a customer_note (or a new version that supersedes an existing one). Writes
|
|
77
|
-
* the memory mirror + the customer_notes row in the `objects` store group's one transaction.
|
|
78
|
-
* When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
|
|
79
|
-
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
|
|
80
|
-
* the new version = predecessor.version + 1 (server-derived).
|
|
81
|
-
*
|
|
82
|
-
* The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
|
|
83
|
-
* + caller extraTags) so scope-aware recall treats the note as entity-local. There is
|
|
84
|
-
* no self-recursion path (customer_note has no receipt-query/refresh).
|
|
85
|
-
*/
|
|
51
|
+
/** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
|
|
52
|
+
* The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
|
|
86
53
|
export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
87
54
|
return saveObjectAt(CUSTOMER_NOTE, { hippoRoot, tenantId, actor }, opts);
|
|
88
55
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
|
|
91
|
-
* distinguishes not-found from not-active. A superseded row is terminal.
|
|
92
|
-
*/
|
|
56
|
+
/** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
|
|
93
57
|
export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
|
|
94
58
|
return closeObjectAt(hippoRoot, CUSTOMER_NOTE, tenantId, id, actor);
|
|
95
59
|
}
|
|
@@ -99,13 +63,8 @@ export function loadCustomerNoteById(hippoRoot, tenantId, id) {
|
|
|
99
63
|
export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
|
|
100
64
|
return listObjectsAt(hippoRoot, CUSTOMER_NOTE, tenantId, { status: opts.status, filter: opts.customer, limit: opts.limit, after: opts.after });
|
|
101
65
|
}
|
|
102
|
-
/**
|
|
103
|
-
*
|
|
104
|
-
* MANY notes) - this deliberately DIVERGES from project_brief's
|
|
105
|
-
* loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
|
|
106
|
-
* evolving summary. A future caller cloning the project_brief shape by analogy must
|
|
107
|
-
* not assume a single-return here; the plural name signals the list contract.
|
|
108
|
-
*/
|
|
66
|
+
/** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
|
|
67
|
+
* loadActiveBriefForRepo: a customer accrues many notes. */
|
|
109
68
|
export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
|
|
110
69
|
return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
|
|
111
70
|
}
|
|
@@ -1,38 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
* `hippo decide` used to write only a tagged memory (tags ['decision'], source
|
|
5
|
-
* 'decision') with a 90-day half-life, so an in-force decision decayed out of
|
|
6
|
-
* recall even though it was never reversed. The `decisions` table is now the
|
|
7
|
-
* source of truth: a decision stays `active` regardless of memory decay, and
|
|
8
|
-
* `hippo decide list --status active` is authoritative. A memory row still
|
|
9
|
-
* mirrors the decision for recall surfaces but is NOT canonical — memory_id is
|
|
10
|
-
* NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
|
|
11
|
-
* orphans the decision row.
|
|
12
|
-
*
|
|
13
|
-
* Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
|
|
14
|
-
* points to the successor) or active -> closed (retired with no successor).
|
|
15
|
-
*
|
|
16
|
-
* Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
|
|
17
|
-
* enforce decisions.tenant_id == the referenced memory's tenant_id, and a
|
|
18
|
-
* superseded_by same-tenant trigger makes cross-tenant supersession
|
|
19
|
-
* unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
|
|
20
|
-
*
|
|
21
|
-
* Dual-write atomicity: `saveDecision` hands the memory and the decision to the
|
|
22
|
-
* `objects` store group, which commits them (and, when superseding, the old
|
|
23
|
-
* row's UPDATE) together, so a failure in any step rolls all of them back.
|
|
24
|
-
*/
|
|
1
|
+
/** Decision object: the `decisions` table is the source of truth, so an in-force decision stays `active` despite memory decay.
|
|
2
|
+
* The memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall only; saveDecision commits both in one `objects` transaction. */
|
|
3
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
25
4
|
import type { KeysetPosition } from '../util/keyset.js';
|
|
26
5
|
import type { SavableDescriptor } from './descriptor.js';
|
|
27
|
-
import type { Decision, DecisionStatus } from '../
|
|
28
|
-
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';
|
|
29
8
|
export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
|
|
30
9
|
export interface SaveDecisionOpts {
|
|
31
10
|
decisionText: string;
|
|
32
11
|
context?: string;
|
|
33
|
-
/** Table id of an ACTIVE decision this one supersedes
|
|
34
|
-
*
|
|
35
|
-
* HTTP/SDK pass the table id directly. */
|
|
12
|
+
/** Table id of an ACTIVE decision this one supersedes; the CLI resolves a `--supersedes <memory-id>`
|
|
13
|
+
* via resolveActiveDecisionIdByMemory, HTTP/SDK pass the table id. */
|
|
36
14
|
supersedesDecisionId?: number;
|
|
37
15
|
/** Extra memory tags merged after ['decision'] (the CLI passes path-context
|
|
38
16
|
* tags; HTTP/SDK pass none). */
|
|
@@ -45,35 +23,19 @@ export interface ListDecisionsOpts {
|
|
|
45
23
|
after?: KeysetPosition;
|
|
46
24
|
}
|
|
47
25
|
export declare const DECISION: SavableDescriptor<'decision', SaveDecisionOpts>;
|
|
48
|
-
/**
|
|
49
|
-
*
|
|
50
|
-
* one transaction by the `objects` store group. When supersedesDecisionId is
|
|
51
|
-
* given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
|
|
52
|
-
* transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
|
|
53
|
-
* supersede aborts the whole write rather than orphaning a successor).
|
|
54
|
-
*
|
|
55
|
-
* The memory mirror preserves the legacy `hippo decide` shape: tags
|
|
56
|
-
* ['decision', ...extraTags], source 'decision', confidence 'verified',
|
|
57
|
-
* the configured default half-life, content = "<text>\n\nContext: <context>"
|
|
58
|
-
* when context is given (so existing recall output is unchanged).
|
|
59
|
-
*/
|
|
26
|
+
/** Create a decision; the memory mirror and the row commit in one transaction.
|
|
27
|
+
* Superseding CASes the old row (WHERE status='active'), so a duplicate supersede aborts the whole write. */
|
|
60
28
|
export declare function saveDecision(hippoRoot: string, tenantId: string, opts: SaveDecisionOpts, actor?: string): Decision;
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*/
|
|
29
|
+
/** Weaken the memory a new decision replaces, once the save has committed: half-life halved to a day at least, marked stale, tagged `superseded`. */
|
|
30
|
+
export declare function weakenSupersededMemory(hippoRoot: string, entry: MemoryEntry, actor?: string): void;
|
|
31
|
+
/** Close (retire) an active decision with no successor; the memory mirror is not mutated. */
|
|
65
32
|
export declare function closeDecision(hippoRoot: string, tenantId: string, id: number, actor?: string): Decision;
|
|
66
33
|
export declare function loadDecisionById(hippoRoot: string, tenantId: string, id: number): Decision | null;
|
|
67
34
|
export declare function loadDecisions(hippoRoot: string, tenantId: string, opts?: ListDecisionsOpts): Decision[];
|
|
68
35
|
export declare function loadActiveDecisions(hippoRoot: string, tenantId: string, opts?: {
|
|
69
36
|
limit?: number;
|
|
70
37
|
}): Decision[];
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
* of the ACTIVE decision backed by that memory, or null when the memory has no
|
|
74
|
-
* active decision row (a legacy pre-episode decision-tagged memory). Extracted
|
|
75
|
-
* so the CLI's backward-compat path is unit-testable at the store layer without
|
|
76
|
-
* exporting cmdDecide.
|
|
77
|
-
*/
|
|
38
|
+
/** Resolve a `--supersedes <memory-id>` to the table id of the ACTIVE decision backed by that memory, or null.
|
|
39
|
+
* Exported so the CLI's backward-compat path is testable at the store layer. */
|
|
78
40
|
export declare function resolveActiveDecisionIdByMemory(hippoRoot: string, tenantId: string, memoryId: string): number | null;
|
|
79
41
|
//# sourceMappingURL=decisions.d.ts.map
|