@desplega.ai/agent-swarm 1.151.0 → 1.152.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-ex8hzjfc.js → acp-adapter-d05sg0q4.js} +1 -1
  3. package/dist/{actions-2bgpyhww.js → actions-4sc0v342.js} +13 -13
  4. package/dist/{app-1706zhr1.js → app-2d0v6kt6.js} +3 -3
  5. package/dist/{assistant-bavke5p7.js → assistant-zs6wdnrf.js} +14 -14
  6. package/dist/{boot-reembed-nafcmmmc.js → boot-reembed-3dwdnnsr.js} +3 -3
  7. package/dist/{boot-reembed-3cmrrmpa.js → boot-reembed-vhh33520.js} +4 -4
  8. package/dist/{boot-scrub-logs-cd6a2sq0.js → boot-scrub-logs-e1fnabcg.js} +2 -2
  9. package/dist/{claude-adapter-wfp2gzvz.js → claude-adapter-h58xqzzd.js} +3 -3
  10. package/dist/{claude-sdk-session-bht9jjak.js → claude-sdk-session-pbaczbgt.js} +3 -3
  11. package/dist/{cli-a1z3h107.js → cli-4fqn2vpg.js} +4 -4
  12. package/dist/{cli-g69fdc9g.js → cli-5bqt4gwa.js} +2 -2
  13. package/dist/{cli-gjyvhmmh.js → cli-5p007m2q.js} +5 -5
  14. package/dist/{cli-5jd2z7av.js → cli-6k2athpf.js} +6 -2
  15. package/dist/{cli-5tpgq60f.js → cli-72vksk1n.js} +152 -23
  16. package/dist/{cli-vwm416m6.js → cli-87hdfyde.js} +1 -1
  17. package/dist/{cli-3v9xhjcn.js → cli-8fy9dmpv.js} +2 -2
  18. package/dist/{cli-czjtgfys.js → cli-awb59f08.js} +2 -2
  19. package/dist/{cli-j9xczhaq.js → cli-cs9z1hw3.js} +1 -1
  20. package/dist/{cli-r2q6pevn.js → cli-cwvey7n1.js} +43 -21
  21. package/dist/{cli-ppm4975n.js → cli-evgy5w3y.js} +1 -1
  22. package/dist/{cli-frcta2w4.js → cli-f1f9n77e.js} +1 -1
  23. package/dist/{cli-9004vfdf.js → cli-fhdssm2v.js} +2 -2
  24. package/dist/{cli-s14agm5s.js → cli-gacq5hg8.js} +12 -3
  25. package/dist/{cli-zkxymas5.js → cli-jh9txj4n.js} +1 -1
  26. package/dist/{cli-q88st9aj.js → cli-nd5s3m4y.js} +2 -2
  27. package/dist/{cli-sjaae6ff.js → cli-p2hx1pxm.js} +3 -3
  28. package/dist/{cli-2tbvf1z1.js → cli-t1mykkng.js} +8 -8
  29. package/dist/{cli-7tgcstn2.js → cli-t6axtdcg.js} +2 -2
  30. package/dist/{cli-f1wky6zp.js → cli-wp7cejrg.js} +1 -1
  31. package/dist/{cli-0qb1z6s2.js → cli-zdcdh02m.js} +1 -1
  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-v3cz462q.js} +2 -2
  35. package/dist/{codex-session-runner-nd6ayxkx.js → codex-session-runner-de1a5g5z.js} +2 -2
  36. package/dist/{commands-9v4psyq1.js → commands-wfqqpn95.js} +2 -2
  37. package/dist/{db-wnt58tpe.js → db-9zzv5y05.js} +2 -2
  38. package/dist/{dispatcher-05jh1aqk.js → dispatcher-hfm1jbgx.js} +12 -12
  39. package/dist/{handlers-tw90pkh5.js → handlers-wrrhsack.js} +15 -15
  40. package/dist/{hook-sxe3r349.js → hook-9skye8zd.js} +1 -1
  41. package/dist/{hook-123e2scb.js → hook-fgjv62k5.js} +2 -2
  42. package/dist/{http-ecsar8ez.js → http-7grttjfq.js} +37 -34
  43. package/dist/{index-nnrbpcjp.js → index-29gxx9ar.js} +12 -12
  44. package/dist/{index-hw26vj40.js → index-30pz2h9w.js} +12 -12
  45. package/dist/{index-zj518gf9.js → index-4ek1df87.js} +13 -13
  46. package/dist/{index-16js521z.js → index-myfwqqyq.js} +8 -8
  47. package/dist/{index-ymn7em0p.js → index-pfhzrh1d.js} +3 -3
  48. package/dist/{keepalive-asqtcm4y.js → keepalive-j75m2m7k.js} +4 -4
  49. package/dist/{lead-xbfr7fvt.js → lead-a1hpjt0a.js} +16 -16
  50. package/dist/{maintenance-qma55qvw.js → maintenance-tngjzqdq.js} +4 -4
  51. package/dist/{oauth-refresh-sweep-3s04c6qw.js → oauth-refresh-sweep-em1fn044.js} +3 -3
  52. package/dist/{onboard-drskd386.js → onboard-fv7ezvwx.js} +2 -2
  53. package/dist/{otel-impl-943c96er.js → otel-impl-6vbb568y.js} +1 -1
  54. package/dist/{pricing-refresh-mx51az05.js → pricing-refresh-nmm949an.js} +4 -4
  55. package/dist/{rbac-roles-wcmrg6sv.js → rbac-roles-0fz5qryx.js} +4 -4
  56. package/dist/{rbac-roles-78baecqd.js → rbac-roles-xtp05syf.js} +3 -3
  57. package/dist/{render-v2-8zjntgf5.js → render-v2-fpb8whme.js} +3 -3
  58. package/dist/{seed-pricing-jqjs6cws.js → seed-pricing-zwa8bs3t.js} +3 -3
  59. package/dist/{setup-4pks0vfk.js → setup-3ybwbdpd.js} +2 -2
  60. package/dist/{work-objects-wangt792.js → work-objects-rmayxcx7.js} +18 -17
  61. package/dist/{worker-p2mr422x.js → worker-rng4jhnh.js} +16 -16
  62. package/openapi.json +4 -4
  63. package/package.json +1 -1
  64. package/src/be/db.ts +1 -1
  65. package/src/be/scripts/typecheck.ts +4 -0
  66. package/src/be/swarm-config-guard.ts +7 -1
  67. package/src/extensions/lifecycle.ts +26 -4
  68. package/src/http/extensions.ts +8 -3
  69. package/src/rbac/legacy-policy.ts +13 -1
  70. package/src/scripts-runtime/sdk-allowlist.ts +4 -0
  71. package/src/scripts-runtime/types/stdlib.d.ts +4 -0
  72. package/src/scripts-runtime/types/swarm-sdk.d.ts +4 -0
  73. package/src/server.ts +12 -0
  74. package/src/slack/render-v2.ts +10 -4
  75. package/src/slack/responses.ts +7 -4
  76. package/src/slack/task-output.ts +21 -0
  77. package/src/slack/watcher.ts +3 -2
  78. package/src/slack/work-objects.ts +2 -1
  79. package/src/tests/extensions-example-mcp-install.test.ts +2 -2
  80. package/src/tests/extensions-http.test.ts +84 -3
  81. package/src/tests/extensions-lead-equivalence.test.ts +21 -0
  82. package/src/tests/extensions-mcp-tools.test.ts +111 -3
  83. package/src/tests/fixtures/store-progress-malformed-output.json +4 -0
  84. package/src/tests/rbac-admission-e2e.test.ts +35 -4
  85. package/src/tests/rbac-e2e-helpers.ts +18 -0
  86. package/src/tests/rbac-engine.test.ts +2 -2
  87. package/src/tests/rbac-mcp-admission-e2e.test.ts +22 -4
  88. package/src/tests/reload-config.test.ts +17 -0
  89. package/src/tests/scripts-only-gating.test.ts +4 -0
  90. package/src/tests/slack-render-v2.test.ts +24 -2
  91. package/src/tests/slack-task-output.test.ts +36 -0
  92. package/src/tests/store-progress-attachments-handler.test.ts +100 -1
  93. package/src/tests/swarm-config-reserved-keys.test.ts +6 -1
  94. package/src/tests/tool-annotations.test.ts +1 -1
  95. package/src/tools/extension-activate-version.ts +38 -0
  96. package/src/tools/extension-common.ts +2 -1
  97. package/src/tools/extension-delete.ts +29 -0
  98. package/src/tools/extension-disable.ts +36 -0
  99. package/src/tools/extension-enable.ts +36 -0
  100. package/src/tools/extension-install.ts +2 -2
  101. package/src/tools/store-progress.ts +30 -0
  102. package/src/tools/tool-config.ts +5 -1
  103. package/templates/skills/agent-browser/SKILL.md +84 -0
  104. 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-5bqt4gwa.js";
22
22
  import {
23
23
  ensureRbacSeedsSynced,
24
24
  getUserGrant
25
- } from "./cli-7tgcstn2.js";
25
+ } from "./cli-t6axtdcg.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-p2hx1pxm.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-cs9z1hw3.js";
124
124
  import {
125
125
  seedPricingFromModelsDev
126
- } from "./cli-0qb1z6s2.js";
126
+ } from "./cli-zdcdh02m.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-cwvey7n1.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-evgy5w3y.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-gacq5hg8.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-jh9txj4n.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-2d0v6kt6.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-9zzv5y05.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-pfhzrh1d.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-3dwdnnsr.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-vhh33520.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-hfm1jbgx.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-2d0v6kt6.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-2d0v6kt6.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-2d0v6kt6.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);
@@ -49,7 +49,7 @@ import {
49
49
  import {
50
50
  init_package,
51
51
  package_default
52
- } from "./cli-zkxymas5.js";
52
+ } from "./cli-jh9txj4n.js";
53
53
  import {
54
54
  init_secret_scrubber,
55
55
  scrubSecrets
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runStopHookSessionSummarySubprocess
3
- } from "./cli-frcta2w4.js";
3
+ } from "./cli-f1f9n77e.js";
4
4
  import {
5
5
  fetchInstalledMcpServers
6
6
  } from "./cli-tng3131n.js";
@@ -819,7 +819,7 @@ class ClaudeAdapter {
819
819
  if (transport === "sdk" && isClaudeBridgeEffective(sourceEnv)) {
820
820
  throw new Error("CLAUDE_TRANSPORT=sdk cannot run with an effective Claude Bridge configuration. Select CLI transport or disable the bridge.");
821
821
  }
822
- const claudeSdk = transport === "sdk" ? await import("./claude-sdk-session-bht9jjak.js") : undefined;
822
+ const claudeSdk = transport === "sdk" ? await import("./claude-sdk-session-pbaczbgt.js") : undefined;
823
823
  claudeSdk?.validateClaudeSdkAdditionalArgs([
824
824
  ...claudeBinaryArgv.slice(1),
825
825
  ...config.additionalArgs ?? []
@@ -4,12 +4,12 @@ import {
4
4
  linkIdentity,
5
5
  recordUnmappedIdentity,
6
6
  resolveIdentity
7
- } from "./cli-5tpgq60f.js";
7
+ } from "./cli-72vksk1n.js";
8
8
  import {
9
9
  getKv,
10
10
  init_db,
11
11
  upsertKv
12
- } from "./cli-s14agm5s.js";
12
+ } from "./cli-gacq5hg8.js";
13
13
 
14
14
  // src/slack/enrich.ts
15
15
  init_db();
@@ -7,7 +7,7 @@ import {
7
7
  init_date_utils,
8
8
  init_db,
9
9
  normalizeDateRequired
10
- } from "./cli-s14agm5s.js";
10
+ } from "./cli-gacq5hg8.js";
11
11
  import {
12
12
  init_secret_scrubber,
13
13
  registerVolatileSecret,
@@ -49,7 +49,7 @@ import {
49
49
  setSlackMessageTracking,
50
50
  slackContextKey,
51
51
  updateSlackMessageRecord
52
- } from "./cli-s14agm5s.js";
52
+ } from "./cli-gacq5hg8.js";
53
53
  import {
54
54
  getAppUrl,
55
55
  init_constants
@@ -54475,7 +54475,7 @@ async function initOtel(serviceRole = process.env.AGENT_ROLE || "api") {
54475
54475
  return;
54476
54476
  initialized = true;
54477
54477
  try {
54478
- const impl = await import("./otel-impl-943c96er.js");
54478
+ const impl = await import("./otel-impl-6vbb568y.js");
54479
54479
  await impl.boot(serviceRole);
54480
54480
  realWithSpan = impl.withSpan;
54481
54481
  realStartSpan = impl.startSpan;
@@ -54871,6 +54871,24 @@ function buildTreeBlocks(roots) {
54871
54871
 
54872
54872
  // src/slack/responses.ts
54873
54873
  init_db();
54874
+
54875
+ // src/slack/task-output.ts
54876
+ function slackTaskOutput(task) {
54877
+ const output = task.output ?? undefined;
54878
+ if (task.status !== "completed" || task.outputSchema || !task.tags?.includes("deferred")) {
54879
+ return output;
54880
+ }
54881
+ const notice = output?.match(/^Deferred until [^\n]+? \([^\n]+?\) -> (.*)$/);
54882
+ if (!notice)
54883
+ return output;
54884
+ const pending = notice[1]?.trim();
54885
+ return pending ? `Pending: ${pending}` : "";
54886
+ }
54887
+ function isSlackEtaOnlyNotice(task) {
54888
+ return !!task.output && slackTaskOutput(task) === "";
54889
+ }
54890
+
54891
+ // src/slack/responses.ts
54874
54892
  function classifySlackUpdateError(error) {
54875
54893
  const errorCode = error?.data?.error;
54876
54894
  if (errorCode === "message_not_found" || errorCode === "channel_not_found" || errorCode === "thread_not_found") {
@@ -54890,7 +54908,7 @@ function shouldPostInlineCompletionOutput(task) {
54890
54908
  return false;
54891
54909
  if (task.slackReplySent)
54892
54910
  return false;
54893
- const output = task.output?.trim();
54911
+ const output = slackTaskOutput(task)?.trim();
54894
54912
  return !!output && isTreeOutputTruncated(markdownToSlack(output));
54895
54913
  }
54896
54914
  function formatInlineCompletionOutputChunks(opts) {
@@ -54913,7 +54931,7 @@ async function sendInlineTaskOutput(task) {
54913
54931
  const chunks = formatInlineCompletionOutputChunks({
54914
54932
  agentName: agent.name,
54915
54933
  taskId: task.id,
54916
- output: task.output
54934
+ output: slackTaskOutput(task) ?? ""
54917
54935
  });
54918
54936
  try {
54919
54937
  for (let i = 0;i < chunks.length; i += MAX_INLINE_OUTPUT_BLOCKS_PER_MESSAGE) {
@@ -54940,6 +54958,8 @@ async function sendInlineTaskOutput(task) {
54940
54958
  }
54941
54959
  }
54942
54960
  async function sendTaskResponse(task) {
54961
+ if (isSlackEtaOnlyNotice(task))
54962
+ return true;
54943
54963
  const app = getSlackApp();
54944
54964
  if (!app || !task.slackChannelId || !task.slackThreadTs) {
54945
54965
  return false;
@@ -54957,7 +54977,7 @@ async function sendTaskResponse(task) {
54957
54977
  const agentName = agent.name;
54958
54978
  try {
54959
54979
  if (task.status === "completed") {
54960
- const output = task.output || "Task completed.";
54980
+ const output = slackTaskOutput(task) || "Task completed.";
54961
54981
  const slackOutput = markdownToSlack(output);
54962
54982
  const attachmentsBlock = formatAttachmentsBlockForSlack(await getTaskAttachments(task.id));
54963
54983
  const body = slackOutput + attachmentsBlock;
@@ -55065,6 +55085,8 @@ async function updateProgressInPlace(task, progress, messageTs) {
55065
55085
  }
55066
55086
  }
55067
55087
  async function updateToFinal(task, messageTs) {
55088
+ if (isSlackEtaOnlyNotice(task))
55089
+ return "ok";
55068
55090
  const app = getSlackApp();
55069
55091
  if (!app || !task.slackChannelId || !task.agentId)
55070
55092
  return "failed";
@@ -55076,7 +55098,7 @@ async function updateToFinal(task, messageTs) {
55076
55098
  let text;
55077
55099
  let completionBlockBatches;
55078
55100
  if (task.status === "completed") {
55079
- const output = task.output || "Task completed.";
55101
+ const output = slackTaskOutput(task) || "Task completed.";
55080
55102
  const slackOutput = markdownToSlack(output);
55081
55103
  const attachmentsBlock = formatAttachmentsBlockForSlack(await getTaskAttachments(task.id));
55082
55104
  const body = slackOutput + attachmentsBlock;
@@ -55265,7 +55287,7 @@ async function buildTreeNodes(tree) {
55265
55287
  progress: child.progress ?? undefined,
55266
55288
  duration: childDuration,
55267
55289
  slackReplySent: child.slackReplySent,
55268
- output: child.output ?? undefined,
55290
+ output: slackTaskOutput(child),
55269
55291
  failureReason: child.failureReason ?? undefined,
55270
55292
  attachments: childAttachments,
55271
55293
  steered: childSteered,
@@ -55283,7 +55305,7 @@ async function buildTreeNodes(tree) {
55283
55305
  progress: task.progress ?? undefined,
55284
55306
  duration,
55285
55307
  slackReplySent: task.slackReplySent,
55286
- output: task.output ?? undefined,
55308
+ output: slackTaskOutput(task),
55287
55309
  failureReason: task.failureReason ?? undefined,
55288
55310
  attachments: rootAttachments,
55289
55311
  steered: rootSteered,
@@ -55793,15 +55815,15 @@ async function initSlackApp() {
55793
55815
  logLevel: import_bolt.LogLevel.DEBUG,
55794
55816
  ...slackApiUrl ? { clientOptions: { slackApiUrl } } : {}
55795
55817
  });
55796
- const { registerMessageHandler } = await import("./handlers-tw90pkh5.js");
55797
- const { registerCommandHandler } = await import("./commands-9v4psyq1.js");
55798
- const { registerActionHandlers } = await import("./actions-2bgpyhww.js");
55799
- const { registerWorkObjectHandlers } = await import("./work-objects-wangt792.js");
55818
+ const { registerMessageHandler } = await import("./handlers-wrrhsack.js");
55819
+ const { registerCommandHandler } = await import("./commands-wfqqpn95.js");
55820
+ const { registerActionHandlers } = await import("./actions-4sc0v342.js");
55821
+ const { registerWorkObjectHandlers } = await import("./work-objects-rmayxcx7.js");
55800
55822
  registerMessageHandler(app);
55801
55823
  registerCommandHandler(app);
55802
55824
  registerActionHandlers(app);
55803
55825
  registerWorkObjectHandlers(app);
55804
- const { createAssistant } = await import("./assistant-bavke5p7.js");
55826
+ const { createAssistant } = await import("./assistant-zs6wdnrf.js");
55805
55827
  app.assistant(createAssistant());
55806
55828
  return app;
55807
55829
  }
@@ -55810,7 +55832,7 @@ async function startSlackApp() {
55810
55832
  await initSlackApp();
55811
55833
  }
55812
55834
  if (app) {
55813
- const { isSlackRenderV2Enabled: isSlackRenderV2Enabled2 } = await import("./render-v2-8zjntgf5.js");
55835
+ const { isSlackRenderV2Enabled: isSlackRenderV2Enabled2 } = await import("./render-v2-fpb8whme.js");
55814
55836
  if (isSlackRenderV2Enabled2())
55815
55837
  await ensureSlackRenderV2Activation();
55816
55838
  await app.start();
@@ -56513,7 +56535,7 @@ ${outcomeText(task.failureReason, "Task was cancelled.")}`;
56513
56535
  }
56514
56536
  return `✅
56515
56537
 
56516
- ${outcomeText(task.output, "Task completed.")}`;
56538
+ ${outcomeText(slackTaskOutput(task), "Task completed.")}`;
56517
56539
  }
56518
56540
  async function agentDisplayNameFor(task) {
56519
56541
  return task.agentId ? (await getAgentById(task.agentId))?.name ?? "Agent" : "Agent";
@@ -56530,23 +56552,23 @@ ${outcomeText(task.failureReason, "Task failed.")}`;
56530
56552
  }
56531
56553
  return `↳ ✅ ${agentName} — result
56532
56554
 
56533
- ${outcomeText(task.output, "Task completed.")}`;
56555
+ ${outcomeText(slackTaskOutput(task), "Task completed.")}`;
56534
56556
  }
56535
56557
  function isSlackContinuation(task) {
56536
56558
  return task.source === "schedule" && task.taskType === "deferred" && !!task.slackChannelId && !!task.slackThreadTs;
56537
56559
  }
56538
56560
  function isChildCardCandidate(task, delegationActivatedAt) {
56539
- return task.source !== "slack" && !isSlackContinuation(task) && !!task.slackChannelId && !!task.slackThreadTs && (task.status === "completed" || task.status === "failed") && task.taskType !== "follow-up" && task.taskType !== "reroute-decision" && task.createdAt >= delegationActivatedAt;
56561
+ return !isSlackEtaOnlyNotice(task) && task.source !== "slack" && !isSlackContinuation(task) && !!task.slackChannelId && !!task.slackThreadTs && (task.status === "completed" || task.status === "failed") && task.taskType !== "follow-up" && task.taskType !== "reroute-decision" && task.createdAt >= delegationActivatedAt;
56540
56562
  }
56541
56563
  function taskNeedsDirectOutcome(task, activatedAt) {
56542
- return (task.source === "slack" && isAskOutcomeStatus(task.status) || isSlackContinuation(task) && isOutcomeStatus(task.status)) && task.createdAt >= activatedAt;
56564
+ return !isSlackEtaOnlyNotice(task) && (task.source === "slack" && isAskOutcomeStatus(task.status) || isSlackContinuation(task) && isOutcomeStatus(task.status)) && task.createdAt >= activatedAt;
56543
56565
  }
56544
56566
  async function conclusionResultsLines(closure) {
56545
56567
  const lines = [];
56546
56568
  for (const member of closure) {
56547
56569
  if (member.taskType === "follow-up" || member.taskType === "reroute-decision")
56548
56570
  continue;
56549
- if (!isOutcomeStatus(member.status))
56571
+ if (!isOutcomeStatus(member.status) || isSlackEtaOnlyNotice(member))
56550
56572
  continue;
56551
56573
  const glyph = await taskStateGlyph(member, new Date);
56552
56574
  const agentName = await agentDisplayNameFor(member);
@@ -56555,7 +56577,7 @@ async function conclusionResultsLines(closure) {
56555
56577
  lines.push(`↳ ${glyph} ${agentName} — ${card.permalink}`);
56556
56578
  continue;
56557
56579
  }
56558
- const raw = outcomeText(member.status === "failed" ? member.failureReason : member.output, "");
56580
+ const raw = outcomeText(member.status === "failed" ? member.failureReason : slackTaskOutput(member), "");
56559
56581
  const digest = raw.length > CONCLUSION_DIGEST_LENGTH ? `${raw.slice(0, CONCLUSION_DIGEST_LENGTH).trimEnd()}…` : raw;
56560
56582
  const label = digest ? `${agentName} — ${digest}` : agentName;
56561
56583
  lines.push(`↳ ${glyph} ${label} ${getTaskLink(member.id)}`);
@@ -57051,4 +57073,4 @@ function _resetSlackRenderV2ForTests() {
57051
57073
  outcomeDeliveryFailures.clear();
57052
57074
  }
57053
57075
 
57054
- export { initialize, ensure, isPollTracingEnabled, initOtel, withSpan, startSpan, withSpanContext, withRemoteContext, injectTraceContext, recordSessionCost, recordDbRetentionSweep, recordDbRetentionStatement, require_dist7 as require_dist, ackSlackMessage, getTaskLink, getTaskUrl, markdownToSlack, buildCancelledBlocks, buildBufferFlushBlocks, buildTreeBlocks, getAgentDisplayName, getAgentEmoji, isSlackRenderV2Enabled, isSlackDelegationEnabled, callSlackWithRetry, formatV2Duration, renderThreadTree, ensureSlackThreadTree, childOutcomeContent, streamOutcomeCard, processSlackRenderV2, _resetSlackRenderV2ForTests, registerTreeMessage, getSlackApp, initSlackApp, startSlackApp, stopSlackApp };
57076
+ export { initialize, ensure, isPollTracingEnabled, initOtel, withSpan, startSpan, withSpanContext, withRemoteContext, injectTraceContext, recordSessionCost, recordDbRetentionSweep, recordDbRetentionStatement, require_dist7 as require_dist, ackSlackMessage, getTaskLink, getTaskUrl, markdownToSlack, buildCancelledBlocks, buildBufferFlushBlocks, buildTreeBlocks, slackTaskOutput, getAgentDisplayName, getAgentEmoji, isSlackRenderV2Enabled, isSlackDelegationEnabled, callSlackWithRetry, formatV2Duration, renderThreadTree, ensureSlackThreadTree, childOutcomeContent, streamOutcomeCard, processSlackRenderV2, _resetSlackRenderV2ForTests, registerTreeMessage, getSlackApp, initSlackApp, startSlackApp, stopSlackApp };
@@ -11,7 +11,7 @@ import {
11
11
  getDbClient,
12
12
  init_db,
13
13
  isSqliteVecAvailable
14
- } from "./cli-s14agm5s.js";
14
+ } from "./cli-gacq5hg8.js";
15
15
  import {
16
16
  __esm,
17
17
  __export,
@@ -35,7 +35,7 @@ import {
35
35
  import {
36
36
  init_package,
37
37
  package_default
38
- } from "./cli-zkxymas5.js";
38
+ } from "./cli-jh9txj4n.js";
39
39
  import {
40
40
  init_secret_scrubber,
41
41
  scrubSecrets
@@ -15,7 +15,7 @@ import {
15
15
  recoverIncompleteRuns,
16
16
  repointTrackerSyncBySwarmId,
17
17
  resolveLeadOnlyRecoveryAssignment
18
- } from "./cli-5tpgq60f.js";
18
+ } from "./cli-72vksk1n.js";
19
19
  import {
20
20
  isMultiRuntimeEnabled
21
21
  } from "./cli-re8z5p8p.js";
@@ -61,7 +61,7 @@ import {
61
61
  releaseStaleReviewingTasks,
62
62
  supersedeTask,
63
63
  updateAgentStatus
64
- } from "./cli-s14agm5s.js";
64
+ } from "./cli-gacq5hg8.js";
65
65
  import {
66
66
  init_registry,
67
67
  init_resolver,