@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
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RunCanceler — the encapsulated external-cancel path for an `executeAnalysis` run.
|
|
3
3
|
*
|
|
4
|
-
* A cancelled DBOS workflow can never
|
|
5
|
-
* terminal block (`collectAndComplete`)
|
|
6
|
-
* nothing converges: the run row stays `running` (blocking same-plan relaunch
|
|
7
|
-
* through `queryActiveRun`'s active-status dedup)
|
|
8
|
-
* sweep
|
|
9
|
-
*
|
|
10
|
-
* parent + children, then converge
|
|
4
|
+
* A cancelled DBOS workflow can never start another step, so the body's own
|
|
5
|
+
* terminal block (`collectAndComplete`) can be unreachable once the cancel lands
|
|
6
|
+
* and nothing converges: the run row stays `running` (blocking same-plan relaunch
|
|
7
|
+
* through `queryActiveRun`'s active-status dedup) and pending step rows never
|
|
8
|
+
* sweep. A step that started before the cancel still runs to its end, and its
|
|
9
|
+
* run status write is conditional on a `running` row. This module is the
|
|
10
|
+
* host-side counterpart: cancel the engine's parent + children, then converge
|
|
11
|
+
* the ledgers the workflow would have.
|
|
12
|
+
*
|
|
13
|
+
* The writer that wins the conditional terminal write of the run row owns the
|
|
14
|
+
* run end: the run emit, the charge close, and the mandate revoke. This module
|
|
15
|
+
* does those acts only when its write changed the row. A refused write means
|
|
16
|
+
* the body won the row and owns them; a failed write leaves the row `running`,
|
|
17
|
+
* so a second cancel converges the run. The step rows settle on every path.
|
|
18
|
+
*
|
|
19
|
+
* One exception: after a failed status write the body does the run end and
|
|
20
|
+
* records it as a workflow event (`run-end-record.ts`), while the row stays
|
|
21
|
+
* `running`. This module reads that record before its terminal write. A present
|
|
22
|
+
* record makes the terminal write carry the recorded status and error, and no
|
|
23
|
+
* act of the run end follows. A failed read writes nothing, so a second cancel
|
|
24
|
+
* converges the run.
|
|
11
25
|
*
|
|
12
26
|
* The engine capability stays internal — the production default is the
|
|
13
27
|
* purger's `DBOSClient`-backed child-cascading cancel, which needs no launched
|
|
14
28
|
* engine (see `dbos-workflow-purger.ts` for why the static `DBOS` facade is
|
|
15
|
-
* the wrong tool here). `cancelWorkflows` is an optional
|
|
29
|
+
* the wrong tool here). `cancelWorkflows` is an optional injected function over it.
|
|
16
30
|
*
|
|
17
31
|
* No stream writes: `DBOS.writeStream` writes only from inside the workflow
|
|
18
32
|
* that owns the stream, so the run-event reader (`run-event-stream.ts`)
|
|
@@ -22,13 +36,14 @@ import type { Pool } from "pg";
|
|
|
22
36
|
import type { AgentSession } from "../auth/types.js";
|
|
23
37
|
import type { RunCharge } from "../billing/run-charge.js";
|
|
24
38
|
import type { Logger } from "../lib/logger.js";
|
|
39
|
+
import type { ProvenanceSeam } from "../provenance/seam.js";
|
|
25
40
|
import type { RunStatus } from "../state/schema.js";
|
|
26
41
|
import type { RunAuthorizer } from "./run-authorizer.js";
|
|
27
42
|
export declare class UnknownRunError extends Error {
|
|
28
43
|
readonly runId: string;
|
|
29
44
|
constructor(runId: string);
|
|
30
45
|
}
|
|
31
|
-
export
|
|
46
|
+
export type CancelRunResult = {
|
|
32
47
|
readonly runId: string;
|
|
33
48
|
/** The DBOS parent workflow id — equal to `runId` by the launch contract
|
|
34
49
|
* (`execute_analysis` launches with `workflowId: runId`). */
|
|
@@ -40,29 +55,36 @@ export interface CancelRunResult {
|
|
|
40
55
|
* (the conditional write refuses to clobber it).
|
|
41
56
|
*/
|
|
42
57
|
readonly finalStatus: RunStatus;
|
|
43
|
-
/** What actually converged. `mandate`
|
|
44
|
-
*
|
|
58
|
+
/** What actually converged. `charge` and `mandate` are vacuously true when
|
|
59
|
+
* there is nothing for this cancel to converge — a refused terminal write
|
|
60
|
+
* (the body owns them) and, for `mandate`, a row with no persisted mandate id — so
|
|
61
|
+
* hosts alert on any false flag. */
|
|
45
62
|
readonly converged: {
|
|
46
63
|
readonly steps: boolean;
|
|
47
64
|
readonly charge: boolean;
|
|
48
65
|
readonly mandate: boolean;
|
|
49
66
|
};
|
|
50
|
-
}
|
|
51
|
-
export
|
|
67
|
+
};
|
|
68
|
+
export type RunCancelerDeps = {
|
|
52
69
|
readonly pool: Pool;
|
|
53
70
|
readonly runCharge: RunCharge;
|
|
54
71
|
readonly runAuthorizer: RunAuthorizer;
|
|
55
72
|
readonly logger?: Logger;
|
|
56
|
-
/**
|
|
73
|
+
/** Receives the end of a run that this canceler cancels. An absent binding, or a binding with no run emit, emits nothing. */
|
|
74
|
+
readonly provenance?: ProvenanceSeam;
|
|
75
|
+
/** The engine cancel. Production default: the workflow
|
|
57
76
|
* purger's `DBOSClient`-backed cancel, child-cascading and launch-free. */
|
|
58
77
|
readonly cancelWorkflows?: (workflowIds: readonly string[]) => Promise<void>;
|
|
59
|
-
|
|
60
|
-
|
|
78
|
+
/** The run end that the body recorded: `null` when it recorded none, a rejection when the read fails.
|
|
79
|
+
* The value is unchecked engine data. Production default: `DBOSClient.getEvent` with a zero timeout. */
|
|
80
|
+
readonly readRecordedRunEnd?: (runId: string) => Promise<unknown>;
|
|
81
|
+
};
|
|
82
|
+
export type RunCanceler = {
|
|
61
83
|
/**
|
|
62
84
|
* Cancel the run's workflows and converge its ledgers. Rejects when the
|
|
63
85
|
* engine cancel itself fails (retry-safe: nothing converged) or the run is
|
|
64
86
|
* unknown; convergence-phase failures resolve with their flag false.
|
|
65
87
|
*/
|
|
66
88
|
cancel(runId: string, session: AgentSession): Promise<CancelRunResult>;
|
|
67
|
-
}
|
|
89
|
+
};
|
|
68
90
|
export declare function createRunCanceler(deps: RunCancelerDeps): RunCanceler;
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RunCanceler — the encapsulated external-cancel path for an `executeAnalysis` run.
|
|
3
3
|
*
|
|
4
|
-
* A cancelled DBOS workflow can never
|
|
5
|
-
* terminal block (`collectAndComplete`)
|
|
6
|
-
* nothing converges: the run row stays `running` (blocking same-plan relaunch
|
|
7
|
-
* through `queryActiveRun`'s active-status dedup)
|
|
8
|
-
* sweep
|
|
9
|
-
*
|
|
10
|
-
* parent + children, then converge
|
|
4
|
+
* A cancelled DBOS workflow can never start another step, so the body's own
|
|
5
|
+
* terminal block (`collectAndComplete`) can be unreachable once the cancel lands
|
|
6
|
+
* and nothing converges: the run row stays `running` (blocking same-plan relaunch
|
|
7
|
+
* through `queryActiveRun`'s active-status dedup) and pending step rows never
|
|
8
|
+
* sweep. A step that started before the cancel still runs to its end, and its
|
|
9
|
+
* run status write is conditional on a `running` row. This module is the
|
|
10
|
+
* host-side counterpart: cancel the engine's parent + children, then converge
|
|
11
|
+
* the ledgers the workflow would have.
|
|
12
|
+
*
|
|
13
|
+
* The writer that wins the conditional terminal write of the run row owns the
|
|
14
|
+
* run end: the run emit, the charge close, and the mandate revoke. This module
|
|
15
|
+
* does those acts only when its write changed the row. A refused write means
|
|
16
|
+
* the body won the row and owns them; a failed write leaves the row `running`,
|
|
17
|
+
* so a second cancel converges the run. The step rows settle on every path.
|
|
18
|
+
*
|
|
19
|
+
* One exception: after a failed status write the body does the run end and
|
|
20
|
+
* records it as a workflow event (`run-end-record.ts`), while the row stays
|
|
21
|
+
* `running`. This module reads that record before its terminal write. A present
|
|
22
|
+
* record makes the terminal write carry the recorded status and error, and no
|
|
23
|
+
* act of the run end follows. A failed read writes nothing, so a second cancel
|
|
24
|
+
* converges the run.
|
|
11
25
|
*
|
|
12
26
|
* The engine capability stays internal — the production default is the
|
|
13
27
|
* purger's `DBOSClient`-backed child-cascading cancel, which needs no launched
|
|
14
28
|
* engine (see `dbos-workflow-purger.ts` for why the static `DBOS` facade is
|
|
15
|
-
* the wrong tool here). `cancelWorkflows` is an optional
|
|
29
|
+
* the wrong tool here). `cancelWorkflows` is an optional injected function over it.
|
|
16
30
|
*
|
|
17
31
|
* No stream writes: `DBOS.writeStream` writes only from inside the workflow
|
|
18
32
|
* that owns the stream, so the run-event reader (`run-event-stream.ts`)
|
|
@@ -22,9 +36,11 @@ import { createNoopLogger } from "../lib/console-logger.js";
|
|
|
22
36
|
import { deliverNotice } from "../lib/hooks.js";
|
|
23
37
|
import { elapsedSinceIso, recordRunCompleted, recordStepCompleted } from "../lib/metrics.js";
|
|
24
38
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
25
|
-
import { markRunCanceledIfActive, queryRun } from "../state/runs.js";
|
|
26
|
-
import { queryStepsByRun, sweepPendingStepExecutions } from "../state/step-executions.js";
|
|
27
|
-
import {
|
|
39
|
+
import { markRunCanceledIfActive, queryRun, updateRunStatus } from "../state/runs.js";
|
|
40
|
+
import { cancelRunningStepExecutions, queryStepsByRun, sweepPendingStepExecutions } from "../state/step-executions.js";
|
|
41
|
+
import { clearPausesOfWork } from "../state/paused-work.js";
|
|
42
|
+
import { createDbosWorkflowPurger, dbosClientFor } from "./dbos-workflow-purger.js";
|
|
43
|
+
import { parseRecordedRunEnd, RUN_END_EVENT_KEY } from "./run-end-record.js";
|
|
28
44
|
/** The reason stamped on the run row and the revoke — the same literal
|
|
29
45
|
* `collectAndComplete` records for a cancel it observes from inside. */
|
|
30
46
|
const EXTERNAL_CANCEL_REASON = "external_cancel";
|
|
@@ -36,7 +52,7 @@ export class UnknownRunError extends Error {
|
|
|
36
52
|
this.name = "UnknownRunError";
|
|
37
53
|
}
|
|
38
54
|
}
|
|
39
|
-
const TERMINAL = new Set(["completed", "partial", "failed", "canceled"
|
|
55
|
+
const TERMINAL = new Set(["completed", "partial", "failed", "canceled"]);
|
|
40
56
|
export function createRunCanceler(deps) {
|
|
41
57
|
const { pool, runCharge, runAuthorizer } = deps;
|
|
42
58
|
const logger = (deps.logger ?? createNoopLogger()).named("run-canceler");
|
|
@@ -52,9 +68,22 @@ export function createRunCanceler(deps) {
|
|
|
52
68
|
})();
|
|
53
69
|
await engineCancel(workflowIds);
|
|
54
70
|
};
|
|
71
|
+
const readRecordedRunEnd = deps.readRecordedRunEnd ??
|
|
72
|
+
(async (runId) => (await dbosClientFor(pool, logger)).getEvent(runId, RUN_END_EVENT_KEY, 0));
|
|
55
73
|
/** Steps whose child started (a persisted child workflow id) and has not written its terminal row. */
|
|
56
74
|
const incompleteSteps = async (runId) => unwrapOrThrow(await queryStepsByRun(pool, runId)).filter((step) => step.childWorkflowId !== null && step.completedAt === null);
|
|
57
75
|
const childIds = (steps) => steps.flatMap((step) => (step.childWorkflowId !== null ? [step.childWorkflowId] : []));
|
|
76
|
+
const emitRunEvent = deps.provenance?.emitRunEvent;
|
|
77
|
+
const emitGuarded = (event, session) => {
|
|
78
|
+
if (emitRunEvent === undefined)
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
emitRunEvent(event, session);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
logger.error("the run emit of the provenance binding threw", { runId: event.runId, event: event.type, ...logger.errorFields(err) });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
58
87
|
return {
|
|
59
88
|
async cancel(runId, session) {
|
|
60
89
|
const row = unwrapOrThrow(await queryRun(pool, runId));
|
|
@@ -89,38 +118,118 @@ export function createRunCanceler(deps) {
|
|
|
89
118
|
catch (err) {
|
|
90
119
|
logger.error("late-child cancel sweep failed", { runId, ...logger.errorFields(err) });
|
|
91
120
|
}
|
|
92
|
-
//
|
|
93
|
-
|
|
121
|
+
// The cancel ended each wait of a paused step, and no workflow of the run deletes its row again.
|
|
122
|
+
const cleared = await clearPausesOfWork(pool, runId);
|
|
123
|
+
if (cleared.isErr())
|
|
124
|
+
logger.error("the pauses of the run did not clear", { runId, op: cleared.error.op });
|
|
125
|
+
// The run end that the body recorded after a failed status write. A value
|
|
126
|
+
// that is not a recorded run end counts as a failed read.
|
|
127
|
+
let recorded = null;
|
|
128
|
+
let readFailed = false;
|
|
94
129
|
try {
|
|
95
|
-
|
|
130
|
+
const value = await readRecordedRunEnd(runId);
|
|
131
|
+
if (value !== null && value !== undefined) {
|
|
132
|
+
recorded = parseRecordedRunEnd(value);
|
|
133
|
+
if (recorded === null) {
|
|
134
|
+
readFailed = true;
|
|
135
|
+
logger.error("the recorded run end has the wrong shape", { runId });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
96
138
|
}
|
|
97
139
|
catch (err) {
|
|
98
|
-
|
|
140
|
+
readFailed = true;
|
|
141
|
+
logger.error("the read of the recorded run end failed", { runId, ...logger.errorFields(err) });
|
|
142
|
+
}
|
|
143
|
+
// Convergence — each phase isolated so one failure skips nothing after it.
|
|
144
|
+
// The terminal write has three outcomes: changed (this cancel won the row),
|
|
145
|
+
// refused (the body won it), failed (the row is unchanged). A failed read of
|
|
146
|
+
// the recorded run end is a failed write that never ran.
|
|
147
|
+
let writeOutcome = "failed";
|
|
148
|
+
if (!readFailed) {
|
|
149
|
+
try {
|
|
150
|
+
const changed = recorded === null
|
|
151
|
+
? unwrapOrThrow(await markRunCanceledIfActive(pool, runId, EXTERNAL_CANCEL_REASON))
|
|
152
|
+
: unwrapOrThrow(await updateRunStatus(pool, runId, recorded.status, recorded.error));
|
|
153
|
+
writeOutcome = changed ? "changed" : "refused";
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
logger.error("the terminal write of the run failed", { runId, ...logger.errorFields(err) });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const transitioned = writeOutcome === "changed";
|
|
160
|
+
// A terminal step of the workflow that started before the cancel can still
|
|
161
|
+
// write, but its write is conditional on a `running` row too. The first
|
|
162
|
+
// write wins, and the run-end acts ride behind the write that won: a
|
|
163
|
+
// refused write means the run settled on its own and its own terminal step
|
|
164
|
+
// does them. A cut child never reached its terminal row, so its step
|
|
165
|
+
// records here too. A recorded run end means the body did the acts, so
|
|
166
|
+
// only the run metric rides behind the repair write.
|
|
167
|
+
if (transitioned && recorded !== null) {
|
|
168
|
+
recordRunCompleted({ workflow: "analysis", status: recorded.status, durationMs: elapsedSinceIso(row.startedAt) });
|
|
99
169
|
}
|
|
100
|
-
|
|
101
|
-
// conditional write is the one terminal write of an external cancel, and
|
|
102
|
-
// the outcome metrics ride behind it: a refused write means the run
|
|
103
|
-
// settled on its own and its own terminal step recorded them. A cut
|
|
104
|
-
// child never reached its terminal row, so its step records here too.
|
|
105
|
-
if (transitioned) {
|
|
170
|
+
if (transitioned && recorded === null) {
|
|
106
171
|
recordRunCompleted({ workflow: "analysis", status: "canceled", durationMs: elapsedSinceIso(row.startedAt) });
|
|
107
172
|
for (const step of cutSteps ?? [])
|
|
108
173
|
recordStepCompleted({ agentId: step.agentId, status: "canceled" });
|
|
174
|
+
// The end of the run rides the same condition. One wall-clock read stamps every event:
|
|
175
|
+
// the canceler is not a workflow, so no replay fires these emits again.
|
|
176
|
+
const atMs = Date.now();
|
|
177
|
+
for (const step of cutSteps ?? []) {
|
|
178
|
+
const durationMs = elapsedSinceIso(step.startedAt, atMs);
|
|
179
|
+
const event = {
|
|
180
|
+
type: "step_completed",
|
|
181
|
+
analysisId: row.analysisId,
|
|
182
|
+
runId,
|
|
183
|
+
stepId: step.stepId,
|
|
184
|
+
status: "canceled",
|
|
185
|
+
atMs,
|
|
186
|
+
};
|
|
187
|
+
if (durationMs !== undefined)
|
|
188
|
+
event.durationMs = durationMs;
|
|
189
|
+
emitGuarded(event, session);
|
|
190
|
+
}
|
|
191
|
+
emitGuarded({
|
|
192
|
+
type: "run_completed",
|
|
193
|
+
analysisId: row.analysisId,
|
|
194
|
+
runId,
|
|
195
|
+
status: "canceled",
|
|
196
|
+
atMs,
|
|
197
|
+
durationMs: Math.max(0, atMs - Date.parse(row.startedAt)),
|
|
198
|
+
}, session);
|
|
109
199
|
}
|
|
110
|
-
let
|
|
200
|
+
let pendingSwept = false;
|
|
111
201
|
try {
|
|
112
202
|
unwrapOrThrow(await sweepPendingStepExecutions(pool, runId));
|
|
113
|
-
|
|
203
|
+
pendingSwept = true;
|
|
114
204
|
}
|
|
115
205
|
catch (err) {
|
|
116
206
|
logger.error("pending-step sweep failed", { runId, ...logger.errorFields(err) });
|
|
117
207
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
(await
|
|
208
|
+
let runningSettled = false;
|
|
209
|
+
try {
|
|
210
|
+
unwrapOrThrow(await cancelRunningStepExecutions(pool, runId, EXTERNAL_CANCEL_REASON));
|
|
211
|
+
runningSettled = true;
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
logger.error("running-step settle failed", { runId, ...logger.errorFields(err) });
|
|
215
|
+
}
|
|
216
|
+
const steps = pendingSwept && runningSettled;
|
|
217
|
+
// Only the writer that won the row closes the charge and revokes. A refused
|
|
218
|
+
// write left both to the body; a failed write left the row `running`, so a
|
|
219
|
+
// second cancel converges the run. The flags of a refused write are true
|
|
220
|
+
// because there is nothing for this cancel to converge. With a recorded run
|
|
221
|
+
// end the body did both acts, and the flags are its results.
|
|
222
|
+
let charge = recorded !== null ? recorded.closed : writeOutcome === "refused";
|
|
223
|
+
let mandate = recorded !== null ? recorded.revoked : writeOutcome === "refused" || (writeOutcome === "failed" && row.mandateId === null);
|
|
224
|
+
if (transitioned && recorded === null) {
|
|
225
|
+
charge = await deliverNotice(logger.with({ runId }), "RunCharge.close", runCharge.close({ analysisId: row.analysisId, runId, outcome: { kind: "canceled" }, session }));
|
|
226
|
+
mandate =
|
|
227
|
+
row.mandateId === null ||
|
|
228
|
+
(await deliverNotice(logger.with({ runId, mandateId: row.mandateId }), "RunAuthorizer.revokeByMandateId", runAuthorizer.revokeByMandateId({ mandateId: row.mandateId, auth: session.auth }, EXTERNAL_CANCEL_REASON)));
|
|
229
|
+
}
|
|
121
230
|
// No transition means the run reached a terminal state on its own (or the
|
|
122
231
|
// write failed) — report the row as it stands rather than claiming `canceled`.
|
|
123
|
-
let finalStatus = "canceled";
|
|
232
|
+
let finalStatus = recorded?.status ?? "canceled";
|
|
124
233
|
if (!transitioned) {
|
|
125
234
|
const reread = unwrapOrThrow(await queryRun(pool, runId));
|
|
126
235
|
finalStatus = reread?.status ?? "canceled";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The workflow event under which the body of `executeAnalysis` records its run
|
|
4
|
+
* end after a failed status write. The run canceler reads it with
|
|
5
|
+
* `DBOSClient.getEvent`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const RUN_END_EVENT_KEY = "run-end";
|
|
8
|
+
/**
|
|
9
|
+
* The run end that the body did: the status and the error that its failed
|
|
10
|
+
* status write tried to write, and the results of the charge close and of the
|
|
11
|
+
* revoke.
|
|
12
|
+
*/
|
|
13
|
+
export declare const RecordedRunEndSchema: z.ZodObject<{
|
|
14
|
+
status: z.ZodEnum<{
|
|
15
|
+
canceled: "canceled";
|
|
16
|
+
completed: "completed";
|
|
17
|
+
failed: "failed";
|
|
18
|
+
partial: "partial";
|
|
19
|
+
}>;
|
|
20
|
+
error: z.ZodNullable<z.ZodString>;
|
|
21
|
+
closed: z.ZodBoolean;
|
|
22
|
+
revoked: z.ZodBoolean;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export type RecordedRunEnd = z.infer<typeof RecordedRunEndSchema>;
|
|
25
|
+
/**
|
|
26
|
+
* The engine hands back deserialized data, thus a value of an event is unknown
|
|
27
|
+
* until this check. A value of the wrong shape gives `null`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseRecordedRunEnd(value: unknown): RecordedRunEnd | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { RunStatus } from "../state/schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* The workflow event under which the body of `executeAnalysis` records its run
|
|
5
|
+
* end after a failed status write. The run canceler reads it with
|
|
6
|
+
* `DBOSClient.getEvent`.
|
|
7
|
+
*/
|
|
8
|
+
export const RUN_END_EVENT_KEY = "run-end";
|
|
9
|
+
/**
|
|
10
|
+
* The run end that the body did: the status and the error that its failed
|
|
11
|
+
* status write tried to write, and the results of the charge close and of the
|
|
12
|
+
* revoke.
|
|
13
|
+
*/
|
|
14
|
+
export const RecordedRunEndSchema = z.object({
|
|
15
|
+
status: RunStatus.exclude(["running"]),
|
|
16
|
+
error: z.string().nullable(),
|
|
17
|
+
closed: z.boolean(),
|
|
18
|
+
revoked: z.boolean(),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* The engine hands back deserialized data, thus a value of an event is unknown
|
|
22
|
+
* until this check. A value of the wrong shape gives `null`.
|
|
23
|
+
*/
|
|
24
|
+
export function parseRecordedRunEnd(value) {
|
|
25
|
+
const parsed = RecordedRunEndSchema.safeParse(value);
|
|
26
|
+
return parsed.success ? parsed.data : null;
|
|
27
|
+
}
|
|
@@ -17,14 +17,6 @@ import type { ChatPart } from "../contracts/chat-parts.js";
|
|
|
17
17
|
* contract is the `ChatPart` union, so anything the registry does not
|
|
18
18
|
* classify is not deliverable — which also covers a part written by a producer
|
|
19
19
|
* newer than the reader.
|
|
20
|
-
*
|
|
21
|
-
* The registry is keyed by the discriminant alone, so this validates `type` and
|
|
22
|
-
* trusts the producer for the payload. The part schemas in `contracts/schemas/`
|
|
23
|
-
* are for a consumer at the edge of the package, which parses what it receives.
|
|
24
|
-
* Both ends of this stream are typed against the same union inside this package,
|
|
25
|
-
* so the discriminant is the boundary that can drift (a producer that emits
|
|
26
|
-
* something else entirely), and a part that fails its schema still reaches the
|
|
27
|
-
* consumer for its own check.
|
|
28
20
|
*/
|
|
29
21
|
export declare function parseRunEventPart(value: unknown): ChatPart | null;
|
|
30
22
|
/**
|
|
@@ -7,8 +7,23 @@
|
|
|
7
7
|
* They live apart from the reader, thus a test drives them directly instead of
|
|
8
8
|
* through a subscription.
|
|
9
9
|
*/
|
|
10
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
10
11
|
import { reconcileKey } from "../contracts/chat-frame.js";
|
|
11
12
|
import { PART_REGISTRY } from "../contracts/part-registry.js";
|
|
13
|
+
import { parseUnknownRecord } from "../lib/unknown-containers.js";
|
|
14
|
+
/**
|
|
15
|
+
* The registry is keyed by the discriminant alone, so this validates `type` and
|
|
16
|
+
* trusts the producer for the payload. The part schemas in `contracts/schemas/`
|
|
17
|
+
* are for a consumer at the edge of the package, which parses what it receives.
|
|
18
|
+
* Both ends of this stream are typed against the same union inside this package,
|
|
19
|
+
* so the discriminant is the boundary that can drift (a producer that emits
|
|
20
|
+
* something else entirely), and a part that fails its schema still reaches the
|
|
21
|
+
* consumer for its own check.
|
|
22
|
+
*/
|
|
23
|
+
function isChatPartRecord(record) {
|
|
24
|
+
const { type } = record;
|
|
25
|
+
return typeof type === "string" && Object.hasOwn(PART_REGISTRY, type);
|
|
26
|
+
}
|
|
12
27
|
/**
|
|
13
28
|
* Narrow one raw stream value to a chat data part, or `null` when it is not one.
|
|
14
29
|
*
|
|
@@ -18,24 +33,12 @@ import { PART_REGISTRY } from "../contracts/part-registry.js";
|
|
|
18
33
|
* contract is the `ChatPart` union, so anything the registry does not
|
|
19
34
|
* classify is not deliverable — which also covers a part written by a producer
|
|
20
35
|
* newer than the reader.
|
|
21
|
-
*
|
|
22
|
-
* The registry is keyed by the discriminant alone, so this validates `type` and
|
|
23
|
-
* trusts the producer for the payload. The part schemas in `contracts/schemas/`
|
|
24
|
-
* are for a consumer at the edge of the package, which parses what it receives.
|
|
25
|
-
* Both ends of this stream are typed against the same union inside this package,
|
|
26
|
-
* so the discriminant is the boundary that can drift (a producer that emits
|
|
27
|
-
* something else entirely), and a part that fails its schema still reaches the
|
|
28
|
-
* consumer for its own check.
|
|
29
36
|
*/
|
|
30
37
|
export function parseRunEventPart(value) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const type = value.type;
|
|
34
|
-
if (typeof type !== "string")
|
|
38
|
+
const record = parseUnknownRecord(value);
|
|
39
|
+
if (record === undefined || !isChatPartRecord(record))
|
|
35
40
|
return null;
|
|
36
|
-
|
|
37
|
-
return null;
|
|
38
|
-
return value;
|
|
41
|
+
return record;
|
|
39
42
|
}
|
|
40
43
|
/**
|
|
41
44
|
* Collapse a batch of parts so each reconciling id appears once, carrying its
|
|
@@ -78,10 +81,12 @@ export function foldRunEventParts(parts) {
|
|
|
78
81
|
export async function pipeFoldedRunEvents(entries, emit, flushMs) {
|
|
79
82
|
const latestByKey = new Map();
|
|
80
83
|
const pendingKeys = new Set();
|
|
81
|
-
|
|
84
|
+
// The gate of the one armed flush wait: present while a window is open, so a
|
|
85
|
+
// second entry in the window reuses it instead of arming a second flush.
|
|
86
|
+
let flushGate;
|
|
82
87
|
let flushChain = Promise.resolve();
|
|
83
88
|
const flushPending = async () => {
|
|
84
|
-
|
|
89
|
+
flushGate = undefined;
|
|
85
90
|
const keys = [...pendingKeys];
|
|
86
91
|
pendingKeys.clear();
|
|
87
92
|
for (const key of keys) {
|
|
@@ -91,14 +96,15 @@ export async function pipeFoldedRunEvents(entries, emit, flushMs) {
|
|
|
91
96
|
}
|
|
92
97
|
};
|
|
93
98
|
const scheduleFlush = () => {
|
|
94
|
-
if (
|
|
99
|
+
if (flushGate !== undefined)
|
|
95
100
|
return;
|
|
96
|
-
|
|
101
|
+
flushGate = new AbortController();
|
|
102
|
+
sleep(flushMs, undefined, { signal: flushGate.signal }).then(() => {
|
|
97
103
|
// A timed flush has no caller to report to. A lasting emit failure
|
|
98
104
|
// still reaches the caller, through the next direct emit or the
|
|
99
105
|
// final flush.
|
|
100
106
|
flushChain = flushChain.then(flushPending).catch(() => undefined);
|
|
101
|
-
},
|
|
107
|
+
}, () => undefined);
|
|
102
108
|
};
|
|
103
109
|
try {
|
|
104
110
|
for await (const entry of entries) {
|
|
@@ -114,10 +120,9 @@ export async function pipeFoldedRunEvents(entries, emit, flushMs) {
|
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
122
|
finally {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
123
|
+
// The abort ends the armed wait, whose rejection the second arm swallows,
|
|
124
|
+
// so the teardown does not wait out the window.
|
|
125
|
+
flushGate?.abort();
|
|
121
126
|
await flushChain;
|
|
122
127
|
if (pendingKeys.size > 0)
|
|
123
128
|
await flushPending();
|
|
@@ -37,17 +37,17 @@ import { type DbError } from "../lib/db-result.js";
|
|
|
37
37
|
import type { Logger } from "../lib/logger.js";
|
|
38
38
|
import type { RunStatus } from "../state/schema.js";
|
|
39
39
|
/** The part of a run row that the terminal part is made from. */
|
|
40
|
-
export
|
|
40
|
+
export type RunEventRunRead = {
|
|
41
41
|
readonly status: RunStatus;
|
|
42
42
|
readonly error: string | null;
|
|
43
|
-
}
|
|
43
|
+
};
|
|
44
44
|
/**
|
|
45
45
|
* Construction-time dependencies. The pool is the application pool the run
|
|
46
46
|
* ledger lives in; the logger is where every contained failure is reported, and
|
|
47
47
|
* defaults to silence so an embedder that wired none sees nothing rather than
|
|
48
48
|
* having console forced on it.
|
|
49
49
|
*/
|
|
50
|
-
export
|
|
50
|
+
export type RunEventStreamDeps = {
|
|
51
51
|
readonly pool: Pool;
|
|
52
52
|
readonly logger?: Logger;
|
|
53
53
|
/** Reads the status and the error of the run row, `null` when no row exists. Defaults to `queryRun` on `pool`. */
|
|
@@ -59,7 +59,7 @@ export interface RunEventStreamDeps {
|
|
|
59
59
|
readonly readWorkflowStatus?: (runId: string) => Promise<string | null>;
|
|
60
60
|
/** The wait between two reads of the run row. Defaults to a timer. */
|
|
61
61
|
readonly sleep?: (ms: number) => Promise<void>;
|
|
62
|
-
}
|
|
62
|
+
};
|
|
63
63
|
/**
|
|
64
64
|
* Receives one part. May be async — the subscription awaits it, so a handler is
|
|
65
65
|
* never invoked concurrently with itself and back-pressure is the caller's to
|
|
@@ -67,20 +67,20 @@ export interface RunEventStreamDeps {
|
|
|
67
67
|
*/
|
|
68
68
|
export type RunEventPartHandler = (part: ChatPart) => void | Promise<void>;
|
|
69
69
|
/** Call-time parameters of one subscription. */
|
|
70
|
-
export
|
|
70
|
+
export type RunEventSubscribeOptions = {
|
|
71
71
|
/** The run to observe. Also the parent workflow's id. */
|
|
72
72
|
readonly runId: string;
|
|
73
73
|
/** Where each delivered part goes. */
|
|
74
74
|
readonly onPart: RunEventPartHandler;
|
|
75
75
|
/** Aborting stops delivery and settles the returned promise. */
|
|
76
76
|
readonly signal: AbortSignal;
|
|
77
|
-
}
|
|
77
|
+
};
|
|
78
78
|
/**
|
|
79
79
|
* The run-event read seam. One method, because a run-scoped subscription is the
|
|
80
80
|
* whole capability: a general-purpose stream reader would leak the engine's model
|
|
81
81
|
* back into the surface this exists to quarantine.
|
|
82
82
|
*/
|
|
83
|
-
export
|
|
83
|
+
export type RunEventStream = {
|
|
84
84
|
/**
|
|
85
85
|
* Deliver every part the run produces — parent and children alike — to
|
|
86
86
|
* `onPart`, resolving when the run is terminal, every stream opened has
|
|
@@ -103,7 +103,7 @@ export interface RunEventStream {
|
|
|
103
103
|
* `runId`/`stepId` and the reconciling fold is per id.
|
|
104
104
|
*/
|
|
105
105
|
subscribe(options: RunEventSubscribeOptions): Promise<void>;
|
|
106
|
-
}
|
|
106
|
+
};
|
|
107
107
|
/**
|
|
108
108
|
* Build the DBOS-backed realization of {@link RunEventStream}.
|
|
109
109
|
*
|
|
@@ -43,10 +43,6 @@ function partOfRow(runId, row) {
|
|
|
43
43
|
switch (row.status) {
|
|
44
44
|
case "canceled":
|
|
45
45
|
return canceledPart(runId);
|
|
46
|
-
case "suspended_insufficient_funds":
|
|
47
|
-
return row.error === null
|
|
48
|
-
? { type: "data-run-failed", runId, error: "Run suspended" }
|
|
49
|
-
: { type: "data-run-failed", runId, error: row.error, reason: row.error };
|
|
50
46
|
case "failed":
|
|
51
47
|
return { type: "data-run-failed", runId, error: row.error ?? "Run failed" };
|
|
52
48
|
case "completed":
|
|
@@ -138,6 +134,7 @@ export function createRunEventStream(deps) {
|
|
|
138
134
|
while (pending.length > 0 && !signal.aborted) {
|
|
139
135
|
const batch = pending.splice(0, pending.length);
|
|
140
136
|
for (const part of foldRunEventParts(batch)) {
|
|
137
|
+
// oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the event wiring that aborts the signal; the re-check after each part is live (cancel stops delivery).
|
|
141
138
|
if (signal.aborted)
|
|
142
139
|
return;
|
|
143
140
|
try {
|
|
@@ -228,6 +225,7 @@ export function createRunEventStream(deps) {
|
|
|
228
225
|
if (signal.aborted)
|
|
229
226
|
return;
|
|
230
227
|
await discoverChildren();
|
|
228
|
+
// oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the event-wired abort or the parentRead .finally that sets parentDrained; both checks are live (discovery stops on cancel or a drained parent).
|
|
231
229
|
if (signal.aborted || parentDrained)
|
|
232
230
|
return;
|
|
233
231
|
await Promise.race([sleep(CHILD_DISCOVERY_INTERVAL_MS), aborted, parentRead]);
|
|
@@ -289,6 +287,7 @@ export function createRunEventStream(deps) {
|
|
|
289
287
|
await discovery;
|
|
290
288
|
await parentRead;
|
|
291
289
|
await Promise.all(childReads);
|
|
290
|
+
// oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the readWorkflowStream closure that sets sawTerminal or the event-wired abort; the fallback that mints the missing terminal part is live.
|
|
292
291
|
if (!sawTerminal && !signal.aborted) {
|
|
293
292
|
const terminal = await missingTerminalPart();
|
|
294
293
|
if (terminal !== null)
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* reference, typed `(input) => Promise<result>`; the launcher only owns the
|
|
11
11
|
* start/await/cancel mechanics around it.
|
|
12
12
|
*/
|
|
13
|
-
export
|
|
13
|
+
export type LaunchOptions = {
|
|
14
14
|
/** Caller-chosen durable workflow id (e.g. the runId). */
|
|
15
15
|
readonly workflowId: string;
|
|
16
|
-
}
|
|
17
|
-
export
|
|
16
|
+
};
|
|
17
|
+
export type RunLauncher = {
|
|
18
18
|
/** Fire-and-forget: resolves once the run is durably started. */
|
|
19
19
|
launch<I>(workflow: (input: I) => Promise<unknown>, opts: LaunchOptions, input: I): Promise<void>;
|
|
20
|
-
}
|
|
20
|
+
};
|