@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,273 @@
|
|
|
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 { ok } from "neverthrow";
|
|
29
|
+
import { presentGet } from "../../lib/present.js";
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
import { defineTool, withToolCallRecord } from "../define-tool.js";
|
|
32
|
+
import { decisionRecordPath, scriptSha256 } from "../workspace/decision-record.js";
|
|
33
|
+
import { installedPackages } from "./environment.js";
|
|
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.
|
|
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_.-]+$/;
|
|
39
|
+
/** A model value equals a bound value when the scalars are identical, or when two lists hold the same strings in order. */
|
|
40
|
+
function sameValue(bound, value) {
|
|
41
|
+
if (Array.isArray(bound)) {
|
|
42
|
+
return Array.isArray(value) && value.length === bound.length && bound.every((item, index) => item === value[index]);
|
|
43
|
+
}
|
|
44
|
+
return bound === value;
|
|
45
|
+
}
|
|
46
|
+
/** The source of a bound slot as the issue names it. A binding without a source for the slot reads as the plan. */
|
|
47
|
+
function sourceOf(binding, slot) {
|
|
48
|
+
return binding.sources[slot] ?? "plan";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The refusal of a render request against the binding, or `undefined` when
|
|
52
|
+
* the request obeys it. A different template reference is one issue on the
|
|
53
|
+
* field `template`. Each bound slot whose model value differs without an
|
|
54
|
+
* override is one issue that names the slot, the bound value, and its source.
|
|
55
|
+
*/
|
|
56
|
+
function refusedByBinding(binding, template, slots, overridden) {
|
|
57
|
+
if (template !== binding.template) {
|
|
58
|
+
const message = `the plan binds the template ${binding.template}; this step renders that reference only`;
|
|
59
|
+
return { match: "rejected", message, issues: [{ field: "template", message, permitted: [binding.template] }] };
|
|
60
|
+
}
|
|
61
|
+
const issues = [];
|
|
62
|
+
for (const [slot, bound] of Object.entries(binding.slots)) {
|
|
63
|
+
const value = slots[slot];
|
|
64
|
+
if (value === undefined || sameValue(bound, value) || overridden.has(slot))
|
|
65
|
+
continue;
|
|
66
|
+
const shown = JSON.stringify(bound);
|
|
67
|
+
issues.push({
|
|
68
|
+
slot,
|
|
69
|
+
reason: "bound by the plan",
|
|
70
|
+
message: `the plan binds ${slot} = ${shown} (${sourceOf(binding, slot)}); send that value, or name the slot in overrides with the reason for the change`,
|
|
71
|
+
permitted: [shown],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (issues.length === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
return { match: "rejected", message: "one or more slot values differ from the plan settings without an override", issues };
|
|
77
|
+
}
|
|
78
|
+
/** A contract answer that is a refusal. The contract itself is a loose object, thus `in` alone cannot tell the two apart. */
|
|
79
|
+
function isContractRefusal(answer) {
|
|
80
|
+
return "match" in answer && (answer.match === "unavailable" || answer.match === "rejected");
|
|
81
|
+
}
|
|
82
|
+
/** The slots of `slots` whose names are in `names`, and the rest, as two records. */
|
|
83
|
+
function splitSlots(slots, names) {
|
|
84
|
+
const local = {};
|
|
85
|
+
const remote = {};
|
|
86
|
+
for (const [name, value] of Object.entries(slots))
|
|
87
|
+
(names.has(name) ? local : remote)[name] = value;
|
|
88
|
+
return { local, remote };
|
|
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
|
+
});
|
|
111
|
+
export function createKnowledgeTemplateTool(deps) {
|
|
112
|
+
return defineTool({
|
|
113
|
+
id: "knowledge_template",
|
|
114
|
+
description: "Render a tested analysis script from a knowledge template and write it into your working directory. " +
|
|
115
|
+
"Use it for a step whose briefing names a template in its Grounding (for example `tpl-deseq2-two-group@1.0.0`). " +
|
|
116
|
+
"The briefing lists the slots of the template and the values the plan binds. " +
|
|
117
|
+
"Send the template id and the slot values only: the file paths of your inputs (absolute `/<analysisId>/...` paths), the column names, the levels of the contrast, and the design. " +
|
|
118
|
+
"A slot the briefing marks local (a path, a column name, a level, a formula) is bound on this machine and never sent to the service; send it as any other slot. " +
|
|
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. " +
|
|
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. " +
|
|
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`. " +
|
|
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. " +
|
|
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. " +
|
|
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.",
|
|
126
|
+
inputSchema: KnowledgeTemplateInputSchema,
|
|
127
|
+
describeCall: ({ template }) => template,
|
|
128
|
+
describeResult: (_input, result) => "status" in result ? (result.status === "ok" ? `${result.script_path} (${result.environment_match})` : result.status) : result.match,
|
|
129
|
+
execute: async ({ template, slots, overrides, script_name }, ctx) => {
|
|
130
|
+
const binding = deps.binding;
|
|
131
|
+
const reasons = new Map((overrides ?? []).map((entry) => [entry.slot, entry.reason]));
|
|
132
|
+
if (binding) {
|
|
133
|
+
const refused = refusedByBinding(binding, template, slots, new Set(reasons.keys()));
|
|
134
|
+
if (refused)
|
|
135
|
+
return ok(refused);
|
|
136
|
+
}
|
|
137
|
+
// The local slots and the adaptable names come from the binding the host composed at dispatch, else from
|
|
138
|
+
// the contract itself. Without them no free-text value can be told from a fact of the machine, and an
|
|
139
|
+
// unknown name could carry one, thus no render happens without them.
|
|
140
|
+
let locals;
|
|
141
|
+
let adaptable;
|
|
142
|
+
if (binding?.local && binding.adaptable) {
|
|
143
|
+
locals = binding.local;
|
|
144
|
+
adaptable = binding.adaptable;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const contract = await deps.client.contract(template);
|
|
148
|
+
if (isContractRefusal(contract))
|
|
149
|
+
return ok(contract);
|
|
150
|
+
locals = localParameters(contract.parameters);
|
|
151
|
+
adaptable = contract.parameters.filter((parameter) => parameter.adaptable).map((parameter) => parameter.name);
|
|
152
|
+
}
|
|
153
|
+
const unknown = Object.keys(slots).filter((name) => !adaptable.includes(name));
|
|
154
|
+
if (unknown.length > 0) {
|
|
155
|
+
return ok({
|
|
156
|
+
match: "rejected",
|
|
157
|
+
message: "one or more slot names are not adaptable slots of this template",
|
|
158
|
+
issues: unknown.map((slot) => ({ slot, reason: "the template has no such adaptable slot", permitted: [...adaptable] })),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const localNames = new Set(locals.map((parameter) => parameter.name));
|
|
162
|
+
const split = splitSlots(slots, localNames);
|
|
163
|
+
const boundSplit = splitSlots(binding?.slots ?? {}, localNames);
|
|
164
|
+
const merged = { ...boundSplit.remote, ...split.remote };
|
|
165
|
+
// A bound local slot is bound on the machine like a model value, under the model value.
|
|
166
|
+
const localValues = { ...boundSplit.local, ...split.local };
|
|
167
|
+
const localByName = new Map(locals.map((parameter) => [parameter.name, parameter]));
|
|
168
|
+
// A local value the contract refuses is refused before the service call, thus a bad path costs no render.
|
|
169
|
+
const localIssues = Object.entries(localValues).flatMap(([name, value]) => {
|
|
170
|
+
const issue = validateLocalSlot(presentGet(localByName, name, "the template parameter of the local value"), value);
|
|
171
|
+
return issue ? [issue] : [];
|
|
172
|
+
});
|
|
173
|
+
if (localIssues.length > 0) {
|
|
174
|
+
return ok({ match: "rejected", message: "one or more local slot values are not valid for this template", issues: localIssues });
|
|
175
|
+
}
|
|
176
|
+
const farmLockFile = typeof deps.farmLockFile === "function" ? deps.farmLockFile(ctx.session.scope.analysisId) : deps.farmLockFile;
|
|
177
|
+
const installed = installedPackages({
|
|
178
|
+
farmLockFile,
|
|
179
|
+
imagePackagesFile: deps.imagePackagesFile,
|
|
180
|
+
});
|
|
181
|
+
const answer = await deps.client.render(template, merged, installed.packages, {
|
|
182
|
+
step: binding?.step,
|
|
183
|
+
claims: binding?.claims,
|
|
184
|
+
expectedSnapshot: binding?.snapshot,
|
|
185
|
+
});
|
|
186
|
+
// A rendered answer carries `ok: true`; the refusals carry `match` and no `ok`.
|
|
187
|
+
if (!("ok" in answer))
|
|
188
|
+
return ok(answer);
|
|
189
|
+
const bound = bindLocalSlots({ language: answer.template.language, parameters: locals }, answer.script, localValues, answer.slots);
|
|
190
|
+
if (!bound.ok) {
|
|
191
|
+
return ok({ match: "rejected", message: "one or more local slot values are not valid for this template", issues: bound.issues });
|
|
192
|
+
}
|
|
193
|
+
const scriptFile = script_name ?? `${answer.template.id}.${answer.template.language === "R" ? "R" : "py"}`;
|
|
194
|
+
const scriptPath = `scripts/${scriptFile}`;
|
|
195
|
+
// Each landed write rides the call record, also when a later write is refused.
|
|
196
|
+
const records = [];
|
|
197
|
+
const write = async (path, content) => {
|
|
198
|
+
const outcome = await deps.mutator.writeFile({
|
|
199
|
+
path,
|
|
200
|
+
content,
|
|
201
|
+
toolName: "knowledge_template",
|
|
202
|
+
invocationId: ctx.invocationId,
|
|
203
|
+
session: ctx.session,
|
|
204
|
+
});
|
|
205
|
+
if (outcome.status === "ok")
|
|
206
|
+
records.push(outcome.record);
|
|
207
|
+
return outcome;
|
|
208
|
+
};
|
|
209
|
+
const scriptWrite = await write(scriptPath, bound.script);
|
|
210
|
+
if (scriptWrite.status !== "ok")
|
|
211
|
+
return ok({ status: "write_refused", path: scriptWrite.path, reason: scriptWrite.status });
|
|
212
|
+
const boundSlots = Object.entries(binding?.slots ?? {}).map(([slot, value]) => ({
|
|
213
|
+
slot,
|
|
214
|
+
value,
|
|
215
|
+
source: binding ? sourceOf(binding, slot) : "plan",
|
|
216
|
+
}));
|
|
217
|
+
const settingsOverrides = boundSlots.flatMap(({ slot, value }) => {
|
|
218
|
+
const reason = reasons.get(slot);
|
|
219
|
+
const sent = slots[slot];
|
|
220
|
+
if (reason === undefined || sent === undefined || sameValue(value, sent))
|
|
221
|
+
return [];
|
|
222
|
+
return [{ slot, plan_value: value, new_value: sent, reason }];
|
|
223
|
+
});
|
|
224
|
+
// The slot report of the record: the service entries, with each local marker entry replaced by the slot as
|
|
225
|
+
// bound here. An optional local slot with no value has no entry, as in a full render.
|
|
226
|
+
const boundByName = new Map(bound.slots.map((slot) => [slot.name, slot]));
|
|
227
|
+
const reportedSlots = answer.slots.flatMap((slot) => {
|
|
228
|
+
if (slot.source !== "local")
|
|
229
|
+
return [slot];
|
|
230
|
+
const local = boundByName.get(slot.name);
|
|
231
|
+
return local ? [local] : [];
|
|
232
|
+
});
|
|
233
|
+
const record = {
|
|
234
|
+
...answer.decision_record,
|
|
235
|
+
slots: reportedSlots,
|
|
236
|
+
script_path: scriptWrite.path,
|
|
237
|
+
written_sha256: scriptSha256(bound.script),
|
|
238
|
+
bound_slots: boundSlots,
|
|
239
|
+
settings_overrides: settingsOverrides,
|
|
240
|
+
};
|
|
241
|
+
const recordWrite = await write(decisionRecordPath(scriptFile), `${JSON.stringify(record, null, 2)}\n`);
|
|
242
|
+
if (recordWrite.status !== "ok") {
|
|
243
|
+
return ok(withToolCallRecord({ status: "write_refused", path: recordWrite.path, reason: recordWrite.status }, records));
|
|
244
|
+
}
|
|
245
|
+
return ok(withToolCallRecord({
|
|
246
|
+
status: "ok",
|
|
247
|
+
script_path: scriptWrite.path,
|
|
248
|
+
decision_record_path: recordWrite.path,
|
|
249
|
+
template: {
|
|
250
|
+
id: answer.template.id,
|
|
251
|
+
version: answer.template.version,
|
|
252
|
+
label: answer.template.label,
|
|
253
|
+
method: { id: answer.template.method.id, label: answer.template.method.label },
|
|
254
|
+
substitute_for: answer.template.substitute_for === undefined
|
|
255
|
+
? undefined
|
|
256
|
+
: { id: answer.template.substitute_for.id, label: answer.template.substitute_for.label },
|
|
257
|
+
},
|
|
258
|
+
snapshot: answer.snapshot,
|
|
259
|
+
slots: reportedSlots,
|
|
260
|
+
local_slots: bound.slots.map((slot) => slot.name),
|
|
261
|
+
written_sha256: record.written_sha256,
|
|
262
|
+
environment_match: answer.environment.match,
|
|
263
|
+
syntax: answer.syntax.status,
|
|
264
|
+
expected_outputs: answer.outputs,
|
|
265
|
+
run_with: `${answer.template.language === "R" ? "Rscript" : "python3"} ${scriptPath}`,
|
|
266
|
+
}, records));
|
|
267
|
+
},
|
|
268
|
+
foldCallRecord: (records) => {
|
|
269
|
+
for (const record of records)
|
|
270
|
+
deps.mutator.recordWrite(record);
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
}
|
|
@@ -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>;
|