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.
- package/README.ja.md +5 -7
- package/README.ko.md +5 -7
- package/README.md +19 -7
- package/README.zh-CN.md +5 -7
- package/dist/bin/commands/dispatch.js +93 -18
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +0 -70
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/provider.js +16 -28
- package/dist/bin/commands/provider.js.map +1 -1
- package/dist/bin/commands/slack.js +65 -2
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/bin/commands/tui/slash-command-runner.js +1 -1
- package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
- package/dist/bin/commands/tui/types.js +0 -4
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +1 -1
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/server.js +5 -3
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +1 -176
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/claude-runtime-pool.js +11 -7
- package/dist/src/agent/claude-runtime-pool.js.map +1 -1
- package/dist/src/agent/cli-helpers.js +1 -3
- package/dist/src/agent/cli-helpers.js.map +1 -1
- package/dist/src/agent/error-classifier.js +1 -1
- package/dist/src/agent/error-classifier.js.map +1 -1
- package/dist/src/agent/error-cooldown.js +1 -3
- package/dist/src/agent/error-cooldown.js.map +1 -1
- package/dist/src/agent/events/claude.js +4 -56
- package/dist/src/agent/events/claude.js.map +1 -1
- package/dist/src/agent/events/helpers.js +3 -5
- package/dist/src/agent/events/helpers.js.map +1 -1
- package/dist/src/agent/events/index.js +12 -18
- package/dist/src/agent/events/index.js.map +1 -1
- package/dist/src/agent/kiro-runtime.js +3 -16
- package/dist/src/agent/kiro-runtime.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +17 -12
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/native-runtime-run.js +7 -2
- package/dist/src/agent/native-runtime-run.js.map +1 -1
- package/dist/src/agent/prompt-context.js +4 -5
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/resume-classifier.js +0 -5
- package/dist/src/agent/resume-classifier.js.map +1 -1
- package/dist/src/agent/runtime/acp/cursor-session.js +21 -3
- package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -1
- package/dist/src/agent/runtime-pool.js +127 -51
- package/dist/src/agent/runtime-pool.js.map +1 -1
- package/dist/src/agent/session-persistence.js +1 -6
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +3 -3
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn.js +27 -96
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/claude-models.js +1 -1
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +1 -8
- package/dist/src/cli/cli-status-worker.js.map +1 -1
- package/dist/src/cli/compact.js +2 -6
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/employee-handler.js +4 -0
- package/dist/src/cli/employee-handler.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +1 -1
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +18 -8
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers.js +3 -31
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/opencodex-models.js +0 -5
- package/dist/src/cli/opencodex-models.js.map +1 -1
- package/dist/src/cli/readiness.js +1 -20
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +1 -51
- package/dist/src/cli/registry-live.js.map +1 -1
- package/dist/src/cli/registry.js +0 -64
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/chat-sessions.js +3 -2
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/cli-detection.js +2 -178
- package/dist/src/core/cli-detection.js.map +1 -1
- package/dist/src/core/compact.js +2 -4
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +5 -4
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +5 -20
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/session-ops.js +4 -6
- package/dist/src/core/session-ops.js.map +1 -1
- package/dist/src/core/windows-launch-spec.js +1 -1
- package/dist/src/http/full-access.js +42 -0
- package/dist/src/http/full-access.js.map +1 -0
- package/dist/src/manager/proxy.js +1 -0
- package/dist/src/manager/proxy.js.map +1 -1
- package/dist/src/messaging/send.js +30 -8
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/dispatch-admission.js +424 -0
- package/dist/src/orchestrator/dispatch-admission.js.map +1 -0
- package/dist/src/orchestrator/distribute.js +63 -21
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +6 -4
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +8 -1
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +40 -16
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/employee.md +4 -4
- package/dist/src/routes/messaging.js +34 -18
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +139 -64
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +1 -30
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/slack-tools.js +6 -4
- package/dist/src/routes/slack-tools.js.map +1 -1
- package/dist/src/security/path-guards.js +15 -1
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/slack/search-quote.js +9 -5
- package/dist/src/slack/search-quote.js.map +1 -1
- package/dist/src/slack/send-handler.js +1 -25
- package/dist/src/slack/send-handler.js.map +1 -1
- package/dist/src/slack/slack-file.js +105 -53
- package/dist/src/slack/slack-file.js.map +1 -1
- package/dist/src/slack/tool-access.js +10 -2
- package/dist/src/slack/tool-access.js.map +1 -1
- package/dist/src/slack/tool-capabilities.js +16 -8
- package/dist/src/slack/tool-capabilities.js.map +1 -1
- package/dist/src/types/cli-engine.js +26 -3
- package/dist/src/types/cli-engine.js.map +1 -1
- package/dist/src/types/cli-events.js +1 -1
- package/dist/src/types/cli-events.js.map +1 -1
- package/dist/src/workflows/employee-boundary.js +9 -5
- package/dist/src/workflows/employee-boundary.js.map +1 -1
- package/dist/src/workflows/scope-sandbox.js +5 -2
- package/dist/src/workflows/scope-sandbox.js.map +1 -1
- package/package.json +2 -6
- package/public/dist/.vite/manifest.json +115 -115
- package/public/dist/assets/Agent-CKX93LQ8.js +1 -0
- package/public/dist/assets/Employees-BuFw6-fT.js +1 -0
- package/public/dist/assets/Heartbeat-BmkZshEU.js +1 -0
- package/public/dist/assets/Memory-DsK_yOCW.js +1 -0
- package/public/dist/assets/ModelProvider-L_hW6YWJ.js +1 -0
- package/public/dist/assets/agent-meta-CkRJlOmN.js +1 -0
- package/public/dist/assets/{app-9OQNfmqw.js → app-B_JTnXIY.js} +4 -4
- package/public/dist/assets/{bgtask-badge-BvxHqMGi.js → bgtask-badge-BLdI7Ara.js} +1 -1
- package/public/dist/assets/bgtask-badge-DOhTsE9l.js +1 -0
- package/public/dist/assets/cli-engine-NdU0lzs_.js +1 -0
- package/public/dist/assets/constants-DmRtjRj3.js +1 -0
- package/public/dist/assets/{employees-CkUqN4oh.js → employees-DGoVBWQd.js} +1 -1
- package/public/dist/assets/iframe-renderer-Dw5vTqFX.js +1 -0
- package/public/dist/assets/{iframe-renderer-C2gchtOj.js → iframe-renderer-mBjdW5ZV.js} +2 -2
- package/public/dist/assets/{manager-rb5X-4DJ.js → manager-iX7KosWI.js} +1 -1
- package/public/dist/assets/memory-DuHc2no-.js +1 -0
- package/public/dist/assets/{memory-BiWzpoBq.js → memory-Hq9y-GQB.js} +1 -1
- package/public/dist/assets/message-history-DT0VaJRd.js +1 -0
- package/public/dist/assets/{message-history-CuFefS02.js → message-history-H7G4apTo.js} +1 -1
- package/public/dist/assets/{provider-icons-Det0fC-4.js → provider-icons-Bge6teOj.js} +1 -1
- package/public/dist/assets/{render-DUGqq9Mu.js → render-OT0puqo3.js} +1 -1
- package/public/dist/assets/settings-BW8q_Rnq.js +1 -0
- package/public/dist/assets/{settings-DQ1fLygB.js → settings-DjCtFSpd.js} +3 -3
- package/public/dist/assets/{settings-BqUHavbH.js → settings-KIPNUOIV.js} +1 -1
- package/public/dist/assets/settings-core-CVO3_bn9.js +1 -0
- package/public/dist/assets/settings-core-DiStY7KC.js +2 -0
- package/public/dist/assets/{settings-embedding-BAKFrVLV.js → settings-embedding-DIqST-91.js} +1 -1
- package/public/dist/assets/{sidebar-CvGbp9x5.js → sidebar-DiS6dGEP.js} +3 -3
- package/public/dist/assets/{skills-abLMqY5_.js → skills-D_mbeyb3.js} +1 -1
- package/public/dist/assets/skills-NzM-geDj.js +1 -0
- package/public/dist/assets/slash-commands-DUk5bLQ1.js +1 -0
- package/public/dist/assets/{slash-commands-D8o9pqOS.js → slash-commands-PWDX9hXL.js} +1 -1
- package/public/dist/assets/{trace-drawer-C6RvkUAd.js → trace-drawer-DSn3xg8f.js} +1 -1
- package/public/dist/assets/{ui-Bxapl_Eu.js → ui-Dzebjyzl.js} +1 -1
- package/public/dist/assets/ui-TcZtZTFR.js +1 -0
- package/public/dist/index.html +1 -3
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/index.html +0 -2
- package/public/js/constants.ts +1 -46
- package/public/js/features/employees.ts +1 -1
- package/public/js/features/retired-runtime-option.ts +2 -2
- package/public/js/features/settings-channel.ts +4 -2
- package/public/js/features/settings-cli-status-render.ts +2 -2
- package/public/js/features/settings-cli-status.ts +0 -2
- package/public/js/provider-icons.ts +1 -3
- package/public/manager/src/settings/pages/Heartbeat.tsx +2 -2
- package/public/manager/src/settings/pages/Memory.tsx +2 -2
- package/public/manager/src/settings/pages/ModelProvider.tsx +7 -4
- package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +2 -2
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +2 -2
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +2 -2
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +4 -35
- package/public/manager/src/settings/pages/components/employees-helpers.ts +0 -2
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +0 -2
- package/scripts/bundle-sidecar.sh +0 -24
- package/scripts/check-electron-sidecar-no-jwc.cjs +12 -4
- package/scripts/fresh-install-smoke.ts +1 -1
- package/scripts/install.sh +0 -5
- package/scripts/retired-runtime-package-smoke.mjs +2 -12
- package/scripts/verify-fresh-install.sh +0 -14
- package/dist/src/agent/claude-e-runtime.js +0 -44
- package/dist/src/agent/claude-e-runtime.js.map +0 -1
- package/public/dist/assets/Agent-CNad_A6t.js +0 -1
- package/public/dist/assets/Employees-B6uviPeN.js +0 -1
- package/public/dist/assets/Heartbeat-C3S3d8xW.js +0 -1
- package/public/dist/assets/Memory-BgeIbQSr.js +0 -1
- package/public/dist/assets/ModelProvider-AnxBVYws.js +0 -1
- package/public/dist/assets/agent-meta-BWHASq1a.js +0 -1
- package/public/dist/assets/bgtask-badge-DeSZJGNN.js +0 -1
- package/public/dist/assets/cli-engine-Bw0QTAVX.js +0 -1
- package/public/dist/assets/constants-D8XAqfHk.js +0 -1
- package/public/dist/assets/iframe-renderer-DfvACXIn.js +0 -1
- package/public/dist/assets/memory-Ckp1Eq5a.js +0 -1
- package/public/dist/assets/message-history-Bv0l_t7O.js +0 -1
- package/public/dist/assets/settings-C81Kf9uX.js +0 -1
- package/public/dist/assets/settings-core-CzdXfoOK.js +0 -2
- package/public/dist/assets/settings-core-DO_5M7Lv.js +0 -1
- package/public/dist/assets/skills-DFpPmMUR.js +0 -1
- package/public/dist/assets/slash-commands-BU58xYih.js +0 -1
- package/public/dist/assets/ui-CUB4iwz3.js +0 -1
package/dist/src/agent/spawn.js
CHANGED
|
@@ -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 {
|
|
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,
|
|
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
|
|
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(
|
|
397
|
-
return
|
|
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
|
-
|
|
656
|
-
|
|
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,
|
|
945
|
-
export { buildArgs, buildResumeArgs,
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
1153
|
-
|
|
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
|
|
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
|
-
?
|
|
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, ...
|
|
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, ...
|
|
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
|
-
|
|
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') {
|