@inflexa-ai/harness 0.45.1 → 0.46.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 +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
package/dist/runtime/boot.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* `bootHarness` — the harness-owned boot sequence.
|
|
3
3
|
*
|
|
4
4
|
* `assembleCoreRuntime` stays sync and pure (it is the register-before-launch
|
|
5
|
-
* cohort SOT, driven by tests
|
|
5
|
+
* cohort SOT, driven by tests outside a workflow). `bootHarness` wraps it with
|
|
6
6
|
* the ordered, effectful boot steps every host must run in the same order, and
|
|
7
7
|
* returns a `shutdown` handle the embedder wires to its process signals. The
|
|
8
8
|
* ordering is load-bearing and runs cheapest-failure-first:
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
* Runs after `launchDbos` and before the HTTP listener accepts traffic so a
|
|
21
21
|
* misconfigured pod fails boot loudly instead of degrading under load.
|
|
22
22
|
*/
|
|
23
|
-
import type {
|
|
23
|
+
import type { Querier } from "../state/db.js";
|
|
24
24
|
import type { Logger } from "../lib/logger.js";
|
|
25
25
|
/**
|
|
26
26
|
* Narrow config slice the budget guard reads — only the optional app-pool
|
|
27
27
|
* size override. Composition roots map `Env.DB_POOL_MAX` onto this.
|
|
28
28
|
*/
|
|
29
|
-
export
|
|
29
|
+
export type ConnectionBudgetConfig = {
|
|
30
30
|
readonly poolMax?: string;
|
|
31
|
-
}
|
|
32
|
-
export
|
|
33
|
-
pool:
|
|
31
|
+
};
|
|
32
|
+
export type AssertConnectionBudgetOptions = {
|
|
33
|
+
pool: Querier;
|
|
34
34
|
logger: Logger;
|
|
35
35
|
config: ConnectionBudgetConfig;
|
|
36
|
-
}
|
|
36
|
+
};
|
|
37
37
|
/**
|
|
38
38
|
* Verify a single pod's pool footprint fits inside pg `max_connections`.
|
|
39
39
|
* Throws on shortfall — the caller must abort boot. Returns the per-pod
|
|
@@ -31,7 +31,7 @@ export async function assertConnectionBudget({ pool, logger, config }) {
|
|
|
31
31
|
const dbosPoolSize = DBOS_SYSTEM_POOL_SIZE;
|
|
32
32
|
const podFootprint = appPoolSize + dbosPoolSize;
|
|
33
33
|
const { rows } = await pool.query("SELECT current_setting('max_connections') AS max");
|
|
34
|
-
const maxConnections = parseInt(rows[0]
|
|
34
|
+
const maxConnections = parseInt(rows[0]?.max ?? "0", 10);
|
|
35
35
|
if (podFootprint + SAFETY_MARGIN > maxConnections) {
|
|
36
36
|
throw new Error(`FATAL: pg max_connections (${maxConnections}) cannot hold one pod's pool footprint ` +
|
|
37
37
|
`(${podFootprint}) = app=${appPoolSize} + dbos=${dbosPoolSize}, plus margin=${SAFETY_MARGIN}. ` +
|
package/dist/runtime/dbos.d.ts
CHANGED
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DBOS Transact bootstrap
|
|
3
|
-
*
|
|
4
|
-
* This is the only module that imports `@dbos-inc/dbos-sdk` directly. The
|
|
5
|
-
* agent loop and routes depend on the `RunStep` shape (`harness/loop/types.ts`),
|
|
6
|
-
* so DBOS stays swappable and the chat path never reaches into the workflow
|
|
7
|
-
* runtime. `harness/loop/run-step.ts` wraps `DBOS.runStep` for the durable
|
|
8
|
-
* variant; nothing else here.
|
|
9
|
-
*
|
|
10
|
-
* Launch is dormant — this change registers no workflows. The durability seam
|
|
11
|
-
* exists; the engine is running; nothing is durable yet.
|
|
12
|
-
*
|
|
13
|
-
* See `openspec/changes/harness-dbos-runtime`.
|
|
2
|
+
* DBOS Transact bootstrap: the config of the engine, its launch, the
|
|
3
|
+
* schedules of the scheduled workflows, and its shutdown.
|
|
14
4
|
*/
|
|
15
5
|
import { type DBOSConfig, type DLogger } from "@dbos-inc/dbos-sdk";
|
|
16
|
-
import type {
|
|
6
|
+
import type { Querier } from "../state/db.js";
|
|
17
7
|
import type { Logger } from "../lib/logger.js";
|
|
18
8
|
/**
|
|
19
9
|
* Narrow config slice the DBOS bootstrap reads. Composition roots map their
|
|
20
10
|
* validated `Env` onto this and pass the executor id in (the harness reads no env).
|
|
21
11
|
*/
|
|
22
|
-
export
|
|
12
|
+
export type DbosConfig = {
|
|
23
13
|
readonly dbHost: string;
|
|
24
14
|
readonly dbPort: string;
|
|
25
15
|
readonly dbName: string;
|
|
@@ -28,7 +18,6 @@ export interface DbosConfig {
|
|
|
28
18
|
readonly dbSslMode: "disable" | "require" | "verify-ca" | "verify-full";
|
|
29
19
|
readonly appName: string;
|
|
30
20
|
readonly applicationVersion?: string;
|
|
31
|
-
readonly adminPort: string;
|
|
32
21
|
/** Stable per-pod executor id (e.g. `process.env.HOSTNAME ?? "local-dev"`). */
|
|
33
22
|
readonly executorId: string;
|
|
34
23
|
/**
|
|
@@ -66,12 +55,12 @@ export interface DbosConfig {
|
|
|
66
55
|
* new root trace, with no link to the trace of the original execution.
|
|
67
56
|
*/
|
|
68
57
|
readonly tracingEnabled?: boolean;
|
|
69
|
-
}
|
|
58
|
+
};
|
|
70
59
|
/** DBOS lifecycle facts a host's readiness probe reports on. */
|
|
71
|
-
export
|
|
60
|
+
export type DbosState = {
|
|
72
61
|
launched: boolean;
|
|
73
62
|
recoveryStarted: boolean;
|
|
74
|
-
}
|
|
63
|
+
};
|
|
75
64
|
/**
|
|
76
65
|
* Bridge the SDK's internal logger onto the harness `Logger` seam, so the
|
|
77
66
|
* SDK's own lines (`Recovering N workflows…`, migration chatter) land in the
|
|
@@ -88,6 +77,27 @@ export declare function dbosSdkLogger(logger: Logger, logLevel: string | undefin
|
|
|
88
77
|
* assert on the mapping without a launch.
|
|
89
78
|
*/
|
|
90
79
|
export declare function dbosSdkConfig(config: DbosConfig, logger: Logger): DBOSConfig;
|
|
80
|
+
/**
|
|
81
|
+
* Whether a failure ends the execution because it no longer owns its workflow. A
|
|
82
|
+
* cancel raises `DBOSWorkflowCancelledError` at the next operation. A cancel that
|
|
83
|
+
* lands while a step runs clears the owner of the workflow, and the record of the
|
|
84
|
+
* step then raises `DBOSWorkflowConflictError`. Neither execution may write a
|
|
85
|
+
* terminal state, thus each one leaves with the error.
|
|
86
|
+
*/
|
|
87
|
+
export declare function isWorkflowCancellation(err: unknown): boolean;
|
|
88
|
+
/** One scheduled workflow: a registered workflow, and the crontab that starts it. */
|
|
89
|
+
export type WorkflowSchedule = {
|
|
90
|
+
readonly scheduleName: string;
|
|
91
|
+
readonly workflowFn: () => Promise<void>;
|
|
92
|
+
/** A crontab with an optional leading field for the seconds. */
|
|
93
|
+
readonly schedule: string;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Schedule a registered workflow. DBOS stores a schedule in its system database,
|
|
97
|
+
* and it accepts one only after the launch, thus `launchDbos` applies each
|
|
98
|
+
* schedule of this list. A second call with the same name replaces the first.
|
|
99
|
+
*/
|
|
100
|
+
export declare function scheduleWorkflow(schedule: WorkflowSchedule): void;
|
|
91
101
|
/**
|
|
92
102
|
* Launch DBOS. Idempotent — a second call is a no-op so tests that drive
|
|
93
103
|
* the harness twice (or accidentally double-import) don't re-launch.
|
|
@@ -126,7 +136,7 @@ export declare function shutdownDbos({ logger: injected }: {
|
|
|
126
136
|
* DB is the same database as the app pool, so the pool reaches it directly.
|
|
127
137
|
*/
|
|
128
138
|
export declare function sweepEphemeralWorkflows({ pool, logger: injectedLogger, executorId, }: {
|
|
129
|
-
pool:
|
|
139
|
+
pool: Querier;
|
|
130
140
|
logger: Logger;
|
|
131
141
|
/** Stable per-pod executor id — must match `launchDbos`'s `executorId`. */
|
|
132
142
|
executorId: string;
|
package/dist/runtime/dbos.js
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DBOS Transact bootstrap
|
|
3
|
-
*
|
|
4
|
-
* This is the only module that imports `@dbos-inc/dbos-sdk` directly. The
|
|
5
|
-
* agent loop and routes depend on the `RunStep` shape (`harness/loop/types.ts`),
|
|
6
|
-
* so DBOS stays swappable and the chat path never reaches into the workflow
|
|
7
|
-
* runtime. `harness/loop/run-step.ts` wraps `DBOS.runStep` for the durable
|
|
8
|
-
* variant; nothing else here.
|
|
9
|
-
*
|
|
10
|
-
* Launch is dormant — this change registers no workflows. The durability seam
|
|
11
|
-
* exists; the engine is running; nothing is durable yet.
|
|
12
|
-
*
|
|
13
|
-
* See `openspec/changes/harness-dbos-runtime`.
|
|
2
|
+
* DBOS Transact bootstrap: the config of the engine, its launch, the
|
|
3
|
+
* schedules of the scheduled workflows, and its shutdown.
|
|
14
4
|
*/
|
|
15
|
-
import {
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
7
|
+
import { DBOS, Error as DBOSErrors } from "@dbos-inc/dbos-sdk";
|
|
8
|
+
import { presentGet } from "../lib/present.js";
|
|
16
9
|
import { DBOS_SYSTEM_POOL_SIZE } from "./pools.js";
|
|
17
10
|
import { errRecipe, okRecipe } from "./result-serialization.js";
|
|
18
11
|
const state = {
|
|
@@ -69,16 +62,16 @@ const SDK_DEFAULT_LOG_LEVEL = "info";
|
|
|
69
62
|
*/
|
|
70
63
|
export function dbosSdkLogger(logger, logLevel) {
|
|
71
64
|
const sink = logger.named("sdk");
|
|
72
|
-
const threshold = SDK_LOG_LEVEL_RANK[logLevel ?? SDK_DEFAULT_LOG_LEVEL] ?? SDK_LOG_LEVEL_RANK
|
|
73
|
-
const passes = (level) => SDK_LOG_LEVEL_RANK
|
|
65
|
+
const threshold = SDK_LOG_LEVEL_RANK[logLevel ?? SDK_DEFAULT_LOG_LEVEL] ?? presentGet(SDK_LOG_LEVEL_RANK, SDK_DEFAULT_LOG_LEVEL, "the default log-level rank");
|
|
66
|
+
const passes = (level) => presentGet(SDK_LOG_LEVEL_RANK, level, "the log-level rank") <= threshold;
|
|
74
67
|
const fields = (metadata) => {
|
|
75
68
|
const attributes = metadata?.span?.attributes;
|
|
76
69
|
const stack = metadata?.stack;
|
|
77
70
|
if (attributes === undefined && stack === undefined)
|
|
78
71
|
return undefined;
|
|
79
|
-
return { ...attributes,
|
|
72
|
+
return { ...attributes, stack };
|
|
80
73
|
};
|
|
81
|
-
const message = (entry) => (typeof entry === "string" ? entry :
|
|
74
|
+
const message = (entry) => (typeof entry === "string" ? entry : textOf(entry));
|
|
82
75
|
return {
|
|
83
76
|
debug: (entry, metadata) => {
|
|
84
77
|
if (passes("debug"))
|
|
@@ -109,13 +102,34 @@ export function dbosSdkConfig(config, logger) {
|
|
|
109
102
|
systemDatabasePoolSize: DBOS_SYSTEM_POOL_SIZE,
|
|
110
103
|
executorID: config.executorId,
|
|
111
104
|
applicationVersion: config.applicationVersion,
|
|
112
|
-
|
|
105
|
+
// With no version from the host, DBOS keeps the one version `PATCHING_ENABLED` across upgrades, thus a paused
|
|
106
|
+
// workflow recovers after an upgrade. A change of the operations of a workflow body goes behind `DBOS.patch`.
|
|
107
|
+
enablePatching: true,
|
|
113
108
|
logLevel: config.logLevel,
|
|
114
109
|
logger: dbosSdkLogger(logger, config.logLevel),
|
|
115
110
|
tracingEnabled: config.tracingEnabled ?? false,
|
|
116
111
|
otelAttributeFormat: "semconv",
|
|
117
112
|
};
|
|
118
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Whether a failure ends the execution because it no longer owns its workflow. A
|
|
116
|
+
* cancel raises `DBOSWorkflowCancelledError` at the next operation. A cancel that
|
|
117
|
+
* lands while a step runs clears the owner of the workflow, and the record of the
|
|
118
|
+
* step then raises `DBOSWorkflowConflictError`. Neither execution may write a
|
|
119
|
+
* terminal state, thus each one leaves with the error.
|
|
120
|
+
*/
|
|
121
|
+
export function isWorkflowCancellation(err) {
|
|
122
|
+
return err instanceof DBOSErrors.DBOSWorkflowCancelledError || err instanceof DBOSErrors.DBOSWorkflowConflictError;
|
|
123
|
+
}
|
|
124
|
+
const pendingSchedules = new Map();
|
|
125
|
+
/**
|
|
126
|
+
* Schedule a registered workflow. DBOS stores a schedule in its system database,
|
|
127
|
+
* and it accepts one only after the launch, thus `launchDbos` applies each
|
|
128
|
+
* schedule of this list. A second call with the same name replaces the first.
|
|
129
|
+
*/
|
|
130
|
+
export function scheduleWorkflow(schedule) {
|
|
131
|
+
pendingSchedules.set(schedule.scheduleName, schedule);
|
|
132
|
+
}
|
|
119
133
|
let resultRecipesRegistered = false;
|
|
120
134
|
/**
|
|
121
135
|
* DBOS refuses a registration after the launch, and the registry of SuperJSON
|
|
@@ -146,12 +160,13 @@ export async function launchDbos({ config, logger: injected }) {
|
|
|
146
160
|
registerResultSerialization();
|
|
147
161
|
const start = performance.now();
|
|
148
162
|
await DBOS.launch();
|
|
163
|
+
if (pendingSchedules.size > 0)
|
|
164
|
+
await DBOS.applySchedules([...pendingSchedules.values()]);
|
|
149
165
|
state.launched = true;
|
|
150
166
|
state.recoveryStarted = true;
|
|
151
167
|
logger.info("launched", {
|
|
152
168
|
executorID: sdkConfig.executorID,
|
|
153
169
|
applicationVersion: config.applicationVersion,
|
|
154
|
-
adminPort: sdkConfig.adminPort,
|
|
155
170
|
tracingEnabled: sdkConfig.tracingEnabled,
|
|
156
171
|
durationMs: Math.round(performance.now() - start),
|
|
157
172
|
});
|
|
@@ -215,7 +230,7 @@ export async function sweepEphemeralWorkflows({ pool, logger: injectedLogger, ex
|
|
|
215
230
|
}
|
|
216
231
|
catch (err) {
|
|
217
232
|
// First-ever boot: DBOS has not created its schema yet — nothing to sweep.
|
|
218
|
-
if (
|
|
233
|
+
if (z.object({ code: z.literal("42P01") }).safeParse(err).success) {
|
|
219
234
|
return;
|
|
220
235
|
}
|
|
221
236
|
logger.error("legacy ephemeral-row sweep failed", { executorID, ...logger.errorFields(err) });
|
|
@@ -15,22 +15,35 @@
|
|
|
15
15
|
* inside the step, before the checkpoint.
|
|
16
16
|
*/
|
|
17
17
|
import { Err, Ok, err, ok } from "neverthrow";
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { parseJsonAs } from "../lib/parse-json.js";
|
|
20
|
+
import { errorOf } from "../lib/thrown.js";
|
|
18
21
|
/**
|
|
19
22
|
* The JSON form of the value inside a `Result`, with the rules of
|
|
20
23
|
* `JSON.stringify`. An `Error` becomes `{ name, message }`, because
|
|
21
24
|
* `JSON.stringify` gives `{}` for one. A `bigint` becomes its decimal text,
|
|
22
25
|
* because `JSON.stringify` throws on one.
|
|
23
26
|
*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
/**
|
|
28
|
+
* The stringify with the Error and bigint replacer. The declared return is honest where
|
|
29
|
+
* the lib signature lies: the format gives back `undefined` for a value it cannot hold.
|
|
30
|
+
*/
|
|
31
|
+
function stringifyJson(value) {
|
|
32
|
+
return JSON.stringify(value, (_key, v) => {
|
|
33
|
+
const error = errorOf(v);
|
|
34
|
+
if (error !== undefined)
|
|
35
|
+
return { name: error.name, message: error.message };
|
|
28
36
|
if (typeof v === "bigint")
|
|
29
37
|
return v.toString();
|
|
30
38
|
return v;
|
|
31
39
|
});
|
|
32
|
-
return text === undefined ? undefined : JSON.parse(text);
|
|
33
40
|
}
|
|
41
|
+
function toJson(value) {
|
|
42
|
+
const text = stringifyJson(value);
|
|
43
|
+
// The stringify round-trip holds only JSON values, so the parse cannot refuse.
|
|
44
|
+
return text === undefined ? undefined : parseJsonAs(text, JsonSchema);
|
|
45
|
+
}
|
|
46
|
+
const JsonSchema = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(JsonSchema), z.record(z.string(), JsonSchema)]));
|
|
34
47
|
export const okRecipe = {
|
|
35
48
|
name: "neverthrow.Ok",
|
|
36
49
|
isApplicable: (v) => v instanceof Ok,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* any single step's failure.
|
|
20
20
|
*/
|
|
21
21
|
import type { Logger } from "../lib/logger.js";
|
|
22
|
-
export
|
|
22
|
+
export type ShutdownDeps = {
|
|
23
23
|
signal: string;
|
|
24
24
|
logger: Logger;
|
|
25
25
|
markDraining: () => void;
|
|
@@ -29,5 +29,5 @@ export interface ShutdownDeps {
|
|
|
29
29
|
flushLogger: () => Promise<void>;
|
|
30
30
|
shutdownOtel: () => Promise<void>;
|
|
31
31
|
exit: (code: number) => void;
|
|
32
|
-
}
|
|
32
|
+
};
|
|
33
33
|
export declare function runShutdownSequence(deps: ShutdownDeps): Promise<void>;
|
package/dist/sandbox/client.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ import type { ResultAsync } from "neverthrow";
|
|
|
21
21
|
import type { SpawnSession } from "../auth/types.js";
|
|
22
22
|
import type { SandboxError } from "./sandbox-error.js";
|
|
23
23
|
import type { ExecEmit, ExecRequest, ExecResult, ManagedSandbox, SandboxIdentity, SandboxLiveness, SandboxRef, SandboxSpec, ToolchainSource } from "./types.js";
|
|
24
|
-
export
|
|
24
|
+
export type SandboxClient = {
|
|
25
25
|
/**
|
|
26
26
|
* The declared owner of the sandbox toolchain, as the client was composed
|
|
27
27
|
* with it: `"image"` when the config declared it, `"store"` when the config
|
|
@@ -59,11 +59,15 @@ export interface SandboxClient {
|
|
|
59
59
|
* same step gets the same id, and the sandbox gives it the result of the
|
|
60
60
|
* first. Outside a workflow it throws.
|
|
61
61
|
*
|
|
62
|
+
* `execId` replaces that id. A caller that runs more than one exec in one
|
|
63
|
+
* step, or an exec outside a workflow, gives its own id
|
|
64
|
+
* (`sandbox/step-sandbox.ts`).
|
|
65
|
+
*
|
|
62
66
|
* A recovered step submits again under the same id. The sandbox dedups the
|
|
63
67
|
* submit on the id, thus the poll attaches to the exec that already ran or
|
|
64
68
|
* runs, and `emit` sees its events again from the start.
|
|
65
69
|
*/
|
|
66
|
-
exec(ref: SandboxRef, request: ExecRequest, emit: ExecEmit, deadline: number): Promise<ExecResult>;
|
|
70
|
+
exec(ref: SandboxRef, request: ExecRequest, emit: ExecEmit, deadline: number, execId?: string): Promise<ExecResult>;
|
|
67
71
|
/**
|
|
68
72
|
* Per-sandbox-machine liveness. `alive: false` only when observably dead
|
|
69
73
|
* (terminal pod phase, missing container); `oomKilled` marks a death the
|
|
@@ -99,4 +103,4 @@ export interface SandboxClient {
|
|
|
99
103
|
* ref the caller already holds; this one finds machines Cortex has forgotten.
|
|
100
104
|
*/
|
|
101
105
|
listManagedSandboxes(): Promise<ManagedSandbox[]>;
|
|
102
|
-
}
|
|
106
|
+
};
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
export declare const CPU_ONLINE_PATH = "/sys/devices/system/cpu/online";
|
|
18
18
|
export declare const CPUINFO_PATH = "/proc/cpuinfo";
|
|
19
19
|
export declare function readHostCpuinfoOnce(): Promise<string | undefined>;
|
|
20
|
-
export
|
|
20
|
+
export type CpuFiles = {
|
|
21
21
|
/** Content of `/sys/devices/system/cpu/online`: `0` for one thread, else the range `0-<n-1>`. */
|
|
22
22
|
readonly online: string;
|
|
23
23
|
/**
|
|
@@ -25,7 +25,7 @@ export interface CpuFiles {
|
|
|
25
25
|
* of the host. `undefined` when the host gives no `/proc/cpuinfo`.
|
|
26
26
|
*/
|
|
27
27
|
readonly cpuinfo: string | undefined;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
/**
|
|
30
30
|
* The content of the two cpu files for `threads` cpus.
|
|
31
31
|
*
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* the content in a ConfigMap and mounts each key with `subPath`.
|
|
15
15
|
*/
|
|
16
16
|
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { splitLines } from "../lib/text.js";
|
|
17
18
|
/** The two container paths that the cpu files cover. */
|
|
18
19
|
export const CPU_ONLINE_PATH = "/sys/devices/system/cpu/online";
|
|
19
20
|
export const CPUINFO_PATH = "/proc/cpuinfo";
|
|
@@ -33,10 +34,26 @@ export function readHostCpuinfoOnce() {
|
|
|
33
34
|
* trailer of an ARM kernel, is not a processor and is dropped.
|
|
34
35
|
*/
|
|
35
36
|
function processorBlocks(cpuinfo) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
.
|
|
37
|
+
const blocks = [];
|
|
38
|
+
let block = [];
|
|
39
|
+
for (const line of splitLines(cpuinfo)) {
|
|
40
|
+
if (line.trim() === "") {
|
|
41
|
+
if (block.length > 0)
|
|
42
|
+
blocks.push(block.join("\n"));
|
|
43
|
+
block = [];
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
block.push(line);
|
|
47
|
+
}
|
|
48
|
+
if (block.length > 0)
|
|
49
|
+
blocks.push(block.join("\n"));
|
|
50
|
+
return blocks.filter(hasProcessorLine);
|
|
51
|
+
}
|
|
52
|
+
function hasProcessorLine(block) {
|
|
53
|
+
return splitLines(block).some((line) => line.startsWith("processor") && !isWordChar(line.charAt("processor".length)));
|
|
54
|
+
}
|
|
55
|
+
function isWordChar(char) {
|
|
56
|
+
return (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_";
|
|
40
57
|
}
|
|
41
58
|
/**
|
|
42
59
|
* The content of the two cpu files for `threads` cpus.
|
|
@@ -12,11 +12,10 @@
|
|
|
12
12
|
* backend-agnostic — it only needs the SandboxRef.
|
|
13
13
|
*/
|
|
14
14
|
import type { V1Toleration } from "@kubernetes/client-node";
|
|
15
|
-
import type {
|
|
15
|
+
import type { Querier } from "../state/db.js";
|
|
16
16
|
import type { Logger } from "../lib/logger.js";
|
|
17
17
|
import { type ResourceLimits } from "../config/resource-limits.js";
|
|
18
18
|
import { type ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
19
|
-
import { clearSandboxRef } from "../state/index.js";
|
|
20
19
|
import type { SandboxClient } from "./client.js";
|
|
21
20
|
import { type ExecDeps } from "./exec.js";
|
|
22
21
|
import { type MountPlanCoords } from "./mount-plan.js";
|
|
@@ -26,13 +25,13 @@ import type { FarmSource, ResolveSandboxLabels, ToolchainSource } from "./types.
|
|
|
26
25
|
* default and the K8s namespace fallback. Composition roots map their
|
|
27
26
|
* validated `Env` onto this.
|
|
28
27
|
*/
|
|
29
|
-
export
|
|
28
|
+
export type SandboxBackendConfig = {
|
|
30
29
|
readonly backend: "docker" | "k8s";
|
|
31
30
|
readonly namespace: string;
|
|
32
|
-
}
|
|
33
|
-
export
|
|
31
|
+
};
|
|
32
|
+
export type CreateSandboxClientConfig = {
|
|
34
33
|
/** App pool — used for registry writes inside the create/teardown steps. */
|
|
35
|
-
pool:
|
|
34
|
+
pool: Querier;
|
|
36
35
|
/** Backend default + namespace fallback source. */
|
|
37
36
|
env: SandboxBackendConfig;
|
|
38
37
|
/** Default sandbox-base image when the workflow doesn't override per-step. */
|
|
@@ -150,7 +149,7 @@ export interface CreateSandboxClientConfig {
|
|
|
150
149
|
* An `isAlive` here wins over the backend inspect that the client wires.
|
|
151
150
|
*/
|
|
152
151
|
execDeps?: ExecDeps;
|
|
153
|
-
}
|
|
152
|
+
};
|
|
154
153
|
/**
|
|
155
154
|
* Backend-agnostic pre-creation of the writable tree under the analysis's
|
|
156
155
|
* resolved workspace root. On Docker that root is the host dir the container
|
|
@@ -177,4 +176,4 @@ export declare function precreateStepTree(deps: {
|
|
|
177
176
|
}, coords: MountPlanCoords): Promise<void>;
|
|
178
177
|
export declare function createSandboxClient(config: CreateSandboxClientConfig): SandboxClient;
|
|
179
178
|
/** Re-exports so consumers import once from this module. */
|
|
180
|
-
export { clearSandboxRef };
|
|
179
|
+
export { clearSandboxRef } from "../state/index.js";
|
|
@@ -22,7 +22,7 @@ import { clampResources } from "../config/resource-limits.js";
|
|
|
22
22
|
import { tailWritePrefix } from "../workspace/paths.js";
|
|
23
23
|
import { tryMutation } from "../lib/db-result.js";
|
|
24
24
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
25
|
-
import {
|
|
25
|
+
import { setSandboxRef } from "../state/index.js";
|
|
26
26
|
import { capExecStreams, EXEC_STREAM_BYTE_CAP } from "../tools/workspace/result-bounds.js";
|
|
27
27
|
import { createDockerSandboxOps } from "./docker-client.js";
|
|
28
28
|
import { runExec, stepExecId } from "./exec.js";
|
|
@@ -95,8 +95,8 @@ export function createSandboxClient(config) {
|
|
|
95
95
|
* variant as the message, and the variant itself on `cause`. The `mapErr`
|
|
96
96
|
* happens before the bridge because `toThrowable` passes an `Error`
|
|
97
97
|
* through untouched — thus `unwrapOrThrow` stays the single sanctioned
|
|
98
|
-
* Result→throw bridge, no second bridge is introduced, and the
|
|
99
|
-
*
|
|
98
|
+
* Result→throw bridge, no second bridge is introduced, and the type check
|
|
99
|
+
* command keeps recognizing every site. The registry
|
|
100
100
|
* unwraps below stay on the plain bridge: they carry a `DbError`.
|
|
101
101
|
*/
|
|
102
102
|
const failing = (e) => new SandboxFailure(e);
|
|
@@ -182,12 +182,6 @@ export function createSandboxClient(config) {
|
|
|
182
182
|
sandboxId: identity.sandboxId,
|
|
183
183
|
cause,
|
|
184
184
|
});
|
|
185
|
-
// Every caller must declare resources — a sandbox with no cpu/memory
|
|
186
|
-
// request is a semantic error, not something to paper over with a
|
|
187
|
-
// default.
|
|
188
|
-
if (!spec.resources) {
|
|
189
|
-
return err(createFailed("createSandbox")(new Error(`createSandbox: ${session.scope.analysisId}/${session.runFrame.runId}/${session.runFrame.stepId} has no resources — every caller must declare cpu/memoryGb`)));
|
|
190
|
-
}
|
|
191
185
|
// The config states an engine fact (binds preserve host ownership);
|
|
192
186
|
// which remediation that fact demands — today, a world-writable step
|
|
193
187
|
// write tree — is harness-owned and chosen here, not by the embedder.
|
|
@@ -218,8 +212,8 @@ export function createSandboxClient(config) {
|
|
|
218
212
|
// recovered step reaches this line again. `capExecStreams` cuts the
|
|
219
213
|
// streams and keeps every other field, thus the kernel accounting the
|
|
220
214
|
// sandbox reported reaches the record intact.
|
|
221
|
-
exec: (ref, request, emit, deadline) => DBOS.runStep(async () => {
|
|
222
|
-
const execId = stepExecId();
|
|
215
|
+
exec: (ref, request, emit, deadline, givenExecId) => DBOS.runStep(async () => {
|
|
216
|
+
const execId = givenExecId ?? stepExecId();
|
|
223
217
|
stableSpan("sandbox.exec", "sandbox.exec", { [ATTR_INFLEXA_EXEC_ID]: execId });
|
|
224
218
|
const result = capExecStreams(await runExec(ref, execId, request, emit, deadline, execDeps), streamCap);
|
|
225
219
|
recordSandboxExec({
|
|
@@ -240,4 +234,4 @@ export function createSandboxClient(config) {
|
|
|
240
234
|
};
|
|
241
235
|
}
|
|
242
236
|
/** Re-exports so consumers import once from this module. */
|
|
243
|
-
export { clearSandboxRef };
|
|
237
|
+
export { clearSandboxRef } from "../state/index.js";
|
|
@@ -39,7 +39,51 @@ import type { Logger } from "../lib/logger.js";
|
|
|
39
39
|
import { type ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
40
40
|
import { type SandboxError } from "./sandbox-error.js";
|
|
41
41
|
import type { FarmSource, ManagedSandbox, SandboxIdentity, SandboxLabels, SandboxLiveness, SandboxRef, SandboxSpec, ToolchainSource } from "./types.js";
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The surface of a Docker engine that this module reads. The classes of
|
|
44
|
+
* `dockerode` carry private members, so an injected engine — a test double or a
|
|
45
|
+
* wrapper — names this shape instead. A real `Docker` instance satisfies it.
|
|
46
|
+
*/
|
|
47
|
+
type EngineContainer = {
|
|
48
|
+
start(): Promise<unknown>;
|
|
49
|
+
stop(options?: {
|
|
50
|
+
t?: number;
|
|
51
|
+
}): Promise<unknown>;
|
|
52
|
+
remove(options?: {
|
|
53
|
+
force?: boolean;
|
|
54
|
+
v?: boolean;
|
|
55
|
+
}): Promise<unknown>;
|
|
56
|
+
inspect(): Promise<EngineInspectInfo>;
|
|
57
|
+
};
|
|
58
|
+
type EngineInspectInfo = {
|
|
59
|
+
Config?: {
|
|
60
|
+
Labels?: Record<string, string>;
|
|
61
|
+
};
|
|
62
|
+
State: {
|
|
63
|
+
Running?: boolean;
|
|
64
|
+
OOMKilled?: boolean;
|
|
65
|
+
};
|
|
66
|
+
NetworkSettings: {
|
|
67
|
+
Ports?: Record<string, Array<{
|
|
68
|
+
HostPort?: string;
|
|
69
|
+
}>>;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
type EngineContainerInfo = {
|
|
73
|
+
Labels?: Record<string, string>;
|
|
74
|
+
Created?: unknown;
|
|
75
|
+
};
|
|
76
|
+
export type DockerEngine = {
|
|
77
|
+
createContainer(options: Docker.ContainerCreateOptions): Promise<EngineContainer>;
|
|
78
|
+
getContainer(id: string): EngineContainer;
|
|
79
|
+
listContainers(options?: {
|
|
80
|
+
all?: boolean;
|
|
81
|
+
filters?: {
|
|
82
|
+
label?: string[];
|
|
83
|
+
};
|
|
84
|
+
}): Promise<EngineContainerInfo[]>;
|
|
85
|
+
};
|
|
86
|
+
export type DockerClientConfig = {
|
|
43
87
|
image: string;
|
|
44
88
|
/** Workspace-root resolution seam; each analysis's resolved root is the bind source for its tree mounts. */
|
|
45
89
|
resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
@@ -87,7 +131,7 @@ export interface DockerClientConfig {
|
|
|
87
131
|
*/
|
|
88
132
|
engineSocketPath?: string;
|
|
89
133
|
/** Injected for tests. */
|
|
90
|
-
docker?:
|
|
134
|
+
docker?: DockerEngine;
|
|
91
135
|
/** Injected for tests so `/health` polling can be stubbed. */
|
|
92
136
|
fetch?: typeof fetch;
|
|
93
137
|
/**
|
|
@@ -104,7 +148,7 @@ export interface DockerClientConfig {
|
|
|
104
148
|
logger?: Logger;
|
|
105
149
|
/** Hook called after the registry row is written. */
|
|
106
150
|
registerSandbox: (session: SpawnSession, spec: SandboxSpec, ref: SandboxRef) => Promise<void>;
|
|
107
|
-
}
|
|
151
|
+
};
|
|
108
152
|
/**
|
|
109
153
|
* dockerode connection options for a configured engine socket, or `undefined`
|
|
110
154
|
* to leave construction as a bare `new Docker()` — which preserves dockerode's
|
|
@@ -121,3 +165,4 @@ export declare function createDockerSandboxOps(config: DockerClientConfig): {
|
|
|
121
165
|
isAliveById(sandboxId: string): ResultAsync<SandboxLiveness, SandboxError>;
|
|
122
166
|
listManagedSandboxes(): ResultAsync<ManagedSandbox[], SandboxError>;
|
|
123
167
|
};
|
|
168
|
+
export {};
|
|
@@ -32,9 +32,12 @@
|
|
|
32
32
|
* The workload ends as uid 1000 with `no-new-privileges` and no effective
|
|
33
33
|
* capabilities.
|
|
34
34
|
*/
|
|
35
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
36
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
35
37
|
import { lstatSync } from "node:fs";
|
|
36
38
|
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
37
39
|
import { dirname, join } from "node:path";
|
|
40
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
38
41
|
import Docker from "dockerode";
|
|
39
42
|
import { ResultAsync, err, ok } from "neverthrow";
|
|
40
43
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
@@ -135,9 +138,9 @@ async function pollHealth(fetchImpl, url, timeoutMs) {
|
|
|
135
138
|
catch (err) {
|
|
136
139
|
lastErr = err;
|
|
137
140
|
}
|
|
138
|
-
await
|
|
141
|
+
await sleep(HEALTH_POLL_MS);
|
|
139
142
|
}
|
|
140
|
-
throw new Error(`sandbox /health did not return 200 within ${timeoutMs}ms: ${lastErr
|
|
143
|
+
throw new Error(`sandbox /health did not return 200 within ${timeoutMs}ms: ${errorMessageOf(lastErr) ?? textOf(lastErr)}`);
|
|
141
144
|
}
|
|
142
145
|
/**
|
|
143
146
|
* dockerode connection options for a configured engine socket, or `undefined`
|
|
@@ -312,10 +315,10 @@ export function createDockerSandboxOps(config) {
|
|
|
312
315
|
...(write && plan.writableStepPath
|
|
313
316
|
? [`${tailWritePrefix({ workspaceRoot: hostTreePath, tail: write.tail })}:${plan.writableStepPath}:rw`]
|
|
314
317
|
: []),
|
|
315
|
-
...(libsMounted && config.libStorePath ? [`${config.libStorePath}:${plan.libsPath}:ro`] : []),
|
|
318
|
+
...(libsMounted && config.libStorePath ? [`${config.libStorePath}:${String(plan.libsPath)}:ro`] : []),
|
|
316
319
|
...(libsMounted && farm && plan.farmPath ? [`${farm.farmPath}:${plan.farmPath}:ro`] : []),
|
|
317
320
|
...(libsMounted && cacheBindable && farm?.cachePath && plan.cachePath ? [`${farm.cachePath}:${plan.cachePath}:rw`] : []),
|
|
318
|
-
...(refsMounted && config.refStorePath ? [`${config.refStorePath}:${plan.refsPath}:ro`] : []),
|
|
321
|
+
...(refsMounted && config.refStorePath ? [`${config.refStorePath}:${String(plan.refsPath)}:ro`] : []),
|
|
319
322
|
...cpuBinds,
|
|
320
323
|
];
|
|
321
324
|
const createFailed = (status, cause) => ({
|
|
@@ -337,11 +340,10 @@ export function createDockerSandboxOps(config) {
|
|
|
337
340
|
SANDBOX_EGRESS_FIREWALL: "1",
|
|
338
341
|
...threadLimitEnv(limits),
|
|
339
342
|
...plan.env,
|
|
340
|
-
...
|
|
343
|
+
...spec.extraEnv,
|
|
341
344
|
}).map(([k, v]) => `${k}=${v}`);
|
|
342
345
|
const createOpts = {
|
|
343
346
|
name: sandboxId,
|
|
344
|
-
...(config.platform !== undefined && { platform: config.platform }),
|
|
345
347
|
Image: image,
|
|
346
348
|
Env: env,
|
|
347
349
|
User: SANDBOX_ROOT_USER,
|
|
@@ -374,6 +376,8 @@ export function createDockerSandboxOps(config) {
|
|
|
374
376
|
AutoRemove: false,
|
|
375
377
|
},
|
|
376
378
|
};
|
|
379
|
+
if (config.platform !== undefined)
|
|
380
|
+
createOpts.platform = config.platform;
|
|
377
381
|
const sandbox = await createOrAdopt(docker, createOpts, sandboxId, spec.childWorkflowId, createFailed, logger);
|
|
378
382
|
if (sandbox.isErr())
|
|
379
383
|
return err(sandbox.error);
|
|
@@ -57,13 +57,8 @@ function factorFor(relativePath) {
|
|
|
57
57
|
export function estimateDataProfileResources(files) {
|
|
58
58
|
if (files.length === 0)
|
|
59
59
|
return { cpu: 1, memoryGb: 2 };
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
for (const f of files) {
|
|
63
|
-
totalBytes += f.size;
|
|
64
|
-
if (f.size > largest.size)
|
|
65
|
-
largest = f;
|
|
66
|
-
}
|
|
60
|
+
const totalBytes = files.reduce((sum, f) => sum + f.size, 0);
|
|
61
|
+
const largest = files.reduce((a, b) => (b.size > a.size ? b : a));
|
|
67
62
|
const memoryGb = Math.max(2, Math.ceil(2 + (largest.size * factorFor(largest.relativePath)) / 1e9));
|
|
68
63
|
let cpu = totalBytes < 100 * 1e6 ? 1 : totalBytes < 1e9 ? 2 : totalBytes < 10 * 1e9 ? 4 : 8;
|
|
69
64
|
if (files.length >= 8)
|
|
@@ -26,7 +26,7 @@ import type { ExecResult } from "./types.js";
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function sandboxExecOutcomeOf(result: ExecResult): SandboxExecOutcome;
|
|
28
28
|
/** The account of one exec that a failure record can hold. Text-free by construction. */
|
|
29
|
-
export
|
|
29
|
+
export type ExecOutcomeSummary = {
|
|
30
30
|
readonly exitCode: number | null;
|
|
31
31
|
readonly timedOut: boolean;
|
|
32
32
|
/**
|
|
@@ -36,7 +36,7 @@ export interface ExecOutcomeSummary {
|
|
|
36
36
|
*/
|
|
37
37
|
readonly stderrTotalBytes: number;
|
|
38
38
|
readonly syntheticFailureReason?: string;
|
|
39
|
-
}
|
|
39
|
+
};
|
|
40
40
|
/** Reduce a result to its summary. */
|
|
41
41
|
export declare function summarizeExec(result: ExecResult): ExecOutcomeSummary;
|
|
42
42
|
/** Keep `summary` as the last known exec of `sandboxId`. */
|