@inflexa-ai/harness 0.45.1 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +306 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +32 -7
- package/dist/lib/hooks.js +22 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +160 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +39 -0
- package/dist/loop/turn-credentials.js +90 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/request-headers.js +12 -3
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +62 -0
- package/dist/testing.js +101 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 1. `mark-running` — update `cortex_step_executions` to running.
|
|
9
9
|
* 2. `createSandbox` — provision the sandbox; persist its handle.
|
|
10
|
-
* 3. `
|
|
11
|
-
* call inside is its own
|
|
12
|
-
* 4. `generateFileMetadata`— the file-metadata
|
|
13
|
-
* 5. `generateStepSummary` — the summary
|
|
10
|
+
* 3. `runLoop` — the harness agent loop. Every model call and
|
|
11
|
+
* tool call inside is its own durable step.
|
|
12
|
+
* 4. `generateFileMetadata`— the file-metadata follow-up request of the step agent.
|
|
13
|
+
* 5. `generateStepSummary` — the summary follow-up request of the step agent,
|
|
14
14
|
* producing `output/summary.md`.
|
|
15
15
|
* 6. `reconcile + register`— write artifact manifest entries to cortex_artifacts.
|
|
16
16
|
* 7. `syncArtifacts` — register provenance + upload missing file_ids
|
|
@@ -20,25 +20,24 @@
|
|
|
20
20
|
* 10. `mark-terminal` — write the final status, emit `data-step-activity`
|
|
21
21
|
* onto the parent's DBOS stream.
|
|
22
22
|
*
|
|
23
|
-
* The parent owns sibling lifecycle
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* `CHILD_SUSPENDED_TOPIC`, and self-cancels to CANCELLED (resumable, not ERROR).
|
|
23
|
+
* The parent owns sibling lifecycle. This child owns its own teardown and its
|
|
24
|
+
* own pause (work-pause spec): a failed model request of the agent loop with a
|
|
25
|
+
* cause of a pause, or a refusal with the suspend flag of the label gate or the
|
|
26
|
+
* register gate. The child waits in place, and the run row stays `running`. The
|
|
27
|
+
* other steps go on, and each one pauses at its own failure.
|
|
29
28
|
*/
|
|
30
|
-
import { DBOS
|
|
29
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
30
|
+
import { isWorkflowCancellation } from "../runtime/dbos.js";
|
|
31
31
|
import { insertStepExecution, updateStepExecution } from "../state/index.js";
|
|
32
32
|
import { recordStepCompleted } from "../lib/metrics.js";
|
|
33
33
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
34
34
|
import { deliverNotice } from "../lib/hooks.js";
|
|
35
35
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import { maskExcept } from "../loop/tool-mask.js";
|
|
36
|
+
import { maskExcept } from "../loop/call-policy.js";
|
|
37
|
+
import { runLoop } from "../loop/run-loop.js";
|
|
39
38
|
import { READ_TOOL_OUTPUT_TOOL_ID } from "../loop/tool-output.js";
|
|
40
39
|
import { lastExecOutcome } from "../sandbox/exec-outcome.js";
|
|
41
|
-
import { activityEmission, activityForTool, applyTreeDelta, isChatDataPart, sandboxTreeDelta, stepPartId } from "../sandbox/sandbox-step-translate.js";
|
|
40
|
+
import { activityEmission, activityForTool, applyTreeDelta, isChatDataPart, sandboxTreeDelta, stepPartId, toolActivityKey, } from "../sandbox/sandbox-step-translate.js";
|
|
42
41
|
import { createDetailResolver } from "../tools/detail-resolver.js";
|
|
43
42
|
import { forSubAgent } from "../auth/types.js";
|
|
44
43
|
import { walkStepArtifacts } from "../execution/post-step.js";
|
|
@@ -46,9 +45,9 @@ import { collectStepOutputs, describeStepRegistrationFailure, generateStepFileMe
|
|
|
46
45
|
import { mintSandboxIdentity } from "../sandbox/identity.js";
|
|
47
46
|
import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
|
|
48
47
|
import { ProvenanceCollector } from "../provenance/collector.js";
|
|
49
|
-
import {
|
|
48
|
+
import { blockerOf } from "../tools/sandbox/report-blocker.js";
|
|
50
49
|
import { createFileMetadataCell, SUBMIT_FILE_METADATA_TOOL_ID } from "../tools/sandbox/submit-file-metadata.js";
|
|
51
|
-
import {
|
|
50
|
+
import { pauseAtGate, workPause } from "./pause.js";
|
|
52
51
|
/**
|
|
53
52
|
* Fallback when the plan step omits `timeout`. Plans that need 3-hour runs
|
|
54
53
|
* declare it explicitly.
|
|
@@ -60,14 +59,6 @@ export const DEFAULT_STEP_TIMEOUT_SECONDS = 3600;
|
|
|
60
59
|
* never model output — the summarizer does not run on this path.
|
|
61
60
|
*/
|
|
62
61
|
export const CAPPED_OUT_EMPTY_REASON = "The step hit its iteration cap with no output files persisted.";
|
|
63
|
-
/**
|
|
64
|
-
* DBOS message topic the child uses to tell the parent that it suspends. The
|
|
65
|
-
* message goes BEFORE `DBOS.cancelWorkflow(self)`, thus the parent's recv
|
|
66
|
-
* accumulator records the child before the child's terminal state lands.
|
|
67
|
-
* Without it the parent observes only `DBOSWorkflowCancelledError` from
|
|
68
|
-
* `getResult`, and it cannot tell a suspension from a cancel.
|
|
69
|
-
*/
|
|
70
|
-
export const CHILD_SUSPENDED_TOPIC = "child-suspended";
|
|
71
62
|
// ── Helpers ───────────────────────────────────────────────────────────
|
|
72
63
|
const NO_STEP_FILE_METADATA = { entries: [], messages: [] };
|
|
73
64
|
/** Normalizes a pre-`messages` checkpoint (a bare entries array) for replay. */
|
|
@@ -153,27 +144,33 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
153
144
|
childWorkflowId,
|
|
154
145
|
}));
|
|
155
146
|
}, { name: "mark-running" });
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
recordStepCompleted({ agentId: input.agentId, status: "canceled", durationMs });
|
|
169
|
-
}, { name: "mark-suspended" });
|
|
170
|
-
const message = { kind: "suspended", childWorkflowId, stepId: input.stepId, reason: suspension.reason };
|
|
171
|
-
await DBOS.runStep(() => DBOS.send(input.parentWorkflowId, message, CHILD_SUSPENDED_TOPIC), { name: "notify-parent-suspended" });
|
|
172
|
-
return cancelSelf("self-cancel-suspended");
|
|
147
|
+
// Each step part goes to the CHILD's own `"events"` stream. `DBOS.writeStream`
|
|
148
|
+
// writes only to the stream of its own workflow, so the SSE route reads the
|
|
149
|
+
// parent's stream plus every active child's, addressed by
|
|
150
|
+
// `cortex_step_executions.child_workflow_id`. A failed write is non-fatal.
|
|
151
|
+
const emitToParentStream = (part) => DBOS.writeStream("events", part);
|
|
152
|
+
const safeEmit = async (part) => {
|
|
153
|
+
try {
|
|
154
|
+
await emitToParentStream(part);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
logger.warn("emitToParentStream failed (non-fatal)", logger.errorFields(err));
|
|
158
|
+
}
|
|
173
159
|
};
|
|
160
|
+
// The step waits in place, and the sandbox, if one stands, stays up for the resume.
|
|
161
|
+
const pause = workPause({
|
|
162
|
+
pool: deps.pool,
|
|
163
|
+
workId: input.runId,
|
|
164
|
+
workKind: "run",
|
|
165
|
+
analysisId: input.analysisId,
|
|
166
|
+
emit: safeEmit,
|
|
167
|
+
retryDelaysMs: deps.pauseRetryDelaysMs,
|
|
168
|
+
run: { session: input.runSession, authorizer: deps.runAuthorizer },
|
|
169
|
+
logger,
|
|
170
|
+
});
|
|
174
171
|
// Stamp the sandbox agent's id into provenance so loop events carry
|
|
175
172
|
// `source.agentId === input.agentId` (the parent's RunSession still reads
|
|
176
|
-
// "conversation-agent"). `run-
|
|
173
|
+
// "conversation-agent"). `run-loop.ts` builds source from
|
|
177
174
|
// `session.provenance.agentId`, and billing tags ride the same provenance.
|
|
178
175
|
const session = forSubAgent(input.runSession, input.agentId);
|
|
179
176
|
const writePrefix = await deps.resolveWritePrefix(input);
|
|
@@ -193,11 +190,15 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
193
190
|
extraEnv: input.extraEnv,
|
|
194
191
|
resources: input.resources,
|
|
195
192
|
};
|
|
196
|
-
const
|
|
193
|
+
const spawn = () => DBOS.runStep(async () => keepSuspendingRefusal(await deps.sandboxClient.createSandbox(session, sandboxSpec, identity)), {
|
|
197
194
|
name: "sandbox.create",
|
|
198
195
|
});
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
let spawned = await spawn();
|
|
197
|
+
// A refusal of the label gate with the suspend flag waits in a pause, and the spawn runs again after the resume.
|
|
198
|
+
while (spawned.isErr()) {
|
|
199
|
+
await pauseAtGate(pause, spawned.error.reason);
|
|
200
|
+
spawned = await spawn();
|
|
201
|
+
}
|
|
201
202
|
const sandbox = spawned.value;
|
|
202
203
|
// Recovery path: re-check `isAlive` on the persisted ref before continuing.
|
|
203
204
|
// A classified-dead sandbox triggers a fresh `createSandbox` (task 4.6).
|
|
@@ -210,7 +211,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
210
211
|
throw new Error(`sandbox ${sandbox.sandboxId} ${cause} — caller must restart the step`);
|
|
211
212
|
}
|
|
212
213
|
}, { name: "sandbox.recheck-alive" });
|
|
213
|
-
// (3)
|
|
214
|
+
// (3) runLoop — the harness loop, each call a durable step.
|
|
214
215
|
// The step deadline is captured ONCE at step start from the checkpointed
|
|
215
216
|
// clock so it reproduces on replay — a raw `Date.now()` here would grow the
|
|
216
217
|
// deadline on each recovery (see the harness-durable-runtime spec). `deadlineMs` is a getter so
|
|
@@ -218,7 +219,6 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
218
219
|
// fresh `now + timeout` per call would make a step with N tool calls runnable
|
|
219
220
|
// for up to N × `timeoutSeconds`.
|
|
220
221
|
const stepDeadlineMs = (await DBOS.now()) + (input.timeoutSeconds ?? DEFAULT_STEP_TIMEOUT_SECONDS) * 1000;
|
|
221
|
-
const blockerHolder = createBlockerHolder();
|
|
222
222
|
const fileMetadata = createFileMetadataCell();
|
|
223
223
|
const agent = await deps.buildAgent({
|
|
224
224
|
input,
|
|
@@ -227,10 +227,10 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
227
227
|
stepWritePrefix: writePrefix,
|
|
228
228
|
deadlineMs: () => stepDeadlineMs,
|
|
229
229
|
lineageCollector,
|
|
230
|
-
|
|
230
|
+
reportsBlocker: true,
|
|
231
231
|
fileMetadata,
|
|
232
232
|
citationResolver: deps.citationResolver,
|
|
233
|
-
|
|
233
|
+
toolOutputStore: deps.toolOutputStore,
|
|
234
234
|
});
|
|
235
235
|
if (deps.toolOutputStore !== undefined && !agent.tools.some((tool) => tool.id === READ_TOOL_OUTPUT_TOOL_ID)) {
|
|
236
236
|
logger.warn("the step agent declares no read_tool_output, thus its loops keep no text of a cut tool result");
|
|
@@ -245,37 +245,23 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
245
245
|
// `tool-finished`) and model-output deltas are wrapped under the
|
|
246
246
|
// `data-loop-event` envelope so the SSE consumer can route them.
|
|
247
247
|
//
|
|
248
|
-
// Every emit is `await`ed in order
|
|
249
|
-
// exec awaits its sandbox-event emits). A body-path `DBOS.writeStream` lands
|
|
248
|
+
// Every emit is `await`ed in order. A body-path `DBOS.writeStream` lands
|
|
250
249
|
// at a deterministic function-ID on replay (see the harness-durable-runtime
|
|
251
250
|
// spec) — no fire-and-forget tail racing the next real op for the counter.
|
|
252
|
-
//
|
|
253
|
-
// a step takes no function-ID, and a recovered step writes its events again.
|
|
251
|
+
// The events of a tool call arrive from inside the step of the call; a write
|
|
252
|
+
// from a step takes no function-ID, and a recovered step writes its events again.
|
|
254
253
|
// `safeEmit` swallows a stream-write failure: a dropped UI frame is
|
|
255
254
|
// non-fatal and must not fail the step.
|
|
256
|
-
// Pattern A (fan-in at route): write to the CHILD's own `"events"` stream.
|
|
257
|
-
// `DBOS.writeStream` writes only to the stream of its own workflow, so the
|
|
258
|
-
// SSE route reads the parent's stream plus every active child's, addressed
|
|
259
|
-
// by `cortex_step_executions.child_workflow_id`.
|
|
260
|
-
const emitToParentStream = (part) => DBOS.writeStream("events", part);
|
|
261
|
-
const safeEmit = async (part) => {
|
|
262
|
-
try {
|
|
263
|
-
await emitToParentStream(part);
|
|
264
|
-
}
|
|
265
|
-
catch (err) {
|
|
266
|
-
logger.warn("emitToParentStream failed (non-fatal)", logger.errorFields(err));
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
255
|
// Schema-conformant step-activity emitter. `data-step-activity` has a stable id per (runId, stepId),
|
|
270
256
|
// so the run-stream fold collapses every phase transition latest-wins. Each emission also leaves one
|
|
271
257
|
// `data-activity-entry` that the fold keeps, thus a late subscriber gets each line with its time. The
|
|
272
258
|
// two parts share one checkpointed clock read. `activitySeq` advances before the clock read and the
|
|
273
259
|
// writes, and each write fails alone through `safeEmit`.
|
|
274
260
|
let activitySeq = 0;
|
|
275
|
-
const emitActivity = async (phase, activity) => {
|
|
276
|
-
const
|
|
261
|
+
const emitActivity = async (phase, activity, toolUseId) => {
|
|
262
|
+
const key = toolUseId === undefined ? activitySeq++ : toolActivityKey(toolUseId);
|
|
277
263
|
const at = new Date(await DBOS.now()).toISOString();
|
|
278
|
-
const parts = activityEmission(input,
|
|
264
|
+
const parts = activityEmission(input, key, phase, activity, at);
|
|
279
265
|
await safeEmit(parts.activity);
|
|
280
266
|
await safeEmit(parts.entry);
|
|
281
267
|
};
|
|
@@ -287,7 +273,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
287
273
|
// stay free of internal paths/hashes/managed-root jargon. A DBOS cancellation is
|
|
288
274
|
// control-flow, not a failure — re-raise it verbatim.
|
|
289
275
|
const failStep = async (errorClass, err) => {
|
|
290
|
-
if (err
|
|
276
|
+
if (isWorkflowCancellation(err))
|
|
291
277
|
throw err;
|
|
292
278
|
await tryTeardown(logger, deps, sandbox);
|
|
293
279
|
const durationMs = (await DBOS.now()) - startedAt;
|
|
@@ -302,7 +288,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
302
288
|
errorClass,
|
|
303
289
|
durationMs,
|
|
304
290
|
hitMaxSteps,
|
|
305
|
-
|
|
291
|
+
lastExec,
|
|
306
292
|
...logger.errorFields(err),
|
|
307
293
|
});
|
|
308
294
|
const safe = userFacingStepFailure(errorClass);
|
|
@@ -359,7 +345,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
359
345
|
// envelope, and surface each tool call as live step activity.
|
|
360
346
|
await safeEmit({ type: "data-loop-event", data: { stepId: input.stepId, event } });
|
|
361
347
|
if (event.type === "tool-started") {
|
|
362
|
-
await emitActivity("executing", activityForTool(event.name, event.input, resolveDetail));
|
|
348
|
+
await emitActivity("executing", activityForTool(event.name, event.input, resolveDetail), event.toolUseId);
|
|
363
349
|
}
|
|
364
350
|
};
|
|
365
351
|
const initial = [{ role: "user", content: input.prompt }];
|
|
@@ -368,39 +354,38 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
368
354
|
// is enforced at DBOS checkpoint (step) boundaries, not cooperatively in-loop.
|
|
369
355
|
const neverAbort = new AbortController().signal;
|
|
370
356
|
let transcript;
|
|
357
|
+
let steps;
|
|
371
358
|
let finishReason;
|
|
372
359
|
// `false` until the loop reports otherwise: a loop that throws never reached its cap.
|
|
373
360
|
let hitMaxSteps = false;
|
|
374
361
|
let stepUsage;
|
|
375
362
|
try {
|
|
376
|
-
const agentResult = await
|
|
363
|
+
const agentResult = await runLoop(agent, initial, session, {
|
|
377
364
|
provider: deps.provider,
|
|
378
365
|
signal: neverAbort,
|
|
379
366
|
emit,
|
|
380
|
-
runStep: durableStep,
|
|
381
367
|
usageRecorder: deps.usageRecorder,
|
|
382
368
|
toolOutputStore: deps.toolOutputStore,
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
369
|
+
// The agent declares the output tool of the file-metadata follow-up
|
|
370
|
+
// request from its first request, and the task must not use it.
|
|
371
|
+
policy: {
|
|
372
|
+
mask: maskExcept(agent.tools.map((tool) => tool.id), [SUBMIT_FILE_METADATA_TOOL_ID]),
|
|
386
373
|
},
|
|
387
|
-
//
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
isFatalLoopError: (err) => err instanceof DBOSErrors.DBOSWorkflowCancelledError,
|
|
374
|
+
// A blocker ends the step: the agent declared that it cannot do the work.
|
|
375
|
+
stopWhen: (done) => blockerOf(done) !== null,
|
|
376
|
+
pause: pause.afterFailure,
|
|
391
377
|
});
|
|
392
378
|
transcript = agentResult.messages;
|
|
379
|
+
steps = agentResult.steps;
|
|
393
380
|
finishReason = agentResult.finish.reason;
|
|
394
381
|
hitMaxSteps = agentResult.finish.cappedOut;
|
|
395
382
|
stepUsage = agentResult.finish.usage;
|
|
396
383
|
}
|
|
397
384
|
catch (err) {
|
|
398
|
-
|
|
399
|
-
if (suspension !== undefined)
|
|
400
|
-
return suspendStep(suspension);
|
|
401
|
-
// Non-resumable failure — tear down, mark failed (scrubbed), re-raise so
|
|
385
|
+
// A failure with a cause of a pause waited in the loop, thus this one fails the step: tear down, mark failed (scrubbed), re-raise so
|
|
402
386
|
// the parent's `getResult` sees ERROR and the fail-fast cascade fires.
|
|
403
387
|
// `failStep` always throws; the outer `throw` is for control-flow analysis.
|
|
388
|
+
// oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path, and a wrapper would erase the scrubbed cause the parent reads.
|
|
404
389
|
throw await failStep("agent_loop", err);
|
|
405
390
|
}
|
|
406
391
|
// What the step's loop spent, emitted the moment the loop is done and before
|
|
@@ -428,11 +413,12 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
428
413
|
// Manifest walk, hoisted above the blocked branch so the capped-out
|
|
429
414
|
// predicate can read it. The call is inline (not `DBOS.runStep`-wrapped),
|
|
430
415
|
// so the hoist shifts no function id (see the harness-durable-runtime spec).
|
|
416
|
+
const noManifest = [];
|
|
431
417
|
const manifest = await safeRunValue(logger, () => walkStepArtifacts({
|
|
432
418
|
writePrefix,
|
|
433
419
|
stepId: input.stepId,
|
|
434
420
|
runId: input.runId,
|
|
435
|
-
}), "post-step.walk",
|
|
421
|
+
}), "post-step.walk", noManifest);
|
|
436
422
|
// Blocker (see the harness-sandbox-agents spec): the agent declared it cannot fulfil the step. A
|
|
437
423
|
// blocked step has no deliverables — skip the artifact post-step pipeline,
|
|
438
424
|
// mark `blocked` (carrying the reason), emit the blocked part, and return a
|
|
@@ -444,9 +430,8 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
444
430
|
// reason. A capped-out step WITH artifacts stays on the completed path,
|
|
445
431
|
// because partial output is real output.
|
|
446
432
|
//
|
|
447
|
-
//
|
|
448
|
-
|
|
449
|
-
const blockerOutcome = recordedBlocker(transcript) ?? blockerHolder.outcome;
|
|
433
|
+
// The recorded calls give the blocker on the first run and on each replay alike.
|
|
434
|
+
const blockerOutcome = blockerOf(steps);
|
|
450
435
|
const cappedOutEmpty = hitMaxSteps && manifest.length === 0;
|
|
451
436
|
if (blockerOutcome || cappedOutEmpty) {
|
|
452
437
|
const blockedReason = blockerOutcome?.reason ?? CAPPED_OUT_EMPTY_REASON;
|
|
@@ -479,7 +464,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
479
464
|
durationMs,
|
|
480
465
|
finishReason,
|
|
481
466
|
error: blockedReason,
|
|
482
|
-
|
|
467
|
+
usage: stepUsage,
|
|
483
468
|
};
|
|
484
469
|
}
|
|
485
470
|
// (4-8) post-step — the body is the explicit composition: the manifest from
|
|
@@ -533,21 +518,29 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
533
518
|
runId: input.runId,
|
|
534
519
|
stepId: input.stepId,
|
|
535
520
|
}, session));
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
521
|
+
const register = async () => {
|
|
522
|
+
let registration;
|
|
523
|
+
try {
|
|
524
|
+
registration = await reconcileAndRegisterStepArtifacts(deps, postCtx, manifest);
|
|
525
|
+
}
|
|
526
|
+
catch (attestationErr) {
|
|
527
|
+
if (isWorkflowCancellation(attestationErr))
|
|
528
|
+
throw attestationErr;
|
|
529
|
+
await syncStepArtifacts();
|
|
530
|
+
// oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path, and a wrapper would erase the scrubbed cause the parent reads.
|
|
531
|
+
throw await failStep("lineage_attestation", attestationErr);
|
|
532
|
+
}
|
|
543
533
|
await syncStepArtifacts();
|
|
544
|
-
|
|
534
|
+
return registration;
|
|
535
|
+
};
|
|
536
|
+
let registered = await register();
|
|
537
|
+
// A refusal of the register gate with the suspend flag waits in a pause, and the registration runs again after the resume.
|
|
538
|
+
while (registered.isErr() && registered.error.kind === "refused" && registered.error.refusal.kind === "suspended") {
|
|
539
|
+
await pauseAtGate(pause, registered.error.refusal.reason);
|
|
540
|
+
registered = await register();
|
|
545
541
|
}
|
|
546
|
-
await syncStepArtifacts();
|
|
547
542
|
if (registered.isErr()) {
|
|
548
|
-
|
|
549
|
-
if (refused !== undefined)
|
|
550
|
-
return suspendStep(refused);
|
|
543
|
+
// oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path.
|
|
551
544
|
throw await failStep("lineage_attestation", new Error(describeStepRegistrationFailure(registered.error)));
|
|
552
545
|
}
|
|
553
546
|
const reconciledManifest = registered.value;
|
|
@@ -629,7 +622,7 @@ export async function runSandboxStepBody(input, deps) {
|
|
|
629
622
|
durationMs,
|
|
630
623
|
finishReason,
|
|
631
624
|
error: null,
|
|
632
|
-
|
|
625
|
+
usage: stepUsage,
|
|
633
626
|
};
|
|
634
627
|
}
|
|
635
628
|
/**
|
|
@@ -642,7 +635,7 @@ async function safeRun(logger, fn, label) {
|
|
|
642
635
|
await fn();
|
|
643
636
|
}
|
|
644
637
|
catch (err) {
|
|
645
|
-
if (err
|
|
638
|
+
if (isWorkflowCancellation(err))
|
|
646
639
|
throw err;
|
|
647
640
|
// The stage rides as a namespace, not interpolated prose: `label` is what
|
|
648
641
|
// says WHICH post-step stage degraded, and a reader must be able to filter
|
|
@@ -660,7 +653,7 @@ async function safeRunValue(logger, fn, label, fallback) {
|
|
|
660
653
|
return await fn();
|
|
661
654
|
}
|
|
662
655
|
catch (err) {
|
|
663
|
-
if (err
|
|
656
|
+
if (isWorkflowCancellation(err))
|
|
664
657
|
throw err;
|
|
665
658
|
// The stage rides as a namespace, not interpolated prose: `label` is what
|
|
666
659
|
// says WHICH post-step stage degraded, and a reader must be able to filter
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SQL write shapes that the workflow tests match on recorded queries. The
|
|
3
|
+
* templates of the body wrap their SQL across lines, so each shape carries the
|
|
4
|
+
* flexible whitespace of that wrapping. One matcher per write, named for the
|
|
5
|
+
* write it finds.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ANALYSIS_STATE_WRITE: RegExp;
|
|
8
|
+
export declare const PAUSE_RECORD_WRITE: RegExp;
|
|
9
|
+
export declare const PAUSE_CLEAR_WRITE: RegExp;
|
|
10
|
+
export declare const PAUSES_OF_WORK_CLEAR_WRITE: RegExp;
|
|
11
|
+
export declare const RUNS_STATUS_WRITE: RegExp;
|
|
12
|
+
export declare const RUNS_STATUS_WRITE_ANY_CASE: RegExp;
|
|
13
|
+
export declare const SYNTHESIS_STATUS_WRITE: RegExp;
|
|
14
|
+
export declare const STEP_SEED_INSERT: RegExp;
|
|
15
|
+
export declare const ON_CONFLICT_DO_NOTHING: RegExp;
|
|
16
|
+
export declare const ON_CONFLICT_DO_UPDATE: RegExp;
|
|
17
|
+
export declare const STEP_STATUS_WRITE_PARAM: RegExp;
|
|
18
|
+
export declare const SKIPPED_SWEEP_WRITE: RegExp;
|
|
19
|
+
export declare const RUN_STATUS_WRITE_PARAM: RegExp;
|
|
20
|
+
export declare const STEP_EXECUTIONS_UPDATE: RegExp;
|
|
21
|
+
export declare const RUNS_PARTS_WRITE: RegExp;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SQL write shapes that the workflow tests match on recorded queries. The
|
|
3
|
+
* templates of the body wrap their SQL across lines, so each shape carries the
|
|
4
|
+
* flexible whitespace of that wrapping. One matcher per write, named for the
|
|
5
|
+
* write it finds.
|
|
6
|
+
*/
|
|
7
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- any write of the analysis row, across wrapped SQL lines
|
|
8
|
+
export const ANALYSIS_STATE_WRITE = /UPDATE\s+cortex_analysis_state/i;
|
|
9
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the row that a workflow writes before it waits in a pause, across wrapped SQL lines
|
|
10
|
+
export const PAUSE_RECORD_WRITE = /INSERT INTO cortex_paused_work/i;
|
|
11
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the delete of the row of one waiting workflow
|
|
12
|
+
export const PAUSE_CLEAR_WRITE = /DELETE FROM cortex_paused_work WHERE workflow_id = \$1/i;
|
|
13
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the delete of each row of a pause of one work
|
|
14
|
+
export const PAUSES_OF_WORK_CLEAR_WRITE = /DELETE FROM cortex_paused_work WHERE work_id = \$1/i;
|
|
15
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the run status write, across wrapped SQL lines
|
|
16
|
+
export const RUNS_STATUS_WRITE = /UPDATE cortex_runs\s+SET status/;
|
|
17
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the run status write in any letter case, across wrapped SQL lines
|
|
18
|
+
export const RUNS_STATUS_WRITE_ANY_CASE = /UPDATE\s+cortex_runs\s+SET\s+status/i;
|
|
19
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the synthesis status write on the run row, across wrapped SQL lines
|
|
20
|
+
export const SYNTHESIS_STATUS_WRITE = /UPDATE\s+cortex_runs\s+SET\s+synthesis_status/i;
|
|
21
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the seed insert of the step ledger, across wrapped SQL lines
|
|
22
|
+
export const STEP_SEED_INSERT = /INSERT INTO cortex_step_executions/i;
|
|
23
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the conflict arm of the seed insert, across wrapped SQL lines
|
|
24
|
+
export const ON_CONFLICT_DO_NOTHING = /DO NOTHING/i;
|
|
25
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the conflict arm of the mark-running upsert, across wrapped SQL lines
|
|
26
|
+
export const ON_CONFLICT_DO_UPDATE = /DO UPDATE/i;
|
|
27
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parameterized terminal status write on the step ledger, across wrapped SQL lines
|
|
28
|
+
export const STEP_STATUS_WRITE_PARAM = /UPDATE cortex_step_executions\s+SET status = \$1/i;
|
|
29
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the terminal sweep of pending steps to skipped, across wrapped SQL lines
|
|
30
|
+
export const SKIPPED_SWEEP_WRITE = /UPDATE cortex_step_executions\s+SET status = 'skipped'/i;
|
|
31
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parameterized run status write, across wrapped SQL lines
|
|
32
|
+
export const RUN_STATUS_WRITE_PARAM = /UPDATE cortex_runs\s+SET status = \$1/i;
|
|
33
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the step-ledger update that marks a canceled step, across wrapped SQL lines
|
|
34
|
+
export const STEP_EXECUTIONS_UPDATE = /UPDATE\s+cortex_step_executions/i;
|
|
35
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parts write on the run row, across wrapped SQL lines
|
|
36
|
+
export const RUNS_PARTS_WRITE = /UPDATE\s+cortex_runs\s+SET\s+parts/i;
|
|
@@ -76,7 +76,7 @@ export type ReadBytesResult = {
|
|
|
76
76
|
} | {
|
|
77
77
|
readonly kind: "out_of_scope";
|
|
78
78
|
};
|
|
79
|
-
export
|
|
79
|
+
export type WorkspaceFilesystem = {
|
|
80
80
|
/**
|
|
81
81
|
* Read a workspace file. `headLines` / `tailLines` (mutually exclusive,
|
|
82
82
|
* enforced by the caller) constrain the read to the first N / last N
|
|
@@ -123,22 +123,22 @@ export interface WorkspaceFilesystem {
|
|
|
123
123
|
readonly path: string;
|
|
124
124
|
readonly workingDir?: string;
|
|
125
125
|
}): ResultAsync<StatResult, FsError>;
|
|
126
|
-
}
|
|
126
|
+
};
|
|
127
127
|
/**
|
|
128
128
|
* Adapter for fetching files that aren't present locally. The managed
|
|
129
129
|
* realization downloads via object-store presigned URLs; the OSS build omits
|
|
130
130
|
* the fallback (files are local) and tests pass a fake.
|
|
131
131
|
*/
|
|
132
|
-
export
|
|
132
|
+
export type PresignedFallback = {
|
|
133
133
|
fetch(args: {
|
|
134
134
|
readonly session: AgentSession;
|
|
135
135
|
readonly relativePath: string;
|
|
136
136
|
}): Promise<Buffer | null>;
|
|
137
|
-
}
|
|
138
|
-
export
|
|
137
|
+
};
|
|
138
|
+
export type WorkspaceFilesystemDeps = {
|
|
139
139
|
/** Embedder-supplied workspace-root resolution seam (see workspace/paths.ts). */
|
|
140
140
|
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
141
141
|
/** Optional fallback for files not present locally. */
|
|
142
142
|
readonly presignedFallback?: PresignedFallback;
|
|
143
|
-
}
|
|
143
|
+
};
|
|
144
144
|
export declare function createWorkspaceFilesystem(deps: WorkspaceFilesystemDeps): WorkspaceFilesystem;
|
|
@@ -34,7 +34,8 @@ import { createInterface } from "node:readline";
|
|
|
34
34
|
import { join } from "node:path";
|
|
35
35
|
import { ResultAsync, ok } from "neverthrow";
|
|
36
36
|
import { scopeResource } from "../auth/types.js";
|
|
37
|
-
import { tryFetch, tryFs } from "../lib/fs-result.js";
|
|
37
|
+
import { tryFetch, tryFs, errnoOf } from "../lib/fs-result.js";
|
|
38
|
+
import { splitLines } from "../lib/text.js";
|
|
38
39
|
import { classifyWithinRoot } from "../lib/fs-helpers.js";
|
|
39
40
|
import { resolveWorkspacePath } from "./paths.js";
|
|
40
41
|
// ── Constructor ───────────────────────────────────────────────────────────
|
|
@@ -226,7 +227,8 @@ function collectEntries(dir, dirents) {
|
|
|
226
227
|
* off-tree, re-opening the read-exfiltration hole for the length of the race
|
|
227
228
|
* (CWE-367). `O_NOFOLLOW` makes the leaf open atomic — a symlinked final
|
|
228
229
|
* component fails `ELOOP` in the same syscall that opens it, so there is no
|
|
229
|
-
* check/use gap.
|
|
230
|
+
* check/use gap. On a platform that lacks the flag, the bitwise OR coerces the
|
|
231
|
+
* absent constant to 0 and the mask stays valid.
|
|
230
232
|
*
|
|
231
233
|
* This refuses EVERY leaf symlink, including an in-tree one the persistent check
|
|
232
234
|
* would allow: pure Node cannot express "follow only if it stays in-tree" (that
|
|
@@ -236,7 +238,7 @@ function collectEntries(dir, dirents) {
|
|
|
236
238
|
* exposes no `openat2`); the upstream realpath check still rejects the
|
|
237
239
|
* persistent case of that.
|
|
238
240
|
*/
|
|
239
|
-
const READ_NO_FOLLOW = fsConstants.O_RDONLY |
|
|
241
|
+
const READ_NO_FOLLOW = fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW;
|
|
240
242
|
/**
|
|
241
243
|
* Open a workspace file read-only without following a leaf symlink (see
|
|
242
244
|
* {@link READ_NO_FOLLOW}). A symlinked final component surfaces as `out_of_scope`
|
|
@@ -251,7 +253,7 @@ function openReadNoFollow(absolute) {
|
|
|
251
253
|
return { kind: "ok", fh: await fsOpen(absolute, READ_NO_FOLLOW) };
|
|
252
254
|
}
|
|
253
255
|
catch (cause) {
|
|
254
|
-
if (cause
|
|
256
|
+
if (errnoOf(cause) === "ELOOP")
|
|
255
257
|
return { kind: "out_of_scope" };
|
|
256
258
|
throw cause;
|
|
257
259
|
}
|
|
@@ -372,7 +374,7 @@ function readTailLines(absolute, totalSize, tailLines, maxBytes) {
|
|
|
372
374
|
if (windowSize > 0) {
|
|
373
375
|
await fh.read(buf, 0, windowSize, offset);
|
|
374
376
|
}
|
|
375
|
-
const allLines = buf.toString("utf8")
|
|
377
|
+
const allLines = splitLines(buf.toString("utf8"));
|
|
376
378
|
// Drop the partial leading line if the window doesn't cover the file start.
|
|
377
379
|
const candidateLines = offset > 0 ? allLines.slice(1) : allLines;
|
|
378
380
|
const sliced = candidateLines.length > tailLines ? candidateLines.slice(-tailLines) : candidateLines;
|
|
@@ -391,7 +393,7 @@ function readTailLines(absolute, totalSize, tailLines, maxBytes) {
|
|
|
391
393
|
}
|
|
392
394
|
function sliceHeadLines(content, headLines, maxBytes) {
|
|
393
395
|
const capped = maxBytes !== undefined && content.length > maxBytes ? content.subarray(0, maxBytes) : content;
|
|
394
|
-
const lines = capped.toString("utf8")
|
|
396
|
+
const lines = splitLines(capped.toString("utf8"));
|
|
395
397
|
const slice = lines.slice(0, headLines);
|
|
396
398
|
const out = Buffer.from(slice.join("\n"));
|
|
397
399
|
if (maxBytes !== undefined && content.length > maxBytes && slice.length < headLines) {
|
|
@@ -401,12 +403,12 @@ function sliceHeadLines(content, headLines, maxBytes) {
|
|
|
401
403
|
}
|
|
402
404
|
function sliceTailLines(content, tailLines, maxBytes) {
|
|
403
405
|
if (maxBytes === undefined || content.length <= maxBytes) {
|
|
404
|
-
const lines = content.toString("utf8")
|
|
406
|
+
const lines = splitLines(content.toString("utf8"));
|
|
405
407
|
const slice = lines.length > tailLines ? lines.slice(-tailLines) : lines;
|
|
406
408
|
return { kind: "ok", content: Buffer.from(slice.join("\n")), truncated: false };
|
|
407
409
|
}
|
|
408
410
|
const window = content.subarray(content.length - maxBytes);
|
|
409
|
-
const lines = window.toString("utf8")
|
|
411
|
+
const lines = splitLines(window.toString("utf8")).slice(1);
|
|
410
412
|
const slice = lines.length > tailLines ? lines.slice(-tailLines) : lines;
|
|
411
413
|
const out = Buffer.from(slice.join("\n"));
|
|
412
414
|
if (slice.length < tailLines) {
|
|
@@ -204,7 +204,7 @@ export declare function reportSessionDir(threadId: string): string;
|
|
|
204
204
|
*/
|
|
205
205
|
export declare function reportSessionDerivedDir(threadId: string): string;
|
|
206
206
|
/**
|
|
207
|
-
* True when `value` is a safe single path segment: the
|
|
207
|
+
* True when `value` is a safe single path segment: the safe-id charset (word
|
|
208
208
|
* chars, `.`, `-` — no slash, NUL, or shell-hostile char) AND not a pure-dot
|
|
209
209
|
* segment (`.`/`..`), which the charset otherwise admits and which `resolve`/`join`
|
|
210
210
|
* would treat as the current/parent directory and use to climb the tree. The one
|
package/dist/workspace/paths.js
CHANGED
|
@@ -179,7 +179,7 @@ export function toAnalysisRootPath(resourceId, path) {
|
|
|
179
179
|
return joinAnalysisRoot(resourceId, normalizeTail(rooted));
|
|
180
180
|
// A record holds no host path. Thus a leading slash is how a model writes the
|
|
181
181
|
// same root-relative path, and the remainder is the tail.
|
|
182
|
-
const tail = normalizeTail(trimmed
|
|
182
|
+
const tail = normalizeTail(stripLeadingSlashes(trimmed));
|
|
183
183
|
if (tail === ".." || tail.startsWith("../"))
|
|
184
184
|
return trimmed;
|
|
185
185
|
return joinAnalysisRoot(resourceId, tail);
|
|
@@ -239,9 +239,15 @@ function stripAnalysisRoot(path, analysisId) {
|
|
|
239
239
|
return null;
|
|
240
240
|
return slashIdx === -1 ? "" : withoutLead.slice(slashIdx + 1);
|
|
241
241
|
}
|
|
242
|
-
|
|
242
|
+
/** The text without its leading slashes. */
|
|
243
|
+
function stripLeadingSlashes(value) {
|
|
244
|
+
let start = 0;
|
|
245
|
+
while (start < value.length && value.charAt(start) === "/")
|
|
246
|
+
start++;
|
|
247
|
+
return value.slice(start);
|
|
248
|
+
}
|
|
243
249
|
/**
|
|
244
|
-
* True when `value` is a safe single path segment: the
|
|
250
|
+
* True when `value` is a safe single path segment: the safe-id charset (word
|
|
245
251
|
* chars, `.`, `-` — no slash, NUL, or shell-hostile char) AND not a pure-dot
|
|
246
252
|
* segment (`.`/`..`), which the charset otherwise admits and which `resolve`/`join`
|
|
247
253
|
* would treat as the current/parent directory and use to climb the tree. The one
|
|
@@ -250,7 +256,12 @@ const SAFE_ID = /^[\w.-]+$/;
|
|
|
250
256
|
* same at plan time and at mount time.
|
|
251
257
|
*/
|
|
252
258
|
export function isSafeId(value) {
|
|
253
|
-
return
|
|
259
|
+
return isSafeIdCharset(value) && value !== "." && value !== "..";
|
|
260
|
+
}
|
|
261
|
+
function isSafeIdCharset(value) {
|
|
262
|
+
if (value.length === 0)
|
|
263
|
+
return false;
|
|
264
|
+
return Array.from(value).every((char) => (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_" || char === "." || char === "-");
|
|
254
265
|
}
|
|
255
266
|
/**
|
|
256
267
|
* Throwing form of {@link isSafeId} for the mount/host-path builders. Ids are
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* read-time workspaces (chat, workflow agents) so they share the
|
|
6
6
|
* same persistent per-analysis pgvector index.
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { Querier } from "../state/db.js";
|
|
9
9
|
/** Derive the vector index name for an analysis. */
|
|
10
10
|
export declare function searchIndexName(resourceId: string): string;
|
|
11
11
|
/**
|
|
@@ -20,4 +20,4 @@ export declare function searchIndexName(resourceId: string): string;
|
|
|
20
20
|
* upsert. Per-analysis dimension tracking / re-embedding on a provider switch
|
|
21
21
|
* is a deliberate non-feature for now.
|
|
22
22
|
*/
|
|
23
|
-
export declare function ensureSearchIndex(pool:
|
|
23
|
+
export declare function ensureSearchIndex(pool: Querier, resourceId: string, dimensions: number): Promise<void>;
|