@inflexa-ai/harness 0.45.1 → 0.46.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  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 +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +306 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +32 -7
  174. package/dist/lib/hooks.js +22 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +160 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +39 -0
  256. package/dist/loop/turn-credentials.js +90 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -23,8 +23,10 @@ export const DraftSectionBlockSchema = z.strictObject({
23
23
  title: z.string(),
24
24
  blocks: z.lazy(() => z.array(DraftBlockSchema)),
25
25
  });
26
+ /** The draft block union, before the erasing annotation of {@link DraftBlockSchema}. */
27
+ export const DraftBlockUnionSchema = z.discriminatedUnion("kind", [DraftSectionBlockSchema, ...ATOM_BLOCK_SCHEMAS]);
26
28
  /** The draft block union. A `z.ZodType<DraftBlock>` annotation gives the recursive members a stable type. */
27
- export const DraftBlockSchema = z.discriminatedUnion("kind", [DraftSectionBlockSchema, ...ATOM_BLOCK_SCHEMAS]);
29
+ export const DraftBlockSchema = DraftBlockUnionSchema;
28
30
  /** The root of a draft. It permits zero sections, thus an empty draft is a legal state. */
29
31
  export const DraftDocumentSchema = z.strictObject({
30
32
  title: z.string(),
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { err, ok } from "neverthrow";
7
7
  import { asFiniteNumber, cellMatchesFilterValue, checkCitationAssertion, checkValueAssertion } from "./assert-rules.js";
8
- import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, } from "./reference-resolver.js";
8
+ import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, snapshotRows, } from "./reference-resolver.js";
9
9
  /** Build an `Err` that carries the unresolved reference. The `detail` key is present only when there is a detail to carry. */
10
10
  function fail(reference, reason, detail) {
11
11
  const failure = detail !== undefined ? { reference, reason, detail } : { reference, reason };
@@ -27,46 +27,61 @@ function resolveArtifactValue(reference, snapshot) {
27
27
  // cell that no real artifact holds. Thus the refusal comes before the read of the rows.
28
28
  const valueFileType = artifact.fileType;
29
29
  if (fileTypeHoldsNoCell(valueFileType)) {
30
- return fail(reference, "unreadable-artifact", `the ${valueFileType} at ${reference.path} holds no cell to read`);
30
+ return fail(reference, "unreadable-artifact", `the ${String(valueFileType)} at ${reference.path} holds no cell to read`);
31
31
  }
32
32
  // An artifact with no rows is pinned whole, thus it addresses no cell and every locator over it lands
33
33
  // out of range.
34
- const rows = artifact.rows ?? [];
34
+ const readRows = snapshotRows(artifact);
35
+ if (readRows.isErr()) {
36
+ return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
37
+ }
38
+ const rows = readRows.value;
35
39
  const locator = reference.locator;
36
40
  let selectedRow;
37
41
  if (locator.row !== undefined) {
38
- if (locator.row < 0 || locator.row >= rows.length) {
42
+ const row = rows[locator.row];
43
+ if (row === undefined) {
39
44
  return fail(reference, "locator-out-of-range", `row ${locator.row} is outside the ${rows.length} rows`);
40
45
  }
41
- selectedRow = rows[locator.row];
46
+ selectedRow = row;
42
47
  }
43
48
  else if (locator.rowFilter !== undefined) {
44
49
  const filter = locator.rowFilter;
45
50
  const matches = rows.filter((row) => cellMatchesFilterValue(row[filter.column], filter.value));
46
- if (matches.length === 0) {
51
+ const match = matches[0];
52
+ if (match === undefined) {
47
53
  return fail(reference, "locator-out-of-range", `no row where ${filter.column} equals ${String(filter.value)}`);
48
54
  }
49
55
  if (matches.length > 1) {
50
56
  return fail(reference, "ambiguous-match", `${matches.length} rows where ${filter.column} equals ${String(filter.value)}`);
51
57
  }
52
- selectedRow = matches[0];
58
+ selectedRow = match;
53
59
  }
54
60
  else {
55
61
  // The locator schema forbids a locator with neither selector. The resolver cannot depend on a
56
62
  // prior parse, thus it treats a row that no selector addresses as out of range.
57
63
  return fail(reference, "locator-out-of-range", "the locator selects no row");
58
64
  }
59
- // A real table holds an empty cell, and a parser gives it back as an absent key, `undefined`, or
60
- // `null`. None of the three is a value that a scalar reference can bind. An empty string is a value,
61
- // thus it stays valid. The wider annotation admits the three, because the row type promises a value
62
- // for each key that it holds.
65
+ // A real table holds an empty cell, and the snapshot parser gives it back as an absent
66
+ // key: `snapshotRows` drops a cell that parsed as `null` or `undefined`, so an absent key
67
+ // is the only absence. It is not a value that a scalar reference can bind. An empty
68
+ // string is a value, thus it stays valid.
63
69
  const cell = selectedRow[locator.column];
64
- if (cell === undefined || cell === null) {
70
+ if (cell === undefined) {
65
71
  return fail(reference, "locator-out-of-range", `column ${locator.column} holds no value in the selected row`);
66
72
  }
67
73
  const valueFailure = checkValueAssertion(reference, reference.assert?.value, reference.assert?.tolerance, cell);
68
74
  return valueFailure !== undefined ? err(valueFailure) : ok({ type: "scalar", value: cell });
69
75
  }
76
+ /**
77
+ * Put one own data property on a projected row.
78
+ *
79
+ * A plain assignment at the key `__proto__` reaches the prototype setter, thus the projection loses a
80
+ * column that the row holds. The definition makes an own data property for each key.
81
+ */
82
+ function defineOwn(target, key, value) {
83
+ Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
84
+ }
70
85
  function resolveArtifactTable(reference, snapshot) {
71
86
  const artifact = snapshotEntry(snapshot, reference.path);
72
87
  if (artifact === undefined) {
@@ -77,13 +92,17 @@ function resolveArtifactTable(reference, snapshot) {
77
92
  }
78
93
  const tableFileType = artifact.fileType;
79
94
  if (fileTypeHoldsNoCell(tableFileType)) {
80
- return fail(reference, "unreadable-artifact", `the ${tableFileType} at ${reference.path} holds no cell to read`);
95
+ return fail(reference, "unreadable-artifact", `the ${String(tableFileType)} at ${reference.path} holds no cell to read`);
81
96
  }
82
97
  // The bound ranks the rows as the artifact holds them, thus a bound over a column that the subset
83
98
  // below leaves out still ranks them. An unknown bound column addresses nothing, exactly as an unknown
84
99
  // subset column does.
85
100
  const bound = reference.rowBound;
86
- const allRows = artifact.rows ?? [];
101
+ const readRows = snapshotRows(artifact);
102
+ if (readRows.isErr()) {
103
+ return fail(reference, "unreadable-artifact", `the artifact at ${reference.path} holds a malformed row: ${readRows.error}`);
104
+ }
105
+ const allRows = readRows.value;
87
106
  if (bound !== undefined && columnsHeldByNoRow(allRows, [bound.column]).length > 0) {
88
107
  return fail(reference, "locator-out-of-range", `the row bound names column ${bound.column}, which the table at ${reference.path} does not hold`);
89
108
  }
@@ -107,8 +126,9 @@ function resolveArtifactTable(reference, snapshot) {
107
126
  const projectedRows = rows.map((row) => {
108
127
  const projected = {};
109
128
  for (const column of columns) {
110
- if (column in row) {
111
- projected[column] = row[column];
129
+ const cell = row[column];
130
+ if (cell !== undefined) {
131
+ defineOwn(projected, column, cell);
112
132
  }
113
133
  }
114
134
  return projected;
@@ -145,6 +165,9 @@ async function resolveDerivation(reference, snapshot) {
145
165
  }
146
166
  const a = numbers[0];
147
167
  const b = numbers[1];
168
+ if (a === undefined || b === undefined) {
169
+ return fail(reference, "locator-out-of-range", `operation ${reference.op} needs two inputs, and the derivation holds ${numbers.length}`);
170
+ }
148
171
  let result;
149
172
  switch (reference.op) {
150
173
  case "ratio":
@@ -31,13 +31,13 @@ export type PinSnapshotError = {
31
31
  cause: unknown;
32
32
  };
33
33
  /** The construction options of the pin. */
34
- export interface PinReportSnapshotOptions {
34
+ export type PinReportSnapshotOptions = {
35
35
  /**
36
36
  * The workspace-root seam of the caller. The citation evidence sits on disk, thus a composition
37
37
  * that binds no seam pins the artifact map alone.
38
38
  */
39
39
  readonly resolveWorkspaceRoot?: ResolveWorkspaceRoot;
40
- }
40
+ };
41
41
  /**
42
42
  * Pin the snapshot of one analysis from the artifact ledger and from the synthesis records of its runs.
43
43
  *
@@ -18,6 +18,9 @@
18
18
  */
19
19
  import { err, ok } from "neverthrow";
20
20
  import { readSynthesisText } from "../execution/run-synthesis.js";
21
+ import { parseJsonAs } from "../lib/parse-json.js";
22
+ import { parseUnknownRecord, UnknownRecordSchema } from "../lib/unknown-containers.js";
23
+ import { nullProtoRecord } from "../lib/null-proto.js";
21
24
  import { queryAnalysisArtifacts } from "../state/artifacts.js";
22
25
  import { queryRunsByAnalysis } from "../state/runs.js";
23
26
  /** The page size of the run listing. The listing walks the pages until a short page ends the walk. */
@@ -56,16 +59,17 @@ function pushPmidCitations(list, entries) {
56
59
  return;
57
60
  }
58
61
  for (const reference of list) {
59
- if (typeof reference !== "object" || reference === null) {
62
+ const fields = parseUnknownRecord(reference);
63
+ if (fields === undefined) {
60
64
  continue;
61
65
  }
62
- const pmid = reference.pmid;
66
+ const pmid = fields.pmid;
63
67
  if (typeof pmid !== "string") {
64
68
  continue;
65
69
  }
66
70
  const id = pmid.trim();
67
71
  if (id.length > 0) {
68
- const record = recordOf(reference);
72
+ const record = recordOf(fields);
69
73
  entries.push(record === undefined ? { key: `pmid:${id}` } : { key: `pmid:${id}`, record });
70
74
  }
71
75
  }
@@ -83,25 +87,23 @@ function pushPmidCitations(list, entries) {
83
87
  * description sits there.
84
88
  */
85
89
  function citationsOf(text) {
86
- let parsed;
90
+ let fields;
87
91
  try {
88
- parsed = JSON.parse(text);
92
+ fields = parseJsonAs(text, UnknownRecordSchema);
89
93
  }
90
94
  catch {
91
95
  return [];
92
96
  }
93
- if (typeof parsed !== "object" || parsed === null) {
94
- return [];
95
- }
96
97
  const entries = [];
97
- pushPmidCitations(parsed.keyReferences, entries);
98
- const findings = parsed.findings;
98
+ pushPmidCitations(fields.keyReferences, entries);
99
+ const findings = fields.findings;
99
100
  if (Array.isArray(findings)) {
100
101
  for (const finding of findings) {
101
- if (typeof finding !== "object" || finding === null) {
102
+ const findingFields = parseUnknownRecord(finding);
103
+ if (findingFields === undefined) {
102
104
  continue;
103
105
  }
104
- pushPmidCitations(finding.references, entries);
106
+ pushPmidCitations(findingFields.references, entries);
105
107
  }
106
108
  }
107
109
  return entries;
@@ -165,9 +167,7 @@ export async function pinReportSnapshot(pool, analysisId, options = {}) {
165
167
  const ledgerRows = await queryAnalysisArtifacts(pool, analysisId);
166
168
  if (ledgerRows.isErr())
167
169
  return err({ kind: "ledger-read-failed", cause: ledgerRows.error.cause });
168
- // The ledger accepts any path. A null-prototype map keeps a key such as `__proto__` an ordinary
169
- // entry, thus no path collides with a prototype slot.
170
- const artifacts = Object.create(null);
170
+ const artifacts = nullProtoRecord();
171
171
  for (const row of ledgerRows.value) {
172
172
  artifacts[row.path] = { hash: row.hash, fileType: row.fileType };
173
173
  }
@@ -18,7 +18,7 @@
18
18
  * executable specification of the value tier. The two realizations are substitutable behind the seam.
19
19
  */
20
20
  import { type Result } from "neverthrow";
21
- import type { Suspension } from "../workflows/suspension.js";
21
+ import type { SuspendingRefusal } from "../sandbox/sandbox-error.js";
22
22
  import { type ReferenceResolver } from "./reference-resolver.js";
23
23
  /** One artifact row, as plain cells. A text-backed format holds a numeric column as a string. */
24
24
  type Row = Record<string, string | number>;
@@ -29,27 +29,27 @@ type Row = Record<string, string | number>;
29
29
  * `format` carries the reader that the host decided. The arm never derives a reader from the extension,
30
30
  * thus the host arm and the sandbox arm can never read one file two ways.
31
31
  */
32
- export interface ExtractionRequest {
32
+ export type ExtractionRequest = {
33
33
  readonly path: string;
34
34
  readonly hash: string;
35
35
  readonly format: TabularFormat;
36
- }
36
+ };
37
37
  /** The rows that the extraction arm read for one artifact. Downstream the rows share the host path logic. */
38
- export interface ExtractionArtifact {
38
+ export type ExtractionArtifact = {
39
39
  readonly rows: Array<Record<string, string | number>>;
40
- }
40
+ };
41
41
  /**
42
42
  * The out-of-process read arm. One `extract` call covers every fall-through artifact of one document
43
43
  * pass. The result maps each requested path to its rows. A path that the arm could not read is absent
44
- * from the map, and the reference at that path fails as `unreadable-artifact`. A suspension of the pass is
45
- * the `err`, and each reference of the batch reports its reason.
44
+ * from the map, and the reference at that path fails as `unreadable-artifact`. A refusal of the sandbox of the
45
+ * pass with the suspend flag is the `err`, and each reference of the batch reports its reason.
46
46
  *
47
47
  * The arm is a seam, thus a test stubs it. While no realization is wired, a fall-through reference fails
48
48
  * with `extraction-unavailable`, and the detail names the absent arm.
49
49
  */
50
- export interface ExtractionArm {
51
- extract(requests: readonly ExtractionRequest[]): Promise<Result<ReadonlyMap<string, ExtractionArtifact>, Suspension>>;
52
- }
50
+ export type ExtractionArm = {
51
+ extract(requests: readonly ExtractionRequest[]): Promise<Result<ReadonlyMap<string, ExtractionArtifact>, SuspendingRefusal>>;
52
+ };
53
53
  /**
54
54
  * The disk facts of one artifact that outlive one resolver.
55
55
  *
@@ -58,11 +58,11 @@ export interface ExtractionArm {
58
58
  * read again. `rows` is present only for a clean read, because a read fault is transient and it must not
59
59
  * stick to the analysis.
60
60
  */
61
- export interface ArtifactRead {
61
+ export type ArtifactRead = {
62
62
  readonly signature: string;
63
63
  readonly hash: string;
64
64
  readonly rows?: Array<Record<string, string | number>>;
65
- }
65
+ };
66
66
  /**
67
67
  * The read cache of one analysis. It holds what a read of the bytes costs: the streamed hash, and the rows
68
68
  * of a file that the host could not parse in process. Two resolvers of one analysis share one cache, thus a
@@ -71,14 +71,14 @@ export interface ArtifactRead {
71
71
  * The cache holds no authorization and no session value. Each resolver still binds its own extraction arm
72
72
  * over the auth of its own call.
73
73
  */
74
- export interface ArtifactReadCache {
74
+ export type ArtifactReadCache = {
75
75
  get(absolutePath: string): ArtifactRead | undefined;
76
76
  set(absolutePath: string, read: ArtifactRead): void;
77
- }
77
+ };
78
78
  /** The read caches that the host process holds, one for each recent analysis. */
79
- export interface ArtifactReadStore {
79
+ export type ArtifactReadStore = {
80
80
  forAnalysis(analysisId: string): ArtifactReadCache;
81
- }
81
+ };
82
82
  /**
83
83
  * Make the read store of the report path. One host process serves many analyses, thus the store bounds both
84
84
  * dimensions: how many analyses it holds, and how many artifacts one analysis holds. A dropped entry costs
@@ -93,13 +93,13 @@ export declare function createArtifactReadStore(): ArtifactReadStore;
93
93
  * `extractionArm` is optional, because no sandbox realization is wired yet. `readCache` is optional, thus a
94
94
  * resolver with no cache reads every artifact itself and its reads die with it.
95
95
  */
96
- export interface ProductionResolverDeps {
96
+ export type ProductionResolverDeps = {
97
97
  readonly workspaceRoot: string;
98
98
  readonly analysisId: string;
99
99
  readonly cap?: number;
100
100
  readonly extractionArm?: ExtractionArm;
101
101
  readonly readCache?: ArtifactReadCache;
102
- }
102
+ };
103
103
  /**
104
104
  * The tabular formats that the host fast path reads. The host decides which one a file is, one time, and it
105
105
  * carries the decision to the extraction arm. Another extension names no format at all.
@@ -21,8 +21,11 @@ import { err, ok } from "neverthrow";
21
21
  import { readFile, stat } from "node:fs/promises";
22
22
  import { extname } from "node:path";
23
23
  import { parquetReadObjects } from "hyparquet";
24
+ import { z } from "zod";
25
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
24
26
  import { allWithConcurrency } from "../lib/async-utils.js";
25
27
  import { computeSha256File } from "../lib/fs-helpers.js";
28
+ import { parseJsonAs } from "../lib/parse-json.js";
26
29
  import { resolveWorkspacePath } from "../workspace/paths.js";
27
30
  import { asFiniteNumber, cellMatchesFilterValue, checkCitationAssertion, checkValueAssertion } from "./assert-rules.js";
28
31
  import { applyRowBound, columnsHeldByNoRow, fileTypeHoldsNoCell, snapshotEntry, } from "./reference-resolver.js";
@@ -175,7 +178,7 @@ function parseRecords(text, delimiter) {
175
178
  i += 1;
176
179
  let closed = false;
177
180
  while (i < n) {
178
- const ch = text[i];
181
+ const ch = text.charAt(i);
179
182
  if (ch === '"') {
180
183
  if (text[i + 1] === '"') {
181
184
  field += '"';
@@ -201,7 +204,7 @@ function parseRecords(text, delimiter) {
201
204
  }
202
205
  else {
203
206
  while (i < n) {
204
- const ch = text[i];
207
+ const ch = text.charAt(i);
205
208
  if (ch === delimiter || ch === "\r" || ch === "\n") {
206
209
  break;
207
210
  }
@@ -241,10 +244,10 @@ export function parseDelimited(text, delimiter) {
241
244
  if (records === undefined) {
242
245
  return undefined;
243
246
  }
244
- if (records.length === 0) {
247
+ const header = records[0];
248
+ if (header === undefined) {
245
249
  return [];
246
250
  }
247
- const header = records[0];
248
251
  const seen = new Set();
249
252
  for (const name of header) {
250
253
  if (seen.has(name)) {
@@ -253,8 +256,7 @@ export function parseDelimited(text, delimiter) {
253
256
  seen.add(name);
254
257
  }
255
258
  const rows = [];
256
- for (let r = 1; r < records.length; r += 1) {
257
- const fields = records[r];
259
+ for (const fields of records.slice(1)) {
258
260
  // A blank line parses as one empty field, thus the walk drops it and reads no dialect into it. A
259
261
  // record with more than one field, or one non-empty field, still obeys the count check, thus a
260
262
  // genuinely ragged record falls through.
@@ -265,39 +267,36 @@ export function parseDelimited(text, delimiter) {
265
267
  return undefined;
266
268
  }
267
269
  const row = {};
268
- for (let c = 0; c < header.length; c += 1) {
269
- row[header[c]] = fields[c];
270
+ for (const [c, name] of header.entries()) {
271
+ const value = fields[c];
272
+ if (value !== undefined) {
273
+ row[name] = value;
274
+ }
270
275
  }
271
276
  rows.push(row);
272
277
  }
273
278
  return rows;
274
279
  }
280
+ /** A cell of a JSON table: the scalars JSON carries. A non-finite number stays a cell — `JSON.parse`
281
+ * reads an over-large literal as Infinity, and the coercion drops it. A nested value is structural doubt. */
282
+ const JsonTableCell = z.custom((cell) => cell === null || typeof cell === "number" || typeof cell === "string" || typeof cell === "boolean");
275
283
  /**
276
- * Parse a JSON file into rows. The strict shape is an array of flat objects. A parse fault, a top-level
277
- * value that is not an array, and a nested cell are structural doubt, thus each gives back `undefined` and
278
- * the file falls through.
284
+ * Parse a JSON file into rows. The strict shape is an array of flat objects with scalar cells. A parse
285
+ * fault, a top-level value that is not an array, and a nested cell are structural doubt, thus each gives
286
+ * back `undefined` and the file falls through.
279
287
  */
280
288
  function parseJsonTable(text) {
281
- let value;
289
+ let table;
282
290
  try {
283
- value = JSON.parse(text);
291
+ table = parseJsonAs(text, z.array(z.record(z.string(), JsonTableCell)));
284
292
  }
285
293
  catch {
286
294
  return undefined;
287
295
  }
288
- if (!Array.isArray(value)) {
289
- return undefined;
290
- }
291
296
  const rows = [];
292
- for (const item of value) {
293
- if (item === null || typeof item !== "object" || Array.isArray(item)) {
294
- return undefined;
295
- }
297
+ for (const fields of table) {
296
298
  const row = {};
297
- for (const [key, cell] of Object.entries(item)) {
298
- if (cell !== null && typeof cell === "object") {
299
- return undefined;
300
- }
299
+ for (const [key, cell] of Object.entries(fields)) {
301
300
  const coerced = coerceCell(cell);
302
301
  if (coerced !== undefined) {
303
302
  row[key] = coerced;
@@ -441,9 +440,12 @@ async function extractFallThrough(arm, requests) {
441
440
  try {
442
441
  answered = await arm.extract(requests.map((request) => ({ path: request.path, hash: request.hash, format: request.format })));
443
442
  }
444
- catch {
443
+ catch (cause) {
445
444
  // The arm speaks the throw protocol for a genuine infrastructure fault. This boundary turns the
446
- // throw into a value, thus each reference on the batch reads a failure as data.
445
+ // throw into a value, thus each reference on the batch reads a failure as data. A cancel of the
446
+ // workflow is not a fault of the read, thus it leaves to DBOS with no change.
447
+ if (isWorkflowCancellation(cause))
448
+ throw cause;
447
449
  for (const request of requests) {
448
450
  out.set(request.path, { kind: "unreadable", detail: `the extraction arm did not read the file at ${request.path}` });
449
451
  }
@@ -453,7 +455,7 @@ async function extractFallThrough(arm, requests) {
453
455
  for (const request of requests) {
454
456
  out.set(request.path, {
455
457
  kind: "unavailable",
456
- detail: `the analysis is suspended (${answered.error.reason}), thus the file at ${request.path} was not read`,
458
+ detail: `the host refused the sandbox (${answered.error.reason}), thus the file at ${request.path} was not read`,
457
459
  });
458
460
  }
459
461
  return out;
@@ -578,7 +580,7 @@ export function createProductionResolver(deps) {
578
580
  return err({ reference, reason: "hash-mismatch", detail: `expected ${reference.hash} but the artifact hash is ${identity.onDiskHash}` });
579
581
  }
580
582
  if (fileTypeHoldsNoCell(identity.fileType)) {
581
- return err({ reference, reason: "unreadable-artifact", detail: `the ${identity.fileType} at ${reference.path} holds no cell to read` });
583
+ return err({ reference, reason: "unreadable-artifact", detail: `the ${String(identity.fileType)} at ${reference.path} holds no cell to read` });
582
584
  }
583
585
  const cells = await getCells(reference.path, identity);
584
586
  if (cells.kind === "unavailable") {
@@ -594,21 +596,23 @@ export function createProductionResolver(deps) {
594
596
  const locator = reference.locator;
595
597
  let selectedRow;
596
598
  if (locator.row !== undefined) {
597
- if (locator.row < 0 || locator.row >= rows.length) {
599
+ const row = rows[locator.row];
600
+ if (row === undefined) {
598
601
  return fail(reference, "locator-out-of-range", `row ${locator.row} is outside the ${rows.length} rows`);
599
602
  }
600
- selectedRow = rows[locator.row];
603
+ selectedRow = row;
601
604
  }
602
605
  else if (locator.rowFilter !== undefined) {
603
606
  const filter = locator.rowFilter;
604
607
  const matches = rows.filter((row) => cellMatchesFilterValue(row[filter.column], filter.value));
605
- if (matches.length === 0) {
608
+ const match = matches[0];
609
+ if (match === undefined) {
606
610
  return fail(reference, "locator-out-of-range", `no row where ${filter.column} equals ${String(filter.value)}`);
607
611
  }
608
612
  if (matches.length > 1) {
609
613
  return fail(reference, "ambiguous-match", `${matches.length} rows where ${filter.column} equals ${String(filter.value)}`);
610
614
  }
611
- selectedRow = matches[0];
615
+ selectedRow = match;
612
616
  }
613
617
  else {
614
618
  // The locator schema forbids a locator with neither selector. The resolver cannot depend on a
@@ -617,8 +621,10 @@ export function createProductionResolver(deps) {
617
621
  }
618
622
  // A real table holds an empty cell, and a parse gives it back as an absent key. An absent key is
619
623
  // not a value that a scalar reference can bind. An empty string is a value, thus it stays valid.
624
+ // A cell that parsed as `null` never lands in a row: `coerceCell` drops it, so `null` is not
625
+ // an absence the resolver can meet here.
620
626
  const cell = selectedRow[locator.column];
621
- if (cell === undefined || cell === null) {
627
+ if (cell === undefined) {
622
628
  return fail(reference, "locator-out-of-range", `column ${locator.column} holds no value in the selected row`);
623
629
  }
624
630
  const valueFailure = checkValueAssertion(reference, reference.assert?.value, reference.assert?.tolerance, cell);
@@ -660,8 +666,9 @@ export function createProductionResolver(deps) {
660
666
  const projectedRows = rows.map((row) => {
661
667
  const projected = {};
662
668
  for (const column of columns) {
663
- if (column in row) {
664
- projected[column] = row[column];
669
+ const cell = row[column];
670
+ if (cell !== undefined) {
671
+ projected[column] = cell;
665
672
  }
666
673
  }
667
674
  return projected;
@@ -701,6 +708,9 @@ export function createProductionResolver(deps) {
701
708
  }
702
709
  const a = numbers[0];
703
710
  const b = numbers[1];
711
+ if (a === undefined || b === undefined) {
712
+ return fail(reference, "locator-out-of-range", `operation ${reference.op} needs two inputs, and the derivation holds ${numbers.length}`);
713
+ }
704
714
  let result;
705
715
  switch (reference.op) {
706
716
  case "ratio":
@@ -764,9 +774,9 @@ export function createProductionResolver(deps) {
764
774
  }
765
775
  // Compute the identity of each path, one read each, under the fan-out bound.
766
776
  const entries = [...byPath.entries()];
767
- const identities = await allWithConcurrency(entries.map(([path]) => () => computeIdentity(workspaceRoot, analysisId, path, snapshot, readCache)), PREPARE_CONCURRENCY);
768
- for (let e = 0; e < entries.length; e += 1) {
769
- idCache.set(entries[e][0], identities[e]);
777
+ const identityPairs = await allWithConcurrency(entries.map(([path]) => async () => ({ path, identity: await computeIdentity(workspaceRoot, analysisId, path, snapshot, readCache) })), PREPARE_CONCURRENCY);
778
+ for (const { path, identity } of identityPairs) {
779
+ idCache.set(path, identity);
770
780
  }
771
781
  // Read cells for each cell-reading path whose on-disk hash matches an expected pin. A hash that no
772
782
  // pin expects means every reference at the path mismatches, thus no parse runs on a drifted file.
@@ -789,14 +799,12 @@ export function createProductionResolver(deps) {
789
799
  pending.push(target);
790
800
  }
791
801
  }
792
- const reads = await allWithConcurrency(pending.map((target) => () => hostReadCells(cap, target.path, target.identity)), PREPARE_CONCURRENCY);
802
+ const reads = await allWithConcurrency(pending.map((target) => async () => ({ target, read: await hostReadCells(cap, target.path, target.identity) })), PREPARE_CONCURRENCY);
793
803
  // Split the clean reads from the fall-throughs, then resolve every fall-through in one arm call. An
794
804
  // unsupported format reaches no arm, because no reader is decided for it.
795
805
  const fallThrough = [];
796
806
  const identityByPath = new Map();
797
- for (let t = 0; t < pending.length; t += 1) {
798
- const target = pending[t];
799
- const read = reads[t];
807
+ for (const { target, read } of reads) {
800
808
  if (read.kind === "rows") {
801
809
  cellsCache.set(target.path, { kind: "rows", rows: read.rows });
802
810
  shareRows(readCache, target.identity, read.rows);
@@ -5,7 +5,7 @@
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 type { Result } from "neverthrow";
8
+ import { type Result } from "neverthrow";
9
9
  import type { Reference, RowBound, UnresolvedReference } from "../contracts/report-reference.js";
10
10
  /**
11
11
  * One pinned artifact: its content hash, and its rows as plain cells.
@@ -15,6 +15,9 @@ import type { Reference, RowBound, UnresolvedReference } from "../contracts/repo
15
15
  * skip a type inference pass, and resolution compares a numeral by its numeric value and never by its
16
16
  * JavaScript type.
17
17
  *
18
+ * A real parser gives an empty cell back as an absent key, `undefined`, or `null`, and a row admits all
19
+ * three. `snapshotRows` parses an entry's rows into the present cells that the resolution reads.
20
+ *
18
21
  * `rows` is optional because an image is pinned by its hash alone and holds no cells. An empty array in
19
22
  * that position would say that the artifact holds zero rows, which is a different and false claim. The
20
23
  * pin never populates `rows`. `rows` serves the fixture realization only, and that realization resolves
@@ -26,19 +29,32 @@ import type { Reference, RowBound, UnresolvedReference } from "../contracts/repo
26
29
  * `figure`, `script`, `log`, `notebook`, and `output`. Thus the field can refuse a kind of reference, and
27
30
  * it can never confirm one. An `output` covers a table and an image alike.
28
31
  */
29
- export interface ArtifactSnapshot {
32
+ export type ArtifactSnapshot = {
30
33
  hash: string;
31
34
  fileType?: string | null;
32
- rows?: Array<Record<string, string | number>>;
33
- }
35
+ rows?: Array<Record<string, string | number | null | undefined>>;
36
+ };
37
+ /**
38
+ * Give back the present cells of a snapshot entry's rows, or an empty array for an entry with no rows.
39
+ *
40
+ * The structural tier and the fixture resolver both read this one parse. Thus the two tiers can never
41
+ * disagree about the rows of one entry.
42
+ *
43
+ * A real parser gives an empty cell back as an absent key, `undefined`, or `null`; the parse admits each
44
+ * and yields the present cells, so the reads below see one absence shape only. The `Err` channel carries
45
+ * the account of a row that the artifact forbids: an entry of the rows list that is not a record, or a
46
+ * cell that is neither a string nor a number. The caller refuses the reference through its own channel,
47
+ * so a malformed row never throws out of resolution.
48
+ */
49
+ export declare function snapshotRows(entry: ArtifactSnapshot | undefined): Result<Array<Record<string, string | number>>, string>;
34
50
  /**
35
51
  * One pinned citation record: the short citation of the paper, and the description that the synthesis
36
52
  * gave. The record is the bibliography of a citation key, and the key alone states the membership.
37
53
  */
38
- export interface CitationRecord {
54
+ export type CitationRecord = {
39
55
  citation: string;
40
56
  description?: string;
41
- }
57
+ };
42
58
  /** The pinned citation records, keyed by the citation key, for example `pmid:12345`. */
43
59
  export type CitationRecords = Record<string, CitationRecord>;
44
60
  /**
@@ -51,11 +67,11 @@ export type CitationRecords = Record<string, CitationRecord>;
51
67
  * membership role, thus a key with no record is a pinned citation and a stored pin with no map reads the
52
68
  * same as one that predates the map.
53
69
  */
54
- export interface ReportSnapshot {
70
+ export type ReportSnapshot = {
55
71
  artifacts: Record<string, ArtifactSnapshot>;
56
72
  citations?: string[];
57
73
  citationRecords?: CitationRecords;
58
- }
74
+ };
59
75
  /**
60
76
  * The concrete value that a reference resolves to. A scalar comes from one artifact cell or one
61
77
  * derivation. A table comes from a whole-table artifact. A file echoes the pin of a whole-file artifact,
@@ -97,10 +113,10 @@ export type ResolvedValue = {
97
113
  * `resolve` then answers from the cache. The method is optional, thus a realization without it keeps the
98
114
  * per-reference behavior and the extension breaks no caller.
99
115
  */
100
- export interface ReferenceResolver {
116
+ export type ReferenceResolver = {
101
117
  resolve(reference: Reference, snapshot: ReportSnapshot): Promise<Result<ResolvedValue, UnresolvedReference>>;
102
118
  prepare?(references: readonly Reference[], snapshot: ReportSnapshot): Promise<void>;
103
- }
119
+ };
104
120
  /**
105
121
  * Give back each name in `columns` that no row holds, in the order of `columns`.
106
122
  *