@desplega.ai/agent-swarm 1.129.0 → 1.131.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 (226) hide show
  1. package/README.md +2 -2
  2. package/dist/{actions-kfv2dawe.js → actions-w53mbns9.js} +11 -11
  3. package/dist/{anthropic-messages-3xgme8my.js → anthropic-messages-rjmd2e7n.js} +5 -5
  4. package/dist/{app-q8vjk6e8.js → app-m9gwqsqv.js} +8 -8
  5. package/dist/{artifact-hg4t1nx7.js → artifact-jysj3wrg.js} +2 -2
  6. package/dist/{assistant-g037r345.js → assistant-bp65m6f3.js} +13 -13
  7. package/dist/{azure-openai-responses-xa4sh9f6.js → azure-openai-responses-c0yjmbfd.js} +8 -5
  8. package/dist/{boot-reembed-18pzsrxa.js → boot-reembed-62p0at2k.js} +6 -6
  9. package/dist/{boot-reembed-wpks2cj8.js → boot-reembed-xmfp6wdh.js} +7 -7
  10. package/dist/{boot-scrub-logs-n7szd57r.js → boot-scrub-logs-rr8q2dms.js} +5 -5
  11. package/dist/{claude-adapter-qz4r0ajt.js → claude-adapter-2y47mrkd.js} +9 -9
  12. package/dist/{cli-mhjnbgb6.js → cli-0rcyq6d9.js} +450 -186
  13. package/dist/{cli-ttkmehy0.js → cli-2q72qz2s.js} +274 -25
  14. package/dist/{cli-gztgc3hz.js → cli-2wadx7p2.js} +2 -2
  15. package/dist/cli-3fj60etf.js +153 -0
  16. package/dist/{cli-7ecgm5v0.js → cli-3kf51j15.js} +1 -1
  17. package/dist/{cli-vgexpfsr.js → cli-57khth04.js} +6 -3
  18. package/dist/{cli-2mbe7vk0.js → cli-5dsbcjjw.js} +1 -1
  19. package/dist/{cli-etr62zy6.js → cli-5kx36evn.js} +2 -2
  20. package/dist/{cli-v2tr6amf.js → cli-5n6e5yfn.js} +30 -8
  21. package/dist/{cli-hx02s9zq.js → cli-5v4rw6yd.js} +2 -2
  22. package/dist/{cli-v37yr6mf.js → cli-5ze9rv97.js} +4 -4
  23. package/dist/{cli-ch7t5v7n.js → cli-6map995v.js} +9 -4
  24. package/dist/{cli-h0457a67.js → cli-70xqj0z3.js} +3 -3
  25. package/dist/{cli-kk4f9r17.js → cli-72q8m8gk.js} +8 -6
  26. package/dist/{cli-7padk69a.js → cli-78xwvkhj.js} +2 -2
  27. package/dist/{cli-dxtxacy7.js → cli-9dr5qzc0.js} +45 -8
  28. package/dist/{cli-17zxdgsq.js → cli-a40rnf71.js} +6 -6
  29. package/dist/{cli-t53vnnxz.js → cli-a4jzdpa3.js} +2514 -1055
  30. package/dist/{cli-w10fkrf1.js → cli-akdvwc9v.js} +354 -115
  31. package/dist/{cli-1qkk5er0.js → cli-bmze986d.js} +1 -1
  32. package/dist/{cli-ga12dc1d.js → cli-bqw0mt1n.js} +3 -3
  33. package/dist/{cli-0sf92efp.js → cli-cdeg08wx.js} +1 -1
  34. package/dist/{cli-a8ynhkyj.js → cli-cvgjwnh1.js} +17 -15
  35. package/dist/{cli-9fxg3v5m.js → cli-d2tfkcga.js} +4 -4
  36. package/dist/{cli-nhcd7x43.js → cli-d3x3x1c9.js} +2 -2
  37. package/dist/{cli-6nh2qxvh.js → cli-darcwax3.js} +1 -1
  38. package/dist/{cli-yjbgmysx.js → cli-e7ckcg4v.js} +12 -12
  39. package/dist/{cli-4n2gcjpd.js → cli-efxfnq6q.js} +4 -3
  40. package/dist/{cli-z9xqqhfk.js → cli-er3a4bb0.js} +1 -1
  41. package/dist/{cli-xg2eezyv.js → cli-f1am9szv.js} +1 -1
  42. package/dist/{cli-xy4cwsm9.js → cli-fywms69x.js} +1 -1
  43. package/dist/{cli-33jj76y8.js → cli-g6b8x1h8.js} +1 -1
  44. package/dist/{cli-epsvdckx.js → cli-gm9cbhbq.js} +20 -10
  45. package/dist/{cli-rkndnn90.js → cli-k9qkf1hw.js} +6 -4
  46. package/dist/{cli-zejvt395.js → cli-kh3ba2zf.js} +1 -1
  47. package/dist/{cli-gb25p1h2.js → cli-nm5gtp1x.js} +2 -2
  48. package/dist/{cli-akxnpx17.js → cli-pm6xbh84.js} +1829 -1629
  49. package/dist/{cli-2k0ztbfp.js → cli-psh3c4va.js} +1 -1
  50. package/dist/{cli-39vgrsep.js → cli-qv61hp37.js} +2 -2
  51. package/dist/{cli-hv2fndhm.js → cli-r6kqqbj0.js} +6 -4
  52. package/dist/{cli-1y1cm570.js → cli-rzbpmxdr.js} +1 -1
  53. package/dist/{cli-mmrk00vp.js → cli-t1xze5qh.js} +1 -1
  54. package/dist/{cli-g252a9ky.js → cli-t55yw3a1.js} +2 -2
  55. package/dist/{cli-7bz8dzqa.js → cli-t76vw5db.js} +1184 -1522
  56. package/dist/{cli-4n4mdv21.js → cli-xpxde7rm.js} +7 -3
  57. package/dist/{cli-fpaa5k2q.js → cli-yw8vghx2.js} +54 -18
  58. package/dist/cli-zsspvvm2.js +490 -0
  59. package/dist/cli.js +27 -25
  60. package/dist/{codex-adapter-7v6t7ff6.js → codex-adapter-d24q75wk.js} +7 -7
  61. package/dist/{codex-hook-amndawyb.js → codex-hook-hq54t9ft.js} +2 -2
  62. package/dist/{codex-session-runner-e7j4khe2.js → codex-session-runner-g50vcsex.js} +7 -7
  63. package/dist/{commands-ex0k5tbf.js → commands-c3nrc5hg.js} +5 -5
  64. package/dist/{db-df7jatfc.js → db-nt7fg3tw.js} +5 -5
  65. package/dist/{google-generative-ai-y42hnw9p.js → google-generative-ai-hysrd8qx.js} +7 -5
  66. package/dist/{google-vertex-4sg66gb6.js → google-vertex-p5arrga0.js} +7 -5
  67. package/dist/{handlers-1j2cfqt2.js → handlers-fkr6swat.js} +13 -13
  68. package/dist/{hook-nx9a0mj3.js → hook-77wpvnjc.js} +7 -7
  69. package/dist/{hook-w6yaf6sy.js → hook-g019yehy.js} +8 -8
  70. package/dist/{http-4tz5h8wg.js → http-jewj0syk.js} +2993 -716
  71. package/dist/{index-0bpkzb09.js → index-070v4eyb.js} +3 -3
  72. package/dist/{index-0s67qv7h.js → index-6gm5he8h.js} +11 -11
  73. package/dist/{index-35gtv6gj.js → index-7n2xpbd4.js} +310 -40
  74. package/dist/{index-ker3gccb.js → index-9znhar3x.js} +4 -4
  75. package/dist/{index-5n2c8yay.js → index-hase6zbe.js} +2 -2
  76. package/dist/{index-kcf3tm9h.js → index-hfvggd0z.js} +12 -12
  77. package/dist/{index-7c0jqna0.js → index-hp1kdbjj.js} +13 -13
  78. package/dist/{keepalive-3j4a9168.js → keepalive-j0fjvqfd.js} +7 -7
  79. package/dist/{lead-6kpevymb.js → lead-1n8x30xe.js} +33 -33
  80. package/dist/{maintenance-m1k82ean.js → maintenance-gvev11sa.js} +7 -7
  81. package/dist/{mistral-conversations-bjkdfb6z.js → mistral-conversations-81fwav0j.js} +6 -6
  82. package/dist/{oauth-refresh-sweep-881k8e4q.js → oauth-refresh-sweep-s9ecsvh0.js} +6 -6
  83. package/dist/{onboard-c0ykffjn.js → onboard-pvm5b38w.js} +2 -2
  84. package/dist/{openai-codex-responses-xetseqvt.js → openai-codex-responses-5g27pd6f.js} +43 -23
  85. package/dist/{openai-completions-5r2g5axa.js → openai-completions-3vkmfz2a.js} +55 -11
  86. package/dist/{openai-responses-ce67hd23.js → openai-responses-dg4t7j7a.js} +8 -5
  87. package/dist/{openrouter-images-pzfp22jb.js → openrouter-images-g3gm8931.js} +1 -1
  88. package/dist/{otel-impl-sqagjerv.js → otel-impl-p6jvgd9c.js} +6 -4
  89. package/dist/{otel-3mp81ppd.js → otel-nqa12wf3.js} +2 -2
  90. package/dist/{pi-mono-adapter-k584k16g.js → pi-mono-adapter-t091s27g.js} +17117 -7517
  91. package/dist/{pricing-refresh-y82whbf9.js → pricing-refresh-k49rcyed.js} +7 -7
  92. package/dist/{rbac-roles-nvkqmzyd.js → rbac-roles-30pspvy7.js} +7 -7
  93. package/dist/{rbac-roles-4ht8gegc.js → rbac-roles-cr80g96t.js} +6 -6
  94. package/dist/{render-v2-wvqdgvvp.js → render-v2-xm457ng1.js} +8 -8
  95. package/dist/{seed-pricing-fy3rxhde.js → seed-pricing-yhpv35fr.js} +6 -6
  96. package/dist/{setup-ak5cnc6f.js → setup-nytnmwwr.js} +2 -2
  97. package/dist/{worker-d8769q8a.js → worker-msytr2cw.js} +33 -33
  98. package/openapi.json +34039 -11036
  99. package/package.json +8 -6
  100. package/src/apps/definition.ts +368 -26
  101. package/src/apps/row-store.ts +66 -10
  102. package/src/apps/schema-migrate.ts +95 -1
  103. package/src/apps/store.ts +13 -4
  104. package/src/apps/sync-run-as.ts +18 -0
  105. package/src/apps/sync.ts +934 -0
  106. package/src/apps/version.ts +16 -2
  107. package/src/assets/key.ts +8 -1
  108. package/src/be/asset-key-audit.ts +3 -1
  109. package/src/be/db-queries/mcp-oauth.ts +297 -24
  110. package/src/be/db.ts +42 -1
  111. package/src/be/migrations/129_asset_keys_apps_scripts.sql +161 -0
  112. package/src/be/scripts/db.ts +5 -2
  113. package/src/be/scripts/typecheck.ts +1 -0
  114. package/src/be/seed-scripts/catalog/app-sync-run.ts +32 -0
  115. package/src/be/seed-scripts/catalog/github-issues-pull.ts +102 -0
  116. package/src/be/seed-scripts/index.ts +18 -0
  117. package/src/be/seed-skills/index.ts +7 -0
  118. package/src/http/active-sessions.ts +26 -18
  119. package/src/http/agents.ts +94 -27
  120. package/src/http/api-keys.ts +91 -17
  121. package/src/http/approval-requests.ts +87 -10
  122. package/src/http/apps.ts +361 -53
  123. package/src/http/assets.ts +165 -31
  124. package/src/http/budgets.ts +7 -5
  125. package/src/http/codex-oauth-keep-warm.ts +21 -3
  126. package/src/http/config.ts +46 -16
  127. package/src/http/context.ts +33 -6
  128. package/src/http/ecosystem.ts +20 -6
  129. package/src/http/events.ts +24 -9
  130. package/src/http/favorites.ts +20 -6
  131. package/src/http/fs.ts +60 -17
  132. package/src/http/heartbeat.ts +18 -4
  133. package/src/http/inbox-state.ts +12 -6
  134. package/src/http/integrations.ts +25 -5
  135. package/src/http/kv.ts +36 -15
  136. package/src/http/mcp-bridge.ts +5 -1
  137. package/src/http/mcp-oauth.ts +332 -17
  138. package/src/http/mcp-servers.ts +56 -18
  139. package/src/http/memory.ts +282 -29
  140. package/src/http/metrics.ts +80 -17
  141. package/src/http/oauth-callback.ts +10 -4
  142. package/src/http/oauth-generic.ts +5 -1
  143. package/src/http/oauth-locks.ts +6 -3
  144. package/src/http/openapi.ts +57 -9
  145. package/src/http/page-proxy.ts +25 -5
  146. package/src/http/pages-public.ts +37 -20
  147. package/src/http/pages.ts +93 -28
  148. package/src/http/poll.ts +89 -5
  149. package/src/http/pricing.ts +9 -6
  150. package/src/http/prompt-templates.ts +85 -21
  151. package/src/http/route-def.ts +67 -4
  152. package/src/http/schedules.ts +63 -14
  153. package/src/http/script-connection-proxy.ts +30 -4
  154. package/src/http/script-connections.ts +393 -43
  155. package/src/http/script-runs.ts +73 -19
  156. package/src/http/scripts.ts +257 -39
  157. package/src/http/session-data.ts +87 -14
  158. package/src/http/sessions.ts +80 -5
  159. package/src/http/skills.ts +115 -35
  160. package/src/http/stats.ts +94 -13
  161. package/src/http/task-templates.ts +6 -4
  162. package/src/http/tasks.ts +230 -61
  163. package/src/http/trackers/jira.ts +90 -30
  164. package/src/http/trackers/linear.ts +46 -12
  165. package/src/http/users.ts +162 -25
  166. package/src/http/utils.ts +12 -2
  167. package/src/http/webhooks.ts +30 -16
  168. package/src/http/workflow-events.ts +18 -5
  169. package/src/http/workflows.ts +128 -39
  170. package/src/http/x.ts +37 -6
  171. package/src/oauth/ensure-mcp-token.ts +16 -1
  172. package/src/oauth/mcp-wrapper.ts +281 -26
  173. package/src/providers/pi-mono-adapter.ts +1 -1
  174. package/src/scripts-runtime/credential-broker/README.md +1 -1
  175. package/src/scripts-runtime/credential-broker/fetch-patch.ts +12 -2
  176. package/src/scripts-runtime/sdk-allowlist.ts +1 -0
  177. package/src/scripts-runtime/stdlib/fetch.ts +6 -0
  178. package/src/scripts-runtime/types/stdlib.d.ts +1 -0
  179. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -0
  180. package/src/server.ts +2 -0
  181. package/src/tests/apps-rbac.test.ts +110 -0
  182. package/src/tests/apps-spike2.test.ts +4 -1
  183. package/src/tests/apps-sync-engine.test.ts +2540 -0
  184. package/src/tests/apps-sync.test.ts +1627 -0
  185. package/src/tests/asset-key-api.test.ts +48 -2
  186. package/src/tests/asset-key-invariants.test.ts +92 -0
  187. package/src/tests/asset-key-migration.test.ts +174 -8
  188. package/src/tests/asset-key-normalization.test.ts +2 -0
  189. package/src/tests/credential-broker.test.ts +27 -2
  190. package/src/tests/mcp-oauth-dcr-reuse.test.ts +743 -0
  191. package/src/tests/mcp-oauth-ensure-token.test.ts +45 -0
  192. package/src/tests/mcp-oauth-manual-client.test.ts +135 -2
  193. package/src/tests/mcp-oauth-queries.test.ts +153 -0
  194. package/src/tests/mcp-oauth-wrapper.test.ts +432 -0
  195. package/src/tests/memory-http-recall-gating.test.ts +2 -0
  196. package/src/tests/openapi-response-contract.test.ts +138 -0
  197. package/src/tests/rbac-admission-e2e.test.ts +68 -0
  198. package/src/tests/script-connections.test.ts +3 -0
  199. package/src/tests/scripts-runtime-fetch.test.ts +121 -0
  200. package/src/tests/scripts-runtime-secret-egress.test.ts +4 -2
  201. package/src/tests/seed-scripts.test.ts +2 -2
  202. package/src/tests/swarm-tool-result-gate.test.ts +32 -0
  203. package/src/tests/task-working-dir.test.ts +8 -4
  204. package/src/tests/whoami-route.test.ts +127 -0
  205. package/src/tests/workflow-engine-v2.test.ts +80 -7
  206. package/src/tests/workflow-swarm-script.test.ts +104 -0
  207. package/src/tools/app-get.ts +10 -2
  208. package/src/tools/app-rollback.ts +1 -0
  209. package/src/tools/app-sync.ts +112 -0
  210. package/src/tools/script-common.ts +20 -0
  211. package/src/tools/tool-config.ts +2 -1
  212. package/src/tools/utils.ts +11 -0
  213. package/src/tools/workflows/create-workflow.ts +4 -1
  214. package/src/types.ts +1394 -1206
  215. package/src/utils/template.ts +8 -1
  216. package/src/utils/zod-openapi.ts +11 -0
  217. package/src/workflows/engine.ts +27 -4
  218. package/src/workflows/executors/swarm-script.ts +28 -0
  219. package/src/workflows/retry-poller.ts +19 -2
  220. package/templates/skills/apps/content.md +94 -5
  221. package/templates/skills/asset-namespaces/content.md +2 -2
  222. package/templates/skills/scheduled-task-resilience/SKILL.md +102 -0
  223. package/templates/skills/scheduled-task-resilience/config.json +14 -0
  224. package/templates/skills/scheduled-task-resilience/content.md +97 -0
  225. package/dist/cli-7wmybrt5.js +0 -115
  226. package/dist/cli-d91pvmq1.js +0 -14
@@ -25,9 +25,20 @@ import {
25
25
  startScriptRunProcess,
26
26
  terminateScriptRunProcess,
27
27
  } from "../script-workflows/supervisor";
28
- import { ScriptRunStatusSchema, TERMINAL_SCRIPT_RUN_STATUSES } from "../types";
28
+ import {
29
+ AgentTaskStatusSchema,
30
+ ScriptRunJournalEntrySchema,
31
+ ScriptRunListItemSchema,
32
+ ScriptRunSchema,
33
+ ScriptRunStatusSchema,
34
+ TERMINAL_SCRIPT_RUN_STATUSES,
35
+ } from "../types";
29
36
  import { getAppUrl } from "../utils/constants";
30
- import { executeRawLlm, RawLlmConfigSchema } from "../workflows/executors/raw-llm";
37
+ import {
38
+ executeRawLlm,
39
+ RawLlmConfigSchema,
40
+ RawLlmOutputSchema,
41
+ } from "../workflows/executors/raw-llm";
31
42
  import { route } from "./route-def";
32
43
  import { deriveApiBaseUrl, json, jsonError } from "./utils";
33
44
 
@@ -89,6 +100,20 @@ const agentTaskBodySchema = z.object({
89
100
  outputSchema: z.record(z.string(), z.unknown()).optional(),
90
101
  });
91
102
 
103
+ const scriptRunCreatedSchema = z.object({
104
+ id: z.string().uuid(),
105
+ status: ScriptRunStatusSchema,
106
+ url: z.string(),
107
+ });
108
+
109
+ const journalStepReplaySchema = ScriptRunJournalEntrySchema.pick({
110
+ stepKey: true,
111
+ stepType: true,
112
+ status: true,
113
+ result: true,
114
+ error: true,
115
+ });
116
+
92
117
  const createScriptRunRoute = route({
93
118
  method: "post",
94
119
  path: "/api/script-runs",
@@ -100,9 +125,11 @@ const createScriptRunRoute = route({
100
125
  tags: ["Script Runs"],
101
126
  body: createScriptRunBodySchema,
102
127
  responses: {
103
- 201: { description: "Script run created" },
128
+ 201: { description: "Script run created", schema: scriptRunCreatedSchema },
104
129
  400: { description: "Validation or label-lint failure" },
105
- 409: { description: "Existing idempotent run returned" },
130
+ // Idempotency conflict returns the EXISTING run's pointer, not the
131
+ // standard error envelope — declare it so the fallback doesn't lie.
132
+ 409: { description: "Existing idempotent run returned", schema: scriptRunCreatedSchema },
106
133
  429: { description: "Script run concurrency cap reached" },
107
134
  },
108
135
  // Matches the inline `POST /api/scripts/run` route and the `launch-script-run`
@@ -126,7 +153,13 @@ const listScriptRunsRoute = route({
126
153
  tags: ["Script Runs"],
127
154
  query: listScriptRunsQuerySchema,
128
155
  responses: {
129
- 200: { description: "Paginated script run list" },
156
+ 200: {
157
+ description: "Paginated script run list",
158
+ schema: z.object({
159
+ runs: z.array(ScriptRunListItemSchema),
160
+ total: z.number().int(),
161
+ }),
162
+ },
130
163
  },
131
164
  });
132
165
 
@@ -139,7 +172,10 @@ const getScriptRunRoute = route({
139
172
  tags: ["Script Runs"],
140
173
  params: idParamsSchema,
141
174
  responses: {
142
- 200: { description: "Script run detail" },
175
+ 200: {
176
+ description: "Script run detail",
177
+ schema: z.object({ run: ScriptRunSchema, journal: z.array(ScriptRunJournalEntrySchema) }),
178
+ },
143
179
  404: { description: "Script run not found" },
144
180
  },
145
181
  });
@@ -167,7 +203,7 @@ const getInternalStepRoute = route({
167
203
  tags: ["Script Runs"],
168
204
  params: stepParamsSchema,
169
205
  responses: {
170
- 200: { description: "Journal step found" },
206
+ 200: { description: "Journal step found", schema: journalStepReplaySchema },
171
207
  404: { description: "Journal step not found" },
172
208
  },
173
209
  });
@@ -182,7 +218,7 @@ const postInternalStepRoute = route({
182
218
  params: runIdParamsSchema,
183
219
  body: journalStepBodySchema,
184
220
  responses: {
185
- 201: { description: "Journal step written" },
221
+ 201: { description: "Journal step written", schema: z.object({ ok: z.literal(true) }) },
186
222
  404: { description: "Script run not found" },
187
223
  },
188
224
  });
@@ -225,7 +261,7 @@ const rawLlmRoute = route({
225
261
  tags: ["Script Runs"],
226
262
  body: RawLlmConfigSchema,
227
263
  responses: {
228
- 200: { description: "LLM call completed" },
264
+ 200: { description: "LLM call completed", schema: RawLlmOutputSchema },
229
265
  500: { description: "LLM call failed" },
230
266
  },
231
267
  });
@@ -240,8 +276,14 @@ const agentTaskRoute = route({
240
276
  params: runIdParamsSchema,
241
277
  body: agentTaskBodySchema,
242
278
  responses: {
243
- 200: { description: "Agent task completed" },
244
- 202: { description: "Agent task created or still running" },
279
+ 200: {
280
+ description: "Agent task completed",
281
+ schema: z.object({ taskId: z.string(), taskOutput: z.string().nullable() }),
282
+ },
283
+ 202: {
284
+ description: "Agent task created or still running",
285
+ schema: z.object({ taskId: z.string(), status: AgentTaskStatusSchema }),
286
+ },
245
287
  404: { description: "Script run not found" },
246
288
  },
247
289
  });
@@ -369,7 +411,19 @@ export async function handleScriptRuns(
369
411
  });
370
412
  }
371
413
 
372
- json(res, { id: run.id, status: run.status, url: scriptRunUrl(run.id) }, existing ? 409 : 201);
414
+ if (existing) {
415
+ createScriptRunRoute.respond(res, 409, {
416
+ id: run.id,
417
+ status: run.status,
418
+ url: scriptRunUrl(run.id),
419
+ });
420
+ return true;
421
+ }
422
+ createScriptRunRoute.respond(res, 201, {
423
+ id: run.id,
424
+ status: run.status,
425
+ url: scriptRunUrl(run.id),
426
+ });
373
427
  return true;
374
428
  }
375
429
 
@@ -383,7 +437,7 @@ export async function handleScriptRuns(
383
437
  limit: parsed.query.limit ?? 50,
384
438
  offset: parsed.query.offset ?? 0,
385
439
  };
386
- json(res, {
440
+ listScriptRunsRoute.respond(res, 200, {
387
441
  runs: listScriptRuns(opts),
388
442
  total: countScriptRuns({
389
443
  status: opts.status,
@@ -402,7 +456,7 @@ export async function handleScriptRuns(
402
456
  jsonError(res, "Script run not found", 404);
403
457
  return true;
404
458
  }
405
- json(res, { run, journal: listScriptRunJournalSteps(run.id) });
459
+ getScriptRunRoute.respond(res, 200, { run, journal: listScriptRunJournalSteps(run.id) });
406
460
  return true;
407
461
  }
408
462
 
@@ -441,7 +495,7 @@ export async function handleScriptRuns(
441
495
  // `status` + `error` are part of the replay contract, not diagnostics: the
442
496
  // harness rethrows a recorded failure instead of replaying it as a
443
497
  // successful `undefined` (see durableStep in script-workflows/workflow-ctx).
444
- json(res, {
498
+ getInternalStepRoute.respond(res, 200, {
445
499
  stepKey: step.stepKey,
446
500
  stepType: step.stepType,
447
501
  status: step.status,
@@ -474,7 +528,7 @@ export async function handleScriptRuns(
474
528
  json(res, { error: "script_run_limit", message: limit.error }, 429);
475
529
  return true;
476
530
  }
477
- json(res, { ok: true }, 201);
531
+ postInternalStepRoute.respond(res, 201, { ok: true });
478
532
  return true;
479
533
  }
480
534
 
@@ -524,7 +578,7 @@ export async function handleScriptRuns(
524
578
  json(res, { error: result.error }, 500);
525
579
  return true;
526
580
  }
527
- json(res, result.output);
581
+ rawLlmRoute.respond(res, 200, result.output);
528
582
  return true;
529
583
  }
530
584
 
@@ -563,7 +617,7 @@ export async function handleScriptRuns(
563
617
  // A later same-context task must never change which work this poll resolves.
564
618
  const latest = getTaskById(task.id) ?? task;
565
619
  if (latest.status === "completed") {
566
- json(res, { taskId: latest.id, taskOutput: latest.output ?? null });
620
+ agentTaskRoute.respond(res, 200, { taskId: latest.id, taskOutput: latest.output ?? null });
567
621
  return true;
568
622
  }
569
623
  if (
@@ -577,7 +631,7 @@ export async function handleScriptRuns(
577
631
  await sleep(1000);
578
632
  }
579
633
 
580
- json(res, { taskId: task.id, status: task.status }, 202);
634
+ agentTaskRoute.respond(res, 202, { taskId: task.id, status: task.status });
581
635
  return true;
582
636
  }
583
637