@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,406 @@
1
+ /**
2
+ * `awaitExec` — awaits a submitted exec's terminal result, forwarding progress
3
+ * events, under one of two transports selected by `options.transport`:
4
+ *
5
+ * - `poll` (default): {@link awaitExecPoll} loops durable pull steps against
6
+ * `GET /exec/{execId}?since={cursor}`. The sandbox initiates nothing; the
7
+ * host asks. Inherently restart-proof — a recovered workflow just resumes
8
+ * polling from its current identity — so the recovery wedge (#41) does not
9
+ * apply. A machine that dies mid-exec fast-fails in-loop: sustained
10
+ * `unavailable` polls escalate to a backend-inspect probe (`liveness.ts`)
11
+ * and an observably dead machine returns the synthetic-failure result
12
+ * instead of waiting out the deadline.
13
+ * - `callback`: {@link awaitExecCallback} is the recv loop below, with the
14
+ * pull as its recovery backstop.
15
+ *
16
+ * Both run in the workflow body (NOT a step) — `DBOS.recv`, `DBOS.writeStream`,
17
+ * and `DBOS.sleepms` are body-only — and both verify every result against the
18
+ * per-sandbox HMAC, treating a bad/stale signature as a hard cancel.
19
+ *
20
+ * ## Callback mode: the recv loop
21
+ *
22
+ * On each received envelope:
23
+ *
24
+ * 1. If it carries `signature: null` and the payload is a
25
+ * `synthetic-failure` done-marker, accept it — the watchdog is an
26
+ * in-process trusted sender. Any other null-signature message
27
+ * hard-cancels.
28
+ * 2. Otherwise HMAC-verify against the per-sandbox `callbackSecret`.
29
+ * A bad or stale signature throws `HardCancelError`, which DBOS
30
+ * treats as a fatal workflow error (no retry).
31
+ * 3. If the verified payload is a done-marker, return its `result`.
32
+ * 4. Otherwise forward the payload via `emit` and continue.
33
+ *
34
+ * `deadline` is an absolute unix-ms timestamp — the durable backstop
35
+ * (typically `step.timeout`). `T` is liveness-agnostic recv pacing: we
36
+ * use `min(5s, remaining)` so the loop returns often enough to honour
37
+ * the deadline.
38
+ *
39
+ * ## Recv is not the only way home
40
+ *
41
+ * The completion callback is a *push* to an address baked into the container at
42
+ * creation. A host that dies mid-exec comes back with a different ingress port,
43
+ * so the push can never land — the sandbox retries into a void while the
44
+ * recovered recv waits for a message that will never arrive. That is the
45
+ * recovery wedge (#41), and it is silent: a `running` row that never advances.
46
+ *
47
+ * So whenever the topic falls quiet, this loop stops waiting and *asks*:
48
+ * `GET /exec/{execId}` on the sandbox itself returns the terminal result,
49
+ * signed fresh at request time. The bytes are the ones the callback would have
50
+ * carried, so the provenance frame survives the recovery path intact and one
51
+ * verification path serves both. Push remains the fast path; pull is what makes
52
+ * the protocol durable rather than merely optimistic.
53
+ *
54
+ * The pull is a DBOS step, not a bare `fetch`: a body-level call whose result
55
+ * varied between replays would desynchronise the recorded function-ID sequence.
56
+ */
57
+ import { DBOS } from "@dbos-inc/dbos-sdk";
58
+ import { signCallback, verifyCallback } from "./hmac.js";
59
+ import { createEscalationPolicy, probeLiveness, syntheticFailureReason, syntheticFailureResult } from "./liveness.js";
60
+ import { ExecResultSchema, isDoneMarker, isSyntheticFailure, PollResponseSchema, } from "./types.js";
61
+ const DEFAULT_FRESHNESS_SECONDS = 300;
62
+ const MAX_RECV_TIMEOUT_SECONDS = 5;
63
+ /**
64
+ * Two-phase poll cadence. Every poll writes a durable step row (plus a durable
65
+ * sleep), so the interval is a direct multiplier on DBOS system-table growth
66
+ * for the life of the exec: 1.5s for the first 40 attempts (~the exec's first
67
+ * minute) keeps short commands snappy; 10s thereafter keeps an hours-long
68
+ * exec's row growth bounded, at a terminal-latency cost that is noise at that
69
+ * runtime. Attempt-derived, so the schedule is a pure function of the
70
+ * checkpointed step sequence and replays identically.
71
+ */
72
+ const DEFAULT_POLL_INTERVAL_MS = 1_500;
73
+ const DEFAULT_FAST_POLL_ATTEMPTS = 40;
74
+ const DEFAULT_SLOW_POLL_INTERVAL_MS = 10_000;
75
+ /**
76
+ * Silent recv slices to tolerate before pulling. At `MAX_RECV_TIMEOUT_SECONDS`
77
+ * per slice this is ~30s of silence — long enough that a chatty exec never
78
+ * pulls at all, short enough that a recovered workflow converges quickly. Each
79
+ * pull is a durable step, so polling every slice would write a step row every
80
+ * five seconds for the life of a quiet three-hour exec.
81
+ */
82
+ const PULL_AFTER_SILENT_SLICES = 6;
83
+ const PULL_HTTP_TIMEOUT_MS = 10_000;
84
+ /**
85
+ * Fetch the terminal result for `execId` directly from sandbox-server.
86
+ *
87
+ * Never throws: every failure mode collapses to `unavailable`, because a failed
88
+ * pull is not a failed exec. Returning an error here would fail the enclosing
89
+ * DBOS step and take the workflow with it, when the correct response is simply
90
+ * to keep waiting for the push.
91
+ *
92
+ * A terminal response is distinguished by the presence of the signature header
93
+ * — sandbox-server leaves a still-running exec unsigned, having nothing to
94
+ * attest to yet.
95
+ */
96
+ async function pullExecResult(fetchImpl, ref, execId) {
97
+ const controller = new AbortController();
98
+ const timer = setTimeout(() => controller.abort(), PULL_HTTP_TIMEOUT_MS);
99
+ try {
100
+ // The result discloses the command's output, so sandbox-server requires a
101
+ // signed request. Sign an empty body over the same construction as the
102
+ // callbacks. `Date.now()` is safe: this runs inside a `DBOS.runStep` whose
103
+ // cached result is replayed without re-executing the body.
104
+ const reqTimestamp = Math.floor(Date.now() / 1000);
105
+ const reqSignature = signCallback({ execId, body: "", timestamp: reqTimestamp, secret: ref.callbackSecret });
106
+ const res = await fetchImpl(`http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}`, {
107
+ method: "GET",
108
+ headers: {
109
+ "x-sandbox-signature": reqSignature,
110
+ "x-sandbox-timestamp": String(reqTimestamp),
111
+ },
112
+ signal: controller.signal,
113
+ });
114
+ if (!res.ok) {
115
+ await res.text().catch(() => "");
116
+ return { kind: "unavailable", detail: `status ${res.status}` };
117
+ }
118
+ const signature = res.headers.get("x-sandbox-signature");
119
+ const raw = await res.text();
120
+ if (signature === null)
121
+ return { kind: "running" };
122
+ const tsHeader = res.headers.get("x-sandbox-timestamp");
123
+ const parsedTs = tsHeader === null ? null : Number.parseInt(tsHeader, 10);
124
+ return {
125
+ kind: "completed",
126
+ raw,
127
+ signature,
128
+ // An unparseable timestamp forwards as null so `verifyCallback`
129
+ // reports `missing` rather than us guessing a wall-clock.
130
+ timestamp: parsedTs === null || Number.isNaN(parsedTs) ? null : parsedTs,
131
+ };
132
+ }
133
+ catch (cause) {
134
+ return { kind: "unavailable", detail: cause instanceof Error ? cause.message : String(cause) };
135
+ }
136
+ finally {
137
+ clearTimeout(timer);
138
+ }
139
+ }
140
+ export class HardCancelError extends Error {
141
+ execId;
142
+ reason;
143
+ constructor(execId, reason, detail) {
144
+ super(`awaitExec[${execId}]: hard cancel — ${reason}${detail ? ` (${detail})` : ""}`);
145
+ this.execId = execId;
146
+ this.reason = reason;
147
+ }
148
+ }
149
+ export class ExecTimeoutError extends Error {
150
+ execId;
151
+ constructor(execId) {
152
+ super(`awaitExec[${execId}]: deadline exceeded before done-marker`);
153
+ this.execId = execId;
154
+ }
155
+ }
156
+ /**
157
+ * Await a submitted exec's terminal result. Dispatches on transport — `poll`
158
+ * (default) or `callback`. Both verify every result against the per-sandbox
159
+ * HMAC and are bounded by `deadlineMs`.
160
+ */
161
+ export async function awaitExec(ref, execId, emit, deadlineMs, options = {}) {
162
+ const transport = options.transport ?? "poll";
163
+ return transport === "callback" ? awaitExecCallback(ref, execId, emit, deadlineMs, options) : awaitExecPoll(ref, execId, emit, deadlineMs, options);
164
+ }
165
+ /**
166
+ * Body of the recv loop (callback transport). Hoisted so it's testable without
167
+ * spinning up DBOS — `recv` is injectable and `now` is overridable.
168
+ */
169
+ export async function awaitExecCallback(ref, execId, emit, deadlineMs, options = {}) {
170
+ const topic = `exec-event:${execId}`;
171
+ const callbackSecret = ref.callbackSecret;
172
+ const now = options.now ?? (() => DBOS.now());
173
+ const recv = options.recv ?? (async (t, sec) => DBOS.recv(t, sec));
174
+ const fetchImpl = options.fetch ?? fetch;
175
+ const runStep = options.runStep ?? ((fn, c) => DBOS.runStep(fn, c));
176
+ // Both counters are pure functions of the checkpointed recv sequence, so a
177
+ // replay issues exactly the same pulls in exactly the same order — which is
178
+ // what keeps the DBOS function-ID sequence stable.
179
+ let silentSlices = 0;
180
+ let pullAttempt = 0;
181
+ /** Ask the sandbox directly. Returns null when the exec has not finished. */
182
+ const pull = async () => {
183
+ pullAttempt += 1;
184
+ const pulled = await runStep(() => pullExecResult(fetchImpl, ref, execId), {
185
+ name: `sandbox.pull-exec-result.${execId}.${pullAttempt}`,
186
+ });
187
+ if (pulled.kind !== "completed")
188
+ return null;
189
+ // Identical treatment to a pushed completion: the bytes were signed by
190
+ // the same secret, so a forgery is as fatal here as it is there.
191
+ const verified = verifyCallback({
192
+ execId,
193
+ body: Buffer.from(pulled.raw, "utf8"),
194
+ signature: pulled.signature,
195
+ timestamp: pulled.timestamp,
196
+ secret: callbackSecret,
197
+ nowSec: Math.floor((await now()) / 1000),
198
+ freshnessSec: DEFAULT_FRESHNESS_SECONDS,
199
+ });
200
+ if (!verified.valid) {
201
+ throw new HardCancelError(execId, verified.reason, "pulled result");
202
+ }
203
+ return ExecResultSchema.parse(JSON.parse(pulled.raw));
204
+ };
205
+ while (true) {
206
+ const remainingMs = deadlineMs - (await now());
207
+ if (remainingMs <= 0) {
208
+ // A lost callback is not a slow command. Ask once before declaring a
209
+ // timeout — the result may have been sitting in the sandbox the whole
210
+ // time, and reporting a timeout would discard a completed analysis.
211
+ const pulled = await pull();
212
+ if (pulled !== null)
213
+ return pulled;
214
+ throw new ExecTimeoutError(execId);
215
+ }
216
+ const timeoutSec = Math.min(MAX_RECV_TIMEOUT_SECONDS, Math.max(1, Math.ceil(remainingMs / 1000)));
217
+ const msg = await recv(topic, timeoutSec);
218
+ if (msg === null) {
219
+ silentSlices += 1;
220
+ if (silentSlices >= PULL_AFTER_SILENT_SLICES) {
221
+ silentSlices = 0;
222
+ const pulled = await pull();
223
+ if (pulled !== null)
224
+ return pulled;
225
+ }
226
+ continue;
227
+ }
228
+ silentSlices = 0;
229
+ if (msg.signature === null) {
230
+ if (isSyntheticFailure(msg.payload)) {
231
+ return ExecResultSchema.parse(msg.payload.result);
232
+ }
233
+ throw new HardCancelError(execId, "synthetic-without-marker");
234
+ }
235
+ // Verify against the exact bytes sandbox-server signed. The route
236
+ // preserves them as `payloadRaw`; the JSON.stringify fallback exists
237
+ // only for messages persisted before that field was added — re-
238
+ // serializing diverges from Go's HTML-escaping encoder.
239
+ const bodyBytes = Buffer.from(msg.payloadRaw ?? JSON.stringify(msg.payload), "utf8");
240
+ const result = verifyCallback({
241
+ execId,
242
+ body: bodyBytes,
243
+ signature: msg.signature,
244
+ timestamp: msg.timestamp,
245
+ secret: callbackSecret,
246
+ nowSec: Math.floor((await now()) / 1000),
247
+ freshnessSec: DEFAULT_FRESHNESS_SECONDS,
248
+ });
249
+ if (!result.valid) {
250
+ throw new HardCancelError(execId, result.reason);
251
+ }
252
+ if (isDoneMarker(msg.payload)) {
253
+ return ExecResultSchema.parse(msg.payload.result);
254
+ }
255
+ await emit(msg.payload);
256
+ }
257
+ }
258
+ async function pollExecOnce(fetchImpl, ref, execId, cursor) {
259
+ const controller = new AbortController();
260
+ const timer = setTimeout(() => controller.abort(), PULL_HTTP_TIMEOUT_MS);
261
+ try {
262
+ // The response discloses the command's output, so the request is signed
263
+ // over an empty body — the same construction as the callbacks. `Date.now()`
264
+ // is safe: this runs inside a `DBOS.runStep` whose cached result is
265
+ // replayed without re-executing the body.
266
+ const reqTimestamp = Math.floor(Date.now() / 1000);
267
+ const reqSignature = signCallback({ execId, body: "", timestamp: reqTimestamp, secret: ref.callbackSecret });
268
+ const res = await fetchImpl(`http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}?since=${cursor}`, {
269
+ method: "GET",
270
+ headers: {
271
+ "x-sandbox-signature": reqSignature,
272
+ "x-sandbox-timestamp": String(reqTimestamp),
273
+ },
274
+ signal: controller.signal,
275
+ });
276
+ if (!res.ok) {
277
+ await res.text().catch(() => "");
278
+ return { kind: "unavailable", detail: `status ${res.status}` };
279
+ }
280
+ const signature = res.headers.get("x-sandbox-signature");
281
+ const raw = await res.text();
282
+ if (signature === null)
283
+ return { kind: "unavailable", detail: "poll response missing signature" };
284
+ const tsHeader = res.headers.get("x-sandbox-timestamp");
285
+ const parsedTs = tsHeader === null ? null : Number.parseInt(tsHeader, 10);
286
+ return {
287
+ kind: "ok",
288
+ raw,
289
+ signature,
290
+ timestamp: parsedTs === null || Number.isNaN(parsedTs) ? null : parsedTs,
291
+ };
292
+ }
293
+ catch (cause) {
294
+ return { kind: "unavailable", detail: cause instanceof Error ? cause.message : String(cause) };
295
+ }
296
+ finally {
297
+ clearTimeout(timer);
298
+ }
299
+ }
300
+ /**
301
+ * Body of the poll loop (poll transport). No `DBOS.recv`, no per-exec topic, no
302
+ * callback handler: a sequence of durable pull steps named
303
+ * `sandbox.poll-exec-result.${execId}.${n}`, each fetching the signed
304
+ * `{ status, events, cursor, result? }`, verifying it exactly as a pushed
305
+ * completion is verified, forwarding new events via `emit`, advancing the
306
+ * cursor, and returning `result` once terminal. `sleep`, `now`, `fetch`,
307
+ * `runStep`, and `isAlive` are injectable so the loop is testable without DBOS.
308
+ *
309
+ * Liveness: when the `isAlive` seam is wired (the client always wires it),
310
+ * consecutive `unavailable` polls past the module threshold escalate to a
311
+ * durable probe step `sandbox.probe-liveness.${execId}.${k}`; a dead verdict
312
+ * returns the synthetic-failure result in-loop — the poll-mode analogue of the
313
+ * watchdog's synthetic-complete, minus the topic and the race gate, since the
314
+ * verdict is produced and consumed by the same workflow in sequence.
315
+ *
316
+ * The `cursor`, `pollAttempt`, and `probeAttempt` counters are pure functions
317
+ * of the cached step sequence, so a replay issues the same polls and probes in
318
+ * the same order and the DBOS function-ID sequence stays stable.
319
+ */
320
+ export async function awaitExecPoll(ref, execId, emit, deadlineMs, options = {}) {
321
+ const callbackSecret = ref.callbackSecret;
322
+ const now = options.now ?? (() => DBOS.now());
323
+ const fetchImpl = options.fetch ?? fetch;
324
+ const runStep = options.runStep ?? ((fn, c) => DBOS.runStep(fn, c));
325
+ const sleep = options.sleep ?? ((ms) => DBOS.sleepms(ms));
326
+ const warn = options.warn ?? ((message) => DBOS.logger.warn(message));
327
+ const isAlive = options.isAlive;
328
+ let cursor = 0;
329
+ let pollAttempt = 0;
330
+ // Sustained-unavailability escalation (`liveness.ts`): consecutive
331
+ // `unavailable` polls arm a backend-inspect probe; poll failures alone
332
+ // never fail the exec (`unavailable` conflates unreachable with unknown
333
+ // execId / non-200). Policy state and the probe counter are pure functions
334
+ // of the checkpointed poll outcomes, so replays walk the identical
335
+ // poll/probe step sequence.
336
+ const escalation = createEscalationPolicy();
337
+ let probeAttempt = 0;
338
+ while (true) {
339
+ pollAttempt += 1;
340
+ const polled = await runStep(() => pollExecOnce(fetchImpl, ref, execId, cursor), {
341
+ name: `sandbox.poll-exec-result.${execId}.${pollAttempt}`,
342
+ });
343
+ if (polled.kind === "ok") {
344
+ // Identical treatment to a pushed completion: the bytes were signed by
345
+ // the same secret, so a forgery is as fatal here as it is there.
346
+ const verified = verifyCallback({
347
+ execId,
348
+ body: Buffer.from(polled.raw, "utf8"),
349
+ signature: polled.signature,
350
+ timestamp: polled.timestamp,
351
+ secret: callbackSecret,
352
+ nowSec: Math.floor((await now()) / 1000),
353
+ freshnessSec: DEFAULT_FRESHNESS_SECONDS,
354
+ });
355
+ if (!verified.valid) {
356
+ throw new HardCancelError(execId, verified.reason, "poll response");
357
+ }
358
+ const resp = PollResponseSchema.parse(JSON.parse(polled.raw));
359
+ // Forward only events past the local cursor, before returning, so
360
+ // trailing progress lands ahead of the terminal result. The filter is
361
+ // load-bearing: the signature covers the body but not the request's
362
+ // `since`, so any validly-signed snapshot verifies against any poll —
363
+ // a replayed or crossed response must not re-emit delivered events.
364
+ const newEvents = resp.events.filter((ev) => ev.seq > cursor);
365
+ // Sequence numbers are per-exec contiguous, so a hole between the
366
+ // local cursor and the next delivered (or high-water) seq is exact
367
+ // proof the ring shed events before the host saw them. Advisory: the
368
+ // terminal result, not the event stream, is the authoritative outcome.
369
+ const nextSeq = newEvents.length > 0 ? newEvents[0].seq : resp.cursor > cursor ? resp.cursor + 1 : cursor + 1;
370
+ const lost = nextSeq - cursor - 1;
371
+ if (lost > 0) {
372
+ warn(`awaitExecPoll[${execId}]: ${lost} progress event(s) (seq ${cursor + 1}-${cursor + lost}) shed by the sandbox ring before delivery; the terminal result is unaffected`);
373
+ }
374
+ for (const ev of newEvents) {
375
+ await emit(ev.payload);
376
+ }
377
+ if (resp.cursor > cursor)
378
+ cursor = resp.cursor;
379
+ if (resp.result !== undefined)
380
+ return resp.result;
381
+ }
382
+ if (isAlive && escalation.onPoll(polled.kind === "ok" ? "ok" : "unavailable")) {
383
+ probeAttempt += 1;
384
+ const verdict = await runStep(() => probeLiveness(isAlive, ref), {
385
+ name: `sandbox.probe-liveness.${execId}.${probeAttempt}`,
386
+ });
387
+ // Only an observably dead machine fails the exec — the result lives
388
+ // in that machine and nowhere else, so it is unrecoverable and the
389
+ // synthetic failure races nothing. `alive` (live-but-slow exec,
390
+ // evicted execId) and `inconclusive` (backend API error) both
391
+ // resume polling, bounded by the deadline.
392
+ if (verdict.kind === "dead") {
393
+ return syntheticFailureResult(execId, syntheticFailureReason({ oomKilled: verdict.oomKilled }));
394
+ }
395
+ }
396
+ // The deadline gate sits AFTER the poll so the loop always asks once more
397
+ // before declaring a timeout — same reasoning as the callback loop's
398
+ // deadline pull: a lost poll window is not a slow command, and reporting
399
+ // a timeout would discard a completed analysis.
400
+ const remainingMs = deadlineMs - (await now());
401
+ if (remainingMs <= 0)
402
+ throw new ExecTimeoutError(execId);
403
+ const intervalMs = pollAttempt <= DEFAULT_FAST_POLL_ATTEMPTS ? DEFAULT_POLL_INTERVAL_MS : DEFAULT_SLOW_POLL_INTERVAL_MS;
404
+ await sleep(Math.min(intervalMs, remainingMs));
405
+ }
406
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * `SandboxClient` — the five-method seam every sandbox-backed module in
3
+ * the harness sits on. Implementations are backend-selected
4
+ * (`docker`/`k8s`) by `createSandboxClient()` in `create-sandbox.ts` and
5
+ * injected at the composition root as a construction-time dependency
6
+ * (see the harness-durable-runtime spec). Callers do NOT import a backend module directly.
7
+ *
8
+ * The interface is split across three files:
9
+ * - `client.ts` (here) — the interface and the per-method types.
10
+ * - `create-sandbox.ts` — the factory + per-backend `createSandbox` /
11
+ * `teardown` / `isAlive` implementations.
12
+ * - `submit-exec.ts` + `await-exec.ts` — `submitExec` and the workflow-
13
+ * body recv loop, which are backend-agnostic (HTTP + DBOS messages).
14
+ *
15
+ * Lifetime separation (CONTEXT.md "Sandbox exec"):
16
+ * - The **sandbox machine** lifetime is `createSandbox → ... → teardown`.
17
+ * Many execs may fire against the same machine.
18
+ * - The **exec** lifetime is one `submitExec → awaitExec`.
19
+ *
20
+ * `awaitExec` runs in the workflow body (not as a DBOS step) because
21
+ * `DBOS.recv` and `DBOS.writeStream` are body-only.
22
+ */
23
+ import type { CreateSandboxMeta, ExecEmit, ExecResult, ManagedSandbox, SandboxIdentity, SandboxLiveness, SandboxRef, SubmitExecBody } from "./types.js";
24
+ export interface SandboxClient {
25
+ /**
26
+ * DBOS step (`sandbox.create`) — the spawn half of the two-step create
27
+ * (see the harness-sandbox-exec spec). Launches the sandbox-base container/Job under the
28
+ * pre-minted `identity` (name + HMAC secret checkpointed by `sandbox.mint`),
29
+ * stamps ownership labels, waits for `/health`, records the live handle in
30
+ * the active-sandbox registry, and returns the in-memory `SandboxRef`. A
31
+ * recovery re-run whose machine already exists (the crash window between
32
+ * spawn and checkpoint) **adopts** it rather than leaking a second one.
33
+ */
34
+ createSandbox(meta: CreateSandboxMeta, identity: SandboxIdentity): Promise<SandboxRef>;
35
+ /**
36
+ * DBOS step (`sandbox.submit-exec.${execId}`). POSTs the command to
37
+ * sandbox-server's `/exec` and returns after the HTTP 202 ack. Does NOT
38
+ * wait for command completion. Replay-safe: the cached step output is
39
+ * returned on subsequent invocations; any duplicate POST that reaches
40
+ * sandbox-server during the in-flight window is deduped server-side
41
+ * (PR #3 change 4) on `execId`.
42
+ */
43
+ submitExec(ref: SandboxRef, body: SubmitExecBody): Promise<void>;
44
+ /**
45
+ * Awaits a submitted exec's terminal result under the client's transport.
46
+ * Poll (default) loops durable, signed `GET /exec/{execId}?since={cursor}`
47
+ * steps against the sandbox in `ref`; callback loops
48
+ * `DBOS.recv("exec-event:${execId}", T)` with a signed pull as its
49
+ * recovery backstop. Both HMAC-verify every body against
50
+ * `ref.callbackSecret`, forward progress events via `emit`, and are
51
+ * bounded by `deadline` (absolute unix-ms timestamp).
52
+ */
53
+ awaitExec(ref: SandboxRef, execId: string, emit: ExecEmit, deadline: number): Promise<ExecResult>;
54
+ /**
55
+ * Per-sandbox-machine liveness. `alive: false` only when observably dead
56
+ * (terminal pod phase, missing container); `oomKilled` marks a death the
57
+ * backend attributes to the machine's memory limit. Transient API errors
58
+ * throw, so callers can decide whether to retry — silently lying about
59
+ * dead sandboxes would race the synthetic-complete path.
60
+ */
61
+ isAlive(ref: SandboxRef): Promise<SandboxLiveness>;
62
+ /**
63
+ * DBOS step (`sandbox.teardown`). Deletes the K8s Job / removes the
64
+ * Docker container, clears the active-sandbox registry. Idempotent —
65
+ * "already gone" is a successful teardown.
66
+ */
67
+ teardown(ref: SandboxRef): Promise<void>;
68
+ /**
69
+ * Delete a sandbox machine by id alone — the reaper path (see the harness-sandbox-exec spec), which
70
+ * holds a `sandboxId` from the cluster sweep but no full `SandboxRef`.
71
+ * Does NOT touch the registry; the reaper reconciles the row itself.
72
+ * Idempotent: "already gone" is success.
73
+ */
74
+ teardownById(sandboxId: string): Promise<void>;
75
+ /**
76
+ * Enumerate every Cortex-managed sandbox machine the backend is running,
77
+ * scoped to the configured namespace (`app.kubernetes.io/managed-by=cortex`).
78
+ * The cluster→registry direction the reaper needs — every other op takes a
79
+ * ref the caller already holds; this one finds machines Cortex has forgotten.
80
+ */
81
+ listManagedSandboxes(): Promise<ManagedSandbox[]>;
82
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `SandboxClient` — the five-method seam every sandbox-backed module in
3
+ * the harness sits on. Implementations are backend-selected
4
+ * (`docker`/`k8s`) by `createSandboxClient()` in `create-sandbox.ts` and
5
+ * injected at the composition root as a construction-time dependency
6
+ * (see the harness-durable-runtime spec). Callers do NOT import a backend module directly.
7
+ *
8
+ * The interface is split across three files:
9
+ * - `client.ts` (here) — the interface and the per-method types.
10
+ * - `create-sandbox.ts` — the factory + per-backend `createSandbox` /
11
+ * `teardown` / `isAlive` implementations.
12
+ * - `submit-exec.ts` + `await-exec.ts` — `submitExec` and the workflow-
13
+ * body recv loop, which are backend-agnostic (HTTP + DBOS messages).
14
+ *
15
+ * Lifetime separation (CONTEXT.md "Sandbox exec"):
16
+ * - The **sandbox machine** lifetime is `createSandbox → ... → teardown`.
17
+ * Many execs may fire against the same machine.
18
+ * - The **exec** lifetime is one `submitExec → awaitExec`.
19
+ *
20
+ * `awaitExec` runs in the workflow body (not as a DBOS step) because
21
+ * `DBOS.recv` and `DBOS.writeStream` are body-only.
22
+ */
23
+ export {};
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Backend-selected `SandboxClient` factory.
3
+ *
4
+ * Docker for local dev, K8s for production — the single place the
5
+ * `SANDBOX_BACKEND` env decision lives. Injected at the composition root
6
+ * as a construction-time dependency (see the harness-durable-runtime spec); callers do NOT import a
7
+ * backend module directly.
8
+ *
9
+ * Registry write/clear callbacks are wired here so the per-backend
10
+ * `createSandbox` / `teardown` implementations stay free of state-layer
11
+ * coupling (they just call the closures we hand them). `submitExec` and
12
+ * `awaitExec` are backend-agnostic — they only need the SandboxRef.
13
+ */
14
+ import type { V1Toleration } from "@kubernetes/client-node";
15
+ import type { Pool } from "pg";
16
+ import type pino from "pino";
17
+ import { type ResourceLimits } from "../config/resource-limits.js";
18
+ import { type ResolveWorkspaceRoot } from "../workspace/paths.js";
19
+ import { clearSandboxRef } from "../state/index.js";
20
+ import { type AwaitExecOptions } from "./await-exec.js";
21
+ import type { SandboxClient } from "./client.js";
22
+ import { type SubmitExecDeps } from "./submit-exec.js";
23
+ import { type SandboxTransport } from "./types.js";
24
+ /**
25
+ * Narrow config slice the sandbox factory reads off `Env` — the backend
26
+ * default and the K8s namespace fallback. Composition roots map their
27
+ * validated `Env` onto this.
28
+ */
29
+ export interface SandboxBackendConfig {
30
+ readonly backend: "docker" | "k8s";
31
+ readonly namespace: string;
32
+ }
33
+ export interface CreateSandboxClientConfig {
34
+ /** App pool — used for registry writes inside the create/teardown steps. */
35
+ pool: Pool;
36
+ /** Backend default + namespace fallback source. */
37
+ env: SandboxBackendConfig;
38
+ /** Cortex base URL injected into sandbox-server's env for callbacks. */
39
+ cortexBaseUrl: string;
40
+ /**
41
+ * Result transport for every sandbox this client creates. Threaded to the
42
+ * container as `SANDBOX_TRANSPORT` and to `awaitExec`'s loop selection.
43
+ * Defaults to `poll`.
44
+ */
45
+ transport?: SandboxTransport;
46
+ /** Default sandbox-base image when the workflow doesn't override per-step. */
47
+ image: string;
48
+ /** Cluster resource ceilings; every sandbox request is clamped to these. */
49
+ resourceLimits: ResourceLimits;
50
+ /** K8s namespace; only used by the k8s backend. */
51
+ namespace?: string;
52
+ /**
53
+ * Workspace-root resolution seam (see workspace/paths.ts). Docker binds
54
+ * each analysis's resolved root; on K8s the resolved roots live under the
55
+ * session PVC. Always required: the writable step dir is pre-created under
56
+ * the resolved root regardless of backend.
57
+ */
58
+ resolveWorkspaceRoot: ResolveWorkspaceRoot;
59
+ /** Docker: host dir bind-mounted read-only at `/mnt/libs`. */
60
+ libStorePath?: string;
61
+ /** Docker: host dir bind-mounted read-only at `/mnt/refs`. */
62
+ refStorePath?: string;
63
+ /** Docker: force the container platform (e.g. `linux/amd64`) so the sandbox matches the mounted lib store's arch. */
64
+ platform?: string;
65
+ /** K8s: PVC claim backing the session PVC the workspace roots live under. */
66
+ sessionPvc?: string;
67
+ /**
68
+ * K8s: absolute mountpoint of `sessionPvc` on this process's filesystem. Required with
69
+ * `sessionPvc` — the pod's `subPath` is a resolved workspace root taken relative to it,
70
+ * which is what keeps the pre-created step tree and the mounted step tree the same one.
71
+ */
72
+ sessionPvcRoot?: string;
73
+ /** K8s: PVC claim mounted read-only at `/mnt/libs`. */
74
+ libStorePvc?: string;
75
+ /** K8s: PVC claim mounted read-only at `/mnt/refs`. */
76
+ refStorePvc?: string;
77
+ /** K8s: node selector pinning sandbox pods to the dedicated agent pool. */
78
+ nodeSelector?: Record<string, string>;
79
+ /** K8s: tolerations letting sandbox pods land on the tainted agent nodes. */
80
+ tolerations?: V1Toleration[];
81
+ /** K8s: RuntimeClass for runtime isolation (e.g. `gvisor`). */
82
+ runtimeClassName?: string;
83
+ /** Override the backend selection — defaults to `env.SANDBOX_BACKEND`. */
84
+ backend?: "docker" | "k8s";
85
+ /**
86
+ * Optional logger forwarded to the Docker backend so a lib-store degradation
87
+ * (a configured store whose `current` vanished/went incomplete mid-session) is
88
+ * observable rather than a silent mount drop. No-op when unset.
89
+ */
90
+ logger?: Pick<pino.Logger, "info" | "warn" | "error">;
91
+ /** Dependency seams (fetch, durable step/sleep, clock, recv, warn sink) forwarded to submit/await. */
92
+ submitDeps?: SubmitExecDeps;
93
+ awaitOptions?: AwaitExecOptions;
94
+ }
95
+ /**
96
+ * Assemble `awaitExec`'s options: the liveness probe self-wires from the
97
+ * backend ops (the poll loop's escalation always has its arbiter under the
98
+ * client), explicit seam injections in `base` win over the self-wired probe,
99
+ * and the transport is client-owned — never overridable through the seam bag.
100
+ * Exported for tests.
101
+ */
102
+ export declare function composeAwaitOptions(base: AwaitExecOptions | undefined, transport: SandboxTransport, isAlive: NonNullable<AwaitExecOptions["isAlive"]>): AwaitExecOptions;
103
+ export declare function createSandboxClient(config: CreateSandboxClientConfig): SandboxClient;
104
+ /** Re-exports so consumers import once from this module. */
105
+ export { clearSandboxRef };