@inflexa-ai/harness 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/dist/agents/conversation-agent.d.ts +12 -11
  2. package/dist/agents/conversation-agent.js +30 -33
  3. package/dist/agents/report-builder.js +2 -1
  4. package/dist/agents/sandbox/bulk-transcriptomics-agent.js +1 -1
  5. package/dist/agents/sandbox/cheminformatics-agent.js +1 -19
  6. package/dist/agents/sandbox/chromatin-agent.js +1 -10
  7. package/dist/agents/sandbox/dna-methylation-agent.js +1 -10
  8. package/dist/agents/sandbox/drug-repurposing-agent.js +4 -14
  9. package/dist/agents/sandbox/enrichment-agent.js +1 -10
  10. package/dist/agents/sandbox/ephemeral-executor.js +1 -10
  11. package/dist/agents/sandbox/genomic-variant-agent.js +1 -3
  12. package/dist/agents/sandbox/immune-profiling-agent.js +1 -13
  13. package/dist/agents/sandbox/metabolomics-agent.js +1 -1
  14. package/dist/agents/sandbox/microbiome-agent.js +1 -1
  15. package/dist/agents/sandbox/multi-omics-integration-agent.js +1 -12
  16. package/dist/agents/sandbox/multimodal-sc-agent.js +1 -1
  17. package/dist/agents/sandbox/network-agent.js +1 -10
  18. package/dist/agents/sandbox/pkpd-clinical-response-agent.js +2 -8
  19. package/dist/agents/sandbox/proteomics-agent.js +1 -1
  20. package/dist/agents/sandbox/scientific-executor.js +1 -10
  21. package/dist/agents/sandbox/shared.d.ts +17 -6
  22. package/dist/agents/sandbox/shared.js +49 -38
  23. package/dist/agents/sandbox/single-cell-agent.js +1 -1
  24. package/dist/agents/sandbox/spatial-omics-agent.js +1 -1
  25. package/dist/agents/sandbox/statistical-modeling-agent.js +1 -1
  26. package/dist/agents/sandbox/translational-safety-agent.js +3 -9
  27. package/dist/agents/sandbox/types.d.ts +1 -1
  28. package/dist/agents/system-prompt.d.ts +37 -11
  29. package/dist/agents/system-prompt.js +35 -12
  30. package/dist/app/data-profile-orientation.d.ts +34 -0
  31. package/dist/app/data-profile-orientation.js +117 -0
  32. package/dist/contracts/schemas/chat-parts.d.ts +9 -9
  33. package/dist/execution/artifact-metadata.js +2 -1
  34. package/dist/execution/ephemeral-runner.d.ts +13 -0
  35. package/dist/execution/ephemeral-runner.js +23 -1
  36. package/dist/execution/run-synthesis.js +20 -19
  37. package/dist/execution/step-summary.js +2 -1
  38. package/dist/index.d.ts +6 -2
  39. package/dist/index.js +19 -5
  40. package/dist/loop/__fixtures__/scripted-provider.d.ts +2 -2
  41. package/dist/loop/__fixtures__/scripted-provider.js +2 -1
  42. package/dist/loop/metrics.d.ts +33 -1
  43. package/dist/loop/metrics.js +56 -2
  44. package/dist/loop/run-agent.d.ts +13 -1
  45. package/dist/loop/run-agent.js +19 -4
  46. package/dist/memory/card-builders.d.ts +8 -1
  47. package/dist/memory/card-builders.js +20 -3
  48. package/dist/memory/reconstruct-cards.js +4 -3
  49. package/dist/memory/thread-history.d.ts +27 -2
  50. package/dist/memory/thread-history.js +45 -5
  51. package/dist/memory/working-memory.d.ts +93 -10
  52. package/dist/memory/working-memory.js +220 -84
  53. package/dist/prompts/SOUL.d.ts +22 -9
  54. package/dist/prompts/SOUL.js +56 -37
  55. package/dist/prompts/analogical-reasoner.d.ts +1 -1
  56. package/dist/prompts/analogical-reasoner.js +2 -2
  57. package/dist/prompts/briefing.d.ts +100 -0
  58. package/dist/prompts/briefing.js +166 -0
  59. package/dist/prompts/conversation.d.ts +1 -1
  60. package/dist/prompts/conversation.js +94 -440
  61. package/dist/prompts/literature-reviewer.d.ts +1 -1
  62. package/dist/prompts/literature-reviewer.js +10 -10
  63. package/dist/prompts/planner.js +28 -59
  64. package/dist/prompts/report-builder.d.ts +1 -1
  65. package/dist/prompts/report-builder.js +71 -24
  66. package/dist/prompts/sandbox/bulk-transcriptomics-agent.d.ts +1 -1
  67. package/dist/prompts/sandbox/bulk-transcriptomics-agent.js +2 -7
  68. package/dist/prompts/sandbox/cheminformatics-agent.d.ts +1 -1
  69. package/dist/prompts/sandbox/cheminformatics-agent.js +11 -15
  70. package/dist/prompts/sandbox/chromatin-agent.d.ts +1 -1
  71. package/dist/prompts/sandbox/chromatin-agent.js +3 -7
  72. package/dist/prompts/sandbox/data-profiler.d.ts +1 -1
  73. package/dist/prompts/sandbox/data-profiler.js +13 -8
  74. package/dist/prompts/sandbox/dna-methylation-agent.d.ts +1 -1
  75. package/dist/prompts/sandbox/dna-methylation-agent.js +2 -7
  76. package/dist/prompts/sandbox/drug-repurposing-agent.d.ts +1 -1
  77. package/dist/prompts/sandbox/drug-repurposing-agent.js +15 -16
  78. package/dist/prompts/sandbox/enrichment-agent.d.ts +1 -1
  79. package/dist/prompts/sandbox/enrichment-agent.js +2 -9
  80. package/dist/prompts/sandbox/genomic-variant-agent.d.ts +1 -1
  81. package/dist/prompts/sandbox/genomic-variant-agent.js +2 -6
  82. package/dist/prompts/sandbox/immune-profiling-agent.d.ts +1 -1
  83. package/dist/prompts/sandbox/immune-profiling-agent.js +3 -8
  84. package/dist/prompts/sandbox/metabolomics-agent.d.ts +1 -1
  85. package/dist/prompts/sandbox/metabolomics-agent.js +1 -7
  86. package/dist/prompts/sandbox/microbiome-agent.d.ts +1 -1
  87. package/dist/prompts/sandbox/microbiome-agent.js +2 -7
  88. package/dist/prompts/sandbox/multi-omics-integration-agent.d.ts +1 -1
  89. package/dist/prompts/sandbox/multi-omics-integration-agent.js +2 -8
  90. package/dist/prompts/sandbox/multimodal-sc-agent.d.ts +1 -1
  91. package/dist/prompts/sandbox/multimodal-sc-agent.js +2 -7
  92. package/dist/prompts/sandbox/network-agent.d.ts +1 -1
  93. package/dist/prompts/sandbox/network-agent.js +2 -7
  94. package/dist/prompts/sandbox/proteomics-agent.d.ts +1 -1
  95. package/dist/prompts/sandbox/proteomics-agent.js +2 -9
  96. package/dist/prompts/sandbox/single-cell-agent.d.ts +1 -1
  97. package/dist/prompts/sandbox/single-cell-agent.js +2 -9
  98. package/dist/prompts/sandbox/spatial-omics-agent.d.ts +1 -1
  99. package/dist/prompts/sandbox/spatial-omics-agent.js +3 -6
  100. package/dist/prompts/sandbox/statistical-modeling-agent.d.ts +1 -1
  101. package/dist/prompts/sandbox/statistical-modeling-agent.js +2 -7
  102. package/dist/prompts/sandbox/translational-safety-agent.d.ts +1 -1
  103. package/dist/prompts/sandbox/translational-safety-agent.js +13 -14
  104. package/dist/prompts/sandbox-standards.d.ts +22 -14
  105. package/dist/prompts/sandbox-standards.js +91 -71
  106. package/dist/prompts/synthesis-agent.d.ts +1 -1
  107. package/dist/prompts/synthesis-agent.js +33 -131
  108. package/dist/provenance/collector.js +1 -1
  109. package/dist/providers/ai-sdk.js +31 -4
  110. package/dist/providers/prompt-cache.d.ts +74 -0
  111. package/dist/providers/prompt-cache.js +77 -0
  112. package/dist/providers/types.d.ts +33 -0
  113. package/dist/reference-data/catalog.d.ts +131 -0
  114. package/dist/reference-data/catalog.js +348 -0
  115. package/dist/reference-data/receipt.d.ts +41 -0
  116. package/dist/reference-data/receipt.js +40 -0
  117. package/dist/schemas/data-profile-schemas.js +5 -3
  118. package/dist/schemas/plan-schemas.d.ts +21 -21
  119. package/dist/schemas/plan-schemas.js +9 -3
  120. package/dist/schemas/run-synthesis.d.ts +8 -4
  121. package/dist/schemas/run-synthesis.js +92 -56
  122. package/dist/schemas/validate-plan.js +1 -1
  123. package/dist/schemas/workflow-state.d.ts +7 -1
  124. package/dist/schemas/workflow-state.js +33 -19
  125. package/dist/state/artifacts.d.ts +13 -0
  126. package/dist/state/artifacts.js +27 -0
  127. package/dist/state/data-profile.d.ts +64 -5
  128. package/dist/state/index.d.ts +3 -3
  129. package/dist/state/index.js +1 -1
  130. package/dist/tasks/data-profile.d.ts +20 -2
  131. package/dist/tasks/data-profile.js +71 -22
  132. package/dist/tools/bio/chembl.d.ts +38 -0
  133. package/dist/tools/bio/chembl.js +138 -0
  134. package/dist/tools/bio/comptox.d.ts +50 -0
  135. package/dist/tools/bio/comptox.js +149 -0
  136. package/dist/tools/bio/get-impc-ko-profile.js +9 -6
  137. package/dist/tools/bio/index.d.ts +5 -17
  138. package/dist/tools/bio/index.js +5 -17
  139. package/dist/tools/bio/keys.d.ts +14 -9
  140. package/dist/tools/bio/keys.js +16 -16
  141. package/dist/tools/bio/opentargets.d.ts +38 -0
  142. package/dist/tools/bio/opentargets.js +89 -0
  143. package/dist/tools/bio/pubchem.d.ts +29 -0
  144. package/dist/tools/bio/pubchem.js +92 -0
  145. package/dist/tools/bio/pubmed.d.ts +51 -0
  146. package/dist/tools/bio/pubmed.js +100 -0
  147. package/dist/tools/bio/search-bgee-expression.js +12 -6
  148. package/dist/tools/bio/search-clinical-trials.js +16 -5
  149. package/dist/tools/bio/search-faers.js +8 -4
  150. package/dist/tools/bio/search-geo-datasets.js +20 -6
  151. package/dist/tools/bio/search-gwas-catalog.d.ts +1 -1
  152. package/dist/tools/bio/search-pharmgkb.js +10 -4
  153. package/dist/tools/display/index.d.ts +1 -0
  154. package/dist/tools/display/index.js +1 -0
  155. package/dist/tools/display/normalize-echart-spec.d.ts +61 -0
  156. package/dist/tools/display/normalize-echart-spec.js +211 -0
  157. package/dist/tools/display/show-user.d.ts +6 -1
  158. package/dist/tools/display/show-user.js +25 -12
  159. package/dist/tools/execute-plan.js +5 -2
  160. package/dist/tools/iterate-report.d.ts +168 -118
  161. package/dist/tools/iterate-report.js +334 -96
  162. package/dist/tools/lib/chembl-client.d.ts +12 -0
  163. package/dist/tools/lib/chembl-client.js +127 -0
  164. package/dist/tools/lib/ctx-ops.d.ts +224 -0
  165. package/dist/tools/lib/ctx-ops.js +450 -0
  166. package/dist/tools/lib/iuphar-client.js +10 -1
  167. package/dist/tools/lib/openfda-client.js +11 -3
  168. package/dist/tools/lib/pathway-client.js +10 -4
  169. package/dist/tools/lib/pubchem-ops.d.ts +74 -0
  170. package/dist/tools/lib/pubchem-ops.js +224 -0
  171. package/dist/tools/memory/update-working-memory.d.ts +45 -7
  172. package/dist/tools/memory/update-working-memory.js +111 -41
  173. package/dist/tools/report/index.d.ts +3 -2
  174. package/dist/tools/report/index.js +3 -2
  175. package/dist/tools/research/generate-analogy-report.js +25 -12
  176. package/dist/tools/research/generate-plan.d.ts +12 -5
  177. package/dist/tools/research/generate-plan.js +168 -37
  178. package/dist/tools/research/index.d.ts +1 -0
  179. package/dist/tools/research/index.js +1 -0
  180. package/dist/tools/research/inspect-data-profile.d.ts +85 -0
  181. package/dist/tools/research/inspect-data-profile.js +161 -0
  182. package/dist/tools/research/literature-reviewer.js +3 -4
  183. package/dist/tools/sandbox/list-available-packages.d.ts +79 -5
  184. package/dist/tools/sandbox/list-available-packages.js +152 -10
  185. package/dist/tools/sandbox/list-available-refs.d.ts +141 -5
  186. package/dist/tools/sandbox/list-available-refs.js +647 -134
  187. package/dist/tools/sandbox/report-blocker.d.ts +39 -9
  188. package/dist/tools/sandbox/report-blocker.js +43 -20
  189. package/dist/tools/workspace/read-file.js +4 -5
  190. package/dist/tools/workspace/run-exec.d.ts +4 -4
  191. package/dist/tools/workspace/run-exec.js +4 -4
  192. package/dist/tools/workspace/show-file.js +10 -6
  193. package/dist/tools/workspace/show-plan.js +12 -6
  194. package/dist/tools/workspace/workspace-search.d.ts +1 -1
  195. package/dist/tools/workspace/workspace-search.js +11 -5
  196. package/dist/workflows/execute-analysis.d.ts +43 -4
  197. package/dist/workflows/execute-analysis.js +107 -6
  198. package/dist/workflows/target-assessment/lib/citation-validator.js +2 -2
  199. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.js +2 -1
  200. package/dist/workspace/paths.d.ts +2 -2
  201. package/dist/workspace/paths.js +2 -2
  202. package/package.json +33 -33
  203. package/dist/execution/filesystem-artifact-registry.d.ts +0 -57
  204. package/dist/execution/filesystem-artifact-registry.js +0 -92
  205. package/dist/lib/identifiers.d.ts +0 -8
  206. package/dist/lib/identifiers.js +0 -10
  207. package/dist/lib/mime-detect.d.ts +0 -17
  208. package/dist/lib/mime-detect.js +0 -29
  209. package/dist/lib/streamed-download.d.ts +0 -28
  210. package/dist/lib/streamed-download.js +0 -111
  211. package/dist/lib/trace-context.d.ts +0 -11
  212. package/dist/lib/trace-context.js +0 -49
  213. package/dist/providers/llm-capabilities.d.ts +0 -33
  214. package/dist/providers/llm-capabilities.js +0 -58
  215. package/dist/schemas/render-step-prompt.d.ts +0 -32
  216. package/dist/schemas/render-step-prompt.js +0 -76
  217. package/dist/tools/bio/find-approval-precedent.d.ts +0 -32
  218. package/dist/tools/bio/find-approval-precedent.js +0 -72
  219. package/dist/tools/bio/get-article-details.d.ts +0 -11
  220. package/dist/tools/bio/get-article-details.js +0 -20
  221. package/dist/tools/bio/get-article-full-text.d.ts +0 -19
  222. package/dist/tools/bio/get-article-full-text.js +0 -32
  223. package/dist/tools/bio/get-bioactivity.d.ts +0 -11
  224. package/dist/tools/bio/get-bioactivity.js +0 -23
  225. package/dist/tools/bio/get-drug-info.d.ts +0 -9
  226. package/dist/tools/bio/get-drug-info.js +0 -22
  227. package/dist/tools/bio/get-mechanism.d.ts +0 -8
  228. package/dist/tools/bio/get-mechanism.js +0 -18
  229. package/dist/tools/bio/get-pubchem-assays.d.ts +0 -22
  230. package/dist/tools/bio/get-pubchem-assays.js +0 -107
  231. package/dist/tools/bio/get-pubchem-cross-refs.d.ts +0 -15
  232. package/dist/tools/bio/get-pubchem-cross-refs.js +0 -68
  233. package/dist/tools/bio/get-target-safety.d.ts +0 -18
  234. package/dist/tools/bio/get-target-safety.js +0 -26
  235. package/dist/tools/bio/search-compounds.d.ts +0 -22
  236. package/dist/tools/bio/search-compounds.js +0 -160
  237. package/dist/tools/bio/search-ctx-chemical.d.ts +0 -50
  238. package/dist/tools/bio/search-ctx-chemical.js +0 -130
  239. package/dist/tools/bio/search-ctx-exposure.d.ts +0 -55
  240. package/dist/tools/bio/search-ctx-exposure.js +0 -176
  241. package/dist/tools/bio/search-ctx-hazard.d.ts +0 -111
  242. package/dist/tools/bio/search-ctx-hazard.js +0 -178
  243. package/dist/tools/bio/search-opentargets.d.ts +0 -11
  244. package/dist/tools/bio/search-opentargets.js +0 -25
  245. package/dist/tools/bio/search-pubchem-compound.d.ts +0 -26
  246. package/dist/tools/bio/search-pubchem-compound.js +0 -110
  247. package/dist/tools/bio/search-pubmed.d.ts +0 -17
  248. package/dist/tools/bio/search-pubmed.js +0 -31
  249. package/dist/tools/bio/search-targets.d.ts +0 -9
  250. package/dist/tools/bio/search-targets.js +0 -20
  251. package/dist/tools/bio/search-toxcast.d.ts +0 -36
  252. package/dist/tools/bio/search-toxcast.js +0 -141
  253. package/dist/workflows/register-workflows.d.ts +0 -51
  254. package/dist/workflows/register-workflows.js +0 -48
  255. package/dist/workflows/resume-execute-analysis.d.ts +0 -70
  256. package/dist/workflows/resume-execute-analysis.js +0 -80
  257. package/dist/workflows/target-assessment/correction-loop.d.ts +0 -45
  258. package/dist/workflows/target-assessment/correction-loop.js +0 -62
  259. package/dist/workflows/target-assessment/steps/phase0-resolve.d.ts +0 -71
  260. package/dist/workflows/target-assessment/steps/phase0-resolve.js +0 -21
  261. package/dist/workflows/target-assessment/steps/phase1-aggregate.d.ts +0 -1018
  262. package/dist/workflows/target-assessment/steps/phase1-aggregate.js +0 -25
  263. package/dist/workspace/mount-strategy.d.ts +0 -50
  264. package/dist/workspace/mount-strategy.js +0 -67
  265. package/dist/workspace/provenance-collector.d.ts +0 -34
  266. package/dist/workspace/provenance-collector.js +0 -16
  267. package/dist/workspace/workspace-paths.d.ts +0 -26
  268. package/dist/workspace/workspace-paths.js +0 -31
@@ -1,178 +0,0 @@
1
- /**
2
- * searchCtxHazard — search EPA CTX Hazard APIs (ToxValDB, ToxRefDB) for
3
- * toxicological hazard data on a chemical.
4
- */
5
- import { ok } from "neverthrow";
6
- import { z } from "zod";
7
- import { defineTool } from "../define-tool.js";
8
- import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
9
- import { EPA_CCTE_BASE, getEpaCcteHeaders } from "../lib/toxcast-config.js";
10
- // Each schema below both validates one raw CTX hazard row and normalizes it
11
- // into the curated output shape via `.transform`; `z.infer` is that output
12
- // type. Every wire field is optional (the API omits absent values); the two
13
- // numeric fields the API sends as string-or-number stay `z.unknown()` so
14
- // `toNumberOrNull` can coerce them without the schema rejecting the row.
15
- const ToxValSchema = z
16
- .object({
17
- source: z.string().nullable().optional(),
18
- toxvalType: z.string().nullable().optional(),
19
- toxvalNumeric: z.unknown().optional(),
20
- toxvalUnits: z.string().nullable().optional(),
21
- studyType: z.string().nullable().optional(),
22
- studyDurationClass: z.string().nullable().optional(),
23
- speciesCommon: z.string().nullable().optional(),
24
- exposureRoute: z.string().nullable().optional(),
25
- toxicologicalEffect: z.string().nullable().optional(),
26
- riskAssessmentClass: z.string().nullable().optional(),
27
- humanEco: z.string().nullable().optional(),
28
- year: z.unknown().optional(),
29
- quality: z.string().nullable().optional(),
30
- })
31
- .transform((r) => ({
32
- source: r.source ?? "",
33
- toxvalType: r.toxvalType ?? "",
34
- toxvalNumeric: toNumberOrNull(r.toxvalNumeric),
35
- toxvalUnits: r.toxvalUnits ?? "",
36
- studyType: r.studyType ?? "",
37
- studyDurationClass: r.studyDurationClass ?? "",
38
- species: r.speciesCommon ?? "",
39
- exposureRoute: r.exposureRoute ?? "",
40
- toxicologicalEffect: r.toxicologicalEffect ?? "",
41
- riskAssessmentClass: r.riskAssessmentClass ?? "",
42
- humanEco: r.humanEco ?? "",
43
- year: toNumberOrNull(r.year),
44
- quality: r.quality ?? "",
45
- }));
46
- const GenetoxSchema = z
47
- .object({
48
- source: z.string().nullable().optional(),
49
- assayCategory: z.string().nullable().optional(),
50
- assayType: z.string().nullable().optional(),
51
- metabolicActivation: z.string().nullable().optional(),
52
- species: z.string().nullable().optional(),
53
- overallResult: z.string().nullable().optional(),
54
- year: z.unknown().optional(),
55
- })
56
- .transform((r) => ({
57
- source: r.source ?? "",
58
- assayCategory: r.assayCategory ?? "",
59
- assayType: r.assayType ?? "",
60
- metabolicActivation: r.metabolicActivation ?? "",
61
- species: r.species ?? "",
62
- overallResult: r.overallResult ?? "",
63
- year: toNumberOrNull(r.year),
64
- }));
65
- const CancerSchema = z
66
- .object({
67
- source: z.string().nullable().optional(),
68
- classification: z.string().nullable().optional(),
69
- cancerClassification: z.string().nullable().optional(),
70
- url: z.string().nullable().optional(),
71
- })
72
- .transform((r) => ({
73
- source: r.source ?? "",
74
- classification: r.classification ?? r.cancerClassification ?? "",
75
- url: r.url ?? "",
76
- }));
77
- // The chemical-search endpoint returns rows the code reads `dtxsid` from
78
- // unguarded, so `dtxsid` stays required — a row missing it is a contract break
79
- // surfaced as `invalid_response`, not a silent `undefined`.
80
- const CtxChemicalSearchRowSchema = z.object({
81
- dtxsid: z.string(),
82
- preferredName: z.string().nullable().optional(),
83
- });
84
- export function createSearchCtxHazardTool(deps) {
85
- return defineTool({
86
- id: "search_ctx_hazard",
87
- description: "Search EPA CTX Hazard APIs (ToxValDB, ToxRefDB) for toxicological hazard data on a chemical. " +
88
- "Returns in-vivo toxicity values (NOAELs, LOAELs, LD50s, BMDs), " +
89
- "genetox summaries, and cancer classifications. " +
90
- "Use to assess toxicological hazard profile for safety evaluation. " +
91
- "Requires EPA_CCTE_API_KEY environment variable.",
92
- inputSchema: z.object({
93
- query: z.string().describe("Chemical identifier: DTXSID (e.g. DTXSID7020182), CASRN (e.g. 80-05-7), " + "or chemical name (e.g. bisphenol A)"),
94
- dataType: z
95
- .enum(["toxval", "genetox", "cancer", "all"])
96
- .default("all")
97
- .describe("'toxval' for ToxValDB dose-response data (NOAELs, LOAELs, LD50s), " +
98
- "'genetox' for genotoxicity summaries, " +
99
- "'cancer' for cancer classifications, " +
100
- "'all' for combined results"),
101
- limit: z.number().int().min(1).max(100).default(30).describe("Max results per category"),
102
- }),
103
- execute: async ({ query, dataType = "all", limit = 30 }) => {
104
- const headers = getEpaCcteHeaders(deps.apiKey);
105
- const resolved = await resolveDtxsid(query, headers);
106
- // "No chemical found" is an expected outcome — a data variant, not an error.
107
- if (!resolved)
108
- return ok({ found: false, query });
109
- const { dtxsid, preferredName } = resolved;
110
- const result = {
111
- found: true,
112
- dtxsid,
113
- preferredName,
114
- };
115
- const fetchers = [];
116
- if (dataType === "toxval" || dataType === "all") {
117
- fetchers.push(fetchToxval(dtxsid, headers, limit).then((v) => {
118
- result.toxval = v;
119
- }));
120
- }
121
- if (dataType === "genetox" || dataType === "all") {
122
- fetchers.push(fetchGenetox(dtxsid, headers, limit).then((v) => {
123
- result.genetox = v;
124
- }));
125
- }
126
- if (dataType === "cancer" || dataType === "all") {
127
- fetchers.push(fetchCancer(dtxsid, headers).then((v) => {
128
- result.cancer = v;
129
- }));
130
- }
131
- await Promise.all(fetchers);
132
- return ok(result);
133
- },
134
- });
135
- }
136
- async function resolveDtxsid(query, headers) {
137
- if (query.startsWith("DTXSID")) {
138
- return { dtxsid: query, preferredName: query };
139
- }
140
- const url = `${EPA_CCTE_BASE}/chemical/search/equal/${encodeURIComponent(query)}`;
141
- const res = await apiFetchValidated(url, z.array(CtxChemicalSearchRowSchema), { headers });
142
- if (res.isErr())
143
- throw new Error(describeApiError(res.error));
144
- if (!res.value?.length)
145
- return null;
146
- const chem = res.value[0];
147
- return {
148
- dtxsid: chem.dtxsid,
149
- preferredName: chem.preferredName ?? query,
150
- };
151
- }
152
- async function fetchToxval(dtxsid, headers, limit) {
153
- const url = `${EPA_CCTE_BASE}/hazard/toxval/search/by-dtxsid/${dtxsid}`;
154
- const res = await apiFetchValidated(url, z.array(ToxValSchema), { headers });
155
- if (res.isErr() || !Array.isArray(res.value))
156
- return [];
157
- return res.value.slice(0, limit);
158
- }
159
- function toNumberOrNull(v) {
160
- if (v == null || v === "")
161
- return null;
162
- const n = typeof v === "number" ? v : Number(v);
163
- return Number.isFinite(n) ? n : null;
164
- }
165
- async function fetchGenetox(dtxsid, headers, limit) {
166
- const url = `${EPA_CCTE_BASE}/hazard/genetox/summary/search/by-dtxsid/${dtxsid}`;
167
- const res = await apiFetchValidated(url, z.array(GenetoxSchema), { headers });
168
- if (res.isErr() || !Array.isArray(res.value))
169
- return [];
170
- return res.value.slice(0, limit);
171
- }
172
- async function fetchCancer(dtxsid, headers) {
173
- const url = `${EPA_CCTE_BASE}/hazard/cancer-summary/search/by-dtxsid/${dtxsid}`;
174
- const res = await apiFetchValidated(url, z.array(CancerSchema), { headers });
175
- if (res.isErr() || !Array.isArray(res.value))
176
- return [];
177
- return res.value;
178
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * searchOpenTargets — query Open Targets Platform for target-disease
3
- * associations, genetic evidence, tractability, and known drug scores.
4
- */
5
- export declare const searchOpenTargetsTool: import("../define-tool.js").Tool<{
6
- query: string;
7
- searchType: "target" | "disease";
8
- limit: number;
9
- }, {
10
- associations: import("../lib/opentargets-client.js").Association[];
11
- }>;
@@ -1,25 +0,0 @@
1
- /**
2
- * searchOpenTargets — query Open Targets Platform for target-disease
3
- * associations, genetic evidence, tractability, and known drug scores.
4
- */
5
- import { ok } from "neverthrow";
6
- import { z } from "zod";
7
- import { defineTool } from "../define-tool.js";
8
- import { searchDiseaseAssociations, searchTargetAssociations } from "../lib/opentargets-client.js";
9
- export const searchOpenTargetsTool = defineTool({
10
- id: "search_opentargets",
11
- description: "Search Open Targets Platform for target-disease associations, genetic evidence, tractability, and known drug scores. Query by Ensembl gene ID (target mode) or EFO disease ID (disease mode).",
12
- inputSchema: z.object({
13
- query: z.string().describe("Ensembl gene ID (e.g. ENSG00000141510) or EFO disease ID (e.g. EFO_0000311)"),
14
- searchType: z.enum(["target", "disease"]).describe("'target' to find diseases for a gene, 'disease' to find targets for a disease"),
15
- limit: z.number().int().min(1).max(100).default(25).describe("Max results to return"),
16
- }),
17
- execute: async ({ query, searchType, limit = 25 }) => {
18
- if (searchType === "target") {
19
- const targetInfo = await searchTargetAssociations(query, limit);
20
- return ok({ targetInfo, associations: targetInfo?.associations ?? [] });
21
- }
22
- const associations = await searchDiseaseAssociations(query, limit);
23
- return ok({ associations });
24
- },
25
- });
@@ -1,26 +0,0 @@
1
- /**
2
- * searchPubchemCompound tool — resolve compounds against PubChem's 110M+ database.
3
- *
4
- * Supports search by name, SMILES, InChI, InChIKey, or CID.
5
- * Returns compound identity and computed molecular properties.
6
- */
7
- export declare const searchPubchemCompoundTool: import("../define-tool.js").Tool<{
8
- query: string;
9
- searchBy: "name" | "smiles" | "inchikey" | "cid" | "inchi";
10
- }, {
11
- results: {
12
- cid: number;
13
- canonicalSmiles: string | null;
14
- molecularFormula: string | null;
15
- molecularWeight: number | null;
16
- iupacName: string | null;
17
- inchi: string | null;
18
- inchiKey: string | null;
19
- xlogp: number | null;
20
- tpsa: number | null;
21
- hbondDonorCount: number | null;
22
- hbondAcceptorCount: number | null;
23
- rotatableBondCount: number | null;
24
- complexity: number | null;
25
- }[];
26
- }>;
@@ -1,110 +0,0 @@
1
- /**
2
- * searchPubchemCompound tool — resolve compounds against PubChem's 110M+ database.
3
- *
4
- * Supports search by name, SMILES, InChI, InChIKey, or CID.
5
- * Returns compound identity and computed molecular properties.
6
- */
7
- import { ok } from "neverthrow";
8
- import { z } from "zod";
9
- import { defineTool } from "../define-tool.js";
10
- import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
11
- import { PUBCHEM_HEADERS as HEADERS, PUBCHEM_BASE } from "../lib/pubchem-config.js";
12
- const PROPERTY_LIST = [
13
- "MolecularFormula",
14
- "MolecularWeight",
15
- "CanonicalSMILES",
16
- "InChI",
17
- "InChIKey",
18
- "IUPACName",
19
- "XLogP",
20
- "TPSA",
21
- "HBondDonorCount",
22
- "HBondAcceptorCount",
23
- "RotatableBondCount",
24
- "Complexity",
25
- ].join(",");
26
- // A single schema that both validates and normalizes one PUG-REST property row:
27
- // the `.object(...)` half is the wire shape (every field optional — PubChem
28
- // omits absent properties), the `.transform(...)` half maps it to the camelCase
29
- // `Compound` we return. Parsing IS the validation, and because the transform
30
- // rides on the schema, `z.infer` below is the OUTPUT type — no separate raw
31
- // interface or mapper.
32
- const PugPropertyRowSchema = z
33
- .object({
34
- CID: z.number().optional(),
35
- CanonicalSMILES: z.string().optional(),
36
- MolecularFormula: z.string().optional(),
37
- // PUG-REST serializes MolecularWeight as a string (e.g. "180.16") to
38
- // preserve significant figures; accept both and let the transform's
39
- // `Number(...)` normalize it.
40
- MolecularWeight: z.union([z.number(), z.string()]).optional(),
41
- IUPACName: z.string().optional(),
42
- InChI: z.string().optional(),
43
- InChIKey: z.string().optional(),
44
- XLogP: z.number().optional(),
45
- TPSA: z.number().optional(),
46
- HBondDonorCount: z.number().optional(),
47
- HBondAcceptorCount: z.number().optional(),
48
- RotatableBondCount: z.number().optional(),
49
- Complexity: z.number().optional(),
50
- })
51
- .transform((raw) => ({
52
- cid: raw.CID ?? 0,
53
- canonicalSmiles: raw.CanonicalSMILES ?? null,
54
- molecularFormula: raw.MolecularFormula ?? null,
55
- molecularWeight: raw.MolecularWeight != null ? Number(raw.MolecularWeight) : null,
56
- iupacName: raw.IUPACName ?? null,
57
- inchi: raw.InChI ?? null,
58
- inchiKey: raw.InChIKey ?? null,
59
- xlogp: raw.XLogP ?? null,
60
- tpsa: raw.TPSA ?? null,
61
- hbondDonorCount: raw.HBondDonorCount ?? null,
62
- hbondAcceptorCount: raw.HBondAcceptorCount ?? null,
63
- rotatableBondCount: raw.RotatableBondCount ?? null,
64
- complexity: raw.Complexity ?? null,
65
- }));
66
- const PubChemPropertyResponseSchema = z.object({
67
- PropertyTable: z.object({ Properties: z.array(PugPropertyRowSchema).optional() }).optional(),
68
- });
69
- /** Build the PUG-REST URL path segment for the given search type. */
70
- function buildNamespace(searchBy, query) {
71
- switch (searchBy) {
72
- case "name":
73
- return `compound/name/${encodeURIComponent(query)}`;
74
- case "smiles":
75
- return `compound/smiles/${encodeURIComponent(query)}`;
76
- case "inchi":
77
- return `compound/inchi/${encodeURIComponent(query)}`;
78
- case "inchikey":
79
- return `compound/inchikey/${encodeURIComponent(query)}`;
80
- case "cid":
81
- return `compound/cid/${encodeURIComponent(query)}`;
82
- default:
83
- return `compound/name/${encodeURIComponent(query)}`;
84
- }
85
- }
86
- export const searchPubchemCompoundTool = defineTool({
87
- id: "search_pubchem_compound",
88
- description: "Search PubChem for a compound by name, SMILES, InChI, InChIKey, or CID. " +
89
- "Returns compound identity (CID, SMILES, InChI, IUPAC name) and computed properties " +
90
- "(molecular weight, XLogP, TPSA, HBD, HBA, rotatable bonds, complexity). " +
91
- "PubChem covers 110M+ compounds — use when ChEMBL doesn't find the compound.",
92
- inputSchema: z.object({
93
- query: z.string().min(1).describe("Search term: compound name, SMILES, InChI, InChIKey, or CID"),
94
- searchBy: z.enum(["name", "smiles", "inchi", "inchikey", "cid"]).describe("Identifier type for the query"),
95
- }),
96
- execute: async ({ query, searchBy }) => {
97
- const namespace = buildNamespace(searchBy, query);
98
- const url = `${PUBCHEM_BASE}/${namespace}/property/${PROPERTY_LIST}/JSON`;
99
- const res = await apiFetchValidated(url, PubChemPropertyResponseSchema, { headers: HEADERS });
100
- if (res.isErr()) {
101
- // PubChem returns 404 when the query matches no compound — expected.
102
- if (res.error.type === "http_status" && res.error.status === 404)
103
- return ok({ results: [] });
104
- throw new Error(describeApiError(res.error));
105
- }
106
- // Already validated + normalized by PugPropertyRowSchema's transform.
107
- const rows = res.value.PropertyTable?.Properties ?? [];
108
- return ok({ results: rows });
109
- },
110
- });
@@ -1,17 +0,0 @@
1
- /**
2
- * searchPubMed — search PubMed via NCBI E-utilities.
3
- */
4
- export declare function createSearchPubMedTool(deps: {
5
- ncbiApiKey?: string;
6
- }): import("../define-tool.js").Tool<{
7
- query: string;
8
- maxResults: number;
9
- sort: "date" | "relevance";
10
- dateRange?: {
11
- from: string;
12
- to: string;
13
- } | undefined;
14
- }, {
15
- totalFound: number;
16
- results: import("../lib/ncbi-utils.js").PubMedSummary[];
17
- }>;
@@ -1,31 +0,0 @@
1
- /**
2
- * searchPubMed — search PubMed via NCBI E-utilities.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { searchPubmed } from "../lib/pubmed-client.js";
8
- export function createSearchPubMedTool(deps) {
9
- return defineTool({
10
- id: "search_pubmed",
11
- description: "Search PubMed for scientific articles using NCBI E-utilities. " +
12
- "The query uses PubMed search syntax — use MeSH terms (e.g., " +
13
- '"breast neoplasms"[MeSH]), field tags ([Title/Abstract], [Author], [Gene]), ' +
14
- "and Boolean operators (AND, OR, NOT). " +
15
- 'Example: "BRCA1"[Gene] AND "breast neoplasms"[MeSH] AND "drug resistance"[Title/Abstract]. ' +
16
- "Returns PMIDs, titles, journal names, publication years, and author summaries.",
17
- inputSchema: z.object({
18
- query: z.string().describe("PubMed search query. Supports MeSH terms, field tags, and Boolean operators."),
19
- maxResults: z.number().int().min(1).max(50).default(10).describe("Maximum number of results to return (1–50, default 10)"),
20
- sort: z.enum(["relevance", "date"]).default("relevance").describe('Sort order: "relevance" or "date" (default "relevance")'),
21
- dateRange: z
22
- .object({
23
- from: z.string().describe("Start date in YYYY/MM/DD format"),
24
- to: z.string().describe("End date in YYYY/MM/DD format"),
25
- })
26
- .optional()
27
- .describe("Optional date range filter"),
28
- }),
29
- execute: async ({ query, maxResults, sort, dateRange }) => ok(await searchPubmed(deps.ncbiApiKey, query, { maxResults, sort, dateRange })),
30
- });
31
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * searchTargets tool — search ChEMBL for biological targets.
3
- */
4
- export declare const searchTargetsTool: import("../define-tool.js").Tool<{
5
- query: string;
6
- limit: number;
7
- }, {
8
- targets: import("../lib/chembl-client.js").ChemblTarget[];
9
- }>;
@@ -1,20 +0,0 @@
1
- /**
2
- * searchTargets tool — search ChEMBL for biological targets.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { searchTargets } from "../lib/chembl-client.js";
8
- export const searchTargetsTool = defineTool({
9
- id: "search_targets",
10
- description: "Search ChEMBL for biological targets by gene symbol, protein name, or ChEMBL ID. " +
11
- "Returns target metadata including ChEMBL IDs, target type, organism, and gene names.",
12
- inputSchema: z.object({
13
- query: z.string().min(1).describe("Search term: gene symbol (e.g. 'EGFR'), protein name, or ChEMBL target ID"),
14
- limit: z.number().int().min(1).max(25).default(25).describe("Maximum number of targets to return"),
15
- }),
16
- execute: async ({ query, limit }) => {
17
- const targets = await searchTargets(query, limit);
18
- return ok({ targets });
19
- },
20
- });
@@ -1,36 +0,0 @@
1
- /**
2
- * searchToxcast — search EPA ToxCast/Tox21 high-throughput screening data
3
- * for a chemical via the CTX Bioactivity API.
4
- */
5
- interface ToxcastAssayResult {
6
- aeid: number;
7
- assayEndpoint: string;
8
- ac50: number | null;
9
- hitCall: number;
10
- maxMean: number | null;
11
- model: string;
12
- flags: string[];
13
- }
14
- type ToxcastOutput = {
15
- found: false;
16
- query: string;
17
- } | {
18
- found: true;
19
- chemical: {
20
- dtxsid: string;
21
- preferredName: string;
22
- casrn: string | null;
23
- totalAssays: number;
24
- activeAssays: number;
25
- activeHitRate: number;
26
- results: ToxcastAssayResult[];
27
- };
28
- };
29
- export declare function createSearchToxcastTool(deps: {
30
- apiKey: string;
31
- }): import("../define-tool.js").Tool<{
32
- query: string;
33
- activeOnly: boolean;
34
- limit: number;
35
- }, ToxcastOutput>;
36
- export {};
@@ -1,141 +0,0 @@
1
- /**
2
- * searchToxcast — search EPA ToxCast/Tox21 high-throughput screening data
3
- * for a chemical via the CTX Bioactivity API.
4
- */
5
- import { ok } from "neverthrow";
6
- import { z } from "zod";
7
- import { defineTool } from "../define-tool.js";
8
- import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
9
- import { EPA_CCTE_BASE, getEpaCcteHeaders } from "../lib/toxcast-config.js";
10
- // Raw CTX Bioactivity API wire shapes, validated at the fetch boundary. Fields
11
- // are optional because the API omits absent values; `dtxsid` stays required
12
- // because `resolveDtxsid` reads it without a guard, so a row missing it is a
13
- // contract break surfaced as `invalid_response` rather than a runtime error.
14
- // The row-shaping/filtering logic in `execute` stays put — it depends on the
15
- // resolved chemical, the assay-name map, and the `activeOnly`/`limit` inputs.
16
- const CtxChemicalSearchRowSchema = z.object({
17
- dtxsid: z.string(),
18
- preferredName: z.string().optional(),
19
- casrn: z.string().nullable().optional(),
20
- });
21
- const ToxcastMc5ParamSchema = z.object({
22
- ac50: z.number().optional(),
23
- acc: z.number().optional(),
24
- });
25
- const ToxcastMc6ParamSchema = z.object({
26
- flag: z.unknown().optional(),
27
- });
28
- const ToxcastBioactivityRowSchema = z.object({
29
- aeid: z.number().optional(),
30
- hitc: z.number().optional(),
31
- maxMean: z.number().nullable().optional(),
32
- modl: z.string().optional(),
33
- mc5Param: ToxcastMc5ParamSchema.nullable().optional(),
34
- mc6Param: ToxcastMc6ParamSchema.nullable().optional(),
35
- });
36
- const ToxcastAssaySummaryRowSchema = z.object({
37
- aeid: z.number().optional(),
38
- aenm: z.string().optional(),
39
- });
40
- export function createSearchToxcastTool(deps) {
41
- return defineTool({
42
- id: "search_toxcast",
43
- description: "Search EPA ToxCast/Tox21 high-throughput screening data for a chemical via the CTX Bioactivity API. " +
44
- "Returns in-vitro bioactivity results across hundreds of assay endpoints " +
45
- "(nuclear receptors, stress response, mitochondrial toxicity, etc.). " +
46
- "Use to assess toxicological liability of compounds or drug targets. " +
47
- "Requires EPA_CCTE_API_KEY environment variable.",
48
- inputSchema: z.object({
49
- query: z.string().describe("Chemical identifier: DTXSID (e.g. DTXSID7020182), CASRN (e.g. 80-05-7), " + "or chemical name (e.g. bisphenol A)"),
50
- activeOnly: z.boolean().default(true).describe("Return only active (hit) assays. Set false for all tested assays."),
51
- limit: z.number().int().min(1).max(200).default(50).describe("Max assay results to return (sorted by AC50 ascending for actives)"),
52
- }),
53
- execute: async ({ query, activeOnly = true, limit = 50 }) => {
54
- const headers = getEpaCcteHeaders(deps.apiKey);
55
- const resolved = await resolveDtxsid(query, headers);
56
- // "No chemical found" is an expected outcome — a data variant, not an error.
57
- if (!resolved)
58
- return ok({ found: false, query });
59
- const { dtxsid, preferredName, casrn } = resolved;
60
- const aeidMap = await fetchAssayNames(dtxsid, headers);
61
- const bioUrl = `${EPA_CCTE_BASE}/bioactivity/data/search/by-dtxsid/${dtxsid}`;
62
- const bioRes = await apiFetchValidated(bioUrl, z.array(ToxcastBioactivityRowSchema), { headers });
63
- if (bioRes.isErr())
64
- throw new Error(describeApiError(bioRes.error));
65
- const allResults = bioRes.value ?? [];
66
- const totalAssays = allResults.length;
67
- const activeAssays = allResults.filter((r) => r.hitc === 1).length;
68
- const filtered = activeOnly ? allResults.filter((r) => r.hitc === 1) : allResults;
69
- filtered.sort((a, b) => extractAc50(a) - extractAc50(b));
70
- const results = filtered.slice(0, limit).map((r) => {
71
- const aeid = r.aeid ?? 0;
72
- const mc6 = r.mc6Param ?? {};
73
- const flags = Array.isArray(mc6.flag) ? mc6.flag : [];
74
- return {
75
- aeid,
76
- assayEndpoint: aeidMap.get(aeid) ?? `aeid:${aeid}`,
77
- ac50: extractAc50Raw(r),
78
- hitCall: r.hitc ?? 0,
79
- maxMean: r.maxMean ?? null,
80
- model: r.modl ?? "",
81
- flags,
82
- };
83
- });
84
- return ok({
85
- found: true,
86
- chemical: {
87
- dtxsid,
88
- preferredName,
89
- casrn,
90
- totalAssays,
91
- activeAssays,
92
- activeHitRate: totalAssays > 0 ? Math.round((activeAssays / totalAssays) * 1000) / 1000 : 0,
93
- results,
94
- },
95
- });
96
- },
97
- });
98
- }
99
- function extractAc50(r) {
100
- return extractAc50Raw(r) ?? Infinity;
101
- }
102
- function extractAc50Raw(r) {
103
- const mc5 = r.mc5Param;
104
- if (mc5 && typeof mc5 === "object") {
105
- if (typeof mc5.ac50 === "number")
106
- return mc5.ac50;
107
- if (typeof mc5.acc === "number")
108
- return mc5.acc;
109
- }
110
- return null;
111
- }
112
- async function resolveDtxsid(query, headers) {
113
- if (query.startsWith("DTXSID")) {
114
- return { dtxsid: query, preferredName: query, casrn: null };
115
- }
116
- const searchUrl = `${EPA_CCTE_BASE}/chemical/search/equal/${encodeURIComponent(query)}`;
117
- const searchRes = await apiFetchValidated(searchUrl, z.array(CtxChemicalSearchRowSchema), { headers });
118
- if (searchRes.isErr())
119
- throw new Error(describeApiError(searchRes.error));
120
- if (!searchRes.value?.length)
121
- return null;
122
- const chem = searchRes.value[0];
123
- return {
124
- dtxsid: chem.dtxsid,
125
- preferredName: chem.preferredName ?? query,
126
- casrn: chem.casrn ?? null,
127
- };
128
- }
129
- async function fetchAssayNames(dtxsid, headers) {
130
- const map = new Map();
131
- const url = `${EPA_CCTE_BASE}/bioactivity/data/summary/search/by-dtxsid/${dtxsid}`;
132
- const res = await apiFetchValidated(url, z.array(ToxcastAssaySummaryRowSchema), { headers });
133
- if (res.isOk() && Array.isArray(res.value)) {
134
- for (const s of res.value) {
135
- if (s.aeid != null && s.aenm) {
136
- map.set(s.aeid, s.aenm);
137
- }
138
- }
139
- }
140
- return map;
141
- }
@@ -1,51 +0,0 @@
1
- /**
2
- * Single registration call site for the analysis-side DBOS workflows.
3
- *
4
- * This module is the **one place** that calls `registerExecuteAnalysis` and
5
- * `registerSandboxStep`, binding the parent + child workflow bodies to the
6
- * running DBOS engine. Keeping both registrations in one file holds a single
7
- * invariant: both workflows land under the same `applicationVersion` stamp
8
- * that `launchDbos` writes onto the engine (`harness/runtime/dbos.ts`).
9
- * Blue/green drains gate on `dbos.application_versions`, so registering the
10
- * parent and child together under one stamp guarantees a drain treats them
11
- * as one cohort.
12
- *
13
- * Deps are supplied by the composition root: `registerAnalysisWorkflows`
14
- * takes a fully-formed deps bundle and passes each half straight through to
15
- * the per-workflow register functions. This module constructs nothing —
16
- * it only wires.
17
- */
18
- import { type ExecuteAnalysisDeps, type ExecuteAnalysisInput, type ExecuteAnalysisResult } from "./execute-analysis.js";
19
- import { type SandboxStepDeps, type SandboxStepInput, type SandboxStepResult } from "./sandbox-step.js";
20
- export interface AnalysisWorkflowDeps {
21
- readonly executeAnalysis: ExecuteAnalysisDeps;
22
- readonly sandboxStep: SandboxStepDeps;
23
- }
24
- export interface RegisteredAnalysisWorkflows {
25
- readonly executeAnalysis: (input: ExecuteAnalysisInput) => Promise<ExecuteAnalysisResult>;
26
- readonly sandboxStep: (input: SandboxStepInput) => Promise<SandboxStepResult>;
27
- }
28
- /**
29
- * Register the parent + child workflows with the running DBOS engine.
30
- *
31
- * Call this BEFORE `launchDbos`: `DBOS.launch()` runs recovery synchronously and
32
- * resolves in-flight workflows by their registered name, so a workflow that is
33
- * not registered at launch cannot be reclaimed. `runtime/assemble.ts` — the
34
- * declared source of truth for wiring order — registers every workflow before
35
- * launch for exactly this reason, and the embedded runtime does the same.
36
- * Idempotency is owned by the SDK — calling twice with the same name is a
37
- * `DBOS.registerWorkflow` invariant violation, not something this module
38
- * guards against.
39
- *
40
- * Scope: this helper takes a fully-formed `AnalysisWorkflowDeps`, so it fits
41
- * only a caller that already holds a registered sandbox-step callable —
42
- * `ExecuteAnalysisDeps.sandboxStepCallable` (inside `deps.executeAnalysis`)
43
- * exists only after `registerSandboxStep` has run. A caller that still needs
44
- * that child callable must instead register the two workflows directly in
45
- * assemble-order — register the child first, then feed its callable into the
46
- * parent's deps — the way `runtime/assemble.ts` does; registering the child
47
- * here as well would make its `registerSandboxStep` a second registration under
48
- * the same name, which the SDK rejects. No in-tree caller holds a
49
- * pre-registered child callable, so this helper is currently uncalled.
50
- */
51
- export declare function registerAnalysisWorkflows(deps: AnalysisWorkflowDeps): RegisteredAnalysisWorkflows;