@desplega.ai/agent-swarm 1.151.0 → 1.152.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 (108) hide show
  1. package/README.md +3 -1
  2. package/dist/{acp-adapter-ex8hzjfc.js → acp-adapter-4s7q25ft.js} +1 -1
  3. package/dist/{actions-2bgpyhww.js → actions-cs6rhmvc.js} +13 -13
  4. package/dist/{app-1706zhr1.js → app-j54aq0dj.js} +3 -3
  5. package/dist/{assistant-bavke5p7.js → assistant-w1pgn7vf.js} +14 -14
  6. package/dist/{boot-reembed-3cmrrmpa.js → boot-reembed-42vgkrrj.js} +4 -4
  7. package/dist/{boot-reembed-nafcmmmc.js → boot-reembed-smy30z32.js} +3 -3
  8. package/dist/{boot-scrub-logs-cd6a2sq0.js → boot-scrub-logs-b6s72fsw.js} +2 -2
  9. package/dist/{claude-adapter-wfp2gzvz.js → claude-adapter-fh7rmcj9.js} +3 -3
  10. package/dist/{claude-sdk-session-bht9jjak.js → claude-sdk-session-xhynatn9.js} +3 -3
  11. package/dist/{cli-f1wky6zp.js → cli-3g61md6v.js} +1 -1
  12. package/dist/{cli-a1z3h107.js → cli-3pft2z6r.js} +4 -4
  13. package/dist/{cli-5tpgq60f.js → cli-72tgtzr1.js} +152 -23
  14. package/dist/{cli-0qb1z6s2.js → cli-7bwaerjt.js} +1 -1
  15. package/dist/{cli-czjtgfys.js → cli-b4dyetqt.js} +2 -2
  16. package/dist/{cli-s14agm5s.js → cli-bdt7w021.js} +12 -3
  17. package/dist/{cli-sjaae6ff.js → cli-dsyg66vt.js} +3 -3
  18. package/dist/{cli-2tbvf1z1.js → cli-ftdjz1mk.js} +8 -8
  19. package/dist/{cli-zkxymas5.js → cli-gfez0qmk.js} +1 -1
  20. package/dist/{cli-q88st9aj.js → cli-gxf2ebyz.js} +2 -2
  21. package/dist/{cli-ppm4975n.js → cli-jtvs5m8q.js} +1 -1
  22. package/dist/{cli-7tgcstn2.js → cli-jytf5mw9.js} +2 -2
  23. package/dist/{cli-g69fdc9g.js → cli-kf8qp2vf.js} +2 -2
  24. package/dist/{cli-5jd2z7av.js → cli-ks8a1cgq.js} +6 -2
  25. package/dist/{cli-gjyvhmmh.js → cli-ng4q6a9t.js} +5 -5
  26. package/dist/{cli-3v9xhjcn.js → cli-sakxd2rg.js} +2 -2
  27. package/dist/{cli-frcta2w4.js → cli-sqmh7jj1.js} +1 -1
  28. package/dist/{cli-vwm416m6.js → cli-v9sk4dzw.js} +1 -1
  29. package/dist/{cli-j9xczhaq.js → cli-vbk025fm.js} +1 -1
  30. package/dist/{cli-r2q6pevn.js → cli-wfve107r.js} +43 -21
  31. package/dist/{cli-9004vfdf.js → cli-y8tayczk.js} +2 -2
  32. package/dist/{cli-gbfwcd3k.js → cli-zfzznn7c.js} +7 -6
  33. package/dist/cli.js +11 -11
  34. package/dist/{codex-adapter-jjjk8w4m.js → codex-adapter-k6yq95sn.js} +2 -2
  35. package/dist/{codex-session-runner-nd6ayxkx.js → codex-session-runner-3rp84pk8.js} +2 -2
  36. package/dist/{commands-9v4psyq1.js → commands-pbr5jzy5.js} +2 -2
  37. package/dist/{db-wnt58tpe.js → db-z0xaa59a.js} +2 -2
  38. package/dist/{dispatcher-05jh1aqk.js → dispatcher-pwpgsj0x.js} +12 -12
  39. package/dist/{handlers-tw90pkh5.js → handlers-5mzk4mbg.js} +15 -15
  40. package/dist/{hook-sxe3r349.js → hook-8bz33zee.js} +1 -1
  41. package/dist/{hook-123e2scb.js → hook-kbh84zb1.js} +2 -2
  42. package/dist/{http-ecsar8ez.js → http-pppxg5vr.js} +100 -36
  43. package/dist/{index-hw26vj40.js → index-68bd9b5f.js} +12 -12
  44. package/dist/{index-16js521z.js → index-k1hq1qt6.js} +8 -8
  45. package/dist/{index-zj518gf9.js → index-mjpxsr6k.js} +13 -13
  46. package/dist/{index-ymn7em0p.js → index-y0te09pn.js} +3 -3
  47. package/dist/{index-nnrbpcjp.js → index-z0zwjtkn.js} +12 -12
  48. package/dist/{keepalive-asqtcm4y.js → keepalive-xvmwnh1d.js} +4 -4
  49. package/dist/{lead-xbfr7fvt.js → lead-pf8nvxt8.js} +16 -16
  50. package/dist/{maintenance-qma55qvw.js → maintenance-jk4q0wgg.js} +4 -4
  51. package/dist/{oauth-refresh-sweep-3s04c6qw.js → oauth-refresh-sweep-6207x9sj.js} +3 -3
  52. package/dist/{onboard-drskd386.js → onboard-b0csgm0q.js} +2 -2
  53. package/dist/{otel-impl-943c96er.js → otel-impl-b6rfehth.js} +1 -1
  54. package/dist/{pricing-refresh-mx51az05.js → pricing-refresh-4e201wtd.js} +4 -4
  55. package/dist/{rbac-roles-wcmrg6sv.js → rbac-roles-mkc5n5qa.js} +4 -4
  56. package/dist/{rbac-roles-78baecqd.js → rbac-roles-zp6e4geh.js} +3 -3
  57. package/dist/{render-v2-8zjntgf5.js → render-v2-4fazz9tf.js} +3 -3
  58. package/dist/{seed-pricing-jqjs6cws.js → seed-pricing-thxpn9vn.js} +3 -3
  59. package/dist/{setup-4pks0vfk.js → setup-wb0z8cat.js} +2 -2
  60. package/dist/{work-objects-wangt792.js → work-objects-h3498kwe.js} +18 -17
  61. package/dist/{worker-p2mr422x.js → worker-2m2tzxp3.js} +16 -16
  62. package/openapi.json +5 -5
  63. package/package.json +1 -1
  64. package/src/agentmail/inbound-archive.ts +71 -0
  65. package/src/agentmail/types.ts +2 -0
  66. package/src/be/db.ts +1 -1
  67. package/src/be/scripts/typecheck.ts +4 -0
  68. package/src/be/swarm-config-guard.ts +7 -1
  69. package/src/extensions/lifecycle.ts +26 -4
  70. package/src/http/extensions.ts +8 -3
  71. package/src/http/webhooks.ts +13 -5
  72. package/src/rbac/legacy-policy.ts +13 -1
  73. package/src/scripts-runtime/sdk-allowlist.ts +4 -0
  74. package/src/scripts-runtime/types/stdlib.d.ts +4 -0
  75. package/src/scripts-runtime/types/swarm-sdk.d.ts +4 -0
  76. package/src/server.ts +12 -0
  77. package/src/slack/render-v2.ts +10 -4
  78. package/src/slack/responses.ts +7 -4
  79. package/src/slack/task-output.ts +21 -0
  80. package/src/slack/watcher.ts +3 -2
  81. package/src/slack/work-objects.ts +2 -1
  82. package/src/tests/agentmail-inbound-archive.test.ts +418 -0
  83. package/src/tests/extensions-example-mcp-install.test.ts +2 -2
  84. package/src/tests/extensions-http.test.ts +84 -3
  85. package/src/tests/extensions-lead-equivalence.test.ts +21 -0
  86. package/src/tests/extensions-mcp-tools.test.ts +111 -3
  87. package/src/tests/fixtures/store-progress-malformed-output.json +4 -0
  88. package/src/tests/rbac-admission-e2e.test.ts +35 -4
  89. package/src/tests/rbac-e2e-helpers.ts +18 -0
  90. package/src/tests/rbac-engine.test.ts +2 -2
  91. package/src/tests/rbac-mcp-admission-e2e.test.ts +22 -4
  92. package/src/tests/reload-config.test.ts +17 -0
  93. package/src/tests/scripts-only-gating.test.ts +4 -0
  94. package/src/tests/slack-render-v2.test.ts +24 -2
  95. package/src/tests/slack-task-output.test.ts +36 -0
  96. package/src/tests/store-progress-attachments-handler.test.ts +100 -1
  97. package/src/tests/swarm-config-reserved-keys.test.ts +6 -1
  98. package/src/tests/tool-annotations.test.ts +1 -1
  99. package/src/tools/extension-activate-version.ts +38 -0
  100. package/src/tools/extension-common.ts +2 -1
  101. package/src/tools/extension-delete.ts +29 -0
  102. package/src/tools/extension-disable.ts +36 -0
  103. package/src/tools/extension-enable.ts +36 -0
  104. package/src/tools/extension-install.ts +2 -2
  105. package/src/tools/store-progress.ts +30 -0
  106. package/src/tools/tool-config.ts +5 -1
  107. package/templates/skills/agent-browser/SKILL.md +84 -0
  108. package/templates/skills/agent-browser/content.md +21 -0
@@ -31,12 +31,12 @@ import {
31
31
  scriptStdlibTypesWithGeneratedApis,
32
32
  typecheckScript,
33
33
  typecheckWithAmbient
34
- } from "./cli-5jd2z7av.js";
34
+ } from "./cli-ks8a1cgq.js";
35
35
  import {
36
36
  checkHeartbeatChecklist,
37
37
  runHeartbeatSweep,
38
38
  stopHeartbeat
39
- } from "./cli-9004vfdf.js";
39
+ } from "./cli-y8tayczk.js";
40
40
  import {
41
41
  AGENT_MAX_TASKS_CONFIG_KEY,
42
42
  ALL_CAPABILITIES,
@@ -285,7 +285,7 @@ import {
285
285
  verifyWebhookSignature,
286
286
  warnIfCorsAllowsAnyOrigin,
287
287
  wireHttpSpanLifecycle
288
- } from "./cli-5tpgq60f.js";
288
+ } from "./cli-72tgtzr1.js";
289
289
  import"./cli-0z2v4nhw.js";
290
290
  import {
291
291
  REFERENCES_SOURCE_MAX_LENGTH,
@@ -302,17 +302,17 @@ import {
302
302
  import"./cli-3dpj7atn.js";
303
303
  import {
304
304
  getModelsCatalog
305
- } from "./cli-g69fdc9g.js";
305
+ } from "./cli-kf8qp2vf.js";
306
306
  import {
307
307
  getUserGrant
308
- } from "./cli-7tgcstn2.js";
308
+ } from "./cli-jytf5mw9.js";
309
309
  import {
310
310
  can,
311
311
  clearAuditSink,
312
312
  decideToolAdmission,
313
313
  isRbacEnabled,
314
314
  setAuditSink
315
- } from "./cli-gbfwcd3k.js";
315
+ } from "./cli-zfzznn7c.js";
316
316
  import {
317
317
  ConnectionAuthInputSchema,
318
318
  MAX_SCRIPT_WALL_CLOCK_MS,
@@ -395,7 +395,7 @@ import {
395
395
  upsertScriptByName,
396
396
  upsertScriptConnection,
397
397
  validateDefinition
398
- } from "./cli-sjaae6ff.js";
398
+ } from "./cli-dsyg66vt.js";
399
399
  import"./cli-epan13p1.js";
400
400
  import {
401
401
  detachedProcessGroup,
@@ -431,14 +431,14 @@ import {
431
431
  updateAuthorizationIdentity,
432
432
  updateOAuthAppById,
433
433
  upsertAuthorization
434
- } from "./cli-j9xczhaq.js";
434
+ } from "./cli-vbk025fm.js";
435
435
  import {
436
436
  normalizeModelKey
437
- } from "./cli-0qb1z6s2.js";
437
+ } from "./cli-7bwaerjt.js";
438
438
  import"./cli-bsakbbkm.js";
439
439
  import {
440
440
  searchScripts
441
- } from "./cli-q88st9aj.js";
441
+ } from "./cli-gxf2ebyz.js";
442
442
  import"./cli-51tf7ac3.js";
443
443
  import {
444
444
  ensure,
@@ -455,7 +455,7 @@ import {
455
455
  withRemoteContext,
456
456
  withSpan,
457
457
  withSpanContext
458
- } from "./cli-r2q6pevn.js";
458
+ } from "./cli-wfve107r.js";
459
459
  import"./cli-q51yprfq.js";
460
460
  import"./cli-yatxqynm.js";
461
461
  import {
@@ -465,7 +465,7 @@ import {
465
465
  init_constants as init_constants2,
466
466
  init_reranker,
467
467
  rerank
468
- } from "./cli-ppm4975n.js";
468
+ } from "./cli-jtvs5m8q.js";
469
469
  import"./cli-fm4ytsdk.js";
470
470
  import"./cli-aehm1rbq.js";
471
471
  import"./cli-2658f6at.js";
@@ -605,6 +605,7 @@ import {
605
605
  backfillSupersedeTaskResumeTaskId,
606
606
  cancelTask,
607
607
  checkoutPromptTemplate,
608
+ claimKv,
608
609
  claimMentions,
609
610
  claimOfferedTask,
610
611
  claimTask,
@@ -842,6 +843,7 @@ import {
842
843
  splitLegacyModelAlias,
843
844
  startTask,
844
845
  supersedeTask,
846
+ sweepExpiredKv,
845
847
  telemetry,
846
848
  uninstallMcpServer,
847
849
  uninstallSkill,
@@ -882,7 +884,7 @@ import {
882
884
  upsertSwarmConfig,
883
885
  validateConfigValue,
884
886
  withFavoriteFlags
885
- } from "./cli-s14agm5s.js";
887
+ } from "./cli-bdt7w021.js";
886
888
  import {
887
889
  IDENTITY_FIELD_BUDGETS,
888
890
  IdentityFieldBudgetError,
@@ -928,7 +930,7 @@ import {
928
930
  import {
929
931
  init_package,
930
932
  package_default
931
- } from "./cli-zkxymas5.js";
933
+ } from "./cli-gfez0qmk.js";
932
934
  import {
933
935
  init_secret_scrubber,
934
936
  registerVolatileSecret,
@@ -7029,7 +7031,7 @@ var enableRoute = route({
7029
7031
  pattern: ["api", "extensions", null, "enable"],
7030
7032
  operationId: "extensions_enable",
7031
7033
  summary: "Enable an extension",
7032
- description: "Loads and enables an extension. This route is operator-only.",
7034
+ description: "Loads and enables an extension. Available to leads, operators, and dashboard users.",
7033
7035
  tags: ["Extensions"],
7034
7036
  params: idParamsSchema,
7035
7037
  responses: {
@@ -7046,7 +7048,7 @@ var disableRoute = route({
7046
7048
  pattern: ["api", "extensions", null, "disable"],
7047
7049
  operationId: "extensions_disable",
7048
7050
  summary: "Disable an extension",
7049
- description: "Unloads and disables an extension. This route is operator-only.",
7051
+ description: "Unloads and disables an extension. Available to leads, operators, and dashboard users.",
7050
7052
  tags: ["Extensions"],
7051
7053
  params: idParamsSchema,
7052
7054
  responses: {
@@ -7062,7 +7064,7 @@ var activateVersionRoute = route({
7062
7064
  pattern: ["api", "extensions", null, "activate-version"],
7063
7065
  operationId: "extensions_activate_version",
7064
7066
  summary: "Activate an extension version",
7065
- description: "Activates a stored version. This route is operator-only.",
7067
+ description: "Activates a stored version. Available to leads, operators, and dashboard users.",
7066
7068
  tags: ["Extensions"],
7067
7069
  params: idParamsSchema,
7068
7070
  body: exports_external.object({ version: exports_external.number().int().min(1) }).strict(),
@@ -7290,7 +7292,8 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7290
7292
  const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7291
7293
  try {
7292
7294
  const extension = await enableExtension(parsed.params.id, {
7293
- by: await resolveHttpAuditUserId(req, writerAgentId)
7295
+ by: await resolveHttpAuditUserId(req, writerAgentId),
7296
+ agentId: writerAgentId
7294
7297
  });
7295
7298
  enableRoute.respond(res, 200, { extension: redactExtension(extension) });
7296
7299
  } catch (error) {
@@ -7308,7 +7311,8 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7308
7311
  const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7309
7312
  try {
7310
7313
  const extension = await disableExtension(parsed.params.id, {
7311
- by: await resolveHttpAuditUserId(req, writerAgentId)
7314
+ by: await resolveHttpAuditUserId(req, writerAgentId),
7315
+ agentId: writerAgentId
7312
7316
  });
7313
7317
  disableRoute.respond(res, 200, { extension: redactExtension(extension) });
7314
7318
  } catch (error) {
@@ -7326,7 +7330,8 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7326
7330
  const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7327
7331
  try {
7328
7332
  const extension = await activateVersion(parsed.params.id, parsed.body.version, {
7329
- by: await resolveHttpAuditUserId(req, writerAgentId)
7333
+ by: await resolveHttpAuditUserId(req, writerAgentId),
7334
+ agentId: writerAgentId
7330
7335
  });
7331
7336
  activateVersionRoute.respond(res, 200, { extension: redactExtension(extension) });
7332
7337
  } catch (error) {
@@ -25581,6 +25586,57 @@ async function handleUsers(req, res, pathSegments, queryParams) {
25581
25586
  // src/http/webhooks.ts
25582
25587
  init_zod();
25583
25588
 
25589
+ // src/agentmail/inbound-archive.ts
25590
+ init_db();
25591
+ init_secret_scrubber();
25592
+ import { createHash as createHash3 } from "node:crypto";
25593
+ var INBOUND_ARCHIVE_NAMESPACE = "agentmail-inbound";
25594
+ var INBOUND_ARCHIVE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
25595
+ var text = (value, limit) => typeof value === "string" ? scrubSecrets(value).slice(0, limit) : "";
25596
+ var inboundArchiveKey = (inboxId, messageId) => createHash3("sha256").update(JSON.stringify([inboxId, messageId])).digest("hex");
25597
+ async function archiveInboundMessage(payload) {
25598
+ if (![
25599
+ "message.received",
25600
+ "message.received.unauthenticated",
25601
+ "message.received.blocked",
25602
+ "message.received.spam"
25603
+ ].includes(payload.event_type))
25604
+ return;
25605
+ const message = payload.message;
25606
+ if (!message?.inbox_id || !message.message_id || !message.thread_id) {
25607
+ throw new Error("Inbound webhook missing inbox, message or thread ID");
25608
+ }
25609
+ const now = Date.now();
25610
+ await sweepExpiredKv(INBOUND_ARCHIVE_NAMESPACE, now);
25611
+ const minimized = {
25612
+ event_type: payload.event_type,
25613
+ message: {
25614
+ inbox_id: message.inbox_id,
25615
+ message_id: message.message_id,
25616
+ thread_id: message.thread_id,
25617
+ from_: text(Array.isArray(message.from_) ? message.from_.join(", ") : message.from_, 1500),
25618
+ reply_to: Array.isArray(message.reply_to) ? message.reply_to.slice(0, 20).map((value) => text(value, 1500)) : undefined,
25619
+ subject: text(message.subject, 300),
25620
+ text: text(message.text, 16000),
25621
+ html: text(message.html, 16000),
25622
+ timestamp: text(message.timestamp || message.created_at, 100),
25623
+ labels: Array.isArray(message.labels) ? message.labels.filter((label) => label === "unauthenticated") : [],
25624
+ attachments: Array.isArray(message.attachments) ? message.attachments.map((attachment) => ({
25625
+ filename: text(attachment.filename, 1500),
25626
+ content_type: text(attachment.content_type, 200),
25627
+ size: typeof attachment.size === "number" ? attachment.size : null
25628
+ })) : undefined
25629
+ }
25630
+ };
25631
+ await claimKv({
25632
+ namespace: INBOUND_ARCHIVE_NAMESPACE,
25633
+ key: inboundArchiveKey(message.inbox_id, message.message_id),
25634
+ value: { version: 1, capturedAt: new Date(now).toISOString(), payload: minimized },
25635
+ expiresAt: now + INBOUND_ARCHIVE_TTL_MS,
25636
+ valueType: "json"
25637
+ });
25638
+ }
25639
+
25584
25640
  // src/integrations/kapso/inbound.ts
25585
25641
  init_resolver();
25586
25642
  init_event_bus();
@@ -25730,7 +25786,7 @@ var agentmailWebhook = route({
25730
25786
  responses: {
25731
25787
  200: { description: "Event received", schema: exports_external.object({ received: exports_external.literal(true) }) },
25732
25788
  401: { description: "Invalid signature" },
25733
- 503: { description: "AgentMail integration not configured" }
25789
+ 503: { description: "AgentMail integration not configured or inbound archive unavailable" }
25734
25790
  }
25735
25791
  });
25736
25792
  var kapsoWebhook = route({
@@ -26053,8 +26109,16 @@ async function handleWebhooks(req, res, pathSegments) {
26053
26109
  res.end(JSON.stringify({ error: "Invalid signature" }));
26054
26110
  return true;
26055
26111
  }
26056
- agentmailWebhook.respond(res, 200, { received: true });
26057
26112
  const payload = verified;
26113
+ try {
26114
+ await archiveInboundMessage(payload);
26115
+ } catch (err) {
26116
+ console.error("[AgentMail] Inbound archive failed; requesting webhook retry", err);
26117
+ res.writeHead(503, { "Content-Type": "application/json" });
26118
+ res.end(JSON.stringify({ error: "Inbound archive unavailable" }));
26119
+ return true;
26120
+ }
26121
+ agentmailWebhook.respond(res, 200, { received: true });
26058
26122
  if (payload.message && !isInboxAllowed(payload.message.inbox_id, process.env.AGENTMAIL_INBOX_DOMAIN_FILTER)) {
26059
26123
  const domain = payload.message.inbox_id.split("@")[1] ?? "unknown";
26060
26124
  console.log(`[AgentMail] Ignoring event for inbox domain "${domain}" (not in AGENTMAIL_INBOX_DOMAIN_FILTER)`);
@@ -27402,7 +27466,7 @@ async function shutdown() {
27402
27466
  sessionsProcessed: getServerSessionsProcessed()
27403
27467
  });
27404
27468
  if (hasCapability("scheduling")) {
27405
- const { stopScheduler } = await import("./index-hw26vj40.js");
27469
+ const { stopScheduler } = await import("./index-68bd9b5f.js");
27406
27470
  stopScheduler();
27407
27471
  }
27408
27472
  stopHeartbeat();
@@ -27410,7 +27474,7 @@ async function shutdown() {
27410
27474
  await stopScriptRunSupervisor();
27411
27475
  await stopSlackApp();
27412
27476
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
27413
- const { stopOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
27477
+ const { stopOAuthKeepalive } = await import("./keepalive-xvmwnh1d.js");
27414
27478
  await stopOAuthKeepalive();
27415
27479
  }
27416
27480
  stopOAuthPendingGc();
@@ -27478,15 +27542,15 @@ try {
27478
27542
  console.warn("[startup] CAPABILITIES upgrade seed failed (non-fatal):", err);
27479
27543
  }
27480
27544
  try {
27481
- const { seedPricingFromModelsDev } = await import("./seed-pricing-jqjs6cws.js");
27545
+ const { seedPricingFromModelsDev } = await import("./seed-pricing-thxpn9vn.js");
27482
27546
  seedPricingFromModelsDev();
27483
- const { startPricingRefreshLoop } = await import("./pricing-refresh-mx51az05.js");
27547
+ const { startPricingRefreshLoop } = await import("./pricing-refresh-4e201wtd.js");
27484
27548
  startPricingRefreshLoop();
27485
27549
  } catch (err) {
27486
27550
  console.error("[startup] Failed to seed pricing rows:", err);
27487
27551
  }
27488
27552
  try {
27489
- const { ensureRbacSeedsSynced } = await import("./rbac-roles-wcmrg6sv.js");
27553
+ const { ensureRbacSeedsSynced } = await import("./rbac-roles-mkc5n5qa.js");
27490
27554
  ensureRbacSeedsSynced();
27491
27555
  } catch (err) {
27492
27556
  console.error("[startup] Failed to sync RBAC seed rows:", err);
@@ -27494,7 +27558,7 @@ try {
27494
27558
  throw err;
27495
27559
  }
27496
27560
  try {
27497
- const { runAllSeeders } = await import("./index-16js521z.js");
27561
+ const { runAllSeeders } = await import("./index-k1hq1qt6.js");
27498
27562
  await runAllSeeders({ scriptEmbeddingMode: "skip" });
27499
27563
  } catch (err) {
27500
27564
  console.error("[startup] Failed to seed built-in entities:", err);
@@ -27548,36 +27612,36 @@ httpServer.listen(port, async () => {
27548
27612
  await initWorkflows();
27549
27613
  await startScriptRunSupervisor(getMcpBaseUrl());
27550
27614
  if (hasCapability("scheduling")) {
27551
- const { startScheduler } = await import("./index-hw26vj40.js");
27552
- const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-nnrbpcjp.js");
27615
+ const { startScheduler } = await import("./index-68bd9b5f.js");
27616
+ const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-z0zwjtkn.js");
27553
27617
  const intervalMs = Number(process.env.SCHEDULER_INTERVAL_MS) || 1e4;
27554
27618
  startScheduler(getExecutorRegistry2(), intervalMs, {
27555
27619
  runId: globalState.__runId
27556
27620
  });
27557
27621
  }
27558
27622
  if (!isEnvFlagEnabled("HEARTBEAT_DISABLE", false)) {
27559
- const { startHeartbeat } = await import("./index-zj518gf9.js");
27623
+ const { startHeartbeat } = await import("./index-mjpxsr6k.js");
27560
27624
  const heartbeatMs = Number(process.env.HEARTBEAT_INTERVAL_MS) || 90000;
27561
27625
  startHeartbeat(heartbeatMs);
27562
27626
  }
27563
27627
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
27564
- const { startOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
27628
+ const { startOAuthKeepalive } = await import("./keepalive-xvmwnh1d.js");
27565
27629
  startOAuthKeepalive();
27566
27630
  }
27567
27631
  if (process.env.OAUTH_REFRESH_SWEEP_DISABLE !== "true") {
27568
- const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-3s04c6qw.js");
27632
+ const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-6207x9sj.js");
27569
27633
  startOAuthRefreshSweep();
27570
27634
  }
27571
27635
  startOAuthPendingGc();
27572
27636
  await startMemoryGc();
27573
27637
  await startDbRetention();
27574
- import("./boot-reembed-nafcmmmc.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
27638
+ import("./boot-reembed-smy30z32.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
27575
27639
  console.error("[boot-reembed] startup backfill failed (non-fatal):", err);
27576
27640
  });
27577
- import("./boot-reembed-3cmrrmpa.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
27641
+ import("./boot-reembed-42vgkrrj.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
27578
27642
  console.error("[boot-reembed-scripts] startup backfill failed (non-fatal):", err);
27579
27643
  });
27580
- import("./boot-scrub-logs-cd6a2sq0.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
27644
+ import("./boot-scrub-logs-b6s72fsw.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
27581
27645
  console.error("[boot-scrub-logs] startup scrub failed (non-fatal):", err);
27582
27646
  });
27583
27647
  }).on("error", (err) => {
@@ -4,34 +4,34 @@ import {
4
4
  runScheduleNow,
5
5
  startScheduler,
6
6
  stopScheduler
7
- } from "./cli-5tpgq60f.js";
7
+ } from "./cli-72tgtzr1.js";
8
8
  import"./cli-0z2v4nhw.js";
9
9
  import"./cli-4wppfkcm.js";
10
10
  import"./cli-e7d20cty.js";
11
11
  import"./cli-re8z5p8p.js";
12
12
  import"./cli-3dpj7atn.js";
13
- import"./cli-g69fdc9g.js";
14
- import"./cli-7tgcstn2.js";
15
- import"./cli-gbfwcd3k.js";
16
- import"./cli-sjaae6ff.js";
13
+ import"./cli-kf8qp2vf.js";
14
+ import"./cli-jytf5mw9.js";
15
+ import"./cli-zfzznn7c.js";
16
+ import"./cli-dsyg66vt.js";
17
17
  import"./cli-epan13p1.js";
18
18
  import"./cli-y89t4nca.js";
19
19
  import"./cli-f14fvzag.js";
20
20
  import"./cli-fad8m16k.js";
21
- import"./cli-j9xczhaq.js";
22
- import"./cli-0qb1z6s2.js";
21
+ import"./cli-vbk025fm.js";
22
+ import"./cli-7bwaerjt.js";
23
23
  import"./cli-bsakbbkm.js";
24
- import"./cli-q88st9aj.js";
24
+ import"./cli-gxf2ebyz.js";
25
25
  import"./cli-51tf7ac3.js";
26
- import"./cli-r2q6pevn.js";
26
+ import"./cli-wfve107r.js";
27
27
  import"./cli-q51yprfq.js";
28
28
  import"./cli-yatxqynm.js";
29
- import"./cli-ppm4975n.js";
29
+ import"./cli-jtvs5m8q.js";
30
30
  import"./cli-fm4ytsdk.js";
31
31
  import"./cli-aehm1rbq.js";
32
32
  import"./cli-2658f6at.js";
33
33
  import"./cli-jsp14b6c.js";
34
- import"./cli-s14agm5s.js";
34
+ import"./cli-bdt7w021.js";
35
35
  import"./cli-ht5rs63n.js";
36
36
  import"./cli-z61ykvam.js";
37
37
  import"./cli-dv6cdjs2.js";
@@ -39,7 +39,7 @@ import"./cli-c2mk1kgf.js";
39
39
  import"./cli-ej6gbxfb.js";
40
40
  import"./cli-sd0mxa3c.js";
41
41
  import"./cli-w5e1d1vv.js";
42
- import"./cli-zkxymas5.js";
42
+ import"./cli-gfez0qmk.js";
43
43
  import"./cli-r2ap2czm.js";
44
44
  import"./cli-pzxba7gw.js";
45
45
  import"./cli-f7kvq46p.js";
@@ -6,20 +6,20 @@ import {
6
6
  extractArgsJsonSchema,
7
7
  extractScriptSignature,
8
8
  typecheckScript
9
- } from "./cli-5jd2z7av.js";
9
+ } from "./cli-ks8a1cgq.js";
10
10
  import {
11
11
  getScript,
12
12
  require_dist,
13
13
  upsertScriptByName,
14
14
  validateDefinition,
15
15
  validateScriptImports
16
- } from "./cli-sjaae6ff.js";
16
+ } from "./cli-dsyg66vt.js";
17
17
  import"./cli-epan13p1.js";
18
18
  import"./cli-y89t4nca.js";
19
19
  import"./cli-f14fvzag.js";
20
- import"./cli-j9xczhaq.js";
21
- import"./cli-q88st9aj.js";
22
- import"./cli-ppm4975n.js";
20
+ import"./cli-vbk025fm.js";
21
+ import"./cli-gxf2ebyz.js";
22
+ import"./cli-jtvs5m8q.js";
23
23
  import"./cli-fm4ytsdk.js";
24
24
  import"./cli-aehm1rbq.js";
25
25
  import"./cli-2658f6at.js";
@@ -39,7 +39,7 @@ import {
39
39
  updateSkill,
40
40
  updateWorkflow,
41
41
  upsertSkillFiles
42
- } from "./cli-s14agm5s.js";
42
+ } from "./cli-bdt7w021.js";
43
43
  import"./cli-ht5rs63n.js";
44
44
  import"./cli-z61ykvam.js";
45
45
  import"./cli-dv6cdjs2.js";
@@ -47,7 +47,7 @@ import"./cli-c2mk1kgf.js";
47
47
  import"./cli-ej6gbxfb.js";
48
48
  import"./cli-sd0mxa3c.js";
49
49
  import"./cli-w5e1d1vv.js";
50
- import"./cli-zkxymas5.js";
50
+ import"./cli-gfez0qmk.js";
51
51
  import"./cli-r2ap2czm.js";
52
52
  import"./cli-zf8jjwex.js";
53
53
  import {
@@ -5655,7 +5655,7 @@ var config_default = `{
5655
5655
  `;
5656
5656
 
5657
5657
  // templates/skills/agent-browser/content.md
5658
- var content_default = '# agent-browser\n\n`agent-browser` (vercel-labs) is the swarm\'s browser-automation CLI. It drives a headless Chromium over CDP and returns accessibility-tree snapshots with compact `@eN` refs. Use it for any browser task: verify a UI change, take a screenshot, walk a page, fill a form, extract page text, reproduce a frontend bug, or attach UI evidence to a PR, issue, Linear comment, or Slack thread.\n\nDo not use `qa-use`. It is not installed in the worker image any more.\n\n## Step 0: check that the CLI is present\n\nThe full worker image (`agent-swarm-worker:latest`) ships `agent-browser` and a headless Chromium. The slim image (`:slim`) has neither. The first command of any browser work is:\n\n```bash\ncommand -v agent-browser\n```\n\nIf it prints nothing, you are on the slim image. Say so in your progress report ("agent-browser is not available on this worker image") and fall back to manual QA: write the exact steps a human should run and mark the browser test cases as **Blocked**, not failed. Do not install a browser or the CLI yourself.\n\n## Step 1: load the version-matched guide\n\nThe CLI bundles its own usage guide. Load it once per task before the first browser command. Do not guess flags from memory.\n\n```bash\nagent-browser skills get core # overview + common patterns\nagent-browser skills get core --full # adds the full command reference\nagent-browser skills list # specialized guides (dogfood, electron, slack, ...)\n```\n\n## Step 2: the core loop\n\n```bash\nagent-browser open <url>\nagent-browser snapshot -i # accessibility tree, interactive elements only, @eN refs\nagent-browser click @e12 # act on refs from the snapshot\nagent-browser fill @e7 "text"\nagent-browser screenshot /tmp/<name>.png\nagent-browser close\n```\n\n- Re-run `snapshot` after every navigation or state change. Refs are only valid for the snapshot that produced them.\n- Run one browser session at a time. Call `store-progress` between page batches so the heartbeat watchdog sees you.\n- The browser is headless. Local servers inside the worker container are reachable at `http://localhost:<port>`.\n- The image launches Chromium with `--no-sandbox,--disable-dev-shm-usage` through `AGENT_BROWSER_ARGS`. If you pass your own `--args`, include `--no-sandbox` again or Chrome will not start.\n\n## Step 3: share the screenshot through agent-fs\n\nScreenshots on the worker disk disappear with the task. Upload them to agent-fs under the qa path convention and share the signed URL. `--file` is binary-safe. `--content` is text-only and mangles PNGs.\n\n```bash\nagent-fs write thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png \\\n --file /tmp/<name>.png -m "<what it shows>"\nagent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # confirm size > 0\nagent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # 24h default, --expires-in up to 7d\n```\n\n- Embed the URL as `![caption](<url>)` in the PR body, review comment, Linear comment, or Slack message.\n- In `store-progress`, list the upload in the `attachments` field with `kind: "agent-fs"` and the path, and paste the signed URL in the progress text.\n- If `agent-fs auth whoami` fails, report the local path, say the upload was skipped, and continue.\n\nThe `artifacts` skill holds the full agent-fs recipe and the naming conventions.\n';
5658
+ var content_default = '# agent-browser\n\n`agent-browser` (vercel-labs) is the swarm\'s browser-automation CLI. It drives a headless Chromium over CDP and returns accessibility-tree snapshots with compact `@eN` refs. Use it for any browser task: verify a UI change, take a screenshot, walk a page, fill a form, extract page text, reproduce a frontend bug, or attach UI evidence to a PR, issue, Linear comment, or Slack thread.\n\nDo not use `qa-use`. It is not installed in the worker image any more.\n\n## Step 0: check that the CLI is present\n\nThe full worker image (`agent-swarm-worker:latest`) ships `agent-browser` and a headless Chromium. The slim image (`:slim`) has neither. The first command of any browser work is:\n\n```bash\ncommand -v agent-browser\n```\n\nIf it prints nothing, you are on the slim image. Say so in your progress report ("agent-browser is not available on this worker image") and fall back to manual QA: write the exact steps a human should run and mark the browser test cases as **Blocked**, not failed. Do not install a browser or the CLI yourself.\n\n## Step 1: load the version-matched guide\n\nThe CLI bundles its own usage guide. Load it once per task before the first browser command. Do not guess flags from memory.\n\n```bash\nagent-browser skills get core # overview + common patterns\nagent-browser skills get core --full # adds the full command reference\nagent-browser skills list # specialized guides (dogfood, electron, slack, ...)\n```\n\n## Step 2: the core loop\n\n```bash\nagent-browser open <url>\nagent-browser snapshot -i # accessibility tree, interactive elements only, @eN refs\nagent-browser click @e12 # act on refs from the snapshot\nagent-browser fill @e7 "text"\nagent-browser screenshot /tmp/<name>.png\nagent-browser close\n```\n\n- Re-run `snapshot` after every navigation or state change. Refs are only valid for the snapshot that produced them.\n- Run one browser session at a time. Call `store-progress` between page batches so the heartbeat watchdog sees you.\n- The browser is headless. Local servers inside the worker container are reachable at `http://localhost:<port>`.\n- The image launches Chromium with `--no-sandbox,--disable-dev-shm-usage` through `AGENT_BROWSER_ARGS`. If you pass your own `--args`, include `--no-sandbox` again or Chrome will not start.\n\n## Recording\n\nDefault: record with `--cursor`, drive every supported pointer action (`click`, `mouse move`, `drag`) with `--human`, and ship the **1.5x video**. Keep the 1x original only if a reviewer asks for it. Human pointer movement follows an eased curve; use `--seed <n>` on `mouse move` to make the take reproducible instead of using a bare move.\n\nOpen the page first, then record the interaction:\n\n```bash\nagent-browser record start ./in.mp4 --cursor\nagent-browser snapshot -i\nagent-browser mouse move 600 400 --human --seed 42 --duration 1400\nagent-browser click @e3 --human # use a ref from the current snapshot\n# Perform the remaining QA steps; use --human for drag actions too.\nagent-browser record stop\nffmpeg -y -i in.mp4 -filter:v "setpts=PTS/1.5,fps=30" -an \\\n -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p out-1.5x.mp4\n```\n\nSpeed-up is a post-process step: `record start` has no speed or human flag. Keep `fps=30` to preserve a steady 30 fps output rather than uneven frame drops at an inferred rate. `-an` disables audio because agent-browser recordings carry no audio track. The worker ships only `ffmpeg`, not `ffprobe`; inspect duration with `ffmpeg -i out-1.5x.mp4 2>&1 | grep Duration`.\n\nAdd `--contact-sheet` to the start command for a timestamped PNG summary of visual changes. Recording needs `ffmpeg` on PATH; check `agent-browser doctor` before starting. Stop the recording before closing the browser so the video is saved. Upload the 1.5x file through the same agent-fs QA path and signed-URL steps as screenshots below, and link it in the PR body.\n\n## Step 3: share the screenshot through agent-fs\n\nScreenshots on the worker disk disappear with the task. Upload them to agent-fs under the qa path convention and share the signed URL. `--file` is binary-safe. `--content` is text-only and mangles PNGs.\n\n```bash\nagent-fs write thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png \\\n --file /tmp/<name>.png -m "<what it shows>"\nagent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # confirm size > 0\nagent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # 24h default, --expires-in up to 7d\n```\n\n- Embed the URL as `![caption](<url>)` in the PR body, review comment, Linear comment, or Slack message.\n- In `store-progress`, list the upload in the `attachments` field with `kind: "agent-fs"` and the path, and paste the signed URL in the progress text.\n- If `agent-fs auth whoami` fails, report the local path, say the upload was skipped, and continue.\n\nThe `artifacts` skill holds the full agent-fs recipe and the naming conventions.\n';
5659
5659
 
5660
5660
  // templates/skills/apps/config.json
5661
5661
  var config_default2 = `{
@@ -4,35 +4,35 @@ import {
4
4
  runRebootSweep,
5
5
  startHeartbeat,
6
6
  stopHeartbeat
7
- } from "./cli-9004vfdf.js";
8
- import"./cli-5tpgq60f.js";
7
+ } from "./cli-y8tayczk.js";
8
+ import"./cli-72tgtzr1.js";
9
9
  import"./cli-0z2v4nhw.js";
10
10
  import"./cli-4wppfkcm.js";
11
11
  import"./cli-e7d20cty.js";
12
12
  import"./cli-re8z5p8p.js";
13
13
  import"./cli-3dpj7atn.js";
14
- import"./cli-g69fdc9g.js";
15
- import"./cli-7tgcstn2.js";
16
- import"./cli-gbfwcd3k.js";
17
- import"./cli-sjaae6ff.js";
14
+ import"./cli-kf8qp2vf.js";
15
+ import"./cli-jytf5mw9.js";
16
+ import"./cli-zfzznn7c.js";
17
+ import"./cli-dsyg66vt.js";
18
18
  import"./cli-epan13p1.js";
19
19
  import"./cli-y89t4nca.js";
20
20
  import"./cli-f14fvzag.js";
21
21
  import"./cli-fad8m16k.js";
22
- import"./cli-j9xczhaq.js";
23
- import"./cli-0qb1z6s2.js";
22
+ import"./cli-vbk025fm.js";
23
+ import"./cli-7bwaerjt.js";
24
24
  import"./cli-bsakbbkm.js";
25
- import"./cli-q88st9aj.js";
25
+ import"./cli-gxf2ebyz.js";
26
26
  import"./cli-51tf7ac3.js";
27
- import"./cli-r2q6pevn.js";
27
+ import"./cli-wfve107r.js";
28
28
  import"./cli-q51yprfq.js";
29
29
  import"./cli-yatxqynm.js";
30
- import"./cli-ppm4975n.js";
30
+ import"./cli-jtvs5m8q.js";
31
31
  import"./cli-fm4ytsdk.js";
32
32
  import"./cli-aehm1rbq.js";
33
33
  import"./cli-2658f6at.js";
34
34
  import"./cli-jsp14b6c.js";
35
- import"./cli-s14agm5s.js";
35
+ import"./cli-bdt7w021.js";
36
36
  import"./cli-ht5rs63n.js";
37
37
  import"./cli-z61ykvam.js";
38
38
  import"./cli-dv6cdjs2.js";
@@ -40,7 +40,7 @@ import"./cli-c2mk1kgf.js";
40
40
  import"./cli-ej6gbxfb.js";
41
41
  import"./cli-sd0mxa3c.js";
42
42
  import"./cli-w5e1d1vv.js";
43
- import"./cli-zkxymas5.js";
43
+ import"./cli-gfez0qmk.js";
44
44
  import"./cli-r2ap2czm.js";
45
45
  import"./cli-pzxba7gw.js";
46
46
  import"./cli-f7kvq46p.js";
@@ -2,11 +2,11 @@ import {
2
2
  getEmbeddingProvider,
3
3
  getMemoryStore,
4
4
  resetEmbeddingProvider
5
- } from "./cli-ppm4975n.js";
5
+ } from "./cli-jtvs5m8q.js";
6
6
  import"./cli-fm4ytsdk.js";
7
7
  import"./cli-aehm1rbq.js";
8
8
  import"./cli-2658f6at.js";
9
- import"./cli-s14agm5s.js";
9
+ import"./cli-bdt7w021.js";
10
10
  import"./cli-ht5rs63n.js";
11
11
  import"./cli-z61ykvam.js";
12
12
  import"./cli-dv6cdjs2.js";
@@ -14,7 +14,7 @@ import"./cli-c2mk1kgf.js";
14
14
  import"./cli-ej6gbxfb.js";
15
15
  import"./cli-sd0mxa3c.js";
16
16
  import"./cli-w5e1d1vv.js";
17
- import"./cli-zkxymas5.js";
17
+ import"./cli-gfez0qmk.js";
18
18
  import"./cli-r2ap2czm.js";
19
19
  import"./cli-zf8jjwex.js";
20
20
  import"./cli-bc05qbss.js";
@@ -20,37 +20,37 @@ import {
20
20
  stopWaitPoller,
21
21
  subscribeWaitToBus,
22
22
  validateTemplateVariables
23
- } from "./cli-5tpgq60f.js";
23
+ } from "./cli-72tgtzr1.js";
24
24
  import"./cli-0z2v4nhw.js";
25
25
  import"./cli-4wppfkcm.js";
26
26
  import"./cli-e7d20cty.js";
27
27
  import"./cli-re8z5p8p.js";
28
28
  import"./cli-3dpj7atn.js";
29
- import"./cli-g69fdc9g.js";
30
- import"./cli-7tgcstn2.js";
31
- import"./cli-gbfwcd3k.js";
29
+ import"./cli-kf8qp2vf.js";
30
+ import"./cli-jytf5mw9.js";
31
+ import"./cli-zfzznn7c.js";
32
32
  import {
33
33
  findEntryNodes,
34
34
  getSuccessors
35
- } from "./cli-sjaae6ff.js";
35
+ } from "./cli-dsyg66vt.js";
36
36
  import"./cli-epan13p1.js";
37
37
  import"./cli-y89t4nca.js";
38
38
  import"./cli-f14fvzag.js";
39
39
  import"./cli-fad8m16k.js";
40
- import"./cli-j9xczhaq.js";
41
- import"./cli-0qb1z6s2.js";
40
+ import"./cli-vbk025fm.js";
41
+ import"./cli-7bwaerjt.js";
42
42
  import"./cli-bsakbbkm.js";
43
- import"./cli-q88st9aj.js";
43
+ import"./cli-gxf2ebyz.js";
44
44
  import"./cli-51tf7ac3.js";
45
- import"./cli-r2q6pevn.js";
45
+ import"./cli-wfve107r.js";
46
46
  import"./cli-q51yprfq.js";
47
47
  import"./cli-yatxqynm.js";
48
- import"./cli-ppm4975n.js";
48
+ import"./cli-jtvs5m8q.js";
49
49
  import"./cli-fm4ytsdk.js";
50
50
  import"./cli-aehm1rbq.js";
51
51
  import"./cli-2658f6at.js";
52
52
  import"./cli-jsp14b6c.js";
53
- import"./cli-s14agm5s.js";
53
+ import"./cli-bdt7w021.js";
54
54
  import"./cli-ht5rs63n.js";
55
55
  import {
56
56
  interpolate
@@ -60,7 +60,7 @@ import"./cli-c2mk1kgf.js";
60
60
  import"./cli-ej6gbxfb.js";
61
61
  import"./cli-sd0mxa3c.js";
62
62
  import"./cli-w5e1d1vv.js";
63
- import"./cli-zkxymas5.js";
63
+ import"./cli-gfez0qmk.js";
64
64
  import"./cli-r2ap2czm.js";
65
65
  import"./cli-pzxba7gw.js";
66
66
  import {
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  ensureAuthorizationTokenOrThrow,
3
3
  listKeepAliveAuthorizations
4
- } from "./cli-j9xczhaq.js";
5
- import"./cli-s14agm5s.js";
4
+ } from "./cli-vbk025fm.js";
5
+ import"./cli-bdt7w021.js";
6
6
  import"./cli-ht5rs63n.js";
7
7
  import"./cli-z61ykvam.js";
8
8
  import"./cli-dv6cdjs2.js";
@@ -10,7 +10,7 @@ import"./cli-c2mk1kgf.js";
10
10
  import"./cli-ej6gbxfb.js";
11
11
  import"./cli-sd0mxa3c.js";
12
12
  import"./cli-w5e1d1vv.js";
13
- import"./cli-zkxymas5.js";
13
+ import"./cli-gfez0qmk.js";
14
14
  import {
15
15
  init_secret_scrubber,
16
16
  scrubSecrets
@@ -66,7 +66,7 @@ async function notifySlack(text) {
66
66
  return;
67
67
  }
68
68
  try {
69
- const { getSlackApp } = await import("./app-1706zhr1.js");
69
+ const { getSlackApp } = await import("./app-j54aq0dj.js");
70
70
  const app = getSlackApp();
71
71
  if (!app) {
72
72
  console.warn("[OAuth Keepalive] Slack not available, cannot send notification");