@straiffi/archon 1.11.14 → 1.11.16

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 (91) hide show
  1. package/dist/client/assets/{ActivityView-CXlLfbio.js → ActivityView-TwJeVDII.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-COncogiu.js → GitHubActionsDialog-Umiz7hRS.js} +1 -1
  3. package/dist/client/assets/VerificationDialog-BVaLckVH.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BgpjZv9J.js → architectureDiagram-3BPJPVTR-DG6n6a9N.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-DZOzPj8L.js → blockDiagram-GPEHLZMM-fpqlAUZA.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-CH8w_-4O.js → c4Diagram-AAUBKEIU-DD-BA8Fj.js} +1 -1
  7. package/dist/client/assets/channel-BvWs2-ry.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-BhCJUMWk.js → chunk-2J33WTMH-BcwQlxYR.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-B4ljJWcN.js → chunk-3OPIFGDE-DCbOiRKI.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-BokkrzzD.js → chunk-5ZQYHXKU-BAgSocEO.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-V-Kd95sz.js → chunk-727SXJPM-0NBz7Bl7.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-D7ZyW65i.js → chunk-AQP2D5EJ-BgLpjpch.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-3cPiGWR4.js → chunk-CSCIHK7Q-CFV8R2WL.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-fh-t3Kan.js → chunk-KSCS5N6A-B-5OABYB.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-Bz_XmsGr.js → chunk-L5ZTLDWV-BEakyLfX.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-DUQIbmfo.js → chunk-LZXEDZCA-k1JqO5jl.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-BeaXA2cA.js → chunk-ND2GUHAM-CAvkgbq4.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-Cljr0eIp.js → chunk-NZK2D7GU-B1XxeNv6.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-BSZxUONE.js → chunk-O5CBEL6O-xsxGQlBc.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-CqeEBV6t.js → chunk-WU5MYG2G-D2RTcS5J.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-CXujfiH2.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BpQoPe_W.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-C684sP5O.js → dagre-BM42HDAG-DQRkT0rW.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-Bsuw7S1w.js → diagram-2AECGRRQ-DLxnmFG_.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-B7TKNAIK.js → diagram-5GNKFQAL-Cu1nMouP.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-RPOTY2uQ.js → diagram-KO2AKTUF-BCpHrNi4.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-Dpk6toIw.js → diagram-LMA3HP47-CIM0-geo.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-DVJDTxyc.js → diagram-OG6HWLK6-DV8jDGdy.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-BTCHMpI9.js → erDiagram-TEJ5UH35-C-5Pkrkl.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-DJHpUHaK.js → flowDiagram-I6XJVG4X-CDPh9OIS.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-B3lqQNjh.js → ganttDiagram-6RSMTGT7-jncsu8xZ.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-kSFZuvH6.js → gitGraphDiagram-PVQCEYII-DGWMJkfX.js} +1 -1
  33. package/dist/client/assets/index-C8n_tSJG.js +293 -0
  34. package/dist/client/assets/{infoDiagram-5YYISTIA-D7rhmUR9.js → infoDiagram-5YYISTIA-B4xDH_w0.js} +1 -1
  35. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CFrqWdH6.js → ishikawaDiagram-YF4QCWOH-DVdd9VXs.js} +1 -1
  36. package/dist/client/assets/{journeyDiagram-JHISSGLW-BPgPF00X.js → journeyDiagram-JHISSGLW-nOtumTZv.js} +1 -1
  37. package/dist/client/assets/{kanban-definition-UN3LZRKU-BJU3LTu3.js → kanban-definition-UN3LZRKU-DDOXGouj.js} +1 -1
  38. package/dist/client/assets/{line-DTRSChYM.js → line-Bv23U4ui.js} +1 -1
  39. package/dist/client/assets/{mermaid-parser.core-X8EDtr9G.js → mermaid-parser.core-G9FbMuHU.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-CQDbIF5j.js → mermaid.core-B3CWAqqw.js} +3 -3
  41. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bcke6M7z.js → mindmap-definition-RKZ34NQL-DjSz56M7.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-4H26LBE5-j8xeTgqq.js → pieDiagram-4H26LBE5-DSWgdOVl.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-OlvBffG8.js → quadrantDiagram-W4KKPZXB-DEupU1aE.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DA6zNi15.js → requirementDiagram-4Y6WPE33-BhBfAL0L.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BsS5qud8.js → sankeyDiagram-5OEKKPKP-CbjG9Vw2.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BfZ_W9Jc.js → sequenceDiagram-3UESZ5HK-1Q4xZQSJ.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-AJRCARHV-C7uuqC0M.js → stateDiagram-AJRCARHV-OtJd_YEY.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Bkxwy8iL.js +1 -0
  49. package/dist/client/assets/{timeline-definition-PNZ67QCA-yuywaFQ6.js → timeline-definition-PNZ67QCA-CABkNCpN.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-CIIHVFJN-Cxlyjlnx.js → vennDiagram-CIIHVFJN-BC2gbfhD.js} +1 -1
  51. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DcJ0jJo4.js → wardleyDiagram-YWT4CUSO-Bkh5qr4Q.js} +1 -1
  52. package/dist/client/assets/{xychartDiagram-2RQKCTM6-Cia16EBC.js → xychartDiagram-2RQKCTM6-BWDBD0AE.js} +1 -1
  53. package/dist/client/index.html +1 -1
  54. package/dist/server/index.js +2 -0
  55. package/dist/server/index.js.map +1 -1
  56. package/dist/server/lib/agent.js +43 -10
  57. package/dist/server/lib/agent.js.map +1 -1
  58. package/dist/server/lib/agentProvider.js.map +1 -1
  59. package/dist/server/lib/opencodeAgentProvider.js +11 -1
  60. package/dist/server/lib/opencodeAgentProvider.js.map +1 -1
  61. package/dist/server/lib/opencodeApprovalContext.js +38 -0
  62. package/dist/server/lib/opencodeApprovalContext.js.map +1 -0
  63. package/dist/server/lib/opencodeApprovalLifecycle.js +49 -0
  64. package/dist/server/lib/opencodeApprovalLifecycle.js.map +1 -0
  65. package/dist/server/lib/opencodeApprovalRoutes.js +51 -0
  66. package/dist/server/lib/opencodeApprovalRoutes.js.map +1 -0
  67. package/dist/server/lib/opencodeApprovalSchema.js +31 -0
  68. package/dist/server/lib/opencodeApprovalSchema.js.map +1 -0
  69. package/dist/server/lib/opencodeApprovalTransport.js +713 -0
  70. package/dist/server/lib/opencodeApprovalTransport.js.map +1 -0
  71. package/dist/server/lib/opencodeApprovalTypes.js +2 -0
  72. package/dist/server/lib/opencodeApprovalTypes.js.map +1 -0
  73. package/dist/server/lib/opencodeToolApprovals.js +371 -0
  74. package/dist/server/lib/opencodeToolApprovals.js.map +1 -0
  75. package/dist/server/lib/planModeQuestions.js +4 -0
  76. package/dist/server/lib/planModeQuestions.js.map +1 -1
  77. package/dist/server/lib/restrictedFilePrompt.js +11 -3
  78. package/dist/server/lib/restrictedFilePrompt.js.map +1 -1
  79. package/dist/server/lib/reviewAgentWatchdog.js +5 -5
  80. package/dist/server/lib/reviewAgentWatchdog.js.map +1 -1
  81. package/dist/server/lib/reviewPromptContext.js +5 -3
  82. package/dist/server/lib/reviewPromptContext.js.map +1 -1
  83. package/dist/server/workers/plan.js +47 -41
  84. package/dist/server/workers/plan.js.map +1 -1
  85. package/package.json +1 -1
  86. package/dist/client/assets/VerificationDialog-DcKjv3mg.js +0 -4
  87. package/dist/client/assets/channel-DOoXSYAr.js +0 -1
  88. package/dist/client/assets/classDiagram-4FO5ZUOK-DKWNm6Cx.js +0 -1
  89. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-JFUHs0Z7.js +0 -1
  90. package/dist/client/assets/index-CXBsxrT1.js +0 -293
  91. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B2rL_9Nk.js +0 -1
@@ -24,6 +24,7 @@ import { createTranscriptRunSnapshots } from './transcriptRuns.js';
24
24
  import { createHostLauncherEnvironment, createLegacyHostRuntimeEnvironment, createWorkspaceProcessEnvironment, } from './workspaceProcessEnvironment.js';
25
25
  import { OpencodeModelResolutionError, parseOpencodeStderrModelResolutionError, parseOpencodePermissionAutoReject, createOpencodePermissionAutoRejectTracker, } from './opencodeErrors.js';
26
26
  import { appendRestrictedFilePrompt } from './restrictedFilePrompt.js';
27
+ import { createOpencodeApprovalClock, prepareOpencodeApprovalPrompt, resolveOpencodeApprovalContext } from './opencodeApprovalContext.js';
27
28
  import { decodeOpencodeStreamEvent, extractLeadingOpencodeJsonObjects, extractOpencodeStreamUsage, parseOpencodeStreamLine } from './opencodeStream.js';
28
29
  import { assertAgentSpawnPermit, AgentSpawnPermitRevokedError } from './agentSpawnPermits.js';
29
30
  import { buildClaudeStdinMessage } from './claudeStdin.js';
@@ -2034,6 +2035,8 @@ export const stopSpecReviewAgent = async (specReviewRunId) => {
2034
2035
  return true;
2035
2036
  };
2036
2037
  const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null, skills = [], resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, reviewProcessState, emitSuccessUpdate = true, opencodeAgentMode, runStream, executionContext, persistSessionIdToTicket = false, spawnPermitId, executionProvider = hostExecutionEnvironment, executionTarget, executionLauncherEnvironment = createHostLauncherEnvironment(), executionRuntimeEnvironment = createLegacyHostRuntimeEnvironment(cwd, { PWD: cwd }), opencodeRuntimeIdentity = null, }) => {
2038
+ const opencodeApprovalContext = resolveOpencodeApprovalContext({ tool, parentKind: 'ticket', parentId: ticketId, executionContext, io });
2039
+ const approvalClock = createOpencodeApprovalClock(opencodeApprovalContext);
2037
2040
  const resolvedModel = resolveAgentModel(tool, model);
2038
2041
  const resolvedOpencodeCompatibility = resolveOpencodeCompatibility(tool, executionProvider, opencodeRuntimeIdentity);
2039
2042
  const resolvedOpencodeRuntimeIdentity = resolvedOpencodeCompatibility?.runtimeIdentity ?? null;
@@ -2108,7 +2111,7 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2108
2111
  let reviewKillTimer = null;
2109
2112
  let reviewCompletionForced = false;
2110
2113
  let reviewInactivityTimeoutForced = false;
2111
- let lastOutputAt = Date.now();
2114
+ let lastOutputAt = approvalClock.now();
2112
2115
  let executionCapableEventObserved = false;
2113
2116
  const buildState = trackBuildProcess
2114
2117
  ? activeBuildProcesses.get(ticketId) ?? registerBuildProcessPlaceholder(ticketId)
@@ -2172,7 +2175,8 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2172
2175
  const streamingRequest = {
2173
2176
  cwd,
2174
2177
  skills,
2175
- prompt,
2178
+ prompt: prepareOpencodeApprovalPrompt(prompt, opencodeApprovalContext),
2179
+ opencodeApprovalContext,
2176
2180
  model: resolvedModel,
2177
2181
  variant,
2178
2182
  mode: opencodeAgentMode,
@@ -2239,6 +2243,10 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2239
2243
  };
2240
2244
  void connection.sessionReady.then(providerThreadId => {
2241
2245
  if (!settled && providerThreadId) {
2246
+ if (tool === 'opencode') {
2247
+ bindResolvedOpencodeSession(providerThreadId, true);
2248
+ return;
2249
+ }
2242
2250
  sessionId = providerThreadId;
2243
2251
  writeRunSessionId(providerThreadId);
2244
2252
  }
@@ -2288,7 +2296,7 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2288
2296
  bindResolvedOpencodeSession(discoveredSessionId);
2289
2297
  },
2290
2298
  onActivity: () => {
2291
- lastOutputAt = Date.now();
2299
+ lastOutputAt = approvalClock.now();
2292
2300
  },
2293
2301
  });
2294
2302
  opencodeSubagentMonitor.start();
@@ -2398,6 +2406,8 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2398
2406
  });
2399
2407
  if (reviewProcessState && startTime !== null) {
2400
2408
  reviewWatchdog = createReviewAgentWatchdog({
2409
+ isApprovalPending: approvalClock.isPending,
2410
+ now: approvalClock.now,
2401
2411
  getLastOutputAt: () => lastOutputAt,
2402
2412
  checkForCompletion: async () => reviewFinalAnswerObserved && !subagentTracker.hasRunningSubagents(),
2403
2413
  onTrigger: async (trigger) => {
@@ -2418,7 +2428,7 @@ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null,
2418
2428
  const output = providerStdout ?? child.stdout;
2419
2429
  output?.on('data', (chunk) => {
2420
2430
  permissionAutoRejectTracker.consume(chunk);
2421
- lastOutputAt = Date.now();
2431
+ lastOutputAt = approvalClock.now();
2422
2432
  const text = remainder + chunk.toString();
2423
2433
  const lines = text.split('\n');
2424
2434
  remainder = lines.pop() ?? '';
@@ -2625,6 +2635,7 @@ export const runAgent = (options) => {
2625
2635
  return typeof enrichedPrompt === 'string' ? launch(enrichedPrompt) : enrichedPrompt.then(launch);
2626
2636
  };
2627
2637
  const runChatAgentOnce = ({ chatSessionId, tool, prompt, files = [], cwd, io, model, variant = null, skills = [], resumeSessionId = null, opencodeAgentMode = 'build', executionContext, mainRun, spawnPermitId, executionProvider = hostExecutionEnvironment, executionTarget, executionLauncherEnvironment = createHostLauncherEnvironment(), executionRuntimeEnvironment = createLegacyHostRuntimeEnvironment(cwd, { PWD: cwd }), opencodeRuntimeIdentity = null, }) => {
2638
+ const opencodeApprovalContext = resolveOpencodeApprovalContext({ tool, parentKind: 'chat', parentId: chatSessionId, executionContext, io });
2628
2639
  const resolvedModel = resolveAgentModel(tool, model);
2629
2640
  const resolvedOpencodeCompatibility = resolveOpencodeCompatibility(tool, executionProvider, opencodeRuntimeIdentity);
2630
2641
  const resolvedOpencodeRuntimeIdentity = resolvedOpencodeCompatibility?.runtimeIdentity ?? null;
@@ -2676,7 +2687,8 @@ const runChatAgentOnce = ({ chatSessionId, tool, prompt, files = [], cwd, io, mo
2676
2687
  cwd,
2677
2688
  files,
2678
2689
  skills,
2679
- prompt,
2690
+ prompt: prepareOpencodeApprovalPrompt(prompt, opencodeApprovalContext),
2691
+ opencodeApprovalContext,
2680
2692
  model: resolvedModel,
2681
2693
  variant,
2682
2694
  mode: opencodeAgentMode,
@@ -2763,7 +2775,11 @@ const runChatAgentOnce = ({ chatSessionId, tool, prompt, files = [], cwd, io, mo
2763
2775
  void connection.sessionReady.then(providerThreadId => {
2764
2776
  if (!settled && providerThreadId) {
2765
2777
  sessionId = providerThreadId;
2766
- updateChatSessionId(chatSessionId, 'codex', providerThreadId, io);
2778
+ updateChatSessionId(chatSessionId, tool, providerThreadId, io);
2779
+ if (tool === 'opencode') {
2780
+ opencodeMetadataRefresher?.pinSessionId(providerThreadId);
2781
+ opencodeSubagentMonitor?.setParentSessionId(providerThreadId);
2782
+ }
2767
2783
  subagentTracker.setMainSessionId(providerThreadId);
2768
2784
  }
2769
2785
  }).catch(() => { });
@@ -3126,6 +3142,7 @@ export const runChatAgent = (options) => {
3126
3142
  return typeof enrichedPrompt === 'string' ? launch(enrichedPrompt) : enrichedPrompt.then(launch);
3127
3143
  };
3128
3144
  const runSpecAgentOnce = ({ specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, skills = [], resumeSessionId = null, executionContext, mainRun, executionProvider = hostExecutionEnvironment, executionTarget, executionLauncherEnvironment = createHostLauncherEnvironment(), executionRuntimeEnvironment = createLegacyHostRuntimeEnvironment(cwd, { PWD: cwd }), opencodeRuntimeIdentity = null, }) => {
3145
+ const opencodeApprovalContext = resolveOpencodeApprovalContext({ tool, parentKind: 'spec', parentId: specSessionId, executionContext, io });
3129
3146
  const resolvedModel = resolveAgentModel(tool, model);
3130
3147
  const resolvedOpencodeCompatibility = resolveOpencodeCompatibility(tool, executionProvider, opencodeRuntimeIdentity);
3131
3148
  const resolvedOpencodeRuntimeIdentity = resolvedOpencodeCompatibility?.runtimeIdentity ?? null;
@@ -3177,7 +3194,8 @@ const runSpecAgentOnce = ({ specSessionId, tool, prompt, files = [], cwd, io, mo
3177
3194
  cwd,
3178
3195
  files,
3179
3196
  skills,
3180
- prompt,
3197
+ prompt: prepareOpencodeApprovalPrompt(prompt, opencodeApprovalContext),
3198
+ opencodeApprovalContext,
3181
3199
  model: resolvedModel,
3182
3200
  variant,
3183
3201
  mode: 'plan',
@@ -3258,7 +3276,11 @@ const runSpecAgentOnce = ({ specSessionId, tool, prompt, files = [], cwd, io, mo
3258
3276
  void connection.sessionReady.then(providerThreadId => {
3259
3277
  if (!settled && providerThreadId) {
3260
3278
  sessionId = providerThreadId;
3261
- updateSpecSessionIdLocal(specSessionId, 'codex', providerThreadId, io);
3279
+ updateSpecSessionIdLocal(specSessionId, tool, providerThreadId, io);
3280
+ if (tool === 'opencode') {
3281
+ opencodeMetadataRefresher?.pinSessionId(providerThreadId);
3282
+ opencodeSubagentMonitor?.setParentSessionId(providerThreadId);
3283
+ }
3262
3284
  subagentTracker.setMainSessionId(providerThreadId);
3263
3285
  }
3264
3286
  }).catch(() => { });
@@ -3631,6 +3653,7 @@ export const runSpecAgent = (options) => {
3631
3653
  * the spec_sessions row is never touched by this path.
3632
3654
  */
3633
3655
  const runSpecReviewAgentOnce = ({ specReviewRunId, specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, skills = [], executionContext, executionProvider = hostExecutionEnvironment, executionTarget, executionLauncherEnvironment = createHostLauncherEnvironment(), executionRuntimeEnvironment = createLegacyHostRuntimeEnvironment(cwd, { PWD: cwd }), opencodeRuntimeIdentity = null, }) => {
3656
+ const opencodeApprovalContext = resolveOpencodeApprovalContext({ tool, parentKind: 'spec', parentId: specSessionId, executionContext, io });
3634
3657
  const registeredState = activeSpecReviewProcesses.get(specReviewRunId);
3635
3658
  if (registeredState?.stopRequested) {
3636
3659
  return Promise.resolve({
@@ -3687,7 +3710,8 @@ const runSpecReviewAgentOnce = ({ specReviewRunId, specSessionId, tool, prompt,
3687
3710
  cwd,
3688
3711
  files,
3689
3712
  skills,
3690
- prompt,
3713
+ prompt: prepareOpencodeApprovalPrompt(prompt, opencodeApprovalContext),
3714
+ opencodeApprovalContext,
3691
3715
  model: resolvedModel,
3692
3716
  variant,
3693
3717
  mode: 'plan',
@@ -3696,7 +3720,7 @@ const runSpecReviewAgentOnce = ({ specReviewRunId, specSessionId, tool, prompt,
3696
3720
  opencodeRuntimeIdentity: resolvedOpencodeRuntimeIdentity,
3697
3721
  opencodeCompatibility: resolvedOpencodeCompatibility,
3698
3722
  };
3699
- const invocation = tool === 'opencode'
3723
+ const invocation = tool === 'opencode' && !opencodeApprovalContext
3700
3724
  ? buildOpencodeSpecReviewInvocation({
3701
3725
  prompt,
3702
3726
  files,
@@ -3742,6 +3766,15 @@ const runSpecReviewAgentOnce = ({ specReviewRunId, specSessionId, tool, prompt,
3742
3766
  void connection.ready.catch(error => {
3743
3767
  rejectOnce(agentProvider.classifyExecutionFailure(error));
3744
3768
  });
3769
+ void connection.sessionReady.then(providerSessionId => {
3770
+ if (!settled && providerSessionId) {
3771
+ if (tool === 'opencode') {
3772
+ opencodeSessionId = providerSessionId;
3773
+ opencodeSubagentMonitor?.setParentSessionId(providerSessionId);
3774
+ }
3775
+ subagentTracker.setMainSessionId(providerSessionId);
3776
+ }
3777
+ }).catch(() => { });
3745
3778
  }
3746
3779
  void placementFailure.then(failure => {
3747
3780
  if (failure) {