@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
@@ -1,23 +1,25 @@
1
1
  /**
2
- * The chat turn of a host: a turn is `runChatTurn`, which is `openChatTurn` and then the `run` of the
3
- * open turn. `prepareChatTurn` is the first step of the open. The host gives only its transport
4
- * values, and the harness stores the opening, each round, and the outcome.
2
+ * The run of one chat turn: `runOpenTurn` runs the root loop over a prepared turn, stores the opening and each
3
+ * round, and closes the turn with its outcome. A transport gives the surface and the store of the turn. The turn
4
+ * workflow (`chat-turn-workflow.ts`) gives the transport of a workflow, and a host reaches the turn through it.
5
5
  */
6
+ import { presentFirst } from "../lib/present.js";
7
+ import { errorNameOf } from "../lib/thrown.js";
6
8
  import { unwrapOrThrow } from "../lib/result.js";
7
- import { finalText, runAgent } from "../loop/run-agent.js";
8
- import { passthroughStep } from "../loop/run-step.js";
9
+ import { rulesForContextWindow } from "../loop/compaction.js";
10
+ import { finalText, runLoop } from "../loop/run-loop.js";
11
+ import { isTurnCredentialMissing } from "../loop/turn-credentials.js";
9
12
  import { compactionExchangeOf, syntheticUserMessage } from "../memory/ai-sdk-message-storage.js";
10
- import { createConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
11
13
  import { deriveThreadTitle } from "../memory/derive-thread-title.js";
12
14
  import { conversationRecordTurn, createThreadHistory } from "../memory/thread-history.js";
13
15
  import { createThreadStore } from "../memory/thread-store.js";
16
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
14
17
  import { createWorkingMemory } from "../memory/working-memory.js";
15
- import { findProviderError } from "../providers/errors.js";
18
+ import { findProviderError, modelFailureOf } from "../providers/errors.js";
16
19
  import { MEMORY_COMPACTION_REQUEST, SUMMARY_COMPACTION_REQUEST } from "../prompts/compaction.js";
17
20
  import { CONVERSATION_PROMPT_CACHE } from "../providers/prompt-cache.js";
18
21
  import { loadAnalysisStatus, queryNonTerminalRunsByAnalysis } from "../state/index.js";
19
22
  import { createToolOutputStore } from "../state/tool-outputs.js";
20
- import { suspensionOfFailure } from "../workflows/suspension.js";
21
23
  import { assembleMessages, contextRecordsFor } from "./message-assembly.js";
22
24
  import { renderRunActivity, renderRunActivityUnavailable, RUN_ACTIVITY_DETAIL_LIMIT } from "./run-activity.js";
23
25
  import { createNoopLogger } from "../lib/console-logger.js";
@@ -28,6 +30,28 @@ import { bindSessionEmit } from "../provenance/seam.js";
28
30
  * inside {@link assembleMessages} (applied once to the new user input only).
29
31
  */
30
32
  export async function prepareChatTurn(deps, params) {
33
+ const opened = await openThread(deps, params);
34
+ if (opened.kind === "not_found")
35
+ return opened;
36
+ const { pool } = deps;
37
+ const { analysisId, threadId, userInput } = params;
38
+ const assembled = await assembleMessages({
39
+ threadId,
40
+ threadType: opened.threadType,
41
+ analysisId,
42
+ userInput,
43
+ ...(await readTurnContext(pool, analysisId)),
44
+ history: createThreadHistory(pool),
45
+ workingMemory: createWorkingMemory(pool),
46
+ logger: deps.logger,
47
+ });
48
+ return { kind: "ok", threadType: opened.threadType, ...assembled };
49
+ }
50
+ /**
51
+ * Open the thread of a turn: check that the analysis owns it, make it when it is absent, and seed its title. A
52
+ * thread that a different analysis owns is `not_found`.
53
+ */
54
+ export async function openThread(deps, params) {
31
55
  const { pool } = deps;
32
56
  const { analysisId, threadId, userInput } = params;
33
57
  const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
@@ -79,69 +103,30 @@ export async function prepareChatTurn(deps, params) {
79
103
  catch (err) {
80
104
  logger.warn("title-seed failed (non-fatal)", logger.errorFields(err));
81
105
  }
82
- const assembled = await assembleMessages({
83
- threadId,
84
- threadType,
85
- analysisId,
86
- userInput,
87
- ...(await readTurnContext(pool, analysisId)),
88
- history: createThreadHistory(pool),
89
- workingMemory: createWorkingMemory(pool),
90
- ...(deps.logger ? { logger: deps.logger } : {}),
91
- });
92
- return { kind: "ok", threadType, ...assembled };
106
+ return { kind: "ok", threadType };
93
107
  }
94
108
  /** The analysis context and the run activity of a turn. A failed read gives the fallback of its kind. */
95
- async function readTurnContext(pool, analysisId) {
109
+ export async function readTurnContext(pool, analysisId) {
96
110
  const analysisState = await loadAnalysisStatus(pool, analysisId).unwrapOr(null);
97
111
  const runActivityContext = await queryNonTerminalRunsByAnalysis(pool, analysisId, RUN_ACTIVITY_DETAIL_LIMIT).match((activity) => renderRunActivity(activity), () => renderRunActivityUnavailable());
98
112
  return { analysisContext: analysisState?.context ?? null, runActivityContext };
99
113
  }
100
114
  /**
101
- * Open one chat turn: prepare it and resolve its agent. A refusal comes back before any row of the
102
- * turn exists, thus a host can answer it before it starts a stream.
103
- */
104
- export async function openChatTurn(deps, params) {
105
- const openedAtMs = Date.now();
106
- let prepared;
107
- try {
108
- prepared = await prepareChatTurn(deps, params);
109
- }
110
- catch (cause) {
111
- return { kind: "prepare_failed", cause };
112
- }
113
- if (prepared.kind === "not_found")
114
- return prepared;
115
- const agent = deps.agents.forThread(prepared.threadType);
116
- if (agent.isErr())
117
- return { kind: "agent_unresolved", threadType: prepared.threadType };
118
- const ready = prepared;
119
- return {
120
- kind: "ready",
121
- agent: agent.value,
122
- run: (run) => runOpenTurn(deps, params, ready, agent.value, { ...run, startedAtMs: run.startedAtMs ?? openedAtMs }),
123
- };
124
- }
125
- /**
126
- * Run one chat turn: open it, store its opening, run the root loop with a round sink that stores
127
- * each round, and close the turn with its outcome.
115
+ * Run a prepared turn: store its opening, run the root loop with a round sink that stores each round, and close the
116
+ * turn with its outcome.
128
117
  */
129
- export async function runChatTurn(deps, params) {
130
- const { analysisId, threadId, userInput, ...run } = params;
131
- const opened = await openChatTurn(deps, { analysisId, threadId, userInput });
132
- if (opened.kind !== "ready")
133
- return opened;
134
- return opened.run(run);
135
- }
136
- async function runOpenTurn(deps, turn, prepared, agent, params) {
118
+ export async function runOpenTurn(deps, turn, prepared, agent, params, transport) {
137
119
  const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
138
120
  const session = { ...params.session, provenance: { agentId: agent.id, callPath: [agent.id] } };
139
121
  const history = createThreadHistory(deps.pool, deps.logger);
140
- const recorder = createConversationDisplayRecorder({
141
- userText: userTextOf(prepared.userMessage),
142
- agentId: agent.id,
143
- sink: params.emit,
144
- });
122
+ const { recorder } = transport;
123
+ let groupIndex = 0;
124
+ /** The group with its key in the turn, when the transport keys its writes. */
125
+ const keyed = (group) => {
126
+ const index = groupIndex;
127
+ groupIndex += 1;
128
+ return transport.groupKey === undefined ? group : { ...group, key: transport.groupKey(index) };
129
+ };
145
130
  // The groups that did not land yet, in the order of the turn. A failed write keeps them for the next write.
146
131
  let pending = [];
147
132
  let startSeq;
@@ -152,9 +137,11 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
152
137
  // A turn that ends before its user message was sent has no rows to close.
153
138
  if (!opened() || (pending.length === 0 && close === undefined))
154
139
  return;
155
- const closing = close === undefined ? {} : { close };
156
- const write = startSeq === undefined ? { opening: pending[0], rounds: pending.slice(1), ...closing } : { startSeq, rounds: pending, ...closing };
157
- (await history.writeTurn(turn.threadId, write)).match((written) => {
140
+ const closing = close === undefined ? {} : { close: close.note === undefined ? close : { ...close, note: keyed(close.note) } };
141
+ const write = startSeq === undefined
142
+ ? { opening: presentFirst(pending, "the pending turn"), rounds: pending.slice(1), ...closing }
143
+ : { startSeq, rounds: pending, ...closing };
144
+ (await transport.durably("chat-turn.write", async () => await history.writeTurn(turn.threadId, write))).match((written) => {
158
145
  pending = [];
159
146
  startSeq = written.startSeq;
160
147
  storeError = undefined;
@@ -167,7 +154,8 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
167
154
  if (!opened() && round.messages[0] !== prepared.userMessage) {
168
155
  // A turn-start compaction comes before the user message, thus its rows land before the turn opens. A later
169
156
  // write cannot keep that order, thus a failed write is not tried again, and the next turn compacts again.
170
- const appended = await history.appendTurn(turn.threadId, { modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) });
157
+ const group = keyed({ modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) });
158
+ const appended = await transport.durably("chat-turn.compaction-write", async () => await history.appendTurn(turn.threadId, group));
171
159
  if (appended.isErr()) {
172
160
  logger.warn("chat turn compaction write failed", {
173
161
  threadId: turn.threadId,
@@ -178,28 +166,34 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
178
166
  return;
179
167
  }
180
168
  const author = params.author === undefined ? {} : { author: params.author };
181
- pending.push(opened()
169
+ const assistantBefore = recorder.assistantMessageId();
170
+ pending.push(keyed(opened()
182
171
  ? { modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) }
183
- : { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author });
172
+ : { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author }));
184
173
  await flush();
174
+ if (recorder.assistantMessageId() !== assistantBefore)
175
+ await transport.announce?.(recorder.assistantMessageId());
185
176
  };
186
- const { ask } = params;
187
- const compaction = compactionPolicy(deps, turn.analysisId, params, prepared.threadType, agent, recorder.emit);
177
+ const compaction = compactionPolicy(deps, turn.analysisId, prepared.threadType, agent);
188
178
  let outcome;
189
179
  let fallbackText;
190
180
  try {
191
- const run = await runAgent(agent, prepared.history, session, {
192
- provider: params.chat(recorder.emit),
193
- signal: params.signal,
194
- emit: recorder.emit,
195
- runStep: passthroughStep,
196
- usageRecorder: params.usageRecorder,
181
+ const run = await runLoop(agent, prepared.history, session, {
182
+ provider: deps.provider,
183
+ signal: transport.signal,
184
+ emit: transport.emit,
185
+ onText: transport.onText,
186
+ chatStream: transport.chatStream,
187
+ toolWriter: transport.toolWriter,
188
+ modelMiddleware: transport.modelMiddleware,
189
+ usageRecorder: deps.usageRecorder,
197
190
  toolOutputStore: createToolOutputStore(deps.pool),
198
191
  promptCache: params.promptCache ?? CONVERSATION_PROMPT_CACHE,
199
192
  turnInput: [prepared.userMessage, ...prepared.contextRecords],
200
- ...(compaction === undefined ? {} : { compaction }),
201
- ...(deps.logger === undefined ? {} : { logger: deps.logger }),
202
- ...(ask === undefined ? {} : { ask: (request) => ask(request, recorder.emit) }),
193
+ compaction,
194
+ logger: deps.logger,
195
+ approve: transport.approve,
196
+ pause: transport.pause,
203
197
  onRound: storeRound,
204
198
  });
205
199
  outcome = run.finish.reason === "aborted" ? { status: "aborted", finish: run.finish } : { status: "done", finish: run.finish };
@@ -208,63 +202,95 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
208
202
  fallbackText = finalText(run.messages.slice(prepared.history.length).filter((message) => compactionExchangeOf(message) === undefined));
209
203
  }
210
204
  catch (cause) {
205
+ // A canceled workflow writes nothing more: its recovery, or the stop of its host, closes the turn.
206
+ if (isWorkflowCancellation(cause))
207
+ throw cause;
211
208
  // A provider failure that races an abort stays a failure, thus both facts must hold.
212
- const aborted = params.signal.aborted && cause instanceof Error && cause.name === "AbortError";
213
- outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), cause };
209
+ const aborted = transport.signal.aborted && errorNameOf(cause) === "AbortError";
210
+ outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), code: failureCodeOf(cause), cause };
211
+ // A host gets the scrubbed text and the code of the failure. This record is the one place where the whole
212
+ // cause survives.
213
+ if (outcome.status === "failed")
214
+ logger.error("chat turn failed", { threadId: turn.threadId, code: outcome.code, ...logger.errorFields(cause) });
214
215
  }
215
216
  const durationMs = Date.now() - params.startedAtMs;
216
217
  const turnUsage = outcome.status === "failed" ? undefined : outcome.finish?.turnUsage;
217
218
  await flush({
218
219
  status: outcome.status,
219
- ...(outcome.status === "failed" ? { reason: outcome.reason, note: conversationRecordTurn(failureNote(outcome.reason)) } : {}),
220
- ...(outcome.status === "aborted" ? { note: interruptionNote() } : {}),
221
- ...(turnUsage === undefined ? {} : { turnUsage }),
220
+ reason: outcome.status === "failed" ? outcome.reason : undefined,
221
+ note: outcome.status === "failed" ? conversationRecordTurn(failureNote(outcome.reason)) : outcome.status === "aborted" ? interruptionNote() : undefined,
222
+ turnUsage,
222
223
  turnDurationMs: durationMs,
223
224
  });
225
+ const storeErrorField = storeError === undefined ? undefined : { storeError };
224
226
  return {
225
227
  kind: "ran",
226
228
  outcome,
227
229
  opened: startSeq !== undefined,
228
- ...(storeError === undefined ? {} : { storeError }),
229
230
  durationMs,
230
- ...(turnUsage === undefined ? {} : { turnUsage: { ...turnUsage } }),
231
- ...(fallbackText === undefined ? {} : { fallbackText }),
231
+ turnUsage: turnUsage === undefined ? undefined : { ...turnUsage },
232
+ fallbackText,
233
+ ...storeErrorField,
232
234
  };
233
235
  }
234
236
  /** The sanitized text of the user message, thus the display never holds a secret that the model does not see. */
235
- function userTextOf(message) {
237
+ export function userTextOf(message) {
236
238
  if (typeof message.content === "string")
237
239
  return message.content;
238
240
  return message.content.map((part) => (part.type === "text" ? part.text : "")).join("");
239
241
  }
240
242
  const WORKING_MEMORY_TOOL_ID = "update_working_memory";
241
- function compactionPolicy(deps, analysisId, params, threadType, agent, emit) {
243
+ function compactionPolicy(deps, analysisId, threadType, agent) {
242
244
  if (agent.compaction === undefined)
243
245
  return undefined;
244
246
  // A report thread reads a frozen copy of the working memory, thus its agent declares no memory tool.
245
247
  const remembers = agent.tools.some((tool) => tool.id === WORKING_MEMORY_TOOL_ID);
246
248
  const workingMemory = createWorkingMemory(deps.pool);
247
249
  return {
248
- ...agent.compaction,
249
- // A streaming provider sends each text delta with no source, thus a delta of the summary would show as a reply.
250
- provider: params.chat((event) => (event.type === "text-delta" ? undefined : emit(event))),
250
+ // The capabilities are read for each turn, because a host can switch the model of the conversation between turns.
251
+ ...rulesForContextWindow(agent.compaction, deps.provider.capabilities.contextWindow),
251
252
  request: remembers ? MEMORY_COMPACTION_REQUEST : SUMMARY_COMPACTION_REQUEST,
252
253
  mask: remembers ? { allow: [WORKING_MEMORY_TOOL_ID] } : "none",
253
254
  keepFirstTurn: threadType === "report",
254
255
  recordsAfter: async (view) => contextRecordsFor({ threadType, analysisId, workingMemory, ...(await readTurnContext(deps.pool, analysisId)) }, view),
255
256
  };
256
257
  }
258
+ /**
259
+ * The machine code of a failure, which the end frame of a turn carries for a host. A turn workflow pauses on a
260
+ * suspend error, a refused or missing credential, and an outage, thus their codes come only from a turn with no
261
+ * workflow: the suspend reason of the host, `credential`, or `outage`. Each other provider error gives `provider`,
262
+ * and each other error gives `internal`.
263
+ */
264
+ function failureCodeOf(err) {
265
+ if (isTurnCredentialMissing(err))
266
+ return "credential";
267
+ const failure = modelFailureOf(err);
268
+ switch (failure.kind) {
269
+ case "billing":
270
+ return failure.reason;
271
+ case "credential":
272
+ return "credential";
273
+ case "outage":
274
+ return "outage";
275
+ case "other":
276
+ return findProviderError(err) === undefined ? "internal" : "provider";
277
+ }
278
+ }
257
279
  /** The reason of a failed turn. It never holds the error message, because each later turn sends the note to the vendor. */
258
280
  function failureReasonOf(err) {
259
- const suspension = suspensionOfFailure(err);
260
- if (suspension !== undefined)
261
- return suspension.reason;
262
- const providerError = findProviderError(err);
263
- if (providerError?.type === "auth")
264
- return "The model endpoint refused the credential.";
265
- if (providerError !== undefined)
266
- return "The model request failed.";
267
- return "The turn stopped on an internal error.";
281
+ if (isTurnCredentialMissing(err))
282
+ return "The turn has no credential of its user.";
283
+ const failure = modelFailureOf(err);
284
+ switch (failure.kind) {
285
+ case "billing":
286
+ return failure.reason;
287
+ case "credential":
288
+ return "The model endpoint refused the credential.";
289
+ case "outage":
290
+ return "The model request failed.";
291
+ case "other":
292
+ return findProviderError(err) === undefined ? "The turn stopped on an internal error." : "The model request failed.";
293
+ }
268
294
  }
269
295
  /**
270
296
  * The note of an aborted turn. Without it, the next turn reads the request of the aborted turn as open, and
@@ -38,6 +38,8 @@
38
38
  * form resolves to the same file in every frame, including the conversation agent's, so
39
39
  * the projection is unconditional.
40
40
  */
41
+ import { presentFirst } from "../lib/present.js";
42
+ import { collapseWhitespace } from "../lib/text.js";
41
43
  import { toAnalysisRootPath } from "../workspace/paths.js";
42
44
  import { profileCaveats, profileDimensions, profileFileRecords, profileGroups } from "./data-profile-view.js";
43
45
  /**
@@ -99,11 +101,11 @@ function clamp(text, max) {
99
101
  * keeps one record on one line.
100
102
  */
101
103
  function clip(text, max) {
102
- return clamp(text.replace(/\s+/g, " ").trim(), max);
104
+ return clamp(collapseWhitespace(text), max);
103
105
  }
104
106
  /** Non-empty, whitespace-collapsed value, or `undefined` — nulls and blanks read the same. */
105
107
  function present(value) {
106
- const flat = value?.replace(/\s+/g, " ").trim();
108
+ const flat = value === null || value === undefined ? undefined : collapseWhitespace(value);
107
109
  return flat ? flat : undefined;
108
110
  }
109
111
  /** `Homo sapiens (taxon 9606)`, plus a confidence marker when the profiler was unsure. */
@@ -128,9 +130,9 @@ function identityLine(result) {
128
130
  const identity = [
129
131
  [present(result.domain), present(result.subtype)].filter((f) => f !== undefined).join(" / ") || undefined,
130
132
  formatOrganism(result.organism),
131
- present(result.tissue) ? `tissue: ${present(result.tissue)}` : undefined,
132
- present(result.cellType) ? `cells: ${present(result.cellType)}` : undefined,
133
- present(result.condition) ? `condition: ${present(result.condition)}` : undefined,
133
+ present(result.tissue) ? `tissue: ${String(present(result.tissue))}` : undefined,
134
+ present(result.cellType) ? `cells: ${String(present(result.cellType))}` : undefined,
135
+ present(result.condition) ? `condition: ${String(present(result.condition))}` : undefined,
134
136
  ].filter((f) => f !== undefined);
135
137
  return `Dataset: ${identity.length > 0 ? identity.join(" — ") : clip(result.summary, MAX_IDENTITY_CHARS)}`;
136
138
  }
@@ -175,7 +177,7 @@ function formatCensus(view, group) {
175
177
  if (formats.length === 0)
176
178
  return present(view.format);
177
179
  if (formats.length === 1)
178
- return present(formats[0].format);
180
+ return present(presentFirst(formats, "the single group format").format);
179
181
  const shown = formats.slice(0, MAX_GROUP_FORMATS).map((entry) => `${entry.format} ${entry.count}`);
180
182
  return `${shown.join(", ")}${formats.length > shown.length ? `, +${formats.length - shown.length}` : ""}`;
181
183
  }
@@ -278,7 +280,7 @@ function caveatsSection(caveats, budget) {
278
280
  return line;
279
281
  }
280
282
  const room = budget - render([""]).length;
281
- return room >= MIN_PROSE_CHARS ? render([clamp(capped[0], room)]) : undefined;
283
+ return room >= MIN_PROSE_CHARS ? render([clamp(presentFirst(capped, "the shortened caveat"), room)]) : undefined;
282
284
  }
283
285
  /**
284
286
  * Fit the body sections into `budget`, in order, each one whole or absent.
@@ -380,7 +382,7 @@ export function buildDataProfileOrientation(result, analysisId, maxChars = DATA_
380
382
  // what remains, so the one line saying how much of the dataset is accounted for
381
383
  // cannot be the line the body's budget drops.
382
384
  const identityBudget = Math.max(0, Math.min(MAX_IDENTITY_CHARS, maxChars - (census ? census.length + 1 : 0)));
383
- const header = [clamp(identityLine(result), identityBudget), census].filter((line) => Boolean(line)).join("\n");
385
+ const header = [clamp(identityLine(result), identityBudget), census].flatMap((line) => (line ? [line] : [])).join("\n");
384
386
  const headerText = clamp(header, maxChars);
385
387
  const bodyBudget = maxChars - headerText.length - 1;
386
388
  if (bodyBudget <= 0)
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import type { DataProfileDimension, DataProfileFile, DataProfileResult } from "../contracts/data-profile.js";
15
15
  /** A group as consumers read it, whether it was authored as a group or as a kind. */
16
- export interface ProfileGroupView {
16
+ export type ProfileGroupView = {
17
17
  readonly id: string;
18
18
  readonly name: string;
19
19
  readonly memberRepresents: string;
@@ -26,18 +26,18 @@ export interface ProfileGroupView {
26
26
  /** The scanner slots this group carries, on a groups-era row. */
27
27
  readonly slotIds?: readonly string[];
28
28
  readonly unclassified?: boolean;
29
- }
29
+ };
30
30
  /**
31
31
  * A dimension as consumers read it. `cardinalities` carries every number the
32
32
  * observations reported, side by side: there is no canonical count, and a single field
33
33
  * would be a silent judgement between disagreeing sources.
34
34
  */
35
- export interface ProfileDimensionView {
35
+ export type ProfileDimensionView = {
36
36
  readonly label: string;
37
37
  readonly cardinalities: readonly number[];
38
38
  readonly exampleValues: readonly string[];
39
39
  readonly description?: string;
40
- }
40
+ };
41
41
  /**
42
42
  * Every number the observations reported, side by side and de-duplicated.
43
43
  *
@@ -11,6 +11,7 @@
11
11
  * older consumers already handled. Nothing it drops is unavailable — the full record is
12
12
  * on the row, and consumers that want the resolved structure read it directly.
13
13
  */
14
+ import { presentFirst } from "../lib/present.js";
14
15
  /**
15
16
  * Every number the observations reported, side by side and de-duplicated.
16
17
  *
@@ -40,7 +41,7 @@ function examplesOf(dimension) {
40
41
  return [];
41
42
  }
42
43
  function fromGroup(group) {
43
- const format = group.formats.length === 1 ? group.formats[0].format : undefined;
44
+ const format = group.formats.length === 1 ? presentFirst(group.formats, "the single group format").format : undefined;
44
45
  return {
45
46
  id: group.id,
46
47
  name: group.name,
@@ -48,9 +49,9 @@ function fromGroup(group) {
48
49
  description: group.description,
49
50
  count: group.count,
50
51
  pattern: group.displayPattern,
51
- ...(format ? { format } : {}),
52
- ...(group.slots ? { slotIds: group.slots.map((slot) => slot.id) } : {}),
53
- ...(group.unclassified ? { unclassified: true } : {}),
52
+ format: format ? format : undefined,
53
+ slotIds: group.slots?.map((slot) => slot.id),
54
+ unclassified: group.unclassified ? true : undefined,
54
55
  };
55
56
  }
56
57
  /** The dataset's structure, from whichever field the snapshot carries it in. */
@@ -64,7 +65,7 @@ export function profileGroups(result) {
64
65
  description: kind.description,
65
66
  count: kind.count,
66
67
  pattern: kind.pathPattern,
67
- ...(kind.format ? { format: kind.format } : {}),
68
+ format: kind.format ? kind.format : undefined,
68
69
  }));
69
70
  }
70
71
  /** What varies across the dataset, from whichever field the snapshot carries it in. */
@@ -74,14 +75,14 @@ export function profileDimensions(result) {
74
75
  label: dimension.label,
75
76
  cardinalities: dimensionCardinalities(dimension),
76
77
  exampleValues: examplesOf(dimension),
77
- ...(dimension.description ? { description: dimension.description } : {}),
78
+ description: dimension.description ? dimension.description : undefined,
78
79
  }));
79
80
  }
80
81
  return (result.axes ?? []).map((axis) => ({
81
82
  label: axis.label,
82
83
  cardinalities: [axis.cardinality],
83
84
  exampleValues: axis.exampleValues ?? [],
84
- ...(axis.description ? { description: axis.description } : {}),
85
+ description: axis.description ? axis.description : undefined,
85
86
  }));
86
87
  }
87
88
  /**
@@ -96,7 +97,7 @@ export function profileFileRecords(result) {
96
97
  return result.groups.flatMap((group) => (group.memberAnnotations ?? []).map((annotation) => ({
97
98
  path: annotation.path,
98
99
  description: annotation.note,
99
- ...(group.formats.length === 1 ? { format: group.formats[0].format } : {}),
100
+ format: group.formats.length === 1 ? presentFirst(group.formats, "the single group format").format : undefined,
100
101
  })));
101
102
  }
102
103
  return result.files ?? [];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A chat turn in the process of a test, with no workflow. The turn of `chat-turn.ts` runs over a transport that
3
+ * streams to an emit sink and runs each write directly, thus a test drives the storage and the loop of a turn with
4
+ * no DBOS engine. A host reaches a turn through the turn workflow only, and `inProcessChatTurns` gives the test of
5
+ * a host the same surface over this turn.
6
+ */
7
+ import { type ChatTurns } from "./chat-turn-workflow.js";
8
+ import type { LoopOptions } from "../loop/run-loop.js";
9
+ import type { EmitFn } from "../loop/types.js";
10
+ import type { PromptCachePolicy } from "../providers/types.js";
11
+ import type { AgentDefinition } from "../loop/types.js";
12
+ import { type ChatTurnRan, type ChatTurnRefusal, type ChatTurnSession, type OpenChatTurnParams, type RunChatTurnDeps } from "./chat-turn.js";
13
+ /** The transport values of a turn in process. */
14
+ export type InProcessRunParams = {
15
+ readonly session: ChatTurnSession;
16
+ readonly emit: EmitFn;
17
+ readonly signal: AbortSignal;
18
+ readonly author?: string;
19
+ /** Absent counts from the open. */
20
+ readonly startedAtMs?: number;
21
+ readonly promptCache?: PromptCachePolicy;
22
+ /** The decision of the user on a call that asks for approval. Absent: the loop denies the call. */
23
+ readonly approve?: LoopOptions["approve"];
24
+ };
25
+ export type InProcessTurnParams = OpenChatTurnParams & InProcessRunParams;
26
+ export type InProcessTurnResult = ChatTurnRefusal | ChatTurnRan;
27
+ /** A prepared turn with its agent. Call `run` one time: each call stores a new opening of the same user message. */
28
+ export type InProcessOpenTurn = {
29
+ readonly kind: "ready";
30
+ readonly agent: AgentDefinition;
31
+ readonly run: (params: InProcessRunParams) => Promise<ChatTurnRan>;
32
+ };
33
+ /** Prepare a turn and resolve its agent. A refusal comes back before any row of the turn exists. */
34
+ export declare function openInProcessTurn(deps: RunChatTurnDeps, params: OpenChatTurnParams): Promise<InProcessOpenTurn | ChatTurnRefusal>;
35
+ /** Open a turn in process and run it. */
36
+ export declare function runInProcessTurn(deps: RunChatTurnDeps, params: InProcessTurnParams): Promise<InProcessTurnResult>;
37
+ /**
38
+ * The chat turns of a host test, over the turn in process: `open` starts the turn at once, `read` gives its frames
39
+ * with the end frame of a turn workflow, `stop` aborts it, and `outcome` gives its end. An ask has no answer here,
40
+ * thus a call that asks for an approval is denied.
41
+ */
42
+ export declare function inProcessChatTurns(deps: RunChatTurnDeps): ChatTurns;