@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
@@ -280,7 +280,7 @@ import {
280
280
  hasCapability,
281
281
  getEnabledCapabilities,
282
282
  createServer
283
- } from "./cli-x719j3vs.js";
283
+ } from "./cli-kr2pmfqx.js";
284
284
  import {
285
285
  chatThreadOfContextKey,
286
286
  agentContextKey,
@@ -288,6 +288,10 @@ import {
288
288
  init_context_key,
289
289
  init_catalog,
290
290
  catalog_default,
291
+ COMPANY_TEAM_SIZES,
292
+ COMPANY_USE_CASES,
293
+ USER_FUNCTIONS,
294
+ init_company_profile,
291
295
  TELEMETRY_PROXY_ORIGIN,
292
296
  normalizeOrgWebsite,
293
297
  orgLogoUrl,
@@ -302,6 +306,7 @@ import {
302
306
  _resolveIntegrationType,
303
307
  _resolveIntegrationProvider,
304
308
  setTelemetryRoleResolver,
309
+ setTelemetryFunctionResolver,
305
310
  isTelemetryReady,
306
311
  trackRelayed,
307
312
  telemetry,
@@ -326,6 +331,7 @@ import {
326
331
  getDbClient2,
327
332
  init_runtime,
328
333
  cachedUserRole,
334
+ cachedUserFunction,
329
335
  configureOrgDomainPersistence,
330
336
  recomputeOrgDomain,
331
337
  init_telemetry_identity,
@@ -422,11 +428,7 @@ import {
422
428
  RANKING_CATEGORIES,
423
429
  readTelemetryRanking,
424
430
  rankingFormSchema,
425
- mintRankingClaim,
426
431
  buildListing,
427
- rankingEntryFile,
428
- rankingPrUrl,
429
- rankingLeaveUrl,
430
432
  init_telemetry_ranking,
431
433
  API_DRAINING_HEADER,
432
434
  init_api_drain,
@@ -712,26 +714,26 @@ import {
712
714
  countScriptRunJournalSteps2,
713
715
  countScriptRunJournalAgentTaskSteps2,
714
716
  init_db3
715
- } from "./cli-rg7ntypm.js";
717
+ } from "./cli-rqqsfz30.js";
716
718
  import {
717
719
  getUserGrant2,
718
720
  init_rbac_roles
719
- } from "./cli-5s5hx57y.js";
720
- import"./cli-kk2r80n5.js";
721
+ } from "./cli-nx462e4v.js";
722
+ import"./cli-s48yvzb8.js";
721
723
  import {
722
724
  normalizeModelKey
723
- } from "./cli-tg9ksbn8.js";
725
+ } from "./cli-3p8fqcnh.js";
724
726
  import {
725
727
  upsertModelCatalogOverlay,
726
728
  deleteModelCatalogOverlay,
727
729
  loadModelsCatalog,
728
730
  requestModelCatalogRefresh2
729
- } from "./cli-ttaz6c7m.js";
731
+ } from "./cli-k9z4zd4p.js";
730
732
  import {
731
733
  AMP_ESTIMATE_MODELS,
732
734
  ampBillsCacheWrites,
733
735
  resolveAmpModel
734
- } from "./cli-2rwet3r7.js";
736
+ } from "./cli-sv5gb0yb.js";
735
737
  import {
736
738
  automationIntegrationFixUrl,
737
739
  preflightAutomation,
@@ -743,7 +745,7 @@ import {
743
745
  cancelWorkflowRun2,
744
746
  TriggerSchemaError,
745
747
  startWorkflowExecution2
746
- } from "./cli-nme7wery.js";
748
+ } from "./cli-kmqgmcnb.js";
747
749
  import {
748
750
  require_dist2,
749
751
  isInvalidClientError,
@@ -823,14 +825,14 @@ import {
823
825
  typecheckWithAmbient,
824
826
  typecheckScript,
825
827
  parseSkillContent
826
- } from "./cli-nrrg0fvy.js";
828
+ } from "./cli-0bh477zn.js";
827
829
  import {
828
830
  buildAuthorizationUrl,
829
831
  exchangeAuthorizationCode,
830
832
  oauthAppRowToProviderConfig,
831
833
  forceRefreshAuthorizationOrThrow,
832
834
  forceRefreshTokenOrThrow
833
- } from "./cli-b80a1100.js";
835
+ } from "./cli-sjyetj21.js";
834
836
  import {
835
837
  signalProcessGroup,
836
838
  detachedProcessGroup,
@@ -858,15 +860,15 @@ import {
858
860
  getSlackApp2,
859
861
  startSlackApp2,
860
862
  stopSlackApp2
861
- } from "./cli-4fhyq711.js";
862
- import"./cli-xfe63zx3.js";
863
+ } from "./cli-vy0fay6k.js";
864
+ import"./cli-mfe7f7b5.js";
863
865
  import {
864
866
  createApprovalFollowUpTask,
865
867
  generateEdges,
866
868
  definitionNodeIds,
867
869
  validateDefinition
868
- } from "./cli-tj4j2ts4.js";
869
- import"./cli-bn26xbcs.js";
870
+ } from "./cli-tbhwrxpt.js";
871
+ import"./cli-8nyhf7za.js";
870
872
  import {
871
873
  _fetchHolder,
872
874
  CLIENT_ID,
@@ -877,11 +879,11 @@ import {
877
879
  codexOAuthKeyForSlot,
878
880
  loadAllCodexOAuthSlots,
879
881
  getValidCodexOAuth
880
- } from "./cli-vjfpshn3.js";
882
+ } from "./cli-ejs3m1sx.js";
881
883
  import {
882
884
  workflowEventBus2,
883
885
  init_event_bus
884
- } from "./cli-ptkpaqfy.js";
886
+ } from "./cli-wt645v7q.js";
885
887
  import {
886
888
  duplicateGuardedQueryKey,
887
889
  warnIfCorsAllowsAnyOrigin,
@@ -923,7 +925,7 @@ import {
923
925
  bodyListTask,
924
926
  describeRequestRoute,
925
927
  route
926
- } from "./cli-02vhhssk.js";
928
+ } from "./cli-z071fb95.js";
927
929
  import {
928
930
  isMultiRuntimeEnabled
929
931
  } from "./cli-7a91w22y.js";
@@ -954,13 +956,13 @@ import {
954
956
  resolvePoolDelivery2,
955
957
  createPoolAgent2,
956
958
  init_db
957
- } from "./cli-6ftrrwm1.js";
959
+ } from "./cli-bn5kevnf.js";
958
960
  import {
959
961
  RATING_MODEL_MAX_LENGTH,
960
962
  REFERENCES_SOURCE_MAX_LENGTH,
961
963
  sanitizeReferencesSource
962
964
  } from "./cli-3h26v7yj.js";
963
- import"./cli-rdr166ht.js";
965
+ import"./cli-smvcw9z5.js";
964
966
  import {
965
967
  startPoolRouting,
966
968
  stopPoolRouting,
@@ -970,8 +972,8 @@ import {
970
972
  checkHeartbeatChecklist2,
971
973
  runHeartbeatSweep2,
972
974
  stopHeartbeat2
973
- } from "./cli-bhwa8rzc.js";
974
- import"./cli-eqgfs202.js";
975
+ } from "./cli-rdq7tzwm.js";
976
+ import"./cli-hqhzg1qq.js";
975
977
  import {
976
978
  import_websocket,
977
979
  import_websocket_server
@@ -980,15 +982,15 @@ import {
980
982
  runtimeSupervisorStatus,
981
983
  startRuntimeSupervisor,
982
984
  stopRuntimeSupervisor
983
- } from "./cli-rsd7ga7v.js";
985
+ } from "./cli-axh29tyr.js";
984
986
  import"./cli-ns59dc6r.js";
985
987
  import {
986
988
  ACP_TARGET_IDS
987
- } from "./cli-a49vpbf3.js";
989
+ } from "./cli-5kqnemen.js";
988
990
  import {
989
991
  reasoningCapability,
990
992
  supportedReasoningLevels
991
- } from "./cli-p22zdvnt.js";
993
+ } from "./cli-bn0rewsy.js";
992
994
  import {
993
995
  MAX_RATE_LIMIT_RESET_MS
994
996
  } from "./cli-gx4rm0qx.js";
@@ -1000,11 +1002,11 @@ import {
1000
1002
  memoryRelevance,
1001
1003
  isUnknownModelError,
1002
1004
  writeSkillsToFilesystem
1003
- } from "./cli-wrv09v7q.js";
1005
+ } from "./cli-m2qgh5sv.js";
1004
1006
  import {
1005
1007
  inviteEmailToSharedOrg,
1006
1008
  ensureAgentFsCredentialsForAgent
1007
- } from "./cli-5ff2sjyt.js";
1009
+ } from "./cli-syhq378v.js";
1008
1010
  import {
1009
1011
  Anthropic
1010
1012
  } from "./cli-er83cjbn.js";
@@ -1039,7 +1041,7 @@ import {
1039
1041
  revokeSessionToken,
1040
1042
  fingerprintApiKey,
1041
1043
  init_users
1042
- } from "./cli-8cxkw1f5.js";
1044
+ } from "./cli-fz9kewbh.js";
1043
1045
  import"./cli-v41kn3cd.js";
1044
1046
  import"./cli-wgtk7xxr.js";
1045
1047
  import {
@@ -1131,6 +1133,7 @@ import {
1131
1133
  RuntimePoolSchema,
1132
1134
  RuntimePoolCreateAgentSchema,
1133
1135
  RuntimeInstanceSchema,
1136
+ SUPERSEDED_WORKFLOW_TASK_REASON,
1134
1137
  WorkflowEdgeSchema,
1135
1138
  WorkflowDefinitionSchema,
1136
1139
  WorkflowNodePatchSchema,
@@ -1194,12 +1197,12 @@ import {
1194
1197
  KvKeySchema,
1195
1198
  KvEntrySchema,
1196
1199
  init_types
1197
- } from "./cli-a1esmmee.js";
1200
+ } from "./cli-fpmsqq59.js";
1198
1201
  import {
1199
1202
  IDENTITY_FIELD_BUDGETS,
1200
1203
  IdentityFieldBudgetError,
1201
1204
  init_identity_field_budget
1202
- } from "./cli-wyrr38xm.js";
1205
+ } from "./cli-x5mq1fyq.js";
1203
1206
  import {
1204
1207
  getSlackConfiguration,
1205
1208
  init_config
@@ -1267,7 +1270,7 @@ import {
1267
1270
  import {
1268
1271
  init_package,
1269
1272
  package_default
1270
- } from "./cli-mz1ezzzh.js";
1273
+ } from "./cli-ash6xxk7.js";
1271
1274
  import {
1272
1275
  realtimeBus,
1273
1276
  init_bus
@@ -1296,11 +1299,11 @@ import {
1296
1299
  scrubObject,
1297
1300
  registerVolatileSecret,
1298
1301
  init_secret_scrubber
1299
- } from "./cli-4mkvwgzr.js";
1302
+ } from "./cli-xf234ws8.js";
1300
1303
  import {
1301
1304
  isAlias,
1302
1305
  init_src2
1303
- } from "./cli-x3en6ct3.js";
1306
+ } from "./cli-nwyw3zhg.js";
1304
1307
  import {
1305
1308
  __toESM
1306
1309
  } from "./cli-242037k3.js";
@@ -3891,6 +3894,7 @@ function startTelemetryTicker(deps) {
3891
3894
  return;
3892
3895
  stopTelemetryTicker();
3893
3896
  setTelemetryRoleResolver(cachedUserRole);
3897
+ setTelemetryFunctionResolver(cachedUserFunction);
3894
3898
  const tick = async () => {
3895
3899
  try {
3896
3900
  await recomputeOrgDomain();
@@ -3921,6 +3925,7 @@ function stopTelemetryTicker() {
3921
3925
  tickTimer = null;
3922
3926
  firstTimer = null;
3923
3927
  setTelemetryRoleResolver(null);
3928
+ setTelemetryFunctionResolver(null);
3924
3929
  configureOrgDomainPersistence(null);
3925
3930
  }
3926
3931
 
@@ -5220,6 +5225,7 @@ async function handleAgentsRest(req, res, pathSegments, queryParams, myAgentId)
5220
5225
  reportedAt: parsed.body.latest_model?.reportedAt ?? parsed.body.acp.reportedAt,
5221
5226
  reportKind: "post_task",
5222
5227
  bedrock: null,
5228
+ opencodeGo: null,
5223
5229
  acp: null
5224
5230
  };
5225
5231
  finalAgent = await updateAgentCredStatus2(parsed.params.id, {
@@ -7400,6 +7406,10 @@ function deriveState(state, signals, funnelEvents) {
7400
7406
  if (state.steps.connect.status !== "done") {
7401
7407
  changed = completeStep(state, "connect", "api_key", true, events) || changed;
7402
7408
  }
7409
+ const orgName = process.env.SWARM_ORG_NAME?.trim();
7410
+ if (state.steps.name.status !== "done" && orgName && orgName !== "Your Swarm") {
7411
+ changed = completeStep(state, "name", "custom_name", true, events) || changed;
7412
+ }
7403
7413
  if (state.steps.ai.status !== "done" && signals.providers.some((entry) => entry.state === "verified")) {
7404
7414
  changed = completeStep(state, "ai", inferAiMethod(signals), true, events) || changed;
7405
7415
  }
@@ -7703,31 +7713,50 @@ init_telemetry_ranking();
7703
7713
  init_telemetry();
7704
7714
  init_env_flag();
7705
7715
 
7716
+ // src/http/global-config.ts
7717
+ init_db3();
7718
+ async function globalConfig(key) {
7719
+ const stored = (await getSwarmConfigs2({ scope: "global", key }))?.[0]?.value;
7720
+ return (stored ?? process.env[key])?.trim() || undefined;
7721
+ }
7722
+
7706
7723
  // src/http/used-by.ts
7707
7724
  init_zod();
7708
7725
  init_db3();
7709
7726
  init_telemetry();
7727
+ init_company_profile();
7710
7728
  init_org_website();
7711
7729
  var CONSENT_KEY = "SWARM_USED_BY_CONSENT";
7712
7730
  var CONSENT_AT_KEY = "SWARM_USED_BY_CONSENT_AT";
7713
7731
  var GRANTED_NAME_KEY = "SWARM_USED_BY_ORG_NAME";
7714
7732
  var GRANTED_WEBSITE_KEY = "SWARM_USED_BY_ORG_WEBSITE";
7733
+ var CONTACT_EMAIL_KEY = "SWARM_USED_BY_CONTACT_EMAIL";
7734
+ var CONTACT_FUNCTION_KEY = "SWARM_USED_BY_CONTACT_FUNCTION";
7735
+ var QUOTE_KEY = "SWARM_USED_BY_QUOTE";
7715
7736
  var TIMEOUT_MS = 1e4;
7716
7737
  var usedBy = route({
7717
7738
  method: "post",
7718
7739
  path: "/api/used-by",
7719
7740
  pattern: ["api", "used-by"],
7720
7741
  summary: "Grant or revoke the 'used by' logo consent",
7721
- description: "Records whether agent-swarm.dev may show this organization's logo as a company that uses Agent Swarm. Sends the organization name and website to the telemetry proxy, where a person approves each logo by hand. An explicit admin action, so it is not gated by the telemetry opt-out.",
7742
+ description: "Records consent to show the organization's logo on agent-swarm.dev. A grant requires a valid contact email. It sends organization identity, contact details, and an optional quote to the proxy for manual review. This explicit admin action works when telemetry is off. A revoke clears the stored contact details and quote.",
7722
7743
  tags: ["Telemetry"],
7723
- body: object2({ granted: boolean() }),
7744
+ body: object2({
7745
+ granted: boolean(),
7746
+ contactEmail: string2().max(320, "Contact email must be at most 320 characters").email("Contact email must be a valid email address").optional(),
7747
+ contactFunction: _enum2(USER_FUNCTIONS).optional(),
7748
+ quote: string2().max(280).optional()
7749
+ }).refine((body) => !body.granted || body.contactEmail !== undefined, {
7750
+ path: ["contactEmail"],
7751
+ message: "Contact email is required when granting logo consent"
7752
+ }),
7724
7753
  responses: {
7725
7754
  200: {
7726
7755
  description: "Consent recorded",
7727
7756
  schema: object2({ granted: boolean(), changedAt: string2() })
7728
7757
  },
7729
7758
  400: {
7730
- description: "Organization name or website is not set (a revoke falls back to the identity of the last grant)"
7759
+ description: "Invalid contact details, or missing organization name or website"
7731
7760
  },
7732
7761
  401: { description: "Unauthorized" },
7733
7762
  403: { description: "Only a config admin can change the consent" },
@@ -7735,10 +7764,6 @@ var usedBy = route({
7735
7764
  },
7736
7765
  rbac: { permission: "config.write.any" }
7737
7766
  });
7738
- async function globalConfig(key) {
7739
- const stored = (await getSwarmConfigs2({ scope: "global", key }))?.[0]?.value?.trim();
7740
- return stored || process.env[key]?.trim() || undefined;
7741
- }
7742
7767
  async function telemetryProxyEndpoint(path) {
7743
7768
  const feedback = await globalConfig("feedback_endpoint");
7744
7769
  if (feedback && /^https?:\/\/[^/]+\/v1\/feedback\/?$/.test(feedback)) {
@@ -7757,7 +7782,7 @@ async function handleUsedBy(req, res, pathSegments, queryParams, myAgentId) {
7757
7782
  return true;
7758
7783
  if (!await ensureConfigAdmin(req, res, "config.write.any"))
7759
7784
  return true;
7760
- const { granted } = parsed.body;
7785
+ const { granted, contactEmail, contactFunction, quote } = parsed.body;
7761
7786
  const current = orgIdentityStatus({
7762
7787
  SWARM_ORG_NAME: await globalConfig("SWARM_ORG_NAME"),
7763
7788
  SWARM_ORG_WEBSITE: await globalConfig("SWARM_ORG_WEBSITE")
@@ -7784,6 +7809,7 @@ async function handleUsedBy(req, res, pathSegments, queryParams, myAgentId) {
7784
7809
  org_website: orgWebsite,
7785
7810
  ...orgDomain ? { org_domain: orgDomain } : {},
7786
7811
  granted,
7812
+ ...granted ? { contact_email: contactEmail, contact_function: contactFunction, quote } : {},
7787
7813
  changed_at: changedAt
7788
7814
  }),
7789
7815
  signal: AbortSignal.timeout(TIMEOUT_MS)
@@ -7796,15 +7822,34 @@ async function handleUsedBy(req, res, pathSegments, queryParams, myAgentId) {
7796
7822
  jsonError(res, "Could not reach the telemetry proxy", 502);
7797
7823
  return true;
7798
7824
  }
7799
- await upsertSwarmConfig2({ scope: "global", key: CONSENT_KEY, value: String(granted) });
7800
- await upsertSwarmConfig2({ scope: "global", key: CONSENT_AT_KEY, value: changedAt });
7801
- if (granted) {
7802
- await upsertSwarmConfig2({ scope: "global", key: GRANTED_NAME_KEY, value: orgName });
7803
- await upsertSwarmConfig2({ scope: "global", key: GRANTED_WEBSITE_KEY, value: orgWebsite });
7804
- }
7825
+ await getDbClient2().transaction(async () => {
7826
+ await upsertSwarmConfig2({ scope: "global", key: CONSENT_KEY, value: String(granted) });
7827
+ await upsertSwarmConfig2({ scope: "global", key: CONSENT_AT_KEY, value: changedAt });
7828
+ if (granted) {
7829
+ await upsertSwarmConfig2({ scope: "global", key: GRANTED_NAME_KEY, value: orgName });
7830
+ await upsertSwarmConfig2({ scope: "global", key: GRANTED_WEBSITE_KEY, value: orgWebsite });
7831
+ }
7832
+ for (const [key, value, isSecret] of [
7833
+ [CONTACT_EMAIL_KEY, contactEmail, true],
7834
+ [CONTACT_FUNCTION_KEY, contactFunction, false],
7835
+ [QUOTE_KEY, quote, false]
7836
+ ]) {
7837
+ await upsertSwarmConfig2({
7838
+ scope: "global",
7839
+ key,
7840
+ value: granted ? value ?? "" : "",
7841
+ isSecret,
7842
+ exportToEnv: false
7843
+ });
7844
+ }
7845
+ });
7805
7846
  scheduleIntegrationsReload();
7806
7847
  const owner = await resolveHttpFavoriteOwner(req, myAgentId);
7807
- trackRelayed("used_by.consent_changed", { granted }, { actor: owner?.userId ? { userId: owner.userId } : undefined, emitter: "ui" });
7848
+ trackRelayed("used_by.consent_changed", {
7849
+ granted,
7850
+ has_quote: granted && Boolean(quote),
7851
+ has_function: granted && Boolean(contactFunction)
7852
+ }, { actor: owner?.userId ? { userId: owner.userId } : undefined, emitter: "ui" });
7808
7853
  usedBy.respond(res, 200, { granted, changedAt });
7809
7854
  return true;
7810
7855
  }
@@ -7812,7 +7857,6 @@ async function handleUsedBy(req, res, pathSegments, queryParams, myAgentId) {
7812
7857
  // src/http/ranking.ts
7813
7858
  var ListingSchema = object2({
7814
7859
  v: literal2(1),
7815
- claim: string2(),
7816
7860
  name: string2(),
7817
7861
  domain: string2(),
7818
7862
  category: _enum2(RANKING_CATEGORIES),
@@ -7830,28 +7874,22 @@ var RankingStateSchema = object2({
7830
7874
  domain: string2().nullable(),
7831
7875
  listing: ListingSchema.nullable(),
7832
7876
  listingMatchesDomain: boolean(),
7833
- fileJson: string2().nullable(),
7834
- prUrl: string2().nullable(),
7835
7877
  verifyUrl: string2().nullable()
7836
7878
  });
7837
7879
  var OptInResponseSchema = object2({
7838
7880
  domain: string2(),
7839
- claim: string2(),
7840
7881
  listing: ListingSchema,
7841
- fileJson: string2(),
7842
- prUrl: string2(),
7843
7882
  verifyUrl: string2()
7844
7883
  });
7845
7884
  var OptOutResponseSchema = object2({
7846
- enabled: literal2(false),
7847
- leaveUrl: string2().nullable()
7885
+ enabled: literal2(false)
7848
7886
  });
7849
7887
  var getRanking = route({
7850
7888
  method: "get",
7851
7889
  path: "/api/ranking",
7852
7890
  pattern: ["api", "ranking"],
7853
7891
  summary: "Public ranking state",
7854
- description: "Whether this install can join the public agent-swarm.dev ranking (telemetry on, organization name and website set), whether it is opted in, and its stored listing. The listing carries the private ranking claim, so only a config admin can read it.",
7892
+ description: "Whether this install can join the public agent-swarm.dev ranking (telemetry on, organization name and website set), whether it is opted in, and its stored listing. Only a config admin can read it.",
7855
7893
  tags: ["Telemetry"],
7856
7894
  responses: {
7857
7895
  200: { description: "Ranking state", schema: RankingStateSchema },
@@ -7865,7 +7903,7 @@ var optIn = route({
7865
7903
  path: "/api/ranking/opt-in",
7866
7904
  pattern: ["api", "ranking", "opt-in"],
7867
7905
  summary: "Opt this install into the public ranking",
7868
- description: "Builds the telemetry_ranking listing from the organization name and website plus the chosen category, stores it, turns PUBLIC_RANKING_ENABLED on and sends ranking.opted_in. The install is ranked only after a ranking PR with the returned file is merged into desplega-ai/agent-swarm.",
7906
+ description: "Builds the telemetry_ranking listing from the organization name and website plus the chosen category, stores it, turns PUBLIC_RANKING_ENABLED on and sends ranking.opted_in. That is the whole opt-in: the install shows on agent-swarm.dev/ranking at the next hourly refresh.",
7869
7907
  tags: ["Telemetry"],
7870
7908
  body: rankingFormSchema,
7871
7909
  responses: {
@@ -7884,7 +7922,7 @@ var optOut = route({
7884
7922
  path: "/api/ranking/opt-out",
7885
7923
  pattern: ["api", "ranking", "opt-out"],
7886
7924
  summary: "Leave the public ranking",
7887
- description: "Turns PUBLIC_RANKING_ENABLED off and sends ranking.opted_out, so workers stop sending ranking.usage. Returns the GitHub page that deletes the ranking entry.",
7925
+ description: "Turns PUBLIC_RANKING_ENABLED off and sends ranking.opted_out, so workers stop sending ranking.usage. The install leaves agent-swarm.dev/ranking at the next hourly refresh.",
7888
7926
  tags: ["Telemetry"],
7889
7927
  responses: {
7890
7928
  200: { description: "Opted out", schema: OptOutResponseSchema },
@@ -7913,10 +7951,14 @@ async function rankingEnabled() {
7913
7951
  async function telemetryReady() {
7914
7952
  return isTelemetryEnabled() && Boolean(await globalConfig("telemetry_installation_id"));
7915
7953
  }
7916
- async function verifyUrl(listing) {
7917
- const params = new URLSearchParams({ domain: listing.domain, claim: listing.claim });
7954
+ async function verifyUrl(domain) {
7955
+ const params = new URLSearchParams({ domain });
7918
7956
  return `${await telemetryProxyEndpoint("/v1/ranking/verify")}?${params.toString()}`;
7919
7957
  }
7958
+ function withoutClaim(listing) {
7959
+ const { claim: _claim, ...rest } = listing;
7960
+ return rest;
7961
+ }
7920
7962
  async function setEnabled(enabled) {
7921
7963
  await upsertSwarmConfig2({
7922
7964
  scope: "global",
@@ -7925,7 +7967,7 @@ async function setEnabled(enabled) {
7925
7967
  });
7926
7968
  }
7927
7969
  function emitOptedIn(listing) {
7928
- telemetry.ranking("opted_in", { listing: JSON.stringify(listing) }, { orgName: listing.name, orgWebsite: listing.domain });
7970
+ telemetry.ranking("opted_in", { listing: JSON.stringify(withoutClaim(listing)) }, { orgName: listing.name, orgWebsite: listing.domain });
7929
7971
  }
7930
7972
  function emitOptedOut(domain) {
7931
7973
  telemetry.ranking("opted_out", { domain });
@@ -7946,11 +7988,9 @@ async function buildRankingState() {
7946
7988
  enabled: enabled && listingMatchesDomain,
7947
7989
  name: identity.name,
7948
7990
  domain: identity.website,
7949
- listing,
7991
+ listing: listing ? withoutClaim(listing) : null,
7950
7992
  listingMatchesDomain,
7951
- fileJson: current ? rankingEntryFile(current) : null,
7952
- prUrl: current ? rankingPrUrl(current) : null,
7953
- verifyUrl: current ? await verifyUrl(current) : null
7993
+ verifyUrl: current ? await verifyUrl(current.domain) : null
7954
7994
  };
7955
7995
  }
7956
7996
  async function syncRankingAfterConfigChange(key, value) {
@@ -7973,7 +8013,7 @@ async function syncRankingAfterConfigChange(key, value) {
7973
8013
  if (identity.name === listing.name)
7974
8014
  return;
7975
8015
  try {
7976
- rebuilt = buildListing(identity, listing, listing.claim);
8016
+ rebuilt = buildListing(identity, listing);
7977
8017
  } catch {}
7978
8018
  }
7979
8019
  if (!rebuilt) {
@@ -8024,14 +8064,11 @@ async function handleRanking(req, res, pathSegments, queryParams) {
8024
8064
  });
8025
8065
  return true;
8026
8066
  }
8027
- const website = identity.website;
8028
8067
  const db = getDbClient2();
8029
8068
  const built = await db.transaction(async () => {
8030
- const stored = await storedListing();
8031
- const claim = stored?.domain === website ? stored.claim : mintRankingClaim();
8032
8069
  let listing;
8033
8070
  try {
8034
- listing = buildListing(identity, parsed.body, claim);
8071
+ listing = buildListing(identity, parsed.body);
8035
8072
  } catch (error) {
8036
8073
  return { ok: false, error };
8037
8074
  }
@@ -8056,11 +8093,8 @@ async function handleRanking(req, res, pathSegments, queryParams) {
8056
8093
  scheduleIntegrationsReload();
8057
8094
  optIn.respond(res, 200, {
8058
8095
  domain: listing.domain,
8059
- claim: listing.claim,
8060
8096
  listing,
8061
- fileJson: rankingEntryFile(listing),
8062
- prUrl: rankingPrUrl(listing),
8063
- verifyUrl: await verifyUrl(listing)
8097
+ verifyUrl: await verifyUrl(listing.domain)
8064
8098
  });
8065
8099
  return true;
8066
8100
  }
@@ -8075,10 +8109,7 @@ async function handleRanking(req, res, pathSegments, queryParams) {
8075
8109
  if (listing)
8076
8110
  emitOptedOut(listing.domain);
8077
8111
  scheduleIntegrationsReload();
8078
- optOut.respond(res, 200, {
8079
- enabled: false,
8080
- leaveUrl: listing ? rankingLeaveUrl(listing.domain) : null
8081
- });
8112
+ optOut.respond(res, 200, { enabled: false });
8082
8113
  return true;
8083
8114
  }
8084
8115
  return false;
@@ -12926,7 +12957,6 @@ async function handleFavorites(req, res, pathSegments, queryParams, myAgentId) {
12926
12957
 
12927
12958
  // src/http/fleet-benchmark.ts
12928
12959
  init_zod();
12929
- init_db3();
12930
12960
 
12931
12961
  // src/fleet-benchmark.ts
12932
12962
  var FLEET_WINDOW_DAYS = 30;
@@ -13005,8 +13035,8 @@ function round(value, decimals) {
13005
13035
 
13006
13036
  // src/be/fleet-benchmark-stats.ts
13007
13037
  init_runtime();
13008
- async function getLocalFleetStats(now = new Date) {
13009
- const start = fleetCountStart(await getTelemetryIngestAnchor(), now);
13038
+ async function getLocalFleetStats(now = new Date, { requireIngestAnchor = true } = {}) {
13039
+ const start = requireIngestAnchor ? fleetCountStart(await getTelemetryIngestAnchor(), now) : new Date(now.getTime() - FLEET_WINDOW_DAYS * 86400000);
13010
13040
  if (!start)
13011
13041
  return null;
13012
13042
  const since = start.toISOString();
@@ -13027,6 +13057,8 @@ async function getLocalFleetStats(now = new Date) {
13027
13057
 
13028
13058
  // src/http/fleet-benchmark.ts
13029
13059
  init_telemetry();
13060
+ init_company_profile();
13061
+ init_org_website();
13030
13062
  var FLEET_TTL_MS = 24 * 60 * 60 * 1000;
13031
13063
  var FLEET_FAILURE_TTL_MS = 60 * 60 * 1000;
13032
13064
  var LOCAL_TTL_MS = 10 * 60 * 1000;
@@ -13040,6 +13072,12 @@ var FleetStateSchema = _enum2([
13040
13072
  ]);
13041
13073
  var FleetBenchmarkResponseSchema = object2({
13042
13074
  state: FleetStateSchema,
13075
+ level: _enum2(["basic", "full"]),
13076
+ peerGroup: object2({
13077
+ teamSize: string2().nullable(),
13078
+ useCase: string2().nullable(),
13079
+ orgs: number2().int()
13080
+ }).nullable(),
13043
13081
  local: object2({
13044
13082
  tasksPerWeek: number2(),
13045
13083
  taskSuccessRate: number2().nullable(),
@@ -13063,7 +13101,7 @@ var fleetBenchmark = route({
13063
13101
  path: "/api/fleet-benchmark",
13064
13102
  pattern: ["api", "fleet-benchmark"],
13065
13103
  summary: "Compare this swarm with similar swarms",
13066
- description: "Places this swarm's tasks per week and task success rate (last 30 days) in the fleet percentiles published by the telemetry proxy, against swarms with the same agent count when enough exist. Needs telemetry on and an organization name; otherwise `state` says what is missing and the proxy is not called. `unavailable` also covers an install whose first event the proxy saw cannot be established locally (until 30 days after the first accepted event). The fleet numbers are cached for a day.",
13104
+ description: "Compares local task volume and success rate with fleet percentiles over the last 30 days. Comparisons require telemetry, an organization name, and a known proxy ingest date. A website, team size, and use case enable full comparisons with peer filters. The response includes the proxy's peer group when available. With telemetry off, it returns local DB counts without a proxy request. The fleet cache key includes the peer filters.",
13067
13105
  tags: ["Telemetry"],
13068
13106
  responses: {
13069
13107
  200: {
@@ -13099,48 +13137,64 @@ var ProxyFleetBenchmarksSchema = object2({
13099
13137
  "1": ProxyBlockSchema.optional(),
13100
13138
  "2-5": ProxyBlockSchema.optional(),
13101
13139
  "6+": ProxyBlockSchema.optional()
13102
- })
13103
- });
13104
- async function fleetBenchmarks(now) {
13105
- if (fleetCache && fleetCache.until > now)
13140
+ }),
13141
+ peer_group: object2({
13142
+ team_size: string2().nullable(),
13143
+ use_case: string2().nullable(),
13144
+ orgs: number2().int().nonnegative()
13145
+ }).nullable().optional()
13146
+ });
13147
+ async function fleetBenchmarks(now, peerGroup) {
13148
+ const endpoint = new URL(await telemetryProxyEndpoint("/v1/fleet/benchmarks"));
13149
+ endpoint.searchParams.set("window", "30d");
13150
+ if (peerGroup) {
13151
+ endpoint.searchParams.set("team_size", peerGroup.teamSize);
13152
+ endpoint.searchParams.set("use_case", peerGroup.useCase);
13153
+ }
13154
+ const key = endpoint.toString();
13155
+ if (fleetCache?.key === key && fleetCache.until > now)
13106
13156
  return fleetCache.value;
13107
13157
  let value = null;
13108
13158
  try {
13109
- const response = await fetch(`${await telemetryProxyEndpoint("/v1/fleet/benchmarks")}?window=30d`, {
13110
- signal: AbortSignal.timeout(TIMEOUT_MS2)
13111
- });
13159
+ const response = await fetch(key, { signal: AbortSignal.timeout(TIMEOUT_MS2) });
13112
13160
  if (response.ok) {
13113
13161
  const parsed = ProxyFleetBenchmarksSchema.safeParse(await response.json());
13114
13162
  if (parsed.success)
13115
13163
  value = parsed.data;
13116
13164
  }
13117
13165
  } catch {}
13118
- fleetCache = { value, until: now + (value ? FLEET_TTL_MS : FLEET_FAILURE_TTL_MS) };
13166
+ fleetCache = { key, value, until: now + (value ? FLEET_TTL_MS : FLEET_FAILURE_TTL_MS) };
13119
13167
  return value;
13120
13168
  }
13121
- async function localStats(now) {
13122
- if (localCache && localCache.until > now.getTime())
13169
+ async function localStats(now, requireIngestAnchor = true) {
13170
+ if (localCache?.requireIngestAnchor === requireIngestAnchor && localCache.until > now.getTime())
13123
13171
  return localCache.value;
13124
- const value = await getLocalFleetStats(now);
13125
- localCache = { value, until: now.getTime() + LOCAL_TTL_MS };
13172
+ const value = await getLocalFleetStats(now, { requireIngestAnchor });
13173
+ localCache = { requireIngestAnchor, value, until: now.getTime() + LOCAL_TTL_MS };
13126
13174
  return value;
13127
13175
  }
13128
- async function orgName() {
13129
- const stored = (await getSwarmConfigs2({ scope: "global", key: "SWARM_ORG_NAME" }))?.[0]?.value?.trim();
13130
- return stored || process.env.SWARM_ORG_NAME?.trim() || undefined;
13131
- }
13132
13176
  async function buildFleetBenchmarkResponse(now = new Date) {
13177
+ const [name, website, teamSize, useCase] = await Promise.all([
13178
+ globalConfig("SWARM_ORG_NAME"),
13179
+ globalConfig("SWARM_ORG_WEBSITE"),
13180
+ globalConfig("SWARM_ORG_TEAM_SIZE"),
13181
+ globalConfig("SWARM_ORG_USE_CASE")
13182
+ ]);
13183
+ const team = _enum2(COMPANY_TEAM_SIZES).safeParse(teamSize);
13184
+ const use = _enum2(COMPANY_USE_CASES).safeParse(useCase);
13185
+ const peerGroup = normalizeOrgWebsite(website) && team.success && use.success ? { teamSize: team.data, useCase: use.data } : null;
13133
13186
  const empty = {
13187
+ level: peerGroup ? "full" : "basic",
13188
+ peerGroup: null,
13134
13189
  local: null,
13135
13190
  minFinishedTasks: FLEET_MIN_FINISHED_TASKS,
13136
13191
  generatedAt: null,
13137
13192
  comparisons: []
13138
13193
  };
13139
- if (!isTelemetryEnabled())
13140
- return { state: "telemetry_off", ...empty };
13141
- if (!await orgName())
13194
+ const telemetryEnabled = isTelemetryEnabled();
13195
+ if (telemetryEnabled && !name)
13142
13196
  return { state: "no_org_name", ...empty };
13143
- const stats = await localStats(now);
13197
+ const stats = await localStats(now, telemetryEnabled);
13144
13198
  if (!stats)
13145
13199
  return { state: "unavailable", ...empty };
13146
13200
  const finishedTasks = stats.tasksCompleted + stats.tasksFailed;
@@ -13151,14 +13205,23 @@ async function buildFleetBenchmarkResponse(now = new Date) {
13151
13205
  agents: stats.agents,
13152
13206
  bucket: fleetBucketFor(stats.agents)
13153
13207
  };
13208
+ if (!telemetryEnabled)
13209
+ return { ...empty, state: "telemetry_off", local };
13154
13210
  if (finishedTasks < FLEET_MIN_FINISHED_TASKS)
13155
13211
  return { ...empty, state: "not_enough_tasks", local };
13156
- const fleet = await fleetBenchmarks(now.getTime());
13212
+ const fleet = await fleetBenchmarks(now.getTime(), peerGroup);
13213
+ const responsePeerGroup = peerGroup && fleet?.peer_group ? {
13214
+ teamSize: fleet.peer_group.team_size,
13215
+ useCase: fleet.peer_group.use_case,
13216
+ orgs: fleet.peer_group.orgs
13217
+ } : null;
13157
13218
  const comparisons = fleet ? compareWithFleet(stats, fleet, now) : [];
13158
13219
  if (!fleet || comparisons.length === 0)
13159
- return { ...empty, state: "unavailable", local };
13220
+ return { ...empty, state: "unavailable", local, peerGroup: responsePeerGroup };
13160
13221
  return {
13222
+ ...empty,
13161
13223
  state: "ready",
13224
+ peerGroup: responsePeerGroup,
13162
13225
  local,
13163
13226
  minFinishedTasks: FLEET_MIN_FINISHED_TASKS,
13164
13227
  generatedAt: fleet.generatedAt,
@@ -23575,7 +23638,7 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
23575
23638
  return true;
23576
23639
  }
23577
23640
  if (task.workflowRunStepId != null) {
23578
- const failed = await failTask2(parsed.params.id, "superseded_workflow_task");
23641
+ const failed = await failTask2(parsed.params.id, SUPERSEDED_WORKFLOW_TASK_REASON);
23579
23642
  ensure({
23580
23643
  id: "task.workflow_step_failed_on_supersede",
23581
23644
  flow: "task",
@@ -34968,9 +35031,8 @@ function uiEventEmitter(event) {
34968
35031
  return relayable.get(event)?.source;
34969
35032
  }
34970
35033
  function resolveSpec(spec) {
34971
- if (!spec.ref)
34972
- return spec;
34973
- return { ...file.definitions[spec.ref], ...spec };
35034
+ const resolved = spec.ref ? { ...file.definitions[spec.ref], ...spec } : spec;
35035
+ return resolved.items ? { ...resolved, items: resolveSpec(resolved.items) } : resolved;
34974
35036
  }
34975
35037
  function typeMatches(type, value) {
34976
35038
  switch (type) {
@@ -35015,6 +35077,12 @@ function validateUiEvent(event, properties) {
35015
35077
  if (spec.enum && !spec.enum.includes(value)) {
35016
35078
  problems.push(`"${key}" must be one of ${spec.enum.join(", ")}`);
35017
35079
  }
35080
+ if (Array.isArray(value) && spec.items?.enum) {
35081
+ const allowed = spec.items.enum;
35082
+ if (value.some((item) => !allowed.includes(item))) {
35083
+ problems.push(`"${key}" items must be one of ${allowed.join(", ")}`);
35084
+ }
35085
+ }
35018
35086
  if (typeof spec.minimum === "number" && typeof value === "number" && value < spec.minimum) {
35019
35087
  problems.push(`"${key}" must be at least ${spec.minimum}`);
35020
35088
  }
@@ -35055,7 +35123,7 @@ var enableTelemetry = route({
35055
35123
  summary: "Turn telemetry on",
35056
35124
  description: "Stores `ANONYMIZED_TELEMETRY=true` and applies it to the running server: the install ID is minted if needed and `telemetry.enabled` is sent once, so no restart is needed.",
35057
35125
  tags: ["Telemetry"],
35058
- body: object2({ via: _enum2(["banner", "settings"]).default("banner") }),
35126
+ body: object2({ via: _enum2(["banner", "settings", "benchmark"]).default("banner") }),
35059
35127
  responses: {
35060
35128
  200: {
35061
35129
  description: "Telemetry is on",
@@ -36006,7 +36074,7 @@ var createUserRoute = route({
36006
36074
  tags: ["Users"],
36007
36075
  body: object2({
36008
36076
  name: string2().min(1),
36009
- email: string2().optional(),
36077
+ email: string2().email("Email must be a valid email address").optional(),
36010
36078
  role: string2().optional(),
36011
36079
  notes: string2().optional(),
36012
36080
  emailAliases: array2(string2()).optional(),
@@ -36101,7 +36169,7 @@ var updateUserRoute = route({
36101
36169
  params: object2({ id: string2() }),
36102
36170
  body: object2({
36103
36171
  name: string2().min(1).optional(),
36104
- email: string2().optional(),
36172
+ email: string2().email("Email must be a valid email address").nullable().optional(),
36105
36173
  role: string2().optional(),
36106
36174
  notes: string2().optional(),
36107
36175
  emailAliases: array2(string2()).optional(),
@@ -39012,7 +39080,7 @@ var httpServer = createHttpServer(async (req, res) => {
39012
39080
  });
39013
39081
  });
39014
39082
  var detachRealtime = attachRealtimeTransport(httpServer);
39015
- var { attachControllerTransport } = await import("./controllers-connect-gkxmqw9d.js");
39083
+ var { attachControllerTransport } = await import("./controllers-connect-bg33ae53.js");
39016
39084
  var detachControllers = attachControllerTransport(httpServer);
39017
39085
  var stopWorkerNudges = startWorkerNudgeListener();
39018
39086
  var stopRoomDeletion = realtimeBus.subscribe("room:namespace-deleted", (namespace) => {
@@ -39041,7 +39109,7 @@ async function shutdown() {
39041
39109
  sessionsProcessed: getServerSessionsProcessed()
39042
39110
  });
39043
39111
  if (hasCapability("scheduling")) {
39044
- const { stopScheduler } = await import("./index-8pwc1jc8.js");
39112
+ const { stopScheduler } = await import("./index-h2ek08d6.js");
39045
39113
  stopScheduler();
39046
39114
  }
39047
39115
  stopHeartbeat2();
@@ -39053,7 +39121,7 @@ async function shutdown() {
39053
39121
  await stopSlackApp2();
39054
39122
  await stopChatSdk();
39055
39123
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
39056
- const { stopOAuthKeepalive } = await import("./keepalive-3nr4st3r.js");
39124
+ const { stopOAuthKeepalive } = await import("./keepalive-nhvpw10z.js");
39057
39125
  await stopOAuthKeepalive();
39058
39126
  }
39059
39127
  stopOAuthPendingGc();
@@ -39133,21 +39201,21 @@ try {
39133
39201
  console.warn("[startup] CAPABILITIES upgrade seed failed (non-fatal):", err);
39134
39202
  }
39135
39203
  try {
39136
- const { ensurePricingSeeded } = await import("./boot-seeds-xs9a8dx1.js");
39204
+ const { ensurePricingSeeded } = await import("./boot-seeds-6wxqkfk2.js");
39137
39205
  ensurePricingSeeded();
39138
- const { startPricingRefreshLoop } = await import("./pricing-refresh-5nvme3sm.js");
39206
+ const { startPricingRefreshLoop } = await import("./pricing-refresh-3cqx3f3x.js");
39139
39207
  startPricingRefreshLoop();
39140
39208
  } catch (err) {
39141
39209
  console.error("[startup] Failed to seed pricing rows:", err);
39142
39210
  }
39143
39211
  try {
39144
- const { ensureModelProfilesSeeded } = await import("./boot-seeds-xs9a8dx1.js");
39212
+ const { ensureModelProfilesSeeded } = await import("./boot-seeds-6wxqkfk2.js");
39145
39213
  await ensureModelProfilesSeeded();
39146
39214
  } catch (err) {
39147
39215
  console.error("[startup] Failed to seed model profiles:", err);
39148
39216
  }
39149
39217
  try {
39150
- const { ensureRbacSeeded } = await import("./boot-seeds-xs9a8dx1.js");
39218
+ const { ensureRbacSeeded } = await import("./boot-seeds-6wxqkfk2.js");
39151
39219
  ensureRbacSeeded();
39152
39220
  } catch (err) {
39153
39221
  console.error("[startup] Failed to sync RBAC seed rows:", err);
@@ -39155,7 +39223,7 @@ try {
39155
39223
  throw err;
39156
39224
  }
39157
39225
  try {
39158
- const { runAllSeeders } = await import("./index-s7ckdajq.js");
39226
+ const { runAllSeeders } = await import("./index-2z710v4x.js");
39159
39227
  await runAllSeeders({ scriptEmbeddingMode: "skip" });
39160
39228
  } catch (err) {
39161
39229
  console.error("[startup] Failed to seed built-in entities:", err);
@@ -39217,39 +39285,39 @@ httpServer.listen(port, async () => {
39217
39285
  await initWorkflows2();
39218
39286
  await startScriptRunSupervisor(getMcpBaseUrl());
39219
39287
  if (hasCapability("scheduling")) {
39220
- const { startScheduler } = await import("./index-8pwc1jc8.js");
39221
- const { getExecutorRegistry } = await import("./index-dg2tmj99.js");
39288
+ const { startScheduler } = await import("./index-h2ek08d6.js");
39289
+ const { getExecutorRegistry } = await import("./index-dgz61nff.js");
39222
39290
  const intervalMs = Number(process.env.SCHEDULER_INTERVAL_MS) || 1e4;
39223
39291
  startScheduler(getExecutorRegistry(), intervalMs, {
39224
39292
  runId: globalState.__runId
39225
39293
  });
39226
39294
  }
39227
39295
  if (!isEnvFlagEnabled("HEARTBEAT_DISABLE", false)) {
39228
- const { startHeartbeat } = await import("./index-nxa6me0q.js");
39296
+ const { startHeartbeat } = await import("./index-pqfwh9nn.js");
39229
39297
  const heartbeatMs = Number(process.env.HEARTBEAT_INTERVAL_MS) || 90000;
39230
39298
  startHeartbeat(heartbeatMs);
39231
39299
  }
39232
39300
  startPoolRouting();
39233
39301
  startRuntimeSupervisor();
39234
39302
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
39235
- const { startOAuthKeepalive } = await import("./keepalive-3nr4st3r.js");
39303
+ const { startOAuthKeepalive } = await import("./keepalive-nhvpw10z.js");
39236
39304
  startOAuthKeepalive();
39237
39305
  }
39238
39306
  if (process.env.OAUTH_REFRESH_SWEEP_DISABLE !== "true") {
39239
- const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-9q2t0y3q.js");
39307
+ const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-4dcbhtn0.js");
39240
39308
  startOAuthRefreshSweep();
39241
39309
  }
39242
39310
  startOAuthPendingGc();
39243
39311
  await startMemoryGc();
39244
39312
  await startDbRetention();
39245
39313
  startHumanFreeDrain();
39246
- import("./boot-reembed-qr8a894z.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
39314
+ import("./boot-reembed-e53x6b9v.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
39247
39315
  console.error("[boot-reembed] startup backfill failed (non-fatal):", err);
39248
39316
  });
39249
- import("./boot-reembed-rj85jjhw.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
39317
+ import("./boot-reembed-f6z923ny.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
39250
39318
  console.error("[boot-reembed-scripts] startup backfill failed (non-fatal):", err);
39251
39319
  });
39252
- import("./boot-scrub-sweep-eyfvn6v9.js").then(({ runBootScrubSweep }) => runBootScrubSweep()).catch((err) => {
39320
+ import("./boot-scrub-sweep-0538vsb7.js").then(({ runBootScrubSweep }) => runBootScrubSweep()).catch((err) => {
39253
39321
  console.error("[boot-scrub-sweep] startup scrub failed (non-fatal):", err);
39254
39322
  });
39255
39323
  }).on("error", (err) => {