cli-jaw 2.17.44 → 2.17.45

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 (219) hide show
  1. package/README.ja.md +5 -7
  2. package/README.ko.md +5 -7
  3. package/README.md +19 -7
  4. package/README.zh-CN.md +5 -7
  5. package/dist/bin/commands/dispatch.js +93 -18
  6. package/dist/bin/commands/dispatch.js.map +1 -1
  7. package/dist/bin/commands/doctor.js +0 -70
  8. package/dist/bin/commands/doctor.js.map +1 -1
  9. package/dist/bin/commands/provider.js +16 -28
  10. package/dist/bin/commands/provider.js.map +1 -1
  11. package/dist/bin/commands/slack.js +65 -2
  12. package/dist/bin/commands/slack.js.map +1 -1
  13. package/dist/bin/commands/tui/slash-command-runner.js +1 -1
  14. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  15. package/dist/bin/commands/tui/types.js +0 -4
  16. package/dist/bin/commands/tui/types.js.map +1 -1
  17. package/dist/scripts/fresh-install-smoke.js +1 -1
  18. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  19. package/dist/server.js +5 -3
  20. package/dist/server.js.map +1 -1
  21. package/dist/src/agent/args.js +1 -176
  22. package/dist/src/agent/args.js.map +1 -1
  23. package/dist/src/agent/claude-runtime-pool.js +11 -7
  24. package/dist/src/agent/claude-runtime-pool.js.map +1 -1
  25. package/dist/src/agent/cli-helpers.js +1 -3
  26. package/dist/src/agent/cli-helpers.js.map +1 -1
  27. package/dist/src/agent/error-classifier.js +1 -1
  28. package/dist/src/agent/error-classifier.js.map +1 -1
  29. package/dist/src/agent/error-cooldown.js +1 -3
  30. package/dist/src/agent/error-cooldown.js.map +1 -1
  31. package/dist/src/agent/events/claude.js +4 -56
  32. package/dist/src/agent/events/claude.js.map +1 -1
  33. package/dist/src/agent/events/helpers.js +3 -5
  34. package/dist/src/agent/events/helpers.js.map +1 -1
  35. package/dist/src/agent/events/index.js +12 -18
  36. package/dist/src/agent/events/index.js.map +1 -1
  37. package/dist/src/agent/kiro-runtime.js +3 -16
  38. package/dist/src/agent/kiro-runtime.js.map +1 -1
  39. package/dist/src/agent/lifecycle-handler.js +17 -12
  40. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  41. package/dist/src/agent/native-runtime-run.js +7 -2
  42. package/dist/src/agent/native-runtime-run.js.map +1 -1
  43. package/dist/src/agent/prompt-context.js +4 -5
  44. package/dist/src/agent/prompt-context.js.map +1 -1
  45. package/dist/src/agent/resume-classifier.js +0 -5
  46. package/dist/src/agent/resume-classifier.js.map +1 -1
  47. package/dist/src/agent/runtime/acp/cursor-session.js +21 -3
  48. package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -1
  49. package/dist/src/agent/runtime-pool.js +127 -51
  50. package/dist/src/agent/runtime-pool.js.map +1 -1
  51. package/dist/src/agent/session-persistence.js +1 -6
  52. package/dist/src/agent/session-persistence.js.map +1 -1
  53. package/dist/src/agent/spawn/resume.js +3 -3
  54. package/dist/src/agent/spawn/resume.js.map +1 -1
  55. package/dist/src/agent/spawn.js +27 -96
  56. package/dist/src/agent/spawn.js.map +1 -1
  57. package/dist/src/cli/claude-models.js +1 -1
  58. package/dist/src/cli/claude-models.js.map +1 -1
  59. package/dist/src/cli/cli-status-worker.js +1 -8
  60. package/dist/src/cli/cli-status-worker.js.map +1 -1
  61. package/dist/src/cli/compact.js +2 -6
  62. package/dist/src/cli/compact.js.map +1 -1
  63. package/dist/src/cli/employee-handler.js +4 -0
  64. package/dist/src/cli/employee-handler.js.map +1 -1
  65. package/dist/src/cli/handlers-completions.js +1 -1
  66. package/dist/src/cli/handlers-completions.js.map +1 -1
  67. package/dist/src/cli/handlers-runtime.js +18 -8
  68. package/dist/src/cli/handlers-runtime.js.map +1 -1
  69. package/dist/src/cli/handlers.js +3 -31
  70. package/dist/src/cli/handlers.js.map +1 -1
  71. package/dist/src/cli/opencodex-models.js +0 -5
  72. package/dist/src/cli/opencodex-models.js.map +1 -1
  73. package/dist/src/cli/readiness.js +1 -20
  74. package/dist/src/cli/readiness.js.map +1 -1
  75. package/dist/src/cli/registry-live.js +1 -51
  76. package/dist/src/cli/registry-live.js.map +1 -1
  77. package/dist/src/cli/registry.js +0 -64
  78. package/dist/src/cli/registry.js.map +1 -1
  79. package/dist/src/core/chat-sessions.js +3 -2
  80. package/dist/src/core/chat-sessions.js.map +1 -1
  81. package/dist/src/core/cli-detection.js +2 -178
  82. package/dist/src/core/cli-detection.js.map +1 -1
  83. package/dist/src/core/compact.js +2 -4
  84. package/dist/src/core/compact.js.map +1 -1
  85. package/dist/src/core/config.js +5 -4
  86. package/dist/src/core/config.js.map +1 -1
  87. package/dist/src/core/runtime-settings.js +5 -20
  88. package/dist/src/core/runtime-settings.js.map +1 -1
  89. package/dist/src/core/session-ops.js +4 -6
  90. package/dist/src/core/session-ops.js.map +1 -1
  91. package/dist/src/core/windows-launch-spec.js +1 -1
  92. package/dist/src/http/full-access.js +42 -0
  93. package/dist/src/http/full-access.js.map +1 -0
  94. package/dist/src/manager/proxy.js +1 -0
  95. package/dist/src/manager/proxy.js.map +1 -1
  96. package/dist/src/messaging/send.js +30 -8
  97. package/dist/src/messaging/send.js.map +1 -1
  98. package/dist/src/orchestrator/dispatch-admission.js +424 -0
  99. package/dist/src/orchestrator/dispatch-admission.js.map +1 -0
  100. package/dist/src/orchestrator/distribute.js +63 -21
  101. package/dist/src/orchestrator/distribute.js.map +1 -1
  102. package/dist/src/orchestrator/gateway.js +6 -4
  103. package/dist/src/orchestrator/gateway.js.map +1 -1
  104. package/dist/src/orchestrator/worker-registry.js +8 -1
  105. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  106. package/dist/src/prompt/builder.js +40 -16
  107. package/dist/src/prompt/builder.js.map +1 -1
  108. package/dist/src/prompt/templates/employee.md +4 -4
  109. package/dist/src/routes/messaging.js +34 -18
  110. package/dist/src/routes/messaging.js.map +1 -1
  111. package/dist/src/routes/orchestrate.js +139 -64
  112. package/dist/src/routes/orchestrate.js.map +1 -1
  113. package/dist/src/routes/settings.js +1 -30
  114. package/dist/src/routes/settings.js.map +1 -1
  115. package/dist/src/routes/slack-tools.js +6 -4
  116. package/dist/src/routes/slack-tools.js.map +1 -1
  117. package/dist/src/security/path-guards.js +15 -1
  118. package/dist/src/security/path-guards.js.map +1 -1
  119. package/dist/src/slack/search-quote.js +9 -5
  120. package/dist/src/slack/search-quote.js.map +1 -1
  121. package/dist/src/slack/send-handler.js +1 -25
  122. package/dist/src/slack/send-handler.js.map +1 -1
  123. package/dist/src/slack/slack-file.js +105 -53
  124. package/dist/src/slack/slack-file.js.map +1 -1
  125. package/dist/src/slack/tool-access.js +10 -2
  126. package/dist/src/slack/tool-access.js.map +1 -1
  127. package/dist/src/slack/tool-capabilities.js +16 -8
  128. package/dist/src/slack/tool-capabilities.js.map +1 -1
  129. package/dist/src/types/cli-engine.js +26 -3
  130. package/dist/src/types/cli-engine.js.map +1 -1
  131. package/dist/src/types/cli-events.js +1 -1
  132. package/dist/src/types/cli-events.js.map +1 -1
  133. package/dist/src/workflows/employee-boundary.js +9 -5
  134. package/dist/src/workflows/employee-boundary.js.map +1 -1
  135. package/dist/src/workflows/scope-sandbox.js +5 -2
  136. package/dist/src/workflows/scope-sandbox.js.map +1 -1
  137. package/package.json +2 -6
  138. package/public/dist/.vite/manifest.json +115 -115
  139. package/public/dist/assets/Agent-CKX93LQ8.js +1 -0
  140. package/public/dist/assets/Employees-BuFw6-fT.js +1 -0
  141. package/public/dist/assets/Heartbeat-BmkZshEU.js +1 -0
  142. package/public/dist/assets/Memory-DsK_yOCW.js +1 -0
  143. package/public/dist/assets/ModelProvider-L_hW6YWJ.js +1 -0
  144. package/public/dist/assets/agent-meta-CkRJlOmN.js +1 -0
  145. package/public/dist/assets/{app-9OQNfmqw.js → app-B_JTnXIY.js} +4 -4
  146. package/public/dist/assets/{bgtask-badge-BvxHqMGi.js → bgtask-badge-BLdI7Ara.js} +1 -1
  147. package/public/dist/assets/bgtask-badge-DOhTsE9l.js +1 -0
  148. package/public/dist/assets/cli-engine-NdU0lzs_.js +1 -0
  149. package/public/dist/assets/constants-DmRtjRj3.js +1 -0
  150. package/public/dist/assets/{employees-CkUqN4oh.js → employees-DGoVBWQd.js} +1 -1
  151. package/public/dist/assets/iframe-renderer-Dw5vTqFX.js +1 -0
  152. package/public/dist/assets/{iframe-renderer-C2gchtOj.js → iframe-renderer-mBjdW5ZV.js} +2 -2
  153. package/public/dist/assets/{manager-rb5X-4DJ.js → manager-iX7KosWI.js} +1 -1
  154. package/public/dist/assets/memory-DuHc2no-.js +1 -0
  155. package/public/dist/assets/{memory-BiWzpoBq.js → memory-Hq9y-GQB.js} +1 -1
  156. package/public/dist/assets/message-history-DT0VaJRd.js +1 -0
  157. package/public/dist/assets/{message-history-CuFefS02.js → message-history-H7G4apTo.js} +1 -1
  158. package/public/dist/assets/{provider-icons-Det0fC-4.js → provider-icons-Bge6teOj.js} +1 -1
  159. package/public/dist/assets/{render-DUGqq9Mu.js → render-OT0puqo3.js} +1 -1
  160. package/public/dist/assets/settings-BW8q_Rnq.js +1 -0
  161. package/public/dist/assets/{settings-DQ1fLygB.js → settings-DjCtFSpd.js} +3 -3
  162. package/public/dist/assets/{settings-BqUHavbH.js → settings-KIPNUOIV.js} +1 -1
  163. package/public/dist/assets/settings-core-CVO3_bn9.js +1 -0
  164. package/public/dist/assets/settings-core-DiStY7KC.js +2 -0
  165. package/public/dist/assets/{settings-embedding-BAKFrVLV.js → settings-embedding-DIqST-91.js} +1 -1
  166. package/public/dist/assets/{sidebar-CvGbp9x5.js → sidebar-DiS6dGEP.js} +3 -3
  167. package/public/dist/assets/{skills-abLMqY5_.js → skills-D_mbeyb3.js} +1 -1
  168. package/public/dist/assets/skills-NzM-geDj.js +1 -0
  169. package/public/dist/assets/slash-commands-DUk5bLQ1.js +1 -0
  170. package/public/dist/assets/{slash-commands-D8o9pqOS.js → slash-commands-PWDX9hXL.js} +1 -1
  171. package/public/dist/assets/{trace-drawer-C6RvkUAd.js → trace-drawer-DSn3xg8f.js} +1 -1
  172. package/public/dist/assets/{ui-Bxapl_Eu.js → ui-Dzebjyzl.js} +1 -1
  173. package/public/dist/assets/ui-TcZtZTFR.js +1 -0
  174. package/public/dist/index.html +1 -3
  175. package/public/dist/manager/index.html +1 -1
  176. package/public/dist/settings/index.html +1 -1
  177. package/public/index.html +0 -2
  178. package/public/js/constants.ts +1 -46
  179. package/public/js/features/employees.ts +1 -1
  180. package/public/js/features/retired-runtime-option.ts +2 -2
  181. package/public/js/features/settings-channel.ts +4 -2
  182. package/public/js/features/settings-cli-status-render.ts +2 -2
  183. package/public/js/features/settings-cli-status.ts +0 -2
  184. package/public/js/provider-icons.ts +1 -3
  185. package/public/manager/src/settings/pages/Heartbeat.tsx +2 -2
  186. package/public/manager/src/settings/pages/Memory.tsx +2 -2
  187. package/public/manager/src/settings/pages/ModelProvider.tsx +7 -4
  188. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +2 -2
  189. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +2 -2
  190. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +2 -2
  191. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +4 -35
  192. package/public/manager/src/settings/pages/components/employees-helpers.ts +0 -2
  193. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +0 -2
  194. package/scripts/bundle-sidecar.sh +0 -24
  195. package/scripts/check-electron-sidecar-no-jwc.cjs +12 -4
  196. package/scripts/fresh-install-smoke.ts +1 -1
  197. package/scripts/install.sh +0 -5
  198. package/scripts/retired-runtime-package-smoke.mjs +2 -12
  199. package/scripts/verify-fresh-install.sh +0 -14
  200. package/dist/src/agent/claude-e-runtime.js +0 -44
  201. package/dist/src/agent/claude-e-runtime.js.map +0 -1
  202. package/public/dist/assets/Agent-CNad_A6t.js +0 -1
  203. package/public/dist/assets/Employees-B6uviPeN.js +0 -1
  204. package/public/dist/assets/Heartbeat-C3S3d8xW.js +0 -1
  205. package/public/dist/assets/Memory-BgeIbQSr.js +0 -1
  206. package/public/dist/assets/ModelProvider-AnxBVYws.js +0 -1
  207. package/public/dist/assets/agent-meta-BWHASq1a.js +0 -1
  208. package/public/dist/assets/bgtask-badge-DeSZJGNN.js +0 -1
  209. package/public/dist/assets/cli-engine-Bw0QTAVX.js +0 -1
  210. package/public/dist/assets/constants-D8XAqfHk.js +0 -1
  211. package/public/dist/assets/iframe-renderer-DfvACXIn.js +0 -1
  212. package/public/dist/assets/memory-Ckp1Eq5a.js +0 -1
  213. package/public/dist/assets/message-history-Bv0l_t7O.js +0 -1
  214. package/public/dist/assets/settings-C81Kf9uX.js +0 -1
  215. package/public/dist/assets/settings-core-CzdXfoOK.js +0 -2
  216. package/public/dist/assets/settings-core-DO_5M7Lv.js +0 -1
  217. package/public/dist/assets/skills-DFpPmMUR.js +0 -1
  218. package/public/dist/assets/slash-commands-BU58xYih.js +0 -1
  219. package/public/dist/assets/ui-CUB4iwz3.js +0 -1
@@ -18,7 +18,6 @@ import { publish as ssePublish } from '../core/event-bus.js';
18
18
  // exists precisely to guarantee the caller hears something.
19
19
  import { settleOnce } from '../orchestrator/request-registry.js';
20
20
  import { settings, UPLOADS_DIR, detectCli, getProjectDirs } from '../core/config.js';
21
- import { migrateLegacyClaudeValue } from '../cli/claude-models.js';
22
21
  import { stripUndefined } from '../core/strip-undefined.js';
23
22
  import { clearEmployeeSession, getSession, insertMessage, getRecentMessages, listQueuedMessages, insertQueuedMessage, deleteQueuedMessage, migrateQueuedMessagesV1ToV2, getSessionBucket, clearSessionBucket, setSessionBucketSnapshot, getMaxMessageId, getSteerSalvageAfter, } from '../core/db.js';
24
23
  import { buildTaskSnapshot } from '../memory/runtime.js';
@@ -66,8 +65,7 @@ import { clearNativeStartFailure, nativeStartFailure, recordNativeStartFailure }
66
65
  import { asCliEventRecord, discriminate, fieldString } from '../types/cli-events.js';
67
66
  import { isRemoteTarget } from '../messaging/types.js';
68
67
  import { buildRemoteBindingKey } from '../messaging/session-key.js';
69
- import { isJawRuntimeEvent, handleJawRuntimeEvent } from './claude-e-runtime.js';
70
- import { isRetiredCliSelection, RETIRED_RUNTIME_DIAGNOSTIC } from '../types/cli-engine.js';
68
+ import { isRetiredCliSelection, retiredRuntimeDiagnostic } from '../types/cli-engine.js';
71
69
  import { runBeforeSpawnChecks } from '../core/policy-hooks.js';
72
70
  import { appendTraceEvent, createTraceId, finalizeTraceRun, stampTraceTool, startTraceRun, updateTraceToolRow } from '../trace/store.js';
73
71
  import { AGY_COMPLETE_KILL_REASON, appendAgyFullText, classifyAgyTranscriptMode, describeAgyFinalSource, extractAgyConversationId, finalizeAgyFallbackText, AGY_PLANNER_ONLY_NOTICE, isAgyIntermediatePlannerText, formatAgyWatchdogContext, resolveAgyEmptyCloseError, formatAgyTimeoutMessage, getAgyQuietCompletionDelayMs, isAgyStaleSessionOutput, normalizeAgyCloseText, shouldFreezeAgyLiveDisplay, stripAgyPromptEchoPrefix, stripAgyResumeReplayPrefix, stripAgyResumeReplayPrefixes, } from './agy-runtime.js';
@@ -75,7 +73,7 @@ import { detectAgyCapabilities } from './agy-capabilities.js';
75
73
  import { buildAgyBootstrapEnvelope, resolveAgyPromptOrder, } from './agy-bootstrap.js';
76
74
  import { startAgyTranscriptWatcher } from './agy-transcript-watcher.js';
77
75
  import { appendAssistantRawText, appendAssistantTextSegment, emitAgentTool, normalizeAssistantDisplayText, pushTrace, streamJsonMarksProgress } from './events/helpers.js';
78
- import { captureKiroSessionIdAfterExit, finalizeKiroFullText, flushKiroStdoutContext, isKiroPlainTextCli, isKiroStaleSessionOutput, parseAiESessionIdFromStderr, processKiroStdoutChunk, spawnWithKiroSnapshot, } from './kiro-runtime.js';
76
+ import { captureKiroSessionIdAfterExit, finalizeKiroFullText, flushKiroStdoutContext, isKiroPlainTextCli, isKiroStaleSessionOutput, processKiroStdoutChunk, spawnWithKiroSnapshot, } from './kiro-runtime.js';
79
77
  import { resolveCursorModelVariant } from './cursor-runtime.js';
80
78
  import { normalizePiSettings, spawnPiRpc } from './pi-runtime.js';
81
79
  import * as piExecutionControls from './pi-runtime.js';
@@ -175,25 +173,6 @@ export function releaseMainRun(scopeKey, child, ownerGeneration) {
175
173
  activeMainProcesses.delete(scopeKey);
176
174
  return true;
177
175
  }
178
- export function buildAiERuntimeStatusMeta(cli, provider, model) {
179
- if (cli !== 'ai-e')
180
- return {};
181
- const mode = 'pty';
182
- return {
183
- selector: 'ai-e',
184
- provider,
185
- effectiveProvider: provider,
186
- model,
187
- mode,
188
- runtime: {
189
- cli,
190
- selector: 'ai-e',
191
- provider,
192
- model,
193
- mode,
194
- },
195
- };
196
- }
197
176
  import { hasChildExited, killProcessTree, killProcessTreeIfAlive, ownProcess } from './spawn/process-kill.js';
198
177
  import { releaseChildOutputAfterExit } from './spawn/exit-drain.js';
199
178
  import { clampPendingLine } from './spawn/line-buffer.js';
@@ -369,8 +348,6 @@ const killReasons = new Map();
369
348
  * case where the exit handler has not finished writing (#523). */
370
349
  const DEFAULT_STEER_WAIT_MS = 10_000;
371
350
  const DEFAULT_KILL_ESCALATION_MS = 2_000;
372
- const CLAUDE_E_STEER_WAIT_MS = 30_000;
373
- const CLAUDE_E_STEER_KILL_ESCALATION_MS = 8_000;
374
351
  const DEFAULT_CODEX_APP_TURN_IDLE_MS = 300_000;
375
352
  const DEFAULT_CODEX_APP_TURN_ABS_MS = 2 * 60 * 60_000;
376
353
  const DEFAULT_CODEX_APP_ACQUIRE_WAIT_MS = 60_000;
@@ -383,18 +360,11 @@ function getActiveMainCli(scopeKey) {
383
360
  const cli = activeMainProcesses.get(scopeKey)?.meta.cli;
384
361
  return typeof cli === 'string' ? cli : null;
385
362
  }
386
- function isActiveAiEPtyRuntime(scopeKey) {
387
- const cli = getActiveMainCli(scopeKey);
388
- return cli === 'claude-e' || cli === 'ai-e';
389
- }
390
- function getKillPolicy(scopeKey, reason) {
391
- if (reason === 'steer' && isActiveAiEPtyRuntime(scopeKey)) {
392
- return { signal: 'SIGINT', escalationMs: CLAUDE_E_STEER_KILL_ESCALATION_MS };
393
- }
363
+ function getKillPolicy(_scopeKey, _reason) {
394
364
  return { signal: 'SIGTERM', escalationMs: DEFAULT_KILL_ESCALATION_MS };
395
365
  }
396
- export function getSteerWaitMsForActiveAgent(scopeKey = 'default') {
397
- return isActiveAiEPtyRuntime(scopeKey) ? CLAUDE_E_STEER_WAIT_MS : DEFAULT_STEER_WAIT_MS;
366
+ export function getSteerWaitMsForActiveAgent(_scopeKey = 'default') {
367
+ return DEFAULT_STEER_WAIT_MS;
398
368
  }
399
369
  /** Get kill reason for a process (by PID), consuming it */
400
370
  function consumeKillReason(pid) {
@@ -652,8 +622,9 @@ export async function steerAgent(scopeKey, newPrompt, source, meta) {
652
622
  const chatSessionId = meta?.chatSessionId || run?.meta.chatSessionId || getActiveChatSession();
653
623
  // This is admission for NEW input, not the already admitted run's selection.
654
624
  // A watched settings change must not inject into or stop that run's lease.
655
- if (isRetiredCliSelection(resolveMainCli(meta?.cli, settings, getSession()))) {
656
- settleOnce(meta?.requestId, 'failed', { error: RETIRED_RUNTIME_DIAGNOSTIC,
625
+ const steerCli = resolveMainCli(meta?.cli, settings, getSession());
626
+ if (isRetiredCliSelection(steerCli)) {
627
+ settleOnce(meta?.requestId, 'failed', { error: retiredRuntimeDiagnostic(steerCli),
657
628
  scope: scopeKey, sessionId: chatSessionId });
658
629
  return 'retired';
659
630
  }
@@ -941,8 +912,8 @@ function getRecentAssistantContentsForAgyResume(workingDir, chatSessionId) {
941
912
  .filter((msg) => msg.role === 'assistant' && typeof msg.content === 'string' && msg.content.trim().length > 0)
942
913
  .map((msg) => String(msg.content || '').trim());
943
914
  }
944
- import { buildArgs, buildResumeArgs, formatAgyPrintTimeout, resolveAiEProvider, resolveScopedSessionBucket, resolveSessionBucket } from './args.js';
945
- export { buildArgs, buildResumeArgs, resolveAiEProvider, resolveSessionBucket };
915
+ import { buildArgs, buildResumeArgs, formatAgyPrintTimeout, resolveScopedSessionBucket, resolveSessionBucket } from './args.js';
916
+ export { buildArgs, buildResumeArgs, resolveSessionBucket };
946
917
  const warnedAgyCapabilityFallbacks = new Set();
947
918
  // ─── Upload wrapper ──────────────────────────────────
948
919
  export const saveUpload = (buffer, originalName, options) => _saveUpload(UPLOADS_DIR, Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer), originalName, options);
@@ -1046,10 +1017,11 @@ export function spawnAgent(prompt, opts = {}) {
1046
1017
  if (mainRun)
1047
1018
  mainRun.meta.cli = cli;
1048
1019
  if (isRetiredCliSelection(cli)) {
1049
- const message = `${RETIRED_RUNTIME_DIAGNOSTIC}: Select an available runtime before sending another request.`;
1020
+ const diagnostic = retiredRuntimeDiagnostic(cli);
1021
+ const message = `${diagnostic}: Select an available runtime before sending another request.`;
1050
1022
  const released = mainManaged && activeMainProcesses.get(scopeKey) === mainRun
1051
1023
  && releaseMainRun(scopeKey, null, ownerGeneration);
1052
- settleOnce(opts.requestId, 'failed', { error: RETIRED_RUNTIME_DIAGNOSTIC, text: message,
1024
+ settleOnce(opts.requestId, 'failed', { error: diagnostic, text: message,
1053
1025
  scope: scopeKey, sessionId: chatSessionId });
1054
1026
  broadcast('agent_done', {
1055
1027
  text: message, error: true, origin, cli, scope: scopeKey, sessionId: chatSessionId,
@@ -1072,7 +1044,10 @@ export function spawnAgent(prompt, opts = {}) {
1072
1044
  // saved-session reads, bootstrap consumption, or worker isolation.
1073
1045
  const runtimeTransport = isSwitchableNativeCli(cli)
1074
1046
  ? resolveRuntimeTransport(settings['perCli']?.[cli]?.transport) : 'print';
1075
- const permissions = opts.permissions || settings['permissions'] || session.permissions || 'auto';
1047
+ const selectedPermissions = opts.permissions || settings['permissions'] || session.permissions || 'auto';
1048
+ const permissions = Array.isArray(selectedPermissions) ? [...selectedPermissions] : selectedPermissions;
1049
+ const capturedPermissions = typeof permissions === 'string'
1050
+ || (Array.isArray(permissions) && permissions.every(value => typeof value === 'string')) ? permissions : undefined;
1076
1051
  const unavailableNative = runtimeTransport === 'native'
1077
1052
  && (!isNativeAdapterImplemented(cli) || (isEmployee && !isNativeWorkerImplemented(cli)));
1078
1053
  const restrictiveNative = runtimeTransport === 'native' && (cli === 'cursor' || cli === 'grok') && permissions !== 'auto';
@@ -1116,6 +1091,7 @@ export function spawnAgent(prompt, opts = {}) {
1116
1091
  setCurrentMainMeta(scopeKey, stripUndefined({
1117
1092
  origin,
1118
1093
  cli,
1094
+ permissions: capturedPermissions,
1119
1095
  target: opts.target,
1120
1096
  chatId: opts.chatId,
1121
1097
  requestId: opts.requestId,
@@ -1133,7 +1109,7 @@ export function spawnAgent(prompt, opts = {}) {
1133
1109
  const st = queueCtrl.fallbackStateForScope(scopeKey).get(cli);
1134
1110
  if (st?.fallbackCli && st.retriesLeft <= 0) {
1135
1111
  const fbAvail = detectCli(st.fallbackCli)?.available;
1136
- if (fbAvail) {
1112
+ if (fbAvail && !isRetiredCliSelection(st.fallbackCli)) {
1137
1113
  console.log(`[jaw:fallback] ${cli} retries exhausted → direct ${st.fallbackCli}`);
1138
1114
  broadcast('agent_fallback', { from: cli, to: st.fallbackCli, reason: 'retries exhausted', ...empTag }, isEmployee ? 'internal' : 'public');
1139
1115
  return spawnAgent(prompt, {
@@ -1149,16 +1125,8 @@ export function spawnAgent(prompt, opts = {}) {
1149
1125
  const ao = settings["activeOverrides"]?.[cli] || {};
1150
1126
  const requestedModel = opts.model || ao.model || cfg.model || 'default';
1151
1127
  const effort = opts.effort ?? ao.effort ?? cfg.effort ?? '';
1152
- const effectiveProvider = cli === 'ai-e'
1153
- ? resolveAiEProvider(typeof cfg.provider === 'string'
1154
- ? cfg.provider
1155
- : typeof ao.provider === 'string'
1156
- ? ao.provider
1157
- : undefined, requestedModel)
1158
- : cli;
1159
- const model = cli === 'ai-e' && effectiveProvider === 'claude'
1160
- ? migrateLegacyClaudeValue(requestedModel)
1161
- : requestedModel;
1128
+ const effectiveProvider = cli;
1129
+ const model = requestedModel;
1162
1130
  const runtimeModel = cli === 'cursor' && runtimeTransport !== 'native' ? resolveCursorModelVariant(model, effort)
1163
1131
  : cli === 'grok' && runtimeTransport === 'native' && model === 'default' ? 'grok-build' : model;
1164
1132
  const codexMultiplexMain = cli === 'codex-app' && mainManaged && !opts.agentId
@@ -1166,6 +1134,7 @@ export function spawnAgent(prompt, opts = {}) {
1166
1134
  if (mainManaged) {
1167
1135
  setCurrentMainMeta(scopeKey, stripUndefined({
1168
1136
  origin,
1137
+ permissions: capturedPermissions,
1169
1138
  target: opts.target,
1170
1139
  chatId: opts.chatId,
1171
1140
  requestId: opts.requestId,
@@ -1194,7 +1163,7 @@ export function spawnAgent(prompt, opts = {}) {
1194
1163
  // than either. The default scope keeps the bare bucket name, so a session that existed
1195
1164
  // before this change continues the conversation it was already in.
1196
1165
  const currentBucket = runtimeSessionBucket(resolveScopedSessionBucket(cli, runtimeModel, effectiveProvider, scopeKey, effort, 'fallback', codexMultiplexMain), runtimeTransport);
1197
- const envDefaultsCli = cli === 'ai-e' ? effectiveProvider : cli;
1166
+ const envDefaultsCli = cli;
1198
1167
  const cliEnv = applyCliEnvDefaults(envDefaultsCli, opts.env);
1199
1168
  const spawnEnv = makeCleanEnv(cliEnv);
1200
1169
  const bucketRow = currentBucket ? getSessionBucket.get(currentBucket) : null;
@@ -1218,13 +1187,12 @@ export function spawnAgent(prompt, opts = {}) {
1218
1187
  // AGY native resume can replay prior stdout and continue stale mid-turn planner
1219
1188
  // state. cli-jaw defaults to DB history; guarded native resume is explicit opt-in.
1220
1189
  const providerSupportsResume = cli !== 'agy'
1221
- ? !(cli === 'ai-e' && effectiveProvider !== 'claude' && effectiveProvider !== 'kiro' && effectiveProvider !== 'codex' && effectiveProvider !== 'grok')
1190
+ ? true
1222
1191
  : agyResumeDecision.ok;
1223
1192
  const canResumeBucketSession = !bucketSessionId || shouldResumeBucketSession(cli, runtimeModel, bucketModel, resumeKey, bucketResumeKey, bucketUpdatedAt, Date.now(), effectiveProvider);
1224
1193
  const isResume = empSid
1225
1194
  ? true
1226
1195
  : (providerSupportsResume && !opts._skipResume && !forceNew && !!bucketSessionId && canResumeBucketSession);
1227
- const runtimeStatusMeta = buildAiERuntimeStatusMeta(cli, effectiveProvider, runtimeModel);
1228
1196
  // ─── Bootstrap compact 1-shot injection (Phase 52: bucket-aware) ───
1229
1197
  // Vendor-agnostic: compact handler reset session_id and stored bootstrap in DB.
1230
1198
  // Inject only on fresh main spawns (not employee/fallback/internal/resume).
@@ -1337,9 +1305,6 @@ export function spawnAgent(prompt, opts = {}) {
1337
1305
  const agyResumeReplayPrefixes = cli === 'agy' && isResume
1338
1306
  ? getRecentAssistantContentsForAgyResume(settings["workingDir"], chatSessionId)
1339
1307
  : [];
1340
- const claudeBin = (cli === 'claude-e' || (cli === 'ai-e' && effectiveProvider === 'claude'))
1341
- ? detectCli('claude').path
1342
- : null;
1343
1308
  const agyLogFile = cli === 'agy'
1344
1309
  ? join(os.tmpdir(), `jaw-agy-${agentId || 'main'}-${Date.now()}-${crypto.randomUUID()}.log`)
1345
1310
  : null;
@@ -1365,8 +1330,6 @@ export function spawnAgent(prompt, opts = {}) {
1365
1330
  sysPrompt,
1366
1331
  includeDirectories,
1367
1332
  workingDir: settings["workingDir"],
1368
- aiEProvider: effectiveProvider,
1369
- ...(claudeBin ? { claudeBin } : {}),
1370
1333
  ...(agyLogFile ? { agyLogFile } : {}),
1371
1334
  ...(agyPrintTimeout ? { agyPrintTimeout } : {}),
1372
1335
  ...(agyCapabilities ? { agyCapabilities } : {}),
@@ -1496,8 +1459,6 @@ export function spawnAgent(prompt, opts = {}) {
1496
1459
  }
1497
1460
  else {
1498
1461
  console.log(`[jaw:${agentLabel}] Spawning: ${cli} ${args.join(' ').slice(0, 120)}...`);
1499
- if (cli === 'claude-e')
1500
- console.log(`[jaw:${agentLabel}:args] ${JSON.stringify(args)}`);
1501
1462
  }
1502
1463
  // ─── Native Claude: provider adaptation uses the shared host/lifecycle. ───
1503
1464
  if (runtimeTransport === 'native' && cli === 'claude') {
@@ -3408,7 +3369,7 @@ export function spawnAgent(prompt, opts = {}) {
3408
3369
  else
3409
3370
  registerActiveProcess(agentLabel, child);
3410
3371
  if (!opts.internal)
3411
- broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...runtimeStatusMeta, ...empTag });
3372
+ broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...empTag });
3412
3373
  if (mainManaged && !opts.internal)
3413
3374
  beginLiveRun(liveScope, cli);
3414
3375
  // The turn settles on 'close', which waits for every stdio stream to close.
@@ -3471,9 +3432,6 @@ export function spawnAgent(prompt, opts = {}) {
3471
3432
  if (cli === 'claude') {
3472
3433
  child.stdin.write(withSteerContext(isResume ? prompt : withHistoryPrompt(prompt, historyBlock), opts.steerContext));
3473
3434
  }
3474
- else if (cli === 'claude-e' || (cli === 'ai-e' && effectiveProvider === 'claude')) {
3475
- child.stdin.write(withSteerContext(isResume ? prompt : withHistoryPrompt(prompt, historyBlock), opts.steerContext));
3476
- }
3477
3435
  else if (cli === 'codex' && !isResume) {
3478
3436
  const codexStdin = historyBlock
3479
3437
  ? `${historyBlock}\n\n[User Message]\n${prompt}`
@@ -3487,7 +3445,7 @@ export function spawnAgent(prompt, opts = {}) {
3487
3445
  }
3488
3446
  child.stdin.end();
3489
3447
  if (!opts.internal)
3490
- broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...runtimeStatusMeta, ...empTag }, traceAudience);
3448
+ broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...empTag }, traceAudience);
3491
3449
  const traceRunId = startTraceRun({ cli, model: runtimeModel, workingDir: settings["workingDir"] || null, agentLabel, audience: traceAudience, sessionId: chatSessionId, scopeKey });
3492
3450
  if (mainManaged && !opts.internal)
3493
3451
  setLiveRunTraceId(liveScope, traceRunId);
@@ -3652,26 +3610,7 @@ export function spawnAgent(prompt, opts = {}) {
3652
3610
  if (streamJsonMarksProgress(cli, ctx.effectiveProvider)) {
3653
3611
  ctx.stallWatchdog?.markProgress();
3654
3612
  }
3655
- // claude-e / ai-e Claude: intercept jaw_runtime events BEFORE discriminator
3656
- if ((cli === 'claude-e' || cli === 'ai-e') && isJawRuntimeEvent(raw)) {
3657
- const rtEvt = raw;
3658
- handleJawRuntimeEvent(rtEvt, agentLabel);
3659
- // Extract sessionId from session_started or interrupted
3660
- const evtName = rtEvt['event'];
3661
- if ((evtName === 'session_started' || evtName === 'interrupted') && typeof rtEvt['sessionId'] === 'string') {
3662
- ctx.sessionId = rtEvt['sessionId'];
3663
- }
3664
- if (evtName === 'error' && typeof rtEvt['message'] === 'string') {
3665
- const message = `[jaw:${cli}:error] ${rtEvt['message']}`;
3666
- if (ctx.stderrBuf.length < 4000)
3667
- ctx.stderrBuf = ctx.stderrBuf ? `${ctx.stderrBuf}\n${message}` : message;
3668
- pushTrace(ctx, message);
3669
- }
3670
- return;
3671
- }
3672
- const dispatchCli = cli === 'ai-e'
3673
- ? (ctx.effectiveProvider === 'claude' ? 'claude-e' : (ctx.effectiveProvider || 'ai-e'))
3674
- : cli;
3613
+ const dispatchCli = cli;
3675
3614
  const event = discriminate(dispatchCli, raw);
3676
3615
  if (!event) {
3677
3616
  const type = fieldString(asCliEventRecord(raw).type, '<no-type>');
@@ -3969,14 +3908,6 @@ export function spawnAgent(prompt, opts = {}) {
3969
3908
  else if (parsed)
3970
3909
  ctx.fullText = parsed;
3971
3910
  }
3972
- // ai-e codex/grok: capture session ID from stderr footer
3973
- if (cli === 'ai-e' && !kiroPlainText && effectiveProvider !== 'claude' && !ctx.sessionId) {
3974
- const fromStderr = parseAiESessionIdFromStderr(ctx.stderrBuf);
3975
- if (fromStderr) {
3976
- ctx.sessionId = fromStderr;
3977
- console.log(`[jaw:ai-e:${effectiveProvider}] session capture id=${fromStderr.slice(0, 16)}...`);
3978
- }
3979
- }
3980
3911
  let agyCloseTimedOut = false;
3981
3912
  let agyTimeoutMessage = '';
3982
3913
  if (cli === 'agy') {