@desplega.ai/agent-swarm 1.153.0 → 1.154.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 (143) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-ahmjxhek.js → acp-adapter-eb2aj8xy.js} +1 -1
  3. package/dist/{actions-jzrfpkmn.js → actions-kpnwp1kz.js} +18 -18
  4. package/dist/{app-03na2vwb.js → app-zk1apkf6.js} +6 -6
  5. package/dist/{assistant-hfkxvhgt.js → assistant-kwq4y50q.js} +19 -19
  6. package/dist/{boot-reembed-c98xrad3.js → boot-reembed-22hd3jjn.js} +7 -7
  7. package/dist/{boot-reembed-zt3qm9xn.js → boot-reembed-qe168424.js} +8 -8
  8. package/dist/{boot-scrub-logs-jcqd8ksj.js → boot-scrub-logs-pkdpsrjd.js} +5 -5
  9. package/dist/{claude-adapter-mgryg8g3.js → claude-adapter-3fx90nww.js} +10 -10
  10. package/dist/{claude-sdk-session-jjf4zss1.js → claude-sdk-session-z7fahf1k.js} +10 -10
  11. package/dist/{cli-1hwnb4hc.js → cli-09y3tjxz.js} +1 -1
  12. package/dist/{cli-b2g6mzjc.js → cli-0e31nm4n.js} +1 -1
  13. package/dist/{cli-5mbmvxnn.js → cli-1jpjafw4.js} +5 -5
  14. package/dist/{cli-bw0dfwkr.js → cli-243tzws8.js} +1 -1
  15. package/dist/{cli-rj7de4b2.js → cli-24k806sc.js} +1 -1
  16. package/dist/{cli-7g9s78jf.js → cli-3bkz2p7j.js} +7 -6
  17. package/dist/{cli-zcsyfw2z.js → cli-4k7jazkq.js} +4 -0
  18. package/dist/{cli-s5s1f2yn.js → cli-5vs0nh43.js} +25 -20
  19. package/dist/{cli-qrqhc31j.js → cli-6r3cgpk2.js} +94 -52
  20. package/dist/{cli-pgj4a5fb.js → cli-71cj99hx.js} +4 -3
  21. package/dist/{cli-d6hk10xx.js → cli-8sea27q4.js} +2 -2
  22. package/dist/{cli-a9scg8sv.js → cli-913yakhv.js} +22 -7
  23. package/dist/{cli-pf9q3696.js → cli-927erqqt.js} +5 -2
  24. package/dist/{cli-zy5w9gpt.js → cli-95jnpnqg.js} +1 -1
  25. package/dist/{cli-cdq08v3r.js → cli-abp3g4ax.js} +15 -2
  26. package/dist/{cli-nq0kgyxe.js → cli-acy6bfhr.js} +10 -7
  27. package/dist/{cli-n0q9b7j4.js → cli-c1v10xb2.js} +157 -52
  28. package/dist/{cli-tdh4hjr2.js → cli-e0pg4zeh.js} +1 -1
  29. package/dist/{cli-83wkg402.js → cli-e31ehqwy.js} +1 -1
  30. package/dist/{cli-m04pt18h.js → cli-e3229na9.js} +3 -3
  31. package/dist/{cli-ysc1kbet.js → cli-e3cyf59d.js} +2 -2
  32. package/dist/{cli-mzgyhxbe.js → cli-fdzg6jhf.js} +2 -2
  33. package/dist/{cli-0d9nbqxf.js → cli-g2h29qar.js} +2 -2
  34. package/dist/{cli-djvxhnc4.js → cli-ge67p080.js} +124 -26
  35. package/dist/{cli-7pnz2v6s.js → cli-hws0vn86.js} +2 -2
  36. package/dist/{cli-3bcmp015.js → cli-kp3qs53m.js} +2 -2
  37. package/dist/{cli-ybpp1srm.js → cli-myaxtgh8.js} +2 -1
  38. package/dist/{cli-r8tdds6s.js → cli-n62atwh9.js} +1 -1
  39. package/dist/{cli-6ks9xf1n.js → cli-pf1v8xhb.js} +4 -4
  40. package/dist/{cli-5taqtpze.js → cli-q85qhckh.js} +6 -6
  41. package/dist/{cli-eazstkad.js → cli-r1d3dzt6.js} +2 -2
  42. package/dist/{cli-ja7mrygn.js → cli-rxkqvngf.js} +2 -2
  43. package/dist/{cli-vw03hg5t.js → cli-stwsmd6k.js} +2 -2
  44. package/dist/{cli-z61ykvam.js → cli-wg04s9kr.js} +4 -3
  45. package/dist/cli.js +13 -12
  46. package/dist/{codex-adapter-8548daap.js → codex-adapter-ttdm995v.js} +5 -5
  47. package/dist/{codex-hook-8jexc34x.js → codex-hook-8gx7bcz0.js} +3 -3
  48. package/dist/{codex-session-runner-2dad8p4x.js → codex-session-runner-3v8nh4c8.js} +5 -5
  49. package/dist/{commands-355dbpa8.js → commands-1cxwbhhq.js} +5 -5
  50. package/dist/{db-4jjvwz1s.js → db-y9zwsr79.js} +23 -5
  51. package/dist/{dispatcher-ca590nkz.js → dispatcher-9m9zss36.js} +17 -17
  52. package/dist/{dsh-adapter-rgvj6ykp.js → dsh-adapter-gsb2qqf9.js} +2 -2
  53. package/dist/{google-generative-ai-xtw7tggr.js → google-generative-ai-gwwrnzqn.js} +1 -1
  54. package/dist/{google-vertex-zdqpms6n.js → google-vertex-5wfawpwz.js} +1 -1
  55. package/dist/{handlers-2y6dqpvf.js → handlers-36fm1bwn.js} +20 -20
  56. package/dist/{hook-0s8knepr.js → hook-pntw4r8h.js} +8 -8
  57. package/dist/{hook-k0gec254.js → hook-vwq8y26p.js} +9 -9
  58. package/dist/{http-jp2nb4zw.js → http-20jesakk.js} +89 -56
  59. package/dist/{index-42s7eezq.js → index-6artrehg.js} +17 -17
  60. package/dist/{index-3mq6ce93.js → index-9n5z2492.js} +17 -17
  61. package/dist/{index-0wzg3sp3.js → index-j5wrf1yw.js} +11 -11
  62. package/dist/{index-s37dbevy.js → index-m2xqpz5r.js} +18 -18
  63. package/dist/{index-b56xkbc7.js → index-m9ks8a7t.js} +7 -7
  64. package/dist/{keepalive-9pfw7t02.js → keepalive-pwxvxd2c.js} +7 -7
  65. package/dist/{lead-7vcmcdq4.js → lead-m789wqa3.js} +26 -26
  66. package/dist/{maintenance-x277jbpd.js → maintenance-bvg6w7e2.js} +8 -8
  67. package/dist/{oauth-refresh-sweep-5fwa7th2.js → oauth-refresh-sweep-6v4bd737.js} +6 -6
  68. package/dist/{onboard-17sv0f51.js → onboard-snckpcj1.js} +14 -2
  69. package/dist/{otel-impl-srjy4be4.js → otel-impl-e0ytens5.js} +1 -1
  70. package/dist/{pi-mono-adapter-946a0sdd.js → pi-mono-adapter-c4ggemhz.js} +6 -6
  71. package/dist/{pricing-refresh-vetcm563.js → pricing-refresh-52g2ywrw.js} +7 -7
  72. package/dist/{rbac-roles-cmxaddmy.js → rbac-roles-5455kfdn.js} +5 -5
  73. package/dist/{rbac-roles-cfzgr6r1.js → rbac-roles-hbf0xa52.js} +6 -6
  74. package/dist/{render-v2-f9hzff72.js → render-v2-npm8xdzh.js} +12 -8
  75. package/dist/{seed-pricing-jggk6rsy.js → seed-pricing-650wbr1n.js} +6 -6
  76. package/dist/{setup-8mfceb9t.js → setup-k1mew5rf.js} +2 -2
  77. package/dist/{virtual-modules-ax661xp0.js → virtual-modules-2q5b2pk4.js} +2 -2
  78. package/dist/{work-objects-vdsdcczj.js → work-objects-2ea3kvwg.js} +20 -20
  79. package/dist/{worker-cd0nhyv1.js → worker-ec6hvc4m.js} +26 -26
  80. package/openapi.json +74 -3
  81. package/package.json +2 -1
  82. package/plugin/opencode-plugins/lib/memory-raters.ts +7 -0
  83. package/src/be/db/agents.ts +75 -2
  84. package/src/be/db/tasks/read.ts +2 -0
  85. package/src/be/db/tasks/write.ts +7 -1
  86. package/src/be/db.ts +140 -18
  87. package/src/be/memory/raters/llm.ts +2 -6
  88. package/src/be/memory/raters/noop.ts +2 -3
  89. package/src/be/memory/raters/registry.ts +4 -10
  90. package/src/be/migrations/157_defer_provenance_and_marker.sql +27 -0
  91. package/src/be/seed/agent-fs-provision.ts +23 -0
  92. package/src/commands/onboard/compose-generator.ts +10 -0
  93. package/src/commands/onboard/env-generator.ts +8 -0
  94. package/src/commands/runner.ts +18 -2
  95. package/src/extensions/identity.ts +15 -7
  96. package/src/hooks/codex-hook.ts +7 -1
  97. package/src/http/agents.ts +10 -2
  98. package/src/http/poll.ts +7 -0
  99. package/src/http/schedules.ts +10 -0
  100. package/src/http/script-runs.ts +35 -26
  101. package/src/http/status.ts +2 -1
  102. package/src/http/tasks.ts +6 -1
  103. package/src/prompts/memories.ts +5 -7
  104. package/src/prompts/session-templates.ts +3 -2
  105. package/src/prompts/steering-delivery.ts +2 -0
  106. package/src/providers/codex-adapter.ts +3 -6
  107. package/src/providers/pi-mono-extension.ts +2 -5
  108. package/src/slack/ack.ts +43 -8
  109. package/src/slack/handlers.ts +7 -1
  110. package/src/slack/render-v2.ts +186 -17
  111. package/src/slack/responses.ts +1 -3
  112. package/src/slack/task-output.ts +66 -8
  113. package/src/slack/thread-buffer.ts +27 -3
  114. package/src/tests/agent-fs-provision-seeder.test.ts +56 -2
  115. package/src/tests/codex-steering-hook.test.ts +2 -2
  116. package/src/tests/db-task-read-contract.test.ts +9 -0
  117. package/src/tests/db-task-write-contract.test.ts +9 -0
  118. package/src/tests/defer-task.test.ts +115 -16
  119. package/src/tests/extension-agent-visibility.test.ts +474 -0
  120. package/src/tests/extensions-lifecycle.test.ts +3 -1
  121. package/src/tests/fetch-resolved-env.test.ts +43 -0
  122. package/src/tests/memory-rate-tool.test.ts +7 -10
  123. package/src/tests/memory-rater-defaults.test.ts +23 -0
  124. package/src/tests/memory-rater-e2e.test.ts +2 -3
  125. package/src/tests/script-connections.test.ts +3 -0
  126. package/src/tests/slack-render-v2.test.ts +446 -16
  127. package/src/tests/slack-steering.test.ts +69 -1
  128. package/src/tests/slack-task-output.test.ts +33 -12
  129. package/src/tests/steering-core.test.ts +35 -0
  130. package/src/tests/steering-delivery.test.ts +39 -0
  131. package/src/tests/steering-transport.test.ts +2 -2
  132. package/src/tests/workflow-live-recovery.test.ts +126 -0
  133. package/src/tools/defer-task.ts +64 -26
  134. package/src/tools/join-swarm.ts +1 -1
  135. package/src/tools/schedules/create-schedule.ts +11 -1
  136. package/src/tools/schedules/patch-schedule.ts +5 -0
  137. package/src/tools/schedules/update-schedule.ts +5 -0
  138. package/src/tools/send-task.ts +6 -0
  139. package/src/tools/utils.ts +1 -1
  140. package/src/types.ts +13 -0
  141. package/src/utils/memory-raters.ts +3 -0
  142. package/src/workflows/engine.ts +28 -0
  143. package/src/workflows/recovery.ts +7 -4
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  renderSteeringDelivery
3
- } from "./cli-pgj4a5fb.js";
3
+ } from "./cli-71cj99hx.js";
4
4
  import {
5
5
  checkClaudeManagedCredentials
6
6
  } from "./cli-scwq51gn.js";
@@ -12,18 +12,18 @@ import {
12
12
  } from "./cli-18amys3y.js";
13
13
  import {
14
14
  checkDshCredentials
15
- } from "./cli-zy5w9gpt.js";
15
+ } from "./cli-95jnpnqg.js";
16
16
  import {
17
17
  checkCodexCredentials,
18
18
  codexUserHome
19
- } from "./cli-5taqtpze.js";
19
+ } from "./cli-q85qhckh.js";
20
20
  import {
21
21
  renderMemoriesPrompt,
22
22
  writeSkillsToFilesystem
23
- } from "./cli-pf9q3696.js";
23
+ } from "./cli-927erqqt.js";
24
24
  import {
25
25
  checkClaudeCredentials
26
- } from "./cli-3bcmp015.js";
26
+ } from "./cli-kp3qs53m.js";
27
27
  import {
28
28
  MAX_RATE_LIMIT_RESET_MS,
29
29
  isCodexCreditsExhaustedMessage,
@@ -37,7 +37,7 @@ import {
37
37
  import {
38
38
  resolveScriptsOnlyMode,
39
39
  validateJsonSchema
40
- } from "./cli-qrqhc31j.js";
40
+ } from "./cli-6r3cgpk2.js";
41
41
  import {
42
42
  authJsonToCredentialSelection,
43
43
  credentialsToAuthJson,
@@ -64,7 +64,7 @@ import {
64
64
  syncProfileFilesToServer,
65
65
  writeIdentityBaselines,
66
66
  writeProfileFileFromDb
67
- } from "./cli-0d9nbqxf.js";
67
+ } from "./cli-g2h29qar.js";
68
68
  import {
69
69
  ensure,
70
70
  initOtel,
@@ -74,7 +74,7 @@ import {
74
74
  startSpan,
75
75
  withSpan,
76
76
  withSpanContext
77
- } from "./cli-n0q9b7j4.js";
77
+ } from "./cli-c1v10xb2.js";
78
78
  import {
79
79
  init_task_attachment_links,
80
80
  taskAttachmentFetchCommand
@@ -83,12 +83,12 @@ import {
83
83
  initTelemetry,
84
84
  init_telemetry,
85
85
  telemetry
86
- } from "./cli-djvxhnc4.js";
86
+ } from "./cli-ge67p080.js";
87
87
  import {
88
88
  ProviderNameSchema,
89
89
  init_types,
90
90
  resolveTaskModelSelection
91
- } from "./cli-zcsyfw2z.js";
91
+ } from "./cli-4k7jazkq.js";
92
92
  import {
93
93
  generateDefaultClaudeMd,
94
94
  generateDefaultIdentityMd,
@@ -98,7 +98,7 @@ import {
98
98
  init_base_prompt,
99
99
  init_defaults,
100
100
  init_templates
101
- } from "./cli-b2g6mzjc.js";
101
+ } from "./cli-0e31nm4n.js";
102
102
  import {
103
103
  configureHttpResolver,
104
104
  init_resolver,
@@ -107,7 +107,7 @@ import {
107
107
  interpolate,
108
108
  isSteeringEnabled,
109
109
  resolveTemplateAsync
110
- } from "./cli-z61ykvam.js";
110
+ } from "./cli-wg04s9kr.js";
111
111
  import {
112
112
  init_credentials,
113
113
  resolveCredentialPools
@@ -156,15 +156,15 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
156
156
  async function createProviderAdapter(provider) {
157
157
  switch (provider) {
158
158
  case "claude": {
159
- const { ClaudeAdapter } = await import("./claude-adapter-mgryg8g3.js");
159
+ const { ClaudeAdapter } = await import("./claude-adapter-3fx90nww.js");
160
160
  return new ClaudeAdapter;
161
161
  }
162
162
  case "pi": {
163
- const { PiMonoAdapter } = await import("./pi-mono-adapter-946a0sdd.js");
163
+ const { PiMonoAdapter } = await import("./pi-mono-adapter-c4ggemhz.js");
164
164
  return new PiMonoAdapter;
165
165
  }
166
166
  case "codex": {
167
- const { CodexAdapter } = await import("./codex-adapter-8548daap.js");
167
+ const { CodexAdapter } = await import("./codex-adapter-ttdm995v.js");
168
168
  return new CodexAdapter;
169
169
  }
170
170
  case "claude-managed": {
@@ -180,11 +180,11 @@ async function createProviderAdapter(provider) {
180
180
  return new OpencodeAdapter;
181
181
  }
182
182
  case "dsh": {
183
- const { DshAdapter } = await import("./dsh-adapter-rgvj6ykp.js");
183
+ const { DshAdapter } = await import("./dsh-adapter-gsb2qqf9.js");
184
184
  return new DshAdapter;
185
185
  }
186
186
  case "acp": {
187
- const { ACPAdapter } = await import("./acp-adapter-ahmjxhek.js");
187
+ const { ACPAdapter } = await import("./acp-adapter-eb2aj8xy.js");
188
188
  return new ACPAdapter;
189
189
  }
190
190
  default:
@@ -598,7 +598,7 @@ var CREDENTIAL_PROVIDER_CHECKERS = {
598
598
  devin: (env) => checkDevinCredentials(env),
599
599
  opencode: (env, opts) => checkOpencodeCredentials(env, opts),
600
600
  pi: async (env, opts) => {
601
- const { checkPiMonoCredentials } = await import("./pi-mono-adapter-946a0sdd.js");
601
+ const { checkPiMonoCredentials } = await import("./pi-mono-adapter-c4ggemhz.js");
602
602
  return checkPiMonoCredentials(env, opts);
603
603
  },
604
604
  acp: () => ({ ready: true, missing: [], satisfiedBy: "sdk-delegated" })
@@ -1377,7 +1377,7 @@ async function pollAndStartSteeringDispatches(config, taskId, session, state, fe
1377
1377
  state.inFlightMessageIds.add(message.id);
1378
1378
  const item = { message };
1379
1379
  prepared.push(item);
1380
- item.text = session.deliverSteering && !state.outcomes.has(message.id) ? await renderSteeringDelivery(message.id, message.body) : undefined;
1380
+ item.text = session.deliverSteering && !state.outcomes.has(message.id) ? await renderSteeringDelivery(message.id, message.body, message.senderLabel ?? message.createdByKind) : undefined;
1381
1381
  }
1382
1382
  } catch (error) {
1383
1383
  for (const { message } of prepared)
@@ -1473,6 +1473,7 @@ async function closeAgent(config, role) {
1473
1473
  console.log(`[${role}] Agent marked as offline`);
1474
1474
  } catch {}
1475
1475
  }
1476
+ var deploymentMemoryRaters = process.env.MEMORY_RATERS;
1476
1477
  async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env, taskModel, sessionContext) {
1477
1478
  const env = { ...baseEnv };
1478
1479
  const repoId = sessionContext?.repoId;
@@ -1488,6 +1489,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
1488
1489
  console.warn(`[env-reload] Failed to fetch config: ${response.status}`);
1489
1490
  } else {
1490
1491
  const data = await response.json();
1492
+ env.MEMORY_RATERS = baseEnv === process.env ? deploymentMemoryRaters : baseEnv.MEMORY_RATERS;
1491
1493
  if (data.configs?.length) {
1492
1494
  scriptsOnlyConfigValue = data.configs.find((config) => config.key === "SCRIPTS_ONLY_MCP")?.value;
1493
1495
  for (const config of data.configs) {
@@ -1583,7 +1585,10 @@ function applyResolvedEnvToProcessEnv(freshEnv) {
1583
1585
  const changed = [];
1584
1586
  for (const key of RELOADABLE_ENV_KEYS) {
1585
1587
  const next = freshEnv[key];
1586
- if (next !== undefined && next !== process.env[key]) {
1588
+ if (key === "MEMORY_RATERS" && next === undefined && process.env[key] !== undefined) {
1589
+ delete process.env[key];
1590
+ changed.push(key);
1591
+ } else if (next !== undefined && next !== process.env[key]) {
1587
1592
  const previous = process.env[key];
1588
1593
  process.env[key] = next;
1589
1594
  changed.push(key);
@@ -7,9 +7,10 @@ import {
7
7
  DEFAULT_MODEL,
8
8
  LlmRater,
9
9
  REFERENCES_SOURCE_MAX_LENGTH,
10
+ getMemoryRaterNames,
10
11
  resolveCredential,
11
12
  sanitizeReferencesSource
12
- } from "./cli-7g9s78jf.js";
13
+ } from "./cli-3bkz2p7j.js";
13
14
  import {
14
15
  isMultiRuntimeEnabled
15
16
  } from "./cli-re8z5p8p.js";
@@ -18,14 +19,14 @@ import {
18
19
  } from "./cli-3dpj7atn.js";
19
20
  import {
20
21
  startPricingRefreshLoop
21
- } from "./cli-vw03hg5t.js";
22
+ } from "./cli-stwsmd6k.js";
22
23
  import {
23
24
  seedPricingFromModelsDev
24
- } from "./cli-tdh4hjr2.js";
25
+ } from "./cli-e0pg4zeh.js";
25
26
  import {
26
27
  ensureRbacSeedsSynced,
27
28
  getUserGrant
28
- } from "./cli-83wkg402.js";
29
+ } from "./cli-e31ehqwy.js";
29
30
  import {
30
31
  can,
31
32
  decideAdmission,
@@ -96,7 +97,7 @@ import {
96
97
  upsertScriptConnection,
97
98
  validateDefinition,
98
99
  writeBareImportShim
99
- } from "./cli-6ks9xf1n.js";
100
+ } from "./cli-pf1v8xhb.js";
100
101
  import {
101
102
  detachedProcessGroup,
102
103
  registerProcessGroup,
@@ -119,7 +120,7 @@ import {
119
120
  listAuthorizationsForApp,
120
121
  onAuthorizationRefreshed,
121
122
  upsertOAuthApp
122
- } from "./cli-r8tdds6s.js";
123
+ } from "./cli-n62atwh9.js";
123
124
  import {
124
125
  ZodFirstPartyTypeKind,
125
126
  objectType
@@ -140,7 +141,7 @@ import {
140
141
  isGraphExpansionEnabled,
141
142
  rerank,
142
143
  rowToCandidate
143
- } from "./cli-7pnz2v6s.js";
144
+ } from "./cli-hws0vn86.js";
144
145
  import {
145
146
  require_dist
146
147
  } from "./cli-51tf7ac3.js";
@@ -154,7 +155,7 @@ import {
154
155
  startSlackApp,
155
156
  stopSlackApp,
156
157
  withSpan
157
- } from "./cli-n0q9b7j4.js";
158
+ } from "./cli-c1v10xb2.js";
158
159
  import {
159
160
  init_task_attachment_links,
160
161
  taskAttachmentDisplayUrl,
@@ -162,6 +163,7 @@ import {
162
163
  } from "./cli-2658f6at.js";
163
164
  import {
164
165
  CredentialBindingSchema,
166
+ EXTENSION_AGENT_ROLE,
165
167
  KvTypeCollisionError,
166
168
  MAX_EMPTY_POLLS,
167
169
  SteeringRequestError,
@@ -215,6 +217,7 @@ import {
215
217
  deleteWorkflow,
216
218
  emitMcpServerConnectedTelemetry,
217
219
  exports_db,
220
+ extensionAgentAssignmentError,
218
221
  failTask,
219
222
  findCompletedTaskInThread,
220
223
  findExistingLinearTrackerContextWork,
@@ -339,6 +342,7 @@ import {
339
342
  installMcpServer,
340
343
  installSkill,
341
344
  isAgentEligibleForTask,
345
+ isExtensionAgent,
342
346
  isInTransaction,
343
347
  isReservedConfigKey,
344
348
  isSteeringEnabled,
@@ -411,7 +415,7 @@ import {
411
415
  upsertSwarmConfig,
412
416
  validateConfigValue,
413
417
  workflowContextKey
414
- } from "./cli-djvxhnc4.js";
418
+ } from "./cli-ge67p080.js";
415
419
  import {
416
420
  $OpenAPIRegistry,
417
421
  $OpenApiGeneratorV31,
@@ -465,13 +469,13 @@ import {
465
469
  normalizeAssetKey,
466
470
  parseAssetKey,
467
471
  splitLegacyModelAlias
468
- } from "./cli-zcsyfw2z.js";
472
+ } from "./cli-4k7jazkq.js";
469
473
  import {
470
474
  generateDefaultClaudeMd,
471
475
  generateDefaultIdentityMd,
472
476
  generateDefaultSoulMd,
473
477
  init_defaults
474
- } from "./cli-b2g6mzjc.js";
478
+ } from "./cli-0e31nm4n.js";
475
479
  import {
476
480
  deepInterpolate,
477
481
  findInterpolationTokens,
@@ -482,7 +486,7 @@ import {
482
486
  interpolate,
483
487
  registerTemplate,
484
488
  resolveTemplate
485
- } from "./cli-z61ykvam.js";
489
+ } from "./cli-wg04s9kr.js";
486
490
  import {
487
491
  MAX_PROFILE_FILE_LENGTH,
488
492
  getAppUrl,
@@ -548,7 +552,7 @@ import {
548
552
  import {
549
553
  init_package,
550
554
  package_default
551
- } from "./cli-ybpp1srm.js";
555
+ } from "./cli-myaxtgh8.js";
552
556
  import {
553
557
  init_secret_scrubber,
554
558
  isSensitiveKey,
@@ -23712,7 +23716,7 @@ async function notifySlack(text) {
23712
23716
  return;
23713
23717
  }
23714
23718
  try {
23715
- const { getSlackApp: getSlackApp2 } = await import("./app-03na2vwb.js");
23719
+ const { getSlackApp: getSlackApp2 } = await import("./app-zk1apkf6.js");
23716
23720
  const app = getSlackApp2();
23717
23721
  if (!app) {
23718
23722
  console.warn("[Jira webhook keepalive] Slack not available, cannot send notification");
@@ -23783,7 +23787,7 @@ async function deleteJiraWebhook(webhookId) {
23783
23787
  console.log(`[Jira webhook keepalive] Deleted webhook id=${webhookId}`);
23784
23788
  }
23785
23789
  async function overwriteWebhookIds(next) {
23786
- const { getDbClient: getDbClient2 } = await import("./db-4jjvwz1s.js");
23790
+ const { getDbClient: getDbClient2 } = await import("./db-y9zwsr79.js");
23787
23791
  await getDbClient2().transaction(async (tx) => {
23788
23792
  const row = await tx.get("SELECT metadata FROM oauth_apps WHERE provider = 'jira'");
23789
23793
  if (!row) {
@@ -97503,7 +97507,7 @@ async function reloadGlobalConfigsAndIntegrations() {
97503
97507
  return runWithoutRequestAuth(() => reloadGlobalConfigsAndIntegrationsInner());
97504
97508
  }
97505
97509
  async function reloadGlobalConfigsAndIntegrationsInner() {
97506
- const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-b56xkbc7.js");
97510
+ const { getEmbeddingProvider: getEmbeddingProvider2, resetEmbeddingProvider } = await import("./index-m9ks8a7t.js");
97507
97511
  const wasEmbeddingsConfigured = getEmbeddingProvider2().isConfigured();
97508
97512
  const updated = await loadGlobalConfigsIntoEnv(true);
97509
97513
  await stopSlackApp();
@@ -97516,10 +97520,10 @@ async function reloadGlobalConfigsAndIntegrationsInner() {
97516
97520
  integrations.push("embeddings");
97517
97521
  }
97518
97522
  if (!wasEmbeddingsConfigured && isEmbeddingsConfigured) {
97519
- import("./boot-reembed-c98xrad3.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
97523
+ import("./boot-reembed-22hd3jjn.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
97520
97524
  console.error("[config-reload] memory backfill failed (non-fatal):", err);
97521
97525
  });
97522
- import("./boot-reembed-zt3qm9xn.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
97526
+ import("./boot-reembed-qe168424.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
97523
97527
  console.error("[config-reload] script backfill failed (non-fatal):", err);
97524
97528
  });
97525
97529
  }
@@ -98006,7 +98010,7 @@ var storeProgressBlockedWaitingNudge = (r) => {
98006
98010
  const ms = r.data?.blockedWaitingElapsedMs;
98007
98011
  if (typeof ms !== "number")
98008
98012
  return;
98009
- return `That reads as blocked-waiting, ${formatIdleDuration(ms)} since your last update — call defer-task so a wake-up task resumes you instead of polling manually.`;
98013
+ return `That reads as blocked-waiting, ${formatIdleDuration(ms)} since your last update — keep working if you can, and if the wait is genuinely long, defer-task is one way to resume later instead of polling.`;
98010
98014
  };
98011
98015
  var workflowLongScriptTimeoutNudge = (r) => {
98012
98016
  if (!r.ok)
@@ -98332,7 +98336,7 @@ function setPreloadedTools(server, names) {
98332
98336
  async function applyPreToolCall(name, args, requestInfo, inputSchema) {
98333
98337
  if (requestInfo.callOrigin !== "mcp")
98334
98338
  return { args };
98335
- const dispatcher = await import("./dispatcher-ca590nkz.js");
98339
+ const dispatcher = await import("./dispatcher-9m9zss36.js");
98336
98340
  const result = await dispatcher.dispatchPre("pre.tool.call", { tool: name, args, requestInfo }, inputSchema ? {
98337
98341
  validateModify: async (data) => {
98338
98342
  const schema = normalizeObjectSchema(inputSchema) ?? inputSchema;
@@ -104660,11 +104664,7 @@ var FACTORIES = {
104660
104664
  };
104661
104665
  var SERVER_RATERS = new Set(["implicit-citation"]);
104662
104666
  function getRegisteredRaters() {
104663
- const raw = process.env.MEMORY_RATERS;
104664
- if (!raw || raw.trim() === "") {
104665
- return [new NoopRater];
104666
- }
104667
- const names = raw.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
104667
+ const names = getMemoryRaterNames();
104668
104668
  const raters = [];
104669
104669
  for (const name of names) {
104670
104670
  const factory = FACTORIES[name];
@@ -105519,7 +105519,6 @@ async function guardTerminalTaskResultWrite(task, write) {
105519
105519
 
105520
105520
  // src/tools/defer-task.ts
105521
105521
  init_types();
105522
- init_constants();
105523
105522
 
105524
105523
  class DeferAbortedError extends Error {
105525
105524
  }
@@ -105562,7 +105561,7 @@ function formatDeferralDateTime(target, now, tz) {
105562
105561
  zone = "UTC";
105563
105562
  }
105564
105563
  const t = partsInTz(target, zone);
105565
- const time = `${t.hour}:${t.minute}:${t.second}`;
105564
+ const time = `${t.hour}:${t.minute}`;
105566
105565
  const n = partsInTz(now, zone);
105567
105566
  if (t.year === n.year && t.month === n.month && t.day === n.day)
105568
105567
  return { date: "today", time };
@@ -105580,22 +105579,26 @@ async function resolveRequesterTimezone(requestedByUserId) {
105580
105579
  }
105581
105580
  return { tz: "UTC", isFallback: true };
105582
105581
  }
105583
- function renderShortDesc(note, max = 100) {
105584
- const firstLine = (note.split(`
105585
- `)[0] ?? "").trim().replace(/^pending:\s*/i, "");
105586
- if (firstLine.length <= max)
105587
- return firstLine;
105588
- return `${firstLine.slice(0, max - 1).trimEnd()}…`;
105582
+ function joinNames(names) {
105583
+ if (names.length < 2)
105584
+ return names[0] ?? "";
105585
+ return `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`;
105589
105586
  }
105590
- function renderHumanFacingDeferral(note, nextRunAt, scheduleId, tz, isFallbackTz) {
105591
- const now = new Date;
105592
- const target = new Date(nextRunAt);
105593
- const { date: date2, time } = formatDeferralDateTime(target, now, tz);
105587
+ function renderWaitingOn(agentNames, watchedCount) {
105588
+ const named = joinNames([...new Set(agentNames.filter((name) => name.trim()))]);
105589
+ if (named)
105590
+ return named;
105591
+ return `${watchedCount} task${watchedCount === 1 ? "" : "s"}`;
105592
+ }
105593
+ function renderWhen(nextRunAt, tz, isFallbackTz) {
105594
+ const { date: date2, time } = formatDeferralDateTime(new Date(nextRunAt), new Date, tz);
105594
105595
  const timeLabel = isFallbackTz ? `${time} UTC` : time;
105595
- const shortId = scheduleId.slice(0, 8);
105596
- const link = `[${shortId}](${getAppUrl()}/schedules/${scheduleId})`;
105597
- const shortDesc = renderShortDesc(note);
105598
- return `Deferred until ${date2} ${timeLabel} (${link}) -> ${shortDesc}`;
105596
+ const day = date2 === "today" || date2 === "tomorrow" ? date2 : `on ${date2}`;
105597
+ return `${day} at ${timeLabel}`;
105598
+ }
105599
+ function renderHumanFacingDeferral(nextRunAt, tz, isFallbackTz, waitingOn) {
105600
+ const when = renderWhen(nextRunAt, tz, isFallbackTz);
105601
+ return waitingOn ? `Waiting on ${waitingOn} — or ${when} at the latest` : `Checking back ${when}`;
105599
105602
  }
105600
105603
  var registerDeferTaskTool = (server) => {
105601
105604
  createToolRegistrar(server)("defer-task", {
@@ -105678,6 +105681,7 @@ var registerDeferTaskTool = (server) => {
105678
105681
  const { tz: requesterTz, isFallback: isFallbackTz } = await resolveRequesterTimezone(task.requestedByUserId);
105679
105682
  try {
105680
105683
  const committed = await getDbClient().transaction(async () => {
105684
+ const watchedAgentNames = [];
105681
105685
  for (const watchedId of watchedTaskIds) {
105682
105686
  if (watchedId === taskId)
105683
105687
  throw new DeferAbortedError("Cannot wake on the task being deferred.");
@@ -105686,6 +105690,9 @@ var registerDeferTaskTool = (server) => {
105686
105690
  throw new DeferAbortedError(`Watched task ${watchedId} not found.`);
105687
105691
  if (isTerminalTaskStatus(watched.status))
105688
105692
  throw new DeferAbortedError(`Watched task ${watchedId} is already ${watched.status}; read its result instead of deferring.`);
105693
+ const watchedAgent = watched.agentId ? await getAgentById(watched.agentId) : null;
105694
+ if (watchedAgent?.name)
105695
+ watchedAgentNames.push(watchedAgent.name);
105689
105696
  }
105690
105697
  const schedule = await createScheduledTask({
105691
105698
  name: `deferred-${taskId.slice(0, 8)}-${Date.now()}-${crypto.randomUUID()}`,
@@ -105699,6 +105706,8 @@ var registerDeferTaskTool = (server) => {
105699
105706
  taskType: "deferred",
105700
105707
  tags: ["deferred"],
105701
105708
  priority: task.priority,
105709
+ requestedDelayMs: delayMs,
105710
+ requestedRunAt: runAt,
105702
105711
  modelTier: task.modelTier,
105703
105712
  parentTaskId: taskId,
105704
105713
  createdBy
@@ -105717,9 +105726,10 @@ var registerDeferTaskTool = (server) => {
105717
105726
  const deferralDetails = `${summary}
105718
105727
 
105719
105728
  Deferred until ${nextRunAt} (schedule ${schedule.id}). Pending: ${note}${checksBlock}`;
105720
- const terminalOutput = task.outputSchema ? output : renderHumanFacingDeferral(note, nextRunAt, schedule.id, requesterTz, isFallbackTz);
105729
+ const terminalOutput = task.outputSchema ? output : renderHumanFacingDeferral(nextRunAt, requesterTz, isFallbackTz, wakeOn ? renderWaitingOn(watchedAgentNames, watchedTaskIds.length) : undefined);
105721
105730
  const completed = await completeTask(taskId, terminalOutput, {
105722
- addTags: ["deferred"]
105731
+ addTags: ["deferred"],
105732
+ deferredAt: new Date().toISOString()
105723
105733
  });
105724
105734
  if (!completed) {
105725
105735
  throw new DeferAbortedError(`Task ${taskId} reached a terminal state before this deferral committed.`);
@@ -106692,7 +106702,7 @@ var registerJoinSwarmTool = (server) => {
106692
106702
  const agentId = requestInfo.agentId ?? requestedId ?? "";
106693
106703
  try {
106694
106704
  const agent = await getDbClient().transaction(async () => {
106695
- const agents = await getAllAgents();
106705
+ const agents = await getAllAgents({ includeExtensions: true });
106696
106706
  const existingIdAgent = agents.find((agent3) => agent3.id === agentId);
106697
106707
  if (existingIdAgent) {
106698
106708
  throw new Error(`Agent with ID "${agentId}" already exists.`);
@@ -117063,7 +117073,7 @@ async function notifyAutomationPreflightFailure(preflight) {
117063
117073
  return;
117064
117074
  }
117065
117075
  try {
117066
- const { getSlackApp: getSlackApp2 } = await import("./app-03na2vwb.js");
117076
+ const { getSlackApp: getSlackApp2 } = await import("./app-zk1apkf6.js");
117067
117077
  const app = getSlackApp2();
117068
117078
  if (!app) {
117069
117079
  console.warn("[Automation Preflight] Slack not available, cannot send notification");
@@ -117806,7 +117816,23 @@ async function startWorkflowExecution(workflow, triggerData, registry, options =
117806
117816
  await walkGraph(workflow.definition, runId, ctx, entryNodes, registry, workflow.id, secretKeys, options);
117807
117817
  return runId;
117808
117818
  }
117819
+ var activeWalks = new Map;
117820
+ function isWorkflowRunActive(runId) {
117821
+ return activeWalks.has(runId);
117822
+ }
117809
117823
  async function walkGraph(def, runId, ctx, startNodes, registry, workflowId, secretKeys = new Set, options = {}) {
117824
+ activeWalks.set(runId, (activeWalks.get(runId) ?? 0) + 1);
117825
+ try {
117826
+ await walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId, secretKeys, options);
117827
+ } finally {
117828
+ const remaining = activeWalks.get(runId) - 1;
117829
+ if (remaining === 0)
117830
+ activeWalks.delete(runId);
117831
+ else
117832
+ activeWalks.set(runId, remaining);
117833
+ }
117834
+ }
117835
+ async function walkGraphOwned(def, runId, ctx, startNodes, registry, workflowId, secretKeys = new Set, options = {}) {
117810
117836
  if (!options.requestedByUserId) {
117811
117837
  options = {
117812
117838
  ...options,
@@ -119094,7 +119120,7 @@ async function recoverIncompleteRuns(registry) {
119094
119120
  recovered += await recoverApprovalWaitingRuns(registry);
119095
119121
  recovered += await recoverWaitStates(registry);
119096
119122
  if (recovered > 0) {
119097
- console.log(`[workflows] Recovered ${recovered} incomplete run(s) on startup`);
119123
+ console.log(`[workflows] Recovered ${recovered} incomplete run(s)`);
119098
119124
  }
119099
119125
  return recovered;
119100
119126
  }
@@ -119103,6 +119129,8 @@ async function recoverRunningRuns(registry) {
119103
119129
  let recovered = 0;
119104
119130
  for (const runId of runningRunIds) {
119105
119131
  try {
119132
+ if (isWorkflowRunActive(runId))
119133
+ continue;
119106
119134
  const run = await getWorkflowRun(runId);
119107
119135
  if (!run || run.status !== "running")
119108
119136
  continue;
@@ -119112,6 +119140,8 @@ async function recoverRunningRuns(registry) {
119112
119140
  const completedNodeIds = new Set(await getCompletedStepNodeIds(runId));
119113
119141
  const ctx = run.context ?? {};
119114
119142
  const readyNodes = findReadyNodes(workflow.definition, completedNodeIds);
119143
+ if (isWorkflowRunActive(runId))
119144
+ continue;
119115
119145
  if (readyNodes.length === 0) {
119116
119146
  await updateWorkflowRun(runId, {
119117
119147
  status: "completed",
@@ -120209,7 +120239,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
120209
120239
  }
120210
120240
  if (notification.channel === "slack") {
120211
120241
  try {
120212
- const { getSlackApp: getSlackApp2 } = await import("./app-03na2vwb.js");
120242
+ const { getSlackApp: getSlackApp2 } = await import("./app-zk1apkf6.js");
120213
120243
  const slackApp = getSlackApp2();
120214
120244
  if (!slackApp) {
120215
120245
  console.warn("[HITL] Slack not initialized — cannot send notification");
@@ -120329,7 +120359,7 @@ class NotifyExecutor extends BaseExecutor {
120329
120359
  }
120330
120360
  }
120331
120361
  case "slack": {
120332
- const { getSlackApp: getSlackApp2 } = await import("./app-03na2vwb.js");
120362
+ const { getSlackApp: getSlackApp2 } = await import("./app-zk1apkf6.js");
120333
120363
  const app = getSlackApp2();
120334
120364
  if (!app) {
120335
120365
  return {
@@ -121636,6 +121666,9 @@ var registerCreateScheduleTool = (server) => {
121636
121666
  if (!agent) {
121637
121667
  return toolErr(`Target agent not found: ${targetAgentId}`);
121638
121668
  }
121669
+ if (isExtensionAgent(agent)) {
121670
+ return toolErr(extensionAgentAssignmentError(agent));
121671
+ }
121639
121672
  }
121640
121673
  const resolvedTargetType = targetType ?? "agent-task";
121641
121674
  if (resolvedTargetType === "agent-task" && !taskTemplate) {
@@ -122174,6 +122207,9 @@ var registerPatchScheduleTool = (server) => {
122174
122207
  if (!agent) {
122175
122208
  return toolErr(`Target agent not found: ${targetAgentId}`);
122176
122209
  }
122210
+ if (isExtensionAgent(agent)) {
122211
+ return toolErr(extensionAgentAssignmentError(agent));
122212
+ }
122177
122213
  }
122178
122214
  if (newName && newName !== schedule.name) {
122179
122215
  const existing = await getScheduledTaskByName(newName);
@@ -122461,6 +122497,9 @@ var registerUpdateScheduleTool = (server) => {
122461
122497
  if (!agent) {
122462
122498
  return toolErr(`Target agent not found: ${targetAgentId}`);
122463
122499
  }
122500
+ if (isExtensionAgent(agent)) {
122501
+ return toolErr(extensionAgentAssignmentError(agent));
122502
+ }
122464
122503
  }
122465
122504
  if (newName && newName !== schedule.name) {
122466
122505
  const existing = await getScheduledTaskByName(newName);
@@ -123666,6 +123705,9 @@ async function sendTaskHandler(ctx, {
123666
123705
  message: `Agent with ID "${targetAgentId}" not found.`
123667
123706
  };
123668
123707
  }
123708
+ if (isExtensionAgent(agent)) {
123709
+ return { success: false, message: extensionAgentAssignmentError(agent) };
123710
+ }
123669
123711
  if (taskOptions.routingAffinity?.leadOnly && !agent.isLead) {
123670
123712
  return {
123671
123713
  success: false,
@@ -130261,7 +130303,7 @@ function extensionAgentName(name) {
130261
130303
  async function ensureExtensionAgent(name) {
130262
130304
  const agentName = extensionAgentName(name);
130263
130305
  return await getDbClient().transaction(async () => {
130264
- let agent = (await getAllAgents()).find((candidate) => candidate.name === agentName);
130306
+ let agent = (await getAllAgents({ includeExtensions: true })).find((candidate) => candidate.name === agentName);
130265
130307
  if (!agent) {
130266
130308
  agent = await createAgent({
130267
130309
  name: agentName,
@@ -130277,14 +130319,14 @@ async function ensureExtensionAgent(name) {
130277
130319
  await updateAgentMaxTasks(agent.id, 0);
130278
130320
  await updateAgentProfile(agent.id, {
130279
130321
  description: `System agent for extension ${name}`,
130280
- role: "extension",
130322
+ role: EXTENSION_AGENT_ROLE,
130281
130323
  capabilities: []
130282
- });
130324
+ }, undefined, { allowExtensionRole: true });
130283
130325
  return agent.id;
130284
130326
  });
130285
130327
  }
130286
130328
  async function deactivateExtensionAgent(name) {
130287
- const agent = (await getAllAgents()).find((candidate) => candidate.name === extensionAgentName(name));
130329
+ const agent = (await getAllAgents({ includeExtensions: true })).find((candidate) => candidate.name === extensionAgentName(name));
130288
130330
  if (agent && agent.status !== "offline")
130289
130331
  await updateAgentStatus(agent.id, "offline");
130290
130332
  }
@@ -2,16 +2,17 @@ import {
2
2
  init_resolver,
3
3
  init_session_templates,
4
4
  resolveTemplateAsync
5
- } from "./cli-z61ykvam.js";
5
+ } from "./cli-wg04s9kr.js";
6
6
 
7
7
  // src/prompts/steering-delivery.ts
8
8
  init_session_templates();
9
9
  init_resolver();
10
- async function renderSteeringDelivery(steeringMessageId, body) {
10
+ async function renderSteeringDelivery(steeringMessageId, body, sender = "Unknown sender") {
11
11
  try {
12
12
  const result = await resolveTemplateAsync("system.agent.steering.delivery", {
13
13
  steeringMessageId,
14
- body
14
+ body,
15
+ sender: sender.replace(/\s+/g, " ").trim()
15
16
  });
16
17
  return result.skipped || !result.text.trim() ? body : result.text;
17
18
  } catch {
@@ -10759,7 +10759,7 @@ function githubCopilotProvider() {
10759
10759
  }
10760
10760
 
10761
10761
  // node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.js
10762
- var googleGenerativeAIApi = () => lazyApi(() => import("./google-generative-ai-xtw7tggr.js"));
10762
+ var googleGenerativeAIApi = () => lazyApi(() => import("./google-generative-ai-gwwrnzqn.js"));
10763
10763
 
10764
10764
  // node_modules/@earendil-works/pi-ai/dist/providers/google.js
10765
10765
  function googleProvider() {
@@ -10774,7 +10774,7 @@ function googleProvider() {
10774
10774
  }
10775
10775
 
10776
10776
  // node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.js
10777
- var googleVertexApi = () => lazyApi(() => import("./google-vertex-zdqpms6n.js"));
10777
+ var googleVertexApi = () => lazyApi(() => import("./google-vertex-5wfawpwz.js"));
10778
10778
 
10779
10779
  // node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js
10780
10780
  var VERTEX_ADC_PATH = "~/.config/gcloud/application_default_credentials.json";