@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
|
@@ -23,8 +23,10 @@ export const DraftSectionBlockSchema = z.strictObject({
|
|
|
23
23
|
title: z.string(),
|
|
24
24
|
blocks: z.lazy(() => z.array(DraftBlockSchema)),
|
|
25
25
|
});
|
|
26
|
+
/** The draft block union, before the erasing annotation of {@link DraftBlockSchema}. */
|
|
27
|
+
export const DraftBlockUnionSchema = z.discriminatedUnion("kind", [DraftSectionBlockSchema, ...ATOM_BLOCK_SCHEMAS]);
|
|
26
28
|
/** The draft block union. A `z.ZodType<DraftBlock>` annotation gives the recursive members a stable type. */
|
|
27
|
-
export const DraftBlockSchema =
|
|
29
|
+
export const DraftBlockSchema = DraftBlockUnionSchema;
|
|
28
30
|
/** The root of a draft. It permits zero sections, thus an empty draft is a legal state. */
|
|
29
31
|
export const DraftDocumentSchema = z.strictObject({
|
|
30
32
|
title: z.string(),
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { err, ok } from "neverthrow";
|
|
7
7
|
import { asFiniteNumber, cellMatchesFilterValue, checkCitationAssertion, checkValueAssertion } from "./assert-rules.js";
|
|
8
|
-
import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, } from "./reference-resolver.js";
|
|
8
|
+
import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, snapshotRows, } from "./reference-resolver.js";
|
|
9
9
|
/** Build an `Err` that carries the unresolved reference. The `detail` key is present only when there is a detail to carry. */
|
|
10
10
|
function fail(reference, reason, detail) {
|
|
11
11
|
const failure = detail !== undefined ? { reference, reason, detail } : { reference, reason };
|
|
@@ -27,46 +27,61 @@ function resolveArtifactValue(reference, snapshot) {
|
|
|
27
27
|
// cell that no real artifact holds. Thus the refusal comes before the read of the rows.
|
|
28
28
|
const valueFileType = artifact.fileType;
|
|
29
29
|
if (fileTypeHoldsNoCell(valueFileType)) {
|
|
30
|
-
return fail(reference, "unreadable-artifact", `the ${valueFileType} at ${reference.path} holds no cell to read`);
|
|
30
|
+
return fail(reference, "unreadable-artifact", `the ${String(valueFileType)} at ${reference.path} holds no cell to read`);
|
|
31
31
|
}
|
|
32
32
|
// An artifact with no rows is pinned whole, thus it addresses no cell and every locator over it lands
|
|
33
33
|
// out of range.
|
|
34
|
-
const
|
|
34
|
+
const readRows = snapshotRows(artifact);
|
|
35
|
+
if (readRows.isErr()) {
|
|
36
|
+
return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
|
|
37
|
+
}
|
|
38
|
+
const rows = readRows.value;
|
|
35
39
|
const locator = reference.locator;
|
|
36
40
|
let selectedRow;
|
|
37
41
|
if (locator.row !== undefined) {
|
|
38
|
-
|
|
42
|
+
const row = rows[locator.row];
|
|
43
|
+
if (row === undefined) {
|
|
39
44
|
return fail(reference, "locator-out-of-range", `row ${locator.row} is outside the ${rows.length} rows`);
|
|
40
45
|
}
|
|
41
|
-
selectedRow =
|
|
46
|
+
selectedRow = row;
|
|
42
47
|
}
|
|
43
48
|
else if (locator.rowFilter !== undefined) {
|
|
44
49
|
const filter = locator.rowFilter;
|
|
45
50
|
const matches = rows.filter((row) => cellMatchesFilterValue(row[filter.column], filter.value));
|
|
46
|
-
|
|
51
|
+
const match = matches[0];
|
|
52
|
+
if (match === undefined) {
|
|
47
53
|
return fail(reference, "locator-out-of-range", `no row where ${filter.column} equals ${String(filter.value)}`);
|
|
48
54
|
}
|
|
49
55
|
if (matches.length > 1) {
|
|
50
56
|
return fail(reference, "ambiguous-match", `${matches.length} rows where ${filter.column} equals ${String(filter.value)}`);
|
|
51
57
|
}
|
|
52
|
-
selectedRow =
|
|
58
|
+
selectedRow = match;
|
|
53
59
|
}
|
|
54
60
|
else {
|
|
55
61
|
// The locator schema forbids a locator with neither selector. The resolver cannot depend on a
|
|
56
62
|
// prior parse, thus it treats a row that no selector addresses as out of range.
|
|
57
63
|
return fail(reference, "locator-out-of-range", "the locator selects no row");
|
|
58
64
|
}
|
|
59
|
-
// A real table holds an empty cell, and
|
|
60
|
-
// `
|
|
61
|
-
//
|
|
62
|
-
//
|
|
65
|
+
// A real table holds an empty cell, and the snapshot parser gives it back as an absent
|
|
66
|
+
// key: `snapshotRows` drops a cell that parsed as `null` or `undefined`, so an absent key
|
|
67
|
+
// is the only absence. It is not a value that a scalar reference can bind. An empty
|
|
68
|
+
// string is a value, thus it stays valid.
|
|
63
69
|
const cell = selectedRow[locator.column];
|
|
64
|
-
if (cell === undefined
|
|
70
|
+
if (cell === undefined) {
|
|
65
71
|
return fail(reference, "locator-out-of-range", `column ${locator.column} holds no value in the selected row`);
|
|
66
72
|
}
|
|
67
73
|
const valueFailure = checkValueAssertion(reference, reference.assert?.value, reference.assert?.tolerance, cell);
|
|
68
74
|
return valueFailure !== undefined ? err(valueFailure) : ok({ type: "scalar", value: cell });
|
|
69
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Put one own data property on a projected row.
|
|
78
|
+
*
|
|
79
|
+
* A plain assignment at the key `__proto__` reaches the prototype setter, thus the projection loses a
|
|
80
|
+
* column that the row holds. The definition makes an own data property for each key.
|
|
81
|
+
*/
|
|
82
|
+
function defineOwn(target, key, value) {
|
|
83
|
+
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
84
|
+
}
|
|
70
85
|
function resolveArtifactTable(reference, snapshot) {
|
|
71
86
|
const artifact = snapshotEntry(snapshot, reference.path);
|
|
72
87
|
if (artifact === undefined) {
|
|
@@ -77,13 +92,17 @@ function resolveArtifactTable(reference, snapshot) {
|
|
|
77
92
|
}
|
|
78
93
|
const tableFileType = artifact.fileType;
|
|
79
94
|
if (fileTypeHoldsNoCell(tableFileType)) {
|
|
80
|
-
return fail(reference, "unreadable-artifact", `the ${tableFileType} at ${reference.path} holds no cell to read`);
|
|
95
|
+
return fail(reference, "unreadable-artifact", `the ${String(tableFileType)} at ${reference.path} holds no cell to read`);
|
|
81
96
|
}
|
|
82
97
|
// The bound ranks the rows as the artifact holds them, thus a bound over a column that the subset
|
|
83
98
|
// below leaves out still ranks them. An unknown bound column addresses nothing, exactly as an unknown
|
|
84
99
|
// subset column does.
|
|
85
100
|
const bound = reference.rowBound;
|
|
86
|
-
const
|
|
101
|
+
const readRows = snapshotRows(artifact);
|
|
102
|
+
if (readRows.isErr()) {
|
|
103
|
+
return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
|
|
104
|
+
}
|
|
105
|
+
const allRows = readRows.value;
|
|
87
106
|
if (bound !== undefined && columnsHeldByNoRow(allRows, [bound.column]).length > 0) {
|
|
88
107
|
return fail(reference, "locator-out-of-range", `the row bound names column ${bound.column}, which the table at ${reference.path} does not hold`);
|
|
89
108
|
}
|
|
@@ -107,8 +126,9 @@ function resolveArtifactTable(reference, snapshot) {
|
|
|
107
126
|
const projectedRows = rows.map((row) => {
|
|
108
127
|
const projected = {};
|
|
109
128
|
for (const column of columns) {
|
|
110
|
-
|
|
111
|
-
|
|
129
|
+
const cell = row[column];
|
|
130
|
+
if (cell !== undefined) {
|
|
131
|
+
defineOwn(projected, column, cell);
|
|
112
132
|
}
|
|
113
133
|
}
|
|
114
134
|
return projected;
|
|
@@ -145,6 +165,9 @@ async function resolveDerivation(reference, snapshot) {
|
|
|
145
165
|
}
|
|
146
166
|
const a = numbers[0];
|
|
147
167
|
const b = numbers[1];
|
|
168
|
+
if (a === undefined || b === undefined) {
|
|
169
|
+
return fail(reference, "locator-out-of-range", `operation ${reference.op} needs two inputs, and the derivation holds ${numbers.length}`);
|
|
170
|
+
}
|
|
148
171
|
let result;
|
|
149
172
|
switch (reference.op) {
|
|
150
173
|
case "ratio":
|
|
@@ -31,13 +31,13 @@ export type PinSnapshotError = {
|
|
|
31
31
|
cause: unknown;
|
|
32
32
|
};
|
|
33
33
|
/** The construction options of the pin. */
|
|
34
|
-
export
|
|
34
|
+
export type PinReportSnapshotOptions = {
|
|
35
35
|
/**
|
|
36
36
|
* The workspace-root seam of the caller. The citation evidence sits on disk, thus a composition
|
|
37
37
|
* that binds no seam pins the artifact map alone.
|
|
38
38
|
*/
|
|
39
39
|
readonly resolveWorkspaceRoot?: ResolveWorkspaceRoot;
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
/**
|
|
42
42
|
* Pin the snapshot of one analysis from the artifact ledger and from the synthesis records of its runs.
|
|
43
43
|
*
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { err, ok } from "neverthrow";
|
|
20
20
|
import { readSynthesisText } from "../execution/run-synthesis.js";
|
|
21
|
+
import { parseJsonAs } from "../lib/parse-json.js";
|
|
22
|
+
import { parseUnknownRecord, UnknownRecordSchema } from "../lib/unknown-containers.js";
|
|
23
|
+
import { nullProtoRecord } from "../lib/null-proto.js";
|
|
21
24
|
import { queryAnalysisArtifacts } from "../state/artifacts.js";
|
|
22
25
|
import { queryRunsByAnalysis } from "../state/runs.js";
|
|
23
26
|
/** The page size of the run listing. The listing walks the pages until a short page ends the walk. */
|
|
@@ -56,16 +59,17 @@ function pushPmidCitations(list, entries) {
|
|
|
56
59
|
return;
|
|
57
60
|
}
|
|
58
61
|
for (const reference of list) {
|
|
59
|
-
|
|
62
|
+
const fields = parseUnknownRecord(reference);
|
|
63
|
+
if (fields === undefined) {
|
|
60
64
|
continue;
|
|
61
65
|
}
|
|
62
|
-
const pmid =
|
|
66
|
+
const pmid = fields.pmid;
|
|
63
67
|
if (typeof pmid !== "string") {
|
|
64
68
|
continue;
|
|
65
69
|
}
|
|
66
70
|
const id = pmid.trim();
|
|
67
71
|
if (id.length > 0) {
|
|
68
|
-
const record = recordOf(
|
|
72
|
+
const record = recordOf(fields);
|
|
69
73
|
entries.push(record === undefined ? { key: `pmid:${id}` } : { key: `pmid:${id}`, record });
|
|
70
74
|
}
|
|
71
75
|
}
|
|
@@ -83,25 +87,23 @@ function pushPmidCitations(list, entries) {
|
|
|
83
87
|
* description sits there.
|
|
84
88
|
*/
|
|
85
89
|
function citationsOf(text) {
|
|
86
|
-
let
|
|
90
|
+
let fields;
|
|
87
91
|
try {
|
|
88
|
-
|
|
92
|
+
fields = parseJsonAs(text, UnknownRecordSchema);
|
|
89
93
|
}
|
|
90
94
|
catch {
|
|
91
95
|
return [];
|
|
92
96
|
}
|
|
93
|
-
if (typeof parsed !== "object" || parsed === null) {
|
|
94
|
-
return [];
|
|
95
|
-
}
|
|
96
97
|
const entries = [];
|
|
97
|
-
pushPmidCitations(
|
|
98
|
-
const findings =
|
|
98
|
+
pushPmidCitations(fields.keyReferences, entries);
|
|
99
|
+
const findings = fields.findings;
|
|
99
100
|
if (Array.isArray(findings)) {
|
|
100
101
|
for (const finding of findings) {
|
|
101
|
-
|
|
102
|
+
const findingFields = parseUnknownRecord(finding);
|
|
103
|
+
if (findingFields === undefined) {
|
|
102
104
|
continue;
|
|
103
105
|
}
|
|
104
|
-
pushPmidCitations(
|
|
106
|
+
pushPmidCitations(findingFields.references, entries);
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
return entries;
|
|
@@ -165,9 +167,7 @@ export async function pinReportSnapshot(pool, analysisId, options = {}) {
|
|
|
165
167
|
const ledgerRows = await queryAnalysisArtifacts(pool, analysisId);
|
|
166
168
|
if (ledgerRows.isErr())
|
|
167
169
|
return err({ kind: "ledger-read-failed", cause: ledgerRows.error.cause });
|
|
168
|
-
|
|
169
|
-
// entry, thus no path collides with a prototype slot.
|
|
170
|
-
const artifacts = Object.create(null);
|
|
170
|
+
const artifacts = nullProtoRecord();
|
|
171
171
|
for (const row of ledgerRows.value) {
|
|
172
172
|
artifacts[row.path] = { hash: row.hash, fileType: row.fileType };
|
|
173
173
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* executable specification of the value tier. The two realizations are substitutable behind the seam.
|
|
19
19
|
*/
|
|
20
20
|
import { type Result } from "neverthrow";
|
|
21
|
-
import type {
|
|
21
|
+
import type { SuspendingRefusal } from "../sandbox/sandbox-error.js";
|
|
22
22
|
import { type ReferenceResolver } from "./reference-resolver.js";
|
|
23
23
|
/** One artifact row, as plain cells. A text-backed format holds a numeric column as a string. */
|
|
24
24
|
type Row = Record<string, string | number>;
|
|
@@ -29,27 +29,27 @@ type Row = Record<string, string | number>;
|
|
|
29
29
|
* `format` carries the reader that the host decided. The arm never derives a reader from the extension,
|
|
30
30
|
* thus the host arm and the sandbox arm can never read one file two ways.
|
|
31
31
|
*/
|
|
32
|
-
export
|
|
32
|
+
export type ExtractionRequest = {
|
|
33
33
|
readonly path: string;
|
|
34
34
|
readonly hash: string;
|
|
35
35
|
readonly format: TabularFormat;
|
|
36
|
-
}
|
|
36
|
+
};
|
|
37
37
|
/** The rows that the extraction arm read for one artifact. Downstream the rows share the host path logic. */
|
|
38
|
-
export
|
|
38
|
+
export type ExtractionArtifact = {
|
|
39
39
|
readonly rows: Array<Record<string, string | number>>;
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
/**
|
|
42
42
|
* The out-of-process read arm. One `extract` call covers every fall-through artifact of one document
|
|
43
43
|
* pass. The result maps each requested path to its rows. A path that the arm could not read is absent
|
|
44
|
-
* from the map, and the reference at that path fails as `unreadable-artifact`. A
|
|
45
|
-
* the `err`, and each reference of the batch reports its reason.
|
|
44
|
+
* from the map, and the reference at that path fails as `unreadable-artifact`. A refusal of the sandbox of the
|
|
45
|
+
* pass with the suspend flag is the `err`, and each reference of the batch reports its reason.
|
|
46
46
|
*
|
|
47
47
|
* The arm is a seam, thus a test stubs it. While no realization is wired, a fall-through reference fails
|
|
48
48
|
* with `extraction-unavailable`, and the detail names the absent arm.
|
|
49
49
|
*/
|
|
50
|
-
export
|
|
51
|
-
extract(requests: readonly ExtractionRequest[]): Promise<Result<ReadonlyMap<string, ExtractionArtifact>,
|
|
52
|
-
}
|
|
50
|
+
export type ExtractionArm = {
|
|
51
|
+
extract(requests: readonly ExtractionRequest[]): Promise<Result<ReadonlyMap<string, ExtractionArtifact>, SuspendingRefusal>>;
|
|
52
|
+
};
|
|
53
53
|
/**
|
|
54
54
|
* The disk facts of one artifact that outlive one resolver.
|
|
55
55
|
*
|
|
@@ -58,11 +58,11 @@ export interface ExtractionArm {
|
|
|
58
58
|
* read again. `rows` is present only for a clean read, because a read fault is transient and it must not
|
|
59
59
|
* stick to the analysis.
|
|
60
60
|
*/
|
|
61
|
-
export
|
|
61
|
+
export type ArtifactRead = {
|
|
62
62
|
readonly signature: string;
|
|
63
63
|
readonly hash: string;
|
|
64
64
|
readonly rows?: Array<Record<string, string | number>>;
|
|
65
|
-
}
|
|
65
|
+
};
|
|
66
66
|
/**
|
|
67
67
|
* The read cache of one analysis. It holds what a read of the bytes costs: the streamed hash, and the rows
|
|
68
68
|
* of a file that the host could not parse in process. Two resolvers of one analysis share one cache, thus a
|
|
@@ -71,14 +71,14 @@ export interface ArtifactRead {
|
|
|
71
71
|
* The cache holds no authorization and no session value. Each resolver still binds its own extraction arm
|
|
72
72
|
* over the auth of its own call.
|
|
73
73
|
*/
|
|
74
|
-
export
|
|
74
|
+
export type ArtifactReadCache = {
|
|
75
75
|
get(absolutePath: string): ArtifactRead | undefined;
|
|
76
76
|
set(absolutePath: string, read: ArtifactRead): void;
|
|
77
|
-
}
|
|
77
|
+
};
|
|
78
78
|
/** The read caches that the host process holds, one for each recent analysis. */
|
|
79
|
-
export
|
|
79
|
+
export type ArtifactReadStore = {
|
|
80
80
|
forAnalysis(analysisId: string): ArtifactReadCache;
|
|
81
|
-
}
|
|
81
|
+
};
|
|
82
82
|
/**
|
|
83
83
|
* Make the read store of the report path. One host process serves many analyses, thus the store bounds both
|
|
84
84
|
* dimensions: how many analyses it holds, and how many artifacts one analysis holds. A dropped entry costs
|
|
@@ -93,13 +93,13 @@ export declare function createArtifactReadStore(): ArtifactReadStore;
|
|
|
93
93
|
* `extractionArm` is optional, because no sandbox realization is wired yet. `readCache` is optional, thus a
|
|
94
94
|
* resolver with no cache reads every artifact itself and its reads die with it.
|
|
95
95
|
*/
|
|
96
|
-
export
|
|
96
|
+
export type ProductionResolverDeps = {
|
|
97
97
|
readonly workspaceRoot: string;
|
|
98
98
|
readonly analysisId: string;
|
|
99
99
|
readonly cap?: number;
|
|
100
100
|
readonly extractionArm?: ExtractionArm;
|
|
101
101
|
readonly readCache?: ArtifactReadCache;
|
|
102
|
-
}
|
|
102
|
+
};
|
|
103
103
|
/**
|
|
104
104
|
* The tabular formats that the host fast path reads. The host decides which one a file is, one time, and it
|
|
105
105
|
* carries the decision to the extraction arm. Another extension names no format at all.
|
|
@@ -21,8 +21,11 @@ import { err, ok } from "neverthrow";
|
|
|
21
21
|
import { readFile, stat } from "node:fs/promises";
|
|
22
22
|
import { extname } from "node:path";
|
|
23
23
|
import { parquetReadObjects } from "hyparquet";
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
import { isWorkflowCancellation } from "../runtime/dbos.js";
|
|
24
26
|
import { allWithConcurrency } from "../lib/async-utils.js";
|
|
25
27
|
import { computeSha256File } from "../lib/fs-helpers.js";
|
|
28
|
+
import { parseJsonAs } from "../lib/parse-json.js";
|
|
26
29
|
import { resolveWorkspacePath } from "../workspace/paths.js";
|
|
27
30
|
import { asFiniteNumber, cellMatchesFilterValue, checkCitationAssertion, checkValueAssertion } from "./assert-rules.js";
|
|
28
31
|
import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, } from "./reference-resolver.js";
|
|
@@ -175,7 +178,7 @@ function parseRecords(text, delimiter) {
|
|
|
175
178
|
i += 1;
|
|
176
179
|
let closed = false;
|
|
177
180
|
while (i < n) {
|
|
178
|
-
const ch = text
|
|
181
|
+
const ch = text.charAt(i);
|
|
179
182
|
if (ch === '"') {
|
|
180
183
|
if (text[i + 1] === '"') {
|
|
181
184
|
field += '"';
|
|
@@ -201,7 +204,7 @@ function parseRecords(text, delimiter) {
|
|
|
201
204
|
}
|
|
202
205
|
else {
|
|
203
206
|
while (i < n) {
|
|
204
|
-
const ch = text
|
|
207
|
+
const ch = text.charAt(i);
|
|
205
208
|
if (ch === delimiter || ch === "\r" || ch === "\n") {
|
|
206
209
|
break;
|
|
207
210
|
}
|
|
@@ -241,10 +244,10 @@ export function parseDelimited(text, delimiter) {
|
|
|
241
244
|
if (records === undefined) {
|
|
242
245
|
return undefined;
|
|
243
246
|
}
|
|
244
|
-
|
|
247
|
+
const header = records[0];
|
|
248
|
+
if (header === undefined) {
|
|
245
249
|
return [];
|
|
246
250
|
}
|
|
247
|
-
const header = records[0];
|
|
248
251
|
const seen = new Set();
|
|
249
252
|
for (const name of header) {
|
|
250
253
|
if (seen.has(name)) {
|
|
@@ -253,8 +256,7 @@ export function parseDelimited(text, delimiter) {
|
|
|
253
256
|
seen.add(name);
|
|
254
257
|
}
|
|
255
258
|
const rows = [];
|
|
256
|
-
for (
|
|
257
|
-
const fields = records[r];
|
|
259
|
+
for (const fields of records.slice(1)) {
|
|
258
260
|
// A blank line parses as one empty field, thus the walk drops it and reads no dialect into it. A
|
|
259
261
|
// record with more than one field, or one non-empty field, still obeys the count check, thus a
|
|
260
262
|
// genuinely ragged record falls through.
|
|
@@ -265,39 +267,36 @@ export function parseDelimited(text, delimiter) {
|
|
|
265
267
|
return undefined;
|
|
266
268
|
}
|
|
267
269
|
const row = {};
|
|
268
|
-
for (
|
|
269
|
-
|
|
270
|
+
for (const [c, name] of header.entries()) {
|
|
271
|
+
const value = fields[c];
|
|
272
|
+
if (value !== undefined) {
|
|
273
|
+
row[name] = value;
|
|
274
|
+
}
|
|
270
275
|
}
|
|
271
276
|
rows.push(row);
|
|
272
277
|
}
|
|
273
278
|
return rows;
|
|
274
279
|
}
|
|
280
|
+
/** A cell of a JSON table: the scalars JSON carries. A non-finite number stays a cell — `JSON.parse`
|
|
281
|
+
* reads an over-large literal as Infinity, and the coercion drops it. A nested value is structural doubt. */
|
|
282
|
+
const JsonTableCell = z.custom((cell) => cell === null || typeof cell === "number" || typeof cell === "string" || typeof cell === "boolean");
|
|
275
283
|
/**
|
|
276
|
-
* Parse a JSON file into rows. The strict shape is an array of flat objects. A parse
|
|
277
|
-
* value that is not an array, and a nested cell are structural doubt, thus each gives
|
|
278
|
-
* the file falls through.
|
|
284
|
+
* Parse a JSON file into rows. The strict shape is an array of flat objects with scalar cells. A parse
|
|
285
|
+
* fault, a top-level value that is not an array, and a nested cell are structural doubt, thus each gives
|
|
286
|
+
* back `undefined` and the file falls through.
|
|
279
287
|
*/
|
|
280
288
|
function parseJsonTable(text) {
|
|
281
|
-
let
|
|
289
|
+
let table;
|
|
282
290
|
try {
|
|
283
|
-
|
|
291
|
+
table = parseJsonAs(text, z.array(z.record(z.string(), JsonTableCell)));
|
|
284
292
|
}
|
|
285
293
|
catch {
|
|
286
294
|
return undefined;
|
|
287
295
|
}
|
|
288
|
-
if (!Array.isArray(value)) {
|
|
289
|
-
return undefined;
|
|
290
|
-
}
|
|
291
296
|
const rows = [];
|
|
292
|
-
for (const
|
|
293
|
-
if (item === null || typeof item !== "object" || Array.isArray(item)) {
|
|
294
|
-
return undefined;
|
|
295
|
-
}
|
|
297
|
+
for (const fields of table) {
|
|
296
298
|
const row = {};
|
|
297
|
-
for (const [key, cell] of Object.entries(
|
|
298
|
-
if (cell !== null && typeof cell === "object") {
|
|
299
|
-
return undefined;
|
|
300
|
-
}
|
|
299
|
+
for (const [key, cell] of Object.entries(fields)) {
|
|
301
300
|
const coerced = coerceCell(cell);
|
|
302
301
|
if (coerced !== undefined) {
|
|
303
302
|
row[key] = coerced;
|
|
@@ -441,9 +440,12 @@ async function extractFallThrough(arm, requests) {
|
|
|
441
440
|
try {
|
|
442
441
|
answered = await arm.extract(requests.map((request) => ({ path: request.path, hash: request.hash, format: request.format })));
|
|
443
442
|
}
|
|
444
|
-
catch {
|
|
443
|
+
catch (cause) {
|
|
445
444
|
// The arm speaks the throw protocol for a genuine infrastructure fault. This boundary turns the
|
|
446
|
-
// throw into a value, thus each reference on the batch reads a failure as data.
|
|
445
|
+
// throw into a value, thus each reference on the batch reads a failure as data. A cancel of the
|
|
446
|
+
// workflow is not a fault of the read, thus it leaves to DBOS with no change.
|
|
447
|
+
if (isWorkflowCancellation(cause))
|
|
448
|
+
throw cause;
|
|
447
449
|
for (const request of requests) {
|
|
448
450
|
out.set(request.path, { kind: "unreadable", detail: `the extraction arm did not read the file at ${request.path}` });
|
|
449
451
|
}
|
|
@@ -453,7 +455,7 @@ async function extractFallThrough(arm, requests) {
|
|
|
453
455
|
for (const request of requests) {
|
|
454
456
|
out.set(request.path, {
|
|
455
457
|
kind: "unavailable",
|
|
456
|
-
detail: `the
|
|
458
|
+
detail: `the host refused the sandbox (${answered.error.reason}), thus the file at ${request.path} was not read`,
|
|
457
459
|
});
|
|
458
460
|
}
|
|
459
461
|
return out;
|
|
@@ -578,7 +580,7 @@ export function createProductionResolver(deps) {
|
|
|
578
580
|
return err({ reference, reason: "hash-mismatch", detail: `expected ${reference.hash} but the artifact hash is ${identity.onDiskHash}` });
|
|
579
581
|
}
|
|
580
582
|
if (fileTypeHoldsNoCell(identity.fileType)) {
|
|
581
|
-
return err({ reference, reason: "unreadable-artifact", detail: `the ${identity.fileType} at ${reference.path} holds no cell to read` });
|
|
583
|
+
return err({ reference, reason: "unreadable-artifact", detail: `the ${String(identity.fileType)} at ${reference.path} holds no cell to read` });
|
|
582
584
|
}
|
|
583
585
|
const cells = await getCells(reference.path, identity);
|
|
584
586
|
if (cells.kind === "unavailable") {
|
|
@@ -594,21 +596,23 @@ export function createProductionResolver(deps) {
|
|
|
594
596
|
const locator = reference.locator;
|
|
595
597
|
let selectedRow;
|
|
596
598
|
if (locator.row !== undefined) {
|
|
597
|
-
|
|
599
|
+
const row = rows[locator.row];
|
|
600
|
+
if (row === undefined) {
|
|
598
601
|
return fail(reference, "locator-out-of-range", `row ${locator.row} is outside the ${rows.length} rows`);
|
|
599
602
|
}
|
|
600
|
-
selectedRow =
|
|
603
|
+
selectedRow = row;
|
|
601
604
|
}
|
|
602
605
|
else if (locator.rowFilter !== undefined) {
|
|
603
606
|
const filter = locator.rowFilter;
|
|
604
607
|
const matches = rows.filter((row) => cellMatchesFilterValue(row[filter.column], filter.value));
|
|
605
|
-
|
|
608
|
+
const match = matches[0];
|
|
609
|
+
if (match === undefined) {
|
|
606
610
|
return fail(reference, "locator-out-of-range", `no row where ${filter.column} equals ${String(filter.value)}`);
|
|
607
611
|
}
|
|
608
612
|
if (matches.length > 1) {
|
|
609
613
|
return fail(reference, "ambiguous-match", `${matches.length} rows where ${filter.column} equals ${String(filter.value)}`);
|
|
610
614
|
}
|
|
611
|
-
selectedRow =
|
|
615
|
+
selectedRow = match;
|
|
612
616
|
}
|
|
613
617
|
else {
|
|
614
618
|
// The locator schema forbids a locator with neither selector. The resolver cannot depend on a
|
|
@@ -617,8 +621,10 @@ export function createProductionResolver(deps) {
|
|
|
617
621
|
}
|
|
618
622
|
// A real table holds an empty cell, and a parse gives it back as an absent key. An absent key is
|
|
619
623
|
// not a value that a scalar reference can bind. An empty string is a value, thus it stays valid.
|
|
624
|
+
// A cell that parsed as `null` never lands in a row: `coerceCell` drops it, so `null` is not
|
|
625
|
+
// an absence the resolver can meet here.
|
|
620
626
|
const cell = selectedRow[locator.column];
|
|
621
|
-
if (cell === undefined
|
|
627
|
+
if (cell === undefined) {
|
|
622
628
|
return fail(reference, "locator-out-of-range", `column ${locator.column} holds no value in the selected row`);
|
|
623
629
|
}
|
|
624
630
|
const valueFailure = checkValueAssertion(reference, reference.assert?.value, reference.assert?.tolerance, cell);
|
|
@@ -660,8 +666,9 @@ export function createProductionResolver(deps) {
|
|
|
660
666
|
const projectedRows = rows.map((row) => {
|
|
661
667
|
const projected = {};
|
|
662
668
|
for (const column of columns) {
|
|
663
|
-
|
|
664
|
-
|
|
669
|
+
const cell = row[column];
|
|
670
|
+
if (cell !== undefined) {
|
|
671
|
+
projected[column] = cell;
|
|
665
672
|
}
|
|
666
673
|
}
|
|
667
674
|
return projected;
|
|
@@ -701,6 +708,9 @@ export function createProductionResolver(deps) {
|
|
|
701
708
|
}
|
|
702
709
|
const a = numbers[0];
|
|
703
710
|
const b = numbers[1];
|
|
711
|
+
if (a === undefined || b === undefined) {
|
|
712
|
+
return fail(reference, "locator-out-of-range", `operation ${reference.op} needs two inputs, and the derivation holds ${numbers.length}`);
|
|
713
|
+
}
|
|
704
714
|
let result;
|
|
705
715
|
switch (reference.op) {
|
|
706
716
|
case "ratio":
|
|
@@ -764,9 +774,9 @@ export function createProductionResolver(deps) {
|
|
|
764
774
|
}
|
|
765
775
|
// Compute the identity of each path, one read each, under the fan-out bound.
|
|
766
776
|
const entries = [...byPath.entries()];
|
|
767
|
-
const
|
|
768
|
-
for (
|
|
769
|
-
idCache.set(
|
|
777
|
+
const identityPairs = await allWithConcurrency(entries.map(([path]) => async () => ({ path, identity: await computeIdentity(workspaceRoot, analysisId, path, snapshot, readCache) })), PREPARE_CONCURRENCY);
|
|
778
|
+
for (const { path, identity } of identityPairs) {
|
|
779
|
+
idCache.set(path, identity);
|
|
770
780
|
}
|
|
771
781
|
// Read cells for each cell-reading path whose on-disk hash matches an expected pin. A hash that no
|
|
772
782
|
// pin expects means every reference at the path mismatches, thus no parse runs on a drifted file.
|
|
@@ -789,14 +799,12 @@ export function createProductionResolver(deps) {
|
|
|
789
799
|
pending.push(target);
|
|
790
800
|
}
|
|
791
801
|
}
|
|
792
|
-
const reads = await allWithConcurrency(pending.map((target) => () => hostReadCells(cap, target.path, target.identity)), PREPARE_CONCURRENCY);
|
|
802
|
+
const reads = await allWithConcurrency(pending.map((target) => async () => ({ target, read: await hostReadCells(cap, target.path, target.identity) })), PREPARE_CONCURRENCY);
|
|
793
803
|
// Split the clean reads from the fall-throughs, then resolve every fall-through in one arm call. An
|
|
794
804
|
// unsupported format reaches no arm, because no reader is decided for it.
|
|
795
805
|
const fallThrough = [];
|
|
796
806
|
const identityByPath = new Map();
|
|
797
|
-
for (
|
|
798
|
-
const target = pending[t];
|
|
799
|
-
const read = reads[t];
|
|
807
|
+
for (const { target, read } of reads) {
|
|
800
808
|
if (read.kind === "rows") {
|
|
801
809
|
cellsCache.set(target.path, { kind: "rows", rows: read.rows });
|
|
802
810
|
shareRows(readCache, target.identity, read.rows);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* belief points at. The harness declares the seam here, thus a production realization can read storage,
|
|
6
6
|
* and a fixture realization can read an in-memory snapshot. The two obey the same contract.
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type Result } from "neverthrow";
|
|
9
9
|
import type { Reference, RowBound, UnresolvedReference } from "../contracts/report-reference.js";
|
|
10
10
|
/**
|
|
11
11
|
* One pinned artifact: its content hash, and its rows as plain cells.
|
|
@@ -15,6 +15,9 @@ import type { Reference, RowBound, UnresolvedReference } from "../contracts/repo
|
|
|
15
15
|
* skip a type inference pass, and resolution compares a numeral by its numeric value and never by its
|
|
16
16
|
* JavaScript type.
|
|
17
17
|
*
|
|
18
|
+
* A real parser gives an empty cell back as an absent key, `undefined`, or `null`, and a row admits all
|
|
19
|
+
* three. `snapshotRows` parses an entry's rows into the present cells that the resolution reads.
|
|
20
|
+
*
|
|
18
21
|
* `rows` is optional because an image is pinned by its hash alone and holds no cells. An empty array in
|
|
19
22
|
* that position would say that the artifact holds zero rows, which is a different and false claim. The
|
|
20
23
|
* pin never populates `rows`. `rows` serves the fixture realization only, and that realization resolves
|
|
@@ -26,19 +29,32 @@ import type { Reference, RowBound, UnresolvedReference } from "../contracts/repo
|
|
|
26
29
|
* `figure`, `script`, `log`, `notebook`, and `output`. Thus the field can refuse a kind of reference, and
|
|
27
30
|
* it can never confirm one. An `output` covers a table and an image alike.
|
|
28
31
|
*/
|
|
29
|
-
export
|
|
32
|
+
export type ArtifactSnapshot = {
|
|
30
33
|
hash: string;
|
|
31
34
|
fileType?: string | null;
|
|
32
|
-
rows?: Array<Record<string, string | number>>;
|
|
33
|
-
}
|
|
35
|
+
rows?: Array<Record<string, string | number | null | undefined>>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Give back the present cells of a snapshot entry's rows, or an empty array for an entry with no rows.
|
|
39
|
+
*
|
|
40
|
+
* The structural tier and the fixture resolver both read this one parse. Thus the two tiers can never
|
|
41
|
+
* disagree about the rows of one entry.
|
|
42
|
+
*
|
|
43
|
+
* A real parser gives an empty cell back as an absent key, `undefined`, or `null`; the parse admits each
|
|
44
|
+
* and yields the present cells, so the reads below see one absence shape only. The `Err` channel carries
|
|
45
|
+
* the account of a row that the artifact forbids: an entry of the rows list that is not a record, or a
|
|
46
|
+
* cell that is neither a string nor a number. The caller refuses the reference through its own channel,
|
|
47
|
+
* so a malformed row never throws out of resolution.
|
|
48
|
+
*/
|
|
49
|
+
export declare function snapshotRows(entry: ArtifactSnapshot | undefined): Result<Array<Record<string, string | number>>, string>;
|
|
34
50
|
/**
|
|
35
51
|
* One pinned citation record: the short citation of the paper, and the description that the synthesis
|
|
36
52
|
* gave. The record is the bibliography of a citation key, and the key alone states the membership.
|
|
37
53
|
*/
|
|
38
|
-
export
|
|
54
|
+
export type CitationRecord = {
|
|
39
55
|
citation: string;
|
|
40
56
|
description?: string;
|
|
41
|
-
}
|
|
57
|
+
};
|
|
42
58
|
/** The pinned citation records, keyed by the citation key, for example `pmid:12345`. */
|
|
43
59
|
export type CitationRecords = Record<string, CitationRecord>;
|
|
44
60
|
/**
|
|
@@ -51,11 +67,11 @@ export type CitationRecords = Record<string, CitationRecord>;
|
|
|
51
67
|
* membership role, thus a key with no record is a pinned citation and a stored pin with no map reads the
|
|
52
68
|
* same as one that predates the map.
|
|
53
69
|
*/
|
|
54
|
-
export
|
|
70
|
+
export type ReportSnapshot = {
|
|
55
71
|
artifacts: Record<string, ArtifactSnapshot>;
|
|
56
72
|
citations?: string[];
|
|
57
73
|
citationRecords?: CitationRecords;
|
|
58
|
-
}
|
|
74
|
+
};
|
|
59
75
|
/**
|
|
60
76
|
* The concrete value that a reference resolves to. A scalar comes from one artifact cell or one
|
|
61
77
|
* derivation. A table comes from a whole-table artifact. A file echoes the pin of a whole-file artifact,
|
|
@@ -97,10 +113,10 @@ export type ResolvedValue = {
|
|
|
97
113
|
* `resolve` then answers from the cache. The method is optional, thus a realization without it keeps the
|
|
98
114
|
* per-reference behavior and the extension breaks no caller.
|
|
99
115
|
*/
|
|
100
|
-
export
|
|
116
|
+
export type ReferenceResolver = {
|
|
101
117
|
resolve(reference: Reference, snapshot: ReportSnapshot): Promise<Result<ResolvedValue, UnresolvedReference>>;
|
|
102
118
|
prepare?(references: readonly Reference[], snapshot: ReportSnapshot): Promise<void>;
|
|
103
|
-
}
|
|
119
|
+
};
|
|
104
120
|
/**
|
|
105
121
|
* Give back each name in `columns` that no row holds, in the order of `columns`.
|
|
106
122
|
*
|