@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,171 @@
1
+ /**
2
+ * Data-profile DBOS workflow — profiles the already-staged input files, runs
3
+ * the data-profiler sandbox agent, writes per-file metadata to
4
+ * cortex_artifacts, and indexes descriptions into the pgvector store. Inputs
5
+ * are staged under `data/inputs/` by the embedder before the run (see the data-profile-init spec);
6
+ * the body assumes a populated tree and never downloads.
7
+ *
8
+ * Recoverable: a crashed Cortex pod resumes the workflow from the DBOS step
9
+ * cache. The run authorization is minted at the async edge (`triggerDataProfile`)
10
+ * and rides in `input.runSession`; the body never mints. The body revokes the
11
+ * authorization on every terminal path.
12
+ *
13
+ * The `cortex_analysis_state.data_profile_status` ledger (claimed via
14
+ * `tryStartDataProfile` / `tryRerunDataProfile` / `tryRetryDataProfile`)
15
+ * still drives the UI status and the trigger's return value. Concurrent
16
+ * triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
17
+ * UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
18
+ */
19
+ import type { Pool } from "pg";
20
+ import { type AuthContext, type RunSession } from "../auth/types.js";
21
+ import type { RunAuthorization, RunAuthorizer } from "../execution/run-authorizer.js";
22
+ import type { StagedInput } from "../execution/staged-input.js";
23
+ import type { BioToolKeys } from "../tools/bio/keys.js";
24
+ import type { ChatProvider, EmbeddingProvider } from "../providers/types.js";
25
+ import type { SandboxClient } from "../sandbox/client.js";
26
+ import type { WorkspaceFilesystem } from "../workspace/filesystem.js";
27
+ import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
28
+ import { type DataProfileInputFile } from "../state/index.js";
29
+ /** The body's construction-time deps — closed over at registration. */
30
+ export interface DataProfileDeps {
31
+ readonly provider: ChatProvider;
32
+ readonly pool: Pool;
33
+ readonly sandboxClient: SandboxClient;
34
+ readonly workspaceFs: WorkspaceFilesystem;
35
+ /** Workspace-root resolution seam (see workspace/paths.ts). */
36
+ readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
37
+ /** Model id — provenance / metric label; the provider owns the wire model. */
38
+ readonly model: string;
39
+ readonly runAuthorizer: RunAuthorizer;
40
+ /** API keys for the bio/chem tools the profiler sandbox agent may use. */
41
+ readonly bioKeys: BioToolKeys;
42
+ /**
43
+ * Write-side embedder for the vector indexer. An instance, not endpoint
44
+ * config: the host composes its own realization (cloud endpoint, local
45
+ * in-process model, …) and the provider's `dimensions` sizes the
46
+ * per-analysis index — matching every other write-side workflow dep.
47
+ */
48
+ readonly embedding: EmbeddingProvider;
49
+ /** Absolute path to the skills tree (one subdirectory per skill). */
50
+ readonly skillsDir: string;
51
+ }
52
+ /**
53
+ * Workflow input. JSON-serialisable — DBOS persists it as the workflow's
54
+ * input row. The `RunSession` carries the run authorization; the body reads it
55
+ * and never mints.
56
+ */
57
+ export interface DataProfileWorkflowInput {
58
+ readonly analysisId: string;
59
+ readonly runSession: RunSession;
60
+ /**
61
+ * Manifest of the input files staged under `data/inputs/` before the run
62
+ * started (see the data-profile-init spec). The body assumes the tree is populated and profiles
63
+ * exactly these files — it never downloads. JSON-serializable; rides in the
64
+ * DBOS workflow input and survives recovery.
65
+ */
66
+ readonly stagedInputs: readonly StagedInput[];
67
+ /**
68
+ * True when Cortex owns the run-authorization lifecycle and therefore must
69
+ * revoke it on every terminal path. False when the caller supplied its own
70
+ * authorization: the caller owns the lifecycle, so the body must NOT revoke
71
+ * it. The ownership decision is made by the `RunAuthorizer` seam — see
72
+ * `authorizeDataProfile`.
73
+ *
74
+ * Optional because a workflow persisted before this field existed (recovered
75
+ * across the deploy that added it) deserializes without it; the body defaults
76
+ * absent → true, matching the prior Cortex-owned behavior.
77
+ */
78
+ readonly ownsMandate?: boolean;
79
+ }
80
+ /**
81
+ * Build the drift-signature comparand a completed profile persists, or `undefined`
82
+ * to omit it. `inputFiles` records whether the profiled files still hold the same
83
+ * bytes; it sits beside the `inputFileIds` audit record (WHICH files) in the stored
84
+ * `DataProfileResult`.
85
+ *
86
+ * A workflow input persisted before `StagedInput.mtimeMs` existed (recovered across
87
+ * the deploy that added it) carries entries with NO `mtimeMs` despite the compile-time
88
+ * type — the same recovered-legacy-input case `ownsMandate` handles. A per-entry
89
+ * `{ …, mtimeMs: undefined }` would JSON.stringify to `{ fileId, size }` and violate
90
+ * `DataProfileInputFile`, so the WHOLE signature is omitted when ANY entry lacks
91
+ * `mtimeMs`: an absent comparand reads back as drift and buys one clean re-profile,
92
+ * exactly as a wholly-absent `result` already does (see `DataProfileResult.inputFiles`).
93
+ * The cast defeats the required-`number` type precisely to observe that legacy gap.
94
+ */
95
+ export declare function buildDriftSignature(stagedInputs: readonly StagedInput[]): DataProfileInputFile[] | undefined;
96
+ /**
97
+ * Register the data-profile workflow with DBOS. Returns the registered
98
+ * callable so `triggerDataProfile` can dispatch via `DBOS.startWorkflow`.
99
+ */
100
+ export declare function registerDataProfileWorkflow(deps: DataProfileDeps): (input: DataProfileWorkflowInput) => Promise<void>;
101
+ /**
102
+ * Body extracted so tests can drive it without registering a workflow.
103
+ * Updates `cortex_analysis_state` status to 'completed' on success or
104
+ * 'failed' on error, and revokes the run authorization on every terminal path.
105
+ */
106
+ export declare function runDataProfileBody(input: DataProfileWorkflowInput, deps: DataProfileDeps): Promise<void>;
107
+ export type DataProfileTriggerResult = "started" | "restarted" | "already_running" | "failed";
108
+ /**
109
+ * Route-side deps for triggering the data-profile workflow: the ledger pool,
110
+ * the run authorizer, and the registered workflow callable. The body's
111
+ * construction-time deps are closed over at registration
112
+ * (`registerDataProfileWorkflow`); the route never holds them.
113
+ */
114
+ export interface DataProfileTriggerDeps {
115
+ readonly pool: Pool;
116
+ readonly runAuthorizer: RunAuthorizer;
117
+ readonly workflow: (input: DataProfileWorkflowInput) => Promise<void>;
118
+ }
119
+ /**
120
+ * Identity + staged inputs for a profile run. The caller (the managed route /
121
+ * the CLI) stages `data/inputs/` BEFORE triggering (see the data-profile-init spec) and passes the
122
+ * resulting manifest here; this trigger never stages — it forwards the manifest
123
+ * into the workflow input.
124
+ */
125
+ export interface DataProfileTriggerParams {
126
+ readonly auth: AuthContext;
127
+ readonly analysisId: string;
128
+ readonly stagedInputs: readonly StagedInput[];
129
+ }
130
+ /**
131
+ * Resolve the `RunSession` the workflow runs under. Whether the authorization
132
+ * is freshly minted (Cortex-owned) or reused (caller-owned) is decided by the
133
+ * `RunAuthorizer` seam from the opaque auth; this passes that auth straight
134
+ * through and never inspects it.
135
+ */
136
+ export declare function authorizeDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<RunAuthorization>;
137
+ /**
138
+ * Per-attempt DBOS workflow id. The `nonce` is fresh per attempt (a bare
139
+ * `randomUUID()` minted at the trigger), so each (re-)profile of the same
140
+ * analysis gets a distinct id. DBOS workflow ids are permanent idempotency
141
+ * keys: a stable `dataprofile:{analysisId}` would make every attempt after the
142
+ * first a no-op — a re-profile/retry would dedup against the first (terminal)
143
+ * run, the body would never re-execute, and the ledger would sit at 'running'
144
+ * until it timed out. Concurrent double-starts are already prevented by the
145
+ * ledger CAS in tryStart/tryRerun/tryRetry, so the id does not need to dedup
146
+ * them. (`runId` is the constant `DATA_PROFILE_RUN_LITERAL`, so it can't key
147
+ * the id; an explicit nonce is what distinguishes attempts.)
148
+ */
149
+ export declare function dataProfileWorkflowId(analysisId: string, nonce: string): string;
150
+ /**
151
+ * Attempt to claim and run data profiling for an analysis, then start the workflow
152
+ * fire-and-forget for whichever claim won. Safe to call from multiple sites
153
+ * concurrently: the claims are CAS UPDATEs, so at most one caller dispatches.
154
+ *
155
+ * Every claim requires a non-empty `seed_input_file_ids` — a profile must always name
156
+ * the files it covers. The startable claim takes `'pending'` or a NULL status (NULL is
157
+ * the cleared-then-reseeded state); the rerun claim takes `'completed'`. A `'failed'`
158
+ * row is claimed by neither: retrying a failure is a deliberate act the caller drives
159
+ * through `tryRetryDataProfile` + `runDataProfile`.
160
+ *
161
+ * Returns what happened, so the caller can surface it (e.g. in the seed response).
162
+ */
163
+ export declare function triggerDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<DataProfileTriggerResult>;
164
+ /**
165
+ * Start the data-profile workflow for an already-claimed analysis (the retry
166
+ * route claims via `tryRetryDataProfile`, then calls this). The caller does not
167
+ * await the workflow's completion, but a start that rejects compensates the
168
+ * ledger (see {@link compensateStartFailure}) before re-throwing, so a caller's
169
+ * own `.catch` still observes the error and the row never wedges at `running`.
170
+ */
171
+ export declare function runDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<void>;
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Data-profile DBOS workflow — profiles the already-staged input files, runs
3
+ * the data-profiler sandbox agent, writes per-file metadata to
4
+ * cortex_artifacts, and indexes descriptions into the pgvector store. Inputs
5
+ * are staged under `data/inputs/` by the embedder before the run (see the data-profile-init spec);
6
+ * the body assumes a populated tree and never downloads.
7
+ *
8
+ * Recoverable: a crashed Cortex pod resumes the workflow from the DBOS step
9
+ * cache. The run authorization is minted at the async edge (`triggerDataProfile`)
10
+ * and rides in `input.runSession`; the body never mints. The body revokes the
11
+ * authorization on every terminal path.
12
+ *
13
+ * The `cortex_analysis_state.data_profile_status` ledger (claimed via
14
+ * `tryStartDataProfile` / `tryRerunDataProfile` / `tryRetryDataProfile`)
15
+ * still drives the UI status and the trigger's return value. Concurrent
16
+ * triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
17
+ * UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
18
+ */
19
+ import { DBOS } from "@dbos-inc/dbos-sdk";
20
+ import { randomUUID } from "node:crypto";
21
+ import { ok } from "neverthrow";
22
+ import { forSubAgent } from "../auth/types.js";
23
+ import { createDataProfilerAgent } from "../agents/sandbox/data-profiler.js";
24
+ import { runToTerminal } from "../loop/run-to-terminal.js";
25
+ import { durableStep } from "../loop/run-step.js";
26
+ import { unwrapOrThrow } from "../lib/result.js";
27
+ import { defineTool } from "../tools/define-tool.js";
28
+ import { estimateDataProfileResources } from "../sandbox/estimate-data-profile-resources.js";
29
+ import { generateExecutionId } from "../sandbox/execution-id.js";
30
+ import { mintSandboxIdentity } from "../sandbox/identity.js";
31
+ import { createVectorStore } from "../state/vector-store.js";
32
+ import { ProfilerOutputSchema } from "../schemas/data-profile-schemas.js";
33
+ import { completeDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, tryRerunDataProfile, tryStartDataProfile, upsertArtifacts, } from "../state/index.js";
34
+ import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
35
+ /** Synthetic run/step literal for the data-profile workflow. */
36
+ const DATA_PROFILE_RUN_LITERAL = "data-profile";
37
+ const DATA_PROFILE_STEP_LITERAL = "profile";
38
+ const DATA_PROFILE_AGENT_ID = "data-profiler";
39
+ /** Sandbox-server exec budget for the profile run. */
40
+ const DEFAULT_DEADLINE_MS = 300_000;
41
+ /** Build the canonical artifact path for a staged input file. */
42
+ function inputArtifactPath(f) {
43
+ return `data/${f.relativePath}`;
44
+ }
45
+ /** Lowercased extension of a path, or `"unknown"` when none. */
46
+ function fileExtension(p) {
47
+ const base = p.slice(p.lastIndexOf("/") + 1);
48
+ const dot = base.lastIndexOf(".");
49
+ return dot > 0 ? base.slice(dot + 1).toLowerCase() : "unknown";
50
+ }
51
+ /**
52
+ * Build the drift-signature comparand a completed profile persists, or `undefined`
53
+ * to omit it. `inputFiles` records whether the profiled files still hold the same
54
+ * bytes; it sits beside the `inputFileIds` audit record (WHICH files) in the stored
55
+ * `DataProfileResult`.
56
+ *
57
+ * A workflow input persisted before `StagedInput.mtimeMs` existed (recovered across
58
+ * the deploy that added it) carries entries with NO `mtimeMs` despite the compile-time
59
+ * type — the same recovered-legacy-input case `ownsMandate` handles. A per-entry
60
+ * `{ …, mtimeMs: undefined }` would JSON.stringify to `{ fileId, size }` and violate
61
+ * `DataProfileInputFile`, so the WHOLE signature is omitted when ANY entry lacks
62
+ * `mtimeMs`: an absent comparand reads back as drift and buys one clean re-profile,
63
+ * exactly as a wholly-absent `result` already does (see `DataProfileResult.inputFiles`).
64
+ * The cast defeats the required-`number` type precisely to observe that legacy gap.
65
+ */
66
+ export function buildDriftSignature(stagedInputs) {
67
+ const mtimeOf = (f) => f.mtimeMs;
68
+ if (!stagedInputs.every((f) => mtimeOf(f) !== undefined))
69
+ return undefined;
70
+ return stagedInputs.map((f) => ({ fileId: f.fileId, size: f.size, mtimeMs: mtimeOf(f) }));
71
+ }
72
+ /**
73
+ * Register the data-profile workflow with DBOS. Returns the registered
74
+ * callable so `triggerDataProfile` can dispatch via `DBOS.startWorkflow`.
75
+ */
76
+ export function registerDataProfileWorkflow(deps) {
77
+ return DBOS.registerWorkflow((input) => runDataProfileBody(input, deps), { name: "data-profile" });
78
+ }
79
+ /**
80
+ * Body extracted so tests can drive it without registering a workflow.
81
+ * Updates `cortex_analysis_state` status to 'completed' on success or
82
+ * 'failed' on error, and revokes the run authorization on every terminal path.
83
+ */
84
+ export async function runDataProfileBody(input, deps) {
85
+ // Ownership defaults to true for inputs persisted before the field existed
86
+ // (a #247 workflow recovered across this deploy): those were always
87
+ // Cortex-owned and must be revoked here.
88
+ const { analysisId, runSession, ownsMandate = true, stagedInputs } = input; // oss-core-managed-ok
89
+ const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
90
+ try {
91
+ // 1. Input files are already staged under data/inputs/ (see the data-profile-init spec); the
92
+ // embedder populated the tree and handed us this manifest in the workflow
93
+ // input. The body never downloads.
94
+ if (stagedInputs.length === 0) {
95
+ console.warn(`[data-profile] No input files staged for ${analysisId}`);
96
+ if (!unwrapOrThrow(await completeDataProfile(deps.pool, analysisId)))
97
+ logTerminalNoop(analysisId, "completion");
98
+ await deps.runAuthorizer.revoke(authorization, "data-profile-completed");
99
+ return;
100
+ }
101
+ // 2. Register staged files in cortex_artifacts
102
+ await upsertArtifacts(deps.pool, stagedInputs.map((f) => ({
103
+ resourceId: analysisId,
104
+ path: inputArtifactPath(f),
105
+ hash: f.hash,
106
+ size: f.size,
107
+ role: "input",
108
+ fileId: f.fileId,
109
+ })));
110
+ // 3. Run data-profiler sandbox agent
111
+ const fileList = stagedInputs.map((f) => inputArtifactPath(f));
112
+ const prompt = [
113
+ `Profile all input data files for this analysis.`,
114
+ ``,
115
+ `IMPORTANT: You MUST use execute_command to profile files before submitting results. Do NOT submit empty files or placeholder text.`,
116
+ ``,
117
+ `CRITICAL: File and directory paths may contain spaces. You MUST always double-quote paths in shell commands (e.g. head "data/inputs/My Folder/file.csv"). Unquoted paths with spaces will silently break commands.`,
118
+ ``,
119
+ `The following input files are available (paths relative to analysis root):`,
120
+ ...fileList.map((f) => `- ${f}`),
121
+ ``,
122
+ `Steps:`,
123
+ `1. For each file, use head and wc to inspect structure (ALWAYS double-quote file paths)`,
124
+ `2. Write a Python script for detailed profiling — use pathlib or os.path for path handling (handles spaces natively)`,
125
+ `3. Call the \`submit_profile\` tool with structured metadata for EVERY file listed above`,
126
+ ``,
127
+ `The analysis root is mounted at /${analysisId}/. All file paths in your response must be relative to the analysis root and must EXACTLY match the paths listed above.`,
128
+ ].join("\n");
129
+ const executionId = generateExecutionId(DATA_PROFILE_AGENT_ID);
130
+ const workflowId = DBOS.workflowID ?? `${DATA_PROFILE_RUN_LITERAL}:${executionId}`;
131
+ const childSession = forSubAgent(runSession, DATA_PROFILE_AGENT_ID);
132
+ // A resolver throw fails the workflow loudly (workspace-root-resolution
133
+ // contract) — profiling an analysis whose root cannot be resolved is
134
+ // meaningless, so no softer handling is warranted.
135
+ const workspaceRoot = deps.resolveWorkspaceRoot(analysisId);
136
+ console.log(`[data-profile] execution=${executionId} analysis=${analysisId} starting sandbox`);
137
+ const sandbox = await deps.sandboxClient.createSandbox({
138
+ runId: DATA_PROFILE_RUN_LITERAL,
139
+ stepId: DATA_PROFILE_STEP_LITERAL,
140
+ analysisId,
141
+ childWorkflowId: workflowId,
142
+ resources: estimateDataProfileResources(stagedInputs),
143
+ }, mintSandboxIdentity(DATA_PROFILE_RUN_LITERAL));
144
+ try {
145
+ // Checkpointed clock, not `Date.now()`: `awaitExec` gates on this absolute
146
+ // deadline and its recovery-pull is a durable step, so a wall-clock deadline
147
+ // that grew on replay would shift which loop iteration crosses the deadline
148
+ // and desynchronise the recorded function-ID sequence (see sandbox-step.ts,
149
+ // which captures its step deadline the same way).
150
+ const deadlineAbs = (await DBOS.now()) + DEFAULT_DEADLINE_MS;
151
+ const nextFunctionId = makeNextFunctionId();
152
+ const sandboxAgentDeps = {
153
+ provider: deps.provider,
154
+ pool: deps.pool,
155
+ sandboxClient: deps.sandboxClient,
156
+ workspaceFs: deps.workspaceFs,
157
+ embedding: deps.embedding,
158
+ model: deps.model,
159
+ skillsDir: deps.skillsDir,
160
+ bioKeys: deps.bioKeys,
161
+ step: {
162
+ sandbox,
163
+ workspaceRoot,
164
+ analysisId,
165
+ runId: DATA_PROFILE_RUN_LITERAL,
166
+ stepId: DATA_PROFILE_STEP_LITERAL,
167
+ workflowId,
168
+ // The profiler writes Python scripts and intermediate artifacts under
169
+ // the synthetic step path; the post-agent `rm -rf runs/data-profile/`
170
+ // cleanup wipes them.
171
+ allowedWritePrefix: `${workspaceRoot}/runs/${DATA_PROFILE_RUN_LITERAL}/${DATA_PROFILE_STEP_LITERAL}`,
172
+ nextFunctionId,
173
+ deadlineMs: () => deadlineAbs,
174
+ },
175
+ };
176
+ let capturedProfile = null;
177
+ const submitProfileTool = defineTool({
178
+ id: "submit_profile",
179
+ description: "Submit the profiling results. Call this tool once after completing " + "all profiling work — it validates and records your findings.",
180
+ inputSchema: ProfilerOutputSchema,
181
+ execute: async (input) => {
182
+ capturedProfile = input;
183
+ return ok({ status: "accepted" });
184
+ },
185
+ });
186
+ const baseAgent = createDataProfilerAgent(sandboxAgentDeps);
187
+ const agentDef = { ...baseAgent, tools: [...baseAgent.tools, submitProfileTool] };
188
+ const signal = new AbortController().signal;
189
+ await runToTerminal(agentDef, [{ role: "user", content: prompt }], childSession, {
190
+ provider: deps.provider,
191
+ signal,
192
+ emit: () => { },
193
+ runStep: durableStep,
194
+ }, {
195
+ resolved: () => capturedProfile !== null,
196
+ tools: [submitProfileTool],
197
+ nudge: "You stopped without calling submit_profile, so no profile was " +
198
+ "recorded. Call submit_profile now with structured metadata for " +
199
+ "every input file — base it on the profiling you already did.",
200
+ });
201
+ if (!capturedProfile) {
202
+ throw new Error("Data profiling failed: agent did not call submit_profile");
203
+ }
204
+ const profilerData = capturedProfile;
205
+ // 4. Index into vector store — real files only, consistent type metadata
206
+ const profilerByPath = new Map(profilerData.files.map((f) => [f.path, f]));
207
+ const normPath = (p) => p
208
+ .replace(/\/+/g, "/")
209
+ .replace(/^\/|\/$/g, "")
210
+ .trim();
211
+ const profilerByNorm = new Map(profilerData.files.map((f) => [normPath(f.path), f]));
212
+ await ensureSearchIndex(deps.pool, analysisId, deps.embedding.dimensions);
213
+ const vectorStore = createVectorStore(deps.pool);
214
+ const embedOne = async (text, session) => {
215
+ const [vec] = unwrapOrThrow(await deps.embedding.embed([text], session));
216
+ if (!vec)
217
+ throw new Error("data-profile: empty embedding response");
218
+ return vec;
219
+ };
220
+ const indexName = searchIndexName(analysisId);
221
+ let indexed = 0;
222
+ let fallbackCount = 0;
223
+ for (const matFile of stagedInputs) {
224
+ const dbPath = inputArtifactPath(matFile);
225
+ const desc = profilerByPath.get(dbPath) ?? profilerByNorm.get(normPath(dbPath));
226
+ // Lossless: a materialized input file the profiler agent omitted
227
+ // still gets a deterministic, no-LLM description so it stays
228
+ // discoverable via search. The agent's profile is enrichment, not a
229
+ // gate on indexing — mirrors the step-output metadata fallback.
230
+ const searchMeta = desc
231
+ ? {
232
+ text: desc.description,
233
+ type: "input",
234
+ dataType: desc.dataType,
235
+ format: desc.format,
236
+ ...(desc.tags ? { tags: desc.tags } : {}),
237
+ }
238
+ : {
239
+ text: `${dbPath} — input file (${fileExtension(dbPath)}, ${matFile.size} bytes); automated profile unavailable.`,
240
+ type: "input",
241
+ dataType: "unknown",
242
+ format: fileExtension(dbPath),
243
+ };
244
+ if (!desc)
245
+ fallbackCount++;
246
+ const embedding = await embedOne(searchMeta.text, runSession);
247
+ unwrapOrThrow(await vectorStore.upsert({
248
+ indexName,
249
+ vectors: [embedding],
250
+ metadata: [searchMeta],
251
+ ids: [`/${analysisId}/${dbPath}`],
252
+ }));
253
+ indexed++;
254
+ }
255
+ if (fallbackCount > 0) {
256
+ console.warn(`[data-profile] ${fallbackCount}/${stagedInputs.length} input file(s) used a deterministic fallback description (analysis=${analysisId}) — profiler omitted them`);
257
+ }
258
+ console.log(`[data-profile] Indexed ${indexed} file(s) for ${analysisId}`);
259
+ // 5. Complete — store result with input snapshot for staleness detection.
260
+ if (!unwrapOrThrow(await completeDataProfile(deps.pool, analysisId, {
261
+ summary: profilerData.analysisSummary,
262
+ files: profilerData.files.map((f) => ({
263
+ path: f.path,
264
+ description: f.description,
265
+ })),
266
+ inputFileIds: stagedInputs.map((f) => f.fileId),
267
+ inputFiles: buildDriftSignature(stagedInputs),
268
+ profiledAt: new Date().toISOString(),
269
+ }))) {
270
+ logTerminalNoop(analysisId, "completion");
271
+ }
272
+ await deps.runAuthorizer.revoke(authorization, "data-profile-completed");
273
+ }
274
+ finally {
275
+ try {
276
+ await deps.sandboxClient.teardown(sandbox);
277
+ }
278
+ catch (teardownErr) {
279
+ console.warn(`[data-profile] execution=${executionId} teardown failed (non-fatal):`, teardownErr);
280
+ }
281
+ }
282
+ }
283
+ catch (err) {
284
+ console.error(`[data-profile] Failed for ${analysisId}:`, err);
285
+ if (!unwrapOrThrow(await failDataProfile(deps.pool, analysisId, profileFailureReason(err))))
286
+ logTerminalNoop(analysisId, "failure");
287
+ await deps.runAuthorizer.revoke(authorization, "data-profile-failed");
288
+ }
289
+ }
290
+ /**
291
+ * Log a terminal ledger write the running-CAS refused: the row was cleared
292
+ * (emptied inputs) or expired (stale-timeout) out from under a live workflow, so
293
+ * there is no `running` row to stamp. Not an error — the ledger correctly moved
294
+ * on; the workflow still revokes its own authorization on the same terminal path.
295
+ */
296
+ function logTerminalNoop(analysisId, write) {
297
+ console.warn(`[data-profile] ${write} write skipped for ${analysisId}: ledger row not running (cleared or expired concurrently)`);
298
+ }
299
+ /**
300
+ * Resolve the `RunSession` the workflow runs under. Whether the authorization
301
+ * is freshly minted (Cortex-owned) or reused (caller-owned) is decided by the
302
+ * `RunAuthorizer` seam from the opaque auth; this passes that auth straight
303
+ * through and never inspects it.
304
+ */
305
+ export async function authorizeDataProfile(deps, params) {
306
+ const { auth, analysisId } = params;
307
+ return deps.runAuthorizer.authorize({
308
+ auth,
309
+ scope: { kind: "analysis", analysisId },
310
+ provenance: { agentId: DATA_PROFILE_AGENT_ID, callPath: [DATA_PROFILE_AGENT_ID] },
311
+ frame: { runId: DATA_PROFILE_RUN_LITERAL, stepId: DATA_PROFILE_STEP_LITERAL },
312
+ });
313
+ }
314
+ /**
315
+ * Per-attempt DBOS workflow id. The `nonce` is fresh per attempt (a bare
316
+ * `randomUUID()` minted at the trigger), so each (re-)profile of the same
317
+ * analysis gets a distinct id. DBOS workflow ids are permanent idempotency
318
+ * keys: a stable `dataprofile:{analysisId}` would make every attempt after the
319
+ * first a no-op — a re-profile/retry would dedup against the first (terminal)
320
+ * run, the body would never re-execute, and the ledger would sit at 'running'
321
+ * until it timed out. Concurrent double-starts are already prevented by the
322
+ * ledger CAS in tryStart/tryRerun/tryRetry, so the id does not need to dedup
323
+ * them. (`runId` is the constant `DATA_PROFILE_RUN_LITERAL`, so it can't key
324
+ * the id; an explicit nonce is what distinguishes attempts.)
325
+ */
326
+ export function dataProfileWorkflowId(analysisId, nonce) {
327
+ return `dataprofile:${analysisId}:${nonce}`;
328
+ }
329
+ /**
330
+ * Authorize the run via the `RunAuthorizer` and start the data-profile workflow
331
+ * under a per-attempt id `dataprofile:{analysisId}:{nonce}` — concurrent
332
+ * triggers are already serialized by the ledger CAS. The caller has already
333
+ * staged the inputs and supplied the manifest in `params.stagedInputs`; this
334
+ * forwards it into the workflow input. Fire-and-forget: the handle result is
335
+ * not awaited.
336
+ */
337
+ async function startDataProfileWorkflow(deps, params) {
338
+ const { runSession, ownsMandate } = await authorizeDataProfile(deps, params); // oss-core-managed-ok
339
+ const attemptNonce = randomUUID();
340
+ await DBOS.startWorkflow(deps.workflow, {
341
+ workflowID: dataProfileWorkflowId(params.analysisId, attemptNonce),
342
+ })({
343
+ analysisId: params.analysisId,
344
+ runSession,
345
+ ownsMandate, // oss-core-managed-ok
346
+ stagedInputs: params.stagedInputs,
347
+ });
348
+ }
349
+ /**
350
+ * Attempt to claim and run data profiling for an analysis, then start the workflow
351
+ * fire-and-forget for whichever claim won. Safe to call from multiple sites
352
+ * concurrently: the claims are CAS UPDATEs, so at most one caller dispatches.
353
+ *
354
+ * Every claim requires a non-empty `seed_input_file_ids` — a profile must always name
355
+ * the files it covers. The startable claim takes `'pending'` or a NULL status (NULL is
356
+ * the cleared-then-reseeded state); the rerun claim takes `'completed'`. A `'failed'`
357
+ * row is claimed by neither: retrying a failure is a deliberate act the caller drives
358
+ * through `tryRetryDataProfile` + `runDataProfile`.
359
+ *
360
+ * Returns what happened, so the caller can surface it (e.g. in the seed response).
361
+ */
362
+ export async function triggerDataProfile(deps, params) {
363
+ const { analysisId } = params;
364
+ try {
365
+ // ADVISORY pre-check, not the enforcement — the claim CAS carries the same seed
366
+ // conjunct (see `SEEDED` in state/data-profile.ts) and is what actually makes a
367
+ // seedless `running` row impossible. This read exists only to name the cause: on
368
+ // the ordinary non-racing path it turns an opaque "no claim matched" into a
369
+ // precise reason. An empty array is not a seed — it names zero files. Reads via
370
+ // `loadSeedInputFileIds`, which returns null for BOTH a missing analysis row and
371
+ // a NULL-seed row (`loadDataProfileStatus` would hide the seed of a cleared row).
372
+ const seeded = unwrapOrThrow(await loadSeedInputFileIds(deps.pool, analysisId));
373
+ if (seeded === null || seeded.length === 0) {
374
+ console.error(`[data-profile] Trigger rejected for ${analysisId}: no seeded input set (missing analysis row or caller skipped seeding)`);
375
+ return "failed";
376
+ }
377
+ // The trigger validates the ledger seed above; it must also validate the manifest
378
+ // it is about to dispatch. A seeded row profiled against an EMPTY manifest would
379
+ // claim `running` and then hit the body's empty-manifest path — completing with a
380
+ // NULL result while the seed still names files, an incoherence a staleness policy
381
+ // then loops on re-triggering. Refuse the divergence before any claim.
382
+ if (params.stagedInputs.length === 0) {
383
+ console.error(`[data-profile] Trigger rejected for ${analysisId}: empty manifest dispatched against a seed naming ${seeded.length} file(s)`);
384
+ return "failed";
385
+ }
386
+ const started = unwrapOrThrow(await tryStartDataProfile(deps.pool, analysisId));
387
+ if (started) {
388
+ startDataProfileWorkflow(deps, params).catch((err) => compensateStartFailure(deps, analysisId, "Run", err));
389
+ return "started";
390
+ }
391
+ const restarted = unwrapOrThrow(await tryRerunDataProfile(deps.pool, analysisId));
392
+ if (restarted) {
393
+ startDataProfileWorkflow(deps, params).catch((err) => compensateStartFailure(deps, analysisId, "Re-run", err));
394
+ return "restarted";
395
+ }
396
+ const status = unwrapOrThrow(await loadDataProfileStatus(deps.pool, analysisId));
397
+ if (status?.status === "running")
398
+ return "already_running";
399
+ return "failed";
400
+ }
401
+ catch (err) {
402
+ console.error(`[data-profile] Trigger error for ${analysisId}:`, err);
403
+ return "failed";
404
+ }
405
+ }
406
+ /**
407
+ * Compensate a fire-and-forget start that rejected. The ledger CAS in
408
+ * `tryStart`/`tryRerun`/`tryRetry` already flipped the row to `running`; if the
409
+ * dispatch never landed a workflow, DBOS has nothing to recover, so without
410
+ * this the row would sit at `running` forever and every later trigger would
411
+ * report `already_running`. Failing the ledger lets the retry path recover.
412
+ * Best-effort — a compensation write that itself fails is only logged, since
413
+ * there is no further channel to report it on.
414
+ */
415
+ async function compensateStartFailure(deps, analysisId, phase, err) {
416
+ console.error(`[data-profile] ${phase} error for ${analysisId}:`, err);
417
+ const failed = await failDataProfile(deps.pool, analysisId, profileFailureReason(err));
418
+ if (failed.isErr()) {
419
+ console.error(`[data-profile] Failed to mark ${analysisId} failed after a start error:`, failed.error);
420
+ }
421
+ else if (!failed.value) {
422
+ // The row this compensation was written to fail is no longer `running` — a
423
+ // concurrent clear/expire already moved it on, so the running-CAS refused the
424
+ // stamp. Nothing wedged at `running`, which is the outcome compensation exists
425
+ // to guarantee; just record the no-op.
426
+ logTerminalNoop(analysisId, "compensation");
427
+ }
428
+ }
429
+ /**
430
+ * Start the data-profile workflow for an already-claimed analysis (the retry
431
+ * route claims via `tryRetryDataProfile`, then calls this). The caller does not
432
+ * await the workflow's completion, but a start that rejects compensates the
433
+ * ledger (see {@link compensateStartFailure}) before re-throwing, so a caller's
434
+ * own `.catch` still observes the error and the row never wedges at `running`.
435
+ */
436
+ export async function runDataProfile(deps, params) {
437
+ try {
438
+ await startDataProfileWorkflow(deps, params);
439
+ }
440
+ catch (err) {
441
+ await compensateStartFailure(deps, params.analysisId, "Retry", err);
442
+ throw err;
443
+ }
444
+ }
445
+ /**
446
+ * Concise, UI-safe failure reason. `data_profile_error` is surfaced verbatim
447
+ * to the frontend, so raw errors — K8s API response bodies, multi-line stack
448
+ * traces — must never reach it. The full error is preserved in the logs; this
449
+ * collapses to a single bounded line for display.
450
+ */
451
+ const PROFILE_ERROR_MAX_LEN = 200;
452
+ function profileFailureReason(err) {
453
+ const raw = err instanceof Error ? err.message : String(err);
454
+ const firstLine = raw.split("\n", 1)[0].replace(/\s+/g, " ").trim();
455
+ return firstLine.length > PROFILE_ERROR_MAX_LEN ? firstLine.slice(0, PROFILE_ERROR_MAX_LEN - 1) + "…" : firstLine || "Data profiling failed";
456
+ }
457
+ /** Per-call function-id minter — replay-deterministic. */
458
+ function makeNextFunctionId() {
459
+ let n = 0;
460
+ return () => `fn-${(n++).toString(36)}`;
461
+ }