@straiffi/archon 1.7.0 → 1.7.2

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 (79) hide show
  1. package/dist/client/assets/{GitHubActionsDialog-B9_WJBOp.js → GitHubActionsDialog-DAD5REmY.js} +1 -1
  2. package/dist/client/assets/{TestsDialog-DKvbjH_M.js → TestsDialog-B5NVrroq.js} +1 -1
  3. package/dist/client/assets/{TicketChangesModal-C8rFoKjY.js → TicketChangesModal-By-_gTGd.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DXRSRLL9.js → architectureDiagram-3BPJPVTR-Do9nbC8v.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-D7EE6Dnv.js → blockDiagram-GPEHLZMM-DGGOLHF8.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-UhVzFafr.js → c4Diagram-AAUBKEIU-Bz7tQybs.js} +1 -1
  7. package/dist/client/assets/channel-Dd5Len0X.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-obbfylVr.js → chunk-2J33WTMH-CJO-GmWJ.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-DPVuS-uo.js → chunk-3OPIFGDE-DPAVagpC.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-Dsc03vy9.js → chunk-5ZQYHXKU-Cof75Mu7.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-COE-iq_Z.js → chunk-727SXJPM-COuPqQ8_.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-DnbAdr8m.js → chunk-AQP2D5EJ-CFj5KabW.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-DbTzC_WS.js → chunk-CSCIHK7Q-C4M6w5cT.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-xvviIayr.js → chunk-KSCS5N6A-ByaiwVue.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-DY4Q9Til.js → chunk-L5ZTLDWV-Cx5jeot9.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-Bbeq2DZs.js → chunk-LZXEDZCA-DmGtztud.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-CylX1p3K.js → chunk-ND2GUHAM-i3yuspqL.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-BTcALpQq.js → chunk-NZK2D7GU-CQ4E_jP4.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-Be_5dk2_.js → chunk-O5CBEL6O-D2g4VDCd.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-DXPsSM4Q.js → chunk-WU5MYG2G-exIu-zQ2.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-B7KUg6r8.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CQm-z5c4.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-CABUW7xK.js → dagre-BM42HDAG-DvF75yLZ.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-KvcNrpvf.js → diagram-2AECGRRQ-DFv0HxLL.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-DQV6-I4e.js → diagram-5GNKFQAL-C_LRir0-.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-DYDk9roD.js → diagram-KO2AKTUF-DGZxRDRy.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-Da-0u-HG.js → diagram-LMA3HP47-UXt0uti4.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-CuD5eRBv.js → diagram-OG6HWLK6-CFbZS4n5.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-BL5dBE-b.js → erDiagram-TEJ5UH35-CfAwZDdf.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-Bke5cWs7.js → flowDiagram-I6XJVG4X-Cdgi5z3n.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-5OD-ayGn.js → ganttDiagram-6RSMTGT7-DOrkFkhu.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-7Cf6FVfO.js → gitGraphDiagram-PVQCEYII-cEox0peD.js} +1 -1
  33. package/dist/client/assets/index-BHq6-Eir.js +270 -0
  34. package/dist/client/assets/index-BxTc5qQT.css +2 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-BchMN9V-.js → infoDiagram-5YYISTIA-gm51u2Nn.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-D6TchjQy.js → ishikawaDiagram-YF4QCWOH-CjnoOIja.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-CwEcoeX-.js → journeyDiagram-JHISSGLW-Dlg4DsiO.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-S2V9CLGR.js → kanban-definition-UN3LZRKU-BU0XZaSd.js} +1 -1
  39. package/dist/client/assets/{line-DRheChzQ.js → line-Bert22-_.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-CN13XjLe.js → mermaid-parser.core-BvQSGDmL.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-JhdSpoF5.js → mermaid.core--qSAHJRj.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-657TKwRB.js → mindmap-definition-RKZ34NQL-BgFIvWWD.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-DJ8eQ94X.js → pieDiagram-4H26LBE5-DGcbXD0M.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-GpYFqyb1.js → quadrantDiagram-W4KKPZXB-ClkBUeia.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-COZFWgq1.js → requirementDiagram-4Y6WPE33-B8CwGToU.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BdCHyfcQ.js → sankeyDiagram-5OEKKPKP-DTk3jL6B.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DAh3Ogx0.js → sequenceDiagram-3UESZ5HK-BQVrcnKf.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-Ck8Yie8_.js → stateDiagram-AJRCARHV-DD4yMZPB.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C8yO6POT.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-kYr9DNtP.js → timeline-definition-PNZ67QCA-BnCBVqcd.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-CC_SlRiC.js → vennDiagram-CIIHVFJN-BDmLMNXS.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CZ17ccSN.js → wardleyDiagram-YWT4CUSO-DSLuQiEv.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-Blqaj-ci.js → xychartDiagram-2RQKCTM6-DAq_LA4r.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/index.js +15 -3
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/lib/agent.js +54 -6
  58. package/dist/server/lib/agent.js.map +1 -1
  59. package/dist/server/lib/buildOpenQuestions.js +8 -0
  60. package/dist/server/lib/buildOpenQuestions.js.map +1 -1
  61. package/dist/server/lib/shutdown.js +2 -2
  62. package/dist/server/lib/shutdown.js.map +1 -1
  63. package/dist/server/lib/ticketOpenQuestions.js +30 -14
  64. package/dist/server/lib/ticketOpenQuestions.js.map +1 -1
  65. package/dist/server/lib/ticketRunOperations.js +24 -1
  66. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  67. package/dist/server/lib/tickets.js +5 -2
  68. package/dist/server/lib/tickets.js.map +1 -1
  69. package/dist/server/workers/followUp.js +27 -15
  70. package/dist/server/workers/followUp.js.map +1 -1
  71. package/dist/server/workers/review.js +65 -1
  72. package/dist/server/workers/review.js.map +1 -1
  73. package/package.json +1 -1
  74. package/dist/client/assets/channel-CNoEXkwa.js +0 -1
  75. package/dist/client/assets/classDiagram-4FO5ZUOK-BgmK8-LI.js +0 -1
  76. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dj5LqBjo.js +0 -1
  77. package/dist/client/assets/index-D8EniXuq.css +0 -2
  78. package/dist/client/assets/index-DXuxAAzf.js +0 -270
  79. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B6zibRqD.js +0 -1
@@ -313,6 +313,7 @@ const hasMatchingUsageSnapshot = (current, next) => {
313
313
  && current.usage_snapshot_reasoning_tokens === next.usage_snapshot_reasoning_tokens;
314
314
  };
315
315
  const activeBuildProcesses = new Map();
316
+ const activeReviewProcesses = new Map();
316
317
  const activeChatProcesses = new Map();
317
318
  const activeSpecProcesses = new Map();
318
319
  const activeSpecReviewProcesses = new Map();
@@ -1763,6 +1764,24 @@ const untrackSpecReviewProcess = (specReviewRunId, state) => {
1763
1764
  state.metadataRefresher = null;
1764
1765
  };
1765
1766
  export const isBuildAgentRunning = (ticketId) => activeBuildProcesses.has(ticketId);
1767
+ export const registerReviewProcess = (ticketId) => {
1768
+ const state = { children: new Set(), stopRequested: false };
1769
+ activeReviewProcesses.set(ticketId, state);
1770
+ return state;
1771
+ };
1772
+ export const untrackReviewProcess = (ticketId, state) => {
1773
+ if (activeReviewProcesses.get(ticketId) === state) {
1774
+ activeReviewProcesses.delete(ticketId);
1775
+ }
1776
+ };
1777
+ export const isReviewAgentRunning = (ticketId) => activeReviewProcesses.has(ticketId);
1778
+ export const isReviewStopRequested = (ticketId) => {
1779
+ return activeReviewProcesses.get(ticketId)?.stopRequested === true;
1780
+ };
1781
+ export const stopAllReviewAgents = async () => {
1782
+ const ticketIds = [...activeReviewProcesses.keys()];
1783
+ await Promise.all(ticketIds.map(stopReviewAgent));
1784
+ };
1766
1785
  export const stopAllBuildAgents = async () => {
1767
1786
  const ticketIds = [...activeBuildProcesses.keys()];
1768
1787
  await Promise.all(ticketIds.map(stopBuildAgent));
@@ -1781,6 +1800,24 @@ export const stopBuildAgent = async (ticketId) => {
1781
1800
  }
1782
1801
  return true;
1783
1802
  };
1803
+ export const stopReviewAgent = async (ticketId) => {
1804
+ const state = activeReviewProcesses.get(ticketId);
1805
+ if (!state) {
1806
+ return false;
1807
+ }
1808
+ state.stopRequested = true;
1809
+ const children = [...state.children];
1810
+ for (const child of children) {
1811
+ killProcess(child, 'SIGTERM');
1812
+ }
1813
+ await Promise.all(children.map(child => waitForProcessExit(child, 5000)));
1814
+ const aliveChildren = children.filter(isProcessAlive);
1815
+ for (const child of aliveChildren) {
1816
+ killProcess(child, 'SIGKILL');
1817
+ }
1818
+ await Promise.all(aliveChildren.map(child => waitForProcessExit(child, 1000)));
1819
+ return true;
1820
+ };
1784
1821
  export const stopChatAgent = async (chatSessionId) => {
1785
1822
  const state = activeChatProcesses.get(chatSessionId);
1786
1823
  if (!state?.child) {
@@ -1834,7 +1871,7 @@ export const stopSpecReviewAgent = async (specReviewRunId) => {
1834
1871
  }
1835
1872
  return true;
1836
1873
  };
1837
- export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = null, resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, emitSuccessUpdate = true, opencodeAgentMode, runStream, }) => {
1874
+ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = null, resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, reviewProcessState, emitSuccessUpdate = true, opencodeAgentMode, runStream, }) => {
1838
1875
  const resolvedModel = resolveAgentModel(tool, model);
1839
1876
  const subagentTracker = createSubagentRunTracker({
1840
1877
  parentType: 'ticket',
@@ -1885,6 +1922,7 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
1885
1922
  let settled = false;
1886
1923
  let startTime = null;
1887
1924
  let firstFinalAnswerTime = null;
1925
+ let reviewChild = null;
1888
1926
  const buildState = trackBuildProcess
1889
1927
  ? { child: null, stopRequested: false, sessionLookupTimer: null }
1890
1928
  : null;
@@ -1901,6 +1939,9 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
1901
1939
  if (trackBuildProcess && buildState) {
1902
1940
  untrackBuildProcess(ticketId, buildState);
1903
1941
  }
1942
+ if (reviewChild) {
1943
+ reviewProcessState?.children.delete(reviewChild);
1944
+ }
1904
1945
  handler(value);
1905
1946
  };
1906
1947
  const resolveOnce = settle(resolve);
@@ -1943,6 +1984,7 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
1943
1984
  env: { ...process.env, PWD: cwd },
1944
1985
  detached: process.platform !== 'win32',
1945
1986
  });
1987
+ reviewChild = child;
1946
1988
  if (tool === 'claude') {
1947
1989
  const claudePrompt = opencodeAgentMode === 'plan'
1948
1990
  ? appendClaudeHeadlessPlanPrompt(prompt)
@@ -1953,6 +1995,12 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
1953
1995
  buildState.child = child;
1954
1996
  activeBuildProcesses.set(ticketId, buildState);
1955
1997
  }
1998
+ if (reviewProcessState) {
1999
+ reviewProcessState.children.add(child);
2000
+ if (reviewProcessState.stopRequested) {
2001
+ killProcess(child, 'SIGTERM');
2002
+ }
2003
+ }
1956
2004
  startTime = Date.now();
1957
2005
  if (tool === 'opencode' && spawnTimestamp !== null) {
1958
2006
  opencodeSubagentMonitor = createOpencodeSubagentMonitor({
@@ -2018,7 +2066,7 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2018
2066
  const finalResponse = responseLines.join('\n\n') || errOutput;
2019
2067
  const modelError = isModelResolutionError(finalLog);
2020
2068
  const timing = startTime ? { totalMs: Date.now() - startTime } : null;
2021
- if (buildState?.stopRequested) {
2069
+ if (buildState?.stopRequested || reviewProcessState?.stopRequested) {
2022
2070
  const transcriptRuns = finalizeRun('stopped', finalLog, finalResponse);
2023
2071
  resolveOnce(withTranscriptRuns({ response: finalResponse, responseTiming: timing, usageSnapshot }, transcriptRuns));
2024
2072
  return;
@@ -2033,7 +2081,7 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2033
2081
  });
2034
2082
  child.on('error', err => {
2035
2083
  progressUpdater.cancel();
2036
- if (buildState?.stopRequested) {
2084
+ if (buildState?.stopRequested || reviewProcessState?.stopRequested) {
2037
2085
  const transcriptRuns = finalizeRun('stopped', null, null);
2038
2086
  resolveOnce(withTranscriptRuns({ response: null, responseTiming: null, usageSnapshot }, transcriptRuns));
2039
2087
  return;
@@ -2117,8 +2165,8 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2117
2165
  ? recoveredResponse
2118
2166
  : responseLines.join('\n\n') || stderrOutput;
2119
2167
  const modelError = isModelResolutionError(log);
2120
- const timing = buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: Boolean(buildState?.stopRequested) });
2121
- if (buildState?.stopRequested) {
2168
+ const timing = buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: Boolean(buildState?.stopRequested || reviewProcessState?.stopRequested) });
2169
+ if (buildState?.stopRequested || reviewProcessState?.stopRequested) {
2122
2170
  const transcriptRuns = finalizeRun('stopped', log, finalResponse);
2123
2171
  resolveOnce(withTranscriptRuns({ response: finalResponse, responseTiming: timing }, transcriptRuns));
2124
2172
  return;
@@ -2137,7 +2185,7 @@ export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = nul
2137
2185
  clearTimeout(sessionLookupTimer);
2138
2186
  sessionLookupTimer = null;
2139
2187
  }
2140
- if (buildState?.stopRequested) {
2188
+ if (buildState?.stopRequested || reviewProcessState?.stopRequested) {
2141
2189
  const transcriptRuns = finalizeRun('stopped', null, null);
2142
2190
  resolveOnce(withTranscriptRuns({ response: null, responseTiming: null }, transcriptRuns));
2143
2191
  return;