@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.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. 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 interface CheckedTree {
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: readonly Cell[]): Result<CheckedTree, RenderProblem>;
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
- if (roots.length === 0)
58
- return fault(`holds a cycle through the node "${edges[0].parent}".`);
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 = [roots[0]];
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 (let index = children.length - 1; index >= 0; index -= 1)
69
- stack.push(children[index]);
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 (let index = preorder.length - 1; index >= 0; index -= 1) {
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(roots[0]), elbows });
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 (let index = 0; index < rows.length; index += 1) {
51
- if (toNumber(rows[index][pColumn]) === 0 && others[index] !== null)
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 [kind, size] of Object.entries(CHART_EXPORT_SIZES)) {
121
- widths[String(size.widthPx)] = build(EXPORT_PLOT_FRAMES[kind]);
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) ? series.filter((entry) => typeof entry === "object" && entry !== null) : [];
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
- const axis = option[key];
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, ...(z !== undefined ? { z } : {}) };
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[DOTPLOT_TERM_LINES - 1].split(" ");
73
- while (last.length > 1 && `${last.join(" ")}…`.length > DOTPLOT_WRAP_CHARACTERS)
74
- last.pop();
75
- kept[DOTPLOT_TERM_LINES - 1] = `${last.join(" ")}…`;
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 (Array.isArray(item))
113
+ if (isUnknownArray(item))
108
114
  return item;
109
- if (typeof item === "object" && item !== null && Array.isArray(item.value))
110
- return item.value;
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
- ...(size !== undefined ? { size } : {}),
146
- ...(color !== undefined ? { color } : {}),
147
- ...(label !== undefined ? { label } : {}),
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 = (Array.isArray(option.series) ? option.series : []).map((entry) => ({
159
- ...entry,
160
- data: (Array.isArray(entry.data) ? entry.data : []).flatMap((item) => {
161
- const place = places.get(String(itemValue(item)?.[1]));
162
- return place === undefined ? [] : [placedItem(item, place)];
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
- ...(wraps ? { axisLabel: { lineHeight: DOTPLOT_LINE_PX } } : {}),
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 = Array.isArray(option.visualMap) ? option.visualMap : [];
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
- if (size !== undefined && sizeMaps.length > 0) {
187
- const range = { min: toNumber(sizeMaps[0].min) ?? 0, max: toNumber(sizeMaps[0].max) ?? 0 };
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 = typeof option.xAxis === "object" && option.xAxis !== null ? option.xAxis : {};
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
- ...(graphic.length > 0 ? { graphic } : {}),
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 = values.length > 0 ? values[0] : 0;
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
- return low;
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 = values.length > 0 ? values[0] : 1;
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
- return high;
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
- ...(group !== undefined ? { group } : {}),
124
- ...(color !== undefined ? { color } : {}),
125
- ...(label !== undefined ? { label } : {}),
125
+ group,
126
+ color,
127
+ label,
126
128
  },
127
129
  },
128
130
  ],
129
- ...(facet !== undefined ? { facet } : {}),
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
- ...(cellGroup !== null ? { group: categoryName(cellGroup) } : {}),
161
- ...(cellColor !== null ? { color: cellColor } : {}),
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 = (Array.isArray(option.series) ? option.series : []).map((entry) => ({
168
- ...entry,
169
- large: color === undefined && cells.length >= EMBEDDING_LARGE_CELLS,
170
- symbolSize: pointPx,
171
- itemStyle: {
172
- ...(typeof entry.itemStyle === "object" && entry.itemStyle !== null ? entry.itemStyle : {}),
173
- opacity: EMBEDDING_OPACITY,
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
- ...(key
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
- ...(key
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
- ...(option.tooltip !== undefined ? { tooltip: option.tooltip } : {}),
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
- const colorChannel = color;
252
- const map = clippedScale(cells.flatMap((cell) => (cell.color === undefined ? [] : [cell.color])), scaleTitle, channelName(colorChannel), declaredForColumn(context.meanings, channelColumn(colorChannel)));
253
- const composedMaps = Array.isArray(option.visualMap) ? option.visualMap : [];
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 negative = sorted.length > 0 && sorted[0] < 0;
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 top = clip > 0 ? clip : (sorted[sorted.length - 1] ?? 0) > 0 ? sorted[sorted.length - 1] : 1;
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
- return sorted[low] + (sorted[high] - sorted[low]) * (place - low);
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 interface SquareMargins {
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 interface SquareLayoutFields {
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 interface SquareLayout {
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 interface AxisRange {
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 interface EqualRanges {
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.length > 0 ? fitting[fitting.length - 1] : placement(SQUARE_MIN_PX, fields, scale, 0);
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
- ...(smallest.legend !== undefined ? { legend: smallest.legend } : {}),
82
- ...(smallest.visualMap !== undefined ? { visualMap: smallest.visualMap } : {}),
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
- ...(entry.series !== undefined ? { series: entry.series } : {}),
95
+ series: entry.series,
96
96
  grid: entry.grid,
97
- ...(entry.legend !== undefined ? { legend: entry.legend } : {}),
98
- ...(entry.visualMap !== undefined ? { visualMap: entry.visualMap } : {}),
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
- ...(entry.legend !== undefined ? { legend: move(entry.legend) } : {}),
108
- ...(entry.visualMap !== undefined ? { visualMap: entry.visualMap.map(move) } : {}),
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
- ...(points !== undefined && index < points.series ? { symbolSize: pointPx } : {}),
140
- ...(squareLabel !== undefined && index === squareLabel.series ? { label: { width: side - 2 * squareLabel.insetPx, overflow: "break" } } : {}),
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
- ...(series.length > 0 ? { series } : {}),
152
+ series,
153
153
  grid,
154
154
  ...legend,
155
- ...(fields.visualMaps !== undefined && fields.visualMaps > 0
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 snapped = [x, y].map((range) => ({ min: Math.floor(range.min / step), max: Math.ceil(range.max / step) }));
180
- const steps = Math.max(...snapped.map((range) => range.max - range.min), 1);
181
- const [xRange, yRange] = snapped.map((range) => {
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: xRange, y: yRange, step };
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
- if (values.length === 0)
190
- return { min: 0, max: 1 };
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. */