@inflexa-ai/harness 0.45.0 → 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 +19 -3
- package/dist/agents/conversation-agent.js +49 -30
- 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 +35 -16
- package/dist/agents/sandbox/shared.js +63 -24
- package/dist/agents/sandbox/translational-safety-agent.js +26 -0
- package/dist/agents/sandbox/types.d.ts +26 -3
- 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 +16 -2
- package/dist/agents/sandbox-catalog.js +22 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/approve-plan.d.ts +5 -2
- package/dist/app/approve-plan.js +1 -1
- 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 +125 -99
- 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 +10 -8
- 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 +46 -22
- package/dist/contracts/chat-events.js +1 -1
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +67 -40
- 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 +3 -3
- 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 +45 -6
- package/dist/contracts/schemas/chat-events.js +16 -0
- package/dist/contracts/schemas/chat-parts.d.ts +214 -102
- package/dist/contracts/schemas/chat-parts.js +50 -7
- package/dist/contracts/schemas/index.d.ts +1 -1
- package/dist/contracts/schemas/index.js +1 -1
- 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 +7 -6
- package/dist/execution/dbos-workflow-purger.js +29 -21
- 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 +39 -17
- package/dist/execution/run-canceler.js +137 -28
- package/dist/execution/run-end-record.d.ts +29 -0
- package/dist/execution/run-end-record.js +27 -0
- 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 +25 -24
- package/dist/index.js +36 -37
- 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 +14 -9
- package/dist/loop/compaction.js +17 -0
- 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 +34 -37
- 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 -6
- package/dist/memory/conversation-display-recorder.js +64 -20
- 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 +66 -24
- package/dist/memory/thread-history.js +212 -79
- 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 +63 -9
- package/dist/prompts/briefing.js +130 -3
- package/dist/prompts/planner.js +13 -2
- 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 +24 -19
- package/dist/provenance/seam.js +7 -5
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +303 -458
- 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 +59 -92
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +166 -10
- 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 +209 -231
- 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.d.ts +26 -4
- package/dist/sandbox/image-packages.js +29 -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 +351 -306
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +79 -25
- package/dist/schemas/plan-schemas.js +1 -1
- 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 +127 -14
- package/dist/schemas/workflow-state.js +56 -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 +47 -18
- package/dist/state/artifacts.js +48 -7
- 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 +5 -5
- package/dist/state/index.js +3 -3
- 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 +70 -25
- package/dist/state/runs.js +127 -64
- 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 +29 -8
- package/dist/state/step-executions.js +28 -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 +11 -9
- package/dist/tools/ad-hoc-router.js +80 -51
- 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 +40 -0
- package/dist/tools/capability-data.js +74 -0
- 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 +54 -17
- package/dist/tools/execute-analysis.js +193 -62
- package/dist/tools/knowledge/check.d.ts +182 -0
- package/dist/tools/knowledge/check.js +94 -0
- package/dist/tools/knowledge/client.d.ts +351 -0
- package/dist/tools/knowledge/client.js +319 -0
- package/dist/tools/knowledge/environment.d.ts +78 -0
- package/dist/tools/knowledge/environment.js +116 -0
- package/dist/tools/knowledge/index.d.ts +49 -0
- package/dist/tools/knowledge/index.js +70 -0
- package/dist/tools/knowledge/local-slots.d.ts +62 -0
- package/dist/tools/knowledge/local-slots.js +184 -0
- package/dist/tools/knowledge/pin.d.ts +14 -0
- package/dist/tools/knowledge/pin.js +17 -0
- package/dist/tools/knowledge/recommend.d.ts +67 -0
- package/dist/tools/knowledge/recommend.js +106 -0
- package/dist/tools/knowledge/situation.d.ts +143 -0
- package/dist/tools/knowledge/situation.js +157 -0
- package/dist/tools/knowledge/skeleton.d.ts +69 -0
- package/dist/tools/knowledge/skeleton.js +201 -0
- package/dist/tools/knowledge/template.d.ts +139 -0
- package/dist/tools/knowledge/template.js +273 -0
- 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 +39 -16
- package/dist/tools/research/generate-plan.js +565 -338
- package/dist/tools/research/guarded-address.d.ts +20 -0
- package/dist/tools/research/guarded-address.js +149 -0
- 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 +40 -0
- package/dist/tools/research/searxng-engine.js +122 -0
- package/dist/tools/research/web-fetch.d.ts +127 -0
- package/dist/tools/research/web-fetch.js +618 -0
- package/dist/tools/research/web-search.d.ts +84 -0
- package/dist/tools/research/web-search.js +117 -0
- 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 +24 -12
- package/dist/tools/sandbox/list-available-packages.js +43 -29
- package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
- package/dist/tools/sandbox/list-available-refs.js +119 -37
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +22 -68
- 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 +14 -0
- package/dist/tools/terminal-text.js +51 -0
- package/dist/tools/workspace/decision-record.d.ts +81 -0
- package/dist/tools/workspace/decision-record.js +127 -0
- package/dist/tools/workspace/edit-file.d.ts +59 -18
- package/dist/tools/workspace/edit-file.js +98 -15
- package/dist/tools/workspace/execute-command.d.ts +31 -12
- package/dist/tools/workspace/execute-command.js +37 -8
- 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/index.d.ts +1 -0
- package/dist/tools/workspace/index.js +1 -0
- 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 +100 -76
- package/dist/workflows/execute-analysis.js +380 -247
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +50 -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 +25 -22
- 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 -236
- package/dist/loop/run-agent.js +0 -1110
- 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 -90
- 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/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
|
*
|
|
@@ -52,8 +52,8 @@ export function mountCoordsOf(session, spec) {
|
|
|
52
52
|
analysisId: session.scope.analysisId,
|
|
53
53
|
runId: session.runFrame.runId,
|
|
54
54
|
stepId: session.runFrame.stepId,
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
readOnly: spec.readOnly,
|
|
56
|
+
writableTail: spec.writableTail,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
@@ -110,7 +110,7 @@ export function buildSessionSubPaths(coords, workspaceSubPath) {
|
|
|
110
110
|
const write = sandboxWriteTail(coords);
|
|
111
111
|
return {
|
|
112
112
|
ro: workspaceSubPath,
|
|
113
|
-
|
|
113
|
+
rw: write === undefined ? undefined : `${workspaceSubPath}/${write.tail}`,
|
|
114
114
|
};
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
@@ -135,17 +135,16 @@ function libStoreEnv(toolchainSource, cache) {
|
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
137
|
const farm = farmContainerPath(toolchainSource);
|
|
138
|
-
|
|
138
|
+
const env = {
|
|
139
139
|
R_LIBS_SITE: `${farm}/r/github:${farm}/r/bioconductor:${farm}/r/cran`,
|
|
140
140
|
NODE_PATH: "/opt/node/node_modules",
|
|
141
141
|
PATH: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/conda/bin:${farm}/python/bin`,
|
|
142
|
-
...(cache
|
|
143
|
-
? {
|
|
144
|
-
NUMBA_CACHE_DIR: `${FARM_CACHE_CONTAINER_PATH}/numba-cache`,
|
|
145
|
-
MPLCONFIGDIR: `${FARM_CACHE_CONTAINER_PATH}/matplotlib_config`,
|
|
146
|
-
}
|
|
147
|
-
: {}),
|
|
148
142
|
};
|
|
143
|
+
if (cache) {
|
|
144
|
+
env.NUMBA_CACHE_DIR = `${FARM_CACHE_CONTAINER_PATH}/numba-cache`;
|
|
145
|
+
env.MPLCONFIGDIR = `${FARM_CACHE_CONTAINER_PATH}/matplotlib_config`;
|
|
146
|
+
}
|
|
147
|
+
return env;
|
|
149
148
|
}
|
|
150
149
|
export function buildMountPlan(coords, stores) {
|
|
151
150
|
const { analysisId } = coords;
|
|
@@ -156,6 +155,9 @@ export function buildMountPlan(coords, stores) {
|
|
|
156
155
|
const write = sandboxWriteTail(coords);
|
|
157
156
|
const writableStepPath = write === undefined ? undefined : `${readonlyTreePath}/${write.tail}`;
|
|
158
157
|
const cache = stores.libs && stores.cache === true;
|
|
158
|
+
const env = { PROVENANCE_WATCH_DIRS: readonlyTreePath };
|
|
159
|
+
if (stores.libs)
|
|
160
|
+
Object.assign(env, libStoreEnv(stores.toolchainSource, cache));
|
|
159
161
|
return {
|
|
160
162
|
readonlyTreePath,
|
|
161
163
|
writableStepPath,
|
|
@@ -165,9 +167,6 @@ export function buildMountPlan(coords, stores) {
|
|
|
165
167
|
cachePath: cache ? FARM_CACHE_CONTAINER_PATH : undefined,
|
|
166
168
|
refsPath: stores.refs ? REFS_CONTAINER_PATH : undefined,
|
|
167
169
|
stepSubdirs: write?.subdirs ?? [],
|
|
168
|
-
env
|
|
169
|
-
PROVENANCE_WATCH_DIRS: readonlyTreePath,
|
|
170
|
-
...(stores.libs ? libStoreEnv(stores.toolchainSource, cache) : {}),
|
|
171
|
-
},
|
|
170
|
+
env,
|
|
172
171
|
};
|
|
173
172
|
}
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import type { Pool } from "pg";
|
|
17
17
|
import type { Logger } from "../lib/logger.js";
|
|
18
|
-
export
|
|
18
|
+
export type SweepDeps = {
|
|
19
19
|
/**
|
|
20
20
|
* Execute the bounded DELETE. Returns the row count cleared. Injected
|
|
21
21
|
* for tests; production wires the app pool.
|
|
22
22
|
*/
|
|
23
23
|
deleteStale: (limit: number) => Promise<number>;
|
|
24
24
|
logger?: Logger;
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
26
|
export declare function sweepStaleNotifications(deps: SweepDeps): Promise<number>;
|
|
27
27
|
/**
|
|
28
28
|
* Default `deleteStale` for production — issues the bounded DELETE
|
|
@@ -30,10 +30,10 @@ export declare function sweepStaleNotifications(deps: SweepDeps): Promise<number
|
|
|
30
30
|
* to. The CTE form keeps the join + the LIMIT in one statement.
|
|
31
31
|
*/
|
|
32
32
|
export declare function makeDefaultDeleteStale(pool: Pool): (limit: number) => Promise<number>;
|
|
33
|
-
export
|
|
33
|
+
export type RegisterNotificationSweepDeps = {
|
|
34
34
|
pool: Pool;
|
|
35
35
|
logger?: Logger;
|
|
36
36
|
/** Override the DELETE driver — production defaults to the app pool. */
|
|
37
37
|
deleteStale?: (limit: number) => Promise<number>;
|
|
38
|
-
}
|
|
38
|
+
};
|
|
39
39
|
export declare function registerNotificationSweep(deps: RegisterNotificationSweepDeps): void;
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
17
17
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
18
18
|
import { untracedWorkflow } from "../lib/otel-spans.js";
|
|
19
|
+
import { scheduleWorkflow } from "../runtime/dbos.js";
|
|
19
20
|
const SWEEP_CRON = "0 */5 * * * *";
|
|
20
21
|
const SWEEP_WORKFLOW = "dbos-notifications-sweep";
|
|
21
22
|
const DELETE_BATCH_LIMIT = 10_000;
|
|
@@ -62,15 +63,11 @@ export function makeDefaultDeleteStale(pool) {
|
|
|
62
63
|
}
|
|
63
64
|
export function registerNotificationSweep(deps) {
|
|
64
65
|
const deleteStale = deps.deleteStale ?? makeDefaultDeleteStale(deps.pool);
|
|
65
|
-
// The scheduled target must itself be a registered workflow
|
|
66
|
-
//
|
|
67
|
-
// a workflow registration. Register, then schedule the same callable.
|
|
66
|
+
// The scheduled target must itself be a registered workflow. Register, then
|
|
67
|
+
// schedule the same callable.
|
|
68
68
|
const sweep = DBOS.registerWorkflow(async () => {
|
|
69
69
|
await sweepStaleNotifications({ deleteStale, logger: deps.logger });
|
|
70
70
|
}, { name: SWEEP_WORKFLOW });
|
|
71
71
|
untracedWorkflow(SWEEP_WORKFLOW);
|
|
72
|
-
|
|
73
|
-
name: SWEEP_WORKFLOW,
|
|
74
|
-
crontab: SWEEP_CRON,
|
|
75
|
-
});
|
|
72
|
+
scheduleWorkflow({ scheduleName: SWEEP_WORKFLOW, workflowFn: sweep, schedule: SWEEP_CRON });
|
|
76
73
|
}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Two types carry the two ideas. A {@link PackageQuery} is what a person or an
|
|
11
11
|
* agent asked: a spelling, an optional track, an optional version. A
|
|
12
|
-
* {@link PackageIdentity} is the name that an ecosystem recognizes. The
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* {@link PackageIdentity} is the name that an ecosystem recognizes. The name is
|
|
13
|
+
* a plain string, so the type alone cannot make a caller construct through the
|
|
14
|
+
* rule; the guard is the constructor funnel — every identity comes from
|
|
15
|
+
* {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}, and each
|
|
16
|
+
* of them validates and folds the name before it hands one out.
|
|
15
17
|
*
|
|
16
18
|
* The PEP 503 fold lives in exactly one function of this file. The provisioner
|
|
17
19
|
* holds the Python twin, `images/sandbox-provisioner/package_identity.py`, and
|
|
@@ -34,12 +36,6 @@ export type PackageQuery = {
|
|
|
34
36
|
readonly track?: Track;
|
|
35
37
|
readonly version?: string;
|
|
36
38
|
};
|
|
37
|
-
/**
|
|
38
|
-
* The brand of an identity name. It has no runtime value: it exists so that a
|
|
39
|
-
* literal `{ track, name }` fails the typecheck outside this module, and thus
|
|
40
|
-
* every identity comes from a constructor that applied the rule of its track.
|
|
41
|
-
*/
|
|
42
|
-
declare const identityBrand: unique symbol;
|
|
43
39
|
/**
|
|
44
40
|
* The name that one ecosystem recognizes, under the track that holds it.
|
|
45
41
|
*
|
|
@@ -50,9 +46,7 @@ declare const identityBrand: unique symbol;
|
|
|
50
46
|
*/
|
|
51
47
|
export type PackageIdentity = {
|
|
52
48
|
readonly track: Track;
|
|
53
|
-
readonly name: string
|
|
54
|
-
readonly [identityBrand]: true;
|
|
55
|
-
};
|
|
49
|
+
readonly name: string;
|
|
56
50
|
};
|
|
57
51
|
/**
|
|
58
52
|
* The Python identity of a spelling. The name folds, because PEP 503 makes
|
|
@@ -205,4 +199,3 @@ export type QueryResolution = {
|
|
|
205
199
|
* `decoupler`, and the R package never links.
|
|
206
200
|
*/
|
|
207
201
|
export declare function resolveQuery(query: PackageQuery, pool: PoolIndex): QueryResolution;
|
|
208
|
-
export {};
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Two types carry the two ideas. A {@link PackageQuery} is what a person or an
|
|
11
11
|
* agent asked: a spelling, an optional track, an optional version. A
|
|
12
|
-
* {@link PackageIdentity} is the name that an ecosystem recognizes. The
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* {@link PackageIdentity} is the name that an ecosystem recognizes. The name is
|
|
13
|
+
* a plain string, so the type alone cannot make a caller construct through the
|
|
14
|
+
* rule; the guard is the constructor funnel — every identity comes from
|
|
15
|
+
* {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}, and each
|
|
16
|
+
* of them validates and folds the name before it hands one out.
|
|
15
17
|
*
|
|
16
18
|
* The PEP 503 fold lives in exactly one function of this file. The provisioner
|
|
17
19
|
* holds the Python twin, `images/sandbox-provisioner/package_identity.py`, and
|
|
@@ -24,19 +26,22 @@ import { err, ok } from "neverthrow";
|
|
|
24
26
|
* idempotent, thus a fold of a folded name gives that name again.
|
|
25
27
|
*/
|
|
26
28
|
function fold(name) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
let out = "";
|
|
30
|
+
let inRun = false;
|
|
31
|
+
for (const char of name) {
|
|
32
|
+
if (char === "-" || char === "_" || char === ".") {
|
|
33
|
+
inRun = true;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (inRun) {
|
|
37
|
+
out += "-";
|
|
38
|
+
inRun = false;
|
|
39
|
+
}
|
|
40
|
+
out += char;
|
|
41
|
+
}
|
|
42
|
+
if (inRun)
|
|
43
|
+
out += "-";
|
|
44
|
+
return out.toLowerCase();
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
42
47
|
* The Python identity of a spelling. The name folds, because PEP 503 makes
|
|
@@ -45,7 +50,7 @@ function brand(name) {
|
|
|
45
50
|
* @param spelling The distribution name, as the caller spells it.
|
|
46
51
|
*/
|
|
47
52
|
export function pythonIdentity(spelling) {
|
|
48
|
-
return { track: "python", name:
|
|
53
|
+
return { track: "python", name: fold(spelling) };
|
|
49
54
|
}
|
|
50
55
|
/**
|
|
51
56
|
* The R identity of a name. The name keeps its spelling, because `library()`
|
|
@@ -54,7 +59,7 @@ export function pythonIdentity(spelling) {
|
|
|
54
59
|
* @param name The DESCRIPTION `Package` value.
|
|
55
60
|
*/
|
|
56
61
|
export function rIdentity(name) {
|
|
57
|
-
return { track: "r", name
|
|
62
|
+
return { track: "r", name };
|
|
58
63
|
}
|
|
59
64
|
/**
|
|
60
65
|
* The identity of a name that an emitter already minted — a graph node, a lock
|
|
@@ -113,10 +118,23 @@ export function identityAddress(identity) {
|
|
|
113
118
|
* A path, a URL, or a store directory. The entry is trimmed already, thus a
|
|
114
119
|
* leading space cannot defeat the guard.
|
|
115
120
|
*/
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
/**
|
|
121
|
+
function isLocation(entry) {
|
|
122
|
+
return entry.startsWith(".") || entry.startsWith("~") || entry.includes("/") || entry.includes("\\") || entry.includes("://");
|
|
123
|
+
}
|
|
124
|
+
/** The `<word>:` prefix of an entry, or `undefined` when the word before the colon is empty or starts outside the letters. */
|
|
125
|
+
function prefixWordOf(entry) {
|
|
126
|
+
const at = entry.indexOf(":");
|
|
127
|
+
if (at < 1)
|
|
128
|
+
return undefined;
|
|
129
|
+
const word = entry.slice(0, at);
|
|
130
|
+
const first = word.charAt(0);
|
|
131
|
+
const isLeadingLetter = (first >= "A" && first <= "Z") || (first >= "a" && first <= "z");
|
|
132
|
+
if (!isLeadingLetter)
|
|
133
|
+
return undefined;
|
|
134
|
+
const isWordChar = (char) => (char >= "A" && char <= "Z") || (char >= "a" && char <= "z") || (char >= "0" && char <= "9") || char === "_" || char === "." || char === "-";
|
|
135
|
+
return Array.from(word).every(isWordChar) ? word : undefined;
|
|
136
|
+
}
|
|
137
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the specifier grammar is a run of comparison characters; the parser reads the first run verbatim to accept only `==` and to report any other run.
|
|
120
138
|
const SPECIFIER = /[<>!~=]+/;
|
|
121
139
|
/**
|
|
122
140
|
* A run of characters that an exact version cannot hold: a specifier
|
|
@@ -124,6 +142,7 @@ const SPECIFIER = /[<>!~=]+/;
|
|
|
124
142
|
* thus `numpy==1.26,<2` gives the version `1.26,<2` without this guard, and
|
|
125
143
|
* the compound range then rides into the pool as a version string.
|
|
126
144
|
*/
|
|
145
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the guard reads the first intruder run of the version text to report it verbatim; the run is the compound specifier the pool must not see.
|
|
127
146
|
const VERSION_INTRUDER = /[<>!~=,\s]+/;
|
|
128
147
|
/**
|
|
129
148
|
* Read one entry of the grammar `[python:|r:]<spelling>[==<version>]`.
|
|
@@ -139,10 +158,9 @@ export function parseQuery(entry) {
|
|
|
139
158
|
const trimmed = entry.trim();
|
|
140
159
|
if (trimmed === "")
|
|
141
160
|
return err({ type: "empty" });
|
|
142
|
-
if (
|
|
161
|
+
if (isLocation(trimmed))
|
|
143
162
|
return err({ type: "location", entry: trimmed });
|
|
144
|
-
const
|
|
145
|
-
const word = prefix?.[1];
|
|
163
|
+
const word = prefixWordOf(trimmed);
|
|
146
164
|
if (word !== undefined && word !== "python" && word !== "r") {
|
|
147
165
|
return err({ type: "unknown_prefix", prefix: word, entry: trimmed });
|
|
148
166
|
}
|
|
@@ -152,7 +170,7 @@ export function parseQuery(entry) {
|
|
|
152
170
|
return err({ type: "empty" });
|
|
153
171
|
const specifier = SPECIFIER.exec(rest);
|
|
154
172
|
if (specifier === null)
|
|
155
|
-
return ok({ spelling: rest,
|
|
173
|
+
return ok({ spelling: rest, track });
|
|
156
174
|
if (specifier[0] !== "==") {
|
|
157
175
|
return err({ type: "unsupported_specifier", specifier: specifier[0], entry: trimmed });
|
|
158
176
|
}
|
|
@@ -172,8 +190,8 @@ export function parseQuery(entry) {
|
|
|
172
190
|
}
|
|
173
191
|
return ok({
|
|
174
192
|
spelling,
|
|
175
|
-
|
|
176
|
-
|
|
193
|
+
track,
|
|
194
|
+
version: version === "" ? undefined : version,
|
|
177
195
|
});
|
|
178
196
|
}
|
|
179
197
|
/**
|
package/dist/sandbox/reaper.d.ts
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* hoisted for unit testing without a DBOS runtime; `registerSandboxReaper` is
|
|
20
20
|
* the thin production wiring.
|
|
21
21
|
*/
|
|
22
|
-
import type { Pool } from "pg";
|
|
23
22
|
import type { Logger } from "../lib/logger.js";
|
|
23
|
+
import type { Querier } from "../state/db.js";
|
|
24
24
|
import type { SandboxClient } from "./client.js";
|
|
25
25
|
import type { ManagedSandbox } from "./types.js";
|
|
26
26
|
export type ReapDecision = "leave" | "reap" | "reap-if-dead";
|
|
@@ -41,8 +41,8 @@ export declare function classifyManaged(sb: ManagedSandbox, status: {
|
|
|
41
41
|
} | null, nowMs: number, graceMs: number): ReapDecision;
|
|
42
42
|
/** Map the owning workflow's terminal status to the step row's terminal status. */
|
|
43
43
|
export declare function terminalStepStatus(workflowStatus: string | null): "canceled" | "failed" | "completed";
|
|
44
|
-
export
|
|
45
|
-
pool:
|
|
44
|
+
export type ReaperDeps = {
|
|
45
|
+
pool: Querier;
|
|
46
46
|
sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById" | "isAliveById">;
|
|
47
47
|
getStatus: (workflowId: string) => Promise<{
|
|
48
48
|
status: string;
|
|
@@ -52,8 +52,8 @@ export interface ReaperDeps {
|
|
|
52
52
|
/** Wall-clock ms; injected for tests. */
|
|
53
53
|
nowMs?: () => number;
|
|
54
54
|
logger?: Logger;
|
|
55
|
-
}
|
|
56
|
-
export
|
|
55
|
+
};
|
|
56
|
+
export type ReapSummary = {
|
|
57
57
|
managedCount: number;
|
|
58
58
|
reapedCount: number;
|
|
59
59
|
rowsReconciled: number;
|
|
@@ -64,18 +64,18 @@ export interface ReapSummary {
|
|
|
64
64
|
* *and* a bug signal — it means owner ids are not round-tripping.
|
|
65
65
|
*/
|
|
66
66
|
liveUnattributed: number;
|
|
67
|
-
}
|
|
67
|
+
};
|
|
68
68
|
/**
|
|
69
69
|
* One cluster→registry sweep. Lists managed machines, classifies each against
|
|
70
70
|
* its owner workflow's status, and reaps the terminal/orphaned ones. A reap
|
|
71
71
|
* failure on one machine is logged and skipped — the next sweep retries.
|
|
72
72
|
*/
|
|
73
73
|
export declare function reapOnce(deps: ReaperDeps): Promise<ReapSummary>;
|
|
74
|
-
export
|
|
75
|
-
pool:
|
|
74
|
+
export type RegisterReaperDeps = {
|
|
75
|
+
pool: Querier;
|
|
76
76
|
sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById" | "isAliveById">;
|
|
77
77
|
graceMs?: number;
|
|
78
78
|
logger?: Logger;
|
|
79
|
-
}
|
|
80
|
-
/** Production registration: a single (unsharded)
|
|
79
|
+
};
|
|
80
|
+
/** Production registration: a single (unsharded) scheduled workflow. */
|
|
81
81
|
export declare function registerSandboxReaper(deps: RegisterReaperDeps): void;
|
package/dist/sandbox/reaper.js
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
23
23
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
24
24
|
import { untracedWorkflow } from "../lib/otel-spans.js";
|
|
25
|
+
import { scheduleWorkflow } from "../runtime/dbos.js";
|
|
25
26
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
26
27
|
import { reconcileReapedSandbox } from "../state/active-sandboxes.js";
|
|
27
28
|
const REAPER_CRON = "0 */5 * * * *";
|
|
@@ -138,7 +139,7 @@ export async function reapOnce(deps) {
|
|
|
138
139
|
logger.info("sweep completed", { ...summary });
|
|
139
140
|
return summary;
|
|
140
141
|
}
|
|
141
|
-
/** Production registration: a single (unsharded)
|
|
142
|
+
/** Production registration: a single (unsharded) scheduled workflow. */
|
|
142
143
|
export function registerSandboxReaper(deps) {
|
|
143
144
|
const reaper = DBOS.registerWorkflow(async () => {
|
|
144
145
|
// The whole sweep is ONE step: `listManagedSandboxes` is live cluster
|
|
@@ -150,14 +151,11 @@ export function registerSandboxReaper(deps) {
|
|
|
150
151
|
await DBOS.runStep(() => reapOnce({
|
|
151
152
|
pool: deps.pool,
|
|
152
153
|
sandboxClient: deps.sandboxClient,
|
|
153
|
-
getStatus: async (workflowId) =>
|
|
154
|
+
getStatus: async (workflowId) => await DBOS.getWorkflowStatus(workflowId),
|
|
154
155
|
graceMs: deps.graceMs,
|
|
155
156
|
logger: deps.logger,
|
|
156
157
|
}), { name: "sandbox-reaper-sweep" });
|
|
157
158
|
}, { name: REAPER_WORKFLOW });
|
|
158
159
|
untracedWorkflow(REAPER_WORKFLOW);
|
|
159
|
-
|
|
160
|
-
name: REAPER_WORKFLOW,
|
|
161
|
-
crontab: REAPER_CRON,
|
|
162
|
-
});
|
|
160
|
+
scheduleWorkflow({ scheduleName: REAPER_WORKFLOW, workflowFn: reaper, schedule: REAPER_CRON });
|
|
163
161
|
}
|
|
@@ -85,8 +85,8 @@ export type SandboxError = {
|
|
|
85
85
|
/**
|
|
86
86
|
* The label hook of the host refused the spawn. The client made no
|
|
87
87
|
* step tree and called no backend. `reason` is the text of the host,
|
|
88
|
-
* and `suspend` asks
|
|
89
|
-
* failure (see `
|
|
88
|
+
* and `suspend` asks a caller inside a workflow to pause the work in
|
|
89
|
+
* place of a failure (see `workflows/pause.ts`).
|
|
90
90
|
*/
|
|
91
91
|
readonly type: "labels_refused";
|
|
92
92
|
readonly op: string;
|
|
@@ -122,13 +122,6 @@ export type SandboxError = {
|
|
|
122
122
|
readonly lockError: FarmLockError["type"];
|
|
123
123
|
readonly cause: unknown;
|
|
124
124
|
};
|
|
125
|
-
/**
|
|
126
|
-
* The HTTP/driver status a backend SDK error carries. dockerode exposes it on
|
|
127
|
-
* `.statusCode`; `@kubernetes/client-node` (v1.x) on `.code` (a number).
|
|
128
|
-
* Mirror the per-client `statusCodeOf` so 404/409 classification is identical.
|
|
129
|
-
* A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
|
|
130
|
-
* `typeof === "number"` to avoid returning it as a status.
|
|
131
|
-
*/
|
|
132
125
|
export declare function sandboxStatusOf(cause: unknown): number | undefined;
|
|
133
126
|
/**
|
|
134
127
|
* A one-line, user-facing description of a `SandboxError` for logs/error
|
|
@@ -37,7 +37,9 @@
|
|
|
37
37
|
* step and throws directly, so the seam forwards its promise as-is.)
|
|
38
38
|
*/
|
|
39
39
|
import { ResultAsync, err, ok } from "neverthrow";
|
|
40
|
-
import { ZodError } from "zod";
|
|
40
|
+
import { z, ZodError } from "zod";
|
|
41
|
+
import { presentFirst } from "../lib/present.js";
|
|
42
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
41
43
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
42
44
|
const _assertDomainError = true;
|
|
43
45
|
/**
|
|
@@ -47,11 +49,22 @@ const _assertDomainError = true;
|
|
|
47
49
|
* A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
|
|
48
50
|
* `typeof === "number"` to avoid returning it as a status.
|
|
49
51
|
*/
|
|
52
|
+
/** The error fields the backend SDKs attach: dockerode `statusCode`, k8s numeric `code`, and the SDK `response`. */
|
|
53
|
+
const SandboxCauseSchema = z.looseObject({
|
|
54
|
+
code: z.unknown().optional(),
|
|
55
|
+
statusCode: z.unknown().optional(),
|
|
56
|
+
response: z.looseObject({ statusCode: z.unknown().optional() }).nullish(),
|
|
57
|
+
});
|
|
50
58
|
export function sandboxStatusOf(cause) {
|
|
51
|
-
const
|
|
59
|
+
const parsed = SandboxCauseSchema.safeParse(cause);
|
|
60
|
+
if (!parsed.success)
|
|
61
|
+
return undefined;
|
|
62
|
+
const e = parsed.data;
|
|
52
63
|
if (typeof e.code === "number")
|
|
53
64
|
return e.code;
|
|
54
|
-
|
|
65
|
+
if (typeof e.statusCode === "number")
|
|
66
|
+
return e.statusCode;
|
|
67
|
+
return typeof e.response?.statusCode === "number" ? e.response.statusCode : undefined;
|
|
55
68
|
}
|
|
56
69
|
/**
|
|
57
70
|
* The bound on the appended cause line — the same 200 characters the profile
|
|
@@ -78,16 +91,16 @@ function causeLine(cause) {
|
|
|
78
91
|
const path = issue.path.join(".");
|
|
79
92
|
text = path.length > 0 ? `${path}: ${issue.message}` : issue.message;
|
|
80
93
|
}
|
|
81
|
-
else if (cause instanceof Error) {
|
|
82
|
-
text = cause.message;
|
|
83
|
-
}
|
|
84
94
|
else if (typeof cause === "string") {
|
|
85
95
|
text = cause;
|
|
86
96
|
}
|
|
87
97
|
else {
|
|
88
|
-
|
|
98
|
+
const message = errorMessageOf(cause);
|
|
99
|
+
if (message === undefined)
|
|
100
|
+
return undefined;
|
|
101
|
+
text = message;
|
|
89
102
|
}
|
|
90
|
-
const first = text.split("\n", 1)
|
|
103
|
+
const first = presentFirst(text.split("\n", 1), "the first cause line").trim();
|
|
91
104
|
if (first.length === 0)
|
|
92
105
|
return undefined;
|
|
93
106
|
return first.length > CAUSE_LINE_MAX ? `${first.slice(0, CAUSE_LINE_MAX - 1)}…` : first;
|
|
@@ -23,16 +23,19 @@ export declare function stepPartId(kind: string, runId: string, stepId: string):
|
|
|
23
23
|
/**
|
|
24
24
|
* The two parts of one activity emission: the reconciling `data-step-activity` that holds the current activity,
|
|
25
25
|
* and the `data-activity-entry` that keeps the emission in the run stream. Both carry the same phase, activity,
|
|
26
|
-
* and time. `
|
|
27
|
-
*
|
|
26
|
+
* and time. `key` names the entry: the position of a body emission in the body of its workflow, or `tool-` and the
|
|
27
|
+
* id of the call for the emission of a tool call. A recovered body counts the same body emissions again, and a
|
|
28
|
+
* replayed tool step emits nothing, thus each entry keeps its id. Every producer mints the two parts here.
|
|
28
29
|
*/
|
|
29
30
|
export declare function activityEmission(frame: {
|
|
30
31
|
readonly runId: string;
|
|
31
32
|
readonly stepId: string;
|
|
32
|
-
},
|
|
33
|
+
}, key: number | string, phase: StepPhase, activity: string, at: string): {
|
|
33
34
|
readonly activity: StepActivityPart;
|
|
34
35
|
readonly entry: ActivityEntryPart;
|
|
35
36
|
};
|
|
37
|
+
/** The key of the activity entry of one tool call. */
|
|
38
|
+
export declare function toolActivityKey(toolUseId: string): string;
|
|
36
39
|
/**
|
|
37
40
|
* The two parts of one synthesis progress report: the reconciling `data-synthesis-progress` that holds the current
|
|
38
41
|
* phase, and the `data-activity-entry` that keeps the report in the run stream under the synthesis step. `seq` is the
|
|
@@ -65,11 +68,11 @@ export declare function synthesisEmission(runId: string, stepId: string, seq: nu
|
|
|
65
68
|
export declare function activityForTool(name: string, input?: unknown, resolveDetail?: ToolDetailResolver): string;
|
|
66
69
|
/** On-change working-tree delta the sandbox executor posts per exec (paths
|
|
67
70
|
* only; the executor skips directories). */
|
|
68
|
-
export
|
|
71
|
+
export type SandboxTreeDelta = {
|
|
69
72
|
added?: string[];
|
|
70
73
|
modified?: string[];
|
|
71
74
|
removed?: string[];
|
|
72
|
-
}
|
|
75
|
+
};
|
|
73
76
|
/** Extract the tree delta from a `data-sandbox-event` part, or null when the
|
|
74
77
|
* part is some other sandbox event. The wrapper shape is set by
|
|
75
78
|
* `run-exec.ts`: `{ type: "data-sandbox-event", data: { event } }`
|