@straiffi/archon 1.8.14 → 1.8.15

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 (111) hide show
  1. package/dist/client/assets/{ActivityView-DYDYyqIN.js → ActivityView-DpY9GZez.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-jhi4GOyV.js → GitHubActionsDialog-BCr-hjvp.js} +1 -1
  3. package/dist/client/assets/{RepositoryGraphDialog-BZV0vHu6.js → RepositoryGraphDialog-_hm-x1Dx.js} +1 -1
  4. package/dist/client/assets/{VerificationDialog-Sc6e8AKH.js → VerificationDialog-CsjDzpE1.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DFbki8mi.js → architectureDiagram-3BPJPVTR-Dx7MJofM.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-GPEHLZMM-BZFehG8P.js → blockDiagram-GPEHLZMM-CSSJR8F_.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AAUBKEIU-FVDXRu1t.js → c4Diagram-AAUBKEIU-C4F9969r.js} +1 -1
  8. package/dist/client/assets/channel-DVkhJzgx.js +1 -0
  9. package/dist/client/assets/{chunk-2J33WTMH-4tuVZaT0.js → chunk-2J33WTMH-23HW6i-y.js} +1 -1
  10. package/dist/client/assets/{chunk-3OPIFGDE-DSn14S35.js → chunk-3OPIFGDE-C3ZmRDMb.js} +1 -1
  11. package/dist/client/assets/{chunk-5ZQYHXKU-Cwx1KNjg.js → chunk-5ZQYHXKU-B_-UQvCg.js} +1 -1
  12. package/dist/client/assets/{chunk-727SXJPM-Odza4hes.js → chunk-727SXJPM-5Dua6u1B.js} +1 -1
  13. package/dist/client/assets/{chunk-AQP2D5EJ-BmVoQT7M.js → chunk-AQP2D5EJ-DcpcaFRO.js} +1 -1
  14. package/dist/client/assets/{chunk-CSCIHK7Q-Bg7Ktx0B.js → chunk-CSCIHK7Q-CLCpOw52.js} +1 -1
  15. package/dist/client/assets/{chunk-KSCS5N6A-2tnhar2x.js → chunk-KSCS5N6A-uOZFe2JI.js} +1 -1
  16. package/dist/client/assets/{chunk-L5ZTLDWV-dAyg8qMJ.js → chunk-L5ZTLDWV-DNnzSNoX.js} +1 -1
  17. package/dist/client/assets/{chunk-LZXEDZCA-0gElxrlR.js → chunk-LZXEDZCA-CSA3Xnoh.js} +2 -2
  18. package/dist/client/assets/{chunk-ND2GUHAM-Bu-8Lz91.js → chunk-ND2GUHAM-BQR5rD7w.js} +1 -1
  19. package/dist/client/assets/{chunk-NZK2D7GU-CInZFdzd.js → chunk-NZK2D7GU-DyIwcQYQ.js} +1 -1
  20. package/dist/client/assets/{chunk-O5CBEL6O-rAzpvdNR.js → chunk-O5CBEL6O-DfW60w5V.js} +1 -1
  21. package/dist/client/assets/{chunk-WU5MYG2G-DOOw2vq7.js → chunk-WU5MYG2G-CzMMPYdi.js} +1 -1
  22. package/dist/client/assets/classDiagram-4FO5ZUOK-6oZ93s5p.js +1 -0
  23. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DYO_YnkU.js +1 -0
  24. package/dist/client/assets/{dagre-BM42HDAG-Dgua1iuh.js → dagre-BM42HDAG-Ba7Pz-ZI.js} +1 -1
  25. package/dist/client/assets/{diagram-2AECGRRQ-odacwlwu.js → diagram-2AECGRRQ-BxYfgpZ6.js} +1 -1
  26. package/dist/client/assets/{diagram-5GNKFQAL-BiKjFmJ1.js → diagram-5GNKFQAL-Bc4-O-UJ.js} +1 -1
  27. package/dist/client/assets/{diagram-KO2AKTUF-CmYcvFri.js → diagram-KO2AKTUF-Ds1Lmrzm.js} +1 -1
  28. package/dist/client/assets/{diagram-LMA3HP47-ncx0RBuX.js → diagram-LMA3HP47-VFQabxKS.js} +1 -1
  29. package/dist/client/assets/{diagram-OG6HWLK6-DbchKIzw.js → diagram-OG6HWLK6-Baff59Zc.js} +1 -1
  30. package/dist/client/assets/{erDiagram-TEJ5UH35-CMnpvRyQ.js → erDiagram-TEJ5UH35-Da5zHjOK.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-I6XJVG4X-Bi02_PK5.js → flowDiagram-I6XJVG4X-pdGMAuog.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BiS992US.js → ganttDiagram-6RSMTGT7-DjJGX0nm.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-Cc1hrTsT.js → gitGraphDiagram-PVQCEYII-kErlwtcT.js} +1 -1
  34. package/dist/client/assets/index-CS4TzG41.css +2 -0
  35. package/dist/client/assets/{index-B1gdJKwK.js → index-D5TEfELZ.js} +107 -107
  36. package/dist/client/assets/{infoDiagram-5YYISTIA-BKVfqJCe.js → infoDiagram-5YYISTIA-Bx78HhDi.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B-IbFOty.js → ishikawaDiagram-YF4QCWOH-BP0YQCMl.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-JHISSGLW-DAZBgAQW.js → journeyDiagram-JHISSGLW-DUgrCOuD.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-UN3LZRKU-Bkr_fXev.js → kanban-definition-UN3LZRKU-K0Zc5_M8.js} +1 -1
  40. package/dist/client/assets/{line-CROuuXDO.js → line-Dtg-krjk.js} +1 -1
  41. package/dist/client/assets/{mermaid-parser.core-DrBw_Rsc.js → mermaid-parser.core-Dw5BI77W.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-pPd6OYYj.js → mermaid.core-BE-qlWNj.js} +3 -3
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BXSd3TZU.js → mindmap-definition-RKZ34NQL-1Piz4H9I.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-DoT7PIZC.js → pieDiagram-4H26LBE5-zlWdJ7lL.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ycZkLowm.js → quadrantDiagram-W4KKPZXB-DRQY8Adp.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BPkO1yLu.js → requirementDiagram-4Y6WPE33-B8_GJFxl.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D7AvhhCw.js → sankeyDiagram-5OEKKPKP-BaI0Njo8.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C982swnH.js → sequenceDiagram-3UESZ5HK-DjqAXbRF.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-xvJ3u8lc.js → stateDiagram-AJRCARHV-Ovr_3LeO.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-9pmeAorV.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-D89qjzb5.js → timeline-definition-PNZ67QCA-DkczYKeZ.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-CoKeC__u.js → vennDiagram-CIIHVFJN-BZyo4ESi.js} +1 -1
  53. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DKhjzvSE.js → wardleyDiagram-YWT4CUSO-BEISrECX.js} +1 -1
  54. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DFn9ass1.js → xychartDiagram-2RQKCTM6-CyNzGK7f.js} +1 -1
  55. package/dist/client/index.html +2 -2
  56. package/dist/server/db.js +2 -0
  57. package/dist/server/db.js.map +1 -1
  58. package/dist/server/index.js +11 -42
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/lib/agent.js +61 -12
  61. package/dist/server/lib/agent.js.map +1 -1
  62. package/dist/server/lib/agentProvider.js +13 -3
  63. package/dist/server/lib/agentProvider.js.map +1 -1
  64. package/dist/server/lib/agentRuns.js +20 -9
  65. package/dist/server/lib/agentRuns.js.map +1 -1
  66. package/dist/server/lib/chatOperations.js +30 -1
  67. package/dist/server/lib/chatOperations.js.map +1 -1
  68. package/dist/server/lib/git.js +32 -1
  69. package/dist/server/lib/git.js.map +1 -1
  70. package/dist/server/lib/lightweightPrompt.js +1 -0
  71. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  72. package/dist/server/lib/opencodeExecutionReliability.js +52 -0
  73. package/dist/server/lib/opencodeExecutionReliability.js.map +1 -0
  74. package/dist/server/lib/opencodeSessionOperations.js +21 -11
  75. package/dist/server/lib/opencodeSessionOperations.js.map +1 -1
  76. package/dist/server/lib/projectAutoConfig.js +1 -0
  77. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  78. package/dist/server/lib/specArtifact.js +19 -0
  79. package/dist/server/lib/specArtifact.js.map +1 -1
  80. package/dist/server/lib/specBundleGroups.js +151 -0
  81. package/dist/server/lib/specBundleGroups.js.map +1 -0
  82. package/dist/server/lib/specExport.js +1 -0
  83. package/dist/server/lib/specExport.js.map +1 -1
  84. package/dist/server/lib/specFormatting.js +13 -0
  85. package/dist/server/lib/specFormatting.js.map +1 -1
  86. package/dist/server/lib/specReviewValidation.js +22 -1
  87. package/dist/server/lib/specReviewValidation.js.map +1 -1
  88. package/dist/server/lib/specReviews.js +1 -1
  89. package/dist/server/lib/specSections.js +8 -1
  90. package/dist/server/lib/specSections.js.map +1 -1
  91. package/dist/server/lib/specTicketMaterialization.js +119 -0
  92. package/dist/server/lib/specTicketMaterialization.js.map +1 -0
  93. package/dist/server/lib/specs.js +27 -5
  94. package/dist/server/lib/specs.js.map +1 -1
  95. package/dist/server/lib/types.js.map +1 -1
  96. package/dist/server/workers/followUp.js +25 -4
  97. package/dist/server/workers/followUp.js.map +1 -1
  98. package/dist/server/workers/plan.js +23 -2
  99. package/dist/server/workers/plan.js.map +1 -1
  100. package/dist/server/workers/review.js +29 -10
  101. package/dist/server/workers/review.js.map +1 -1
  102. package/dist/server/workers/specReview.js +7 -1
  103. package/dist/server/workers/specReview.js.map +1 -1
  104. package/dist/server/workers/specSession.js +68 -36
  105. package/dist/server/workers/specSession.js.map +1 -1
  106. package/package.json +1 -1
  107. package/dist/client/assets/channel-D1kOpezG.js +0 -1
  108. package/dist/client/assets/classDiagram-4FO5ZUOK-C253nwny.js +0 -1
  109. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DFgDA23g.js +0 -1
  110. package/dist/client/assets/index-CCQwWUKF.css +0 -2
  111. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BKQG8NCn.js +0 -1
@@ -8,6 +8,7 @@ import { normalizeClaudeModelId, normalizeModelId } from './models.js';
8
8
  import { createOpencodeTaskSessionReader, parseOpencodeTaskEnvelope } from './opencodeTaskSessions.js';
9
9
  import { hostOpencodeSessionOperations } from './opencodeSessionOperations.js';
10
10
  import { hostExecutionEnvironment } from './hostExecutionEnvironment.js';
11
+ import { markRetryableOpenCodeDatabaseLock, RetryableOpenCodeDatabaseLockError, retryOpenCodeDatabaseLocks } from './opencodeExecutionReliability.js';
11
12
  import { claudeAgentProvider } from './claudeAgentProvider.js';
12
13
  import { buildOpencodeSpecReviewInvocation, createOpencodeExitError, createOpencodeRecoveryTracker, interpretOpencodeRecoveryEvent, isSuccessfulOpencodeExit, opencodeAgentProvider, } from './opencodeAgentProvider.js';
13
14
  import { appendClaudeHeadlessPlanPrompt, buildClaudeHeadlessPlanArgs } from './planModeQuestions.js';
@@ -49,6 +50,7 @@ export const getAgentErrorTranscriptRuns = (error) => {
49
50
  };
50
51
  const OPENCODE_SESSION_METADATA_LOOKUP_DELAY_MS = 1500;
51
52
  const AGENT_PROGRESS_UPDATE_INTERVAL_MS = 100;
53
+ const OPENCODE_SUBAGENT_POLL_INTERVAL_MS = 750;
52
54
  const resolveAgentModel = (tool, model) => {
53
55
  if (tool === 'claude') {
54
56
  return normalizeClaudeModelId(model) || null;
@@ -1486,7 +1488,7 @@ export const readOpencodeSessionTranscript = ({ sessionId, since, cwd, }) => {
1486
1488
  reader.close();
1487
1489
  }
1488
1490
  };
1489
- export const createOpencodeSubagentMonitor = ({ initialParentSessionId, spawnTimestamp, cwd, tracker, onParentSessionId, taskSessionReader, discoverParentSession = true, }) => {
1491
+ export const createOpencodeSubagentMonitor = ({ initialParentSessionId, spawnTimestamp, cwd, tracker, onParentSessionId, taskSessionReader, discoverParentSession = true, parentDiscoveryDelayMs = 0, }) => {
1490
1492
  const reader = taskSessionReader === undefined ? createOpencodeTaskSessionReader() : taskSessionReader;
1491
1493
  let parentSessionId = initialParentSessionId;
1492
1494
  let timer = null;
@@ -1529,7 +1531,7 @@ export const createOpencodeSubagentMonitor = ({ initialParentSessionId, spawnTim
1529
1531
  return;
1530
1532
  }
1531
1533
  try {
1532
- if (!parentSessionId && discoverParentSession) {
1534
+ if (!parentSessionId && discoverParentSession && Date.now() >= spawnTimestamp + parentDiscoveryDelayMs) {
1533
1535
  setParentSessionId(reader.findParentSessionSince(spawnTimestamp));
1534
1536
  }
1535
1537
  if (!parentSessionId) {
@@ -1562,7 +1564,7 @@ export const createOpencodeSubagentMonitor = ({ initialParentSessionId, spawnTim
1562
1564
  return;
1563
1565
  }
1564
1566
  refresh();
1565
- timer = setInterval(refresh, 150);
1567
+ timer = setInterval(refresh, OPENCODE_SUBAGENT_POLL_INTERVAL_MS);
1566
1568
  timer.unref?.();
1567
1569
  };
1568
1570
  const stop = () => {
@@ -1864,7 +1866,7 @@ export const stopSpecReviewAgent = async (specReviewRunId) => {
1864
1866
  }
1865
1867
  return true;
1866
1868
  };
1867
- export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = null, resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, reviewProcessState, emitSuccessUpdate = true, opencodeAgentMode, runStream, executionContext, persistSessionIdToTicket = false, spawnPermitId, executionProvider = hostExecutionEnvironment, }) => {
1869
+ const runAgentOnce = ({ ticketId, tool, prompt, cwd, io, model, variant = null, resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, reviewProcessState, emitSuccessUpdate = true, opencodeAgentMode, runStream, executionContext, persistSessionIdToTicket = false, spawnPermitId, executionProvider = hostExecutionEnvironment, }) => {
1868
1870
  const resolvedModel = resolveAgentModel(tool, model);
1869
1871
  const subagentTracker = createSubagentRunTracker({
1870
1872
  parentType: 'ticket',
@@ -2244,6 +2246,13 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2244
2246
  const error = resumeSessionId && !executionCapableEventObserved && isTypedPreExecutionContinuationRejection(failureMessage)
2245
2247
  ? new AgentContinuationRejectedError(failureMessage)
2246
2248
  : createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker);
2249
+ const retryableError = !executionCapableEventObserved && !sessionId
2250
+ ? markRetryableOpenCodeDatabaseLock(error)
2251
+ : error;
2252
+ if (retryableError instanceof RetryableOpenCodeDatabaseLockError) {
2253
+ rejectOnce(retryableError);
2254
+ return;
2255
+ }
2247
2256
  const transcriptRuns = finalizeRun('error', log, finalResponse);
2248
2257
  rejectOnce(attachTranscriptRunsToError(error, transcriptRuns));
2249
2258
  });
@@ -2264,7 +2273,11 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2264
2273
  });
2265
2274
  });
2266
2275
  };
2267
- export const runChatAgent = ({ chatSessionId, tool, prompt, files = [], cwd, io, model, variant = null, resumeSessionId = null, opencodeAgentMode = 'build', executionContext, mainRun, spawnPermitId, }) => {
2276
+ export const runAgent = (options) => {
2277
+ const run = () => runAgentOnce(options);
2278
+ return options.tool === 'opencode' ? retryOpenCodeDatabaseLocks(run) : run();
2279
+ };
2280
+ const runChatAgentOnce = ({ chatSessionId, tool, prompt, files = [], cwd, io, model, variant = null, resumeSessionId = null, opencodeAgentMode = 'build', executionContext, mainRun, spawnPermitId, }) => {
2268
2281
  const resolvedModel = resolveAgentModel(tool, model);
2269
2282
  const subagentTracker = createSubagentRunTracker({
2270
2283
  parentType: 'chat',
@@ -2631,11 +2644,18 @@ export const runChatAgent = ({ chatSessionId, tool, prompt, files = [], cwd, io,
2631
2644
  }, transcriptRuns));
2632
2645
  return;
2633
2646
  }
2634
- updateChatSessionStatus(chatSessionId, 'error', log, io, finalResponse);
2635
2647
  const failureMessage = `Agent exited with code ${code ?? 'null'}\n${log}${stderrOutput !== log && stderrOutput ? '\n\n' + stderrOutput : ''}`;
2636
2648
  const error = resumeSessionId && !executionCapableEventObserved && isTypedPreExecutionContinuationRejection(failureMessage)
2637
2649
  ? new AgentContinuationRejectedError(failureMessage)
2638
2650
  : createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker);
2651
+ const retryableError = !executionCapableEventObserved
2652
+ ? markRetryableOpenCodeDatabaseLock(error)
2653
+ : error;
2654
+ if (retryableError instanceof RetryableOpenCodeDatabaseLockError) {
2655
+ rejectOnce(retryableError);
2656
+ return;
2657
+ }
2658
+ updateChatSessionStatus(chatSessionId, 'error', log, io, finalResponse);
2639
2659
  const transcriptRuns = subagentTracker.finalize('error', log, finalResponse);
2640
2660
  rejectOnce(attachTranscriptRunsToError(error, transcriptRuns));
2641
2661
  });
@@ -2665,7 +2685,11 @@ export const runChatAgent = ({ chatSessionId, tool, prompt, files = [], cwd, io,
2665
2685
  });
2666
2686
  });
2667
2687
  };
2668
- export const runSpecAgent = ({ specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, resumeSessionId = null, executionContext, mainRun, }) => {
2688
+ export const runChatAgent = (options) => {
2689
+ const run = () => runChatAgentOnce(options);
2690
+ return options.tool === 'opencode' ? retryOpenCodeDatabaseLocks(run) : run();
2691
+ };
2692
+ const runSpecAgentOnce = ({ specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, resumeSessionId = null, executionContext, mainRun, }) => {
2669
2693
  const resolvedModel = resolveAgentModel(tool, model);
2670
2694
  const subagentTracker = createSubagentRunTracker({
2671
2695
  parentType: 'spec',
@@ -3005,10 +3029,18 @@ export const runSpecAgent = ({ specSessionId, tool, prompt, files = [], cwd, io,
3005
3029
  }, transcriptRuns));
3006
3030
  return;
3007
3031
  }
3032
+ const failureMessage = `Agent exited with code ${code ?? 'null'}\n${log}${stderrOutput !== log && stderrOutput ? '\n\n' + stderrOutput : ''}`;
3033
+ const error = createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker);
3034
+ const retryableError = logLines.length === 0 && responseLines.length === 0
3035
+ ? markRetryableOpenCodeDatabaseLock(error)
3036
+ : error;
3037
+ if (retryableError instanceof RetryableOpenCodeDatabaseLockError) {
3038
+ rejectOnce(retryableError);
3039
+ return;
3040
+ }
3008
3041
  updateSpecSessionStatusLocal(specSessionId, 'error', log, io, finalResponse);
3009
3042
  const transcriptRuns = subagentTracker.finalize('error', log, finalResponse);
3010
- const failureMessage = `Agent exited with code ${code ?? 'null'}\n${log}${stderrOutput !== log && stderrOutput ? '\n\n' + stderrOutput : ''}`;
3011
- rejectOnce(attachTranscriptRunsToError(createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker), transcriptRuns));
3043
+ rejectOnce(attachTranscriptRunsToError(error, transcriptRuns));
3012
3044
  });
3013
3045
  child.on('error', err => {
3014
3046
  progressUpdater.cancel();
@@ -3036,6 +3068,10 @@ export const runSpecAgent = ({ specSessionId, tool, prompt, files = [], cwd, io,
3036
3068
  });
3037
3069
  });
3038
3070
  };
3071
+ export const runSpecAgent = (options) => {
3072
+ const run = () => runSpecAgentOnce(options);
3073
+ return options.tool === 'opencode' ? retryOpenCodeDatabaseLocks(run) : run();
3074
+ };
3039
3075
  /**
3040
3076
  * Focused, decoupled runner for a one-shot Spec Review.
3041
3077
  *
@@ -3046,7 +3082,7 @@ export const runSpecAgent = ({ specSessionId, tool, prompt, files = [], cwd, io,
3046
3082
  * updateSpecReviewRunStatus / updateSpecReviewRunStreaming / updateSpecReviewRunUsage —
3047
3083
  * the spec_sessions row is never touched by this path.
3048
3084
  */
3049
- export const runSpecReviewAgent = ({ specReviewRunId, specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, executionContext, }) => {
3085
+ const runSpecReviewAgentOnce = ({ specReviewRunId, specSessionId, tool, prompt, files = [], cwd, io, model, variant = null, executionContext, }) => {
3050
3086
  const registeredState = activeSpecReviewProcesses.get(specReviewRunId);
3051
3087
  if (registeredState?.stopRequested) {
3052
3088
  return Promise.resolve({
@@ -3150,6 +3186,7 @@ export const runSpecReviewAgent = ({ specReviewRunId, specSessionId, tool, promp
3150
3186
  spawnTimestamp,
3151
3187
  cwd,
3152
3188
  tracker: subagentTracker,
3189
+ parentDiscoveryDelayMs: OPENCODE_SESSION_METADATA_LOOKUP_DELAY_MS,
3153
3190
  });
3154
3191
  opencodeSubagentMonitor.start();
3155
3192
  }
@@ -3322,9 +3359,17 @@ export const runSpecReviewAgent = ({ specReviewRunId, specSessionId, tool, promp
3322
3359
  });
3323
3360
  return;
3324
3361
  }
3325
- subagentTracker.finalize('error', log || null, finalResponse || null);
3326
3362
  const failureMessage = `Agent exited with code ${code ?? 'null'}\n${log}${stderrOutput !== log && stderrOutput ? '\n\n' + stderrOutput : ''}`;
3327
- rejectOnce(createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker));
3363
+ const error = createOpencodeExitError(failureMessage, stderrModelError, recoveryTracker);
3364
+ const retryableError = logLines.length === 0 && responseLines.length === 0 && !opencodeSessionId
3365
+ ? markRetryableOpenCodeDatabaseLock(error)
3366
+ : error;
3367
+ if (retryableError instanceof RetryableOpenCodeDatabaseLockError) {
3368
+ rejectOnce(retryableError);
3369
+ return;
3370
+ }
3371
+ subagentTracker.finalize('error', log || null, finalResponse || null);
3372
+ rejectOnce(error);
3328
3373
  });
3329
3374
  child.on('error', err => {
3330
3375
  progressUpdater.cancel();
@@ -3350,4 +3395,8 @@ export const runSpecReviewAgent = ({ specReviewRunId, specSessionId, tool, promp
3350
3395
  });
3351
3396
  });
3352
3397
  };
3398
+ export const runSpecReviewAgent = (options) => {
3399
+ const run = () => runSpecReviewAgentOnce(options);
3400
+ return options.tool === 'opencode' ? retryOpenCodeDatabaseLocks(run) : run();
3401
+ };
3353
3402
  //# sourceMappingURL=agent.js.map