@inflexa-ai/harness 0.45.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +19 -3
- package/dist/agents/conversation-agent.js +49 -30
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +35 -16
- package/dist/agents/sandbox/shared.js +63 -24
- package/dist/agents/sandbox/translational-safety-agent.js +26 -0
- package/dist/agents/sandbox/types.d.ts +26 -3
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +16 -2
- package/dist/agents/sandbox-catalog.js +22 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/approve-plan.d.ts +5 -2
- package/dist/app/approve-plan.js +1 -1
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +125 -99
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +10 -8
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +46 -22
- package/dist/contracts/chat-events.js +1 -1
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +67 -40
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +45 -6
- package/dist/contracts/schemas/chat-events.js +16 -0
- package/dist/contracts/schemas/chat-parts.d.ts +214 -102
- package/dist/contracts/schemas/chat-parts.js +50 -7
- package/dist/contracts/schemas/index.d.ts +1 -1
- package/dist/contracts/schemas/index.js +1 -1
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +7 -6
- package/dist/execution/dbos-workflow-purger.js +29 -21
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +39 -17
- package/dist/execution/run-canceler.js +137 -28
- package/dist/execution/run-end-record.d.ts +29 -0
- package/dist/execution/run-end-record.js +27 -0
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +25 -24
- package/dist/index.js +36 -37
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +14 -9
- package/dist/loop/compaction.js +17 -0
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +34 -37
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -6
- package/dist/memory/conversation-display-recorder.js +64 -20
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +66 -24
- package/dist/memory/thread-history.js +212 -79
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +63 -9
- package/dist/prompts/briefing.js +130 -3
- package/dist/prompts/planner.js +13 -2
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +24 -19
- package/dist/provenance/seam.js +7 -5
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +303 -458
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +59 -92
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +166 -10
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +209 -231
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.d.ts +26 -4
- package/dist/sandbox/image-packages.js +29 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +351 -306
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +79 -25
- package/dist/schemas/plan-schemas.js +1 -1
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +127 -14
- package/dist/schemas/workflow-state.js +56 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +47 -18
- package/dist/state/artifacts.js +48 -7
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +5 -5
- package/dist/state/index.js +3 -3
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +70 -25
- package/dist/state/runs.js +127 -64
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +29 -8
- package/dist/state/step-executions.js +28 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +11 -9
- package/dist/tools/ad-hoc-router.js +80 -51
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +40 -0
- package/dist/tools/capability-data.js +74 -0
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +54 -17
- package/dist/tools/execute-analysis.js +193 -62
- package/dist/tools/knowledge/check.d.ts +182 -0
- package/dist/tools/knowledge/check.js +94 -0
- package/dist/tools/knowledge/client.d.ts +351 -0
- package/dist/tools/knowledge/client.js +319 -0
- package/dist/tools/knowledge/environment.d.ts +78 -0
- package/dist/tools/knowledge/environment.js +116 -0
- package/dist/tools/knowledge/index.d.ts +49 -0
- package/dist/tools/knowledge/index.js +70 -0
- package/dist/tools/knowledge/local-slots.d.ts +62 -0
- package/dist/tools/knowledge/local-slots.js +184 -0
- package/dist/tools/knowledge/pin.d.ts +14 -0
- package/dist/tools/knowledge/pin.js +17 -0
- package/dist/tools/knowledge/recommend.d.ts +67 -0
- package/dist/tools/knowledge/recommend.js +106 -0
- package/dist/tools/knowledge/situation.d.ts +143 -0
- package/dist/tools/knowledge/situation.js +157 -0
- package/dist/tools/knowledge/skeleton.d.ts +69 -0
- package/dist/tools/knowledge/skeleton.js +201 -0
- package/dist/tools/knowledge/template.d.ts +139 -0
- package/dist/tools/knowledge/template.js +273 -0
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +39 -16
- package/dist/tools/research/generate-plan.js +565 -338
- package/dist/tools/research/guarded-address.d.ts +20 -0
- package/dist/tools/research/guarded-address.js +149 -0
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +40 -0
- package/dist/tools/research/searxng-engine.js +122 -0
- package/dist/tools/research/web-fetch.d.ts +127 -0
- package/dist/tools/research/web-fetch.js +618 -0
- package/dist/tools/research/web-search.d.ts +84 -0
- package/dist/tools/research/web-search.js +117 -0
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
- package/dist/tools/sandbox/list-available-packages.js +43 -29
- package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
- package/dist/tools/sandbox/list-available-refs.js +119 -37
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +22 -68
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +14 -0
- package/dist/tools/terminal-text.js +51 -0
- package/dist/tools/workspace/decision-record.d.ts +81 -0
- package/dist/tools/workspace/decision-record.js +127 -0
- package/dist/tools/workspace/edit-file.d.ts +59 -18
- package/dist/tools/workspace/edit-file.js +98 -15
- package/dist/tools/workspace/execute-command.d.ts +31 -12
- package/dist/tools/workspace/execute-command.js +37 -8
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/index.d.ts +1 -0
- package/dist/tools/workspace/index.js +1 -0
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +100 -76
- package/dist/workflows/execute-analysis.js +380 -247
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +50 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +25 -22
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -236
- package/dist/loop/run-agent.js +0 -1110
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -90
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The situation fields as a flat tool input. Each `.describe()` is the whole
|
|
3
|
+
* of what the model knows about a field, thus the descriptions carry the
|
|
4
|
+
* definitions of the terms, and they tell the planner where in the Data
|
|
5
|
+
* Context each value comes from.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export const SituationFieldsSchema = z.object({
|
|
9
|
+
question: z
|
|
10
|
+
.enum([
|
|
11
|
+
"differential_expression",
|
|
12
|
+
"enrichment",
|
|
13
|
+
"qc",
|
|
14
|
+
"full_plan",
|
|
15
|
+
"tf_activity",
|
|
16
|
+
"deconvolution",
|
|
17
|
+
"coexpression",
|
|
18
|
+
"clustering",
|
|
19
|
+
"survival",
|
|
20
|
+
"signature_scoring",
|
|
21
|
+
])
|
|
22
|
+
.describe("What the plan needs a procedure for. `full_plan` returns QC, filtering, the model, the test, shrinkage, multiple testing, enrichment, and the report in one answer. " +
|
|
23
|
+
"Use `differential_expression` when the research question does not ask for pathways or gene sets; an enrichment step the user did not ask for is unasked scope. " +
|
|
24
|
+
"Use `enrichment` when a results table is the input and no new test is fitted, and `qc` when the question stops at the sample structure. " +
|
|
25
|
+
"Use `tf_activity` for regulator or pathway activity, `deconvolution` for cell type proportions, `coexpression` for modules, `clustering` for sample subgroups, `survival` for an outcome association, " +
|
|
26
|
+
"and `signature_scoring` for a per-sample score, or with `classifier: true` for a classifier of the samples."),
|
|
27
|
+
modality: z.literal("bulk_rna_seq").describe("The assay. Phase 0 serves bulk RNA-seq only."),
|
|
28
|
+
data_state: z
|
|
29
|
+
.enum(["fastq", "counts", "tpm_or_fpkm", "log_normalized"])
|
|
30
|
+
.describe("The state of the expression data in the inputs: raw reads, a raw integer count matrix, TPM/FPKM/RPKM abundances, or log-scale normalized values (log-CPM, microarray)."),
|
|
31
|
+
count_source: z
|
|
32
|
+
.enum(["salmon", "kallisto", "star_featurecounts", "rsem", "unknown"])
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("The quantifier that produced the counts, when the profile names one. The quantifier does not establish the length correction; `import_state` does."),
|
|
35
|
+
import_state: z
|
|
36
|
+
.enum(["quantifications", "estimated_counts_with_lengths", "corrected_counts", "integer_counts", "unknown"])
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("The import state of a count table from a transcript quantifier (Salmon, kallisto, RSEM): whether the length correction occurred. Read it from the profile. " +
|
|
39
|
+
"`quantifications`: per-sample quantification files (quant.sf or abundance.h5) or a quantification directory, plus a transcript-to-gene map. " +
|
|
40
|
+
"`estimated_counts_with_lengths`: a fractional gene-by-sample matrix plus a table of average transcript lengths per gene and sample. " +
|
|
41
|
+
"`corrected_counts`: a table described as lengthScaledTPM or scaledTPM counts. " +
|
|
42
|
+
"`integer_counts`: integer counts from an aligner and a counter (STAR, featureCounts) or from a 3' protocol, with no length data. " +
|
|
43
|
+
"`unknown`: a count table from a quantifier with no statement of the correction. Omit when `data_state` is not `counts`."),
|
|
44
|
+
organism: z.enum(["human", "mouse", "other"]).describe("The organism of the samples."),
|
|
45
|
+
n_groups: z
|
|
46
|
+
.number()
|
|
47
|
+
.int()
|
|
48
|
+
.min(1)
|
|
49
|
+
.describe("The number of levels of the condition of interest (2 for a two-group comparison; 4 for a 2x2 design; 1 when `continuous_predictor` names the variable of interest)."),
|
|
50
|
+
n_per_group_min: z
|
|
51
|
+
.number()
|
|
52
|
+
.int()
|
|
53
|
+
.min(1)
|
|
54
|
+
.describe("The smallest number of biological samples in any group, after technical replicates are summed. 1 means a group has no replication. In a time course, the smallest number in one group at one time point. With a nested block, the smallest number of blocks (for example animals) in one group. With a continuous predictor, the number of samples."),
|
|
55
|
+
n_per_group_max: z
|
|
56
|
+
.number()
|
|
57
|
+
.int()
|
|
58
|
+
.min(1)
|
|
59
|
+
.describe("The largest number of biological samples in any group. In a time course, the largest number in one group at one time point. With a nested block, the largest number of blocks in one group. With a continuous predictor, the number of samples."),
|
|
60
|
+
n_samples: z
|
|
61
|
+
.number()
|
|
62
|
+
.int()
|
|
63
|
+
.min(1)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("The total number of biological samples in the analysis, after technical replicates are summed. Give it whenever the profile states it: the per-group extrema do not give the total for three or more groups, and the rules on a small cohort read it."),
|
|
66
|
+
n_events: z
|
|
67
|
+
.number()
|
|
68
|
+
.int()
|
|
69
|
+
.min(0)
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("For a survival question, the number of samples with an observed event (event indicator 1) in the outcome column. Omit when the question is not survival or the count is not in the profile."),
|
|
72
|
+
paired: z.boolean().describe("True when each subject contributes a sample to more than one condition (paired or repeated measures)."),
|
|
73
|
+
blocking_factor: z
|
|
74
|
+
.enum(["individual", "cell_line", "litter", "site", "pair", "other"])
|
|
75
|
+
.nullable()
|
|
76
|
+
.optional()
|
|
77
|
+
.describe("The role of the blocking factor that is not the condition, never its column name: `individual` when the same subject, donor, or animal gives more than one sample; `cell_line`; `litter`; `site` for a center or a lab of a multi-site study; `pair` for matched pairs of different individuals; `other`. Omit when there is none. The column name stays in the step."),
|
|
78
|
+
block_structure: z
|
|
79
|
+
.enum(["crossed", "nested"])
|
|
80
|
+
.optional()
|
|
81
|
+
.describe("How the blocking factor relates to the condition: `crossed` when each block holds samples of more than one condition (a donor with a treated and a control sample); `nested` when each block lies inside one condition (several samples from one animal of one genotype), thus the block is the unit of replication. Omit when there is no blocking factor."),
|
|
82
|
+
batch: z
|
|
83
|
+
.enum(["none", "known_balanced", "known_confounded", "known_unbalanced", "suspected"])
|
|
84
|
+
.describe("The batch structure: none; a known batch whose levels each hold every condition; a known batch whose levels coincide with the conditions; a known batch whose levels do not each hold every condition but at least one level holds two conditions (estimable, unbalanced); or a suspected structure (dates, lanes, plates) the metadata does not name."),
|
|
85
|
+
covariates: z
|
|
86
|
+
.array(z.enum(["sex", "age", "clinical", "technical", "other"]))
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('The role of each other sample covariate the design must hold, one entry per covariate and never a column name, for example ["sex", "age"]: `clinical` for a stage, a grade, or a diagnosis; `technical` for a variable that is not the batch, for example the RNA integrity. Omit when there are none. The column names stay in the step.'),
|
|
89
|
+
n_timepoints: z.number().int().min(1).nullable().optional().describe("The number of time points when the design is a time course. Omit otherwise."),
|
|
90
|
+
continuous_predictor: z
|
|
91
|
+
.enum(["dose", "time", "age", "score", "other"])
|
|
92
|
+
.nullable()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("The role of the numeric variable of interest, never its column name, when the research question is a trend over that value and not a comparison of groups: `dose`, `time`, `age`, `score`, or `other`. Then set `n_groups` to 1 and the per-group counts to the number of samples. Omit when the variable of interest is a factor. The column name stays in the step."),
|
|
95
|
+
technical_replicates: z
|
|
96
|
+
.boolean()
|
|
97
|
+
.optional()
|
|
98
|
+
.describe("Set true when some columns of the count table are technical replicates of one biological sample, for example one library sequenced on two lanes or two runs. Omit when each column is one biological sample."),
|
|
99
|
+
sample_exclusions: z
|
|
100
|
+
.boolean()
|
|
101
|
+
.optional()
|
|
102
|
+
.describe("Set true when the plan drops some delivered samples before the analysis, for example an on-treatment biopsy in a pre-treatment cohort or a failed library. The service then adds a cohort assembly step that counts the units per group after the drop, so the plan states no count before that step. Omit when every delivered sample enters the analysis."),
|
|
103
|
+
feature_level: z
|
|
104
|
+
.enum(["gene", "exon", "transcript"])
|
|
105
|
+
.optional()
|
|
106
|
+
.describe("The row unit of the count table: `gene` for one row per gene; `exon` for one row per exon or counting bin with the gene of each row, as featureCounts at the feature level writes it; `transcript` for one row per transcript, as tximport writes with txOut or a quantifier table delivers. Omit for a gene-level table or when `data_state` is not counts."),
|
|
107
|
+
library_type: z.enum(["polyA", "total", "three_prime", "unknown"]).optional().describe("The library preparation, when known."),
|
|
108
|
+
strandedness: z
|
|
109
|
+
.enum(["verified", "declared_unverified", "unknown"])
|
|
110
|
+
.optional()
|
|
111
|
+
.describe("Whether the strandedness was verified against the quantification, declared but not verified, or unknown."),
|
|
112
|
+
interaction: z.boolean().optional().describe("True when the question is the interaction of two factors (for example genotype by treatment)."),
|
|
113
|
+
classifier: z
|
|
114
|
+
.boolean()
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("Set true when the question is a classifier of the samples into classes (a model that predicts the class of a sample from its expression, with cross-validation). Omit for a per-sample score."),
|
|
117
|
+
extra_analyses: z
|
|
118
|
+
.array(z.enum([
|
|
119
|
+
"variance_partition",
|
|
120
|
+
"tf_activity",
|
|
121
|
+
"pathway_activity",
|
|
122
|
+
"signature_scoring",
|
|
123
|
+
"deconvolution",
|
|
124
|
+
"coexpression",
|
|
125
|
+
"clustering",
|
|
126
|
+
"survival",
|
|
127
|
+
"transcript_level",
|
|
128
|
+
"annotation",
|
|
129
|
+
]))
|
|
130
|
+
.optional()
|
|
131
|
+
.describe("Analyses the research question asks for beside the question kind, for example a regulator activity beside a differential expression. Each joins the procedure at its place. " +
|
|
132
|
+
"Add `annotation` when the rows of the count table are not gene symbols (Ensembl or Entrez identifiers) and a later step needs symbols: the identifier map is then a vetted step with its own template, and no other step rebuilds it. Omit when none."),
|
|
133
|
+
preferred_language: z
|
|
134
|
+
.enum(["R", "python"])
|
|
135
|
+
.optional()
|
|
136
|
+
.describe("The script language the user asked for, when the user constraints name one. The answer then names the template in that language when the method has one. Omit otherwise."),
|
|
137
|
+
enrichment_input: z
|
|
138
|
+
.enum(["ranked_list", "gene_list", "sample_scores"])
|
|
139
|
+
.optional()
|
|
140
|
+
.describe("What the enrichment step takes: `ranked_list` for every tested gene ranked by a statistic (the default), `gene_list` for a discrete list such as the significant genes, `sample_scores` for a pathway score per sample. Omit when the question has no enrichment."),
|
|
141
|
+
quality_flags: z
|
|
142
|
+
.array(z.enum(["low_depth_sample", "outlier_sample", "sample_identity_doubt", "high_duplication", "degraded_rna"]))
|
|
143
|
+
.optional()
|
|
144
|
+
.describe("The quality concerns of the profile as typed flags: a sample with a library size far below the median; a sample that does not cluster with its group; a doubt about the identity of a sample; high duplication; degraded RNA (a low RNA integrity number, a 3' coverage bias, or formalin-fixed material)."),
|
|
145
|
+
});
|
|
146
|
+
/** The situation as the client sends it: the fields as given, with the caller preference held out of the situation fields. */
|
|
147
|
+
export function toSituation(fields) {
|
|
148
|
+
const { preferred_language: _omitted, ...situation } = fields;
|
|
149
|
+
return situation;
|
|
150
|
+
}
|
|
151
|
+
/** The preferences of the caller, beside the situation: the language of the template. */
|
|
152
|
+
export function toPreferences(fields) {
|
|
153
|
+
return fields.preferred_language ? { language: fields.preferred_language } : undefined;
|
|
154
|
+
}
|
|
155
|
+
/** One worked example, in the descriptions of the two planner tools. Examples raise complex-parameter accuracy. */
|
|
156
|
+
export const SITUATION_EXAMPLE = '{"question":"differential_expression","modality":"bulk_rna_seq","data_state":"counts","count_source":"salmon","import_state":"unknown","organism":"human",' +
|
|
157
|
+
'"n_groups":2,"n_per_group_min":6,"n_per_group_max":6,"paired":false,"batch":"none","quality_flags":["low_depth_sample"]}';
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plan skeleton: the procedure of the service folded into the steps of a
|
|
3
|
+
* plan, with the agent, the packages, the dependencies, the caveats, the
|
|
4
|
+
* alternatives, the disputed sides, the forbidden methods, the environment,
|
|
5
|
+
* and the grounding of each step filled from the answer. It is
|
|
6
|
+
* the one representation the planner receives: the procedure itself never
|
|
7
|
+
* reaches the model, thus nothing the procedure holds may be lost here. A
|
|
8
|
+
* small model edits a skeleton where it fails to compose a plan from a
|
|
9
|
+
* procedure; a frontier model pays nothing for it. The skeleton carries only
|
|
10
|
+
* the fields the answer can fill. The question, the acceptance criteria, the
|
|
11
|
+
* resources, and the step budget come from the data profile, and the planner
|
|
12
|
+
* adds them.
|
|
13
|
+
*
|
|
14
|
+
* The fold is fixed: one cohort assembly step when the procedure holds one
|
|
15
|
+
* (the sample exclusions and the sum of technical replicates, before any
|
|
16
|
+
* other step reads the counts), one QC step, one differential expression
|
|
17
|
+
* step that holds the filter, the normalization, the design, the test, the
|
|
18
|
+
* shrinkage, and the multiple testing (the templates cover the same span),
|
|
19
|
+
* one enrichment step on its own track, and one report step. A group with
|
|
20
|
+
* no step in the procedure is absent from the skeleton.
|
|
21
|
+
*
|
|
22
|
+
* The central step of a group names the method of the skeleton step, and it
|
|
23
|
+
* gives the alternatives, the template, and the environment: an alternative
|
|
24
|
+
* of a folded step (a normalization in the differential expression group)
|
|
25
|
+
* is not a permitted replacement of the step method, and it stays out. The
|
|
26
|
+
* settings, the caveats, and the forbidden methods come from every step of
|
|
27
|
+
* the group, each setting with the step it belongs to. A parameter is a
|
|
28
|
+
* setting of the grounding, never a constraint of the step: the value is the
|
|
29
|
+
* vetted default, and the agent can state another value with its reason.
|
|
30
|
+
*/
|
|
31
|
+
import type { GroundingSetting } from "../../schemas/workflow-state.js";
|
|
32
|
+
import type { RecommendWithEnvironment, StepEnvironment } from "./environment.js";
|
|
33
|
+
export type SkeletonAlternative = {
|
|
34
|
+
readonly method: string;
|
|
35
|
+
readonly label: string;
|
|
36
|
+
readonly when: string;
|
|
37
|
+
readonly rules: readonly string[];
|
|
38
|
+
};
|
|
39
|
+
export type SkeletonStep = {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly track: string;
|
|
43
|
+
readonly step_type: string;
|
|
44
|
+
readonly agent: string;
|
|
45
|
+
readonly packages: readonly string[];
|
|
46
|
+
readonly depends_on: readonly string[];
|
|
47
|
+
readonly caveats: readonly string[];
|
|
48
|
+
/** The other permitted methods of the step, from the central procedure step. */
|
|
49
|
+
readonly alternatives: readonly SkeletonAlternative[];
|
|
50
|
+
/** A disputed rule of the group with its sides. The planner chooses one side and states the choice. */
|
|
51
|
+
readonly disputed?: {
|
|
52
|
+
readonly rule: string;
|
|
53
|
+
readonly sides: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
/** The method ids the rules forbid in the steps of the group. */
|
|
56
|
+
readonly forbids: readonly string[];
|
|
57
|
+
/** The environment of the central step, when the host bound the stores: the package in the farm and the collection in the reference store. */
|
|
58
|
+
readonly environment?: StepEnvironment;
|
|
59
|
+
readonly grounding: {
|
|
60
|
+
readonly status: "grounded" | "ungrounded" | "flagged";
|
|
61
|
+
readonly snapshot: string;
|
|
62
|
+
readonly claims: readonly string[];
|
|
63
|
+
readonly template?: string;
|
|
64
|
+
/** One entry per parameter of the procedure steps of the group, with the step it belongs to. */
|
|
65
|
+
readonly settings: readonly GroundingSetting[];
|
|
66
|
+
readonly reason: string;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
export declare function buildPlanSkeleton(answer: RecommendWithEnvironment): SkeletonStep[];
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plan skeleton: the procedure of the service folded into the steps of a
|
|
3
|
+
* plan, with the agent, the packages, the dependencies, the caveats, the
|
|
4
|
+
* alternatives, the disputed sides, the forbidden methods, the environment,
|
|
5
|
+
* and the grounding of each step filled from the answer. It is
|
|
6
|
+
* the one representation the planner receives: the procedure itself never
|
|
7
|
+
* reaches the model, thus nothing the procedure holds may be lost here. A
|
|
8
|
+
* small model edits a skeleton where it fails to compose a plan from a
|
|
9
|
+
* procedure; a frontier model pays nothing for it. The skeleton carries only
|
|
10
|
+
* the fields the answer can fill. The question, the acceptance criteria, the
|
|
11
|
+
* resources, and the step budget come from the data profile, and the planner
|
|
12
|
+
* adds them.
|
|
13
|
+
*
|
|
14
|
+
* The fold is fixed: one cohort assembly step when the procedure holds one
|
|
15
|
+
* (the sample exclusions and the sum of technical replicates, before any
|
|
16
|
+
* other step reads the counts), one QC step, one differential expression
|
|
17
|
+
* step that holds the filter, the normalization, the design, the test, the
|
|
18
|
+
* shrinkage, and the multiple testing (the templates cover the same span),
|
|
19
|
+
* one enrichment step on its own track, and one report step. A group with
|
|
20
|
+
* no step in the procedure is absent from the skeleton.
|
|
21
|
+
*
|
|
22
|
+
* The central step of a group names the method of the skeleton step, and it
|
|
23
|
+
* gives the alternatives, the template, and the environment: an alternative
|
|
24
|
+
* of a folded step (a normalization in the differential expression group)
|
|
25
|
+
* is not a permitted replacement of the step method, and it stays out. The
|
|
26
|
+
* settings, the caveats, and the forbidden methods come from every step of
|
|
27
|
+
* the group, each setting with the step it belongs to. A parameter is a
|
|
28
|
+
* setting of the grounding, never a constraint of the step: the value is the
|
|
29
|
+
* vetted default, and the agent can state another value with its reason.
|
|
30
|
+
*/
|
|
31
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
32
|
+
const GROUPS = [
|
|
33
|
+
{ id: "T0S1", track: "T1", step_type: "data_preparation", agent: "bulk-transcriptomics-agent", steps: ["cohort_assembly"], name: "Cohort assembly" },
|
|
34
|
+
{ id: "T1S1", track: "T1", step_type: "qc", agent: "bulk-transcriptomics-agent", steps: ["qc_sample_structure"], name: "Sample structure QC" },
|
|
35
|
+
{
|
|
36
|
+
id: "T1S2",
|
|
37
|
+
track: "T1",
|
|
38
|
+
step_type: "analysis",
|
|
39
|
+
agent: "bulk-transcriptomics-agent",
|
|
40
|
+
steps: ["filter_low_counts", "normalize", "model_design", "differential_expression", "shrink_lfc", "multiple_testing"],
|
|
41
|
+
name: "Differential expression",
|
|
42
|
+
},
|
|
43
|
+
{ id: "T2S1", track: "T2", step_type: "enrichment", agent: "enrichment-agent", steps: ["enrichment"], name: "Gene set enrichment" },
|
|
44
|
+
{
|
|
45
|
+
id: "T2S2",
|
|
46
|
+
track: "T2",
|
|
47
|
+
step_type: "activity",
|
|
48
|
+
agent: "enrichment-agent",
|
|
49
|
+
steps: ["tf_activity", "pathway_activity"],
|
|
50
|
+
name: "Regulator and pathway activity",
|
|
51
|
+
},
|
|
52
|
+
{ id: "T1S4", track: "T1", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["variance_partition"], name: "Variance partition" },
|
|
53
|
+
{ id: "T3S1", track: "T3", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["signature_scoring"], name: "Signature scoring" },
|
|
54
|
+
{ id: "T3S2", track: "T3", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["deconvolution"], name: "Cell type deconvolution" },
|
|
55
|
+
{ id: "T3S3", track: "T3", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["coexpression"], name: "Co-expression modules" },
|
|
56
|
+
{ id: "T3S4", track: "T3", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["clustering"], name: "Sample clustering" },
|
|
57
|
+
{ id: "T3S5", track: "T3", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["survival"], name: "Outcome association" },
|
|
58
|
+
{ id: "T1S5", track: "T1", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["transcript_level"], name: "Transcript-level analysis" },
|
|
59
|
+
{ id: "T1S6", track: "T1", step_type: "analysis", agent: "bulk-transcriptomics-agent", steps: ["annotation"], name: "Identifier annotation" },
|
|
60
|
+
{ id: "T1S3", track: "T1", step_type: "report", agent: "bulk-transcriptomics-agent", steps: ["report"], name: "Report" },
|
|
61
|
+
];
|
|
62
|
+
/**
|
|
63
|
+
* The dependencies of each group. The QC depends on the cohort assembly when
|
|
64
|
+
* one is present, a group depends on the QC, on the differential expression
|
|
65
|
+
* when its input is a results table, and the report depends on every group
|
|
66
|
+
* that is present.
|
|
67
|
+
*/
|
|
68
|
+
const DEPENDS = {
|
|
69
|
+
T0S1: [],
|
|
70
|
+
T1S1: ["T0S1"],
|
|
71
|
+
T1S2: ["T1S1"],
|
|
72
|
+
T2S1: ["T1S2"],
|
|
73
|
+
T2S2: ["T1S2", "T1S1"],
|
|
74
|
+
T1S4: ["T1S1"],
|
|
75
|
+
T3S1: ["T1S1"],
|
|
76
|
+
T3S2: ["T1S1"],
|
|
77
|
+
T3S3: ["T1S1"],
|
|
78
|
+
T3S4: ["T1S1"],
|
|
79
|
+
T3S5: ["T3S1", "T1S1"],
|
|
80
|
+
T1S5: ["T1S1"],
|
|
81
|
+
T1S6: ["T1S1"],
|
|
82
|
+
T1S3: ["T1S2", "T2S1", "T2S2", "T1S4", "T3S1", "T3S2", "T3S3", "T3S4", "T3S5", "T1S5", "T1S6"],
|
|
83
|
+
};
|
|
84
|
+
/** A parameter value as a setting: a scalar stays, a list becomes a list of strings, anything else its text. */
|
|
85
|
+
function settingValue(value) {
|
|
86
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
87
|
+
return value;
|
|
88
|
+
if (Array.isArray(value))
|
|
89
|
+
return value.map(String);
|
|
90
|
+
return textOf(value);
|
|
91
|
+
}
|
|
92
|
+
/** The settings of the steps of a group: one entry per parameter, with the step it belongs to. */
|
|
93
|
+
function stepSettings(steps) {
|
|
94
|
+
return steps.flatMap((step) => (step.parameters ?? []).map((parameter) => ({
|
|
95
|
+
step: step.step,
|
|
96
|
+
name: parameter.name,
|
|
97
|
+
value: settingValue(parameter.value),
|
|
98
|
+
source: parameter.default_source,
|
|
99
|
+
})));
|
|
100
|
+
}
|
|
101
|
+
/** The forbidden method ids of a step. The client schema reads the field through the loose object. */
|
|
102
|
+
function forbidsOf(step) {
|
|
103
|
+
const forbids = step.forbids;
|
|
104
|
+
return Array.isArray(forbids) ? forbids.flatMap((method) => (typeof method === "string" ? [method] : [])) : [];
|
|
105
|
+
}
|
|
106
|
+
/** `a and b`, or `a, b and c` for a longer list. */
|
|
107
|
+
function joinWithAnd(items) {
|
|
108
|
+
if (items.length <= 1)
|
|
109
|
+
return items.join("");
|
|
110
|
+
return `${items.slice(0, -1).join(", ")} and ${String(items[items.length - 1])}`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The caveats a step carries beside its warn flags. A parameter conflict, a
|
|
114
|
+
* substitution, and a language limit each render as a caveat, never as a
|
|
115
|
+
* setting: a setting is a value, and none of the three is a value.
|
|
116
|
+
*/
|
|
117
|
+
function stepCaveats(step) {
|
|
118
|
+
const caveats = [];
|
|
119
|
+
for (const conflict of step.conflicts ?? []) {
|
|
120
|
+
caveats.push(`${step.step}: ${conflict.parameter} conflicts between ${joinWithAnd(conflict.entries.map((entry) => entry.rule))}`);
|
|
121
|
+
}
|
|
122
|
+
if (step.substitution && step.method) {
|
|
123
|
+
caveats.push(`${step.method.label} stands in for ${step.substitution.label}`);
|
|
124
|
+
}
|
|
125
|
+
if (step.limit) {
|
|
126
|
+
// Only two languages exist, thus the named template is in the other one. A slot that refuses a value of the
|
|
127
|
+
// rules is not a fact of the design, thus with a refusal the caveat names the cause of each skipped template.
|
|
128
|
+
const named = step.limit.requested_language === "python" ? "R" : "Python";
|
|
129
|
+
const refused = step.limit.skipped.some((entry) => entry.refused !== undefined);
|
|
130
|
+
const causes = step.limit.skipped.map((entry) => entry.refused !== undefined ? `${entry.template}: ${entry.refused}` : `${entry.template} does not honor ${entry.missing.join(", ")}`);
|
|
131
|
+
const cause = refused ? `because ${causes.join("; ")}` : "for this design";
|
|
132
|
+
caveats.push(`the requested language has no template that realizes ${step.method?.label ?? step.step} ${cause}; the ${named} template is named`);
|
|
133
|
+
}
|
|
134
|
+
if (step.unrealized) {
|
|
135
|
+
// The knowledge covers the step and no vetted script does: the plan says so, and it invents no template.
|
|
136
|
+
const why = step.unrealized.templates.map((entry) => `${entry.template}: ${entry.why}`).join("; ");
|
|
137
|
+
caveats.push(`no vetted template realizes ${step.method?.label ?? step.step} for this design (${why || "the method lists no template for the step"}); the step runs without a template of the service`);
|
|
138
|
+
}
|
|
139
|
+
return caveats;
|
|
140
|
+
}
|
|
141
|
+
/** The present dependencies of a group; a group whose own dependency is absent falls back to the QC, and the two first groups to nothing. */
|
|
142
|
+
function dependsOn(id, kept) {
|
|
143
|
+
const present = (DEPENDS[id] ?? []).filter((dependency) => kept.has(dependency));
|
|
144
|
+
if (present.length > 0)
|
|
145
|
+
return [...new Set(present)];
|
|
146
|
+
return id !== "T0S1" && id !== "T1S1" && kept.has("T1S1") ? ["T1S1"] : [];
|
|
147
|
+
}
|
|
148
|
+
export function buildPlanSkeleton(answer) {
|
|
149
|
+
const byStep = new Map(answer.procedure.map((step) => [step.step, step]));
|
|
150
|
+
const present = new Set(answer.procedure.map((step) => step.step));
|
|
151
|
+
const kept = GROUPS.filter((group) => group.steps.some((step) => present.has(step)));
|
|
152
|
+
const keptIds = new Set(kept.map((group) => group.id));
|
|
153
|
+
return kept.map((group) => {
|
|
154
|
+
const steps = group.steps.map((step) => byStep.get(step)).filter((step) => step !== undefined);
|
|
155
|
+
const central = steps.find((step) => step.step === "differential_expression") ?? steps.find((step) => step.method !== undefined) ?? steps[0];
|
|
156
|
+
const flags = steps.flatMap((step) => step.flags ?? []);
|
|
157
|
+
const hardFlag = flags.find((flag) => flag.severity === "flag");
|
|
158
|
+
const claims = [...new Set(steps.flatMap((step) => step.rules))];
|
|
159
|
+
const packages = [...new Set(steps.map((step) => step.package?.name).flatMap((name) => (name !== undefined ? [name] : [])))];
|
|
160
|
+
const caveats = [...flags.filter((flag) => flag.severity === "warn").map((flag) => flag.message), ...steps.flatMap(stepCaveats)];
|
|
161
|
+
const method = central?.method;
|
|
162
|
+
// A rule covers the group when a step of the group carries one. A method
|
|
163
|
+
// is not necessary: the report step carries the reporting rules and no
|
|
164
|
+
// method, and it is grounded by those rules.
|
|
165
|
+
const covered = method !== undefined || claims.length > 0;
|
|
166
|
+
const status = hardFlag ? "flagged" : covered ? "grounded" : "ungrounded";
|
|
167
|
+
const name = method && group.id !== "T1S1" && group.id !== "T1S3" ? method.label : group.name;
|
|
168
|
+
const alternatives = (central?.alternatives ?? []).map(({ method: id, label, when, rules }) => ({ method: id, label, when, rules }));
|
|
169
|
+
// One dispute per skeleton step: the central step first, else the first folded step that carries one.
|
|
170
|
+
const disputed = central?.disputed ?? steps.find((step) => step.disputed !== undefined)?.disputed;
|
|
171
|
+
const forbids = [...new Set(steps.flatMap(forbidsOf))];
|
|
172
|
+
return {
|
|
173
|
+
id: group.id,
|
|
174
|
+
name,
|
|
175
|
+
track: group.track,
|
|
176
|
+
step_type: group.step_type,
|
|
177
|
+
agent: group.agent,
|
|
178
|
+
packages,
|
|
179
|
+
depends_on: dependsOn(group.id, keptIds),
|
|
180
|
+
caveats: hardFlag ? [hardFlag.message, ...caveats] : caveats,
|
|
181
|
+
alternatives,
|
|
182
|
+
disputed: disputed === undefined ? undefined : { rule: disputed.rule, sides: disputed.sides },
|
|
183
|
+
forbids,
|
|
184
|
+
environment: central?.environment,
|
|
185
|
+
grounding: {
|
|
186
|
+
status,
|
|
187
|
+
snapshot: answer.snapshot.digest,
|
|
188
|
+
claims,
|
|
189
|
+
template: central?.template,
|
|
190
|
+
settings: stepSettings(steps),
|
|
191
|
+
reason: hardFlag
|
|
192
|
+
? `flagged by ${hardFlag.rule}`
|
|
193
|
+
: method
|
|
194
|
+
? `${method.label} per ${claims[0] ?? "the procedure"}`
|
|
195
|
+
: covered
|
|
196
|
+
? `${group.name} per ${String(claims[0])}`
|
|
197
|
+
: "no rule covers this step",
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `knowledge_template` — the model emits slot values, and the tool writes the
|
|
3
|
+
* rendered script and the decision record into the step workspace through
|
|
4
|
+
* the same `WorkspaceMutator` as `write_file`. The script is never output tokens.
|
|
5
|
+
*
|
|
6
|
+
* The installed versions ride from the tool, not from the model: the tool
|
|
7
|
+
* reads the `inflexa.lock` of the farm and the `image-packages.json` of the
|
|
8
|
+
* store when the host names them (`installedPackages`), and the service
|
|
9
|
+
* answers with the environment match, which the decision record keeps.
|
|
10
|
+
*
|
|
11
|
+
* The plan settings ride from the host, not from the model: the step input
|
|
12
|
+
* carries a `TemplateBinding` when the plan step grounds on a template, and
|
|
13
|
+
* the tool merges the bound slots under the model values. A model value that
|
|
14
|
+
* differs from a bound value is refused before the service call unless an
|
|
15
|
+
* `overrides` entry names the slot with a reason, and the decision record
|
|
16
|
+
* keeps the bound slots and the overrides beside the script path.
|
|
17
|
+
*
|
|
18
|
+
* The facts of the machine never ride at all: a local slot of the template
|
|
19
|
+
* (a path, a column name, a level label, a design formula) is split off the
|
|
20
|
+
* request, the service renders it as its marker, and the tool binds the
|
|
21
|
+
* value on the machine before it writes the file. The request carries the
|
|
22
|
+
* step, its claims, and the release digest the plan pinned, thus the record
|
|
23
|
+
* binds the cited decision to the bytes, and a service on another release
|
|
24
|
+
* refuses the render instead of moving the plan in silence. The call runs as
|
|
25
|
+
* one durable step, thus a replay returns the cached result and renders
|
|
26
|
+
* nothing again.
|
|
27
|
+
*/
|
|
28
|
+
import { z } from "zod";
|
|
29
|
+
import type { EnvironmentStorePaths } from "../../config/environment-stores.js";
|
|
30
|
+
import { type Tool, type WithToolCallRecord } from "../define-tool.js";
|
|
31
|
+
import type { WorkspaceMutator, WriteFileResult, WriteRecord } from "../workspace/mutator.js";
|
|
32
|
+
import type { KnowledgeClient, KnowledgeRejected, KnowledgeSnapshotMismatch, KnowledgeUnavailable, TemplateParameter } from "./client.js";
|
|
33
|
+
/** A slot value the plan binds: a scalar, or a list of strings. JSON-serialisable, as the durable step input needs. */
|
|
34
|
+
export type TemplateBindingValue = string | number | boolean | readonly string[];
|
|
35
|
+
/**
|
|
36
|
+
* The plan settings bound to the template of one step, composed by the host
|
|
37
|
+
* at dispatch and carried on the durable step input. `slots` holds the bound
|
|
38
|
+
* value per slot name, and `sources` the source of each value (a doi, a
|
|
39
|
+
* document, or the plan) under the same name. The rest binds the render to
|
|
40
|
+
* the plan step: its id, its claims, the release the plan pinned, and the
|
|
41
|
+
* local slots of the contract that the tool binds on the machine.
|
|
42
|
+
*/
|
|
43
|
+
export type TemplateBinding = {
|
|
44
|
+
/** The template reference of the plan step, with its version, for example `tpl-deseq2-two-group@1.0.0`. */
|
|
45
|
+
readonly template: string;
|
|
46
|
+
readonly slots: Readonly<Record<string, TemplateBindingValue>>;
|
|
47
|
+
readonly sources: Readonly<Record<string, string>>;
|
|
48
|
+
/** The id of the plan step. */
|
|
49
|
+
readonly step?: string;
|
|
50
|
+
/** The claims of the plan step, as `knowledge_recommend` returned them. */
|
|
51
|
+
readonly claims?: readonly string[];
|
|
52
|
+
/** The release digest the plan pinned. Absent when the step is ungrounded. */
|
|
53
|
+
readonly snapshot?: string;
|
|
54
|
+
/** The local slots of the served contract. Absent on a binding made before the contract carried the flag. */
|
|
55
|
+
readonly local?: readonly TemplateParameter[];
|
|
56
|
+
/** The names of every adaptable slot of the served contract, thus the tool refuses an unknown name before anything leaves the machine. */
|
|
57
|
+
readonly adaptable?: readonly string[];
|
|
58
|
+
};
|
|
59
|
+
export type KnowledgeTemplateDeps = {
|
|
60
|
+
readonly client: KnowledgeClient;
|
|
61
|
+
readonly mutator: WorkspaceMutator;
|
|
62
|
+
/** Host path of the farm `inflexa.lock`, or its resolver for each analysis. Absent with no image record, the environment match reads as unknown. */
|
|
63
|
+
readonly farmLockFile?: EnvironmentStorePaths["farmLockFile"];
|
|
64
|
+
/** Host path of the `image-packages.json` of the store: the packages the sandbox image ships, among them the R packages of the R runtime. */
|
|
65
|
+
readonly imagePackagesFile?: string;
|
|
66
|
+
/** The plan settings bound to the template of the step. Absent, the model values ride alone. */
|
|
67
|
+
readonly binding?: TemplateBinding;
|
|
68
|
+
};
|
|
69
|
+
/** One bound slot as the decision record keeps it. */
|
|
70
|
+
export type BoundSlotRecord = {
|
|
71
|
+
readonly slot: string;
|
|
72
|
+
readonly value: TemplateBindingValue;
|
|
73
|
+
readonly source: string;
|
|
74
|
+
};
|
|
75
|
+
/** One change of a bound value that an `overrides` entry declared, as the decision record keeps it. */
|
|
76
|
+
export type SettingsOverrideRecord = {
|
|
77
|
+
readonly slot: string;
|
|
78
|
+
readonly plan_value: TemplateBindingValue;
|
|
79
|
+
readonly new_value: unknown;
|
|
80
|
+
readonly reason: string;
|
|
81
|
+
};
|
|
82
|
+
export type KnowledgeTemplateOutput = {
|
|
83
|
+
readonly status: "ok";
|
|
84
|
+
readonly script_path: string;
|
|
85
|
+
readonly decision_record_path: string;
|
|
86
|
+
readonly template: {
|
|
87
|
+
readonly id: string;
|
|
88
|
+
readonly version: string;
|
|
89
|
+
readonly label: string;
|
|
90
|
+
readonly method: {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly label: string;
|
|
93
|
+
};
|
|
94
|
+
readonly substitute_for?: {
|
|
95
|
+
readonly id: string;
|
|
96
|
+
readonly label: string;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
readonly snapshot: {
|
|
100
|
+
readonly date: string;
|
|
101
|
+
readonly digest: string;
|
|
102
|
+
};
|
|
103
|
+
readonly slots: readonly {
|
|
104
|
+
readonly name: string;
|
|
105
|
+
readonly value?: unknown;
|
|
106
|
+
readonly source: string;
|
|
107
|
+
readonly adaptable: boolean;
|
|
108
|
+
readonly lines: readonly number[];
|
|
109
|
+
}[];
|
|
110
|
+
/** The local slots the tool bound on this machine. */
|
|
111
|
+
readonly local_slots: readonly string[];
|
|
112
|
+
/** The digest of the script as written. */
|
|
113
|
+
readonly written_sha256: string;
|
|
114
|
+
readonly environment_match: string;
|
|
115
|
+
readonly syntax: string;
|
|
116
|
+
readonly expected_outputs: readonly {
|
|
117
|
+
readonly name: string;
|
|
118
|
+
readonly path: string;
|
|
119
|
+
readonly description?: string;
|
|
120
|
+
}[];
|
|
121
|
+
readonly run_with: string;
|
|
122
|
+
} | {
|
|
123
|
+
readonly status: "write_refused";
|
|
124
|
+
readonly path: string;
|
|
125
|
+
readonly reason: Exclude<WriteFileResult["status"], "ok">;
|
|
126
|
+
} | KnowledgeUnavailable | KnowledgeRejected | KnowledgeSnapshotMismatch;
|
|
127
|
+
/** The result of a `knowledge_template` call: each landed write rides as the call record, for the fold. */
|
|
128
|
+
type KnowledgeTemplateResult = KnowledgeTemplateOutput | WithToolCallRecord<KnowledgeTemplateOutput, readonly WriteRecord[]>;
|
|
129
|
+
declare const KnowledgeTemplateInputSchema: z.ZodObject<{
|
|
130
|
+
template: z.ZodString;
|
|
131
|
+
slots: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString>]>>;
|
|
132
|
+
overrides: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
133
|
+
slot: z.ZodString;
|
|
134
|
+
reason: z.ZodString;
|
|
135
|
+
}, z.core.$strip>>>;
|
|
136
|
+
script_name: z.ZodOptional<z.ZodString>;
|
|
137
|
+
}, z.core.$strip>;
|
|
138
|
+
export declare function createKnowledgeTemplateTool(deps: KnowledgeTemplateDeps): Tool<z.infer<typeof KnowledgeTemplateInputSchema>, KnowledgeTemplateResult>;
|
|
139
|
+
export {};
|