@inflexa-ai/harness 0.45.1 → 0.46.2
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 +306 -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 +32 -7
- package/dist/lib/hooks.js +22 -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 +160 -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 +39 -0
- package/dist/loop/turn-credentials.js +90 -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/request-headers.js +12 -3
- 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 +62 -0
- package/dist/testing.js +101 -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
|
@@ -37,7 +37,7 @@ export function summarizeExec(result) {
|
|
|
37
37
|
exitCode: result.exitCode,
|
|
38
38
|
timedOut: result.timedOut,
|
|
39
39
|
stderrTotalBytes: result.stderrTotalBytes ?? Buffer.byteLength(result.stderr, "utf8"),
|
|
40
|
-
|
|
40
|
+
syntheticFailureReason: result.syntheticFailure?.reason,
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
/**
|
package/dist/sandbox/exec.d.ts
CHANGED
|
@@ -18,13 +18,17 @@ export declare class ExecTimeoutError extends Error {
|
|
|
18
18
|
constructor(execId: string);
|
|
19
19
|
}
|
|
20
20
|
/** The effects of one exec. Each member has a default, and a test replaces it. */
|
|
21
|
-
export
|
|
21
|
+
export type ExecDeps = {
|
|
22
22
|
/** Defaults to `globalThis.fetch`. */
|
|
23
23
|
readonly fetch?: typeof fetch;
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
/**
|
|
25
|
+
* The clock of the deadline, of the cancel reads, and of the pause between
|
|
26
|
+
* two polls. Defaults to the system clock and a timer.
|
|
27
|
+
*/
|
|
28
|
+
readonly clock?: {
|
|
29
|
+
now(): number;
|
|
30
|
+
wait(ms: number, signal?: AbortSignal): Promise<void>;
|
|
31
|
+
};
|
|
28
32
|
/**
|
|
29
33
|
* Sink for advisory warnings: events that the sandbox ring shed. Defaults to
|
|
30
34
|
* `DBOS.logger.warn`. The terminal result, not the event stream, is the
|
|
@@ -41,7 +45,7 @@ export interface ExecDeps {
|
|
|
41
45
|
readonly isCancelled?: () => Promise<boolean>;
|
|
42
46
|
/** Per-stream retention budget sent with the submit. Defaults to `EXEC_STREAM_BYTE_CAP`. */
|
|
43
47
|
readonly execStreamByteCap?: number;
|
|
44
|
-
}
|
|
48
|
+
};
|
|
45
49
|
/**
|
|
46
50
|
* The id of the exec that runs in the current durable step: the workflow id
|
|
47
51
|
* and the function id of the step. Both are stable across a replay, and DBOS
|
package/dist/sandbox/exec.js
CHANGED
|
@@ -12,8 +12,13 @@
|
|
|
12
12
|
* finished exec instead of a second run. The poll then starts at cursor 0, and
|
|
13
13
|
* the caller gets the events of the exec again.
|
|
14
14
|
*/
|
|
15
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
16
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
17
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
15
18
|
import { DBOS, Error as DBOSErrors, StatusString } from "@dbos-inc/dbos-sdk";
|
|
16
19
|
import { untracedFetch } from "../lib/otel-spans.js";
|
|
20
|
+
import { parseJsonAs } from "../lib/parse-json.js";
|
|
21
|
+
import { presentFirst } from "../lib/present.js";
|
|
17
22
|
import { EXEC_STREAM_BYTE_CAP } from "../tools/workspace/result-bounds.js";
|
|
18
23
|
import { createEscalationPolicy, probeLiveness, syntheticFailureReason, syntheticFailureResult } from "./liveness.js";
|
|
19
24
|
import { PollResponseSchema } from "./types.js";
|
|
@@ -33,6 +38,10 @@ const SLOW_POLL_INTERVAL_MS = 10_000;
|
|
|
33
38
|
* when the workflow is cancelled.
|
|
34
39
|
*/
|
|
35
40
|
const CANCEL_CHECK_INTERVAL_MS = 10_000;
|
|
41
|
+
const systemClock = {
|
|
42
|
+
now: Date.now,
|
|
43
|
+
wait: (ms, signal) => sleep(ms, undefined, { signal }),
|
|
44
|
+
};
|
|
36
45
|
export class ExecTimeoutError extends Error {
|
|
37
46
|
execId;
|
|
38
47
|
constructor(execId) {
|
|
@@ -63,15 +72,19 @@ export function stepExecId() {
|
|
|
63
72
|
export async function runExec(ref, execId, request, emit, deadlineMs, deps = {}) {
|
|
64
73
|
const fetchImpl = deps.fetch ?? fetch;
|
|
65
74
|
const cap = deps.execStreamByteCap ?? EXEC_STREAM_BYTE_CAP;
|
|
66
|
-
|
|
75
|
+
const body = {
|
|
67
76
|
command: [...request.command],
|
|
68
77
|
execId,
|
|
69
|
-
...(request.cwd === undefined ? {} : { cwd: request.cwd }),
|
|
70
|
-
...(request.env === undefined ? {} : { env: { ...request.env } }),
|
|
71
|
-
...(request.timeoutSeconds === undefined ? {} : { timeoutSeconds: request.timeoutSeconds }),
|
|
72
78
|
stdoutByteCap: cap,
|
|
73
79
|
stderrByteCap: cap,
|
|
74
|
-
}
|
|
80
|
+
};
|
|
81
|
+
if (request.cwd !== undefined)
|
|
82
|
+
body.cwd = request.cwd;
|
|
83
|
+
if (request.env !== undefined)
|
|
84
|
+
body.env = { ...request.env };
|
|
85
|
+
if (request.timeoutSeconds !== undefined)
|
|
86
|
+
body.timeoutSeconds = request.timeoutSeconds;
|
|
87
|
+
await submitExec(fetchImpl, ref, body);
|
|
75
88
|
return pollExec(ref, execId, emit, deadlineMs, deps);
|
|
76
89
|
}
|
|
77
90
|
/**
|
|
@@ -81,6 +94,7 @@ export async function runExec(ref, execId, request, emit, deadlineMs, deps = {})
|
|
|
81
94
|
*/
|
|
82
95
|
async function submitExec(fetchImpl, ref, body) {
|
|
83
96
|
const controller = new AbortController();
|
|
97
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- a deadline guard, not a wait: it aborts the controller of the in-flight submit, and the finally clears it.
|
|
84
98
|
const timer = setTimeout(() => controller.abort(), SUBMIT_HTTP_TIMEOUT_MS);
|
|
85
99
|
try {
|
|
86
100
|
const res = await untracedFetch(fetchImpl, `http://${ref.host}:${ref.port}/exec`, {
|
|
@@ -102,6 +116,7 @@ async function submitExec(fetchImpl, ref, body) {
|
|
|
102
116
|
}
|
|
103
117
|
async function pollOnce(fetchImpl, ref, execId, cursor) {
|
|
104
118
|
const controller = new AbortController();
|
|
119
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- a deadline guard, not a wait: it aborts the controller of the in-flight poll, and the finally clears it.
|
|
105
120
|
const timer = setTimeout(() => controller.abort(), POLL_HTTP_TIMEOUT_MS);
|
|
106
121
|
try {
|
|
107
122
|
const res = await untracedFetch(fetchImpl, `http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}?since=${cursor}`, {
|
|
@@ -115,7 +130,7 @@ async function pollOnce(fetchImpl, ref, execId, cursor) {
|
|
|
115
130
|
return { kind: "ok", raw: await res.text() };
|
|
116
131
|
}
|
|
117
132
|
catch (cause) {
|
|
118
|
-
return { kind: "unavailable", detail: cause
|
|
133
|
+
return { kind: "unavailable", detail: errorMessageOf(cause) ?? textOf(cause) };
|
|
119
134
|
}
|
|
120
135
|
finally {
|
|
121
136
|
clearTimeout(timer);
|
|
@@ -132,25 +147,25 @@ async function pollOnce(fetchImpl, ref, execId, cursor) {
|
|
|
132
147
|
*/
|
|
133
148
|
async function pollExec(ref, execId, emit, deadlineMs, deps) {
|
|
134
149
|
const fetchImpl = deps.fetch ?? fetch;
|
|
135
|
-
const now = deps.now ??
|
|
136
|
-
const
|
|
150
|
+
const now = deps.clock?.now.bind(deps.clock) ?? systemClock.now.bind(systemClock);
|
|
151
|
+
const wait = deps.clock?.wait.bind(deps.clock) ?? systemClock.wait.bind(systemClock);
|
|
137
152
|
const warn = deps.warn ?? ((message) => DBOS.logger.warn(message));
|
|
138
153
|
const isCancelled = deps.isCancelled ?? workflowCancelled;
|
|
139
154
|
let cursor = 0;
|
|
140
155
|
let pollAttempt = 0;
|
|
141
156
|
let lastCancelCheckMs = now();
|
|
142
157
|
const escalation = createEscalationPolicy();
|
|
143
|
-
|
|
158
|
+
for (;;) {
|
|
144
159
|
pollAttempt += 1;
|
|
145
160
|
const polled = await pollOnce(fetchImpl, ref, execId, cursor);
|
|
146
161
|
if (polled.kind === "ok") {
|
|
147
|
-
const resp =
|
|
162
|
+
const resp = parseJsonAs(polled.raw, PollResponseSchema);
|
|
148
163
|
// Each event is emitted at most once, whatever `since` the server applied.
|
|
149
164
|
const newEvents = resp.events.filter((ev) => ev.seq > cursor);
|
|
150
165
|
// Sequence numbers are contiguous per exec, thus a hole between the local
|
|
151
166
|
// cursor and the next delivered (or high-water) seq proves that the ring
|
|
152
167
|
// shed events before the host saw them.
|
|
153
|
-
const nextSeq = newEvents.length > 0 ? newEvents
|
|
168
|
+
const nextSeq = newEvents.length > 0 ? presentFirst(newEvents, "the new sandbox event").seq : resp.cursor > cursor ? resp.cursor + 1 : cursor + 1;
|
|
154
169
|
const lost = nextSeq - cursor - 1;
|
|
155
170
|
if (lost > 0) {
|
|
156
171
|
warn(`exec[${execId}]: ${lost} progress event(s) (seq ${cursor + 1}-${cursor + lost}) shed by the sandbox ring before delivery; the terminal result is unaffected`);
|
|
@@ -184,7 +199,7 @@ async function pollExec(ref, execId, emit, deadlineMs, deps) {
|
|
|
184
199
|
throw new DBOSErrors.DBOSWorkflowCancelledError(DBOS.workflowID ?? execId);
|
|
185
200
|
}
|
|
186
201
|
const intervalMs = pollAttempt <= FAST_POLL_ATTEMPTS ? FAST_POLL_INTERVAL_MS : SLOW_POLL_INTERVAL_MS;
|
|
187
|
-
await
|
|
202
|
+
await wait(Math.min(intervalMs, remainingMs));
|
|
188
203
|
}
|
|
189
204
|
}
|
|
190
205
|
/** Read the status of the workflow that runs this exec. Outside a workflow, nothing can cancel it. */
|
|
@@ -27,12 +27,20 @@ const nanoid = customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789");
|
|
|
27
27
|
* - Truncated to 40 characters
|
|
28
28
|
*/
|
|
29
29
|
export function sanitizeAgentName(name) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
let out = "";
|
|
31
|
+
let inRun = false;
|
|
32
|
+
for (const char of name.toLowerCase()) {
|
|
33
|
+
const keeps = (char >= "a" && char <= "z") || (char >= "0" && char <= "9");
|
|
34
|
+
if (!keeps) {
|
|
35
|
+
inRun = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (inRun && out.length > 0)
|
|
39
|
+
out += "-";
|
|
40
|
+
inRun = false;
|
|
41
|
+
out += char;
|
|
42
|
+
}
|
|
43
|
+
return out.slice(0, AGENT_NAME_MAX_LENGTH);
|
|
36
44
|
}
|
|
37
45
|
/**
|
|
38
46
|
* Generate a unified execution ID for an agent invocation.
|
package/dist/sandbox/farm.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ export declare const FarmLockSchema: z.ZodObject<{
|
|
|
55
55
|
r: z.ZodOptional<z.ZodObject<{
|
|
56
56
|
version: z.ZodString;
|
|
57
57
|
bioc_releases: z.ZodArray<z.ZodString>;
|
|
58
|
-
pak_lock: z.ZodOptional<z.
|
|
58
|
+
pak_lock: z.ZodOptional<z.ZodCustom<unknown, unknown>>;
|
|
59
59
|
}, z.core.$loose>>;
|
|
60
60
|
}, z.core.$loose>;
|
|
61
61
|
warm: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
@@ -65,8 +65,8 @@ export declare const FarmLockSchema: z.ZodObject<{
|
|
|
65
65
|
merge_conflicts: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
66
66
|
entry: z.ZodString;
|
|
67
67
|
action: z.ZodEnum<{
|
|
68
|
-
skipped: "skipped";
|
|
69
68
|
"kept-first": "kept-first";
|
|
69
|
+
skipped: "skipped";
|
|
70
70
|
}>;
|
|
71
71
|
}, z.core.$loose>>>;
|
|
72
72
|
}, z.core.$loose>;
|
package/dist/sandbox/farm.js
CHANGED
|
@@ -18,11 +18,11 @@ import { readFileSync } from "node:fs";
|
|
|
18
18
|
import { join } from "node:path";
|
|
19
19
|
import { err, ok } from "neverthrow";
|
|
20
20
|
import { z } from "zod";
|
|
21
|
+
import { safeParseJsonAs } from "../lib/parse-json.js";
|
|
21
22
|
/** The one metadata file of a farm. */
|
|
22
23
|
export const FARM_LOCK_FILE = "inflexa.lock";
|
|
23
24
|
/** One linked distribution. `requested` obeys the PEP 376 meaning: true for a direct ask, false for a transitive dependency. */
|
|
24
|
-
export const FarmLockPackageSchema = z
|
|
25
|
-
.object({
|
|
25
|
+
export const FarmLockPackageSchema = z.looseObject({
|
|
26
26
|
name: z.string(),
|
|
27
27
|
version: z.string(),
|
|
28
28
|
/** The link subtree of the package (for example `python`, `cran`, `bioconductor`). */
|
|
@@ -31,52 +31,48 @@ export const FarmLockPackageSchema = z
|
|
|
31
31
|
/** The full sha256 of the sorted store tree. */
|
|
32
32
|
hash: z.string(),
|
|
33
33
|
requested: z.boolean(),
|
|
34
|
-
})
|
|
35
|
-
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Whatever `JSON.parse` yields: a JSON value, plus Infinity — an over-large
|
|
37
|
+
* literal such as `1e999` reads as Infinity, which `z.json()` refuses.
|
|
38
|
+
* `JSON.parse` output never holds `undefined`, so the check is exact for that feed.
|
|
39
|
+
*/
|
|
40
|
+
const ParsedJsonValue = z.custom((value) => value !== undefined);
|
|
36
41
|
/**
|
|
37
42
|
* `inflexa.lock` at schema version 1. Additive fields pass through — a
|
|
38
43
|
* breaking change to the shape must move the schema number instead.
|
|
39
44
|
*/
|
|
40
|
-
export const FarmLockSchema = z
|
|
41
|
-
.object({
|
|
45
|
+
export const FarmLockSchema = z.looseObject({
|
|
42
46
|
schema: z.literal(1),
|
|
43
47
|
arch: z.enum(["amd64", "arm64"]),
|
|
44
48
|
packages: z.array(FarmLockPackageSchema),
|
|
45
49
|
/** Per-language provenance. Each language object owns its own fields. */
|
|
46
|
-
languages: z
|
|
47
|
-
.
|
|
48
|
-
python: z.object({ version: z.string(), index: z.string() }).passthrough().optional(),
|
|
50
|
+
languages: z.looseObject({
|
|
51
|
+
python: z.looseObject({ version: z.string(), index: z.string() }).optional(),
|
|
49
52
|
r: z
|
|
50
|
-
.
|
|
53
|
+
.looseObject({
|
|
51
54
|
version: z.string(),
|
|
52
55
|
bioc_releases: z.array(z.string()),
|
|
53
56
|
/** The embedded pak lock of the build, verbatim. */
|
|
54
|
-
pak_lock:
|
|
57
|
+
pak_lock: ParsedJsonValue.optional(),
|
|
55
58
|
})
|
|
56
|
-
.passthrough()
|
|
57
59
|
.optional(),
|
|
58
|
-
})
|
|
59
|
-
.passthrough(),
|
|
60
|
+
}),
|
|
60
61
|
/** The warm replay record. Present in the catalog farm only. */
|
|
61
62
|
warm: z
|
|
62
|
-
.record(z.string(), z
|
|
63
|
-
.object({
|
|
63
|
+
.record(z.string(), z.looseObject({
|
|
64
64
|
script_sha256: z.string(),
|
|
65
65
|
cache_entries: z.array(z.string()),
|
|
66
|
-
})
|
|
67
|
-
.passthrough())
|
|
66
|
+
}))
|
|
68
67
|
.optional(),
|
|
69
68
|
/** The top-level entries that the link merge kept-first or skipped. */
|
|
70
69
|
merge_conflicts: z
|
|
71
|
-
.array(z
|
|
72
|
-
.object({
|
|
70
|
+
.array(z.looseObject({
|
|
73
71
|
entry: z.string(),
|
|
74
72
|
action: z.enum(["kept-first", "skipped"]),
|
|
75
|
-
})
|
|
76
|
-
.passthrough())
|
|
73
|
+
}))
|
|
77
74
|
.optional(),
|
|
78
|
-
})
|
|
79
|
-
.passthrough();
|
|
75
|
+
});
|
|
80
76
|
/**
|
|
81
77
|
* Read and validate the `inflexa.lock` of a farm directory. The mount gate
|
|
82
78
|
* accepts a farm only when this returns ok — a farm whose lock is absent,
|
|
@@ -94,14 +90,13 @@ export function readFarmLockFile(lockPath) {
|
|
|
94
90
|
catch (cause) {
|
|
95
91
|
return err({ type: "lock_unreadable", lockPath, cause });
|
|
96
92
|
}
|
|
97
|
-
let
|
|
93
|
+
let lock;
|
|
98
94
|
try {
|
|
99
|
-
|
|
95
|
+
lock = safeParseJsonAs(raw, FarmLockSchema);
|
|
100
96
|
}
|
|
101
97
|
catch (cause) {
|
|
102
98
|
return err({ type: "lock_invalid", lockPath, cause });
|
|
103
99
|
}
|
|
104
|
-
const lock = FarmLockSchema.safeParse(parsed);
|
|
105
100
|
if (!lock.success) {
|
|
106
101
|
return err({ type: "lock_invalid", lockPath, cause: lock.error });
|
|
107
102
|
}
|
|
@@ -13,3 +13,10 @@ import type { SandboxIdentity } from "./types.js";
|
|
|
13
13
|
* adoption is owner-label-guarded, but a unique name keeps a collision from
|
|
14
14
|
* ever reaching that guard. */
|
|
15
15
|
export declare function mintSandboxIdentity(runId: string): SandboxIdentity;
|
|
16
|
+
/**
|
|
17
|
+
* `sbx-{run8}-{hash12}` — the name of a sandbox whose identity comes from a
|
|
18
|
+
* key, not from a checkpoint. The same key gives the same name, thus a rerun
|
|
19
|
+
* of a step adopts the machine of the earlier attempt. The key is hashed,
|
|
20
|
+
* because a workflow id can hold characters that a container name refuses.
|
|
21
|
+
*/
|
|
22
|
+
export declare function keyedSandboxIdentity(runId: string, key: string): SandboxIdentity;
|
package/dist/sandbox/identity.js
CHANGED
|
@@ -6,14 +6,25 @@
|
|
|
6
6
|
* spawn-step checkpoint is recoverable — the re-run adopts the existing machine
|
|
7
7
|
* under the same name.
|
|
8
8
|
*/
|
|
9
|
-
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
10
10
|
/** `sbx-{run8}-{rand8}` — run prefix aids `kubectl` triage; the 8-hex random
|
|
11
11
|
* suffix makes within-run collisions across a run's concurrent steps
|
|
12
12
|
* negligible. Names are NOT the idempotency mechanism (the checkpoint is), and
|
|
13
13
|
* adoption is owner-label-guarded, but a unique name keeps a collision from
|
|
14
14
|
* ever reaching that guard. */
|
|
15
15
|
export function mintSandboxIdentity(runId) {
|
|
16
|
-
const run8 = runId.
|
|
17
|
-
const suffix = randomUUID().
|
|
16
|
+
const run8 = runId.replaceAll("-", "").slice(0, 8);
|
|
17
|
+
const suffix = randomUUID().replaceAll("-", "").slice(0, 8);
|
|
18
|
+
return { sandboxId: `sbx-${run8}-${suffix}` };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `sbx-{run8}-{hash12}` — the name of a sandbox whose identity comes from a
|
|
22
|
+
* key, not from a checkpoint. The same key gives the same name, thus a rerun
|
|
23
|
+
* of a step adopts the machine of the earlier attempt. The key is hashed,
|
|
24
|
+
* because a workflow id can hold characters that a container name refuses.
|
|
25
|
+
*/
|
|
26
|
+
export function keyedSandboxIdentity(runId, key) {
|
|
27
|
+
const run8 = runId.replaceAll("-", "").slice(0, 8);
|
|
28
|
+
const suffix = createHash("sha256").update(key, "utf8").digest("hex").slice(0, 12);
|
|
18
29
|
return { sandboxId: `sbx-${run8}-${suffix}` };
|
|
19
30
|
}
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
import { readFileSync } from "node:fs";
|
|
25
25
|
import { err, ok } from "neverthrow";
|
|
26
26
|
import { z } from "zod";
|
|
27
|
+
import { safeParseJsonAs } from "../lib/parse-json.js";
|
|
27
28
|
/**
|
|
28
29
|
* The file name of the record, at the root of the package store. Exported,
|
|
29
30
|
* as `FARM_LOCK_FILE` is, thus an embedder that joins the path onto its own
|
|
@@ -31,48 +32,38 @@ import { z } from "zod";
|
|
|
31
32
|
*/
|
|
32
33
|
export const IMAGE_PACKAGES_FILE = "image-packages.json";
|
|
33
34
|
/** The image the record describes. The pair of tags shares one version string. */
|
|
34
|
-
export const ImageIdentitySchema = z
|
|
35
|
-
.object({
|
|
35
|
+
export const ImageIdentitySchema = z.looseObject({
|
|
36
36
|
repository: z.string(),
|
|
37
37
|
version: z.string(),
|
|
38
38
|
arch: z.enum(["amd64", "arm64"]),
|
|
39
|
-
})
|
|
40
|
-
.passthrough();
|
|
39
|
+
});
|
|
41
40
|
/** The interpreter versions of the image, so a reader can compare them against the lock. */
|
|
42
|
-
export const ImageRuntimesSchema = z
|
|
43
|
-
.object({
|
|
41
|
+
export const ImageRuntimesSchema = z.looseObject({
|
|
44
42
|
python: z.string(),
|
|
45
43
|
r: z.string(),
|
|
46
44
|
node: z.string(),
|
|
47
|
-
})
|
|
48
|
-
.passthrough();
|
|
45
|
+
});
|
|
49
46
|
/**
|
|
50
47
|
* One conda tool of the image. `executable` carries the binary name when it
|
|
51
48
|
* differs from the package name (the manifest `binaries:` map holds those
|
|
52
49
|
* exceptions), because an agent invokes the binary and not the package.
|
|
53
50
|
*/
|
|
54
|
-
export const ImageSystemToolSchema = z
|
|
55
|
-
.object({
|
|
51
|
+
export const ImageSystemToolSchema = z.looseObject({
|
|
56
52
|
name: z.string(),
|
|
57
53
|
version: z.string(),
|
|
58
54
|
executable: z.string().optional(),
|
|
59
|
-
})
|
|
60
|
-
.passthrough();
|
|
55
|
+
});
|
|
61
56
|
/** One Node package of the image. */
|
|
62
|
-
export const ImageNodePackageSchema = z
|
|
63
|
-
.object({
|
|
57
|
+
export const ImageNodePackageSchema = z.looseObject({
|
|
64
58
|
name: z.string(),
|
|
65
59
|
version: z.string(),
|
|
66
|
-
})
|
|
67
|
-
.passthrough();
|
|
60
|
+
});
|
|
68
61
|
/** One R package that ships with the R runtime of the image: a base package or a recommended package. */
|
|
69
|
-
export const ImageRBasePackageSchema = z
|
|
70
|
-
.object({
|
|
62
|
+
export const ImageRBasePackageSchema = z.looseObject({
|
|
71
63
|
name: z.string(),
|
|
72
64
|
version: z.string(),
|
|
73
65
|
priority: z.enum(["base", "recommended"]),
|
|
74
|
-
})
|
|
75
|
-
.passthrough();
|
|
66
|
+
});
|
|
76
67
|
/**
|
|
77
68
|
* `image-packages.json` at schema version 1. The keys `system_tools` and
|
|
78
69
|
* `node` are the keys of the image manifest, thus one name means one track
|
|
@@ -81,16 +72,14 @@ export const ImageRBasePackageSchema = z
|
|
|
81
72
|
* lists. It is optional, because a record from before the field existed is
|
|
82
73
|
* still a valid record of its image.
|
|
83
74
|
*/
|
|
84
|
-
export const ImagePackagesSchema = z
|
|
85
|
-
.object({
|
|
75
|
+
export const ImagePackagesSchema = z.looseObject({
|
|
86
76
|
schema: z.literal(1),
|
|
87
77
|
image: ImageIdentitySchema,
|
|
88
78
|
runtimes: ImageRuntimesSchema,
|
|
89
79
|
system_tools: z.array(ImageSystemToolSchema),
|
|
90
80
|
node: z.array(ImageNodePackageSchema),
|
|
91
81
|
r_base: z.array(ImageRBasePackageSchema).optional(),
|
|
92
|
-
})
|
|
93
|
-
.passthrough();
|
|
82
|
+
});
|
|
94
83
|
/**
|
|
95
84
|
* Read and validate one `image-packages.json` by its file path. The read is
|
|
96
85
|
* synchronous, the same as {@link readFarmLockFile}, because the caller reads
|
|
@@ -106,14 +95,13 @@ export function readImagePackagesFile(recordPath) {
|
|
|
106
95
|
catch (cause) {
|
|
107
96
|
return err({ type: "record_unreadable", recordPath, cause });
|
|
108
97
|
}
|
|
109
|
-
let
|
|
98
|
+
let record;
|
|
110
99
|
try {
|
|
111
|
-
|
|
100
|
+
record = safeParseJsonAs(raw, ImagePackagesSchema);
|
|
112
101
|
}
|
|
113
102
|
catch (cause) {
|
|
114
103
|
return err({ type: "record_invalid", recordPath, cause });
|
|
115
104
|
}
|
|
116
|
-
const record = ImagePackagesSchema.safeParse(parsed);
|
|
117
105
|
if (!record.success) {
|
|
118
106
|
return err({ type: "record_invalid", recordPath, cause: record.error });
|
|
119
107
|
}
|
|
@@ -13,14 +13,41 @@
|
|
|
13
13
|
* derived from the same `resolveWorkspaceRoot` seam the harness pre-creates
|
|
14
14
|
* the step tree under, so both sides address one directory by construction.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { type V1Job, type V1JobList, type V1PodList, type V1Toleration } from "@kubernetes/client-node";
|
|
17
17
|
import { ResultAsync } from "neverthrow";
|
|
18
18
|
import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
19
19
|
import { type SandboxError } from "./sandbox-error.js";
|
|
20
20
|
import type { SpawnSession } from "../auth/types.js";
|
|
21
21
|
import type { FarmSource, ManagedSandbox, SandboxIdentity, SandboxLabels, SandboxLiveness, SandboxRef, SandboxSpec, ToolchainSource } from "./types.js";
|
|
22
22
|
import type { Logger } from "../lib/logger.js";
|
|
23
|
-
|
|
23
|
+
/** The Job operations of `BatchV1Api` the module reads, read structurally so tests build fakes cast-free. */
|
|
24
|
+
export type BatchJobApi = {
|
|
25
|
+
createNamespacedJob(request: {
|
|
26
|
+
namespace: string;
|
|
27
|
+
body: V1Job;
|
|
28
|
+
}): Promise<V1Job>;
|
|
29
|
+
readNamespacedJob(request: {
|
|
30
|
+
namespace: string;
|
|
31
|
+
name: string;
|
|
32
|
+
}): Promise<V1Job>;
|
|
33
|
+
deleteNamespacedJob(request: {
|
|
34
|
+
namespace: string;
|
|
35
|
+
name: string;
|
|
36
|
+
propagationPolicy?: string;
|
|
37
|
+
}): Promise<unknown>;
|
|
38
|
+
listNamespacedJob(request: {
|
|
39
|
+
namespace: string;
|
|
40
|
+
labelSelector?: string;
|
|
41
|
+
}): Promise<V1JobList>;
|
|
42
|
+
};
|
|
43
|
+
/** The Pod operations of `CoreV1Api` the module reads, read structurally so tests build fakes cast-free. */
|
|
44
|
+
export type CorePodApi = {
|
|
45
|
+
listNamespacedPod(request: {
|
|
46
|
+
namespace: string;
|
|
47
|
+
labelSelector?: string;
|
|
48
|
+
}): Promise<V1PodList>;
|
|
49
|
+
};
|
|
50
|
+
export type K8sClientConfig = {
|
|
24
51
|
/** Operational logging seam; omitted falls back to no-op. */
|
|
25
52
|
readonly logger?: Logger;
|
|
26
53
|
image: string;
|
|
@@ -76,17 +103,17 @@ export interface K8sClientConfig {
|
|
|
76
103
|
/** RuntimeClass for runtime isolation (e.g. `gvisor`). Omit for the default runtime. */
|
|
77
104
|
runtimeClassName?: string;
|
|
78
105
|
/** Injected for tests. */
|
|
79
|
-
batchApi?:
|
|
80
|
-
coreApi?:
|
|
106
|
+
batchApi?: BatchJobApi;
|
|
107
|
+
coreApi?: CorePodApi;
|
|
81
108
|
registerSandbox: (session: SpawnSession, spec: SandboxSpec, ref: SandboxRef) => Promise<void>;
|
|
82
|
-
}
|
|
109
|
+
};
|
|
83
110
|
/** Clock and sleep seams, so a test can drive the slow-pod warning without waiting a minute. */
|
|
84
|
-
export
|
|
111
|
+
export type WaitForPodReadyDeps = {
|
|
85
112
|
readonly logger?: Logger;
|
|
86
113
|
readonly now?: () => number;
|
|
87
114
|
readonly sleep?: (ms: number) => Promise<void>;
|
|
88
|
-
}
|
|
89
|
-
export declare function waitForPodReady(coreApi:
|
|
115
|
+
};
|
|
116
|
+
export declare function waitForPodReady(coreApi: CorePodApi, namespace: string, sandboxId: string, deps?: WaitForPodReadyDeps): ResultAsync<{
|
|
90
117
|
podIP: string;
|
|
91
118
|
podName: string;
|
|
92
119
|
}, SandboxError>;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* the step tree under, so both sides address one directory by construction.
|
|
15
15
|
*/
|
|
16
16
|
import { join, relative as relativePath, sep } from "node:path";
|
|
17
|
+
import { setTimeout as timerSleep } from "node:timers/promises";
|
|
17
18
|
import { BatchV1Api, CoreV1Api, KubeConfig, } from "@kubernetes/client-node";
|
|
18
19
|
import { ResultAsync, err, ok } from "neverthrow";
|
|
19
20
|
import { trySandbox } from "./sandbox-error.js";
|
|
@@ -132,7 +133,7 @@ async function buildJobSpec(session, sandboxSpec, hostLabels, config, identity,
|
|
|
132
133
|
const env = Object.entries({
|
|
133
134
|
...threadLimitEnv(spec),
|
|
134
135
|
...plan.env,
|
|
135
|
-
...
|
|
136
|
+
...sandboxSpec.extraEnv,
|
|
136
137
|
}).map(([name, value]) => ({ name, value }));
|
|
137
138
|
// requests == limits → Guaranteed QoS and a predictable OOM bound; also
|
|
138
139
|
// satisfies the namespace ResourceQuota, which rejects any pod that omits
|
|
@@ -178,7 +179,7 @@ async function buildJobSpec(session, sandboxSpec, hostLabels, config, identity,
|
|
|
178
179
|
// Volume-level readOnly only when nothing writes through the claim:
|
|
179
180
|
// the cache mount needs write access, and the per-mount flags keep
|
|
180
181
|
// the store and the farm read-only either way.
|
|
181
|
-
persistentVolumeClaim: { claimName: config.libStorePvc,
|
|
182
|
+
persistentVolumeClaim: { claimName: config.libStorePvc, readOnly: cacheSubPath === undefined ? true : undefined },
|
|
182
183
|
});
|
|
183
184
|
volumeMounts.push({
|
|
184
185
|
name: LIBS_VOLUME_NAME,
|
|
@@ -295,7 +296,7 @@ export function waitForPodReady(coreApi, namespace, sandboxId, deps = {}) {
|
|
|
295
296
|
cause,
|
|
296
297
|
});
|
|
297
298
|
const now = deps.now ?? (() => Date.now());
|
|
298
|
-
const sleep = deps.sleep ??
|
|
299
|
+
const sleep = deps.sleep ?? timerSleep;
|
|
299
300
|
const logger = (deps.logger ?? createNoopLogger()).named("k8s-client");
|
|
300
301
|
return new ResultAsync((async () => {
|
|
301
302
|
const startedAt = now();
|
|
@@ -378,7 +379,7 @@ function waitForJobGone(batchApi, namespace, name) {
|
|
|
378
379
|
return ok(undefined);
|
|
379
380
|
return err(read.error);
|
|
380
381
|
}
|
|
381
|
-
await
|
|
382
|
+
await timerSleep(500);
|
|
382
383
|
}
|
|
383
384
|
return err(createFailed(undefined, new Error(`K8sSandbox ${name}: prior Job did not delete within 60s`)));
|
|
384
385
|
})());
|
|
@@ -501,7 +502,7 @@ export function createK8sSandboxOps(config) {
|
|
|
501
502
|
// finishes) — the Job controller retries pod creation forever. Delete
|
|
502
503
|
// the Job on any startup failure so a failed create can't leak a
|
|
503
504
|
// zombie that floods k8s events indefinitely.
|
|
504
|
-
const ready = await waitForPodReady(coreApi, config.namespace, sandboxId, {
|
|
505
|
+
const ready = await waitForPodReady(coreApi, config.namespace, sandboxId, { logger: config.logger });
|
|
505
506
|
if (ready.isOk()) {
|
|
506
507
|
const ref = {
|
|
507
508
|
sandboxId,
|
package/dist/sandbox/labels.js
CHANGED
|
@@ -27,6 +27,7 @@ export const STEP_ID_LABEL = "cortex/step-id";
|
|
|
27
27
|
*/
|
|
28
28
|
export const OWNER_WORKFLOW_KEY = "cortex/owner-workflow-id";
|
|
29
29
|
/** A valid K8s label value: 1 to 63 characters, `[A-Za-z0-9._-]` only, a letter or a digit at each end. */
|
|
30
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the K8s label-value grammar: the bounded charset with the letter-or-digit ends; the shape is the K8s validation rule.
|
|
30
31
|
const LABEL_VALUE = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,61}[A-Za-z0-9])?$/;
|
|
31
32
|
/** The harness never applies it to a host value. */
|
|
32
33
|
export function isLabelValue(value) {
|
package/dist/sandbox/liveness.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* versus live-but-slow, invoked through {@link probeLiveness} once
|
|
10
10
|
* {@link createEscalationPolicy} arms.
|
|
11
11
|
*/
|
|
12
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
13
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
12
14
|
/**
|
|
13
15
|
* Consecutive `unavailable` polls tolerated before probing. On the fast poll
|
|
14
16
|
* cadence (~1.5 s) this is seconds of silence before the first probe — a dead
|
|
@@ -50,7 +52,7 @@ export async function probeLiveness(isAlive, ref) {
|
|
|
50
52
|
liveness = await isAlive(ref);
|
|
51
53
|
}
|
|
52
54
|
catch (cause) {
|
|
53
|
-
return { kind: "inconclusive", detail: cause
|
|
55
|
+
return { kind: "inconclusive", detail: errorMessageOf(cause) ?? textOf(cause) };
|
|
54
56
|
}
|
|
55
57
|
return liveness.alive ? { kind: "alive" } : { kind: "dead", oomKilled: liveness.oomKilled };
|
|
56
58
|
}
|
|
@@ -46,7 +46,7 @@ export declare const FARM_CACHE_CONTAINER_PATH = "/mnt/libs/cache";
|
|
|
46
46
|
* images name that path.
|
|
47
47
|
*/
|
|
48
48
|
export declare function farmContainerPath(toolchainSource: ToolchainSource | undefined): string;
|
|
49
|
-
export
|
|
49
|
+
export type MountPlanCoords = {
|
|
50
50
|
analysisId: string;
|
|
51
51
|
runId: string;
|
|
52
52
|
stepId: string;
|
|
@@ -64,9 +64,9 @@ export interface MountPlanCoords {
|
|
|
64
64
|
* contradiction, and the builders refuse it.
|
|
65
65
|
*/
|
|
66
66
|
writableTail?: string;
|
|
67
|
-
}
|
|
67
|
+
};
|
|
68
68
|
export declare function mountCoordsOf(session: SpawnSession, spec: Pick<SandboxSpec, "readOnly" | "writableTail">): MountPlanCoords;
|
|
69
|
-
export
|
|
69
|
+
export type MountPlanStores = {
|
|
70
70
|
/** Lib store is mounted at `/mnt/libs`, with the farm nested inside it, and its env is emitted. */
|
|
71
71
|
libs: boolean;
|
|
72
72
|
/** Ref store is mounted at `/mnt/refs`. */
|
|
@@ -79,8 +79,8 @@ export interface MountPlanStores {
|
|
|
79
79
|
toolchainSource?: ToolchainSource;
|
|
80
80
|
/** The farm resolution carries a cache location, mounted read-write at `/mnt/libs/cache`. */
|
|
81
81
|
cache?: boolean;
|
|
82
|
-
}
|
|
83
|
-
export
|
|
82
|
+
};
|
|
83
|
+
export type MountPlan = {
|
|
84
84
|
/** Flat read-only mount of the whole analysis tree. */
|
|
85
85
|
readonlyTreePath: string;
|
|
86
86
|
/**
|
|
@@ -106,21 +106,21 @@ export interface MountPlan {
|
|
|
106
106
|
stepSubdirs: readonly string[];
|
|
107
107
|
/** Env merged into the sandbox container: provenance + lib-store vars. */
|
|
108
108
|
env: Record<string, string>;
|
|
109
|
-
}
|
|
109
|
+
};
|
|
110
110
|
/** K8s `subPath` strings into the session PVC. No leading or trailing slash. */
|
|
111
|
-
export
|
|
111
|
+
export type SessionSubPaths = {
|
|
112
112
|
/** Read-only mount of the whole analysis tree. */
|
|
113
113
|
readonly ro: string;
|
|
114
114
|
/** Read-write mount of the step's artifact dir, or of the declared tail; absent when read-only. */
|
|
115
115
|
readonly rw?: string;
|
|
116
|
-
}
|
|
116
|
+
};
|
|
117
117
|
/** The one writable mount of a sandbox: its workspace-relative tail, and what the host pre-makes under it. */
|
|
118
|
-
export
|
|
118
|
+
export type SandboxWriteTail = {
|
|
119
119
|
/** The tail beneath the workspace root, in both container and PVC-relative space. */
|
|
120
120
|
readonly tail: string;
|
|
121
121
|
/** The subdirectories the host pre-creates under the tail. A declared tail is one directory, thus none. */
|
|
122
122
|
readonly subdirs: readonly string[];
|
|
123
|
-
}
|
|
123
|
+
};
|
|
124
124
|
/**
|
|
125
125
|
* The write tail of a sandbox, or `undefined` when the sandbox holds no write mount.
|
|
126
126
|
*
|