@desplega.ai/agent-swarm 2.4.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-kedstxx6.js → acp-adapter-zvzr538d.js} +9 -9
  3. package/dist/{actions-vget6r1k.js → actions-jhtqdw69.js} +21 -21
  4. package/dist/{amp-adapter-xeb5mktv.js → amp-adapter-bd84rhs2.js} +4 -4
  5. package/dist/{app-mqap8t8m.js → app-kreq1gwg.js} +3 -3
  6. package/dist/{assistant-h0gv97mv.js → assistant-3k22sbsq.js} +22 -22
  7. package/dist/{boot-reembed-qr8a894z.js → boot-reembed-e53x6b9v.js} +1 -1
  8. package/dist/{boot-reembed-rj85jjhw.js → boot-reembed-f6z923ny.js} +1 -1
  9. package/dist/{boot-scrub-sweep-eyfvn6v9.js → boot-scrub-sweep-0538vsb7.js} +4 -4
  10. package/dist/{boot-seeds-xs9a8dx1.js → boot-seeds-6wxqkfk2.js} +4 -4
  11. package/dist/{claude-adapter-bm23cye7.js → claude-adapter-gfts5044.js} +9 -9
  12. package/dist/{claude-managed-adapter-1mwrsm9d.js → claude-managed-adapter-h2y889ge.js} +2 -2
  13. package/dist/{claude-managed-setup-gkfgks4j.js → claude-managed-setup-h00hsgtz.js} +2 -2
  14. package/dist/{claude-sdk-session-apb4ypz3.js → claude-sdk-session-56besmfz.js} +13 -13
  15. package/dist/{cli-nrrg0fvy.js → cli-0bh477zn.js} +18 -5
  16. package/dist/{cli-7gh7020n.js → cli-1dmcq2eh.js} +1 -1
  17. package/dist/{cli-7ayprxp7.js → cli-2dfbv8qr.js} +8 -0
  18. package/dist/{cli-1cevz46c.js → cli-3kh4kpqy.js} +6 -6
  19. package/dist/{cli-tg9ksbn8.js → cli-3p8fqcnh.js} +2 -2
  20. package/dist/{cli-x1p5dhq2.js → cli-3r448dqn.js} +3 -3
  21. package/dist/{cli-ecshf504.js → cli-3tnpj2bh.js} +7 -7
  22. package/dist/{cli-ffbrkh1r.js → cli-471qk6s2.js} +46 -38
  23. package/dist/{cli-a49vpbf3.js → cli-5kqnemen.js} +1 -1
  24. package/dist/{cli-zvze9rbm.js → cli-6ncjvx55.js} +3 -3
  25. package/dist/{cli-fb6t92v8.js → cli-6x9ma5w5.js} +1 -1
  26. package/dist/{cli-c8fwpgqb.js → cli-7225gwj7.js} +2 -2
  27. package/dist/{cli-bn26xbcs.js → cli-8nyhf7za.js} +1 -1
  28. package/dist/{cli-y83zk5sb.js → cli-a0kcty51.js} +4 -4
  29. package/dist/{cli-8b9wvjps.js → cli-a4gvwttf.js} +4 -4
  30. package/dist/{cli-jhp7w1fy.js → cli-a5ebc95n.js} +2 -2
  31. package/dist/{cli-mz1ezzzh.js → cli-ash6xxk7.js} +2 -2
  32. package/dist/{cli-rsd7ga7v.js → cli-axh29tyr.js} +11 -11
  33. package/dist/{cli-p22zdvnt.js → cli-bn0rewsy.js} +3 -3
  34. package/dist/{cli-6ftrrwm1.js → cli-bn5kevnf.js} +5 -5
  35. package/dist/{cli-p1m2b6gc.js → cli-d2mb5s8a.js} +7 -7
  36. package/dist/{cli-c5sbmw1v.js → cli-d82btycs.js} +94 -15
  37. package/dist/{cli-vjfpshn3.js → cli-ejs3m1sx.js} +1 -1
  38. package/dist/{cli-a1esmmee.js → cli-fpmsqq59.js} +7 -2
  39. package/dist/{cli-8cxkw1f5.js → cli-fz9kewbh.js} +2 -2
  40. package/dist/{cli-8rwvksbc.js → cli-g0hgtz4p.js} +5 -5
  41. package/dist/{cli-kz116kvw.js → cli-gf0kfg81.js} +7 -7
  42. package/dist/{cli-eqgfs202.js → cli-hqhzg1qq.js} +2 -2
  43. package/dist/{cli-3wjs22x3.js → cli-j4rqdf2n.js} +2 -2
  44. package/dist/{cli-ywyrffff.js → cli-jh0qcrga.js} +1 -1
  45. package/dist/{cli-ttaz6c7m.js → cli-k9z4zd4p.js} +6 -5
  46. package/dist/{cli-nme7wery.js → cli-kmqgmcnb.js} +46 -13
  47. package/dist/{cli-x719j3vs.js → cli-kr2pmfqx.js} +392 -168
  48. package/dist/{cli-wrv09v7q.js → cli-m2qgh5sv.js} +1 -1
  49. package/dist/{cli-xfe63zx3.js → cli-mfe7f7b5.js} +2 -2
  50. package/dist/{cli-x3en6ct3.js → cli-nwyw3zhg.js} +1 -1
  51. package/dist/{cli-5s5hx57y.js → cli-nx462e4v.js} +1 -1
  52. package/dist/{cli-bfc3k1x5.js → cli-p0rakbrk.js} +9 -9
  53. package/dist/{cli-avmqhatn.js → cli-p6argxh9.js} +8 -8
  54. package/dist/{cli-3avfh5az.js → cli-pemywhfq.js} +2 -2
  55. package/dist/{cli-sppc0cmw.js → cli-pnp2j5zg.js} +2 -2
  56. package/dist/{cli-wk8ccrz6.js → cli-pw7v69vp.js} +2 -2
  57. package/dist/{cli-bhwa8rzc.js → cli-rdq7tzwm.js} +13 -12
  58. package/dist/{cli-rg7ntypm.js → cli-rqqsfz30.js} +379 -87
  59. package/dist/{cli-kk2r80n5.js → cli-s48yvzb8.js} +4 -4
  60. package/dist/{cli-zv4vy2b0.js → cli-s95dknxh.js} +1 -1
  61. package/dist/{cli-b80a1100.js → cli-sjyetj21.js} +2 -2
  62. package/dist/{cli-rdr166ht.js → cli-smvcw9z5.js} +1 -1
  63. package/dist/{cli-2rwet3r7.js → cli-sv5gb0yb.js} +1 -1
  64. package/dist/{cli-5ff2sjyt.js → cli-syhq378v.js} +2 -2
  65. package/dist/{cli-tj4j2ts4.js → cli-tbhwrxpt.js} +8 -8
  66. package/dist/{cli-4fhyq711.js → cli-vy0fay6k.js} +13 -13
  67. package/dist/{cli-ptkpaqfy.js → cli-wt645v7q.js} +1 -1
  68. package/dist/{cli-f3nx1h8z.js → cli-wxbn3yfx.js} +2 -2
  69. package/dist/{cli-wyrr38xm.js → cli-x5mq1fyq.js} +1 -1
  70. package/dist/{cli-ccn0eybf.js → cli-xbzvet96.js} +6 -6
  71. package/dist/{cli-4mkvwgzr.js → cli-xf234ws8.js} +1 -1
  72. package/dist/{cli-tgvpmnwz.js → cli-xftrvxag.js} +5 -5
  73. package/dist/{cli-02vhhssk.js → cli-z071fb95.js} +5 -5
  74. package/dist/{cli-mvg2hf8p.js → cli-z1ew8vbq.js} +14 -7
  75. package/dist/{cli-dsgj3e7a.js → cli-zfg9enh9.js} +2 -2
  76. package/dist/{cli-yxqag76b.js → cli-zw88zjba.js} +1 -1
  77. package/dist/cli.js +19 -19
  78. package/dist/{codex-adapter-pp2gq8gr.js → codex-adapter-p6rmm7vv.js} +6 -6
  79. package/dist/{codex-hook-qwzccd64.js → codex-hook-x7nejyrr.js} +7 -4
  80. package/dist/{codex-login-35p4sk85.js → codex-login-m819c41r.js} +1 -1
  81. package/dist/{codex-session-runner-0vzn09t8.js → codex-session-runner-8vd5t9t0.js} +7 -7
  82. package/dist/{commands-psqhkttb.js → commands-7ems2p13.js} +2 -2
  83. package/dist/{controller-t20vz2k8.js → controller-m263fg43.js} +4 -4
  84. package/dist/{controllers-connect-gkxmqw9d.js → controllers-connect-bg33ae53.js} +23 -23
  85. package/dist/{cursor-adapter-3v542qe5.js → cursor-adapter-cz6nm6mj.js} +3 -3
  86. package/dist/{db-2xbyenjr.js → db-w505dwa8.js} +2 -2
  87. package/dist/{db-nc1rd869.js → db-ys2rbdft.js} +3 -3
  88. package/dist/{devin-adapter-7egzmt0k.js → devin-adapter-zgqadvnm.js} +1 -1
  89. package/dist/{dispatcher-ewceb8ts.js → dispatcher-0s0mckqr.js} +20 -20
  90. package/dist/{docker-njavd3fb.js → docker-fkgtr75t.js} +2 -2
  91. package/dist/{dsh-adapter-75xwh78t.js → dsh-adapter-3n3net33.js} +3 -3
  92. package/dist/{e2b-5r6a5jeb.js → e2b-7am6tmq6.js} +2 -2
  93. package/dist/{e2b-pw1nvtmh.js → e2b-thdcxtjd.js} +2 -2
  94. package/dist/{easter-egg-3d-xsc47jwf.js → easter-egg-3d-5cgynaja.js} +1 -1
  95. package/dist/{event-bus-101fenkh.js → event-bus-9vpk8gmq.js} +1 -1
  96. package/dist/{execute-gzmw1mnw.js → execute-t4e6m3rw.js} +1 -1
  97. package/dist/{external-channel-a5dsmxn4.js → external-channel-5b23fv8z.js} +2 -2
  98. package/dist/{grok-adapter-vj88xr23.js → grok-adapter-q9fghe5q.js} +10 -10
  99. package/dist/handlers-mqrym347.js +39 -0
  100. package/dist/{heartbeat-t2m9r3wa.js → heartbeat-tww6yx1w.js} +23 -23
  101. package/dist/{hook-xa677f8r.js → hook-dx0pkvar.js} +16 -9
  102. package/dist/{hook-8femx1bg.js → hook-pvmh9b6m.js} +6 -6
  103. package/dist/{http-xpmmq028.js → http-k2ejbt05.js} +199 -131
  104. package/dist/{index-s7ckdajq.js → index-2z710v4x.js} +10 -10
  105. package/dist/{index-dg2tmj99.js → index-dgz61nff.js} +20 -20
  106. package/dist/{index-syztqdt6.js → index-g6tbb6ve.js} +1 -1
  107. package/dist/index-h2ek08d6.js +40 -0
  108. package/dist/index-pqfwh9nn.js +41 -0
  109. package/dist/{index-cdzyfrsp.js → index-x5aktmp8.js} +1 -1
  110. package/dist/{keepalive-3nr4st3r.js → keepalive-nhvpw10z.js} +4 -4
  111. package/dist/lead-jb6sf69z.js +78 -0
  112. package/dist/{maintenance-verwpe2c.js → maintenance-agakc519.js} +1 -1
  113. package/dist/{oauth-refresh-sweep-9q2t0y3q.js → oauth-refresh-sweep-4dcbhtn0.js} +3 -3
  114. package/dist/{onboard-aytqedmq.js → onboard-4n2kwa4v.js} +3 -3
  115. package/dist/{opencode-adapter-f4hryjny.js → opencode-adapter-3s7ax02e.js} +7 -7
  116. package/dist/{otel-impl-hckw4wt1.js → otel-impl-tfa12080.js} +2 -2
  117. package/dist/{pi-mono-adapter-hxby0ce1.js → pi-mono-adapter-ytp7gz8b.js} +22 -11
  118. package/dist/{pricing-refresh-5nvme3sm.js → pricing-refresh-3cqx3f3x.js} +3 -3
  119. package/dist/{rbac-roles-pd8c26m1.js → rbac-roles-9fae5rnv.js} +1 -1
  120. package/dist/{rbac-roles-vbpy21mg.js → rbac-roles-y6zbfzve.js} +2 -2
  121. package/dist/{render-v2-7nqgvk2q.js → render-v2-emawjvc4.js} +3 -3
  122. package/dist/{resume-b6djcj3c.js → resume-zhgts7h7.js} +10 -8
  123. package/dist/{runtime-txrxc9za.js → runtime-xe3aqy4x.js} +1 -1
  124. package/dist/{session-access-fc3f9y12.js → session-access-cm823e06.js} +4 -4
  125. package/dist/{setup-n39szm6b.js → setup-tkp99w1e.js} +1 -1
  126. package/dist/{virtual-modules-wyp2k6z3.js → virtual-modules-4r3zkc20.js} +2 -2
  127. package/dist/{work-objects-jem2fre0.js → work-objects-f722h263.js} +23 -23
  128. package/dist/worker-p7f336rq.js +78 -0
  129. package/dist/{x-8ewt8gxn.js → x-y45mthwn.js} +2 -2
  130. package/openapi.json +99 -52
  131. package/package.json +2 -2
  132. package/src/apps/action-runner.ts +146 -0
  133. package/src/apps/row-store.ts +4 -2
  134. package/src/apps/script-types.ts +1 -1
  135. package/src/be/db.ts +14 -4
  136. package/src/be/fleet-benchmark-stats.ts +10 -5
  137. package/src/be/models-catalog.ts +4 -0
  138. package/src/be/onboarding.ts +6 -0
  139. package/src/be/scripts/typecheck.ts +13 -0
  140. package/src/be/swarm-config-guard.ts +10 -1
  141. package/src/be/telemetry-enable.ts +1 -1
  142. package/src/commands/provider-credentials.ts +12 -2
  143. package/src/commands/runner.ts +3 -0
  144. package/src/heartbeat/heartbeat.ts +2 -2
  145. package/src/hooks/codex-hook.ts +6 -2
  146. package/src/hooks/hook.ts +7 -0
  147. package/src/hooks/pr-body-guard.ts +38 -11
  148. package/src/hooks/pr-room-guard.ts +88 -0
  149. package/src/http/agents.ts +1 -0
  150. package/src/http/apps.ts +84 -181
  151. package/src/http/fleet-benchmark.ts +79 -30
  152. package/src/http/global-config.ts +7 -0
  153. package/src/http/ranking.ts +24 -40
  154. package/src/http/tasks.ts +2 -1
  155. package/src/http/telemetry-ui.ts +1 -1
  156. package/src/http/used-by.ts +55 -19
  157. package/src/http/users.ts +2 -2
  158. package/src/providers/amp-adapter.ts +1 -1
  159. package/src/providers/pi-mono-adapter.ts +15 -0
  160. package/src/providers/reasoning-effort.ts +2 -1
  161. package/src/providers/types.ts +2 -0
  162. package/src/ranking/telemetry-ranking.ts +5 -33
  163. package/src/scripts-runtime/sdk-allowlist.ts +7 -0
  164. package/src/scripts-runtime/types/stdlib.d.ts +31 -0
  165. package/src/scripts-runtime/types/swarm-sdk.d.ts +31 -0
  166. package/src/server.ts +4 -0
  167. package/src/telemetry-context.ts +19 -1
  168. package/src/telemetry-contract/EVENTS.md +42 -8
  169. package/src/telemetry-contract/SOURCE.json +6 -5
  170. package/src/telemetry-contract/catalog.json +225 -5
  171. package/src/telemetry-contract/ranking/fixtures/valid/no-claim.json +10 -0
  172. package/src/telemetry-contract/ranking/listing.v1.schema.json +2 -2
  173. package/src/telemetry-contract/types.gen.ts +225 -27
  174. package/src/telemetry-identity.ts +47 -9
  175. package/src/telemetry-snapshot.ts +9 -1
  176. package/src/telemetry-ui-events.ts +9 -2
  177. package/src/telemetry.ts +14 -3
  178. package/src/tests/app-action-run-tool.test.ts +178 -0
  179. package/src/tests/app-row-tools.test.ts +360 -0
  180. package/src/tests/check-pr-body.test.ts +0 -23
  181. package/src/tests/credential-check.test.ts +38 -0
  182. package/src/tests/fleet-benchmark.test.ts +122 -2
  183. package/src/tests/http-users.test.ts +62 -1
  184. package/src/tests/model-catalog-table.test.ts +63 -0
  185. package/src/tests/model-profiles-api.test.ts +19 -7
  186. package/src/tests/models-catalog.test.ts +50 -0
  187. package/src/tests/onboarding.test.ts +21 -0
  188. package/src/tests/org-website.test.ts +62 -0
  189. package/src/tests/pi-mono-adapter.test.ts +23 -0
  190. package/src/tests/pr-body-leaks.test.ts +4 -0
  191. package/src/tests/pr-room-guard.test.ts +242 -0
  192. package/src/tests/ranking-listing.test.ts +8 -23
  193. package/src/tests/ranking-route.test.ts +49 -47
  194. package/src/tests/reasoning-effort.test.ts +39 -3
  195. package/src/tests/runner-harness-telemetry-env.test.ts +56 -1
  196. package/src/tests/swarm-tool-result-gate.test.ts +2 -4
  197. package/src/tests/telemetry-context.test.ts +128 -2
  198. package/src/tests/telemetry-ui-route.test.ts +123 -0
  199. package/src/tests/tool-annotations.test.ts +3 -2
  200. package/src/tests/used-by-route.test.ts +144 -10
  201. package/src/tests/workflow-agent-task-retry.test.ts +130 -4
  202. package/src/tests/workflow-wait-recovery.test.ts +116 -4
  203. package/src/tools/app-action-run.ts +63 -0
  204. package/src/tools/app-rows.ts +234 -0
  205. package/src/tools/model-catalog/index.ts +1 -1
  206. package/src/tools/tool-config.ts +8 -0
  207. package/src/tools/utils.ts +1 -1
  208. package/src/tools/workflows/retry-workflow-run.ts +1 -1
  209. package/src/types.ts +17 -0
  210. package/src/utils/company-profile.ts +24 -0
  211. package/src/utils/org-website.ts +58 -21
  212. package/src/workflows/recovery.ts +10 -22
  213. package/src/workflows/resume.ts +16 -0
  214. package/src/workflows/task-step-routing.ts +47 -7
  215. package/templates/skills/apps/SKILL.md +41 -2
  216. package/templates/skills/apps/content.md +41 -2
  217. package/dist/handlers-zbs90bny.js +0 -39
  218. package/dist/index-8pwc1jc8.js +0 -40
  219. package/dist/index-nxa6me0q.js +0 -41
  220. package/dist/lead-td8h2sfn.js +0 -78
  221. package/dist/worker-wr6xgfr2.js +0 -78
  222. package/src/tests/check-ranking-entry.test.ts +0 -146
package/src/types.ts CHANGED
@@ -1362,6 +1362,14 @@ export const AgentBedrockStatusSchema = z
1362
1362
  .openapi("AgentBedrockStatus");
1363
1363
  export type AgentBedrockStatus = z.infer<typeof AgentBedrockStatusSchema>;
1364
1364
 
1365
+ export const AgentOpencodeGoStatusSchema = z
1366
+ .object({
1367
+ probedAt: z.number(), // unix ms
1368
+ models: z.array(z.string()).default([]),
1369
+ })
1370
+ .openapi("AgentOpencodeGoStatus");
1371
+ export type AgentOpencodeGoStatus = z.infer<typeof AgentOpencodeGoStatusSchema>;
1372
+
1365
1373
  const AcpSessionConfigSelectValueSchema = z.object({
1366
1374
  value: z.string(),
1367
1375
  name: z.string(),
@@ -1421,6 +1429,8 @@ export const AgentCredStatusSchema = z
1421
1429
  reportKind: z.enum(["boot", "post_task"]).default("boot"),
1422
1430
  /** Pi-mono Bedrock enumeration block — null when not in Bedrock mode. */
1423
1431
  bedrock: AgentBedrockStatusSchema.nullable().default(null),
1432
+ /** Pi-mono only: the `opencode-go` model ids the worker's pi-ai resolves. */
1433
+ opencodeGo: AgentOpencodeGoStatusSchema.nullable().default(null),
1424
1434
  /** ACP options advertised by the most recently created session. */
1425
1435
  acp: AgentAcpStatusSchema.nullable().default(null),
1426
1436
  })
@@ -2210,6 +2220,13 @@ export const RetryPolicySchema = z
2210
2220
  .openapi("RetryPolicy");
2211
2221
  export type RetryPolicy = z.infer<typeof RetryPolicySchema>;
2212
2222
 
2223
+ /**
2224
+ * `failureReason` of a workflow-step task cut by a supersede (deploy drain,
2225
+ * heartbeat remediation). The workflow engine re-dispatches it once even
2226
+ * when the node declares no `retry` (see `scheduleTaskStepRetry`).
2227
+ */
2228
+ export const SUPERSEDED_WORKFLOW_TASK_REASON = "superseded_workflow_task";
2229
+
2213
2230
  // --- Executor Metadata ---
2214
2231
 
2215
2232
  export const ExecutorMetaSchema = z
@@ -0,0 +1,24 @@
1
+ export const COMPANY_TEAM_SIZES = ["1", "2-10", "11-50", "51+"] as const;
2
+
3
+ export const COMPANY_USE_CASES = ["features", "bugs", "review", "ops", "docs", "data"] as const;
4
+
5
+ export const COMPANY_ACQUISITION_SOURCES = [
6
+ "search",
7
+ "github",
8
+ "social",
9
+ "colleague",
10
+ "newsletter",
11
+ "event",
12
+ "ai_assistant",
13
+ "hacker_news",
14
+ "other",
15
+ ] as const;
16
+
17
+ export const USER_FUNCTIONS = [
18
+ "engineer",
19
+ "eng_lead",
20
+ "founder",
21
+ "product",
22
+ "ops",
23
+ "other",
24
+ ] as const;
@@ -71,34 +71,71 @@ export function isFilledOrgLogoUrl(
71
71
  }
72
72
  }
73
73
 
74
+ /**
75
+ * Free-mail providers with regional domains, matched on the label before the
76
+ * public suffix: hotmail.es, yahoo.co.uk, gmx.net and yandex.com.tr all count.
77
+ */
78
+ const FREE_MAIL_FAMILIES = new Set([
79
+ "aol",
80
+ "fastmail",
81
+ "gmail",
82
+ "gmx",
83
+ "googlemail",
84
+ "hotmail",
85
+ "icloud",
86
+ "live",
87
+ "msn",
88
+ "outlook",
89
+ "protonmail",
90
+ "rocketmail",
91
+ "yahoo",
92
+ "yandex",
93
+ "ymail",
94
+ "zoho",
95
+ ]);
96
+
97
+ /** Free-mail providers on one domain only, where the label alone is too generic. */
74
98
  const FREE_MAIL_DOMAINS = new Set([
75
- "gmail.com",
76
- "googlemail.com",
77
- "outlook.com",
78
- "hotmail.com",
79
- "live.com",
80
- "msn.com",
81
- "yahoo.com",
82
- "icloud.com",
83
- "me.com",
99
+ "126.com",
100
+ "163.com",
101
+ "comcast.net",
102
+ "daum.net",
103
+ "free.fr",
104
+ "hanmail.net",
105
+ "hey.com",
106
+ "libero.it",
84
107
  "mac.com",
85
- "aol.com",
86
- "proton.me",
87
- "protonmail.com",
88
- "gmx.com",
89
- "gmx.de",
90
- "yandex.com",
91
- "yandex.ru",
92
108
  "mail.com",
93
- "zoho.com",
109
+ "mail.ru",
110
+ "me.com",
111
+ "naver.com",
112
+ "orange.fr",
113
+ "pm.me",
114
+ "proton.me",
94
115
  "qq.com",
95
- "163.com",
96
- "hey.com",
97
- "fastmail.com",
116
+ "rediffmail.com",
117
+ "sina.com",
118
+ "t-online.de",
119
+ "tutanota.com",
120
+ "web.de",
98
121
  ]);
99
122
 
123
+ /** Second-level labels of a country code suffix (acme.co.uk, acme.com.br). */
124
+ const SECOND_LEVEL_LABELS = new Set(["ac", "co", "com", "edu", "gov", "ne", "net", "or", "org"]);
125
+
126
+ /** Whether `host` (a normalized hostname) belongs to a public free-mail provider. */
127
+ function isFreeMailHost(host: string): boolean {
128
+ const labels = host.split(".");
129
+ const suffixLength = labels.length > 2 && SECOND_LEVEL_LABELS.has(labels.at(-2) ?? "") ? 2 : 1;
130
+ // mail.yahoo.co.uk becomes yahoo.co.uk.
131
+ const registrable = labels.slice(-(suffixLength + 1));
132
+ return (
133
+ FREE_MAIL_FAMILIES.has(registrable[0] ?? "") || FREE_MAIL_DOMAINS.has(registrable.join("."))
134
+ );
135
+ }
136
+
100
137
  /** The admin's email domain as a website suggestion, or null for free-mail domains. */
101
138
  export function websiteSuggestion(orgDomain: string | null | undefined): string | null {
102
139
  const host = normalizeOrgWebsite(orgDomain);
103
- return host && !FREE_MAIL_DOMAINS.has(host) ? host : null;
140
+ return host && !isFreeMailHost(host) ? host : null;
104
141
  }
@@ -25,7 +25,12 @@ import {
25
25
  } from "./engine";
26
26
  import type { ExecutorRegistry } from "./executors/registry";
27
27
  import { getSecretInputKeys } from "./input";
28
- import { finalizeOrWait, resumeFromChildRun, resumeWaitState } from "./resume";
28
+ import {
29
+ finalizeOrWait,
30
+ recoverResolvedWaitState,
31
+ resumeFromChildRun,
32
+ resumeWaitState,
33
+ } from "./resume";
29
34
  import {
30
35
  checkpointPortStepAndResolveSuccessors,
31
36
  completeTaskStepAndResolveSuccessors,
@@ -392,21 +397,12 @@ async function recoverWaitStates(registry: ExecutorRegistry): Promise<number> {
392
397
 
393
398
  for (const stuck of stuckRuns) {
394
399
  try {
395
- // Decide what status to (re)apply.
396
- let resumeStatus: "fired" | "timeout";
397
- let payload: unknown;
398
-
399
- if (stuck.waitStatus === "fired") {
400
- resumeStatus = "fired";
401
- payload = stuck.firedPayload != null ? safeJsonParse(stuck.firedPayload) : undefined;
402
- } else if (stuck.waitStatus === "timeout") {
403
- resumeStatus = "timeout";
400
+ if (stuck.waitStatus === "pending") {
401
+ const status = stuck.waitMode === "time" ? "fired" : "timeout";
402
+ await resumeWaitState(stuck.waitId, status, undefined, registry);
404
403
  } else {
405
- // pending + overdue
406
- resumeStatus = stuck.waitMode === "time" ? "fired" : "timeout";
404
+ await recoverResolvedWaitState(stuck.waitId, registry);
407
405
  }
408
-
409
- await resumeWaitState(stuck.waitId, resumeStatus, payload, registry);
410
406
  recovered++;
411
407
  } catch (err) {
412
408
  if (await failRunOnUnreadableReplay(stuck.runId, err)) continue;
@@ -417,14 +413,6 @@ async function recoverWaitStates(registry: ExecutorRegistry): Promise<number> {
417
413
  return recovered;
418
414
  }
419
415
 
420
- function safeJsonParse(s: string): unknown {
421
- try {
422
- return JSON.parse(s);
423
- } catch {
424
- return s;
425
- }
426
- }
427
-
428
416
  /**
429
417
  * Get run IDs by status. Simple query since there's no dedicated function for this.
430
418
  */
@@ -711,6 +711,22 @@ export async function resumeWaitState(
711
711
  );
712
712
  }
713
713
 
714
+ /** Finish a wait resolution that committed before its step was checkpointed. */
715
+ export async function recoverResolvedWaitState(
716
+ waitId: string,
717
+ registry: ExecutorRegistry,
718
+ ): Promise<void> {
719
+ const waitRow = await getWaitStateById(waitId);
720
+ if (!waitRow) return;
721
+ const status = waitRow.status;
722
+ if (status !== "fired" && status !== "timeout") return;
723
+
724
+ // Replay the durable result; the step checkpoint arbitrates concurrent resumes.
725
+ await failClosedOnUnreadableReplay(waitRow.workflowRunId, waitRow.workflowRunStepId, () =>
726
+ resumeClaimedWait(waitRow, status, waitRow.firedPayload, registry),
727
+ );
728
+ }
729
+
714
730
  async function resumeClaimedWait(
715
731
  waitRow: WaitStateRow,
716
732
  status: "fired" | "timeout",
@@ -2,12 +2,15 @@ import {
2
2
  detachTaskFromWorkflowRunStep,
3
3
  getDbClient,
4
4
  getTaskById,
5
+ getWorkflowRun,
5
6
  getWorkflowRunStep,
6
7
  updateWorkflowRun,
7
8
  updateWorkflowRunStep,
8
9
  } from "../be/db";
9
10
  import {
11
+ type RetryPolicy,
10
12
  RetryPolicySchema,
13
+ SUPERSEDED_WORKFLOW_TASK_REASON,
11
14
  type WorkflowDefinition,
12
15
  type WorkflowNode,
13
16
  type WorkflowRunStep,
@@ -17,7 +20,7 @@ import { getSuccessors } from "./definition";
17
20
  import { joinForeach, resolveForeachParent } from "./foreach-join";
18
21
 
19
22
  export interface PortStepRoutingResult {
20
- /** False when another handler already moved the step out of `waiting`. */
23
+ /** False when the step was already claimed or its run is terminal. */
21
24
  claimed: boolean;
22
25
  successors: WorkflowNode[];
23
26
  }
@@ -85,6 +88,10 @@ export async function checkpointPortStepAndResolveSuccessors(
85
88
  return await getDbClient().transaction(async (): Promise<PortStepRoutingResult> => {
86
89
  const current = await getWorkflowRunStep(stepId);
87
90
  if (!current || current.status !== "waiting") return { claimed: false, successors: [] };
91
+ const run = await getWorkflowRun(runId);
92
+ if (!run || (run.status !== "waiting" && run.status !== "running")) {
93
+ return { claimed: false, successors: [] };
94
+ }
88
95
  await checkpointStep(runId, stepId, nodeId, { output, nextPort }, ctx);
89
96
  await updateWorkflowRun(runId, { status: "running" });
90
97
  return { claimed: true, successors: getSuccessors(def, nodeId, nextPort) };
@@ -97,15 +104,33 @@ export async function checkpointPortStepAndResolveSuccessors(
97
104
  * - `not-claimed`: another handler already moved the step out of `waiting`,
98
105
  * or the failed task is no longer the one bound to the step (it was
99
106
  * already retried and a fresh task now owns it); the caller stops.
100
- * - `not-eligible`: no retry applies (no `node.retry`, not an agent-task node,
101
- * or retries exhausted); the caller applies `onNodeFailure` as before.
107
+ * - `not-eligible`: no retry applies (no `node.retry` and not a supersede
108
+ * cut, not an agent-task node, or retries exhausted); the caller applies
109
+ * `onNodeFailure` as before.
102
110
  */
103
111
  export type TaskStepRetryOutcome = "scheduled" | "not-claimed" | "not-eligible";
104
112
 
113
+ /**
114
+ * Retry applied to an agent-task step whose task was cut by a supersede
115
+ * (deploy drain, heartbeat remediation) when the node declares no `retry`.
116
+ * The cut is not the task's fault, so the step gets one fresh attempt after
117
+ * the restart settles. An explicit `node.retry` always wins; `retry:
118
+ * { maxRetries: 0 }` opts a node with external side effects out.
119
+ */
120
+ export const SUPERSEDE_RETRY_POLICY: RetryPolicy = {
121
+ maxRetries: 1,
122
+ strategy: "static",
123
+ baseDelayMs: 30_000,
124
+ maxDelayMs: 30_000,
125
+ };
126
+
105
127
  /**
106
128
  * Apply a node's `retry` policy to a FAILED agent-task step task. The sync
107
129
  * executor path does this in `executeStep`; an async agent-task step only
108
130
  * learns about the failure here, from `task.failed` or the recovery sweep.
131
+ * A node without `retry` gets `SUPERSEDE_RETRY_POLICY` when the task was
132
+ * failed with `SUPERSEDED_WORKFLOW_TASK_REASON`. The task row is checked as
133
+ * well as `reason`, because the recovery sweep passes its own reason text.
109
134
  *
110
135
  * In one transaction: re-claim the step while it is still `waiting` AND still
111
136
  * bound to the failed task, detach that task (the executor reuses any task
@@ -114,6 +139,9 @@ export type TaskStepRetryOutcome = "scheduled" | "not-claimed" | "not-eligible";
114
139
  * task. Bounded by `maxRetries` via the step's persisted `retryCount`, read
115
140
  * only after ownership is confirmed: a stale caller's step snapshot may carry
116
141
  * the counter of a newer attempt.
142
+ *
143
+ * Foreach children (`<foreachId>#<key>`) are not matched here: the retry
144
+ * poller resolves nodes by exact id and cannot re-dispatch a child yet.
117
145
  */
118
146
  export async function scheduleTaskStepRetry(
119
147
  def: WorkflowDefinition,
@@ -123,10 +151,16 @@ export async function scheduleTaskStepRetry(
123
151
  reason: string,
124
152
  ): Promise<TaskStepRetryOutcome> {
125
153
  const node = def.nodes.find((n) => n.id === step.nodeId);
126
- if (!node || node.type !== "agent-task" || !node.retry) return "not-eligible";
127
- const parsed = RetryPolicySchema.safeParse(node.retry);
128
- if (!parsed.success) return "not-eligible";
129
- const policy = parsed.data;
154
+ if (!node || node.type !== "agent-task") return "not-eligible";
155
+ let policy: RetryPolicy;
156
+ if (node.retry) {
157
+ const parsed = RetryPolicySchema.safeParse(node.retry);
158
+ if (!parsed.success) return "not-eligible";
159
+ policy = parsed.data;
160
+ } else {
161
+ if (!(await isSupersedeCut(taskId, reason))) return "not-eligible";
162
+ policy = SUPERSEDE_RETRY_POLICY;
163
+ }
130
164
 
131
165
  return await getDbClient().transaction(async (): Promise<TaskStepRetryOutcome> => {
132
166
  const current = await getWorkflowRunStep(step.id);
@@ -139,6 +173,12 @@ export async function scheduleTaskStepRetry(
139
173
  });
140
174
  }
141
175
 
176
+ async function isSupersedeCut(taskId: string, reason: string): Promise<boolean> {
177
+ if (reason === SUPERSEDED_WORKFLOW_TASK_REASON) return true;
178
+ const task = await getTaskById(taskId);
179
+ return task?.failureReason === SUPERSEDED_WORKFLOW_TASK_REASON;
180
+ }
181
+
142
182
  export interface TaskStepRoutingResult {
143
183
  /**
144
184
  * False when another handler already moved the step out of `waiting` — the
@@ -18,6 +18,14 @@ Swarm Apps are persistent, agent-authored internal applications: a schema-backed
18
18
  | `app-upsert` | Create an app, or replace an existing app's entire definition when you intentionally have the full desired state. |
19
19
  | `app-patch` | Make a focused change while preserving everything not mentioned in the patch. Prefer this for iteration. |
20
20
  | `app-query` | Run one declared named query and return its rows. Use this when an agent or saved script needs to consume app data rather than render the app UI. |
21
+ | `app-rows-list` | List rows with typed equality filters, sorting, and a limit. Returns `{ rows, total }`. |
22
+ | `app-row-get` | Read a row by `rowId`. Returns `{ row }`. |
23
+ | `app-row-create` | Create a row from `values`. Returns `{ row }`. |
24
+ | `app-rows-create` | Create 1 to 500 rows from a `rows: values[]` array, within 10 MiB. Returns `{ rows }`. |
25
+ | `app-row-patch` | Patch a row by `rowId` with `values`. Returns `{ row }`. |
26
+ | `app-row-delete` | Delete a row by `rowId`. Returns `{ ok: true }`. |
27
+ | `app-rows-delete` | Delete matching rows with a non-empty `equals` filter. Returns `{ deleted }`. |
28
+ | `app-action-run` | Run a declared script, task, or sync action with `{ appId, action, input? }`. Agents can invoke it through MCP only. |
21
29
  | `app-history` | List definition snapshots and their compact model/column digests before choosing a restore point. |
22
30
  | `app-diff` | Show a unified definition diff; defaults to newest snapshot → CURRENT. |
23
31
  | `app-rollback` | Restore a snapshot through the normal schema-migration engine. |
@@ -28,7 +36,24 @@ For every edit: `app-get` -> modify the smallest coherent subtree -> `app-patch`
28
36
 
29
37
  ### Reading an app's callable surface
30
38
 
31
- One `app-get` returns everything needed to drive an app you did not write: `definition.queries` are runnable with `app-query` (supply every `$param` the query references), and `definition.actions` are invocable with `POST /api/apps/<id>/actions/<name>` (a `script` action runs its script, a `task` action spawns a task, a `sync` action refreshes sources). Read a query's `$param` placeholders and an action's kind/args from the definition before calling — do not guess parameter names.
39
+ One `app-get` returns everything needed to drive an app you did not write: `definition.queries` are runnable with `app-query` (supply every `$param` the query references), and `definition.actions` are invocable with `app-action-run` or `POST /api/apps/<id>/actions/<name>` (a `script` action runs its script, a `task` action spawns a task, a `sync` action refreshes sources). Read the query parameters and action arguments from the definition before invocation. Do not guess parameter names.
40
+
41
+ ### Verified action caller
42
+
43
+ Script actions receive `caller` as a reserved, server-stamped argument. The server overwrites `caller` from definition defaults and request input.
44
+
45
+ ```typescript
46
+ type AppActionCaller = {
47
+ kind: "user" | "agent" | "operator" | "guest";
48
+ id: string | null;
49
+ name?: string;
50
+ pageId?: string;
51
+ };
52
+ ```
53
+
54
+ The caller identifies the authenticated user or agent. Operator and guest callers have `id: null`. A signed page session adds `pageId`.
55
+ With the swarm key, a registered `X-Agent-ID` produces an agent caller and `agent:<id>` row provenance. Missing or unknown agent IDs remain operator callers.
56
+ Task actions include the same caller as server-verified JSON in the task prompt. Script execution still uses the saved script owner's bindings.
32
57
 
33
58
  ### Verified action caller
34
59
 
@@ -372,7 +397,7 @@ Use a task action named Tackle when a person should hand one issue row to the sw
372
397
 
373
398
  For direct MCP calls, `app-query` accepts `{ appId, query, params? }` and returns rows from that declared named query; every supplied param must be referenced by a `$param` filter in that query. Use it when an agent needs to read app state without scraping the UI.
374
399
 
375
- Saved scripts use the generated SDK name `ctx.swarm.app_query({ appId, query, params? })`. Use `app_query` in scripts or workflows that turn current app rows into reports, digests, or follow-up work. Saved scripts also get generated per-app types automatically: each app contributes an `App_<Name>` namespace with one row interface per model (enum columns as literal unions) and a typed `app_query` overload per named query, all visible via `script-query-types`. Actions stay REST-only from scripts — there is no SDK method to invoke them.
400
+ Saved scripts use the generated SDK name `ctx.swarm.app_query({ appId, query, params? })`. Use `app_query` in scripts or workflows that turn current app rows into reports, digests, or follow-up work. Saved scripts also get generated per-app types automatically: each app contributes an `App_<Name>` namespace with one row interface per model (enum columns as literal unions) and a typed `app_query` overload per named query, all visible via `script-query-types`. Scripts can create, list, get, patch, and delete rows with the seven row tools. Actions remain REST/MCP-only and have no script SDK method.
376
401
 
377
402
  ### Pages, routes, and page trees
378
403
 
@@ -764,3 +789,17 @@ The tool returns `{ appId, url: "/apps/<id>" }`. Open that URL to verify the liv
764
789
  - Logged-in browser: a fresh dashboard has no connection and redirects to /setup. Seed the localStorage key `agent-swarm-connections` with `{connections:[{id,name,apiUrl,apiKey}],activeId}`. Build the value from an env var and pipe it to `agent-browser eval --stdin`, so the key never reaches a command line. Reload, then pick a user in the "Who are you?" dialog.
765
790
  - Apps scroll inside an inner canvas, so a full-page screenshot captures only the viewport. Scroll the canvas or raise the viewport height. For mobile, set a 375px-wide viewport before the screenshot.
766
791
  - App definitions: `GET /api/apps` and `GET /api/apps/<id>` with the API key as Bearer.
792
+
793
+
794
+ ### Rows from agents and scripts
795
+
796
+ Every row tool requires `appId` and `model`. Scripts use underscore names, such as `ctx.swarm.app_row_create` and `ctx.swarm.app_rows_list`.
797
+ Results use the usual `data` wrapper, so scripts read `res?.data ?? res`. Rows contain system fields and declared columns at the top level.
798
+ Writes record `agent:<agentId>` in `createdBy` and `updatedBy`. Source projections and join keys remain read-only. Each row input must fit within 1 MiB.
799
+
800
+ `app-rows-list` accepts `equals`, `sort: "<column>:asc|desc"`, and `limit` from 1 to 1000 (default 200).
801
+ Equality filters accept declared columns and system columns. Filter values must match the column kind and use strict equality.
802
+ `app-rows-delete` requires at least one equality filter and accepts a limit from 1 to 1000 (default 1000).
803
+
804
+ `app-action-run` returns the REST action body under `data`. Script actions run with the script owner's identity and receive the verified invoking agent as `caller`.
805
+ Scripts and extensions cannot invoke `app-action-run`.
@@ -13,6 +13,14 @@ Swarm Apps are persistent, agent-authored internal applications: a schema-backed
13
13
  | `app-upsert` | Create an app, or replace an existing app's entire definition when you intentionally have the full desired state. |
14
14
  | `app-patch` | Make a focused change while preserving everything not mentioned in the patch. Prefer this for iteration. |
15
15
  | `app-query` | Run one declared named query and return its rows. Use this when an agent or saved script needs to consume app data rather than render the app UI. |
16
+ | `app-rows-list` | List rows with typed equality filters, sorting, and a limit. Returns `{ rows, total }`. |
17
+ | `app-row-get` | Read a row by `rowId`. Returns `{ row }`. |
18
+ | `app-row-create` | Create a row from `values`. Returns `{ row }`. |
19
+ | `app-rows-create` | Create 1 to 500 rows from a `rows: values[]` array, within 10 MiB. Returns `{ rows }`. |
20
+ | `app-row-patch` | Patch a row by `rowId` with `values`. Returns `{ row }`. |
21
+ | `app-row-delete` | Delete a row by `rowId`. Returns `{ ok: true }`. |
22
+ | `app-rows-delete` | Delete matching rows with a non-empty `equals` filter. Returns `{ deleted }`. |
23
+ | `app-action-run` | Run a declared script, task, or sync action with `{ appId, action, input? }`. Agents can invoke it through MCP only. |
16
24
  | `app-history` | List definition snapshots and their compact model/column digests before choosing a restore point. |
17
25
  | `app-diff` | Show a unified definition diff; defaults to newest snapshot → CURRENT. |
18
26
  | `app-rollback` | Restore a snapshot through the normal schema-migration engine. |
@@ -23,7 +31,24 @@ For every edit: `app-get` -> modify the smallest coherent subtree -> `app-patch`
23
31
 
24
32
  ### Reading an app's callable surface
25
33
 
26
- One `app-get` returns everything needed to drive an app you did not write: `definition.queries` are runnable with `app-query` (supply every `$param` the query references), and `definition.actions` are invocable with `POST /api/apps/<id>/actions/<name>` (a `script` action runs its script, a `task` action spawns a task, a `sync` action refreshes sources). Read a query's `$param` placeholders and an action's kind/args from the definition before calling — do not guess parameter names.
34
+ One `app-get` returns everything needed to drive an app you did not write: `definition.queries` are runnable with `app-query` (supply every `$param` the query references), and `definition.actions` are invocable with `app-action-run` or `POST /api/apps/<id>/actions/<name>` (a `script` action runs its script, a `task` action spawns a task, a `sync` action refreshes sources). Read the query parameters and action arguments from the definition before invocation. Do not guess parameter names.
35
+
36
+ ### Verified action caller
37
+
38
+ Script actions receive `caller` as a reserved, server-stamped argument. The server overwrites `caller` from definition defaults and request input.
39
+
40
+ ```typescript
41
+ type AppActionCaller = {
42
+ kind: "user" | "agent" | "operator" | "guest";
43
+ id: string | null;
44
+ name?: string;
45
+ pageId?: string;
46
+ };
47
+ ```
48
+
49
+ The caller identifies the authenticated user or agent. Operator and guest callers have `id: null`. A signed page session adds `pageId`.
50
+ With the swarm key, a registered `X-Agent-ID` produces an agent caller and `agent:<id>` row provenance. Missing or unknown agent IDs remain operator callers.
51
+ Task actions include the same caller as server-verified JSON in the task prompt. Script execution still uses the saved script owner's bindings.
27
52
 
28
53
  ### Verified action caller
29
54
 
@@ -367,7 +392,7 @@ Use a task action named Tackle when a person should hand one issue row to the sw
367
392
 
368
393
  For direct MCP calls, `app-query` accepts `{ appId, query, params? }` and returns rows from that declared named query; every supplied param must be referenced by a `$param` filter in that query. Use it when an agent needs to read app state without scraping the UI.
369
394
 
370
- Saved scripts use the generated SDK name `ctx.swarm.app_query({ appId, query, params? })`. Use `app_query` in scripts or workflows that turn current app rows into reports, digests, or follow-up work. Saved scripts also get generated per-app types automatically: each app contributes an `App_<Name>` namespace with one row interface per model (enum columns as literal unions) and a typed `app_query` overload per named query, all visible via `script-query-types`. Actions stay REST-only from scripts — there is no SDK method to invoke them.
395
+ Saved scripts use the generated SDK name `ctx.swarm.app_query({ appId, query, params? })`. Use `app_query` in scripts or workflows that turn current app rows into reports, digests, or follow-up work. Saved scripts also get generated per-app types automatically: each app contributes an `App_<Name>` namespace with one row interface per model (enum columns as literal unions) and a typed `app_query` overload per named query, all visible via `script-query-types`. Scripts can create, list, get, patch, and delete rows with the seven row tools. Actions remain REST/MCP-only and have no script SDK method.
371
396
 
372
397
  ### Pages, routes, and page trees
373
398
 
@@ -759,3 +784,17 @@ The tool returns `{ appId, url: "/apps/<id>" }`. Open that URL to verify the liv
759
784
  - Logged-in browser: a fresh dashboard has no connection and redirects to /setup. Seed the localStorage key `agent-swarm-connections` with `{connections:[{id,name,apiUrl,apiKey}],activeId}`. Build the value from an env var and pipe it to `agent-browser eval --stdin`, so the key never reaches a command line. Reload, then pick a user in the "Who are you?" dialog.
760
785
  - Apps scroll inside an inner canvas, so a full-page screenshot captures only the viewport. Scroll the canvas or raise the viewport height. For mobile, set a 375px-wide viewport before the screenshot.
761
786
  - App definitions: `GET /api/apps` and `GET /api/apps/<id>` with the API key as Bearer.
787
+
788
+
789
+ ### Rows from agents and scripts
790
+
791
+ Every row tool requires `appId` and `model`. Scripts use underscore names, such as `ctx.swarm.app_row_create` and `ctx.swarm.app_rows_list`.
792
+ Results use the usual `data` wrapper, so scripts read `res?.data ?? res`. Rows contain system fields and declared columns at the top level.
793
+ Writes record `agent:<agentId>` in `createdBy` and `updatedBy`. Source projections and join keys remain read-only. Each row input must fit within 1 MiB.
794
+
795
+ `app-rows-list` accepts `equals`, `sort: "<column>:asc|desc"`, and `limit` from 1 to 1000 (default 200).
796
+ Equality filters accept declared columns and system columns. Filter values must match the column kind and use strict equality.
797
+ `app-rows-delete` requires at least one equality filter and accepts a limit from 1 to 1000 (default 1000).
798
+
799
+ `app-action-run` returns the REST action body under `data`. Script actions run with the script owner's identity and receive the verified invoking agent as `caller`.
800
+ Scripts and extensions cannot invoke `app-action-run`.
@@ -1,39 +0,0 @@
1
- import {
2
- isUserAllowed2,
3
- registerMessageHandler2
4
- } from "./cli-avmqhatn.js";
5
- import"./cli-1cevz46c.js";
6
- import"./cli-x1p5dhq2.js";
7
- import"./cli-x719j3vs.js";
8
- import"./cli-rdr166ht.js";
9
- import"./cli-2rwet3r7.js";
10
- import"./cli-qz93y3x5.js";
11
- import"./cli-3h26v7yj.js";
12
- import"./cli-7a91w22y.js";
13
- import"./cli-ttaz6c7m.js";
14
- import"./cli-nrrg0fvy.js";
15
- import"./cli-3ggwdtb0.js";
16
- import"./cli-b80a1100.js";
17
- import"./cli-kk2r80n5.js";
18
- import"./cli-tg9ksbn8.js";
19
- import"./cli-qje9k2nh.js";
20
- import"./cli-nme7wery.js";
21
- import"./cli-tj4j2ts4.js";
22
- import"./cli-bn26xbcs.js";
23
- import"./cli-vjfpshn3.js";
24
- import"./cli-02vhhssk.js";
25
- import"./cli-13p25grh.js";
26
- import"./cli-0adyhvq2.js";
27
- import"./cli-4fhyq711.js";
28
- import"./cli-xfe63zx3.js";
29
- import"./cli-6ftrrwm1.js";
30
- import"./cli-8cxkw1f5.js";
31
- import"./cli-445c1vp7.js";
32
- import"./cli-kvzgak7c.js";
33
- import"./cli-5s5hx57y.js";
34
- import"./cli-rg7ntypm.js";
35
- import"./cli-ptkpaqfy.js";
36
- export {
37
- isUserAllowed2 as isUserAllowed,
38
- registerMessageHandler2 as registerMessageHandler
39
- };
@@ -1,40 +0,0 @@
1
- import {
2
- calculateNextRun2,
3
- startScheduler2,
4
- stopScheduler2,
5
- runScheduleNow2
6
- } from "./cli-x719j3vs.js";
7
- import"./cli-rdr166ht.js";
8
- import"./cli-2rwet3r7.js";
9
- import"./cli-qz93y3x5.js";
10
- import"./cli-3h26v7yj.js";
11
- import"./cli-7a91w22y.js";
12
- import"./cli-ttaz6c7m.js";
13
- import"./cli-nrrg0fvy.js";
14
- import"./cli-3ggwdtb0.js";
15
- import"./cli-b80a1100.js";
16
- import"./cli-kk2r80n5.js";
17
- import"./cli-tg9ksbn8.js";
18
- import"./cli-qje9k2nh.js";
19
- import"./cli-nme7wery.js";
20
- import"./cli-tj4j2ts4.js";
21
- import"./cli-bn26xbcs.js";
22
- import"./cli-vjfpshn3.js";
23
- import"./cli-02vhhssk.js";
24
- import"./cli-13p25grh.js";
25
- import"./cli-0adyhvq2.js";
26
- import"./cli-4fhyq711.js";
27
- import"./cli-xfe63zx3.js";
28
- import"./cli-6ftrrwm1.js";
29
- import"./cli-8cxkw1f5.js";
30
- import"./cli-445c1vp7.js";
31
- import"./cli-kvzgak7c.js";
32
- import"./cli-5s5hx57y.js";
33
- import"./cli-rg7ntypm.js";
34
- import"./cli-ptkpaqfy.js";
35
- export {
36
- calculateNextRun2 as calculateNextRun,
37
- runScheduleNow2 as runScheduleNow,
38
- startScheduler2 as startScheduler,
39
- stopScheduler2 as stopScheduler
40
- };
@@ -1,41 +0,0 @@
1
- import"./cli-ns59dc6r.js";
2
- import {
3
- startHeartbeat2,
4
- stopHeartbeat2
5
- } from "./cli-bhwa8rzc.js";
6
- import"./cli-rsd7ga7v.js";
7
- import"./cli-eqgfs202.js";
8
- import"./cli-x719j3vs.js";
9
- import"./cli-rdr166ht.js";
10
- import"./cli-2rwet3r7.js";
11
- import"./cli-qz93y3x5.js";
12
- import"./cli-3h26v7yj.js";
13
- import"./cli-7a91w22y.js";
14
- import"./cli-ttaz6c7m.js";
15
- import"./cli-nrrg0fvy.js";
16
- import"./cli-3ggwdtb0.js";
17
- import"./cli-b80a1100.js";
18
- import"./cli-kk2r80n5.js";
19
- import"./cli-tg9ksbn8.js";
20
- import"./cli-qje9k2nh.js";
21
- import"./cli-nme7wery.js";
22
- import"./cli-tj4j2ts4.js";
23
- import"./cli-bn26xbcs.js";
24
- import"./cli-vjfpshn3.js";
25
- import"./cli-02vhhssk.js";
26
- import"./cli-13p25grh.js";
27
- import"./cli-0adyhvq2.js";
28
- import"./cli-4fhyq711.js";
29
- import"./cli-xfe63zx3.js";
30
- import"./cli-6ftrrwm1.js";
31
- import"./cli-8cxkw1f5.js";
32
- import"./cli-445c1vp7.js";
33
- import"./cli-kvzgak7c.js";
34
- import"./cli-b2mz5mjc.js";
35
- import"./cli-5s5hx57y.js";
36
- import"./cli-rg7ntypm.js";
37
- import"./cli-ptkpaqfy.js";
38
- export {
39
- startHeartbeat2 as startHeartbeat,
40
- stopHeartbeat2 as stopHeartbeat
41
- };