@inflexa-ai/harness 0.45.1 → 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 (789) 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 +307 -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 +23 -7
  174. package/dist/lib/hooks.js +17 -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 +161 -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 +34 -0
  256. package/dist/loop/turn-credentials.js +73 -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/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -1,78 +1,135 @@
1
+ import { presentAt } from "../../lib/present.js";
2
+ import { collapseWhitespace as collapseText, isAllDigits, isAllHex } from "../../lib/text.js";
1
3
  import { requestText } from "./http.js";
2
4
  const BASE_URL = "https://export.arxiv.org/api/query";
5
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- an Atom feed wraps text in CDATA sections; this keeps the text of each nearest opener/closer pair.
3
6
  const stripCdata = (value) => value.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, "$1");
4
- const decodeXmlEntities = (value) => value
5
- .replace(/&lt;/g, "<")
6
- .replace(/&gt;/g, ">")
7
- .replace(/&quot;/g, '"')
8
- .replace(/&apos;/g, "'")
9
- .replace(/&#x([0-9a-fA-F]+);/g, (_, hexadecimal) => String.fromCodePoint(parseInt(hexadecimal, 16)))
10
- .replace(/&#(\d+);/g, (_, decimal) => String.fromCodePoint(parseInt(decimal, 10)))
11
- .replace(/&amp;/g, "&");
12
- const collapseWhitespace = (value) => decodeXmlEntities(stripCdata(value)).replace(/\s+/g, " ").trim();
13
- function extractEntries(xml) {
14
- const expression = /<entry\b[^>]*>([\s\S]*?)<\/entry>/g;
15
- const entries = [];
16
- let match;
17
- while ((match = expression.exec(xml)) !== null)
18
- entries.push(match[1]);
19
- return entries;
7
+ const NAMED_XML_ENTITIES = new Map([
8
+ ["lt", "<"],
9
+ ["gt", ">"],
10
+ ["quot", '"'],
11
+ ["apos", "'"],
12
+ ["amp", "&"],
13
+ ]);
14
+ function decodeEntity(body) {
15
+ const named = NAMED_XML_ENTITIES.get(body);
16
+ if (named !== undefined)
17
+ return named;
18
+ if (body.startsWith("#x")) {
19
+ const hexadecimal = body.slice(2);
20
+ return hexadecimal.length > 0 && isAllHex(hexadecimal) ? String.fromCodePoint(parseInt(hexadecimal, 16)) : undefined;
21
+ }
22
+ if (body.startsWith("#")) {
23
+ const decimal = body.slice(1);
24
+ return decimal.length > 0 && isAllDigits(decimal) ? String.fromCodePoint(parseInt(decimal, 10)) : undefined;
25
+ }
26
+ return undefined;
20
27
  }
21
- function firstMatch(entry, tag) {
22
- return entry.match(new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)</${tag}>`))?.[1];
28
+ /**
29
+ * Decode the XML entities the feed emits, in one pass.
30
+ *
31
+ * A single pass cannot re-decode its own output: `&amp;lt;` yields `&lt;`, never `<`.
32
+ * A body that names no entity — or a numeric body that is not well-formed — stays literal.
33
+ */
34
+ function decodeXmlEntities(value) {
35
+ let out = "";
36
+ for (let i = 0; i < value.length;) {
37
+ if (value.charAt(i) !== "&") {
38
+ out += value.charAt(i);
39
+ i++;
40
+ continue;
41
+ }
42
+ const semicolon = value.indexOf(";", i);
43
+ const decoded = semicolon < 0 ? undefined : decodeEntity(value.slice(i + 1, semicolon));
44
+ if (decoded === undefined) {
45
+ out += "&";
46
+ i++;
47
+ continue;
48
+ }
49
+ out += decoded;
50
+ i = semicolon + 1;
51
+ }
52
+ return out;
23
53
  }
54
+ const collapseWhitespace = (value) => collapseText(decodeXmlEntities(stripCdata(value)));
24
55
  function allMatches(entry, tag) {
56
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- an Atom tag's content is `<tag …>` up to the nearest `</tag>`; the expression is built per tag name, and a tag name is not data.
25
57
  const expression = new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)</${tag}>`, "g");
26
58
  const values = [];
27
59
  let match;
28
60
  while ((match = expression.exec(entry)) !== null)
29
- values.push(match[1]);
61
+ values.push(presentAt(match, 1, `the captured ${tag}`));
30
62
  return values;
31
63
  }
32
- function linkAttribute(entry, predicate) {
33
- const expression = /<link\b([^>]*)\/>/g;
64
+ function firstMatch(entry, tag) {
65
+ return allMatches(entry, tag)[0];
66
+ }
67
+ function attributeValue(attributes, name) {
68
+ const marker = `${name}="`;
69
+ const start = attributes.indexOf(marker);
70
+ if (start < 0)
71
+ return undefined;
72
+ const valueStart = start + marker.length;
73
+ const end = attributes.indexOf('"', valueStart);
74
+ return end > valueStart ? attributes.slice(valueStart, end) : undefined;
75
+ }
76
+ function selfClosingAttributes(entry, tag) {
77
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a self-closing Atom tag carries its attributes in the tag itself: `<tag … />`; the expression is built per tag name.
78
+ const expression = new RegExp(`<${tag}\\b([^>]*)/>`, "g");
79
+ const values = [];
34
80
  let match;
35
- while ((match = expression.exec(entry)) !== null) {
36
- const attributes = match[1];
81
+ while ((match = expression.exec(entry)) !== null)
82
+ values.push(presentAt(match, 1, `the attributes of ${tag}`));
83
+ return values;
84
+ }
85
+ function linkAttribute(entry, predicate) {
86
+ for (const attributes of selfClosingAttributes(entry, "link")) {
37
87
  if (predicate(attributes))
38
- return attributes.match(/href="([^"]+)"/)?.[1];
88
+ return attributeValue(attributes, "href");
39
89
  }
40
90
  return undefined;
41
91
  }
42
92
  function categoryTerms(entry) {
43
- const expression = /<category\b([^>]*)\/>/g;
44
93
  const terms = [];
45
- let match;
46
- while ((match = expression.exec(entry)) !== null) {
47
- const term = match[1].match(/term="([^"]+)"/)?.[1];
94
+ for (const attributes of selfClosingAttributes(entry, "category")) {
95
+ const term = attributeValue(attributes, "term");
48
96
  if (term !== undefined)
49
97
  terms.push(term);
50
98
  }
51
99
  return terms;
52
100
  }
101
+ function afterMarker(text, marker) {
102
+ const start = text.indexOf(marker);
103
+ if (start < 0)
104
+ return undefined;
105
+ const rest = text.slice(start + marker.length);
106
+ return rest.length > 0 ? rest : undefined;
107
+ }
108
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the Atom envelope probe: a `<feed` element opens the document; the word boundary keeps a longer element name from passing.
109
+ const ATOM_FEED_ELEMENT = /<feed\b/;
53
110
  export function parseArxivAtom(xml) {
54
- return extractEntries(xml).flatMap((entry) => {
111
+ return allMatches(xml, "entry").flatMap((entry) => {
55
112
  const rawId = firstMatch(entry, "id");
56
113
  const title = firstMatch(entry, "title");
57
114
  if (rawId === undefined || title === undefined)
58
115
  return [];
59
- const idMatch = rawId.match(/abs\/(.+)$/);
116
+ const idMatch = afterMarker(rawId, "abs/");
60
117
  const authors = allMatches(entry, "author")
61
118
  .map((author) => firstMatch(author, "name"))
62
119
  .filter((name) => name !== undefined)
63
120
  .map(collapseWhitespace);
64
- const htmlUrl = linkAttribute(entry, (attributes) => /rel="alternate"/.test(attributes) && /type="text\/html"/.test(attributes));
65
- const pdfUrl = linkAttribute(entry, (attributes) => /title="pdf"/.test(attributes));
121
+ const htmlUrl = linkAttribute(entry, (attributes) => attributes.includes('rel="alternate"') && attributes.includes('type="text/html"'));
122
+ const pdfUrl = linkAttribute(entry, (attributes) => attributes.includes('title="pdf"'));
66
123
  return [
67
124
  {
68
- id: idMatch?.[1] ?? collapseWhitespace(rawId),
125
+ id: idMatch ?? collapseWhitespace(rawId),
69
126
  title: collapseWhitespace(title),
70
127
  abstract: collapseWhitespace(firstMatch(entry, "summary") ?? ""),
71
128
  authors,
72
129
  published: collapseWhitespace(firstMatch(entry, "published") ?? ""),
73
130
  categories: categoryTerms(entry),
74
131
  url: htmlUrl ?? collapseWhitespace(rawId),
75
- ...(pdfUrl === undefined ? {} : { pdfUrl }),
132
+ pdfUrl,
76
133
  },
77
134
  ];
78
135
  });
@@ -82,7 +139,7 @@ export function createArxivSource(options = {}) {
82
139
  const result = await requestText(`${BASE_URL}?${params}`, options, signal);
83
140
  if (result.status !== "ok")
84
141
  return result;
85
- if (!/<feed\b/.test(result.value))
142
+ if (!ATOM_FEED_ELEMENT.test(result.value))
86
143
  return { status: "unavailable", detail: "response schema mismatch: missing Atom feed" };
87
144
  return { status: "ok", value: parseArxivAtom(result.value) };
88
145
  }
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export interface SourceHttpOptions {
2
+ export type SourceHttpOptions = {
3
3
  readonly fetch?: typeof globalThis.fetch;
4
4
  /**
5
5
  * Admission gate wrapped around each network attempt — a rate limiter, a
@@ -13,7 +13,7 @@ export interface SourceHttpOptions {
13
13
  /** Ceiling on any single retry wait, including one a server asks for via `Retry-After`. */
14
14
  readonly maxRetryDelayMs?: number;
15
15
  readonly sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
16
- }
16
+ };
17
17
  export type SourceHttpResult<T> = {
18
18
  readonly status: "ok";
19
19
  readonly value: T;
@@ -1,20 +1,21 @@
1
+ import { errorOf, errorMessageOf } from "../../lib/thrown.js";
2
+ import { textOf } from "../../lib/unknown-text.js";
3
+ import { setTimeout as timerSleep } from "node:timers/promises";
1
4
  const RETRYABLE_STATUSES = new Set([429, 503]);
2
5
  function cancellationReason(signal) {
3
- return signal.reason instanceof Error ? signal.reason : new DOMException("The operation was aborted", "AbortError");
6
+ return errorOf(signal.reason) ?? new DOMException("The operation was aborted", "AbortError");
4
7
  }
5
8
  async function delay(ms, signal) {
6
- if (signal?.aborted)
9
+ if (signal === undefined) {
10
+ await timerSleep(ms);
11
+ return;
12
+ }
13
+ if (signal.aborted)
14
+ throw cancellationReason(signal);
15
+ // The node wait's abort rejection is a fresh AbortError instead of the signal's
16
+ // reason under the Bun test runtime, so the catch restores this contract's reason.
17
+ await timerSleep(ms, undefined, { signal }).catch(() => {
7
18
  throw cancellationReason(signal);
8
- await new Promise((resolve, reject) => {
9
- const onAbort = () => {
10
- clearTimeout(timeout);
11
- reject(cancellationReason(signal));
12
- };
13
- const timeout = setTimeout(() => {
14
- signal?.removeEventListener("abort", onAbort);
15
- resolve();
16
- }, ms);
17
- signal?.addEventListener("abort", onAbort, { once: true });
18
19
  });
19
20
  }
20
21
  function retryAfterMilliseconds(response) {
@@ -66,7 +67,7 @@ async function request(url, options, signal, init) {
66
67
  await sleep(backoff(attempt), signal);
67
68
  continue;
68
69
  }
69
- return { status: "unavailable", detail: error instanceof Error ? error.message : String(error) };
70
+ return { status: "unavailable", detail: errorMessageOf(error) ?? textOf(error) };
70
71
  }
71
72
  }
72
73
  }
@@ -81,7 +82,7 @@ export async function requestJson(url, schema, options, signal, init = {}) {
81
82
  return { status: "ok", value: parsed.data };
82
83
  }
83
84
  catch (error) {
84
- return { status: "unavailable", detail: `invalid JSON response: ${error instanceof Error ? error.message : String(error)}` };
85
+ return { status: "unavailable", detail: `invalid JSON response: ${errorMessageOf(error) ?? textOf(error)}` };
85
86
  }
86
87
  }
87
88
  export async function requestText(url, options, signal, init = {}) {
@@ -92,6 +93,6 @@ export async function requestText(url, options, signal, init = {}) {
92
93
  return { status: "ok", value: await response.value.text() };
93
94
  }
94
95
  catch (error) {
95
- return { status: "unavailable", detail: `invalid text response: ${error instanceof Error ? error.message : String(error)}` };
96
+ return { status: "unavailable", detail: `invalid text response: ${errorMessageOf(error) ?? textOf(error)}` };
96
97
  }
97
98
  }
@@ -1,33 +1,33 @@
1
1
  import { type SourceHttpOptions, type SourceHttpResult } from "./http.js";
2
2
  export declare const NCBI_BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
3
3
  export declare const NCBI_IDCONV = "https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0";
4
- export interface PubmedSourceOptions extends SourceHttpOptions {
4
+ export type PubmedSourceOptions = SourceHttpOptions & {
5
5
  readonly apiKey?: string;
6
- }
7
- export interface PubmedSearchOptions {
6
+ };
7
+ export type PubmedSearchOptions = {
8
8
  readonly maxResults?: number;
9
9
  readonly sort?: "relevance" | "date";
10
10
  readonly dateRange?: {
11
11
  readonly from: string;
12
12
  readonly to: string;
13
13
  };
14
- }
15
- export interface PubmedCitationFields {
14
+ };
15
+ export type PubmedCitationFields = {
16
16
  readonly venue?: string;
17
17
  readonly year?: string | number;
18
18
  readonly volume?: string;
19
19
  readonly firstPage?: string;
20
20
  readonly firstAuthor?: string;
21
21
  readonly key: string;
22
- }
23
- export interface PubMedSummary {
22
+ };
23
+ export type PubMedSummary = {
24
24
  pmid: string;
25
25
  title: string;
26
26
  journal: string;
27
27
  year: string;
28
28
  authors: string;
29
- }
30
- export interface ArticleDetail {
29
+ };
30
+ export type ArticleDetail = {
31
31
  pmid: string;
32
32
  title: string;
33
33
  abstract: string;
@@ -37,16 +37,16 @@ export interface ArticleDetail {
37
37
  doi: string;
38
38
  meshTerms: string[];
39
39
  pmcId: string | null;
40
- }
41
- export interface ArticleSection {
40
+ };
41
+ export type ArticleSection = {
42
42
  heading: string;
43
43
  text: string;
44
- }
45
- export interface FullTextResult {
44
+ };
45
+ export type FullTextResult = {
46
46
  fullText: string;
47
47
  sections: ArticleSection[];
48
- }
49
- export interface PubmedSource {
48
+ };
49
+ export type PubmedSource = {
50
50
  search(query: string, options?: PubmedSearchOptions, signal?: AbortSignal): Promise<SourceHttpResult<{
51
51
  totalFound: number;
52
52
  results: PubMedSummary[];
@@ -59,7 +59,7 @@ export interface PubmedSource {
59
59
  notFound: string[];
60
60
  }>>;
61
61
  fetchFullText(pmcId: string, signal?: AbortSignal): Promise<SourceHttpResult<FullTextResult | null>>;
62
- }
62
+ };
63
63
  export declare function ncbiUrl(apiKey: string | undefined, base: string, params: Record<string, string | number | undefined>): string;
64
64
  export declare function parseEsummary(xml: string): PubMedSummary[];
65
65
  export declare function parseEfetch(xml: string): ArticleDetail[];
@@ -1,6 +1,10 @@
1
+ import { textOf } from "../../lib/unknown-text.js";
1
2
  import { XMLParser } from "fast-xml-parser";
2
3
  import { z } from "zod";
3
4
  import { requestJson, requestText } from "./http.js";
5
+ import { isAllDigits, splitLines } from "../../lib/text.js";
6
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the PubmedArticleSet envelope probe; the word boundary keeps a longer element name from passing.
7
+ const PUBMED_ARTICLE_SET_ELEMENT = /<PubmedArticleSet\b/;
4
8
  export const NCBI_BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
5
9
  export const NCBI_IDCONV = "https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0";
6
10
  const EsearchResponseSchema = z.object({
@@ -29,33 +33,63 @@ const xmlParser = new XMLParser({
29
33
  // then crashes the year extraction in `parseEsummary`.
30
34
  parseTagValue: false,
31
35
  });
36
+ function isRecord(value) {
37
+ return typeof value === "object" && value !== null;
38
+ }
39
+ /** The string the record holds at `key`, or `undefined` when the key is absent or holds a non-string. The XML parser is configured with `parseTagValue: false`, so every text node arrives as a string. */
40
+ function stringField(record, key) {
41
+ const value = record[key];
42
+ return typeof value === "string" ? value : undefined;
43
+ }
44
+ function parseXmlRecord(xml) {
45
+ const parsed = xmlParser.parse(xml);
46
+ return isRecord(parsed) ? parsed : undefined;
47
+ }
48
+ function childRecord(value, key) {
49
+ if (!isRecord(value))
50
+ return undefined;
51
+ const child = value[key];
52
+ return isRecord(child) ? child : undefined;
53
+ }
54
+ function recordList(value) {
55
+ if (value === undefined)
56
+ return [];
57
+ if (Array.isArray(value))
58
+ return value.filter(isRecord);
59
+ return isRecord(value) ? [value] : [];
60
+ }
61
+ function isDocSumItem(value) {
62
+ return typeof value === "object" && value !== null;
63
+ }
64
+ function itemOf(value) {
65
+ if (value === undefined)
66
+ return [];
67
+ return (Array.isArray(value) ? value : [value]).filter(isDocSumItem);
68
+ }
32
69
  function getItemValue(items, name) {
33
- if (items === undefined)
34
- return "";
35
- const item = (Array.isArray(items) ? items : [items]).find((candidate) => candidate["@_Name"] === name);
70
+ const item = itemOf(items).find((candidate) => candidate["@_Name"] === name);
36
71
  return item?.["#text"] ?? "";
37
72
  }
38
73
  function getAuthorsFromDocSum(items) {
39
- if (items === undefined)
40
- return "";
41
- const authorList = (Array.isArray(items) ? items : [items]).find((item) => item["@_Name"] === "AuthorList");
74
+ const authorList = itemOf(items).find((item) => item["@_Name"] === "AuthorList");
42
75
  if (authorList?.Item === undefined)
43
76
  return "";
44
- const names = (Array.isArray(authorList.Item) ? authorList.Item : [authorList.Item]).map((author) => author["#text"] ?? "").filter(Boolean);
77
+ const names = itemOf(authorList.Item)
78
+ .map((author) => author["#text"] ?? "")
79
+ .filter(Boolean);
45
80
  if (names.length <= 3)
46
81
  return names.join(", ");
47
- return `${names[0]} et al.`;
82
+ return `${String(names[0])} et al.`;
48
83
  }
49
84
  export function parseEsummary(xml) {
50
- const parsed = xmlParser.parse(xml);
51
- const docSums = (parsed?.eSummaryResult ?? parsed)?.DocSum;
85
+ const parsed = parseXmlRecord(xml);
86
+ const docSums = (childRecord(parsed, "eSummaryResult") ?? parsed)?.DocSum;
52
87
  if (docSums === undefined)
53
88
  return [];
54
- const documents = Array.isArray(docSums) ? docSums : [docSums];
55
- return documents.map((document) => {
89
+ return recordList(docSums).map((document) => {
56
90
  const publicationDate = getItemValue(document.Item, "PubDate");
57
91
  return {
58
- pmid: String(document.Id ?? ""),
92
+ pmid: textOf(document.Id ?? ""),
59
93
  title: getItemValue(document.Item, "Title"),
60
94
  journal: getItemValue(document.Item, "FullJournalName") || getItemValue(document.Item, "Source"),
61
95
  year: publicationDate.slice(0, 4),
@@ -64,57 +98,56 @@ export function parseEsummary(xml) {
64
98
  });
65
99
  }
66
100
  export function parseEfetch(xml) {
67
- const articleSet = xmlParser.parse(xml)?.PubmedArticleSet;
101
+ const articleSet = childRecord(parseXmlRecord(xml), "PubmedArticleSet");
68
102
  if (articleSet === undefined)
69
103
  return [];
70
- const entries = Array.isArray(articleSet.PubmedArticle)
71
- ? articleSet.PubmedArticle
72
- : articleSet.PubmedArticle === undefined
73
- ? []
74
- : [articleSet.PubmedArticle];
104
+ const entries = recordList(articleSet.PubmedArticle);
75
105
  return entries.map((entry) => {
76
- const article = entry;
77
- const citation = article.MedlineCitation;
78
- const articleData = citation?.Article;
106
+ const citation = childRecord(entry, "MedlineCitation");
107
+ const articleData = childRecord(citation, "Article");
79
108
  const pmidValue = citation?.PMID;
80
- const pmid = typeof pmidValue === "object" && pmidValue !== null ? String(pmidValue["#text"] ?? "") : String(pmidValue ?? "");
81
- const abstractValue = articleData?.Abstract?.AbstractText;
109
+ const pmid = isRecord(pmidValue) ? textOf(pmidValue["#text"] ?? "") : textOf(pmidValue ?? "");
110
+ const abstractValue = childRecord(articleData, "Abstract")?.AbstractText;
82
111
  const abstract = (abstractValue === undefined ? [] : Array.isArray(abstractValue) ? abstractValue : [abstractValue])
83
112
  .map((value) => {
84
113
  if (typeof value === "string")
85
114
  return value;
86
- if (typeof value !== "object" || value === null)
115
+ if (!isRecord(value))
87
116
  return String(value);
88
- const object = value;
89
- const text = String(object["#text"] ?? "");
90
- return object["@_Label"] === undefined ? text : `${String(object["@_Label"])}: ${text}`;
117
+ const text = textOf(value["#text"] ?? "");
118
+ return value["@_Label"] === undefined ? text : `${textOf(value["@_Label"])}: ${text}`;
91
119
  })
92
120
  .join("\n\n");
93
- const authorValue = articleData?.AuthorList?.Author;
94
- const authors = (authorValue === undefined ? [] : Array.isArray(authorValue) ? authorValue : [authorValue]).map((author) => author.CollectiveName ?? [author.ForeName ?? author.Initials, author.LastName].filter(Boolean).join(" "));
95
- const journalData = articleData?.Journal;
96
- const publicationDate = journalData?.JournalIssue?.PubDate;
121
+ const authors = recordList(childRecord(articleData, "AuthorList")?.Author).map((author) => {
122
+ const collectiveName = stringField(author, "CollectiveName");
123
+ if (collectiveName !== undefined)
124
+ return collectiveName;
125
+ return [stringField(author, "ForeName") ?? stringField(author, "Initials"), stringField(author, "LastName")].filter(Boolean).join(" ");
126
+ });
127
+ const journalData = childRecord(articleData, "Journal");
128
+ const publicationDate = childRecord(childRecord(journalData, "JournalIssue"), "PubDate");
97
129
  let doi = "";
98
- const articleIds = article.PubmedData?.ArticleIdList?.ArticleId;
99
- for (const id of articleIds === undefined ? [] : Array.isArray(articleIds) ? articleIds : [articleIds]) {
100
- if (typeof id === "object" && id !== null && id["@_IdType"] === "doi") {
101
- doi = String(id["#text"] ?? "");
130
+ const articleIds = childRecord(childRecord(childRecord(entry, "PubmedData"), "ArticleIdList"), "ArticleId");
131
+ for (const id of recordList(articleIds)) {
132
+ if (stringField(id, "@_IdType") === "doi") {
133
+ doi = stringField(id, "#text") ?? "";
102
134
  }
103
135
  }
104
- const meshValue = citation?.MeshHeadingList?.MeshHeading;
105
- const meshTerms = (meshValue === undefined ? [] : Array.isArray(meshValue) ? meshValue : [meshValue])
136
+ const meshTerms = recordList(childRecord(citation, "MeshHeadingList")?.MeshHeading)
106
137
  .map((heading) => {
107
138
  const descriptor = heading.DescriptorName;
108
- return typeof descriptor === "string" ? descriptor : (descriptor?.["#text"] ?? "");
139
+ if (typeof descriptor === "string")
140
+ return descriptor;
141
+ return isRecord(descriptor) ? textOf(descriptor["#text"] ?? "") : "";
109
142
  })
110
143
  .filter(Boolean);
111
144
  return {
112
145
  pmid,
113
- title: String(articleData?.ArticleTitle ?? ""),
146
+ title: textOf(articleData?.ArticleTitle ?? ""),
114
147
  abstract,
115
148
  authors,
116
- journal: String(journalData?.Title ?? journalData?.ISOAbbreviation ?? ""),
117
- year: String(publicationDate?.Year ?? ""),
149
+ journal: textOf(journalData?.Title ?? journalData?.ISOAbbreviation ?? ""),
150
+ year: textOf(publicationDate?.Year ?? ""),
118
151
  doi,
119
152
  meshTerms,
120
153
  pmcId: null,
@@ -123,23 +156,24 @@ export function parseEfetch(xml) {
123
156
  }
124
157
  export function parseIdConvResponse(data) {
125
158
  const result = new Map();
126
- const records = data?.records ?? [];
127
- for (const record of records)
159
+ const parsed = IdConvResponseSchema.safeParse(data);
160
+ for (const record of parsed.success ? (parsed.data.records ?? []) : []) {
128
161
  if (record.pmid !== undefined && record.pmcid !== undefined)
129
162
  result.set(record.pmid, record.pmcid);
163
+ }
130
164
  return result;
131
165
  }
132
166
  function flattenTextContent(node) {
133
167
  if (typeof node === "string" || typeof node === "number")
134
168
  return String(node);
135
- if (node === null || typeof node !== "object")
169
+ if (!isRecord(node))
136
170
  return "";
137
171
  return Object.entries(node)
138
172
  .flatMap(([key, value]) => {
139
173
  if (key.startsWith("@_") || key === "fig" || key === "table-wrap" || key === "supplementary-material")
140
174
  return [];
141
175
  if (key === "#text")
142
- return [String(value)];
176
+ return [textOf(value)];
143
177
  return Array.isArray(value) ? value.map(flattenTextContent) : [flattenTextContent(value)];
144
178
  })
145
179
  .filter(Boolean)
@@ -155,23 +189,22 @@ function extractParagraphs(container) {
155
189
  .join("\n\n");
156
190
  }
157
191
  function extractSection(section, output) {
158
- if (section === null || typeof section !== "object")
192
+ if (!isRecord(section))
159
193
  return;
160
- const object = section;
161
- const text = extractParagraphs(object);
194
+ const text = extractParagraphs(section);
162
195
  if (text)
163
- output.push({ heading: typeof object.title === "string" ? object.title : "", text });
164
- const nested = object.sec;
196
+ output.push({ heading: typeof section.title === "string" ? section.title : "", text });
197
+ const nested = section.sec;
165
198
  for (const child of nested === undefined ? [] : Array.isArray(nested) ? nested : [nested])
166
199
  extractSection(child, output);
167
200
  }
168
201
  export function parsePmcFullText(xml) {
169
- const article = xmlParser.parse(xml)?.["pmc-articleset"]?.article;
170
- const body = article?.body;
202
+ const article = childRecord(parseXmlRecord(xml), "pmc-articleset")?.article;
203
+ const body = childRecord(article, "body");
171
204
  if (body === undefined)
172
205
  return null;
173
206
  const sections = [];
174
- for (const section of body.sec === undefined ? [] : Array.isArray(body.sec) ? body.sec : [body.sec])
207
+ for (const section of recordList(body.sec))
175
208
  extractSection(section, sections);
176
209
  if (sections.length === 0) {
177
210
  const text = extractParagraphs(body);
@@ -213,7 +246,7 @@ export function createPubmedSource(options = {}) {
213
246
  const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, { db: "pubmed", id: pmids.join(","), rettype: "xml", retmode: "xml" }), options, signal);
214
247
  if (result.status !== "ok")
215
248
  return result;
216
- if (!/<PubmedArticleSet\b/.test(result.value))
249
+ if (!PUBMED_ARTICLE_SET_ELEMENT.test(result.value))
217
250
  return { status: "unavailable", detail: "response schema mismatch: missing PubmedArticleSet" };
218
251
  return { status: "ok", value: parseEfetch(result.value) };
219
252
  }
@@ -238,12 +271,9 @@ export function createPubmedSource(options = {}) {
238
271
  const result = await requestText(url(`${NCBI_BASE}/ecitmatch.cgi`, { db: "pubmed", rettype: "xml", bdata }), options, signal);
239
272
  if (result.status !== "ok")
240
273
  return result;
241
- const pmids = result.value
242
- .trim()
243
- .split(/\r?\n/)
244
- .flatMap((line) => {
274
+ const pmids = splitLines(result.value.trim()).flatMap((line) => {
245
275
  const value = line.split("|").at(-1)?.trim();
246
- return value !== undefined && /^\d+$/.test(value) ? [value] : [];
276
+ return value !== undefined && value.length > 0 && isAllDigits(value) ? [value] : [];
247
277
  });
248
278
  return { status: "ok", value: pmids };
249
279
  },
@@ -264,7 +294,12 @@ export function createPubmedSource(options = {}) {
264
294
  return { status: "ok", value: { articles: articlesResult.value, notFound: pmids.filter((pmid) => !found.has(pmid)) } };
265
295
  },
266
296
  async fetchFullText(pmcId, signal) {
267
- const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, { db: "pmc", id: pmcId.replace(/^PMC/i, ""), rettype: "xml", retmode: "xml" }), options, signal);
297
+ const result = await requestText(url(`${NCBI_BASE}/efetch.fcgi`, {
298
+ db: "pmc",
299
+ id: pmcId.slice(0, 3).toLowerCase() === "pmc" ? pmcId.slice(3) : pmcId,
300
+ rettype: "xml",
301
+ retmode: "xml",
302
+ }), options, signal);
268
303
  return result.status === "ok" ? { status: "ok", value: parsePmcFullText(result.value) } : result;
269
304
  },
270
305
  };
@@ -33,7 +33,7 @@ export declare const SearchResponseSchema: z.ZodObject<{
33
33
  externalIds: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>>;
34
34
  }, z.core.$loose>>>;
35
35
  }, z.core.$strip>;
36
- export interface SemanticScholarPaper {
36
+ export type SemanticScholarPaper = {
37
37
  id: string;
38
38
  title?: string;
39
39
  abstract?: string;
@@ -43,16 +43,16 @@ export interface SemanticScholarPaper {
43
43
  url?: string;
44
44
  authors: string[];
45
45
  externalIds?: Record<string, string>;
46
- }
47
- export interface SemanticScholarSearchPaper extends SemanticScholarPaper {
46
+ };
47
+ export type SemanticScholarSearchPaper = SemanticScholarPaper & {
48
48
  title: string;
49
- }
50
- export interface SemanticScholarSourceOptions extends SourceHttpOptions {
49
+ };
50
+ export type SemanticScholarSourceOptions = SourceHttpOptions & {
51
51
  readonly apiKey?: string;
52
- }
53
- export interface SemanticScholarSource {
52
+ };
53
+ export type SemanticScholarSource = {
54
54
  search(query: string, limit: number, signal?: AbortSignal): Promise<SourceHttpResult<SemanticScholarSearchPaper[]>>;
55
55
  lookupIdentifier(identifier: string, signal?: AbortSignal): Promise<SourceHttpResult<SemanticScholarPaper>>;
56
- }
56
+ };
57
57
  export declare function parseSemanticScholarResponse(raw: unknown): SemanticScholarSearchPaper[];
58
58
  export declare function createSemanticScholarSource(options?: SemanticScholarSourceOptions): SemanticScholarSource;