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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { briefFromReceipts, MAX_CHANGE_SUMMARY_LEN, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief, } from '../../objects/project-briefs.js';
|
|
3
3
|
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { parseJsonBody } from '../validation.js';
|
|
5
|
-
import { objectsOf, saveFor } from '../../api/objects.js';
|
|
5
|
+
import { objectsOf, saveFor } from '../../api/objects/objects.js';
|
|
6
6
|
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
|
|
7
7
|
const briefRoutes = {
|
|
8
8
|
noun: 'project brief',
|
|
@@ -16,7 +16,8 @@ const briefRoutes = {
|
|
|
16
16
|
return (existing, id) => ({ repo: existing.repo, summary, changeSummary, supersedesBriefId: id });
|
|
17
17
|
},
|
|
18
18
|
};
|
|
19
|
-
// Routes: /v1/project-briefs (create, list, refresh, show, supersede, close), mirroring /v1/skills; /refresh is ordered
|
|
19
|
+
// Routes: /v1/project-briefs (create, list, refresh, show, supersede, close), mirroring /v1/skills; /refresh is ordered
|
|
20
|
+
// before /:id.
|
|
20
21
|
// The store validates and throws; the boundary maps validation -> 400, not-found -> 404, not-active -> 409.
|
|
21
22
|
export async function handleCreateProjectBrief(rr) {
|
|
22
23
|
const { ctx } = rr;
|
|
@@ -2,7 +2,7 @@ import type { AuthedRouteRequest } from '../types.js';
|
|
|
2
2
|
/** Test-only: reset the HTTP recall rings. Call from beforeEach. */
|
|
3
3
|
export declare function __resetSessionRecallHistoryHttp(): void;
|
|
4
4
|
export declare function handleRecallMemories({ res, ctx, query }: AuthedRouteRequest): Promise<void>;
|
|
5
|
-
export declare function handleAssembleSession({ res, ctx, query }: AuthedRouteRequest
|
|
6
|
-
export declare function handleDrillRecall({ res, ctx, query }: AuthedRouteRequest
|
|
7
|
-
export declare function handleGetContext({ res, ctx, opts, query }: AuthedRouteRequest): Promise<void>;
|
|
5
|
+
export declare function handleAssembleSession({ res, ctx, query }: AuthedRouteRequest<'dagReads'>, assembleMatch: Record<string, string>): Promise<void>;
|
|
6
|
+
export declare function handleDrillRecall({ res, ctx, query }: AuthedRouteRequest<'dagReads'>, drillMatch: Record<string, string>): Promise<void>;
|
|
7
|
+
export declare function handleGetContext({ res, ctx, opts, query }: AuthedRouteRequest<'contextReads'>): Promise<void>;
|
|
8
8
|
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -3,10 +3,10 @@ import { dirname, resolve } from 'node:path';
|
|
|
3
3
|
import { assertCallerProject, resolveProjectIdentity } from '../../core/project-identity.js';
|
|
4
4
|
import { isSharedStore } from '../../core/config.js';
|
|
5
5
|
import { assembleCost, contextCost, drillCost } from '../../api/context-render.js';
|
|
6
|
-
import { assemble, drillDown, getContext, recordTokens, retrieve } from '../../api/index.js';
|
|
7
|
-
import { RECALL_RECORDING } from '../../api/recall
|
|
8
|
-
import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall
|
|
9
|
-
import { resetSessionRings } from '../../api/recall
|
|
6
|
+
import { assemble, drillDown, getContext, recordTokens, retrieve, } from '../../api/index.js';
|
|
7
|
+
import { RECALL_RECORDING } from '../../api/recall/finish.js';
|
|
8
|
+
import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall/request.js';
|
|
9
|
+
import { resetSessionRings } from '../../api/recall/finish.js';
|
|
10
10
|
import { HttpError, sendJson } from '../../util/http-util.js';
|
|
11
11
|
import { MAX_LIST_LIMIT } from '../../util/limits.js';
|
|
12
12
|
import { parseListLimit, validateIdSegment } from '../validation.js';
|
|
@@ -26,7 +26,8 @@ export async function handleRecallMemories({ res, ctx, query }) {
|
|
|
26
26
|
sendJson(res, 200, result);
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
// GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1: ordered AssembledContextItem[] (fresh-tail
|
|
29
|
+
// GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1: ordered AssembledContextItem[] (fresh-tail
|
|
30
|
+
// raws, summary substitutions, bio-aware
|
|
30
31
|
// budget fit). Tenant scope from the Bearer; default-deny on private rows.
|
|
31
32
|
export async function handleAssembleSession({ res, ctx, query }, assembleMatch) {
|
|
32
33
|
validateIdSegment(assembleMatch.id, 'session id');
|
|
@@ -58,11 +59,16 @@ export async function handleAssembleSession({ res, ctx, query }, assembleMatch)
|
|
|
58
59
|
if (scope !== undefined)
|
|
59
60
|
assembleExtra.scope = scope;
|
|
60
61
|
const result = await assemble(ctx, assembleMatch.id, { ...assembleExtra, cost: assembleCost(assembleMatch.id) });
|
|
61
|
-
await recordTokens(ctx, 'http_assemble', {
|
|
62
|
+
await recordTokens(ctx, 'http_assemble', {
|
|
63
|
+
items: result.items.length,
|
|
64
|
+
tokens: result.tokens,
|
|
65
|
+
sessionId: assembleMatch.id,
|
|
66
|
+
});
|
|
62
67
|
sendJson(res, 200, result);
|
|
63
68
|
return;
|
|
64
69
|
}
|
|
65
|
-
// GET /v1/recall/drill/:id?limit=N&budget=N: companion to /v1/memories; the caller drills into a level-2 summary
|
|
70
|
+
// GET /v1/recall/drill/:id?limit=N&budget=N: companion to /v1/memories; the caller drills into a level-2 summary
|
|
71
|
+
// (RecallResultItem.isSummary) to recover the
|
|
66
72
|
// originals. Tenant-scoped via Bearer; default-deny on private scopes for the summary and its children.
|
|
67
73
|
export async function handleDrillRecall({ res, ctx, query }, drillMatch) {
|
|
68
74
|
validateIdSegment(drillMatch.id, 'summary id');
|
|
@@ -109,7 +115,10 @@ export async function handleDrillRecall({ res, ctx, query }, drillMatch) {
|
|
|
109
115
|
sendJson(res, 200, result);
|
|
110
116
|
return;
|
|
111
117
|
}
|
|
112
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* A shared store's folder is no caller's project, so the caller names it (`project`, repeated `alias`); with none,
|
|
120
|
+
* getContext refuses.
|
|
121
|
+
*/
|
|
113
122
|
function contextReader(hippoRoot, query) {
|
|
114
123
|
if (!isSharedStore(hippoRoot))
|
|
115
124
|
return resolveProjectIdentity(dirname(resolve(hippoRoot)));
|
|
@@ -120,8 +129,10 @@ function contextReader(hippoRoot, query) {
|
|
|
120
129
|
assertCallerProject({ name, aliases });
|
|
121
130
|
return { name, legacyName: name, aliases };
|
|
122
131
|
}
|
|
123
|
-
// GET /v1/context: a budget-bounded ContextResult JSON, rendered by clients, not the server; tenant-scoped via the
|
|
124
|
-
//
|
|
132
|
+
// GET /v1/context: a budget-bounded ContextResult JSON, rendered by clients, not the server; tenant-scoped via the
|
|
133
|
+
// Bearer.
|
|
134
|
+
// Pinned-only and '*' fallback skip the recall audit emit (as cmdContext does); a real-query hybrid search emits one
|
|
135
|
+
// 'recall' row.
|
|
125
136
|
export async function handleGetContext({ res, ctx, opts, query }) {
|
|
126
137
|
const parsed = parseContextRequest(httpParams(query));
|
|
127
138
|
const result = await getContext(ctx, {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { AuthedRouteRequest } from '../types.js';
|
|
2
|
-
export declare function handleCreateSkill(rr: AuthedRouteRequest): Promise<void>;
|
|
3
|
-
export declare function handleListSkills(rr: AuthedRouteRequest): Promise<void>;
|
|
4
|
-
export declare function handleExportSkills(rr: AuthedRouteRequest): Promise<void>;
|
|
5
|
-
export declare function handleSupersedeSkill(rr: AuthedRouteRequest
|
|
6
|
-
export declare function handleCloseSkill(rr: AuthedRouteRequest
|
|
7
|
-
export declare function handleGetSkill(rr: AuthedRouteRequest
|
|
2
|
+
export declare function handleCreateSkill(rr: AuthedRouteRequest<'objects'>): Promise<void>;
|
|
3
|
+
export declare function handleListSkills(rr: AuthedRouteRequest<'objects'>): Promise<void>;
|
|
4
|
+
export declare function handleExportSkills(rr: AuthedRouteRequest<'objects'>): Promise<void>;
|
|
5
|
+
export declare function handleSupersedeSkill(rr: AuthedRouteRequest<'objects'>, match: RegExpMatchArray): Promise<void>;
|
|
6
|
+
export declare function handleCloseSkill(rr: AuthedRouteRequest<'objects'>, match: RegExpMatchArray): Promise<void>;
|
|
7
|
+
export declare function handleGetSkill(rr: AuthedRouteRequest<'objects'>, match: RegExpMatchArray): Promise<void>;
|
|
8
8
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { MAX_SKILL_NAME_LEN, SKILL, skillsMarkdown } from '../../objects/skills.js';
|
|
3
3
|
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
|
|
5
|
-
import { objectsOf, saveFor } from '../../api/objects.js';
|
|
5
|
+
import { objectsOf, saveFor } from '../../api/objects/objects.js';
|
|
6
6
|
import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
|
|
7
7
|
const INSTRUCTIONS = { max: 8192, plural: true };
|
|
8
8
|
const skillRoutes = {
|
|
@@ -14,11 +14,19 @@ const skillRoutes = {
|
|
|
14
14
|
const instructions = requiredString(body, 'instructions', INSTRUCTIONS);
|
|
15
15
|
const trigger = optionalString(body, 'trigger', 1024);
|
|
16
16
|
const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
|
|
17
|
-
return (existing, id) => ({
|
|
17
|
+
return (existing, id) => ({
|
|
18
|
+
skillName: existing.skillName,
|
|
19
|
+
instructions,
|
|
20
|
+
trigger,
|
|
21
|
+
changeSummary,
|
|
22
|
+
supersedesSkillId: id,
|
|
23
|
+
});
|
|
18
24
|
},
|
|
19
25
|
};
|
|
20
|
-
// Routes: /v1/skills (create, list, export, show, supersede, close), mirroring /v1/processes; "executable" means
|
|
21
|
-
//
|
|
26
|
+
// Routes: /v1/skills (create, list, export, show, supersede, close), mirroring /v1/processes; "executable" means
|
|
27
|
+
// exportable instruction (no code exec).
|
|
28
|
+
// GET /v1/skills/export renders ACTIVE skills as a markdown block for AGENTS.md or CLAUDE.md and is ordered before
|
|
29
|
+
// /:id.
|
|
22
30
|
export async function handleCreateSkill(rr) {
|
|
23
31
|
const { ctx } = rr;
|
|
24
32
|
const body = await parseJsonBody(rr.req, ctx);
|
|
@@ -1,32 +1,48 @@
|
|
|
1
1
|
export interface ServerInfo {
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Pidfile schema version; absent on pidfiles written before the field existed, which detectServer treats as legacy
|
|
4
|
+
* and still accepts.
|
|
5
|
+
*/
|
|
3
6
|
schema?: number;
|
|
4
7
|
pid: number;
|
|
5
8
|
port: number;
|
|
6
9
|
url: string;
|
|
7
10
|
started_at: string;
|
|
8
11
|
}
|
|
9
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* The pidfile names a live process on loopback that did not answer /health in time: most likely a busy server, so a
|
|
14
|
+
* caller must neither
|
|
10
15
|
* bypass it with a second writer nor start another server beside it. */
|
|
11
16
|
export declare class ServerUnresponsiveError extends Error {
|
|
12
17
|
constructor(info: ServerInfo, probeMs: number, options?: ErrorOptions);
|
|
13
18
|
}
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
19
|
+
/**
|
|
20
|
+
* Returns the pidfile's ServerInfo if a live hippo server answers on the recorded url, else null (best-effort unlinking
|
|
21
|
+
* of missing/stale/malformed pidfiles).
|
|
22
|
+
* `process.kill(pid, 0)` rules out dead pids; GET /health must then return the pidfile's `started_at` (pids get
|
|
23
|
+
* reused). Probes only if the pid is live.
|
|
16
24
|
* Throws ServerUnresponsiveError when that probe times out. */
|
|
17
25
|
export declare function detectServer(hippoRoot: string): Promise<ServerInfo | null>;
|
|
18
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Atomically writes the pidfile (process-scoped temp file, then rename; atomic on POSIX and NTFS). `startedAt` comes
|
|
28
|
+
* from the caller (`serve()`) so the
|
|
19
29
|
* pidfile and GET /health carry the same timestamp, which detectServer's liveness probe compares. */
|
|
20
30
|
export declare function writePidfile(hippoRoot: string, opts: {
|
|
21
31
|
port: number;
|
|
22
32
|
url: string;
|
|
23
33
|
startedAt: string;
|
|
24
34
|
}): void;
|
|
25
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Best-effort pidfile removal, silent on any error so shutdown paths can call it. Identity-blind: a shutdown that must
|
|
37
|
+
* not clobber a newer server's pidfile
|
|
26
38
|
* uses removePidfileIfOwned. */
|
|
27
39
|
export declare function removePidfile(hippoRoot: string): void;
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
40
|
+
/**
|
|
41
|
+
* Removes the pidfile ONLY when both `pid` and `started_at` match `owner`, so an older shutting-down server cannot
|
|
42
|
+
* orphan a newer one; never throws.
|
|
43
|
+
* Anything unreadable or malformed is "not provably mine" and left alone (detectServer unlinks it). Returns true iff
|
|
44
|
+
* removed.
|
|
45
|
+
*/
|
|
30
46
|
export declare function removePidfileIfOwned(hippoRoot: string, owner: {
|
|
31
47
|
pid: number;
|
|
32
48
|
startedAt: string;
|
|
@@ -2,21 +2,32 @@ import { existsSync, readFileSync, writeFileSync, unlinkSync, renameSync } from
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { envHealthProbeMs } from '../util/env.js';
|
|
4
4
|
import { errorCode, errorFields, errorMessage, log } from '../util/log.js';
|
|
5
|
-
// Pidfile sits directly inside hippoRoot (the `.hippo` directory itself, as for openHippoDb), i.e.
|
|
5
|
+
// Pidfile sits directly inside hippoRoot (the `.hippo` directory itself, as for openHippoDb), i.e.
|
|
6
|
+
// `${hippoRoot}/server.pid`.
|
|
6
7
|
const PIDFILE = 'server.pid';
|
|
7
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* How long detectServer waits for the `/health` probe before treating the pidfile as stale; short because it fires only
|
|
10
|
+
* when a pidfile exists with a live
|
|
8
11
|
* pid on loopback. HIPPO_HEALTH_PROBE_MS overrides it. */
|
|
9
12
|
const HEALTH_PROBE_TIMEOUT_MS = 300;
|
|
10
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Hard cap on the /health body detectServer buffers: a real payload is well under 1 KB, so a larger body means the
|
|
15
|
+
* process on the recorded port is not
|
|
11
16
|
* hippo. */
|
|
12
17
|
const HEALTH_BODY_MAX_BYTES = 64 * 1024;
|
|
13
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Loopback hosts a recorded pidfile url may point at (serve() only binds these); any other host is malformed or forged
|
|
20
|
+
* and is not probed.
|
|
21
|
+
*/
|
|
14
22
|
const PIDFILE_LOOPBACK_HOSTS = new Set(['127.0.0.1', '::1', 'localhost']);
|
|
15
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* The pidfile names a live process on loopback that did not answer /health in time: most likely a busy server, so a
|
|
25
|
+
* caller must neither
|
|
16
26
|
* bypass it with a second writer nor start another server beside it. */
|
|
17
27
|
export class ServerUnresponsiveError extends Error {
|
|
18
28
|
constructor(info, probeMs, options) {
|
|
19
|
-
super(`a hippo server (pid ${info.pid}) is recorded at ${info.url} but did not answer /health within ${probeMs} ms;
|
|
29
|
+
super(`a hippo server (pid ${info.pid}) is recorded at ${info.url} but did not answer /health within ${probeMs} ms; ` +
|
|
30
|
+
`it may be busy. ` +
|
|
20
31
|
'Retry shortly, raise HIPPO_HEALTH_PROBE_MS, or stop that server.', options);
|
|
21
32
|
this.name = 'ServerUnresponsiveError';
|
|
22
33
|
}
|
|
@@ -31,8 +42,10 @@ function isLiveLoopbackTarget(info) {
|
|
|
31
42
|
catch {
|
|
32
43
|
return false;
|
|
33
44
|
}
|
|
34
|
-
// The pid may have been reused and the recorded url is read from a forgeable file; serve() only binds loopback, so a
|
|
35
|
-
//
|
|
45
|
+
// The pid may have been reused and the recorded url is read from a forgeable file; serve() only binds loopback, so a
|
|
46
|
+
// url that is not http on a loopback
|
|
47
|
+
// host and the recorded port is malformed or forged. Reject it before probing, since the probe and any routed request
|
|
48
|
+
// can carry HIPPO_API_KEY.
|
|
36
49
|
let probeUrl;
|
|
37
50
|
try {
|
|
38
51
|
probeUrl = new URL(info.url);
|
|
@@ -46,7 +59,8 @@ function isLiveLoopbackTarget(info) {
|
|
|
46
59
|
}
|
|
47
60
|
/** The whole body as text, or null once it passes HEALTH_BODY_MAX_BYTES (the stream is then cancelled). */
|
|
48
61
|
async function readCappedBody(body) {
|
|
49
|
-
// Read the body under a hard byte cap: the process on info.url may not be hippo (pid reuse), so its response is
|
|
62
|
+
// Read the body under a hard byte cap: the process on info.url may not be hippo (pid reuse), so its response is
|
|
63
|
+
// untrusted and never goes unbounded into a
|
|
50
64
|
// parser.
|
|
51
65
|
const reader = body.getReader();
|
|
52
66
|
const decoder = new TextDecoder();
|
|
@@ -66,19 +80,27 @@ async function readCappedBody(body) {
|
|
|
66
80
|
raw += decoder.decode();
|
|
67
81
|
return raw;
|
|
68
82
|
}
|
|
69
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* True when fetch failed because nothing listens on the port (the error or its cause, or any address tried, is
|
|
85
|
+
* ECONNREFUSED).
|
|
86
|
+
*/
|
|
70
87
|
function isConnectionRefused(err) {
|
|
71
88
|
if (errorCode(err) === 'ECONNREFUSED')
|
|
72
89
|
return true;
|
|
73
90
|
const cause = err instanceof Error ? err.cause : undefined;
|
|
74
91
|
if (errorCode(cause) === 'ECONNREFUSED')
|
|
75
92
|
return true;
|
|
76
|
-
return cause instanceof AggregateError &&
|
|
93
|
+
return (cause instanceof AggregateError &&
|
|
94
|
+
cause.errors.length > 0 &&
|
|
95
|
+
cause.errors.every((e) => errorCode(e) === 'ECONNREFUSED'));
|
|
77
96
|
}
|
|
78
|
-
/**
|
|
97
|
+
/**
|
|
98
|
+
* True when /health on info.url reports the pidfile's started_at; unlinks the pidfile on any definitive mismatch and
|
|
99
|
+
* throws ServerUnresponsiveError on a
|
|
79
100
|
* probe timeout. */
|
|
80
101
|
async function healthMatchesPidfile(hippoRoot, info) {
|
|
81
|
-
// Refusal, non-200 or a malformed body unlink the pidfile as stale. A timeout proves neither a dead server nor this
|
|
102
|
+
// Refusal, non-200 or a malformed body unlink the pidfile as stale. A timeout proves neither a dead server nor this
|
|
103
|
+
// one, so it keeps the pidfile and throws.
|
|
82
104
|
// Any other error keeps it and warns.
|
|
83
105
|
const probeMs = envHealthProbeMs() ?? HEALTH_PROBE_TIMEOUT_MS;
|
|
84
106
|
try {
|
|
@@ -100,9 +122,11 @@ async function healthMatchesPidfile(hippoRoot, info) {
|
|
|
100
122
|
return true;
|
|
101
123
|
}
|
|
102
124
|
catch (err) {
|
|
103
|
-
if (err instanceof Error && err.name === 'TimeoutError')
|
|
125
|
+
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
104
126
|
throw new ServerUnresponsiveError(info, probeMs, { cause: err });
|
|
105
|
-
|
|
127
|
+
}
|
|
128
|
+
// A refusal or a non-JSON body proves no hippo server answers there; any other failure may be a live server, so the
|
|
129
|
+
// file stays.
|
|
106
130
|
if (isConnectionRefused(err) || err instanceof SyntaxError) {
|
|
107
131
|
removePidfile(hippoRoot);
|
|
108
132
|
}
|
|
@@ -112,8 +136,11 @@ async function healthMatchesPidfile(hippoRoot, info) {
|
|
|
112
136
|
return false;
|
|
113
137
|
}
|
|
114
138
|
}
|
|
115
|
-
/**
|
|
116
|
-
*
|
|
139
|
+
/**
|
|
140
|
+
* Returns the pidfile's ServerInfo if a live hippo server answers on the recorded url, else null (best-effort unlinking
|
|
141
|
+
* of missing/stale/malformed pidfiles).
|
|
142
|
+
* `process.kill(pid, 0)` rules out dead pids; GET /health must then return the pidfile's `started_at` (pids get
|
|
143
|
+
* reused). Probes only if the pid is live.
|
|
117
144
|
* Throws ServerUnresponsiveError when that probe times out. */
|
|
118
145
|
export async function detectServer(hippoRoot) {
|
|
119
146
|
const path = join(hippoRoot, PIDFILE);
|
|
@@ -124,7 +151,7 @@ export async function detectServer(hippoRoot) {
|
|
|
124
151
|
info = JSON.parse(readFileSync(path, 'utf8'));
|
|
125
152
|
}
|
|
126
153
|
catch (err) {
|
|
127
|
-
log.warn(`server pidfile ${path} is unreadable (${errorMessage(err)}); removing it
|
|
154
|
+
log.warn(`server pidfile ${path} is unreadable (${errorMessage(err)}); removing it`, errorFields(err));
|
|
128
155
|
removePidfile(hippoRoot);
|
|
129
156
|
return null;
|
|
130
157
|
}
|
|
@@ -134,7 +161,9 @@ export async function detectServer(hippoRoot) {
|
|
|
134
161
|
}
|
|
135
162
|
return (await healthMatchesPidfile(hippoRoot, info)) ? info : null;
|
|
136
163
|
}
|
|
137
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* Atomically writes the pidfile (process-scoped temp file, then rename; atomic on POSIX and NTFS). `startedAt` comes
|
|
166
|
+
* from the caller (`serve()`) so the
|
|
138
167
|
* pidfile and GET /health carry the same timestamp, which detectServer's liveness probe compares. */
|
|
139
168
|
export function writePidfile(hippoRoot, opts) {
|
|
140
169
|
const path = join(hippoRoot, PIDFILE);
|
|
@@ -149,7 +178,9 @@ export function writePidfile(hippoRoot, opts) {
|
|
|
149
178
|
writeFileSync(tmp, JSON.stringify(info));
|
|
150
179
|
renameSync(tmp, path);
|
|
151
180
|
}
|
|
152
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* Best-effort pidfile removal, silent on any error so shutdown paths can call it. Identity-blind: a shutdown that must
|
|
183
|
+
* not clobber a newer server's pidfile
|
|
153
184
|
* uses removePidfileIfOwned. */
|
|
154
185
|
export function removePidfile(hippoRoot) {
|
|
155
186
|
const path = join(hippoRoot, PIDFILE);
|
|
@@ -158,8 +189,12 @@ export function removePidfile(hippoRoot) {
|
|
|
158
189
|
}
|
|
159
190
|
catch { /* already gone or undeletable; the next detectServer probe re-checks */ }
|
|
160
191
|
}
|
|
161
|
-
/**
|
|
162
|
-
*
|
|
192
|
+
/**
|
|
193
|
+
* Removes the pidfile ONLY when both `pid` and `started_at` match `owner`, so an older shutting-down server cannot
|
|
194
|
+
* orphan a newer one; never throws.
|
|
195
|
+
* Anything unreadable or malformed is "not provably mine" and left alone (detectServer unlinks it). Returns true iff
|
|
196
|
+
* removed.
|
|
197
|
+
*/
|
|
163
198
|
export function removePidfileIfOwned(hippoRoot, owner) {
|
|
164
199
|
const path = join(hippoRoot, PIDFILE);
|
|
165
200
|
try {
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
// Entry of the process that runs one POST /v1/sleep or MCP auto-sleep; sleep-offload.ts starts it and nothing imports
|
|
2
|
-
// The sleep modules alone: the api barrel loads far more than one sleep needs, and every sleep pays for the start.
|
|
3
|
-
import { sleep } from '../api/sleep.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
// Entry of the process that runs one POST /v1/sleep or MCP auto-sleep; sleep-offload.ts starts it and nothing imports
|
|
2
|
+
// it. The sleep modules alone: the api barrel loads far more than one sleep needs, and every sleep pays for the start.
|
|
3
|
+
import { sleep } from '../api/sleep/sleep.js';
|
|
4
|
+
import { runConsolidation } from '../consolidate/sleep.js';
|
|
5
|
+
import { isStoreBusy } from '../api/busy.js';
|
|
6
|
+
import { runSqliteRequest } from '../store/sqlite/request-scope.js';
|
|
7
|
+
import { sqliteStore, sqliteSyncStore } from '../store/sqlite/store.js';
|
|
7
8
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
8
9
|
function failed(err) {
|
|
9
|
-
return {
|
|
10
|
+
return {
|
|
11
|
+
ok: false,
|
|
12
|
+
busy: isStoreBusy(err),
|
|
13
|
+
message: errorMessage(err),
|
|
14
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
15
|
+
};
|
|
10
16
|
}
|
|
11
17
|
/** Resolves to the exit code once the channel has taken the reply, or failed to. */
|
|
12
18
|
function sendReply(reply) {
|
|
@@ -22,10 +28,10 @@ process.once('message', (message) => {
|
|
|
22
28
|
// SAFETY: sleep-offload.ts is the only writer on this channel and sends exactly one SleepJob.
|
|
23
29
|
const job = message;
|
|
24
30
|
const work = () => job.kind === 'consolidate'
|
|
25
|
-
?
|
|
26
|
-
: sleep({ hippoRoot: job.hippoRoot, tenantId: job.tenantId, actor: job.actor }, job.opts);
|
|
31
|
+
? runConsolidation(sqliteSyncStore(job.hippoRoot).localFiles)
|
|
32
|
+
: sleep({ hippoRoot: job.hippoRoot, tenantId: job.tenantId, actor: job.actor, store: sqliteStore(job.hippoRoot) }, job.opts);
|
|
27
33
|
// The server's own request scope and lock wait, so a busy store answers as it did when sleep ran in the server.
|
|
28
|
-
|
|
34
|
+
runSqliteRequest(work, 'server')
|
|
29
35
|
.then((result) => ({ ok: true, result }), failed)
|
|
30
36
|
// Exit only once the reply is written, or the parent could see the process end first.
|
|
31
37
|
.then(sendReply)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type Actor, type
|
|
2
|
-
/** What the child needs to rebuild the request's context (the store handle itself cannot cross a process boundary),
|
|
1
|
+
import { type Actor, type SleepOpts, type SleepResult, type ContextWith } from '../api/index.js';
|
|
2
|
+
/** What the child needs to rebuild the request's context (the store handle itself cannot cross a process boundary),
|
|
3
|
+
* or the store an auto-sleep consolidates. */
|
|
3
4
|
export type SleepJob = {
|
|
4
5
|
readonly kind: 'sleep';
|
|
5
6
|
readonly hippoRoot: string;
|
|
@@ -19,8 +20,10 @@ export type SleepReply<R = SleepResult> = {
|
|
|
19
20
|
readonly message: string;
|
|
20
21
|
readonly stack?: string;
|
|
21
22
|
};
|
|
22
|
-
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline
|
|
24
|
+
* (10 minutes, or HIPPO_SLEEP_TIMEOUT_MS). */
|
|
25
|
+
export declare function sleepInChild(ctx: ContextWith<'localFiles'>, opts: SleepOpts): Promise<SleepResult>;
|
|
26
|
+
/** The MCP auto-sleep's consolidation, in the same queue and child
|
|
27
|
+
* as POST /v1/sleep; auto-sleep only starts on a hippo.db store. */
|
|
25
28
|
export declare function consolidateInChild(hippoRoot: string): Promise<void>;
|
|
26
29
|
//# sourceMappingURL=sleep-offload.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// POST /v1/sleep and the MCP auto-sleep run their consolidation in a child process, so the server keeps answering and a
|
|
1
|
+
// POST /v1/sleep and the MCP auto-sleep run their consolidation in a child process, so the server keeps answering and a
|
|
2
|
+
// stuck run can be stopped.
|
|
2
3
|
import { spawn } from 'node:child_process';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import {
|
|
5
|
-
import { hasGroup, StoreBusyError } from '../store/port.js';
|
|
5
|
+
import { StoreBusyError } from '../store/port.js';
|
|
6
6
|
import { envSleepTimeoutMs } from '../util/env.js';
|
|
7
7
|
import { HttpError } from '../util/http-util.js';
|
|
8
8
|
const DEFAULT_SLEEP_DEADLINE_MS = 600_000;
|
|
@@ -25,22 +25,32 @@ function runInChild(job) {
|
|
|
25
25
|
// The child's stderr is the server's log, so Node's SQLite notice would repeat there on every sleep.
|
|
26
26
|
const child = spawn(process.execPath, ['--disable-warning=ExperimentalWarning', CHILD_ENTRY], {
|
|
27
27
|
stdio: ['ignore', 'inherit', 'inherit', 'ipc'],
|
|
28
|
-
windowsHide: true
|
|
28
|
+
windowsHide: true,
|
|
29
29
|
});
|
|
30
30
|
let reply;
|
|
31
31
|
let timedOut = false;
|
|
32
|
-
// SIGKILL because the child is inside synchronous SQLite work
|
|
33
|
-
|
|
32
|
+
// SIGKILL because the child is inside synchronous SQLite work
|
|
33
|
+
// and cannot run a handler; the OS drops its write lock.
|
|
34
|
+
const timer = setTimeout(() => {
|
|
35
|
+
timedOut = true;
|
|
36
|
+
child.kill('SIGKILL');
|
|
37
|
+
}, deadlineMs);
|
|
34
38
|
child.once('message', (message) => {
|
|
35
|
-
// SAFETY: sleep-child.ts is the only writer on this channel and sends exactly one SleepReply for the job it was
|
|
39
|
+
// SAFETY: sleep-child.ts is the only writer on this channel and sends exactly one SleepReply for the job it was
|
|
40
|
+
// given.
|
|
36
41
|
reply = message;
|
|
37
42
|
});
|
|
38
|
-
child.once('error', (err) => {
|
|
39
|
-
|
|
43
|
+
child.once('error', (err) => {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
reject(err);
|
|
46
|
+
});
|
|
47
|
+
// 'close' and not 'exit': it waits for the channel to drain, so
|
|
48
|
+
// the reply is in hand and the child's store handles are gone.
|
|
40
49
|
child.once('close', (code, signal) => {
|
|
41
50
|
clearTimeout(timer);
|
|
42
|
-
if (timedOut)
|
|
51
|
+
if (timedOut) {
|
|
43
52
|
reject(new HttpError(504, `sleep did not finish within ${deadlineMs} ms and was stopped; the next sleep carries on from there`));
|
|
53
|
+
}
|
|
44
54
|
else if (reply?.ok)
|
|
45
55
|
resolve(reply.result);
|
|
46
56
|
else
|
|
@@ -50,7 +60,8 @@ function runInChild(job) {
|
|
|
50
60
|
});
|
|
51
61
|
}
|
|
52
62
|
let turn = Promise.resolve();
|
|
53
|
-
// One running and one waiting: each further sleep would only hold
|
|
63
|
+
// One running and one waiting: each further sleep would only hold
|
|
64
|
+
// a request open behind work the waiting one already covers.
|
|
54
65
|
const MAX_SLEEPS_IN_LINE = 2;
|
|
55
66
|
const SLEEP_RETRY_AFTER_SEC = 30;
|
|
56
67
|
let inLine = 0;
|
|
@@ -59,20 +70,31 @@ function inTurn(job) {
|
|
|
59
70
|
return Promise.reject(new HttpError(503, 'a sleep is already running and another is waiting; retry when one has finished', SLEEP_RETRY_AFTER_SEC));
|
|
60
71
|
}
|
|
61
72
|
inLine += 1;
|
|
62
|
-
// One sleep at a time, as on the server's single thread: a second one waits its turn and does not fight the first for
|
|
73
|
+
// One sleep at a time, as on the server's single thread: a second one waits its turn and does not fight the first for
|
|
74
|
+
// the write lock.
|
|
63
75
|
const run = turn.then(() => runInChild(job));
|
|
64
76
|
// A failed sleep reaches its own caller through `run`; the queue only needs to know the turn is over.
|
|
65
|
-
turn = run
|
|
77
|
+
turn = run
|
|
78
|
+
.then(() => undefined, () => undefined)
|
|
79
|
+
.finally(() => {
|
|
80
|
+
inLine -= 1;
|
|
81
|
+
});
|
|
66
82
|
return run;
|
|
67
83
|
}
|
|
68
|
-
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline
|
|
84
|
+
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline
|
|
85
|
+
* (10 minutes, or HIPPO_SLEEP_TIMEOUT_MS). */
|
|
69
86
|
export function sleepInChild(ctx, opts) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
87
|
+
return inTurn({
|
|
88
|
+
kind: 'sleep',
|
|
89
|
+
// The child reopens the folder the served store owns.
|
|
90
|
+
hippoRoot: ctx.store.localFiles.hippoRoot,
|
|
91
|
+
tenantId: ctx.tenantId,
|
|
92
|
+
actor: ctx.actor,
|
|
93
|
+
opts,
|
|
94
|
+
});
|
|
74
95
|
}
|
|
75
|
-
/** The MCP auto-sleep's consolidation, in the same queue and child
|
|
96
|
+
/** The MCP auto-sleep's consolidation, in the same queue and child
|
|
97
|
+
* as POST /v1/sleep; auto-sleep only starts on a hippo.db store. */
|
|
76
98
|
export async function consolidateInChild(hippoRoot) {
|
|
77
99
|
await inTurn({ kind: 'consolidate', hippoRoot });
|
|
78
100
|
}
|
package/dist/server/tls.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ export declare class CleartextBindError extends Error {
|
|
|
6
6
|
readonly host: string;
|
|
7
7
|
constructor(host: string);
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Throws CleartextBindError for a non-loopback bind without TLS unless the operator allowed cleartext, which is then
|
|
11
|
+
* said once at boot.
|
|
12
|
+
*/
|
|
10
13
|
export declare function assertTlsOrCleartextAllowed(host: string, tls: ServeOpts['tls'], loopbackHosts: ReadonlySet<string>, allowCleartext: boolean): void;
|
|
11
14
|
//# sourceMappingURL=tls.d.ts.map
|
package/dist/server/tls.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The serve() listener: node:https when a certificate is given, else node:http, which a non-loopback bind must opt
|
|
1
|
+
// The serve() listener: node:https when a certificate is given, else node:http, which a non-loopback bind must opt
|
|
2
|
+
// into.
|
|
2
3
|
import { createServer as createHttpServer } from 'node:http';
|
|
3
4
|
import { createServer as createHttpsServer } from 'node:https';
|
|
4
5
|
import { errorMessage, log } from '../util/log.js';
|
|
@@ -18,19 +19,26 @@ export function createListener(tls, onRequest) {
|
|
|
18
19
|
export class CleartextBindError extends Error {
|
|
19
20
|
host;
|
|
20
21
|
constructor(host) {
|
|
21
|
-
super(`hippo serve: refusing to listen on ${host} without TLS, since API keys and memory text would travel in
|
|
22
|
-
|
|
22
|
+
super(`hippo serve: refusing to listen on ${host} without TLS, since API keys and memory text would travel in ` +
|
|
23
|
+
`cleartext. ` +
|
|
24
|
+
'Pass --tls-cert and --tls-key (or set HIPPO_TLS_CERT and HIPPO_TLS_KEY) to serve HTTPS. If a ' +
|
|
25
|
+
'TLS-terminating ' +
|
|
26
|
+
'proxy sits in front, ' +
|
|
23
27
|
'start with --allow-cleartext, set HIPPO_ALLOW_CLEARTEXT=1, or pass allowCleartext: true to serve().');
|
|
24
28
|
this.host = host;
|
|
25
29
|
this.name = 'CleartextBindError';
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Throws CleartextBindError for a non-loopback bind without TLS unless the operator allowed cleartext, which is then
|
|
34
|
+
* said once at boot.
|
|
35
|
+
*/
|
|
29
36
|
export function assertTlsOrCleartextAllowed(host, tls, loopbackHosts, allowCleartext) {
|
|
30
37
|
if (tls || loopbackHosts.has(host))
|
|
31
38
|
return;
|
|
32
39
|
if (!allowCleartext)
|
|
33
40
|
throw new CleartextBindError(host);
|
|
34
|
-
log.warn(`serve: listening on ${host} without TLS, as allowed; API keys and memory text are cleartext until the proxy in
|
|
41
|
+
log.warn(`serve: listening on ${host} without TLS, as allowed; API keys and memory text are cleartext until the proxy in ` +
|
|
42
|
+
`front adds TLS.`);
|
|
35
43
|
}
|
|
36
44
|
//# sourceMappingURL=tls.js.map
|