@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
@@ -0,0 +1,273 @@
1
+ /**
2
+ * `knowledge_template` — the model emits slot values, and the tool writes the
3
+ * rendered script and the decision record into the step workspace through
4
+ * the same `WorkspaceMutator` as `write_file`. The script is never output tokens.
5
+ *
6
+ * The installed versions ride from the tool, not from the model: the tool
7
+ * reads the `inflexa.lock` of the farm and the `image-packages.json` of the
8
+ * store when the host names them (`installedPackages`), and the service
9
+ * answers with the environment match, which the decision record keeps.
10
+ *
11
+ * The plan settings ride from the host, not from the model: the step input
12
+ * carries a `TemplateBinding` when the plan step grounds on a template, and
13
+ * the tool merges the bound slots under the model values. A model value that
14
+ * differs from a bound value is refused before the service call unless an
15
+ * `overrides` entry names the slot with a reason, and the decision record
16
+ * keeps the bound slots and the overrides beside the script path.
17
+ *
18
+ * The facts of the machine never ride at all: a local slot of the template
19
+ * (a path, a column name, a level label, a design formula) is split off the
20
+ * request, the service renders it as its marker, and the tool binds the
21
+ * value on the machine before it writes the file. The request carries the
22
+ * step, its claims, and the release digest the plan pinned, thus the record
23
+ * binds the cited decision to the bytes, and a service on another release
24
+ * refuses the render instead of moving the plan in silence. The call runs as
25
+ * one durable step, thus a replay returns the cached result and renders
26
+ * nothing again.
27
+ */
28
+ import { ok } from "neverthrow";
29
+ import { presentGet } from "../../lib/present.js";
30
+ import { z } from "zod";
31
+ import { defineTool, withToolCallRecord } from "../define-tool.js";
32
+ import { decisionRecordPath, scriptSha256 } from "../workspace/decision-record.js";
33
+ import { installedPackages } from "./environment.js";
34
+ import { bindLocalSlots, localParameters, validateLocalSlot } from "./local-slots.js";
35
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the template reference grammar: the tpl- prefix, an id, and an optional @version tail.
36
+ const TEMPLATE_REF = /^tpl-[a-z0-9-]+(@\d+\.\d+\.\d+)?$/;
37
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a script file name is one segment of the safe file-name charset; the shape is the path-safety rule.
38
+ const SCRIPT_NAME_RE = /^[A-Za-z0-9_.-]+$/;
39
+ /** A model value equals a bound value when the scalars are identical, or when two lists hold the same strings in order. */
40
+ function sameValue(bound, value) {
41
+ if (Array.isArray(bound)) {
42
+ return Array.isArray(value) && value.length === bound.length && bound.every((item, index) => item === value[index]);
43
+ }
44
+ return bound === value;
45
+ }
46
+ /** The source of a bound slot as the issue names it. A binding without a source for the slot reads as the plan. */
47
+ function sourceOf(binding, slot) {
48
+ return binding.sources[slot] ?? "plan";
49
+ }
50
+ /**
51
+ * The refusal of a render request against the binding, or `undefined` when
52
+ * the request obeys it. A different template reference is one issue on the
53
+ * field `template`. Each bound slot whose model value differs without an
54
+ * override is one issue that names the slot, the bound value, and its source.
55
+ */
56
+ function refusedByBinding(binding, template, slots, overridden) {
57
+ if (template !== binding.template) {
58
+ const message = `the plan binds the template ${binding.template}; this step renders that reference only`;
59
+ return { match: "rejected", message, issues: [{ field: "template", message, permitted: [binding.template] }] };
60
+ }
61
+ const issues = [];
62
+ for (const [slot, bound] of Object.entries(binding.slots)) {
63
+ const value = slots[slot];
64
+ if (value === undefined || sameValue(bound, value) || overridden.has(slot))
65
+ continue;
66
+ const shown = JSON.stringify(bound);
67
+ issues.push({
68
+ slot,
69
+ reason: "bound by the plan",
70
+ message: `the plan binds ${slot} = ${shown} (${sourceOf(binding, slot)}); send that value, or name the slot in overrides with the reason for the change`,
71
+ permitted: [shown],
72
+ });
73
+ }
74
+ if (issues.length === 0)
75
+ return undefined;
76
+ return { match: "rejected", message: "one or more slot values differ from the plan settings without an override", issues };
77
+ }
78
+ /** A contract answer that is a refusal. The contract itself is a loose object, thus `in` alone cannot tell the two apart. */
79
+ function isContractRefusal(answer) {
80
+ return "match" in answer && (answer.match === "unavailable" || answer.match === "rejected");
81
+ }
82
+ /** The slots of `slots` whose names are in `names`, and the rest, as two records. */
83
+ function splitSlots(slots, names) {
84
+ const local = {};
85
+ const remote = {};
86
+ for (const [name, value] of Object.entries(slots))
87
+ (names.has(name) ? local : remote)[name] = value;
88
+ return { local, remote };
89
+ }
90
+ const KnowledgeTemplateInputSchema = z.object({
91
+ template: z
92
+ .string()
93
+ .regex(TEMPLATE_REF, "a template id, optionally with @version")
94
+ .describe("The template id from the Grounding of the step, with its version, for example `tpl-deseq2-two-group@1.0.0`."),
95
+ slots: z
96
+ .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]))
97
+ .describe("The slot values, by slot name. Only the adaptable slots of the template; a pinned slot is refused. Strings, numbers, booleans, and lists of strings."),
98
+ overrides: z
99
+ .array(z.object({
100
+ slot: z.string().min(1).describe("The name of the bound slot whose value you change."),
101
+ reason: z.string().min(1).describe("Why the plan value does not hold for this step, in one sentence."),
102
+ }))
103
+ .optional()
104
+ .describe("One entry per bound slot whose value you change from the plan value. Absent when you send every bound value as it is."),
105
+ script_name: z
106
+ .string()
107
+ .regex(SCRIPT_NAME_RE)
108
+ .optional()
109
+ .describe("The file name under `scripts/`. Defaults to `<template id>.R` or `<template id>.py` by the language of the template."),
110
+ });
111
+ export function createKnowledgeTemplateTool(deps) {
112
+ return defineTool({
113
+ id: "knowledge_template",
114
+ description: "Render a tested analysis script from a knowledge template and write it into your working directory. " +
115
+ "Use it for a step whose briefing names a template in its Grounding (for example `tpl-deseq2-two-group@1.0.0`). " +
116
+ "The briefing lists the slots of the template and the values the plan binds. " +
117
+ "Send the template id and the slot values only: the file paths of your inputs (absolute `/<analysisId>/...` paths), the column names, the levels of the contrast, and the design. " +
118
+ "A slot the briefing marks local (a path, a column name, a level, a formula) is bound on this machine and never sent to the service; send it as any other slot. " +
119
+ "A bound value rides into the script as it is; send it unchanged, or omit it. To change a bound value, send the new value and add an `overrides` entry with the slot and the reason. A changed value without an override is refused before the service call. " +
120
+ "Prefer the template over a script of your own: it is tested, and it carries the settings of the plan. When the template does not fit the step (a design it does not cover, or an input it cannot read), write the script yourself with `write_file`, and state the reason in your summary. " +
121
+ "The tool writes `scripts/<template>.R` or `scripts/<template>.py` and `output/decision_record_<script>.json`, one record per rendered script (the step, its claims, the template, the snapshot, each slot with its source, the bound slots, the overrides, the environment match, the citations, and the digest of the script as written), then you run the script with `execute_command` using the command in `run_with`. " +
122
+ "A slot value of the right type that the template refuses comes back as `match: rejected` with the slot and the permitted values; correct it and call again. " +
123
+ "A slot value of a different type (a string for a number, for example) fails the input check of the tool before the template sees it; send the type that the slot states. " +
124
+ "A change the slots do not cover: use `edit_file` on a line marked `# [adaptable: ...]` in the rendered script, and keep the edit small; the record lists each such edit. " +
125
+ "`match: unavailable` means the service did not answer, and `match: snapshot_mismatch` means the service moved to another release than the plan pinned; in both cases write the script yourself as you would without this tool, and state it in your summary.",
126
+ inputSchema: KnowledgeTemplateInputSchema,
127
+ describeCall: ({ template }) => template,
128
+ describeResult: (_input, result) => "status" in result ? (result.status === "ok" ? `${result.script_path} (${result.environment_match})` : result.status) : result.match,
129
+ execute: async ({ template, slots, overrides, script_name }, ctx) => {
130
+ const binding = deps.binding;
131
+ const reasons = new Map((overrides ?? []).map((entry) => [entry.slot, entry.reason]));
132
+ if (binding) {
133
+ const refused = refusedByBinding(binding, template, slots, new Set(reasons.keys()));
134
+ if (refused)
135
+ return ok(refused);
136
+ }
137
+ // The local slots and the adaptable names come from the binding the host composed at dispatch, else from
138
+ // the contract itself. Without them no free-text value can be told from a fact of the machine, and an
139
+ // unknown name could carry one, thus no render happens without them.
140
+ let locals;
141
+ let adaptable;
142
+ if (binding?.local && binding.adaptable) {
143
+ locals = binding.local;
144
+ adaptable = binding.adaptable;
145
+ }
146
+ else {
147
+ const contract = await deps.client.contract(template);
148
+ if (isContractRefusal(contract))
149
+ return ok(contract);
150
+ locals = localParameters(contract.parameters);
151
+ adaptable = contract.parameters.filter((parameter) => parameter.adaptable).map((parameter) => parameter.name);
152
+ }
153
+ const unknown = Object.keys(slots).filter((name) => !adaptable.includes(name));
154
+ if (unknown.length > 0) {
155
+ return ok({
156
+ match: "rejected",
157
+ message: "one or more slot names are not adaptable slots of this template",
158
+ issues: unknown.map((slot) => ({ slot, reason: "the template has no such adaptable slot", permitted: [...adaptable] })),
159
+ });
160
+ }
161
+ const localNames = new Set(locals.map((parameter) => parameter.name));
162
+ const split = splitSlots(slots, localNames);
163
+ const boundSplit = splitSlots(binding?.slots ?? {}, localNames);
164
+ const merged = { ...boundSplit.remote, ...split.remote };
165
+ // A bound local slot is bound on the machine like a model value, under the model value.
166
+ const localValues = { ...boundSplit.local, ...split.local };
167
+ const localByName = new Map(locals.map((parameter) => [parameter.name, parameter]));
168
+ // A local value the contract refuses is refused before the service call, thus a bad path costs no render.
169
+ const localIssues = Object.entries(localValues).flatMap(([name, value]) => {
170
+ const issue = validateLocalSlot(presentGet(localByName, name, "the template parameter of the local value"), value);
171
+ return issue ? [issue] : [];
172
+ });
173
+ if (localIssues.length > 0) {
174
+ return ok({ match: "rejected", message: "one or more local slot values are not valid for this template", issues: localIssues });
175
+ }
176
+ const farmLockFile = typeof deps.farmLockFile === "function" ? deps.farmLockFile(ctx.session.scope.analysisId) : deps.farmLockFile;
177
+ const installed = installedPackages({
178
+ farmLockFile,
179
+ imagePackagesFile: deps.imagePackagesFile,
180
+ });
181
+ const answer = await deps.client.render(template, merged, installed.packages, {
182
+ step: binding?.step,
183
+ claims: binding?.claims,
184
+ expectedSnapshot: binding?.snapshot,
185
+ });
186
+ // A rendered answer carries `ok: true`; the refusals carry `match` and no `ok`.
187
+ if (!("ok" in answer))
188
+ return ok(answer);
189
+ const bound = bindLocalSlots({ language: answer.template.language, parameters: locals }, answer.script, localValues, answer.slots);
190
+ if (!bound.ok) {
191
+ return ok({ match: "rejected", message: "one or more local slot values are not valid for this template", issues: bound.issues });
192
+ }
193
+ const scriptFile = script_name ?? `${answer.template.id}.${answer.template.language === "R" ? "R" : "py"}`;
194
+ const scriptPath = `scripts/${scriptFile}`;
195
+ // Each landed write rides the call record, also when a later write is refused.
196
+ const records = [];
197
+ const write = async (path, content) => {
198
+ const outcome = await deps.mutator.writeFile({
199
+ path,
200
+ content,
201
+ toolName: "knowledge_template",
202
+ invocationId: ctx.invocationId,
203
+ session: ctx.session,
204
+ });
205
+ if (outcome.status === "ok")
206
+ records.push(outcome.record);
207
+ return outcome;
208
+ };
209
+ const scriptWrite = await write(scriptPath, bound.script);
210
+ if (scriptWrite.status !== "ok")
211
+ return ok({ status: "write_refused", path: scriptWrite.path, reason: scriptWrite.status });
212
+ const boundSlots = Object.entries(binding?.slots ?? {}).map(([slot, value]) => ({
213
+ slot,
214
+ value,
215
+ source: binding ? sourceOf(binding, slot) : "plan",
216
+ }));
217
+ const settingsOverrides = boundSlots.flatMap(({ slot, value }) => {
218
+ const reason = reasons.get(slot);
219
+ const sent = slots[slot];
220
+ if (reason === undefined || sent === undefined || sameValue(value, sent))
221
+ return [];
222
+ return [{ slot, plan_value: value, new_value: sent, reason }];
223
+ });
224
+ // The slot report of the record: the service entries, with each local marker entry replaced by the slot as
225
+ // bound here. An optional local slot with no value has no entry, as in a full render.
226
+ const boundByName = new Map(bound.slots.map((slot) => [slot.name, slot]));
227
+ const reportedSlots = answer.slots.flatMap((slot) => {
228
+ if (slot.source !== "local")
229
+ return [slot];
230
+ const local = boundByName.get(slot.name);
231
+ return local ? [local] : [];
232
+ });
233
+ const record = {
234
+ ...answer.decision_record,
235
+ slots: reportedSlots,
236
+ script_path: scriptWrite.path,
237
+ written_sha256: scriptSha256(bound.script),
238
+ bound_slots: boundSlots,
239
+ settings_overrides: settingsOverrides,
240
+ };
241
+ const recordWrite = await write(decisionRecordPath(scriptFile), `${JSON.stringify(record, null, 2)}\n`);
242
+ if (recordWrite.status !== "ok") {
243
+ return ok(withToolCallRecord({ status: "write_refused", path: recordWrite.path, reason: recordWrite.status }, records));
244
+ }
245
+ return ok(withToolCallRecord({
246
+ status: "ok",
247
+ script_path: scriptWrite.path,
248
+ decision_record_path: recordWrite.path,
249
+ template: {
250
+ id: answer.template.id,
251
+ version: answer.template.version,
252
+ label: answer.template.label,
253
+ method: { id: answer.template.method.id, label: answer.template.method.label },
254
+ substitute_for: answer.template.substitute_for === undefined
255
+ ? undefined
256
+ : { id: answer.template.substitute_for.id, label: answer.template.substitute_for.label },
257
+ },
258
+ snapshot: answer.snapshot,
259
+ slots: reportedSlots,
260
+ local_slots: bound.slots.map((slot) => slot.name),
261
+ written_sha256: record.written_sha256,
262
+ environment_match: answer.environment.match,
263
+ syntax: answer.syntax.status,
264
+ expected_outputs: answer.outputs,
265
+ run_with: `${answer.template.language === "R" ? "Rscript" : "python3"} ${scriptPath}`,
266
+ }, records));
267
+ },
268
+ foldCallRecord: (records) => {
269
+ for (const record of records)
270
+ deps.mutator.recordWrite(record);
271
+ },
272
+ });
273
+ }
@@ -19,6 +19,7 @@
19
19
  * `found: false` tells the agent to report the absence and not to retry.
20
20
  */
21
21
  import { z } from "zod";
22
+ import { presentFirst } from "../../lib/present.js";
22
23
  import { apiFetchValidated, describeApiError } from "./api-utils.js";
23
24
  const ALPHAFOLD_BASE = "https://alphafold.ebi.ac.uk/api/prediction";
24
25
  /**
@@ -70,7 +71,7 @@ export async function fetchAlphaFoldPrediction(uniprotAccession) {
70
71
  if (entries.length === 0)
71
72
  return null;
72
73
  const exact = entries.find((entry) => entry.uniprotAccession.toUpperCase() === accession.toUpperCase());
73
- return exact ?? entries[0];
74
+ return exact ?? presentFirst(entries, "the fallback entry");
74
75
  }
75
76
  function isAbsence(e) {
76
77
  return e.type === "http_status" && (e.status === 400 || e.status === 404);
@@ -349,24 +349,24 @@ export declare const RegulatorySectionResponseSchema: z.ZodObject<{
349
349
  }, z.core.$strip>;
350
350
  type RegulatoryBase = z.infer<typeof RegulatoryBaseSchema>;
351
351
  /** The sections of one source document. The document fields appear once, not on every section. */
352
- export interface SectionGroup<S> {
352
+ export type SectionGroup<S> = {
353
353
  readonly docType: string;
354
354
  readonly sourceUrl: string | null;
355
355
  readonly sourceDate: string | null;
356
356
  readonly sections: S[];
357
- }
357
+ };
358
358
  /** One entry of a table of contents. */
359
- export interface SectionEntry {
359
+ export type SectionEntry = {
360
360
  readonly documentSectionId: string;
361
361
  readonly path: string | null;
362
362
  readonly title: string | null;
363
- }
363
+ };
364
364
  /** One matched section of a search, with the excerpt that drove the match. */
365
- export interface MatchedSectionEntry extends SectionEntry {
365
+ export type MatchedSectionEntry = SectionEntry & {
366
366
  readonly matchedText: string | null;
367
- }
367
+ };
368
368
  /** The fields of an authorization that both the search and the details answer carry. */
369
- export interface AuthorizationSummary {
369
+ export type AuthorizationSummary = {
370
370
  readonly amassId: string;
371
371
  readonly agency: string;
372
372
  readonly name: string | null;
@@ -382,22 +382,22 @@ export interface AuthorizationSummary {
382
382
  readonly designations: RegulatoryBase["designations"];
383
383
  readonly otherAuthorizations: RegulatoryBase["authorizationsByAgency"];
384
384
  readonly sourceUrl: string | null;
385
- }
385
+ };
386
386
  /** The matched sections that a search row keeps. The count still reports all of them. */
387
387
  export declare const MAX_MATCHED_SECTIONS = 5;
388
- export interface AuthorizationSearchRow extends AuthorizationSummary {
388
+ export type AuthorizationSearchRow = AuthorizationSummary & {
389
389
  readonly matchedSectionCount: number;
390
390
  readonly matchedDocuments: SectionGroup<MatchedSectionEntry>[];
391
- }
391
+ };
392
392
  export declare function mapRegulatorySearchRow(record: z.infer<typeof RegulatorySearchResponseSchema>["data"][number]): AuthorizationSearchRow;
393
- export interface AuthorizationRecord extends AuthorizationSummary {
393
+ export type AuthorizationRecord = AuthorizationSummary & {
394
394
  readonly fdaDetails: z.infer<typeof FdaDetailsSchema> | null;
395
395
  readonly emaDetails: z.infer<typeof EmaDetailsSchema> | null;
396
396
  readonly sectionCount: number;
397
397
  readonly documents: SectionGroup<SectionEntry>[];
398
- }
398
+ };
399
399
  export declare function mapRegulatoryRecord(record: z.infer<typeof RegulatoryRecordResponseSchema>["data"]): AuthorizationRecord;
400
- export interface RegulatorySection {
400
+ export type RegulatorySection = {
401
401
  readonly amassId: string;
402
402
  readonly documentSectionId: string;
403
403
  readonly docType: string;
@@ -406,8 +406,8 @@ export interface RegulatorySection {
406
406
  readonly sourceUrl: string | null;
407
407
  readonly sourceDate: string | null;
408
408
  readonly content: string | null;
409
- }
410
- export interface RegulatorySearchParams {
409
+ };
410
+ export type RegulatorySearchParams = {
411
411
  readonly query: string;
412
412
  readonly limit: number;
413
413
  readonly agency?: readonly string[];
@@ -418,19 +418,19 @@ export interface RegulatorySearchParams {
418
418
  readonly minAuthorizationDate?: string;
419
419
  readonly maxAuthorizationDate?: string;
420
420
  readonly amassId?: string;
421
- }
421
+ };
422
422
  export declare function searchRegulatoryRecords(params: RegulatorySearchParams, headers: Record<string, string>): ResultAsync<AuthorizationSearchRow[], AmassError>;
423
423
  /** One authorization with its table of contents, or `null` when Amass holds no such ID. */
424
424
  export declare function getRegulatoryRecord(amassId: string, headers: Record<string, string>): ResultAsync<AuthorizationRecord | null, AmassError>;
425
425
  /** The full text of one document section, or `null` when Amass holds no such section. */
426
426
  export declare function getRegulatorySection(amassId: string, documentSectionId: string, headers: Record<string, string>): ResultAsync<RegulatorySection | null, AmassError>;
427
427
  /** The identifiers that the RegulatoryCore lookup accepts. Exactly one is set. */
428
- export interface RegulatoryIdentifier {
428
+ export type RegulatoryIdentifier = {
429
429
  readonly fdaApplicationNumber?: string;
430
430
  readonly emaProductNumber?: string;
431
431
  readonly ndc?: string;
432
432
  readonly splSetId?: string;
433
- }
433
+ };
434
434
  export declare function regulatoryLookupItems(id: RegulatoryIdentifier): LookupItem[];
435
435
  export declare function lookupRegulatoryIds(id: RegulatoryIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
436
436
  declare const PatentBaseSchema: z.ZodObject<{
@@ -523,7 +523,7 @@ export declare const PatentRecordResponseSchema: z.ZodObject<{
523
523
  }, z.core.$strip>;
524
524
  type PatentBase = z.infer<typeof PatentBaseSchema>;
525
525
  /** A patent with its citation counts. The citation lists stay out: a cited patent can carry thousands. */
526
- export interface PatentSummary {
526
+ export type PatentSummary = {
527
527
  readonly amassId: string;
528
528
  readonly publicationNumber: string | null;
529
529
  readonly applicationNumber: string | null;
@@ -546,17 +546,17 @@ export interface PatentSummary {
546
546
  readonly hasClaims: boolean | null;
547
547
  readonly hasDescription: boolean | null;
548
548
  readonly url: string | null;
549
- }
549
+ };
550
550
  export declare function mapPatentSummary(record: PatentBase): PatentSummary;
551
- export interface PatentRecord extends PatentSummary {
551
+ export type PatentRecord = PatentSummary & {
552
552
  readonly familyMembers: string[];
553
553
  readonly language: string | null;
554
554
  readonly nonEnglishFallback: boolean | null;
555
- readonly claims?: string | null;
556
- readonly description?: string | null;
557
- }
555
+ claims?: string | null;
556
+ description?: string | null;
557
+ };
558
558
  export declare function mapPatentRecord(record: PatentBase): PatentRecord;
559
- export interface PatentSearchParams {
559
+ export type PatentSearchParams = {
560
560
  readonly query: string;
561
561
  readonly limit: number;
562
562
  readonly assignee?: readonly string[];
@@ -571,16 +571,16 @@ export interface PatentSearchParams {
571
571
  readonly maxPriorityDate?: string;
572
572
  readonly minGrantDate?: string;
573
573
  readonly maxGrantDate?: string;
574
- }
574
+ };
575
575
  export declare function searchPatentRecords(params: PatentSearchParams, headers: Record<string, string>): ResultAsync<PatentSummary[], AmassError>;
576
576
  export declare function getPatentRecord(amassId: string, include: {
577
577
  readonly claims: boolean;
578
578
  readonly description: boolean;
579
579
  }, headers: Record<string, string>): ResultAsync<PatentRecord | null, AmassError>;
580
580
  /** The identifiers that the PatentCore lookup accepts. Exactly one is set. */
581
- export interface PatentIdentifier {
581
+ export type PatentIdentifier = {
582
582
  readonly publicationNumber?: string;
583
583
  readonly applicationNumber?: string;
584
- }
584
+ };
585
585
  export declare function lookupPatentIds(id: PatentIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
586
586
  export {};
@@ -31,6 +31,8 @@
31
31
  import { err, ok } from "neverthrow";
32
32
  import { z } from "zod";
33
33
  import { apiFetchValidated, describeApiError } from "./api-utils.js";
34
+ import { safeParseJsonAs } from "../../lib/parse-json.js";
35
+ import { hasWhitespace, isAllDigits } from "../../lib/text.js";
34
36
  import { AMASS_BASE } from "./amass-config.js";
35
37
  /** Render an `AmassError` as a one-line message for the model or for a throw. */
36
38
  export function describeAmassError(e) {
@@ -60,14 +62,13 @@ export const AmassErrorEnvelopeSchema = z.object({
60
62
  });
61
63
  /** Read the message of an Amass error body, with the per-field reasons of a 400. */
62
64
  function envelopeOf(body) {
63
- let parsed;
65
+ let envelope;
64
66
  try {
65
- parsed = JSON.parse(body);
67
+ envelope = safeParseJsonAs(body, AmassErrorEnvelopeSchema);
66
68
  }
67
69
  catch {
68
70
  return { code: null, message: body || "no message" };
69
71
  }
70
- const envelope = AmassErrorEnvelopeSchema.safeParse(parsed);
71
72
  if (!envelope.success)
72
73
  return { code: null, message: body || "no message" };
73
74
  const { code, message, fields } = envelope.data.error;
@@ -105,7 +106,8 @@ function urlOf(path, params) {
105
106
  if (value === undefined)
106
107
  continue;
107
108
  if (Array.isArray(value)) {
108
- for (const item of value)
109
+ const items = value;
110
+ for (const item of items)
109
111
  url.searchParams.append(key, item);
110
112
  }
111
113
  else {
@@ -154,8 +156,11 @@ const FDA_APPLICATION_PREFIXES = ["NDA", "BLA", "ANDA"];
154
156
  * thus goes as all three prefixes, in one request at the price of one.
155
157
  */
156
158
  export function fdaApplicationForms(input) {
157
- const compact = input.replace(/[\s-]/g, "").toUpperCase();
158
- if (/^\d+$/.test(compact))
159
+ const compact = Array.from(input)
160
+ .filter((char) => char !== "-" && !hasWhitespace(char))
161
+ .join("")
162
+ .toUpperCase();
163
+ if (compact !== "" && isAllDigits(compact))
159
164
  return FDA_APPLICATION_PREFIXES.map((prefix) => `${prefix}${compact}`);
160
165
  return [compact];
161
166
  }
@@ -166,7 +171,9 @@ export function fdaApplicationForms(input) {
166
171
  export function productNdcOf(input) {
167
172
  const trimmed = input.trim();
168
173
  const segments = trimmed.split("-");
169
- return segments.length === 3 && segments.every((segment) => /^\d+$/.test(segment)) ? `${segments[0]}-${segments[1]}` : trimmed;
174
+ return segments.length === 3 && segments.every((segment) => segment.length > 0 && isAllDigits(segment))
175
+ ? `${String(segments[0])}-${String(segments[1])}`
176
+ : trimmed;
170
177
  }
171
178
  // ---------------------------------------------------------------------------
172
179
  // RegulatoryCore
@@ -455,14 +462,17 @@ export function mapPatentSummary(record) {
455
462
  };
456
463
  }
457
464
  export function mapPatentRecord(record) {
458
- return {
465
+ const patent = {
459
466
  ...mapPatentSummary(record),
460
467
  familyMembers: record.familyMembers,
461
468
  language: record.language,
462
469
  nonEnglishFallback: record.nonEnglishFallback,
463
- ...(record.claims === undefined ? {} : { claims: record.claims }),
464
- ...(record.description === undefined ? {} : { description: record.description }),
465
470
  };
471
+ if (record.claims !== undefined)
472
+ patent.claims = record.claims;
473
+ if (record.description !== undefined)
474
+ patent.description = record.description;
475
+ return patent;
466
476
  }
467
477
  /** PatentCore reads a list filter as one comma-separated value, not as a repeated parameter. */
468
478
  function commaList(values) {
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import { ResultAsync } from "neverthrow";
12
12
  import { z } from "zod";
13
- export interface ApiFetchOptions {
13
+ export type ApiFetchOptions = {
14
14
  method?: "GET" | "POST";
15
15
  headers?: Record<string, string>;
16
16
  body?: string;
@@ -31,7 +31,7 @@ export interface ApiFetchOptions {
31
31
  sleep?: (ms: number) => Promise<void>;
32
32
  timeoutMs?: number;
33
33
  parseAs?: "json" | "text";
34
- }
34
+ };
35
35
  /** The error channel of `apiFetch`. A `DomainError` (string `type` discriminant). */
36
36
  export type ApiError = {
37
37
  readonly type: "http_status";
@@ -64,8 +64,18 @@ export declare const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)
64
64
  * and every wait stays at or below `maxRetryDelayMs`.
65
65
  *
66
66
  * Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
67
+ *
68
+ * The success value is `unknown`: the caller either walks it with guards, or
69
+ * validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
70
+ */
71
+ export declare function apiFetch(url: string, options?: ApiFetchOptions): ResultAsync<unknown, ApiError>;
72
+ /**
73
+ * `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
74
+ * value a string, so the wrapper states that shape instead of casting the
75
+ * `unknown` read; the check never refuses a body, because `res.text()` always
76
+ * resolves to one.
67
77
  */
68
- export declare function apiFetch<T = unknown>(url: string, options?: ApiFetchOptions): ResultAsync<T, ApiError>;
78
+ export declare function apiFetchText(url: string, options?: ApiFetchOptions): ResultAsync<string, ApiError>;
69
79
  /**
70
80
  * `apiFetch` that validates the JSON response against a Zod `schema` before
71
81
  * returning it. The success value is the schema's parsed output, so callers
@@ -8,6 +8,8 @@
8
8
  * `ResultAsync<T, ApiError>` rather than throwing — callers branch on
9
9
  * `isErr()` and read `value` / `error` (see `result.ts` for the house rules).
10
10
  */
11
+ import { errorMessageOf } from "../../lib/thrown.js";
12
+ import { textOf } from "../../lib/unknown-text.js";
11
13
  import { ResultAsync, err, ok } from "neverthrow";
12
14
  import { z } from "zod";
13
15
  import { sleep } from "../../lib/async-utils.js";
@@ -33,10 +35,22 @@ export const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)";
33
35
  * and every wait stays at or below `maxRetryDelayMs`.
34
36
  *
35
37
  * Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
38
+ *
39
+ * The success value is `unknown`: the caller either walks it with guards, or
40
+ * validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
36
41
  */
37
42
  export function apiFetch(url, options = {}) {
38
43
  return new ResultAsync(runFetch(url, options));
39
44
  }
45
+ /**
46
+ * `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
47
+ * value a string, so the wrapper states that shape instead of casting the
48
+ * `unknown` read; the check never refuses a body, because `res.text()` always
49
+ * resolves to one.
50
+ */
51
+ export function apiFetchText(url, options = {}) {
52
+ return apiFetch(url, { ...options, parseAs: "text" }).andThen((data) => typeof data === "string" ? ok(data) : err({ type: "invalid_response", issues: "expected a text body" }));
53
+ }
40
54
  /**
41
55
  * `apiFetch` that validates the JSON response against a Zod `schema` before
42
56
  * returning it. The success value is the schema's parsed output, so callers
@@ -125,14 +139,14 @@ async function runFetch(url, options) {
125
139
  const text = await res.text().catch(() => "");
126
140
  return err({ type: "http_status", status: res.status, body: text.trim() });
127
141
  }
128
- const data = parseAs === "text" ? (await res.text()) : (await res.json());
129
- return ok(data);
142
+ const readBody = parseAs === "text" ? (res) => res.text() : (res) => res.json();
143
+ return ok(await readBody(res));
130
144
  }
131
145
  catch (e) {
132
146
  if (e instanceof DOMException && e.name === "TimeoutError") {
133
147
  return err({ type: "timeout", timeoutMs });
134
148
  }
135
- lastError = e instanceof Error ? e.message : String(e);
149
+ lastError = errorMessageOf(e) ?? textOf(e);
136
150
  if (attempt < maxRetries) {
137
151
  await wait(Math.min(maxRetryDelayMs, retryDelayMs * 2 ** attempt));
138
152
  continue;
@@ -15,26 +15,26 @@ export declare const SUPPORTED_SPECIES: readonly ["homo_sapiens", "mus_musculus"
15
15
  export type SupportedSpecies = (typeof SUPPORTED_SPECIES)[number];
16
16
  export declare const SPECIES_TAXON: Record<SupportedSpecies, number>;
17
17
  export type ExpressionRank = "absent" | "low" | "medium" | "high";
18
- export interface TissueRow {
18
+ export type TissueRow = {
19
19
  tissue: string;
20
20
  cellType: string | null;
21
21
  expressionScore: number | null;
22
22
  confidence: "gold" | "silver" | null;
23
23
  expressionState: "expressed" | "not expressed";
24
24
  rank: ExpressionRank;
25
- }
26
- export interface SpeciesEntry {
25
+ };
26
+ export type SpeciesEntry = {
27
27
  species: SupportedSpecies;
28
28
  taxonId: number;
29
29
  ensemblId: string;
30
30
  tissues: TissueRow[];
31
- }
32
- export interface MultiSpeciesExpression {
31
+ };
32
+ export type MultiSpeciesExpression = {
33
33
  geneSymbol: string;
34
34
  humanEnsemblId: string | null;
35
35
  bySpecies: SpeciesEntry[];
36
36
  notFound: string[];
37
- }
37
+ };
38
38
  export declare function bucketRank(expressionState: string, score: number | null): ExpressionRank;
39
39
  export declare const EnsemblLookupSchema: z.ZodObject<{
40
40
  id: z.ZodOptional<z.ZodString>;