hippo-memory 1.70.0 → 1.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -52,18 +52,47 @@ function removeTemp(tmp) {
|
|
|
52
52
|
log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
/** Flushed before the rename, or a crash soon after could leave the file's name on bytes that never reached the disk. */
|
|
56
|
+
function writeFlushed(tmp, text, old) {
|
|
57
|
+
const fd = fs.openSync(tmp, 'w', (old?.mode ?? 0o666) & 0o777);
|
|
57
58
|
try {
|
|
58
|
-
fs.writeFileSync(
|
|
59
|
+
fs.writeFileSync(fd, text, 'utf8');
|
|
59
60
|
if (old)
|
|
60
61
|
keepAccess(tmp, old);
|
|
62
|
+
fs.fsyncSync(fd);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
fs.closeSync(fd);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content, so it only warns. */
|
|
69
|
+
function flushFolder(dir) {
|
|
70
|
+
if (process.platform === 'win32')
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
const fd = fs.openSync(dir, 'r');
|
|
74
|
+
try {
|
|
75
|
+
fs.fsyncSync(fd);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
fs.closeSync(fd);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function replaceViaTemp(target, text, old) {
|
|
86
|
+
const tmp = `${target}.${process.pid}.tmp`;
|
|
87
|
+
try {
|
|
88
|
+
writeFlushed(tmp, text, old);
|
|
61
89
|
renameOnto(tmp, target);
|
|
62
90
|
}
|
|
63
91
|
catch (err) {
|
|
64
92
|
removeTemp(tmp);
|
|
65
93
|
throw err;
|
|
66
94
|
}
|
|
95
|
+
flushFolder(path.dirname(target));
|
|
67
96
|
}
|
|
68
97
|
/** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps hard links together. */
|
|
69
98
|
function writeInPlace(target, text) {
|
|
@@ -79,7 +108,8 @@ function writeInPlace(target, text) {
|
|
|
79
108
|
throw new Error(`${target} ${reason}`, { cause: err });
|
|
80
109
|
}
|
|
81
110
|
}
|
|
82
|
-
/**
|
|
111
|
+
/** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old content or the new, whole.
|
|
112
|
+
* A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can leave it truncated. */
|
|
83
113
|
export function writeFileAtomic(file, text) {
|
|
84
114
|
const target = writeTarget(file);
|
|
85
115
|
const old = fs.statSync(target, { throwIfNoEntry: false });
|
|
@@ -101,6 +131,7 @@ export function writeFileAtomic(file, text) {
|
|
|
101
131
|
catch (err) {
|
|
102
132
|
if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
|
|
103
133
|
throw err;
|
|
134
|
+
log.warn(`${target} could not be replaced by a rename (${errnoCode(err)}), so it is written in place: not atomic, a crash mid-write can leave it truncated`);
|
|
104
135
|
writeInPlace(target, text);
|
|
105
136
|
}
|
|
106
137
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { JsonValue } from './json.js';
|
|
2
|
+
/** Reads a reply body as JSON and stops with an error as soon as it passes `maxBytes`. */
|
|
3
|
+
export declare function readCappedJson(resp: Response, maxBytes: number): Promise<JsonValue>;
|
|
4
|
+
/** Reads at most `maxBytes` of a body as text, then cancels the rest; never throws on size. */
|
|
5
|
+
export declare function readCappedText(resp: Response, maxBytes: number): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=capped-json.d.ts.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// The timeout bounds time, not bytes: a hostile endpoint could stream a huge 2xx body into memory.
|
|
2
|
+
/** Reads a reply body as JSON and stops with an error as soon as it passes `maxBytes`. */
|
|
3
|
+
export async function readCappedJson(resp, maxBytes) {
|
|
4
|
+
if (!resp.body)
|
|
5
|
+
throw new Error('reply has no body');
|
|
6
|
+
const reader = resp.body.getReader();
|
|
7
|
+
const decoder = new TextDecoder();
|
|
8
|
+
let raw = '';
|
|
9
|
+
let received = 0;
|
|
10
|
+
for (;;) {
|
|
11
|
+
const { done, value } = await reader.read();
|
|
12
|
+
if (done)
|
|
13
|
+
break;
|
|
14
|
+
received += value.byteLength;
|
|
15
|
+
if (received > maxBytes) {
|
|
16
|
+
await reader.cancel();
|
|
17
|
+
throw new Error(`reply over ${maxBytes} bytes`);
|
|
18
|
+
}
|
|
19
|
+
raw += decoder.decode(value, { stream: true });
|
|
20
|
+
}
|
|
21
|
+
raw += decoder.decode();
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new Error('reply is not JSON', { cause: err });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Reads at most `maxBytes` of a body as text, then cancels the rest; never throws on size. */
|
|
30
|
+
export async function readCappedText(resp, maxBytes) {
|
|
31
|
+
if (!resp.body)
|
|
32
|
+
return '';
|
|
33
|
+
const reader = resp.body.getReader();
|
|
34
|
+
const chunks = [];
|
|
35
|
+
let received = 0;
|
|
36
|
+
while (received < maxBytes) {
|
|
37
|
+
const { done, value } = await reader.read();
|
|
38
|
+
if (done)
|
|
39
|
+
break;
|
|
40
|
+
chunks.push(value.subarray(0, maxBytes - received));
|
|
41
|
+
received += chunks[chunks.length - 1].byteLength;
|
|
42
|
+
}
|
|
43
|
+
await reader.cancel();
|
|
44
|
+
return new TextDecoder().decode(Buffer.concat(chunks));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=capped-json.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
|
|
2
|
+
const ID_CHUNK = 500;
|
|
3
|
+
/** `items` in consecutive slices of at most `size`. */
|
|
4
|
+
export function chunked(items, size = ID_CHUNK) {
|
|
5
|
+
const out = [];
|
|
6
|
+
for (let i = 0; i < items.length; i += size)
|
|
7
|
+
out.push(items.slice(i, i + size));
|
|
8
|
+
return out;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=chunked.js.map
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
/** What an entry point runs before it exits, and how long that may take before the process is ended without it. */
|
|
2
|
+
export interface Shutdown {
|
|
3
|
+
readonly run: () => void | Promise<void>;
|
|
4
|
+
readonly boundMs: number;
|
|
5
|
+
}
|
|
1
6
|
/** Exit once stdout and stderr have drained, so the last reply and the last log line reach their reader; capped at 1 s. */
|
|
2
7
|
export declare function exitAfterFlush(code: number): void;
|
|
8
|
+
/** On SIGTERM or SIGINT: runs `shutdown` once, then exits 0. */
|
|
9
|
+
export declare function installSignalHandlers(name: string, shutdown: Shutdown): void;
|
|
3
10
|
/** After an uncaught throw the process state is unknown: log the cause, run `shutdown` once, then exit 1 for the supervisor or client to restart it. */
|
|
4
|
-
export declare function installCrashHandlers(name: string, shutdown?:
|
|
11
|
+
export declare function installCrashHandlers(name: string, shutdown?: Shutdown): void;
|
|
5
12
|
//# sourceMappingURL=crash-handlers.d.ts.map
|
|
@@ -1,17 +1,59 @@
|
|
|
1
1
|
// Last-resort process handlers shared by the long-running entry points (`hippo mcp`, `hippo serve`).
|
|
2
2
|
import { errorFields, errorMessage, log } from './log.js';
|
|
3
|
-
|
|
4
|
-
export function exitAfterFlush(code) {
|
|
5
|
-
process.exitCode = code;
|
|
3
|
+
function afterFlush(leave) {
|
|
6
4
|
let pending = 2;
|
|
7
5
|
const done = () => { if (--pending === 0)
|
|
8
|
-
|
|
6
|
+
leave(); };
|
|
9
7
|
process.stdout.write('', done);
|
|
10
8
|
process.stderr.write('', done);
|
|
11
|
-
setTimeout(
|
|
9
|
+
setTimeout(leave, 1000).unref();
|
|
10
|
+
}
|
|
11
|
+
/** Exit once stdout and stderr have drained, so the last reply and the last log line reach their reader; capped at 1 s. */
|
|
12
|
+
export function exitAfterFlush(code) {
|
|
13
|
+
process.exitCode = code;
|
|
14
|
+
afterFlush(() => process.exit(code));
|
|
15
|
+
}
|
|
16
|
+
// process.exit joins every worker thread, so one stuck in a synchronous statement would hold the exit open; a kill cannot be held.
|
|
17
|
+
function killSelf() {
|
|
18
|
+
process.kill(process.pid, 'SIGKILL');
|
|
19
|
+
}
|
|
20
|
+
/** Runs `shutdown` for `cause`, then exits with `code`, or 1 when it threw. One still running after its bound is logged and the process ended without it. */
|
|
21
|
+
function exitAfterShutdown(name, cause, shutdown, code) {
|
|
22
|
+
let ended = false;
|
|
23
|
+
// Referenced on purpose: a shutdown that never settles must end at the bound, not when the loop happens to empty.
|
|
24
|
+
const bound = setTimeout(() => {
|
|
25
|
+
ended = true;
|
|
26
|
+
log.error(`${name} shutdown after ${cause} did not finish within ${shutdown.boundMs} ms; ending the process without it`);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
afterFlush(killSelf);
|
|
29
|
+
}, shutdown.boundMs);
|
|
30
|
+
void Promise.resolve()
|
|
31
|
+
.then(shutdown.run)
|
|
32
|
+
.then(() => code, (err) => {
|
|
33
|
+
log.error(`${name} shutdown after ${cause} failed: ${errorMessage(err)}`, errorFields(err));
|
|
34
|
+
return 1;
|
|
35
|
+
})
|
|
36
|
+
.then((exitCode) => {
|
|
37
|
+
clearTimeout(bound);
|
|
38
|
+
if (!ended)
|
|
39
|
+
exitAfterFlush(exitCode);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** On SIGTERM or SIGINT: runs `shutdown` once, then exits 0. */
|
|
43
|
+
export function installSignalHandlers(name, shutdown) {
|
|
44
|
+
let shuttingDown = false;
|
|
45
|
+
const stopFor = (signal) => {
|
|
46
|
+
if (shuttingDown)
|
|
47
|
+
return;
|
|
48
|
+
shuttingDown = true;
|
|
49
|
+
log.warn(`received ${signal}, shutting down`);
|
|
50
|
+
exitAfterShutdown(name, signal, shutdown, 0);
|
|
51
|
+
};
|
|
52
|
+
process.once('SIGTERM', () => stopFor('SIGTERM'));
|
|
53
|
+
process.once('SIGINT', () => stopFor('SIGINT'));
|
|
12
54
|
}
|
|
13
55
|
/** After an uncaught throw the process state is unknown: log the cause, run `shutdown` once, then exit 1 for the supervisor or client to restart it. */
|
|
14
|
-
export function installCrashHandlers(name, shutdown
|
|
56
|
+
export function installCrashHandlers(name, shutdown) {
|
|
15
57
|
let crashing = false;
|
|
16
58
|
const crash = (kind, err) => {
|
|
17
59
|
log.error(`${name} ${kind}: ${errorMessage(err)}`, errorFields(err));
|
|
@@ -19,10 +61,10 @@ export function installCrashHandlers(name, shutdown = () => { }) {
|
|
|
19
61
|
if (crashing)
|
|
20
62
|
return;
|
|
21
63
|
crashing = true;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
64
|
+
if (shutdown)
|
|
65
|
+
exitAfterShutdown(name, kind, shutdown, 1);
|
|
66
|
+
else
|
|
67
|
+
exitAfterFlush(1);
|
|
26
68
|
};
|
|
27
69
|
process.on('uncaughtException', (err) => crash('uncaught exception', err));
|
|
28
70
|
process.on('unhandledRejection', (err) => crash('unhandled rejection', err));
|
package/dist/util/env.d.ts
CHANGED
|
@@ -28,10 +28,13 @@ export declare function envClaudeCodeSessionId(): string | undefined;
|
|
|
28
28
|
export declare function envScope(): string | undefined;
|
|
29
29
|
export declare function envGstackSkill(): string | undefined;
|
|
30
30
|
export declare function envOpenclawSkill(): string | undefined;
|
|
31
|
-
/**
|
|
31
|
+
/** The tenant of a store that names none. */
|
|
32
|
+
export declare const DEFAULT_TENANT_ID = "default";
|
|
33
|
+
/** HIPPO_TENANT trimmed; empty or whitespace-only falls through to the default tenant. */
|
|
32
34
|
export declare function envTenant(): string;
|
|
33
35
|
export declare function envSkipAutoIntegrations(): boolean;
|
|
34
36
|
export declare function envSkipPostinstall(): boolean;
|
|
37
|
+
export declare function envSkipSchedule(): boolean;
|
|
35
38
|
export declare function envMcpStdio(): boolean;
|
|
36
39
|
/** `1` or `true`, so `0` and `false` turn it off; `true` stays on for anyone who set it that way. */
|
|
37
40
|
export declare function envRequireServer(): boolean;
|
|
@@ -44,12 +47,15 @@ export declare function envPort(): string | undefined;
|
|
|
44
47
|
/** How long a client waits for a running server's /health before writing to the store directly; server-detect.ts holds the default. */
|
|
45
48
|
export declare function envHealthProbeMs(): number | undefined;
|
|
46
49
|
export declare function envRequireAuth(): boolean;
|
|
50
|
+
/** `1` lets a request made on this machine in with no key, as host admin; HIPPO_REQUIRE_AUTH=1 wins over it. */
|
|
51
|
+
export declare function envAllowKeylessLocal(): boolean;
|
|
47
52
|
export declare function envV1Rps(): string | undefined;
|
|
48
53
|
/** How long a request body may take to arrive; http-util.ts holds the default. */
|
|
49
54
|
export declare function envBodyTimeoutMs(): number | undefined;
|
|
50
55
|
/** How long POST /v1/sleep lets its consolidation run; server/sleep-offload.ts holds the default. */
|
|
51
56
|
export declare function envSleepTimeoutMs(): number | undefined;
|
|
52
|
-
/** How long a /v1 or /mcp request may run before the server answers 504,
|
|
57
|
+
/** How long a /v1 or /mcp request may run before the server answers 504, and a stdio MCP
|
|
58
|
+
* request before its timeout error; 0 for no deadline; util/request-scope.ts holds the default. */
|
|
53
59
|
export declare function envRequestDeadlineMs(): number | undefined;
|
|
54
60
|
/** How many store calls may wait for one worker thread before the next is refused; store/sqlite/executor.ts holds the default. */
|
|
55
61
|
export declare function envStoreQueueMax(): number | undefined;
|
|
@@ -69,6 +75,8 @@ export declare function envLlmTimeoutMs(): number | undefined;
|
|
|
69
75
|
export declare function envTypesafeApiKey(): string | undefined;
|
|
70
76
|
export declare function envJevTimeoutMs(): number | undefined;
|
|
71
77
|
export declare function envJevModel(): string | undefined;
|
|
78
|
+
/** How long a recall waits for an API provider to embed its query before ranking on BM25 alone; search/vector.ts holds the default. */
|
|
79
|
+
export declare function envQueryEmbedTimeoutMs(): number | undefined;
|
|
72
80
|
export declare function envLlmRerankerUrl(): string | undefined;
|
|
73
81
|
export declare function envLlmRerankerKey(): string | undefined;
|
|
74
82
|
export declare function envLlmRerankerModel(): string | undefined;
|
|
@@ -83,8 +91,8 @@ export declare function envSlackTeamId(): string | undefined;
|
|
|
83
91
|
export declare function envSlackSigningSecret(): string | undefined;
|
|
84
92
|
export declare function envSlackSigningSecretPrevious(): string | undefined;
|
|
85
93
|
export declare function envSlackAllowUnknownTeamFallback(): boolean;
|
|
86
|
-
export declare function
|
|
87
|
-
export declare function
|
|
88
|
-
export declare function
|
|
89
|
-
export declare function
|
|
94
|
+
export declare function envGitHubToken(): string | undefined;
|
|
95
|
+
export declare function envGitHubWebhookSecret(): string | undefined;
|
|
96
|
+
export declare function envGitHubWebhookSecretPrevious(): string | undefined;
|
|
97
|
+
export declare function envGitHubAllowUnknownInstallationFallback(): boolean;
|
|
90
98
|
//# sourceMappingURL=env.d.ts.map
|
package/dist/util/env.js
CHANGED
|
@@ -71,13 +71,16 @@ export function envClaudeCodeSessionId() { return trimmed('CLAUDE_CODE_SESSION_I
|
|
|
71
71
|
export function envScope() { return raw('HIPPO_SCOPE'); }
|
|
72
72
|
export function envGstackSkill() { return raw('GSTACK_SKILL'); }
|
|
73
73
|
export function envOpenclawSkill() { return raw('OPENCLAW_SKILL'); }
|
|
74
|
-
/**
|
|
74
|
+
/** The tenant of a store that names none. */
|
|
75
|
+
export const DEFAULT_TENANT_ID = 'default';
|
|
76
|
+
/** HIPPO_TENANT trimmed; empty or whitespace-only falls through to the default tenant. */
|
|
75
77
|
export function envTenant() {
|
|
76
|
-
return raw('HIPPO_TENANT')?.trim() ||
|
|
78
|
+
return raw('HIPPO_TENANT')?.trim() || DEFAULT_TENANT_ID;
|
|
77
79
|
}
|
|
78
80
|
// Install and CLI switches.
|
|
79
81
|
export function envSkipAutoIntegrations() { return isOne('HIPPO_SKIP_AUTO_INTEGRATIONS'); }
|
|
80
82
|
export function envSkipPostinstall() { return isOne('HIPPO_SKIP_POSTINSTALL'); }
|
|
83
|
+
export function envSkipSchedule() { return isOne('HIPPO_SKIP_SCHEDULE'); }
|
|
81
84
|
export function envMcpStdio() { return isOne('HIPPO_MCP_STDIO'); }
|
|
82
85
|
/** `1` or `true`, so `0` and `false` turn it off; `true` stays on for anyone who set it that way. */
|
|
83
86
|
export function envRequireServer() { return isOneOrTrue('HIPPO_REQUIRE_SERVER'); }
|
|
@@ -91,12 +94,15 @@ export function envPort() { return raw('HIPPO_PORT'); }
|
|
|
91
94
|
/** How long a client waits for a running server's /health before writing to the store directly; server-detect.ts holds the default. */
|
|
92
95
|
export function envHealthProbeMs() { return positiveInt('HIPPO_HEALTH_PROBE_MS'); }
|
|
93
96
|
export function envRequireAuth() { return isOne('HIPPO_REQUIRE_AUTH'); }
|
|
97
|
+
/** `1` lets a request made on this machine in with no key, as host admin; HIPPO_REQUIRE_AUTH=1 wins over it. */
|
|
98
|
+
export function envAllowKeylessLocal() { return isOne('HIPPO_ALLOW_KEYLESS_LOCAL'); }
|
|
94
99
|
export function envV1Rps() { return raw('HIPPO_V1_RPS'); }
|
|
95
100
|
/** How long a request body may take to arrive; http-util.ts holds the default. */
|
|
96
101
|
export function envBodyTimeoutMs() { return positiveInt('HIPPO_BODY_TIMEOUT_MS'); }
|
|
97
102
|
/** How long POST /v1/sleep lets its consolidation run; server/sleep-offload.ts holds the default. */
|
|
98
103
|
export function envSleepTimeoutMs() { return positiveInt('HIPPO_SLEEP_TIMEOUT_MS'); }
|
|
99
|
-
/** How long a /v1 or /mcp request may run before the server answers 504,
|
|
104
|
+
/** How long a /v1 or /mcp request may run before the server answers 504, and a stdio MCP
|
|
105
|
+
* request before its timeout error; 0 for no deadline; util/request-scope.ts holds the default. */
|
|
100
106
|
export function envRequestDeadlineMs() { return nonNegativeInt('HIPPO_REQUEST_DEADLINE_MS'); }
|
|
101
107
|
/** How many store calls may wait for one worker thread before the next is refused; store/sqlite/executor.ts holds the default. */
|
|
102
108
|
export function envStoreQueueMax() { return positiveInt('HIPPO_STORE_QUEUE_MAX'); }
|
|
@@ -117,6 +123,8 @@ export function envLlmTimeoutMs() { return positiveInt('HIPPO_LLM_TIMEOUT_MS');
|
|
|
117
123
|
export function envTypesafeApiKey() { return trimmed('TYPESAFE_API_KEY'); }
|
|
118
124
|
export function envJevTimeoutMs() { return positiveInt('HIPPO_JEV_TIMEOUT_MS'); }
|
|
119
125
|
export function envJevModel() { return raw('HIPPO_JEV_MODEL'); }
|
|
126
|
+
/** How long a recall waits for an API provider to embed its query before ranking on BM25 alone; search/vector.ts holds the default. */
|
|
127
|
+
export function envQueryEmbedTimeoutMs() { return positiveInt('HIPPO_QUERY_EMBED_TIMEOUT_MS'); }
|
|
120
128
|
export function envLlmRerankerUrl() { return raw('HIPPO_LLM_RERANKER_URL'); }
|
|
121
129
|
export function envLlmRerankerKey() { return raw('HIPPO_LLM_RERANKER_KEY'); }
|
|
122
130
|
export function envLlmRerankerModel() { return raw('HIPPO_LLM_RERANKER_MODEL'); }
|
|
@@ -132,8 +140,8 @@ export function envSlackTeamId() { return raw('SLACK_TEAM_ID'); }
|
|
|
132
140
|
export function envSlackSigningSecret() { return raw('SLACK_SIGNING_SECRET'); }
|
|
133
141
|
export function envSlackSigningSecretPrevious() { return raw('SLACK_SIGNING_SECRET_PREVIOUS'); }
|
|
134
142
|
export function envSlackAllowUnknownTeamFallback() { return isOne('SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK'); }
|
|
135
|
-
export function
|
|
136
|
-
export function
|
|
137
|
-
export function
|
|
138
|
-
export function
|
|
143
|
+
export function envGitHubToken() { return raw('GITHUB_TOKEN'); }
|
|
144
|
+
export function envGitHubWebhookSecret() { return raw('GITHUB_WEBHOOK_SECRET'); }
|
|
145
|
+
export function envGitHubWebhookSecretPrevious() { return raw('GITHUB_WEBHOOK_SECRET_PREVIOUS'); }
|
|
146
|
+
export function envGitHubAllowUnknownInstallationFallback() { return isOne('GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK'); }
|
|
139
147
|
//# sourceMappingURL=env.js.map
|
package/dist/util/home-path.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
|
|
1
|
+
/** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
|
|
2
|
+
* mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
|
|
2
3
|
export declare const USER_SEGMENT: readonly RegExp[];
|
|
3
4
|
/** `text` with each home-directory segment replaced by `[home]`. */
|
|
4
5
|
export declare function maskHomePaths(text: string): string;
|
package/dist/util/home-path.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// VS Code writes file links URL-encoded, so a separator may be %5C or %2F.
|
|
3
3
|
const WIN_SEP = String.raw `(?:[\\/]|%5[Cc]|%2[Ff])`;
|
|
4
4
|
const WIN_CHAR = String.raw `(?:(?!%5[Cc]|%2[Ff])[^\\/:*?"<>|\s])`;
|
|
5
|
-
// A Windows name never holds a quote, so JSON stops it; one with spaces runs to a separator, quote,
|
|
5
|
+
// A Windows name never holds a quote, so JSON stops it; one with spaces runs to a separator, quote,
|
|
6
|
+
// closing mark or line end, leaving the mark, as stopping at its first word leaks the surname.
|
|
6
7
|
const WIN_USER = String.raw `(?:${WIN_CHAR}+(?: ${WIN_CHAR}+){0,3}(?=${WIN_SEP}|["'\`)\]>,;]|\.(?=\s|$)|(?<!\.)(?:[^\S ]|$))(?<![\`)\],;'])|${WIN_CHAR}+)`;
|
|
7
8
|
// Slash-led homes with their case spelled out and no flag, so one pattern can hold all four: Git Bash and WSL mounts, Linux, root and macOS.
|
|
8
9
|
const MOUNT_HOME = String.raw `(?:\/[Mm][Nn][Tt])?\/[A-Za-z]\/[Uu][Ss][Ee][Rr][Ss]\/${WIN_USER}`;
|
|
@@ -18,7 +19,8 @@ const MOUNT_START = String.raw `(?<![\w.])${MOUNT_HOME}`;
|
|
|
18
19
|
const LINUX_START = String.raw `(?<![\w.~-])${LINUX_HOME}`;
|
|
19
20
|
const ROOT_START = String.raw `(?<![\w.~-])${ROOT_HOME}`;
|
|
20
21
|
const MAC_START = String.raw `(?<![\w.~-])${MAC_HOME}`;
|
|
21
|
-
/** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
|
|
22
|
+
/** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
|
|
23
|
+
* mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
|
|
22
24
|
export const USER_SEGMENT = [
|
|
23
25
|
DRIVE_HOME,
|
|
24
26
|
new RegExp(MOUNT_START),
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
|
|
2
|
+
export declare function hookPayloadSessionId(stdinText: string | undefined, requiredSource?: string | null): string | null;
|
|
3
|
+
/** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
|
|
4
|
+
export declare function hookPayloadString(stdinText: string | undefined, field: string): string | null;
|
|
5
|
+
/** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
|
|
6
|
+
* Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
|
|
7
|
+
export declare function isSubagentPayload(stdinText: string | undefined): boolean;
|
|
8
|
+
//# sourceMappingURL=hook-payload.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isJsonObjectLiteral, isJsonString } from './json.js';
|
|
2
|
+
/** A Claude Code hook payload on stdin as a JSON object; null when empty, malformed or not an object. */
|
|
3
|
+
function parseHookPayload(stdinText) {
|
|
4
|
+
if (!stdinText || stdinText.trim() === '')
|
|
5
|
+
return null;
|
|
6
|
+
try {
|
|
7
|
+
// SAFETY: JSON.parse returns a JSON value by definition.
|
|
8
|
+
const payload = JSON.parse(stdinText.trim());
|
|
9
|
+
return isJsonObjectLiteral(payload) ? payload : null;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// Malformed is one of the null cases the docblock names.
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
|
|
17
|
+
export function hookPayloadSessionId(stdinText, requiredSource = null) {
|
|
18
|
+
const payload = parseHookPayload(stdinText);
|
|
19
|
+
const sessionId = payload?.session_id;
|
|
20
|
+
if (!payload || !isJsonString(sessionId) || sessionId.trim() === '')
|
|
21
|
+
return null;
|
|
22
|
+
if (requiredSource !== null && payload.source !== requiredSource)
|
|
23
|
+
return null;
|
|
24
|
+
return sessionId;
|
|
25
|
+
}
|
|
26
|
+
/** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
|
|
27
|
+
export function hookPayloadString(stdinText, field) {
|
|
28
|
+
const value = parseHookPayload(stdinText)?.[field];
|
|
29
|
+
return isJsonString(value) ? value : null;
|
|
30
|
+
}
|
|
31
|
+
/** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
|
|
32
|
+
* Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
|
|
33
|
+
export function isSubagentPayload(stdinText) {
|
|
34
|
+
const agentId = parseHookPayload(stdinText)?.agent_id;
|
|
35
|
+
return isJsonString(agentId) && agentId.trim() !== '';
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=hook-payload.js.map
|
|
@@ -4,6 +4,8 @@ export interface RetryPolicy {
|
|
|
4
4
|
timeoutMs: number;
|
|
5
5
|
/** Total attempts including the first. */
|
|
6
6
|
attempts?: number;
|
|
7
|
+
/** Limit on the whole call, waits included: an attempt is cut short at it and no retry starts whose wait would reach it. */
|
|
8
|
+
totalMs?: number;
|
|
7
9
|
baseDelayMs?: number;
|
|
8
10
|
/** A Retry-After longer than this hands the response back, so a caller with its own long pause keeps it. */
|
|
9
11
|
maxDelayMs?: number;
|
|
@@ -12,16 +14,22 @@ export interface RetryPolicy {
|
|
|
12
14
|
/** Also retry a dropped connection or a timed-out attempt. On for GET and HEAD; any other method turns it on only when a replay cannot commit twice. */
|
|
13
15
|
retryTransport?: boolean;
|
|
14
16
|
fetchFn?: typeof fetch;
|
|
17
|
+
/** Replaces the timer between attempts. A caller `signal` that aborts still ends the wait at once. */
|
|
15
18
|
sleep?: (ms: number) => Promise<void>;
|
|
16
19
|
random?: () => number;
|
|
20
|
+
/** Replaces the clock `totalMs` is measured on. */
|
|
21
|
+
now?: () => number;
|
|
17
22
|
}
|
|
18
23
|
/** LLM calls (consolidation refine, DAG summaries, fact extraction) share one budget; `HIPPO_LLM_TIMEOUT_MS` overrides it. */
|
|
19
24
|
export declare function llmTimeoutMs(): number;
|
|
25
|
+
/** One LLM call with its retries: two full attempts and the longest wait between them, where three slow failures would hold a sleep for 3x the timeout. */
|
|
26
|
+
export declare function llmTotalMs(): number;
|
|
20
27
|
export declare function isRetryableStatus(status: number): boolean;
|
|
21
28
|
/** Retry-After as milliseconds: delta-seconds or an HTTP date; null when absent or unreadable. */
|
|
22
29
|
export declare function parseRetryAfterMs(header: string | null, now?: number): number | null;
|
|
23
30
|
/** A dropped connection, a DNS hiccup or a timed-out attempt: faults a second try can clear. A refused connection is not one. */
|
|
24
31
|
export declare function isTransientTransportError<E>(err: E): boolean;
|
|
25
|
-
/** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
|
|
32
|
+
/** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
|
|
33
|
+
* `retryTransport`) transport faults; the last response or error comes back as is. */
|
|
26
34
|
export declare function fetchWithRetry(url: string | URL, init: RequestInit, policy: RetryPolicy): Promise<Response>;
|
|
27
35
|
//# sourceMappingURL=http-retry.d.ts.map
|
package/dist/util/http-retry.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/** One retry policy for outbound HTTP: a timeout on every attempt, backoff on 429 and 5xx, and on a dropped connection where a replay is safe. */
|
|
2
|
+
import { MINUTE_MS } from './time.js';
|
|
2
3
|
import { envLlmTimeoutMs } from './env.js';
|
|
4
|
+
import { errorCode, errorFields, log } from './log.js';
|
|
3
5
|
const DEFAULT_ATTEMPTS = 3;
|
|
4
6
|
const DEFAULT_BASE_DELAY_MS = 250;
|
|
5
7
|
const DEFAULT_MAX_DELAY_MS = 8_000;
|
|
6
|
-
const DEFAULT_LLM_TIMEOUT_MS =
|
|
8
|
+
const DEFAULT_LLM_TIMEOUT_MS = MINUTE_MS;
|
|
7
9
|
/** LLM calls (consolidation refine, DAG summaries, fact extraction) share one budget; `HIPPO_LLM_TIMEOUT_MS` overrides it. */
|
|
8
10
|
export function llmTimeoutMs() {
|
|
9
11
|
return envLlmTimeoutMs() ?? DEFAULT_LLM_TIMEOUT_MS;
|
|
10
12
|
}
|
|
13
|
+
/** One LLM call with its retries: two full attempts and the longest wait between them, where three slow failures would hold a sleep for 3x the timeout. */
|
|
14
|
+
export function llmTotalMs() {
|
|
15
|
+
return 2 * llmTimeoutMs() + DEFAULT_MAX_DELAY_MS;
|
|
16
|
+
}
|
|
11
17
|
export function isRetryableStatus(status) {
|
|
12
18
|
return status === 429 || (status >= 500 && status <= 599);
|
|
13
19
|
}
|
|
@@ -39,24 +45,64 @@ function isIdempotent(method) {
|
|
|
39
45
|
const verb = (method ?? 'GET').toUpperCase();
|
|
40
46
|
return verb === 'GET' || verb === 'HEAD';
|
|
41
47
|
}
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
/** Host plus pathname only: a query string can carry a key. */
|
|
49
|
+
function redactedTarget(url) {
|
|
50
|
+
try {
|
|
51
|
+
const u = new URL(url);
|
|
52
|
+
return `${u.host}${u.pathname}`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 'unparseable-url';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function logRetry(init, url, reason, attempt, attempts, delayMs) {
|
|
59
|
+
// Debug: an attempt that may still succeed is not a warning, and the caller reports the final failure.
|
|
60
|
+
log.debug('http retry', {
|
|
61
|
+
method: (init.method ?? 'GET').toUpperCase(), target: redactedTarget(url), reason, attempt: `${attempt}/${attempts}`, delayMs: Math.round(delayMs),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// `cancel` clears the timer, so a wait the caller left does not keep the process alive.
|
|
65
|
+
const timerSleep = (ms, cancel) => new Promise((resolve) => {
|
|
66
|
+
const timer = setTimeout(resolve, ms);
|
|
67
|
+
cancel?.addEventListener('abort', () => clearTimeout(timer), { once: true });
|
|
68
|
+
});
|
|
69
|
+
/** The wait between attempts. With a caller signal it ends the moment that signal aborts and rejects with its reason, so no further attempt starts. */
|
|
70
|
+
async function backoffWait(ms, sleep, signal) {
|
|
71
|
+
if (!signal)
|
|
72
|
+
return (sleep ?? timerSleep)(ms);
|
|
73
|
+
signal.throwIfAborted();
|
|
74
|
+
const left = new AbortController();
|
|
75
|
+
const aborted = new Promise((_resolve, reject) => {
|
|
76
|
+
signal.addEventListener('abort', () => reject(signal.reason), { once: true, signal: left.signal });
|
|
77
|
+
});
|
|
78
|
+
try {
|
|
79
|
+
// An injected sleep cannot be cancelled, so it is raced and left to run out.
|
|
80
|
+
await Promise.race([sleep ? sleep(ms) : timerSleep(ms, left.signal), aborted]);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
left.abort();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
|
|
87
|
+
* `retryTransport`) transport faults; the last response or error comes back as is. */
|
|
44
88
|
export async function fetchWithRetry(url, init, policy) {
|
|
45
89
|
const fetchFn = policy.fetchFn ?? fetch;
|
|
46
90
|
const attempts = Math.max(1, policy.attempts ?? DEFAULT_ATTEMPTS);
|
|
47
91
|
const baseDelayMs = policy.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
48
92
|
const maxDelayMs = policy.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
49
|
-
const sleep = policy.sleep ?? realSleep;
|
|
50
93
|
const random = policy.random ?? Math.random;
|
|
51
94
|
const retryOn = policy.retryOn ?? ((res) => isRetryableStatus(res.status));
|
|
52
95
|
const retryTransport = policy.retryTransport ?? isIdempotent(init.method);
|
|
96
|
+
const now = policy.now ?? Date.now;
|
|
97
|
+
const deadline = policy.totalMs === undefined ? Infinity : now() + policy.totalMs;
|
|
98
|
+
const fitsBudget = (delayMs) => now() + delayMs < deadline;
|
|
53
99
|
// Jitter over the upper half keeps parallel callers from retrying in lockstep.
|
|
54
100
|
const backoffMs = (attempt) => {
|
|
55
101
|
const ceiling = Math.min(maxDelayMs, baseDelayMs * 2 ** (attempt - 1));
|
|
56
102
|
return ceiling / 2 + random() * (ceiling / 2);
|
|
57
103
|
};
|
|
58
104
|
for (let attempt = 1;; attempt++) {
|
|
59
|
-
const timeout = AbortSignal.timeout(policy.timeoutMs);
|
|
105
|
+
const timeout = AbortSignal.timeout(Math.max(1, Math.min(policy.timeoutMs, deadline - now())));
|
|
60
106
|
const signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
|
|
61
107
|
let res;
|
|
62
108
|
try {
|
|
@@ -66,7 +112,11 @@ export async function fetchWithRetry(url, init, policy) {
|
|
|
66
112
|
// The caller's own abort is a decision, not a fault, so it ends the call.
|
|
67
113
|
if (!retryTransport || attempt >= attempts || init.signal?.aborted || !isTransientTransportError(err))
|
|
68
114
|
throw err;
|
|
69
|
-
|
|
115
|
+
const delay = backoffMs(attempt);
|
|
116
|
+
if (!fitsBudget(delay))
|
|
117
|
+
throw err;
|
|
118
|
+
logRetry(init, url, errorCode(err) || (err instanceof Error ? err.name : 'transport'), attempt, attempts, delay);
|
|
119
|
+
await backoffWait(delay, policy.sleep, init.signal);
|
|
70
120
|
continue;
|
|
71
121
|
}
|
|
72
122
|
if (!retryOn(res) || attempt >= attempts)
|
|
@@ -74,9 +124,18 @@ export async function fetchWithRetry(url, init, policy) {
|
|
|
74
124
|
const retryAfter = parseRetryAfterMs(res.headers.get('retry-after'));
|
|
75
125
|
if (retryAfter !== null && retryAfter > maxDelayMs)
|
|
76
126
|
return res;
|
|
127
|
+
const delay = retryAfter ?? backoffMs(attempt);
|
|
128
|
+
if (!fitsBudget(delay))
|
|
129
|
+
return res;
|
|
77
130
|
// Frees the pooled socket before the next attempt.
|
|
78
|
-
|
|
79
|
-
|
|
131
|
+
try {
|
|
132
|
+
await res.body?.cancel();
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
log.debug('http retry: body cancel failed', errorFields(err));
|
|
136
|
+
}
|
|
137
|
+
logRetry(init, url, `status ${res.status}`, attempt, attempts, delay);
|
|
138
|
+
await backoffWait(delay, policy.sleep, init.signal);
|
|
80
139
|
}
|
|
81
140
|
}
|
|
82
141
|
//# sourceMappingURL=http-retry.js.map
|
package/dist/util/http-util.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
export declare function isHeaderString(value: string | string[] | undefined): value is string;
|
|
3
3
|
export declare const MAX_BODY_BYTES: number;
|
|
4
|
-
export declare const MAX_ID_LEN = 256;
|
|
5
4
|
export declare const JSON_HEADERS: {
|
|
6
5
|
readonly 'content-type': "application/json";
|
|
7
6
|
};
|
|
@@ -21,16 +20,9 @@ export declare class BodyTooLargeError extends Error {
|
|
|
21
20
|
/** The body did not arrive in time. Its own class so mapApiError answers 408 and the server drops the socket. */
|
|
22
21
|
export declare class BodyTimeoutError extends Error {
|
|
23
22
|
}
|
|
24
|
-
/** The status and client-facing message for one failed request. */
|
|
25
|
-
export interface ApiErrorReply {
|
|
26
|
-
status: number;
|
|
27
|
-
message: string;
|
|
28
|
-
}
|
|
29
23
|
export declare const INTERNAL_ERROR_MESSAGE = "internal server error";
|
|
30
24
|
/** The reply when a request under another store reaches code that still opens hippo.db. */
|
|
31
25
|
export declare const STORE_NOT_PORTED_MESSAGE = "store_not_ported";
|
|
32
|
-
/** Maps by class so rewording a message never moves a status; an untyped error is a 500 whose text stays in the server log. */
|
|
33
|
-
export declare function mapApiError<E>(err: E): ApiErrorReply;
|
|
34
26
|
/** Serialises before the head goes out, so a body that is not JSON still reaches the caller's error reply. */
|
|
35
27
|
export declare function sendJson<T>(res: ServerResponse, status: number, body: T): void;
|
|
36
28
|
/** How long any route waits for a request body, so a client that sends headers and then stalls cannot hold a request open: 30 s, or HIPPO_BODY_TIMEOUT_MS. */
|