@inflexa-ai/harness 0.45.1 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +306 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +32 -7
- package/dist/lib/hooks.js +22 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +160 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +39 -0
- package/dist/loop/turn-credentials.js +90 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/request-headers.js +12 -3
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +62 -0
- package/dist/testing.js +101 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -115,6 +115,7 @@ const GENE_LINE_PLACE = 0.25;
|
|
|
115
115
|
const GENE_CHARACTER_SHARE = 0.6;
|
|
116
116
|
const GENE_GAP_CHARACTERS = 1;
|
|
117
117
|
/** The trailing unit of a declared position label, which the megabase axis replaces. */
|
|
118
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the declared unit suffix (bp, base pairs, kb, Mb) in its parenthesised form, stripped with the whitespace around it.
|
|
118
119
|
const POSITION_UNIT = /\s*\((bp|base pairs|kb|Mb)\)\s*$/i;
|
|
119
120
|
function deriveLocusZoom(block, rows, context) {
|
|
120
121
|
const columns = locusColumns(block, rows, context);
|
|
@@ -124,16 +125,16 @@ function deriveLocusZoom(block, rows, context) {
|
|
|
124
125
|
const xs = rows.map((row) => toNumber(row[position]));
|
|
125
126
|
const faulty = xs.findIndex((x) => x === null);
|
|
126
127
|
if (faulty >= 0) {
|
|
127
|
-
return err(chartProblem(context.blockId, `The locuszoom reads the "${position}" column as a position in base pairs, and row ${faulty + 1} holds "${String(rows[faulty][position] ?? "")}", which is not a number.`));
|
|
128
|
+
return err(chartProblem(context.blockId, `The locuszoom reads the "${position}" column as a position in base pairs, and row ${faulty + 1} holds "${String(rows[faulty]?.[position] ?? "")}", which is not a number.`));
|
|
128
129
|
}
|
|
129
130
|
const chromosomes = chromosome === undefined ? [] : distinctNames(rows, chromosome);
|
|
130
131
|
if (chromosomes.length > 1) {
|
|
131
|
-
return err(chartProblem(context.blockId, `The locuszoom draws one region of one chromosome, and the "${chromosome}" column holds "${chromosomes[0]}" and "${chromosomes[1]}".`));
|
|
132
|
+
return err(chartProblem(context.blockId, `The locuszoom draws one region of one chromosome, and the "${String(chromosome)}" column holds "${String(chromosomes[0])}" and "${String(chromosomes[1])}".`));
|
|
132
133
|
}
|
|
133
134
|
const r2s = rows.map((row) => toNumber(row[r2]));
|
|
134
135
|
const outside = r2s.findIndex((value) => value !== null && (value < 0 || value > 1));
|
|
135
136
|
if (outside >= 0) {
|
|
136
|
-
return err(chartProblem(context.blockId, `The locuszoom reads the "${r2}" column as the r² with the lead variant, and row ${outside + 1} holds ${r2s[outside]}, which is outside 0 to 1.`));
|
|
137
|
+
return err(chartProblem(context.blockId, `The locuszoom reads the "${r2}" column as the r² with the lead variant, and row ${outside + 1} holds ${String(r2s[outside])}, which is outside 0 to 1.`));
|
|
137
138
|
}
|
|
138
139
|
const line = -Math.log10(MANHATTAN_P_THRESHOLD);
|
|
139
140
|
const finite = transformColumn(rows, p, "neg_log10");
|
|
@@ -151,7 +152,7 @@ function deriveLocusZoom(block, rows, context) {
|
|
|
151
152
|
const lanes = genes.value === undefined ? 0 : Math.max(1, (largest(genes.value.map((gene) => gene.lane)) ?? 0) + 1);
|
|
152
153
|
const composition = {
|
|
153
154
|
series: [
|
|
154
|
-
{ form: "scatter", encoding: { x: position, y: { column: p, transform: "neg_log10" }, color: r2,
|
|
155
|
+
{ form: "scatter", encoding: { x: position, y: { column: p, transform: "neg_log10" }, color: r2, label } },
|
|
155
156
|
...(rate !== undefined ? [{ form: "line", name: RECOMBINATION_NAME, encoding: { x: position, y: rate } }] : []),
|
|
156
157
|
],
|
|
157
158
|
annotations: [{ kind: "reference-line", axis: "y", value: line }],
|
|
@@ -163,17 +164,17 @@ function deriveLocusZoom(block, rows, context) {
|
|
|
163
164
|
const option = composed.value;
|
|
164
165
|
const [points, recombination] = seriesOf(option);
|
|
165
166
|
const nameOf = (index) => {
|
|
166
|
-
const cell = label === undefined ? undefined : rows[index][label];
|
|
167
|
-
return cell === undefined ||
|
|
167
|
+
const cell = label === undefined ? undefined : rows[index]?.[label];
|
|
168
|
+
return cell === undefined || String(cell).trim() === "" ? undefined : String(cell);
|
|
168
169
|
};
|
|
169
170
|
const item = (index, y) => {
|
|
170
171
|
const name = nameOf(index);
|
|
171
|
-
return {
|
|
172
|
+
return { name, value: [xs[index] ?? 0, y] };
|
|
172
173
|
};
|
|
173
174
|
const missing = [];
|
|
174
175
|
for (let index = 0; index < rows.length; index += 1) {
|
|
175
176
|
const y = finite[index];
|
|
176
|
-
if (r2s[index] === null && y !== null)
|
|
177
|
+
if (r2s[index] === null && y !== null && y !== undefined)
|
|
177
178
|
missing.push(item(index, y));
|
|
178
179
|
}
|
|
179
180
|
const rated = rate === undefined ? [] : ratesInOrder(rows, xs, rate);
|
|
@@ -213,7 +214,7 @@ function deriveLocusZoom(block, rows, context) {
|
|
|
213
214
|
]
|
|
214
215
|
: []),
|
|
215
216
|
...(missing.length > 0 ? [missingSeries(missing)] : []),
|
|
216
|
-
...(zeroRows.length > 0 ? [zeroSeries(zeroRows.map((index) => ({ ...item(index, zeroY), itemStyle: { color: binColor(r2s[index]) } })))] : []),
|
|
217
|
+
...(zeroRows.length > 0 ? [zeroSeries(zeroRows.map((index) => ({ ...item(index, zeroY), itemStyle: { color: binColor(r2s[index] ?? null) } })))] : []),
|
|
217
218
|
tickSeries(window),
|
|
218
219
|
guideSeries(guideText(MANHATTAN_P_THRESHOLD), line, { ys, xs, rated, top, rateTop, window, layout }),
|
|
219
220
|
...(lead !== undefined ? [leadSeries(item(lead, ys[lead] ?? 0))] : []),
|
|
@@ -250,16 +251,20 @@ function locusColumns(block, rows, context) {
|
|
|
250
251
|
return err(chartProblem(context.blockId, `The locuszoom reads the "${name}" column as it stands, thus the channel takes no transform and no "orderBy".`));
|
|
251
252
|
}
|
|
252
253
|
}
|
|
254
|
+
const metric = encoding.metric;
|
|
255
|
+
const group = encoding.group;
|
|
253
256
|
const found = {
|
|
254
257
|
position: channelColumn(x.value),
|
|
255
258
|
// The figure applies the transform of the p column itself, as the Manhattan figure does.
|
|
256
259
|
p: channelColumn(y.value),
|
|
257
260
|
r2: channelColumn(encoding.color),
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
+
label: encoding.label,
|
|
262
|
+
rate: metric === undefined ? undefined : channelColumn(metric),
|
|
263
|
+
chromosome: group === undefined ? undefined : channelColumn(group),
|
|
261
264
|
};
|
|
262
|
-
for (const column of
|
|
265
|
+
for (const column of [found.position, found.p, found.r2, found.label, found.rate, found.chromosome]) {
|
|
266
|
+
if (column === undefined)
|
|
267
|
+
continue;
|
|
263
268
|
if (rows.length > 0 && !columnPresent(column, rows, context.columns)) {
|
|
264
269
|
return err(chartProblem(context.blockId, `The column "${column}" is absent from every row.`));
|
|
265
270
|
}
|
|
@@ -271,7 +276,7 @@ function distinctNames(rows, column) {
|
|
|
271
276
|
const names = [];
|
|
272
277
|
for (const row of rows) {
|
|
273
278
|
const cell = row[column];
|
|
274
|
-
if (cell === undefined ||
|
|
279
|
+
if (cell === undefined || String(cell).trim() === "")
|
|
275
280
|
continue;
|
|
276
281
|
const name = categoryName(cell);
|
|
277
282
|
if (!names.includes(name))
|
|
@@ -290,7 +295,7 @@ function leadRow(xs, finite, zeros) {
|
|
|
290
295
|
let best = Number.NEGATIVE_INFINITY;
|
|
291
296
|
for (let index = 0; index < finite.length; index += 1) {
|
|
292
297
|
const rank = zeros.has(index) ? Number.POSITIVE_INFINITY : finite[index];
|
|
293
|
-
if (rank === null)
|
|
298
|
+
if (rank === null || rank === undefined)
|
|
294
299
|
continue;
|
|
295
300
|
if (lead === undefined || rank > best || (rank === best && (xs[index] ?? 0) < (xs[lead] ?? 0))) {
|
|
296
301
|
lead = index;
|
|
@@ -309,7 +314,7 @@ function ratesInOrder(rows, xs, rate) {
|
|
|
309
314
|
for (const [index, row] of rows.entries()) {
|
|
310
315
|
const x = xs[index];
|
|
311
316
|
const value = toNumber(row[rate]);
|
|
312
|
-
if (x !== null && value !== null)
|
|
317
|
+
if (x !== null && x !== undefined && value !== null)
|
|
313
318
|
pairs.push([x, value]);
|
|
314
319
|
}
|
|
315
320
|
return pairs.sort((a, b) => a[0] - b[0]);
|
|
@@ -339,17 +344,21 @@ function guideStart(text, line, room) {
|
|
|
339
344
|
const blocked = [];
|
|
340
345
|
for (const [index, x] of room.xs.entries()) {
|
|
341
346
|
const y = room.ys[index];
|
|
342
|
-
if (x !== null && y !== null && y + reach >= low && y - reach <= high)
|
|
347
|
+
if (x !== null && y !== null && y !== undefined && y + reach >= low && y - reach <= high)
|
|
343
348
|
blocked.push([x - half, x + half]);
|
|
344
349
|
}
|
|
345
350
|
if (room.rateTop > 0) {
|
|
346
351
|
const rateLow = (low / room.top) * room.rateTop;
|
|
347
352
|
const rateHigh = (high / room.top) * room.rateTop;
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
+
let previous;
|
|
354
|
+
for (const pair of room.rated) {
|
|
355
|
+
if (previous !== undefined) {
|
|
356
|
+
const [x1, r1] = previous;
|
|
357
|
+
const [x2, r2] = pair;
|
|
358
|
+
if (Math.max(r1, r2) >= rateLow && Math.min(r1, r2) <= rateHigh)
|
|
359
|
+
blocked.push([x1, x2]);
|
|
360
|
+
}
|
|
361
|
+
previous = pair;
|
|
353
362
|
}
|
|
354
363
|
}
|
|
355
364
|
const marks = union(blocked);
|
|
@@ -387,13 +396,16 @@ function union(intervals) {
|
|
|
387
396
|
function coverage(marks) {
|
|
388
397
|
const before = [0];
|
|
389
398
|
for (const [start, end] of marks)
|
|
390
|
-
before.push(before[before.length - 1] + end - start);
|
|
399
|
+
before.push((before[before.length - 1] ?? 0) + end - start);
|
|
391
400
|
const firstEndingAfter = (x) => {
|
|
392
401
|
let low = 0;
|
|
393
402
|
let high = marks.length;
|
|
394
403
|
while (low < high) {
|
|
395
404
|
const middle = (low + high) >> 1;
|
|
396
|
-
|
|
405
|
+
const mark = marks[middle];
|
|
406
|
+
if (mark === undefined)
|
|
407
|
+
break;
|
|
408
|
+
if (mark[1] > x)
|
|
397
409
|
high = middle;
|
|
398
410
|
else
|
|
399
411
|
low = middle + 1;
|
|
@@ -403,11 +415,18 @@ function coverage(marks) {
|
|
|
403
415
|
return (from, to) => {
|
|
404
416
|
const first = firstEndingAfter(from);
|
|
405
417
|
let last = firstEndingAfter(to);
|
|
406
|
-
|
|
418
|
+
const next = marks[last];
|
|
419
|
+
if (next !== undefined && next[0] < to)
|
|
407
420
|
last += 1;
|
|
408
421
|
if (first >= last)
|
|
409
422
|
return 0;
|
|
410
|
-
|
|
423
|
+
const startMark = marks[first];
|
|
424
|
+
const endMark = marks[last - 1];
|
|
425
|
+
const startSum = before[first];
|
|
426
|
+
const endSum = before[last];
|
|
427
|
+
if (startMark === undefined || endMark === undefined || startSum === undefined || endSum === undefined)
|
|
428
|
+
return 0;
|
|
429
|
+
return endSum - startSum - Math.max(0, from - startMark[0]) - Math.max(0, endMark[1] - to);
|
|
411
430
|
};
|
|
412
431
|
}
|
|
413
432
|
/**
|
|
@@ -451,8 +470,13 @@ function positionWindow(xs) {
|
|
|
451
470
|
}
|
|
452
471
|
const from = low ?? 0;
|
|
453
472
|
const to = high ?? 0;
|
|
454
|
-
const
|
|
455
|
-
const
|
|
473
|
+
const smallest = POSITION_STEPS[0];
|
|
474
|
+
const widest = POSITION_STEPS[POSITION_STEPS.length - 1];
|
|
475
|
+
if (smallest === undefined || widest === undefined) {
|
|
476
|
+
return { min: from, max: Math.max(to, from + 1), step: 1 };
|
|
477
|
+
}
|
|
478
|
+
const span = Math.max(to - from, smallest);
|
|
479
|
+
const step = POSITION_STEPS.find((candidate) => span / candidate <= POSITION_TICK_COUNT) ?? widest;
|
|
456
480
|
return { min: from, max: Math.max(to, from + 1), step };
|
|
457
481
|
}
|
|
458
482
|
/**
|
|
@@ -465,7 +489,7 @@ function positionTitle(context, column, chromosome) {
|
|
|
465
489
|
return `${declared.replace(POSITION_UNIT, "")} (Mb)`;
|
|
466
490
|
if (chromosome === undefined)
|
|
467
491
|
return "Position (Mb)";
|
|
468
|
-
const name = chromosome.
|
|
492
|
+
const name = chromosome.toLowerCase().startsWith("chr") ? chromosome.slice(3) : chromosome;
|
|
469
493
|
return `Position on chr${name} (Mb)`;
|
|
470
494
|
}
|
|
471
495
|
/**
|
|
@@ -504,7 +528,10 @@ function decimalsOf(step) {
|
|
|
504
528
|
function binColor(r2) {
|
|
505
529
|
if (r2 === null)
|
|
506
530
|
return LD_MISSING_COLOR;
|
|
507
|
-
|
|
531
|
+
const first = LD_BINS[0];
|
|
532
|
+
if (first === undefined)
|
|
533
|
+
return LD_MISSING_COLOR;
|
|
534
|
+
return (LD_BINS.find((bin, place) => r2 >= bin.low && (r2 < bin.high || place === LD_BINS.length - 1)) ?? first).color;
|
|
508
535
|
}
|
|
509
536
|
/**
|
|
510
537
|
* The legend of the LD bins: a piecewise map over the r² of the points, highest bin first, with the gray entry
|
|
@@ -517,7 +544,8 @@ function binColor(r2) {
|
|
|
517
544
|
function ldLegend() {
|
|
518
545
|
const bins = [...LD_BINS].reverse().map((bin, place) => ({
|
|
519
546
|
gte: bin.low,
|
|
520
|
-
|
|
547
|
+
lte: place === 0 ? bin.high : undefined,
|
|
548
|
+
lt: place === 0 ? undefined : bin.high,
|
|
521
549
|
label: `${bin.low}–${bin.high}`,
|
|
522
550
|
color: bin.color,
|
|
523
551
|
}));
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* box is one row of the track, and the lane of a box is the first lane where it overlaps no earlier box, thus
|
|
12
12
|
* the lanes follow the order of the track rows.
|
|
13
13
|
*/
|
|
14
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
14
15
|
import { err, ok } from "neverthrow";
|
|
15
16
|
import { channelColumn, channelOrder, channelTransform } from "../../contracts/report-blocks.js";
|
|
16
17
|
import { STEM_RENDERER } from "../chart-renderers.js";
|
|
@@ -77,7 +78,7 @@ function deriveLollipop(block, rows, context) {
|
|
|
77
78
|
const stemTitle = valueAxisTitle(context.labels, count.value, COUNT_TITLE);
|
|
78
79
|
const series = group === undefined
|
|
79
80
|
? [stemSeries(stemTitle, CHART_PALETTE[0], stems, label)]
|
|
80
|
-
: classes.map((name, index) => stemSeries(categoryName(name), colors[index], stems.filter((stem) => classOf(stem.row, group) === name), label));
|
|
81
|
+
: classes.map((name, index) => stemSeries(categoryName(name), colors[index] ?? CHART_PALETTE[0], stems.filter((stem) => classOf(stem.row, group) === name), label));
|
|
81
82
|
if (label !== undefined)
|
|
82
83
|
series.push(labelSeries(stems, label));
|
|
83
84
|
const positionTitle = valueAxisTitle(context.labels, position.value, POSITION_TITLE);
|
|
@@ -87,7 +88,7 @@ function deriveLollipop(block, rows, context) {
|
|
|
87
88
|
itemWidth: LEGEND_ICON_PX,
|
|
88
89
|
itemHeight: LEGEND_ICON_PX,
|
|
89
90
|
itemGap: LEGEND_GAP_PX,
|
|
90
|
-
data: series.filter((entry) => entry.renderItem === STEM_RENDERER).map((entry) =>
|
|
91
|
+
data: series.filter((entry) => entry.renderItem === STEM_RENDERER).map((entry) => textOf(entry.name)),
|
|
91
92
|
};
|
|
92
93
|
if (boxes.value === undefined) {
|
|
93
94
|
return ok({ tooltip: { trigger: "item" }, xAxis: valueAxis("x", positionTitle, { min: 0, max: length }), yAxis: countAxis, series, legend });
|
|
@@ -43,7 +43,7 @@ function maClassification(rows, pColumn, pTitle, cut) {
|
|
|
43
43
|
categoryOf: (x, y, index) => {
|
|
44
44
|
if (x === null || y === null || x <= 0)
|
|
45
45
|
return undefined;
|
|
46
|
-
const p = toNumber(rows[index][pColumn]);
|
|
46
|
+
const p = toNumber(rows[index]?.[pColumn]);
|
|
47
47
|
return p !== null && p < cut ? significant : MA_NULL;
|
|
48
48
|
},
|
|
49
49
|
};
|
|
@@ -74,7 +74,7 @@ function deriveMa(block, rows, context) {
|
|
|
74
74
|
if (pColumn.isErr())
|
|
75
75
|
return err(pColumn.error);
|
|
76
76
|
const composition = {
|
|
77
|
-
series: [{ form: "scatter", encoding: { x: x.value, y: y.value,
|
|
77
|
+
series: [{ form: "scatter", encoding: { x: x.value, y: y.value, label: encoding.label } }],
|
|
78
78
|
annotations: [{ kind: "reference-line", axis: "y", value: MA_BASELINE }],
|
|
79
79
|
axes: { x: { scale: "log" } },
|
|
80
80
|
};
|
|
@@ -90,7 +90,7 @@ function deriveMa(block, rows, context) {
|
|
|
90
90
|
for (let index = 0; index < rows.length; index += 1) {
|
|
91
91
|
const mean = xs[index];
|
|
92
92
|
const effect = ys[index];
|
|
93
|
-
if (mean === null || effect === null || mean <= 0)
|
|
93
|
+
if (mean === null || mean === undefined || effect === null || effect === undefined || mean <= 0)
|
|
94
94
|
continue;
|
|
95
95
|
means.push(mean);
|
|
96
96
|
effects.push(Math.abs(effect));
|
|
@@ -101,7 +101,11 @@ function deriveMa(block, rows, context) {
|
|
|
101
101
|
const option = composed.value;
|
|
102
102
|
return ok({
|
|
103
103
|
...option,
|
|
104
|
-
xAxis: {
|
|
104
|
+
xAxis: {
|
|
105
|
+
...axisOf(option, "xAxis"),
|
|
106
|
+
min: low === undefined || high === undefined ? undefined : decadeFloor(low),
|
|
107
|
+
max: low === undefined || high === undefined ? undefined : decadeCeiling(high),
|
|
108
|
+
},
|
|
105
109
|
yAxis: { ...axisOf(option, "yAxis"), ...symmetricRange(reach) },
|
|
106
110
|
series: classification === undefined
|
|
107
111
|
? seriesOf(option).map((series) => ({ ...series, symbolSize: DENSE_SIGNAL_SYMBOL_PX }))
|
|
@@ -51,8 +51,7 @@ export declare function guideLabelBox(line: number, x: {
|
|
|
51
51
|
readonly min: number;
|
|
52
52
|
readonly max: number;
|
|
53
53
|
}, top: number, text: string, frame: NameFrame): Box;
|
|
54
|
-
/**
|
|
55
|
-
* The genome order of two chromosome names: the numbered chromosomes in numeric order, then X, Y, and MT, then
|
|
54
|
+
/** The genome order of two chromosome names: the numbered chromosomes in numeric order, then X, Y, and MT, then
|
|
56
55
|
* each other name in text order. A `chr` prefix takes no part in the order.
|
|
57
56
|
*/
|
|
58
57
|
export declare function compareChromosomes(a: Cell, b: Cell): number;
|
|
@@ -27,12 +27,16 @@
|
|
|
27
27
|
* as mark members, and the chromosome names and the lead names ride one series each after them. Thus the page
|
|
28
28
|
* draws each of them over the payload points.
|
|
29
29
|
*/
|
|
30
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
30
31
|
import { err, ok } from "neverthrow";
|
|
31
32
|
import { channelColumn } from "../../contracts/report-blocks.js";
|
|
32
33
|
import { MANHATTAN_P_THRESHOLD } from "../chart-presets.js";
|
|
33
34
|
import { GENOME_MEMBER, GENOME_POSITION_FUNCTION } from "../chart-toolbox.js";
|
|
35
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
36
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
34
37
|
import { CHART_INK, CHART_PALETTE, MUTED_CHART_COLOR } from "../design.js";
|
|
35
38
|
import { formatNumberCell, typographicExponent } from "../number-format.js";
|
|
39
|
+
import { isAllDigits } from "../../lib/text.js";
|
|
36
40
|
import { categoryName, transformColumn } from "./common.js";
|
|
37
41
|
import { axisOf, BELOW_RESOLUTION_NAME, BELOW_RESOLUTION_SYMBOL, BELOW_RESOLUTION_SYMBOL_PX, BELOW_RESOLUTION_TOOLTIP, belowResolutionHeight, belowResolutionRows, DENSE_NULL_SYMBOL_PX, DENSE_SIGNAL_OPACITY, demandedChannel, largest, niceCeiling, plottedValues, pointLayer, POINT_NAMES, pointNameSeries, seriesOf, sizedSeries, smallest, } from "./dense.js";
|
|
38
42
|
import { placeLeaderNames, textWidthPx } from "./label-room.js";
|
|
@@ -141,28 +145,29 @@ function chromosomeNames(found) {
|
|
|
141
145
|
*/
|
|
142
146
|
function genomeAxis(found) {
|
|
143
147
|
const byPlace = [...found].sort((a, b) => a.low - b.low);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
};
|
|
148
|
+
const starts = [];
|
|
149
|
+
let previous;
|
|
150
|
+
for (const chromosome of byPlace) {
|
|
151
|
+
starts.push([previous === undefined ? 0 : previous.high, `chr${withoutChrPrefix(categoryName(chromosome.name).trim())}`]);
|
|
152
|
+
previous = chromosome;
|
|
153
|
+
}
|
|
154
|
+
return { names: CHROMOSOME_NAMES, starts };
|
|
151
155
|
}
|
|
152
156
|
/** The sides of a peak where a lead name sits, in the order that the figure tries them. */
|
|
153
157
|
const LEAD_NAME_SIDES = ["top", "right", "left"];
|
|
154
158
|
/** The place of the three named chromosomes after the numbered ones, in genome order. */
|
|
155
159
|
const NAMED_CHROMOSOMES = { X: 0, Y: 1, MT: 2, M: 2 };
|
|
156
|
-
/** The
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
/** The chromosome name without its leading `chr`, in either case. */
|
|
161
|
+
function withoutChrPrefix(name) {
|
|
162
|
+
return name.toLowerCase().startsWith("chr") ? name.slice(3) : name;
|
|
163
|
+
}
|
|
164
|
+
/** The genome order of two chromosome names: the numbered chromosomes in numeric order, then X, Y, and MT, then
|
|
160
165
|
* each other name in text order. A `chr` prefix takes no part in the order.
|
|
161
166
|
*/
|
|
162
167
|
export function compareChromosomes(a, b) {
|
|
163
168
|
const rank = (cell) => {
|
|
164
|
-
const name = String(cell).trim()
|
|
165
|
-
if (
|
|
169
|
+
const name = withoutChrPrefix(String(cell).trim());
|
|
170
|
+
if (name.length > 0 && isAllDigits(name))
|
|
166
171
|
return [0, Number(name), name];
|
|
167
172
|
const named = NAMED_CHROMOSOMES[name.toUpperCase()];
|
|
168
173
|
return named !== undefined ? [1, named, name] : [2, 0, name];
|
|
@@ -184,10 +189,10 @@ function chromosomes(rows, groupColumn, labelColumn, xs, ys, line) {
|
|
|
184
189
|
const byKey = new Map();
|
|
185
190
|
const order = [];
|
|
186
191
|
for (let index = 0; index < rows.length; index += 1) {
|
|
187
|
-
const value = rows[index][groupColumn];
|
|
192
|
+
const value = rows[index]?.[groupColumn];
|
|
188
193
|
const x = xs[index];
|
|
189
194
|
const y = ys[index];
|
|
190
|
-
if (value === undefined || x === null || y === null)
|
|
195
|
+
if (value === undefined || x === null || x === undefined || y === null || y === undefined)
|
|
191
196
|
continue;
|
|
192
197
|
// The key carries the type of the cell, as the series split does.
|
|
193
198
|
const key = `${typeof value}:${String(value)}`;
|
|
@@ -199,7 +204,7 @@ function chromosomes(rows, groupColumn, labelColumn, xs, ys, line) {
|
|
|
199
204
|
}
|
|
200
205
|
chromosome.low = Math.min(chromosome.low, x);
|
|
201
206
|
chromosome.high = Math.max(chromosome.high, x);
|
|
202
|
-
const name = labelColumn === undefined ? undefined : rows[index][labelColumn];
|
|
207
|
+
const name = labelColumn === undefined ? undefined : rows[index]?.[labelColumn];
|
|
203
208
|
if (y > line && name !== undefined && String(name).trim() !== "" && (chromosome.lead === undefined || leads(index, chromosome.lead, xs, ys))) {
|
|
204
209
|
chromosome.lead = index;
|
|
205
210
|
}
|
|
@@ -217,12 +222,16 @@ function leads(index, other, xs, ys) {
|
|
|
217
222
|
}
|
|
218
223
|
/** The guide lines of a mark member, with the label of the genome-wide line over the line. */
|
|
219
224
|
function guideOverLine(markLine, line) {
|
|
220
|
-
const data =
|
|
225
|
+
const data = isUnknownArray(markLine.data) ? markLine.data : [];
|
|
221
226
|
return {
|
|
222
227
|
...markLine,
|
|
223
|
-
data: data.map((entry) =>
|
|
224
|
-
|
|
225
|
-
:
|
|
228
|
+
data: data.map((entry) => {
|
|
229
|
+
const fields = parseUnknownRecord(entry);
|
|
230
|
+
const label = fields === undefined ? undefined : parseUnknownRecord(fields.label);
|
|
231
|
+
if (fields === undefined || label === undefined || fields.yAxis !== line)
|
|
232
|
+
return entry;
|
|
233
|
+
return { ...fields, label: { ...label, position: GUIDE_OVER_LINE } };
|
|
234
|
+
}),
|
|
226
235
|
};
|
|
227
236
|
}
|
|
228
237
|
/** The text of a guide p-value: the p in the scientific form of the number helper, as a power of ten. */
|
|
@@ -262,7 +271,7 @@ function deriveManhattan(block, rows, context) {
|
|
|
262
271
|
x: x.value,
|
|
263
272
|
y: { column: pColumn, transform: "neg_log10" },
|
|
264
273
|
group: group.value,
|
|
265
|
-
|
|
274
|
+
label: encoding.label,
|
|
266
275
|
},
|
|
267
276
|
},
|
|
268
277
|
],
|
|
@@ -284,12 +293,12 @@ function deriveManhattan(block, rows, context) {
|
|
|
284
293
|
// The composition splits the series in the order of the rows, thus each series takes the color of the
|
|
285
294
|
// genome place of its chromosome, and never of its place in the series list.
|
|
286
295
|
const places = new Map(found.map((chromosome, place) => [categoryName(chromosome.name), place]));
|
|
287
|
-
const colorOf = (name) => MANHATTAN_COLORS[(places.get(
|
|
296
|
+
const colorOf = (name) => MANHATTAN_COLORS[(places.get(textOf(name)) ?? 0) % MANHATTAN_COLORS.length] ?? CHART_PALETTE[0];
|
|
288
297
|
const low = smallest(found.map((chromosome) => chromosome.low));
|
|
289
298
|
const high = largest(found.map((chromosome) => chromosome.high));
|
|
290
299
|
const top = niceCeiling(Math.max(peak, line, zeroRows.length > 0 ? zeroY : 0));
|
|
291
300
|
const labelColumn = encoding.label;
|
|
292
|
-
const names = labelColumn === undefined ? [] : leadRows.map((index) => ({ x: xs[index] ?? 0, y: ys[index] ?? 0, text: String(rows[index][labelColumn]) }));
|
|
301
|
+
const names = labelColumn === undefined ? [] : leadRows.map((index) => ({ x: xs[index] ?? 0, y: ys[index] ?? 0, text: String(rows[index]?.[labelColumn]) }));
|
|
293
302
|
const span = low !== undefined && high !== undefined ? { min: low, max: high } : undefined;
|
|
294
303
|
const text = sizedSeries([CHROMOSOME_NAMES, POINT_NAMES], (frame) => {
|
|
295
304
|
if (span === undefined)
|
|
@@ -306,18 +315,24 @@ function deriveManhattan(block, rows, context) {
|
|
|
306
315
|
legend: { show: false },
|
|
307
316
|
xAxis: {
|
|
308
317
|
...axisOf(option, "xAxis"),
|
|
309
|
-
|
|
318
|
+
min: low,
|
|
319
|
+
max: high,
|
|
310
320
|
axisLabel: { show: false, formatter: GENOME_POSITION_FUNCTION },
|
|
311
321
|
axisTick: { show: false },
|
|
312
322
|
[GENOME_MEMBER]: genomeAxis(found),
|
|
313
323
|
},
|
|
314
324
|
yAxis: { ...axisOf(option, "yAxis"), min: 0, max: top },
|
|
315
325
|
series: [
|
|
316
|
-
...seriesOf(option).map((series) =>
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
326
|
+
...seriesOf(option).map((series) => {
|
|
327
|
+
const guided = {
|
|
328
|
+
...series,
|
|
329
|
+
...pointLayer(colorOf(series.name), DENSE_NULL_SYMBOL_PX, DENSE_SIGNAL_OPACITY),
|
|
330
|
+
};
|
|
331
|
+
if (series.markLine !== undefined) {
|
|
332
|
+
guided.markLine = guideOverLine(parseUnknownRecord(series.markLine) ?? {}, line);
|
|
333
|
+
}
|
|
334
|
+
return guided;
|
|
335
|
+
}),
|
|
321
336
|
...(zeroRows.length > 0
|
|
322
337
|
? [
|
|
323
338
|
{
|
|
@@ -327,11 +342,14 @@ function deriveManhattan(block, rows, context) {
|
|
|
327
342
|
symbolSize: BELOW_RESOLUTION_SYMBOL_PX,
|
|
328
343
|
itemStyle: { opacity: DENSE_SIGNAL_OPACITY },
|
|
329
344
|
tooltip: BELOW_RESOLUTION_TOOLTIP,
|
|
330
|
-
data: zeroRows.map((index) =>
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
345
|
+
data: zeroRows.map((index) => {
|
|
346
|
+
const group = rows[index]?.[groupColumn];
|
|
347
|
+
return {
|
|
348
|
+
name: labelColumn === undefined ? undefined : String(rows[index]?.[labelColumn]),
|
|
349
|
+
value: [xs[index] ?? 0, zeroY],
|
|
350
|
+
itemStyle: { color: group === undefined ? MANHATTAN_COLORS[0] : colorOf(categoryName(group)) },
|
|
351
|
+
};
|
|
352
|
+
}),
|
|
335
353
|
},
|
|
336
354
|
]
|
|
337
355
|
: []),
|
|
@@ -173,11 +173,10 @@ function deriveOncoprint(block, rows, context) {
|
|
|
173
173
|
legend: {
|
|
174
174
|
// A taller body holds the legend lines of the single column export, thus the page legend starts
|
|
175
175
|
// under the sample title and the free part of the band sits under it.
|
|
176
|
-
|
|
177
|
-
?
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
: { bottom: 0 }),
|
|
176
|
+
top: tall
|
|
177
|
+
? percentOf(100 - bottom + ((CHART_PAGE_TEXT_PX * (1 + TITLE_LINE_SHARE) + SAMPLE_TITLE_GAP) / Math.min(body, CHART_BODY_MAX_PX)) * 100)
|
|
178
|
+
: undefined,
|
|
179
|
+
bottom: tall ? undefined : 0,
|
|
181
180
|
itemWidth: LEGEND_ICON_PX,
|
|
182
181
|
itemHeight: LEGEND_ICON_PX,
|
|
183
182
|
itemGap: LEGEND_GAP_PX,
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { err, ok } from "neverthrow";
|
|
19
19
|
import { channelColumn, channelOrder, channelTransform } from "../../contracts/report-blocks.js";
|
|
20
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
20
21
|
import { CHART_INK, CHART_PALETTE } from "../design.js";
|
|
21
22
|
import { categoricalPalette, categoryName, chartProblem, columnPresent, firstAppearance, POINT_LEGEND_ICON, toNumber, transformColumn, valueAxis, valueAxisTitle, } from "./common.js";
|
|
22
23
|
import { equalRanges, squareLayout } from "./equal-units.js";
|
|
@@ -147,7 +148,13 @@ function deriveShapeDraw(block, rows, context, draw) {
|
|
|
147
148
|
const ps = shapes?.values[index] ?? null;
|
|
148
149
|
if (px === null || py === null || (groups !== undefined && pg === null) || (shapes !== undefined && ps === null))
|
|
149
150
|
continue;
|
|
150
|
-
points.push({
|
|
151
|
+
points.push({
|
|
152
|
+
index,
|
|
153
|
+
x: px,
|
|
154
|
+
y: py,
|
|
155
|
+
group: pg === null ? undefined : categoryName(pg),
|
|
156
|
+
shape: ps === null ? undefined : categoryName(ps),
|
|
157
|
+
});
|
|
151
158
|
}
|
|
152
159
|
const groupNames = firstAppearance(points.flatMap((point) => (point.group === undefined ? [] : [point.group])));
|
|
153
160
|
const shapeNames = firstAppearance(points.flatMap((point) => (point.shape === undefined ? [] : [point.shape])));
|
|
@@ -164,10 +171,13 @@ function deriveShapeDraw(block, rows, context, draw) {
|
|
|
164
171
|
const named = labelColumn !== undefined;
|
|
165
172
|
const labeled = named && draw.labelRows > 0 && points.length <= draw.labelRows;
|
|
166
173
|
const sides = new Map();
|
|
167
|
-
if (
|
|
168
|
-
const placed = pointNameSides(points.map((point) => ({ x: point.x, y: point.y, text: String(rows[point.index][labelColumn] ?? "") })), ranges, SHAPED_POINT_PX);
|
|
169
|
-
for (const [place, point] of points.entries())
|
|
170
|
-
|
|
174
|
+
if (labelColumn !== undefined && labeled) {
|
|
175
|
+
const placed = pointNameSides(points.map((point) => ({ x: point.x, y: point.y, text: String(rows[point.index]?.[labelColumn] ?? "") })), ranges, SHAPED_POINT_PX);
|
|
176
|
+
for (const [place, point] of points.entries()) {
|
|
177
|
+
const side = placed[place];
|
|
178
|
+
if (side !== undefined)
|
|
179
|
+
sides.set(point.index, side);
|
|
180
|
+
}
|
|
171
181
|
}
|
|
172
182
|
const buckets = new Map();
|
|
173
183
|
for (const point of points) {
|
|
@@ -189,17 +199,21 @@ function deriveShapeDraw(block, rows, context, draw) {
|
|
|
189
199
|
series.push({
|
|
190
200
|
type: "scatter",
|
|
191
201
|
name: groupKey ?? shapeKey ?? yTitle,
|
|
192
|
-
|
|
202
|
+
symbol: shapeKey !== undefined ? SHAPE_SYMBOLS[shapePlace] : undefined,
|
|
193
203
|
symbolSize: SHAPED_POINT_PX,
|
|
194
204
|
itemStyle: { color: groupKey !== undefined ? palette[groupPlace] : CHART_PALETTE[0] },
|
|
195
|
-
|
|
205
|
+
label: labeled ? POINT_LABEL_FIELDS.label : undefined,
|
|
196
206
|
data: members.map((point) => {
|
|
197
207
|
const pair = [point.x, point.y];
|
|
198
|
-
const name = labelColumn === undefined ? undefined : rows[point.index][labelColumn];
|
|
208
|
+
const name = labelColumn === undefined ? undefined : rows[point.index]?.[labelColumn];
|
|
199
209
|
if (name === undefined)
|
|
200
210
|
return pair;
|
|
201
211
|
const side = sides.get(point.index);
|
|
202
|
-
return {
|
|
212
|
+
return {
|
|
213
|
+
value: pair,
|
|
214
|
+
name: String(name),
|
|
215
|
+
label: side !== undefined && side !== "right" ? { position: side } : undefined,
|
|
216
|
+
};
|
|
203
217
|
}),
|
|
204
218
|
});
|
|
205
219
|
}
|
|
@@ -219,7 +233,7 @@ function deriveShapeDraw(block, rows, context, draw) {
|
|
|
219
233
|
const option = {
|
|
220
234
|
tooltip: named ? { ...NAMED_POINT_TOOLTIP } : { ...PLAIN_POINT_TOOLTIP },
|
|
221
235
|
series,
|
|
222
|
-
legend: keyed ? { orient: draw.equalUnits ? "vertical" : "horizontal",
|
|
236
|
+
legend: keyed ? { orient: draw.equalUnits ? "vertical" : "horizontal", bottom: draw.equalUnits ? undefined : 0, data: entries } : { show: false },
|
|
223
237
|
};
|
|
224
238
|
if (!draw.equalUnits) {
|
|
225
239
|
return ok({ ...option, xAxis: valueAxis("x", xTitle, { scale: true }), yAxis: valueAxis("y", yTitle, { scale: true }) });
|
|
@@ -231,7 +245,7 @@ function deriveShapeDraw(block, rows, context, draw) {
|
|
|
231
245
|
grid: layout.grid,
|
|
232
246
|
xAxis: { ...valueAxis("x", xTitle, ranges.x), ...interval },
|
|
233
247
|
yAxis: { ...valueAxis("y", yTitle, ranges.y), ...interval },
|
|
234
|
-
|
|
248
|
+
legend: { ...parseUnknownRecord(option.legend), ...layout.legend },
|
|
235
249
|
media: layout.media,
|
|
236
250
|
});
|
|
237
251
|
}
|