@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,8 +16,12 @@
16
16
  * enrichment reads a bounded number of members per shape whatever the tree's size.
17
17
  */
18
18
  import { readFile } from "node:fs/promises";
19
+ import { z } from "zod";
19
20
  import { runSandboxExec } from "../tools/workspace/run-exec.js";
20
21
  import { READOUT_PREFIX_BYTES, readPrefix } from "./readout.js";
22
+ import { safeParseJsonAs } from "../lib/parse-json.js";
23
+ import { presentAt } from "../lib/present.js";
24
+ import { collapseWhitespace } from "../lib/text.js";
21
25
  /** Members decoded per shape. One is enough to characterise a set whose names already match. */
22
26
  export const MEMBERS_DECODED_PER_SHAPE = 1;
23
27
  /** Wall-clock bound on the container-decode exec. It opens footers, nothing more. */
@@ -57,7 +61,7 @@ export async function readHeaders(args) {
57
61
  let next = 0;
58
62
  await Promise.all(Array.from({ length: Math.min(READOUT_CONCURRENCY, prefixed.length) }, async () => {
59
63
  for (let i = next++; i < prefixed.length; i = next++) {
60
- const target = prefixed[i];
64
+ const target = presentAt(prefixed, i, "readout targets");
61
65
  readouts.set(target.path, await readFromPrefix(args, target));
62
66
  }
63
67
  }));
@@ -85,7 +89,7 @@ export async function enrichShapes(args) {
85
89
  return [...args.shapes];
86
90
  const readouts = await readHeaders({
87
91
  ...args,
88
- targets: [...targets.entries()].map(([path, shape]) => ({ path, format: shape.format, ...(shape.wrapper ? { wrapper: shape.wrapper } : {}) })),
92
+ targets: [...targets.entries()].map(([path, shape]) => ({ path, format: shape.format, wrapper: shape.wrapper })),
89
93
  });
90
94
  const byShape = new Map();
91
95
  for (const [path, shape] of targets) {
@@ -105,9 +109,15 @@ async function readFromPrefix(args, target) {
105
109
  .unwrapOr({ kind: "read_failed" });
106
110
  if (read.kind !== "ok")
107
111
  return { path, fields: {}, unavailable: `prefix unreadable (${read.kind})` };
108
- const readout = await readPrefix({ prefix: read.bytes, format: target.format, ...(target.wrapper ? { wrapper: target.wrapper } : {}) });
109
- return { path, fields: readout.fields, ...(readout.unavailable ? { unavailable: readout.unavailable } : {}) };
112
+ const readout = await readPrefix({ prefix: read.bytes, format: target.format, wrapper: target.wrapper });
113
+ return { path, fields: readout.fields, unavailable: readout.unavailable };
110
114
  }
115
+ /** One JSON line the decoder prints on stdout: the path it read, its fields, or why it could not. */
116
+ const ReadoutLineSchema = z.object({
117
+ path: z.string().optional(),
118
+ fields: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
119
+ unavailable: z.string().optional(),
120
+ });
111
121
  async function decodeContainers(args, machine, containers) {
112
122
  const readouts = new Map();
113
123
  const source = await readFile(CONTAINER_DECODER, "utf8").catch(() => undefined);
@@ -133,18 +143,21 @@ async function decodeContainers(args, machine, containers) {
133
143
  continue;
134
144
  let parsed;
135
145
  try {
136
- parsed = JSON.parse(trimmed);
146
+ parsed = safeParseJsonAs(trimmed, ReadoutLineSchema);
137
147
  }
138
148
  catch {
149
+ // The sandbox caps stdout and a timeout can stop the decoder mid-write, so the last line can be cut.
139
150
  continue;
140
151
  }
141
- const target = parsed.path ? byAbsolute.get(parsed.path) : undefined;
152
+ if (!parsed.success)
153
+ continue;
154
+ const target = parsed.data.path ? byAbsolute.get(parsed.data.path) : undefined;
142
155
  if (!target)
143
156
  continue;
144
157
  readouts.set(target.path, {
145
158
  path: target.path,
146
- fields: parsed.fields ?? {},
147
- ...(parsed.unavailable ? { unavailable: parsed.unavailable } : {}),
159
+ fields: parsed.data.fields ?? {},
160
+ unavailable: parsed.data.unavailable,
148
161
  });
149
162
  }
150
163
  // A target the decoder said nothing about is told WHY, from the exec's own outcome: the
@@ -158,14 +171,18 @@ async function decodeContainers(args, machine, containers) {
158
171
  }
159
172
  return readouts;
160
173
  }
174
+ const CUT_OUTPUT_REASON = "container decoder output was cut at the sandbox byte cap";
161
175
  function describeExecFailure(result) {
176
+ const cut = result.stdoutTruncated ? ` (${CUT_OUTPUT_REASON})` : "";
162
177
  if (result.timedOut)
163
- return `container decoder timed out after ${ENRICH_TIMEOUT_SECONDS}s`;
178
+ return `container decoder timed out after ${ENRICH_TIMEOUT_SECONDS}s${cut}`;
164
179
  if (result.syntheticFailure)
165
- return `container decoder did not complete: ${result.syntheticFailure.reason}`;
180
+ return `container decoder did not complete: ${result.syntheticFailure.reason}${cut}`;
166
181
  if (result.exitCode !== 0) {
167
- const stderr = result.stderr.replace(/\s+/g, " ").trim().slice(0, MAX_STDERR_CHARS);
168
- return `container decoder exited ${result.exitCode ?? "with no code"}${stderr ? `: ${stderr}` : ""}`;
182
+ const stderr = collapseWhitespace(result.stderr).slice(0, MAX_STDERR_CHARS);
183
+ return `container decoder exited ${result.exitCode ?? "with no code"}${stderr ? `: ${stderr}` : ""}${cut}`;
169
184
  }
185
+ if (result.stdoutTruncated)
186
+ return CUT_OUTPUT_REASON;
170
187
  return "container decoder reported nothing for this member";
171
188
  }
@@ -30,10 +30,10 @@ export declare const KNOWN_EXTENSIONS: ReadonlySet<string>;
30
30
  export declare function extensionChain(fileName: string): string[];
31
31
  /** The extension chain with any compression wrappers stripped from the tail. */
32
32
  export declare function innerExtensions(extensions: readonly string[]): string[];
33
- export interface DetectedFormat {
33
+ export type DetectedFormat = {
34
34
  readonly format: string;
35
35
  readonly wrapper?: string;
36
- }
36
+ };
37
37
  /**
38
38
  * Identify a file's format from a bounded prefix of its bytes, falling back to the
39
39
  * extension chain — which is all a wrapped file can offer the host, since reading
@@ -139,6 +139,8 @@ function gzipWrapper(buf) {
139
139
  if (buf.length < 12)
140
140
  return "gzip";
141
141
  const flags = buf[3];
142
+ if (flags === undefined)
143
+ return "gzip";
142
144
  const hasExtra = (flags & 0x04) !== 0;
143
145
  if (!hasExtra)
144
146
  return "gzip";
@@ -209,7 +211,7 @@ function textFormat(buf) {
209
211
  return "cel";
210
212
  if (head.startsWith("track ") || head.startsWith("fixedStep") || head.startsWith("variableStep"))
211
213
  return "wig";
212
- if (/^<\?xml/.test(head)) {
214
+ if (head.startsWith("<?xml")) {
213
215
  if (head.includes("<indexedmzML") || head.includes("<mzML"))
214
216
  return "mzml";
215
217
  if (head.includes("<mzXML"))
@@ -239,8 +241,12 @@ export function extensionChain(fileName) {
239
241
  /** The extension chain with any compression wrappers stripped from the tail. */
240
242
  export function innerExtensions(extensions) {
241
243
  const inner = [...extensions];
242
- while (inner.length > 0 && WRAPPER_EXTENSIONS.has(inner[inner.length - 1]))
244
+ for (;;) {
245
+ const last = inner[inner.length - 1];
246
+ if (last === undefined || !WRAPPER_EXTENSIONS.has(last))
247
+ break;
243
248
  inner.pop();
249
+ }
244
250
  return inner;
245
251
  }
246
252
  /**
@@ -9,11 +9,11 @@
9
9
  * The catalogue is a floor, not a closed set.
10
10
  */
11
11
  import type { MemberFile } from "./set-types.js";
12
- export interface MarkerUnit {
12
+ export type MarkerUnit = {
13
13
  readonly label: string;
14
14
  readonly root: string;
15
15
  readonly members: readonly MemberFile[];
16
- }
16
+ };
17
17
  /** The marker-claimed units of a tree, and the members no marker claimed. */
18
18
  export declare function applyMarkers(files: readonly MemberFile[]): {
19
19
  units: MarkerUnit[];
@@ -9,11 +9,16 @@
9
9
  * The catalogue is a floor, not a closed set.
10
10
  */
11
11
  import { basenameOf, dirnameOf } from "./tokens.js";
12
+ import { presentFirst } from "../lib/present.js";
12
13
  /** A marker whose presence claims the directory it sits in, and nothing below it. */
13
14
  const DIRECTORY_MARKERS = [
14
15
  {
15
16
  label: "feature-barcode-matrix",
16
- requires: [/^matrix\.mtx(\.gz)?$/, /^barcodes\.tsv(\.gz)?$/, /^(features|genes)\.tsv(\.gz)?$/],
17
+ requires: [
18
+ nameIs("matrix.mtx", "matrix.mtx.gz"),
19
+ nameIs("barcodes.tsv", "barcodes.tsv.gz"),
20
+ nameIs("features.tsv", "features.tsv.gz", "genes.tsv", "genes.tsv.gz"),
21
+ ],
17
22
  },
18
23
  ];
19
24
  /**
@@ -25,11 +30,15 @@ const DIRECTORY_MARKERS = [
25
30
  */
26
31
  const SUBTREE_MARKERS = [
27
32
  { label: "study-manifest", name: "meta_study.txt" },
28
- { label: "dataset-descriptor", name: "dataset_description.json", corroborate: /^sub-/ },
33
+ { label: "dataset-descriptor", name: "dataset_description.json", corroborate: (segment) => segment.startsWith("sub-") },
29
34
  ];
30
- function hasCorroboratingChild(files, root, pattern) {
35
+ function nameIs(...names) {
36
+ const known = new Set(names);
37
+ return (name) => known.has(name);
38
+ }
39
+ function hasCorroboratingChild(files, root, matches) {
31
40
  const prefix = root === "" ? "" : `${root}/`;
32
- return files.some((file) => file.path.startsWith(prefix) && pattern.test(file.path.slice(prefix.length).split("/")[0]));
41
+ return files.some((file) => file.path.startsWith(prefix) && matches(presentFirst(file.path.slice(prefix.length).split("/"), "the first path segment")));
33
42
  }
34
43
  /** The marker-claimed units of a tree, and the members no marker claimed. */
35
44
  export function applyMarkers(files) {
@@ -47,7 +56,7 @@ export function applyMarkers(files) {
47
56
  for (const [directory, members] of byDirectory) {
48
57
  const names = members.map((member) => basenameOf(member.path));
49
58
  for (const marker of DIRECTORY_MARKERS) {
50
- if (marker.requires.every((pattern) => names.some((name) => pattern.test(name))))
59
+ if (marker.requires.every((matches) => names.some((name) => matches(name))))
51
60
  directories.push({ label: marker.label, root: directory });
52
61
  }
53
62
  for (const marker of SUBTREE_MARKERS) {
@@ -43,13 +43,13 @@ export declare const MAX_CROSSED_SLOTS = 3;
43
43
  * a full 24-member crossing or 8 members each at one timepoint, and the two are different
44
44
  * experimental designs. The margins alone cannot tell them apart.
45
45
  */
46
- export interface SetCrossing {
46
+ export type SetCrossing = {
47
47
  readonly setId: string;
48
48
  readonly slotIds: readonly string[];
49
49
  readonly observedCombinations: number;
50
50
  /** The full cross product, or `null` when it is past counting. */
51
51
  readonly possibleCombinations: number | null;
52
- }
52
+ };
53
53
  /**
54
54
  * Measured overlap between two sets' slots, with its gaps.
55
55
  *
@@ -57,7 +57,7 @@ export interface SetCrossing {
57
57
  * dimension plausible; the values present in one and absent from the other are what make
58
58
  * it checkable.
59
59
  */
60
- export interface SlotCorrespondence {
60
+ export type SlotCorrespondence = {
61
61
  readonly sets: readonly [string, string];
62
62
  readonly slots: readonly [string, string];
63
63
  readonly shared: number;
@@ -66,15 +66,15 @@ export interface SlotCorrespondence {
66
66
  readonly sharedSample: readonly string[];
67
67
  readonly onlyInFirstSample: readonly string[];
68
68
  readonly onlyInSecondSample: readonly string[];
69
- }
69
+ };
70
70
  /** The tail the menu did not list, in aggregate. */
71
- export interface UnlistedSets {
71
+ export type UnlistedSets = {
72
72
  readonly sets: number;
73
73
  readonly members: number;
74
74
  readonly files: number;
75
75
  readonly totalBytes: number;
76
- }
77
- export interface SetMenu {
76
+ };
77
+ export type SetMenu = {
78
78
  readonly fileCount: number;
79
79
  readonly keptFileCount: number;
80
80
  /** The addressable entries. An operation may name one of these ids and no other. */
@@ -95,7 +95,7 @@ export interface SetMenu {
95
95
  readonly truncated: boolean;
96
96
  /** Leftovers whose header readout was elided by the readout budget. */
97
97
  readonly readoutsElided: number;
98
- }
98
+ };
99
99
  /**
100
100
  * Slot overlap across the listed sets, strongest first.
101
101
  *
@@ -110,12 +110,12 @@ export declare function buildCorrespondences(detected: DetectedSets, sets: reado
110
110
  * which is the whole content of the observation.
111
111
  */
112
112
  export declare function buildCrossings(detected: DetectedSets, sets: readonly DetectedSet[]): SetCrossing[];
113
- export interface BuildSetMenuOptions {
113
+ export type BuildSetMenuOptions = {
114
114
  readonly headers?: ReadonlyMap<string, HeaderReadout>;
115
115
  /** The walk stopped at its ceiling; see {@link SetMenu.truncated}. */
116
116
  readonly truncated?: boolean;
117
117
  readonly readoutsElided?: number;
118
- }
118
+ };
119
119
  /** Project a scan into the bounded menu the agent authors against. */
120
120
  export declare function buildSetMenu(detected: DetectedSets, options?: BuildSetMenuOptions): SetMenu;
121
121
  /**
Binary file
@@ -10,8 +10,8 @@ import type { QuarantineReason, QuarantineSummary } from "./set-types.js";
10
10
  import type { ScannedFile } from "./types.js";
11
11
  /** The rule a path trips, or `undefined` when it trips none. */
12
12
  export declare function quarantineReason(path: string): QuarantineReason | undefined;
13
- export interface QuarantineResult {
13
+ export type QuarantineResult = {
14
14
  readonly kept: readonly ScannedFile[];
15
15
  readonly summary: QuarantineSummary;
16
- }
16
+ };
17
17
  export declare function quarantine(files: readonly ScannedFile[]): QuarantineResult;
@@ -7,38 +7,43 @@
7
7
  * be reported: a wrongly quarantined file that no one can see is worse than the junk.
8
8
  */
9
9
  import { MAX_QUARANTINE_SAMPLE } from "./tuning.js";
10
+ import { presentLast } from "../lib/present.js";
10
11
  const EXACT_JUNK_NAMES = new Set([".DS_Store", "Thumbs.db", "desktop.ini"]);
12
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- LibreOffice-style atomic writes suffix `.tmp-` with a full UUID; the dashed hex groups are the shape.
13
+ const TMP_UUID_SUFFIX = /\.tmp-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
14
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the same writer without a UUID: `.tmp-` and at least eight hex digits.
15
+ const TMP_HEX_SUFFIX = /\.tmp-[0-9a-fA-F]{8,}$/;
11
16
  const NAME_RULES = [
12
- { pattern: /^\._/, reason: "os-junk" },
13
- { pattern: /^~\$/, reason: "editor-temp" },
14
- { pattern: /~$/, reason: "editor-temp" },
15
- { pattern: /^\.~lock\..*#$/, reason: "editor-temp" },
16
- { pattern: /\.swp$/, reason: "editor-temp" },
17
- { pattern: /\.part$/, reason: "partial-download" },
18
- { pattern: /\.filepart$/, reason: "partial-download" },
19
- { pattern: /\.crdownload$/, reason: "partial-download" },
20
- { pattern: /\.download$/, reason: "partial-download" },
21
- { pattern: /\.tmp$/, reason: "atomic-write-temp" },
22
- { pattern: /^\.nfs/, reason: "atomic-write-temp" },
23
- { pattern: /\.tmp-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/, reason: "atomic-write-temp" },
24
- { pattern: /\.tmp-[0-9a-fA-F]{8,}$/, reason: "atomic-write-temp" },
17
+ { matches: (name) => name.startsWith("._"), reason: "os-junk" },
18
+ { matches: (name) => name.startsWith("~$"), reason: "editor-temp" },
19
+ { matches: (name) => name.endsWith("~"), reason: "editor-temp" },
20
+ { matches: (name) => name.startsWith(".~lock.") && name.endsWith("#"), reason: "editor-temp" },
21
+ { matches: (name) => name.endsWith(".swp"), reason: "editor-temp" },
22
+ { matches: (name) => name.endsWith(".part"), reason: "partial-download" },
23
+ { matches: (name) => name.endsWith(".filepart"), reason: "partial-download" },
24
+ { matches: (name) => name.endsWith(".crdownload"), reason: "partial-download" },
25
+ { matches: (name) => name.endsWith(".download"), reason: "partial-download" },
26
+ { matches: (name) => name.endsWith(".tmp"), reason: "atomic-write-temp" },
27
+ { matches: (name) => name.startsWith(".nfs"), reason: "atomic-write-temp" },
28
+ { matches: (name) => TMP_UUID_SUFFIX.test(name), reason: "atomic-write-temp" },
29
+ { matches: (name) => TMP_HEX_SUFFIX.test(name), reason: "atomic-write-temp" },
25
30
  ];
26
31
  const SEGMENT_RULES = [
27
- { pattern: /^__MACOSX$/, reason: "os-junk" },
28
- { pattern: /^\.Trash-/, reason: "os-junk" },
32
+ { matches: (segment) => segment === "__MACOSX", reason: "os-junk" },
33
+ { matches: (segment) => segment.startsWith(".Trash-"), reason: "os-junk" },
29
34
  ];
30
35
  /** The rule a path trips, or `undefined` when it trips none. */
31
36
  export function quarantineReason(path) {
32
37
  const segments = path.split("/");
33
- const name = segments[segments.length - 1];
38
+ const name = presentLast(segments, "the path name");
34
39
  if (EXACT_JUNK_NAMES.has(name))
35
40
  return "os-junk";
36
41
  for (const rule of NAME_RULES)
37
- if (rule.pattern.test(name))
42
+ if (rule.matches(name))
38
43
  return rule.reason;
39
44
  for (const segment of segments)
40
45
  for (const rule of SEGMENT_RULES)
41
- if (rule.pattern.test(segment))
46
+ if (rule.matches(segment))
42
47
  return rule.reason;
43
48
  return undefined;
44
49
  }
@@ -19,11 +19,11 @@ import type { DetectedSet, DetectedSets, MemberFile, ReadoutSelection } from "./
19
19
  */
20
20
  export declare const MAX_LEFTOVER_READOUTS = 64;
21
21
  /** A file the selection named, with what the scan already knows about its bytes. */
22
- export interface ReadoutTarget {
22
+ export type ReadoutTarget = {
23
23
  readonly path: string;
24
24
  readonly format: string;
25
25
  readonly wrapper?: string;
26
- }
26
+ };
27
27
  export declare function selectReadouts(sets: readonly DetectedSet[], leftovers: readonly MemberFile[]): ReadoutSelection;
28
28
  /**
29
29
  * The selection as readout targets. The format the scan detected rides along, so the
@@ -55,7 +55,7 @@ export function readoutTargets(detected) {
55
55
  if (!member || seen.has(path))
56
56
  continue;
57
57
  seen.add(path);
58
- targets.push({ path, format: member.format, ...(member.wrapper ? { wrapper: member.wrapper } : {}) });
58
+ targets.push({ path, format: member.format, wrapper: member.wrapper });
59
59
  }
60
60
  return targets;
61
61
  }
@@ -14,11 +14,11 @@ export declare const READOUT_PREFIX_BYTES = 262144;
14
14
  /** Cap on the text window a readout inspects, whether decompressed or raw. */
15
15
  export declare const READOUT_TEXT_BYTES = 262144;
16
16
  export type ReadoutFields = Record<string, string | number | boolean>;
17
- export interface PrefixReadout {
17
+ export type PrefixReadout = {
18
18
  readonly fields: ReadoutFields;
19
19
  /** Why the fields are thin or empty. Present alongside whatever WAS read. */
20
20
  readonly unavailable?: string;
21
- }
21
+ };
22
22
  /**
23
23
  * Read what a bounded prefix can say about a file.
24
24
  *
@@ -10,6 +10,12 @@
10
10
  * `enrich.ts`), which is what makes the whole surface testable from synthetic bytes.
11
11
  */
12
12
  import { constants as zlibConstants, createGunzip, createZstdDecompress } from "node:zlib";
13
+ import { z } from "zod";
14
+ import { parseJsonAs } from "../lib/parse-json.js";
15
+ import { isUnknownArray } from "../lib/unknown-array.js";
16
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
17
+ import { collapseWhitespace, splitLines } from "../lib/text.js";
18
+ import { presentAt, presentFirst } from "../lib/present.js";
13
19
  /** Bytes read from each file. The readout's whole per-file I/O budget. */
14
20
  export const READOUT_PREFIX_BYTES = 262_144;
15
21
  /** Cap on the text window a readout inspects, whether decompressed or raw. */
@@ -110,7 +116,7 @@ function decodeText(buf, format) {
110
116
  return textFields(buf.subarray(0, READOUT_TEXT_BYTES).toString("utf8"), format);
111
117
  }
112
118
  function textFields(text, format) {
113
- const lines = text.split(/\r?\n/).filter((line) => line.trim() !== "");
119
+ const lines = splitLines(text).filter((line) => line.trim() !== "");
114
120
  const head = lines[0];
115
121
  if (head === undefined)
116
122
  return { fields: {}, unavailable: "no text in the prefix" };
@@ -127,7 +133,7 @@ function textFields(text, format) {
127
133
  if (head.startsWith("@HD") || head.startsWith("@SQ"))
128
134
  return samFields(lines);
129
135
  if (head.startsWith("@") && lines.length > 1)
130
- return { fields: { firstRecord: clip(head.slice(1), MAX_RECORD_CHARS), readLength: lines[1].length } };
136
+ return { fields: { firstRecord: clip(head.slice(1), MAX_RECORD_CHARS), readLength: presentAt(lines, 1, "prefix lines").length } };
131
137
  return delimitedFields(lines) ?? { fields: { firstLine: clip(head, MAX_LINE_CHARS), linesInPrefix: lines.length } };
132
138
  }
133
139
  /**
@@ -163,14 +169,16 @@ function metaHeaderFields(lines) {
163
169
  }
164
170
  return { fields };
165
171
  }
172
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the SAM header sort order: `SO:<value>` at the line start or after a tab, ending at the next tab.
173
+ const SAM_SORT_ORDER_FIELD = /(?:^|\t)SO:([^\t]+)/;
166
174
  function samFields(lines) {
167
175
  const fields = {
168
176
  referenceSequences: countPrefixed(lines, "@SQ"),
169
177
  readGroups: countPrefixed(lines, "@RG"),
170
178
  };
171
- const sortOrder = /(?:^|\t)SO:([^\t]+)/.exec(lines.find((line) => line.startsWith("@HD")) ?? "");
179
+ const sortOrder = SAM_SORT_ORDER_FIELD.exec(lines.find((line) => line.startsWith("@HD")) ?? "");
172
180
  if (sortOrder)
173
- fields.sortOrder = clip(sortOrder[1], 20);
181
+ fields.sortOrder = clip(presentAt(sortOrder, 1, "the SO: capture group"), 20);
174
182
  return { fields };
175
183
  }
176
184
  const DELIMITERS = [
@@ -200,7 +208,7 @@ function delimitedFields(lines) {
200
208
  const headerIndex = lines.findIndex((line) => !line.startsWith("#"));
201
209
  if (headerIndex < 0)
202
210
  return undefined;
203
- const header = lines[headerIndex];
211
+ const header = presentAt(lines, headerIndex, "the header line");
204
212
  const delimiter = sniffDelimiter(header);
205
213
  if (delimiter === undefined)
206
214
  return undefined;
@@ -228,10 +236,11 @@ function looksLikeHeader(columns) {
228
236
  }
229
237
  function splitDelimited(line, delimiter) {
230
238
  const cells = [];
239
+ const chars = line.split("");
231
240
  let current = "";
232
241
  let quoted = false;
233
242
  for (let index = 0; index < line.length; index++) {
234
- const char = line[index];
243
+ const char = presentAt(chars, index, "line characters");
235
244
  if (quoted) {
236
245
  if (char !== '"')
237
246
  current += char;
@@ -257,18 +266,17 @@ function splitDelimited(line, delimiter) {
257
266
  }
258
267
  function jsonFields(text, lines) {
259
268
  const whole = parseJson(text.slice(0, READOUT_TEXT_BYTES));
260
- if (Array.isArray(whole)) {
269
+ if (isUnknownArray(whole)) {
261
270
  const first = whole[0];
262
- return {
263
- fields: {
264
- jsonType: "array",
265
- elementCount: whole.length,
266
- ...(isRecord(first) ? { firstElementKeys: joinKeys(Object.keys(first)) } : {}),
267
- },
268
- };
271
+ const fields = { jsonType: "array", elementCount: whole.length };
272
+ const firstRecord = parseUnknownRecord(first);
273
+ if (firstRecord !== undefined)
274
+ fields.firstElementKeys = joinKeys(Object.keys(firstRecord));
275
+ return { fields };
269
276
  }
270
- if (isRecord(whole)) {
271
- const keys = Object.keys(whole);
277
+ const wholeRecord = parseUnknownRecord(whole);
278
+ if (wholeRecord !== undefined) {
279
+ const keys = Object.keys(wholeRecord);
272
280
  return { fields: { jsonType: "object", keyCount: keys.length, keys: joinKeys(keys) } };
273
281
  }
274
282
  if (whole !== undefined)
@@ -277,35 +285,43 @@ function jsonFields(text, lines) {
277
285
  const candidates = lines.slice(0, MAX_META_LINES);
278
286
  const parsed = candidates.map((line) => parseJson(line));
279
287
  const complete = parsed.filter((value) => value !== undefined);
280
- const record = parsed.find(isRecord);
288
+ const record = parsed.reduce((found, value) => found ?? parseUnknownRecord(value), undefined);
281
289
  if (record !== undefined && complete.length >= Math.max(1, candidates.length - 1)) {
282
290
  return { fields: { jsonType: "json-lines", recordsInPrefix: lines.length, keys: joinKeys(Object.keys(record)) } };
283
291
  }
284
- return { fields: { firstLine: clip(lines[0], MAX_LINE_CHARS) }, unavailable: "JSON document extends past the readout prefix" };
292
+ return { fields: { firstLine: clip(presentFirst(lines, "prefix lines"), MAX_LINE_CHARS) }, unavailable: "JSON document extends past the readout prefix" };
285
293
  }
294
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a top-level YAML key: an identifier from the line start, then `:` and end of line or whitespace.
295
+ const YAML_TOP_LEVEL_KEY = /^([A-Za-z_][\w.-]*):(\s|$)/;
286
296
  /** Top-level keys, read positionally: an unindented `key:` line opens a mapping entry. */
287
297
  function yamlFields(lines) {
288
298
  const keys = [];
289
299
  for (const line of lines.slice(0, MAX_META_LINES)) {
290
- const match = /^([A-Za-z_][\w.-]*):(\s|$)/.exec(line);
300
+ const match = YAML_TOP_LEVEL_KEY.exec(line);
291
301
  if (match)
292
- keys.push(match[1]);
302
+ keys.push(presentAt(match, 1, "the yaml key capture"));
293
303
  }
294
304
  const documents = lines.filter((line) => line.trim() === "---").length;
295
- return {
296
- fields: {
297
- topLevelKeyCount: keys.length,
298
- topLevelKeys: joinKeys(keys),
299
- linesInPrefix: lines.length,
300
- ...(documents > 0 ? { documentSeparators: documents } : {}),
301
- },
305
+ const fields = {
306
+ topLevelKeyCount: keys.length,
307
+ topLevelKeys: joinKeys(keys),
308
+ linesInPrefix: lines.length,
302
309
  };
310
+ if (documents > 0)
311
+ fields.documentSeparators = documents;
312
+ return { fields };
303
313
  }
314
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- an ATX heading opens with one to six `#` and a whitespace character.
315
+ const MARKDOWN_HEADING = /^#{1,6}\s/;
304
316
  function markdownFields(lines) {
305
- const headings = lines.filter((line) => /^#{1,6}\s/.test(line));
317
+ const headings = lines.filter((line) => MARKDOWN_HEADING.test(line));
318
+ const first = headings[0] ?? presentFirst(lines, "prefix lines");
319
+ let markers = 0;
320
+ while (first.charAt(markers) === "#")
321
+ markers++;
306
322
  return {
307
323
  fields: {
308
- title: clip((headings[0] ?? lines[0]).replace(/^#+\s*/, ""), MAX_LINE_CHARS),
324
+ title: clip(first.slice(markers).trimStart(), MAX_LINE_CHARS),
309
325
  headings: headings.length,
310
326
  linesInPrefix: lines.length,
311
327
  },
@@ -313,15 +329,12 @@ function markdownFields(lines) {
313
329
  }
314
330
  function parseJson(text) {
315
331
  try {
316
- return JSON.parse(text);
332
+ return parseJsonAs(text, z.json());
317
333
  }
318
334
  catch {
319
335
  return undefined;
320
336
  }
321
337
  }
322
- function isRecord(value) {
323
- return typeof value === "object" && value !== null && !Array.isArray(value);
324
- }
325
338
  function joinKeys(keys) {
326
339
  return clip(keys
327
340
  .slice(0, MAX_COLUMNS_REPORTED)
@@ -332,5 +345,5 @@ function countPrefixed(lines, prefix) {
332
345
  return lines.filter((line) => line.startsWith(prefix)).length;
333
346
  }
334
347
  function clip(text, limit) {
335
- return text.replace(/\s+/g, " ").trim().slice(0, limit);
348
+ return collapseWhitespace(text).slice(0, limit);
336
349
  }
@@ -26,7 +26,7 @@ import type { InputScan, InputScanManifest, ScannedFile } from "./types.js";
26
26
  * capability exists to remove.
27
27
  */
28
28
  export declare const MAX_SCANNED_FILES = 100000;
29
- export interface ScanInputTreeArgs {
29
+ export type ScanInputTreeArgs = {
30
30
  readonly session: AgentSession;
31
31
  readonly fs: WorkspaceFilesystem;
32
32
  /** Directory to scan, relative to the analysis root (e.g. `data/inputs`). */
@@ -34,7 +34,7 @@ export interface ScanInputTreeArgs {
34
34
  /** Walk ceiling; defaults to {@link MAX_SCANNED_FILES}. */
35
35
  readonly limit?: number;
36
36
  readonly signal?: AbortSignal;
37
- }
37
+ };
38
38
  /** Assemble a manifest from an already-walked file set. Pure — the seam of the unit tests. */
39
39
  export declare function buildManifest(root: string, files: readonly ScannedFile[], truncated: boolean, limit?: number): InputScan;
40
40
  /** Walk a staged input tree and observe its shapes. No model, no container. */
@@ -36,6 +36,8 @@ async function walk(args) {
36
36
  while (queue.length > 0) {
37
37
  signal?.throwIfAborted();
38
38
  const dir = queue.shift();
39
+ if (dir === undefined)
40
+ break;
39
41
  const listing = unwrapOrThrow(await fs.list({ session, path: dir }));
40
42
  // A directory that vanished mid-walk, or one the seam refuses, is not a scan
41
43
  // failure — the tree is being described, not validated.
@@ -60,7 +62,7 @@ async function walk(args) {
60
62
  size: entry.size ?? 0,
61
63
  extensions,
62
64
  format,
63
- ...(wrapper ? { wrapper } : {}),
65
+ wrapper,
64
66
  });
65
67
  }
66
68
  }
@@ -75,18 +77,18 @@ function formatCensus(files) {
75
77
  /** Assemble a manifest from an already-walked file set. Pure — the seam of the unit tests. */
76
78
  export function buildManifest(root, files, truncated, limit = MAX_SCANNED_FILES) {
77
79
  const observed = observeShapes(files);
78
- const manifest = {
80
+ const base = {
79
81
  root,
80
82
  fileCount: files.length,
81
83
  totalBytes: files.reduce((sum, f) => sum + f.size, 0),
82
84
  truncated,
83
- ...(truncated ? { scanLimit: limit } : {}),
84
85
  shapesTruncated: observed.shapesTruncated,
85
86
  formats: formatCensus(files),
86
87
  shapes: observed.shapes,
87
88
  valueOverlaps: observed.valueOverlaps,
88
89
  unstructured: observed.unstructured,
89
90
  };
91
+ const manifest = truncated ? { ...base, scanLimit: limit } : base;
90
92
  return { files, manifest, positionValues: observed.positionValues };
91
93
  }
92
94
  /** Walk a staged input tree and observe its shapes. No model, no container. */
@@ -105,7 +107,7 @@ export function formatBytes(bytes) {
105
107
  value /= 1024;
106
108
  unit++;
107
109
  }
108
- return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
110
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${String(units[unit])}`;
109
111
  }
110
112
  /**
111
113
  * Render a manifest for a briefing or a tool result.
@@ -145,7 +147,7 @@ export function renderInputScanManifest(manifest) {
145
147
  }
146
148
  if (shape.header) {
147
149
  const fields = Object.entries(shape.header.fields)
148
- .map(([key, value]) => `${key}=${value}`)
150
+ .map(([key, value]) => `${key}=${String(value)}`)
149
151
  .join(", ");
150
152
  lines.push(` - header (${shape.header.path}): ${fields || shape.header.unavailable || "no fields read"}`);
151
153
  }