@inflexa-ai/harness 0.1.1

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 (823) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +58 -0
  4. package/dist/agents/conversation-agent.d.ts +105 -0
  5. package/dist/agents/conversation-agent.js +140 -0
  6. package/dist/agents/report-builder.d.ts +32 -0
  7. package/dist/agents/report-builder.js +31 -0
  8. package/dist/agents/sandbox/__fixtures__/deps.d.ts +23 -0
  9. package/dist/agents/sandbox/__fixtures__/deps.js +96 -0
  10. package/dist/agents/sandbox/bulk-transcriptomics-agent.d.ts +8 -0
  11. package/dist/agents/sandbox/bulk-transcriptomics-agent.js +22 -0
  12. package/dist/agents/sandbox/cheminformatics-agent.d.ts +9 -0
  13. package/dist/agents/sandbox/cheminformatics-agent.js +62 -0
  14. package/dist/agents/sandbox/chromatin-agent.d.ts +8 -0
  15. package/dist/agents/sandbox/chromatin-agent.js +24 -0
  16. package/dist/agents/sandbox/data-profiler.d.ts +10 -0
  17. package/dist/agents/sandbox/data-profiler.js +24 -0
  18. package/dist/agents/sandbox/dna-methylation-agent.d.ts +8 -0
  19. package/dist/agents/sandbox/dna-methylation-agent.js +24 -0
  20. package/dist/agents/sandbox/drug-repurposing-agent.d.ts +8 -0
  21. package/dist/agents/sandbox/drug-repurposing-agent.js +54 -0
  22. package/dist/agents/sandbox/enrichment-agent.d.ts +8 -0
  23. package/dist/agents/sandbox/enrichment-agent.js +24 -0
  24. package/dist/agents/sandbox/ephemeral-executor.d.ts +9 -0
  25. package/dist/agents/sandbox/ephemeral-executor.js +29 -0
  26. package/dist/agents/sandbox/genomic-variant-agent.d.ts +8 -0
  27. package/dist/agents/sandbox/genomic-variant-agent.js +27 -0
  28. package/dist/agents/sandbox/immune-profiling-agent.d.ts +8 -0
  29. package/dist/agents/sandbox/immune-profiling-agent.js +43 -0
  30. package/dist/agents/sandbox/index.d.ts +31 -0
  31. package/dist/agents/sandbox/index.js +96 -0
  32. package/dist/agents/sandbox/metabolomics-agent.d.ts +8 -0
  33. package/dist/agents/sandbox/metabolomics-agent.js +15 -0
  34. package/dist/agents/sandbox/microbiome-agent.d.ts +8 -0
  35. package/dist/agents/sandbox/microbiome-agent.js +15 -0
  36. package/dist/agents/sandbox/multi-omics-integration-agent.d.ts +8 -0
  37. package/dist/agents/sandbox/multi-omics-integration-agent.js +33 -0
  38. package/dist/agents/sandbox/multimodal-sc-agent.d.ts +8 -0
  39. package/dist/agents/sandbox/multimodal-sc-agent.js +15 -0
  40. package/dist/agents/sandbox/network-agent.d.ts +8 -0
  41. package/dist/agents/sandbox/network-agent.js +25 -0
  42. package/dist/agents/sandbox/pkpd-clinical-response-agent.d.ts +8 -0
  43. package/dist/agents/sandbox/pkpd-clinical-response-agent.js +59 -0
  44. package/dist/agents/sandbox/proteomics-agent.d.ts +8 -0
  45. package/dist/agents/sandbox/proteomics-agent.js +15 -0
  46. package/dist/agents/sandbox/scientific-executor.d.ts +9 -0
  47. package/dist/agents/sandbox/scientific-executor.js +56 -0
  48. package/dist/agents/sandbox/shared.d.ts +100 -0
  49. package/dist/agents/sandbox/shared.js +195 -0
  50. package/dist/agents/sandbox/single-cell-agent.d.ts +8 -0
  51. package/dist/agents/sandbox/single-cell-agent.js +25 -0
  52. package/dist/agents/sandbox/spatial-omics-agent.d.ts +8 -0
  53. package/dist/agents/sandbox/spatial-omics-agent.js +15 -0
  54. package/dist/agents/sandbox/statistical-modeling-agent.d.ts +8 -0
  55. package/dist/agents/sandbox/statistical-modeling-agent.js +37 -0
  56. package/dist/agents/sandbox/translational-safety-agent.d.ts +8 -0
  57. package/dist/agents/sandbox/translational-safety-agent.js +59 -0
  58. package/dist/agents/sandbox/types.d.ts +34 -0
  59. package/dist/agents/sandbox/types.js +15 -0
  60. package/dist/agents/sandbox/validate-skills.d.ts +18 -0
  61. package/dist/agents/sandbox/validate-skills.js +40 -0
  62. package/dist/agents/sandbox-catalog.d.ts +33 -0
  63. package/dist/agents/sandbox-catalog.js +44 -0
  64. package/dist/agents/system-prompt.d.ts +25 -0
  65. package/dist/agents/system-prompt.js +23 -0
  66. package/dist/app/chat-turn.d.ts +35 -0
  67. package/dist/app/chat-turn.js +64 -0
  68. package/dist/app/data-profile-policy.d.ts +36 -0
  69. package/dist/app/data-profile-policy.js +37 -0
  70. package/dist/app/message-assembly.d.ts +65 -0
  71. package/dist/app/message-assembly.js +61 -0
  72. package/dist/app/synthesize-run.d.ts +57 -0
  73. package/dist/app/synthesize-run.js +103 -0
  74. package/dist/auth/local-auth-context.d.ts +19 -0
  75. package/dist/auth/local-auth-context.js +20 -0
  76. package/dist/auth/local-run-authorizer.d.ts +10 -0
  77. package/dist/auth/local-run-authorizer.js +23 -0
  78. package/dist/auth/types.d.ts +166 -0
  79. package/dist/auth/types.js +61 -0
  80. package/dist/billing/cached-resolver.d.ts +23 -0
  81. package/dist/billing/cached-resolver.js +61 -0
  82. package/dist/billing/noop-resolver.d.ts +6 -0
  83. package/dist/billing/noop-resolver.js +7 -0
  84. package/dist/billing/noop-run-charge.d.ts +6 -0
  85. package/dist/billing/noop-run-charge.js +10 -0
  86. package/dist/billing/resolver.d.ts +64 -0
  87. package/dist/billing/resolver.js +24 -0
  88. package/dist/billing/run-charge.d.ts +24 -0
  89. package/dist/billing/run-charge.js +9 -0
  90. package/dist/config/resource-limits.d.ts +76 -0
  91. package/dist/config/resource-limits.js +116 -0
  92. package/dist/contracts/analogy-report.d.ts +120 -0
  93. package/dist/contracts/analogy-report.js +50 -0
  94. package/dist/contracts/chat-events.d.ts +61 -0
  95. package/dist/contracts/chat-events.js +13 -0
  96. package/dist/contracts/chat-parts.d.ts +308 -0
  97. package/dist/contracts/chat-parts.js +13 -0
  98. package/dist/contracts/content-url.d.ts +49 -0
  99. package/dist/contracts/content-url.js +56 -0
  100. package/dist/contracts/index.d.ts +12 -0
  101. package/dist/contracts/index.js +5 -0
  102. package/dist/contracts/message.d.ts +36 -0
  103. package/dist/contracts/message.js +9 -0
  104. package/dist/contracts/part-registry.d.ts +18 -0
  105. package/dist/contracts/part-registry.js +28 -0
  106. package/dist/contracts/schemas/chat-events.d.ts +90 -0
  107. package/dist/contracts/schemas/chat-events.js +43 -0
  108. package/dist/contracts/schemas/chat-parts.d.ts +683 -0
  109. package/dist/contracts/schemas/chat-parts.js +295 -0
  110. package/dist/contracts/schemas/index.d.ts +2 -0
  111. package/dist/contracts/schemas/index.js +2 -0
  112. package/dist/contracts/target-assessment-row.d.ts +85 -0
  113. package/dist/contracts/target-assessment-row.js +37 -0
  114. package/dist/contracts/target-dossier.d.ts +16720 -0
  115. package/dist/contracts/target-dossier.js +1339 -0
  116. package/dist/data/clinical-benchmarks.json +108 -0
  117. package/dist/data/protein-family-modality.json +101 -0
  118. package/dist/data/safety-panel-schema.d.ts +64 -0
  119. package/dist/data/safety-panel-schema.js +34 -0
  120. package/dist/data/safety-panel.json +436 -0
  121. package/dist/execution/artifact-metadata.d.ts +74 -0
  122. package/dist/execution/artifact-metadata.js +203 -0
  123. package/dist/execution/artifact-record.d.ts +19 -0
  124. package/dist/execution/artifact-record.js +7 -0
  125. package/dist/execution/artifact-registration.d.ts +36 -0
  126. package/dist/execution/artifact-registration.js +61 -0
  127. package/dist/execution/artifact-registry.d.ts +82 -0
  128. package/dist/execution/artifact-registry.js +17 -0
  129. package/dist/execution/dbos-run-launcher.d.ts +7 -0
  130. package/dist/execution/dbos-run-launcher.js +38 -0
  131. package/dist/execution/ephemeral-runner.d.ts +81 -0
  132. package/dist/execution/ephemeral-runner.js +161 -0
  133. package/dist/execution/filesystem-artifact-registry.d.ts +57 -0
  134. package/dist/execution/filesystem-artifact-registry.js +92 -0
  135. package/dist/execution/noop-artifact-registry.d.ts +11 -0
  136. package/dist/execution/noop-artifact-registry.js +17 -0
  137. package/dist/execution/post-step-pipeline.d.ts +70 -0
  138. package/dist/execution/post-step-pipeline.js +207 -0
  139. package/dist/execution/post-step.d.ts +20 -0
  140. package/dist/execution/post-step.js +65 -0
  141. package/dist/execution/reconcile-manifest.d.ts +25 -0
  142. package/dist/execution/reconcile-manifest.js +132 -0
  143. package/dist/execution/report-render.d.ts +39 -0
  144. package/dist/execution/report-render.js +98 -0
  145. package/dist/execution/report-runner.d.ts +87 -0
  146. package/dist/execution/report-runner.js +227 -0
  147. package/dist/execution/run-authorizer.d.ts +43 -0
  148. package/dist/execution/run-authorizer.js +17 -0
  149. package/dist/execution/run-launcher.d.ts +36 -0
  150. package/dist/execution/run-launcher.js +15 -0
  151. package/dist/execution/run-synthesis.d.ts +107 -0
  152. package/dist/execution/run-synthesis.js +329 -0
  153. package/dist/execution/staged-input.d.ts +41 -0
  154. package/dist/execution/staged-input.js +15 -0
  155. package/dist/execution/step-summary-metrics.d.ts +10 -0
  156. package/dist/execution/step-summary-metrics.js +22 -0
  157. package/dist/execution/step-summary.d.ts +55 -0
  158. package/dist/execution/step-summary.js +106 -0
  159. package/dist/execution/topo-sort.d.ts +33 -0
  160. package/dist/execution/topo-sort.js +99 -0
  161. package/dist/index.d.ts +112 -0
  162. package/dist/index.js +157 -0
  163. package/dist/input-sanitization.d.ts +22 -0
  164. package/dist/input-sanitization.js +64 -0
  165. package/dist/lib/async-utils.d.ts +10 -0
  166. package/dist/lib/async-utils.js +24 -0
  167. package/dist/lib/chrome.d.ts +15 -0
  168. package/dist/lib/chrome.js +95 -0
  169. package/dist/lib/db-result.d.ts +93 -0
  170. package/dist/lib/db-result.js +197 -0
  171. package/dist/lib/fs-helpers.d.ts +74 -0
  172. package/dist/lib/fs-helpers.js +119 -0
  173. package/dist/lib/fs-result.d.ts +98 -0
  174. package/dist/lib/fs-result.js +137 -0
  175. package/dist/lib/host-concurrency.d.ts +16 -0
  176. package/dist/lib/host-concurrency.js +60 -0
  177. package/dist/lib/identifiers.d.ts +8 -0
  178. package/dist/lib/identifiers.js +10 -0
  179. package/dist/lib/metrics.d.ts +7 -0
  180. package/dist/lib/metrics.js +12 -0
  181. package/dist/lib/mime-detect.d.ts +17 -0
  182. package/dist/lib/mime-detect.js +29 -0
  183. package/dist/lib/otel.d.ts +30 -0
  184. package/dist/lib/otel.js +102 -0
  185. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +35 -0
  186. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +107 -0
  187. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +46 -0
  188. package/dist/lib/regulatory-corpus/fetch-ich.js +173 -0
  189. package/dist/lib/regulatory-corpus.d.ts +88 -0
  190. package/dist/lib/regulatory-corpus.js +141 -0
  191. package/dist/lib/result.d.ts +87 -0
  192. package/dist/lib/result.js +103 -0
  193. package/dist/lib/storage.d.ts +29 -0
  194. package/dist/lib/storage.js +37 -0
  195. package/dist/lib/streamed-download.d.ts +28 -0
  196. package/dist/lib/streamed-download.js +111 -0
  197. package/dist/lib/trace-context.d.ts +11 -0
  198. package/dist/lib/trace-context.js +49 -0
  199. package/dist/loop/__fixtures__/scripted-provider.d.ts +31 -0
  200. package/dist/loop/__fixtures__/scripted-provider.js +57 -0
  201. package/dist/loop/budget-exceeded.d.ts +22 -0
  202. package/dist/loop/budget-exceeded.js +41 -0
  203. package/dist/loop/metrics.d.ts +25 -0
  204. package/dist/loop/metrics.js +46 -0
  205. package/dist/loop/run-agent.d.ts +28 -0
  206. package/dist/loop/run-agent.js +204 -0
  207. package/dist/loop/run-step.d.ts +29 -0
  208. package/dist/loop/run-step.js +34 -0
  209. package/dist/loop/run-to-terminal.d.ts +46 -0
  210. package/dist/loop/run-to-terminal.js +51 -0
  211. package/dist/loop/types.d.ts +95 -0
  212. package/dist/loop/types.js +10 -0
  213. package/dist/memory/ai-sdk-message-storage.d.ts +20 -0
  214. package/dist/memory/ai-sdk-message-storage.js +114 -0
  215. package/dist/memory/card-builders.d.ts +114 -0
  216. package/dist/memory/card-builders.js +231 -0
  217. package/dist/memory/content-to-cortex.d.ts +42 -0
  218. package/dist/memory/content-to-cortex.js +85 -0
  219. package/dist/memory/count-tokens.d.ts +18 -0
  220. package/dist/memory/count-tokens.js +64 -0
  221. package/dist/memory/derive-thread-title.d.ts +14 -0
  222. package/dist/memory/derive-thread-title.js +26 -0
  223. package/dist/memory/message-backfill.d.ts +2 -0
  224. package/dist/memory/message-backfill.js +38 -0
  225. package/dist/memory/reconstruct-cards.d.ts +23 -0
  226. package/dist/memory/reconstruct-cards.js +64 -0
  227. package/dist/memory/thread-history.d.ts +80 -0
  228. package/dist/memory/thread-history.js +187 -0
  229. package/dist/memory/thread-store.d.ts +66 -0
  230. package/dist/memory/thread-store.js +88 -0
  231. package/dist/memory/working-memory.d.ts +135 -0
  232. package/dist/memory/working-memory.js +185 -0
  233. package/dist/prompts/SOUL.d.ts +17 -0
  234. package/dist/prompts/SOUL.js +173 -0
  235. package/dist/prompts/analogical-reasoner.d.ts +1 -0
  236. package/dist/prompts/analogical-reasoner.js +170 -0
  237. package/dist/prompts/conversation.d.ts +1 -0
  238. package/dist/prompts/conversation.js +697 -0
  239. package/dist/prompts/execute-analysis/step-summary.d.ts +1 -0
  240. package/dist/prompts/execute-analysis/step-summary.js +38 -0
  241. package/dist/prompts/literature-reviewer.d.ts +1 -0
  242. package/dist/prompts/literature-reviewer.js +107 -0
  243. package/dist/prompts/planner.d.ts +2 -0
  244. package/dist/prompts/planner.js +259 -0
  245. package/dist/prompts/report-builder.d.ts +1 -0
  246. package/dist/prompts/report-builder.js +127 -0
  247. package/dist/prompts/sandbox/bulk-transcriptomics-agent.d.ts +1 -0
  248. package/dist/prompts/sandbox/bulk-transcriptomics-agent.js +78 -0
  249. package/dist/prompts/sandbox/cheminformatics-agent.d.ts +1 -0
  250. package/dist/prompts/sandbox/cheminformatics-agent.js +224 -0
  251. package/dist/prompts/sandbox/chromatin-agent.d.ts +1 -0
  252. package/dist/prompts/sandbox/chromatin-agent.js +100 -0
  253. package/dist/prompts/sandbox/data-profiler.d.ts +1 -0
  254. package/dist/prompts/sandbox/data-profiler.js +291 -0
  255. package/dist/prompts/sandbox/dna-methylation-agent.d.ts +1 -0
  256. package/dist/prompts/sandbox/dna-methylation-agent.js +96 -0
  257. package/dist/prompts/sandbox/drug-repurposing-agent.d.ts +1 -0
  258. package/dist/prompts/sandbox/drug-repurposing-agent.js +144 -0
  259. package/dist/prompts/sandbox/enrichment-agent.d.ts +1 -0
  260. package/dist/prompts/sandbox/enrichment-agent.js +89 -0
  261. package/dist/prompts/sandbox/ephemeral-executor.d.ts +1 -0
  262. package/dist/prompts/sandbox/ephemeral-executor.js +66 -0
  263. package/dist/prompts/sandbox/genomic-variant-agent.d.ts +1 -0
  264. package/dist/prompts/sandbox/genomic-variant-agent.js +83 -0
  265. package/dist/prompts/sandbox/immune-profiling-agent.d.ts +1 -0
  266. package/dist/prompts/sandbox/immune-profiling-agent.js +101 -0
  267. package/dist/prompts/sandbox/metabolomics-agent.d.ts +1 -0
  268. package/dist/prompts/sandbox/metabolomics-agent.js +89 -0
  269. package/dist/prompts/sandbox/microbiome-agent.d.ts +1 -0
  270. package/dist/prompts/sandbox/microbiome-agent.js +109 -0
  271. package/dist/prompts/sandbox/multi-omics-integration-agent.d.ts +1 -0
  272. package/dist/prompts/sandbox/multi-omics-integration-agent.js +122 -0
  273. package/dist/prompts/sandbox/multimodal-sc-agent.d.ts +1 -0
  274. package/dist/prompts/sandbox/multimodal-sc-agent.js +90 -0
  275. package/dist/prompts/sandbox/network-agent.d.ts +1 -0
  276. package/dist/prompts/sandbox/network-agent.js +95 -0
  277. package/dist/prompts/sandbox/pkpd-clinical-response-agent.d.ts +1 -0
  278. package/dist/prompts/sandbox/pkpd-clinical-response-agent.js +71 -0
  279. package/dist/prompts/sandbox/proteomics-agent.d.ts +1 -0
  280. package/dist/prompts/sandbox/proteomics-agent.js +93 -0
  281. package/dist/prompts/sandbox/scientific-executor.d.ts +1 -0
  282. package/dist/prompts/sandbox/scientific-executor.js +68 -0
  283. package/dist/prompts/sandbox/single-cell-agent.d.ts +1 -0
  284. package/dist/prompts/sandbox/single-cell-agent.js +129 -0
  285. package/dist/prompts/sandbox/spatial-omics-agent.d.ts +1 -0
  286. package/dist/prompts/sandbox/spatial-omics-agent.js +94 -0
  287. package/dist/prompts/sandbox/statistical-modeling-agent.d.ts +1 -0
  288. package/dist/prompts/sandbox/statistical-modeling-agent.js +112 -0
  289. package/dist/prompts/sandbox/translational-safety-agent.d.ts +1 -0
  290. package/dist/prompts/sandbox/translational-safety-agent.js +105 -0
  291. package/dist/prompts/sandbox-standards.d.ts +18 -0
  292. package/dist/prompts/sandbox-standards.js +358 -0
  293. package/dist/prompts/synthesis-agent.d.ts +1 -0
  294. package/dist/prompts/synthesis-agent.js +289 -0
  295. package/dist/prompts/target-assessment/briefs/executive-recommendation.d.ts +1 -0
  296. package/dist/prompts/target-assessment/briefs/executive-recommendation.js +85 -0
  297. package/dist/prompts/target-assessment/briefs/index.d.ts +4 -0
  298. package/dist/prompts/target-assessment/briefs/index.js +4 -0
  299. package/dist/prompts/target-assessment/briefs/liability-bullets.d.ts +1 -0
  300. package/dist/prompts/target-assessment/briefs/liability-bullets.js +114 -0
  301. package/dist/prompts/target-assessment/briefs/target-organ-liabilities.d.ts +1 -0
  302. package/dist/prompts/target-assessment/briefs/target-organ-liabilities.js +29 -0
  303. package/dist/prompts/target-assessment/briefs/translational-commentary.d.ts +1 -0
  304. package/dist/prompts/target-assessment/briefs/translational-commentary.js +23 -0
  305. package/dist/prompts/target-assessment/drugs-in-class.d.ts +1 -0
  306. package/dist/prompts/target-assessment/drugs-in-class.js +29 -0
  307. package/dist/prompts/target-assessment/modulator-triage.d.ts +1 -0
  308. package/dist/prompts/target-assessment/modulator-triage.js +31 -0
  309. package/dist/prompts/target-assessment/off-target-annotator.d.ts +1 -0
  310. package/dist/prompts/target-assessment/off-target-annotator.js +28 -0
  311. package/dist/prompts/target-assessment/tox-voice/core.d.ts +1 -0
  312. package/dist/prompts/target-assessment/tox-voice/core.js +74 -0
  313. package/dist/prompts/target-assessment/tox-voice/critique.d.ts +7 -0
  314. package/dist/prompts/target-assessment/tox-voice/critique.js +109 -0
  315. package/dist/prompts/target-assessment/tox-voice/exemplars.d.ts +8 -0
  316. package/dist/prompts/target-assessment/tox-voice/exemplars.js +24 -0
  317. package/dist/prompts/target-assessment/tox-voice/index.d.ts +4 -0
  318. package/dist/prompts/target-assessment/tox-voice/index.js +4 -0
  319. package/dist/prompts/target-assessment/tox-voice/vocabulary.d.ts +15 -0
  320. package/dist/prompts/target-assessment/tox-voice/vocabulary.js +72 -0
  321. package/dist/provenance/collector.d.ts +148 -0
  322. package/dist/provenance/collector.js +296 -0
  323. package/dist/provenance/exec-frame.d.ts +36 -0
  324. package/dist/provenance/exec-frame.js +49 -0
  325. package/dist/provenance/types.d.ts +95 -0
  326. package/dist/provenance/types.js +64 -0
  327. package/dist/providers/__fixtures__/session.d.ts +16 -0
  328. package/dist/providers/__fixtures__/session.js +20 -0
  329. package/dist/providers/ai-sdk.d.ts +47 -0
  330. package/dist/providers/ai-sdk.js +142 -0
  331. package/dist/providers/anthropic.d.ts +22 -0
  332. package/dist/providers/anthropic.js +26 -0
  333. package/dist/providers/embedding.d.ts +32 -0
  334. package/dist/providers/embedding.js +42 -0
  335. package/dist/providers/errors.d.ts +80 -0
  336. package/dist/providers/errors.js +137 -0
  337. package/dist/providers/llm-capabilities.d.ts +33 -0
  338. package/dist/providers/llm-capabilities.js +58 -0
  339. package/dist/providers/streaming-chat.d.ts +23 -0
  340. package/dist/providers/streaming-chat.js +61 -0
  341. package/dist/providers/types.d.ts +59 -0
  342. package/dist/providers/types.js +8 -0
  343. package/dist/runtime/assemble.d.ts +68 -0
  344. package/dist/runtime/assemble.js +46 -0
  345. package/dist/runtime/boot.d.ts +73 -0
  346. package/dist/runtime/boot.js +65 -0
  347. package/dist/runtime/connection-budget.d.ts +48 -0
  348. package/dist/runtime/connection-budget.js +57 -0
  349. package/dist/runtime/dbos.d.ts +94 -0
  350. package/dist/runtime/dbos.js +160 -0
  351. package/dist/runtime/lifecycle.d.ts +12 -0
  352. package/dist/runtime/lifecycle.js +19 -0
  353. package/dist/runtime/pools.d.ts +25 -0
  354. package/dist/runtime/pools.js +30 -0
  355. package/dist/runtime/shutdown.d.ts +33 -0
  356. package/dist/runtime/shutdown.js +39 -0
  357. package/dist/sandbox/await-exec.d.ts +143 -0
  358. package/dist/sandbox/await-exec.js +406 -0
  359. package/dist/sandbox/client.d.ts +82 -0
  360. package/dist/sandbox/client.js +23 -0
  361. package/dist/sandbox/create-sandbox.d.ts +105 -0
  362. package/dist/sandbox/create-sandbox.js +132 -0
  363. package/dist/sandbox/deliver-exec-event.d.ts +25 -0
  364. package/dist/sandbox/deliver-exec-event.js +29 -0
  365. package/dist/sandbox/docker-client.d.ts +75 -0
  366. package/dist/sandbox/docker-client.js +315 -0
  367. package/dist/sandbox/estimate-data-profile-resources.d.ts +5 -0
  368. package/dist/sandbox/estimate-data-profile-resources.js +73 -0
  369. package/dist/sandbox/exec-id.d.ts +12 -0
  370. package/dist/sandbox/exec-id.js +20 -0
  371. package/dist/sandbox/execution-id.d.ts +30 -0
  372. package/dist/sandbox/execution-id.js +47 -0
  373. package/dist/sandbox/hmac.d.ts +54 -0
  374. package/dist/sandbox/hmac.js +67 -0
  375. package/dist/sandbox/identity.d.ts +15 -0
  376. package/dist/sandbox/identity.js +22 -0
  377. package/dist/sandbox/ignored-dirs.d.ts +7 -0
  378. package/dist/sandbox/ignored-dirs.js +7 -0
  379. package/dist/sandbox/k8s-client.d.ts +71 -0
  380. package/dist/sandbox/k8s-client.js +488 -0
  381. package/dist/sandbox/liveness.d.ts +60 -0
  382. package/dist/sandbox/liveness.js +82 -0
  383. package/dist/sandbox/mount-plan.d.ts +77 -0
  384. package/dist/sandbox/mount-plan.js +84 -0
  385. package/dist/sandbox/notification-sweep.d.ts +42 -0
  386. package/dist/sandbox/notification-sweep.js +74 -0
  387. package/dist/sandbox/reaper.d.ts +70 -0
  388. package/dist/sandbox/reaper.js +124 -0
  389. package/dist/sandbox/sandbox-error.d.ts +105 -0
  390. package/dist/sandbox/sandbox-error.js +92 -0
  391. package/dist/sandbox/sandbox-step-translate.d.ts +35 -0
  392. package/dist/sandbox/sandbox-step-translate.js +76 -0
  393. package/dist/sandbox/submit-exec.d.ts +33 -0
  394. package/dist/sandbox/submit-exec.js +68 -0
  395. package/dist/sandbox/types.d.ts +277 -0
  396. package/dist/sandbox/types.js +147 -0
  397. package/dist/sandbox/watchdog.d.ts +71 -0
  398. package/dist/sandbox/watchdog.js +150 -0
  399. package/dist/schemas/artifact-manifest.d.ts +34 -0
  400. package/dist/schemas/artifact-manifest.js +36 -0
  401. package/dist/schemas/data-profile-schemas.d.ts +92 -0
  402. package/dist/schemas/data-profile-schemas.js +89 -0
  403. package/dist/schemas/file-metadata.d.ts +51 -0
  404. package/dist/schemas/file-metadata.js +39 -0
  405. package/dist/schemas/plan-schemas.d.ts +110 -0
  406. package/dist/schemas/plan-schemas.js +50 -0
  407. package/dist/schemas/render-step-prompt.d.ts +32 -0
  408. package/dist/schemas/render-step-prompt.js +76 -0
  409. package/dist/schemas/run-synthesis.d.ts +148 -0
  410. package/dist/schemas/run-synthesis.js +87 -0
  411. package/dist/schemas/step-summary.d.ts +18 -0
  412. package/dist/schemas/step-summary.js +20 -0
  413. package/dist/schemas/validate-plan.d.ts +39 -0
  414. package/dist/schemas/validate-plan.js +120 -0
  415. package/dist/schemas/workflow-state.d.ts +314 -0
  416. package/dist/schemas/workflow-state.js +139 -0
  417. package/dist/state/active-sandboxes.d.ts +58 -0
  418. package/dist/state/active-sandboxes.js +100 -0
  419. package/dist/state/analyses-metrics.d.ts +21 -0
  420. package/dist/state/analyses-metrics.js +59 -0
  421. package/dist/state/analyses.d.ts +58 -0
  422. package/dist/state/analyses.js +132 -0
  423. package/dist/state/artifacts.d.ts +53 -0
  424. package/dist/state/artifacts.js +175 -0
  425. package/dist/state/data-profile.d.ts +176 -0
  426. package/dist/state/data-profile.js +284 -0
  427. package/dist/state/db.d.ts +10 -0
  428. package/dist/state/db.js +9 -0
  429. package/dist/state/index.d.ts +29 -0
  430. package/dist/state/index.js +20 -0
  431. package/dist/state/init.d.ts +14 -0
  432. package/dist/state/init.js +406 -0
  433. package/dist/state/plans.d.ts +56 -0
  434. package/dist/state/plans.js +117 -0
  435. package/dist/state/runs.d.ts +69 -0
  436. package/dist/state/runs.js +206 -0
  437. package/dist/state/schema.d.ts +150 -0
  438. package/dist/state/schema.js +100 -0
  439. package/dist/state/step-executions.d.ts +77 -0
  440. package/dist/state/step-executions.js +175 -0
  441. package/dist/state/target-assessments.d.ts +68 -0
  442. package/dist/state/target-assessments.js +222 -0
  443. package/dist/state/vector-store.d.ts +53 -0
  444. package/dist/state/vector-store.js +89 -0
  445. package/dist/tasks/data-profile.d.ts +171 -0
  446. package/dist/tasks/data-profile.js +461 -0
  447. package/dist/tasks/refresh-regulatory-corpus.d.ts +59 -0
  448. package/dist/tasks/refresh-regulatory-corpus.js +146 -0
  449. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +55 -0
  450. package/dist/tasks/regulatory-corpus-boot-refresh.js +149 -0
  451. package/dist/tools/__fixtures__/tool-context.d.ts +13 -0
  452. package/dist/tools/__fixtures__/tool-context.js +18 -0
  453. package/dist/tools/bio/check-safety-panel.d.ts +35 -0
  454. package/dist/tools/bio/check-safety-panel.js +76 -0
  455. package/dist/tools/bio/find-approval-precedent.d.ts +32 -0
  456. package/dist/tools/bio/find-approval-precedent.js +72 -0
  457. package/dist/tools/bio/get-article-details.d.ts +11 -0
  458. package/dist/tools/bio/get-article-details.js +20 -0
  459. package/dist/tools/bio/get-article-full-text.d.ts +19 -0
  460. package/dist/tools/bio/get-article-full-text.js +32 -0
  461. package/dist/tools/bio/get-bioactivity.d.ts +11 -0
  462. package/dist/tools/bio/get-bioactivity.js +23 -0
  463. package/dist/tools/bio/get-drug-info.d.ts +9 -0
  464. package/dist/tools/bio/get-drug-info.js +22 -0
  465. package/dist/tools/bio/get-impc-ko-profile.d.ts +9 -0
  466. package/dist/tools/bio/get-impc-ko-profile.js +20 -0
  467. package/dist/tools/bio/get-mechanism.d.ts +8 -0
  468. package/dist/tools/bio/get-mechanism.js +18 -0
  469. package/dist/tools/bio/get-pubchem-assays.d.ts +22 -0
  470. package/dist/tools/bio/get-pubchem-assays.js +107 -0
  471. package/dist/tools/bio/get-pubchem-cross-refs.d.ts +15 -0
  472. package/dist/tools/bio/get-pubchem-cross-refs.js +68 -0
  473. package/dist/tools/bio/get-target-safety.d.ts +18 -0
  474. package/dist/tools/bio/get-target-safety.js +26 -0
  475. package/dist/tools/bio/index.d.ts +41 -0
  476. package/dist/tools/bio/index.js +48 -0
  477. package/dist/tools/bio/keys.d.ts +31 -0
  478. package/dist/tools/bio/keys.js +30 -0
  479. package/dist/tools/bio/lookup-go-term.d.ts +31 -0
  480. package/dist/tools/bio/lookup-go-term.js +116 -0
  481. package/dist/tools/bio/search-bgee-expression.d.ts +10 -0
  482. package/dist/tools/bio/search-bgee-expression.js +24 -0
  483. package/dist/tools/bio/search-clinical-trials.d.ts +12 -0
  484. package/dist/tools/bio/search-clinical-trials.js +21 -0
  485. package/dist/tools/bio/search-clinvar.d.ts +13 -0
  486. package/dist/tools/bio/search-clinvar.js +28 -0
  487. package/dist/tools/bio/search-compounds.d.ts +22 -0
  488. package/dist/tools/bio/search-compounds.js +160 -0
  489. package/dist/tools/bio/search-ctx-chemical.d.ts +50 -0
  490. package/dist/tools/bio/search-ctx-chemical.js +130 -0
  491. package/dist/tools/bio/search-ctx-exposure.d.ts +55 -0
  492. package/dist/tools/bio/search-ctx-exposure.js +176 -0
  493. package/dist/tools/bio/search-ctx-hazard.d.ts +111 -0
  494. package/dist/tools/bio/search-ctx-hazard.js +178 -0
  495. package/dist/tools/bio/search-dgidb.d.ts +43 -0
  496. package/dist/tools/bio/search-dgidb.js +199 -0
  497. package/dist/tools/bio/search-disgenet.d.ts +30 -0
  498. package/dist/tools/bio/search-disgenet.js +84 -0
  499. package/dist/tools/bio/search-drugbank.d.ts +38 -0
  500. package/dist/tools/bio/search-drugbank.js +109 -0
  501. package/dist/tools/bio/search-faers.d.ts +11 -0
  502. package/dist/tools/bio/search-faers.js +23 -0
  503. package/dist/tools/bio/search-gene.d.ts +11 -0
  504. package/dist/tools/bio/search-gene.js +19 -0
  505. package/dist/tools/bio/search-geo-datasets.d.ts +20 -0
  506. package/dist/tools/bio/search-geo-datasets.js +86 -0
  507. package/dist/tools/bio/search-gwas-catalog.d.ts +33 -0
  508. package/dist/tools/bio/search-gwas-catalog.js +172 -0
  509. package/dist/tools/bio/search-interactions.d.ts +17 -0
  510. package/dist/tools/bio/search-interactions.js +31 -0
  511. package/dist/tools/bio/search-opentargets.d.ts +11 -0
  512. package/dist/tools/bio/search-opentargets.js +25 -0
  513. package/dist/tools/bio/search-pathway.d.ts +12 -0
  514. package/dist/tools/bio/search-pathway.js +32 -0
  515. package/dist/tools/bio/search-pharmgkb.d.ts +17 -0
  516. package/dist/tools/bio/search-pharmgkb.js +46 -0
  517. package/dist/tools/bio/search-pubchem-compound.d.ts +26 -0
  518. package/dist/tools/bio/search-pubchem-compound.js +110 -0
  519. package/dist/tools/bio/search-pubmed.d.ts +17 -0
  520. package/dist/tools/bio/search-pubmed.js +31 -0
  521. package/dist/tools/bio/search-targets.d.ts +9 -0
  522. package/dist/tools/bio/search-targets.js +20 -0
  523. package/dist/tools/bio/search-toxcast.d.ts +36 -0
  524. package/dist/tools/bio/search-toxcast.js +141 -0
  525. package/dist/tools/define-tool.d.ts +80 -0
  526. package/dist/tools/define-tool.js +48 -0
  527. package/dist/tools/display/index.d.ts +4 -0
  528. package/dist/tools/display/index.js +4 -0
  529. package/dist/tools/display/show-user.d.ts +33 -0
  530. package/dist/tools/display/show-user.js +67 -0
  531. package/dist/tools/execute-plan.d.ts +64 -0
  532. package/dist/tools/execute-plan.js +208 -0
  533. package/dist/tools/iterate-report.d.ts +172 -0
  534. package/dist/tools/iterate-report.js +521 -0
  535. package/dist/tools/lib/api-utils.d.ts +80 -0
  536. package/dist/tools/lib/api-utils.js +128 -0
  537. package/dist/tools/lib/bgee-client.d.ts +36 -0
  538. package/dist/tools/lib/bgee-client.js +150 -0
  539. package/dist/tools/lib/cbioportal-client.d.ts +34 -0
  540. package/dist/tools/lib/cbioportal-client.js +159 -0
  541. package/dist/tools/lib/chembl-client.d.ts +123 -0
  542. package/dist/tools/lib/chembl-client.js +458 -0
  543. package/dist/tools/lib/chembl-config.d.ts +5 -0
  544. package/dist/tools/lib/chembl-config.js +3 -0
  545. package/dist/tools/lib/clinical-benchmarks-client.d.ts +33 -0
  546. package/dist/tools/lib/clinical-benchmarks-client.js +54 -0
  547. package/dist/tools/lib/clinical-trials-client.d.ts +216 -0
  548. package/dist/tools/lib/clinical-trials-client.js +339 -0
  549. package/dist/tools/lib/clinicaltrials-config.d.ts +4 -0
  550. package/dist/tools/lib/clinicaltrials-config.js +2 -0
  551. package/dist/tools/lib/clinvar-client.d.ts +25 -0
  552. package/dist/tools/lib/clinvar-client.js +126 -0
  553. package/dist/tools/lib/disgenet-config.d.ts +2 -0
  554. package/dist/tools/lib/disgenet-config.js +11 -0
  555. package/dist/tools/lib/drugbank-config.d.ts +2 -0
  556. package/dist/tools/lib/drugbank-config.js +12 -0
  557. package/dist/tools/lib/ema-client.d.ts +45 -0
  558. package/dist/tools/lib/ema-client.js +127 -0
  559. package/dist/tools/lib/ema-config.d.ts +7 -0
  560. package/dist/tools/lib/ema-config.js +7 -0
  561. package/dist/tools/lib/ensembl-client.d.ts +27 -0
  562. package/dist/tools/lib/ensembl-client.js +82 -0
  563. package/dist/tools/lib/gwas-catalog-config.d.ts +4 -0
  564. package/dist/tools/lib/gwas-catalog-config.js +2 -0
  565. package/dist/tools/lib/identifier-resolver.d.ts +85 -0
  566. package/dist/tools/lib/identifier-resolver.js +333 -0
  567. package/dist/tools/lib/impc-client.d.ts +44 -0
  568. package/dist/tools/lib/impc-client.js +239 -0
  569. package/dist/tools/lib/iuphar-client.d.ts +75 -0
  570. package/dist/tools/lib/iuphar-client.js +230 -0
  571. package/dist/tools/lib/iuphar-config.d.ts +5 -0
  572. package/dist/tools/lib/iuphar-config.js +3 -0
  573. package/dist/tools/lib/ncbi-utils.d.ts +58 -0
  574. package/dist/tools/lib/ncbi-utils.js +286 -0
  575. package/dist/tools/lib/openfda-client.d.ts +53 -0
  576. package/dist/tools/lib/openfda-client.js +192 -0
  577. package/dist/tools/lib/openfda-config.d.ts +2 -0
  578. package/dist/tools/lib/openfda-config.js +2 -0
  579. package/dist/tools/lib/opentargets-client.d.ts +64 -0
  580. package/dist/tools/lib/opentargets-client.js +290 -0
  581. package/dist/tools/lib/opentargets-config.d.ts +5 -0
  582. package/dist/tools/lib/opentargets-config.js +5 -0
  583. package/dist/tools/lib/path-validation.d.ts +14 -0
  584. package/dist/tools/lib/path-validation.js +26 -0
  585. package/dist/tools/lib/pathway-client.d.ts +27 -0
  586. package/dist/tools/lib/pathway-client.js +149 -0
  587. package/dist/tools/lib/pharmgkb-config.d.ts +4 -0
  588. package/dist/tools/lib/pharmgkb-config.js +2 -0
  589. package/dist/tools/lib/preview-lock.d.ts +20 -0
  590. package/dist/tools/lib/preview-lock.js +35 -0
  591. package/dist/tools/lib/protein-family-modality.d.ts +16 -0
  592. package/dist/tools/lib/protein-family-modality.js +42 -0
  593. package/dist/tools/lib/protein-family-normalize.d.ts +12 -0
  594. package/dist/tools/lib/protein-family-normalize.js +46 -0
  595. package/dist/tools/lib/pubchem-client.d.ts +40 -0
  596. package/dist/tools/lib/pubchem-client.js +128 -0
  597. package/dist/tools/lib/pubchem-config.d.ts +5 -0
  598. package/dist/tools/lib/pubchem-config.js +3 -0
  599. package/dist/tools/lib/pubmed-client.d.ts +28 -0
  600. package/dist/tools/lib/pubmed-client.js +91 -0
  601. package/dist/tools/lib/report-preflight.d.ts +39 -0
  602. package/dist/tools/lib/report-preflight.js +283 -0
  603. package/dist/tools/lib/string-client.d.ts +33 -0
  604. package/dist/tools/lib/string-client.js +93 -0
  605. package/dist/tools/lib/toxcast-config.d.ts +2 -0
  606. package/dist/tools/lib/toxcast-config.js +11 -0
  607. package/dist/tools/lib/uniprot-client.d.ts +28 -0
  608. package/dist/tools/lib/uniprot-client.js +103 -0
  609. package/dist/tools/lib/uniprot-config.d.ts +5 -0
  610. package/dist/tools/lib/uniprot-config.js +3 -0
  611. package/dist/tools/memory/index.d.ts +4 -0
  612. package/dist/tools/memory/index.js +4 -0
  613. package/dist/tools/memory/update-working-memory.d.ts +25 -0
  614. package/dist/tools/memory/update-working-memory.js +112 -0
  615. package/dist/tools/registry.d.ts +15 -0
  616. package/dist/tools/registry.js +26 -0
  617. package/dist/tools/report/build-report.d.ts +13 -0
  618. package/dist/tools/report/build-report.js +26 -0
  619. package/dist/tools/report/index.d.ts +14 -0
  620. package/dist/tools/report/index.js +14 -0
  621. package/dist/tools/report/mint-preview-url.d.ts +26 -0
  622. package/dist/tools/report/mint-preview-url.js +44 -0
  623. package/dist/tools/report/preview-publisher.d.ts +37 -0
  624. package/dist/tools/report/preview-publisher.js +25 -0
  625. package/dist/tools/report/preview-snapshot.d.ts +26 -0
  626. package/dist/tools/report/preview-snapshot.js +121 -0
  627. package/dist/tools/report/submit-report.d.ts +25 -0
  628. package/dist/tools/report/submit-report.js +126 -0
  629. package/dist/tools/report/version-fs.d.ts +15 -0
  630. package/dist/tools/report/version-fs.js +154 -0
  631. package/dist/tools/research/context7-docs.d.ts +31 -0
  632. package/dist/tools/research/context7-docs.js +61 -0
  633. package/dist/tools/research/generate-analogy-report.d.ts +60 -0
  634. package/dist/tools/research/generate-analogy-report.js +288 -0
  635. package/dist/tools/research/generate-plan.d.ts +39 -0
  636. package/dist/tools/research/generate-plan.js +393 -0
  637. package/dist/tools/research/index.d.ts +15 -0
  638. package/dist/tools/research/index.js +15 -0
  639. package/dist/tools/research/inspect-run.d.ts +54 -0
  640. package/dist/tools/research/inspect-run.js +85 -0
  641. package/dist/tools/research/literature-reviewer.d.ts +29 -0
  642. package/dist/tools/research/literature-reviewer.js +84 -0
  643. package/dist/tools/research/search-arxiv.d.ts +32 -0
  644. package/dist/tools/research/search-arxiv.js +123 -0
  645. package/dist/tools/research/search-github-repos.d.ts +32 -0
  646. package/dist/tools/research/search-github-repos.js +86 -0
  647. package/dist/tools/research/search-semantic-scholar.d.ts +33 -0
  648. package/dist/tools/research/search-semantic-scholar.js +93 -0
  649. package/dist/tools/run-ephemeral.d.ts +33 -0
  650. package/dist/tools/run-ephemeral.js +65 -0
  651. package/dist/tools/sandbox/index.d.ts +7 -0
  652. package/dist/tools/sandbox/index.js +7 -0
  653. package/dist/tools/sandbox/list-available-packages.d.ts +7 -0
  654. package/dist/tools/sandbox/list-available-packages.js +27 -0
  655. package/dist/tools/sandbox/list-available-refs.d.ts +7 -0
  656. package/dist/tools/sandbox/list-available-refs.js +147 -0
  657. package/dist/tools/sandbox/report-blocker.d.ts +23 -0
  658. package/dist/tools/sandbox/report-blocker.js +39 -0
  659. package/dist/tools/sandbox/skills.d.ts +72 -0
  660. package/dist/tools/sandbox/skills.js +144 -0
  661. package/dist/tools/workspace/edit-file.d.ts +46 -0
  662. package/dist/tools/workspace/edit-file.js +100 -0
  663. package/dist/tools/workspace/execute-command.d.ts +80 -0
  664. package/dist/tools/workspace/execute-command.js +95 -0
  665. package/dist/tools/workspace/file-stat.d.ts +24 -0
  666. package/dist/tools/workspace/file-stat.js +37 -0
  667. package/dist/tools/workspace/grep.d.ts +57 -0
  668. package/dist/tools/workspace/grep.js +154 -0
  669. package/dist/tools/workspace/index.d.ts +26 -0
  670. package/dist/tools/workspace/index.js +27 -0
  671. package/dist/tools/workspace/list-files.d.ts +24 -0
  672. package/dist/tools/workspace/list-files.js +38 -0
  673. package/dist/tools/workspace/mutator.d.ts +83 -0
  674. package/dist/tools/workspace/mutator.js +81 -0
  675. package/dist/tools/workspace/read-file.d.ts +39 -0
  676. package/dist/tools/workspace/read-file.js +93 -0
  677. package/dist/tools/workspace/result-bounds.d.ts +42 -0
  678. package/dist/tools/workspace/result-bounds.js +50 -0
  679. package/dist/tools/workspace/run-exec.d.ts +32 -0
  680. package/dist/tools/workspace/run-exec.js +34 -0
  681. package/dist/tools/workspace/show-file.d.ts +37 -0
  682. package/dist/tools/workspace/show-file.js +54 -0
  683. package/dist/tools/workspace/show-plan.d.ts +23 -0
  684. package/dist/tools/workspace/show-plan.js +44 -0
  685. package/dist/tools/workspace/workspace-search.d.ts +25 -0
  686. package/dist/tools/workspace/workspace-search.js +78 -0
  687. package/dist/tools/workspace/write-file.d.ts +16 -0
  688. package/dist/tools/workspace/write-file.js +33 -0
  689. package/dist/workflows/execute-analysis-scheduler.d.ts +94 -0
  690. package/dist/workflows/execute-analysis-scheduler.js +186 -0
  691. package/dist/workflows/execute-analysis.d.ts +271 -0
  692. package/dist/workflows/execute-analysis.js +746 -0
  693. package/dist/workflows/execute-target-assessment.d.ts +101 -0
  694. package/dist/workflows/execute-target-assessment.js +528 -0
  695. package/dist/workflows/metrics.d.ts +37 -0
  696. package/dist/workflows/metrics.js +55 -0
  697. package/dist/workflows/plan/level.d.ts +12 -0
  698. package/dist/workflows/plan/level.js +12 -0
  699. package/dist/workflows/register-workflows.d.ts +51 -0
  700. package/dist/workflows/register-workflows.js +48 -0
  701. package/dist/workflows/resume-execute-analysis.d.ts +70 -0
  702. package/dist/workflows/resume-execute-analysis.js +80 -0
  703. package/dist/workflows/sandbox-step.d.ts +243 -0
  704. package/dist/workflows/sandbox-step.js +573 -0
  705. package/dist/workflows/target-assessment/assemblers/index.d.ts +5 -0
  706. package/dist/workflows/target-assessment/assemblers/index.js +4 -0
  707. package/dist/workflows/target-assessment/assemblers/literature.d.ts +299 -0
  708. package/dist/workflows/target-assessment/assemblers/literature.js +987 -0
  709. package/dist/workflows/target-assessment/assemblers/orchestrator.d.ts +109 -0
  710. package/dist/workflows/target-assessment/assemblers/orchestrator.js +835 -0
  711. package/dist/workflows/target-assessment/assemblers/safety.d.ts +352 -0
  712. package/dist/workflows/target-assessment/assemblers/safety.js +985 -0
  713. package/dist/workflows/target-assessment/assemblers/trials.d.ts +30 -0
  714. package/dist/workflows/target-assessment/assemblers/trials.js +75 -0
  715. package/dist/workflows/target-assessment/collectors/index.d.ts +105 -0
  716. package/dist/workflows/target-assessment/collectors/index.js +468 -0
  717. package/dist/workflows/target-assessment/correction-loop.d.ts +45 -0
  718. package/dist/workflows/target-assessment/correction-loop.js +62 -0
  719. package/dist/workflows/target-assessment/coverage.d.ts +81 -0
  720. package/dist/workflows/target-assessment/coverage.js +82 -0
  721. package/dist/workflows/target-assessment/decisions/index.d.ts +86 -0
  722. package/dist/workflows/target-assessment/decisions/index.js +127 -0
  723. package/dist/workflows/target-assessment/fanout/index.d.ts +31 -0
  724. package/dist/workflows/target-assessment/fanout/index.js +155 -0
  725. package/dist/workflows/target-assessment/lib/approval-precedents.d.ts +52 -0
  726. package/dist/workflows/target-assessment/lib/approval-precedents.js +119 -0
  727. package/dist/workflows/target-assessment/lib/citation-validator.d.ts +46 -0
  728. package/dist/workflows/target-assessment/lib/citation-validator.js +316 -0
  729. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.d.ts +62 -0
  730. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.js +172 -0
  731. package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.d.ts +45 -0
  732. package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.js +156 -0
  733. package/dist/workflows/target-assessment/lib/compute-derived.d.ts +19 -0
  734. package/dist/workflows/target-assessment/lib/compute-derived.js +252 -0
  735. package/dist/workflows/target-assessment/lib/compute-selectivity.d.ts +15 -0
  736. package/dist/workflows/target-assessment/lib/compute-selectivity.js +18 -0
  737. package/dist/workflows/target-assessment/lib/dedup-modulators.d.ts +37 -0
  738. package/dist/workflows/target-assessment/lib/dedup-modulators.js +157 -0
  739. package/dist/workflows/target-assessment/lib/evidence-conflict-detector.d.ts +17 -0
  740. package/dist/workflows/target-assessment/lib/evidence-conflict-detector.js +100 -0
  741. package/dist/workflows/target-assessment/lib/expression-constants.d.ts +21 -0
  742. package/dist/workflows/target-assessment/lib/expression-constants.js +21 -0
  743. package/dist/workflows/target-assessment/lib/family-complex-supplement.d.ts +21 -0
  744. package/dist/workflows/target-assessment/lib/family-complex-supplement.js +37 -0
  745. package/dist/workflows/target-assessment/lib/heterodimer-filter.d.ts +39 -0
  746. package/dist/workflows/target-assessment/lib/heterodimer-filter.js +54 -0
  747. package/dist/workflows/target-assessment/lib/intended-polypharm-filter.d.ts +4 -0
  748. package/dist/workflows/target-assessment/lib/intended-polypharm-filter.js +24 -0
  749. package/dist/workflows/target-assessment/lib/llm-step.d.ts +77 -0
  750. package/dist/workflows/target-assessment/lib/llm-step.js +99 -0
  751. package/dist/workflows/target-assessment/lib/meddra-organ-map.d.ts +30 -0
  752. package/dist/workflows/target-assessment/lib/meddra-organ-map.js +126 -0
  753. package/dist/workflows/target-assessment/lib/recommendation-quality-gates.d.ts +17 -0
  754. package/dist/workflows/target-assessment/lib/recommendation-quality-gates.js +99 -0
  755. package/dist/workflows/target-assessment/lib/recommendation-sanitizer.d.ts +2 -0
  756. package/dist/workflows/target-assessment/lib/recommendation-sanitizer.js +51 -0
  757. package/dist/workflows/target-assessment/lib/regulatory-actions.d.ts +26 -0
  758. package/dist/workflows/target-assessment/lib/regulatory-actions.js +147 -0
  759. package/dist/workflows/target-assessment/lib/structured-llm.d.ts +58 -0
  760. package/dist/workflows/target-assessment/lib/structured-llm.js +101 -0
  761. package/dist/workflows/target-assessment/lib/target-identity-filter.d.ts +60 -0
  762. package/dist/workflows/target-assessment/lib/target-identity-filter.js +86 -0
  763. package/dist/workflows/target-assessment/lib/therapeutic-programs.d.ts +20 -0
  764. package/dist/workflows/target-assessment/lib/therapeutic-programs.js +68 -0
  765. package/dist/workflows/target-assessment/metrics.d.ts +21 -0
  766. package/dist/workflows/target-assessment/metrics.js +42 -0
  767. package/dist/workflows/target-assessment/phase4-assemble.d.ts +1841 -0
  768. package/dist/workflows/target-assessment/phase4-assemble.js +39 -0
  769. package/dist/workflows/target-assessment/phase5-persist.d.ts +57 -0
  770. package/dist/workflows/target-assessment/phase5-persist.js +461 -0
  771. package/dist/workflows/target-assessment/progress.d.ts +38 -0
  772. package/dist/workflows/target-assessment/progress.js +76 -0
  773. package/dist/workflows/target-assessment/schemas.d.ts +931 -0
  774. package/dist/workflows/target-assessment/schemas.js +293 -0
  775. package/dist/workflows/target-assessment/steps/collectors/pathways.d.ts +15 -0
  776. package/dist/workflows/target-assessment/steps/collectors/pathways.js +58 -0
  777. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.d.ts +34 -0
  778. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.js +31 -0
  779. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.d.ts +57 -0
  780. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.js +54 -0
  781. package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.d.ts +35 -0
  782. package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.js +32 -0
  783. package/dist/workflows/target-assessment/steps/fanout/index.d.ts +14 -0
  784. package/dist/workflows/target-assessment/steps/fanout/index.js +10 -0
  785. package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.d.ts +28 -0
  786. package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.js +27 -0
  787. package/dist/workflows/target-assessment/steps/phase0-resolve.d.ts +71 -0
  788. package/dist/workflows/target-assessment/steps/phase0-resolve.js +21 -0
  789. package/dist/workflows/target-assessment/steps/phase1-aggregate.d.ts +1018 -0
  790. package/dist/workflows/target-assessment/steps/phase1-aggregate.js +25 -0
  791. package/dist/workflows/target-assessment/steps/phase2-aggregate.d.ts +696 -0
  792. package/dist/workflows/target-assessment/steps/phase2-aggregate.js +38 -0
  793. package/dist/workflows/target-assessment/steps/phase3-aggregate.d.ts +936 -0
  794. package/dist/workflows/target-assessment/steps/phase3-aggregate.js +22 -0
  795. package/dist/workflows/target-assessment/steps/synthesis/diagnostics.d.ts +34 -0
  796. package/dist/workflows/target-assessment/steps/synthesis/diagnostics.js +45 -0
  797. package/dist/workflows/target-assessment/sub-workflows/index.d.ts +15 -0
  798. package/dist/workflows/target-assessment/sub-workflows/index.js +11 -0
  799. package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.d.ts +41 -0
  800. package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.js +12 -0
  801. package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.d.ts +41 -0
  802. package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.js +12 -0
  803. package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.d.ts +36 -0
  804. package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.js +12 -0
  805. package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.d.ts +66 -0
  806. package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.js +12 -0
  807. package/dist/workflows/target-assessment/synthesis/index.d.ts +560 -0
  808. package/dist/workflows/target-assessment/synthesis/index.js +351 -0
  809. package/dist/workflows/target-assessment/synthesis-probes.d.ts +56 -0
  810. package/dist/workflows/target-assessment/synthesis-probes.js +320 -0
  811. package/dist/workspace/filesystem.d.ts +117 -0
  812. package/dist/workspace/filesystem.js +304 -0
  813. package/dist/workspace/mount-strategy.d.ts +50 -0
  814. package/dist/workspace/mount-strategy.js +67 -0
  815. package/dist/workspace/paths.d.ts +185 -0
  816. package/dist/workspace/paths.js +219 -0
  817. package/dist/workspace/provenance-collector.d.ts +34 -0
  818. package/dist/workspace/provenance-collector.js +16 -0
  819. package/dist/workspace/search-config.d.ts +23 -0
  820. package/dist/workspace/search-config.js +43 -0
  821. package/dist/workspace/workspace-paths.d.ts +26 -0
  822. package/dist/workspace/workspace-paths.js +31 -0
  823. package/package.json +101 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Backend-agnostic mount model — the single source of truth for the
3
+ * container-side paths, writable step subdirectories, and lib-store env
4
+ * that both the Docker and K8s clients translate into their own mount
5
+ * mechanism (`HostConfig.Binds` vs `volumes`/`volumeMounts`).
6
+ *
7
+ * The storage contract (CLAUDE.md "Storage Layout"): a flat read-only
8
+ * mount of the analysis tree at `/{resourceId}`, a nested read-write
9
+ * mount at `/{resourceId}/runs/{runId}/{stepId}` for the step's
10
+ * artifacts, lib store read-only at `/mnt/libs`, ref store read-only at
11
+ * `/mnt/refs`.
12
+ *
13
+ * Container paths are a function of `resourceId` alone — they never carry the
14
+ * host location of the tree. Where that tree physically lives is the embedder's
15
+ * (`resolveWorkspaceRoot`); the two are reconciled per backend: Docker binds the
16
+ * resolved root directly, K8s addresses it as a `subPath` into the session PVC
17
+ * (see {@link buildSessionSubPaths}).
18
+ */
19
+ export declare const STEP_SUBDIRS: readonly ["output", "scripts", "figures", "logs", "notebooks"];
20
+ export interface MountPlanCoords {
21
+ analysisId: string;
22
+ runId: string;
23
+ stepId: string;
24
+ /**
25
+ * Enforced read-only: emit no read-write step mount. The container sees only
26
+ * the read-only analysis tree (plus container-local `/tmp`). Used by the
27
+ * ephemeral executor, whose prompt promises it physically cannot write files.
28
+ */
29
+ readOnly?: boolean;
30
+ }
31
+ export interface MountPlanStores {
32
+ /** Lib store is mounted at `/mnt/libs` and its env is emitted. */
33
+ libs: boolean;
34
+ /** Ref store is mounted at `/mnt/refs`. */
35
+ refs: boolean;
36
+ }
37
+ export interface MountPlan {
38
+ /** Flat read-only mount of the whole analysis tree. */
39
+ readonlyTreePath: string;
40
+ /**
41
+ * Nested read-write mount for this step's artifacts, also the WorkingDir.
42
+ * Undefined for a read-only sandbox — no writable mount exists; the
43
+ * WorkingDir falls back to the read-only tree root.
44
+ */
45
+ writableStepPath?: string;
46
+ /** Container WorkingDir: the writable step path, or the RO tree root in
47
+ * read-only mode. */
48
+ workingDir: string;
49
+ /** Container path of the lib store, present only when `libs`. */
50
+ libsPath?: string;
51
+ /** Container path of the ref store, present only when `refs`. */
52
+ refsPath?: string;
53
+ /** Pre-created subdirectories under the writable step path. Empty when
54
+ * read-only (nothing to pre-create). */
55
+ stepSubdirs: readonly string[];
56
+ /** Env merged into the sandbox container: provenance + lib-store vars. */
57
+ env: Record<string, string>;
58
+ }
59
+ /** K8s `subPath` strings into the session PVC. No leading or trailing slash. */
60
+ export interface SessionSubPaths {
61
+ /** Read-only mount of the whole analysis tree. */
62
+ readonly ro: string;
63
+ /** Read-write mount of the step's artifact dir; absent when read-only. */
64
+ readonly rw?: string;
65
+ }
66
+ /**
67
+ * K8s `subPath`s for the session-PVC mounts.
68
+ *
69
+ * `workspaceSubPath` is the analysis's workspace root expressed relative to the PVC root —
70
+ * i.e. `relative(pvcRoot, resolveWorkspaceRoot(analysisId))`. Deriving the subPaths from the
71
+ * same resolver that `precreateStepTree` mkdirs under is what makes the directory the harness
72
+ * creates and the directory the pod mounts provably the same one. Hardcoding `{analysisId}`
73
+ * here instead would silently mount elsewhere for any embedder whose roots are not laid out
74
+ * as `{pvcRoot}/{analysisId}` — a coupling nothing in the type system would catch.
75
+ */
76
+ export declare function buildSessionSubPaths(coords: MountPlanCoords, workspaceSubPath: string): SessionSubPaths;
77
+ export declare function buildMountPlan(coords: MountPlanCoords, stores: MountPlanStores): MountPlan;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Backend-agnostic mount model — the single source of truth for the
3
+ * container-side paths, writable step subdirectories, and lib-store env
4
+ * that both the Docker and K8s clients translate into their own mount
5
+ * mechanism (`HostConfig.Binds` vs `volumes`/`volumeMounts`).
6
+ *
7
+ * The storage contract (CLAUDE.md "Storage Layout"): a flat read-only
8
+ * mount of the analysis tree at `/{resourceId}`, a nested read-write
9
+ * mount at `/{resourceId}/runs/{runId}/{stepId}` for the step's
10
+ * artifacts, lib store read-only at `/mnt/libs`, ref store read-only at
11
+ * `/mnt/refs`.
12
+ *
13
+ * Container paths are a function of `resourceId` alone — they never carry the
14
+ * host location of the tree. Where that tree physically lives is the embedder's
15
+ * (`resolveWorkspaceRoot`); the two are reconciled per backend: Docker binds the
16
+ * resolved root directly, K8s addresses it as a `subPath` into the session PVC
17
+ * (see {@link buildSessionSubPaths}).
18
+ */
19
+ import { assertSafeId } from "../workspace/paths.js";
20
+ export const STEP_SUBDIRS = ["output", "scripts", "figures", "logs", "notebooks"];
21
+ const LIBS_CONTAINER_PATH = "/mnt/libs";
22
+ const REFS_CONTAINER_PATH = "/mnt/refs";
23
+ /**
24
+ * The step tail beneath an analysis's workspace root, in both container and
25
+ * PVC-relative space. The harness owns this layout (workspace-layout spec).
26
+ */
27
+ function stepTail(runId, stepId) {
28
+ // The single builder feeding both the container RW path (`buildMountPlan`)
29
+ // and the K8s RW subPath (`buildSessionSubPaths`); validate here so a crafted
30
+ // `stepId` cannot inject a `..`/`/` into either.
31
+ assertSafeId(runId, "runId");
32
+ assertSafeId(stepId, "stepId");
33
+ return `runs/${runId}/${stepId}`;
34
+ }
35
+ /**
36
+ * K8s `subPath`s for the session-PVC mounts.
37
+ *
38
+ * `workspaceSubPath` is the analysis's workspace root expressed relative to the PVC root —
39
+ * i.e. `relative(pvcRoot, resolveWorkspaceRoot(analysisId))`. Deriving the subPaths from the
40
+ * same resolver that `precreateStepTree` mkdirs under is what makes the directory the harness
41
+ * creates and the directory the pod mounts provably the same one. Hardcoding `{analysisId}`
42
+ * here instead would silently mount elsewhere for any embedder whose roots are not laid out
43
+ * as `{pvcRoot}/{analysisId}` — a coupling nothing in the type system would catch.
44
+ */
45
+ export function buildSessionSubPaths(coords, workspaceSubPath) {
46
+ if (workspaceSubPath.length === 0 || workspaceSubPath.startsWith("/") || workspaceSubPath.split("/").includes("..")) {
47
+ throw new Error(`buildSessionSubPaths: workspaceSubPath must be a non-empty PVC-root-relative path without '..' (got ${JSON.stringify(workspaceSubPath)})`);
48
+ }
49
+ return {
50
+ ro: workspaceSubPath,
51
+ rw: coords.readOnly ? undefined : `${workspaceSubPath}/${stepTail(coords.runId, coords.stepId)}`,
52
+ };
53
+ }
54
+ /**
55
+ * Lib-store package-discovery env. PYTHONPATH is intentionally omitted —
56
+ * system Python resolves via a `.pth` file in the lib store.
57
+ */
58
+ function libStoreEnv() {
59
+ return {
60
+ R_LIBS_SITE: "/mnt/libs/current/r/github:/mnt/libs/current/r/bioconductor:/mnt/libs/current/r/cran",
61
+ NODE_PATH: "/mnt/libs/current/node/node_modules",
62
+ PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mnt/libs/current/conda/bin",
63
+ };
64
+ }
65
+ export function buildMountPlan(coords, stores) {
66
+ const { analysisId, runId, stepId, readOnly } = coords;
67
+ // `analysisId` becomes the RO mount point `/{analysisId}` even in read-only
68
+ // mode (where `stepTail` — which validates runId/stepId — is not reached).
69
+ assertSafeId(analysisId, "analysisId");
70
+ const readonlyTreePath = `/${analysisId}`;
71
+ const writableStepPath = readOnly ? undefined : `${readonlyTreePath}/${stepTail(runId, stepId)}`;
72
+ return {
73
+ readonlyTreePath,
74
+ writableStepPath,
75
+ workingDir: writableStepPath ?? readonlyTreePath,
76
+ libsPath: stores.libs ? LIBS_CONTAINER_PATH : undefined,
77
+ refsPath: stores.refs ? REFS_CONTAINER_PATH : undefined,
78
+ stepSubdirs: readOnly ? [] : STEP_SUBDIRS,
79
+ env: {
80
+ PROVENANCE_WATCH_DIRS: readonlyTreePath,
81
+ ...(stores.libs ? libStoreEnv() : {}),
82
+ },
83
+ };
84
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Notification-cleanup sweep — clears unconsumed `dbos.notifications`
3
+ * rows whose owning workflow has reached a terminal status (SUCCESS,
4
+ * ERROR, CANCELLED).
5
+ *
6
+ * Background: a `DBOS.send` to an already-completed workflow accumulates
7
+ * forever as `consumed=f`. The watchdog's
8
+ * synthetic-failure send guarantees this happens at the protocol level —
9
+ * a real `complete` may arrive microseconds before the watchdog and the
10
+ * loser becomes a stuck notification.
11
+ *
12
+ * Cadence is separate from the liveness watchdog (~5 minutes vs ~1
13
+ * minute). Bounded delete batch keeps the lock window short.
14
+ *
15
+ * Production reads the DBOS system DB via the app pool (DBOS by default
16
+ * shares the database, only the pool is separate). The query function is
17
+ * injectable so tests can drive the sweep against a stub.
18
+ */
19
+ import type { Pool } from "pg";
20
+ import type pino from "pino";
21
+ export interface SweepDeps {
22
+ /**
23
+ * Execute the bounded DELETE. Returns the row count cleared. Injected
24
+ * for tests; production wires the app pool.
25
+ */
26
+ deleteStale: (limit: number) => Promise<number>;
27
+ logger?: Pick<pino.Logger, "info" | "warn" | "error">;
28
+ }
29
+ export declare function sweepStaleNotifications(deps: SweepDeps): Promise<number>;
30
+ /**
31
+ * Default `deleteStale` for production — issues the bounded DELETE
32
+ * against the shared application pool, which DBOS by default connects
33
+ * to. The CTE form keeps the join + the LIMIT in one statement.
34
+ */
35
+ export declare function makeDefaultDeleteStale(pool: Pool): (limit: number) => Promise<number>;
36
+ export interface RegisterNotificationSweepDeps {
37
+ pool: Pool;
38
+ logger?: Pick<pino.Logger, "info" | "warn" | "error">;
39
+ /** Override the DELETE driver — production defaults to the app pool. */
40
+ deleteStale?: (limit: number) => Promise<number>;
41
+ }
42
+ export declare function registerNotificationSweep(deps: RegisterNotificationSweepDeps): void;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Notification-cleanup sweep — clears unconsumed `dbos.notifications`
3
+ * rows whose owning workflow has reached a terminal status (SUCCESS,
4
+ * ERROR, CANCELLED).
5
+ *
6
+ * Background: a `DBOS.send` to an already-completed workflow accumulates
7
+ * forever as `consumed=f`. The watchdog's
8
+ * synthetic-failure send guarantees this happens at the protocol level —
9
+ * a real `complete` may arrive microseconds before the watchdog and the
10
+ * loser becomes a stuck notification.
11
+ *
12
+ * Cadence is separate from the liveness watchdog (~5 minutes vs ~1
13
+ * minute). Bounded delete batch keeps the lock window short.
14
+ *
15
+ * Production reads the DBOS system DB via the app pool (DBOS by default
16
+ * shares the database, only the pool is separate). The query function is
17
+ * injectable so tests can drive the sweep against a stub.
18
+ */
19
+ import { DBOS } from "@dbos-inc/dbos-sdk";
20
+ const SWEEP_CRON = "0 */5 * * * *";
21
+ const DELETE_BATCH_LIMIT = 10_000;
22
+ export async function sweepStaleNotifications(deps) {
23
+ try {
24
+ const cleared = await deps.deleteStale(DELETE_BATCH_LIMIT);
25
+ deps.logger?.info({ rowsCleared: cleared }, "[notification-sweep] cleared stale notifications");
26
+ return cleared;
27
+ }
28
+ catch (err) {
29
+ deps.logger?.error({ err: err instanceof Error ? err.message : String(err) }, "[notification-sweep] sweep failed");
30
+ throw err;
31
+ }
32
+ }
33
+ /**
34
+ * Default `deleteStale` for production — issues the bounded DELETE
35
+ * against the shared application pool, which DBOS by default connects
36
+ * to. The CTE form keeps the join + the LIMIT in one statement.
37
+ */
38
+ export function makeDefaultDeleteStale(pool) {
39
+ return async (limit) => {
40
+ const result = await pool.query({
41
+ text: `WITH stale AS (
42
+ SELECT destination_uuid, topic, message
43
+ FROM dbos.notifications n
44
+ WHERE n.consumed = false
45
+ AND EXISTS (
46
+ SELECT 1 FROM dbos.workflow_status w
47
+ WHERE w.workflow_uuid = n.destination_uuid
48
+ AND w.status IN ('SUCCESS','ERROR','CANCELLED')
49
+ )
50
+ LIMIT $1
51
+ )
52
+ DELETE FROM dbos.notifications n
53
+ USING stale s
54
+ WHERE n.destination_uuid = s.destination_uuid
55
+ AND n.topic = s.topic
56
+ AND n.message = s.message`,
57
+ values: [limit],
58
+ });
59
+ return result.rowCount ?? 0;
60
+ };
61
+ }
62
+ export function registerNotificationSweep(deps) {
63
+ const deleteStale = deps.deleteStale ?? makeDefaultDeleteStale(deps.pool);
64
+ // The scheduled target must itself be a registered workflow — DBOS's
65
+ // scheduler loop skips (and errors on) any `@scheduled` function that lacks
66
+ // a workflow registration. Register, then schedule the same callable.
67
+ const sweep = DBOS.registerWorkflow(async () => {
68
+ await sweepStaleNotifications({ deleteStale, logger: deps.logger });
69
+ }, { name: "dbos-notifications-sweep" });
70
+ DBOS.registerScheduled(sweep, {
71
+ name: "dbos-notifications-sweep",
72
+ crontab: SWEEP_CRON,
73
+ });
74
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Sandbox reaper — the sole cleanup for orphaned sandboxes and stale registry
3
+ * rows (see the harness-sandbox-exec spec, CONTEXT.md "Sandbox reaper").
4
+ *
5
+ * Distinct from the liveness watchdog (`sandbox/watchdog.ts`): the watchdog
6
+ * sweeps registry→cluster and unblocks stuck recvs; the reaper sweeps
7
+ * cluster→registry and garbage-collects. It lists every Cortex-managed sandbox
8
+ * machine in the configured namespace, reads each machine's owner-workflow-id
9
+ * label, and reaps any whose owning workflow is terminal/missing — tearing the
10
+ * machine down and reconciling its step row.
11
+ *
12
+ * Why a sweep and not teardown-on-cancel: DBOS forbids running a step in a
13
+ * cancelled workflow, so the body cannot tear down on the cancel path; and only
14
+ * a cluster-side sweep catches permanent scale-down orphans (see the harness-durable-runtime spec), whose
15
+ * workflows never recover to run any cleanup.
16
+ *
17
+ * The pure decision logic (`classifyManaged`) and the sweep (`reapOnce`) are
18
+ * hoisted for unit testing without a DBOS runtime; `registerSandboxReaper` is
19
+ * the thin production wiring.
20
+ */
21
+ import type pino from "pino";
22
+ import type { Pool } from "pg";
23
+ import type { SandboxClient } from "./client.js";
24
+ import type { ManagedSandbox } from "./types.js";
25
+ export type ReapDecision = "leave" | "reap";
26
+ /**
27
+ * Decide whether a managed machine is reapable. The owning workflow's status
28
+ * is authoritative — DBOS writes it at enqueue, *before* the machine exists, so
29
+ * a just-spawned machine is always observably in-flight and never mistaken for
30
+ * an orphan. Only the no-status case (no owner label, or the workflow is gone)
31
+ * falls back to a creation-time grace, the one window the status signal can't
32
+ * cover.
33
+ */
34
+ export declare function classifyManaged(sb: ManagedSandbox, status: {
35
+ status: string;
36
+ } | null, nowMs: number, graceMs: number): ReapDecision;
37
+ /** Map the owning workflow's terminal status to the step row's terminal status. */
38
+ export declare function terminalStepStatus(workflowStatus: string | null): "canceled" | "failed" | "completed";
39
+ export interface ReaperDeps {
40
+ pool: Pool;
41
+ sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById">;
42
+ getStatus: (workflowId: string) => Promise<{
43
+ status: string;
44
+ } | null>;
45
+ /** Creation-time grace for label-less / orphaned machines. */
46
+ graceMs?: number;
47
+ /** Wall-clock ms; injected for tests. */
48
+ nowMs?: () => number;
49
+ logger?: Pick<pino.Logger, "info" | "warn" | "error">;
50
+ }
51
+ export interface ReapSummary {
52
+ managedCount: number;
53
+ reapedCount: number;
54
+ rowsReconciled: number;
55
+ leftCount: number;
56
+ }
57
+ /**
58
+ * One cluster→registry sweep. Lists managed machines, classifies each against
59
+ * its owner workflow's status, and reaps the terminal/orphaned ones. A reap
60
+ * failure on one machine is logged and skipped — the next sweep retries.
61
+ */
62
+ export declare function reapOnce(deps: ReaperDeps): Promise<ReapSummary>;
63
+ export interface RegisterReaperDeps {
64
+ pool: Pool;
65
+ sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById">;
66
+ graceMs?: number;
67
+ logger?: Pick<pino.Logger, "info" | "warn" | "error">;
68
+ }
69
+ /** Production registration: a single (unsharded) `@DBOS.scheduled` workflow. */
70
+ export declare function registerSandboxReaper(deps: RegisterReaperDeps): void;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Sandbox reaper — the sole cleanup for orphaned sandboxes and stale registry
3
+ * rows (see the harness-sandbox-exec spec, CONTEXT.md "Sandbox reaper").
4
+ *
5
+ * Distinct from the liveness watchdog (`sandbox/watchdog.ts`): the watchdog
6
+ * sweeps registry→cluster and unblocks stuck recvs; the reaper sweeps
7
+ * cluster→registry and garbage-collects. It lists every Cortex-managed sandbox
8
+ * machine in the configured namespace, reads each machine's owner-workflow-id
9
+ * label, and reaps any whose owning workflow is terminal/missing — tearing the
10
+ * machine down and reconciling its step row.
11
+ *
12
+ * Why a sweep and not teardown-on-cancel: DBOS forbids running a step in a
13
+ * cancelled workflow, so the body cannot tear down on the cancel path; and only
14
+ * a cluster-side sweep catches permanent scale-down orphans (see the harness-durable-runtime spec), whose
15
+ * workflows never recover to run any cleanup.
16
+ *
17
+ * The pure decision logic (`classifyManaged`) and the sweep (`reapOnce`) are
18
+ * hoisted for unit testing without a DBOS runtime; `registerSandboxReaper` is
19
+ * the thin production wiring.
20
+ */
21
+ import { DBOS } from "@dbos-inc/dbos-sdk";
22
+ import { unwrapOrThrow } from "../lib/result.js";
23
+ import { reconcileReapedSandbox } from "../state/active-sandboxes.js";
24
+ const REAPER_CRON = "0 */5 * * * *";
25
+ const DEFAULT_GRACE_MS = 10 * 60_000;
26
+ /**
27
+ * Workflow statuses that mean "still owns its sandbox — never reap". Must
28
+ * include every non-terminal DBOS state (`mapDbosToRunStatus` in
29
+ * `routes/run-status.ts` is the canonical active set): `RUNNING` especially —
30
+ * an actively-executing step's workflow is RUNNING, and omitting it would reap
31
+ * a live sandbox out from under a running step.
32
+ */
33
+ const ACTIVE_WORKFLOW_STATUSES = new Set(["PENDING", "ENQUEUED", "RUNNING"]);
34
+ /**
35
+ * Decide whether a managed machine is reapable. The owning workflow's status
36
+ * is authoritative — DBOS writes it at enqueue, *before* the machine exists, so
37
+ * a just-spawned machine is always observably in-flight and never mistaken for
38
+ * an orphan. Only the no-status case (no owner label, or the workflow is gone)
39
+ * falls back to a creation-time grace, the one window the status signal can't
40
+ * cover.
41
+ */
42
+ export function classifyManaged(sb, status, nowMs, graceMs) {
43
+ if (status && ACTIVE_WORKFLOW_STATUSES.has(status.status))
44
+ return "leave";
45
+ if (status)
46
+ return "reap";
47
+ const ageMs = sb.createdAtMs == null ? Number.POSITIVE_INFINITY : nowMs - sb.createdAtMs;
48
+ return ageMs >= graceMs ? "reap" : "leave";
49
+ }
50
+ /** Map the owning workflow's terminal status to the step row's terminal status. */
51
+ export function terminalStepStatus(workflowStatus) {
52
+ switch (workflowStatus) {
53
+ case "CANCELLED":
54
+ return "canceled";
55
+ case "SUCCESS":
56
+ return "completed";
57
+ default:
58
+ // ERROR, MAX_RECOVERY_ATTEMPTS_EXCEEDED, or no workflow at all.
59
+ return "failed";
60
+ }
61
+ }
62
+ /**
63
+ * One cluster→registry sweep. Lists managed machines, classifies each against
64
+ * its owner workflow's status, and reaps the terminal/orphaned ones. A reap
65
+ * failure on one machine is logged and skipped — the next sweep retries.
66
+ */
67
+ export async function reapOnce(deps) {
68
+ const nowMs = (deps.nowMs ?? (() => Date.now()))();
69
+ const graceMs = deps.graceMs ?? DEFAULT_GRACE_MS;
70
+ const managed = await deps.sandboxClient.listManagedSandboxes();
71
+ let reapedCount = 0;
72
+ let rowsReconciled = 0;
73
+ let leftCount = 0;
74
+ for (const sb of managed) {
75
+ const status = sb.ownerWorkflowId ? await deps.getStatus(sb.ownerWorkflowId) : null;
76
+ if (classifyManaged(sb, status, nowMs, graceMs) === "leave") {
77
+ leftCount++;
78
+ continue;
79
+ }
80
+ try {
81
+ await deps.sandboxClient.teardownById(sb.sandboxId);
82
+ reapedCount++;
83
+ const reconciled = unwrapOrThrow(await reconcileReapedSandbox(deps.pool, sb.sandboxId, terminalStepStatus(status?.status ?? null)));
84
+ if (reconciled)
85
+ rowsReconciled++;
86
+ }
87
+ catch (err) {
88
+ deps.logger?.warn({
89
+ sandboxId: sb.sandboxId,
90
+ err: err instanceof Error ? err.message : String(err),
91
+ }, "[sandbox-reaper] reap failed — skipping this round");
92
+ }
93
+ }
94
+ const summary = {
95
+ managedCount: managed.length,
96
+ reapedCount,
97
+ rowsReconciled,
98
+ leftCount,
99
+ };
100
+ deps.logger?.info(summary, "[sandbox-reaper] sweep completed");
101
+ return summary;
102
+ }
103
+ /** Production registration: a single (unsharded) `@DBOS.scheduled` workflow. */
104
+ export function registerSandboxReaper(deps) {
105
+ const reaper = DBOS.registerWorkflow(async () => {
106
+ // The whole sweep is ONE step: `listManagedSandboxes` is live cluster
107
+ // state (set membership + order vary across runs) and it gates how many
108
+ // per-machine `getWorkflowStatus` reads happen. In the workflow body
109
+ // `getWorkflowStatus` is a function-ID-counting op, so a differing list
110
+ // on replay would diverge the recorded sequence. Inside a step the sweep
111
+ // is checkpointed wholesale and `getWorkflowStatus` is a plain read.
112
+ await DBOS.runStep(() => reapOnce({
113
+ pool: deps.pool,
114
+ sandboxClient: deps.sandboxClient,
115
+ getStatus: async (workflowId) => (await DBOS.getWorkflowStatus(workflowId)),
116
+ graceMs: deps.graceMs,
117
+ logger: deps.logger,
118
+ }), { name: "sandbox-reaper-sweep" });
119
+ }, { name: "sandbox-reaper" });
120
+ DBOS.registerScheduled(reaper, {
121
+ name: "sandbox-reaper",
122
+ crontab: REAPER_CRON,
123
+ });
124
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Sandbox Result glue for cortex.
3
+ *
4
+ * The sandbox backend boundaries — the Docker SDK ops (`docker-client.ts`) and
5
+ * the K8s client ops (`k8s-client.ts`) — model failure as values: each external
6
+ * op returns `ResultAsync<T, SandboxError>`. The ONLY `try/catch` against the
7
+ * SDK/driver call lives in those files (via the `trySandbox` helper here);
8
+ * everything up to the composition seam flows `ResultAsync`. (`submitExec`
9
+ * (`submit-exec.ts`) is NOT on this channel — it wraps its own `/exec` POST in a
10
+ * `DBOS.runStep` and throws on a non-202 so the step boundary records the
11
+ * failure.)
12
+ *
13
+ * House rules realized here (see `lib/result.ts`):
14
+ * - Absence / "already gone" is NOT an error. A 404 on inspect/isAlive is the
15
+ * OK-channel fact `ok(false)`; a 404 on teardown is a successful idempotent
16
+ * teardown `ok(undefined)`; a 409 name-conflict that the owner-guard adopts
17
+ * is the OK-channel outcome of create. `SandboxError` is reserved for a
18
+ * genuine failure — a create that cannot complete, a name-collision the
19
+ * owner-guard REFUSES, a submit the server rejects, a teardown the driver
20
+ * errors on, a liveness probe that errors.
21
+ * - Control-flow exceptions are NOT failures and are never captured as a
22
+ * `SandboxError`. The recv loop's `HardCancelError` / `ExecTimeoutError`
23
+ * (`await-exec.ts`) and DBOS's `DBOSWorkflowCancelledError` / `AbortError`
24
+ * are control-flow signalling — they live OUTSIDE this error channel and
25
+ * propagate untouched. `await-exec.ts` is NOT converted; `trySandbox` only
26
+ * ever wraps the single SDK/HTTP call handed to it.
27
+ *
28
+ * The public `SandboxClient` interface keeps `Promise<T>` method signatures.
29
+ * `create-sandbox.ts` is the composition seam: it builds the backend ops, then
30
+ * `unwrapOrThrow`s each op's `ResultAsync` so the seam re-throws a genuine
31
+ * `SandboxError`. (`submitExec` is the exception — it is already its own DBOS
32
+ * step and throws directly, so the seam forwards its `Promise<void>` as-is.)
33
+ * Workflow consumers (`sandbox-step.ts`) already wrap each seam call in
34
+ * `DBOS.runStep`, so the re-thrown error records the step as failed;
35
+ * non-workflow consumers (`reaper`, `watchdog`, `ephemeral-runner`,
36
+ * `data-profile`, `run-exec`) already handle a thrown failure. They are
37
+ * untouched by this wave.
38
+ */
39
+ import { ResultAsync } from "neverthrow";
40
+ /**
41
+ * A sandbox backend failure. Absence / idempotent "already gone" is NOT
42
+ * modelled — those ride the OK channel (`ok(false)` for a dead/missing machine,
43
+ * `ok(undefined)` for a teardown that found nothing to remove). `op` is a
44
+ * stable label (e.g. `"docker.createSandbox"`); `sandboxId` is carried when the
45
+ * op knows it. `status` carries the originating HTTP status when one exists.
46
+ */
47
+ export type SandboxError = {
48
+ readonly type: "container_create_failed";
49
+ readonly op: string;
50
+ readonly sandboxId?: string;
51
+ readonly status?: number;
52
+ readonly cause: unknown;
53
+ } | {
54
+ readonly type: "name_conflict";
55
+ readonly op: string;
56
+ readonly sandboxId: string;
57
+ readonly owner: string | null;
58
+ readonly cause?: unknown;
59
+ } | {
60
+ readonly type: "not_found";
61
+ readonly op: string;
62
+ readonly sandboxId?: string;
63
+ readonly cause?: unknown;
64
+ } | {
65
+ readonly type: "submit_failed";
66
+ readonly op: string;
67
+ readonly execId: string;
68
+ readonly status?: number;
69
+ readonly cause: unknown;
70
+ } | {
71
+ readonly type: "teardown_failed";
72
+ readonly op: string;
73
+ readonly sandboxId?: string;
74
+ readonly status?: number;
75
+ readonly cause: unknown;
76
+ } | {
77
+ readonly type: "liveness_failed";
78
+ readonly op: string;
79
+ readonly sandboxId?: string;
80
+ readonly status?: number;
81
+ readonly cause: unknown;
82
+ };
83
+ /**
84
+ * The HTTP/driver status a backend SDK error carries. dockerode exposes it on
85
+ * `.statusCode`; `@kubernetes/client-node` (v1.x) on `.code` (a number).
86
+ * Mirror the per-client `statusCodeOf` so 404/409 classification is identical.
87
+ * A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
88
+ * `typeof === "number"` to avoid returning it as a status.
89
+ */
90
+ export declare function sandboxStatusOf(cause: unknown): number | undefined;
91
+ /** A one-line, user-facing description of a `SandboxError` for logs/error bodies. */
92
+ export declare function describeSandboxError(e: SandboxError): string;
93
+ /**
94
+ * Wrap a single sandbox backend call (Docker SDK op, K8s API op, or the
95
+ * `/exec` POST). A throw becomes `err(toError(status, cause))`; the caller
96
+ * supplies `toError` so each op classifies its own throw (create vs submit vs
97
+ * teardown vs liveness) and special-cases 404/409.
98
+ *
99
+ * `fn` runs the single SDK/HTTP call and returns the already-mapped value
100
+ * (`T`). Keep `fn` to that one call plus trivial mapping; do NOT embed
101
+ * control-flow that could throw a non-backend error (the recv loop's
102
+ * `HardCancelError`/`ExecTimeoutError` and DBOS cancellation must stay outside
103
+ * any `trySandbox` so they propagate as control-flow, never become an `err`).
104
+ */
105
+ export declare function trySandbox<T>(fn: () => Promise<T>, toError: (status: number | undefined, cause: unknown) => SandboxError): ResultAsync<T, SandboxError>;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Sandbox Result glue for cortex.
3
+ *
4
+ * The sandbox backend boundaries — the Docker SDK ops (`docker-client.ts`) and
5
+ * the K8s client ops (`k8s-client.ts`) — model failure as values: each external
6
+ * op returns `ResultAsync<T, SandboxError>`. The ONLY `try/catch` against the
7
+ * SDK/driver call lives in those files (via the `trySandbox` helper here);
8
+ * everything up to the composition seam flows `ResultAsync`. (`submitExec`
9
+ * (`submit-exec.ts`) is NOT on this channel — it wraps its own `/exec` POST in a
10
+ * `DBOS.runStep` and throws on a non-202 so the step boundary records the
11
+ * failure.)
12
+ *
13
+ * House rules realized here (see `lib/result.ts`):
14
+ * - Absence / "already gone" is NOT an error. A 404 on inspect/isAlive is the
15
+ * OK-channel fact `ok(false)`; a 404 on teardown is a successful idempotent
16
+ * teardown `ok(undefined)`; a 409 name-conflict that the owner-guard adopts
17
+ * is the OK-channel outcome of create. `SandboxError` is reserved for a
18
+ * genuine failure — a create that cannot complete, a name-collision the
19
+ * owner-guard REFUSES, a submit the server rejects, a teardown the driver
20
+ * errors on, a liveness probe that errors.
21
+ * - Control-flow exceptions are NOT failures and are never captured as a
22
+ * `SandboxError`. The recv loop's `HardCancelError` / `ExecTimeoutError`
23
+ * (`await-exec.ts`) and DBOS's `DBOSWorkflowCancelledError` / `AbortError`
24
+ * are control-flow signalling — they live OUTSIDE this error channel and
25
+ * propagate untouched. `await-exec.ts` is NOT converted; `trySandbox` only
26
+ * ever wraps the single SDK/HTTP call handed to it.
27
+ *
28
+ * The public `SandboxClient` interface keeps `Promise<T>` method signatures.
29
+ * `create-sandbox.ts` is the composition seam: it builds the backend ops, then
30
+ * `unwrapOrThrow`s each op's `ResultAsync` so the seam re-throws a genuine
31
+ * `SandboxError`. (`submitExec` is the exception — it is already its own DBOS
32
+ * step and throws directly, so the seam forwards its `Promise<void>` as-is.)
33
+ * Workflow consumers (`sandbox-step.ts`) already wrap each seam call in
34
+ * `DBOS.runStep`, so the re-thrown error records the step as failed;
35
+ * non-workflow consumers (`reaper`, `watchdog`, `ephemeral-runner`,
36
+ * `data-profile`, `run-exec`) already handle a thrown failure. They are
37
+ * untouched by this wave.
38
+ */
39
+ import { ResultAsync, err, ok } from "neverthrow";
40
+ const _assertDomainError = true;
41
+ /**
42
+ * The HTTP/driver status a backend SDK error carries. dockerode exposes it on
43
+ * `.statusCode`; `@kubernetes/client-node` (v1.x) on `.code` (a number).
44
+ * Mirror the per-client `statusCodeOf` so 404/409 classification is identical.
45
+ * A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
46
+ * `typeof === "number"` to avoid returning it as a status.
47
+ */
48
+ export function sandboxStatusOf(cause) {
49
+ const e = cause;
50
+ if (typeof e.code === "number")
51
+ return e.code;
52
+ return e.statusCode ?? e.response?.statusCode;
53
+ }
54
+ /** A one-line, user-facing description of a `SandboxError` for logs/error bodies. */
55
+ export function describeSandboxError(e) {
56
+ switch (e.type) {
57
+ case "container_create_failed":
58
+ return `sandbox create failed (${e.op}${e.sandboxId ? `: ${e.sandboxId}` : ""})`;
59
+ case "name_conflict":
60
+ return `sandbox name collision (${e.op}: ${e.sandboxId} owned by ${e.owner ?? "<unlabeled>"})`;
61
+ case "not_found":
62
+ return `sandbox not found (${e.op}${e.sandboxId ? `: ${e.sandboxId}` : ""})`;
63
+ case "submit_failed":
64
+ return `sandbox exec submit failed (${e.op}: execId=${e.execId})`;
65
+ case "teardown_failed":
66
+ return `sandbox teardown failed (${e.op}${e.sandboxId ? `: ${e.sandboxId}` : ""})`;
67
+ case "liveness_failed":
68
+ return `sandbox liveness probe failed (${e.op}${e.sandboxId ? `: ${e.sandboxId}` : ""})`;
69
+ }
70
+ }
71
+ /**
72
+ * Wrap a single sandbox backend call (Docker SDK op, K8s API op, or the
73
+ * `/exec` POST). A throw becomes `err(toError(status, cause))`; the caller
74
+ * supplies `toError` so each op classifies its own throw (create vs submit vs
75
+ * teardown vs liveness) and special-cases 404/409.
76
+ *
77
+ * `fn` runs the single SDK/HTTP call and returns the already-mapped value
78
+ * (`T`). Keep `fn` to that one call plus trivial mapping; do NOT embed
79
+ * control-flow that could throw a non-backend error (the recv loop's
80
+ * `HardCancelError`/`ExecTimeoutError` and DBOS cancellation must stay outside
81
+ * any `trySandbox` so they propagate as control-flow, never become an `err`).
82
+ */
83
+ export function trySandbox(fn, toError) {
84
+ return new ResultAsync((async () => {
85
+ try {
86
+ return ok(await fn());
87
+ }
88
+ catch (cause) {
89
+ return err(toError(sandboxStatusOf(cause), cause));
90
+ }
91
+ })());
92
+ }