@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
|
@@ -17,26 +17,33 @@
|
|
|
17
17
|
* triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
|
|
18
18
|
* UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
|
|
19
19
|
*/
|
|
20
|
-
import {
|
|
20
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
21
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
22
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
23
|
+
import { isWorkflowCancellation } from "../runtime/dbos.js";
|
|
21
24
|
import { randomUUID } from "node:crypto";
|
|
22
25
|
import { ResultAsync, err, ok } from "neverthrow";
|
|
23
26
|
import { forStep, forSubAgent } from "../auth/types.js";
|
|
27
|
+
import { presentFirst } from "../lib/present.js";
|
|
28
|
+
import { collapseWhitespace } from "../lib/text.js";
|
|
24
29
|
import { createDataProfilerAgent } from "../agents/sandbox/data-profiler.js";
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
30
|
+
import { runWithSalvage } from "../loop/run-loop.js";
|
|
31
|
+
import { recordedInputOf } from "../loop/tool-adapter.js";
|
|
27
32
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
28
33
|
import { deliverNotice, passGate } from "../lib/hooks.js";
|
|
29
34
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
30
35
|
import { defineTool } from "../tools/define-tool.js";
|
|
31
36
|
import { createDetailResolver } from "../tools/detail-resolver.js";
|
|
32
37
|
import { renderWorkspace } from "../prompts/briefing.js";
|
|
33
|
-
import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
|
|
34
|
-
import {
|
|
38
|
+
import { keepSuspendingRefusal, SandboxFailure } from "../sandbox/sandbox-error.js";
|
|
39
|
+
import { workPause } from "../workflows/pause.js";
|
|
40
|
+
import { clearPausesOfWork } from "../state/paused-work.js";
|
|
35
41
|
import { toSandboxPath } from "../workspace/paths.js";
|
|
36
42
|
import { estimateDataProfileResources } from "../sandbox/estimate-data-profile-resources.js";
|
|
37
43
|
import { generateExecutionId } from "../sandbox/execution-id.js";
|
|
38
44
|
import { mintSandboxIdentity } from "../sandbox/identity.js";
|
|
39
45
|
import { createVectorStore } from "../state/vector-store.js";
|
|
46
|
+
import { z } from "zod";
|
|
40
47
|
import { ProfileSubmissionSchema } from "../schemas/data-profile-schemas.js";
|
|
41
48
|
import { computeInputSignature } from "../execution/input-signature.js";
|
|
42
49
|
import { readHeaders } from "../input-scan/enrich.js";
|
|
@@ -47,7 +54,7 @@ import { scanInputTree } from "../input-scan/scan.js";
|
|
|
47
54
|
import { PROFILE_INDEX_TYPES, buildProfileIndexEntries } from "./data-profile-index.js";
|
|
48
55
|
import { absorbRecipe, renderAbsorbDelta } from "./data-profile-absorb.js";
|
|
49
56
|
import { formatResolutionErrors, resolveProfileSubmission } from "./data-profile-resolve.js";
|
|
50
|
-
import { completeDataProfile, completeEmptyDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, recordDataProfileWorkflowId,
|
|
57
|
+
import { completeDataProfile, completeEmptyDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, recordDataProfileWorkflowId, tryRerunDataProfile, tryStartDataProfile, upsertArtifacts, } from "../state/index.js";
|
|
51
58
|
import { elapsedSinceIso, recordRunCompleted } from "../lib/metrics.js";
|
|
52
59
|
import { createProfileActivityEmitter } from "./data-profile-activity.js";
|
|
53
60
|
import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
|
|
@@ -64,15 +71,45 @@ const DATA_PROFILE_AGENT_ID = "data-profiler";
|
|
|
64
71
|
const DEFAULT_DEADLINE_MS = 1_200_000;
|
|
65
72
|
/** Index entries embedded and upserted per round trip. */
|
|
66
73
|
const INDEX_BATCH_SIZE = 256;
|
|
74
|
+
const SUBMIT_PROFILE_TOOL_ID = "submit_profile";
|
|
75
|
+
/** What one call of `submit_profile` tells the agent. */
|
|
76
|
+
const SubmitOutcomeSchema = z.discriminatedUnion("status", [
|
|
77
|
+
z.object({ status: z.literal("needs_repair"), detail: z.string() }),
|
|
78
|
+
z.object({
|
|
79
|
+
status: z.literal("accepted"),
|
|
80
|
+
groups: z.number(),
|
|
81
|
+
keptFiles: z.number(),
|
|
82
|
+
unclassifiedFiles: z.number(),
|
|
83
|
+
unresolvedOperations: z.number(),
|
|
84
|
+
}),
|
|
85
|
+
]);
|
|
86
|
+
/** The submissions of a run, in call order, with the outcome that the tool gave each one. */
|
|
87
|
+
function profileSubmissions(steps) {
|
|
88
|
+
const submissions = [];
|
|
89
|
+
for (const step of steps) {
|
|
90
|
+
for (const call of step.calls) {
|
|
91
|
+
if (call.toolName !== SUBMIT_PROFILE_TOOL_ID || call.output?.outcome !== "ok")
|
|
92
|
+
continue;
|
|
93
|
+
const submission = recordedInputOf(ProfileSubmissionSchema, call.input);
|
|
94
|
+
const outcome = SubmitOutcomeSchema.safeParse(call.output.value);
|
|
95
|
+
if (submission === undefined || !outcome.success)
|
|
96
|
+
continue;
|
|
97
|
+
submissions.push({ submission, accepted: outcome.data.status === "accepted" });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return submissions;
|
|
101
|
+
}
|
|
67
102
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* operation that still does not resolve produces no group, and its members land in the
|
|
73
|
-
* visible `unclassified` group rather than blocking a profile that gates planning.
|
|
103
|
+
* The submission that the profile records: the last accepted one, else the last one. A repair is a FULL
|
|
104
|
+
* resubmit — nothing merges into the prior attempt. The last submission of a run with no accepted one
|
|
105
|
+
* resolves as final: an operation that still does not resolve produces no group, and its members land in
|
|
106
|
+
* the visible `unclassified` group rather than blocking a profile that gates planning.
|
|
74
107
|
*/
|
|
75
|
-
|
|
108
|
+
function selectedSubmission(steps) {
|
|
109
|
+
const submissions = profileSubmissions(steps);
|
|
110
|
+
const chosen = submissions.filter((entry) => entry.accepted).at(-1) ?? submissions.at(-1);
|
|
111
|
+
return chosen === undefined ? undefined : { ...chosen, count: submissions.length };
|
|
112
|
+
}
|
|
76
113
|
/** Where the embedder stages this analysis's inputs (see the data-profile-init spec). */
|
|
77
114
|
const STAGED_INPUT_ROOT = "data/inputs";
|
|
78
115
|
/** Build the canonical artifact path for a staged input file. */
|
|
@@ -141,7 +178,7 @@ async function readSetHeaders(args) {
|
|
|
141
178
|
});
|
|
142
179
|
}
|
|
143
180
|
catch (err) {
|
|
144
|
-
if (err
|
|
181
|
+
if (isWorkflowCancellation(err))
|
|
145
182
|
throw err;
|
|
146
183
|
logger.warn("input-scan header readout failed (non-fatal)", logger.errorFields(err));
|
|
147
184
|
return new Map();
|
|
@@ -250,7 +287,7 @@ function logProfileMonitoring(logger, args) {
|
|
|
250
287
|
}
|
|
251
288
|
/**
|
|
252
289
|
* Register the data-profile workflow with DBOS. Returns the registered
|
|
253
|
-
* callable so `triggerDataProfile` can dispatch
|
|
290
|
+
* callable so `triggerDataProfile` can dispatch it through the run launcher.
|
|
254
291
|
*/
|
|
255
292
|
/**
|
|
256
293
|
* Project the workflow deps onto the profiler agent bag. The farm-extension
|
|
@@ -266,11 +303,11 @@ export function profilerSandboxAgentDeps(deps, step) {
|
|
|
266
303
|
embedding: deps.embedding,
|
|
267
304
|
model: deps.model,
|
|
268
305
|
skillsDir: deps.skillsDir,
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
306
|
+
farmLockFile: deps.farmLockFile,
|
|
307
|
+
imagePackagesFile: deps.imagePackagesFile,
|
|
308
|
+
refStorePath: deps.refStorePath,
|
|
309
|
+
extendAnalysisFarm: deps.extendAnalysisFarm,
|
|
310
|
+
toolOutputStore: deps.toolOutputStore,
|
|
274
311
|
bioKeys: deps.bioKeys,
|
|
275
312
|
step,
|
|
276
313
|
};
|
|
@@ -285,26 +322,8 @@ export function registerDataProfileWorkflow(deps) {
|
|
|
285
322
|
*/
|
|
286
323
|
export async function runDataProfileBody(input, deps) {
|
|
287
324
|
const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId: input.analysisId });
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
// Cortex-owned and must be revoked here.
|
|
291
|
-
const { analysisId, runSession, ownsMandate = true, stagedInputs } = input; // oss-core-managed-ok
|
|
292
|
-
const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
|
|
293
|
-
const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(authorization, reason));
|
|
294
|
-
let selfCancelled = false;
|
|
295
|
-
// A suspension fails the row with the reason of the host, because the profile
|
|
296
|
-
// ledger has no suspended state and the retry path takes a `failed` row again.
|
|
297
|
-
const suspendProfile = async (suspension) => {
|
|
298
|
-
logger.warn("profile suspended", { reason: suspension.reason });
|
|
299
|
-
await settleTerminalWrite(logger, analysisId, unwrapOrThrow(await failDataProfile(deps.pool, analysisId, suspension.reason)), "failed", deps.notifyDataProfileSettled);
|
|
300
|
-
await revoke("data-profile-suspended");
|
|
301
|
-
unwrapOrThrow(await suspendAnalysis(deps.pool, analysisId));
|
|
302
|
-
await activity.failed(suspension.reason);
|
|
303
|
-
if (DBOS.workflowID === undefined)
|
|
304
|
-
return;
|
|
305
|
-
selfCancelled = true;
|
|
306
|
-
await cancelSelf("self-cancel-suspended");
|
|
307
|
-
};
|
|
325
|
+
const { analysisId, runSession, stagedInputs } = input;
|
|
326
|
+
const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(runSession, reason));
|
|
308
327
|
// The profile's activity channel. The write to the stream is bound here, while every phase and
|
|
309
328
|
// phrase lives in the emitter — the phrases are the observable contract of
|
|
310
329
|
// this capability, and a body that composed its own strings is a body they can drift from.
|
|
@@ -355,6 +374,17 @@ export async function runDataProfileBody(input, deps) {
|
|
|
355
374
|
}))));
|
|
356
375
|
const executionId = generateExecutionId(DATA_PROFILE_AGENT_ID);
|
|
357
376
|
const workflowId = DBOS.workflowID ?? `${DATA_PROFILE_RUN_LITERAL}:${executionId}`;
|
|
377
|
+
// The profile waits in place, with its row `running`: the profile pauses, and it does not fail.
|
|
378
|
+
const pause = workPause({
|
|
379
|
+
pool: deps.pool,
|
|
380
|
+
workId: workflowId,
|
|
381
|
+
workKind: "profile",
|
|
382
|
+
analysisId,
|
|
383
|
+
emit: (part) => DBOS.writeStream("events", part),
|
|
384
|
+
retryDelaysMs: deps.pauseRetryDelaysMs,
|
|
385
|
+
run: { session: runSession, authorizer: deps.runAuthorizer },
|
|
386
|
+
logger,
|
|
387
|
+
});
|
|
358
388
|
const childSession = forSubAgent(runSession, DATA_PROFILE_AGENT_ID);
|
|
359
389
|
// A resolver rejection fails the workflow loudly (workspace-root-resolution
|
|
360
390
|
// contract) — profiling an analysis whose root cannot be resolved is
|
|
@@ -428,9 +458,16 @@ export async function runDataProfileBody(input, deps) {
|
|
|
428
458
|
// from the agent loop would leave the longest wait of all unreported — the same defect the
|
|
429
459
|
// run panel's activity readout was built to remove.
|
|
430
460
|
await activity.sandboxInit();
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
|
|
461
|
+
const spawn = async () => keepSuspendingRefusal(await deps.sandboxClient.createSandbox(forStep(runSession, DATA_PROFILE_STEP_LITERAL), { childWorkflowId: workflowId, resources: estimateDataProfileResources(stagedInputs) }, mintSandboxIdentity(DATA_PROFILE_RUN_LITERAL)));
|
|
462
|
+
let spawned = await spawn();
|
|
463
|
+
// A refusal of the label gate with the suspend flag waits in a pause, and the spawn runs again after the
|
|
464
|
+
// resume. A body that runs outside a workflow cannot wait, thus the refusal fails the profile there.
|
|
465
|
+
while (spawned.isErr()) {
|
|
466
|
+
const waited = await pause.forCause({ kind: "host", reason: spawned.error.reason }, 0);
|
|
467
|
+
if (waited === undefined)
|
|
468
|
+
throw new SandboxFailure(spawned.error);
|
|
469
|
+
spawned = await spawn();
|
|
470
|
+
}
|
|
434
471
|
const sandbox = spawned.value;
|
|
435
472
|
try {
|
|
436
473
|
// Checkpointed clock, not `Date.now()`: one deadline bounds every exec of the
|
|
@@ -483,34 +520,26 @@ export async function runDataProfileBody(input, deps) {
|
|
|
483
520
|
allowedWritePrefix: profileWritePrefix,
|
|
484
521
|
deadlineMs: () => deadlineAbs,
|
|
485
522
|
});
|
|
486
|
-
let accepted = null;
|
|
487
|
-
let rounds = 0;
|
|
488
523
|
const submitProfileTool = defineTool({
|
|
489
|
-
id:
|
|
490
|
-
description: "Submit the profiling results. Call this tool
|
|
491
|
-
"operations against the scan, computes every group's membership and counts, and
|
|
492
|
-
"A submission whose operations do not resolve, or that leaves kept files unclaimed, comes back
|
|
493
|
-
"the errors; the repair is a FULL resubmit of the whole operation list.",
|
|
524
|
+
id: SUBMIT_PROFILE_TOOL_ID,
|
|
525
|
+
description: "Submit the profiling results. Call this tool after completing all profiling work — it resolves your " +
|
|
526
|
+
"operations against the scan, computes every group's membership and counts, and checks the profile. " +
|
|
527
|
+
"A submission whose operations do not resolve, or that leaves kept files unclaimed, comes back with " +
|
|
528
|
+
"the errors; the repair is a FULL resubmit of the whole operation list. The last accepted submission is the profile.",
|
|
494
529
|
inputSchema: ProfileSubmissionSchema,
|
|
495
530
|
describeCall: "none",
|
|
496
|
-
execute:
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
// operation the agent happened to write first.
|
|
501
|
-
const finalRound = rounds >= MAX_SUBMIT_ROUNDS;
|
|
502
|
-
const resolution = resolveProfileSubmission(input, detected, briefingMenu, { finalRound });
|
|
503
|
-
if (!finalRound && (resolution.errors.length > 0 || resolution.unclaimed.length > 0)) {
|
|
504
|
-
return ok({ status: "needs_repair", detail: formatResolutionErrors(resolution) });
|
|
531
|
+
execute: (input) => {
|
|
532
|
+
const resolution = resolveProfileSubmission(input, detected, briefingMenu, { finalRound: false });
|
|
533
|
+
if (resolution.errors.length > 0 || resolution.unclaimed.length > 0) {
|
|
534
|
+
return Promise.resolve(ok({ status: "needs_repair", detail: formatResolutionErrors(resolution) }));
|
|
505
535
|
}
|
|
506
|
-
|
|
507
|
-
return ok({
|
|
536
|
+
return Promise.resolve(ok({
|
|
508
537
|
status: "accepted",
|
|
509
538
|
groups: resolution.groups.length,
|
|
510
539
|
keptFiles: resolution.partition.keptFiles,
|
|
511
540
|
unclassifiedFiles: resolution.partition.unclassifiedFiles,
|
|
512
541
|
unresolvedOperations: resolution.errors.length,
|
|
513
|
-
});
|
|
542
|
+
}));
|
|
514
543
|
},
|
|
515
544
|
});
|
|
516
545
|
const baseAgent = createDataProfilerAgent(sandboxAgentDeps);
|
|
@@ -523,37 +552,39 @@ export async function runDataProfileBody(input, deps) {
|
|
|
523
552
|
// otherwise still read as `Starting sandbox` long after the container was up. The run
|
|
524
553
|
// path's `Running ${agentId}` serves the same purpose at the same point.
|
|
525
554
|
await activity.agentStarting();
|
|
526
|
-
await
|
|
555
|
+
const run = await runWithSalvage(agentDef, [{ role: "user", content: prompt }], childSession, {
|
|
527
556
|
provider: deps.provider,
|
|
528
557
|
signal,
|
|
529
558
|
// Every tool call the profiler makes becomes live activity. Only `tool-started`
|
|
530
559
|
// is forwarded: the loop's other events (iteration boundaries, model deltas,
|
|
531
560
|
// tool completions) describe machinery rather than work, and the panel this
|
|
532
561
|
// feeds carries a single line whose value is that it always names what is
|
|
533
|
-
// happening now.
|
|
534
|
-
// function id and an unawaited write would race the next operation for the
|
|
535
|
-
// counter and desynchronise the recorded sequence on replay.
|
|
562
|
+
// happening now. The events of a tool call arrive from inside its step.
|
|
536
563
|
emit: async (event) => {
|
|
537
564
|
if (event.type === "tool-started")
|
|
538
|
-
await activity.forTool(event.name, event.input, resolveDetail);
|
|
565
|
+
await activity.forTool(event.toolUseId, event.name, event.input, resolveDetail);
|
|
539
566
|
},
|
|
540
|
-
runStep: durableStep,
|
|
541
|
-
resolved: () => accepted !== null,
|
|
542
567
|
invocationId: workflowId,
|
|
543
568
|
usageRecorder: deps.usageRecorder,
|
|
544
569
|
toolOutputStore: deps.toolOutputStore,
|
|
545
|
-
|
|
570
|
+
pause: pause.afterFailure,
|
|
546
571
|
}, {
|
|
547
|
-
tools: [
|
|
548
|
-
nudge: "You stopped without
|
|
572
|
+
tools: [SUBMIT_PROFILE_TOOL_ID],
|
|
573
|
+
nudge: "You stopped without an accepted submit_profile, so no profile was " +
|
|
549
574
|
"recorded. Call submit_profile now with your operations on the menu, " +
|
|
550
575
|
"what each resulting group means, and the dimensions you saw with " +
|
|
551
576
|
"their observations — base it on the scan and the work you already did.",
|
|
577
|
+
hasOutcome: (steps) => profileSubmissions(steps).some((entry) => entry.accepted),
|
|
552
578
|
});
|
|
553
|
-
|
|
579
|
+
const selected = selectedSubmission(run.steps);
|
|
580
|
+
if (selected === undefined) {
|
|
554
581
|
throw new Error("Data profiling failed: agent did not call submit_profile");
|
|
555
582
|
}
|
|
556
|
-
const { submission
|
|
583
|
+
const { submission } = selected;
|
|
584
|
+
// A submission that no call accepted resolves as final: nothing that follows can repair an
|
|
585
|
+
// overlap, so a contested file sweeps rather than being awarded to whichever operation the
|
|
586
|
+
// agent happened to write first. The resolution is pure, thus it gives the answer of the call.
|
|
587
|
+
const resolution = resolveProfileSubmission(submission, detected, briefingMenu, { finalRound: !selected.accepted });
|
|
557
588
|
// 5. Index into vector store — one entry per group, one per dimension, one per annotated member.
|
|
558
589
|
//
|
|
559
590
|
// Reported as `indexing`, not `persisting`: the contract defines `persisting` as step
|
|
@@ -566,7 +597,7 @@ export async function runDataProfileBody(input, deps) {
|
|
|
566
597
|
resolution,
|
|
567
598
|
dimensions: resolution.dimensions,
|
|
568
599
|
probes: resolution.probes,
|
|
569
|
-
repairRounds:
|
|
600
|
+
repairRounds: selected.count - 1,
|
|
570
601
|
absorb: absorb.kind,
|
|
571
602
|
});
|
|
572
603
|
// 6. Complete — store the FULL profiler finding plus the input signature for
|
|
@@ -591,11 +622,12 @@ export async function runDataProfileBody(input, deps) {
|
|
|
591
622
|
}
|
|
592
623
|
}
|
|
593
624
|
catch (err) {
|
|
594
|
-
if (
|
|
625
|
+
if (isWorkflowCancellation(err)) {
|
|
626
|
+
// `stopDataProfile` writes the row, but only the body holds the run session.
|
|
627
|
+
await revoke("data-profile-stopped");
|
|
595
628
|
throw err;
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
return await suspendProfile(suspension);
|
|
629
|
+
}
|
|
630
|
+
// A failure with a cause of a pause waited in the loop, thus this one fails the profile.
|
|
599
631
|
logger.error("profile failed", logger.errorFields(err));
|
|
600
632
|
const reason = profileFailureReason(err);
|
|
601
633
|
await settleTerminalWrite(logger, analysisId, unwrapOrThrow(await failDataProfile(deps.pool, analysisId, reason)), "failed", deps.notifyDataProfileSettled);
|
|
@@ -646,9 +678,8 @@ export function describeDataProfileStartError(e) {
|
|
|
646
678
|
}
|
|
647
679
|
/**
|
|
648
680
|
* Resolve the `RunSession` the workflow runs under. Whether the authorization
|
|
649
|
-
* is freshly minted
|
|
650
|
-
*
|
|
651
|
-
* through and never inspects it.
|
|
681
|
+
* is freshly minted or reused is decided by the `RunAuthorizer` seam from the
|
|
682
|
+
* opaque auth; this passes that auth straight through and never inspects it.
|
|
652
683
|
*/
|
|
653
684
|
export function authorizeDataProfile(deps, params) {
|
|
654
685
|
const { auth, analysisId } = params;
|
|
@@ -681,15 +712,11 @@ export function dataProfileWorkflowId(analysisId, nonce) {
|
|
|
681
712
|
* supplied the manifest in `params.stagedInputs`; this forwards it into the
|
|
682
713
|
* workflow input. The handle result is not awaited.
|
|
683
714
|
*/
|
|
684
|
-
async function startDataProfileWorkflow(deps, params,
|
|
685
|
-
const { runSession, ownsMandate } = authorization; // oss-core-managed-ok
|
|
715
|
+
async function startDataProfileWorkflow(deps, params, runSession) {
|
|
686
716
|
const attemptNonce = randomUUID();
|
|
687
|
-
await
|
|
688
|
-
workflowID: dataProfileWorkflowId(params.analysisId, attemptNonce),
|
|
689
|
-
})({
|
|
717
|
+
await deps.runLauncher.launch(deps.workflow, { workflowId: dataProfileWorkflowId(params.analysisId, attemptNonce) }, {
|
|
690
718
|
analysisId: params.analysisId,
|
|
691
719
|
runSession,
|
|
692
|
-
ownsMandate, // oss-core-managed-ok
|
|
693
720
|
stagedInputs: params.stagedInputs,
|
|
694
721
|
});
|
|
695
722
|
}
|
|
@@ -827,12 +854,8 @@ async function compensateStartFailure(deps, analysisId, phase, cause) {
|
|
|
827
854
|
async function refuseClaimedProfile(deps, analysisId, phase, refusal) {
|
|
828
855
|
const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
|
|
829
856
|
logger.error("the profile was not authorized", { phase, reason: refusal.reason, suspend: refusal.kind === "suspended" });
|
|
857
|
+
// No work exists yet, thus a refusal with the suspend flag fails the row the same as each other refusal.
|
|
830
858
|
await failClaimedProfile(deps, analysisId, phase, refusal.reason);
|
|
831
|
-
if (suspensionOfRefusal(refusal) === undefined)
|
|
832
|
-
return;
|
|
833
|
-
const marked = await suspendAnalysis(deps.pool, analysisId);
|
|
834
|
-
if (marked.isErr())
|
|
835
|
-
logger.error("the analysis was not marked as suspended", { phase, err: marked.error });
|
|
836
859
|
}
|
|
837
860
|
async function failClaimedProfile(deps, analysisId, phase, reason) {
|
|
838
861
|
const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
|
|
@@ -863,6 +886,26 @@ async function failClaimedProfile(deps, analysisId, phase, reason) {
|
|
|
863
886
|
export function runDataProfile(deps, params) {
|
|
864
887
|
return new ResultAsync(dispatchClaimedProfile(deps, params, "Retry"));
|
|
865
888
|
}
|
|
889
|
+
/** The ledger error of a profile that a stop ended. A client shows it, and a retry can follow it. */
|
|
890
|
+
export const DATA_PROFILE_STOPPED = "Data profiling was stopped";
|
|
891
|
+
/**
|
|
892
|
+
* Stop the profile workflow of an analysis, and fail its row. The body passes a cancel through its failure path,
|
|
893
|
+
* thus the row, the rows of its pauses, and the settled notice converge here. The revoke of the mandate and the
|
|
894
|
+
* teardown of the sandbox stay in the body, which runs them on its way out. The `running` guard of the row write keeps a profile that settled first.
|
|
895
|
+
*/
|
|
896
|
+
export async function stopDataProfile(deps, analysisId, workflowId) {
|
|
897
|
+
const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
|
|
898
|
+
await DBOS.cancelWorkflow(workflowId);
|
|
899
|
+
const cleared = await clearPausesOfWork(deps.pool, workflowId);
|
|
900
|
+
if (cleared.isErr())
|
|
901
|
+
logger.warn("the pauses of a stopped profile did not clear", { op: cleared.error.op });
|
|
902
|
+
const failed = await failDataProfile(deps.pool, analysisId, DATA_PROFILE_STOPPED);
|
|
903
|
+
if (failed.isErr()) {
|
|
904
|
+
logger.error("the row of a stopped profile did not fail", { op: failed.error.op });
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
await settleTerminalWrite(logger, analysisId, failed.value, "failed", deps.notifyDataProfileSettled);
|
|
908
|
+
}
|
|
866
909
|
/**
|
|
867
910
|
* Concise, UI-safe failure reason. `data_profile_error` is surfaced verbatim
|
|
868
911
|
* to the frontend, so raw errors — K8s API response bodies, multi-line stack
|
|
@@ -871,7 +914,7 @@ export function runDataProfile(deps, params) {
|
|
|
871
914
|
*/
|
|
872
915
|
const PROFILE_ERROR_MAX_LEN = 200;
|
|
873
916
|
function profileFailureReason(err) {
|
|
874
|
-
const raw = err
|
|
875
|
-
const firstLine = raw.split("\n", 1)
|
|
917
|
+
const raw = errorMessageOf(err) ?? textOf(err);
|
|
918
|
+
const firstLine = collapseWhitespace(presentFirst(raw.split("\n", 1), "the first line of the error"));
|
|
876
919
|
return firstLine.length > PROFILE_ERROR_MAX_LEN ? firstLine.slice(0, PROFILE_ERROR_MAX_LEN - 1) + "…" : firstLine || "Data profiling failed";
|
|
877
920
|
}
|
|
@@ -1,52 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The extraction
|
|
2
|
+
* The extraction pass on the profile rails, and the `ExtractionArm` realization over it.
|
|
3
3
|
*
|
|
4
4
|
* The report resolver falls through to this arm for an over-cap file or a host parse fault. The arm runs one
|
|
5
5
|
* fixed extraction script in an ephemeral sandbox, and it gives back the rows that the script read. No agent
|
|
6
6
|
* loop runs anywhere in this path. A file whose extension names no tabular format never arrives here,
|
|
7
7
|
* because the host decides the format and it refuses the file before the fall-through.
|
|
8
8
|
*
|
|
9
|
-
* The
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* standing machine exists.
|
|
9
|
+
* The pass runs inside the step of the tool call that resolves the report (`sandbox/step-sandbox.ts`), under
|
|
10
|
+
* the auth of that call, and it mints no mandate. One call can run more than one pass, thus the exec of each
|
|
11
|
+
* pass takes the key of the step and a hash of its requests. The container is ephemeral, and it goes away
|
|
12
|
+
* with the work, thus no standing machine exists.
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import type { RunAuthorizer } from "../execution/run-authorizer.js";
|
|
14
|
+
import type { Result } from "neverthrow";
|
|
15
|
+
import type { AuthContext, Identity } from "../auth/types.js";
|
|
17
16
|
import type { Logger } from "../lib/logger.js";
|
|
18
17
|
import type { ExtractionArm, ExtractionArtifact, ExtractionRequest } from "../report-model/production-resolver.js";
|
|
19
18
|
import type { SandboxClient } from "../sandbox/client.js";
|
|
20
|
-
import {
|
|
19
|
+
import type { SuspendingRefusal } from "../sandbox/sandbox-error.js";
|
|
21
20
|
import type { ExecRequest, ExecResult } from "../sandbox/types.js";
|
|
22
21
|
import { type ExtractValuesResult } from "./extract-values-script.js";
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* sandbox and authorization rails, thus it draws the same three seams and nothing else.
|
|
27
|
-
*/
|
|
28
|
-
export interface ExtractValuesDeps {
|
|
22
|
+
/** The construction deps of the pass. It shares the sandbox rail of the profile. */
|
|
23
|
+
export type ExtractionDeps = {
|
|
24
|
+
readonly sandboxClient: SandboxClient;
|
|
29
25
|
/** Operational logging seam. An absent logger falls back to a no-op. */
|
|
30
26
|
readonly logger?: Logger;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* The workflow input. It is JSON-serializable, thus DBOS persists it as the workflow's input row. The
|
|
36
|
-
* `RunSession` carries the run authorization. The body reads it and never mints.
|
|
37
|
-
*/
|
|
38
|
-
export interface ExtractValuesWorkflowInput {
|
|
27
|
+
};
|
|
28
|
+
/** The caller of one pass: the analysis that it reads, and the identity and the auth of the tool call. */
|
|
29
|
+
export type ExtractionCaller = {
|
|
39
30
|
readonly analysisId: string;
|
|
40
|
-
readonly
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* True when this workflow owns the run-authorization lifecycle, thus the body revokes on every terminal
|
|
45
|
-
* path. An input persisted before this field existed reads as absent, and the body defaults it to true,
|
|
46
|
-
* which matches the prior owned behavior.
|
|
47
|
-
*/
|
|
48
|
-
readonly ownsMandate?: boolean;
|
|
49
|
-
}
|
|
31
|
+
readonly identity: Identity;
|
|
32
|
+
readonly auth: AuthContext;
|
|
33
|
+
};
|
|
50
34
|
/**
|
|
51
35
|
* Build the sandbox exec for one extraction pass. The command runs the fixed script through `python3 -c`.
|
|
52
36
|
* The working directory is the analysis mount, thus a relative request path reads the correct file. The
|
|
@@ -65,56 +49,18 @@ export declare function buildExtractionExec(analysisId: string, requests: readon
|
|
|
65
49
|
* Parse the script output from the exec result. A synthetic failure, a timeout, and a non-zero exit each
|
|
66
50
|
* throw, because each means the script did not emit its map. A stdout that is not the map shape throws too.
|
|
67
51
|
*
|
|
68
|
-
* The function is pure, thus a test asserts the parse without a sandbox. The
|
|
69
|
-
*
|
|
52
|
+
* The function is pure, thus a test asserts the parse without a sandbox. The arm turns the throw into a
|
|
53
|
+
* rejected promise.
|
|
70
54
|
*/
|
|
71
55
|
export declare function parseExtractionOutput(result: ExecResult): ExtractValuesResult;
|
|
72
56
|
/**
|
|
73
|
-
*
|
|
74
|
-
* container, submits one exec, awaits the result durably, and gives the value map back. It revokes the run
|
|
75
|
-
* authorization on every terminal path, and it tears the container down on both paths.
|
|
57
|
+
* Run one extraction pass: make the container, run the script on every request, and remove the container.
|
|
76
58
|
*
|
|
77
|
-
* A
|
|
78
|
-
* cancel (workflow-suspension spec). The body does not mark the analysis: the caller reports the suspension.
|
|
59
|
+
* A suspending refusal of the spawn is the `err`, and the caller reports it. Each other fault throws.
|
|
79
60
|
*/
|
|
80
|
-
export declare function
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
* dispatches with `DBOS.startWorkflow`.
|
|
84
|
-
*/
|
|
85
|
-
export declare function registerExtractValuesWorkflow(deps: ExtractValuesDeps): (input: ExtractValuesWorkflowInput) => Promise<Result<ExtractValuesResult, Suspension>>;
|
|
86
|
-
/** The per-attempt workflow id. A fresh nonce keeps each pass under a distinct id. */
|
|
87
|
-
export declare function extractValuesWorkflowId(analysisId: string, nonce: string): string;
|
|
88
|
-
/**
|
|
89
|
-
* The route-side deps for the trigger: the run authorizer, and the registered workflow callable. The body's
|
|
90
|
-
* construction-time deps are closed over at registration, thus the trigger never holds them.
|
|
91
|
-
*/
|
|
92
|
-
export interface ExtractValuesTriggerDeps {
|
|
93
|
-
readonly runAuthorizer: RunAuthorizer;
|
|
94
|
-
readonly workflow: (input: ExtractValuesWorkflowInput) => Promise<Result<ExtractValuesResult, Suspension>>;
|
|
95
|
-
}
|
|
96
|
-
/** The identity and the requests for one extraction pass. */
|
|
97
|
-
export interface ExtractValuesTriggerParams {
|
|
98
|
-
readonly auth: AuthContext;
|
|
99
|
-
readonly analysisId: string;
|
|
100
|
-
readonly requests: readonly ExtractionRequest[];
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* The async edge. It authorizes through the `RunAuthorizer`, starts the workflow, and awaits the outcome.
|
|
104
|
-
* The body owns the revoke, thus the trigger holds no lifecycle. A workflow fault and a refused
|
|
105
|
-
* authorization reject the returned promise. A suspension is the `err` of the result: of the workflow, or of
|
|
106
|
-
* an authorization that the host refused with the suspend flag.
|
|
107
|
-
*/
|
|
108
|
-
export declare function triggerExtractValues(deps: ExtractValuesTriggerDeps, params: ExtractValuesTriggerParams): Promise<Result<ExtractValuesResult, Suspension>>;
|
|
109
|
-
/** Runs one extraction pass for the bound analysis, and gives the raw value map back, or the suspension. */
|
|
110
|
-
export type ExtractionRunner = (requests: readonly ExtractionRequest[]) => Promise<Result<ExtractValuesResult, Suspension>>;
|
|
111
|
-
/**
|
|
112
|
-
* Bind the trigger to one analysis and one auth context. The result runs one pass with every request in it.
|
|
113
|
-
*/
|
|
114
|
-
export declare function bindExtractionTrigger(deps: ExtractValuesTriggerDeps, binding: {
|
|
115
|
-
readonly auth: AuthContext;
|
|
116
|
-
readonly analysisId: string;
|
|
117
|
-
}): ExtractionRunner;
|
|
61
|
+
export declare function runExtraction(deps: ExtractionDeps, caller: ExtractionCaller, requests: readonly ExtractionRequest[]): Promise<Result<ExtractValuesResult, SuspendingRefusal>>;
|
|
62
|
+
/** Runs one extraction pass for the bound analysis, and gives the raw value map back, or the refusal of its sandbox. */
|
|
63
|
+
export type ExtractionRunner = (requests: readonly ExtractionRequest[]) => Promise<Result<ExtractValuesResult, SuspendingRefusal>>;
|
|
118
64
|
/**
|
|
119
65
|
* Turn the raw script output into the arm result. A path with rows enters the map. A path with an error
|
|
120
66
|
* drops out, thus the reference at that path reads as an unread artifact, which the seam contract expects.
|
|
@@ -125,6 +71,7 @@ export declare function extractionArtifactsFromResult(result: ExtractValuesResul
|
|
|
125
71
|
/**
|
|
126
72
|
* Make the extraction arm over a runner. One `extract` call makes one run with every request in it, and it
|
|
127
73
|
* gives the value map. A run fault rejects the promise, and the resolver turns the rejection into a failed
|
|
128
|
-
* reference. A
|
|
74
|
+
* reference. A refusal of the sandbox with the suspend flag is the `err`, and the resolver reports its reason on each
|
|
75
|
+
* reference.
|
|
129
76
|
*/
|
|
130
77
|
export declare function createExtractionArm(run: ExtractionRunner): ExtractionArm;
|