@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
@@ -12,16 +12,16 @@
12
12
  * owns eviction, coalescing, and expiry — the deep, drift-prone plumbing.
13
13
  */
14
14
  import { ResultAsync } from "neverthrow";
15
- export interface CachedResolverMetrics {
15
+ export type CachedResolverMetrics = {
16
16
  onHit(): void;
17
17
  /** Recorded once per upstream fetch — coalesced callers do not count. */
18
18
  onMiss(): void;
19
- }
20
- export interface CachedResolverConfig<In, Out, E> {
19
+ };
20
+ export type CachedResolverConfig<In, Out, E> = {
21
21
  readonly ttlMs: number;
22
22
  readonly maxEntries: number;
23
23
  readonly keyFn: (input: In) => string;
24
24
  readonly fetch: (input: In) => ResultAsync<Out, E>;
25
25
  readonly metrics?: CachedResolverMetrics;
26
- }
26
+ };
27
27
  export declare function createCachedResolver<In, Out, E>(cfg: CachedResolverConfig<In, Out, E>): (input: In) => ResultAsync<Out, E>;
@@ -6,21 +6,18 @@
6
6
  * external running-charge bracket; OSS wires a no-op. The harness only ever sees this
7
7
  * interface — the body brackets the run, the embedder owns the ledger.
8
8
  *
9
- * `open` is a gate: an `err` ends the run before a step starts, or suspends it
10
- * when the host asks. `close` is a notice: an `err` is logged, and the terminal
9
+ * `open` is a gate: an `err` ends the run before a step starts, or pauses it
10
+ * when the host sets the suspend flag. `close` is a notice: an `err` is logged, and the terminal
11
11
  * status of the run does not change (see `lib/hooks.ts`).
12
12
  */
13
13
  import type { ResultAsync } from "neverthrow";
14
14
  import type { AgentSession } from "../auth/types.js";
15
15
  import type { GateFailure, NoticeFailure } from "../lib/hooks.js";
16
- /** A suspension carries the reason of the host, which the harness does not read. */
16
+ /** The outcome of a run that ended. A paused run does not end, thus it closes no charge. */
17
17
  export type RunChargeOutcome = {
18
18
  readonly kind: "ok" | "error" | "canceled";
19
- } | {
20
- readonly kind: "suspended";
21
- readonly reason: string;
22
19
  };
23
- export interface RunCharge {
20
+ export type RunCharge = {
24
21
  /** Open the run's running charge at init. */
25
22
  open(args: {
26
23
  analysisId: string;
@@ -34,4 +31,4 @@ export interface RunCharge {
34
31
  outcome: RunChargeOutcome;
35
32
  session: AgentSession;
36
33
  }): ResultAsync<void, NoticeFailure>;
37
- }
34
+ };
@@ -6,8 +6,8 @@
6
6
  * external running-charge bracket; OSS wires a no-op. The harness only ever sees this
7
7
  * interface — the body brackets the run, the embedder owns the ledger.
8
8
  *
9
- * `open` is a gate: an `err` ends the run before a step starts, or suspends it
10
- * when the host asks. `close` is a notice: an `err` is logged, and the terminal
9
+ * `open` is a gate: an `err` ends the run before a step starts, or pauses it
10
+ * when the host sets the suspend flag. `close` is a notice: an `err` is logged, and the terminal
11
11
  * status of the run does not change (see `lib/hooks.ts`).
12
12
  */
13
13
  export {};
@@ -15,16 +15,16 @@ import type { Scope } from "../auth/types.js";
15
15
  import type { NoticeFailure } from "../lib/hooks.js";
16
16
  import type { ChatUsage } from "../providers/types.js";
17
17
  /** One completed LLM call's token usage, with the attribution held at the call site. */
18
- export interface LlmUsageRecord {
18
+ export type LlmUsageRecord = {
19
19
  /**
20
20
  * Idempotency key. Stable across every replay of the same call: under a
21
21
  * `RunFrame` it composes the `runId`, the frame's `stepId` when it carries
22
22
  * one, the session's provenance call path, the dispatching tool call's id
23
- * when the loop runs nested inside one, and the loop's deterministic step
24
- * name; outside a `RunFrame` (the chat path, where no replay exists) it is
25
- * freshly minted. Every component past the frame is load-bearing, because
26
- * a step name is unique only within one loop invocation and loops routinely
27
- * share a frame: the `stepId` keeps sibling step workflows of one run
23
+ * when the loop runs nested inside one, and the response id of the call,
24
+ * which the checkpoint of the call keeps; outside a `RunFrame` (the chat
25
+ * path, where no replay exists) it is freshly minted. Every component past
26
+ * the frame is load-bearing, because loops routinely share a frame: the
27
+ * `stepId` keeps sibling step workflows of one run
28
28
  * apart, the call path keeps distinct agent chains under one frame apart,
29
29
  * and the invocation id keeps parallel dispatches of one sub-agent apart.
30
30
  * The harness guarantees key stability, not at-most-once delivery —
@@ -48,7 +48,7 @@ export interface LlmUsageRecord {
48
48
  readonly servedModelId?: string;
49
49
  /** What the provider reported. Unreported figures stay absent, never zeroed. */
50
50
  readonly usage: ChatUsage;
51
- }
51
+ };
52
52
  /**
53
53
  * Records one `LlmUsageRecord` per completed LLM call.
54
54
  *
@@ -59,6 +59,6 @@ export interface LlmUsageRecord {
59
59
  * make a run slower, but a realization that throws before it returns a
60
60
  * `ResultAsync` still fails the run it was only meant to observe.
61
61
  */
62
- export interface UsageRecorder {
62
+ export type UsageRecorder = {
63
63
  record(record: LlmUsageRecord): ResultAsync<void, NoticeFailure>;
64
- }
64
+ };
@@ -35,7 +35,7 @@ export function aggregateCitationResolution(input, normalized, sourceOutcomes, m
35
35
  normalized,
36
36
  sourceOutcomes: [...sourceOutcomes],
37
37
  candidates,
38
- ...(selected === undefined ? {} : { selectedClusterId: selected.id }),
38
+ selectedClusterId: selected?.id,
39
39
  comparisons,
40
40
  conflicts: detectCitationConflicts(candidates),
41
41
  verdict,
@@ -1,6 +1,6 @@
1
1
  import type { CitationSourceClient } from "../types.js";
2
2
  import type { SourceHttpOptions } from "../../literature/sources/http.js";
3
- export interface ArxivCitationClientOptions extends SourceHttpOptions {
3
+ export type ArxivCitationClientOptions = SourceHttpOptions & {
4
4
  readonly maxCandidates?: number;
5
- }
5
+ };
6
6
  export declare function createArxivCitationClient(options?: ArxivCitationClientOptions): CitationSourceClient;
@@ -10,7 +10,7 @@ function arxivRecord(paper) {
10
10
  identifiers: { arxiv: identifier },
11
11
  title: paper.title,
12
12
  authors: paper.authors,
13
- ...(year === undefined ? {} : { year }),
13
+ year,
14
14
  venue: "arXiv",
15
15
  url: paper.url,
16
16
  };
@@ -22,9 +22,17 @@ export function createArxivCitationClient(options = {}) {
22
22
  async resolve(request, signal) {
23
23
  if (!request.plan.applicable)
24
24
  return sourceOutcome("arxiv", request.plan.operation, "not_applicable", 0, [], request.plan.reason);
25
- const result = request.plan.operation === "arxiv_exact"
26
- ? await source.lookupExact(request.normalized.identifiers.arxiv, options.maxCandidates ?? 5, signal)
27
- : await source.search({ query: request.input.title ?? request.input.citation, limit: options.maxCandidates ?? 5 }, signal);
25
+ if (request.plan.operation === "arxiv_exact") {
26
+ const arxivId = request.normalized.identifiers.arxiv;
27
+ if (arxivId === undefined)
28
+ return sourceOutcome("arxiv", request.plan.operation, "unavailable", 0, [], "the exact plan carries no arXiv identifier");
29
+ const result = await source.lookupExact(arxivId, options.maxCandidates ?? 5, signal);
30
+ if (result.status !== "ok")
31
+ return sourceOutcome("arxiv", request.plan.operation, result.status, 1, [], result.detail);
32
+ const records = result.value.map(arxivRecord);
33
+ return sourceOutcome("arxiv", request.plan.operation, records.length === 0 ? "no_data" : "ok", 1, records);
34
+ }
35
+ const result = await source.search({ query: request.input.title ?? request.input.citation, limit: options.maxCandidates ?? 5 }, signal);
28
36
  if (result.status !== "ok")
29
37
  return sourceOutcome("arxiv", request.plan.operation, result.status, 1, [], result.detail);
30
38
  const records = result.value.map(arxivRecord);
@@ -1,3 +1,5 @@
1
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a publication year stands alone in untyped metadata; the boundaries keep the tail of a longer number out.
2
+ const YEAR_PATTERN = /\b(1[5-9]\d{2}|20\d{2}|21\d{2})\b/;
1
3
  export function notApplicableOutcome(plan) {
2
4
  return {
3
5
  source: plan.source,
@@ -15,7 +17,7 @@ export function sourceOutcome(source, operation, status, requestCount, records =
15
17
  status,
16
18
  requestCount,
17
19
  records,
18
- ...(detail === undefined ? {} : { detail }),
20
+ detail,
19
21
  };
20
22
  }
21
23
  /**
@@ -31,7 +33,7 @@ export function parseYear(value) {
31
33
  return value;
32
34
  if (typeof value !== "string")
33
35
  return undefined;
34
- const match = value.match(/\b(1[5-9]\d{2}|20\d{2}|21\d{2})\b/);
36
+ const match = value.match(YEAR_PATTERN);
35
37
  return match?.[1] === undefined ? undefined : Number(match[1]);
36
38
  }
37
39
  export function firstNonEmpty(values) {
@@ -1,8 +1,8 @@
1
1
  import type { CitationSourceClient } from "../types.js";
2
2
  import { type SourceHttpOptions } from "../../literature/sources/http.js";
3
- export interface CrossrefClientOptions extends SourceHttpOptions {
3
+ export type CrossrefClientOptions = SourceHttpOptions & {
4
4
  readonly mailto?: string;
5
5
  readonly userAgent?: string;
6
6
  readonly maxCandidates?: number;
7
- }
7
+ };
8
8
  export declare function createCrossrefClient(options?: CrossrefClientOptions): CitationSourceClient;
@@ -1,21 +1,20 @@
1
1
  import { z } from "zod";
2
2
  import { encodeDoiPath, firstNonEmpty, parseYear, sourceOutcome } from "./common.js";
3
+ import { firstSegmentOf } from "../../lib/text.js";
3
4
  import { requestJson } from "../../literature/sources/http.js";
4
- const CrossrefItemSchema = z
5
- .object({
5
+ const CrossrefItemSchema = z.looseObject({
6
6
  DOI: z.string().optional(),
7
7
  URL: z.string().optional(),
8
8
  title: z.array(z.string()).optional(),
9
- author: z.array(z.object({ given: z.string().optional(), family: z.string().optional(), name: z.string().optional() }).passthrough()).optional(),
9
+ author: z.array(z.looseObject({ given: z.string().optional(), family: z.string().optional(), name: z.string().optional() })).optional(),
10
10
  issued: z.object({ "date-parts": z.array(z.array(z.number())).optional() }).optional(),
11
11
  published: z.object({ "date-parts": z.array(z.array(z.number())).optional() }).optional(),
12
12
  "container-title": z.array(z.string()).optional(),
13
13
  volume: z.string().optional(),
14
14
  page: z.string().optional(),
15
- })
16
- .passthrough();
15
+ });
17
16
  const ExactSchema = z.object({ message: CrossrefItemSchema });
18
- const SearchSchema = z.object({ message: z.object({ items: z.array(CrossrefItemSchema) }).passthrough() });
17
+ const SearchSchema = z.object({ message: z.looseObject({ items: z.array(CrossrefItemSchema) }) });
19
18
  function crossrefRecord(item, index) {
20
19
  const doi = item.DOI?.toLocaleLowerCase("en-US");
21
20
  const sourceRecordId = firstNonEmpty([doi, item.URL, `candidate-${index}`]);
@@ -30,14 +29,14 @@ function crossrefRecord(item, index) {
30
29
  return {
31
30
  source: "crossref",
32
31
  sourceRecordId,
33
- identifiers: { ...(doi === undefined ? {} : { doi }) },
34
- ...(title === undefined ? {} : { title }),
35
- ...(authors === undefined || authors.length === 0 ? {} : { authors }),
36
- ...(dateParts?.[0] === undefined ? {} : { year: parseYear(dateParts[0]) }),
37
- ...(venue === undefined ? {} : { venue }),
38
- ...(item.volume === undefined ? {} : { volume: item.volume }),
39
- ...(item.page === undefined ? {} : { firstPage: item.page.split(/[-–]/)[0] }),
40
- ...(item.URL === undefined ? {} : { url: item.URL }),
32
+ identifiers: { doi },
33
+ title,
34
+ authors: authors !== undefined && authors.length > 0 ? authors : undefined,
35
+ year: dateParts?.[0] === undefined ? undefined : parseYear(dateParts[0]),
36
+ venue,
37
+ volume: item.volume,
38
+ firstPage: firstSegmentOf(item.page, "-–"),
39
+ url: item.URL,
41
40
  };
42
41
  }
43
42
  export function createCrossrefClient(options = {}) {
@@ -66,29 +65,30 @@ export function createCrossrefClient(options = {}) {
66
65
  }
67
66
  const doi = request.normalized.identifiers.doi;
68
67
  const exact = request.plan.operation === "crossref_doi_if_owned";
69
- const url = exact
70
- ? (() => {
71
- const target = new URL(`https://api.crossref.org/works/${encodeDoiPath(doi)}`);
72
- if (options.mailto)
73
- target.searchParams.set("mailto", options.mailto);
74
- return target.toString();
75
- })()
76
- : (() => {
77
- const params = new URLSearchParams({
78
- "query.bibliographic": request.input.citation,
79
- rows: String(options.maxCandidates ?? 5),
80
- });
81
- if (options.mailto)
82
- params.set("mailto", options.mailto);
83
- return `https://api.crossref.org/works?${params}`;
84
- })();
85
- const result = exact
86
- ? await requestJson(url, ExactSchema, options, signal, { headers })
87
- : await requestJson(url, SearchSchema, options, signal, { headers });
88
- if (result.status !== "ok")
89
- return sourceOutcome("crossref", request.plan.operation, result.status, 1, [], result.detail);
90
- const items = exact ? [result.value.message] : result.value.message.items;
91
- const records = items.flatMap((item, index) => {
68
+ let url;
69
+ if (exact) {
70
+ if (doi === undefined)
71
+ return sourceOutcome("crossref", request.plan.operation, "unavailable", 0, [], "the exact plan carries no DOI");
72
+ const target = new URL(`https://api.crossref.org/works/${encodeDoiPath(doi)}`);
73
+ if (options.mailto)
74
+ target.searchParams.set("mailto", options.mailto);
75
+ url = target.toString();
76
+ }
77
+ else {
78
+ const params = new URLSearchParams({
79
+ "query.bibliographic": request.input.citation,
80
+ rows: String(options.maxCandidates ?? 5),
81
+ });
82
+ if (options.mailto)
83
+ params.set("mailto", options.mailto);
84
+ url = `https://api.crossref.org/works?${params}`;
85
+ }
86
+ const fetched = exact
87
+ ? await requestJson(url, ExactSchema, options, signal, { headers }).then((result) => result.status === "ok" ? { status: "ok", value: [result.value.message] } : result)
88
+ : await requestJson(url, SearchSchema, options, signal, { headers }).then((result) => result.status === "ok" ? { status: "ok", value: result.value.message.items } : result);
89
+ if (fetched.status !== "ok")
90
+ return sourceOutcome("crossref", request.plan.operation, fetched.status, 1, [], fetched.detail);
91
+ const records = fetched.value.flatMap((item, index) => {
92
92
  const record = crossrefRecord(item, index);
93
93
  return record === undefined ? [] : [record];
94
94
  });
@@ -1,22 +1,21 @@
1
1
  import { z } from "zod";
2
2
  import { encodeDoiPath, firstNonEmpty, parseYear, sourceOutcome } from "./common.js";
3
+ import { firstSegmentOf } from "../../lib/text.js";
3
4
  import { requestJson } from "../../literature/sources/http.js";
4
- const HandleResponseSchema = z.object({ responseCode: z.number() }).passthrough();
5
- const RegistrationAgencySchema = z.array(z.object({ DOI: z.string().optional(), RA: z.string().optional() }).passthrough());
6
- const CslMetadataSchema = z
7
- .object({
5
+ const HandleResponseSchema = z.looseObject({ responseCode: z.number() });
6
+ const RegistrationAgencySchema = z.array(z.looseObject({ DOI: z.string().optional(), RA: z.string().optional() }));
7
+ const CslMetadataSchema = z.looseObject({
8
8
  DOI: z.string().optional(),
9
9
  id: z.string().optional(),
10
10
  title: z.union([z.string(), z.array(z.string())]).optional(),
11
- author: z.array(z.object({ given: z.string().optional(), family: z.string().optional(), literal: z.string().optional() }).passthrough()).optional(),
11
+ author: z.array(z.looseObject({ given: z.string().optional(), family: z.string().optional(), literal: z.string().optional() })).optional(),
12
12
  issued: z.object({ "date-parts": z.array(z.array(z.number())).optional() }).optional(),
13
13
  published: z.object({ "date-parts": z.array(z.array(z.number())).optional() }).optional(),
14
14
  "container-title": z.union([z.string(), z.array(z.string())]).optional(),
15
15
  volume: z.string().optional(),
16
16
  page: z.string().optional(),
17
17
  URL: z.string().optional(),
18
- })
19
- .passthrough();
18
+ });
20
19
  function scalar(value) {
21
20
  return Array.isArray(value) ? firstNonEmpty(value) : firstNonEmpty([value]);
22
21
  }
@@ -31,14 +30,14 @@ function cslRecord(doi, registrationAgency, metadata) {
31
30
  source: "doi_registry",
32
31
  sourceRecordId: doi,
33
32
  identifiers: { doi },
34
- ...(title === undefined ? {} : { title }),
35
- ...(authors === undefined || authors.length === 0 ? {} : { authors }),
36
- ...(dateParts?.[0] === undefined ? {} : { year: parseYear(dateParts[0]) }),
37
- ...(venue === undefined ? {} : { venue }),
38
- ...(metadata?.volume === undefined ? {} : { volume: metadata.volume }),
39
- ...(metadata?.page === undefined ? {} : { firstPage: metadata.page.split(/[-–]/)[0] }),
40
- ...(registrationAgency === undefined ? {} : { registrationAgency }),
41
- ...(metadata?.URL === undefined ? {} : { url: metadata.URL }),
33
+ title,
34
+ authors: authors !== undefined && authors.length > 0 ? authors : undefined,
35
+ year: dateParts?.[0] === undefined ? undefined : parseYear(dateParts[0]),
36
+ venue,
37
+ volume: metadata?.volume,
38
+ firstPage: firstSegmentOf(metadata?.page, "-–"),
39
+ registrationAgency,
40
+ url: metadata?.URL,
42
41
  };
43
42
  }
44
43
  export function createDoiRegistryClient(options = {}) {
@@ -86,7 +85,7 @@ export function createDoiRegistryClient(options = {}) {
86
85
  type: "doi",
87
86
  identifier: doi,
88
87
  exists: true,
89
- ...(registrationAgency === undefined ? {} : { registrationAgency }),
88
+ registrationAgency,
90
89
  metadataAvailable: metadata !== undefined,
91
90
  },
92
91
  };
@@ -1,6 +1,6 @@
1
1
  import type { CitationSourceClient } from "../types.js";
2
2
  import { type PubmedSourceOptions } from "../../literature/sources/pubmed.js";
3
- export interface PubmedCitationClientOptions extends PubmedSourceOptions {
3
+ export type PubmedCitationClientOptions = PubmedSourceOptions & {
4
4
  readonly maxCandidates?: number;
5
- }
5
+ };
6
6
  export declare function createPubmedCitationClient(options?: PubmedCitationClientOptions): CitationSourceClient;
@@ -5,11 +5,11 @@ function pubmedRecord(article) {
5
5
  return {
6
6
  source: "pubmed",
7
7
  sourceRecordId: article.pmid,
8
- identifiers: { pmid: article.pmid, ...(article.doi ? { doi: article.doi.toLocaleLowerCase("en-US") } : {}) },
9
- ...(article.title ? { title: article.title } : {}),
10
- ...(article.authors.length === 0 ? {} : { authors: article.authors }),
11
- ...(year === undefined ? {} : { year }),
12
- ...(article.journal ? { venue: article.journal } : {}),
8
+ identifiers: { pmid: article.pmid, doi: article.doi ? article.doi.toLocaleLowerCase("en-US") : undefined },
9
+ title: article.title ? article.title : undefined,
10
+ authors: article.authors.length > 0 ? article.authors : undefined,
11
+ year,
12
+ venue: article.journal ? article.journal : undefined,
13
13
  url: `https://pubmed.ncbi.nlm.nih.gov/${article.pmid}/`,
14
14
  };
15
15
  }
@@ -21,16 +21,19 @@ export function createPubmedCitationClient(options = {}) {
21
21
  let requestCount = 0;
22
22
  let pmids;
23
23
  if (request.plan.operation === "pubmed_exact") {
24
- pmids = [request.normalized.identifiers.pmid];
24
+ const pmid = request.normalized.identifiers.pmid;
25
+ if (pmid === undefined)
26
+ return sourceOutcome("pubmed", request.plan.operation, "unavailable", 0, [], "the exact plan carries no PMID");
27
+ pmids = [pmid];
25
28
  }
26
29
  else if (request.plan.operation === "pubmed_structured") {
27
30
  requestCount += 1;
28
31
  const match = await source.matchCitation({
29
- ...(request.input.venue === undefined ? {} : { venue: request.input.venue }),
30
- ...(request.input.year === undefined ? {} : { year: request.input.year }),
31
- ...(request.input.volume === undefined ? {} : { volume: request.input.volume }),
32
- ...(request.input.firstPage === undefined ? {} : { firstPage: request.input.firstPage }),
33
- ...(request.input.authors?.[0] === undefined ? {} : { firstAuthor: request.input.authors[0] }),
32
+ venue: request.input.venue,
33
+ year: request.input.year,
34
+ volume: request.input.volume,
35
+ firstPage: request.input.firstPage,
36
+ firstAuthor: request.input.authors?.[0],
34
37
  key: "citation-0",
35
38
  }, signal);
36
39
  if (match.status !== "ok")
@@ -39,7 +42,7 @@ export function createPubmedCitationClient(options = {}) {
39
42
  }
40
43
  else {
41
44
  requestCount += 1;
42
- const term = request.plan.operation === "pubmed_doi" ? `${request.normalized.identifiers.doi}[AID]` : `${request.input.title ?? ""}[Title]`;
45
+ const term = request.plan.operation === "pubmed_doi" ? `${String(request.normalized.identifiers.doi)}[AID]` : `${request.input.title ?? ""}[Title]`;
43
46
  const search = await source.searchIds(term, options.maxCandidates ?? 5, signal);
44
47
  if (search.status !== "ok")
45
48
  return sourceOutcome("pubmed", request.plan.operation, search.status, requestCount, [], search.detail);
@@ -77,7 +80,11 @@ export function createPubmedCitationClient(options = {}) {
77
80
  if (results[index] === undefined)
78
81
  results[index] = await resolve(request, signal);
79
82
  }));
80
- return results.map((result) => result);
83
+ return results.map((result) => {
84
+ if (result === undefined)
85
+ throw new Error("the pubmed batch left an outcome unresolved");
86
+ return result;
87
+ });
81
88
  }
82
89
  return { source: "pubmed", resolve, resolveMany };
83
90
  }
@@ -1,6 +1,6 @@
1
1
  import type { CitationSourceClient } from "../types.js";
2
2
  import { type SemanticScholarSourceOptions } from "../../literature/sources/semantic-scholar.js";
3
- export interface SemanticScholarCitationClientOptions extends SemanticScholarSourceOptions {
3
+ export type SemanticScholarCitationClientOptions = SemanticScholarSourceOptions & {
4
4
  readonly maxCandidates?: number;
5
- }
5
+ };
6
6
  export declare function createSemanticScholarCitationClient(options?: SemanticScholarCitationClientOptions): CitationSourceClient;
@@ -13,16 +13,16 @@ function semanticRecord(paper) {
13
13
  source: "semantic_scholar",
14
14
  sourceRecordId: paper.id,
15
15
  identifiers: {
16
- ...(doi === undefined ? {} : { doi }),
17
- ...(pmid === undefined ? {} : { pmid }),
18
- ...(arxiv === undefined ? {} : { arxiv }),
19
- ...(corpusId === undefined ? {} : { corpusId }),
16
+ doi,
17
+ pmid,
18
+ arxiv,
19
+ corpusId,
20
20
  },
21
- ...(paper.title === undefined ? {} : { title: paper.title }),
22
- ...(paper.authors.length === 0 ? {} : { authors: paper.authors }),
23
- ...(paper.year === undefined ? {} : { year: paper.year }),
24
- ...(paper.venue === undefined ? {} : { venue: paper.venue }),
25
- ...(paper.url === undefined ? {} : { url: paper.url }),
21
+ title: paper.title,
22
+ authors: paper.authors.length > 0 ? paper.authors : undefined,
23
+ year: paper.year,
24
+ venue: paper.venue,
25
+ url: paper.url,
26
26
  };
27
27
  }
28
28
  export function createSemanticScholarCitationClient(options = {}) {
@@ -10,7 +10,7 @@ function recordValue(record, field) {
10
10
  return record[field];
11
11
  }
12
12
  function normalizedValue(field, value) {
13
- if (field === "authors")
13
+ if (field === "authors" && Array.isArray(value))
14
14
  return value.map(normalizeAuthor).sort().join("|");
15
15
  if (field === "year")
16
16
  return String(value);
@@ -20,7 +20,7 @@ function authorMatch(supplied, source) {
20
20
  return supplied.every((author) => source.some((candidate) => authorNamesMatch(author, candidate)));
21
21
  }
22
22
  function fieldMatches(field, supplied, source) {
23
- if (field === "authors")
23
+ if (field === "authors" && Array.isArray(supplied) && Array.isArray(source))
24
24
  return authorMatch(supplied, source);
25
25
  if (field === "year")
26
26
  return Math.abs(Number(supplied) - Number(source)) <= 1;
@@ -1,10 +1,10 @@
1
1
  import type { CitationCandidateCluster, CitationInput, CitationRecord, NormalizedCitation } from "./types.js";
2
- export interface CitationMatchConfig {
2
+ export type CitationMatchConfig = {
3
3
  readonly minimumScore: number;
4
4
  readonly separationMargin: number;
5
5
  readonly clusterSimilarity: number;
6
6
  readonly relatedVersionSimilarity: number;
7
- }
7
+ };
8
8
  export declare const DEFAULT_MATCH_CONFIG: CitationMatchConfig;
9
9
  export declare function tokenSimilarity(left: string, right: string): number;
10
10
  export declare function clusterCitationRecords(input: CitationInput, normalized: NormalizedCitation, records: readonly CitationRecord[], config?: CitationMatchConfig): CitationCandidateCluster[];
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { presentAt } from "../lib/present.js";
2
3
  import { authorNamesMatch, normalizeAuthor, normalizeComparable } from "./normalize.js";
3
4
  export const DEFAULT_MATCH_CONFIG = {
4
5
  minimumScore: 0.72,
@@ -36,7 +37,11 @@ function authorSimilarity(left, right) {
36
37
  return intersection / Math.min(a.length, b.length);
37
38
  }
38
39
  function identifierEntries(identifiers) {
39
- return Object.entries(identifiers).flatMap(([kind, value]) => (value === undefined ? [] : [`${kind}:${value.toLocaleLowerCase("en-US")}`]));
40
+ // Object.entries types the values as `string`, but a record can carry a key set to
41
+ // `undefined` (the clients build `identifiers: { doi }` verbatim), so the entry value
42
+ // is widened to keep the skip of undefined values.
43
+ const entries = Object.entries(identifiers);
44
+ return entries.flatMap(([kind, value]) => (value === undefined ? [] : [`${kind}:${value.toLocaleLowerCase("en-US")}`]));
40
45
  }
41
46
  function sharesStrongIdentifier(left, right) {
42
47
  const rightIds = new Set(identifierEntries(right.identifiers));
@@ -69,7 +74,7 @@ class UnionFind {
69
74
  this.parent = Array.from({ length: size }, (_, index) => index);
70
75
  }
71
76
  find(index) {
72
- const parent = this.parent[index];
77
+ const parent = presentAt(this.parent, index, "the parent link");
73
78
  if (parent === index)
74
79
  return index;
75
80
  const root = this.find(parent);
@@ -111,8 +116,8 @@ function containsId(cluster, key) {
111
116
  function addRelatedVersions(clusters, config) {
112
117
  for (let left = 0; left < clusters.length; left += 1) {
113
118
  for (let right = left + 1; right < clusters.length; right += 1) {
114
- const a = clusters[left];
115
- const b = clusters[right];
119
+ const a = presentAt(clusters, left, "the left cluster");
120
+ const b = presentAt(clusters, right, "the right cluster");
116
121
  const similarity = Math.max(...a.records.flatMap((one) => b.records.map((two) => recordSimilarity(one, two))));
117
122
  if (similarity < config.relatedVersionSimilarity)
118
123
  continue;
@@ -139,8 +144,8 @@ export function clusterCitationRecords(input, normalized, records, config = DEFA
139
144
  const union = new UnionFind(records.length);
140
145
  for (let left = 0; left < records.length; left += 1) {
141
146
  for (let right = left + 1; right < records.length; right += 1) {
142
- const a = records[left];
143
- const b = records[right];
147
+ const a = presentAt(records, left, "the left record");
148
+ const b = presentAt(records, right, "the right record");
144
149
  if (sharesStrongIdentifier(a, b))
145
150
  union.union(left, right);
146
151
  else if ((!hasStrongIdentifier(a) || !hasStrongIdentifier(b)) && recordSimilarity(a, b) >= config.clusterSimilarity)
@@ -150,7 +155,7 @@ export function clusterCitationRecords(input, normalized, records, config = DEFA
150
155
  const grouped = new Map();
151
156
  for (let index = 0; index < records.length; index += 1) {
152
157
  const root = union.find(index);
153
- grouped.set(root, [...(grouped.get(root) ?? []), records[index]]);
158
+ grouped.set(root, [...(grouped.get(root) ?? []), presentAt(records, index, "the record")]);
154
159
  }
155
160
  const clusters = [...grouped.values()].map((members) => ({
156
161
  id: stableClusterId(members),