@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
@@ -18,18 +18,18 @@ import {
18
18
  } from "./cli-3dpj7atn.js";
19
19
  import {
20
20
  startPricingRefreshLoop
21
- } from "./cli-g69fdc9g.js";
21
+ } from "./cli-kf8qp2vf.js";
22
22
  import {
23
23
  ensureRbacSeedsSynced,
24
24
  getUserGrant
25
- } from "./cli-7tgcstn2.js";
25
+ } from "./cli-jytf5mw9.js";
26
26
  import {
27
27
  can,
28
28
  decideAdmission,
29
29
  grantLeadEquivalence,
30
30
  isRbacEnabled,
31
31
  revokeLeadEquivalence
32
- } from "./cli-gbfwcd3k.js";
32
+ } from "./cli-zfzznn7c.js";
33
33
  import {
34
34
  AppDefinitionSchema,
35
35
  AppElementsSchema,
@@ -93,7 +93,7 @@ import {
93
93
  upsertScriptConnection,
94
94
  validateDefinition,
95
95
  writeBareImportShim
96
- } from "./cli-sjaae6ff.js";
96
+ } from "./cli-dsyg66vt.js";
97
97
  import {
98
98
  detachedProcessGroup,
99
99
  registerProcessGroup,
@@ -120,10 +120,10 @@ import {
120
120
  listAuthorizationsForApp,
121
121
  onAuthorizationRefreshed,
122
122
  upsertOAuthApp
123
- } from "./cli-j9xczhaq.js";
123
+ } from "./cli-vbk025fm.js";
124
124
  import {
125
125
  seedPricingFromModelsDev
126
- } from "./cli-0qb1z6s2.js";
126
+ } from "./cli-7bwaerjt.js";
127
127
  import {
128
128
  require_dist
129
129
  } from "./cli-51tf7ac3.js";
@@ -137,7 +137,7 @@ import {
137
137
  startSlackApp,
138
138
  stopSlackApp,
139
139
  withSpan
140
- } from "./cli-r2q6pevn.js";
140
+ } from "./cli-wfve107r.js";
141
141
  import {
142
142
  CANDIDATE_SET_MULTIPLIER,
143
143
  computeScore,
@@ -149,7 +149,7 @@ import {
149
149
  isGraphExpansionEnabled,
150
150
  rerank,
151
151
  rowToCandidate
152
- } from "./cli-ppm4975n.js";
152
+ } from "./cli-jtvs5m8q.js";
153
153
  import {
154
154
  init_task_attachment_links,
155
155
  taskAttachmentDisplayUrl,
@@ -463,7 +463,7 @@ import {
463
463
  upsertSwarmConfig,
464
464
  validateConfigValue,
465
465
  workflowContextKey
466
- } from "./cli-s14agm5s.js";
466
+ } from "./cli-bdt7w021.js";
467
467
  import {
468
468
  generateDefaultClaudeMd,
469
469
  generateDefaultIdentityMd,
@@ -541,7 +541,7 @@ import {
541
541
  import {
542
542
  init_package,
543
543
  package_default
544
- } from "./cli-zkxymas5.js";
544
+ } from "./cli-gfez0qmk.js";
545
545
  import {
546
546
  init_secret_scrubber,
547
547
  isSensitiveKey,
@@ -23685,7 +23685,7 @@ async function notifySlack(text) {
23685
23685
  return;
23686
23686
  }
23687
23687
  try {
23688
- const { getSlackApp: getSlackApp2 } = await import("./app-1706zhr1.js");
23688
+ const { getSlackApp: getSlackApp2 } = await import("./app-j54aq0dj.js");
23689
23689
  const app = getSlackApp2();
23690
23690
  if (!app) {
23691
23691
  console.warn("[Jira webhook keepalive] Slack not available, cannot send notification");
@@ -23756,7 +23756,7 @@ async function deleteJiraWebhook(webhookId) {
23756
23756
  console.log(`[Jira webhook keepalive] Deleted webhook id=${webhookId}`);
23757
23757
  }
23758
23758
  async function overwriteWebhookIds(next) {
23759
- const { getDbClient: getDbClient2 } = await import("./db-wnt58tpe.js");
23759
+ const { getDbClient: getDbClient2 } = await import("./db-z0xaa59a.js");
23760
23760
  await getDbClient2().transaction(async (tx) => {
23761
23761
  const row = await tx.get("SELECT metadata FROM oauth_apps WHERE provider = 'jira'");
23762
23762
  if (!row) {
@@ -97476,7 +97476,7 @@ async function reloadGlobalConfigsAndIntegrations() {
97476
97476
  return runWithoutRequestAuth(() => reloadGlobalConfigsAndIntegrationsInner());
97477
97477
  }
97478
97478
  async function reloadGlobalConfigsAndIntegrationsInner() {
97479
- const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-ymn7em0p.js");
97479
+ const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-y0te09pn.js");
97480
97480
  const wasEmbeddingsConfigured = getEmbeddingProvider2().isConfigured();
97481
97481
  const updated = await loadGlobalConfigsIntoEnv(true);
97482
97482
  const { resetFileStorageProvider } = await import("./registry-v5wytg0s.js");
@@ -97488,10 +97488,10 @@ async function reloadGlobalConfigsAndIntegrationsInner() {
97488
97488
  integrations.push("embeddings");
97489
97489
  }
97490
97490
  if (!wasEmbeddingsConfigured && isEmbeddingsConfigured) {
97491
- import("./boot-reembed-nafcmmmc.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
97491
+ import("./boot-reembed-smy30z32.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
97492
97492
  console.error("[config-reload] memory backfill failed (non-fatal):", err);
97493
97493
  });
97494
- import("./boot-reembed-3cmrrmpa.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
97494
+ import("./boot-reembed-42vgkrrj.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
97495
97495
  console.error("[config-reload] script backfill failed (non-fatal):", err);
97496
97496
  });
97497
97497
  }
@@ -98304,7 +98304,7 @@ function setPreloadedTools(server, names) {
98304
98304
  async function applyPreToolCall(name, args, requestInfo, inputSchema) {
98305
98305
  if (requestInfo.callOrigin !== "mcp")
98306
98306
  return { args };
98307
- const dispatcher = await import("./dispatcher-05jh1aqk.js");
98307
+ const dispatcher = await import("./dispatcher-pwpgsj0x.js");
98308
98308
  const result = await dispatcher.dispatchPre("pre.tool.call", { tool: name, args, requestInfo }, inputSchema ? {
98309
98309
  validateModify: async (data) => {
98310
98310
  const schema = normalizeObjectSchema(inputSchema) ?? inputSchema;
@@ -105897,9 +105897,8 @@ var registerDeletePageTool = (server) => {
105897
105897
  });
105898
105898
  };
105899
105899
 
105900
- // src/tools/extension-install.ts
105900
+ // src/tools/extension-activate-version.ts
105901
105901
  init_zod();
105902
- init_types();
105903
105902
 
105904
105903
  // src/tools/extension-common.ts
105905
105904
  init_zod();
@@ -106074,6 +106073,7 @@ var extensionToolOutputSchema = swarmToolOutputSchema({
106074
106073
  priority: number().optional(),
106075
106074
  consecutiveFailures: number().optional(),
106076
106075
  contentDeduped: boolean().optional(),
106076
+ deleted: boolean().optional(),
106077
106077
  extensions: array(extensionListItemSchema).optional()
106078
106078
  });
106079
106079
  function isRecord2(value) {
@@ -106121,15 +106121,100 @@ async function proxyExtensionsApi(args) {
106121
106121
  });
106122
106122
  }
106123
106123
 
106124
+ // src/tools/extension-activate-version.ts
106125
+ var registerExtensionActivateVersionTool = (server) => {
106126
+ createToolRegistrar(server)("extension-activate-version", {
106127
+ title: "Extension Activate Version",
106128
+ description: "Activate a stored extension version, reloading it if enabled. Requires a lead, operator, or dashboard user.",
106129
+ annotations: { openWorldHint: false },
106130
+ inputSchema: object({
106131
+ id: string().uuid().describe("Installed extension ID from extension-list."),
106132
+ version: number().int().min(1).describe("Stored version number to activate.")
106133
+ }).strict(),
106134
+ outputSchema: extensionToolOutputSchema
106135
+ }, async (args, requestInfo) => proxyExtensionsApi({
106136
+ method: "POST",
106137
+ path: `/api/extensions/${args.id}/activate-version`,
106138
+ body: { version: args.version },
106139
+ requestInfo,
106140
+ success: (data) => toolOk("Extension activated.", {
106141
+ data: coerceExtensionSummary(data.extension)
106142
+ })
106143
+ }));
106144
+ };
106145
+
106146
+ // src/tools/extension-delete.ts
106147
+ init_zod();
106148
+ var registerExtensionDeleteTool = (server) => {
106149
+ createToolRegistrar(server)("extension-delete", {
106150
+ title: "Extension Delete",
106151
+ description: "Uninstall a disabled extension and delete its stored history. Disable it first with extension-disable. Requires a lead, operator, or dashboard user.",
106152
+ annotations: { openWorldHint: false, destructiveHint: true },
106153
+ inputSchema: object({
106154
+ id: string().uuid().describe("Installed extension ID from extension-list.")
106155
+ }).strict(),
106156
+ outputSchema: extensionToolOutputSchema
106157
+ }, async (args, requestInfo) => proxyExtensionsApi({
106158
+ method: "DELETE",
106159
+ path: `/api/extensions/${args.id}`,
106160
+ requestInfo,
106161
+ success: () => toolOk("Extension deleted.", { data: { id: args.id, deleted: true } })
106162
+ }));
106163
+ };
106164
+
106165
+ // src/tools/extension-disable.ts
106166
+ init_zod();
106167
+ var registerExtensionDisableTool = (server) => {
106168
+ createToolRegistrar(server)("extension-disable", {
106169
+ title: "Extension Disable",
106170
+ description: "Unload and disable an installed extension. Requires a lead, operator, or dashboard user.",
106171
+ annotations: { openWorldHint: false },
106172
+ inputSchema: object({
106173
+ id: string().uuid().describe("Installed extension ID from extension-list.")
106174
+ }).strict(),
106175
+ outputSchema: extensionToolOutputSchema
106176
+ }, async (args, requestInfo) => proxyExtensionsApi({
106177
+ method: "POST",
106178
+ path: `/api/extensions/${args.id}/disable`,
106179
+ requestInfo,
106180
+ success: (data) => toolOk("Extension disabled.", {
106181
+ data: coerceExtensionSummary(data.extension)
106182
+ })
106183
+ }));
106184
+ };
106185
+
106186
+ // src/tools/extension-enable.ts
106187
+ init_zod();
106188
+ var registerExtensionEnableTool = (server) => {
106189
+ createToolRegistrar(server)("extension-enable", {
106190
+ title: "Extension Enable",
106191
+ description: "Load and enable an installed extension. Requires a lead, operator, or dashboard user.",
106192
+ annotations: { openWorldHint: false },
106193
+ inputSchema: object({
106194
+ id: string().uuid().describe("Installed extension ID from extension-list.")
106195
+ }).strict(),
106196
+ outputSchema: extensionToolOutputSchema
106197
+ }, async (args, requestInfo) => proxyExtensionsApi({
106198
+ method: "POST",
106199
+ path: `/api/extensions/${args.id}/enable`,
106200
+ requestInfo,
106201
+ success: (data) => toolOk("Extension enabled.", {
106202
+ data: coerceExtensionSummary(data.extension)
106203
+ })
106204
+ }));
106205
+ };
106206
+
106124
106207
  // src/tools/extension-install.ts
106125
- var EXTENSION_INSTALL_DESCRIPTION = "Validate and store a TypeScript extension bundle (manifest plus a files map with one hooks.ts). Fetch the hook contract first: GET /api/extensions/type-defs returns swarm-extension.d.ts with every event and modify shape. The extension remains disabled until an operator enables it.";
106208
+ init_zod();
106209
+ init_types();
106210
+ var EXTENSION_INSTALL_DESCRIPTION = "Validate and store a TypeScript extension bundle (manifest plus a files map with one hooks.ts). Fetch the hook contract first: GET /api/extensions/type-defs returns swarm-extension.d.ts with every event and modify shape. The extension remains disabled until a lead, operator, or dashboard user enables it with extension-enable.";
106126
106211
  function extensionInstallResult(data, fallbackName) {
106127
106212
  const body = data;
106128
106213
  const extension = coerceExtensionSummary(body.extension);
106129
106214
  const name = extension.name ?? fallbackName;
106130
106215
  const version = typeof extension.version === "number" ? ` v${extension.version}` : "";
106131
106216
  const deduped = body.contentDeduped === true ? " Content was unchanged." : "";
106132
- const enableInstruction = "An operator must enable it from the dashboard or `POST /api/extensions/{id}/enable`.";
106217
+ const enableInstruction = "A lead, operator, or dashboard user can enable it with `extension-enable` or `POST /api/extensions/{id}/enable`.";
106133
106218
  return toolOk(`Extension \`${name}\`${version} installed.${deduped} ${enableInstruction}`, {
106134
106219
  data: {
106135
106220
  ...extension,
@@ -116947,7 +117032,7 @@ async function notifyAutomationPreflightFailure(preflight) {
116947
117032
  return;
116948
117033
  }
116949
117034
  try {
116950
- const { getSlackApp: getSlackApp2 } = await import("./app-1706zhr1.js");
117035
+ const { getSlackApp: getSlackApp2 } = await import("./app-j54aq0dj.js");
116951
117036
  const app = getSlackApp2();
116952
117037
  if (!app) {
116953
117038
  console.warn("[Automation Preflight] Slack not available, cannot send notification");
@@ -120092,7 +120177,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
120092
120177
  }
120093
120178
  if (notification.channel === "slack") {
120094
120179
  try {
120095
- const { getSlackApp: getSlackApp2 } = await import("./app-1706zhr1.js");
120180
+ const { getSlackApp: getSlackApp2 } = await import("./app-j54aq0dj.js");
120096
120181
  const slackApp = getSlackApp2();
120097
120182
  if (!slackApp) {
120098
120183
  console.warn("[HITL] Slack not initialized — cannot send notification");
@@ -120212,7 +120297,7 @@ class NotifyExecutor extends BaseExecutor {
120212
120297
  }
120213
120298
  }
120214
120299
  case "slack": {
120215
- const { getSlackApp: getSlackApp2 } = await import("./app-1706zhr1.js");
120300
+ const { getSlackApp: getSlackApp2 } = await import("./app-j54aq0dj.js");
120216
120301
  const app = getSlackApp2();
120217
120302
  if (!app) {
120218
120303
  return {
@@ -126427,6 +126512,23 @@ var registerStoreProgressTool = (server) => {
126427
126512
  }
126428
126513
  }
126429
126514
  const status = requestedStatus === "completed" || requestedStatus === "failed" ? requestedStatus : undefined;
126515
+ const leakedParameter = output?.match(/(?:<\/(?:output|parameter)>\s*)?<parameter name="([a-zA-Z_]+)">\s*([\s\S]*)$/);
126516
+ if (leakedParameter) {
126517
+ output = output?.slice(0, leakedParameter.index);
126518
+ let recovered = false;
126519
+ if (leakedParameter[1] === "attachments") {
126520
+ try {
126521
+ const parsed = array(AttachmentInputSchema).max(20).safeParse(JSON.parse(leakedParameter[2].replace(/\s*<\/parameter>\s*$/, "")));
126522
+ if (parsed.success && (attachments?.length ?? 0) + parsed.data.length <= 20) {
126523
+ attachments = [...attachments ?? [], ...parsed.data];
126524
+ recovered = true;
126525
+ }
126526
+ } catch {}
126527
+ }
126528
+ if (!recovered) {
126529
+ console.warn(`[store-progress] Stripped malformed output tail for task ${taskId}; parameter ${leakedParameter[1]} was not recovered.`);
126530
+ }
126531
+ }
126430
126532
  const agentFsScopes = new Map;
126431
126533
  const agentFsAttachments = attachments?.filter((a) => a.kind === "agent-fs") ?? [];
126432
126534
  if (agentFsAttachments.length > 0) {
@@ -129038,6 +129140,10 @@ async function createServer(opts = {}) {
129038
129140
  registerScriptSearchTool(server);
129039
129141
  registerScriptRunTool(server);
129040
129142
  registerScriptUpsertTool(server);
129143
+ registerExtensionDeleteTool(server);
129144
+ registerExtensionEnableTool(server);
129145
+ registerExtensionDisableTool(server);
129146
+ registerExtensionActivateVersionTool(server);
129041
129147
  registerExtensionInstallTool(server);
129042
129148
  registerExtensionListTool(server);
129043
129149
  registerScriptDeleteTool(server);
@@ -129081,6 +129187,10 @@ async function createServer(opts = {}) {
129081
129187
  registerScriptApisTool(server);
129082
129188
  registerScriptRunTool(server);
129083
129189
  registerScriptUpsertTool(server);
129190
+ registerExtensionDeleteTool(server);
129191
+ registerExtensionEnableTool(server);
129192
+ registerExtensionDisableTool(server);
129193
+ registerExtensionActivateVersionTool(server);
129084
129194
  registerExtensionInstallTool(server);
129085
129195
  registerExtensionListTool(server);
129086
129196
  registerScriptDeleteTool(server);
@@ -129280,6 +129390,10 @@ var SDK_TOOL_NAME_MAP = {
129280
129390
  script_launchRun: "launch-script-run",
129281
129391
  script_getRun: "get-script-run",
129282
129392
  script_listRuns: "list-script-runs",
129393
+ extension_delete: "extension-delete",
129394
+ extension_enable: "extension-enable",
129395
+ extension_disable: "extension-disable",
129396
+ extension_activate_version: "extension-activate-version",
129283
129397
  extension_install: "extension-install",
129284
129398
  extension_list: "extension-list",
129285
129399
  swarm_get: "get-swarm",
@@ -130452,11 +130566,24 @@ async function removeRegistered(id2) {
130452
130566
  if (previous)
130453
130567
  await previous.dispose();
130454
130568
  }
130569
+ async function recordLifecycleRequest(record3, operation, agentId, version = record3.activeVersion) {
130570
+ if (!agentId)
130571
+ return;
130572
+ await insertExtensionRun({
130573
+ extensionId: record3.id,
130574
+ version,
130575
+ event: `lifecycle.${operation}.requested`,
130576
+ action: "continue",
130577
+ agentId,
130578
+ subject: record3.name
130579
+ });
130580
+ }
130455
130581
  async function enableExtension(id2, opts = {}) {
130456
130582
  initExtensionPostBridge();
130457
130583
  let record3 = await getExtensionById(id2);
130458
130584
  if (!record3)
130459
130585
  throw new ExtensionLifecycleError("Extension not found", 404);
130586
+ await recordLifecycleRequest(record3, "enable", opts.agentId);
130460
130587
  const agentId = await ensureExtensionAgent(record3.name);
130461
130588
  const identified = await setExtensionState(id2, { agentId, updatedBy: opts.by });
130462
130589
  if (!identified)
@@ -130489,6 +130616,7 @@ async function disableExtension(id2, opts = {}) {
130489
130616
  const record3 = await getExtensionById(id2);
130490
130617
  if (!record3)
130491
130618
  throw new ExtensionLifecycleError("Extension not found", 404);
130619
+ await recordLifecycleRequest(record3, "disable", opts.agentId);
130492
130620
  await removeRegistered(id2);
130493
130621
  attemptedFingerprints.delete(id2);
130494
130622
  await deactivateExtensionAgent(record3.name);
@@ -130508,6 +130636,7 @@ async function activateVersion(id2, version, opts = {}) {
130508
130636
  if (!await getExtensionVersion(id2, version)) {
130509
130637
  throw new ExtensionLifecycleError(`Extension version ${version} was not found`, 404);
130510
130638
  }
130639
+ await recordLifecycleRequest(current, "activate-version", opts.agentId, version);
130511
130640
  const wasEnabled = current.enabled;
130512
130641
  if (wasEnabled)
130513
130642
  await disableExtension(id2, opts);
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getDb,
3
3
  init_db
4
- } from "./cli-s14agm5s.js";
4
+ } from "./cli-bdt7w021.js";
5
5
 
6
6
  // src/be/seed-pricing.ts
7
7
  init_db();
@@ -4,12 +4,12 @@ import {
4
4
  linkIdentity,
5
5
  recordUnmappedIdentity,
6
6
  resolveIdentity
7
- } from "./cli-5tpgq60f.js";
7
+ } from "./cli-72tgtzr1.js";
8
8
  import {
9
9
  getKv,
10
10
  init_db,
11
11
  upsertKv
12
- } from "./cli-s14agm5s.js";
12
+ } from "./cli-bdt7w021.js";
13
13
 
14
14
  // src/slack/enrich.ts
15
15
  init_db();
@@ -49,7 +49,7 @@ import {
49
49
  import {
50
50
  init_package,
51
51
  package_default
52
- } from "./cli-zkxymas5.js";
52
+ } from "./cli-gfez0qmk.js";
53
53
  import {
54
54
  init_secret_scrubber,
55
55
  registerVolatileSecret,
@@ -7544,6 +7544,10 @@ var init_tool_config = __esm(() => {
7544
7544
  "launch-script-run",
7545
7545
  "get-script-run",
7546
7546
  "list-script-runs",
7547
+ "extension-delete",
7548
+ "extension-enable",
7549
+ "extension-disable",
7550
+ "extension-activate-version",
7547
7551
  "extension-install",
7548
7552
  "extension-list",
7549
7553
  "swarm_x",
@@ -7657,7 +7661,12 @@ var init_swarm_config_guard = __esm(() => {
7657
7661
  init_reaction_shortcode();
7658
7662
  init_types();
7659
7663
  init_task_tool_manifest();
7660
- RESERVED_KEYS = new Set(["API_KEY", "SECRETS_ENCRYPTION_KEY", "CORS_ALLOW_ANY_ORIGIN"]);
7664
+ RESERVED_KEYS = new Set([
7665
+ "API_KEY",
7666
+ "SECRETS_ENCRYPTION_KEY",
7667
+ "CORS_ALLOW_ANY_ORIGIN",
7668
+ "EXTENSION_ALLOW_LEAD_ACTIVATION"
7669
+ ]);
7661
7670
  BOOLEAN_LITERALS = ["true", "false", "1", "0"];
7662
7671
  DB_RETENTION_TUNING_BOUNDS = {
7663
7672
  DB_RETENTION_TICK_BUDGET_MS: { min: 1000, max: 300000 },
@@ -11599,7 +11608,7 @@ async function getSwarmConfigs(filters) {
11599
11608
  async function getInjectableGlobalConfigs() {
11600
11609
  const rows = await getDbClient().query(`SELECT * FROM swarm_config
11601
11610
  WHERE scope = 'global'
11602
- AND UPPER(key) NOT IN ('API_KEY', 'SECRETS_ENCRYPTION_KEY', 'CORS_ALLOW_ANY_ORIGIN')
11611
+ AND UPPER(key) NOT IN ('API_KEY', 'SECRETS_ENCRYPTION_KEY', 'CORS_ALLOW_ANY_ORIGIN', 'EXTENSION_ALLOW_LEAD_ACTIVATION')
11603
11612
  ORDER BY key ASC`);
11604
11613
  return rows.map(rowToSwarmConfig);
11605
11614
  }
@@ -20,10 +20,10 @@ import {
20
20
  oauthAppRowToProviderConfig,
21
21
  updateAuthorizationTokens,
22
22
  upsertAuthorization
23
- } from "./cli-j9xczhaq.js";
23
+ } from "./cli-vbk025fm.js";
24
24
  import {
25
25
  embedScript
26
- } from "./cli-q88st9aj.js";
26
+ } from "./cli-gxf2ebyz.js";
27
27
  import {
28
28
  CredentialBroker,
29
29
  DEFAULT_CREDENTIAL_BINDINGS,
@@ -45,7 +45,7 @@ import {
45
45
  normalizeDateRequired,
46
46
  placeholderForConfigKey,
47
47
  upsertSwarmConfig
48
- } from "./cli-s14agm5s.js";
48
+ } from "./cli-bdt7w021.js";
49
49
  import {
50
50
  init_env_flag,
51
51
  isEnvFlagEnabled
@@ -12,11 +12,11 @@ import {
12
12
  } from "./cli-d3p82erb.js";
13
13
  import {
14
14
  checkClaudeCredentials
15
- } from "./cli-3v9xhjcn.js";
15
+ } from "./cli-sakxd2rg.js";
16
16
  import {
17
17
  checkCodexCredentials,
18
18
  codexUserHome
19
- } from "./cli-vwm416m6.js";
19
+ } from "./cli-v9sk4dzw.js";
20
20
  import {
21
21
  MAX_RATE_LIMIT_RESET_MS,
22
22
  isCodexCreditsExhaustedMessage,
@@ -34,7 +34,7 @@ import {
34
34
  import {
35
35
  resolveScriptsOnlyMode,
36
36
  validateJsonSchema
37
- } from "./cli-5tpgq60f.js";
37
+ } from "./cli-72tgtzr1.js";
38
38
  import {
39
39
  authJsonToCredentialSelection,
40
40
  credentialsToAuthJson,
@@ -58,7 +58,7 @@ import {
58
58
  startSpan,
59
59
  withSpan,
60
60
  withSpanContext
61
- } from "./cli-r2q6pevn.js";
61
+ } from "./cli-wfve107r.js";
62
62
  import {
63
63
  buildContextPreamble,
64
64
  buildResumeContextPreamble,
@@ -83,7 +83,7 @@ import {
83
83
  init_types,
84
84
  resolveTaskModelSelection,
85
85
  telemetry
86
- } from "./cli-s14agm5s.js";
86
+ } from "./cli-bdt7w021.js";
87
87
  import {
88
88
  generateDefaultClaudeMd,
89
89
  generateDefaultIdentityMd,
@@ -151,7 +151,7 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
151
151
  async function createProviderAdapter(provider) {
152
152
  switch (provider) {
153
153
  case "claude": {
154
- const { ClaudeAdapter } = await import("./claude-adapter-wfp2gzvz.js");
154
+ const { ClaudeAdapter } = await import("./claude-adapter-fh7rmcj9.js");
155
155
  return new ClaudeAdapter;
156
156
  }
157
157
  case "pi": {
@@ -159,7 +159,7 @@ async function createProviderAdapter(provider) {
159
159
  return new PiMonoAdapter;
160
160
  }
161
161
  case "codex": {
162
- const { CodexAdapter } = await import("./codex-adapter-jjjk8w4m.js");
162
+ const { CodexAdapter } = await import("./codex-adapter-k6yq95sn.js");
163
163
  return new CodexAdapter;
164
164
  }
165
165
  case "claude-managed": {
@@ -175,7 +175,7 @@ async function createProviderAdapter(provider) {
175
175
  return new OpencodeAdapter;
176
176
  }
177
177
  case "acp": {
178
- const { ACPAdapter } = await import("./acp-adapter-ex8hzjfc.js");
178
+ const { ACPAdapter } = await import("./acp-adapter-4s7q25ft.js");
179
179
  return new ACPAdapter;
180
180
  }
181
181
  default:
@@ -7,7 +7,7 @@ var package_default;
7
7
  var init_package = __esm(() => {
8
8
  package_default = {
9
9
  name: "@desplega.ai/agent-swarm",
10
- version: "1.151.0",
10
+ version: "1.152.1",
11
11
  description: "agent-swarm.dev — an open-source operating system for AI work: a lead agent breaks goals into tasks, routes them to specialized workers such as Claude Code or Codex, runs each worker in an isolated container, and preserves shared memory, tools, schedules, and review gates so delegated work compounds across sessions.",
12
12
  keywords: [
13
13
  "agent-swarm.dev",
@@ -4,11 +4,11 @@ import {
4
4
  getEmbeddingProvider,
5
5
  init_embedding,
6
6
  serializeEmbedding
7
- } from "./cli-ppm4975n.js";
7
+ } from "./cli-jtvs5m8q.js";
8
8
  import {
9
9
  getDbClient,
10
10
  init_db
11
- } from "./cli-s14agm5s.js";
11
+ } from "./cli-bdt7w021.js";
12
12
  import {
13
13
  init_secret_scrubber,
14
14
  scrubSecrets
@@ -11,7 +11,7 @@ import {
11
11
  getDbClient,
12
12
  init_db,
13
13
  isSqliteVecAvailable
14
- } from "./cli-s14agm5s.js";
14
+ } from "./cli-bdt7w021.js";
15
15
  import {
16
16
  __esm,
17
17
  __export,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  PermissionVerbSchema
3
- } from "./cli-gbfwcd3k.js";
3
+ } from "./cli-zfzznn7c.js";
4
4
  import {
5
5
  getDb,
6
6
  getDbClient,
7
7
  init_db
8
- } from "./cli-s14agm5s.js";
8
+ } from "./cli-bdt7w021.js";
9
9
  import {
10
10
  init_env_flag,
11
11
  isEnvFlagEnabled
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  buildModelsDevSeedRows,
3
3
  loadModelsDevCache
4
- } from "./cli-0qb1z6s2.js";
4
+ } from "./cli-7bwaerjt.js";
5
5
  import {
6
6
  createLogEntry,
7
7
  getActivePricingRow,
8
8
  getDbClient,
9
9
  init_db,
10
10
  insertPricingRow
11
- } from "./cli-s14agm5s.js";
11
+ } from "./cli-bdt7w021.js";
12
12
  import {
13
13
  init_secret_scrubber,
14
14
  scrubSecrets
@@ -4,7 +4,7 @@ import {
4
4
  getScriptMcpTypes,
5
5
  listAppRecords,
6
6
  require_typescript
7
- } from "./cli-sjaae6ff.js";
7
+ } from "./cli-dsyg66vt.js";
8
8
  import {
9
9
  deleteSwarmConfigByKey,
10
10
  getAgentById,
@@ -13,7 +13,7 @@ import {
13
13
  getSwarmConfigs,
14
14
  init_db,
15
15
  upsertSwarmConfig
16
- } from "./cli-s14agm5s.js";
16
+ } from "./cli-bdt7w021.js";
17
17
  import {
18
18
  init_secret_scrubber,
19
19
  scrubSecrets
@@ -867,6 +867,10 @@ export interface SwarmSdk {
867
867
  // --- write: extensions ---
868
868
  extension_install(args: { manifest: Record<string, unknown>; files: Record<string, string>; priority?: number; config?: Record<string, unknown> }): Promise<unknown>;
869
869
  extension_list(args?: { enabledOnly?: boolean }): Promise<unknown>;
870
+ extension_delete(args: { id: string }): Promise<unknown>;
871
+ extension_enable(args: { id: string }): Promise<unknown>;
872
+ extension_disable(args: { id: string }): Promise<unknown>;
873
+ extension_activate_version(args: { id: string; version: number }): Promise<unknown>;
870
874
 
871
875
  // --- write: repos ---
872
876
  repo_update(args: Record<string, unknown>): Promise<unknown>;
@@ -5,12 +5,12 @@ import {
5
5
  instantFlush,
6
6
  requestSlackThreadSteering,
7
7
  wasEventSeen
8
- } from "./cli-a1z3h107.js";
8
+ } from "./cli-3pft2z6r.js";
9
9
  import {
10
10
  enrichSlackUserEmail,
11
11
  resolveSlackUserId,
12
12
  rewriteSlackMentions
13
- } from "./cli-czjtgfys.js";
13
+ } from "./cli-b4dyetqt.js";
14
14
  import {
15
15
  TaskCreationBlockedError,
16
16
  broadcastMatches,
@@ -23,14 +23,14 @@ import {
23
23
  hasOtherUserMention,
24
24
  notifySlackFileFailures,
25
25
  routeMessage
26
- } from "./cli-5tpgq60f.js";
26
+ } from "./cli-72tgtzr1.js";
27
27
  import {
28
28
  ackSlackMessage,
29
29
  buildTreeBlocks,
30
30
  ensureSlackThreadTree,
31
31
  isSlackRenderV2Enabled,
32
32
  registerTreeMessage
33
- } from "./cli-r2q6pevn.js";
33
+ } from "./cli-wfve107r.js";
34
34
  import {
35
35
  getAgentById,
36
36
  getAgentWorkingOnThread,
@@ -42,7 +42,7 @@ import {
42
42
  init_db,
43
43
  reactionName,
44
44
  slackContextKey
45
- } from "./cli-s14agm5s.js";
45
+ } from "./cli-bdt7w021.js";
46
46
  import {
47
47
  init_resolver,
48
48
  resolveTemplate