hippo-memory 2.0.0 → 2.1.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/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- 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 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -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 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
package/dist/server/cursor.d.ts
CHANGED
|
@@ -4,15 +4,22 @@ type CursorPart = 'string' | 'integer';
|
|
|
4
4
|
/** Bare-array routes cannot grow a body field without breaking clients, so their next cursor rides this header. */
|
|
5
5
|
export declare const NEXT_CURSOR_HEADER = "X-Next-Cursor";
|
|
6
6
|
export declare function encodeCursor(pos: KeysetPosition): string;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* The position a `?cursor=` names, or undefined when the param is absent; anything this server did not mint is a 400.
|
|
9
|
+
*/
|
|
8
10
|
export declare function parseCursor(raw: string | null, keyPart: CursorPart, idPart: CursorPart): KeysetPosition | undefined;
|
|
9
11
|
export interface Page<T> {
|
|
10
12
|
items: T[];
|
|
11
13
|
nextCursor: string | null;
|
|
12
14
|
}
|
|
13
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Drops the one-row lookahead the query fetched past `limit` and names the next page's cursor, null on the last page.
|
|
17
|
+
*/
|
|
14
18
|
export declare function pageOf<T>(rows: readonly T[], limit: number, positionOf: (row: T) => KeysetPosition): Page<T>;
|
|
15
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Rows ordered by (created_at DESC, id DESC): the decision, incident, process, policy, skill, brief, note and
|
|
21
|
+
* prediction tables.
|
|
22
|
+
*/
|
|
16
23
|
export declare function byCreatedAt(row: {
|
|
17
24
|
createdAt: string;
|
|
18
25
|
id: number;
|
package/dist/server/cursor.js
CHANGED
|
@@ -29,7 +29,9 @@ function toPosition(parsed, keyPart, idPart) {
|
|
|
29
29
|
const [key, id] = parsed;
|
|
30
30
|
return isPart(key, keyPart) && isPart(id, idPart) ? { key, id } : undefined;
|
|
31
31
|
}
|
|
32
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* The position a `?cursor=` names, or undefined when the param is absent; anything this server did not mint is a 400.
|
|
34
|
+
*/
|
|
33
35
|
export function parseCursor(raw, keyPart, idPart) {
|
|
34
36
|
if (raw === null)
|
|
35
37
|
return undefined;
|
|
@@ -39,14 +41,19 @@ export function parseCursor(raw, keyPart, idPart) {
|
|
|
39
41
|
throw new HttpError(400, 'cursor is malformed; pass next_cursor from the previous page unchanged');
|
|
40
42
|
return pos;
|
|
41
43
|
}
|
|
42
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Drops the one-row lookahead the query fetched past `limit` and names the next page's cursor, null on the last page.
|
|
46
|
+
*/
|
|
43
47
|
export function pageOf(rows, limit, positionOf) {
|
|
44
48
|
if (rows.length <= limit)
|
|
45
49
|
return { items: [...rows], nextCursor: null };
|
|
46
50
|
const items = rows.slice(0, limit);
|
|
47
51
|
return { items, nextCursor: encodeCursor(positionOf(items[items.length - 1])) };
|
|
48
52
|
}
|
|
49
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Rows ordered by (created_at DESC, id DESC): the decision, incident, process, policy, skill, brief, note and
|
|
55
|
+
* prediction tables.
|
|
56
|
+
*/
|
|
50
57
|
export function byCreatedAt(row) {
|
|
51
58
|
return { key: row.createdAt, id: row.id };
|
|
52
59
|
}
|
|
@@ -6,6 +6,9 @@ export declare function handlerDeadlineCount(): number;
|
|
|
6
6
|
export declare function isAbandoned(res: ServerResponse): boolean;
|
|
7
7
|
/** The deadline of `req`, for every /v1 and /mcp route but the two exempt ones. */
|
|
8
8
|
export declare function requestDeadlineFor(req: IncomingMessage): RequestDeadline | undefined;
|
|
9
|
-
/**
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Calls `reply` when `res` has sent nothing by `deadline`. A store call still in flight answers first, since only the
|
|
11
|
+
* store knows what became of a write.
|
|
12
|
+
*/
|
|
13
|
+
export declare function answerAtDeadline(res: ServerResponse, deadline: RequestDeadline, reply: () => void, onDeadline?: () => void): void;
|
|
11
14
|
//# sourceMappingURL=deadline.d.ts.map
|
package/dist/server/deadline.js
CHANGED
|
@@ -19,8 +19,11 @@ export function requestDeadlineFor(req) {
|
|
|
19
19
|
return undefined;
|
|
20
20
|
return path.startsWith('/v1/') || path === '/mcp' ? new RequestDeadline(Date.now() + ms) : undefined;
|
|
21
21
|
}
|
|
22
|
-
/**
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Calls `reply` when `res` has sent nothing by `deadline`. A store call still in flight answers first, since only the
|
|
24
|
+
* store knows what became of a write.
|
|
25
|
+
*/
|
|
26
|
+
export function answerAtDeadline(res, deadline, reply, onDeadline = () => { }) {
|
|
24
27
|
const expire = () => {
|
|
25
28
|
if (res.headersSent || res.destroyed)
|
|
26
29
|
return;
|
|
@@ -29,7 +32,11 @@ export function answerAtDeadline(res, deadline, reply) {
|
|
|
29
32
|
reply();
|
|
30
33
|
};
|
|
31
34
|
// One turn of the loop later, so a handler that fails on the store's answer sends that answer itself.
|
|
32
|
-
const timer = setTimeout(() =>
|
|
35
|
+
const timer = setTimeout(() => {
|
|
36
|
+
// Before the wait for store calls, so a call still queued is dropped rather than run for a caller who left.
|
|
37
|
+
onDeadline();
|
|
38
|
+
deadline.onceIdle(() => setImmediate(expire));
|
|
39
|
+
}, deadline.at - Date.now());
|
|
33
40
|
// The open socket keeps the process alive; this timer alone must not.
|
|
34
41
|
timer.unref();
|
|
35
42
|
const clear = () => clearTimeout(timer);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// Bounds on the scrypt work a bearer key check may start: how many derive at once, and how many one address starts for
|
|
1
|
+
// Bounds on the scrypt work a bearer key check may start: how many derive at once, and how many one address starts for
|
|
2
|
+
// one key id.
|
|
2
3
|
import { HttpError } from '../util/http-util.js';
|
|
3
4
|
import { createRateLimiter } from './rate-limit.js';
|
|
4
5
|
// libuv runs scrypt on a pool of four threads by default, so two stay free for file and DNS work.
|
|
@@ -12,14 +13,21 @@ const KEY_ADDRESS_TRIES_PER_SEC = 5 / 60;
|
|
|
12
13
|
export function keyCheckBounds(maxKeys) {
|
|
13
14
|
// A bucket idle for a full refill is back at its burst, so dropping it then gives nothing away.
|
|
14
15
|
const idleEvictMs = (KEY_ADDRESS_BURST / KEY_ADDRESS_TRIES_PER_SEC) * 1000;
|
|
15
|
-
const perKeyAddress = createRateLimiter({
|
|
16
|
+
const perKeyAddress = createRateLimiter({
|
|
17
|
+
ratePerSec: KEY_ADDRESS_TRIES_PER_SEC,
|
|
18
|
+
burst: KEY_ADDRESS_BURST,
|
|
19
|
+
idleEvictMs,
|
|
20
|
+
maxKeys,
|
|
21
|
+
});
|
|
16
22
|
let inFlight = 0;
|
|
17
23
|
const waiting = [];
|
|
18
24
|
return {
|
|
19
25
|
admit(keyId, address) {
|
|
20
|
-
// Each answers in the words an existing limit uses: the request limit's for a full queue, the address's scrypt
|
|
21
|
-
|
|
26
|
+
// Each answers in the words an existing limit uses: the request limit's for a full queue, the address's scrypt
|
|
27
|
+
// bucket's for spent tries.
|
|
28
|
+
if (inFlight >= MAX_IN_FLIGHT && waiting.length >= MAX_WAITING) {
|
|
22
29
|
throw new HttpError(429, 'rate limit exceeded', 1);
|
|
30
|
+
}
|
|
23
31
|
if (!perKeyAddress.check(`${keyId}\u0000${address}`)) {
|
|
24
32
|
throw new HttpError(429, 'too many key checks from this address', perKeyAddress.retryAfterSec);
|
|
25
33
|
}
|
|
@@ -3,6 +3,9 @@ export declare function setKeepAliveTimeouts(server: Server): void;
|
|
|
3
3
|
export declare const DEFAULT_SHUTDOWN_DRAIN_MS = 5000;
|
|
4
4
|
/** How long a signal or crash shutdown may run before the process is ended without it. */
|
|
5
5
|
export declare function shutdownBoundMs(drainMs: number): number;
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Stops accepting, ends streams at once (they never finish on their own), gives other in-flight requests up to
|
|
8
|
+
* `drainMs`, then closes what is left.
|
|
9
|
+
*/
|
|
7
10
|
export declare function drainAndClose(server: Server, inflight: ReadonlySet<ServerResponse>, drainMs: number): Promise<void>;
|
|
8
11
|
//# sourceMappingURL=lifecycle.d.ts.map
|
package/dist/server/lifecycle.js
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { bodyDeadlineMs } from '../util/http-util.js';
|
|
2
2
|
import { log } from '../util/log.js';
|
|
3
|
-
// Node's own default, named so the three socket deadlines read together. It times the request arriving, never the
|
|
3
|
+
// Node's own default, named so the three socket deadlines read together. It times the request arriving, never the
|
|
4
|
+
// handler, so a 10 minute sleep is not cut.
|
|
4
5
|
const REQUEST_RECEIVE_TIMEOUT_MS = 300_000;
|
|
5
6
|
export function setKeepAliveTimeouts(server) {
|
|
6
7
|
// The default 5s keepAliveTimeout closes idle sockets just as clients reuse them (ECONNRESET).
|
|
7
|
-
// headersTimeout must stay ABOVE keepAliveTimeout + keepAliveTimeoutBuffer (1s), or it closes idle reused sockets
|
|
8
|
+
// headersTimeout must stay ABOVE keepAliveTimeout + keepAliveTimeoutBuffer (1s), or it closes idle reused sockets
|
|
9
|
+
// itself.
|
|
8
10
|
server.keepAliveTimeout = 65_000;
|
|
9
11
|
server.headersTimeout = 70_000;
|
|
10
12
|
// Never below what a raised body deadline allows, or Node's bare 408 would come before the route's own.
|
|
11
13
|
server.requestTimeout = Math.max(REQUEST_RECEIVE_TIMEOUT_MS, server.headersTimeout + bodyDeadlineMs());
|
|
12
14
|
}
|
|
13
15
|
export const DEFAULT_SHUTDOWN_DRAIN_MS = 5000;
|
|
14
|
-
// Past the request drain, a stop only waits for each store thread to end its statement and close: seconds at most, so
|
|
16
|
+
// Past the request drain, a stop only waits for each store thread to end its statement and close: seconds at most, so
|
|
17
|
+
// longer means a thread that will not end.
|
|
15
18
|
const STORE_CLOSE_GRACE_MS = 10_000;
|
|
16
19
|
/** How long a signal or crash shutdown may run before the process is ended without it. */
|
|
17
20
|
export function shutdownBoundMs(drainMs) {
|
|
18
21
|
return drainMs + STORE_CLOSE_GRACE_MS;
|
|
19
22
|
}
|
|
20
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Stops accepting, ends streams at once (they never finish on their own), gives other in-flight requests up to
|
|
25
|
+
* `drainMs`, then closes what is left.
|
|
26
|
+
*/
|
|
21
27
|
export async function drainAndClose(server, inflight, drainMs) {
|
|
22
28
|
const closed = new Promise((resolve, reject) => {
|
|
23
29
|
server.close((err) => (err ? reject(err) : resolve()));
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
import type { CallerProject } from '../api/prompt-hook.js';
|
|
3
3
|
import type { ResolvedServeOpts } from './types.js';
|
|
4
|
-
/** On a shared store, the caller's project from X-Hippo-Project and the comma-separated X-Hippo-Project-Aliases; any
|
|
4
|
+
/** On a shared store, the caller's project from X-Hippo-Project and the comma-separated X-Hippo-Project-Aliases; any
|
|
5
|
+
* other store ignores both. */
|
|
5
6
|
export declare function callerProjectFromHeaders(req: IncomingMessage, hippoRoot: string): CallerProject | undefined;
|
|
6
7
|
export declare function handleMcpPost(req: IncomingMessage, res: ServerResponse, opts: ResolvedServeOpts): Promise<void>;
|
|
7
8
|
export declare function handleMcpStream(req: IncomingMessage, res: ServerResponse, opts: ResolvedServeOpts, streamSlots: Map<string, number>): Promise<void>;
|
package/dist/server/mcp-http.js
CHANGED
|
@@ -3,18 +3,19 @@ import { envMcpSseHeartbeatMs, envMcpSseMaxAgeSec, envMcpSseMaxStreams } from '.
|
|
|
3
3
|
import { isSharedStore } from '../core/config.js';
|
|
4
4
|
import { handleMcpRequest, mcpErrorResponse } from '../mcp/server.js';
|
|
5
5
|
import { HttpError, readBody, sendJson } from '../util/http-util.js';
|
|
6
|
-
import { log } from '../util/log.js';
|
|
6
|
+
import { errorFields, log } from '../util/log.js';
|
|
7
7
|
import { assertCallerProject } from '../core/project-identity.js';
|
|
8
8
|
import { buildContextWithAuth, heartbeatVerdict, readAuthHeader, requireAuth } from './auth.js';
|
|
9
9
|
import { clientLimitKey } from './client-ip.js';
|
|
10
10
|
import { noteAccess } from './request.js';
|
|
11
11
|
import { isJsonString, isJsonObject } from '../util/json.js';
|
|
12
12
|
import { blockHash } from '../util/token-text.js';
|
|
13
|
+
import { MINUTE_MS } from '../util/time.js';
|
|
13
14
|
import { consolidateInChild } from './sleep-offload.js';
|
|
14
|
-
const DEFAULT_SSE_HEARTBEAT_MS =
|
|
15
|
+
const DEFAULT_SSE_HEARTBEAT_MS = MINUTE_MS;
|
|
15
16
|
const DEFAULT_SSE_MAX_AGE_SEC = 3600;
|
|
16
|
-
/** Per-client key for MCP state isolation under HTTP-MCP (scopes `lastRecalledIds`): sha256 of the token (16 hex chars,
|
|
17
|
-
* plus the client address the rate limiter keys on
|
|
17
|
+
/** Per-client key for MCP state isolation under HTTP-MCP (scopes `lastRecalledIds`): sha256 of the token (16 hex chars,
|
|
18
|
+
* so the raw bearer is never logged) plus the client address the rate limiter keys on; 'noauth' covers loopback. */
|
|
18
19
|
function buildMcpClientKey(req) {
|
|
19
20
|
const auth = readAuthHeader(req);
|
|
20
21
|
const tokenHash = auth.kind === 'bearer'
|
|
@@ -23,8 +24,8 @@ function buildMcpClientKey(req) {
|
|
|
23
24
|
return `http:${tokenHash}:${clientLimitKey(req)}`;
|
|
24
25
|
}
|
|
25
26
|
// MCP-over-HTTP/SSE: POST /mcp answers a JSON-RPC request synchronously; GET /mcp/stream is a keepalive-only SSE stream
|
|
26
|
-
// (`: ping` every DEFAULT_SSE_HEARTBEAT_MS, 60 s) in v1.
|
|
27
|
-
//
|
|
27
|
+
// (`: ping` every DEFAULT_SSE_HEARTBEAT_MS, 60 s) in v1. Both dispatch to handleMcpRequest as stdio does. Auth matches
|
|
28
|
+
// /v1/* (Bearer via `requireAuth`, loopback fallback); SSE is checked once at stream-open.
|
|
28
29
|
// Percent-encoded by the client, so any lowercase Unicode name fits a Latin-1 header.
|
|
29
30
|
const HEADER_PIECE = /^[A-Za-z0-9\-_.!~*'()%]+$/;
|
|
30
31
|
function decodeHeaderPiece(raw, header) {
|
|
@@ -37,7 +38,8 @@ function decodeHeaderPiece(raw, header) {
|
|
|
37
38
|
throw new HttpError(400, `${header} holds a bad percent escape`);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
/** On a shared store, the caller's project from X-Hippo-Project and the comma-separated X-Hippo-Project-Aliases; any
|
|
41
|
+
/** On a shared store, the caller's project from X-Hippo-Project and the comma-separated X-Hippo-Project-Aliases; any
|
|
42
|
+
* other store ignores both. */
|
|
41
43
|
export function callerProjectFromHeaders(req, hippoRoot) {
|
|
42
44
|
if (!isSharedStore(hippoRoot))
|
|
43
45
|
return undefined;
|
|
@@ -48,8 +50,9 @@ export function callerProjectFromHeaders(req, hippoRoot) {
|
|
|
48
50
|
throw new HttpError(400, 'X-Hippo-Project-Aliases needs X-Hippo-Project');
|
|
49
51
|
return undefined;
|
|
50
52
|
}
|
|
51
|
-
if (names.length > 1 || (aliasHeaders?.length ?? 0) > 1)
|
|
53
|
+
if (names.length > 1 || (aliasHeaders?.length ?? 0) > 1) {
|
|
52
54
|
throw new HttpError(400, 'send X-Hippo-Project and X-Hippo-Project-Aliases once each');
|
|
55
|
+
}
|
|
53
56
|
const name = decodeHeaderPiece(names[0], 'X-Hippo-Project');
|
|
54
57
|
const rawAliases = aliasHeaders?.[0] ?? '';
|
|
55
58
|
const aliases = rawAliases === '' ? [] : rawAliases.split(',').map((a) => decodeHeaderPiece(a, 'X-Hippo-Project-Aliases'));
|
|
@@ -70,6 +73,7 @@ function mcpContextFor(ctx, clientKey, autoSleep, project) {
|
|
|
70
73
|
owner: ctx.actor.owner,
|
|
71
74
|
clientKey,
|
|
72
75
|
store: ctx.store,
|
|
76
|
+
reach: ctx.reach,
|
|
73
77
|
autoSleep,
|
|
74
78
|
autoSleepRunner: consolidateInChild,
|
|
75
79
|
};
|
|
@@ -78,8 +82,8 @@ function mcpContextFor(ctx, clientKey, autoSleep, project) {
|
|
|
78
82
|
return mcpCtx;
|
|
79
83
|
}
|
|
80
84
|
export async function handleMcpPost(req, res, opts) {
|
|
81
|
-
// Same Context the /v1/* routes use, so
|
|
82
|
-
// from cwd and
|
|
85
|
+
// Same Context the /v1/* routes use, so tool calls inherit the bound hippoRoot and the auth-resolved tenantId/actor;
|
|
86
|
+
// else executeTool walks from cwd and reads HIPPO_TENANT, dropping a valid Bearer for tenant B to the env's tenant.
|
|
83
87
|
const ctx = await buildContextWithAuth(req, opts);
|
|
84
88
|
noteAccess(req, { tenant: ctx.tenantId });
|
|
85
89
|
const project = callerProjectFromHeaders(req, ctx.hippoRoot);
|
|
@@ -94,8 +98,8 @@ export async function handleMcpPost(req, res, opts) {
|
|
|
94
98
|
if (!isJsonObject(mcpReq) || !isJsonString(mcpReq.method)) {
|
|
95
99
|
throw new HttpError(400, 'JSON-RPC body must include a method string');
|
|
96
100
|
}
|
|
97
|
-
// SAFETY: validated above as a plain JSON object with a string method; the other McpRequest wire fields (jsonrpc, id,
|
|
98
|
-
// handleMcpRequest.
|
|
101
|
+
// SAFETY: validated above as a plain JSON object with a string method; the other McpRequest wire fields (jsonrpc, id,
|
|
102
|
+
// params) are checked or defaulted in handleMcpRequest.
|
|
99
103
|
const rpcReq = mcpReq;
|
|
100
104
|
let mcpRes;
|
|
101
105
|
try {
|
|
@@ -127,8 +131,9 @@ function acquireStreamSlot(req, res, slots) {
|
|
|
127
131
|
const max = envMcpSseMaxStreams() ?? DEFAULT_MAX_STREAMS_PER_CLIENT;
|
|
128
132
|
const key = streamSlotKey(req);
|
|
129
133
|
const open = slots.get(key) ?? 0;
|
|
130
|
-
if (open >= max)
|
|
134
|
+
if (open >= max) {
|
|
131
135
|
throw new HttpError(429, `too many open streams for this client (limit ${max}); close one first`, 60);
|
|
136
|
+
}
|
|
132
137
|
slots.set(key, open + 1);
|
|
133
138
|
res.once('close', () => {
|
|
134
139
|
const left = (slots.get(key) ?? 1) - 1;
|
|
@@ -152,8 +157,8 @@ export async function handleMcpStream(req, res, opts, streamSlots) {
|
|
|
152
157
|
// Initial ping so smoke tests can confirm the stream is live without
|
|
153
158
|
// waiting for the first keepalive interval.
|
|
154
159
|
res.write(': ping\n\n');
|
|
155
|
-
// SSE hardening: the heartbeat re-validates the bearer (MCP_SSE_HEARTBEAT_MS, default 60000) and closes with
|
|
156
|
-
// rotated; MCP_SSE_MAX_AGE_SEC (default 3600)
|
|
160
|
+
// SSE hardening: the heartbeat re-validates the bearer (MCP_SSE_HEARTBEAT_MS, default 60000) and closes with
|
|
161
|
+
// 'auth_revoked' if the key was revoked or rotated; MCP_SSE_MAX_AGE_SEC (default 3600) ends it as 'max_age_exceeded'.
|
|
157
162
|
keepStreamAlive(req, res, opts);
|
|
158
163
|
}
|
|
159
164
|
function keepStreamAlive(req, res, opts) {
|
|
@@ -181,7 +186,7 @@ function keepStreamAlive(req, res, opts) {
|
|
|
181
186
|
if (checking)
|
|
182
187
|
return;
|
|
183
188
|
checking = true;
|
|
184
|
-
|
|
189
|
+
heartbeatVerdict(req, opts).then((verdict) => {
|
|
185
190
|
checking = false;
|
|
186
191
|
if (!closed && verdict === 'unavailable')
|
|
187
192
|
log.warn('heartbeat tick skipped: auth check unavailable');
|
|
@@ -192,12 +197,12 @@ function keepStreamAlive(req, res, opts) {
|
|
|
192
197
|
clearInterval(ping);
|
|
193
198
|
return;
|
|
194
199
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
200
|
+
if (!writePing(res))
|
|
201
|
+
clearInterval(ping);
|
|
202
|
+
}).catch((err) => {
|
|
203
|
+
// Without the reset `checking` stays true and the heartbeat never runs again.
|
|
204
|
+
checking = false;
|
|
205
|
+
log.warn('heartbeat tick failed', errorFields(err));
|
|
201
206
|
});
|
|
202
207
|
}, heartbeatMs);
|
|
203
208
|
// Don't keep the event loop alive just for this timer — the server's
|
|
@@ -210,6 +215,16 @@ function keepStreamAlive(req, res, opts) {
|
|
|
210
215
|
clearInterval(ping);
|
|
211
216
|
});
|
|
212
217
|
}
|
|
218
|
+
/** False when the client hung up, so the caller stops pinging a dead socket. */
|
|
219
|
+
function writePing(res) {
|
|
220
|
+
try {
|
|
221
|
+
res.write(': ping\n\n');
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
213
228
|
function endStreamWithReason(res, reason) {
|
|
214
229
|
try {
|
|
215
230
|
res.write(`event: closed\ndata: ${JSON.stringify({ reason })}\n\n`);
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Per-key token-bucket rate limiter for inbound /v1/* requests, bounding api-key-id enumeration. Dependency-free; the
|
|
3
|
+
* injectable `now` makes it
|
|
2
4
|
* unit-testable. */
|
|
3
5
|
export interface RateLimiter {
|
|
4
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Consume one token for `key`: true if allowed, false if the bucket is exhausted; `now` (epoch ms) is injectable for
|
|
8
|
+
* deterministic tests.
|
|
9
|
+
*/
|
|
5
10
|
check(key: string, now?: number): boolean;
|
|
6
11
|
readonly retryAfterSec: number;
|
|
7
12
|
}
|
|
@@ -12,10 +17,17 @@ export interface RateLimiterOpts {
|
|
|
12
17
|
burst: number;
|
|
13
18
|
/** A bucket untouched for this many ms is dropped by the throttled sweep. */
|
|
14
19
|
idleEvictMs: number;
|
|
15
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Hard cap on tracked keys; at the cap the least-recently-used key is evicted only once it has refilled, else unseen
|
|
22
|
+
* keys share one overflow bucket.
|
|
23
|
+
*/
|
|
16
24
|
maxKeys: number;
|
|
17
25
|
}
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
26
|
+
/**
|
|
27
|
+
* Token-bucket limiter with bounded memory: a sweep (at most once per `idleEvictMs`) drops idle buckets and a `maxKeys`
|
|
28
|
+
* cap bounds the map,
|
|
29
|
+
* so a client rotating source addresses can neither grow it without bound nor evict its own throttled bucket to get a
|
|
30
|
+
* fresh one.
|
|
31
|
+
*/
|
|
20
32
|
export declare function createRateLimiter(opts: RateLimiterOpts): RateLimiter;
|
|
21
33
|
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -1,10 +1,38 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Per-key token-bucket rate limiter for inbound /v1/* requests, bounding api-key-id enumeration. Dependency-free; the
|
|
3
|
+
* injectable `now` makes it
|
|
2
4
|
* unit-testable. */
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
+
/** The tokens `b` holds at `now`; a clock stepped back refills nothing. */
|
|
6
|
+
function tokensAt(b, now, ratePerSec, burst) {
|
|
7
|
+
return Math.min(burst, b.tokens + (Math.max(0, now - b.last) / 1000) * ratePerSec);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Brings `b` up to `now` and returns it; keeping the later time stops a clock that stepped back and forward again
|
|
11
|
+
* refilling that span twice.
|
|
12
|
+
*/
|
|
13
|
+
function refill(b, now, ratePerSec, burst) {
|
|
14
|
+
b.tokens = tokensAt(b, now, ratePerSec, burst);
|
|
15
|
+
b.last = Math.max(b.last, now);
|
|
16
|
+
return b;
|
|
17
|
+
}
|
|
18
|
+
function spend(b) {
|
|
19
|
+
const allowed = b.tokens >= 1;
|
|
20
|
+
if (allowed)
|
|
21
|
+
b.tokens -= 1;
|
|
22
|
+
return allowed;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Token-bucket limiter with bounded memory: a sweep (at most once per `idleEvictMs`) drops idle buckets and a `maxKeys`
|
|
26
|
+
* cap bounds the map,
|
|
27
|
+
* so a client rotating source addresses can neither grow it without bound nor evict its own throttled bucket to get a
|
|
28
|
+
* fresh one.
|
|
29
|
+
*/
|
|
5
30
|
export function createRateLimiter(opts) {
|
|
6
31
|
const { ratePerSec, burst, idleEvictMs, maxKeys } = opts;
|
|
32
|
+
// SHORTCUT: one process, buckets reset on restart; a shared store table if the server runs as several processes.
|
|
7
33
|
const buckets = new Map();
|
|
34
|
+
// Unseen keys draw from this while the map is full of buckets still below burst, so key churn buys no fresh bucket.
|
|
35
|
+
const overflow = { tokens: burst, last: 0 };
|
|
8
36
|
let lastSweep = 0;
|
|
9
37
|
function sweep(now) {
|
|
10
38
|
if (now - lastSweep < idleEvictMs)
|
|
@@ -15,36 +43,37 @@ export function createRateLimiter(opts) {
|
|
|
15
43
|
buckets.delete(key);
|
|
16
44
|
}
|
|
17
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Frees one slot for an unseen key; false when the least-recently-used bucket is still below burst, since dropping it
|
|
48
|
+
* would reset a throttled caller.
|
|
49
|
+
*/
|
|
50
|
+
function makeRoom(now) {
|
|
51
|
+
if (buckets.size < maxKeys)
|
|
52
|
+
return true;
|
|
53
|
+
const lru = buckets.entries().next().value;
|
|
54
|
+
if (lru === undefined)
|
|
55
|
+
return true;
|
|
56
|
+
if (tokensAt(lru[1], now, ratePerSec, burst) < burst)
|
|
57
|
+
return false;
|
|
58
|
+
buckets.delete(lru[0]);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
18
61
|
return {
|
|
19
62
|
check(key, now = Date.now()) {
|
|
20
63
|
sweep(now);
|
|
21
64
|
const existing = buckets.get(key);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// Unseen key: a full bucket, so a fresh client's first request passes.
|
|
25
|
-
bucket = { tokens: burst, last: now };
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
// A clock stepped back refills nothing, and keeping the later time stops the step forward again refilling that span twice.
|
|
29
|
-
const refill = (Math.max(0, now - existing.last) / 1000) * ratePerSec;
|
|
30
|
-
existing.tokens = Math.min(burst, existing.tokens + refill);
|
|
31
|
-
existing.last = Math.max(existing.last, now);
|
|
32
|
-
bucket = existing;
|
|
33
|
-
// Drop the old slot so the re-insert below puts the key last in Map
|
|
34
|
-
// iteration order — Map order then tracks least-recently-used.
|
|
65
|
+
if (existing !== undefined) {
|
|
66
|
+
// Re-inserting puts the key last in Map iteration order, so Map order tracks least-recently-used.
|
|
35
67
|
buckets.delete(key);
|
|
68
|
+
buckets.set(key, existing);
|
|
69
|
+
return spend(refill(existing, now, ratePerSec, burst));
|
|
36
70
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (buckets.size >= maxKeys) {
|
|
42
|
-
const lru = buckets.keys().next().value;
|
|
43
|
-
if (lru !== undefined)
|
|
44
|
-
buckets.delete(lru);
|
|
45
|
-
}
|
|
71
|
+
if (!makeRoom(now))
|
|
72
|
+
return spend(refill(overflow, now, ratePerSec, burst));
|
|
73
|
+
// Unseen key: a full bucket, so a fresh client's first request passes.
|
|
74
|
+
const bucket = { tokens: burst, last: now };
|
|
46
75
|
buckets.set(key, bucket);
|
|
47
|
-
return
|
|
76
|
+
return spend(bucket);
|
|
48
77
|
},
|
|
49
78
|
// A refused bucket holds under one token and refills at ratePerSec, so one token is back within this.
|
|
50
79
|
retryAfterSec: Math.max(1, Math.ceil(1 / ratePerSec)),
|
package/dist/server/ready.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { SERVER_DB_WAIT_MS, runWithRequestStores } from '../db/index.js';
|
|
2
1
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
3
|
-
// A prober must never see a 429, so the store read is bounded by remembering its answer instead of rate-limiting the
|
|
2
|
+
// A prober must never see a 429, so the store read is bounded by remembering its answer instead of rate-limiting the
|
|
3
|
+
// route.
|
|
4
4
|
const READY_WINDOW_MS = 1000;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* True when the store answered; one read per window whatever the caller count, and a failed read is remembered for the
|
|
7
|
+
* same window.
|
|
8
|
+
*/
|
|
6
9
|
function createReadyProbe(readiness, now = Date.now) {
|
|
7
10
|
let answer;
|
|
8
11
|
let inFlight;
|
|
9
12
|
async function read() {
|
|
10
13
|
let ok = true;
|
|
11
14
|
try {
|
|
12
|
-
await
|
|
15
|
+
await readiness.ping();
|
|
13
16
|
}
|
|
14
17
|
catch (err) {
|
|
15
18
|
log.warn(`GET /ready: the store did not answer: ${errorMessage(err)}`, errorFields(err));
|
package/dist/server/request.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* One line per failed request; 4xx is the caller's mistake, a busy 503 is back-pressure and a 501 is a route not on
|
|
4
|
+
* this store, so none logs as an error.
|
|
5
|
+
*/
|
|
3
6
|
export declare function logRequestFailure<E>(req: IncomingMessage, err: E, status: number): void;
|
|
4
7
|
/** The status and client message for a failed request; a held write lock is a retryable 503, never a 500. */
|
|
5
8
|
export declare function replyFor<E>(err: E): {
|
|
@@ -11,11 +14,17 @@ interface AccessNote {
|
|
|
11
14
|
route?: string;
|
|
12
15
|
tenant?: string;
|
|
13
16
|
}
|
|
14
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Names the matched route (the table's pattern, never the path sent) or the caller's tenant for the request's access
|
|
19
|
+
* line.
|
|
20
|
+
*/
|
|
15
21
|
export declare function noteAccess(req: IncomingMessage, note: AccessNote): void;
|
|
16
22
|
/** The route name the request's access line carries, for a line about the same request logged after its reply. */
|
|
17
23
|
export declare function accessRouteOf(req: IncomingMessage): string;
|
|
18
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* The request's id, after stamping the headers every reply carries and starting the slow-request watchdog and the
|
|
26
|
+
* access line.
|
|
27
|
+
*/
|
|
19
28
|
export declare function openRequest(req: IncomingMessage, res: ServerResponse, slowWarnMs?: number): string;
|
|
20
29
|
export declare function sendError(res: ServerResponse, status: number, message: string): void;
|
|
21
30
|
interface ParsedRoute {
|
|
@@ -25,7 +34,9 @@ interface ParsedRoute {
|
|
|
25
34
|
}
|
|
26
35
|
export declare function parseRequest(req: IncomingMessage): ParsedRoute;
|
|
27
36
|
export declare function matchPath(pattern: string, path: string): Record<string, string> | null;
|
|
28
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Rejects URL-encoded slashes in path segments BEFORE the URL parser decodes them (`%2F` would become `/` and 404 or
|
|
39
|
+
* match the wrong template).
|
|
29
40
|
* Only the PATHNAME is scanned, so recall queries like `?q=https%3A%2F%2Fexample.com` are not rejected. */
|
|
30
41
|
export declare function rejectEncodedSlash(rawUrl: string): void;
|
|
31
42
|
export {};
|