@inflexa-ai/harness 0.45.1 → 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 +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 +307 -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 +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 +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 +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 +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/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 +60 -0
- package/dist/testing.js +96 -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
|
@@ -26,12 +26,16 @@
|
|
|
26
26
|
* nothing again.
|
|
27
27
|
*/
|
|
28
28
|
import { ok } from "neverthrow";
|
|
29
|
+
import { presentGet } from "../../lib/present.js";
|
|
29
30
|
import { z } from "zod";
|
|
30
31
|
import { defineTool, withToolCallRecord } from "../define-tool.js";
|
|
31
32
|
import { decisionRecordPath, scriptSha256 } from "../workspace/decision-record.js";
|
|
32
33
|
import { installedPackages } from "./environment.js";
|
|
33
34
|
import { bindLocalSlots, localParameters, validateLocalSlot } from "./local-slots.js";
|
|
35
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the template reference grammar: the tpl- prefix, an id, and an optional @version tail.
|
|
34
36
|
const TEMPLATE_REF = /^tpl-[a-z0-9-]+(@\d+\.\d+\.\d+)?$/;
|
|
37
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- a script file name is one segment of the safe file-name charset; the shape is the path-safety rule.
|
|
38
|
+
const SCRIPT_NAME_RE = /^[A-Za-z0-9_.-]+$/;
|
|
35
39
|
/** A model value equals a bound value when the scalars are identical, or when two lists hold the same strings in order. */
|
|
36
40
|
function sameValue(bound, value) {
|
|
37
41
|
if (Array.isArray(bound)) {
|
|
@@ -83,6 +87,27 @@ function splitSlots(slots, names) {
|
|
|
83
87
|
(names.has(name) ? local : remote)[name] = value;
|
|
84
88
|
return { local, remote };
|
|
85
89
|
}
|
|
90
|
+
const KnowledgeTemplateInputSchema = z.object({
|
|
91
|
+
template: z
|
|
92
|
+
.string()
|
|
93
|
+
.regex(TEMPLATE_REF, "a template id, optionally with @version")
|
|
94
|
+
.describe("The template id from the Grounding of the step, with its version, for example `tpl-deseq2-two-group@1.0.0`."),
|
|
95
|
+
slots: z
|
|
96
|
+
.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]))
|
|
97
|
+
.describe("The slot values, by slot name. Only the adaptable slots of the template; a pinned slot is refused. Strings, numbers, booleans, and lists of strings."),
|
|
98
|
+
overrides: z
|
|
99
|
+
.array(z.object({
|
|
100
|
+
slot: z.string().min(1).describe("The name of the bound slot whose value you change."),
|
|
101
|
+
reason: z.string().min(1).describe("Why the plan value does not hold for this step, in one sentence."),
|
|
102
|
+
}))
|
|
103
|
+
.optional()
|
|
104
|
+
.describe("One entry per bound slot whose value you change from the plan value. Absent when you send every bound value as it is."),
|
|
105
|
+
script_name: z
|
|
106
|
+
.string()
|
|
107
|
+
.regex(SCRIPT_NAME_RE)
|
|
108
|
+
.optional()
|
|
109
|
+
.describe("The file name under `scripts/`. Defaults to `<template id>.R` or `<template id>.py` by the language of the template."),
|
|
110
|
+
});
|
|
86
111
|
export function createKnowledgeTemplateTool(deps) {
|
|
87
112
|
return defineTool({
|
|
88
113
|
id: "knowledge_template",
|
|
@@ -94,30 +119,11 @@ export function createKnowledgeTemplateTool(deps) {
|
|
|
94
119
|
"A bound value rides into the script as it is; send it unchanged, or omit it. To change a bound value, send the new value and add an `overrides` entry with the slot and the reason. A changed value without an override is refused before the service call. " +
|
|
95
120
|
"Prefer the template over a script of your own: it is tested, and it carries the settings of the plan. When the template does not fit the step (a design it does not cover, or an input it cannot read), write the script yourself with `write_file`, and state the reason in your summary. " +
|
|
96
121
|
"The tool writes `scripts/<template>.R` or `scripts/<template>.py` and `output/decision_record_<script>.json`, one record per rendered script (the step, its claims, the template, the snapshot, each slot with its source, the bound slots, the overrides, the environment match, the citations, and the digest of the script as written), then you run the script with `execute_command` using the command in `run_with`. " +
|
|
97
|
-
"A slot value the template refuses comes back as `match: rejected` with the slot and the permitted values; correct it and call again. " +
|
|
122
|
+
"A slot value of the right type that the template refuses comes back as `match: rejected` with the slot and the permitted values; correct it and call again. " +
|
|
123
|
+
"A slot value of a different type (a string for a number, for example) fails the input check of the tool before the template sees it; send the type that the slot states. " +
|
|
98
124
|
"A change the slots do not cover: use `edit_file` on a line marked `# [adaptable: ...]` in the rendered script, and keep the edit small; the record lists each such edit. " +
|
|
99
125
|
"`match: unavailable` means the service did not answer, and `match: snapshot_mismatch` means the service moved to another release than the plan pinned; in both cases write the script yourself as you would without this tool, and state it in your summary.",
|
|
100
|
-
inputSchema:
|
|
101
|
-
template: z
|
|
102
|
-
.string()
|
|
103
|
-
.regex(TEMPLATE_REF, "a template id, optionally with @version")
|
|
104
|
-
.describe("The template id from the Grounding of the step, with its version, for example `tpl-deseq2-two-group@1.0.0`."),
|
|
105
|
-
slots: z
|
|
106
|
-
.record(z.string(), z.unknown())
|
|
107
|
-
.describe("The slot values, by slot name. Only the adaptable slots of the template; a pinned slot is refused. Strings, numbers, booleans, and lists of strings."),
|
|
108
|
-
overrides: z
|
|
109
|
-
.array(z.object({
|
|
110
|
-
slot: z.string().min(1).describe("The name of the bound slot whose value you change."),
|
|
111
|
-
reason: z.string().min(1).describe("Why the plan value does not hold for this step, in one sentence."),
|
|
112
|
-
}))
|
|
113
|
-
.optional()
|
|
114
|
-
.describe("One entry per bound slot whose value you change from the plan value. Absent when you send every bound value as it is."),
|
|
115
|
-
script_name: z
|
|
116
|
-
.string()
|
|
117
|
-
.regex(/^[A-Za-z0-9_.-]+$/)
|
|
118
|
-
.optional()
|
|
119
|
-
.describe("The file name under `scripts/`. Defaults to `<template id>.R` or `<template id>.py` by the language of the template."),
|
|
120
|
-
}),
|
|
126
|
+
inputSchema: KnowledgeTemplateInputSchema,
|
|
121
127
|
describeCall: ({ template }) => template,
|
|
122
128
|
describeResult: (_input, result) => "status" in result ? (result.status === "ok" ? `${result.script_path} (${result.environment_match})` : result.status) : result.match,
|
|
123
129
|
execute: async ({ template, slots, overrides, script_name }, ctx) => {
|
|
@@ -161,7 +167,7 @@ export function createKnowledgeTemplateTool(deps) {
|
|
|
161
167
|
const localByName = new Map(locals.map((parameter) => [parameter.name, parameter]));
|
|
162
168
|
// A local value the contract refuses is refused before the service call, thus a bad path costs no render.
|
|
163
169
|
const localIssues = Object.entries(localValues).flatMap(([name, value]) => {
|
|
164
|
-
const issue = validateLocalSlot(localByName
|
|
170
|
+
const issue = validateLocalSlot(presentGet(localByName, name, "the template parameter of the local value"), value);
|
|
165
171
|
return issue ? [issue] : [];
|
|
166
172
|
});
|
|
167
173
|
if (localIssues.length > 0) {
|
|
@@ -169,13 +175,13 @@ export function createKnowledgeTemplateTool(deps) {
|
|
|
169
175
|
}
|
|
170
176
|
const farmLockFile = typeof deps.farmLockFile === "function" ? deps.farmLockFile(ctx.session.scope.analysisId) : deps.farmLockFile;
|
|
171
177
|
const installed = installedPackages({
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
farmLockFile,
|
|
179
|
+
imagePackagesFile: deps.imagePackagesFile,
|
|
174
180
|
});
|
|
175
181
|
const answer = await deps.client.render(template, merged, installed.packages, {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
182
|
+
step: binding?.step,
|
|
183
|
+
claims: binding?.claims,
|
|
184
|
+
expectedSnapshot: binding?.snapshot,
|
|
179
185
|
});
|
|
180
186
|
// A rendered answer carries `ok: true`; the refusals carry `match` and no `ok`.
|
|
181
187
|
if (!("ok" in answer))
|
|
@@ -205,7 +211,7 @@ export function createKnowledgeTemplateTool(deps) {
|
|
|
205
211
|
return ok({ status: "write_refused", path: scriptWrite.path, reason: scriptWrite.status });
|
|
206
212
|
const boundSlots = Object.entries(binding?.slots ?? {}).map(([slot, value]) => ({
|
|
207
213
|
slot,
|
|
208
|
-
value
|
|
214
|
+
value,
|
|
209
215
|
source: binding ? sourceOf(binding, slot) : "plan",
|
|
210
216
|
}));
|
|
211
217
|
const settingsOverrides = boundSlots.flatMap(({ slot, value }) => {
|
|
@@ -245,9 +251,9 @@ export function createKnowledgeTemplateTool(deps) {
|
|
|
245
251
|
version: answer.template.version,
|
|
246
252
|
label: answer.template.label,
|
|
247
253
|
method: { id: answer.template.method.id, label: answer.template.method.label },
|
|
248
|
-
|
|
249
|
-
?
|
|
250
|
-
: {}
|
|
254
|
+
substitute_for: answer.template.substitute_for === undefined
|
|
255
|
+
? undefined
|
|
256
|
+
: { id: answer.template.substitute_for.id, label: answer.template.substitute_for.label },
|
|
251
257
|
},
|
|
252
258
|
snapshot: answer.snapshot,
|
|
253
259
|
slots: reportedSlots,
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* `found: false` tells the agent to report the absence and not to retry.
|
|
20
20
|
*/
|
|
21
21
|
import { z } from "zod";
|
|
22
|
+
import { presentFirst } from "../../lib/present.js";
|
|
22
23
|
import { apiFetchValidated, describeApiError } from "./api-utils.js";
|
|
23
24
|
const ALPHAFOLD_BASE = "https://alphafold.ebi.ac.uk/api/prediction";
|
|
24
25
|
/**
|
|
@@ -70,7 +71,7 @@ export async function fetchAlphaFoldPrediction(uniprotAccession) {
|
|
|
70
71
|
if (entries.length === 0)
|
|
71
72
|
return null;
|
|
72
73
|
const exact = entries.find((entry) => entry.uniprotAccession.toUpperCase() === accession.toUpperCase());
|
|
73
|
-
return exact ?? entries
|
|
74
|
+
return exact ?? presentFirst(entries, "the fallback entry");
|
|
74
75
|
}
|
|
75
76
|
function isAbsence(e) {
|
|
76
77
|
return e.type === "http_status" && (e.status === 400 || e.status === 404);
|
|
@@ -349,24 +349,24 @@ export declare const RegulatorySectionResponseSchema: z.ZodObject<{
|
|
|
349
349
|
}, z.core.$strip>;
|
|
350
350
|
type RegulatoryBase = z.infer<typeof RegulatoryBaseSchema>;
|
|
351
351
|
/** The sections of one source document. The document fields appear once, not on every section. */
|
|
352
|
-
export
|
|
352
|
+
export type SectionGroup<S> = {
|
|
353
353
|
readonly docType: string;
|
|
354
354
|
readonly sourceUrl: string | null;
|
|
355
355
|
readonly sourceDate: string | null;
|
|
356
356
|
readonly sections: S[];
|
|
357
|
-
}
|
|
357
|
+
};
|
|
358
358
|
/** One entry of a table of contents. */
|
|
359
|
-
export
|
|
359
|
+
export type SectionEntry = {
|
|
360
360
|
readonly documentSectionId: string;
|
|
361
361
|
readonly path: string | null;
|
|
362
362
|
readonly title: string | null;
|
|
363
|
-
}
|
|
363
|
+
};
|
|
364
364
|
/** One matched section of a search, with the excerpt that drove the match. */
|
|
365
|
-
export
|
|
365
|
+
export type MatchedSectionEntry = SectionEntry & {
|
|
366
366
|
readonly matchedText: string | null;
|
|
367
|
-
}
|
|
367
|
+
};
|
|
368
368
|
/** The fields of an authorization that both the search and the details answer carry. */
|
|
369
|
-
export
|
|
369
|
+
export type AuthorizationSummary = {
|
|
370
370
|
readonly amassId: string;
|
|
371
371
|
readonly agency: string;
|
|
372
372
|
readonly name: string | null;
|
|
@@ -382,22 +382,22 @@ export interface AuthorizationSummary {
|
|
|
382
382
|
readonly designations: RegulatoryBase["designations"];
|
|
383
383
|
readonly otherAuthorizations: RegulatoryBase["authorizationsByAgency"];
|
|
384
384
|
readonly sourceUrl: string | null;
|
|
385
|
-
}
|
|
385
|
+
};
|
|
386
386
|
/** The matched sections that a search row keeps. The count still reports all of them. */
|
|
387
387
|
export declare const MAX_MATCHED_SECTIONS = 5;
|
|
388
|
-
export
|
|
388
|
+
export type AuthorizationSearchRow = AuthorizationSummary & {
|
|
389
389
|
readonly matchedSectionCount: number;
|
|
390
390
|
readonly matchedDocuments: SectionGroup<MatchedSectionEntry>[];
|
|
391
|
-
}
|
|
391
|
+
};
|
|
392
392
|
export declare function mapRegulatorySearchRow(record: z.infer<typeof RegulatorySearchResponseSchema>["data"][number]): AuthorizationSearchRow;
|
|
393
|
-
export
|
|
393
|
+
export type AuthorizationRecord = AuthorizationSummary & {
|
|
394
394
|
readonly fdaDetails: z.infer<typeof FdaDetailsSchema> | null;
|
|
395
395
|
readonly emaDetails: z.infer<typeof EmaDetailsSchema> | null;
|
|
396
396
|
readonly sectionCount: number;
|
|
397
397
|
readonly documents: SectionGroup<SectionEntry>[];
|
|
398
|
-
}
|
|
398
|
+
};
|
|
399
399
|
export declare function mapRegulatoryRecord(record: z.infer<typeof RegulatoryRecordResponseSchema>["data"]): AuthorizationRecord;
|
|
400
|
-
export
|
|
400
|
+
export type RegulatorySection = {
|
|
401
401
|
readonly amassId: string;
|
|
402
402
|
readonly documentSectionId: string;
|
|
403
403
|
readonly docType: string;
|
|
@@ -406,8 +406,8 @@ export interface RegulatorySection {
|
|
|
406
406
|
readonly sourceUrl: string | null;
|
|
407
407
|
readonly sourceDate: string | null;
|
|
408
408
|
readonly content: string | null;
|
|
409
|
-
}
|
|
410
|
-
export
|
|
409
|
+
};
|
|
410
|
+
export type RegulatorySearchParams = {
|
|
411
411
|
readonly query: string;
|
|
412
412
|
readonly limit: number;
|
|
413
413
|
readonly agency?: readonly string[];
|
|
@@ -418,19 +418,19 @@ export interface RegulatorySearchParams {
|
|
|
418
418
|
readonly minAuthorizationDate?: string;
|
|
419
419
|
readonly maxAuthorizationDate?: string;
|
|
420
420
|
readonly amassId?: string;
|
|
421
|
-
}
|
|
421
|
+
};
|
|
422
422
|
export declare function searchRegulatoryRecords(params: RegulatorySearchParams, headers: Record<string, string>): ResultAsync<AuthorizationSearchRow[], AmassError>;
|
|
423
423
|
/** One authorization with its table of contents, or `null` when Amass holds no such ID. */
|
|
424
424
|
export declare function getRegulatoryRecord(amassId: string, headers: Record<string, string>): ResultAsync<AuthorizationRecord | null, AmassError>;
|
|
425
425
|
/** The full text of one document section, or `null` when Amass holds no such section. */
|
|
426
426
|
export declare function getRegulatorySection(amassId: string, documentSectionId: string, headers: Record<string, string>): ResultAsync<RegulatorySection | null, AmassError>;
|
|
427
427
|
/** The identifiers that the RegulatoryCore lookup accepts. Exactly one is set. */
|
|
428
|
-
export
|
|
428
|
+
export type RegulatoryIdentifier = {
|
|
429
429
|
readonly fdaApplicationNumber?: string;
|
|
430
430
|
readonly emaProductNumber?: string;
|
|
431
431
|
readonly ndc?: string;
|
|
432
432
|
readonly splSetId?: string;
|
|
433
|
-
}
|
|
433
|
+
};
|
|
434
434
|
export declare function regulatoryLookupItems(id: RegulatoryIdentifier): LookupItem[];
|
|
435
435
|
export declare function lookupRegulatoryIds(id: RegulatoryIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
|
|
436
436
|
declare const PatentBaseSchema: z.ZodObject<{
|
|
@@ -523,7 +523,7 @@ export declare const PatentRecordResponseSchema: z.ZodObject<{
|
|
|
523
523
|
}, z.core.$strip>;
|
|
524
524
|
type PatentBase = z.infer<typeof PatentBaseSchema>;
|
|
525
525
|
/** A patent with its citation counts. The citation lists stay out: a cited patent can carry thousands. */
|
|
526
|
-
export
|
|
526
|
+
export type PatentSummary = {
|
|
527
527
|
readonly amassId: string;
|
|
528
528
|
readonly publicationNumber: string | null;
|
|
529
529
|
readonly applicationNumber: string | null;
|
|
@@ -546,17 +546,17 @@ export interface PatentSummary {
|
|
|
546
546
|
readonly hasClaims: boolean | null;
|
|
547
547
|
readonly hasDescription: boolean | null;
|
|
548
548
|
readonly url: string | null;
|
|
549
|
-
}
|
|
549
|
+
};
|
|
550
550
|
export declare function mapPatentSummary(record: PatentBase): PatentSummary;
|
|
551
|
-
export
|
|
551
|
+
export type PatentRecord = PatentSummary & {
|
|
552
552
|
readonly familyMembers: string[];
|
|
553
553
|
readonly language: string | null;
|
|
554
554
|
readonly nonEnglishFallback: boolean | null;
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
}
|
|
555
|
+
claims?: string | null;
|
|
556
|
+
description?: string | null;
|
|
557
|
+
};
|
|
558
558
|
export declare function mapPatentRecord(record: PatentBase): PatentRecord;
|
|
559
|
-
export
|
|
559
|
+
export type PatentSearchParams = {
|
|
560
560
|
readonly query: string;
|
|
561
561
|
readonly limit: number;
|
|
562
562
|
readonly assignee?: readonly string[];
|
|
@@ -571,16 +571,16 @@ export interface PatentSearchParams {
|
|
|
571
571
|
readonly maxPriorityDate?: string;
|
|
572
572
|
readonly minGrantDate?: string;
|
|
573
573
|
readonly maxGrantDate?: string;
|
|
574
|
-
}
|
|
574
|
+
};
|
|
575
575
|
export declare function searchPatentRecords(params: PatentSearchParams, headers: Record<string, string>): ResultAsync<PatentSummary[], AmassError>;
|
|
576
576
|
export declare function getPatentRecord(amassId: string, include: {
|
|
577
577
|
readonly claims: boolean;
|
|
578
578
|
readonly description: boolean;
|
|
579
579
|
}, headers: Record<string, string>): ResultAsync<PatentRecord | null, AmassError>;
|
|
580
580
|
/** The identifiers that the PatentCore lookup accepts. Exactly one is set. */
|
|
581
|
-
export
|
|
581
|
+
export type PatentIdentifier = {
|
|
582
582
|
readonly publicationNumber?: string;
|
|
583
583
|
readonly applicationNumber?: string;
|
|
584
|
-
}
|
|
584
|
+
};
|
|
585
585
|
export declare function lookupPatentIds(id: PatentIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
|
|
586
586
|
export {};
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
import { err, ok } from "neverthrow";
|
|
32
32
|
import { z } from "zod";
|
|
33
33
|
import { apiFetchValidated, describeApiError } from "./api-utils.js";
|
|
34
|
+
import { safeParseJsonAs } from "../../lib/parse-json.js";
|
|
35
|
+
import { hasWhitespace, isAllDigits } from "../../lib/text.js";
|
|
34
36
|
import { AMASS_BASE } from "./amass-config.js";
|
|
35
37
|
/** Render an `AmassError` as a one-line message for the model or for a throw. */
|
|
36
38
|
export function describeAmassError(e) {
|
|
@@ -60,14 +62,13 @@ export const AmassErrorEnvelopeSchema = z.object({
|
|
|
60
62
|
});
|
|
61
63
|
/** Read the message of an Amass error body, with the per-field reasons of a 400. */
|
|
62
64
|
function envelopeOf(body) {
|
|
63
|
-
let
|
|
65
|
+
let envelope;
|
|
64
66
|
try {
|
|
65
|
-
|
|
67
|
+
envelope = safeParseJsonAs(body, AmassErrorEnvelopeSchema);
|
|
66
68
|
}
|
|
67
69
|
catch {
|
|
68
70
|
return { code: null, message: body || "no message" };
|
|
69
71
|
}
|
|
70
|
-
const envelope = AmassErrorEnvelopeSchema.safeParse(parsed);
|
|
71
72
|
if (!envelope.success)
|
|
72
73
|
return { code: null, message: body || "no message" };
|
|
73
74
|
const { code, message, fields } = envelope.data.error;
|
|
@@ -105,7 +106,8 @@ function urlOf(path, params) {
|
|
|
105
106
|
if (value === undefined)
|
|
106
107
|
continue;
|
|
107
108
|
if (Array.isArray(value)) {
|
|
108
|
-
|
|
109
|
+
const items = value;
|
|
110
|
+
for (const item of items)
|
|
109
111
|
url.searchParams.append(key, item);
|
|
110
112
|
}
|
|
111
113
|
else {
|
|
@@ -154,8 +156,11 @@ const FDA_APPLICATION_PREFIXES = ["NDA", "BLA", "ANDA"];
|
|
|
154
156
|
* thus goes as all three prefixes, in one request at the price of one.
|
|
155
157
|
*/
|
|
156
158
|
export function fdaApplicationForms(input) {
|
|
157
|
-
const compact =
|
|
158
|
-
|
|
159
|
+
const compact = Array.from(input)
|
|
160
|
+
.filter((char) => char !== "-" && !hasWhitespace(char))
|
|
161
|
+
.join("")
|
|
162
|
+
.toUpperCase();
|
|
163
|
+
if (compact !== "" && isAllDigits(compact))
|
|
159
164
|
return FDA_APPLICATION_PREFIXES.map((prefix) => `${prefix}${compact}`);
|
|
160
165
|
return [compact];
|
|
161
166
|
}
|
|
@@ -166,7 +171,9 @@ export function fdaApplicationForms(input) {
|
|
|
166
171
|
export function productNdcOf(input) {
|
|
167
172
|
const trimmed = input.trim();
|
|
168
173
|
const segments = trimmed.split("-");
|
|
169
|
-
return segments.length === 3 && segments.every((segment) =>
|
|
174
|
+
return segments.length === 3 && segments.every((segment) => segment.length > 0 && isAllDigits(segment))
|
|
175
|
+
? `${String(segments[0])}-${String(segments[1])}`
|
|
176
|
+
: trimmed;
|
|
170
177
|
}
|
|
171
178
|
// ---------------------------------------------------------------------------
|
|
172
179
|
// RegulatoryCore
|
|
@@ -455,14 +462,17 @@ export function mapPatentSummary(record) {
|
|
|
455
462
|
};
|
|
456
463
|
}
|
|
457
464
|
export function mapPatentRecord(record) {
|
|
458
|
-
|
|
465
|
+
const patent = {
|
|
459
466
|
...mapPatentSummary(record),
|
|
460
467
|
familyMembers: record.familyMembers,
|
|
461
468
|
language: record.language,
|
|
462
469
|
nonEnglishFallback: record.nonEnglishFallback,
|
|
463
|
-
...(record.claims === undefined ? {} : { claims: record.claims }),
|
|
464
|
-
...(record.description === undefined ? {} : { description: record.description }),
|
|
465
470
|
};
|
|
471
|
+
if (record.claims !== undefined)
|
|
472
|
+
patent.claims = record.claims;
|
|
473
|
+
if (record.description !== undefined)
|
|
474
|
+
patent.description = record.description;
|
|
475
|
+
return patent;
|
|
466
476
|
}
|
|
467
477
|
/** PatentCore reads a list filter as one comma-separated value, not as a repeated parameter. */
|
|
468
478
|
function commaList(values) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { ResultAsync } from "neverthrow";
|
|
12
12
|
import { z } from "zod";
|
|
13
|
-
export
|
|
13
|
+
export type ApiFetchOptions = {
|
|
14
14
|
method?: "GET" | "POST";
|
|
15
15
|
headers?: Record<string, string>;
|
|
16
16
|
body?: string;
|
|
@@ -31,7 +31,7 @@ export interface ApiFetchOptions {
|
|
|
31
31
|
sleep?: (ms: number) => Promise<void>;
|
|
32
32
|
timeoutMs?: number;
|
|
33
33
|
parseAs?: "json" | "text";
|
|
34
|
-
}
|
|
34
|
+
};
|
|
35
35
|
/** The error channel of `apiFetch`. A `DomainError` (string `type` discriminant). */
|
|
36
36
|
export type ApiError = {
|
|
37
37
|
readonly type: "http_status";
|
|
@@ -64,8 +64,18 @@ export declare const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)
|
|
|
64
64
|
* and every wait stays at or below `maxRetryDelayMs`.
|
|
65
65
|
*
|
|
66
66
|
* Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
|
|
67
|
+
*
|
|
68
|
+
* The success value is `unknown`: the caller either walks it with guards, or
|
|
69
|
+
* validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function apiFetch(url: string, options?: ApiFetchOptions): ResultAsync<unknown, ApiError>;
|
|
72
|
+
/**
|
|
73
|
+
* `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
|
|
74
|
+
* value a string, so the wrapper states that shape instead of casting the
|
|
75
|
+
* `unknown` read; the check never refuses a body, because `res.text()` always
|
|
76
|
+
* resolves to one.
|
|
67
77
|
*/
|
|
68
|
-
export declare function
|
|
78
|
+
export declare function apiFetchText(url: string, options?: ApiFetchOptions): ResultAsync<string, ApiError>;
|
|
69
79
|
/**
|
|
70
80
|
* `apiFetch` that validates the JSON response against a Zod `schema` before
|
|
71
81
|
* returning it. The success value is the schema's parsed output, so callers
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* `ResultAsync<T, ApiError>` rather than throwing — callers branch on
|
|
9
9
|
* `isErr()` and read `value` / `error` (see `result.ts` for the house rules).
|
|
10
10
|
*/
|
|
11
|
+
import { errorMessageOf } from "../../lib/thrown.js";
|
|
12
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
11
13
|
import { ResultAsync, err, ok } from "neverthrow";
|
|
12
14
|
import { z } from "zod";
|
|
13
15
|
import { sleep } from "../../lib/async-utils.js";
|
|
@@ -33,10 +35,22 @@ export const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)";
|
|
|
33
35
|
* and every wait stays at or below `maxRetryDelayMs`.
|
|
34
36
|
*
|
|
35
37
|
* Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
|
|
38
|
+
*
|
|
39
|
+
* The success value is `unknown`: the caller either walks it with guards, or
|
|
40
|
+
* validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
|
|
36
41
|
*/
|
|
37
42
|
export function apiFetch(url, options = {}) {
|
|
38
43
|
return new ResultAsync(runFetch(url, options));
|
|
39
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
|
|
47
|
+
* value a string, so the wrapper states that shape instead of casting the
|
|
48
|
+
* `unknown` read; the check never refuses a body, because `res.text()` always
|
|
49
|
+
* resolves to one.
|
|
50
|
+
*/
|
|
51
|
+
export function apiFetchText(url, options = {}) {
|
|
52
|
+
return apiFetch(url, { ...options, parseAs: "text" }).andThen((data) => typeof data === "string" ? ok(data) : err({ type: "invalid_response", issues: "expected a text body" }));
|
|
53
|
+
}
|
|
40
54
|
/**
|
|
41
55
|
* `apiFetch` that validates the JSON response against a Zod `schema` before
|
|
42
56
|
* returning it. The success value is the schema's parsed output, so callers
|
|
@@ -125,14 +139,14 @@ async function runFetch(url, options) {
|
|
|
125
139
|
const text = await res.text().catch(() => "");
|
|
126
140
|
return err({ type: "http_status", status: res.status, body: text.trim() });
|
|
127
141
|
}
|
|
128
|
-
const
|
|
129
|
-
return ok(
|
|
142
|
+
const readBody = parseAs === "text" ? (res) => res.text() : (res) => res.json();
|
|
143
|
+
return ok(await readBody(res));
|
|
130
144
|
}
|
|
131
145
|
catch (e) {
|
|
132
146
|
if (e instanceof DOMException && e.name === "TimeoutError") {
|
|
133
147
|
return err({ type: "timeout", timeoutMs });
|
|
134
148
|
}
|
|
135
|
-
lastError = e
|
|
149
|
+
lastError = errorMessageOf(e) ?? textOf(e);
|
|
136
150
|
if (attempt < maxRetries) {
|
|
137
151
|
await wait(Math.min(maxRetryDelayMs, retryDelayMs * 2 ** attempt));
|
|
138
152
|
continue;
|
|
@@ -15,26 +15,26 @@ export declare const SUPPORTED_SPECIES: readonly ["homo_sapiens", "mus_musculus"
|
|
|
15
15
|
export type SupportedSpecies = (typeof SUPPORTED_SPECIES)[number];
|
|
16
16
|
export declare const SPECIES_TAXON: Record<SupportedSpecies, number>;
|
|
17
17
|
export type ExpressionRank = "absent" | "low" | "medium" | "high";
|
|
18
|
-
export
|
|
18
|
+
export type TissueRow = {
|
|
19
19
|
tissue: string;
|
|
20
20
|
cellType: string | null;
|
|
21
21
|
expressionScore: number | null;
|
|
22
22
|
confidence: "gold" | "silver" | null;
|
|
23
23
|
expressionState: "expressed" | "not expressed";
|
|
24
24
|
rank: ExpressionRank;
|
|
25
|
-
}
|
|
26
|
-
export
|
|
25
|
+
};
|
|
26
|
+
export type SpeciesEntry = {
|
|
27
27
|
species: SupportedSpecies;
|
|
28
28
|
taxonId: number;
|
|
29
29
|
ensemblId: string;
|
|
30
30
|
tissues: TissueRow[];
|
|
31
|
-
}
|
|
32
|
-
export
|
|
31
|
+
};
|
|
32
|
+
export type MultiSpeciesExpression = {
|
|
33
33
|
geneSymbol: string;
|
|
34
34
|
humanEnsemblId: string | null;
|
|
35
35
|
bySpecies: SpeciesEntry[];
|
|
36
36
|
notFound: string[];
|
|
37
|
-
}
|
|
37
|
+
};
|
|
38
38
|
export declare function bucketRank(expressionState: string, score: number | null): ExpressionRank;
|
|
39
39
|
export declare const EnsemblLookupSchema: z.ZodObject<{
|
|
40
40
|
id: z.ZodOptional<z.ZodString>;
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* field carries `.optional()`, not `.nullable()`.
|
|
12
12
|
*/
|
|
13
13
|
import { z } from "zod";
|
|
14
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
15
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
14
16
|
import { apiFetchValidated, describeApiError, isUnexpectedApiError } from "./api-utils.js";
|
|
15
17
|
const ENSEMBL_BASE = "https://rest.ensembl.org";
|
|
16
18
|
const BGEE_BASE = "https://www.bgee.org/api";
|
|
@@ -60,28 +62,32 @@ export const EnsemblHomologyResponseSchema = z.object({
|
|
|
60
62
|
data: z.array(z.object({ homologies: z.array(z.object({ id: z.string().optional(), type: z.string().optional() })).optional() })).optional(),
|
|
61
63
|
});
|
|
62
64
|
export function parseExpressionResponse(raw) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const calls = raw?.data?.calls;
|
|
66
|
-
if (!Array.isArray(calls))
|
|
65
|
+
const calls = parseUnknownRecord(parseUnknownRecord(raw)?.data)?.calls;
|
|
66
|
+
if (!isUnknownArray(calls))
|
|
67
67
|
return [];
|
|
68
68
|
const out = [];
|
|
69
|
-
for (const
|
|
70
|
-
const
|
|
69
|
+
for (const entry of calls) {
|
|
70
|
+
const call = parseUnknownRecord(entry);
|
|
71
|
+
if (!call)
|
|
72
|
+
continue;
|
|
73
|
+
const condition = parseUnknownRecord(call.condition);
|
|
74
|
+
const anatEntity = parseUnknownRecord(condition?.anatEntity);
|
|
75
|
+
const anatName = typeof anatEntity?.name === "string" ? anatEntity.name : "";
|
|
71
76
|
const tissue = anatName.trim().toLowerCase();
|
|
72
77
|
if (!tissue)
|
|
73
78
|
continue;
|
|
74
|
-
const
|
|
79
|
+
const cellTypeRecord = parseUnknownRecord(condition?.cellType);
|
|
80
|
+
const cellTypeName = cellTypeRecord?.name;
|
|
75
81
|
const cellType = typeof cellTypeName === "string" && cellTypeName.trim() !== "" ? cellTypeName.trim().toLowerCase() : null;
|
|
76
|
-
const rawScore = call
|
|
82
|
+
const rawScore = parseUnknownRecord(call.expressionScore)?.expressionScore;
|
|
77
83
|
let expressionScore = null;
|
|
78
84
|
if (typeof rawScore === "string" || typeof rawScore === "number") {
|
|
79
85
|
const n = typeof rawScore === "number" ? rawScore : parseFloat(rawScore);
|
|
80
86
|
expressionScore = Number.isFinite(n) ? n : null;
|
|
81
87
|
}
|
|
82
|
-
const quality = call
|
|
88
|
+
const quality = call.expressionQuality;
|
|
83
89
|
const confidence = quality === "gold" || quality === "silver" ? quality : null;
|
|
84
|
-
const stateRaw = call
|
|
90
|
+
const stateRaw = call.expressionState;
|
|
85
91
|
const expressionState = stateRaw === "not expressed" ? "not expressed" : "expressed";
|
|
86
92
|
out.push({
|
|
87
93
|
tissue,
|
|
@@ -11,19 +11,19 @@
|
|
|
11
11
|
* not `.nullable()`.
|
|
12
12
|
*/
|
|
13
13
|
import { z } from "zod";
|
|
14
|
-
export
|
|
14
|
+
export type CancerStudy = {
|
|
15
15
|
studyId: string;
|
|
16
16
|
cancerType: string;
|
|
17
17
|
cancerTypeName: string;
|
|
18
|
-
}
|
|
19
|
-
export
|
|
18
|
+
};
|
|
19
|
+
export type MutationFrequency = {
|
|
20
20
|
cancerTypeId: string;
|
|
21
21
|
cancerTypeName: string;
|
|
22
22
|
totalSamples: number;
|
|
23
23
|
mutatedSamples: number;
|
|
24
24
|
frequency: number;
|
|
25
25
|
studies: string[];
|
|
26
|
-
}
|
|
26
|
+
};
|
|
27
27
|
export declare const RawMutationRowSchema: z.ZodObject<{
|
|
28
28
|
studyId: z.ZodString;
|
|
29
29
|
sampleId: z.ZodString;
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
import { apiFetchValidated, describeApiError } from "./api-utils.js";
|
|
15
|
+
import { presentGet } from "../../lib/present.js";
|
|
15
16
|
const CBIOPORTAL_BASE = "https://www.cbioportal.org/api";
|
|
16
17
|
const HEADERS = { Accept: "application/json" };
|
|
17
18
|
// Raw cBioPortal wire shapes, validated at the fetch boundary. Fields the code
|
|
@@ -52,7 +53,7 @@ async function listStudies() {
|
|
|
52
53
|
const res = await apiFetchValidated(url, z.array(RawCancerStudySchema), { headers: HEADERS });
|
|
53
54
|
if (res.isErr())
|
|
54
55
|
throw new Error(describeApiError(res.error));
|
|
55
|
-
return res.value
|
|
56
|
+
return res.value;
|
|
56
57
|
}
|
|
57
58
|
/**
|
|
58
59
|
* The cancer-type vocabulary, keyed by its id. The study SUMMARY projection
|
|
@@ -65,7 +66,7 @@ async function cancerTypeNames() {
|
|
|
65
66
|
const names = new Map();
|
|
66
67
|
if (res.isErr())
|
|
67
68
|
return names;
|
|
68
|
-
for (const row of res.value
|
|
69
|
+
for (const row of res.value) {
|
|
69
70
|
if (row.cancerTypeId && row.name)
|
|
70
71
|
names.set(row.cancerTypeId, row.name);
|
|
71
72
|
}
|
|
@@ -76,14 +77,14 @@ async function listAllSampleLists() {
|
|
|
76
77
|
const res = await apiFetchValidated(url, z.array(RawSampleListSchema), { headers: HEADERS });
|
|
77
78
|
if (res.isErr())
|
|
78
79
|
throw new Error(describeApiError(res.error));
|
|
79
|
-
return res.value
|
|
80
|
+
return res.value;
|
|
80
81
|
}
|
|
81
82
|
async function listMutationProfiles() {
|
|
82
83
|
const url = `${CBIOPORTAL_BASE}/molecular-profiles?projection=SUMMARY&pageSize=10000`;
|
|
83
84
|
const res = await apiFetchValidated(url, z.array(RawMolecularProfileSchema), { headers: HEADERS });
|
|
84
85
|
if (res.isErr())
|
|
85
86
|
throw new Error(describeApiError(res.error));
|
|
86
|
-
return
|
|
87
|
+
return res.value.filter((p) => p.molecularAlterationType === "MUTATION_EXTENDED");
|
|
87
88
|
}
|
|
88
89
|
async function fetchMutationRowsForGene(entrezGeneId, profileIds) {
|
|
89
90
|
if (profileIds.length === 0)
|
|
@@ -99,7 +100,7 @@ async function fetchMutationRowsForGene(entrezGeneId, profileIds) {
|
|
|
99
100
|
});
|
|
100
101
|
if (res.isErr())
|
|
101
102
|
throw new Error(describeApiError(res.error));
|
|
102
|
-
return res.value
|
|
103
|
+
return res.value;
|
|
103
104
|
}
|
|
104
105
|
/**
|
|
105
106
|
* Resolve a gene symbol to its NCBI Entrez Gene ID via cBioPortal's gene
|
|
@@ -111,7 +112,7 @@ async function resolveEntrezId(symbol) {
|
|
|
111
112
|
const res = await apiFetchValidated(url, z.object({ entrezGeneId: z.number().optional() }), { headers: HEADERS });
|
|
112
113
|
if (res.isErr())
|
|
113
114
|
return null;
|
|
114
|
-
return res.value
|
|
115
|
+
return res.value.entrezGeneId ?? null;
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
117
118
|
* Compute somatic mutation frequencies for a target across all curated
|
|
@@ -145,7 +146,7 @@ export async function getSomaticMutationFrequencies(geneSymbol, options = {}) {
|
|
|
145
146
|
for (const m of mutations) {
|
|
146
147
|
if (!mutatedStudySamples.has(m.studyId))
|
|
147
148
|
mutatedStudySamples.set(m.studyId, new Set());
|
|
148
|
-
mutatedStudySamples
|
|
149
|
+
presentGet(mutatedStudySamples, m.studyId, "the sample set of the study").add(m.sampleId);
|
|
149
150
|
}
|
|
150
151
|
const byCancerType = new Map();
|
|
151
152
|
for (const studyId of studiesWithMutations) {
|
|
@@ -163,7 +164,7 @@ export async function getSomaticMutationFrequencies(geneSymbol, options = {}) {
|
|
|
163
164
|
studies: new Set(),
|
|
164
165
|
});
|
|
165
166
|
}
|
|
166
|
-
const bucket = byCancerType
|
|
167
|
+
const bucket = presentGet(byCancerType, cancerTypeId, "the aggregate bucket");
|
|
167
168
|
bucket.total += sampleCount;
|
|
168
169
|
bucket.mutated += mutatedStudySamples.get(studyId)?.size ?? 0;
|
|
169
170
|
bucket.studies.add(studyId);
|