crewly 1.18.5 → 1.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +24 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +124 -55
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +3 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +8 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +111 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +214 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +6 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +24 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +124 -55
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +3 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +8 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +111 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +214 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js +6 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/package.json +1 -1
|
@@ -189,6 +189,30 @@ export declare class AgentRegistrationService {
|
|
|
189
189
|
* @returns True if an in-process runtime exists and is ready
|
|
190
190
|
*/
|
|
191
191
|
isInProcessRuntimeActive(sessionName: string): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Decide how the runtime's conversation id is handled for this launch and
|
|
194
|
+
* apply the Claude Code half (flags + persisting a preset id). Codex's
|
|
195
|
+
* resume id is returned for the command rewrite; a fresh Codex id is
|
|
196
|
+
* discovered after launch by {@link recordRuntimeSessionAfterLaunch}.
|
|
197
|
+
*
|
|
198
|
+
* @param sessionName - Agent session
|
|
199
|
+
* @param runtimeType - Runtime
|
|
200
|
+
* @param effectiveFlags - Flag list to extend in place
|
|
201
|
+
* @returns The plan
|
|
202
|
+
*/
|
|
203
|
+
private planSessionRecovery;
|
|
204
|
+
/**
|
|
205
|
+
* For a freshly launched Codex agent, learn its conversation id from the
|
|
206
|
+
* rollout file it writes right after start and persist it. Runs in the
|
|
207
|
+
* background; never throws.
|
|
208
|
+
*
|
|
209
|
+
* @param sessionName - Agent session
|
|
210
|
+
* @param runtimeType - Runtime
|
|
211
|
+
* @param cwd - The agent's working directory (matched against the rollout's cwd)
|
|
212
|
+
* @param launchedAtMs - When the launch command was sent
|
|
213
|
+
* @param plan - The launch plan (skips when the id is already known)
|
|
214
|
+
*/
|
|
215
|
+
private recordRuntimeSessionAfterLaunch;
|
|
192
216
|
/**
|
|
193
217
|
* Get the check interval based on environment.
|
|
194
218
|
* Uses shorter intervals in test environment for faster tests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yDAAyD,CAAC;AAK5G,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACN,gBAAgB,EAMhB,WAAW,EAQX,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
|
|
|
25
25
|
import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndicator, containsBusyStatusBar, containsRewindMode, extractChatPrefix, stripTuiLineBorders, matchTuiPromptLine, } from '../../utils/terminal-string-ops.js';
|
|
26
26
|
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
27
27
|
import { synthesizeSlackConversationId } from '../chat-v2/legacy-dto.utils.js';
|
|
28
|
+
import { planRuntimeSessionFlags, waitForCodexSessionId } from './runtime-session-recovery.js';
|
|
28
29
|
/**
|
|
29
30
|
* Error thrown when an agent role cannot be resolved to a valid value.
|
|
30
31
|
*
|
|
@@ -614,6 +615,106 @@ export class AgentRegistrationService {
|
|
|
614
615
|
const runtime = this.inProcessRuntimes.get(sessionName);
|
|
615
616
|
return runtime !== undefined && runtime.isReady();
|
|
616
617
|
}
|
|
618
|
+
/**
|
|
619
|
+
* Decide how the runtime's conversation id is handled for this launch and
|
|
620
|
+
* apply the Claude Code half (flags + persisting a preset id). Codex's
|
|
621
|
+
* resume id is returned for the command rewrite; a fresh Codex id is
|
|
622
|
+
* discovered after launch by {@link recordRuntimeSessionAfterLaunch}.
|
|
623
|
+
*
|
|
624
|
+
* @param sessionName - Agent session
|
|
625
|
+
* @param runtimeType - Runtime
|
|
626
|
+
* @param effectiveFlags - Flag list to extend in place
|
|
627
|
+
* @returns The plan
|
|
628
|
+
*/
|
|
629
|
+
async planSessionRecovery(sessionName, runtimeType, effectiveFlags) {
|
|
630
|
+
let autoResume = true;
|
|
631
|
+
try {
|
|
632
|
+
autoResume = (await getSettingsService().getSettings()).general.autoResumeOnRestart !== false;
|
|
633
|
+
}
|
|
634
|
+
catch {
|
|
635
|
+
// settings unavailable — default to resuming
|
|
636
|
+
}
|
|
637
|
+
// Persistence is optional infrastructure: without it the agent still
|
|
638
|
+
// launches, it just cannot be resumed after a restart.
|
|
639
|
+
let persistence = null;
|
|
640
|
+
try {
|
|
641
|
+
persistence = getSessionStatePersistence();
|
|
642
|
+
}
|
|
643
|
+
catch (err) {
|
|
644
|
+
this.logger.warn('Session persistence unavailable — launching without resume support', {
|
|
645
|
+
sessionName,
|
|
646
|
+
error: err instanceof Error ? err.message : String(err),
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
const plan = planRuntimeSessionFlags({
|
|
650
|
+
runtimeType,
|
|
651
|
+
isRestored: persistence?.isRestoredSession(sessionName) ?? false,
|
|
652
|
+
storedSessionId: persistence?.getSessionId(sessionName) ?? null,
|
|
653
|
+
autoResume,
|
|
654
|
+
});
|
|
655
|
+
effectiveFlags.push(...plan.flags);
|
|
656
|
+
if (plan.presetSessionId && persistence) {
|
|
657
|
+
try {
|
|
658
|
+
persistence.updateSessionId(sessionName, plan.presetSessionId);
|
|
659
|
+
}
|
|
660
|
+
catch (err) {
|
|
661
|
+
this.logger.warn('Could not persist the preset session id (resume after restart may not work)', {
|
|
662
|
+
sessionName,
|
|
663
|
+
error: err instanceof Error ? err.message : String(err),
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
this.logger.info('Runtime conversation plan', {
|
|
668
|
+
sessionName,
|
|
669
|
+
runtimeType,
|
|
670
|
+
note: plan.note,
|
|
671
|
+
sessionId: plan.presetSessionId ?? plan.resumeSessionId ?? null,
|
|
672
|
+
});
|
|
673
|
+
return plan;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* For a freshly launched Codex agent, learn its conversation id from the
|
|
677
|
+
* rollout file it writes right after start and persist it. Runs in the
|
|
678
|
+
* background; never throws.
|
|
679
|
+
*
|
|
680
|
+
* @param sessionName - Agent session
|
|
681
|
+
* @param runtimeType - Runtime
|
|
682
|
+
* @param cwd - The agent's working directory (matched against the rollout's cwd)
|
|
683
|
+
* @param launchedAtMs - When the launch command was sent
|
|
684
|
+
* @param plan - The launch plan (skips when the id is already known)
|
|
685
|
+
*/
|
|
686
|
+
recordRuntimeSessionAfterLaunch(sessionName, runtimeType, cwd, launchedAtMs, plan) {
|
|
687
|
+
if (runtimeType !== RUNTIME_TYPES.CODEX_CLI || plan.resumeSessionId || !cwd)
|
|
688
|
+
return;
|
|
689
|
+
let persistence;
|
|
690
|
+
try {
|
|
691
|
+
persistence = getSessionStatePersistence();
|
|
692
|
+
}
|
|
693
|
+
catch {
|
|
694
|
+
return; // no persistence, nothing to record into
|
|
695
|
+
}
|
|
696
|
+
const claimed = new Set();
|
|
697
|
+
for (const name of persistence.getRegisteredSessions()) {
|
|
698
|
+
const id = persistence.getSessionId(name);
|
|
699
|
+
if (id && name !== sessionName)
|
|
700
|
+
claimed.add(id);
|
|
701
|
+
}
|
|
702
|
+
void waitForCodexSessionId({ cwd, notBeforeMs: launchedAtMs, claimed })
|
|
703
|
+
.then((found) => {
|
|
704
|
+
if (!found) {
|
|
705
|
+
this.logger.warn('Codex conversation id not found after launch (resume after restart will not work)', { sessionName, cwd });
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
persistence.updateSessionId(sessionName, found.sessionId);
|
|
709
|
+
this.logger.info('Codex conversation id recorded', { sessionName, sessionId: found.sessionId });
|
|
710
|
+
})
|
|
711
|
+
.catch((err) => {
|
|
712
|
+
this.logger.debug('Codex conversation id discovery failed (non-fatal)', {
|
|
713
|
+
sessionName,
|
|
714
|
+
error: err instanceof Error ? err.message : String(err),
|
|
715
|
+
});
|
|
716
|
+
});
|
|
717
|
+
}
|
|
617
718
|
/**
|
|
618
719
|
* Get the check interval based on environment.
|
|
619
720
|
* Uses shorter intervals in test environment for faster tests.
|
|
@@ -836,33 +937,10 @@ export class AgentRegistrationService {
|
|
|
836
937
|
async tryCleanupAndReinit(sessionName, role, timeout, projectPath, memberId, runtimeType = RUNTIME_TYPES.CLAUDE_CODE, runtimeFlags, additionalAllowlistPaths) {
|
|
837
938
|
// Clear Commandline
|
|
838
939
|
await (await this.getSessionHelper()).clearCurrentCommandLine(sessionName);
|
|
839
|
-
//
|
|
940
|
+
// Conversation id: preset for Claude Code (--session-id), resumed on
|
|
941
|
+
// restore (--resume / `codex resume`), discovered after launch for Codex.
|
|
840
942
|
const effectiveFlags = runtimeFlags ? [...runtimeFlags] : [];
|
|
841
|
-
|
|
842
|
-
try {
|
|
843
|
-
const settings = await getSettingsService().getSettings();
|
|
844
|
-
if (settings.general.autoResumeOnRestart) {
|
|
845
|
-
const persistence = getSessionStatePersistence();
|
|
846
|
-
if (persistence.isRestoredSession(sessionName)) {
|
|
847
|
-
const storedSessionId = persistence.getSessionId(sessionName);
|
|
848
|
-
if (storedSessionId) {
|
|
849
|
-
effectiveFlags.push('--resume', storedSessionId);
|
|
850
|
-
this.logger.info('Injecting --resume flag for session restore', {
|
|
851
|
-
sessionName, sessionId: storedSessionId,
|
|
852
|
-
});
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
this.logger.info('Auto-resume disabled by settings, skipping session resume', { sessionName });
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
catch (resumeError) {
|
|
861
|
-
this.logger.debug('Could not resolve resume flag (non-fatal)', {
|
|
862
|
-
sessionName, error: resumeError instanceof Error ? resumeError.message : String(resumeError),
|
|
863
|
-
});
|
|
864
|
-
}
|
|
865
|
-
}
|
|
943
|
+
const sessionPlan = await this.planSessionRecovery(sessionName, runtimeType, effectiveFlags);
|
|
866
944
|
// Write prompt file before launching runtime so --agent (Claude Code) or --append-system-prompt-file works
|
|
867
945
|
let promptFilePath;
|
|
868
946
|
let agentName;
|
|
@@ -885,7 +963,9 @@ export class AgentRegistrationService {
|
|
|
885
963
|
}
|
|
886
964
|
// Reinitialize runtime using the appropriate initialization script (always fresh start)
|
|
887
965
|
const runtimeService2 = this.createRuntimeService(runtimeType);
|
|
888
|
-
|
|
966
|
+
const launchedAtMs = Date.now();
|
|
967
|
+
await runtimeService2.executeRuntimeInitScript(sessionName, projectPath, effectiveFlags, promptFilePath, agentName, sessionPlan.resumeSessionId ?? undefined);
|
|
968
|
+
this.recordRuntimeSessionAfterLaunch(sessionName, runtimeType, projectPath, launchedAtMs, sessionPlan);
|
|
889
969
|
// Wait for runtime to be ready (simplified detection)
|
|
890
970
|
// Use shorter check interval in test environment, and reasonable interval in production
|
|
891
971
|
const checkInterval = this.getCheckInterval();
|
|
@@ -988,6 +1068,15 @@ export class AgentRegistrationService {
|
|
|
988
1068
|
*/
|
|
989
1069
|
async detectAndStoreSessionId(sessionName, projectPath) {
|
|
990
1070
|
try {
|
|
1071
|
+
// A launch with a preset or resumed id already knows the answer. The
|
|
1072
|
+
// "newest transcript in the project dir" guess below is only for
|
|
1073
|
+
// legacy sessions — with several agents sharing a cwd it picks the
|
|
1074
|
+
// wrong agent's (or an older) conversation, and did exactly that 17 s
|
|
1075
|
+
// after a preset launch on 2026-09-18.
|
|
1076
|
+
if (getSessionStatePersistence().getSessionId(sessionName)) {
|
|
1077
|
+
this.logger.debug('Session id already known — skipping filesystem detection', { sessionName });
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
991
1080
|
const slug = projectPath.replace(/\//g, '-');
|
|
992
1081
|
const claudeProjectDir = path.join(os.homedir(), '.claude', 'projects', slug);
|
|
993
1082
|
const files = await readdir(claudeProjectDir);
|
|
@@ -1285,33 +1374,9 @@ export class AgentRegistrationService {
|
|
|
1285
1374
|
await (await this.getSessionHelper()).killSession(sessionName);
|
|
1286
1375
|
// Wait for cleanup
|
|
1287
1376
|
await delay(1000);
|
|
1288
|
-
//
|
|
1377
|
+
// Conversation id (see planSessionRecovery): preset, resumed, or discovered.
|
|
1289
1378
|
const effectiveFlags = runtimeFlags ? [...runtimeFlags] : [];
|
|
1290
|
-
|
|
1291
|
-
try {
|
|
1292
|
-
const settings = await getSettingsService().getSettings();
|
|
1293
|
-
if (settings.general.autoResumeOnRestart) {
|
|
1294
|
-
const persistence = getSessionStatePersistence();
|
|
1295
|
-
if (persistence.isRestoredSession(sessionName)) {
|
|
1296
|
-
const storedSessionId = persistence.getSessionId(sessionName);
|
|
1297
|
-
if (storedSessionId) {
|
|
1298
|
-
effectiveFlags.push('--resume', storedSessionId);
|
|
1299
|
-
this.logger.info('Injecting --resume flag for session restore (full recreation)', {
|
|
1300
|
-
sessionName, sessionId: storedSessionId,
|
|
1301
|
-
});
|
|
1302
|
-
}
|
|
1303
|
-
}
|
|
1304
|
-
}
|
|
1305
|
-
else {
|
|
1306
|
-
this.logger.info('Auto-resume disabled by settings, skipping session resume after recreation', { sessionName });
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
|
-
catch (resumeError) {
|
|
1310
|
-
this.logger.debug('Could not resolve resume flag (non-fatal)', {
|
|
1311
|
-
sessionName, error: resumeError instanceof Error ? resumeError.message : String(resumeError),
|
|
1312
|
-
});
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1379
|
+
const sessionPlan = await this.planSessionRecovery(sessionName, runtimeType, effectiveFlags);
|
|
1315
1380
|
// Write prompt file before launching runtime so --agent (Claude Code) or --append-system-prompt-file works
|
|
1316
1381
|
let promptFilePath;
|
|
1317
1382
|
let agentName;
|
|
@@ -1344,7 +1409,9 @@ export class AgentRegistrationService {
|
|
|
1344
1409
|
});
|
|
1345
1410
|
// Initialize runtime for orchestrator using script (always fresh start)
|
|
1346
1411
|
const runtimeService = this.createRuntimeService(runtimeType);
|
|
1347
|
-
|
|
1412
|
+
const launchedAtMs = Date.now();
|
|
1413
|
+
await runtimeService.executeRuntimeInitScript(sessionName, orchestratorCwd, effectiveFlags, promptFilePath, agentName, sessionPlan.resumeSessionId ?? undefined);
|
|
1414
|
+
this.recordRuntimeSessionAfterLaunch(sessionName, runtimeType, orchestratorCwd, launchedAtMs, sessionPlan);
|
|
1348
1415
|
// Wait for runtime to be ready
|
|
1349
1416
|
const checkInterval = this.getCheckInterval();
|
|
1350
1417
|
// runtimeService3: Separate instance for orchestrator ready-state detection
|
|
@@ -1390,7 +1457,9 @@ export class AgentRegistrationService {
|
|
|
1390
1457
|
// For other roles, create basic session and initialize Claude (always fresh start)
|
|
1391
1458
|
await (await this.getSessionHelper()).createSession(sessionName, projectPath || process.cwd());
|
|
1392
1459
|
const runtimeService = this.createRuntimeService(runtimeType);
|
|
1393
|
-
|
|
1460
|
+
const launchedAtMs = Date.now();
|
|
1461
|
+
await runtimeService.executeRuntimeInitScript(sessionName, projectPath, effectiveFlags, promptFilePath, agentName, sessionPlan.resumeSessionId ?? undefined);
|
|
1462
|
+
this.recordRuntimeSessionAfterLaunch(sessionName, runtimeType, projectPath, launchedAtMs, sessionPlan);
|
|
1394
1463
|
// Wait for runtime to be ready (simplified detection)
|
|
1395
1464
|
const checkInterval = this.getCheckInterval();
|
|
1396
1465
|
const isReady = await this.createRuntimeService(runtimeType)
|