@inflexa-ai/harness 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -0,0 +1,319 @@
1
+ /**
2
+ * The knowledge service interface of the harness.
3
+ *
4
+ * `KnowledgeClient` is the one contract between the harness and the remote
5
+ * knowledge service: four typed operations and the snapshot they answer
6
+ * from. The harness never knows about a license. It sees a client, or it sees
7
+ * nothing, and an absent client is a normal state in which no knowledge tool
8
+ * attaches. `createHttpKnowledgeClient` is the shipped realization over plain
9
+ * HTTPS with the retry and timeout policy of the other external tools.
10
+ *
11
+ * Every operation answers a data variant. A service that is configured but
12
+ * unreachable gives `{ match: "unavailable" }` after the retry policy, and the
13
+ * caller continues from the prose skills. A 400 names the field and the
14
+ * permitted values, thus a model corrects itself in one turn. A 404 on the
15
+ * contract lookup names the `template` field the same way. The response
16
+ * shapes below are the harness copy of the wire contract of the service, kept
17
+ * lenient with `looseObject`, thus a richer answer of a later snapshot still
18
+ * parses.
19
+ */
20
+ import { z } from "zod";
21
+ import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
22
+ import { parseJsonAs, safeParseJsonAs } from "../../lib/parse-json.js";
23
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
24
+ // ── The answers, as the harness reads them ──────────────────────────
25
+ const SnapshotRefSchema = z.object({ date: z.string(), digest: z.string() });
26
+ /** A method of the catalog by id and label. */
27
+ const MethodRefSchema = z.looseObject({ id: z.string(), label: z.string() });
28
+ /** Two rules of equal specificity and strength disagree on a parameter. The step omits the parameter and names both. */
29
+ const ProcedureConflictSchema = z.looseObject({
30
+ parameter: z.string(),
31
+ entries: z.array(z.looseObject({ rule: z.string(), value: z.json() })),
32
+ });
33
+ /** The step method is a declared substitute: `for` names the method of record it stands in for. */
34
+ const ProcedureSubstitutionSchema = z.looseObject({ for: z.string(), label: z.string(), template: z.string() });
35
+ /**
36
+ * No template of the requested language is eligible; the step keeps the first template that is. A skipped template
37
+ * lacks a design requirement (`missing`), or its slot refuses a value that the rules give (`refused`).
38
+ */
39
+ const ProcedureLimitSchema = z.looseObject({
40
+ requested_language: z.enum(["R", "python"]),
41
+ reason: z.string(),
42
+ skipped: z.array(z.looseObject({ template: z.string(), missing: z.array(z.string()), refused: z.string().optional() })),
43
+ });
44
+ /** The rules select a method for the step, and no template of the method holds: the knowledge covers the step, and no vetted script does. */
45
+ const ProcedureUnrealizedSchema = z.looseObject({
46
+ reason: z.string(),
47
+ templates: z.array(z.looseObject({ template: z.string(), why: z.string() })),
48
+ });
49
+ const ProcedureStepSchema = z.looseObject({
50
+ step: z.string(),
51
+ method: MethodRefSchema.optional(),
52
+ template: z.string().optional(),
53
+ rules: z.array(z.string()),
54
+ flags: z.array(z.looseObject({ rule: z.string(), severity: z.string(), message: z.string(), outcome: z.string().optional() })).optional(),
55
+ alternatives: z.array(z.looseObject({ method: z.string(), label: z.string(), when: z.string(), rules: z.array(z.string()) })).optional(),
56
+ disputed: z.looseObject({ rule: z.string(), sides: z.array(z.string()) }).optional(),
57
+ parameters: z.array(z.looseObject({ name: z.string(), value: z.json(), default_source: z.string().optional() })).optional(),
58
+ conflicts: z.array(ProcedureConflictSchema).optional(),
59
+ substitution: ProcedureSubstitutionSchema.optional(),
60
+ limit: ProcedureLimitSchema.optional(),
61
+ unrealized: ProcedureUnrealizedSchema.optional(),
62
+ /** The runtime package the step installs, when the service names one. */
63
+ package: z.looseObject({ name: z.string() }).optional(),
64
+ /** The forbidden method ids, read defensively by the grounding report. */
65
+ forbids: z.json().optional(),
66
+ });
67
+ const ClaimSchema = z.looseObject({
68
+ id: z.string(),
69
+ statement: z.string(),
70
+ strength: z.string(),
71
+ evidence: z.array(z.looseObject({ doi: z.string().optional(), pmid: z.string().optional(), title: z.string(), year: z.number(), direction: z.string() })),
72
+ });
73
+ export const RecommendResponseSchema = z.looseObject({
74
+ match: z.enum(["applicable", "none", "flag"]),
75
+ snapshot: SnapshotRefSchema,
76
+ procedure: z.array(ProcedureStepSchema),
77
+ uncovered: z.array(z.string()),
78
+ /** The steps whose method has no eligible template in this situation. Absent when none. */
79
+ unrealized: z.array(z.string()).optional(),
80
+ flags: z.array(z.looseObject({ rule: z.string(), severity: z.string(), message: z.string(), outcome: z.string().optional() })),
81
+ claims: z.array(ClaimSchema),
82
+ nearest: z.array(z.looseObject({ claim: z.string(), title: z.string(), failed: z.array(z.string()) })).optional(),
83
+ reason: z.string().optional(),
84
+ });
85
+ const FindingSchema = z.looseObject({
86
+ step_type: z.string(),
87
+ severity: z.string(),
88
+ rule: z.string(),
89
+ message: z.string(),
90
+ permitted: z.array(z.string()).optional(),
91
+ });
92
+ /** A drafted step that no rule covers in the situation: neither passed nor failed. */
93
+ const NotAssessedSchema = z.looseObject({ step_type: z.string(), reason: z.string(), message: z.string() });
94
+ export const CheckResponseSchema = z.looseObject({
95
+ /** True when the assessed steps carry no violation and no warning. A step in `not_assessed` does not count. */
96
+ ok: z.boolean(),
97
+ snapshot: SnapshotRefSchema,
98
+ violations: z.array(FindingSchema),
99
+ warnings: z.array(FindingSchema),
100
+ not_assessed: z.array(NotAssessedSchema).optional(),
101
+ });
102
+ export const RenderResponseSchema = z.looseObject({
103
+ ok: z.literal(true),
104
+ snapshot: SnapshotRefSchema,
105
+ template: z.looseObject({
106
+ id: z.string(),
107
+ version: z.string(),
108
+ label: z.string(),
109
+ /** The method the script runs: the substitute when the template is one. */
110
+ method: MethodRefSchema,
111
+ /** The method of record when the template is a declared substitute. */
112
+ substitute_for: MethodRefSchema.optional(),
113
+ language: z.string(),
114
+ }),
115
+ /** The script with each local slot as its marker `{{name}}`. The host binds the local values before it writes the file. */
116
+ script: z.string(),
117
+ /** A local slot entry has no value: the host binds it. */
118
+ slots: z.array(z.looseObject({
119
+ name: z.string(),
120
+ value: z.json().optional(),
121
+ source: z.string(),
122
+ adaptable: z.boolean(),
123
+ lines: z.array(z.number()),
124
+ read: z.boolean().optional(),
125
+ })),
126
+ /** The local slots the host must bind: each marker still in `script`. */
127
+ local_slots: z.array(z.string()).optional(),
128
+ environment: z.looseObject({ match: z.string() }),
129
+ syntax: z.looseObject({ status: z.string() }),
130
+ outputs: z.array(z.looseObject({ name: z.string(), path: z.string(), description: z.string().optional() })),
131
+ decision_record: z.record(z.string(), z.json()),
132
+ });
133
+ // ── The template contract ───────────────────────────────────────────
134
+ /** A scalar on the wire. */
135
+ const SlotScalarSchema = z.union([z.string(), z.number(), z.boolean()]);
136
+ /** A slot value on the wire: a scalar, or a list of strings — the contract the service states for a default. */
137
+ const SlotValueSchema = z.union([SlotScalarSchema, z.array(z.string())]);
138
+ /**
139
+ * One slot of a template with the constraint a caller value must obey.
140
+ * `adaptable: false` marks a pinned slot: the render refuses a caller value
141
+ * for it. An adaptable slot without a default is required unless `required`
142
+ * is false.
143
+ */
144
+ const TemplateParameterSchema = z.looseObject({
145
+ name: z.string(),
146
+ type: z.string(),
147
+ description: z.string(),
148
+ adaptable: z.boolean(),
149
+ /** True for a slot whose value is a fact of the machine (a path, a column name, a level label, a formula): the host binds it, and the service never sees it. */
150
+ local: z.boolean().optional(),
151
+ required: z.boolean().optional(),
152
+ /** A `null` default is a slot with no default: it parses to an absent value. */
153
+ default: SlotValueSchema.nullish()
154
+ .transform((value) => value ?? undefined)
155
+ .optional(),
156
+ default_source: z.string().optional(),
157
+ enum: z.array(z.string()).optional(),
158
+ pattern: z.string().optional(),
159
+ minimum: z.number().optional(),
160
+ maximum: z.number().optional(),
161
+ });
162
+ /** A file the script reads. The path names the slot that gives it, for example `{{counts_path}}`. */
163
+ const TemplateInputSchema = z.looseObject({ name: z.string(), path: z.string(), description: z.string().optional() });
164
+ /**
165
+ * The contract of one template as `GET /v1/templates/{id}` serves it: every
166
+ * slot, pinned ones included, the inputs, and the outputs. The service adds
167
+ * fields such as `step_types` and `environment`; they pass through the loose
168
+ * remainder.
169
+ */
170
+ export const TemplateContractSchema = z.looseObject({
171
+ id: z.string(),
172
+ version: z.string(),
173
+ label: z.string(),
174
+ /** The catalog id of the method the script runs. */
175
+ method: z.string(),
176
+ /** The catalog id of the method of record when the template is a declared substitute. */
177
+ substitute_for: z.string().optional(),
178
+ language: z.string(),
179
+ /** The design requirements the script realizes. Absent: not subject to them. */
180
+ honors: z.array(z.string()).optional(),
181
+ parameters: z.array(TemplateParameterSchema),
182
+ inputs: z.array(TemplateInputSchema).optional(),
183
+ outputs: z.array(z.looseObject({ name: z.string(), path: z.string(), description: z.string().optional() })),
184
+ /** The input requirements in prose, from the applicability of the template. */
185
+ notes: z.string().optional(),
186
+ });
187
+ const ValidationFailureSchema = z.looseObject({
188
+ error: z.literal("validation"),
189
+ message: z.string(),
190
+ issues: z.array(z.looseObject({
191
+ message: z.string().optional(),
192
+ reason: z.string().optional(),
193
+ field: z.string().optional(),
194
+ slot: z.string().optional(),
195
+ permitted: z.array(z.string()).optional(),
196
+ })),
197
+ });
198
+ /** The runtime shape of that answer, for the paths whose type says it cannot arrive. */
199
+ const SnapshotMismatchAnswerSchema = z.looseObject({
200
+ match: z.literal("snapshot_mismatch"),
201
+ message: z.string(),
202
+ });
203
+ /** True when `call` answered a mismatch envelope on a route whose type says it cannot carry one. */
204
+ function isSnapshotMismatchAnswer(answer) {
205
+ return SnapshotMismatchAnswerSchema.safeParse(answer).success;
206
+ }
207
+ /** The `message` of an error envelope, or the body itself when it is not one. */
208
+ function messageOf(body) {
209
+ try {
210
+ const message = parseUnknownRecord(parseJsonAs(body, z.json()))?.["message"];
211
+ if (typeof message === "string")
212
+ return message;
213
+ }
214
+ catch {
215
+ // Not JSON: the body is the message.
216
+ }
217
+ return body || undefined;
218
+ }
219
+ /** The template id of a reference: `tpl-x@1.0.0` gives `tpl-x`. The service serves one version, thus the route takes the id alone. */
220
+ function templateIdOf(reference) {
221
+ const at = reference.indexOf("@");
222
+ return at < 0 ? reference : reference.slice(0, at);
223
+ }
224
+ const SnapshotMismatchSchema = z.looseObject({
225
+ error: z.literal("snapshot_mismatch"),
226
+ message: z.string(),
227
+ expected: z.string(),
228
+ served: SnapshotRefSchema,
229
+ });
230
+ /**
231
+ * A 400 is a rejection that names the field and the permitted values. A 404
232
+ * is one only on a lookup route, where `notFoundField` names the field whose
233
+ * value the service does not hold. A 409 is a snapshot mismatch: the service
234
+ * serves another release than the pinned one. Every other failure is
235
+ * `unavailable`.
236
+ */
237
+ function refusalOf(error, notFoundField) {
238
+ if (error.type !== "http_status")
239
+ return undefined;
240
+ if (error.status === 404 && notFoundField) {
241
+ const message = messageOf(error.body) ?? `no such ${notFoundField}`;
242
+ return { match: "rejected", message, issues: [{ field: notFoundField, message }] };
243
+ }
244
+ if (error.status === 409) {
245
+ let parsed;
246
+ try {
247
+ parsed = safeParseJsonAs(error.body, SnapshotMismatchSchema);
248
+ }
249
+ catch {
250
+ return undefined;
251
+ }
252
+ if (!parsed.success)
253
+ return undefined;
254
+ return { match: "snapshot_mismatch", message: parsed.data.message, expected: parsed.data.expected, served: parsed.data.served };
255
+ }
256
+ if (error.status !== 400)
257
+ return undefined;
258
+ let parsed;
259
+ try {
260
+ parsed = safeParseJsonAs(error.body, ValidationFailureSchema);
261
+ }
262
+ catch {
263
+ return { match: "rejected", message: error.body || "the service refused the request", issues: [] };
264
+ }
265
+ if (!parsed.success)
266
+ return { match: "rejected", message: error.body, issues: [] };
267
+ return { match: "rejected", message: parsed.data.message, issues: parsed.data.issues };
268
+ }
269
+ export function createHttpKnowledgeClient(config) {
270
+ // Trim the trailing slashes with a loop, not a regex: CodeQL flags `/\/+$/` on library input as polynomial.
271
+ let base = config.baseUrl;
272
+ while (base.endsWith("/"))
273
+ base = base.slice(0, -1);
274
+ const authorization = `Bearer ${config.apiKey}`;
275
+ const policy = { timeoutMs: config.timeoutMs ?? 30_000, maxRetries: config.maxRetries ?? 2, retryDelayMs: 500 };
276
+ /** One call of the service: a POST with a JSON body, or a GET without one. Every call carries the bearer key. */
277
+ async function call(method, path, body, schema, notFoundField) {
278
+ const headers = body === undefined ? { authorization } : { "content-type": "application/json", authorization };
279
+ const result = await apiFetchValidated(`${base}${path}`, schema, {
280
+ ...policy,
281
+ method,
282
+ headers,
283
+ body: JSON.stringify(body),
284
+ });
285
+ if (result.isOk())
286
+ return result.value;
287
+ const refusal = refusalOf(result.error, notFoundField);
288
+ if (refusal)
289
+ return refusal;
290
+ return { match: "unavailable", reason: describeApiError(result.error) };
291
+ }
292
+ /** A contract lookup carries no pin, thus a mismatch cannot come back; the type says so. */
293
+ async function lookup(path, schema, notFoundField) {
294
+ const answer = await call("GET", path, undefined, schema, notFoundField);
295
+ // A GET without a body has no pin, thus a 409 is not among its answers; the guard keeps the type honest.
296
+ if (isSnapshotMismatchAnswer(answer)) {
297
+ return { match: "unavailable", reason: answer.message };
298
+ }
299
+ return answer;
300
+ }
301
+ return {
302
+ recommend: (situation, responseFormat, preferences, expectedSnapshot) => call("POST", "/v1/recommend", {
303
+ situation,
304
+ response_format: responseFormat,
305
+ preferences,
306
+ expected_snapshot: expectedSnapshot,
307
+ }, RecommendResponseSchema),
308
+ check: (situation, steps, expectedSnapshot) => call("POST", "/v1/check", { situation, steps, expected_snapshot: expectedSnapshot }, CheckResponseSchema),
309
+ render: (template, slots, farm, options) => call("POST", "/v1/template/render", {
310
+ template,
311
+ slots,
312
+ farm,
313
+ step: options?.step,
314
+ claims: options?.claims,
315
+ expected_snapshot: options?.expectedSnapshot,
316
+ }, RenderResponseSchema),
317
+ contract: (template) => lookup(`/v1/templates/${encodeURIComponent(templateIdOf(template))}`, TemplateContractSchema, "template"),
318
+ };
319
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The environment join of a procedure: which package of each step the farm
3
+ * holds, at which version, and which collection of the reference store the
4
+ * enrichment step names. The service knows the methods and the collections
5
+ * by name; the host knows what is installed. Joined here, the answer of
6
+ * `knowledge_recommend` carries the environment, and a planner has no reason
7
+ * to call the listing tools for the packages and the collection it was told
8
+ * to use. A model that hunts for what it already has was the cost of the
9
+ * Phase 0 campaigns on a small model.
10
+ *
11
+ * The installed packages come from two records the host reads, never from a
12
+ * list in the code: the `inflexa.lock` of the farm names the packages the
13
+ * store links, and the `image-packages.json` of the store names what the
14
+ * sandbox image itself ships, among them the R packages of the R runtime
15
+ * (`stats`, `survival`, `MASS`), which no farm lock lists. Both records are
16
+ * written by their producers and validated here.
17
+ *
18
+ * Absence is data: a package neither record names reads `present: false`,
19
+ * and a collection the store lacks reads `present: false`. The join never
20
+ * fills a gap and never names a path it did not read.
21
+ */
22
+ import type { FarmPackage, RecommendResponse } from "./client.js";
23
+ export type EnvironmentPaths = {
24
+ /** Host path of the farm `inflexa.lock`. Absent, the packages read as unknown. */
25
+ readonly farmLockFile?: string;
26
+ /** Host path of the `image-packages.json` of the store. Absent, the packages the image ships are unknown. */
27
+ readonly imagePackagesFile?: string;
28
+ /** Host path of the reference store. Absent, the collection reads as unknown. */
29
+ readonly refStorePath?: string;
30
+ };
31
+ export type StepEnvironment = {
32
+ readonly package?: {
33
+ readonly name: string;
34
+ readonly present: boolean;
35
+ readonly version?: string;
36
+ };
37
+ readonly collection?: {
38
+ readonly name: string;
39
+ readonly present: boolean;
40
+ readonly path?: string;
41
+ readonly title?: string;
42
+ };
43
+ };
44
+ /** Where each fact of the environment came from: a record the host read, or nothing. */
45
+ export type EnvironmentSource = {
46
+ readonly farm: "lock" | "unknown";
47
+ /** `record` when the store carries the `image-packages.json` of the sandbox image. */
48
+ readonly image: "record" | "unknown";
49
+ readonly references: "store" | "unknown";
50
+ };
51
+ /** The recommend answer with an `environment` per step. */
52
+ export type RecommendWithEnvironment = RecommendResponse & {
53
+ readonly environment_source?: EnvironmentSource;
54
+ readonly procedure: readonly (RecommendResponse["procedure"][number] & {
55
+ readonly environment?: StepEnvironment;
56
+ })[];
57
+ };
58
+ /**
59
+ * The packages installed in the sandbox, as the two records report them, with
60
+ * one entry per name. The farm lock comes first and it wins a collision,
61
+ * because a farm that links its own copy of a package is what a step loads.
62
+ * `packages` is absent when neither record is readable, thus a caller sends
63
+ * nothing to the knowledge service rather than an empty farm, and the answer
64
+ * reads `unknown` instead of "absent".
65
+ *
66
+ * Of the image record only the R runtime track joins the list. The conda
67
+ * tools and the Node packages of the image are not of the package tracks a
68
+ * template pins, and a name of one of them must not answer for a package.
69
+ *
70
+ * The same list serves the environment join of the recommend answer and the
71
+ * environment match of a rendered template, thus the two agree.
72
+ */
73
+ export declare function installedPackages(paths: Pick<EnvironmentPaths, "farmLockFile" | "imagePackagesFile">): {
74
+ readonly packages?: readonly FarmPackage[];
75
+ readonly farm: EnvironmentSource["farm"];
76
+ readonly image: EnvironmentSource["image"];
77
+ };
78
+ export declare function joinEnvironment(answer: RecommendResponse, paths: EnvironmentPaths): Promise<RecommendWithEnvironment>;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * The environment join of a procedure: which package of each step the farm
3
+ * holds, at which version, and which collection of the reference store the
4
+ * enrichment step names. The service knows the methods and the collections
5
+ * by name; the host knows what is installed. Joined here, the answer of
6
+ * `knowledge_recommend` carries the environment, and a planner has no reason
7
+ * to call the listing tools for the packages and the collection it was told
8
+ * to use. A model that hunts for what it already has was the cost of the
9
+ * Phase 0 campaigns on a small model.
10
+ *
11
+ * The installed packages come from two records the host reads, never from a
12
+ * list in the code: the `inflexa.lock` of the farm names the packages the
13
+ * store links, and the `image-packages.json` of the store names what the
14
+ * sandbox image itself ships, among them the R packages of the R runtime
15
+ * (`stats`, `survival`, `MASS`), which no farm lock lists. Both records are
16
+ * written by their producers and validated here.
17
+ *
18
+ * Absence is data: a package neither record names reads `present: false`,
19
+ * and a collection the store lacks reads `present: false`. The join never
20
+ * fills a gap and never names a path it did not read.
21
+ */
22
+ import { readFarmLockFile } from "../../sandbox/farm.js";
23
+ import { readImagePackagesFile } from "../../sandbox/image-packages.js";
24
+ import { readReferenceInventory } from "../sandbox/list-available-refs.js";
25
+ /**
26
+ * The packages installed in the sandbox, as the two records report them, with
27
+ * one entry per name. The farm lock comes first and it wins a collision,
28
+ * because a farm that links its own copy of a package is what a step loads.
29
+ * `packages` is absent when neither record is readable, thus a caller sends
30
+ * nothing to the knowledge service rather than an empty farm, and the answer
31
+ * reads `unknown` instead of "absent".
32
+ *
33
+ * Of the image record only the R runtime track joins the list. The conda
34
+ * tools and the Node packages of the image are not of the package tracks a
35
+ * template pins, and a name of one of them must not answer for a package.
36
+ *
37
+ * The same list serves the environment join of the recommend answer and the
38
+ * environment match of a rendered template, thus the two agree.
39
+ */
40
+ export function installedPackages(paths) {
41
+ const lock = paths.farmLockFile ? readFarmLockFile(paths.farmLockFile).unwrapOr(undefined) : undefined;
42
+ const record = paths.imagePackagesFile ? readImagePackagesFile(paths.imagePackagesFile).unwrapOr(undefined) : undefined;
43
+ if (!lock && !record)
44
+ return { farm: "unknown", image: "unknown" };
45
+ const packages = [];
46
+ const seen = new Set();
47
+ for (const pkg of [...(lock?.packages ?? []), ...(record?.r_base ?? [])]) {
48
+ const key = pkg.name.toLowerCase();
49
+ if (seen.has(key))
50
+ continue;
51
+ seen.add(key);
52
+ packages.push({ name: pkg.name, version: pkg.version });
53
+ }
54
+ return { packages, farm: lock ? "lock" : "unknown", image: record ? "record" : "unknown" };
55
+ }
56
+ function tokens(text) {
57
+ const tokens = [];
58
+ let token = "";
59
+ const flush = () => {
60
+ if (token.length > 1)
61
+ tokens.push(token);
62
+ token = "";
63
+ };
64
+ for (const char of text.toLowerCase()) {
65
+ if ((char >= "a" && char <= "z") || (char >= "0" && char <= "9"))
66
+ token += char;
67
+ else
68
+ flush();
69
+ }
70
+ flush();
71
+ return tokens;
72
+ }
73
+ /** A collection term of the tree (`msigdb_hallmark_human`) matches an entry whose labels hold every token of the term. */
74
+ function findCollection(term, entries) {
75
+ const wanted = tokens(term);
76
+ if (wanted.length === 0)
77
+ return undefined;
78
+ const candidates = entries.filter((entry) => {
79
+ const haystack = tokens([entry.path, entry.metadata?.datasetId ?? "", entry.metadata?.title ?? ""].join(" "));
80
+ return wanted.every((token) => haystack.includes(token));
81
+ });
82
+ // A directory entry names the dataset; a file inside it is the concrete artifact. Prefer the file.
83
+ return candidates.find((entry) => entry.kind === "file") ?? candidates[0];
84
+ }
85
+ export async function joinEnvironment(answer, paths) {
86
+ if (answer.match !== "applicable" && answer.match !== "flag")
87
+ return answer;
88
+ const installed = installedPackages(paths);
89
+ const farm = installed.packages ? new Map(installed.packages.map((pkg) => [pkg.name.toLowerCase(), pkg.version])) : undefined;
90
+ const inventory = paths.refStorePath ? await readReferenceInventory(paths.refStorePath).catch(() => undefined) : undefined;
91
+ const entries = inventory?.available ? inventory.entries : undefined;
92
+ const procedure = answer.procedure.map((step) => {
93
+ const environment = {};
94
+ const pkg = step.package;
95
+ if (pkg && farm) {
96
+ const version = farm.get(pkg.name.toLowerCase());
97
+ environment.package = { name: pkg.name, present: version !== undefined, version };
98
+ }
99
+ const collection = step.parameters?.find((parameter) => parameter.name === "gene_set_collection");
100
+ if (collection && typeof collection.value === "string" && entries) {
101
+ const found = findCollection(collection.value, entries);
102
+ environment.collection = {
103
+ name: collection.value,
104
+ present: found !== undefined,
105
+ path: found?.path,
106
+ title: found?.metadata?.title,
107
+ };
108
+ }
109
+ return Object.keys(environment).length > 0 ? { ...step, environment } : step;
110
+ });
111
+ return {
112
+ ...answer,
113
+ procedure,
114
+ environment_source: { farm: installed.farm, image: installed.image, references: entries ? "store" : "unknown" },
115
+ };
116
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Knowledge barrel — the three tools of the knowledge plane and the client
3
+ * interface they share.
4
+ *
5
+ * `createKnowledgeTools` gives the two planner tools when a client is bound,
6
+ * and nothing when it is not. Absence is the default state of the open-source
7
+ * host, and it is a normal condition: no tool attaches, no description enters
8
+ * the context, and the planner works from the prose skills as it does today.
9
+ * The template tool binds per step, because it needs the mutator of the step.
10
+ */
11
+ import type { EnvironmentStorePaths } from "../../config/environment-stores.js";
12
+ import type { Tool } from "../define-tool.js";
13
+ import type { KnowledgeClient } from "./client.js";
14
+ import { type KnowledgeRecommendDeps } from "./recommend.js";
15
+ export * from "./client.js";
16
+ export * from "./environment.js";
17
+ export * from "./local-slots.js";
18
+ export * from "./pin.js";
19
+ export * from "./skeleton.js";
20
+ export * from "./check.js";
21
+ export * from "./recommend.js";
22
+ export * from "./situation.js";
23
+ export * from "./template.js";
24
+ export type KnowledgeToolsDeps = {
25
+ readonly client?: KnowledgeClient;
26
+ /** Host path of the farm `inflexa.lock`, or its resolver for each analysis, for the environment join of the recommend answer. */
27
+ readonly farmLockFile?: EnvironmentStorePaths["farmLockFile"];
28
+ /** Host path of the `image-packages.json` of the store, for the same join: the packages the sandbox image ships. */
29
+ readonly imagePackagesFile?: string;
30
+ /** Host path of the reference store, for the same join. */
31
+ readonly refStorePath?: string;
32
+ /** Receives each recommend answer the planner sees; see `KnowledgeRecommendDeps.onAnswer`. */
33
+ readonly onRecommend?: KnowledgeRecommendDeps["onAnswer"];
34
+ };
35
+ /**
36
+ * The planner tools: `knowledge_recommend` and `knowledge_check`, or an empty
37
+ * list with no client. The two share one pin: the first recommend answer
38
+ * fixes the release of the plan, and each later call carries it.
39
+ */
40
+ export declare function createKnowledgeTools(deps: KnowledgeToolsDeps): Tool[];
41
+ /**
42
+ * The digest of the three tool definitions as this host registers them: the
43
+ * id, the description, and the input schema of each, in id order. The
44
+ * snapshot of the service pins its wire contract under its own tool
45
+ * definition hash; this one names what the model saw, and a run records it,
46
+ * thus a changed description or schema is a visible change of the run and
47
+ * not a silent one.
48
+ */
49
+ export declare function knowledgeToolDefinitionHash(): string;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Knowledge barrel — the three tools of the knowledge plane and the client
3
+ * interface they share.
4
+ *
5
+ * `createKnowledgeTools` gives the two planner tools when a client is bound,
6
+ * and nothing when it is not. Absence is the default state of the open-source
7
+ * host, and it is a normal condition: no tool attaches, no description enters
8
+ * the context, and the planner works from the prose skills as it does today.
9
+ * The template tool binds per step, because it needs the mutator of the step.
10
+ */
11
+ import { createHash } from "node:crypto";
12
+ import { createKnowledgeCheckTool } from "./check.js";
13
+ import { createSnapshotPin } from "./pin.js";
14
+ import { createKnowledgeRecommendTool } from "./recommend.js";
15
+ import { createKnowledgeTemplateTool } from "./template.js";
16
+ export * from "./client.js";
17
+ export * from "./environment.js";
18
+ export * from "./local-slots.js";
19
+ export * from "./pin.js";
20
+ export * from "./skeleton.js";
21
+ export * from "./check.js";
22
+ export * from "./recommend.js";
23
+ export * from "./situation.js";
24
+ export * from "./template.js";
25
+ /**
26
+ * The planner tools: `knowledge_recommend` and `knowledge_check`, or an empty
27
+ * list with no client. The two share one pin: the first recommend answer
28
+ * fixes the release of the plan, and each later call carries it.
29
+ */
30
+ export function createKnowledgeTools(deps) {
31
+ if (!deps.client)
32
+ return [];
33
+ const pin = createSnapshotPin();
34
+ return [
35
+ createKnowledgeRecommendTool({
36
+ client: deps.client,
37
+ pin,
38
+ farmLockFile: deps.farmLockFile,
39
+ imagePackagesFile: deps.imagePackagesFile,
40
+ refStorePath: deps.refStorePath,
41
+ onAnswer: deps.onRecommend,
42
+ }),
43
+ createKnowledgeCheckTool({ client: deps.client, pin }),
44
+ ];
45
+ }
46
+ /** A client that answers nothing: the definitions of the tools do not depend on the answers. */
47
+ const NO_CLIENT = {
48
+ recommend: () => Promise.resolve({ match: "unavailable", reason: "no service" }),
49
+ check: () => Promise.resolve({ match: "unavailable", reason: "no service" }),
50
+ render: () => Promise.resolve({ match: "unavailable", reason: "no service" }),
51
+ contract: () => Promise.resolve({ match: "unavailable", reason: "no service" }),
52
+ };
53
+ /** A mutator that writes nothing: the definition of the template tool does not depend on the workspace. */
54
+ const NO_MUTATOR = {
55
+ writeFile: ({ path }) => Promise.resolve({ status: "out_of_scope", path }),
56
+ recordWrite: () => undefined,
57
+ };
58
+ /**
59
+ * The digest of the three tool definitions as this host registers them: the
60
+ * id, the description, and the input schema of each, in id order. The
61
+ * snapshot of the service pins its wire contract under its own tool
62
+ * definition hash; this one names what the model saw, and a run records it,
63
+ * thus a changed description or schema is a visible change of the run and
64
+ * not a silent one.
65
+ */
66
+ export function knowledgeToolDefinitionHash() {
67
+ const tools = [...createKnowledgeTools({ client: NO_CLIENT }), createKnowledgeTemplateTool({ client: NO_CLIENT, mutator: NO_MUTATOR })];
68
+ const definitions = tools.map((tool) => ({ id: tool.id, description: tool.description, schema: tool.jsonSchema })).sort((a, b) => (a.id < b.id ? -1 : 1));
69
+ return `sha256:${createHash("sha256").update(JSON.stringify(definitions), "utf8").digest("hex")}`;
70
+ }