hippo-memory 1.69.0 → 1.71.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- 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 +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- 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 +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- 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/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- 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 +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- 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 +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- 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 +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → 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 +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- 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/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Home-directory paths name their user, so text bound for a shared store tests or masks them here; no imports keep it light.
|
|
2
|
+
// VS Code writes file links URL-encoded, so a separator may be %5C or %2F.
|
|
3
|
+
const WIN_SEP = String.raw `(?:[\\/]|%5[Cc]|%2[Ff])`;
|
|
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,
|
|
6
|
+
// closing mark or line end, leaving the mark, as stopping at its first word leaks the surname.
|
|
7
|
+
const WIN_USER = String.raw `(?:${WIN_CHAR}+(?: ${WIN_CHAR}+){0,3}(?=${WIN_SEP}|["'\`)\]>,;]|\.(?=\s|$)|(?<!\.)(?:[^\S ]|$))(?<![\`)\],;'])|${WIN_CHAR}+)`;
|
|
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.
|
|
9
|
+
const MOUNT_HOME = String.raw `(?:\/[Mm][Nn][Tt])?\/[A-Za-z]\/[Uu][Ss][Ee][Rr][Ss]\/${WIN_USER}`;
|
|
10
|
+
const LINUX_HOME = String.raw `(?:\/var)?\/home\/[^/\s]+`;
|
|
11
|
+
const ROOT_HOME = String.raw `(?:\/var)?\/root(?![\w.-])`;
|
|
12
|
+
const MAC_HOME = String.raw `\/Users\/[^/\s]+`;
|
|
13
|
+
const DRIVE_HOME = new RegExp(String.raw `[A-Za-z](?::|%3A)${WIN_SEP}+(?:Users|Documents and Settings)${WIN_SEP}+${WIN_USER}`, 'i');
|
|
14
|
+
const LONG_PATH = /\\\\\?\\/;
|
|
15
|
+
const SHARE_HOME = new RegExp(String.raw `\\\\[^\\/\s]+\\+(?:homes?|users|profiles?)\$?\\+${WIN_USER}`, 'i');
|
|
16
|
+
const SHORT_NAME = /[\\/][A-Z0-9_$]{1,6}~\d{1,6}(?:\.[A-Z0-9]{1,3})?(?![\w~])|\b[A-Z0-9_$]{1,6}~\d{1,6}(?:\.[A-Z0-9]{1,3})?[\\/]/;
|
|
17
|
+
// A slash-led home counts only at the start of a path, so each takes a guard against the text before it.
|
|
18
|
+
const MOUNT_START = String.raw `(?<![\w.])${MOUNT_HOME}`;
|
|
19
|
+
const LINUX_START = String.raw `(?<![\w.~-])${LINUX_HOME}`;
|
|
20
|
+
const ROOT_START = String.raw `(?<![\w.~-])${ROOT_HOME}`;
|
|
21
|
+
const MAC_START = String.raw `(?<![\w.~-])${MAC_HOME}`;
|
|
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. */
|
|
24
|
+
export const USER_SEGMENT = [
|
|
25
|
+
DRIVE_HOME,
|
|
26
|
+
new RegExp(MOUNT_START),
|
|
27
|
+
LONG_PATH,
|
|
28
|
+
SHARE_HOME,
|
|
29
|
+
new RegExp(LINUX_START),
|
|
30
|
+
new RegExp(ROOT_START),
|
|
31
|
+
new RegExp(MAC_START),
|
|
32
|
+
SHORT_NAME,
|
|
33
|
+
];
|
|
34
|
+
const MASK = '[home]';
|
|
35
|
+
// Global copies, so the shared test patterns keep their lastIndex at 0.
|
|
36
|
+
const allOf = (re) => new RegExp(re.source, `${re.flags}g`);
|
|
37
|
+
const [DRIVE_HOMES, LONG_PATHS, SHARE_HOMES, SHORT_NAMES] = [DRIVE_HOME, LONG_PATH, SHARE_HOME, SHORT_NAME].map(allOf);
|
|
38
|
+
// A home glued after another starts where a mask will end, which no guard refuses: one match takes the whole run, as masking one a pass costs a pass per home.
|
|
39
|
+
// A run holds only shapes whose own step is not still to come, so a later step meets the same text it would without the run.
|
|
40
|
+
const runFrom = (start, ...glued) => new RegExp(`${start}(?:${glued.join('|')})*`, 'g');
|
|
41
|
+
const MOUNT_RUNS = runFrom(MOUNT_START, MOUNT_HOME);
|
|
42
|
+
const LINUX_RUNS = runFrom(LINUX_START, MOUNT_HOME, LINUX_HOME);
|
|
43
|
+
const ROOT_RUNS = runFrom(ROOT_START, MOUNT_HOME, LINUX_HOME, ROOT_HOME);
|
|
44
|
+
const MAC_RUNS = runFrom(MAC_START, MOUNT_HOME, LINUX_HOME, ROOT_HOME, MAC_HOME);
|
|
45
|
+
const SLASH_HOMES = new RegExp(`${MOUNT_HOME}|${LINUX_HOME}|${ROOT_HOME}|${MAC_HOME}`, 'g');
|
|
46
|
+
const maskRun = (run) => MASK.repeat(run.match(SLASH_HOMES)?.length ?? 1);
|
|
47
|
+
function maskOnce(text) {
|
|
48
|
+
return text
|
|
49
|
+
.replace(DRIVE_HOMES, MASK)
|
|
50
|
+
.replace(MOUNT_RUNS, maskRun)
|
|
51
|
+
.replace(LONG_PATHS, MASK)
|
|
52
|
+
.replace(SHARE_HOMES, MASK)
|
|
53
|
+
.replace(LINUX_RUNS, maskRun)
|
|
54
|
+
.replace(ROOT_RUNS, maskRun)
|
|
55
|
+
.replace(MAC_RUNS, maskRun)
|
|
56
|
+
.replace(SHORT_NAMES, MASK);
|
|
57
|
+
}
|
|
58
|
+
/** `text` with each home-directory segment replaced by `[home]`. */
|
|
59
|
+
export function maskHomePaths(text) {
|
|
60
|
+
let out = text;
|
|
61
|
+
let next = maskOnce(out);
|
|
62
|
+
// A mask can uncover a home path its text was hiding, so passes repeat until one changes nothing; each takes a separator out, so they end.
|
|
63
|
+
while (next !== out) {
|
|
64
|
+
out = next;
|
|
65
|
+
next = maskOnce(out);
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=home-path.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** One retry policy for outbound HTTP: a timeout on every attempt,
|
|
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
2
|
export interface RetryPolicy {
|
|
3
3
|
/** Per-attempt limit; a stalled peer ends as a thrown `TimeoutError`, never a hang. */
|
|
4
4
|
timeoutMs: number;
|
|
@@ -9,7 +9,10 @@ export interface RetryPolicy {
|
|
|
9
9
|
maxDelayMs?: number;
|
|
10
10
|
/** Which responses to retry; defaults to 429 and 5xx. A write narrows it to answers that prove nothing committed. */
|
|
11
11
|
retryOn?: (res: Response) => boolean;
|
|
12
|
+
/** 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
|
+
retryTransport?: boolean;
|
|
12
14
|
fetchFn?: typeof fetch;
|
|
15
|
+
/** Replaces the timer between attempts. A caller `signal` that aborts still ends the wait at once. */
|
|
13
16
|
sleep?: (ms: number) => Promise<void>;
|
|
14
17
|
random?: () => number;
|
|
15
18
|
}
|
|
@@ -18,6 +21,9 @@ export declare function llmTimeoutMs(): number;
|
|
|
18
21
|
export declare function isRetryableStatus(status: number): boolean;
|
|
19
22
|
/** Retry-After as milliseconds: delta-seconds or an HTTP date; null when absent or unreadable. */
|
|
20
23
|
export declare function parseRetryAfterMs(header: string | null, now?: number): number | null;
|
|
21
|
-
/**
|
|
24
|
+
/** A dropped connection, a DNS hiccup or a timed-out attempt: faults a second try can clear. A refused connection is not one. */
|
|
25
|
+
export declare function isTransientTransportError<E>(err: E): boolean;
|
|
26
|
+
/** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
|
|
27
|
+
* `retryTransport`) transport faults; the last response or error comes back as is. */
|
|
22
28
|
export declare function fetchWithRetry(url: string | URL, init: RequestInit, policy: RetryPolicy): Promise<Response>;
|
|
23
29
|
//# sourceMappingURL=http-retry.d.ts.map
|
|
@@ -0,0 +1,103 @@
|
|
|
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 { envLlmTimeoutMs } from './env.js';
|
|
3
|
+
const DEFAULT_ATTEMPTS = 3;
|
|
4
|
+
const DEFAULT_BASE_DELAY_MS = 250;
|
|
5
|
+
const DEFAULT_MAX_DELAY_MS = 8_000;
|
|
6
|
+
const DEFAULT_LLM_TIMEOUT_MS = 60_000;
|
|
7
|
+
/** LLM calls (consolidation refine, DAG summaries, fact extraction) share one budget; `HIPPO_LLM_TIMEOUT_MS` overrides it. */
|
|
8
|
+
export function llmTimeoutMs() {
|
|
9
|
+
return envLlmTimeoutMs() ?? DEFAULT_LLM_TIMEOUT_MS;
|
|
10
|
+
}
|
|
11
|
+
export function isRetryableStatus(status) {
|
|
12
|
+
return status === 429 || (status >= 500 && status <= 599);
|
|
13
|
+
}
|
|
14
|
+
/** Retry-After as milliseconds: delta-seconds or an HTTP date; null when absent or unreadable. */
|
|
15
|
+
export function parseRetryAfterMs(header, now = Date.now()) {
|
|
16
|
+
if (header === null || header.trim() === '')
|
|
17
|
+
return null;
|
|
18
|
+
const seconds = Number(header);
|
|
19
|
+
if (Number.isFinite(seconds))
|
|
20
|
+
return Math.max(0, seconds * 1000);
|
|
21
|
+
const at = Date.parse(header);
|
|
22
|
+
return Number.isNaN(at) ? null : Math.max(0, at - now);
|
|
23
|
+
}
|
|
24
|
+
// Node's fetch reports a broken socket as a bare `fetch failed` with one of these on its cause.
|
|
25
|
+
const TRANSIENT_CODES = new Set([
|
|
26
|
+
'ECONNRESET', 'ETIMEDOUT', 'EAI_AGAIN', 'UND_ERR_SOCKET', 'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_HEADERS_TIMEOUT',
|
|
27
|
+
]);
|
|
28
|
+
/** A dropped connection, a DNS hiccup or a timed-out attempt: faults a second try can clear. A refused connection is not one. */
|
|
29
|
+
export function isTransientTransportError(err) {
|
|
30
|
+
if (!(err instanceof Error))
|
|
31
|
+
return false;
|
|
32
|
+
if (err.name === 'TimeoutError')
|
|
33
|
+
return true;
|
|
34
|
+
const holder = err.cause instanceof Object ? err.cause : err;
|
|
35
|
+
const code = 'code' in holder ? String(holder.code) : '';
|
|
36
|
+
return TRANSIENT_CODES.has(code) || err.message.toLowerCase().includes('socket hang up');
|
|
37
|
+
}
|
|
38
|
+
function isIdempotent(method) {
|
|
39
|
+
const verb = (method ?? 'GET').toUpperCase();
|
|
40
|
+
return verb === 'GET' || verb === 'HEAD';
|
|
41
|
+
}
|
|
42
|
+
// `cancel` clears the timer, so a wait the caller left does not keep the process alive.
|
|
43
|
+
const timerSleep = (ms, cancel) => new Promise((resolve) => {
|
|
44
|
+
const timer = setTimeout(resolve, ms);
|
|
45
|
+
cancel?.addEventListener('abort', () => clearTimeout(timer), { once: true });
|
|
46
|
+
});
|
|
47
|
+
/** 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. */
|
|
48
|
+
async function backoffWait(ms, sleep, signal) {
|
|
49
|
+
if (!signal)
|
|
50
|
+
return (sleep ?? timerSleep)(ms);
|
|
51
|
+
signal.throwIfAborted();
|
|
52
|
+
const left = new AbortController();
|
|
53
|
+
const aborted = new Promise((_resolve, reject) => {
|
|
54
|
+
signal.addEventListener('abort', () => reject(signal.reason), { once: true, signal: left.signal });
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
// An injected sleep cannot be cancelled, so it is raced and left to run out.
|
|
58
|
+
await Promise.race([sleep ? sleep(ms) : timerSleep(ms, left.signal), aborted]);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
left.abort();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
|
|
65
|
+
* `retryTransport`) transport faults; the last response or error comes back as is. */
|
|
66
|
+
export async function fetchWithRetry(url, init, policy) {
|
|
67
|
+
const fetchFn = policy.fetchFn ?? fetch;
|
|
68
|
+
const attempts = Math.max(1, policy.attempts ?? DEFAULT_ATTEMPTS);
|
|
69
|
+
const baseDelayMs = policy.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
70
|
+
const maxDelayMs = policy.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
71
|
+
const random = policy.random ?? Math.random;
|
|
72
|
+
const retryOn = policy.retryOn ?? ((res) => isRetryableStatus(res.status));
|
|
73
|
+
const retryTransport = policy.retryTransport ?? isIdempotent(init.method);
|
|
74
|
+
// Jitter over the upper half keeps parallel callers from retrying in lockstep.
|
|
75
|
+
const backoffMs = (attempt) => {
|
|
76
|
+
const ceiling = Math.min(maxDelayMs, baseDelayMs * 2 ** (attempt - 1));
|
|
77
|
+
return ceiling / 2 + random() * (ceiling / 2);
|
|
78
|
+
};
|
|
79
|
+
for (let attempt = 1;; attempt++) {
|
|
80
|
+
const timeout = AbortSignal.timeout(policy.timeoutMs);
|
|
81
|
+
const signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
|
|
82
|
+
let res;
|
|
83
|
+
try {
|
|
84
|
+
res = await fetchFn(url, { ...init, signal });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// The caller's own abort is a decision, not a fault, so it ends the call.
|
|
88
|
+
if (!retryTransport || attempt >= attempts || init.signal?.aborted || !isTransientTransportError(err))
|
|
89
|
+
throw err;
|
|
90
|
+
await backoffWait(backoffMs(attempt), policy.sleep, init.signal);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (!retryOn(res) || attempt >= attempts)
|
|
94
|
+
return res;
|
|
95
|
+
const retryAfter = parseRetryAfterMs(res.headers.get('retry-after'));
|
|
96
|
+
if (retryAfter !== null && retryAfter > maxDelayMs)
|
|
97
|
+
return res;
|
|
98
|
+
// Frees the pooled socket before the next attempt.
|
|
99
|
+
await res.body?.cancel();
|
|
100
|
+
await backoffWait(retryAfter ?? backoffMs(attempt), policy.sleep, init.signal);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=http-retry.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import type { JsonValue } from './json.js';
|
|
3
|
-
export declare function isJsonObjectRecord(value: JsonValue | undefined): value is Record<string, JsonValue>;
|
|
4
2
|
export declare function isHeaderString(value: string | string[] | undefined): value is string;
|
|
3
|
+
export declare const MAX_BODY_BYTES: number;
|
|
5
4
|
export declare const MAX_ID_LEN = 256;
|
|
6
5
|
export declare const JSON_HEADERS: {
|
|
7
6
|
readonly 'content-type': "application/json";
|
|
@@ -12,6 +11,11 @@ export declare class HttpError extends Error {
|
|
|
12
11
|
readonly retryAfterSec: number | undefined;
|
|
13
12
|
constructor(status: number, message: string, retryAfterSec?: number);
|
|
14
13
|
}
|
|
14
|
+
/** A request, or a store call it waited on, ran past the request's deadline; the reply carries `code` so a client branches without parsing prose. */
|
|
15
|
+
export declare class DeadlineExceededError extends HttpError {
|
|
16
|
+
readonly code = "deadline_exceeded";
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
15
19
|
export declare class BodyTooLargeError extends Error {
|
|
16
20
|
}
|
|
17
21
|
/** The body did not arrive in time. Its own class so mapApiError answers 408 and the server drops the socket. */
|
|
@@ -29,10 +33,12 @@ export declare const STORE_NOT_PORTED_MESSAGE = "store_not_ported";
|
|
|
29
33
|
export declare function mapApiError<E>(err: E): ApiErrorReply;
|
|
30
34
|
/** Serialises before the head goes out, so a body that is not JSON still reaches the caller's error reply. */
|
|
31
35
|
export declare function sendJson<T>(res: ServerResponse, status: number, body: T): void;
|
|
36
|
+
/** 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. */
|
|
37
|
+
export declare function bodyDeadlineMs(): number;
|
|
32
38
|
export interface ReadBodyOpts {
|
|
33
39
|
/** Defaults to 1 MB. */
|
|
34
40
|
maxBytes?: number;
|
|
35
|
-
/** Fails with BodyTimeoutError when the whole body has not arrived by then;
|
|
41
|
+
/** Fails with BodyTimeoutError when the whole body has not arrived by then; defaults to bodyDeadlineMs(). */
|
|
36
42
|
deadlineMs?: number;
|
|
37
43
|
}
|
|
38
44
|
/** The body as text, refused mid-stream past maxBytes and past deadlineMs, so an oversized or slow sender cannot tie up the server. */
|
|
@@ -47,6 +53,11 @@ export interface WebhookRequest {
|
|
|
47
53
|
res: ServerResponse;
|
|
48
54
|
opts: {
|
|
49
55
|
hippoRoot: string;
|
|
56
|
+
webhookBodyDeadlineMs?: number;
|
|
50
57
|
};
|
|
51
58
|
}
|
|
59
|
+
/** Call before refusing a webhook unread: a caller still sending its body loses the socket once the reply is out, as it does after a 413. */
|
|
60
|
+
export declare function closeIfBodyUnread({ req, res }: WebhookRequest): void;
|
|
61
|
+
/** A webhook's raw body, exactly as sent, for the receiver's HMAC check; call it only once a secret is configured and the signature headers are present. */
|
|
62
|
+
export declare function readWebhookBody({ req, opts }: WebhookRequest): Promise<string>;
|
|
52
63
|
//# sourceMappingURL=http-util.d.ts.map
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { ApiError } from '
|
|
2
|
-
import { SqliteBlockedError } from './
|
|
1
|
+
import { ApiError } from '../core/api-errors.js';
|
|
2
|
+
import { SqliteBlockedError } from './sqlite-blocked.js';
|
|
3
|
+
import { envBodyTimeoutMs } from './env.js';
|
|
3
4
|
// Leaf module shared by server.ts and the connector webhook receivers; it must not import either.
|
|
4
|
-
export function isJsonObjectRecord(value) {
|
|
5
|
-
return value !== undefined && value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
6
|
-
}
|
|
7
5
|
// node:http header values are `string | string[] | undefined` (never a bare
|
|
8
6
|
// unknown), so this gets its own predicate rather than reusing isJsonString.
|
|
9
7
|
export function isHeaderString(value) {
|
|
@@ -11,7 +9,7 @@ export function isHeaderString(value) {
|
|
|
11
9
|
}
|
|
12
10
|
// 1 MB body cap. The CLI never sends payloads near this; anything bigger is
|
|
13
11
|
// almost certainly a misconfigured client or a deliberate memory-blowup attempt.
|
|
14
|
-
const MAX_BODY_BYTES = 1024 * 1024;
|
|
12
|
+
export const MAX_BODY_BYTES = 1024 * 1024;
|
|
15
13
|
function sizeLabel(bytes) {
|
|
16
14
|
return bytes % (1024 * 1024) === 0 ? `${bytes / (1024 * 1024)}MB` : `${Math.ceil(bytes / 1024)}KB`;
|
|
17
15
|
}
|
|
@@ -30,6 +28,13 @@ export class HttpError extends Error {
|
|
|
30
28
|
this.retryAfterSec = retryAfterSec;
|
|
31
29
|
}
|
|
32
30
|
}
|
|
31
|
+
/** A request, or a store call it waited on, ran past the request's deadline; the reply carries `code` so a client branches without parsing prose. */
|
|
32
|
+
export class DeadlineExceededError extends HttpError {
|
|
33
|
+
code = 'deadline_exceeded';
|
|
34
|
+
constructor(message) {
|
|
35
|
+
super(504, message);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
33
38
|
export class BodyTooLargeError extends Error {
|
|
34
39
|
}
|
|
35
40
|
/** The body did not arrive in time. Its own class so mapApiError answers 408 and the server drops the socket. */
|
|
@@ -62,12 +67,16 @@ export function sendJson(res, status, body) {
|
|
|
62
67
|
res.writeHead(status, JSON_HEADERS);
|
|
63
68
|
res.end(text);
|
|
64
69
|
}
|
|
70
|
+
const DEFAULT_BODY_DEADLINE_MS = 30_000;
|
|
71
|
+
/** 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. */
|
|
72
|
+
export function bodyDeadlineMs() {
|
|
73
|
+
return envBodyTimeoutMs() ?? DEFAULT_BODY_DEADLINE_MS;
|
|
74
|
+
}
|
|
65
75
|
/** The body as text, refused mid-stream past maxBytes and past deadlineMs, so an oversized or slow sender cannot tie up the server. */
|
|
66
|
-
export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs } = {}) {
|
|
76
|
+
export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs = bodyDeadlineMs() } = {}) {
|
|
67
77
|
return new Promise((resolve, reject) => {
|
|
68
78
|
const chunks = [];
|
|
69
79
|
let total = 0;
|
|
70
|
-
let timer;
|
|
71
80
|
const refuse = (err) => {
|
|
72
81
|
clearTimeout(timer);
|
|
73
82
|
req.off('data', onData);
|
|
@@ -83,9 +92,7 @@ export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs } = {}) {
|
|
|
83
92
|
}
|
|
84
93
|
refuse(new BodyTooLargeError(`request body exceeds ${sizeLabel(maxBytes)}`));
|
|
85
94
|
};
|
|
86
|
-
|
|
87
|
-
timer = setTimeout(() => refuse(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
|
|
88
|
-
}
|
|
95
|
+
const timer = setTimeout(() => refuse(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
|
|
89
96
|
req.on('data', onData);
|
|
90
97
|
req.once('end', () => {
|
|
91
98
|
clearTimeout(timer);
|
|
@@ -116,4 +123,17 @@ export function isCrossSite(req) {
|
|
|
116
123
|
const origin = req.headers.origin;
|
|
117
124
|
return origin !== undefined && origin !== `http://${req.headers.host}`;
|
|
118
125
|
}
|
|
126
|
+
// A webhook route takes no key, so anyone holding a signature header could otherwise keep a socket open with a body that never ends.
|
|
127
|
+
const WEBHOOK_BODY_DEADLINE_MS = 10_000;
|
|
128
|
+
/** Call before refusing a webhook unread: a caller still sending its body loses the socket once the reply is out, as it does after a 413. */
|
|
129
|
+
export function closeIfBodyUnread({ req, res }) {
|
|
130
|
+
res.once('finish', () => {
|
|
131
|
+
if (!req.complete)
|
|
132
|
+
closeAfterReply(req);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** A webhook's raw body, exactly as sent, for the receiver's HMAC check; call it only once a secret is configured and the signature headers are present. */
|
|
136
|
+
export function readWebhookBody({ req, opts }) {
|
|
137
|
+
return readBody(req, { deadlineMs: opts.webhookBodyDeadlineMs ?? WEBHOOK_BODY_DEADLINE_MS });
|
|
138
|
+
}
|
|
119
139
|
//# sourceMappingURL=http-util.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
2
|
+
[key: string]: JsonValue;
|
|
3
|
+
};
|
|
4
|
+
export declare function isJsonString(value: JsonValue | undefined): value is string;
|
|
5
|
+
export declare function isJsonNumber(value: JsonValue | undefined): value is number;
|
|
6
|
+
export declare function isJsonBoolean(value: JsonValue | undefined): value is boolean;
|
|
7
|
+
/** A non-null, non-array object. */
|
|
8
|
+
export declare function isJsonObject(value: JsonValue | undefined): value is {
|
|
9
|
+
[key: string]: JsonValue;
|
|
10
|
+
};
|
|
11
|
+
/** Like `isJsonObject`, but also false for an object whose own `constructor` key shadows `Object`. */
|
|
12
|
+
export declare function isJsonObjectLiteral(value: JsonValue | undefined): value is {
|
|
13
|
+
[key: string]: JsonValue;
|
|
14
|
+
};
|
|
15
|
+
/** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
|
|
16
|
+
export declare function readJsonFile(file: string): JsonValue;
|
|
17
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Leaf module: the one value space JSON.parse can produce, so boundary guards narrow a shared type.
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
export function isJsonString(value) {
|
|
4
|
+
return typeof value === 'string';
|
|
5
|
+
}
|
|
6
|
+
export function isJsonNumber(value) {
|
|
7
|
+
return typeof value === 'number';
|
|
8
|
+
}
|
|
9
|
+
export function isJsonBoolean(value) {
|
|
10
|
+
return typeof value === 'boolean';
|
|
11
|
+
}
|
|
12
|
+
/** A non-null, non-array object. */
|
|
13
|
+
export function isJsonObject(value) {
|
|
14
|
+
return value !== undefined && value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
/** Like `isJsonObject`, but also false for an object whose own `constructor` key shadows `Object`. */
|
|
17
|
+
export function isJsonObjectLiteral(value) {
|
|
18
|
+
return value !== undefined && value !== null && !Array.isArray(value) && value.constructor === Object;
|
|
19
|
+
}
|
|
20
|
+
/** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
|
|
21
|
+
export function readJsonFile(file) {
|
|
22
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
23
|
+
return JSON.parse(text.codePointAt(0) === 0xfeff ? text.slice(1) : text);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
1
|
+
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
2
|
+
* debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
|
|
2
3
|
export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
3
|
-
/** Extra key=value pairs appended to the line
|
|
4
|
+
/** Extra key=value pairs appended to the line. `ts` and, inside a request, `requestId` are added to every line written. */
|
|
4
5
|
export interface LogFields {
|
|
6
|
+
ts?: string;
|
|
5
7
|
requestId?: string;
|
|
6
8
|
[key: string]: string | number | boolean | undefined;
|
|
7
9
|
}
|
|
@@ -10,7 +12,9 @@ export declare function logThreshold(): LogLevel;
|
|
|
10
12
|
export declare function isLevelEnabled(level: LogLevel): boolean;
|
|
11
13
|
/** Same `[hippo] ` prefix the existing stderr lines use, so default-level output reads as before. */
|
|
12
14
|
export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
|
|
13
|
-
/**
|
|
15
|
+
/** One JSON object per line for a log collector; JSON escaping keeps a multi-line value on the one line. */
|
|
16
|
+
export declare function formatLogJson(level: LogLevel, message: string, fields?: LogFields): string;
|
|
17
|
+
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
|
|
14
18
|
declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
|
|
15
19
|
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
16
20
|
declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
2
|
-
|
|
1
|
+
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
|
|
2
|
+
* debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
|
|
3
|
+
import { envLogJson, envLogLevel } from './env.js';
|
|
4
|
+
import { currentRequestId } from './request-scope.js';
|
|
3
5
|
const RANK = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
4
6
|
function isLogLevel(value) {
|
|
5
7
|
return Object.hasOwn(RANK, value);
|
|
@@ -22,24 +24,46 @@ export function formatLogLine(level, message, fields = {}) {
|
|
|
22
24
|
.join('');
|
|
23
25
|
return `[hippo] ${level}: ${oneLine(message)}${extras}`;
|
|
24
26
|
}
|
|
27
|
+
/** One JSON object per line for a log collector; JSON escaping keeps a multi-line value on the one line. */
|
|
28
|
+
export function formatLogJson(level, message, fields = {}) {
|
|
29
|
+
const { ts, ...rest } = fields;
|
|
30
|
+
return JSON.stringify({ ts, level, msg: message, ...rest });
|
|
31
|
+
}
|
|
25
32
|
function write(level, message, fields) {
|
|
26
33
|
if (!isLevelEnabled(level))
|
|
27
34
|
return;
|
|
28
|
-
|
|
35
|
+
// The request id is ambient, so a line logged deep in a library call still names the request it ran for.
|
|
36
|
+
const stamped = { ts: new Date().toISOString(), requestId: currentRequestId(), ...fields };
|
|
37
|
+
const format = envLogJson() ? formatLogJson : formatLogLine;
|
|
38
|
+
process.stderr.write(`${format(level, message, stamped)}\n`);
|
|
29
39
|
}
|
|
40
|
+
// Some keys follow the data (one per damaged row and column), so the set of them stops growing here.
|
|
41
|
+
const ONCE_KEY_CAP = 1_000;
|
|
30
42
|
const onceKeys = new Set();
|
|
31
|
-
|
|
32
|
-
|
|
43
|
+
let onceCapReported = false;
|
|
44
|
+
/** 'new' records the key and 'seen' is a repeat. 'uncounted' is an unseen key once the set is full: it is not recorded, and the first one says so at warn. */
|
|
45
|
+
function sightOnceKey(key) {
|
|
33
46
|
if (onceKeys.has(key))
|
|
34
|
-
return;
|
|
35
|
-
onceKeys.
|
|
36
|
-
|
|
47
|
+
return 'seen';
|
|
48
|
+
if (onceKeys.size < ONCE_KEY_CAP) {
|
|
49
|
+
onceKeys.add(key);
|
|
50
|
+
return 'new';
|
|
51
|
+
}
|
|
52
|
+
if (!onceCapReported) {
|
|
53
|
+
onceCapReported = true;
|
|
54
|
+
write('warn', `log: ${ONCE_KEY_CAP} once-only warnings were written; further new ones in this process log at debug`);
|
|
55
|
+
}
|
|
56
|
+
return 'uncounted';
|
|
57
|
+
}
|
|
58
|
+
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
|
|
59
|
+
function once(key, level, message, fields) {
|
|
60
|
+
const sighting = sightOnceKey(key);
|
|
61
|
+
if (sighting !== 'seen')
|
|
62
|
+
write(sighting === 'new' ? level : 'debug', message, fields);
|
|
37
63
|
}
|
|
38
64
|
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
39
65
|
function warnThenDebug(key, message, fields) {
|
|
40
|
-
|
|
41
|
-
onceKeys.add(key);
|
|
42
|
-
write(level, message, fields);
|
|
66
|
+
write(sightOnceKey(key) === 'new' ? 'warn' : 'debug', message, fields);
|
|
43
67
|
}
|
|
44
68
|
/** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
|
|
45
69
|
export function errorFields(err) {
|
|
@@ -62,5 +86,6 @@ export function errorMessage(cause) {
|
|
|
62
86
|
/** Test hook: forget which once-keys have fired. */
|
|
63
87
|
export function resetLogOnce() {
|
|
64
88
|
onceKeys.clear();
|
|
89
|
+
onceCapReported = false;
|
|
65
90
|
}
|
|
66
91
|
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Leaf module: path canonicalisation shared by project identity and the importers.
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { errorMessage, log } from './log.js';
|
|
5
|
+
/** Dereferences symlinks and junctions and normalises case on Windows; falls back to path.resolve when the path does not exist yet. */
|
|
6
|
+
export function realpathOrResolve(p) {
|
|
7
|
+
try {
|
|
8
|
+
return fs.realpathSync.native(p);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
log.debug(`realpath fell back to resolve for ${p}: ${errorMessage(err)}`);
|
|
12
|
+
return path.resolve(p);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=real-path.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
/** What every scope carries; the store layer's RequestStores is one, and adds its handles. */
|
|
3
|
+
export interface RequestScope {
|
|
4
|
+
/** Ties every log line written inside the scope to one request. */
|
|
5
|
+
readonly requestId: string | undefined;
|
|
6
|
+
/** Set for a served request that must be answered by a given time. */
|
|
7
|
+
readonly deadline?: RequestDeadline | undefined;
|
|
8
|
+
}
|
|
9
|
+
/** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
|
|
10
|
+
export declare class RequestDeadline {
|
|
11
|
+
#private;
|
|
12
|
+
/** Epoch milliseconds. */
|
|
13
|
+
readonly at: number;
|
|
14
|
+
constructor(at: number);
|
|
15
|
+
/** Counts `call` as one the request waits on until it settles. */
|
|
16
|
+
track<T>(call: Promise<T>): Promise<T>;
|
|
17
|
+
/** Runs `fn` now, or once the last store call the request waits on has settled. */
|
|
18
|
+
onceIdle(fn: () => void): void;
|
|
19
|
+
}
|
|
20
|
+
export declare const requestScopes: AsyncLocalStorage<RequestScope>;
|
|
21
|
+
/** The id of the request this code runs for, if any. */
|
|
22
|
+
export declare function currentRequestId(): string | undefined;
|
|
23
|
+
/** The deadline of the request this code runs for, if it has one. */
|
|
24
|
+
export declare function currentDeadline(): RequestDeadline | undefined;
|
|
25
|
+
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
26
|
+
* timers and promises it starts. `deadline` reaches every store call made inside. */
|
|
27
|
+
export declare function runWithRequestId<T>(requestId: string, fn: () => T, deadline?: RequestDeadline): T;
|
|
28
|
+
//# sourceMappingURL=request-scope.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// The one ambient scope of a request. A leaf module, so the logger can read the request id without importing the store layer.
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
/** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
|
|
4
|
+
export class RequestDeadline {
|
|
5
|
+
/** Epoch milliseconds. */
|
|
6
|
+
at;
|
|
7
|
+
#storeCalls = 0;
|
|
8
|
+
#whenIdle;
|
|
9
|
+
constructor(at) {
|
|
10
|
+
this.at = at;
|
|
11
|
+
}
|
|
12
|
+
/** Counts `call` as one the request waits on until it settles. */
|
|
13
|
+
track(call) {
|
|
14
|
+
this.#storeCalls += 1;
|
|
15
|
+
const done = () => {
|
|
16
|
+
this.#storeCalls -= 1;
|
|
17
|
+
if (this.#storeCalls > 0)
|
|
18
|
+
return;
|
|
19
|
+
const idle = this.#whenIdle;
|
|
20
|
+
this.#whenIdle = undefined;
|
|
21
|
+
idle?.();
|
|
22
|
+
};
|
|
23
|
+
call.then(done, done);
|
|
24
|
+
return call;
|
|
25
|
+
}
|
|
26
|
+
/** Runs `fn` now, or once the last store call the request waits on has settled. */
|
|
27
|
+
onceIdle(fn) {
|
|
28
|
+
if (this.#storeCalls === 0)
|
|
29
|
+
fn();
|
|
30
|
+
else
|
|
31
|
+
this.#whenIdle = fn;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export const requestScopes = new AsyncLocalStorage();
|
|
35
|
+
/** The id of the request this code runs for, if any. */
|
|
36
|
+
export function currentRequestId() {
|
|
37
|
+
return requestScopes.getStore()?.requestId;
|
|
38
|
+
}
|
|
39
|
+
/** The deadline of the request this code runs for, if it has one. */
|
|
40
|
+
export function currentDeadline() {
|
|
41
|
+
return requestScopes.getStore()?.deadline;
|
|
42
|
+
}
|
|
43
|
+
/** Runs `fn` with `requestId` on every log line it writes, including the ones from
|
|
44
|
+
* timers and promises it starts. `deadline` reaches every store call made inside. */
|
|
45
|
+
export function runWithRequestId(requestId, fn, deadline) {
|
|
46
|
+
return requestScopes.run({ requestId, deadline }, fn);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=request-scope.js.map
|
|
@@ -1,22 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Conservative, provider-bounded patterns only - a bare `sk-` in prose must
|
|
5
|
-
* NOT flag. Detection gates two surfaces:
|
|
6
|
-
* - producer: shareMemory/autoShare never promote flagged rows to the
|
|
7
|
-
* global store;
|
|
8
|
-
* - consumer: ambient context (getContext) never injects a flagged row
|
|
9
|
-
* outside its owning project, and never anywhere when the row has no
|
|
10
|
-
* project origin. Explicit recall is unaffected - recalling a secret is
|
|
11
|
-
* a deliberate act.
|
|
12
|
-
*
|
|
13
|
-
* This is deliberately a thin slice of lifecycle compliance
|
|
14
|
-
* (no PII detection). Write-time scrubbing covers only text no person
|
|
15
|
-
* typed into hippo; see `vetSecrets`.
|
|
16
|
-
*
|
|
17
|
-
* Leaf module: keep free of imports from store/api/shared so all of them
|
|
18
|
-
* can import it without cycles.
|
|
19
|
-
*/
|
|
1
|
+
/** Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag). Flagged rows are never shared to
|
|
2
|
+
* the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no imports from store/api/shared. */
|
|
20
3
|
/** Result of scanning one memory. `reason` names the tag or pattern that fired. */
|
|
21
4
|
export interface SecretDetection {
|
|
22
5
|
flagged: boolean;
|
|
@@ -24,21 +7,13 @@ export interface SecretDetection {
|
|
|
24
7
|
}
|
|
25
8
|
/** Tags that flag a memory as secret, lower case; detectSecret folds a tag's case before the lookup. */
|
|
26
9
|
export declare const SECRET_TAGS: ReadonlySet<string>;
|
|
27
|
-
/**
|
|
28
|
-
* Scan a memory's tags + content for secret material.
|
|
29
|
-
* Pure and deterministic; no filesystem or store access.
|
|
30
|
-
*/
|
|
10
|
+
/** Scan a memory's tags + content for secret material; pure and deterministic, no filesystem or store access. */
|
|
31
11
|
export declare function detectSecret(entry: {
|
|
32
12
|
content: string;
|
|
33
13
|
tags: string[];
|
|
34
14
|
}): SecretDetection;
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
-
* Reuses the same `SECRET_PATTERNS` / co-occurrence guard as `detectSecret`
|
|
38
|
-
* (which only flags whole-entry content) so callers that must persist raw
|
|
39
|
-
* text that never passes through the normal capture content gate (e.g. the
|
|
40
|
-
* pre-compact snapshot fields) can scrub it in place instead.
|
|
41
|
-
*/
|
|
15
|
+
/** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
|
|
16
|
+
* for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
|
|
42
17
|
export declare function redactSecrets(text: string): string;
|
|
43
18
|
/** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
|
|
44
19
|
export declare function maskEmails(text: string): string;
|