@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
|
@@ -5,7 +5,59 @@
|
|
|
5
5
|
* belief points at. The harness declares the seam here, thus a production realization can read storage,
|
|
6
6
|
* and a fixture realization can read an in-memory snapshot. The two obey the same contract.
|
|
7
7
|
*/
|
|
8
|
+
import { err, ok } from "neverthrow";
|
|
9
|
+
import { z } from "zod";
|
|
8
10
|
import { asFiniteNumber } from "./assert-rules.js";
|
|
11
|
+
/** One cell that a row of a snapshot may hold: a string or a number, or one of the empty-cell shapes. */
|
|
12
|
+
const CellSchema = z.union([z.string(), z.number()]).nullish();
|
|
13
|
+
/**
|
|
14
|
+
* Put one own data property on a row.
|
|
15
|
+
*
|
|
16
|
+
* A plain assignment at the key `__proto__` reaches the prototype setter, thus the row loses a column
|
|
17
|
+
* that the payload carries. The definition makes an own data property for each key.
|
|
18
|
+
*/
|
|
19
|
+
function defineOwn(target, key, value) {
|
|
20
|
+
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Give back the present cells of a snapshot entry's rows, or an empty array for an entry with no rows.
|
|
24
|
+
*
|
|
25
|
+
* The structural tier and the fixture resolver both read this one parse. Thus the two tiers can never
|
|
26
|
+
* disagree about the rows of one entry.
|
|
27
|
+
*
|
|
28
|
+
* A real parser gives an empty cell back as an absent key, `undefined`, or `null`; the parse admits each
|
|
29
|
+
* and yields the present cells, so the reads below see one absence shape only. The `Err` channel carries
|
|
30
|
+
* the account of a row that the artifact forbids: an entry of the rows list that is not a record, or a
|
|
31
|
+
* cell that is neither a string nor a number. The caller refuses the reference through its own channel,
|
|
32
|
+
* so a malformed row never throws out of resolution.
|
|
33
|
+
*/
|
|
34
|
+
export function snapshotRows(entry) {
|
|
35
|
+
const rows = entry?.rows;
|
|
36
|
+
if (rows === undefined)
|
|
37
|
+
return ok([]);
|
|
38
|
+
if (!Array.isArray(rows))
|
|
39
|
+
return err("the rows of the artifact are not a list");
|
|
40
|
+
const list = rows;
|
|
41
|
+
const parsed = [];
|
|
42
|
+
for (const [index, row] of list.entries()) {
|
|
43
|
+
if (row === null || typeof row !== "object" || Array.isArray(row)) {
|
|
44
|
+
return err(`row ${index} of the artifact is not a record`);
|
|
45
|
+
}
|
|
46
|
+
const cells = {};
|
|
47
|
+
for (const column of Object.keys(row)) {
|
|
48
|
+
const cell = Reflect.get(row, column);
|
|
49
|
+
const read = CellSchema.safeParse(cell);
|
|
50
|
+
if (!read.success) {
|
|
51
|
+
return err(`the cell ${column} of row ${index} is neither a string, a number, nor empty`);
|
|
52
|
+
}
|
|
53
|
+
if (read.data !== undefined && read.data !== null) {
|
|
54
|
+
defineOwn(cells, column, read.data);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
parsed.push(cells);
|
|
58
|
+
}
|
|
59
|
+
return ok(parsed);
|
|
60
|
+
}
|
|
9
61
|
/**
|
|
10
62
|
* Give back each name in `columns` that no row holds, in the order of `columns`.
|
|
11
63
|
*
|
|
@@ -47,15 +99,19 @@ function rankText(left, right) {
|
|
|
47
99
|
return 0;
|
|
48
100
|
}
|
|
49
101
|
/**
|
|
50
|
-
*
|
|
102
|
+
* The row as a rankable row, or `undefined` for a row that holds no rank in the column. The bound keeps
|
|
103
|
+
* such a row last in either direction.
|
|
51
104
|
*
|
|
52
105
|
* A row that the column does not reach carries no value to rank. In a numeric column a cell that reads as
|
|
53
106
|
* no number carries none either: a sentinel such as `NA` is the absence of a measurement, and a rank for it
|
|
54
107
|
* against a real value would be invented. Thus a descending bound of the top 20 rows gives 20 measurements,
|
|
55
108
|
* and never 20 sentinels.
|
|
56
109
|
*/
|
|
57
|
-
function
|
|
58
|
-
|
|
110
|
+
function asRankable(entry, numeric) {
|
|
111
|
+
const { cell } = entry;
|
|
112
|
+
if (cell === undefined || (numeric && entry.value === undefined))
|
|
113
|
+
return undefined;
|
|
114
|
+
return { ...entry, cell };
|
|
59
115
|
}
|
|
60
116
|
/**
|
|
61
117
|
* The rank of two rows that both hold one. A numeric column compares the parsed numbers, and a column
|
|
@@ -92,8 +148,15 @@ export function applyRowBound(rows, bound) {
|
|
|
92
148
|
const numeric = ranked.some((entry) => entry.value !== undefined);
|
|
93
149
|
// A row with no rank stays behind every ranked row, and the direction never lifts it. The two lists
|
|
94
150
|
// keep their source order, thus the tail is as stable as the head.
|
|
95
|
-
const rankable =
|
|
96
|
-
const unrankable =
|
|
151
|
+
const rankable = [];
|
|
152
|
+
const unrankable = [];
|
|
153
|
+
for (const entry of ranked) {
|
|
154
|
+
const kept = asRankable(entry, numeric);
|
|
155
|
+
if (kept === undefined)
|
|
156
|
+
unrankable.push(entry);
|
|
157
|
+
else
|
|
158
|
+
rankable.push(kept);
|
|
159
|
+
}
|
|
97
160
|
const sorted = [...rankable].sort((left, right) => {
|
|
98
161
|
const rank = rankRankable(left, right, numeric);
|
|
99
162
|
return rank === 0 ? left.index - right.index : descending ? -rank : rank;
|
|
@@ -22,17 +22,23 @@
|
|
|
22
22
|
import { err, ok } from "neverthrow";
|
|
23
23
|
import { snapshotEntry } from "./reference-resolver.js";
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Give the authored record of an object that takes a stamp, or `undefined` when the object takes none.
|
|
26
26
|
*
|
|
27
|
-
* The
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* The test reads the shape alone, because the payload reaches the stamp before the grammar parse. A hash
|
|
28
|
+
* that the object carries decides nothing here, because the stamp writes the hash of the snapshot over it.
|
|
29
|
+
* The copy the function returns is the refusal's view of the author's object: the walk still stamps and
|
|
30
|
+
* returns the original, and the copy holds the same own enumerable fields, so the serialized refusal is
|
|
31
|
+
* unchanged.
|
|
30
32
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
33
|
+
function stampablePin(record) {
|
|
34
|
+
if (!("kind" in record) || !("path" in record))
|
|
35
|
+
return undefined;
|
|
36
|
+
const kind = record.kind;
|
|
37
|
+
const path = record.path;
|
|
38
|
+
const pinned = kind === "artifact-value" ? "artifact-value" : kind === "artifact-table" ? "artifact-table" : kind === "artifact-file" ? "artifact-file" : undefined;
|
|
39
|
+
if (pinned === undefined || typeof path !== "string")
|
|
40
|
+
return undefined;
|
|
41
|
+
return { path, record: { ...record, kind: pinned, path } };
|
|
36
42
|
}
|
|
37
43
|
/**
|
|
38
44
|
* Put one own data property on a copy.
|
|
@@ -43,19 +49,6 @@ function holdsPin(record) {
|
|
|
43
49
|
function defineOwn(target, key, value) {
|
|
44
50
|
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
45
51
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Give the artifact path of an object that takes a stamp, or `undefined` when the object takes none.
|
|
48
|
-
*
|
|
49
|
-
* The test reads the shape alone, because the payload reaches the stamp before the grammar parse. A hash
|
|
50
|
-
* that the object carries decides nothing here, because the stamp writes the hash of the snapshot over it.
|
|
51
|
-
*/
|
|
52
|
-
function stampablePath(record) {
|
|
53
|
-
const { path } = record;
|
|
54
|
-
if (!holdsPin(record) || typeof path !== "string") {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
return path;
|
|
58
|
-
}
|
|
59
52
|
/**
|
|
60
53
|
* Walk one value, and give the value with the hash of each artifact reference filled from the snapshot.
|
|
61
54
|
*
|
|
@@ -78,23 +71,23 @@ function stampValue(value, snapshot, missing) {
|
|
|
78
71
|
if (value === null || typeof value !== "object") {
|
|
79
72
|
return value;
|
|
80
73
|
}
|
|
81
|
-
const record = value;
|
|
82
74
|
let changed = false;
|
|
83
75
|
const next = {};
|
|
84
|
-
for (const key of Object.keys(
|
|
85
|
-
const
|
|
86
|
-
|
|
76
|
+
for (const key of Object.keys(value)) {
|
|
77
|
+
const held = Reflect.get(value, key);
|
|
78
|
+
const stamped = stampValue(held, snapshot, missing);
|
|
79
|
+
if (stamped !== held) {
|
|
87
80
|
changed = true;
|
|
88
81
|
}
|
|
89
82
|
defineOwn(next, key, stamped);
|
|
90
83
|
}
|
|
91
|
-
const
|
|
92
|
-
if (
|
|
84
|
+
const pin = stampablePin(value);
|
|
85
|
+
if (pin === undefined) {
|
|
93
86
|
return changed ? next : value;
|
|
94
87
|
}
|
|
95
|
-
const entry = snapshotEntry(snapshot, path);
|
|
88
|
+
const entry = snapshotEntry(snapshot, pin.path);
|
|
96
89
|
if (entry === undefined) {
|
|
97
|
-
missing.push({ path, record });
|
|
90
|
+
missing.push({ path: pin.path, record: pin.record });
|
|
98
91
|
return changed ? next : value;
|
|
99
92
|
}
|
|
100
93
|
return { ...next, hash: entry.hash };
|
|
@@ -116,9 +109,8 @@ export function stampReferenceHashes(payload, snapshot) {
|
|
|
116
109
|
return ok(stamped);
|
|
117
110
|
}
|
|
118
111
|
const unresolved = missing.map((pin) => ({
|
|
119
|
-
// The payload reaches the stamp before the parse, thus the
|
|
120
|
-
//
|
|
121
|
-
// where the pre-parse shape enters the parsed reference type.
|
|
112
|
+
// The payload reaches the stamp before the parse, thus the refusal carries the object as the
|
|
113
|
+
// author wrote it, and the `AuthoredPinRecord` arm of `UnresolvedReferenceSchema` types it.
|
|
122
114
|
reference: pin.record,
|
|
123
115
|
reason: "artifact-missing",
|
|
124
116
|
detail: `no artifact at ${pin.path}`,
|
|
@@ -154,17 +146,17 @@ export function stripReferenceHashes(value) {
|
|
|
154
146
|
if (value === null || typeof value !== "object") {
|
|
155
147
|
return value;
|
|
156
148
|
}
|
|
157
|
-
const
|
|
158
|
-
const pinned = holdsPin(record);
|
|
149
|
+
const pinned = stampablePin(value) !== undefined;
|
|
159
150
|
let changed = false;
|
|
160
151
|
const next = {};
|
|
161
|
-
for (const key of Object.keys(
|
|
152
|
+
for (const key of Object.keys(value)) {
|
|
162
153
|
if (pinned && key === "hash") {
|
|
163
154
|
changed = true;
|
|
164
155
|
continue;
|
|
165
156
|
}
|
|
166
|
-
const
|
|
167
|
-
|
|
157
|
+
const held = Reflect.get(value, key);
|
|
158
|
+
const stripped = stripReferenceHashes(held);
|
|
159
|
+
if (stripped !== held) {
|
|
168
160
|
changed = true;
|
|
169
161
|
}
|
|
170
162
|
defineOwn(next, key, stripped);
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* value. As a result the costly read happens one time for each report version, and never for each edit.
|
|
9
9
|
*/
|
|
10
10
|
import { err, ok } from "neverthrow";
|
|
11
|
-
import { columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry } from "./reference-resolver.js";
|
|
11
|
+
import { columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, snapshotRows } from "./reference-resolver.js";
|
|
12
12
|
/** Build an `Err` that carries the unresolved reference. The `detail` key is present only when there is a detail to carry. */
|
|
13
13
|
function fail(reference, reason, detail) {
|
|
14
14
|
const failure = detail !== undefined ? { reference, reason, detail } : { reference, reason };
|
|
@@ -29,7 +29,7 @@ function validatePin(reference, snapshot) {
|
|
|
29
29
|
const readsACell = reference.kind === "artifact-value" || reference.kind === "artifact-table";
|
|
30
30
|
const fileType = entry.fileType;
|
|
31
31
|
if (readsACell && fileTypeHoldsNoCell(fileType)) {
|
|
32
|
-
return fail(reference, "unreadable-artifact", `the ${fileType} at ${reference.path} holds no cell to read`);
|
|
32
|
+
return fail(reference, "unreadable-artifact", `the ${String(fileType)} at ${reference.path} holds no cell to read`);
|
|
33
33
|
}
|
|
34
34
|
return ok();
|
|
35
35
|
}
|
|
@@ -51,7 +51,11 @@ function validateColumns(reference, snapshot, columns) {
|
|
|
51
51
|
return fail(reference, "locator-out-of-range", `the chart names column ${outside.join(", ")}, which the bound column subset leaves out`);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
const
|
|
54
|
+
const readRows = snapshotRows(snapshotEntry(snapshot, reference.path));
|
|
55
|
+
if (readRows.isErr()) {
|
|
56
|
+
return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
|
|
57
|
+
}
|
|
58
|
+
const absent = columnsHeldByNoRow(readRows.value, columns);
|
|
55
59
|
if (absent.length > 0) {
|
|
56
60
|
return fail(reference, "locator-out-of-range", `the chart names column ${absent.join(", ")}, which the bound table does not hold`);
|
|
57
61
|
}
|
|
@@ -80,7 +84,11 @@ export function validateReferenceStructure(reference, snapshot, columns) {
|
|
|
80
84
|
// artifact does not hold refuses here, exactly as a grammar column of a chart does.
|
|
81
85
|
const bound = reference.rowBound;
|
|
82
86
|
if (bound !== undefined) {
|
|
83
|
-
const
|
|
87
|
+
const readRows = snapshotRows(snapshotEntry(snapshot, reference.path));
|
|
88
|
+
if (readRows.isErr()) {
|
|
89
|
+
return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
|
|
90
|
+
}
|
|
91
|
+
const absent = columnsHeldByNoRow(readRows.value, [bound.column]);
|
|
84
92
|
if (absent.length > 0) {
|
|
85
93
|
return fail(reference, "locator-out-of-range", `the row bound names column ${bound.column}, which the bound table does not hold`);
|
|
86
94
|
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import type { UnresolvedReference } from "../contracts/report-reference.js";
|
|
11
11
|
import { type AnyBlock, type ChartSlot, type CollectedReference, type ReportWarning } from "./block-walk.js";
|
|
12
12
|
import { type ReferenceResolver, type ReportSnapshot, type ResolvedValue } from "./reference-resolver.js";
|
|
13
|
-
export type { ReportWarning };
|
|
13
|
+
export type { ReportWarning } from "./block-walk.js";
|
|
14
14
|
/**
|
|
15
15
|
* The cap on how many references resolve at the same time.
|
|
16
16
|
*
|
|
@@ -19,19 +19,19 @@ export type { ReportWarning };
|
|
|
19
19
|
*/
|
|
20
20
|
export declare const RESOLUTION_CONCURRENCY = 8;
|
|
21
21
|
/** One schema conformance problem, reduced to a path and a message. */
|
|
22
|
-
export
|
|
22
|
+
export type SchemaIssue = {
|
|
23
23
|
path: string;
|
|
24
24
|
message: string;
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
26
|
/**
|
|
27
27
|
* One reference that did not resolve, tied to the block that carries it. `slot` names the place of the
|
|
28
28
|
* reference inside a chart block, thus a reviewer tells a failed track or statistic from a failed binding.
|
|
29
29
|
*/
|
|
30
|
-
export
|
|
30
|
+
export type ResolutionFailure = {
|
|
31
31
|
blockId: string;
|
|
32
32
|
slot?: ChartSlot;
|
|
33
33
|
failure: UnresolvedReference;
|
|
34
|
-
}
|
|
34
|
+
};
|
|
35
35
|
/**
|
|
36
36
|
* The result of validation. `valid` is false when the schema failed, a block id repeats, or a reference
|
|
37
37
|
* did not resolve. `duplicateIds` names each repeated id one time, in sorted order. The warnings ride
|
|
@@ -56,7 +56,7 @@ export type ReportValidation = {
|
|
|
56
56
|
*/
|
|
57
57
|
export declare function checkChartEncoding(entry: CollectedReference, value: ResolvedValue): UnresolvedReference | undefined;
|
|
58
58
|
/** The resolved values and the failures of one resolution pass over the references of a block tree. */
|
|
59
|
-
export
|
|
59
|
+
export type ReferenceResolution = {
|
|
60
60
|
/** The resolved value of the binding of each block whose binding resolved, keyed by its block id. */
|
|
61
61
|
resolvedByBlock: Map<string, ResolvedValue>;
|
|
62
62
|
/**
|
|
@@ -66,7 +66,7 @@ export interface ReferenceResolution {
|
|
|
66
66
|
resolvedBySlot: Map<string, Map<ChartSlot, ResolvedValue>>;
|
|
67
67
|
/** Each reference that did not resolve, or whose chart encoding named an absent column. */
|
|
68
68
|
failures: ResolutionFailure[];
|
|
69
|
-
}
|
|
69
|
+
};
|
|
70
70
|
/**
|
|
71
71
|
* Resolve each reference of a block tree under the concurrency bound, and run the chart-encoding match.
|
|
72
72
|
*
|
|
@@ -105,12 +105,12 @@ export async function validateReport(document, snapshot, resolver) {
|
|
|
105
105
|
const { repeatedIds, warnings } = walkBlocks(parsed.data.sections);
|
|
106
106
|
const { failures: resolutionFailures } = await resolveDocumentReferences(parsed.data.sections, snapshot, resolver);
|
|
107
107
|
if (repeatedIds.length > 0 || resolutionFailures.length > 0) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
const failure = { valid: false, warnings };
|
|
109
|
+
if (repeatedIds.length > 0)
|
|
110
|
+
failure.duplicateIds = repeatedIds;
|
|
111
|
+
if (resolutionFailures.length > 0)
|
|
112
|
+
failure.resolutionFailures = resolutionFailures;
|
|
113
|
+
return failure;
|
|
114
114
|
}
|
|
115
115
|
return { valid: true, warnings };
|
|
116
116
|
}
|
|
@@ -26,10 +26,10 @@ export declare const DEPS_DIR = "deps";
|
|
|
26
26
|
* One staged asset. `file` is the path under the assets directory, and `specifier` is the module
|
|
27
27
|
* specifier of the source file inside the installed package.
|
|
28
28
|
*/
|
|
29
|
-
export
|
|
29
|
+
export type PageAsset = {
|
|
30
30
|
readonly file: string;
|
|
31
31
|
readonly specifier: string;
|
|
32
|
-
}
|
|
32
|
+
};
|
|
33
33
|
/** The relative source of a staged asset. The page directory is self-contained, thus the source is `assets/<file>`. */
|
|
34
34
|
export declare function assetSource(asset: PageAsset): string;
|
|
35
35
|
/** The relative source of a staged file by its name. A page reference never spells the directory itself. */
|
|
@@ -43,10 +43,34 @@ const HASH_CHARS = 12;
|
|
|
43
43
|
* The head takes the hex alone, and the basename takes each unsafe run as one dash.
|
|
44
44
|
*/
|
|
45
45
|
export function tableSidecarName(hash, path) {
|
|
46
|
-
const hex = hash.slice(hash.lastIndexOf(":") + 1)
|
|
47
|
-
const base = path.slice(path.lastIndexOf("/") + 1)
|
|
46
|
+
const hex = keepAlphanumeric(hash.slice(hash.lastIndexOf(":") + 1));
|
|
47
|
+
const base = keepFileSafe(path.slice(path.lastIndexOf("/") + 1));
|
|
48
48
|
return `${hex.slice(0, HASH_CHARS)}-${base}`;
|
|
49
49
|
}
|
|
50
|
+
/** Each character outside the letters and digits leaves the text. */
|
|
51
|
+
function keepAlphanumeric(text) {
|
|
52
|
+
return Array.from(text).filter(isNameChar).join("");
|
|
53
|
+
}
|
|
54
|
+
/** Each run of characters outside `[a-zA-Z0-9._-]` becomes one dash. */
|
|
55
|
+
function keepFileSafe(text) {
|
|
56
|
+
let out = "";
|
|
57
|
+
let inRun = false;
|
|
58
|
+
for (const char of text) {
|
|
59
|
+
const safe = isNameChar(char) || char === "." || char === "_" || char === "-";
|
|
60
|
+
if (safe) {
|
|
61
|
+
out += char;
|
|
62
|
+
inRun = false;
|
|
63
|
+
}
|
|
64
|
+
else if (!inRun) {
|
|
65
|
+
out += "-";
|
|
66
|
+
inRun = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
function isNameChar(char) {
|
|
72
|
+
return (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9");
|
|
73
|
+
}
|
|
50
74
|
/**
|
|
51
75
|
* The staged name of the script of one derivation: a hash head, in the content-address style of a data
|
|
52
76
|
* asset.
|
|
@@ -59,7 +83,7 @@ export function tableSidecarName(hash, path) {
|
|
|
59
83
|
* container.
|
|
60
84
|
*/
|
|
61
85
|
export function derivationScriptName(scriptHash) {
|
|
62
|
-
const hex = scriptHash.slice(scriptHash.lastIndexOf(":") + 1)
|
|
86
|
+
const hex = keepAlphanumeric(scriptHash.slice(scriptHash.lastIndexOf(":") + 1));
|
|
63
87
|
return `d-${hex.slice(0, HASH_CHARS)}.py`;
|
|
64
88
|
}
|
|
65
89
|
/** The chart runtime. The page-side bootstrap reads the `echarts` global that this file declares. */
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type * as Echarts from "echarts";
|
|
12
12
|
import { type Result } from "neverthrow";
|
|
13
13
|
import type { EchartOption } from "./chart.js";
|
|
14
|
+
import { type RenderApi } from "./chart-renderers.js";
|
|
14
15
|
import { type ChartExportSize } from "./design.js";
|
|
15
16
|
import type { DataAsset } from "./table-data.js";
|
|
16
17
|
import type { RenderProblem } from "./types.js";
|
|
@@ -25,10 +26,17 @@ export type ChartRuntime = typeof Echarts;
|
|
|
25
26
|
*/
|
|
26
27
|
export declare function loadChartRuntime(): Promise<ChartRuntime>;
|
|
27
28
|
/** The two SVG files of one chart: the single journal column and the double journal column. */
|
|
28
|
-
export
|
|
29
|
+
export type ChartSvgs = {
|
|
29
30
|
readonly single: DataAsset;
|
|
30
31
|
readonly double: DataAsset;
|
|
31
|
-
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The part of the chart runtime API that a renderer reads, taken from the API of the runtime.
|
|
35
|
+
*
|
|
36
|
+
* The runtime types each item dimension as its parsed value, and the derivation writes numbers alone,
|
|
37
|
+
* thus the number and text conversions read the same values that the raw API gives.
|
|
38
|
+
*/
|
|
39
|
+
export declare function rendererApi(api: Echarts.CustomSeriesRenderItemAPI): RenderApi;
|
|
32
40
|
/**
|
|
33
41
|
* Render one option to SVG text at one column size.
|
|
34
42
|
*
|
|
@@ -8,18 +8,24 @@
|
|
|
8
8
|
* classes with counters of the whole process, thus two renders of one option differ in those tokens alone.
|
|
9
9
|
* The export renumbers each token in order of first appearance, and two renders give one byte sequence.
|
|
10
10
|
*/
|
|
11
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
12
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
11
13
|
import { createHash } from "node:crypto";
|
|
12
14
|
import { err, ok } from "neverthrow";
|
|
13
15
|
import { exportOption, OUTLINE_RENDERER, registerChartRenderers } from "./chart-renderers.js";
|
|
16
|
+
import { isUnknownArray } from "../lib/unknown-array.js";
|
|
17
|
+
import { parseUnknownRecord } from "../lib/unknown-containers.js";
|
|
14
18
|
import { CHART_BODY_PX, CHART_EXPORT_SIZES, CHART_PRINT_THEME_NAME, CHART_PRINT_TEXT_PX, chartTheme, exportSizeFor, SCATTER_CROWD_ROWS, } from "./design.js";
|
|
15
19
|
import { millimeterRoot } from "./hybrid-svg.js";
|
|
16
20
|
/** One instance token of the chart runtime: a class, a clip path, or a gradient, for example `zr1-cls-2`. */
|
|
21
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the chart-runtime token grammar (zr<digits>-<family>-<n>); the renumbering rewrites exactly these tokens and nothing else.
|
|
17
22
|
const INSTANCE_TOKEN = /zr\d+-[a-z]+-?\d+/g;
|
|
18
23
|
/**
|
|
19
24
|
* The places where the chart runtime writes an instance token: the value of an `id` or a `class` attribute,
|
|
20
25
|
* a `url(#...)` reference, and the style block. A text node is none of them, thus a category name that
|
|
21
26
|
* reads as a token keeps its text.
|
|
22
27
|
*/
|
|
28
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the three attribute and reference places carry the tokens; the alternation bounds the rewrite to them.
|
|
23
29
|
const TOKEN_PLACES = /\s(?:id|class)="[^"]*"|url\(#[^)]*\)|<style[^>]*>[\s\S]*?<\/style>/g;
|
|
24
30
|
/** The count of hash characters in an asset name. It matches the name of a table asset. */
|
|
25
31
|
const HASH_CHARS = 12;
|
|
@@ -33,6 +39,26 @@ const HASH_CHARS = 12;
|
|
|
33
39
|
export function loadChartRuntime() {
|
|
34
40
|
return import("echarts");
|
|
35
41
|
}
|
|
42
|
+
/** One pair of pixel numbers, as the renderer API reads it from the coordinate of the chart runtime. */
|
|
43
|
+
function pixelPair(values) {
|
|
44
|
+
if (typeof values === "number")
|
|
45
|
+
return [values, values];
|
|
46
|
+
return [values[0] ?? Number.NaN, values[1] ?? Number.NaN];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The part of the chart runtime API that a renderer reads, taken from the API of the runtime.
|
|
50
|
+
*
|
|
51
|
+
* The runtime types each item dimension as its parsed value, and the derivation writes numbers alone,
|
|
52
|
+
* thus the number and text conversions read the same values that the raw API gives.
|
|
53
|
+
*/
|
|
54
|
+
export function rendererApi(api) {
|
|
55
|
+
return {
|
|
56
|
+
value: (dimension) => Number(api.value(dimension)),
|
|
57
|
+
coord: (point) => pixelPair(api.coord(point)),
|
|
58
|
+
size: (delta) => pixelPair(api.size?.(delta) ?? []),
|
|
59
|
+
visual: (name) => textOf(api.visual(name)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
36
62
|
/**
|
|
37
63
|
* Render one option to SVG text at one column size.
|
|
38
64
|
*
|
|
@@ -44,9 +70,7 @@ export function loadChartRuntime() {
|
|
|
44
70
|
export function renderChartSvg(echarts, option, size) {
|
|
45
71
|
echarts.registerTheme(CHART_PRINT_THEME_NAME, chartTheme(CHART_PRINT_TEXT_PX));
|
|
46
72
|
registerChartRenderers({
|
|
47
|
-
|
|
48
|
-
// for a named renderer holds numbers alone, thus the renderer reads a number at each dimension.
|
|
49
|
-
registerCustomSeries: (name, render) => echarts.registerCustomSeries(name, render),
|
|
73
|
+
registerCustomSeries: (name, render) => echarts.registerCustomSeries(name, (params, api) => render({ itemPayload: params.itemPayload }, rendererApi(api))),
|
|
50
74
|
});
|
|
51
75
|
let chart;
|
|
52
76
|
// The axis jitter of the chart runtime places a point that finds no free place with `Math.random`. The
|
|
@@ -60,7 +84,7 @@ export function renderChartSvg(echarts, option, size) {
|
|
|
60
84
|
return ok(finishedSvg(chart.renderToSVGString(), size));
|
|
61
85
|
}
|
|
62
86
|
catch (cause) {
|
|
63
|
-
return err(cause
|
|
87
|
+
return err(errorMessageOf(cause) ?? textOf(cause));
|
|
64
88
|
}
|
|
65
89
|
finally {
|
|
66
90
|
Math.random = random;
|
|
@@ -96,7 +120,9 @@ function finishedSvg(svg, size) {
|
|
|
96
120
|
const renumber = (token) => {
|
|
97
121
|
let next = tokens.get(token);
|
|
98
122
|
if (next === undefined) {
|
|
99
|
-
const family =
|
|
123
|
+
const family =
|
|
124
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the token family (zr<digits>-<letters>) is the runtime's own naming scheme, read verbatim from the token it renumbers.
|
|
125
|
+
/^zr\d+-([a-z]+)/.exec(token)?.[1] ?? "t";
|
|
100
126
|
next = `zr0-${family}-${tokens.size}`;
|
|
101
127
|
tokens.set(token, next);
|
|
102
128
|
}
|
|
@@ -118,10 +144,10 @@ function plottedPoints(option) {
|
|
|
118
144
|
return 0;
|
|
119
145
|
let count = 0;
|
|
120
146
|
for (const entry of series) {
|
|
121
|
-
|
|
147
|
+
const fields = parseUnknownRecord(entry);
|
|
148
|
+
if (fields === undefined)
|
|
122
149
|
continue;
|
|
123
|
-
|
|
124
|
-
if (!Array.isArray(fields.data))
|
|
150
|
+
if (!isUnknownArray(fields.data))
|
|
125
151
|
continue;
|
|
126
152
|
for (const item of fields.data) {
|
|
127
153
|
if (fields.type === "radar")
|
|
@@ -136,7 +162,7 @@ function plottedPoints(option) {
|
|
|
136
162
|
}
|
|
137
163
|
/** True when one item draws a coordinate: a number, or a value whose members hold no empty slot. */
|
|
138
164
|
function drawnItem(item) {
|
|
139
|
-
const value =
|
|
165
|
+
const value = parseUnknownRecord(item)?.value ?? item;
|
|
140
166
|
if (typeof value === "number")
|
|
141
167
|
return true;
|
|
142
168
|
return Array.isArray(value) && value.every((member) => member !== null && member !== undefined && member !== "-");
|
|
@@ -153,13 +179,13 @@ function outlineVertices(item) {
|
|
|
153
179
|
const OUTLINE_LEAD_MEMBERS = 4;
|
|
154
180
|
/** The count of coordinates that one radar polygon draws: each member of its value that is not empty. */
|
|
155
181
|
function polygonCoordinates(item) {
|
|
156
|
-
const value =
|
|
182
|
+
const value = parseUnknownRecord(item)?.value;
|
|
157
183
|
return Array.isArray(value) ? value.filter((member) => member !== null && member !== undefined).length : 0;
|
|
158
184
|
}
|
|
159
185
|
/** One SVG asset: the content-addressed name, with the column in millimeters, and the text. */
|
|
160
186
|
function svgAsset(bytes, size) {
|
|
161
187
|
const hash = createHash("sha256").update(bytes).digest("hex").slice(0, HASH_CHARS);
|
|
162
|
-
return { name: `c-${hash}-${size.widthMm}mm.svg`, bytes };
|
|
188
|
+
return { name: `c-${hash}-${String(size.widthMm)}mm.svg`, bytes };
|
|
163
189
|
}
|
|
164
190
|
/**
|
|
165
191
|
* The two SVG files of one chart, or `undefined` for a chart past the export bound.
|
|
@@ -22,15 +22,15 @@ export declare const MANHATTAN_P_THRESHOLD = 5e-8;
|
|
|
22
22
|
/** The baseline of an MA plot. A point above it rose, and a point below it fell. */
|
|
23
23
|
export declare const MA_BASELINE = 0;
|
|
24
24
|
/** The semantic axis titles of one preset. A preset whose axis carries no fixed quantity states none. */
|
|
25
|
-
export
|
|
25
|
+
export type PresetAxisTitles = {
|
|
26
26
|
readonly x?: string;
|
|
27
27
|
readonly y?: string;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
/** One category of a preset classification: the name that a legend reads, and whether it states no finding. */
|
|
30
|
-
export
|
|
30
|
+
export type PresetCategory = {
|
|
31
31
|
readonly name: string;
|
|
32
32
|
readonly muted: boolean;
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
/**
|
|
35
35
|
* The classification rule as plain data: the kind of the split, and the two cuts that it reads.
|
|
36
36
|
*
|
|
@@ -63,16 +63,16 @@ export type PresetRule = {
|
|
|
63
63
|
* guide lines carry. The color split then lands on the drawn lines. A row that gives no pair belongs to no
|
|
64
64
|
* category, and its point drops.
|
|
65
65
|
*/
|
|
66
|
-
export
|
|
66
|
+
export type PresetClassification = {
|
|
67
67
|
readonly categories: readonly PresetCategory[];
|
|
68
68
|
readonly categoryOf: (x: number | null, y: number | null, index: number) => string | undefined;
|
|
69
69
|
readonly rule: PresetRule;
|
|
70
|
-
}
|
|
70
|
+
};
|
|
71
71
|
/** The expansion of the volcano: the composition of its points and its guides, and its classification. */
|
|
72
|
-
export
|
|
72
|
+
export type PresetExpansion = {
|
|
73
73
|
readonly composition: ChartComposition;
|
|
74
74
|
readonly classification: PresetClassification;
|
|
75
|
-
}
|
|
75
|
+
};
|
|
76
76
|
/**
|
|
77
77
|
* The composition of a volcano: the effect on x, the transformed p-value on y, three guide lines, and the
|
|
78
78
|
* three-way classification.
|
|
@@ -124,12 +124,12 @@ function volcanoClassification(significance, effect) {
|
|
|
124
124
|
* `axes` field, where an agent title sits and where they would outrank the label.
|
|
125
125
|
*/
|
|
126
126
|
export function volcanoAxisTitles(x) {
|
|
127
|
-
return {
|
|
127
|
+
return { x: channelTransform(x) === undefined ? LOG2_EFFECT_TITLE : undefined, y: NEG_LOG10_P_TITLE };
|
|
128
128
|
}
|
|
129
129
|
/** The two optional channels that the volcano carries through from the quick-path encoding. */
|
|
130
130
|
function optionalChannels(encoding) {
|
|
131
131
|
return {
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
group: encoding.group,
|
|
133
|
+
label: encoding.label,
|
|
134
134
|
};
|
|
135
135
|
}
|