@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
|
@@ -16,11 +16,11 @@ import type { Cell } from "../chart.js";
|
|
|
16
16
|
import type { RenderProblem } from "../types.js";
|
|
17
17
|
import type { FigureTree } from "./index.js";
|
|
18
18
|
/** One checked tree: the axis categories in leaf order, and the elbow of each edge in table order. */
|
|
19
|
-
export
|
|
19
|
+
export type CheckedTree = {
|
|
20
20
|
readonly order: readonly Cell[];
|
|
21
21
|
readonly height: number;
|
|
22
22
|
readonly elbows: readonly Elbow[];
|
|
23
|
-
}
|
|
23
|
+
};
|
|
24
24
|
/**
|
|
25
25
|
* The elbow of one edge, in tree coordinates: the place along the axis and the height of each of its three
|
|
26
26
|
* points. It rises from the child to the height of the parent, then it runs across to the place of the parent.
|
|
@@ -33,4 +33,4 @@ export type Elbow = readonly [readonly [number, number], readonly [number, numbe
|
|
|
33
33
|
* number, a node with two heights or two parents, no root or two roots, a cycle, a child over its parent, a
|
|
34
34
|
* leaf that is no category, and a category that no leaf names.
|
|
35
35
|
*/
|
|
36
|
-
export declare function checkTree(blockId: string, axis: "x" | "y", tree: FigureTree, categories:
|
|
36
|
+
export declare function checkTree(blockId: string, axis: "x" | "y", tree: FigureTree, categories: ReadonlyArray<Cell | undefined>): Result<CheckedTree, RenderProblem>;
|
|
@@ -54,19 +54,20 @@ export function checkTree(blockId, axis, tree, categories) {
|
|
|
54
54
|
edges.push({ parent, child, height });
|
|
55
55
|
}
|
|
56
56
|
const roots = [...childrenOf.keys()].filter((node) => !parentOf.has(node));
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
const root = roots[0];
|
|
58
|
+
if (root === undefined)
|
|
59
|
+
return fault(`holds a cycle through the node "${String(edges[0]?.parent)}".`);
|
|
59
60
|
if (roots.length > 1)
|
|
60
|
-
return fault(`holds more than one root, for example "${roots[0]}" and "${roots[1]}". A tree holds one root.`);
|
|
61
|
+
return fault(`holds more than one root, for example "${String(roots[0])}" and "${String(roots[1])}". A tree holds one root.`);
|
|
61
62
|
// Each child has one parent and the root has none, thus a walk from the root meets each node one time. A
|
|
62
63
|
// node that the walk never meets sits on a cycle apart from the root.
|
|
63
64
|
const preorder = [];
|
|
64
|
-
const stack = [
|
|
65
|
+
const stack = [root];
|
|
65
66
|
for (let node = stack.pop(); node !== undefined; node = stack.pop()) {
|
|
66
67
|
preorder.push(node);
|
|
67
68
|
const children = childrenOf.get(node) ?? [];
|
|
68
|
-
for (
|
|
69
|
-
stack.push(
|
|
69
|
+
for (const child of children.slice().reverse())
|
|
70
|
+
stack.push(child);
|
|
70
71
|
}
|
|
71
72
|
const met = new Set(preorder);
|
|
72
73
|
const stray = edges.find((edge) => !met.has(edge.parent));
|
|
@@ -96,9 +97,8 @@ export function checkTree(blockId, axis, tree, categories) {
|
|
|
96
97
|
const place = new Map(leaves.map((leaf, index) => [leaf, index]));
|
|
97
98
|
// The reverse of the preorder meets each child before its parent, and the walk met each node, thus each
|
|
98
99
|
// lookup below finds a place.
|
|
99
|
-
const placeOf = (node) => place.get(node);
|
|
100
|
-
for (
|
|
101
|
-
const node = preorder[index];
|
|
100
|
+
const placeOf = (node) => place.get(node) ?? Number.NaN;
|
|
101
|
+
for (const node of preorder.slice().reverse()) {
|
|
102
102
|
const children = childrenOf.get(node);
|
|
103
103
|
if (children === undefined)
|
|
104
104
|
continue;
|
|
@@ -119,7 +119,7 @@ export function checkTree(blockId, axis, tree, categories) {
|
|
|
119
119
|
[placeOf(edge.parent), edge.height],
|
|
120
120
|
];
|
|
121
121
|
});
|
|
122
|
-
return ok({ order, height: heightAt(
|
|
122
|
+
return ok({ order, height: heightAt(root), elbows });
|
|
123
123
|
}
|
|
124
124
|
/** The name of one node cell, or `undefined` for an empty cell. */
|
|
125
125
|
function nodeName(cell) {
|
|
@@ -8,11 +8,14 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { err, ok } from "neverthrow";
|
|
10
10
|
import { channelColumn, channelTransform } from "../../contracts/report-blocks.js";
|
|
11
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
11
12
|
import { SIZED_SERIES_MEMBER } from "../chart-renderers.js";
|
|
12
13
|
import { CHART_EXPORT_SIZES, CHART_INK } from "../design.js";
|
|
13
14
|
import { formatNumberCell } from "../number-format.js";
|
|
14
15
|
import { chartProblem, toNumber, transformColumn } from "./common.js";
|
|
15
16
|
import { EXPORT_PLOT_FRAMES, PAGE_PLOT_FRAME } from "./label-room.js";
|
|
17
|
+
/** The plot frames of each export size, keyed by the same kind that names the size. */
|
|
18
|
+
const EXPORT_SIZE_KINDS = ["single", "double", "slide"];
|
|
16
19
|
/**
|
|
17
20
|
* The symbol sizes in pixels of a dense figure: a signal point, and a point that states no finding.
|
|
18
21
|
*
|
|
@@ -47,8 +50,8 @@ export const BELOW_RESOLUTION_TOOLTIP = { formatter: "{b}<br/>{a}: p = 0" };
|
|
|
47
50
|
*/
|
|
48
51
|
export function belowResolutionRows(rows, pColumn, others) {
|
|
49
52
|
const found = [];
|
|
50
|
-
for (
|
|
51
|
-
if (toNumber(
|
|
53
|
+
for (const [index, row] of rows.entries()) {
|
|
54
|
+
if (toNumber(row[pColumn]) === 0 && others[index] !== null)
|
|
52
55
|
found.push(index);
|
|
53
56
|
}
|
|
54
57
|
return found;
|
|
@@ -117,8 +120,8 @@ export function pointNameSeries(names, placed) {
|
|
|
117
120
|
*/
|
|
118
121
|
export function sizedSeries(names, build) {
|
|
119
122
|
const widths = {};
|
|
120
|
-
for (const
|
|
121
|
-
widths[String(
|
|
123
|
+
for (const kind of EXPORT_SIZE_KINDS) {
|
|
124
|
+
widths[String(CHART_EXPORT_SIZES[kind].widthPx)] = build(EXPORT_PLOT_FRAMES[kind]);
|
|
122
125
|
}
|
|
123
126
|
const sized = { names, widths };
|
|
124
127
|
return { page: build(PAGE_PLOT_FRAME), member: { [SIZED_SERIES_MEMBER]: sized } };
|
|
@@ -187,16 +190,20 @@ export function smallest(values) {
|
|
|
187
190
|
/** The series of an option, as objects. */
|
|
188
191
|
export function seriesOf(option) {
|
|
189
192
|
const series = option.series;
|
|
190
|
-
return Array.isArray(series)
|
|
193
|
+
return Array.isArray(series)
|
|
194
|
+
? series.flatMap((entry) => {
|
|
195
|
+
const record = parseUnknownRecord(entry);
|
|
196
|
+
return record === undefined ? [] : [record];
|
|
197
|
+
})
|
|
198
|
+
: [];
|
|
191
199
|
}
|
|
192
200
|
/** The axis of an option as one object. A composition of one grid gives one object for each axis. */
|
|
193
201
|
export function axisOf(option, key) {
|
|
194
|
-
|
|
195
|
-
return typeof axis === "object" && axis !== null && !Array.isArray(axis) ? axis : {};
|
|
202
|
+
return parseUnknownRecord(option[key]) ?? {};
|
|
196
203
|
}
|
|
197
204
|
/** The fields of one layer of points: the fill, the opacity, the symbol size, and the drawing order. */
|
|
198
205
|
export function pointLayer(color, size, opacity, z) {
|
|
199
|
-
return { itemStyle: { color, opacity }, symbolSize: size,
|
|
206
|
+
return { itemStyle: { color, opacity }, symbolSize: size, z };
|
|
200
207
|
}
|
|
201
208
|
/** The shown text of a count in a legend name: a whole number with a thousands separator. */
|
|
202
209
|
export function countText(count) {
|
|
@@ -14,9 +14,12 @@
|
|
|
14
14
|
* The dots build through the composition machinery. The figure moves each dot onto the place of its category,
|
|
15
15
|
* and the page builds no such move, thus the rows stay inline whatever their count.
|
|
16
16
|
*/
|
|
17
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
17
18
|
import { err, ok } from "neverthrow";
|
|
18
19
|
import { channelColumn, channelOrder, channelTransform } from "../../contracts/report-blocks.js";
|
|
19
20
|
import { declaredForColumn } from "../../contracts/report-reference.js";
|
|
21
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
22
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
20
23
|
import { CHART_BODY_PX, SEQUENTIAL_RAMP } from "../design.js";
|
|
21
24
|
import { categoryAxis, categoryAxisTitle, chartProblem, colorScale, orderQuickCategories, sizeLegend, toNumber, transformedTitle, withFigureBody, } from "./common.js";
|
|
22
25
|
/** The band at the right of the plot that holds the color scale and the size legend, in percent of the width. */
|
|
@@ -69,10 +72,13 @@ export function wrappedTerm(term) {
|
|
|
69
72
|
if (lines.length <= DOTPLOT_TERM_LINES)
|
|
70
73
|
return lines.join("\n");
|
|
71
74
|
const kept = lines.slice(0, DOTPLOT_TERM_LINES);
|
|
72
|
-
const last = kept[
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
const last = kept[kept.length - 1];
|
|
76
|
+
if (last === undefined)
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
const words = last.split(" ");
|
|
79
|
+
while (words.length > 1 && `${words.join(" ")}…`.length > DOTPLOT_WRAP_CHARACTERS)
|
|
80
|
+
words.pop();
|
|
81
|
+
kept[kept.length - 1] = `${words.join(" ")}…`;
|
|
76
82
|
return kept.join("\n");
|
|
77
83
|
}
|
|
78
84
|
/**
|
|
@@ -104,10 +110,11 @@ function formatSource(context, channel) {
|
|
|
104
110
|
}
|
|
105
111
|
/** The members of one item: the array form, or the value of the object form. */
|
|
106
112
|
function itemValue(item) {
|
|
107
|
-
if (
|
|
113
|
+
if (isUnknownArray(item))
|
|
108
114
|
return item;
|
|
109
|
-
|
|
110
|
-
|
|
115
|
+
const carried = parseUnknownRecord(item)?.value;
|
|
116
|
+
if (isUnknownArray(carried))
|
|
117
|
+
return carried;
|
|
111
118
|
return undefined;
|
|
112
119
|
}
|
|
113
120
|
/** One item with its y member set to the place of its category. */
|
|
@@ -116,7 +123,7 @@ function placedItem(item, place) {
|
|
|
116
123
|
if (value === undefined)
|
|
117
124
|
return item;
|
|
118
125
|
const moved = [value[0], place, ...value.slice(2)];
|
|
119
|
-
return Array.isArray(item) ? moved : { ...item, value: moved };
|
|
126
|
+
return Array.isArray(item) ? moved : { ...parseUnknownRecord(item), value: moved };
|
|
120
127
|
}
|
|
121
128
|
function deriveDotplot(block, rows, context) {
|
|
122
129
|
const encoding = block.encoding ?? {};
|
|
@@ -142,9 +149,9 @@ function deriveDotplot(block, rows, context) {
|
|
|
142
149
|
x,
|
|
143
150
|
// The figure orders the y categories itself, thus the composition reads the plain column.
|
|
144
151
|
y: yColumn,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
152
|
+
size,
|
|
153
|
+
color,
|
|
154
|
+
label,
|
|
148
155
|
},
|
|
149
156
|
},
|
|
150
157
|
],
|
|
@@ -155,23 +162,26 @@ function deriveDotplot(block, rows, context) {
|
|
|
155
162
|
return err(composed.error);
|
|
156
163
|
const option = composed.value;
|
|
157
164
|
const places = new Map(categories.value.map((category, place) => [String(category), place]));
|
|
158
|
-
const series = (
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
const series = (isUnknownArray(option.series) ? option.series : []).map((entry) => {
|
|
166
|
+
const fields = parseUnknownRecord(entry) ?? {};
|
|
167
|
+
return {
|
|
168
|
+
...fields,
|
|
169
|
+
data: (isUnknownArray(fields.data) ? fields.data : []).flatMap((item) => {
|
|
170
|
+
const place = places.get(textOf(itemValue(item)?.[1]));
|
|
171
|
+
return place === undefined ? [] : [placedItem(item, place)];
|
|
172
|
+
}),
|
|
173
|
+
};
|
|
174
|
+
});
|
|
165
175
|
const wraps = categories.value.some((category) => String(category).length > DOTPLOT_WRAP_CHARACTERS);
|
|
166
176
|
// The series place each dot by the index of its term, thus the axis can show the wrapped text of a term.
|
|
167
177
|
const terms = wraps ? categories.value.map((category) => wrappedTerm(String(category))) : undefined;
|
|
168
178
|
const yAxis = {
|
|
169
179
|
...categoryAxis("y", terms ?? categories.value, { title: categoryAxisTitle(context.labels, yColumn), topDown: true }),
|
|
170
|
-
|
|
180
|
+
axisLabel: wraps ? { lineHeight: DOTPLOT_LINE_PX } : undefined,
|
|
171
181
|
};
|
|
172
182
|
const lines = terms === undefined ? 1 : highestOf(terms.map((term) => term.split("\n").length));
|
|
173
183
|
const body = (categories.value.length * (lines * DOTPLOT_LINE_PX + DOTPLOT_ROW_GAP_PX)) / DOTPLOT_PLOT_SHARE;
|
|
174
|
-
const maps =
|
|
184
|
+
const maps = isUnknownArray(option.visualMap) ? option.visualMap.map((entry) => parseUnknownRecord(entry) ?? {}) : [];
|
|
175
185
|
const keys = [];
|
|
176
186
|
const graphic = [];
|
|
177
187
|
const colorMap = maps.find((entry) => entry.show !== false);
|
|
@@ -183,13 +193,14 @@ function deriveDotplot(block, rows, context) {
|
|
|
183
193
|
}
|
|
184
194
|
const sizeMaps = maps.filter((entry) => entry.show === false);
|
|
185
195
|
keys.push(...sizeMaps);
|
|
186
|
-
|
|
187
|
-
|
|
196
|
+
const sizeMap = sizeMaps[0];
|
|
197
|
+
if (size !== undefined && sizeMap !== undefined) {
|
|
198
|
+
const range = { min: toNumber(sizeMap.min) ?? 0, max: toNumber(sizeMap.max) ?? 0 };
|
|
188
199
|
graphic.push(sizeLegend(range, scaleTitle(context.labels, size), formatSource(context, size)[0], DOTPLOT_SIZE_PLACE, formatSource(context, size)[1]));
|
|
189
200
|
}
|
|
190
|
-
const composedX =
|
|
201
|
+
const composedX = parseUnknownRecord(option.xAxis) ?? {};
|
|
191
202
|
const xAxis = composedX.type === "value"
|
|
192
|
-
? { ...composedX, boundaryGap: [...DOTPLOT_VALUE_ROOM], axisLabel: { ...composedX.axisLabel, hideOverlap: true } }
|
|
203
|
+
? { ...composedX, boundaryGap: [...DOTPLOT_VALUE_ROOM], axisLabel: { ...parseUnknownRecord(composedX.axisLabel), hideOverlap: true } }
|
|
193
204
|
: composedX;
|
|
194
205
|
const drawn = {
|
|
195
206
|
...option,
|
|
@@ -197,7 +208,7 @@ function deriveDotplot(block, rows, context) {
|
|
|
197
208
|
xAxis,
|
|
198
209
|
yAxis,
|
|
199
210
|
visualMap: keys,
|
|
200
|
-
|
|
211
|
+
graphic,
|
|
201
212
|
legend: { show: false },
|
|
202
213
|
// The grid holds its labels and its titles inside the chart, as the runtime does by default.
|
|
203
214
|
grid: { right: DOTPLOT_KEY_BAND },
|
|
@@ -218,17 +229,19 @@ function drawnMembers(series, dimension) {
|
|
|
218
229
|
}
|
|
219
230
|
/** The smallest of some values, or zero for none. */
|
|
220
231
|
function lowestOf(values) {
|
|
221
|
-
let low
|
|
222
|
-
for (const value of values)
|
|
223
|
-
if (value < low)
|
|
232
|
+
let low;
|
|
233
|
+
for (const value of values) {
|
|
234
|
+
if (low === undefined || value < low)
|
|
224
235
|
low = value;
|
|
225
|
-
|
|
236
|
+
}
|
|
237
|
+
return low ?? 0;
|
|
226
238
|
}
|
|
227
239
|
/** The largest of some values, or one for none. */
|
|
228
240
|
function highestOf(values) {
|
|
229
|
-
let high
|
|
230
|
-
for (const value of values)
|
|
231
|
-
if (value > high)
|
|
241
|
+
let high;
|
|
242
|
+
for (const value of values) {
|
|
243
|
+
if (high === undefined || value > high)
|
|
232
244
|
high = value;
|
|
233
|
-
|
|
245
|
+
}
|
|
246
|
+
return high ?? 1;
|
|
234
247
|
}
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
import { err, ok } from "neverthrow";
|
|
19
19
|
import { channelColumn, channelOrder, channelTransform } from "../../contracts/report-blocks.js";
|
|
20
20
|
import { declaredForColumn } from "../../contracts/report-reference.js";
|
|
21
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
22
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
21
23
|
import { CHART_INK, CHART_PAGE_TEXT_PX, DIVERGING_RAMP, SEQUENTIAL_RAMP } from "../design.js";
|
|
22
24
|
import { categoricalPalette, categoryName, chartProblem, colorScale, firstAppearance, toNumber, transformColumn, valueAxisTitle } from "./common.js";
|
|
23
25
|
import { equalRanges, squareLayout } from "./equal-units.js";
|
|
@@ -120,13 +122,13 @@ function deriveEmbedding(block, rows, context) {
|
|
|
120
122
|
encoding: {
|
|
121
123
|
x,
|
|
122
124
|
y,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
group,
|
|
126
|
+
color,
|
|
127
|
+
label,
|
|
126
128
|
},
|
|
127
129
|
},
|
|
128
130
|
],
|
|
129
|
-
|
|
131
|
+
facet,
|
|
130
132
|
};
|
|
131
133
|
const composed = context.compose(composition, color !== undefined ? { colorOnTop: true } : {});
|
|
132
134
|
if (composed.isErr())
|
|
@@ -157,22 +159,23 @@ function deriveEmbedding(block, rows, context) {
|
|
|
157
159
|
x: px,
|
|
158
160
|
y: py,
|
|
159
161
|
panel: facetCell === null ? 0 : (panelOf.get(`${typeof facetCell}:${String(facetCell)}`) ?? 0),
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
group: cellGroup === null ? undefined : categoryName(cellGroup),
|
|
163
|
+
color: cellColor ?? undefined,
|
|
162
164
|
});
|
|
163
165
|
}
|
|
164
166
|
const option = composed.value;
|
|
165
167
|
const panels = Math.max(1, panelNames.length);
|
|
166
168
|
const pointPx = embeddingPointPx(cells.length);
|
|
167
|
-
const series = (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
const series = (isUnknownArray(option.series) ? option.series : []).map((entry) => {
|
|
170
|
+
const fields = parseUnknownRecord(entry) ?? {};
|
|
171
|
+
const itemStyle = parseUnknownRecord(fields.itemStyle);
|
|
172
|
+
return {
|
|
173
|
+
...fields,
|
|
174
|
+
large: color === undefined && cells.length >= EMBEDDING_LARGE_CELLS,
|
|
175
|
+
symbolSize: pointPx,
|
|
176
|
+
itemStyle: itemStyle === undefined ? { opacity: EMBEDDING_OPACITY } : { ...itemStyle, opacity: EMBEDDING_OPACITY },
|
|
177
|
+
};
|
|
178
|
+
});
|
|
176
179
|
const ranges = equalRanges(cells.map((cell) => cell.x), cells.map((cell) => cell.y), { pad: EMBEDDING_PAD, round: false });
|
|
177
180
|
const scaleTitle = color !== undefined ? valueAxisTitle(context.labels, channelName(color)) : "";
|
|
178
181
|
const scaleBand = Math.max(EMBEDDING_SCALE_BAND_PX, Math.ceil(scaleTitle.length * CHART_PAGE_TEXT_PX * SCALE_CHARACTER_SHARE) + SCALE_BAND_PAD_PX);
|
|
@@ -188,34 +191,36 @@ function deriveEmbedding(block, rows, context) {
|
|
|
188
191
|
const keyStyle = { color: CHART_INK, align: "left" };
|
|
189
192
|
for (let panel = 0; panel < panels; panel += 1) {
|
|
190
193
|
const key = panel === 0;
|
|
194
|
+
const keyFields = key
|
|
195
|
+
? {
|
|
196
|
+
name: `${valueAxisTitle(context.labels, channelName(x))}${KEY_ARROW}`,
|
|
197
|
+
nameLocation: "start",
|
|
198
|
+
nameGap: 0,
|
|
199
|
+
nameTextStyle: { ...keyStyle, verticalAlign: "top" },
|
|
200
|
+
}
|
|
201
|
+
: undefined;
|
|
191
202
|
xAxes.push({
|
|
192
203
|
type: "value",
|
|
193
204
|
gridIndex: panel,
|
|
194
205
|
...ranges.x,
|
|
195
206
|
...HIDDEN_AXIS_PARTS,
|
|
196
|
-
...
|
|
197
|
-
? {
|
|
198
|
-
name: `${valueAxisTitle(context.labels, channelName(x))}${KEY_ARROW}`,
|
|
199
|
-
nameLocation: "start",
|
|
200
|
-
nameGap: 0,
|
|
201
|
-
nameTextStyle: { ...keyStyle, verticalAlign: "top" },
|
|
202
|
-
}
|
|
203
|
-
: {}),
|
|
207
|
+
...keyFields,
|
|
204
208
|
});
|
|
209
|
+
const yKeyFields = key
|
|
210
|
+
? {
|
|
211
|
+
name: `${valueAxisTitle(context.labels, channelName(y))}${KEY_ARROW}`,
|
|
212
|
+
nameLocation: "start",
|
|
213
|
+
nameRotate: 90,
|
|
214
|
+
nameGap: 0,
|
|
215
|
+
nameTextStyle: { ...keyStyle, verticalAlign: "bottom" },
|
|
216
|
+
}
|
|
217
|
+
: undefined;
|
|
205
218
|
yAxes.push({
|
|
206
219
|
type: "value",
|
|
207
220
|
gridIndex: panel,
|
|
208
221
|
...ranges.y,
|
|
209
222
|
...HIDDEN_AXIS_PARTS,
|
|
210
|
-
...
|
|
211
|
-
? {
|
|
212
|
-
name: `${valueAxisTitle(context.labels, channelName(y))}${KEY_ARROW}`,
|
|
213
|
-
nameLocation: "start",
|
|
214
|
-
nameRotate: 90,
|
|
215
|
-
nameGap: 0,
|
|
216
|
-
nameTextStyle: { ...keyStyle, verticalAlign: "bottom" },
|
|
217
|
-
}
|
|
218
|
-
: {}),
|
|
223
|
+
...yKeyFields,
|
|
219
224
|
});
|
|
220
225
|
}
|
|
221
226
|
// Each panel names its facet value on an axis of no series over its square, thus the name moves with the square.
|
|
@@ -232,7 +237,7 @@ function deriveEmbedding(block, rows, context) {
|
|
|
232
237
|
});
|
|
233
238
|
}
|
|
234
239
|
const out = {
|
|
235
|
-
|
|
240
|
+
tooltip: option.tooltip,
|
|
236
241
|
grid: layout.grid,
|
|
237
242
|
xAxis: xAxes,
|
|
238
243
|
yAxis: yAxes,
|
|
@@ -248,9 +253,11 @@ function deriveEmbedding(block, rows, context) {
|
|
|
248
253
|
series: [...series, ...nameSeries(cells, names, panels, ranges)],
|
|
249
254
|
});
|
|
250
255
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
256
|
+
if (color === undefined) {
|
|
257
|
+
return err(chartProblem(block.id, 'The embedding colors its cells by a "group" channel or by a "color" channel. Name one of the two.'));
|
|
258
|
+
}
|
|
259
|
+
const map = clippedScale(cells.flatMap((cell) => (cell.color === undefined ? [] : [cell.color])), scaleTitle, channelName(color), declaredForColumn(context.meanings, channelColumn(color)));
|
|
260
|
+
const composedMaps = isUnknownArray(option.visualMap) ? option.visualMap.map((entry) => parseUnknownRecord(entry) ?? {}) : [];
|
|
254
261
|
const seriesIndex = composedMaps.find((entry) => entry.dimension === 2)?.seriesIndex ?? series.map((_entry, index) => index);
|
|
255
262
|
const place = layout.visualMap?.[0] ?? {};
|
|
256
263
|
return ok({ ...out, visualMap: [{ type: "continuous", seriesIndex, dimension: 2, ...map, ...place }] });
|
|
@@ -265,7 +272,8 @@ function deriveEmbedding(block, rows, context) {
|
|
|
265
272
|
*/
|
|
266
273
|
function clippedScale(values, title, column, meaning) {
|
|
267
274
|
const sorted = [...values].sort((a, b) => a - b);
|
|
268
|
-
const
|
|
275
|
+
const first = sorted[0];
|
|
276
|
+
const negative = first !== undefined && first < 0;
|
|
269
277
|
if (negative) {
|
|
270
278
|
const reach = quantile(values.map((value) => Math.abs(value)).sort((a, b) => a - b), EMBEDDING_CLIP_QUANTILE);
|
|
271
279
|
const end = reach > 0 ? reach : 1;
|
|
@@ -273,7 +281,8 @@ function clippedScale(values, title, column, meaning) {
|
|
|
273
281
|
}
|
|
274
282
|
const positive = sorted.find((value) => value > 0);
|
|
275
283
|
const clip = quantile(sorted, EMBEDDING_CLIP_QUANTILE);
|
|
276
|
-
const
|
|
284
|
+
const last = sorted[sorted.length - 1];
|
|
285
|
+
const top = clip > 0 ? clip : last !== undefined && last > 0 ? last : 1;
|
|
277
286
|
const low = positive === undefined ? top : Math.min(positive, top);
|
|
278
287
|
return {
|
|
279
288
|
...withoutRight(colorScale({ min: 0, max: top, ramp: SEQUENTIAL_RAMP }, title, column, meaning)),
|
|
@@ -290,12 +299,12 @@ function withoutRight(map) {
|
|
|
290
299
|
* The linear quantile of sorted values, as numpy and R type 7 give it. An empty list gives zero.
|
|
291
300
|
*/
|
|
292
301
|
function quantile(sorted, p) {
|
|
293
|
-
if (sorted.length === 0)
|
|
294
|
-
return 0;
|
|
295
302
|
const place = (sorted.length - 1) * p;
|
|
296
|
-
const low = Math.floor(place);
|
|
297
|
-
const high = Math.ceil(place);
|
|
298
|
-
|
|
303
|
+
const low = sorted[Math.floor(place)];
|
|
304
|
+
const high = sorted[Math.ceil(place)];
|
|
305
|
+
if (low === undefined || high === undefined)
|
|
306
|
+
return 0;
|
|
307
|
+
return low + (high - low) * (place - Math.floor(place));
|
|
299
308
|
}
|
|
300
309
|
/**
|
|
301
310
|
* The series of the category names on the data: one name for each category of each panel, at the median x and
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import type { EchartOption } from "../chart.js";
|
|
25
25
|
/** The margins around the squares, in pixels at the page text size. */
|
|
26
|
-
export
|
|
26
|
+
export type SquareMargins = {
|
|
27
27
|
readonly top: number;
|
|
28
28
|
readonly bottom: number;
|
|
29
29
|
readonly left: number;
|
|
30
30
|
readonly right: number;
|
|
31
|
-
}
|
|
31
|
+
};
|
|
32
32
|
/** What one square layout places: the panels, their margins, and the members of the band at their right. */
|
|
33
|
-
export
|
|
33
|
+
export type SquareLayoutFields = {
|
|
34
34
|
readonly panels: number;
|
|
35
35
|
readonly margins: SquareMargins;
|
|
36
36
|
/** The width in pixels of the band at the right of the squares, or 0 for no band. */
|
|
@@ -61,14 +61,14 @@ export interface SquareLayoutFields {
|
|
|
61
61
|
readonly series: number;
|
|
62
62
|
readonly insetPx: number;
|
|
63
63
|
};
|
|
64
|
-
}
|
|
64
|
+
};
|
|
65
65
|
/** The grids of a square layout, the places of the band members, and the media rules that resize them. */
|
|
66
|
-
export
|
|
66
|
+
export type SquareLayout = {
|
|
67
67
|
readonly grid: EchartOption[];
|
|
68
68
|
readonly legend?: EchartOption;
|
|
69
69
|
readonly visualMap?: EchartOption[];
|
|
70
70
|
readonly media: EchartOption[];
|
|
71
|
-
}
|
|
71
|
+
};
|
|
72
72
|
/**
|
|
73
73
|
* The layout of some square panels, and of the band at their right.
|
|
74
74
|
*
|
|
@@ -77,16 +77,16 @@ export interface SquareLayout {
|
|
|
77
77
|
*/
|
|
78
78
|
export declare function squareLayout(fields: SquareLayoutFields): SquareLayout;
|
|
79
79
|
/** The range of one axis. */
|
|
80
|
-
export
|
|
80
|
+
export type AxisRange = {
|
|
81
81
|
readonly min: number;
|
|
82
82
|
readonly max: number;
|
|
83
|
-
}
|
|
83
|
+
};
|
|
84
84
|
/** The ranges of the two axes of one unit, and the tick step of a rounded pair. */
|
|
85
|
-
export
|
|
85
|
+
export type EqualRanges = {
|
|
86
86
|
readonly x: AxisRange;
|
|
87
87
|
readonly y: AxisRange;
|
|
88
88
|
readonly step?: number;
|
|
89
|
-
}
|
|
89
|
+
};
|
|
90
90
|
/**
|
|
91
91
|
* The ranges of two axes that share one unit: each axis spans one length, around its own data.
|
|
92
92
|
*
|
|
@@ -61,7 +61,7 @@ const POINT_MIN_PX = 1;
|
|
|
61
61
|
*/
|
|
62
62
|
export function squareLayout(fields) {
|
|
63
63
|
const placements = SQUARE_SIDES.map((side) => placement(side, fields, marginScale(side), TOOLBOX_BAND_PX));
|
|
64
|
-
const smallest = placements[0];
|
|
64
|
+
const smallest = placements[0] ?? placement(SQUARE_MIN_PX, fields, marginScale(SQUARE_MIN_PX), TOOLBOX_BAND_PX);
|
|
65
65
|
const media = placements.map((entry, index) => ({
|
|
66
66
|
// The first rule matches every container, thus a container that shrinks past a rule falls back to it.
|
|
67
67
|
query: index === 0 ? { minWidth: 0 } : { minWidth: entry.minWidth, minHeight: entry.minHeight },
|
|
@@ -70,7 +70,7 @@ export function squareLayout(fields) {
|
|
|
70
70
|
for (const size of EXPORT_SIZES) {
|
|
71
71
|
const scale = size.textPx / CHART_PAGE_TEXT_PX;
|
|
72
72
|
const fitting = SQUARE_SIDES.map((side) => placement(side, fields, scale, 0)).filter((entry) => entry.minWidth <= size.widthPx && entry.minHeight <= size.heightPx);
|
|
73
|
-
const chosen = fitting
|
|
73
|
+
const chosen = fitting[fitting.length - 1] ?? placement(SQUARE_MIN_PX, fields, scale, 0);
|
|
74
74
|
media.push({
|
|
75
75
|
query: { minWidth: size.widthPx, maxWidth: size.widthPx, minHeight: size.heightPx, maxHeight: size.heightPx },
|
|
76
76
|
option: placedOption(shifted(chosen, Math.max(0, Math.floor((size.widthPx - chosen.minWidth) / 2)))),
|
|
@@ -78,8 +78,8 @@ export function squareLayout(fields) {
|
|
|
78
78
|
}
|
|
79
79
|
return {
|
|
80
80
|
grid: smallest.grid,
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
legend: smallest.legend,
|
|
82
|
+
visualMap: smallest.visualMap,
|
|
83
83
|
media,
|
|
84
84
|
};
|
|
85
85
|
}
|
|
@@ -92,20 +92,20 @@ function marginScale(side) {
|
|
|
92
92
|
/** The option of one media rule: the point size, the grids, the legend, and the color scales of one placement. */
|
|
93
93
|
function placedOption(entry) {
|
|
94
94
|
return {
|
|
95
|
-
|
|
95
|
+
series: entry.series,
|
|
96
96
|
grid: entry.grid,
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
legend: entry.legend,
|
|
98
|
+
visualMap: entry.visualMap,
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
101
|
/** One placement moved right by some pixels: each grid, the legend, and each color scale. */
|
|
102
102
|
function shifted(entry, by) {
|
|
103
|
-
const move = (member) => ({ ...member, left: member.left + by });
|
|
103
|
+
const move = (member) => ({ ...member, left: Number(member.left) + by });
|
|
104
104
|
return {
|
|
105
105
|
...entry,
|
|
106
106
|
grid: entry.grid.map(move),
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
legend: entry.legend === undefined ? undefined : move(entry.legend),
|
|
108
|
+
visualMap: entry.visualMap?.map(move),
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
@@ -136,8 +136,8 @@ function placement(side, fields, scale, leastTop) {
|
|
|
136
136
|
const pointPx = points === undefined ? 0 : Math.max(POINT_MIN_PX, Math.round(points.px * Math.min(1, side / POINT_SCALE_FROM_PX) * 10) / 10);
|
|
137
137
|
const squareLabel = fields.squareLabel;
|
|
138
138
|
const series = Array.from({ length: Math.max(points?.series ?? 0, squareLabel === undefined ? 0 : squareLabel.series + 1) }, (_entry, index) => ({
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
symbolSize: points !== undefined && index < points.series ? pointPx : undefined,
|
|
140
|
+
label: squareLabel !== undefined && index === squareLabel.series ? { width: side - 2 * squareLabel.insetPx, overflow: "break" } : undefined,
|
|
141
141
|
}));
|
|
142
142
|
const blockBottom = top + rows * side + (rows - 1) * gap + margin(fields.margins.bottom);
|
|
143
143
|
const bottomBand = fields.legendBand;
|
|
@@ -149,12 +149,10 @@ function placement(side, fields, scale, leastTop) {
|
|
|
149
149
|
? { legend: { left: bandLeft, top } }
|
|
150
150
|
: { legend: { left, top: blockBottom, width: blockRight - left, orient: "horizontal" } };
|
|
151
151
|
return {
|
|
152
|
-
|
|
152
|
+
series,
|
|
153
153
|
grid,
|
|
154
154
|
...legend,
|
|
155
|
-
|
|
156
|
-
? { visualMap: Array.from({ length: fields.visualMaps }, () => ({ left: bandLeft, top })) }
|
|
157
|
-
: {}),
|
|
155
|
+
visualMap: Array.from({ length: fields.visualMaps ?? 0 }, () => ({ left: bandLeft, top })),
|
|
158
156
|
minWidth: blockRight + band + margin(fields.margins.right),
|
|
159
157
|
minHeight: blockBottom + legendHeight,
|
|
160
158
|
};
|
|
@@ -176,26 +174,28 @@ export function equalRanges(xs, ys, fields) {
|
|
|
176
174
|
return { x: around(x, length), y: around(y, length) };
|
|
177
175
|
}
|
|
178
176
|
const step = roundStep(length / 5);
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
const
|
|
177
|
+
const snap = (range) => ({ min: Math.floor(range.min / step), max: Math.ceil(range.max / step) });
|
|
178
|
+
const xSnapped = snap(x);
|
|
179
|
+
const ySnapped = snap(y);
|
|
180
|
+
const steps = Math.max(xSnapped.max - xSnapped.min, ySnapped.max - ySnapped.min, 1);
|
|
181
|
+
const widen = (range) => {
|
|
182
182
|
const short = steps - (range.max - range.min);
|
|
183
183
|
return { min: exact((range.min - Math.ceil(short / 2)) * step), max: exact((range.max + Math.floor(short / 2)) * step) };
|
|
184
|
-
}
|
|
185
|
-
return { x:
|
|
184
|
+
};
|
|
185
|
+
return { x: widen(xSnapped), y: widen(ySnapped), step };
|
|
186
186
|
}
|
|
187
187
|
/** The extent of some values, or the unit range for no value. */
|
|
188
188
|
function extent(values) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
let min = values[0];
|
|
192
|
-
let max = values[0];
|
|
189
|
+
let min;
|
|
190
|
+
let max;
|
|
193
191
|
for (const value of values) {
|
|
194
|
-
if (value < min)
|
|
192
|
+
if (min === undefined || value < min)
|
|
195
193
|
min = value;
|
|
196
|
-
if (value > max)
|
|
194
|
+
if (max === undefined || value > max)
|
|
197
195
|
max = value;
|
|
198
196
|
}
|
|
197
|
+
if (min === undefined || max === undefined)
|
|
198
|
+
return { min: 0, max: 1 };
|
|
199
199
|
return { min, max };
|
|
200
200
|
}
|
|
201
201
|
/** One range of the given length around the middle of an extent. */
|