@inflexa-ai/harness 0.45.1 → 0.46.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +306 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +32 -7
  174. package/dist/lib/hooks.js +22 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +160 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +39 -0
  256. package/dist/loop/turn-credentials.js +90 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -13,19 +13,21 @@
13
13
  * reference. Expected outcomes are data variants — never throws on a missing
14
14
  * skill, an undeclared skill, or no matches.
15
15
  */
16
- export interface SkillToolsDeps {
16
+ import { z } from "zod";
17
+ import { type Tool } from "../define-tool.js";
18
+ export type SkillToolsDeps = {
17
19
  /** Absolute path to the skills tree (one subdirectory per skill). */
18
20
  readonly skillsDir: string;
19
21
  /** The agent's declared skills (`meta.skills`) — the access allowlist. */
20
22
  readonly skills: readonly string[];
21
- }
22
- interface SkillMatch {
23
+ };
24
+ type SkillMatch = {
23
25
  readonly skill: string;
24
26
  readonly path: string;
25
27
  readonly line: number;
26
28
  readonly snippet: string;
27
29
  readonly score: number;
28
- }
30
+ };
29
31
  type SkillSearchOutput = {
30
32
  status: "no_skills";
31
33
  } | {
@@ -59,14 +61,16 @@ type SkillReadOutput = {
59
61
  path: string;
60
62
  content: string;
61
63
  };
64
+ declare const SkillSearchInputSchema: z.ZodObject<{
65
+ query: z.ZodString;
66
+ topK: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>;
68
+ declare const SkillReadInputSchema: z.ZodObject<{
69
+ skill: z.ZodString;
70
+ path: z.ZodString;
71
+ }, z.core.$strip>;
62
72
  export declare function createSkillTools(deps: SkillToolsDeps): {
63
- skillSearch: import("../define-tool.js").Tool<{
64
- query: string;
65
- topK?: number | undefined;
66
- }, SkillSearchOutput>;
67
- skillRead: import("../define-tool.js").Tool<{
68
- skill: string;
69
- path: string;
70
- }, SkillReadOutput>;
73
+ skillSearch: Tool<z.infer<typeof SkillSearchInputSchema>, SkillSearchOutput>;
74
+ skillRead: Tool<z.infer<typeof SkillReadInputSchema>, SkillReadOutput>;
71
75
  };
72
76
  export {};
@@ -18,12 +18,14 @@ import { join, relative, resolve, sep } from "node:path";
18
18
  import { ok } from "neverthrow";
19
19
  import { z } from "zod";
20
20
  import { defineTool } from "../define-tool.js";
21
+ import { collapseWhitespace, splitLines } from "../../lib/text.js";
21
22
  /** Bounds — keep a search over a deep skill tree cheap and context-safe. */
22
23
  const MAX_FILE_BYTES = 512 * 1024;
23
24
  const MAX_SNIPPET = 240;
24
25
  const DEFAULT_TOP_K = 10;
25
26
  const MAX_TOP_K = 25;
26
- const TEXT_EXT = /\.(md|markdown|txt|py|r|R|json|ya?ml|csv|tsv)$/;
27
+ /** The file-name extensions a skill may carry text in. */
28
+ const TEXT_EXTENSIONS = [".md", ".markdown", ".txt", ".py", ".r", ".R", ".json", ".yaml", ".yml", ".csv", ".tsv"];
27
29
  async function collectTextFiles(dir, acc) {
28
30
  let entries;
29
31
  try {
@@ -37,11 +39,19 @@ async function collectTextFiles(dir, acc) {
37
39
  if (e.isDirectory()) {
38
40
  await collectTextFiles(full, acc);
39
41
  }
40
- else if (TEXT_EXT.test(e.name)) {
42
+ else if (TEXT_EXTENSIONS.some((extension) => e.name.endsWith(extension))) {
41
43
  acc.push(full);
42
44
  }
43
45
  }
44
46
  }
47
+ const SkillSearchInputSchema = z.object({
48
+ query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
49
+ topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
50
+ });
51
+ const SkillReadInputSchema = z.object({
52
+ skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
53
+ path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
54
+ });
45
55
  export function createSkillTools(deps) {
46
56
  const allowed = new Set(deps.skills);
47
57
  const skillSearch = defineTool({
@@ -52,16 +62,13 @@ export function createSkillTools(deps) {
52
62
  "case-insensitive substring. Returns one entry per matching skill file — its skill, its path, " +
53
63
  "and the first line that holds a query word — ranked by how many distinct query words the file " +
54
64
  "holds. Then `skill_read` the file. No matches returns a data variant.",
55
- inputSchema: z.object({
56
- query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
57
- topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
58
- }),
65
+ inputSchema: SkillSearchInputSchema,
59
66
  describeCall: "none",
60
67
  execute: async ({ query, topK }) => {
61
68
  if (allowed.size === 0) {
62
69
  return ok({ status: "no_skills" });
63
70
  }
64
- const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
71
+ const tokens = collapseWhitespace(query.toLowerCase()).split(" ").filter(Boolean);
65
72
  const matches = [];
66
73
  for (const skill of allowed) {
67
74
  const skillRoot = resolve(deps.skillsDir, skill);
@@ -82,7 +89,7 @@ export function createSkillTools(deps) {
82
89
  const distinct = tokens.filter((t) => lower.includes(t)).length;
83
90
  if (distinct === 0)
84
91
  continue;
85
- const lines = content.split(/\r?\n/);
92
+ const lines = splitLines(content);
86
93
  const hitIdx = lines.findIndex((l) => {
87
94
  const ll = l.toLowerCase();
88
95
  return tokens.some((t) => ll.includes(t));
@@ -113,10 +120,7 @@ export function createSkillTools(deps) {
113
120
  description: "Read a file from one of your skills (e.g. its SKILL.md or a reference " +
114
121
  "found via skill_search). Confined to your declared skills. Undeclared " +
115
122
  "skills and missing paths return a data variant.",
116
- inputSchema: z.object({
117
- skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
118
- path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
119
- }),
123
+ inputSchema: SkillReadInputSchema,
120
124
  describeCall: "none",
121
125
  execute: async ({ skill, path }) => {
122
126
  if (!allowed.has(skill)) {
@@ -10,21 +10,24 @@
10
10
  * index, so a dropped, reordered, or extra entry can never attach a
11
11
  * description to the wrong file.
12
12
  */
13
- import { type SubmittedFileDescription } from "../../schemas/file-metadata.js";
14
13
  import { type Tool } from "../define-tool.js";
15
14
  export declare const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
16
15
  /**
17
- * The per-step cell of the file-metadata continuation. The step body makes it
18
- * beside the blocker cell, and the agent factory binds the output tool to it.
16
+ * The per-step cell of the file-metadata follow-up request. The step body makes
17
+ * it beside the step agent, and the agent factory binds the output tool to it.
18
+ * The descriptions themselves live in the inputs of the calls: the post-step
19
+ * code reads them from the recorded calls.
19
20
  */
20
- export interface FileMetadataCell {
21
- /** The paths that the continuation describes, or `null` before the first `expect`. */
21
+ export type FileMetadataCell = {
22
+ /** The paths that the follow-up request describes, or `null` before the first `expect`. */
22
23
  readonly knownPaths: ReadonlySet<string> | null;
23
- /** The accepted description of each described path, keyed by the path. The tool writes only a known path. */
24
- readonly descriptions: Map<string, SubmittedFileDescription>;
25
- /** Arm the cell for one continuation: set the known paths, and drop each accepted description. */
24
+ /** The known paths that the earlier calls described. The loop folds each call record into it. */
25
+ readonly described: ReadonlySet<string>;
26
+ /** Arm the cell for one follow-up request: set the known paths, and forget each described path. */
26
27
  expect(paths: readonly string[]): void;
27
- }
28
+ /** Add the paths of one call record. */
29
+ fold(paths: readonly string[]): void;
30
+ };
28
31
  export declare function createFileMetadataCell(): FileMetadataCell;
29
32
  /** Build the `submit_file_metadata` tool bound to the cell of one step. */
30
33
  export declare function createSubmitFileMetadataTool(cell: FileMetadataCell): Tool;
@@ -12,19 +12,23 @@
12
12
  */
13
13
  import { err, ok } from "neverthrow";
14
14
  import { SubmitFileMetadataInputSchema } from "../../schemas/file-metadata.js";
15
- import { defineTool } from "../define-tool.js";
15
+ import { defineTool, withToolCallRecord } from "../define-tool.js";
16
16
  export const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
17
17
  export function createFileMetadataCell() {
18
18
  let knownPaths = null;
19
- const descriptions = new Map();
19
+ const described = new Set();
20
20
  return {
21
21
  get knownPaths() {
22
22
  return knownPaths;
23
23
  },
24
- descriptions,
24
+ described,
25
25
  expect(paths) {
26
26
  knownPaths = new Set(paths);
27
- descriptions.clear();
27
+ described.clear();
28
+ },
29
+ fold(paths) {
30
+ for (const path of paths)
31
+ described.add(path);
28
32
  },
29
33
  };
30
34
  }
@@ -40,28 +44,21 @@ export function createSubmitFileMetadataTool(cell) {
40
44
  "the unknownPaths and describe the remaining files.",
41
45
  inputSchema: SubmitFileMetadataInputSchema,
42
46
  describeCall: "none",
43
- execute: async (input) => {
47
+ execute: (input) => {
44
48
  const knownPaths = cell.knownPaths;
45
49
  if (knownPaths === null) {
46
- return err({
50
+ return Promise.resolve(err({
47
51
  error: "No list of files is known yet. The harness asks for the file metadata after the task, with the list of the files.",
48
52
  retryable: false,
49
- });
50
- }
51
- const unknownPaths = [];
52
- for (const entry of input.files) {
53
- if (!knownPaths.has(entry.path)) {
54
- unknownPaths.push(entry.path);
55
- continue;
56
- }
57
- cell.descriptions.set(entry.path, entry);
53
+ }));
58
54
  }
59
- const remaining = [...knownPaths].filter((path) => !cell.descriptions.has(path));
60
- return ok({
61
- accepted: unknownPaths.length === 0 && remaining.length === 0,
62
- unknownPaths,
63
- remaining,
64
- });
55
+ const unknownPaths = input.files.map((entry) => entry.path).filter((path) => !knownPaths.has(path));
56
+ const described = input.files.map((entry) => entry.path).filter((path) => knownPaths.has(path));
57
+ const covered = new Set([...cell.described, ...described]);
58
+ const remaining = [...knownPaths].filter((path) => !covered.has(path));
59
+ const outcome = { accepted: unknownPaths.length === 0 && remaining.length === 0, unknownPaths, remaining };
60
+ return Promise.resolve(ok(withToolCallRecord(outcome, { described })));
65
61
  },
62
+ foldCallRecord: (record) => cell.fold(record.described),
66
63
  });
67
64
  }
@@ -12,17 +12,23 @@
12
12
  * past the anchor of the newest report child, the tool starts nothing and it
13
13
  * names that child. The spawn runs last.
14
14
  *
15
+ * Inside a durable step, the child id is the UUIDv5 of the key of the step. A
16
+ * rerun of the call after the spawn, before the checkpoint of the step, finds
17
+ * that child. It skips the advice, and it gives the same session and the same
18
+ * part.
19
+ *
15
20
  * Each degraded condition is a typed outcome in the ok channel: a scope with no
16
21
  * thread id, a composition with no eyes, the advice, each refusal of the spawn,
17
22
  * and a store fault. The tool never throws for one of them.
18
23
  */
19
- import type { Pool } from "pg";
24
+ import type { Querier } from "../state/db.js";
20
25
  import { z } from "zod";
21
26
  import type { EnsureSessionStateResult } from "../app/report-session-runtime.js";
22
27
  import type { ChromeConfig } from "../lib/chrome.js";
28
+ import { type Connectable } from "../lib/db-result.js";
23
29
  import type { AcquireEyes } from "../lib/eyes.js";
24
30
  import type { Logger } from "../lib/logger.js";
25
- import type { ThreadType } from "../memory/thread-store.js";
31
+ import { type ThreadType } from "../memory/thread-store.js";
26
32
  import { type Tool } from "./define-tool.js";
27
33
  import type { ProvenanceSeam } from "../provenance/seam.js";
28
34
  /**
@@ -85,8 +91,8 @@ export type StartReportSessionResult = {
85
91
  * a page. A composition that binds a capture seam straight to the spawn still
86
92
  * opens the gate of that spawn.
87
93
  */
88
- export interface StartReportSessionToolDeps {
89
- readonly pool: Pool;
94
+ export type StartReportSessionToolDeps = {
95
+ readonly pool: Querier & Connectable;
90
96
  readonly chrome: ChromeConfig;
91
97
  /**
92
98
  * The eyes seam of the composition. A bound seam gives a browser for one
@@ -107,7 +113,9 @@ export interface StartReportSessionToolDeps {
107
113
  */
108
114
  readonly provenance?: ProvenanceSeam;
109
115
  readonly logger?: Logger;
110
- }
116
+ /** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
117
+ readonly stepKey?: () => string | undefined;
118
+ };
111
119
  /**
112
120
  * Make the tool that starts a report session, over one Postgres pool and the
113
121
  * eyes of the composition.
@@ -12,6 +12,11 @@
12
12
  * past the anchor of the newest report child, the tool starts nothing and it
13
13
  * names that child. The spawn runs last.
14
14
  *
15
+ * Inside a durable step, the child id is the UUIDv5 of the key of the step. A
16
+ * rerun of the call after the spawn, before the checkpoint of the step, finds
17
+ * that child. It skips the advice, and it gives the same session and the same
18
+ * part.
19
+ *
15
20
  * Each degraded condition is a typed outcome in the ok channel: a scope with no
16
21
  * thread id, a composition with no eyes, the advice, each refusal of the spawn,
17
22
  * and a store fault. The tool never throws for one of them.
@@ -21,7 +26,9 @@ import { z } from "zod";
21
26
  import { compositionHasEyes, createReportSessionSpawn } from "../app/spawn-report-session.js";
22
27
  import { createNoopLogger } from "../lib/console-logger.js";
23
28
  import { describeDbError } from "../lib/db-result.js";
29
+ import { createThreadStore } from "../memory/thread-store.js";
24
30
  import { defineTool } from "./define-tool.js";
31
+ import { durableStepKey, stepUuid } from "./workspace/edit-file.js";
25
32
  /**
26
33
  * The character bound of each brief field. The whole brief lands in one durable
27
34
  * message row, thus the schema holds no unbounded string out of the store.
@@ -107,12 +114,14 @@ export function createStartReportSessionTool(deps) {
107
114
  const spawnDeps = {
108
115
  pool: deps.pool,
109
116
  chrome: deps.chrome,
110
- ...(deps.eyes ? { eyes: deps.eyes } : {}),
111
- ...(deps.anchorSession ? { anchorSession: deps.anchorSession } : {}),
112
- ...(deps.provenance ? { provenance: deps.provenance } : {}),
113
- ...(deps.logger ? { logger: deps.logger } : {}),
117
+ eyes: deps.eyes,
118
+ anchorSession: deps.anchorSession,
119
+ provenance: deps.provenance,
120
+ logger: deps.logger,
114
121
  };
115
122
  const spawn = createReportSessionSpawn(spawnDeps);
123
+ const threads = createThreadStore(deps.pool);
124
+ const stepKey = deps.stepKey ?? durableStepKey;
116
125
  // The gate reads the routes of the very spawn below, thus the two answers
117
126
  // come from one value. The routes are fixed at construction, thus the gate
118
127
  // reads one boolean and never a live probe of the sidecar.
@@ -132,7 +141,6 @@ export function createStartReportSessionTool(deps) {
132
141
  "`no_browser` means that this deployment has no browser for the report agent, thus no report session can start; tell the user. " +
133
142
  "`refused`, `parent_not_found`, `parent_not_a_conversation`, and `failed` mean that nothing started, and `detail` gives the reason where there is one.",
134
143
  inputSchema: startReportSessionInput,
135
- executionMode: "inline",
136
144
  describeCall: "none",
137
145
  execute: async (input, ctx) => {
138
146
  const brief = {
@@ -143,16 +151,35 @@ export function createStartReportSessionTool(deps) {
143
151
  openQuestions: input.openQuestions,
144
152
  };
145
153
  const { scope } = ctx.session;
146
- if (scope.kind !== "analysis" || scope.threadId === undefined || scope.threadId.length === 0) {
154
+ if (scope.threadId === undefined || scope.threadId.length === 0) {
147
155
  return ok({ outcome: "refused", detail: NO_THREAD_SCOPE_DETAIL });
148
156
  }
149
157
  const parentThreadId = scope.threadId;
158
+ // Inside a durable step the child id comes from the step, thus a rerun of
159
+ // the call finds the child of its first run. The advice would name that
160
+ // child as an existing session, thus a found child skips the advice, and
161
+ // the spawn gives the child back with no second write.
162
+ const key = stepKey();
163
+ const childThreadId = key === undefined ? undefined : stepUuid(key);
164
+ let rerun = false;
165
+ if (childThreadId !== undefined) {
166
+ const earlier = await threads.getThread(childThreadId);
167
+ if (earlier.isErr()) {
168
+ logger.warn("the child of an earlier run did not read", {
169
+ parentThreadId,
170
+ reason: earlier.error.type,
171
+ ...logger.errorFields(earlier.error.cause),
172
+ });
173
+ return ok(toOutcome(earlier.error));
174
+ }
175
+ rerun = earlier.value !== null;
176
+ }
150
177
  // The eyes gate has priority over the advice, and the advice costs two
151
178
  // reads. The spawn holds the same gate before each read of its own,
152
179
  // thus a blind composition reaches the `no_browser` refusal of the
153
180
  // spawn with no read and no write. As a result the tool copies no
154
181
  // detail line of the spawn.
155
- if (eyesAvailable) {
182
+ if (eyesAvailable && !rerun) {
156
183
  const delta = await spawn.reportSessionDelta(parentThreadId);
157
184
  if (delta.isErr()) {
158
185
  logger.warn("the report session delta did not read", {
@@ -172,7 +199,7 @@ export function createStartReportSessionTool(deps) {
172
199
  return ok({ outcome: "existing-session", threadId: newestChild.threadId, title: newestChild.title });
173
200
  }
174
201
  }
175
- const spawned = await spawn.spawnReportSession(parentThreadId, brief);
202
+ const spawned = await spawn.spawnReportSession(parentThreadId, brief, childThreadId);
176
203
  if (spawned.isOk()) {
177
204
  const child = spawned.value;
178
205
  // The part rides the started arm only. The existing-session arm
@@ -3,9 +3,12 @@
3
3
  *
4
4
  * A terminal call whose text is a placeholder ends a run with nothing. A small
5
5
  * model emits such a call when it drafts several calls at once and fills the
6
- * text later, or never. The guard names the fault, the tool refuses the call,
7
- * and the loop continues with the real work.
6
+ * text later, or never. The input schema of the tool names the fault, the call
7
+ * gets an error result, and the loop continues with the real work.
8
8
  */
9
+ import { z } from "zod";
9
10
  export declare const MIN_TERMINAL_TEXT = 4;
10
11
  /** The reason a text cannot end a run, or undefined when it can. */
11
12
  export declare function degenerateTerminalText(text: string): string | undefined;
13
+ /** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
14
+ export declare function terminalTextSchema(description: string): z.ZodString;
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * A terminal call whose text is a placeholder ends a run with nothing. A small
5
5
  * model emits such a call when it drafts several calls at once and fills the
6
- * text later, or never. The guard names the fault, the tool refuses the call,
7
- * and the loop continues with the real work.
6
+ * text later, or never. The input schema of the tool names the fault, the call
7
+ * gets an error result, and the loop continues with the real work.
8
8
  */
9
+ import { z } from "zod";
10
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the anchored placeholder words and their n/a spellings, at the start of the text; the alternation is the guard's own word list.
9
11
  const PLACEHOLDER_TEXT = /^\s*(?:placeholder|todo|tbd|skip|n\/?a|none|null|test|x+|\.+|-+)\b/i;
10
12
  export const MIN_TERMINAL_TEXT = 4;
11
13
  /** The reason a text cannot end a run, or undefined when it can. */
@@ -13,7 +15,37 @@ export function degenerateTerminalText(text) {
13
15
  const trimmed = text.trim();
14
16
  if (trimmed.length < MIN_TERMINAL_TEXT)
15
17
  return `The text has ${trimmed.length} characters, and a real question or reason has at least ${MIN_TERMINAL_TEXT}.`;
16
- if (PLACEHOLDER_TEXT.test(trimmed) || /\bplaceholder\b/i.test(trimmed))
18
+ if (PLACEHOLDER_TEXT.test(trimmed) || holdsStandaloneWord(trimmed, "placeholder"))
17
19
  return "The text is a placeholder.";
18
20
  return undefined;
19
21
  }
22
+ /** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
23
+ export function terminalTextSchema(description) {
24
+ return z
25
+ .string()
26
+ .min(1)
27
+ .check(z.superRefine((text, ctx) => {
28
+ const degenerate = degenerateTerminalText(text);
29
+ if (degenerate !== undefined)
30
+ ctx.addIssue({ code: "custom", message: `${degenerate} Give the real text, or continue the work.` });
31
+ }))
32
+ .describe(description);
33
+ }
34
+ /** Whether `word` occurs in `text` as a standalone word, case-insensitively. */
35
+ function holdsStandaloneWord(text, word) {
36
+ const lower = text.toLowerCase();
37
+ const needle = word.toLowerCase();
38
+ let at = lower.indexOf(needle);
39
+ while (at >= 0) {
40
+ const boundedBefore = at === 0 || !isWordChar(lower.charAt(at - 1));
41
+ const end = at + needle.length;
42
+ const boundedAfter = end >= lower.length || !isWordChar(lower.charAt(end));
43
+ if (boundedBefore && boundedAfter)
44
+ return true;
45
+ at = lower.indexOf(needle, at + 1);
46
+ }
47
+ return false;
48
+ }
49
+ function isWordChar(char) {
50
+ return (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_";
51
+ }
@@ -27,15 +27,15 @@ export declare function decisionRecordPath(scriptFile: string): string;
27
27
  export declare function decisionRecordPathFor(scriptPath: string): string | undefined;
28
28
  export declare function scriptSha256(content: string | Uint8Array): string;
29
29
  /** One change of a script after its render, as the record keeps it. */
30
- export interface UnvettedEdit {
30
+ export type UnvettedEdit = {
31
31
  readonly path: string;
32
32
  readonly note: string;
33
33
  /** The digest of the script after the change. */
34
34
  readonly sha256: string;
35
- }
35
+ };
36
36
  /** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
37
37
  export declare function expectedScriptSha256(record: Readonly<Record<string, unknown>>): string | undefined;
38
- export interface NoteScriptChangeArgs {
38
+ export type NoteScriptChangeArgs = {
39
39
  readonly filesystem: WorkspaceFilesystem;
40
40
  readonly mutator: WorkspaceMutator;
41
41
  readonly session: AgentSession;
@@ -49,7 +49,7 @@ export interface NoteScriptChangeArgs {
49
49
  readonly note: string;
50
50
  /** The digest of the script after the change. */
51
51
  readonly sha256: string;
52
- }
52
+ };
53
53
  /**
54
54
  * The outcome of a change note. `noted` carries the record of the write,
55
55
  * thus the calling tool carries it as its call record, and its fold hands it
@@ -11,14 +11,23 @@
11
11
  */
12
12
  import { createHash } from "node:crypto";
13
13
  import { posix as posixPath } from "node:path";
14
+ import { z } from "zod";
14
15
  import { unwrapOrThrow } from "../../lib/result.js";
16
+ import { safeParseJsonAs } from "../../lib/parse-json.js";
17
+ import { isUnknownArray } from "../../lib/unknown-array.js";
18
+ import { UnknownRecordSchema } from "../../lib/unknown-containers.js";
15
19
  /**
16
20
  * The path of the decision record of one rendered script inside the step:
17
21
  * `output/decision_record_<script stem>.json`. One record per render, thus a
18
22
  * step that renders two scripts keeps both records.
19
23
  */
20
24
  export function decisionRecordPath(scriptFile) {
21
- const stem = scriptFile.replace(/\.[A-Za-z0-9]+$/, "");
25
+ const dot = scriptFile.lastIndexOf(".");
26
+ const suffix = scriptFile.slice(dot + 1);
27
+ const isSuffixAlnum = dot !== -1 &&
28
+ suffix.length > 0 &&
29
+ Array.from(suffix).every((char) => (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9"));
30
+ const stem = isSuffixAlnum ? scriptFile.slice(0, dot) : scriptFile;
22
31
  return `output/decision_record_${stem}.json`;
23
32
  }
24
33
  /**
@@ -37,12 +46,13 @@ export function decisionRecordPathFor(scriptPath) {
37
46
  export function scriptSha256(content) {
38
47
  return `sha256:${createHash("sha256").update(content).digest("hex")}`;
39
48
  }
49
+ const LastEditRecordSchema = z.looseObject({ sha256: z.string() });
40
50
  /** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
41
51
  export function expectedScriptSha256(record) {
42
- const edits = Array.isArray(record.unvetted_edits) ? record.unvetted_edits : [];
43
- const last = edits[edits.length - 1]?.sha256;
44
- if (typeof last === "string")
45
- return last;
52
+ const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
53
+ const parsed = LastEditRecordSchema.safeParse(edits.at(-1));
54
+ if (parsed.success)
55
+ return parsed.data.sha256;
46
56
  return typeof record.written_sha256 === "string" ? record.written_sha256 : undefined;
47
57
  }
48
58
  /**
@@ -56,20 +66,20 @@ export async function noteScriptChange(args) {
56
66
  const recordPath = decisionRecordPathFor(args.scriptPath);
57
67
  if (!recordPath)
58
68
  return { status: "no_record" };
59
- const read = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath, ...(args.workingDir !== undefined ? { workingDir: args.workingDir } : {}) }));
69
+ const read = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath, workingDir: args.workingDir }));
60
70
  if (read.kind !== "ok")
61
71
  return { status: "no_record" };
62
72
  let record;
63
73
  try {
64
- const parsed = JSON.parse(read.content.toString("utf8"));
65
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
74
+ const parsed = safeParseJsonAs(read.content.toString("utf8"), UnknownRecordSchema);
75
+ if (!parsed.success)
66
76
  return { status: "no_record" };
67
- record = parsed;
77
+ record = parsed.data;
68
78
  }
69
79
  catch {
70
80
  return { status: "no_record" };
71
81
  }
72
- const edits = Array.isArray(record.unvetted_edits) ? record.unvetted_edits : [];
82
+ const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
73
83
  const entry = { path: args.scriptPath, note: args.note, sha256: args.sha256 };
74
84
  const next = { ...record, unvetted_edits: [...edits, entry] };
75
85
  const written = await args.mutator.writeFile({
@@ -97,10 +107,10 @@ export async function reconcileScriptRecord(args) {
97
107
  return { status: "no_record" };
98
108
  let expected;
99
109
  try {
100
- const parsed = JSON.parse(record.content.toString("utf8"));
101
- if (parsed === null || typeof parsed !== "object")
110
+ const parsed = safeParseJsonAs(record.content.toString("utf8"), UnknownRecordSchema);
111
+ if (!parsed.success)
102
112
  return { status: "no_record" };
103
- expected = expectedScriptSha256(parsed);
113
+ expected = expectedScriptSha256(parsed.data);
104
114
  }
105
115
  catch {
106
116
  return { status: "no_record" };