@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
|
@@ -53,9 +53,9 @@ function bandRows(blockId, rows, xs, lowColumn, highColumn) {
|
|
|
53
53
|
const complete = [];
|
|
54
54
|
for (let index = 0; index < rows.length; index += 1) {
|
|
55
55
|
const x = xs[index];
|
|
56
|
-
const low = toNumber(rows[index][lowColumn]);
|
|
57
|
-
const high = toNumber(rows[index][highColumn]);
|
|
58
|
-
if (x === null || low === null || high === null)
|
|
56
|
+
const low = toNumber(rows[index]?.[lowColumn]);
|
|
57
|
+
const high = toNumber(rows[index]?.[highColumn]);
|
|
58
|
+
if (x === null || x === undefined || low === null || high === null)
|
|
59
59
|
continue;
|
|
60
60
|
if (high < low) {
|
|
61
61
|
return err(chartProblem(blockId, `The row ${index + 1} holds the band from ${low} in "${lowColumn}" to ${high} in "${highColumn}". ` +
|
|
@@ -67,19 +67,30 @@ function bandRows(blockId, rows, xs, lowColumn, highColumn) {
|
|
|
67
67
|
if (complete.length <= QQ_BAND_POINTS)
|
|
68
68
|
return ok(complete);
|
|
69
69
|
const last = complete[complete.length - 1];
|
|
70
|
-
const
|
|
70
|
+
const first = complete[0];
|
|
71
|
+
if (last === undefined || first === undefined)
|
|
72
|
+
return ok(complete);
|
|
73
|
+
const step = (last.x - first.x) / (QQ_BAND_POINTS - 1);
|
|
71
74
|
// Each row sits zero steps from the next one, thus the rule of the step keeps each row.
|
|
72
75
|
if (!(step > 0)) {
|
|
73
|
-
return ok(Array.from({ length: QQ_BAND_POINTS }, (_row, place) =>
|
|
76
|
+
return ok(Array.from({ length: QQ_BAND_POINTS }, (_row, place) => {
|
|
77
|
+
const sampled = complete[Math.round((place * (complete.length - 1)) / (QQ_BAND_POINTS - 1))];
|
|
78
|
+
return sampled ?? last;
|
|
79
|
+
}));
|
|
74
80
|
}
|
|
75
81
|
// The kept rows sit at least one step apart, and a kept row between the ends sits at least one step before
|
|
76
82
|
// the last row. Thus the span holds at most `QQ_BAND_POINTS - 1` steps, and the band at most
|
|
77
83
|
// `QQ_BAND_POINTS` rows.
|
|
78
|
-
const kept = [
|
|
84
|
+
const kept = [first];
|
|
85
|
+
let previous = first;
|
|
79
86
|
for (let place = 1; place < complete.length - 1; place += 1) {
|
|
80
87
|
const row = complete[place];
|
|
81
|
-
if (row
|
|
88
|
+
if (row === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
if (row.x - previous.x >= step && last.x - row.x >= step) {
|
|
82
91
|
kept.push(row);
|
|
92
|
+
previous = row;
|
|
93
|
+
}
|
|
83
94
|
}
|
|
84
95
|
kept.push(last);
|
|
85
96
|
return ok(kept);
|
|
@@ -131,7 +142,7 @@ function deriveQq(block, rows, context) {
|
|
|
131
142
|
for (let index = 0; index < rows.length; index += 1) {
|
|
132
143
|
const expected = xs[index];
|
|
133
144
|
const observed = ys[index];
|
|
134
|
-
if (expected === null || observed === null)
|
|
145
|
+
if (expected === null || expected === undefined || observed === null || observed === undefined)
|
|
135
146
|
continue;
|
|
136
147
|
expectedValues.push(expected);
|
|
137
148
|
observedValues.push(observed);
|
|
@@ -175,7 +186,7 @@ function deriveQq(block, rows, context) {
|
|
|
175
186
|
]
|
|
176
187
|
: []),
|
|
177
188
|
],
|
|
178
|
-
|
|
189
|
+
graphic: statistics,
|
|
179
190
|
});
|
|
180
191
|
}
|
|
181
192
|
/** The QQ figure module. */
|
|
@@ -36,10 +36,10 @@ export declare const SANKEY_LABEL_BOX_COLOR = "#ffffff";
|
|
|
36
36
|
/** The Sankey module: the source, the target, the flow, and the group. */
|
|
37
37
|
export declare const SANKEY_FIGURE: FigureModule;
|
|
38
38
|
/** One flow of the table: its two nodes. */
|
|
39
|
-
export
|
|
39
|
+
export type SankeyEdge = {
|
|
40
40
|
readonly source: string;
|
|
41
41
|
readonly target: string;
|
|
42
|
-
}
|
|
42
|
+
};
|
|
43
43
|
/**
|
|
44
44
|
* The stage of each node, in the order of first appearance: the longest chain of flows from a node with no
|
|
45
45
|
* inflow. A node with no outflow takes the last stage. A cycle has no stage, thus it refuses, and the error
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import { err, ok } from "neverthrow";
|
|
26
26
|
import { declaredForColumn } from "../../contracts/report-reference.js";
|
|
27
|
-
import { CHART_BODY_PX, CHART_EXPORT_SIZES, CHART_PAGE_TEXT_PX, CHART_PAGE_WIDTH_PX, MUTED_CHART_COLOR } from "../design.js";
|
|
27
|
+
import { CHART_BODY_PX, CHART_EXPORT_SIZES, CHART_INK, CHART_PAGE_TEXT_PX, CHART_PAGE_WIDTH_PX, MUTED_CHART_COLOR } from "../design.js";
|
|
28
28
|
import { AREA_LEGEND_ICON, categoricalPalette, chartProblem, demandedColumn, firstAppearance, legendLineCount, legendLinePx, plainColumn, toNumber, } from "./common.js";
|
|
29
29
|
import { largest } from "./dense.js";
|
|
30
30
|
/** The opacity of a flow. A flow reads as the path of its source, and a label reads over it. */
|
|
@@ -110,15 +110,14 @@ function findCycle(nodes, outgoing) {
|
|
|
110
110
|
continue;
|
|
111
111
|
const path = [{ node: root, next: 0 }];
|
|
112
112
|
state.set(root, "open");
|
|
113
|
-
|
|
114
|
-
const top = path[path.length - 1];
|
|
113
|
+
for (let top = path.at(-1); top !== undefined; top = path.at(-1)) {
|
|
115
114
|
const targets = outgoing.get(top.node) ?? [];
|
|
116
|
-
|
|
115
|
+
const target = targets[top.next];
|
|
116
|
+
if (target === undefined) {
|
|
117
117
|
state.set(top.node, "done");
|
|
118
118
|
path.pop();
|
|
119
119
|
continue;
|
|
120
120
|
}
|
|
121
|
-
const target = targets[top.next];
|
|
122
121
|
top.next += 1;
|
|
123
122
|
const seen = state.get(target);
|
|
124
123
|
if (seen === "open") {
|
|
@@ -144,6 +143,8 @@ function topologicalOrder(nodes, outgoing) {
|
|
|
144
143
|
const ready = nodes.filter((node) => inflow.get(node) === 0);
|
|
145
144
|
for (let next = 0; next < ready.length; next += 1) {
|
|
146
145
|
const node = ready[next];
|
|
146
|
+
if (node === undefined)
|
|
147
|
+
continue;
|
|
147
148
|
order.push(node);
|
|
148
149
|
for (const target of outgoing.get(node) ?? []) {
|
|
149
150
|
const left = (inflow.get(target) ?? 0) - 1;
|
|
@@ -177,7 +178,7 @@ function readFlows(rows, source, target, value, group) {
|
|
|
177
178
|
if (seen.has(key))
|
|
178
179
|
return err(`The table holds two flows from "${from}" to "${to}". It holds one row for each flow.`);
|
|
179
180
|
seen.add(key);
|
|
180
|
-
flows.push({ source: from, target: to, value: amount,
|
|
181
|
+
flows.push({ source: from, target: to, value: amount, group: groupName });
|
|
181
182
|
}
|
|
182
183
|
return ok(flows);
|
|
183
184
|
}
|
|
@@ -234,7 +235,7 @@ function nodeColors(nodes, stages) {
|
|
|
234
235
|
for (const members of byStage.values()) {
|
|
235
236
|
const palette = categoricalPalette(members.length);
|
|
236
237
|
for (const [place, node] of members.entries())
|
|
237
|
-
colors.set(node, palette[place % palette.length]);
|
|
238
|
+
colors.set(node, palette[place % palette.length] ?? CHART_INK);
|
|
238
239
|
}
|
|
239
240
|
return colors;
|
|
240
241
|
}
|
|
@@ -252,7 +253,7 @@ function legendBandPct(names) {
|
|
|
252
253
|
return rounded(Math.max(bandAt(CHART_PAGE_WIDTH_PX, CHART_BODY_PX, CHART_PAGE_TEXT_PX), bandAt(single.widthPx, single.heightPx, single.textPx)));
|
|
253
254
|
}
|
|
254
255
|
function deriveSankey(block, rows, context) {
|
|
255
|
-
const source = { blockId: context.blockId, rows,
|
|
256
|
+
const source = { blockId: context.blockId, rows, columns: context.columns };
|
|
256
257
|
const encoding = block.encoding ?? {};
|
|
257
258
|
const from = demandedColumn("sankey", encoding, "x", source);
|
|
258
259
|
if (from.isErr())
|
|
@@ -284,7 +285,7 @@ function deriveSankey(block, rows, context) {
|
|
|
284
285
|
const stageNodes = largest([...stageSizes.values()]) ?? 0;
|
|
285
286
|
const groups = group.value === undefined ? [] : firstAppearance(flows.value.map((entry) => entry.group ?? ""));
|
|
286
287
|
const groupPalette = categoricalPalette(groups.length);
|
|
287
|
-
const groupColors = new Map(groups.map((name, place) => [name, groupPalette[place % groupPalette.length]]));
|
|
288
|
+
const groupColors = new Map(groups.map((name, place) => [name, groupPalette[place % groupPalette.length] ?? CHART_INK]));
|
|
288
289
|
const grouped = group.value !== undefined;
|
|
289
290
|
const bottom = grouped ? legendBandPct(groups) + BOTTOM_PCT : BOTTOM_PCT;
|
|
290
291
|
const page = boxFields(PAGE_BOX, last + 1, stageNodes, bottom);
|
|
@@ -316,7 +317,7 @@ function deriveSankey(block, rows, context) {
|
|
|
316
317
|
source: entry.source,
|
|
317
318
|
target: entry.target,
|
|
318
319
|
value: entry.value,
|
|
319
|
-
|
|
320
|
+
lineStyle: grouped ? { color: groupColors.get(entry.group ?? "") } : undefined,
|
|
320
321
|
})),
|
|
321
322
|
},
|
|
322
323
|
];
|
|
@@ -37,20 +37,20 @@ export declare const UPSET_INTERSECTION_LIMIT = 30;
|
|
|
37
37
|
/** The UpSet module: the element and the set. */
|
|
38
38
|
export declare const UPSET_FIGURE: FigureModule;
|
|
39
39
|
/** One set: its name and the count of its elements. */
|
|
40
|
-
export
|
|
40
|
+
export type UpsetSet = {
|
|
41
41
|
readonly name: string;
|
|
42
42
|
readonly size: number;
|
|
43
|
-
}
|
|
43
|
+
};
|
|
44
44
|
/** One exact intersection: the places of its member sets in the set order, and the count of its elements. */
|
|
45
|
-
export
|
|
45
|
+
export type UpsetIntersection = {
|
|
46
46
|
readonly members: readonly number[];
|
|
47
47
|
readonly size: number;
|
|
48
|
-
}
|
|
48
|
+
};
|
|
49
49
|
/** The computed summary of the figure: the sets in size order, and each intersection in draw order. */
|
|
50
|
-
export
|
|
50
|
+
export type UpsetSummary = {
|
|
51
51
|
readonly sets: readonly UpsetSet[];
|
|
52
52
|
readonly intersections: readonly UpsetIntersection[];
|
|
53
|
-
}
|
|
53
|
+
};
|
|
54
54
|
/**
|
|
55
55
|
* The set sizes and the exact intersections of one membership table.
|
|
56
56
|
*
|
|
@@ -118,8 +118,10 @@ export function upsetSummary(rows, element, set) {
|
|
|
118
118
|
/** Compare two member lists of one degree by the set order: the list whose first different set comes first sorts first. */
|
|
119
119
|
function compareMembers(a, b) {
|
|
120
120
|
for (let place = 0; place < Math.min(a.length, b.length); place += 1) {
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
const left = a[place];
|
|
122
|
+
const right = b[place];
|
|
123
|
+
if (left !== right)
|
|
124
|
+
return (left ?? 0) - (right ?? 0);
|
|
123
125
|
}
|
|
124
126
|
return a.length - b.length;
|
|
125
127
|
}
|
|
@@ -171,7 +173,7 @@ function pct(value) {
|
|
|
171
173
|
return `${rounded(value)}%`;
|
|
172
174
|
}
|
|
173
175
|
function deriveUpset(block, rows, context) {
|
|
174
|
-
const source = { blockId: context.blockId, rows,
|
|
176
|
+
const source = { blockId: context.blockId, rows, columns: context.columns };
|
|
175
177
|
const encoding = block.encoding ?? {};
|
|
176
178
|
const element = demandedColumn("upset", encoding, "x", source);
|
|
177
179
|
if (element.isErr())
|
|
@@ -188,6 +190,7 @@ function deriveUpset(block, rows, context) {
|
|
|
188
190
|
const { sets, intersections } = summary.value;
|
|
189
191
|
const drawn = intersections.slice(0, UPSET_INTERSECTION_LIMIT);
|
|
190
192
|
const hidden = intersections.length - drawn.length;
|
|
193
|
+
const shownName = hidden > 0 ? { ...axisNameFields("x", `Intersections: ${drawn.length} of ${intersections.length} shown`), nameGap: NAME_GAP_PX } : undefined;
|
|
191
194
|
const setNames = sets.map((entry) => entry.name);
|
|
192
195
|
const columnNames = drawn.map((entry) => entry.members.map((place) => setNames[place]).join(MEMBER_SEPARATOR));
|
|
193
196
|
const layout = upsetLayout(sets.length, Math.max(...setNames.map((name) => name.length)));
|
|
@@ -283,7 +286,7 @@ function deriveUpset(block, rows, context) {
|
|
|
283
286
|
gridIndex: 1,
|
|
284
287
|
data: columnNames,
|
|
285
288
|
...hiddenAxis,
|
|
286
|
-
...
|
|
289
|
+
...shownName,
|
|
287
290
|
},
|
|
288
291
|
{ ...valueAxis("x", SET_TITLE), gridIndex: 2, inverse: true, splitNumber: 2, minInterval: 1, axisLabel: { rotate: 0 } },
|
|
289
292
|
],
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import { err, ok } from "neverthrow";
|
|
22
22
|
import { channelColumn } from "../../contracts/report-blocks.js";
|
|
23
23
|
import { expandVolcano, VOLCANO_EFFECT_THRESHOLD, volcanoAxisTitles } from "../chart-presets.js";
|
|
24
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
24
25
|
import { CHART_PALETTE, MUTED_CHART_COLOR } from "../design.js";
|
|
25
26
|
import { transformColumn } from "./common.js";
|
|
26
27
|
import { axisOf, BELOW_RESOLUTION_SYMBOL, BELOW_RESOLUTION_SYMBOL_PX, BELOW_RESOLUTION_TOOLTIP, belowResolutionHeight, belowResolutionRows, countText, DENSE_NULL_OPACITY, DENSE_NULL_SYMBOL_PX, DENSE_NULL_Z, DENSE_SIGNAL_OPACITY, DENSE_SIGNAL_SYMBOL_PX, demandedChannel, largest, niceCeiling, plottedValues, pointLayer, POINT_NAMES, pointNameSeries, seriesOf, sizedSeries, symmetricRange, } from "./dense.js";
|
|
@@ -42,7 +43,7 @@ const READS = new Set(["x", "y", "label"]);
|
|
|
42
43
|
function countedClassification(base, xs, ys) {
|
|
43
44
|
const counts = new Map(base.categories.map((category) => [category.name, 0]));
|
|
44
45
|
for (let index = 0; index < xs.length; index += 1) {
|
|
45
|
-
const category = base.categoryOf(xs[index], ys[index], index);
|
|
46
|
+
const category = base.categoryOf(xs[index] ?? null, ys[index] ?? null, index);
|
|
46
47
|
if (category !== undefined)
|
|
47
48
|
counts.set(category, (counts.get(category) ?? 0) + 1);
|
|
48
49
|
}
|
|
@@ -67,8 +68,8 @@ function labeledRows(rows, labelColumn, base, xs, ys, zeros) {
|
|
|
67
68
|
const signal = new Set(base.categories.filter((category) => !category.muted).map((category) => category.name));
|
|
68
69
|
const candidates = [];
|
|
69
70
|
for (let index = 0; index < rows.length; index += 1) {
|
|
70
|
-
const category = base.categoryOf(xs[index], ys[index], index);
|
|
71
|
-
const name = rows[index][labelColumn];
|
|
71
|
+
const category = base.categoryOf(xs[index] ?? null, ys[index] ?? null, index);
|
|
72
|
+
const name = rows[index]?.[labelColumn];
|
|
72
73
|
if (category !== undefined && signal.has(category) && name !== undefined && String(name).trim() !== "")
|
|
73
74
|
candidates.push(index);
|
|
74
75
|
}
|
|
@@ -110,14 +111,14 @@ function deriveVolcano(block, rows, context) {
|
|
|
110
111
|
: labeledRows(rows, labelColumn, base, xs, ys, zeros).map((index) => ({
|
|
111
112
|
x: xs[index] ?? 0,
|
|
112
113
|
y: ys[index] ?? 0,
|
|
113
|
-
text: String(rows[index][labelColumn]),
|
|
114
|
+
text: String(rows[index]?.[labelColumn]),
|
|
114
115
|
}));
|
|
115
116
|
const top = zeroRows.length > 0 ? Math.max(peak, zeroY) : peak;
|
|
116
117
|
// The runtime ends the p axis at its own round number at or past the peak. The round number of the figure
|
|
117
118
|
// is at or past it too, thus the names measure against a span at least as long as the drawn one.
|
|
118
119
|
const plot = { x: { min: -end, max: end }, y: { min: 0, max: niceCeiling(top) } };
|
|
119
120
|
const text = sizedSeries([POINT_NAMES], (frame) => pointNameSeries(names, placeLeaderNames(names, { xs, ys, pointPx: DENSE_SIGNAL_SYMBOL_PX }, plot, VOLCANO_NAME_SIDES, top, frame)));
|
|
120
|
-
const legend =
|
|
121
|
+
const legend = parseUnknownRecord(option.legend) ?? {};
|
|
121
122
|
return ok({
|
|
122
123
|
...option,
|
|
123
124
|
...text.member,
|
|
@@ -127,16 +128,17 @@ function deriveVolcano(block, rows, context) {
|
|
|
127
128
|
yAxis: { ...axisOf(option, "yAxis"), min: 0 },
|
|
128
129
|
series: [
|
|
129
130
|
...seriesOf(option).map((series, place) => ({ ...series, ...sideLayer(place, DENSE_SIGNAL_SYMBOL_PX, DENSE_NULL_SYMBOL_PX) })),
|
|
130
|
-
...zeroSeries(counted, zeroRows, xs, zeroY, labelColumn === undefined ? undefined : (index) => String(rows[index][labelColumn])),
|
|
131
|
+
...zeroSeries(counted, zeroRows, xs, zeroY, labelColumn === undefined ? undefined : (index) => String(rows[index]?.[labelColumn])),
|
|
131
132
|
...text.page,
|
|
132
133
|
],
|
|
133
134
|
});
|
|
134
135
|
}
|
|
135
136
|
/** The style of the points of one side, by the place of the side: the two signal sides, then the null side. */
|
|
136
137
|
function sideLayer(place, signalPx, nullPx) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
const signal = SIDE_COLORS[place];
|
|
139
|
+
if (signal !== undefined)
|
|
140
|
+
return pointLayer(signal, signalPx, DENSE_SIGNAL_OPACITY);
|
|
141
|
+
return pointLayer(MUTED_CHART_COLOR, nullPx, DENSE_NULL_OPACITY, DENSE_NULL_Z);
|
|
140
142
|
}
|
|
141
143
|
/**
|
|
142
144
|
* The series of the stored zeros: one series for each side that holds one, under the name and in the style of
|
|
@@ -146,7 +148,7 @@ function sideLayer(place, signalPx, nullPx) {
|
|
|
146
148
|
function zeroSeries(classification, zeroRows, xs, zeroY, nameOf) {
|
|
147
149
|
return classification.categories.flatMap((category, place) => {
|
|
148
150
|
const data = zeroRows
|
|
149
|
-
.filter((index) => classification.categoryOf(xs[index], zeroY, index) === category.name)
|
|
151
|
+
.filter((index) => classification.categoryOf(xs[index] ?? null, zeroY, index) === category.name)
|
|
150
152
|
.map((index) => (nameOf === undefined ? [xs[index] ?? 0, zeroY] : { name: nameOf(index), value: [xs[index] ?? 0, zeroY] }));
|
|
151
153
|
if (data.length === 0)
|
|
152
154
|
return [];
|
|
@@ -12,20 +12,20 @@
|
|
|
12
12
|
* option transforms and the two draws exist on the page alone, because the server never builds the file.
|
|
13
13
|
*/
|
|
14
14
|
/** The box of one export in CSS pixels, and in millimeters for a column export. */
|
|
15
|
-
export
|
|
15
|
+
export type SvgRootSize = {
|
|
16
16
|
readonly widthPx: number;
|
|
17
17
|
readonly heightPx: number;
|
|
18
18
|
readonly widthMm?: number;
|
|
19
19
|
readonly heightMm?: number;
|
|
20
|
-
}
|
|
20
|
+
};
|
|
21
21
|
/** The raster image of the point layer and its rectangle in the pixel space of the SVG. */
|
|
22
|
-
export
|
|
22
|
+
export type PointLayerImage = {
|
|
23
23
|
readonly href: string;
|
|
24
24
|
readonly x: number;
|
|
25
25
|
readonly y: number;
|
|
26
26
|
readonly width: number;
|
|
27
27
|
readonly height: number;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
/**
|
|
30
30
|
* True when one series draws a point for each row: a `scatter` whose symbol draws and which shows no series
|
|
31
31
|
* label. A scatter of size zero, or one with a shown label, carries names, and names stay vector text.
|
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
* function and the page function. A shared test vector runs both, thus the two cannot drift in silence. The
|
|
12
12
|
* option transforms and the two draws exist on the page alone, because the server never builds the file.
|
|
13
13
|
*/
|
|
14
|
+
import { parseUnknownRecord } from "../lib/unknown-containers.js";
|
|
14
15
|
/**
|
|
15
16
|
* True when one series draws a point for each row: a `scatter` whose symbol draws and which shows no series
|
|
16
17
|
* label. A scatter of size zero, or one with a shown label, carries names, and names stay vector text.
|
|
17
18
|
*/
|
|
18
19
|
export function isPointLayer(series) {
|
|
19
|
-
|
|
20
|
+
const fields = parseUnknownRecord(series);
|
|
21
|
+
if (fields === undefined)
|
|
20
22
|
return false;
|
|
21
|
-
const fields = series;
|
|
22
23
|
if (fields.type !== "scatter" || fields.symbolSize === 0 || fields.symbol === "none")
|
|
23
24
|
return false;
|
|
24
|
-
|
|
25
|
-
return !(typeof label === "object" && label !== null && label.show === true);
|
|
25
|
+
return parseUnknownRecord(fields.label)?.show !== true;
|
|
26
26
|
}
|
|
27
27
|
/** True when an option holds a point layer. The page can then build the hybrid SVG of the option. */
|
|
28
28
|
export function holdsPointLayer(option) {
|
|
@@ -46,10 +46,12 @@ function layerNumber(value) {
|
|
|
46
46
|
}
|
|
47
47
|
/** One attribute value with each character that can close it written as an entity. */
|
|
48
48
|
function attributeText(value) {
|
|
49
|
-
return value.
|
|
49
|
+
return value.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<");
|
|
50
50
|
}
|
|
51
51
|
/** The root tag of an SVG file, and the transparent background rectangle that the chart runtime writes first. */
|
|
52
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the SVG root tag of the chart output, read host-side and interpolated into the page script that locates the same tag.
|
|
52
53
|
const ROOT_TAG = /^<svg\b[^>]*>/;
|
|
54
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the transparent background rectangle that the chart runtime writes first; the fixed attribute shape is the contract between the two sides.
|
|
53
55
|
const BACKGROUND_RECT = /^\s*<rect width="[^"]*" height="[^"]*" x="0" y="0"[^>]*><\/rect>/;
|
|
54
56
|
/**
|
|
55
57
|
* The hybrid SVG file: the vector file with one `<image>` element of the point layer, and the root at the
|
|
@@ -31,10 +31,10 @@ import type { ColumnMeaning } from "../contracts/report-reference.js";
|
|
|
31
31
|
/** The five number kinds that the renderer shows. */
|
|
32
32
|
export type NumberKind = "scientific" | "compact" | "compact-scientific" | "identifier" | "below-resolution";
|
|
33
33
|
/** One formatted cell. `full` holds the full digits, and it is present only when `text` hides one. */
|
|
34
|
-
export
|
|
34
|
+
export type FormattedNumber = {
|
|
35
35
|
readonly text: string;
|
|
36
36
|
readonly full?: string;
|
|
37
|
-
}
|
|
37
|
+
};
|
|
38
38
|
/**
|
|
39
39
|
* Format one cell in one kind.
|
|
40
40
|
*
|
|
@@ -45,7 +45,7 @@ export interface FormattedNumber {
|
|
|
45
45
|
* below-resolution kind alone, and the caller reads the column one time to get it. Thus this function stays
|
|
46
46
|
* a pure function of its arguments, and it never reads a column.
|
|
47
47
|
*/
|
|
48
|
-
export declare function formatNumberCell(cell: string | number, kind: NumberKind, bound?: number): FormattedNumber;
|
|
48
|
+
export declare function formatNumberCell(cell: string | number | undefined, kind: NumberKind, bound?: number): FormattedNumber;
|
|
49
49
|
/**
|
|
50
50
|
* Select the number kind for one cell of one column.
|
|
51
51
|
*
|
|
@@ -59,7 +59,7 @@ export declare function formatNumberCell(cell: string | number, kind: NumberKind
|
|
|
59
59
|
* that holds no finite number selects the compact-scientific kind too, because the format passes such a
|
|
60
60
|
* cell through unchanged.
|
|
61
61
|
*/
|
|
62
|
-
export declare function selectNumberKind(column: string, cell: string | number, meaning?: ColumnMeaning): NumberKind;
|
|
62
|
+
export declare function selectNumberKind(column: string, cell: string | number | undefined, meaning?: ColumnMeaning): NumberKind;
|
|
63
63
|
/**
|
|
64
64
|
* The number kind of one whole column.
|
|
65
65
|
*
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* exponent in a notation that no shown form gives. Such a sentence drifts from the page, and the advisory
|
|
28
28
|
* scan of a draft reports it.
|
|
29
29
|
*/
|
|
30
|
+
import { hasWhitespace, isAllDigits } from "../lib/text.js";
|
|
30
31
|
/** The significant digits of the scientific coefficient, for example the two digits of `4.3e-5`. */
|
|
31
32
|
const SCIENTIFIC_DIGITS = 2;
|
|
32
33
|
/** The significant digits of the compact-scientific form, for example the three digits of `-3.09`. */
|
|
@@ -55,16 +56,26 @@ const GROUP_SIZE = 3;
|
|
|
55
56
|
const P_VALUE_TOKENS = new Set(["p", "pval", "pvalue", "padj", "fdr", "q", "qval"]);
|
|
56
57
|
/** The whole tokens of a column name that name an identifier. Such a value is a name, not a magnitude. */
|
|
57
58
|
const IDENTIFIER_TOKENS = new Set(["id", "pmid", "doi", "entrez", "taxid", "year", "accession"]);
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
/**
|
|
60
|
+
* The exponent of one written or shown form, for example the `-05` of `4.3e-05`.
|
|
61
|
+
* `null` when the text ends in no `e` or `E` marker and its digits.
|
|
62
|
+
*/
|
|
63
|
+
function trailingExponentOf(text) {
|
|
64
|
+
let end = text.length;
|
|
65
|
+
while (end > 0 && text.charAt(end - 1) >= "0" && text.charAt(end - 1) <= "9")
|
|
66
|
+
end--;
|
|
67
|
+
if (end === text.length)
|
|
68
|
+
return null;
|
|
69
|
+
let start = end;
|
|
70
|
+
if (start > 0 && (text.charAt(start - 1) === "+" || text.charAt(start - 1) === "-"))
|
|
71
|
+
start--;
|
|
72
|
+
if (start === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const marker = text.charAt(start - 1);
|
|
75
|
+
if (marker !== "e" && marker !== "E")
|
|
76
|
+
return null;
|
|
77
|
+
return text.slice(start);
|
|
78
|
+
}
|
|
68
79
|
/**
|
|
69
80
|
* The form of a stored zero that no positive neighbor bounds. It claims nearness, and it claims no bound,
|
|
70
81
|
* because the column gives nothing better.
|
|
@@ -79,8 +90,6 @@ const TYPOGRAPHIC_MINUS = "−";
|
|
|
79
90
|
const NAME_DELIMITER = "%";
|
|
80
91
|
/** The count of segments that an encoded set name holds: the name, the collection, and the accession. */
|
|
81
92
|
const NAME_SEGMENTS = 3;
|
|
82
|
-
/** One whitespace character. A segment of an encoded name holds none. */
|
|
83
|
-
const WHITESPACE = /\s/;
|
|
84
93
|
/**
|
|
85
94
|
* Format one cell in one kind.
|
|
86
95
|
*
|
|
@@ -233,7 +242,7 @@ function firstNameSegment(text) {
|
|
|
233
242
|
if (segments.length < NAME_SEGMENTS) {
|
|
234
243
|
return undefined;
|
|
235
244
|
}
|
|
236
|
-
const encoded = segments.every((segment) => segment.length > 0 && !
|
|
245
|
+
const encoded = segments.every((segment) => segment.length > 0 && !hasWhitespace(segment));
|
|
237
246
|
return encoded ? segments[0] : undefined;
|
|
238
247
|
}
|
|
239
248
|
/**
|
|
@@ -310,7 +319,7 @@ export function smallestPositiveValue(cells) {
|
|
|
310
319
|
* A text that carries no exponent, and a text that holds no finite number, both give false.
|
|
311
320
|
*/
|
|
312
321
|
export function holdsADriftedExponent(text) {
|
|
313
|
-
const written =
|
|
322
|
+
const written = trailingExponentOf(text.trim());
|
|
314
323
|
if (written === null) {
|
|
315
324
|
return false;
|
|
316
325
|
}
|
|
@@ -318,13 +327,14 @@ export function holdsADriftedExponent(text) {
|
|
|
318
327
|
if (value === null) {
|
|
319
328
|
return false;
|
|
320
329
|
}
|
|
321
|
-
const shown =
|
|
322
|
-
return shown !== null && shown
|
|
330
|
+
const shown = trailingExponentOf(formatNumberCell(value, "scientific").text);
|
|
331
|
+
return shown !== null && shown !== written;
|
|
323
332
|
}
|
|
324
333
|
/**
|
|
325
334
|
* One scientific form inside a text: a coefficient with its sign, and an exponent. The coefficient stands
|
|
326
335
|
* alone, thus a name such as `rs1e5` holds no scientific form.
|
|
327
336
|
*/
|
|
337
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the coefficient and exponent captures with the boundary lookarounds keep a name such as `rs1e5` outside the match.
|
|
328
338
|
const SCIENTIFIC_IN_TEXT = /(?<![\w.])([−-]?\d+(?:\.\d+)?)e([+-]?\d+)(?![\w.])/g;
|
|
329
339
|
/** The superscript form of each decimal digit, in digit order. */
|
|
330
340
|
const SUPERSCRIPT_DIGITS = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"];
|
|
@@ -341,7 +351,9 @@ const SUPERSCRIPT_MINUS = "⁻";
|
|
|
341
351
|
export function typographicExponent(text) {
|
|
342
352
|
return text.replace(SCIENTIFIC_IN_TEXT, (_form, coefficient, exponent) => {
|
|
343
353
|
const power = Number(exponent);
|
|
344
|
-
const digits =
|
|
354
|
+
const digits = Array.from(String(Math.abs(power)))
|
|
355
|
+
.map((digit) => SUPERSCRIPT_DIGITS[Number(digit)])
|
|
356
|
+
.join("");
|
|
345
357
|
return `${shownMinus(coefficient)} × 10${power < 0 ? SUPERSCRIPT_MINUS : ""}${digits}`;
|
|
346
358
|
});
|
|
347
359
|
}
|
|
@@ -359,7 +371,7 @@ export function typographicExponent(text) {
|
|
|
359
371
|
* notation. Thus `<0.02` stands beside `0.04`, and no bound gives an exponent of zero.
|
|
360
372
|
*/
|
|
361
373
|
function boundForm(bound) {
|
|
362
|
-
const [mantissa, exponent] = bound.toExponential().split("e");
|
|
374
|
+
const [mantissa = "", exponent = ""] = bound.toExponential().split("e");
|
|
363
375
|
const digits = mantissa.replace(".", "");
|
|
364
376
|
const raised = Number(digits[0]) + (digits.length > 1 ? 1 : 0);
|
|
365
377
|
const carries = raised === 10;
|
|
@@ -371,11 +383,14 @@ function boundForm(bound) {
|
|
|
371
383
|
// The decimal text builds from the digit and the exponent, thus no float arithmetic can shift it.
|
|
372
384
|
return power >= 0 ? `${digit}${"0".repeat(power)}` : `0.${"0".repeat(-power - 1)}${digit}`;
|
|
373
385
|
}
|
|
374
|
-
/** The finite number of one cell, or `null` when the cell holds no finite number. */
|
|
386
|
+
/** The finite number of one cell, or `null` when the cell is absent or holds no finite number. */
|
|
375
387
|
function finiteValue(cell) {
|
|
376
388
|
if (typeof cell === "number") {
|
|
377
389
|
return Number.isFinite(cell) ? cell : null;
|
|
378
390
|
}
|
|
391
|
+
if (cell === undefined) {
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
379
394
|
const trimmed = cell.trim();
|
|
380
395
|
if (trimmed === "") {
|
|
381
396
|
return null;
|
|
@@ -435,7 +450,7 @@ function compactForm(value) {
|
|
|
435
450
|
* thus a magnitude that `toFixed` gives in the exponential form stays whole.
|
|
436
451
|
*/
|
|
437
452
|
function groupDigits(digits) {
|
|
438
|
-
if (!
|
|
453
|
+
if (!isAllDigits(digits)) {
|
|
439
454
|
return digits;
|
|
440
455
|
}
|
|
441
456
|
let grouped = "";
|
|
@@ -443,7 +458,7 @@ function groupDigits(digits) {
|
|
|
443
458
|
if (index > 0 && (digits.length - index) % GROUP_SIZE === 0) {
|
|
444
459
|
grouped += ",";
|
|
445
460
|
}
|
|
446
|
-
grouped += digits
|
|
461
|
+
grouped += digits.charAt(index);
|
|
447
462
|
}
|
|
448
463
|
return grouped;
|
|
449
464
|
}
|
|
@@ -476,7 +491,7 @@ function trimTrailingZeros(text) {
|
|
|
476
491
|
}
|
|
477
492
|
/** One shown form without its group commas, thus the grouping alone never counts as a hidden digit. */
|
|
478
493
|
function ungrouped(text) {
|
|
479
|
-
return text.
|
|
494
|
+
return text.replaceAll(",", "");
|
|
480
495
|
}
|
|
481
496
|
/** True when the shown text no longer parses back to the value. */
|
|
482
497
|
function hidesDigits(text, value) {
|
|
@@ -495,9 +510,29 @@ function isIdentifierColumn(column) {
|
|
|
495
510
|
* gives `padj` and `bh`, and `p_value` gives `p` and `value`.
|
|
496
511
|
*/
|
|
497
512
|
function columnTokens(column) {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
513
|
+
const tokens = [];
|
|
514
|
+
let token = "";
|
|
515
|
+
for (const char of column) {
|
|
516
|
+
const atCaseBoundary = token.length > 0 && isLowerOrDigit(token.charAt(token.length - 1)) && isAsciiUpper(char);
|
|
517
|
+
if (isNameSeparator(char) || atCaseBoundary) {
|
|
518
|
+
if (token.length > 0)
|
|
519
|
+
tokens.push(token);
|
|
520
|
+
token = "";
|
|
521
|
+
if (isNameSeparator(char))
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
token += char;
|
|
525
|
+
}
|
|
526
|
+
if (token.length > 0)
|
|
527
|
+
tokens.push(token);
|
|
528
|
+
return tokens.map((token) => token.toLowerCase());
|
|
529
|
+
}
|
|
530
|
+
function isLowerOrDigit(char) {
|
|
531
|
+
return (char >= "a" && char <= "z") || (char >= "0" && char <= "9");
|
|
532
|
+
}
|
|
533
|
+
function isAsciiUpper(char) {
|
|
534
|
+
return char >= "A" && char <= "Z";
|
|
535
|
+
}
|
|
536
|
+
function isNameSeparator(char) {
|
|
537
|
+
return char === "_" || char === "." || char === "-" || hasWhitespace(char);
|
|
503
538
|
}
|
|
@@ -308,7 +308,8 @@ const PAGE_EXPORT_SIZES = Object.fromEntries(Object.entries(CHART_EXPORT_SIZES).
|
|
|
308
308
|
textPx: size.textPx,
|
|
309
309
|
width: size.widthPx,
|
|
310
310
|
height: size.heightPx,
|
|
311
|
-
|
|
311
|
+
widthMm: size.theme === "inflexa-print" ? size.widthMm : undefined,
|
|
312
|
+
heightMm: size.theme === "inflexa-print" ? size.heightMm : undefined,
|
|
312
313
|
pixelRatio: size.pixelRatio,
|
|
313
314
|
},
|
|
314
315
|
]));
|
|
@@ -29,10 +29,10 @@ export declare const REPORT_PROVENANCE_GLOBAL = "__REPORT_PROV";
|
|
|
29
29
|
* Both are opaque strings. The renderer moves them into the page and never into a parse, thus a document of
|
|
30
30
|
* any format rides unchanged and the page-side reader owns the format.
|
|
31
31
|
*/
|
|
32
|
-
export
|
|
32
|
+
export type ProvenanceExport = {
|
|
33
33
|
readonly document: string;
|
|
34
34
|
readonly attestation?: string;
|
|
35
|
-
}
|
|
35
|
+
};
|
|
36
36
|
/**
|
|
37
37
|
* The data assets of one provenance export, in load order.
|
|
38
38
|
*
|
|
@@ -22,10 +22,10 @@ import { type CitationReference, type Reference } from "../contracts/report-refe
|
|
|
22
22
|
/** The citation key of one citation reference, in the prefixed `idKind:id` form. */
|
|
23
23
|
export declare function citationKeyOf(reference: CitationReference): string;
|
|
24
24
|
/** One source of a derivation: the pinned path that the script read, and the content hash of those bytes. */
|
|
25
|
-
export
|
|
25
|
+
export type DerivationChainSource = {
|
|
26
26
|
readonly path: string;
|
|
27
27
|
readonly hash: string;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
/**
|
|
30
30
|
* The chain of one derived path: the sources that the script read, and the hash of the script itself.
|
|
31
31
|
*
|
|
@@ -38,13 +38,13 @@ export interface DerivationChainSource {
|
|
|
38
38
|
* stages the script and it knows where the derived file sits, thus the caller states both and the renderer
|
|
39
39
|
* reads no disk. A chain that carries neither renders its hashes alone.
|
|
40
40
|
*/
|
|
41
|
-
export
|
|
41
|
+
export type DerivationChain = {
|
|
42
42
|
readonly outputPath: string;
|
|
43
43
|
readonly sources: readonly DerivationChainSource[];
|
|
44
44
|
readonly scriptHash: string;
|
|
45
45
|
readonly scriptSource?: string;
|
|
46
46
|
readonly outputSource?: string;
|
|
47
|
-
}
|
|
47
|
+
};
|
|
48
48
|
/** The chain of each derived path of one render, keyed by the output path that the bindings name. */
|
|
49
49
|
export type DerivationChains = ReadonlyMap<string, DerivationChain>;
|
|
50
50
|
/**
|