@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,488 @@
1
+ /**
2
+ * K8s-backed `createSandbox` / `teardown` / `isAlive`.
3
+ *
4
+ * Launches a sandbox Job with `CORTEX_BASE_URL` and `SANDBOX_CALLBACK_SECRET`
5
+ * env vars; pod IP + port 8765 are the host/port Cortex POSTs `/exec` to.
6
+ * Storage is wired via the shared session PVC: a flat read-only `volumeMount`
7
+ * of the analysis tree at `/{resourceId}` plus a nested read-write mount of the
8
+ * step's artifact dir, with the lib/ref stores mounted read-only at `/mnt/libs`
9
+ * / `/mnt/refs` when their PVCs are set. Container paths and lib-store env come
10
+ * from the shared mount plan; the PVC `subPath`s are derived from the same
11
+ * `resolveWorkspaceRoot` seam the harness pre-creates the step tree under, so
12
+ * both sides address one directory by construction.
13
+ */
14
+ import { relative as relativePath, sep } from "node:path";
15
+ import { BatchV1Api, CoreV1Api, KubeConfig } from "@kubernetes/client-node";
16
+ import { ResultAsync, err, ok } from "neverthrow";
17
+ import { trySandbox } from "./sandbox-error.js";
18
+ import { buildMountPlan, buildSessionSubPaths } from "./mount-plan.js";
19
+ /** Read the originating HTTP status off any `SandboxError` variant that carries one. */
20
+ function statusOf(e) {
21
+ return "status" in e ? e.status : undefined;
22
+ }
23
+ const SESSION_VOLUME_NAME = "session";
24
+ const LIBS_VOLUME_NAME = "libs";
25
+ const REFS_VOLUME_NAME = "refs";
26
+ const SANDBOX_SERVER_PORT = 8765;
27
+ const POD_READY_TIMEOUT_MS = 5 * 60_000;
28
+ const POD_POLL_INTERVAL_MS = 1_000;
29
+ const MANAGED_BY_LABEL = "app.kubernetes.io/managed-by";
30
+ const MANAGED_BY_VALUE = "cortex";
31
+ const OWNER_WORKFLOW_LABEL = "cortex/owner-workflow-id";
32
+ const RUN_ID_LABEL = "cortex/run-id";
33
+ const STEP_ID_LABEL = "cortex/step-id";
34
+ /**
35
+ * Coerce an arbitrary identifier into a valid K8s label value:
36
+ * ≤63 chars, `[A-Za-z0-9._-]` only, starting and ending alphanumeric.
37
+ * Workflow ids legitimately contain `:` (exec-id routing packs
38
+ * `workflowId:stepId:fnId`), which is illegal in a label — without this an
39
+ * otherwise-valid Job is rejected with a 422 at admission. Sanitization is a
40
+ * no-op for already-valid ids, so DBOS-keyed lookups (adoption, reaper) match
41
+ * unchanged; only the synthetic, non-DBOS data-profile id is rewritten.
42
+ */
43
+ export function sanitizeLabelValue(value) {
44
+ return value
45
+ .replace(/[^A-Za-z0-9._-]/g, "-")
46
+ .replace(/^[^A-Za-z0-9]+/, "")
47
+ .slice(0, 63)
48
+ .replace(/[^A-Za-z0-9]+$/, "");
49
+ }
50
+ function deleteJobIgnoreMissing(batchApi, namespace, name) {
51
+ return trySandbox(async () => {
52
+ await batchApi.deleteNamespacedJob({
53
+ namespace,
54
+ name,
55
+ propagationPolicy: "Foreground",
56
+ });
57
+ }, (status, cause) => ({
58
+ type: "teardown_failed",
59
+ op: "k8s.teardown",
60
+ sandboxId: name,
61
+ status,
62
+ cause,
63
+ })).orElse((e) =>
64
+ // A 404 means the Job is already gone — an idempotent success.
65
+ statusOf(e) === 404 ? ok(undefined) : err(e));
66
+ }
67
+ function buildKubeApi() {
68
+ const kc = new KubeConfig();
69
+ // In-cluster when running on a pod, else from ~/.kube/config.
70
+ try {
71
+ kc.loadFromCluster();
72
+ }
73
+ catch {
74
+ kc.loadFromDefault();
75
+ }
76
+ return {
77
+ batchApi: kc.makeApiClient(BatchV1Api),
78
+ coreApi: kc.makeApiClient(CoreV1Api),
79
+ };
80
+ }
81
+ /**
82
+ * Express an analysis's resolved workspace root as a path relative to the session PVC's root.
83
+ * A root outside the PVC cannot be addressed by `subPath` at all, so the pod would silently
84
+ * mount a directory the harness never wrote to — fail loudly instead. `createSandbox` runs
85
+ * inside a DBOS workflow body, where a throw is the durable failure signal.
86
+ */
87
+ function workspaceSubPathFor(config, analysisId) {
88
+ if (!config.sessionPvcRoot) {
89
+ throw new Error("k8s sandbox: sessionPvc is set but sessionPvcRoot is not — the PVC subPath of a workspace root cannot be derived");
90
+ }
91
+ const rel = relativePath(config.sessionPvcRoot, config.resolveWorkspaceRoot(analysisId));
92
+ const posix = rel.split(sep).join("/");
93
+ if (posix.length === 0 || posix.startsWith("..")) {
94
+ throw new Error(`k8s sandbox: workspace root for ${analysisId} does not live under sessionPvcRoot (${config.sessionPvcRoot})`);
95
+ }
96
+ return posix;
97
+ }
98
+ function buildJobSpec(meta, config, identity) {
99
+ const { sandboxId } = identity;
100
+ const plan = buildMountPlan(meta, {
101
+ libs: !!config.libStorePvc,
102
+ refs: !!config.refStorePvc,
103
+ });
104
+ const transport = config.transport ?? "poll";
105
+ const env = [
106
+ { name: "SANDBOX_TRANSPORT", value: transport },
107
+ // Poll mode never dials out, so the URL is omitted (matching the Docker
108
+ // backend) — the pod spec itself then documents that no callback egress
109
+ // is expected. sandbox-server neither reads nor requires it in poll mode.
110
+ ...(transport === "callback" ? [{ name: "CORTEX_BASE_URL", value: config.cortexBaseUrl }] : []),
111
+ { name: "SANDBOX_CALLBACK_SECRET", value: identity.callbackSecret },
112
+ ...Object.entries(plan.env).map(([name, value]) => ({ name, value })),
113
+ ...Object.entries(meta.extraEnv ?? {}).map(([k, v]) => ({
114
+ name: k,
115
+ value: v,
116
+ })),
117
+ ];
118
+ // requests == limits → Guaranteed QoS and a predictable OOM bound; also
119
+ // satisfies the namespace ResourceQuota, which rejects any pod that omits
120
+ // requests.cpu/memory. The CPU limit can throttle a hot step, but a throttle
121
+ // beats an eviction.
122
+ const spec = meta.resources;
123
+ const quantities = {
124
+ cpu: String(spec.cpu),
125
+ memory: `${spec.memoryGb}Gi`,
126
+ };
127
+ if (spec.gpu)
128
+ quantities["nvidia.com/gpu"] = String(spec.gpu.count);
129
+ const resources = { requests: quantities, limits: quantities };
130
+ const volumes = [];
131
+ const volumeMounts = [];
132
+ if (config.sessionPvc) {
133
+ const subPaths = buildSessionSubPaths(meta, workspaceSubPathFor(config, meta.analysisId));
134
+ volumes.push({
135
+ name: SESSION_VOLUME_NAME,
136
+ persistentVolumeClaim: { claimName: config.sessionPvc },
137
+ });
138
+ // Most-specific path wins: the nested RW mount shadows the RO tree at
139
+ // the step subtree. A read-only sandbox omits the RW mount entirely —
140
+ // only the read-only tree is mounted.
141
+ volumeMounts.push({
142
+ name: SESSION_VOLUME_NAME,
143
+ mountPath: plan.readonlyTreePath,
144
+ subPath: subPaths.ro,
145
+ readOnly: true,
146
+ });
147
+ if (plan.writableStepPath && subPaths.rw) {
148
+ volumeMounts.push({
149
+ name: SESSION_VOLUME_NAME,
150
+ mountPath: plan.writableStepPath,
151
+ subPath: subPaths.rw,
152
+ readOnly: false,
153
+ });
154
+ }
155
+ }
156
+ if (config.libStorePvc && plan.libsPath) {
157
+ volumes.push({
158
+ name: LIBS_VOLUME_NAME,
159
+ persistentVolumeClaim: { claimName: config.libStorePvc, readOnly: true },
160
+ });
161
+ volumeMounts.push({
162
+ name: LIBS_VOLUME_NAME,
163
+ mountPath: plan.libsPath,
164
+ readOnly: true,
165
+ });
166
+ }
167
+ if (config.refStorePvc && plan.refsPath) {
168
+ volumes.push({
169
+ name: REFS_VOLUME_NAME,
170
+ persistentVolumeClaim: { claimName: config.refStorePvc, readOnly: true },
171
+ });
172
+ volumeMounts.push({
173
+ name: REFS_VOLUME_NAME,
174
+ mountPath: plan.refsPath,
175
+ readOnly: true,
176
+ });
177
+ }
178
+ const podSpec = {
179
+ automountServiceAccountToken: false,
180
+ restartPolicy: "Never",
181
+ containers: [
182
+ {
183
+ name: "sandbox",
184
+ image: meta.image ?? config.image,
185
+ imagePullPolicy: "IfNotPresent",
186
+ env,
187
+ resources,
188
+ workingDir: plan.workingDir,
189
+ volumeMounts,
190
+ ports: [{ containerPort: SANDBOX_SERVER_PORT }],
191
+ securityContext: {
192
+ allowPrivilegeEscalation: false,
193
+ readOnlyRootFilesystem: false,
194
+ capabilities: { drop: ["ALL"] },
195
+ },
196
+ },
197
+ ],
198
+ volumes,
199
+ securityContext: {
200
+ runAsNonRoot: true,
201
+ runAsUser: 1000,
202
+ runAsGroup: 1000,
203
+ fsGroup: 1000,
204
+ seccompProfile: { type: "RuntimeDefault" },
205
+ },
206
+ };
207
+ // Pin sandbox pods to the dedicated agent pool and isolate them under the
208
+ // configured RuntimeClass (gVisor). Each field is omitted when unset so the
209
+ // default-scheduling / default-runtime behaviour is preserved.
210
+ if (config.nodeSelector)
211
+ podSpec.nodeSelector = config.nodeSelector;
212
+ if (config.tolerations)
213
+ podSpec.tolerations = config.tolerations;
214
+ if (config.runtimeClassName)
215
+ podSpec.runtimeClassName = config.runtimeClassName;
216
+ return {
217
+ apiVersion: "batch/v1",
218
+ kind: "Job",
219
+ metadata: {
220
+ name: sandboxId,
221
+ namespace: config.namespace,
222
+ labels: {
223
+ [MANAGED_BY_LABEL]: MANAGED_BY_VALUE,
224
+ role: "sandbox",
225
+ "cortex/sandbox-id": sandboxId,
226
+ [OWNER_WORKFLOW_LABEL]: sanitizeLabelValue(meta.childWorkflowId),
227
+ [RUN_ID_LABEL]: sanitizeLabelValue(meta.runId),
228
+ [STEP_ID_LABEL]: sanitizeLabelValue(meta.stepId),
229
+ },
230
+ },
231
+ spec: {
232
+ backoffLimit: 0,
233
+ ttlSecondsAfterFinished: 60,
234
+ template: {
235
+ metadata: {
236
+ labels: {
237
+ role: "sandbox",
238
+ "cortex/sandbox-id": sandboxId,
239
+ },
240
+ },
241
+ spec: podSpec,
242
+ },
243
+ },
244
+ };
245
+ }
246
+ function waitForPodReady(coreApi, namespace, sandboxId) {
247
+ const createFailed = (status, cause) => ({
248
+ type: "container_create_failed",
249
+ op: "k8s.waitForPodReady",
250
+ sandboxId,
251
+ status,
252
+ cause,
253
+ });
254
+ return new ResultAsync((async () => {
255
+ const deadline = Date.now() + POD_READY_TIMEOUT_MS;
256
+ let lastSnapshot = {};
257
+ while (Date.now() < deadline) {
258
+ const listed = await trySandbox(() => coreApi.listNamespacedPod({
259
+ namespace,
260
+ labelSelector: `cortex/sandbox-id=${sandboxId}`,
261
+ }), createFailed);
262
+ if (listed.isErr())
263
+ return err(listed.error);
264
+ const pod = listed.value.items[0];
265
+ lastSnapshot = {
266
+ phase: pod?.status?.phase,
267
+ podIP: pod?.status?.podIP,
268
+ podName: pod?.metadata?.name,
269
+ };
270
+ if (pod && pod.status?.phase === "Running" && typeof pod.status.podIP === "string" && pod.metadata?.name) {
271
+ return ok({ podIP: pod.status.podIP, podName: pod.metadata.name });
272
+ }
273
+ if (pod?.status?.phase === "Failed") {
274
+ return err(createFailed(undefined, new Error(`K8sSandbox ${sandboxId}: pod phase=Failed before becoming ready`)));
275
+ }
276
+ await new Promise((r) => setTimeout(r, POD_POLL_INTERVAL_MS));
277
+ }
278
+ return err(createFailed(undefined, new Error(`K8sSandbox ${sandboxId}: pod did not reach Running within ` + `${POD_READY_TIMEOUT_MS}ms (last: ${JSON.stringify(lastSnapshot)})`)));
279
+ })());
280
+ }
281
+ /** The single pod behind a sandbox Job is in a terminal phase — a genuinely
282
+ * dead prior attempt, not a machine we should adopt. */
283
+ function existingPodIsTerminal(coreApi, namespace, sandboxId) {
284
+ return trySandbox(() => coreApi.listNamespacedPod({
285
+ namespace,
286
+ labelSelector: `cortex/sandbox-id=${sandboxId}`,
287
+ }), (status, cause) => ({
288
+ type: "container_create_failed",
289
+ op: "k8s.existingPodIsTerminal",
290
+ sandboxId,
291
+ status,
292
+ cause,
293
+ })).map((pods) => {
294
+ const phase = pods.items[0]?.status?.phase;
295
+ return phase === "Failed" || phase === "Succeeded";
296
+ });
297
+ }
298
+ /** Poll until a deleted Job's name is free again — K8s deletion is async, and
299
+ * recreating under the same name before the old object is gone 409s. */
300
+ function waitForJobGone(batchApi, namespace, name) {
301
+ const createFailed = (status, cause) => ({
302
+ type: "container_create_failed",
303
+ op: "k8s.waitForJobGone",
304
+ sandboxId: name,
305
+ status,
306
+ cause,
307
+ });
308
+ return new ResultAsync((async () => {
309
+ const deadline = Date.now() + 60_000;
310
+ while (Date.now() < deadline) {
311
+ const read = await trySandbox(() => batchApi.readNamespacedJob({ namespace, name }), createFailed);
312
+ // A 404 means the prior Job is finally gone — the name is free.
313
+ if (read.isErr()) {
314
+ if (statusOf(read.error) === 404)
315
+ return ok(undefined);
316
+ return err(read.error);
317
+ }
318
+ await new Promise((r) => setTimeout(r, 500));
319
+ }
320
+ return err(createFailed(undefined, new Error(`K8sSandbox ${name}: prior Job did not delete within 60s`)));
321
+ })());
322
+ }
323
+ /**
324
+ * Create the Job, or adopt an existing one on `409 AlreadyExists` — the
325
+ * recovery re-run of the spawn step (see the harness-sandbox-exec spec). A live/starting pod is adopted
326
+ * as-is (the caller's `waitForPodReady` picks up its IP). A terminal pod is a
327
+ * dead prior attempt under the same checkpointed name: delete it, wait for the
328
+ * name to free, and recreate fresh.
329
+ *
330
+ * Adoption (and deletion) is **owner-guarded**: the existing Job's
331
+ * `cortex/owner-workflow-id` label must match this step's `ownerWorkflowId`.
332
+ * Only a recovery re-run carries the same checkpointed identity, so a mismatch
333
+ * means an (astronomically rare) name collision with a *different* step —
334
+ * adopting its pod would HMAC-fail every callback, and deleting its Job would
335
+ * kill a live sibling. Refuse loudly instead.
336
+ */
337
+ function createOrAdoptJob(batchApi, coreApi, namespace, sandboxId, ownerWorkflowId, job) {
338
+ const createFailed = (status, cause) => ({
339
+ type: "container_create_failed",
340
+ op: "k8s.createNamespacedJob",
341
+ sandboxId,
342
+ status,
343
+ cause,
344
+ });
345
+ return new ResultAsync((async () => {
346
+ const created = await trySandbox(() => batchApi.createNamespacedJob({ namespace, body: job }), createFailed);
347
+ if (created.isOk())
348
+ return ok(undefined);
349
+ if (statusOf(created.error) !== 409)
350
+ return err(created.error);
351
+ const existingRead = await trySandbox(() => batchApi.readNamespacedJob({ namespace, name: sandboxId }), createFailed);
352
+ if (existingRead.isErr())
353
+ return err(existingRead.error);
354
+ const owner = existingRead.value.metadata?.labels?.[OWNER_WORKFLOW_LABEL];
355
+ if (owner !== ownerWorkflowId) {
356
+ return err({
357
+ type: "name_conflict",
358
+ op: "k8s.createSandbox",
359
+ sandboxId,
360
+ owner: owner ?? null,
361
+ });
362
+ }
363
+ const terminal = await existingPodIsTerminal(coreApi, namespace, sandboxId);
364
+ if (terminal.isErr())
365
+ return err(terminal.error);
366
+ if (terminal.value) {
367
+ const deleted = await deleteJobIgnoreMissing(batchApi, namespace, sandboxId);
368
+ if (deleted.isErr())
369
+ return err(deleted.error);
370
+ const gone = await waitForJobGone(batchApi, namespace, sandboxId);
371
+ if (gone.isErr())
372
+ return err(gone.error);
373
+ const recreated = await trySandbox(() => batchApi.createNamespacedJob({ namespace, body: job }), createFailed);
374
+ if (recreated.isErr())
375
+ return err(recreated.error);
376
+ }
377
+ return ok(undefined);
378
+ })());
379
+ }
380
+ export function createK8sSandboxOps(config) {
381
+ const { batchApi, coreApi } = config.batchApi && config.coreApi ? { batchApi: config.batchApi, coreApi: config.coreApi } : buildKubeApi();
382
+ return {
383
+ createSandbox(meta, identity) {
384
+ return new ResultAsync((async () => {
385
+ const { sandboxId } = identity;
386
+ const job = buildJobSpec(meta, config, identity);
387
+ const adopted = await createOrAdoptJob(batchApi, coreApi, config.namespace, sandboxId, sanitizeLabelValue(meta.childWorkflowId), job);
388
+ if (adopted.isErr())
389
+ return err(adopted.error);
390
+ // A Job whose pod never schedules (quota rejection, no nodes, spot
391
+ // reclaim) is reaped by neither backoffLimit (an admission rejection
392
+ // creates no pod to count) nor ttlSecondsAfterFinished (the Job never
393
+ // finishes) — the Job controller retries pod creation forever. Delete
394
+ // the Job on any startup failure so a failed create can't leak a
395
+ // zombie that floods k8s events indefinitely.
396
+ const ready = await waitForPodReady(coreApi, config.namespace, sandboxId);
397
+ if (ready.isOk()) {
398
+ const ref = {
399
+ sandboxId,
400
+ host: ready.value.podIP,
401
+ port: SANDBOX_SERVER_PORT,
402
+ backend: "k8s",
403
+ callbackSecret: identity.callbackSecret,
404
+ };
405
+ const registered = await trySandbox(() => config.registerSandbox(meta, ref), (status, cause) => ({
406
+ type: "container_create_failed",
407
+ op: "k8s.registerSandbox",
408
+ sandboxId,
409
+ status,
410
+ cause,
411
+ }));
412
+ if (registered.isErr()) {
413
+ await cleanupFailedJob(batchApi, config.namespace, sandboxId);
414
+ return err(registered.error);
415
+ }
416
+ return ok(ref);
417
+ }
418
+ await cleanupFailedJob(batchApi, config.namespace, sandboxId);
419
+ return err(ready.error);
420
+ })());
421
+ },
422
+ teardown(ref) {
423
+ return deleteJobIgnoreMissing(batchApi, config.namespace, ref.sandboxId);
424
+ },
425
+ teardownById(sandboxId) {
426
+ return deleteJobIgnoreMissing(batchApi, config.namespace, sandboxId);
427
+ },
428
+ listManagedSandboxes() {
429
+ return trySandbox(() => batchApi.listNamespacedJob({
430
+ namespace: config.namespace,
431
+ labelSelector: `${MANAGED_BY_LABEL}=${MANAGED_BY_VALUE}`,
432
+ }), (status, cause) => ({
433
+ type: "liveness_failed",
434
+ op: "k8s.listManagedSandboxes",
435
+ status,
436
+ cause,
437
+ })).map((jobs) => jobs.items
438
+ .map((j) => {
439
+ const labels = j.metadata?.labels ?? {};
440
+ const ts = j.metadata?.creationTimestamp;
441
+ return {
442
+ sandboxId: labels["cortex/sandbox-id"] ?? j.metadata?.name ?? "",
443
+ ownerWorkflowId: labels[OWNER_WORKFLOW_LABEL] ?? null,
444
+ createdAtMs: ts ? new Date(ts).getTime() : null,
445
+ };
446
+ })
447
+ .filter((s) => s.sandboxId.length > 0));
448
+ },
449
+ isAlive(ref) {
450
+ return trySandbox(() => coreApi.listNamespacedPod({
451
+ namespace: config.namespace,
452
+ labelSelector: `cortex/sandbox-id=${ref.sandboxId}`,
453
+ }), (status, cause) => ({
454
+ type: "liveness_failed",
455
+ op: "k8s.isAlive",
456
+ sandboxId: ref.sandboxId,
457
+ status,
458
+ cause,
459
+ }))
460
+ .map((pods) => {
461
+ const pod = pods.items[0];
462
+ if (!pod)
463
+ return { alive: false, oomKilled: false };
464
+ const phase = pod.status?.phase;
465
+ // `Pending` and `Running` are alive; `Succeeded`, `Failed`,
466
+ // `Unknown` are dead. `Pending` covers startup.
467
+ const alive = phase === "Pending" || phase === "Running";
468
+ const oomKilled = !alive &&
469
+ (pod.status?.containerStatuses ?? []).some((cs) => cs.state?.terminated?.reason === "OOMKilled" || cs.lastState?.terminated?.reason === "OOMKilled");
470
+ return { alive, oomKilled };
471
+ })
472
+ .orElse((e) =>
473
+ // A 404 means the pod is gone — observably dead.
474
+ statusOf(e) === 404 ? ok({ alive: false, oomKilled: false }) : err(e));
475
+ },
476
+ };
477
+ }
478
+ /**
479
+ * Best-effort Job removal after a failed create. The original failure is what
480
+ * matters; a delete error here is logged and swallowed so it never masks the
481
+ * create error returned to the caller.
482
+ */
483
+ async function cleanupFailedJob(batchApi, namespace, sandboxId) {
484
+ const deleted = await deleteJobIgnoreMissing(batchApi, namespace, sandboxId);
485
+ if (deleted.isErr()) {
486
+ console.error(`K8sSandbox: failed to delete Job ${sandboxId} after startup failure`, deleted.error);
487
+ }
488
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Transport-agnostic liveness escalation (the harness-sandbox-exec spec,
3
+ * "sustained unavailability escalates to a liveness probe").
4
+ *
5
+ * The await loops observe the raw unreachability signal (consecutive
6
+ * `unavailable` poll outcomes) but never adjudicate it themselves — poll
7
+ * failures conflate "unreachable" with "unknown execId / non-200". The
8
+ * backend inspect (`SandboxClient.isAlive`) is the sole arbiter of dead
9
+ * versus live-but-slow, invoked through {@link probeLiveness} once
10
+ * {@link createEscalationPolicy} arms.
11
+ *
12
+ * Shared with the watchdog: {@link syntheticFailureReason} and
13
+ * {@link syntheticFailureResult} are the one constructor for synthetic
14
+ * failures, so reasons and result shape are identical no matter which
15
+ * adjudicator (in-loop escalation or watchdog) produced them.
16
+ */
17
+ import type { ExecResult, SandboxLiveness, SandboxRef } from "./types.js";
18
+ /**
19
+ * Consecutive `unavailable` polls tolerated before probing. On the fast poll
20
+ * cadence (~1.5 s) this is seconds of silence before the first probe — a dead
21
+ * container refuses connections instantly, so a spurious probe against a
22
+ * healthy-but-quiet machine is rare, cheap (one backend inspect), and safe
23
+ * (an `alive` verdict just resumes polling).
24
+ */
25
+ export declare const PROBE_AFTER_UNAVAILABLE_POLLS = 4;
26
+ export type PollLivenessOutcome = "ok" | "unavailable";
27
+ export type ProbeVerdict = {
28
+ readonly kind: "dead";
29
+ readonly oomKilled: boolean;
30
+ } | {
31
+ readonly kind: "alive";
32
+ } | {
33
+ readonly kind: "inconclusive";
34
+ readonly detail: string;
35
+ };
36
+ /**
37
+ * The consecutive-unavailable counter: `unavailable` increments, `ok` resets,
38
+ * and crossing `threshold` arms one probe and re-arms from zero. Pure state
39
+ * over checkpointed poll outcomes, so a replaying loop walks the identical
40
+ * poll/probe sequence.
41
+ */
42
+ export declare function createEscalationPolicy(threshold?: number): {
43
+ /** Record a poll outcome; true means "run the probe now". */
44
+ onPoll(outcome: PollLivenessOutcome): boolean;
45
+ };
46
+ /**
47
+ * Run the backend inspect and collapse it to a three-valued verdict. Never
48
+ * throws: `isAlive` throws on transient backend API errors by contract, but
49
+ * inside an await loop a failed probe is not a failed exec — the same
50
+ * discipline as a failed poll — so a throw maps to `inconclusive` and the
51
+ * caller resumes polling.
52
+ */
53
+ export declare function probeLiveness(isAlive: (ref: SandboxRef) => Promise<SandboxLiveness>, ref: SandboxRef): Promise<ProbeVerdict>;
54
+ /**
55
+ * An OOM-killed machine gets a distinguishable reason so the step failure
56
+ * reads "exceeded its memory limit", not a mystery death.
57
+ */
58
+ export declare function syntheticFailureReason(liveness: Pick<SandboxLiveness, "oomKilled">): "sandbox-oom-killed" | "sandbox-dead";
59
+ /** The synthetic-failure `ExecResult` for an exec whose machine died under it. */
60
+ export declare function syntheticFailureResult(execId: string, reason: string): ExecResult;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Transport-agnostic liveness escalation (the harness-sandbox-exec spec,
3
+ * "sustained unavailability escalates to a liveness probe").
4
+ *
5
+ * The await loops observe the raw unreachability signal (consecutive
6
+ * `unavailable` poll outcomes) but never adjudicate it themselves — poll
7
+ * failures conflate "unreachable" with "unknown execId / non-200". The
8
+ * backend inspect (`SandboxClient.isAlive`) is the sole arbiter of dead
9
+ * versus live-but-slow, invoked through {@link probeLiveness} once
10
+ * {@link createEscalationPolicy} arms.
11
+ *
12
+ * Shared with the watchdog: {@link syntheticFailureReason} and
13
+ * {@link syntheticFailureResult} are the one constructor for synthetic
14
+ * failures, so reasons and result shape are identical no matter which
15
+ * adjudicator (in-loop escalation or watchdog) produced them.
16
+ */
17
+ /**
18
+ * Consecutive `unavailable` polls tolerated before probing. On the fast poll
19
+ * cadence (~1.5 s) this is seconds of silence before the first probe — a dead
20
+ * container refuses connections instantly, so a spurious probe against a
21
+ * healthy-but-quiet machine is rare, cheap (one backend inspect), and safe
22
+ * (an `alive` verdict just resumes polling).
23
+ */
24
+ export const PROBE_AFTER_UNAVAILABLE_POLLS = 4;
25
+ /**
26
+ * The consecutive-unavailable counter: `unavailable` increments, `ok` resets,
27
+ * and crossing `threshold` arms one probe and re-arms from zero. Pure state
28
+ * over checkpointed poll outcomes, so a replaying loop walks the identical
29
+ * poll/probe sequence.
30
+ */
31
+ export function createEscalationPolicy(threshold = PROBE_AFTER_UNAVAILABLE_POLLS) {
32
+ let consecutiveUnavailable = 0;
33
+ return {
34
+ onPoll(outcome) {
35
+ if (outcome === "ok") {
36
+ consecutiveUnavailable = 0;
37
+ return false;
38
+ }
39
+ consecutiveUnavailable += 1;
40
+ if (consecutiveUnavailable < threshold)
41
+ return false;
42
+ consecutiveUnavailable = 0;
43
+ return true;
44
+ },
45
+ };
46
+ }
47
+ /**
48
+ * Run the backend inspect and collapse it to a three-valued verdict. Never
49
+ * throws: `isAlive` throws on transient backend API errors by contract, but
50
+ * inside an await loop a failed probe is not a failed exec — the same
51
+ * discipline as a failed poll — so a throw maps to `inconclusive` and the
52
+ * caller resumes polling.
53
+ */
54
+ export async function probeLiveness(isAlive, ref) {
55
+ let liveness;
56
+ try {
57
+ liveness = await isAlive(ref);
58
+ }
59
+ catch (cause) {
60
+ return { kind: "inconclusive", detail: cause instanceof Error ? cause.message : String(cause) };
61
+ }
62
+ return liveness.alive ? { kind: "alive" } : { kind: "dead", oomKilled: liveness.oomKilled };
63
+ }
64
+ /**
65
+ * An OOM-killed machine gets a distinguishable reason so the step failure
66
+ * reads "exceeded its memory limit", not a mystery death.
67
+ */
68
+ export function syntheticFailureReason(liveness) {
69
+ return liveness.oomKilled ? "sandbox-oom-killed" : "sandbox-dead";
70
+ }
71
+ /** The synthetic-failure `ExecResult` for an exec whose machine died under it. */
72
+ export function syntheticFailureResult(execId, reason) {
73
+ return {
74
+ execId,
75
+ exitCode: null,
76
+ stdout: "",
77
+ stderr: "",
78
+ durationMs: null,
79
+ timedOut: false,
80
+ syntheticFailure: { reason },
81
+ };
82
+ }