@desplega.ai/agent-swarm 1.157.0 → 1.158.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 (256) hide show
  1. package/dist/{acp-adapter-qhqrk4q0.js → acp-adapter-xaq4n6pc.js} +1 -1
  2. package/dist/{actions-9rrg0zxm.js → actions-p9hz5yat.js} +15 -15
  3. package/dist/{app-enysy1zd.js → app-g26wdcz6.js} +4 -4
  4. package/dist/{artifact-td4q4dch.js → artifact-3v5t9jtg.js} +1 -1
  5. package/dist/{assistant-zegamy48.js → assistant-wydfqkb3.js} +16 -16
  6. package/dist/{boot-reembed-r6shx5qx.js → boot-reembed-g5ckg9yb.js} +6 -6
  7. package/dist/{boot-reembed-zfxb937k.js → boot-reembed-se8zmdcp.js} +5 -5
  8. package/dist/{boot-scrub-logs-k5y0se6r.js → boot-scrub-logs-wfxqan61.js} +3 -3
  9. package/dist/{seed-pricing-vqxa06qf.js → boot-seeds-s3q01xj3.js} +10 -10
  10. package/dist/{claude-adapter-5yc7hxwv.js → claude-adapter-tv2x4f36.js} +7 -7
  11. package/dist/{claude-managed-adapter-ea2aga6w.js → claude-managed-adapter-41b2s7fd.js} +2 -2
  12. package/dist/{claude-sdk-session-j4ywn3xf.js → claude-sdk-session-t442qz6f.js} +8 -8
  13. package/dist/{cli-e781c6f9.js → cli-0xjkj1j7.js} +1 -0
  14. package/dist/{cli-58rgvkt4.js → cli-1hkrch3k.js} +2 -2
  15. package/dist/{cli-yscm6cv8.js → cli-20cj37vt.js} +1866 -9
  16. package/dist/{cli-h0wdadsx.js → cli-4198qc9v.js} +7 -3
  17. package/dist/{cli-awwphhcs.js → cli-47m6dkd3.js} +362 -126
  18. package/dist/{cli-wb2zvbfg.js → cli-53sz8gkz.js} +1 -1
  19. package/dist/{cli-005pze6s.js → cli-5d10vd2m.js} +1 -1
  20. package/dist/{cli-v53rbqp3.js → cli-65hjmev5.js} +57 -17
  21. package/dist/{cli-scwq51gn.js → cli-68w09sjw.js} +7 -1
  22. package/dist/{cli-s98skd5r.js → cli-7gtvvpbh.js} +4 -4
  23. package/dist/{cli-y3nxwx0t.js → cli-7s3syk22.js} +18 -11
  24. package/dist/{cli-74h6f2bp.js → cli-8qmme6vd.js} +2 -2
  25. package/dist/{cli-wsed24mk.js → cli-987hg0aa.js} +2 -2
  26. package/dist/{cli-9n76jszt.js → cli-9httdpyq.js} +1 -1
  27. package/dist/{cli-f3va018d.js → cli-aky8tctm.js} +26 -93
  28. package/dist/{cli-sgyqyyxe.js → cli-c07r9a2m.js} +2 -1
  29. package/dist/{cli-c41wjx0r.js → cli-fgqxwrpv.js} +291 -12
  30. package/dist/{cli-01vfmq8c.js → cli-ftfvggzx.js} +607 -164
  31. package/dist/{cli-ytxs7mn1.js → cli-g8djp6qe.js} +17 -0
  32. package/dist/{cli-avkd6mqv.js → cli-h967nb6r.js} +551 -0
  33. package/dist/{cli-r9ee9c4w.js → cli-j55n64b6.js} +23 -22
  34. package/dist/{cli-9p33cz9h.js → cli-j57qkrpq.js} +86 -28
  35. package/dist/{cli-tjmghmm5.js → cli-q67y4wzm.js} +6 -3
  36. package/dist/{cli-n6zq3kbd.js → cli-rj19hc34.js} +1 -1
  37. package/dist/{cli-jytrw2na.js → cli-rjehvrts.js} +4 -4
  38. package/dist/{cli-tpv97m71.js → cli-rqz8qbw7.js} +245 -75
  39. package/dist/{cli-p37sg0a9.js → cli-s8eet254.js} +1 -1
  40. package/dist/cli-t1ze64h3.js +811 -0
  41. package/dist/{cli-6jjzxv3b.js → cli-ws6rqycm.js} +3 -2
  42. package/dist/{cli-xf5b7y1f.js → cli-wscdvcqz.js} +13 -5
  43. package/dist/{cli-5j7bm4tb.js → cli-x24pshtq.js} +5 -5
  44. package/dist/{cli-nbp6m6gp.js → cli-xberxa1r.js} +51 -26
  45. package/dist/{cli-vx9p3qdt.js → cli-xhaeg2nc.js} +1 -1
  46. package/dist/cli.js +29 -15
  47. package/dist/{codex-adapter-gns3s6c3.js → codex-adapter-cnm8wk11.js} +5 -5
  48. package/dist/{codex-session-runner-gqnxys5w.js → codex-session-runner-gfg547zj.js} +5 -5
  49. package/dist/{commands-hxy2y2sp.js → commands-e3bn0p75.js} +3 -3
  50. package/dist/{db-w8ghhsgf.js → db-03v9kzr2.js} +17 -3
  51. package/dist/{dispatcher-cp1rknjz.js → dispatcher-nrmg8yht.js} +14 -14
  52. package/dist/{dsh-adapter-1dwg97zv.js → dsh-adapter-k03nfqa6.js} +2 -2
  53. package/dist/{handlers-egfhr351.js → handlers-aqcedbyb.js} +17 -17
  54. package/dist/{hook-x4kftwzt.js → hook-7vkskkre.js} +19 -11
  55. package/dist/{hook-fbxjqfjz.js → hook-ybvmrmhq.js} +4 -4
  56. package/dist/{http-c7jfx990.js → http-2eqa8t24.js} +432 -195
  57. package/dist/{index-4k9hct21.js → index-1yks3qcr.js} +14 -14
  58. package/dist/{index-jtvpgb8f.js → index-a3vn96n8.js} +30 -27
  59. package/dist/{index-dc2ek6bw.js → index-c6zsv1bd.js} +5 -5
  60. package/dist/{index-yy07ef2s.js → index-chgdkq36.js} +14 -14
  61. package/dist/{index-r6bty6tb.js → index-x71bvq0p.js} +15 -15
  62. package/dist/{keepalive-f7ekefyc.js → keepalive-vtkf5n99.js} +5 -5
  63. package/dist/{lead-h053syts.js → lead-h3sp357x.js} +26 -26
  64. package/dist/{maintenance-a3w6zs54.js → maintenance-jzeqtk3q.js} +6 -6
  65. package/dist/{oauth-refresh-sweep-vra1dhkd.js → oauth-refresh-sweep-qp3dzmdp.js} +4 -4
  66. package/dist/{onboard-mfgzeqxs.js → onboard-tmsp0qbz.js} +278 -81
  67. package/dist/{opencode-adapter-z64xjzec.js → opencode-adapter-x6x2da1z.js} +3 -3
  68. package/dist/{otel-impl-2ez6xk57.js → otel-impl-9mz73q65.js} +416 -301
  69. package/dist/{pi-mono-adapter-2b7mw16r.js → pi-mono-adapter-m6dvv0dz.js} +2 -2
  70. package/dist/{pricing-refresh-6sw65tck.js → pricing-refresh-v1cbr9te.js} +5 -5
  71. package/dist/{rbac-roles-nm6924sy.js → rbac-roles-c9wqz83x.js} +4 -4
  72. package/dist/{render-v2-f026j6c4.js → render-v2-gryrh9h8.js} +4 -4
  73. package/dist/{setup-w606fr1q.js → setup-q9720bt6.js} +2 -2
  74. package/dist/{virtual-modules-8qheft18.js → virtual-modules-3htpgn8x.js} +1 -1
  75. package/dist/{work-objects-ezmggdne.js → work-objects-b76x7deb.js} +17 -17
  76. package/dist/{worker-1mbyv29k.js → worker-6vrxbv41.js} +26 -26
  77. package/openapi.json +1626 -629
  78. package/package.json +2 -1
  79. package/src/apps/catalog.generated.json +229 -0
  80. package/src/apps/page-validator.ts +71 -16
  81. package/src/apps/row-store.ts +66 -11
  82. package/src/apps/sync.ts +59 -17
  83. package/src/artifact-sdk/browser-sdk.ts +436 -2
  84. package/src/be/approval-sweeps.ts +109 -0
  85. package/src/be/boot-seeds.ts +40 -0
  86. package/src/be/chunking.ts +1 -1
  87. package/src/be/db/agents.ts +20 -0
  88. package/src/be/db/approvals.ts +78 -0
  89. package/src/be/db/tasks/read.ts +197 -39
  90. package/src/be/db/tasks/write.ts +41 -9
  91. package/src/be/db-client.ts +107 -48
  92. package/src/be/db.ts +219 -76
  93. package/src/be/events.ts +33 -1
  94. package/src/be/memory/graph-expansion.ts +10 -3
  95. package/src/be/memory/providers/sqlite-store.ts +55 -13
  96. package/src/be/memory/raters/retrieval.ts +5 -2
  97. package/src/be/memory/reranker.ts +26 -2
  98. package/src/be/memory/types.ts +2 -0
  99. package/src/be/migrations/166_approval_request_auto_cancellation.sql +9 -0
  100. package/src/be/migrations/171_memory_retrieval_relevance.sql +8 -0
  101. package/src/be/migrations/175_workflow_runs_list_index.sql +11 -0
  102. package/src/be/migrations/177_events_event_agent_created_index.sql +11 -0
  103. package/src/be/models-catalog.ts +2 -0
  104. package/src/be/modelsdev-cache.json +1857 -0
  105. package/src/be/modelsdev-cache.ts +14 -1
  106. package/src/be/pricing-normalize.ts +2 -0
  107. package/src/be/scripts/typecheck.ts +1 -0
  108. package/src/be/seed-pricing.ts +3 -1
  109. package/src/be/seed-skills/bundled-files.generated.json +1 -1
  110. package/src/be/steering.ts +53 -3
  111. package/src/be/swarm-config-guard.ts +3 -0
  112. package/src/be/task-citations.ts +29 -0
  113. package/src/cli.tsx +14 -1
  114. package/src/commands/onboard/compose-generator.ts +8 -3
  115. package/src/commands/onboard/container-engine.ts +220 -0
  116. package/src/commands/onboard/manifest.ts +1 -0
  117. package/src/commands/onboard/steps/health-check.tsx +4 -1
  118. package/src/commands/onboard/steps/prereq-check.tsx +50 -54
  119. package/src/commands/onboard/steps/start.tsx +31 -16
  120. package/src/commands/onboard/types.ts +7 -2
  121. package/src/commands/onboard.tsx +39 -4
  122. package/src/commands/profile-sync.ts +79 -26
  123. package/src/commands/runner.ts +8 -1
  124. package/src/extensions/catalog.generated.json +17 -0
  125. package/src/extensions/contract-types.generated.ts +1 -1
  126. package/src/heartbeat/heartbeat.ts +263 -103
  127. package/src/hooks/hook.ts +21 -12
  128. package/src/http/agents.ts +35 -0
  129. package/src/http/approval-requests.ts +136 -64
  130. package/src/http/apps.ts +14 -3
  131. package/src/http/config.ts +15 -1
  132. package/src/http/events.ts +62 -2
  133. package/src/http/index.ts +6 -4
  134. package/src/http/memory.ts +21 -7
  135. package/src/http/schedules.ts +1 -1
  136. package/src/http/session-data.ts +9 -4
  137. package/src/http/sessions.ts +25 -18
  138. package/src/http/stats.ts +19 -7
  139. package/src/http/status.ts +11 -1
  140. package/src/http/tasks.ts +40 -8
  141. package/src/http/webhooks.ts +67 -46
  142. package/src/http/workflows.ts +15 -20
  143. package/src/linear/outbound.ts +37 -15
  144. package/src/otel-impl.ts +151 -1
  145. package/src/otel.ts +14 -3
  146. package/src/prompts/memories.ts +19 -2
  147. package/src/providers/claude-managed-models.ts +8 -0
  148. package/src/providers/modelsdev-reasoning.json +551 -0
  149. package/src/rbac/legacy-policy.ts +16 -0
  150. package/src/rbac/permissions.ts +4 -0
  151. package/src/scheduler/schedule-task.ts +3 -0
  152. package/src/scripts-runtime/sdk-allowlist.ts +1 -0
  153. package/src/scripts-runtime/swarm-sdk.ts +9 -0
  154. package/src/scripts-runtime/types/stdlib.d.ts +1 -0
  155. package/src/scripts-runtime/types/swarm-extension.d.ts +1 -0
  156. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -0
  157. package/src/server.ts +12 -7
  158. package/src/slack/app.ts +35 -4
  159. package/src/slack/connection-state.ts +17 -0
  160. package/src/tasks/context-key.ts +1 -0
  161. package/src/tasks/worker-follow-up.ts +6 -2
  162. package/src/tests/agent-task-activity.test.ts +74 -0
  163. package/src/tests/agents-list-model-display.test.ts +6 -1
  164. package/src/tests/approval-auto-cancellation-migration.test.ts +104 -0
  165. package/src/tests/approval-requests.test.ts +395 -0
  166. package/src/tests/approval-sweeps-config.test.ts +47 -0
  167. package/src/tests/approval-sweeps.test.ts +508 -0
  168. package/src/tests/apps-kibo-blocks.test.ts +77 -0
  169. package/src/tests/apps-spike.test.ts +56 -1
  170. package/src/tests/apps-sync-engine.test.ts +20 -9
  171. package/src/tests/boot-seeds.test.ts +170 -0
  172. package/src/tests/cancel-approval-request-tool.test.ts +115 -0
  173. package/src/tests/claude-managed-adapter.test.ts +6 -0
  174. package/src/tests/config-key-filter.test.ts +80 -0
  175. package/src/tests/context-window.test.ts +1 -0
  176. package/src/tests/db-client-busy-retry.test.ts +96 -0
  177. package/src/tests/db-client.test.ts +60 -1
  178. package/src/tests/db-task-read-contract.test.ts +10 -0
  179. package/src/tests/db-task-write-contract.test.ts +9 -0
  180. package/src/tests/docs-index-footprint.test.js +3 -3
  181. package/src/tests/events-http.test.ts +103 -0
  182. package/src/tests/extensions-catalog.test.ts +22 -17
  183. package/src/tests/extensions-pre-task.test.ts +107 -0
  184. package/src/tests/fixtures/kibo-blocks-definition.json.txt +105 -0
  185. package/src/tests/follow-up-config-inheritance.test.ts +260 -0
  186. package/src/tests/heartbeat-orphan-resume.test.ts +84 -0
  187. package/src/tests/heartbeat-reboot-live.test.ts +95 -0
  188. package/src/tests/heartbeat-stall-cas.test.ts +80 -0
  189. package/src/tests/heartbeat.test.ts +99 -3
  190. package/src/tests/hook-mcp-config.test.ts +29 -0
  191. package/src/tests/http-api-integration.test.ts +16 -2
  192. package/src/tests/kv-storage.test.ts +62 -0
  193. package/src/tests/linear-outbound-sync.test.ts +120 -5
  194. package/src/tests/list-endpoint-slimming.test.ts +91 -0
  195. package/src/tests/memory-graph-organic-route.test.ts +155 -0
  196. package/src/tests/memory-http-recall-gating.test.ts +14 -4
  197. package/src/tests/memory-hybrid.test.ts +161 -1
  198. package/src/tests/memory-prompt-recall-crowdout.test.ts +297 -0
  199. package/src/tests/memory.test.ts +22 -0
  200. package/src/tests/onboard-container-engine.test.ts +240 -0
  201. package/src/tests/otel-event-loop-and-logs.test.ts +99 -0
  202. package/src/tests/pricing-routes.test.ts +14 -0
  203. package/src/tests/profile-sync-warning.test.ts +8 -4
  204. package/src/tests/promote-draft-task-route.test.ts +19 -0
  205. package/src/tests/provider-registration.test.ts +296 -42
  206. package/src/tests/rbac-engine.test.ts +30 -0
  207. package/src/tests/reasoning-effort.test.ts +8 -0
  208. package/src/tests/script-connections.test.ts +7 -0
  209. package/src/tests/sdk-allowlist.test.ts +39 -0
  210. package/src/tests/session-costs-model-key-normalize.test.ts +1 -0
  211. package/src/tests/sessions-detail-batch.test.ts +250 -0
  212. package/src/tests/sessions.test.ts +118 -0
  213. package/src/tests/slack-config.test.ts +22 -0
  214. package/src/tests/sonnet-5-5-registry.test.ts +44 -0
  215. package/src/tests/status.test.ts +36 -1
  216. package/src/tests/swarm-diff.test.ts +316 -10
  217. package/src/tests/task-completion-idempotency.test.ts +2 -1
  218. package/src/tests/tasks-requested-by-filter.test.ts +3 -1
  219. package/src/tests/tool-annotations.test.ts +1 -1
  220. package/src/tests/ui-list-slim-projections.test.ts +158 -0
  221. package/src/tests/webhooks-task-blocked.test.ts +127 -0
  222. package/src/tests/workflow-approval-recovery.test.ts +203 -0
  223. package/src/tests/workflow-hitl-routing.test.ts +22 -1
  224. package/src/tests/workflow-hitl-slack-card.test.ts +52 -0
  225. package/src/tests/workflow-http-v2.test.ts +99 -8
  226. package/src/tests/workflow-retry-validation.test.ts +56 -0
  227. package/src/tests/workflow-tla-races.test.ts +389 -0
  228. package/src/tests/workflow-validation-port-routing.test.ts +113 -1
  229. package/src/tools/cancel-approval-request.ts +57 -0
  230. package/src/tools/memory-search.ts +1 -0
  231. package/src/tools/request-human-input.ts +4 -2
  232. package/src/tools/send-task.ts +4 -0
  233. package/src/tools/templates.ts +19 -0
  234. package/src/tools/tool-config.ts +2 -1
  235. package/src/tools/workflows/list-workflow-runs.ts +1 -0
  236. package/src/types.ts +38 -0
  237. package/src/utils/context-window.ts +1 -0
  238. package/src/workflows/approval-cancel.ts +152 -0
  239. package/src/workflows/approval-notifications.ts +84 -0
  240. package/src/workflows/checkpoint.ts +10 -5
  241. package/src/workflows/definition.ts +21 -0
  242. package/src/workflows/engine.ts +152 -21
  243. package/src/workflows/executors/human-in-the-loop.ts +1 -1
  244. package/src/workflows/recovery.ts +100 -45
  245. package/src/workflows/resume.ts +49 -18
  246. package/src/workflows/retry-poller.ts +71 -21
  247. package/templates/extensions/README.md +1 -0
  248. package/templates/extensions/github-sender-allowlist/README.md +18 -0
  249. package/templates/extensions/github-sender-allowlist/hooks.ts +55 -0
  250. package/templates/extensions/github-sender-allowlist/manifest.json +8 -0
  251. package/templates/skills/apps/content.md +20 -1
  252. package/templates/skills/code-quality/content.md +26 -1
  253. package/templates/skills/pages/content.md +16 -4
  254. package/templates/skills/pages/files/examples/multiplayer-board.html +3 -12
  255. package/dist/cli-2daksqps.js +0 -378
  256. package/dist/rbac-roles-3gxmnb20.js +0 -37
@@ -18,22 +18,20 @@ import {
18
18
  getOpenRouterBaseUrl
19
19
  } from "./cli-3dpj7atn.js";
20
20
  import {
21
- startPricingRefreshLoop
22
- } from "./cli-6jjzxv3b.js";
23
- import {
24
- seedPricingFromModelsDev
25
- } from "./cli-xf5b7y1f.js";
26
- import {
27
- ensureRbacSeedsSynced,
21
+ ensurePricingSeeded,
22
+ ensureRbacSeeded,
28
23
  getUserGrant
29
- } from "./cli-f3va018d.js";
24
+ } from "./cli-aky8tctm.js";
30
25
  import {
31
26
  can,
32
27
  decideAdmission,
33
28
  grantLeadEquivalence,
34
29
  isRbacEnabled,
35
30
  revokeLeadEquivalence
36
- } from "./cli-ytxs7mn1.js";
31
+ } from "./cli-g8djp6qe.js";
32
+ import {
33
+ startPricingRefreshLoop
34
+ } from "./cli-ws6rqycm.js";
37
35
  import {
38
36
  AppDefinitionSchema,
39
37
  AppElementsSchema,
@@ -87,6 +85,7 @@ import {
87
85
  refreshScriptConnection,
88
86
  require_dist as require_dist2,
89
87
  resolveSyncRunAs,
88
+ resolveValidationPort,
90
89
  restoreScratchScriptLastUsedIfUnchanged,
91
90
  runSavedScriptAsAgent,
92
91
  runScript,
@@ -103,7 +102,7 @@ import {
103
102
  validateDefinition,
104
103
  validateScriptImports,
105
104
  writeBareImportShim
106
- } from "./cli-c41wjx0r.js";
105
+ } from "./cli-fgqxwrpv.js";
107
106
  import {
108
107
  detachedProcessGroup,
109
108
  registerProcessGroup,
@@ -114,7 +113,7 @@ import {
114
113
  } from "./cli-f14fvzag.js";
115
114
  import {
116
115
  embedScript
117
- } from "./cli-wsed24mk.js";
116
+ } from "./cli-987hg0aa.js";
118
117
  import {
119
118
  buildAuthorizationUrl,
120
119
  createOAuthApp,
@@ -129,7 +128,7 @@ import {
129
128
  listAuthorizationsForApp,
130
129
  onAuthorizationRefreshed,
131
130
  upsertOAuthApp
132
- } from "./cli-wb2zvbfg.js";
131
+ } from "./cli-53sz8gkz.js";
133
132
  import {
134
133
  AgentFsProvider,
135
134
  getFileStorageProvider,
@@ -146,7 +145,7 @@ import {
146
145
  isGraphExpansionEnabled,
147
146
  rerank,
148
147
  rowToCandidate
149
- } from "./cli-v53rbqp3.js";
148
+ } from "./cli-65hjmev5.js";
150
149
  import {
151
150
  ZodFirstPartyTypeKind,
152
151
  objectType
@@ -176,7 +175,7 @@ import {
176
175
  taskCitationWarnings,
177
176
  upsertTaskCitations,
178
177
  withSpan
179
- } from "./cli-9p33cz9h.js";
178
+ } from "./cli-j57qkrpq.js";
180
179
  import {
181
180
  init_task_attachment_links,
182
181
  taskAttachmentDisplayUrl,
@@ -194,6 +193,7 @@ import {
194
193
  beginRequestAuthScope,
195
194
  buildJiraContextKey,
196
195
  buildRoutingAffinityFromAgent,
196
+ cancelApprovalRequestById,
197
197
  cancelPendingApprovalRequestsForRun,
198
198
  cancelTask,
199
199
  checkDependencies,
@@ -263,6 +263,7 @@ import {
263
263
  getAllUsers,
264
264
  getAppVersion,
265
265
  getAppVersions,
266
+ getApprovalRequestById,
266
267
  getBudget,
267
268
  getChannelById,
268
269
  getChannelByName,
@@ -270,6 +271,7 @@ import {
270
271
  getCompletedStepNodeIds,
271
272
  getContextVersion,
272
273
  getContextVersionHistory,
274
+ getCurrentStepForNode,
273
275
  getDailySpendForAgent,
274
276
  getDailySpendForUser,
275
277
  getDailySpendGlobal,
@@ -372,6 +374,7 @@ import {
372
374
  isInternalConfigKey,
373
375
  isReservedConfigKey,
374
376
  isSteeringEnabled,
377
+ kvPrefixUpperBound,
375
378
  linearContextKey,
376
379
  listCancelledApprovalRequestsForRun,
377
380
  listKv,
@@ -442,7 +445,7 @@ import {
442
445
  upsertSwarmConfig,
443
446
  validateConfigValue,
444
447
  workflowContextKey
445
- } from "./cli-awwphhcs.js";
448
+ } from "./cli-47m6dkd3.js";
446
449
  import {
447
450
  $OpenAPIRegistry,
448
451
  $OpenApiGeneratorV31,
@@ -482,6 +485,7 @@ import {
482
485
  SteerModeSchema,
483
486
  SteerOutcomeSchema,
484
487
  SwarmConfigScopeSchema,
488
+ TERMINAL_TASK_STATUSES,
485
489
  TriggerConfigSchema,
486
490
  WorkflowDefinitionSchema,
487
491
  WorkflowNodePatchSchema,
@@ -497,7 +501,7 @@ import {
497
501
  normalizeAssetKey,
498
502
  parseAssetKey,
499
503
  splitLegacyModelAlias
500
- } from "./cli-h0wdadsx.js";
504
+ } from "./cli-4198qc9v.js";
501
505
  import {
502
506
  generateDefaultClaudeMd,
503
507
  generateDefaultIdentityMd,
@@ -580,7 +584,7 @@ import {
580
584
  import {
581
585
  init_package,
582
586
  package_default
583
- } from "./cli-sgyqyyxe.js";
587
+ } from "./cli-c07r9a2m.js";
584
588
  import {
585
589
  init_secret_scrubber,
586
590
  isSensitiveKey,
@@ -14319,7 +14323,7 @@ async function notifyAutomationPreflightFailure(preflight) {
14319
14323
  return;
14320
14324
  }
14321
14325
  try {
14322
- const { getSlackApp: getSlackApp2 } = await import("./app-enysy1zd.js");
14326
+ const { getSlackApp: getSlackApp2 } = await import("./app-g26wdcz6.js");
14323
14327
  const app = getSlackApp2();
14324
14328
  if (!app) {
14325
14329
  console.warn("[Automation Preflight] Slack not available, cannot send notification");
@@ -14643,10 +14647,15 @@ async function checkpointStepFailure(runId, stepId, error, retryCount, retryPoli
14643
14647
  });
14644
14648
  const markRunFailed = options?.markRunFailed ?? true;
14645
14649
  if (markRunFailed) {
14646
- await updateWorkflowRun(runId, {
14647
- status: "failed",
14648
- error: `Step failed: ${error}`,
14649
- finishedAt: now
14650
+ await getDbClient().transaction(async () => {
14651
+ const run = await getWorkflowRun(runId);
14652
+ if (run?.status !== "running" && run?.status !== "waiting")
14653
+ return;
14654
+ await updateWorkflowRun(runId, {
14655
+ status: "failed",
14656
+ error: `Step failed: ${error}`,
14657
+ finishedAt: now
14658
+ });
14650
14659
  });
14651
14660
  }
14652
14661
  return { shouldRetry: false };
@@ -15170,19 +15179,30 @@ async function startWorkflowExecution(workflow, triggerData, registry, options =
15170
15179
  return runId;
15171
15180
  }
15172
15181
  var activeWalks = new Map;
15182
+ var executingSteps = new Set;
15173
15183
  function isWorkflowRunActive(runId) {
15174
15184
  return activeWalks.has(runId);
15175
15185
  }
15176
- async function walkGraph(def, runId, ctx, startNodes, registry, workflowId, secretKeys = new Set, options = {}) {
15186
+ function holdWorkflowRun(runId) {
15177
15187
  activeWalks.set(runId, (activeWalks.get(runId) ?? 0) + 1);
15178
- try {
15179
- await walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId, secretKeys, options);
15180
- } finally {
15188
+ let released = false;
15189
+ return () => {
15190
+ if (released)
15191
+ return;
15192
+ released = true;
15181
15193
  const remaining = activeWalks.get(runId) - 1;
15182
15194
  if (remaining === 0)
15183
15195
  activeWalks.delete(runId);
15184
15196
  else
15185
15197
  activeWalks.set(runId, remaining);
15198
+ };
15199
+ }
15200
+ async function walkGraph(def, runId, ctx, startNodes, registry, workflowId, secretKeys = new Set, options = {}) {
15201
+ const release = holdWorkflowRun(runId);
15202
+ try {
15203
+ await walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId, secretKeys, options);
15204
+ } finally {
15205
+ release();
15186
15206
  }
15187
15207
  }
15188
15208
  async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId, secretKeys = new Set, options = {}) {
@@ -15215,12 +15235,13 @@ async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId,
15215
15235
  activeEdges.add(`${step.nodeId}→${succ.id}`);
15216
15236
  }
15217
15237
  }
15238
+ const awaited = awaitedNodeIds(allSteps, activeEdges);
15218
15239
  let pendingNodes = startNodes.filter((n) => {
15219
15240
  const preds = getAllPredecessors(def, n.id);
15220
15241
  if (preds.length === 0) {
15221
15242
  return !completedNodeIds.has(n.id);
15222
15243
  }
15223
- const activePreds = preds.filter((predId) => activeEdges.has(`${predId}→${n.id}`));
15244
+ const activePreds = preds.filter((predId) => activeEdges.has(`${predId}→${n.id}`) || awaited.has(predId));
15224
15245
  const predsToCheck = activePreds.length > 0 ? activePreds : preds;
15225
15246
  return predsToCheck.every((p) => completedNodeIds.has(p));
15226
15247
  });
@@ -15264,11 +15285,24 @@ async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId,
15264
15285
  if (hasWaiting)
15265
15286
  return;
15266
15287
  const readyNext = [];
15288
+ const batchSteps = nextBatch.size > 0 ? await getWorkflowRunStepsByRunId(runId) : [];
15289
+ const batchAwaited = awaitedNodeIds(batchSteps, activeEdges);
15290
+ const batchLatest = latestStepByNode(batchSteps);
15267
15291
  for (const [nodeId, node] of nextBatch) {
15268
15292
  if (executedInThisWalk.has(nodeId))
15269
15293
  continue;
15270
15294
  const allPreds = getAllPredecessors(def, nodeId);
15271
- const activePreds = allPreds.filter((predId) => activeEdges.has(`${predId}→${nodeId}`));
15295
+ for (const predId of allPreds) {
15296
+ if (completedNodeIds.has(predId))
15297
+ continue;
15298
+ const latest = batchLatest.get(predId);
15299
+ if (latest?.status !== "completed")
15300
+ continue;
15301
+ completedNodeIds.add(predId);
15302
+ if (latest.output !== undefined)
15303
+ ctx[predId] = latest.output;
15304
+ }
15305
+ const activePreds = allPreds.filter((predId) => activeEdges.has(`${predId}→${nodeId}`) || batchAwaited.has(predId));
15272
15306
  const allActivePredsCompleted = activePreds.every((p) => completedNodeIds.has(p));
15273
15307
  if (allActivePredsCompleted) {
15274
15308
  readyNext.push(node);
@@ -15281,6 +15315,8 @@ async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId,
15281
15315
  if (!run || run.status !== "running")
15282
15316
  return;
15283
15317
  const finalSteps = await getWorkflowRunStepsByRunId(runId);
15318
+ if (hasRunningStep(finalSteps))
15319
+ return;
15284
15320
  const hasWaitingSteps = finalSteps.some((s) => s.status === "waiting");
15285
15321
  const hasPendingRetries = finalSteps.some((s) => s.status === "failed" && s.nextRetryAt != null);
15286
15322
  const failedSteps = finalSteps.filter((s) => s.status === "failed" && s.nextRetryAt == null);
@@ -15315,6 +15351,33 @@ async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId,
15315
15351
  }
15316
15352
  });
15317
15353
  }
15354
+ function latestStepByNode(steps) {
15355
+ const latest = new Map;
15356
+ for (const step of steps)
15357
+ latest.set(step.nodeId, step);
15358
+ return latest;
15359
+ }
15360
+ function awaitedNodeIds(steps, activeEdges) {
15361
+ const latest = latestStepByNode(steps);
15362
+ const awaited = new Set;
15363
+ for (const [nodeId, step] of latest) {
15364
+ if (step.status === "running" || step.status === "waiting")
15365
+ awaited.add(nodeId);
15366
+ }
15367
+ for (const edge of activeEdges) {
15368
+ const target = edge.slice(edge.indexOf("→") + 1);
15369
+ if (!latest.has(target))
15370
+ awaited.add(target);
15371
+ }
15372
+ return awaited;
15373
+ }
15374
+ function hasRunningStep(steps) {
15375
+ for (const step of latestStepByNode(steps).values()) {
15376
+ if (step.status === "running")
15377
+ return true;
15378
+ }
15379
+ return false;
15380
+ }
15318
15381
  async function rehydrateCompletedStepOutputs(def, runId, ctx, registry) {
15319
15382
  const completedNodeIds = new Set(await getCompletedStepNodeIds(runId));
15320
15383
  const latestSteps = new Map;
@@ -15352,23 +15415,30 @@ function getAllPredecessors(def, nodeId) {
15352
15415
  return preds;
15353
15416
  }
15354
15417
  async function executeStep(def, runId, ctx, node, registry, workflowId, secretKeys = new Set, options = {}) {
15355
- const dedup = await getDbClient().transaction(async () => {
15418
+ let claimedStepId;
15419
+ const claimStep = async () => {
15356
15420
  const run = await getWorkflowRun(runId);
15357
15421
  if (!run || run.status !== "running" && run.status !== "waiting") {
15358
15422
  return { halted: true };
15359
15423
  }
15424
+ if (node.type !== "foreach") {
15425
+ const current = await getCurrentStepForNode(runId, node.id, getAllPredecessors(def, node.id));
15426
+ if (current && (current.status !== "running" || executingSteps.has(current.id))) {
15427
+ return { current };
15428
+ }
15429
+ }
15360
15430
  const iteration = await getStepCountForNode(runId, node.id);
15361
15431
  const idempotencyKey = `${runId}:${node.id}:${iteration}`;
15362
- const existingStep2 = await getStepByIdempotencyKey(idempotencyKey);
15363
- if (existingStep2 && (existingStep2.status === "completed" || existingStep2.status === "waiting")) {
15364
- return { existingStep: existingStep2, stepId: existingStep2.id, deduped: true };
15432
+ const existingStep = await getStepByIdempotencyKey(idempotencyKey);
15433
+ if (existingStep && (existingStep.status === "completed" || existingStep.status === "waiting")) {
15434
+ return { existingStep, stepId: existingStep.id, deduped: true };
15365
15435
  }
15366
15436
  const latestForeachStep = node.type === "foreach" ? await getLatestStepForNode(runId, node.id) : undefined;
15367
15437
  const reusableForeachStep = latestForeachStep && !FOREACH_TERMINAL_STEP_STATUSES.has(latestForeachStep.status) ? latestForeachStep : undefined;
15368
- const stepId2 = reusableForeachStep?.id ?? crypto.randomUUID();
15438
+ const stepId = reusableForeachStep?.id ?? crypto.randomUUID();
15369
15439
  if (!reusableForeachStep) {
15370
15440
  await createWorkflowRunStep({
15371
- id: stepId2,
15441
+ id: stepId,
15372
15442
  runId,
15373
15443
  nodeId: node.id,
15374
15444
  nodeType: node.type,
@@ -15376,20 +15446,38 @@ async function executeStep(def, runId, ctx, node, registry, workflowId, secretKe
15376
15446
  idempotencyKey
15377
15447
  });
15378
15448
  }
15379
- return { existingStep: existingStep2, stepId: stepId2, deduped: false };
15449
+ claimedStepId = stepId;
15450
+ executingSteps.add(stepId);
15451
+ return { existingStep, stepId, deduped: false };
15452
+ };
15453
+ const dedup = await getDbClient().transaction(claimStep).catch((err) => {
15454
+ if (claimedStepId)
15455
+ executingSteps.delete(claimedStepId);
15456
+ throw err;
15380
15457
  });
15381
15458
  if ("halted" in dedup)
15382
15459
  return { outcome: "completed", successors: [] };
15460
+ if ("current" in dedup && dedup.current) {
15461
+ if (dedup.current.status !== "completed")
15462
+ return { outcome: "waiting", successors: [] };
15463
+ ctx[node.id] = dedup.current.output;
15464
+ return { outcome: "completed", successors: [] };
15465
+ }
15383
15466
  if (dedup.deduped && dedup.existingStep) {
15384
15467
  if (dedup.existingStep.status === "completed") {
15385
15468
  ctx[node.id] = dedup.existingStep.output;
15386
- const successors2 = getSuccessors(def, node.id);
15387
- return { outcome: "completed", successors: successors2 };
15469
+ const successors = getSuccessors(def, node.id);
15470
+ return { outcome: "completed", successors };
15388
15471
  }
15389
15472
  return { outcome: "waiting", successors: [] };
15390
15473
  }
15391
- const existingStep = dedup.existingStep;
15392
- const stepId = dedup.stepId;
15474
+ try {
15475
+ return await runClaimedStep(def, runId, ctx, node, registry, dedup.existingStep, dedup.stepId, workflowId, options);
15476
+ } finally {
15477
+ executingSteps.delete(dedup.stepId);
15478
+ }
15479
+ }
15480
+ async function runClaimedStep(def, runId, ctx, node, registry, existingStep, stepId, workflowId, options = {}) {
15393
15481
  const executor = registry.get(node.type);
15394
15482
  const interpolationCtx = buildNodeInterpolationCtx(node, ctx);
15395
15483
  if (node.inputSchema) {
@@ -15493,9 +15581,7 @@ async function executeStep(def, runId, ctx, node, registry, workflowId, secretKe
15493
15581
  return { outcome: "completed", successors: [] };
15494
15582
  }
15495
15583
  }
15496
- if (validationResult?.passed !== undefined && !result.nextPort && node.next && typeof node.next === "object" && !Array.isArray(node.next)) {
15497
- result.nextPort = validationResult.passed ? "pass" : "fail";
15498
- }
15584
+ result.nextPort = resolveValidationPort(node.next, result.nextPort, validationResult?.passed);
15499
15585
  await checkpointStep(runId, stepId, node.id, result, ctx);
15500
15586
  const successors = result.nextPort ? getSuccessors(def, node.id, result.nextPort) : getSuccessors(def, node.id);
15501
15587
  return { outcome: "completed", successors };
@@ -15656,6 +15742,8 @@ init_secret_scrubber();
15656
15742
 
15657
15743
  // src/workflows/approval-notifications.ts
15658
15744
  init_db();
15745
+ init_resolver();
15746
+ init_types();
15659
15747
  init_secret_scrubber();
15660
15748
  async function postApprovalCancellationUpdates(approvals, reason, client = getSlackApp()?.client) {
15661
15749
  if (!client)
@@ -15689,6 +15777,60 @@ async function postApprovalCancellationUpdates(approvals, reason, client = getSl
15689
15777
  }
15690
15778
  }
15691
15779
  }
15780
+ async function createApprovalFollowUpTask(request, templateEventType) {
15781
+ if (request.workflowRunId || !request.sourceTaskId)
15782
+ return false;
15783
+ const sourceTask = await getTaskById(request.sourceTaskId);
15784
+ if (!sourceTask)
15785
+ return false;
15786
+ if (templateEventType === "hitl.timeout" && TERMINAL_TASK_STATUSES.includes(sourceTask.status)) {
15787
+ return false;
15788
+ }
15789
+ const { text: taskText } = templateEventType === "hitl.follow_up" ? resolveTemplate("hitl.follow_up", {
15790
+ request_id: request.id,
15791
+ title: request.title,
15792
+ status: request.status,
15793
+ responses: formatResponses(request.questions, request.responses ?? {})
15794
+ }) : resolveTemplate("hitl.timeout", {
15795
+ request_id: request.id,
15796
+ title: request.title,
15797
+ expires_at: request.expiresAt ?? "",
15798
+ reason: request.resolutionReason ?? ""
15799
+ });
15800
+ await createTaskExtended(taskText, {
15801
+ agentId: sourceTask.agentId,
15802
+ routingReason: sourceTask.agentId ? "continuity" : undefined,
15803
+ routingSource: sourceTask.agentId ? "engine_default" : undefined,
15804
+ parentTaskId: request.sourceTaskId,
15805
+ source: "system",
15806
+ taskType: "hitl-follow-up",
15807
+ tags: ["hitl", "follow-up"],
15808
+ slackChannelId: sourceTask.slackChannelId ?? undefined,
15809
+ slackThreadTs: sourceTask.slackThreadTs ?? undefined,
15810
+ slackUserId: sourceTask.slackUserId ?? undefined
15811
+ });
15812
+ return true;
15813
+ }
15814
+ function formatResponses(questions, responses) {
15815
+ return questions.map((q) => {
15816
+ const answer = responses[q.id];
15817
+ let answerText;
15818
+ if (answer == null) {
15819
+ answerText = "(no answer)";
15820
+ } else if (q.type === "approval") {
15821
+ const a = answer;
15822
+ answerText = a.approved ? "Approved" : "Rejected";
15823
+ if (a.comment)
15824
+ answerText += ` — ${a.comment}`;
15825
+ } else if (typeof answer === "object") {
15826
+ answerText = JSON.stringify(answer);
15827
+ } else {
15828
+ answerText = String(answer);
15829
+ }
15830
+ return `- ${q.label}: ${answerText}`;
15831
+ }).join(`
15832
+ `);
15833
+ }
15692
15834
 
15693
15835
  // src/workflows/resume.ts
15694
15836
  init_event_bus();
@@ -16166,6 +16308,12 @@ async function resumeFromTaskCompletion(event, registry) {
16166
16308
  async function finalizeOrWait(runId) {
16167
16309
  await getDbClient().transaction(async () => {
16168
16310
  const steps = await getWorkflowRunStepsByRunId(runId);
16311
+ if (hasRunningStep(steps)) {
16312
+ const run = await getWorkflowRun(runId);
16313
+ if (run?.status === "waiting")
16314
+ await updateWorkflowRun(runId, { status: "running" });
16315
+ return;
16316
+ }
16169
16317
  const hasWaiting = steps.some((s) => s.status === "waiting");
16170
16318
  if (hasWaiting) {
16171
16319
  await updateWorkflowRun(runId, { status: "waiting" });
@@ -16253,27 +16401,19 @@ async function retryFailedRun(runId, registry) {
16253
16401
  });
16254
16402
  if (!claimed)
16255
16403
  throw new Error("Run is not in failed state");
16256
- const readyNodes = findReadyNodes(workflow.definition, completedNodeIds, activeEdges);
16404
+ const liveNodeIds = new Set(steps.filter((s) => s.status === "running" || s.status === "waiting").map((s) => s.nodeId));
16405
+ const readyNodes = findReadyNodes(workflow.definition, completedNodeIds, activeEdges).filter((n) => n.id === failedNode.id || !liveNodeIds.has(n.id));
16257
16406
  const nodesToRun = !shouldRetryFailedNode || readyNodes.some((n) => n.id === failedNode.id) ? readyNodes : [failedNode, ...readyNodes];
16258
16407
  const secretKeys = getSecretInputKeys(workflow.input);
16259
16408
  await walkGraph(workflow.definition, runId, ctx, nodesToRun, registry, workflow.id, secretKeys);
16260
16409
  }
16261
- async function cancelWorkflowRun(runId, reason) {
16262
- const run = await getWorkflowRun(runId);
16263
- if (!run)
16264
- throw new Error("Workflow run not found");
16410
+ async function cancelWorkflowRunRows(runId, cancelReason) {
16265
16411
  const terminalStatuses = ["completed", "failed", "cancelled", "skipped"];
16266
- if (terminalStatuses.includes(run.status) && run.status !== "cancelled") {
16267
- throw new Error(`Cannot cancel run in '${run.status}' state`);
16268
- }
16269
16412
  const now = new Date().toISOString();
16270
- const cancelReason = reason ?? "Cancelled by user";
16271
- let applied = false;
16272
- await getDbClient().transaction(async () => {
16413
+ return await getDbClient().transaction(async () => {
16273
16414
  const current = await getWorkflowRun(runId);
16274
16415
  if (!current || terminalStatuses.includes(current.status))
16275
- return;
16276
- applied = true;
16416
+ return false;
16277
16417
  const steps = await getWorkflowRunStepsByRunId(runId);
16278
16418
  for (const step of steps) {
16279
16419
  if (terminalStatuses.includes(step.status))
@@ -16294,7 +16434,19 @@ async function cancelWorkflowRun(runId, reason) {
16294
16434
  error: cancelReason,
16295
16435
  finishedAt: now
16296
16436
  });
16437
+ return true;
16297
16438
  });
16439
+ }
16440
+ async function cancelWorkflowRun(runId, reason) {
16441
+ const run = await getWorkflowRun(runId);
16442
+ if (!run)
16443
+ throw new Error("Workflow run not found");
16444
+ const terminalStatuses = ["completed", "failed", "cancelled", "skipped"];
16445
+ if (terminalStatuses.includes(run.status) && run.status !== "cancelled") {
16446
+ throw new Error(`Cannot cancel run in '${run.status}' state`);
16447
+ }
16448
+ const cancelReason = reason ?? "Cancelled by user";
16449
+ const applied = await cancelWorkflowRunRows(runId, cancelReason);
16298
16450
  const cancelledApprovals = await listCancelledApprovalRequestsForRun(runId);
16299
16451
  const latestRun = await getWorkflowRun(runId);
16300
16452
  if (!applied && latestRun?.status !== "cancelled") {
@@ -16313,6 +16465,10 @@ async function resumeFromApprovalResolution(event, registry) {
16313
16465
  if (!workflow)
16314
16466
  return;
16315
16467
  const ctx = run.context ?? {};
16468
+ if (event.status === "cancelled") {
16469
+ console.warn(`[workflows] approval ${event.requestId} is cancelled; step ${event.workflowRunStepId} stays waiting for the run cancel path`);
16470
+ return;
16471
+ }
16316
16472
  const nextPort = event.status === "timeout" ? "timeout" : event.status === "rejected" ? "rejected" : "approved";
16317
16473
  const stepOutput = {
16318
16474
  requestId: event.requestId,
@@ -16507,15 +16663,13 @@ async function recoverRunningRuns(registry) {
16507
16663
  const completedNodeIds = new Set(await getCompletedStepNodeIds(runId));
16508
16664
  const ctx = run.context ?? {};
16509
16665
  const { activeEdges } = await loadCompletedStepRouting(workflow.definition, runId, completedNodeIds);
16510
- const readyNodes = findReadyNodes(workflow.definition, completedNodeIds, activeEdges);
16666
+ const retryPending = retryPendingNodeIds(await getWorkflowRunStepsByRunId(runId));
16667
+ const readyNodes = findReadyNodes(workflow.definition, completedNodeIds, activeEdges).filter((node) => !retryPending.has(node.id));
16511
16668
  if (isWorkflowRunActive(runId))
16512
16669
  continue;
16513
16670
  if (readyNodes.length === 0) {
16514
- await updateWorkflowRun(runId, {
16515
- status: "completed",
16516
- context: ctx,
16517
- finishedAt: new Date().toISOString()
16518
- });
16671
+ if (!await completeIfSettled(runId, ctx))
16672
+ continue;
16519
16673
  } else {
16520
16674
  const secretKeys = getSecretInputKeys(workflow.input);
16521
16675
  await walkGraph(workflow.definition, runId, ctx, readyNodes, registry, workflow.id, secretKeys);
@@ -16527,6 +16681,38 @@ async function recoverRunningRuns(registry) {
16527
16681
  }
16528
16682
  return recovered;
16529
16683
  }
16684
+ function retryPendingNodeIds(steps) {
16685
+ const nodeIds = new Set;
16686
+ for (const step of steps) {
16687
+ if (step.status === "failed" && step.nextRetryAt != null)
16688
+ nodeIds.add(step.nodeId);
16689
+ }
16690
+ return nodeIds;
16691
+ }
16692
+ async function completeIfSettled(runId, ctx) {
16693
+ return getDbClient().transaction(async () => {
16694
+ const run = await getWorkflowRun(runId);
16695
+ if (run?.status !== "running")
16696
+ return false;
16697
+ const steps = await getWorkflowRunStepsByRunId(runId);
16698
+ if (retryPendingNodeIds(steps).size > 0)
16699
+ return false;
16700
+ const latest = new Map;
16701
+ for (const step of steps)
16702
+ latest.set(step.nodeId, step);
16703
+ for (const step of latest.values()) {
16704
+ if (step.status === "running" || step.status === "waiting" || step.status === "pending") {
16705
+ return false;
16706
+ }
16707
+ }
16708
+ await updateWorkflowRun(runId, {
16709
+ status: "completed",
16710
+ context: ctx,
16711
+ finishedAt: new Date().toISOString()
16712
+ });
16713
+ return true;
16714
+ });
16715
+ }
16530
16716
  async function recoverWaitingRuns(registry) {
16531
16717
  const stuckRuns = await getStuckWorkflowRuns();
16532
16718
  let recovered = 0;
@@ -16589,24 +16775,28 @@ async function recoverApprovalWaitingRuns(registry) {
16589
16775
  const workflow = await getWorkflow(stuck.workflowId);
16590
16776
  if (!run || !workflow)
16591
16777
  continue;
16592
- let approvalStatus = stuck.approvalStatus;
16593
- let responses = stuck.approvalResponses ? JSON.parse(stuck.approvalResponses) : null;
16594
- if (approvalStatus === "pending" && stuck.expiresAt) {
16595
- await resolveApprovalRequest(stuck.approvalId, {
16596
- status: "timeout"
16597
- });
16598
- approvalStatus = "timeout";
16599
- responses = null;
16600
- }
16601
- const nextPort = approvalStatus === "timeout" ? "timeout" : approvalStatus === "rejected" ? "rejected" : "approved";
16602
16778
  const ctx = run.context ?? {};
16603
- const stepOutput = {
16604
- requestId: stuck.approvalId,
16605
- status: approvalStatus,
16606
- responses
16607
- };
16608
- const routing = await checkpointPortStepAndResolveSuccessors(workflow.definition, stuck.runId, stuck.stepId, stuck.nodeId, stepOutput, nextPort, ctx);
16609
- if (!routing.claimed)
16779
+ const routing = await getDbClient().transaction(async () => {
16780
+ if (stuck.approvalStatus === "pending" && stuck.expiresAt) {
16781
+ await resolveApprovalRequest(stuck.approvalId, {
16782
+ status: "timeout",
16783
+ resolutionReason: `Timed out: no answer before ${stuck.expiresAt}`
16784
+ });
16785
+ }
16786
+ const approval = await getApprovalRequestById(stuck.approvalId);
16787
+ const approvalStatus = approval?.status;
16788
+ if (approvalStatus !== "approved" && approvalStatus !== "rejected" && approvalStatus !== "timeout") {
16789
+ return null;
16790
+ }
16791
+ const nextPort = approvalStatus === "timeout" ? "timeout" : approvalStatus === "rejected" ? "rejected" : "approved";
16792
+ const stepOutput = {
16793
+ requestId: stuck.approvalId,
16794
+ status: approvalStatus,
16795
+ responses: approval?.responses ?? null
16796
+ };
16797
+ return await checkpointPortStepAndResolveSuccessors(workflow.definition, stuck.runId, stuck.stepId, stuck.nodeId, stepOutput, nextPort, ctx);
16798
+ });
16799
+ if (!routing?.claimed)
16610
16800
  continue;
16611
16801
  if (routing.successors.length > 0) {
16612
16802
  const secretKeys = getSecretInputKeys(workflow.input);
@@ -16665,6 +16855,7 @@ function startRetryPoller(registry, intervalMs = 5000) {
16665
16855
  try {
16666
16856
  const retryableSteps = await getRetryableSteps();
16667
16857
  for (const step of retryableSteps) {
16858
+ let release;
16668
16859
  try {
16669
16860
  const run = await getWorkflowRun(step.runId);
16670
16861
  if (!run)
@@ -16676,17 +16867,9 @@ function startRetryPoller(registry, intervalMs = 5000) {
16676
16867
  if (!node)
16677
16868
  continue;
16678
16869
  console.log(`[workflows] Retrying step ${step.nodeId} (attempt ${step.retryCount}) for run ${step.runId}`);
16679
- if (run.status === "failed") {
16680
- await updateWorkflowRun(run.id, {
16681
- status: "running",
16682
- error: undefined
16683
- });
16684
- }
16685
- await updateWorkflowRunStep(step.id, {
16686
- status: "running",
16687
- error: undefined,
16688
- nextRetryAt: undefined
16689
- });
16870
+ release = holdWorkflowRun(run.id);
16871
+ if (!await claimRetry(run.id, step.id))
16872
+ continue;
16690
16873
  const ctx = run.context ?? {};
16691
16874
  if (!("run" in ctx))
16692
16875
  ctx.run = { id: run.id };
@@ -16722,6 +16905,7 @@ function startRetryPoller(registry, intervalMs = 5000) {
16722
16905
  if (!waiting)
16723
16906
  continue;
16724
16907
  } else {
16908
+ let validationPassed;
16725
16909
  if (node.validation) {
16726
16910
  const validationResult = await runStepValidation(registry, node, result.output, ctx, meta);
16727
16911
  if (validationResult.outcome === "halt") {
@@ -16738,18 +16922,16 @@ function startRetryPoller(registry, intervalMs = 5000) {
16738
16922
  await checkpointStepFailure(run.id, step.id, "Validation failed, retrying", step.retryCount, retryPolicy);
16739
16923
  continue;
16740
16924
  }
16925
+ validationPassed = validationResult.passed;
16741
16926
  }
16927
+ result.nextPort = resolveValidationPort(node.next, result.nextPort, validationPassed);
16742
16928
  await checkpointStep(run.id, step.id, step.nodeId, result, ctx);
16743
16929
  const port = result.nextPort || "default";
16744
16930
  const successors = getSuccessors(workflow.definition, step.nodeId, port);
16745
16931
  if (successors.length > 0) {
16746
16932
  await walkGraph(workflow.definition, run.id, ctx, successors, registry, workflow.id);
16747
16933
  } else {
16748
- await updateWorkflowRun(run.id, {
16749
- status: "completed",
16750
- context: ctx,
16751
- finishedAt: new Date().toISOString()
16752
- });
16934
+ await completeRunIfSettled(run.id, ctx);
16753
16935
  }
16754
16936
  }
16755
16937
  } catch (err) {
@@ -16759,6 +16941,8 @@ function startRetryPoller(registry, intervalMs = 5000) {
16759
16941
  }
16760
16942
  } catch (err) {
16761
16943
  console.error(`[workflows] Retry failed for step ${step.id}:`, err);
16944
+ } finally {
16945
+ release?.();
16762
16946
  }
16763
16947
  }
16764
16948
  } catch (err) {
@@ -16768,6 +16952,40 @@ function startRetryPoller(registry, intervalMs = 5000) {
16768
16952
  }
16769
16953
  pollerTimeout = setTimeout(poll, intervalMs);
16770
16954
  }
16955
+ async function claimRetry(runId, stepId) {
16956
+ return getDbClient().transaction(async () => {
16957
+ const run = await getWorkflowRun(runId);
16958
+ if (!run || !RETRYABLE_RUN_STATUSES.has(run.status))
16959
+ return false;
16960
+ const claimed = await getDbClient().get(`UPDATE workflow_run_steps
16961
+ SET status = 'running', nextRetryAt = NULL
16962
+ WHERE id = ? AND runId = ? AND status = 'failed' AND nextRetryAt IS NOT NULL
16963
+ RETURNING id`, [stepId, runId]);
16964
+ if (!claimed)
16965
+ return false;
16966
+ if (run.status === "failed") {
16967
+ await updateWorkflowRun(runId, { status: "running", error: undefined });
16968
+ }
16969
+ return true;
16970
+ });
16971
+ }
16972
+ async function completeRunIfSettled(runId, ctx) {
16973
+ await getDbClient().transaction(async () => {
16974
+ const run = await getWorkflowRun(runId);
16975
+ if (!run || run.status !== "running" && run.status !== "waiting")
16976
+ return;
16977
+ const steps = await getWorkflowRunStepsByRunId(runId);
16978
+ const live = steps.some((s) => s.status === "running" || s.status === "waiting" || s.status === "failed" && s.nextRetryAt != null);
16979
+ if (live)
16980
+ return;
16981
+ await updateWorkflowRun(runId, {
16982
+ status: "completed",
16983
+ context: ctx,
16984
+ finishedAt: new Date().toISOString()
16985
+ });
16986
+ });
16987
+ }
16988
+ var RETRYABLE_RUN_STATUSES = new Set(["running", "waiting", "failed"]);
16771
16989
  function stopRetryPoller() {
16772
16990
  if (pollerTimeout !== null) {
16773
16991
  clearTimeout(pollerTimeout);
@@ -17394,7 +17612,8 @@ async function prepareStandaloneScheduleTask(schedule, extraTags = []) {
17394
17612
  source: "schedule",
17395
17613
  requestedByUserId: schedule.createdBy,
17396
17614
  contextKey: scheduleContextKey({ scheduleId: schedule.id }),
17397
- parentTaskId: schedule.parentTaskId
17615
+ parentTaskId: schedule.parentTaskId,
17616
+ inheritParentFollowUpConfig: schedule.taskType === "deferred" && !!schedule.parentTaskId
17398
17617
  }, { origin: "schedule" });
17399
17618
  }
17400
17619
  async function createStandaloneScheduleTask(schedule, extraTags = [], prepared) {
@@ -27773,7 +27992,7 @@ async function notifySlack(text) {
27773
27992
  return;
27774
27993
  }
27775
27994
  try {
27776
- const { getSlackApp: getSlackApp2 } = await import("./app-enysy1zd.js");
27995
+ const { getSlackApp: getSlackApp2 } = await import("./app-g26wdcz6.js");
27777
27996
  const app = getSlackApp2();
27778
27997
  if (!app) {
27779
27998
  console.warn("[Jira webhook keepalive] Slack not available, cannot send notification");
@@ -27844,7 +28063,7 @@ async function deleteJiraWebhook(webhookId) {
27844
28063
  console.log(`[Jira webhook keepalive] Deleted webhook id=${webhookId}`);
27845
28064
  }
27846
28065
  async function overwriteWebhookIds(next) {
27847
- const { getDbClient: getDbClient2 } = await import("./db-w8ghhsgf.js");
28066
+ const { getDbClient: getDbClient2 } = await import("./db-03v9kzr2.js");
27848
28067
  await getDbClient2().transaction(async (tx) => {
27849
28068
  const row = await tx.get("SELECT metadata FROM oauth_apps WHERE provider = 'jira'");
27850
28069
  if (!row) {
@@ -100323,6 +100542,19 @@ async function handleTaskProgress(data) {
100323
100542
  console.error(`[Linear Outbound] Failed to post progress action for task ${taskId}:`, err);
100324
100543
  });
100325
100544
  }
100545
+ var LINEAR_BODY_MAX = 30000;
100546
+ function formatLinearOutcomeBody(text, taskId) {
100547
+ if (text.length <= LINEAR_BODY_MAX)
100548
+ return text;
100549
+ const dashboardUrl = (process.env.SWARM_DASHBOARD_URL || process.env.APP_URL)?.replace(/\/+$/, "");
100550
+ const where = dashboardUrl ? `${dashboardUrl}/tasks/${taskId}` : `swarm task \`${taskId}\``;
100551
+ const note = (shown2) => `
100552
+
100553
+ ---
100554
+ _Truncated: showing ${shown2} of ${text.length} characters. Full text: ${where}_`;
100555
+ const shown = LINEAR_BODY_MAX - note(LINEAR_BODY_MAX).length;
100556
+ return `${text.slice(0, shown).trimEnd()}${note(shown)}`;
100557
+ }
100326
100558
  async function handleTaskCompleted2(data) {
100327
100559
  const { taskId, output } = data;
100328
100560
  if (!taskId)
@@ -100333,11 +100565,7 @@ async function handleTaskCompleted2(data) {
100333
100565
  if (shouldSkipForLoopPrevention2(sync))
100334
100566
  return;
100335
100567
  const sessionId = taskSessionMap.get(taskId);
100336
- const body = output ? `Task completed.
100337
-
100338
- +++ Output
100339
- ${output.slice(0, 2000)}
100340
- +++` : "Task completed.";
100568
+ const body = output?.trim() ? formatLinearOutcomeBody(output, taskId) : "Task completed.";
100341
100569
  if (sessionId) {
100342
100570
  endAgentSession(sessionId, body, "response").catch((err) => {
100343
100571
  console.error(`[Linear Outbound] Failed to end AgentSession for task ${taskId}:`, err);
@@ -100353,12 +100581,7 @@ ${output.slice(0, 2000)}
100353
100581
  console.log("[Linear Outbound] No Linear client available, skipping sync for", taskId);
100354
100582
  return;
100355
100583
  }
100356
- const comment = output ? `Task completed by swarm agent.
100357
-
100358
- +++ Output
100359
- ${output.slice(0, 2000)}
100360
- +++` : "Task completed by swarm agent.";
100361
- await client.createComment({ issueId: sync.externalId, body: comment });
100584
+ await client.createComment({ issueId: sync.externalId, body });
100362
100585
  console.log(`[Linear Outbound] Posted completion comment for task ${taskId}`);
100363
100586
  } catch (error) {
100364
100587
  console.error(`[Linear Outbound] Failed to sync task completion for ${taskId}:`, error instanceof Error ? error.message : error);
@@ -100379,11 +100602,9 @@ async function handleTaskFailed2(data) {
100379
100602
  if (shouldSkipForLoopPrevention2(sync))
100380
100603
  return;
100381
100604
  const sessionId = taskSessionMap.get(taskId);
100382
- const body = failureReason ? `Task failed.
100605
+ const body = failureReason?.trim() ? formatLinearOutcomeBody(`Task failed.
100383
100606
 
100384
- +++ Error Details
100385
- ${failureReason.slice(0, 2000)}
100386
- +++` : "Task failed.";
100607
+ ${failureReason}`, taskId) : "Task failed.";
100387
100608
  if (sessionId) {
100388
100609
  endAgentSession(sessionId, body, "error").catch((err) => {
100389
100610
  console.error(`[Linear Outbound] Failed to end AgentSession for task ${taskId}:`, err);
@@ -100399,12 +100620,7 @@ ${failureReason.slice(0, 2000)}
100399
100620
  console.log("[Linear Outbound] No Linear client available, skipping sync for", taskId);
100400
100621
  return;
100401
100622
  }
100402
- const comment = failureReason ? `Task failed.
100403
-
100404
- +++ Error Details
100405
- ${failureReason.slice(0, 2000)}
100406
- +++` : "Task failed.";
100407
- await client.createComment({ issueId: sync.externalId, body: comment });
100623
+ await client.createComment({ issueId: sync.externalId, body });
100408
100624
  console.log(`[Linear Outbound] Posted failure comment for task ${taskId}`);
100409
100625
  } catch (error) {
100410
100626
  console.error(`[Linear Outbound] Failed to sync task failure for ${taskId}:`, error instanceof Error ? error.message : error);
@@ -101579,7 +101795,7 @@ async function reloadGlobalConfigsAndIntegrations() {
101579
101795
  return runWithoutRequestAuth(() => reloadGlobalConfigsAndIntegrationsInner());
101580
101796
  }
101581
101797
  async function reloadGlobalConfigsAndIntegrationsInner() {
101582
- const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-dc2ek6bw.js");
101798
+ const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-c6zsv1bd.js");
101583
101799
  const wasEmbeddingsConfigured = getEmbeddingProvider2().isConfigured();
101584
101800
  const updated = await loadGlobalConfigsIntoEnv(true);
101585
101801
  await stopSlackApp();
@@ -101592,10 +101808,10 @@ async function reloadGlobalConfigsAndIntegrationsInner() {
101592
101808
  integrations.push("embeddings");
101593
101809
  }
101594
101810
  if (!wasEmbeddingsConfigured && isEmbeddingsConfigured) {
101595
- import("./boot-reembed-zfxb937k.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
101811
+ import("./boot-reembed-se8zmdcp.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
101596
101812
  console.error("[config-reload] memory backfill failed (non-fatal):", err);
101597
101813
  });
101598
- import("./boot-reembed-r6shx5qx.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
101814
+ import("./boot-reembed-g5ckg9yb.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
101599
101815
  console.error("[config-reload] script backfill failed (non-fatal):", err);
101600
101816
  });
101601
101817
  }
@@ -102408,7 +102624,7 @@ function setPreloadedTools(server, names) {
102408
102624
  async function applyPreToolCall(name, args, requestInfo, inputSchema) {
102409
102625
  if (requestInfo.callOrigin !== "mcp")
102410
102626
  return { args };
102411
- const dispatcher = await import("./dispatcher-cp1rknjz.js");
102627
+ const dispatcher = await import("./dispatcher-nrmg8yht.js");
102412
102628
  const result = await dispatcher.dispatchPre("pre.tool.call", { tool: name, args, requestInfo }, inputSchema ? {
102413
102629
  validateModify: async (data) => {
102414
102630
  const schema = normalizeObjectSchema(inputSchema) ?? inputSchema;
@@ -102631,6 +102847,7 @@ init_secret_scrubber();
102631
102847
 
102632
102848
  // src/apps/row-store.ts
102633
102849
  init_db();
102850
+ init_db_client();
102634
102851
  class AppRowValidationError extends Error {
102635
102852
  issues;
102636
102853
  constructor(issues) {
@@ -102648,6 +102865,9 @@ class AppRowAppNotFoundError extends Error {
102648
102865
  }
102649
102866
  var mutationChains = new Map;
102650
102867
  var lastCreatedAtMs = 0;
102868
+ function yieldToEventLoop() {
102869
+ return new Promise((resolve) => setImmediate(resolve));
102870
+ }
102651
102871
  function appsNamespace(appId2) {
102652
102872
  return `apps:${appId2}`;
102653
102873
  }
@@ -102840,11 +103060,12 @@ async function getAppRow(appId2, model, rowId) {
102840
103060
  }
102841
103061
  return entry.value;
102842
103062
  }
102843
- async function listAppRows(appId2, model) {
103063
+ async function listAppRows(appId2, model, equals = []) {
102844
103064
  const entries = await listKv(appsNamespace(appId2), {
102845
103065
  prefix: `${model}/row/`,
102846
103066
  limit: 1e5,
102847
- offset: 0
103067
+ offset: 0,
103068
+ jsonFieldEquals: equals.filter((filter) => !/["\\]/.test(filter.column)).map((filter) => ({ field: filter.column, value: filter.value }))
102848
103069
  });
102849
103070
  return entries.map((entry) => entry.value).filter((value) => typeof value === "object" && value !== null && !Array.isArray(value));
102850
103071
  }
@@ -102853,18 +103074,32 @@ async function listAllAppRowsForMigrationUnlocked(appId2, model) {
102853
103074
  const rows = [];
102854
103075
  const namespace2 = appsNamespace(appId2);
102855
103076
  const prefix = `${model}/row/`;
102856
- let offset = 0;
103077
+ const upper = kvPrefixUpperBound(prefix);
103078
+ let afterKey = "";
102857
103079
  while (true) {
102858
- const entries = await listKv(namespace2, { prefix, limit: MIGRATION_KV_BATCH_SIZE, offset });
102859
- for (const entry of entries) {
102860
- const value = entry.value;
103080
+ const page = await getDbClient().query(`SELECT key, value, value_type FROM kv_entries
103081
+ WHERE namespace = ? AND key >= ? AND key < ? AND key > ?
103082
+ AND (expires_at IS NULL OR expires_at > ?)
103083
+ ORDER BY key
103084
+ LIMIT ?`, [namespace2, prefix, upper, afterKey, Date.now(), MIGRATION_KV_BATCH_SIZE]);
103085
+ for (const entry of page) {
103086
+ if (entry.value_type !== "json")
103087
+ continue;
103088
+ let value;
103089
+ try {
103090
+ value = JSON.parse(entry.value);
103091
+ } catch {
103092
+ continue;
103093
+ }
102861
103094
  if (typeof value === "object" && value !== null && !Array.isArray(value)) {
102862
103095
  rows.push(value);
102863
103096
  }
102864
103097
  }
102865
- if (entries.length < MIGRATION_KV_BATCH_SIZE)
103098
+ if (page.length < MIGRATION_KV_BATCH_SIZE)
102866
103099
  return rows;
102867
- offset += entries.length;
103100
+ afterKey = page[page.length - 1].key;
103101
+ if (!isInTransaction())
103102
+ await yieldToEventLoop();
102868
103103
  }
102869
103104
  }
102870
103105
  function patchAppRow(appId2, model, _definition, rowId, values, options = {}) {
@@ -102962,14 +103197,16 @@ function deleteAppRow(appId2, model, _definition, rowId) {
102962
103197
  return true;
102963
103198
  });
102964
103199
  }
103200
+ var PURGE_BATCH_SIZE = 1000;
102965
103201
  async function purgeNamespace(appId2) {
102966
103202
  const namespace2 = appsNamespace(appId2);
102967
103203
  while (true) {
102968
- const entries = await listKv(namespace2, { prefix: "", limit: 1e5, offset: 0 });
102969
- if (entries.length === 0)
103204
+ const result = await getDbClient().run(`DELETE FROM kv_entries
103205
+ WHERE namespace = ?
103206
+ AND key IN (SELECT key FROM kv_entries WHERE namespace = ? ORDER BY key LIMIT ?)`, [namespace2, namespace2, PURGE_BATCH_SIZE]);
103207
+ if (result.changes === 0)
102970
103208
  return;
102971
- for (const entry of entries)
102972
- await deleteKv(namespace2, entry.key);
103209
+ await yieldToEventLoop();
102973
103210
  }
102974
103211
  }
102975
103212
  function purgeAppRows(appId2, models, afterPurge) {
@@ -103318,6 +103555,30 @@ function pairFingerprint(model, sourceName, source) {
103318
103555
  }));
103319
103556
  return JSON.stringify({ source, bindings });
103320
103557
  }
103558
+ var RECONCILE_CHUNK_SIZE = 200;
103559
+ async function writeInChunks(items, counts, write) {
103560
+ for (let start = 0;start < items.length; start += RECONCILE_CHUNK_SIZE) {
103561
+ const chunk = items.slice(start, start + RECONCILE_CHUNK_SIZE);
103562
+ const tally = await getDbClient().transaction(async () => {
103563
+ const chunkTally = {
103564
+ created: 0,
103565
+ updated: 0,
103566
+ refreshed: 0,
103567
+ unchanged: 0,
103568
+ markedStale: 0
103569
+ };
103570
+ for (const item of chunk)
103571
+ await write(item, chunkTally);
103572
+ return chunkTally;
103573
+ });
103574
+ counts.created += tally.created;
103575
+ counts.updated += tally.updated;
103576
+ counts.refreshed += tally.refreshed;
103577
+ counts.unchanged += tally.unchanged;
103578
+ counts.markedStale += tally.markedStale;
103579
+ await yieldToEventLoop();
103580
+ }
103581
+ }
103321
103582
  function reconcile(args) {
103322
103583
  const { appId: appId2, model, sourceName, joinKey, pull, warnings, counts } = args;
103323
103584
  return withMutationLock(appId2, model, async () => {
@@ -103344,7 +103605,7 @@ function reconcile(args) {
103344
103605
  const now = new Date().toISOString();
103345
103606
  const actor = `sync:${sourceName}`;
103346
103607
  const seen = new Set;
103347
- for (const record3 of pull.records) {
103608
+ await writeInChunks(pull.records, counts, async (record3, tally) => {
103348
103609
  if (seen.has(record3.key)) {
103349
103610
  warn(warnings, `source returned duplicate key "${record3.key}"; the last record wins`);
103350
103611
  }
@@ -103359,8 +103620,8 @@ function reconcile(args) {
103359
103620
  actor
103360
103621
  });
103361
103622
  mine.set(record3.key, created);
103362
- counts.created += 1;
103363
- continue;
103623
+ tally.created += 1;
103624
+ return;
103364
103625
  }
103365
103626
  const differs = Object.entries(values).some(([name, value]) => !sameValue(existing[name], value));
103366
103627
  const updated = await patchAppRowUnlocked(appId2, model, modelDef, existing.id, values, {
@@ -103371,14 +103632,14 @@ function reconcile(args) {
103371
103632
  });
103372
103633
  if (!updated) {
103373
103634
  warn(warnings, `row "${existing.id}" vanished before it could be updated`);
103374
- continue;
103635
+ return;
103375
103636
  }
103376
103637
  mine.set(record3.key, updated);
103377
103638
  if (differs)
103378
- counts.updated += 1;
103639
+ tally.updated += 1;
103379
103640
  else
103380
- counts.refreshed += 1;
103381
- }
103641
+ tally.refreshed += 1;
103642
+ });
103382
103643
  const unseen = [...mine.entries()].filter(([key]) => !seen.has(key)).map(([, row]) => row).concat(unkeyed);
103383
103644
  if (!pull.complete) {
103384
103645
  counts.staleSweepSkipped = true;
@@ -103386,10 +103647,10 @@ function reconcile(args) {
103386
103647
  warn(warnings, "pull reported an incomplete window; stale sweep skipped");
103387
103648
  return;
103388
103649
  }
103389
- for (const row of unseen) {
103650
+ await writeInChunks(unseen, counts, async (row, tally) => {
103390
103651
  if (row.stale === true) {
103391
- counts.unchanged += 1;
103392
- continue;
103652
+ tally.unchanged += 1;
103653
+ return;
103393
103654
  }
103394
103655
  await patchAppRowUnlocked(appId2, model, modelDef, row.id, {}, {
103395
103656
  allowSourceManaged: true,
@@ -103400,8 +103661,8 @@ function reconcile(args) {
103400
103661
  stale: true
103401
103662
  }
103402
103663
  });
103403
- counts.markedStale += 1;
103404
- }
103664
+ tally.markedStale += 1;
103665
+ });
103405
103666
  });
103406
103667
  }
103407
103668
  var inFlight = new Map;
@@ -105561,7 +105822,7 @@ async function handleApps(req, res, pathSegments, queryParams, myAgentId) {
105561
105822
  json(res, { error: "invalid row query", issues }, 400);
105562
105823
  return true;
105563
105824
  }
105564
- const rows = (await listAppRows(parsed.params.id, parsed.params.model)).filter((row) => filters.every((filter) => rowValue(row, filter.column) === filter.value));
105825
+ const rows = (await listAppRows(parsed.params.id, parsed.params.model, filters.flatMap((filter) => typeof filter.value === "string" || typeof filter.value === "number" || typeof filter.value === "boolean" ? [{ column: filter.column, value: filter.value }] : []))).filter((row) => filters.every((filter) => rowValue(row, filter.column) === filter.value));
105565
105826
  const sortRaw = parsed.query.sort;
105566
105827
  if (sortRaw) {
105567
105828
  const [column, dir, extra] = sortRaw.split(":");
@@ -106717,6 +106978,148 @@ var registerAppUpsertTool = (server) => {
106717
106978
  });
106718
106979
  };
106719
106980
 
106981
+ // src/tools/cancel-approval-request.ts
106982
+ init_zod();
106983
+ init_db();
106984
+
106985
+ // src/workflows/approval-cancel.ts
106986
+ init_db();
106987
+ var LIVE_RUN_STATUSES = new Set(["running", "waiting"]);
106988
+ async function cancelApprovalRequest(input) {
106989
+ const finalReason = input.reason ?? "Cancelled through the API";
106990
+ let authorized = false;
106991
+ for (let attempt = 0;attempt < 3; attempt++) {
106992
+ const existing = await getApprovalRequestById(input.id);
106993
+ if (!existing)
106994
+ return { ok: false, status: 404, message: "Approval request not found" };
106995
+ if (existing.status === "cancelled") {
106996
+ return { ok: true, request: existing, alreadyCancelled: true, runCancelled: false };
106997
+ }
106998
+ if (existing.status !== "pending") {
106999
+ return {
107000
+ ok: false,
107001
+ status: 409,
107002
+ message: `Approval request already resolved with status: ${existing.status}`
107003
+ };
107004
+ }
107005
+ if (!authorized) {
107006
+ const ownerAgentId = existing.sourceTaskId ? (await getTaskById(existing.sourceTaskId))?.agentId ?? null : null;
107007
+ const decision = can({
107008
+ principal: input.principal,
107009
+ verb: "approval.cancel.any",
107010
+ resource: { kind: "owned", ownerAgentId },
107011
+ source: input.source ?? "http"
107012
+ });
107013
+ if (!decision.allow)
107014
+ return { ok: false, status: 403, message: decision.reason };
107015
+ authorized = true;
107016
+ }
107017
+ const result = await cancelApprovalRequestAndRun(input.id, {
107018
+ reason: finalReason,
107019
+ resolvedBy: input.resolvedBy
107020
+ });
107021
+ if (!result)
107022
+ continue;
107023
+ if ("timedOut" in result) {
107024
+ return {
107025
+ ok: false,
107026
+ status: 409,
107027
+ message: `Approval request expired at ${result.timedOut.expiresAt}`
107028
+ };
107029
+ }
107030
+ return {
107031
+ ok: true,
107032
+ request: result.request,
107033
+ alreadyCancelled: false,
107034
+ runCancelled: result.runCancelled
107035
+ };
107036
+ }
107037
+ return { ok: false, status: 409, message: "Approval request changed during cancellation" };
107038
+ }
107039
+ async function cancelApprovalRequestAndRun(id, data) {
107040
+ const client = getDbClient();
107041
+ return await client.transaction(async () => {
107042
+ const current = await getApprovalRequestById(id);
107043
+ if (current?.status === "pending" && current.expiresAt && new Date(current.expiresAt) < new Date) {
107044
+ const timedOut = await resolveApprovalRequest(id, {
107045
+ status: "timeout",
107046
+ resolutionReason: `Timed out: the cancellation arrived after the deadline ${current.expiresAt}`
107047
+ });
107048
+ if (!timedOut)
107049
+ return null;
107050
+ await createApprovalFollowUpTask(timedOut, "hitl.timeout");
107051
+ return { timedOut };
107052
+ }
107053
+ const request = await cancelApprovalRequestById(id, {
107054
+ reason: data.reason,
107055
+ resolvedBy: data.resolvedBy
107056
+ });
107057
+ if (!request)
107058
+ return null;
107059
+ let runCancelled = false;
107060
+ const runId = request.workflowRunId;
107061
+ if (runId) {
107062
+ const run = await getWorkflowRun(runId);
107063
+ if (run && LIVE_RUN_STATUSES.has(run.status)) {
107064
+ runCancelled = await cancelWorkflowRunRows(runId, data.reason);
107065
+ }
107066
+ }
107067
+ const slackReason = data.slackReason ?? data.reason;
107068
+ client.afterCommit(async () => {
107069
+ await postApprovalCancellationUpdates([request], slackReason);
107070
+ if (runCancelled && runId) {
107071
+ const others = (await listCancelledApprovalRequestsForRun(runId)).filter((row) => row.id !== request.id);
107072
+ await postApprovalCancellationUpdates(others, data.reason);
107073
+ }
107074
+ });
107075
+ return { request, runCancelled };
107076
+ });
107077
+ }
107078
+
107079
+ // src/tools/cancel-approval-request.ts
107080
+ var cancelApprovalRequestInputSchema = object({
107081
+ requestId: uuid().describe("The ID of the approval request to cancel."),
107082
+ reason: string().max(500).optional().describe("Reason for cancellation.")
107083
+ });
107084
+ var cancelApprovalRequestOutputSchema = swarmToolOutputSchema({
107085
+ yourAgentId: string().optional(),
107086
+ approvalRequest: looseObject({}).optional(),
107087
+ alreadyCancelled: boolean().optional(),
107088
+ runCancelled: boolean().optional()
107089
+ });
107090
+ var registerCancelApprovalRequestTool = (server) => {
107091
+ createToolRegistrar(server)("cancel-approval-request", {
107092
+ title: "Cancel approval request",
107093
+ description: "Cancel a pending approval request by id. Allowed for a lead agent, or for the agent that owns the request's source task. If the request gates a running or waiting workflow run, that run is cancelled too. A request whose explicit timeout passed is already 'timeout' and cannot be cancelled.",
107094
+ annotations: { destructiveHint: true },
107095
+ inputSchema: cancelApprovalRequestInputSchema,
107096
+ outputSchema: cancelApprovalRequestOutputSchema
107097
+ }, async ({ requestId, reason }, info) => {
107098
+ if (!info.agentId) {
107099
+ return toolErr('Agent ID not found. Set the "X-Agent-ID" header.');
107100
+ }
107101
+ const agent = await getAgentById(info.agentId);
107102
+ const result = await cancelApprovalRequest({
107103
+ id: requestId,
107104
+ reason,
107105
+ principal: { kind: "agent", agentId: info.agentId, isLead: agent?.isLead ?? false },
107106
+ resolvedBy: info.agentId,
107107
+ source: "mcp"
107108
+ });
107109
+ if (!result.ok) {
107110
+ return toolErr(result.message, { data: { yourAgentId: info.agentId } });
107111
+ }
107112
+ const data = {
107113
+ yourAgentId: info.agentId,
107114
+ approvalRequest: result.request,
107115
+ alreadyCancelled: result.alreadyCancelled,
107116
+ runCancelled: result.runCancelled
107117
+ };
107118
+ const message = result.alreadyCancelled ? `Approval request "${requestId}" was already cancelled.` : `Approval request "${requestId}" cancelled${result.runCancelled ? ", and its workflow run with it" : ""}.`;
107119
+ return toolOk(message, { data, details: JSON.stringify(data, null, 2) });
107120
+ });
107121
+ };
107122
+
106720
107123
  // src/tools/cancel-task.ts
106721
107124
  init_zod();
106722
107125
  init_db();
@@ -108460,8 +108863,8 @@ async function recordRetrievals(taskId, agentId, results, sessionId, extras) {
108460
108863
  if (!taskId || results.length === 0)
108461
108864
  return;
108462
108865
  const insertSql = `INSERT INTO memory_retrieval
108463
- (id, taskId, agentId, sessionId, memoryId, similarity, retrievedAt, contextKey, intent, eventType, retrievalId, rank, retrievalSource)
108464
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
108866
+ (id, taskId, agentId, sessionId, memoryId, similarity, retrievedAt, contextKey, intent, eventType, retrievalId, rank, retrievalSource, relevance)
108867
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
108465
108868
  const now = new Date().toISOString();
108466
108869
  const retrievalId = crypto.randomUUID();
108467
108870
  const contextKey = extras?.contextKey ?? null;
@@ -108482,7 +108885,8 @@ async function recordRetrievals(taskId, agentId, results, sessionId, extras) {
108482
108885
  eventType,
108483
108886
  retrievalId,
108484
108887
  rank,
108485
- r.retrievalSource ?? null
108888
+ r.retrievalSource ?? null,
108889
+ r.relevance ?? null
108486
108890
  ]);
108487
108891
  }
108488
108892
  });
@@ -109049,6 +109453,7 @@ async function createResumeFollowUp(args) {
109049
109453
  tags,
109050
109454
  priority,
109051
109455
  parentTaskId: parent.id,
109456
+ inheritParentFollowUpConfig: true,
109052
109457
  routingAffinity
109053
109458
  });
109054
109459
  if (authorizationDecision) {
@@ -112479,6 +112884,7 @@ async function expandCandidatesWithGraph(candidates, agentId, options = {}) {
112479
112884
  neighbors.set(row.id, {
112480
112885
  ...rowToCandidate(row, similarity),
112481
112886
  retrievalSource: "graph",
112887
+ graphParentId: parent.id,
112482
112888
  recencyDecayApplied: false
112483
112889
  });
112484
112890
  }
@@ -112492,7 +112898,9 @@ async function expandCandidatesWithGraph(candidates, agentId, options = {}) {
112492
112898
  for (const neighbor of ranked) {
112493
112899
  const existingIndex = indexById.get(neighbor.id);
112494
112900
  if (existingIndex !== undefined) {
112495
- if (computeScore(neighbor, now) > computeScore(result[existingIndex], now)) {
112901
+ const parent = parentById.get(neighbor.graphParentId);
112902
+ const graphScore = Math.min(computeScore(neighbor, now), computeScore(parent, now));
112903
+ if (graphScore > computeScore(result[existingIndex], now)) {
112496
112904
  result[existingIndex] = neighbor;
112497
112905
  }
112498
112906
  continue;
@@ -112580,6 +112988,7 @@ var registerMemorySearchTool = (server) => {
112580
112988
  await recordRetrievals(requestInfo.sourceTaskId, requestInfo.agentId, ranked.map((r) => ({
112581
112989
  memoryId: r.id,
112582
112990
  similarity: r.similarity,
112991
+ relevance: r.rawSimilarity,
112583
112992
  retrievalSource: r.retrievalSource
112584
112993
  })), requestInfo.sessionId, { intent, contextKey: requestInfo.contextKey, eventType: "search" });
112585
112994
  } catch (err) {
@@ -112769,9 +113178,9 @@ function hardSplit(text) {
112769
113178
  while (start < text.length) {
112770
113179
  const end = Math.min(start + MAX_CHUNK_SIZE, text.length);
112771
113180
  chunks.push(text.slice(start, end).trim());
112772
- start = end - CHUNK_OVERLAP;
112773
- if (start >= text.length - MIN_CHUNK_SIZE)
113181
+ if (end === text.length)
112774
113182
  break;
113183
+ start = end - CHUNK_OVERLAP;
112775
113184
  }
112776
113185
  return chunks.filter((c) => c.length > 0);
112777
113186
  }
@@ -114413,11 +114822,11 @@ var registerRequestHumanInputTool = (server) => {
114413
114822
  createToolRegistrar(server)("request-human-input", {
114414
114823
  title: "Request human input",
114415
114824
  annotations: { destructiveHint: false },
114416
- description: "Create an approval request that pauses until a human responds. " + "Supports multiple question types: approval (yes/no), text, single-select, " + "multi-select, and boolean. Returns the request ID and URL for the human to respond.",
114825
+ description: "Create an approval request and return at once with the request id and URL. The answer arrives later as a hitl-follow-up task. " + "Supports multiple question types: approval (yes/no), text, single-select, " + "multi-select, and boolean. Returns the request ID and URL for the human to respond.",
114417
114826
  inputSchema: object({
114418
114827
  title: string().min(1).describe("Title of the approval request"),
114419
114828
  questions: array(QuestionSchema).min(1).describe("Questions to ask the human"),
114420
- timeoutSeconds: number().int().min(1).optional().describe("Timeout in seconds (auto-rejects on timeout)")
114829
+ timeoutSeconds: number().int().min(1).optional().describe("Seconds until the request expires. After that the request becomes 'timeout' and you get a hitl-follow-up task. A request with no timeout is cancelled after APPROVAL_REQUEST_AUTO_CANCELLATION_DAYS days (default 7).")
114421
114830
  }),
114422
114831
  outputSchema: swarmToolOutputSchema({
114423
114832
  yourAgentId: string().optional(),
@@ -121253,6 +121662,10 @@ async function getEventsFiltered(filters) {
121253
121662
  conditions.push("event = ?");
121254
121663
  params2.push(filters.event);
121255
121664
  }
121665
+ if (filters.events && filters.events.length > 0) {
121666
+ conditions.push(`event IN (${filters.events.map(() => "?").join(", ")})`);
121667
+ params2.push(...filters.events);
121668
+ }
121256
121669
  if (filters.status) {
121257
121670
  conditions.push("status = ?");
121258
121671
  params2.push(filters.status);
@@ -121285,8 +121698,24 @@ async function getEventsFiltered(filters) {
121285
121698
  conditions.push("createdAt <= ?");
121286
121699
  params2.push(filters.until);
121287
121700
  }
121288
- const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
121289
121701
  const limit = filters.limit ?? 100;
121702
+ if (filters.latestPerDataField) {
121703
+ const lookups = [];
121704
+ const lookupParams = [];
121705
+ for (const event of filters.latestPerDataField.events) {
121706
+ for (const field of filters.latestPerDataField.dataFields) {
121707
+ const where2 = [...conditions, "event = ?", "json_extract(data, '$.field') = ?"];
121708
+ lookups.push(`SELECT * FROM (SELECT * FROM events WHERE ${where2.join(" AND ")} ORDER BY createdAt DESC LIMIT 1)`);
121709
+ lookupParams.push(...params2, event, field);
121710
+ }
121711
+ }
121712
+ if (lookups.length === 0)
121713
+ return [];
121714
+ const sql2 = `${lookups.join(" UNION ALL ")} ORDER BY createdAt DESC LIMIT ?`;
121715
+ const rows2 = await getDbClient().query(sql2, [...lookupParams, limit]);
121716
+ return rows2.map(rowToSwarmEvent);
121717
+ }
121718
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
121290
121719
  params2.push(limit);
121291
121720
  const sql = `SELECT * FROM events ${where} ORDER BY createdAt DESC LIMIT ?`;
121292
121721
  const rows = await getDbClient().query(sql, params2);
@@ -122999,6 +123428,7 @@ async function sendTaskHandler(ctx, {
122999
123428
  slackUserId,
123000
123429
  overrideSlackContext,
123001
123430
  followUpConfig,
123431
+ inheritParentFollowUpConfig: taskType === "resume",
123002
123432
  outputSchema,
123003
123433
  routingReason: effectiveRoutingReason,
123004
123434
  routingSource: effectiveRoutingSource,
@@ -128103,7 +128533,8 @@ async function listWorkflowRunsHandler({
128103
128533
  const { runs, page } = await listWorkflowRunsPage(workflowId, {
128104
128534
  status,
128105
128535
  limit,
128106
- offset
128536
+ offset,
128537
+ includeContext
128107
128538
  });
128108
128539
  const resultRuns = includeContext ? runs : runs.map(slimRun);
128109
128540
  return toolOk(`Found ${runs.length} run(s) at offset ${page.offset} (${page.total} total).`, {
@@ -128585,10 +129016,10 @@ async function createServer(opts = {}) {
128585
129016
  await loadGlobalConfigsIntoEnv(true);
128586
129017
  const hasCapability2 = (cap) => opts.fullSurface === true || getCapabilities().has(cap);
128587
129018
  initDb(process.env.DATABASE_PATH);
128588
- seedPricingFromModelsDev();
129019
+ ensurePricingSeeded();
128589
129020
  startPricingRefreshLoop();
128590
129021
  try {
128591
- ensureRbacSeedsSynced();
129022
+ ensureRbacSeeded();
128592
129023
  } catch (err) {
128593
129024
  console.error("[startup] Failed to sync RBAC seed rows:", err);
128594
129025
  if (isRbacEnabled())
@@ -128727,6 +129158,7 @@ async function createServer(opts = {}) {
128727
129158
  registerRetryWorkflowRunTool(server);
128728
129159
  registerCancelWorkflowRunTool(server);
128729
129160
  registerRequestHumanInputTool(server);
129161
+ registerCancelApprovalRequestTool(server);
128730
129162
  }
128731
129163
  if (hasCapability2("skills")) {
128732
129164
  registerSkillCreateTool(server);
@@ -128953,7 +129385,8 @@ var SDK_TOOL_NAME_MAP = {
128953
129385
  page_create: "create_page",
128954
129386
  page_delete: "delete-page",
128955
129387
  metric_create: "create_metric",
128956
- request_humanInput: "request-human-input"
129388
+ request_humanInput: "request-human-input",
129389
+ approval_cancel: "cancel-approval-request"
128957
129390
  };
128958
129391
  var SDK_ALLOWLIST = Object.keys(SDK_TOOL_NAME_MAP);
128959
129392
  var MCP_TOOL_NAMES = new Set(Object.values(SDK_TOOL_NAME_MAP));
@@ -129297,6 +129730,16 @@ function bridgeRequestFor(name, args2) {
129297
129730
  throw new Error("task_cancel requires string `taskId`");
129298
129731
  return { method: "POST", path: `/api/tasks/${encodeURIComponent(taskId)}/cancel` };
129299
129732
  }
129733
+ case "approval_cancel": {
129734
+ const requestId = typeof body.requestId === "string" ? body.requestId : undefined;
129735
+ if (!requestId)
129736
+ throw new Error("approval_cancel requires string `requestId`");
129737
+ return {
129738
+ method: "POST",
129739
+ path: `/api/approval-requests/${encodeURIComponent(requestId)}/cancel`,
129740
+ body: { reason: body.reason }
129741
+ };
129742
+ }
129300
129743
  case "kv_get":
129301
129744
  case "kv_getOrNull":
129302
129745
  return { method: "GET", path: kvPath(body) };
@@ -131365,7 +131808,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
131365
131808
  }
131366
131809
  if (notification.channel === "slack") {
131367
131810
  try {
131368
- const { getSlackApp: getSlackApp2 } = await import("./app-enysy1zd.js");
131811
+ const { getSlackApp: getSlackApp2 } = await import("./app-g26wdcz6.js");
131369
131812
  const slackApp = getSlackApp2();
131370
131813
  if (!slackApp) {
131371
131814
  console.warn("[HITL] Slack not initialized — cannot send notification");
@@ -131379,7 +131822,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
131379
131822
  elements: [
131380
131823
  {
131381
131824
  type: "mrkdwn",
131382
- text: `⏱ Timeout: ${formatTimeout(config.timeout.seconds)} — auto-rejects if not responded`
131825
+ text: `⏱ Timeout: ${formatTimeout(config.timeout.seconds)} — times out if not responded`
131383
131826
  }
131384
131827
  ]
131385
131828
  }
@@ -131494,7 +131937,7 @@ class NotifyExecutor extends BaseExecutor {
131494
131937
  }
131495
131938
  }
131496
131939
  case "slack": {
131497
- const { getSlackApp: getSlackApp2 } = await import("./app-enysy1zd.js");
131940
+ const { getSlackApp: getSlackApp2 } = await import("./app-g26wdcz6.js");
131498
131941
  const app = getSlackApp2();
131499
131942
  if (!app) {
131500
131943
  return {
@@ -132318,4 +132761,4 @@ async function initWorkflows() {
132318
132761
  logOpenWebhookTriggers();
132319
132762
  }
132320
132763
 
132321
- export { DEFAULT_NEGOTIATED_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, isJSONRPCRequest, isJSONRPCResultResponse, isJSONRPCErrorResponse, JSONRPCMessageSchema, isInitializeRequest, McpServer, isGitHubEnabled, initGitHub, verifyWebhookSignature, isAgentMailEnabled, initAgentMail, verifyAgentMailWebhook, findUserById, findUserByExternalId, getUserIdentities, listUserEvents, listUserTokens, recordIdentityEvent, findOrCreateUserByEmail, linkIdentity, unlinkIdentity, mintToken, revokeToken, resolveUserByToken, mintSessionToken, revokeSessionToken, fingerprintApiKey, resolveIdentity, renderIdentity, createAdditiveBuffer, referencedBundlePaths, skillDirs, TaskCreationBlockedError, recordUnmappedIdentity, MAX_TASK_ATTACHMENT_BYTES, recordTaskAttachmentUpload, buildEffectiveText, bufferedFileFailures, fetchSlackFiles, createSlackTaskWithFiles, notifySlackFileFailures, hasOtherUserMention, broadcastMatches, routeMessage, extractTaskFromMessage, extractSlackMessageText, automationIntegrationFixUrl, preflightAutomation, getAutomationSetupStates, listEnabledAutomationPreflightInputs, validateJsonSchema, TriggerSchemaError, startWorkflowExecution, setupWorkflowResumeListener, retryFailedRun, cancelWorkflowRun, resumeWaitState, initWaitBusSubscriptions, subscribeWaitToBus, recoverIncompleteRuns, startRetryPoller, stopRetryPoller, validateTemplateVariables, instantiateTemplate, handleWebhookTrigger, logOpenWebhookTriggers, handleEventTrigger, handleScheduleTrigger, verifyHmacSignature, WebhookError, snapshotWorkflow, snapshotAndUpdateWorkflow, startWaitPoller, stopWaitPoller, RawLlmConfigSchema, RawLlmOutputSchema, executeRawLlm, getExecutorRegistry, initWorkflows, dispatchScheduleTarget, calculateNextRun, startScheduler, stopScheduler, runScheduleNow, parseSkillContent, ExtensionAssetConflictError, ExtensionOwnershipError, getExtensionFiles, getExtensionById, getExtensionByName, listExtensions, listExtensionVersions, updateExtensionMeta, listExtensionRuns, SDK_ALLOWLIST, mcpToolNameForSdkMethod, mcpOverflowAuthError, toolErr, createToolRegistrar, warnIfCorsAllowsAnyOrigin, isOriginAllowedForCredentials, allowedCredentialRedirect, setCorsHeaders, parseQueryParams, getPathSegments, wireHttpSpanLifecycle, safeRequestUrlForLog, agentWithCapacity, parseBody, BODY_TOO_LARGE, enforceContentLengthCap, json, jsonError, triggerSchemaErrorResponse, deriveApiBaseUrl, httpServerSemconvAttributes, runtimeInstanceHeader, describeRequestRoute, route, handleMcpBridge, Redacted, SCRIPT_SDK_RESPONSE_LIMIT_BYTES, readScriptSdkJsonResponse, ExtensionConfigError, ExtensionLifecycleError, setExtensionLoopbackBaseUrl, enableExtension, disableExtension, activateVersion, ExtensionAssetsInvalidError, installExtensionWithAssets, uninstallExtension, reloadExtension, loadEnabledExtensions, stopExtensionRuntime, ExtensionAbortedError, isRegistered, isExtensionAgentId, getExtensionBridgeToken, resolveBridgeCallOrigin, extensionIdForAgent, runContext, registerLoaded, unregister, listRegistered, dispatchPre, dispatchPost, createTaskWithSiblingAwareness, isInboxAllowed, isSenderAllowed, handleMessageReceived, AGENT_MAX_TASKS_CONFIG_KEY, reconcileAgentMaxTasksPolicy, resetAgentMaxTasksMirror, upsertSwarmConfigWithPolicyMirror, runtimeStaleThresholdMinutes, upsertRuntimeInstance, getRuntimeInstanceById, touchRuntimeInstance, countActiveRuntimeInstancesForAgent, listRuntimeInstancesForAgent, setRuntimeCredentialReady, reconcileAgentStatusFromRuntimes, agentsWithLiveRuntime, expireStaleRuntimeInstances, enqueueAuditRow, enqueueAdmissionRow, flushAuditBuffer, startAuditWriter, stopAuditWriter, startAuditGc, stopAuditGc, handlePullRequest, handleIssue, handleComment, handlePullRequestReview, handleCheckRun, handleCheckSuite, handleWorkflowRun, isGitLabEnabled, initGitLab, verifyGitLabWebhook, handleMergeRequest, handleIssue2 as handleIssue1, handleNote, handlePipeline, repointTrackerSyncBySwarmId, getJiraMetadata, updateJiraMetadata, clearJiraMetadata, registerJiraWebhook, deleteJiraWebhook, isJiraEnabled, initJira, handleJiraWebhook, handleAgentSessionEvent, handleIssueUpdate, handleIssueDelete, handleAgentSessionPrompted, isLinearEnabled, initLinear, parseCookieHeader, extractAndVerifyCookie, issuePageSessionCookie, resolveHttpRequestAuth, loadGlobalConfigsIntoEnv, reloadGlobalConfigsAndIntegrations, scheduleIntegrationsReload, handleCore, userCtx, resolveTaskAuditUserId, resolveHttpAuditUserId, resolveHttpFavoriteOwner, handleApps, getUserCommsPrefs, getTaskDetailsInputSchema, getTaskDetailsOutputSchema, getTaskDetailsHandler, cancelTaskInputSchema, cancelTaskOutputSchema, cancelTaskHandler, executeReadOnlyQuery, assertSelectOnlyQuery, handleDbQuery, snapshotMetric, AssetKeyAuthorizationError, authorizeAssetKeyWrite, snapshotPage, assertOAuthAppUrlsSafe, assertOAuthEgressUrlSafe, listOAuthPresets, listOAuthPresetIds, getOAuthPreset, hydrateOAuthAppFromPreset, scopedResourceScopeIdSchema, resolveScopedResourceId, dedupeMemoryDocumentIds, recordMemoryAccesses, recordRetrievals, ExplicitSelfDuplicateError, applyRating, shouldPersistAutomaticTaskMemory, REBOOT_RETRY_PIN_TAG, getPinCandidateAgent, resolveLeadOnlyRecoveryAssignment, getResumeGeneration, getNextResumeGeneration, createWorkerTaskFollowUp, createResumeFollowUp, createRerouteDecisionTask, createPoolStarvationDecisionTask, guardTerminalTaskResultWrite, getTasksInputSchema, getTasksOutputSchema, getTasksHandler, reservedNamespaceError, reservedRoomKeyError, refreshLinks, canReadMemory, getLinksForMemory, expandCandidatesWithGraph, indexMemoryContent, markKapsoMessageRead, sendKapsoReaction, getKapsoConfig, getKapsoNumberMapping, markKapsoMessageSeen, resolveRoomNamespace, roomRequestInfo, authorizeRoomNamespace, RoomOperationSchema, removeAwarenessStates, roomTopic, decodeRoomSnapshot, roomView, getRoom, changeRoom, applyRoomUpdate, resetRoom, sweepRooms, closeRooms, removeNamespaceRooms, createEvent, createEventsBatch, getEventCountsFiltered, getEventsFiltered, mergeScheduleTiming, validateRecurringTiming, checkOutputSchemaShape, sendTaskOutputSchema, sendTaskHandler, steerTaskUserInputSchema, steerTaskOutputSchema, steerTaskHandler, canClaim, emitBudgetRefusalSideEffects, taskActionInputSchema, taskActionOutputSchema, taskActionHandler, patchWorkflowDefinition, resolveScriptsOnlyMode, ALL_CAPABILITIES, hasCapability, getEnabledCapabilities, createServer };
132764
+ export { DEFAULT_NEGOTIATED_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, isJSONRPCRequest, isJSONRPCResultResponse, isJSONRPCErrorResponse, JSONRPCMessageSchema, isInitializeRequest, McpServer, isGitHubEnabled, initGitHub, verifyWebhookSignature, isAgentMailEnabled, initAgentMail, verifyAgentMailWebhook, findUserById, findUserByExternalId, getUserIdentities, listUserEvents, listUserTokens, recordIdentityEvent, findOrCreateUserByEmail, linkIdentity, unlinkIdentity, mintToken, revokeToken, resolveUserByToken, mintSessionToken, revokeSessionToken, fingerprintApiKey, resolveIdentity, renderIdentity, createAdditiveBuffer, referencedBundlePaths, skillDirs, TaskCreationBlockedError, recordUnmappedIdentity, MAX_TASK_ATTACHMENT_BYTES, recordTaskAttachmentUpload, buildEffectiveText, bufferedFileFailures, fetchSlackFiles, createSlackTaskWithFiles, notifySlackFileFailures, hasOtherUserMention, broadcastMatches, routeMessage, extractTaskFromMessage, extractSlackMessageText, automationIntegrationFixUrl, preflightAutomation, getAutomationSetupStates, listEnabledAutomationPreflightInputs, validateJsonSchema, TriggerSchemaError, startWorkflowExecution, createApprovalFollowUpTask, setupWorkflowResumeListener, retryFailedRun, cancelWorkflowRun, resumeWaitState, initWaitBusSubscriptions, subscribeWaitToBus, recoverIncompleteRuns, startRetryPoller, stopRetryPoller, validateTemplateVariables, instantiateTemplate, handleWebhookTrigger, logOpenWebhookTriggers, handleEventTrigger, handleScheduleTrigger, verifyHmacSignature, WebhookError, snapshotWorkflow, snapshotAndUpdateWorkflow, startWaitPoller, stopWaitPoller, RawLlmConfigSchema, RawLlmOutputSchema, executeRawLlm, getExecutorRegistry, initWorkflows, dispatchScheduleTarget, calculateNextRun, startScheduler, stopScheduler, runScheduleNow, parseSkillContent, ExtensionAssetConflictError, ExtensionOwnershipError, getExtensionFiles, getExtensionById, getExtensionByName, listExtensions, listExtensionVersions, updateExtensionMeta, listExtensionRuns, SDK_ALLOWLIST, mcpToolNameForSdkMethod, mcpOverflowAuthError, toolErr, createToolRegistrar, warnIfCorsAllowsAnyOrigin, isOriginAllowedForCredentials, allowedCredentialRedirect, setCorsHeaders, parseQueryParams, getPathSegments, wireHttpSpanLifecycle, safeRequestUrlForLog, agentWithCapacity, parseBody, BODY_TOO_LARGE, enforceContentLengthCap, json, jsonError, triggerSchemaErrorResponse, deriveApiBaseUrl, httpServerSemconvAttributes, runtimeInstanceHeader, describeRequestRoute, route, handleMcpBridge, Redacted, SCRIPT_SDK_RESPONSE_LIMIT_BYTES, readScriptSdkJsonResponse, ExtensionConfigError, ExtensionLifecycleError, setExtensionLoopbackBaseUrl, enableExtension, disableExtension, activateVersion, ExtensionAssetsInvalidError, installExtensionWithAssets, uninstallExtension, reloadExtension, loadEnabledExtensions, stopExtensionRuntime, ExtensionAbortedError, isRegistered, isExtensionAgentId, getExtensionBridgeToken, resolveBridgeCallOrigin, extensionIdForAgent, runContext, registerLoaded, unregister, listRegistered, dispatchPre, dispatchPost, createTaskWithSiblingAwareness, isInboxAllowed, isSenderAllowed, handleMessageReceived, AGENT_MAX_TASKS_CONFIG_KEY, reconcileAgentMaxTasksPolicy, resetAgentMaxTasksMirror, upsertSwarmConfigWithPolicyMirror, runtimeStaleThresholdMinutes, upsertRuntimeInstance, getRuntimeInstanceById, touchRuntimeInstance, countActiveRuntimeInstancesForAgent, listRuntimeInstancesForAgent, setRuntimeCredentialReady, reconcileAgentStatusFromRuntimes, agentsWithLiveRuntime, expireStaleRuntimeInstances, enqueueAuditRow, enqueueAdmissionRow, flushAuditBuffer, startAuditWriter, stopAuditWriter, startAuditGc, stopAuditGc, handlePullRequest, handleIssue, handleComment, handlePullRequestReview, handleCheckRun, handleCheckSuite, handleWorkflowRun, isGitLabEnabled, initGitLab, verifyGitLabWebhook, handleMergeRequest, handleIssue2 as handleIssue1, handleNote, handlePipeline, repointTrackerSyncBySwarmId, getJiraMetadata, updateJiraMetadata, clearJiraMetadata, registerJiraWebhook, deleteJiraWebhook, isJiraEnabled, initJira, handleJiraWebhook, handleAgentSessionEvent, handleIssueUpdate, handleIssueDelete, handleAgentSessionPrompted, isLinearEnabled, initLinear, parseCookieHeader, extractAndVerifyCookie, issuePageSessionCookie, resolveHttpRequestAuth, loadGlobalConfigsIntoEnv, reloadGlobalConfigsAndIntegrations, scheduleIntegrationsReload, handleCore, userCtx, resolveTaskAuditUserId, resolveHttpAuditUserId, resolveHttpFavoriteOwner, handleApps, cancelApprovalRequest, cancelApprovalRequestAndRun, getUserCommsPrefs, getTaskDetailsInputSchema, getTaskDetailsOutputSchema, getTaskDetailsHandler, cancelTaskInputSchema, cancelTaskOutputSchema, cancelTaskHandler, executeReadOnlyQuery, assertSelectOnlyQuery, handleDbQuery, snapshotMetric, AssetKeyAuthorizationError, authorizeAssetKeyWrite, snapshotPage, assertOAuthAppUrlsSafe, assertOAuthEgressUrlSafe, listOAuthPresets, listOAuthPresetIds, getOAuthPreset, hydrateOAuthAppFromPreset, scopedResourceScopeIdSchema, resolveScopedResourceId, dedupeMemoryDocumentIds, recordMemoryAccesses, recordRetrievals, ExplicitSelfDuplicateError, applyRating, shouldPersistAutomaticTaskMemory, REBOOT_RETRY_PIN_TAG, getPinCandidateAgent, resolveLeadOnlyRecoveryAssignment, getResumeGeneration, getNextResumeGeneration, createWorkerTaskFollowUp, createResumeFollowUp, createRerouteDecisionTask, createPoolStarvationDecisionTask, guardTerminalTaskResultWrite, getTasksInputSchema, getTasksOutputSchema, getTasksHandler, reservedNamespaceError, reservedRoomKeyError, refreshLinks, canReadMemory, getLinksForMemory, expandCandidatesWithGraph, indexMemoryContent, markKapsoMessageRead, sendKapsoReaction, getKapsoConfig, getKapsoNumberMapping, markKapsoMessageSeen, resolveRoomNamespace, roomRequestInfo, authorizeRoomNamespace, RoomOperationSchema, removeAwarenessStates, roomTopic, decodeRoomSnapshot, roomView, getRoom, changeRoom, applyRoomUpdate, resetRoom, sweepRooms, closeRooms, removeNamespaceRooms, createEvent, createEventsBatch, getEventCountsFiltered, getEventsFiltered, mergeScheduleTiming, validateRecurringTiming, checkOutputSchemaShape, sendTaskOutputSchema, sendTaskHandler, steerTaskUserInputSchema, steerTaskOutputSchema, steerTaskHandler, canClaim, emitBudgetRefusalSideEffects, taskActionInputSchema, taskActionOutputSchema, taskActionHandler, patchWorkflowDefinition, resolveScriptsOnlyMode, ALL_CAPABILITIES, hasCapability, getEnabledCapabilities, createServer };