@straiffi/archon 1.10.12 → 1.11.0

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 (199) hide show
  1. package/README.md +9 -2
  2. package/dist/client/assets/{ActivityView-BFn_Nhj4.js → ActivityView-BvXSn9Jw.js} +1 -1
  3. package/dist/client/assets/{GitHubActionsDialog-iZD86Yju.js → GitHubActionsDialog-BPZg_Wy3.js} +1 -1
  4. package/dist/client/assets/{VerificationDialog-CqKE8t1d.js → VerificationDialog-D3mOY3z9.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-3BPJPVTR-C8KefY67.js → architectureDiagram-3BPJPVTR-Bj7m5nzx.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-GPEHLZMM-BO2Q_Osr.js → blockDiagram-GPEHLZMM-Dv4SrhZg.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AAUBKEIU-DGPkhbrK.js → c4Diagram-AAUBKEIU-BKGsMo_n.js} +1 -1
  8. package/dist/client/assets/channel-DmiHuOD2.js +1 -0
  9. package/dist/client/assets/{chunk-2J33WTMH-Dtb7Xu8C.js → chunk-2J33WTMH-oppoEflV.js} +1 -1
  10. package/dist/client/assets/{chunk-3OPIFGDE-Bnf4GbOF.js → chunk-3OPIFGDE-FoeHxEDL.js} +1 -1
  11. package/dist/client/assets/{chunk-5ZQYHXKU-BWGid3g7.js → chunk-5ZQYHXKU-DFo7Hn8f.js} +1 -1
  12. package/dist/client/assets/{chunk-727SXJPM-ScA8IRGP.js → chunk-727SXJPM-BbM0ijwZ.js} +1 -1
  13. package/dist/client/assets/{chunk-AQP2D5EJ-Bygg04Ip.js → chunk-AQP2D5EJ-hGswj21x.js} +1 -1
  14. package/dist/client/assets/{chunk-CSCIHK7Q-CxdDDtfN.js → chunk-CSCIHK7Q-k3Y3HBPl.js} +1 -1
  15. package/dist/client/assets/{chunk-KSCS5N6A-BgpZFsB5.js → chunk-KSCS5N6A-D-fMWFHX.js} +1 -1
  16. package/dist/client/assets/{chunk-L5ZTLDWV-CKSew0OL.js → chunk-L5ZTLDWV-Cp8034Xo.js} +1 -1
  17. package/dist/client/assets/{chunk-LZXEDZCA-DVG9Rx0K.js → chunk-LZXEDZCA-DCmWwuZY.js} +2 -2
  18. package/dist/client/assets/{chunk-ND2GUHAM-CHBqNmuF.js → chunk-ND2GUHAM-CPxoYLrb.js} +1 -1
  19. package/dist/client/assets/{chunk-NZK2D7GU-DvZYWn7V.js → chunk-NZK2D7GU-B1xsQ-Ge.js} +1 -1
  20. package/dist/client/assets/{chunk-O5CBEL6O-BL7lRTSe.js → chunk-O5CBEL6O-CP_QLulv.js} +1 -1
  21. package/dist/client/assets/{chunk-WU5MYG2G-C-il2wHZ.js → chunk-WU5MYG2G-CqDmmASz.js} +1 -1
  22. package/dist/client/assets/classDiagram-4FO5ZUOK-GuChK9KD.js +1 -0
  23. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-ezsQe4jc.js +1 -0
  24. package/dist/client/assets/{dagre-BM42HDAG-B00l5tLi.js → dagre-BM42HDAG-I60HgRr5.js} +1 -1
  25. package/dist/client/assets/{diagram-2AECGRRQ-Tum6g1_5.js → diagram-2AECGRRQ-DH7489lu.js} +1 -1
  26. package/dist/client/assets/{diagram-5GNKFQAL-BK1GX5jc.js → diagram-5GNKFQAL-UG5kJveS.js} +1 -1
  27. package/dist/client/assets/{diagram-KO2AKTUF-BrzmD5NB.js → diagram-KO2AKTUF-DLPd9cl-.js} +1 -1
  28. package/dist/client/assets/{diagram-LMA3HP47-BhrlgXiJ.js → diagram-LMA3HP47-gfoMHIE-.js} +1 -1
  29. package/dist/client/assets/{diagram-OG6HWLK6-K-fWsJ3a.js → diagram-OG6HWLK6-D7zejHzo.js} +1 -1
  30. package/dist/client/assets/{erDiagram-TEJ5UH35-Der6PjHE.js → erDiagram-TEJ5UH35-DB1R9rUd.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-I6XJVG4X-BVWgGhXe.js → flowDiagram-I6XJVG4X-rSasRun9.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DcoZ5ggj.js → ganttDiagram-6RSMTGT7-ickt48MT.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BhhbMTBu.js → gitGraphDiagram-PVQCEYII-B2MWuej-.js} +1 -1
  34. package/dist/client/assets/index-4RQBXPuO.css +2 -0
  35. package/dist/client/assets/index-BN2UMUYo.js +276 -0
  36. package/dist/client/assets/{infoDiagram-5YYISTIA-Lwc-agyc.js → infoDiagram-5YYISTIA-ClB9-yBC.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B95U1Xcl.js → ishikawaDiagram-YF4QCWOH-CyUX0IyE.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-JHISSGLW-xFpigy5D.js → journeyDiagram-JHISSGLW-CvZv1SZ7.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-UN3LZRKU-D3mudQnR.js → kanban-definition-UN3LZRKU-C3MgzQMY.js} +1 -1
  40. package/dist/client/assets/{line-DtTL3ZI2.js → line-Dpj7mkeR.js} +1 -1
  41. package/dist/client/assets/{mermaid-parser.core-Dau7K6zV.js → mermaid-parser.core-Ezn4UHHp.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-B8qtvATu.js → mermaid.core-GVI7XZqR.js} +3 -3
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Cus04Yq3.js → mindmap-definition-RKZ34NQL-Bu2cgOo4.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-BCMGpBnn.js → pieDiagram-4H26LBE5-_WS41t2_.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CAmOr-PJ.js → quadrantDiagram-W4KKPZXB-Urvq-XqI.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-kisD3jc4.js → requirementDiagram-4Y6WPE33-bkmWG0rM.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CsCedmM0.js → sankeyDiagram-5OEKKPKP-DI0SArVz.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B-dAi954.js → sequenceDiagram-3UESZ5HK-n7PKrHd3.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-X0BnedIW.js → stateDiagram-AJRCARHV-CxnEzrQA.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DXTMu4iJ.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-DfFoSjhr.js → timeline-definition-PNZ67QCA-BFr88_A9.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-CKSCBwhG.js → vennDiagram-CIIHVFJN-BNYs6tfr.js} +1 -1
  53. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DNIBQmHO.js → wardleyDiagram-YWT4CUSO-CaGZd3fe.js} +1 -1
  54. package/dist/client/assets/{xychartDiagram-2RQKCTM6-FvB55TQN.js → xychartDiagram-2RQKCTM6-CMyDrx2a.js} +1 -1
  55. package/dist/client/index.html +2 -2
  56. package/dist/server/db.js +153 -26
  57. package/dist/server/db.js.map +1 -1
  58. package/dist/server/index.js +93 -36
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/lib/activeTool.js +23 -0
  61. package/dist/server/lib/activeTool.js.map +1 -0
  62. package/dist/server/lib/agent.js +291 -67
  63. package/dist/server/lib/agent.js.map +1 -1
  64. package/dist/server/lib/agentCatalog.js +92 -4
  65. package/dist/server/lib/agentCatalog.js.map +1 -1
  66. package/dist/server/lib/agentProvider.js +8 -11
  67. package/dist/server/lib/agentProvider.js.map +1 -1
  68. package/dist/server/lib/agentRuns.js +26 -2
  69. package/dist/server/lib/agentRuns.js.map +1 -1
  70. package/dist/server/lib/automationCheckGate.js +6 -0
  71. package/dist/server/lib/automationCheckGate.js.map +1 -1
  72. package/dist/server/lib/buildExecutionEnvironment.js +82 -29
  73. package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
  74. package/dist/server/lib/buildFlow.js +5 -4
  75. package/dist/server/lib/buildFlow.js.map +1 -1
  76. package/dist/server/lib/buildSequences.js +7 -29
  77. package/dist/server/lib/buildSequences.js.map +1 -1
  78. package/dist/server/lib/buildTicketCommit.js +82 -11
  79. package/dist/server/lib/buildTicketCommit.js.map +1 -1
  80. package/dist/server/lib/bundleReviewOperations.js +6 -0
  81. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  82. package/dist/server/lib/chatOperations.js +109 -93
  83. package/dist/server/lib/chatOperations.js.map +1 -1
  84. package/dist/server/lib/chatSessionTitle.js +66 -0
  85. package/dist/server/lib/chatSessionTitle.js.map +1 -0
  86. package/dist/server/lib/chats.js +20 -4
  87. package/dist/server/lib/chats.js.map +1 -1
  88. package/dist/server/lib/checkAutoFix.js +65 -61
  89. package/dist/server/lib/checkAutoFix.js.map +1 -1
  90. package/dist/server/lib/codexAgentProvider.js +320 -0
  91. package/dist/server/lib/codexAgentProvider.js.map +1 -0
  92. package/dist/server/lib/codexAppServer.js +678 -0
  93. package/dist/server/lib/codexAppServer.js.map +1 -0
  94. package/dist/server/lib/codexCatalogDiscoveryExecutionEnvironment.js +302 -0
  95. package/dist/server/lib/codexCatalogDiscoveryExecutionEnvironment.js.map +1 -0
  96. package/dist/server/lib/codexDiscovery.js +137 -0
  97. package/dist/server/lib/codexDiscovery.js.map +1 -0
  98. package/dist/server/lib/config.js.map +1 -1
  99. package/dist/server/lib/dockerSandboxEnvironmentOperations.js +2 -2
  100. package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
  101. package/dist/server/lib/dockerSandboxExecutionEnvironment.js +39 -10
  102. package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
  103. package/dist/server/lib/dockerSandboxExecutionProvider.js +3 -1
  104. package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -1
  105. package/dist/server/lib/dockerSandboxReleaseProfiles.js +8 -0
  106. package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -1
  107. package/dist/server/lib/executionCredentialCapabilities.js +39 -14
  108. package/dist/server/lib/executionCredentialCapabilities.js.map +1 -1
  109. package/dist/server/lib/executionEnvironment.js.map +1 -1
  110. package/dist/server/lib/executionEnvironmentContexts.js +1 -1
  111. package/dist/server/lib/executionEnvironmentContexts.js.map +1 -1
  112. package/dist/server/lib/executionEnvironmentLifecycle.js +1 -1
  113. package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -1
  114. package/dist/server/lib/executionEnvironmentReconciliation.js +7 -7
  115. package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
  116. package/dist/server/lib/executionEnvironmentRoutes.js +29 -25
  117. package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
  118. package/dist/server/lib/executionEnvironmentValidation.js +205 -20
  119. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
  120. package/dist/server/lib/executionEnvironmentValidationOperations.js +34 -29
  121. package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
  122. package/dist/server/lib/executionEnvironments.js +59 -1
  123. package/dist/server/lib/executionEnvironments.js.map +1 -1
  124. package/dist/server/lib/executionProfiles.js +6 -3
  125. package/dist/server/lib/executionProfiles.js.map +1 -1
  126. package/dist/server/lib/executionRetryPredicates.js +2 -1
  127. package/dist/server/lib/executionRetryPredicates.js.map +1 -1
  128. package/dist/server/lib/executionRunAuthority.js +6 -1
  129. package/dist/server/lib/executionRunAuthority.js.map +1 -1
  130. package/dist/server/lib/genericToolCall.js +131 -9
  131. package/dist/server/lib/genericToolCall.js.map +1 -1
  132. package/dist/server/lib/hostExecutionEnvironment.js +5 -0
  133. package/dist/server/lib/hostExecutionEnvironment.js.map +1 -1
  134. package/dist/server/lib/lightweightPrompt.js +258 -18
  135. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  136. package/dist/server/lib/mobileAccess.js +21 -13
  137. package/dist/server/lib/mobileAccess.js.map +1 -1
  138. package/dist/server/lib/modelResolutionErrors.js +4 -2
  139. package/dist/server/lib/modelResolutionErrors.js.map +1 -1
  140. package/dist/server/lib/models.js +15 -2
  141. package/dist/server/lib/models.js.map +1 -1
  142. package/dist/server/lib/oneShotAgent.js +11 -0
  143. package/dist/server/lib/oneShotAgent.js.map +1 -0
  144. package/dist/server/lib/projectAutoConfig.js +11 -5
  145. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  146. package/dist/server/lib/projectMemory.js +3 -1
  147. package/dist/server/lib/projectMemory.js.map +1 -1
  148. package/dist/server/lib/projectMemoryScan.js +13 -3
  149. package/dist/server/lib/projectMemoryScan.js.map +1 -1
  150. package/dist/server/lib/projectMemoryTransfer.js +5 -2
  151. package/dist/server/lib/projectMemoryTransfer.js.map +1 -1
  152. package/dist/server/lib/promptSkills.js +1 -1
  153. package/dist/server/lib/promptSkills.js.map +1 -1
  154. package/dist/server/lib/run.js +2 -0
  155. package/dist/server/lib/run.js.map +1 -1
  156. package/dist/server/lib/skills.js +21 -4
  157. package/dist/server/lib/skills.js.map +1 -1
  158. package/dist/server/lib/specOperations.js +14 -10
  159. package/dist/server/lib/specOperations.js.map +1 -1
  160. package/dist/server/lib/specReviewOperations.js +20 -11
  161. package/dist/server/lib/specReviewOperations.js.map +1 -1
  162. package/dist/server/lib/specs.js +14 -4
  163. package/dist/server/lib/specs.js.map +1 -1
  164. package/dist/server/lib/ticketAutomationCommit.js +23 -7
  165. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  166. package/dist/server/lib/ticketFollowUpOperations.js +7 -0
  167. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  168. package/dist/server/lib/ticketRunOperations.js +11 -1
  169. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  170. package/dist/server/lib/ticketSettingsOperations.js +4 -1
  171. package/dist/server/lib/ticketSettingsOperations.js.map +1 -1
  172. package/dist/server/lib/toolUpgrade.js +1 -0
  173. package/dist/server/lib/toolUpgrade.js.map +1 -1
  174. package/dist/server/lib/transcriptRuns.js +4 -1
  175. package/dist/server/lib/transcriptRuns.js.map +1 -1
  176. package/dist/server/lib/types.js.map +1 -1
  177. package/dist/server/workers/build.js +9 -4
  178. package/dist/server/workers/build.js.map +1 -1
  179. package/dist/server/workers/chat.js +55 -11
  180. package/dist/server/workers/chat.js.map +1 -1
  181. package/dist/server/workers/followUp.js +6 -1
  182. package/dist/server/workers/followUp.js.map +1 -1
  183. package/dist/server/workers/plan.js +235 -68
  184. package/dist/server/workers/plan.js.map +1 -1
  185. package/dist/server/workers/planFollowUp.js +11 -4
  186. package/dist/server/workers/planFollowUp.js.map +1 -1
  187. package/dist/server/workers/review.js +15 -18
  188. package/dist/server/workers/review.js.map +1 -1
  189. package/dist/server/workers/specReview.js +7 -7
  190. package/dist/server/workers/specReview.js.map +1 -1
  191. package/dist/server/workers/specSession.js +8 -12
  192. package/dist/server/workers/specSession.js.map +1 -1
  193. package/package.json +1 -1
  194. package/dist/client/assets/channel-DXKn3TOv.js +0 -1
  195. package/dist/client/assets/classDiagram-4FO5ZUOK-U0fU20hT.js +0 -1
  196. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C6bQNSxL.js +0 -1
  197. package/dist/client/assets/index-B6BltHSr.css +0 -2
  198. package/dist/client/assets/index-CFOYm3j9.js +0 -276
  199. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-6B8YH8Y2.js +0 -1
@@ -1,27 +1,267 @@
1
+ import { requireExecutableAgent } from './agentCatalog.js';
2
+ import { runOneShotAgentForTool } from './oneShotAgent.js';
3
+ import { createExecutionRun, transitionExecutionRun } from './executionRuns.js';
4
+ import { createExecutionProfileSelectionMetadata } from './executionRunAuthority.js';
5
+ import { createExecutionTargetKey, resolveExecutionTarget } from './executionTargets.js';
6
+ import { resolveWorkloadExecutionEnvironment, WorkloadExecutionEnvironmentFailure } from './workloadExecutionEnvironment.js';
1
7
  import { createWorkspaceProcessEnvironment } from './workspaceProcessEnvironment.js';
2
- import { runOneShotAgent } from './agentProvider.js';
3
- import { claudeAgentProvider } from './claudeAgentProvider.js';
4
- import { hostExecutionEnvironment } from './hostExecutionEnvironment.js';
5
- import { opencodeAgentProvider } from './opencodeAgentProvider.js';
6
- export const runLightweightPrompt = async ({ tool, model, variant }, prompt, cwd) => {
8
+ const LIGHTWEIGHT_PROMPT_LEASE_WAIT_TIMEOUT_MS = 30 * 60 * 1000;
9
+ const LIGHTWEIGHT_PROMPT_LEASE_RETRY_MS = 100;
10
+ const lightweightPromptQueues = new Map();
11
+ const runningLightweightPromptQueues = new Set();
12
+ let lightweightPromptSequence = 0;
13
+ const waitForLeaseRetry = () => new Promise(resolve => {
14
+ setTimeout(resolve, LIGHTWEIGHT_PROMPT_LEASE_RETRY_MS);
15
+ });
16
+ const getPromptPriority = (initiatedBy) => {
17
+ if (initiatedBy === 'user') {
18
+ return 0;
19
+ }
20
+ if (initiatedBy === 'automation') {
21
+ return 1;
22
+ }
23
+ return 2;
24
+ };
25
+ const drainLightweightPromptQueue = async (key) => {
26
+ if (runningLightweightPromptQueues.has(key)) {
27
+ return;
28
+ }
29
+ runningLightweightPromptQueues.add(key);
7
30
  try {
8
- return await runOneShotAgent(tool === 'claude' ? claudeAgentProvider : opencodeAgentProvider, hostExecutionEnvironment, {
9
- cwd,
10
- env: createWorkspaceProcessEnvironment(cwd),
11
- prompt,
12
- model,
13
- variant,
14
- emptyOutputMessage: 'The helper model did not return a usable result.',
15
- retryOpenCodeDatabaseLocks: tool === 'opencode',
31
+ const queue = lightweightPromptQueues.get(key);
32
+ while (queue?.length) {
33
+ queue.sort((left, right) => left.priority - right.priority || left.sequence - right.sequence);
34
+ const pending = queue.shift();
35
+ await pending?.run();
36
+ }
37
+ }
38
+ finally {
39
+ lightweightPromptQueues.delete(key);
40
+ runningLightweightPromptQueues.delete(key);
41
+ }
42
+ };
43
+ const enqueueLightweightPrompt = (key, priority, task) => new Promise((resolve, reject) => {
44
+ const queue = lightweightPromptQueues.get(key) ?? [];
45
+ queue.push({
46
+ priority,
47
+ sequence: lightweightPromptSequence++,
48
+ run: async () => {
49
+ try {
50
+ resolve(await task());
51
+ }
52
+ catch (error) {
53
+ reject(error);
54
+ }
55
+ },
56
+ });
57
+ lightweightPromptQueues.set(key, queue);
58
+ void drainLightweightPromptQueue(key);
59
+ });
60
+ const runExecutionContextCommand = (context, command, args) => new Promise((resolve, reject) => {
61
+ let settled = false;
62
+ const handle = context.provider.execute({
63
+ phase: 'setup',
64
+ target: context.target,
65
+ command,
66
+ args,
67
+ cwd: context.target?.workspacePath ?? '/',
68
+ stdio: ['ignore', 'ignore', 'pipe'],
69
+ launcherEnvironment: context.launcherEnvironment,
70
+ runtimeEnvironment: context.runtimeEnvironment,
71
+ detached: false,
72
+ placementExecutionRunId: context.placementExecutionRunId,
73
+ });
74
+ const stderr = [];
75
+ handle.child.stderr?.on('data', chunk => stderr.push(Buffer.from(chunk)));
76
+ void handle.placementFailure.then(failure => {
77
+ if (failure && !settled) {
78
+ settled = true;
79
+ reject(failure);
80
+ }
81
+ });
82
+ handle.child.on('error', error => {
83
+ if (!settled) {
84
+ settled = true;
85
+ reject(error);
86
+ }
87
+ });
88
+ handle.child.on('close', code => {
89
+ if (settled) {
90
+ return;
91
+ }
92
+ settled = true;
93
+ if (code === 0) {
94
+ resolve();
95
+ return;
96
+ }
97
+ reject(new Error(Buffer.concat(stderr).toString().trim() || `${command} exited with code ${code}`));
98
+ });
99
+ });
100
+ export const resolveLightweightPromptExecutionContext = async ({ project, executionRunId, execution, target: descriptor, }) => {
101
+ const target = await resolveExecutionTarget({ project, descriptor });
102
+ const lease = { release: null };
103
+ try {
104
+ const environment = await resolveWorkloadExecutionEnvironment({
105
+ project,
106
+ executionRunId,
107
+ agent: execution.tool,
108
+ model: execution.model ?? null,
109
+ target,
110
+ workload: 'plan',
111
+ onLeaseAcquired: release => {
112
+ lease.release = release;
113
+ },
16
114
  });
115
+ lease.release = null;
116
+ return {
117
+ context: {
118
+ provider: environment.provider,
119
+ target,
120
+ launcherEnvironment: environment.launcherEnvironment,
121
+ runtimeEnvironment: environment.runtimeEnvironment,
122
+ placementExecutionRunId: executionRunId,
123
+ },
124
+ release: environment.release,
125
+ };
17
126
  }
18
127
  catch (error) {
19
- if (!model) {
20
- throw error;
128
+ await lease.release?.();
129
+ throw error;
130
+ }
131
+ };
132
+ const resolveQueuedLightweightPromptExecutionContext = async (input) => {
133
+ const deadline = Date.now() + LIGHTWEIGHT_PROMPT_LEASE_WAIT_TIMEOUT_MS;
134
+ while (true) {
135
+ try {
136
+ return await resolveLightweightPromptExecutionContext(input);
137
+ }
138
+ catch (error) {
139
+ if (!(error instanceof WorkloadExecutionEnvironmentFailure) || error.code !== 'environment_leased') {
140
+ throw error;
141
+ }
142
+ if (Date.now() >= deadline) {
143
+ throw new Error('Timed out waiting for the Docker Sandbox to become available for the helper prompt.', { cause: error });
144
+ }
145
+ await waitForLeaseRetry();
21
146
  }
22
- const agent = tool === 'claude' ? 'Claude' : 'OpenCode';
23
- const selection = variant ? `${model} (${variant})` : model;
24
- throw new Error(`Configured Helper model "${selection}" for ${agent} could not run. Verify that the model is available or select another Helper model. ${error instanceof Error ? error.message : String(error)}`, { cause: error });
25
147
  }
26
148
  };
149
+ export const runLightweightPrompt = async ({ tool, model, variant }, prompt, context, workingDirectory = context.target?.workspacePath) => {
150
+ requireExecutableAgent(tool);
151
+ if (!workingDirectory) {
152
+ throw new Error('A lightweight prompt requires a working directory');
153
+ }
154
+ return runOneShotAgentForTool(tool, context.provider, {
155
+ cwd: workingDirectory,
156
+ env: createWorkspaceProcessEnvironment(workingDirectory),
157
+ prompt,
158
+ model,
159
+ variant,
160
+ planAgent: true,
161
+ emptyOutputMessage: 'The helper model did not return a usable result.',
162
+ retryOpenCodeDatabaseLocks: tool === 'opencode',
163
+ }, context);
164
+ };
165
+ export const runTrackedLightweightPrompt = async ({ project, execution, target, initiatedBy = 'user', workingDirectory, parentRunId = null, sourceReference, }, prompt) => {
166
+ const { tool, model, variant } = execution;
167
+ requireExecutableAgent(tool);
168
+ const run = createExecutionRun({
169
+ projectId: project.id,
170
+ kind: 'planning_agent',
171
+ domainStatus: 'queued',
172
+ sourceReference: sourceReference === undefined
173
+ ? { kind: 'project', id: project.id, label: project.name }
174
+ : sourceReference,
175
+ parentRunId,
176
+ initiatedBy,
177
+ metadata: {
178
+ helper_prompt: true,
179
+ helper_tool: tool,
180
+ helper_model: model ?? null,
181
+ helper_variant: variant ?? null,
182
+ target_kind: target.kind,
183
+ target_bundle_id: target.bundleId,
184
+ ...createExecutionProfileSelectionMetadata(project.id),
185
+ },
186
+ eventType: 'helper_prompt_created',
187
+ });
188
+ const queueKey = createExecutionTargetKey(project.id, target);
189
+ return enqueueLightweightPrompt(queueKey, getPromptPriority(initiatedBy), async () => {
190
+ let release = null;
191
+ let resolvedContext = null;
192
+ let removeProviderWorkingDirectory = false;
193
+ try {
194
+ const resolved = await resolveQueuedLightweightPromptExecutionContext({
195
+ project,
196
+ executionRunId: run.id,
197
+ execution,
198
+ target,
199
+ });
200
+ transitionExecutionRun({
201
+ projectId: project.id,
202
+ runId: run.id,
203
+ status: 'running',
204
+ domainStatus: 'running',
205
+ eventType: 'helper_prompt_started',
206
+ });
207
+ release = resolved.release;
208
+ resolvedContext = resolved.context;
209
+ if (workingDirectory && resolved.context.provider.kind === 'docker_sandbox') {
210
+ if (!/^\/tmp\/archon-context-scan-[^/]+$/.test(workingDirectory)) {
211
+ throw new Error('Docker Sandbox isolated helper directories must use the project context scan namespace');
212
+ }
213
+ await runExecutionContextCommand(resolved.context, 'mkdir', ['-p', workingDirectory]);
214
+ removeProviderWorkingDirectory = true;
215
+ resolvedContext = { ...resolved.context, isolatedWorkingDirectory: workingDirectory };
216
+ }
217
+ const output = await runLightweightPrompt(execution, prompt, resolvedContext, workingDirectory);
218
+ if (removeProviderWorkingDirectory) {
219
+ await runExecutionContextCommand(resolved.context, 'rm', ['-rf', workingDirectory]);
220
+ removeProviderWorkingDirectory = false;
221
+ }
222
+ await release();
223
+ release = null;
224
+ transitionExecutionRun({
225
+ projectId: project.id,
226
+ runId: run.id,
227
+ status: 'completed',
228
+ domainStatus: 'completed',
229
+ eventType: 'helper_prompt_completed',
230
+ });
231
+ return output;
232
+ }
233
+ catch (error) {
234
+ if (removeProviderWorkingDirectory && resolvedContext) {
235
+ try {
236
+ await runExecutionContextCommand(resolvedContext, 'rm', ['-rf', workingDirectory]);
237
+ }
238
+ catch {
239
+ // The original failure remains authoritative; provider release below still runs.
240
+ }
241
+ }
242
+ if (release) {
243
+ try {
244
+ await release();
245
+ }
246
+ catch (releaseError) {
247
+ error = new Error('Helper execution environment could not be released', { cause: releaseError });
248
+ }
249
+ }
250
+ transitionExecutionRun({
251
+ projectId: project.id,
252
+ runId: run.id,
253
+ status: 'failed',
254
+ domainStatus: 'failed',
255
+ failure: { code: 'helper_prompt_failed', message: error instanceof Error ? error.message : String(error) },
256
+ eventType: 'helper_prompt_failed',
257
+ });
258
+ if (!model) {
259
+ throw error;
260
+ }
261
+ const agent = tool === 'claude' ? 'Claude' : tool === 'codex' ? 'Codex' : 'OpenCode';
262
+ const selection = variant ? `${model} (${variant})` : model;
263
+ throw new Error(`Configured Helper model "${selection}" for ${agent} could not run. Verify that the model is available or select another Helper model. ${error instanceof Error ? error.message : String(error)}`, { cause: error });
264
+ }
265
+ });
266
+ };
27
267
  //# sourceMappingURL=lightweightPrompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lightweightPrompt.js","sourceRoot":"","sources":["../../../server/lib/lightweightPrompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAQlE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAa,EAAE,MAAc,EAAE,GAAW,EAAmB,EAAE;IAC9H,IAAI,CAAC;QACH,OAAO,MAAM,eAAe,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,EAAE,wBAAwB,EAAE;YACxH,GAAG;YACH,GAAG,EAAE,iCAAiC,CAAC,GAAG,CAAC;YAC3C,MAAM;YACN,KAAK;YACL,OAAO;YACP,kBAAkB,EAAE,kDAAkD;YACtE,0BAA0B,EAAE,IAAI,KAAK,UAAU;SAC9C,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAA;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;QAC3D,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,SAAS,KAAK,sFAAsF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACtO,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"lightweightPrompt.js","sourceRoot":"","sources":["../../../server/lib/lightweightPrompt.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,8 @@ import { listAgentRunsForParent } from './agentRuns.js';
18
18
  import { ApprovalRequestConflictError, ApprovalRequestCursorError, decideApprovalRequest, getApprovalRequest, listApprovalRequestEvents, listApprovalRequests } from './approvalRequests.js';
19
19
  import { finalizeProductionCheckApproval, resumeProductionCheckApproval } from './checkRunner.js';
20
20
  import { finalizeGitPushApproval, resumeGitPushApproval } from './gitPushApprovals.js';
21
- import { discoverAgentModels, getSupportedAgentCatalog, isSupportedAgent } from './agentCatalog.js';
22
- import config from './config.js';
21
+ import { discoverAgentModelCatalog, getSupportedAgentCatalog, isSupportedAgent } from './agentCatalog.js';
22
+ import { getActiveTool as getPersistedActiveTool, setActiveTool as setPersistedActiveTool } from './activeTool.js';
23
23
  const DEFAULT_MOBILE_PORT = 43111;
24
24
  const MOBILE_PORT_FALLBACK_COUNT = 20;
25
25
  const PAIRING_TTL_MS = 2 * 60 * 1000;
@@ -226,20 +226,23 @@ const listMobileChatSessions = async (projectId) => {
226
226
  };
227
227
  const listMobileModels = async (tool) => {
228
228
  if (!isSupportedAgent(tool)) {
229
- return [];
229
+ return { status: 'unavailable', models: [] };
230
230
  }
231
- return await discoverAgentModels(tool);
231
+ return await discoverAgentModelCatalog(tool);
232
232
  };
233
233
  const listMobileSkills = async (tool, projectId) => {
234
- if (tool !== 'opencode') {
235
- return [];
234
+ if (tool !== 'opencode' && tool !== 'codex') {
235
+ return { status: 'unavailable', skills: [] };
236
236
  }
237
- const [{ getProjectById }, { getDiscoveredSkills }] = await Promise.all([
237
+ const [{ getProjectById }, { getSkillDiscoveryResult }] = await Promise.all([
238
238
  import('./projects.js'),
239
239
  import('./skills.js'),
240
240
  ]);
241
241
  const project = projectId ? getProjectById(projectId) : null;
242
- return await getDiscoveredSkills(tool, { projectPath: project?.repo_path ?? null });
242
+ return await getSkillDiscoveryResult(tool, {
243
+ projectId: project?.id ?? null,
244
+ projectPath: project?.repo_path ?? null,
245
+ });
243
246
  };
244
247
  const listMobileTickets = async (projectId) => {
245
248
  const [{ getProjectById }, { listTickets }] = await Promise.all([
@@ -342,11 +345,15 @@ export const createMobileAccessController = (options = {}) => {
342
345
  const getProjectTicket = options.getTicket ?? getMobileTicket;
343
346
  let getProjectBundleDetails = options.getBundleDetails ?? (() => null);
344
347
  const getMobileTargetOptions = options.getProjectTargetOptions ?? getProjectTargetOptions;
345
- const getActiveTool = options.getTool ?? (() => config.tool ?? 'opencode');
346
- const setActiveTool = options.setTool ?? (tool => {
347
- config.tool = tool;
348
+ const getActiveTool = options.getTool ?? getPersistedActiveTool;
349
+ const setActiveTool = options.setTool ?? setPersistedActiveTool;
350
+ const listSupportedAgents = options.listAgents ?? (async (projectId) => {
351
+ const projects = await listMobileProjects();
352
+ const project = projectId ? projects.find(candidate => candidate.id === projectId) : null;
353
+ return await getSupportedAgentCatalog({
354
+ probeHostAvailability: project?.build_execution_provider === 'host',
355
+ });
348
356
  });
349
- const listSupportedAgents = options.listAgents ?? getSupportedAgentCatalog;
350
357
  const listAgentModels = options.listModels ?? listMobileModels;
351
358
  const listAgentSkills = options.listSkills ?? listMobileSkills;
352
359
  const createMobileChatSession = options.createChatSession ?? ((projectId, payload, broadcaster) => createProjectChatSession({ projectId, payload, broadcaster }));
@@ -909,7 +916,8 @@ export const createMobileAccessController = (options = {}) => {
909
916
  return;
910
917
  }
911
918
  try {
912
- res.json(await listSupportedAgents());
919
+ const projectId = typeof req.query.project_id === 'string' ? req.query.project_id : null;
920
+ res.json(await listSupportedAgents(projectId));
913
921
  }
914
922
  catch {
915
923
  res.status(500).json({ error: 'Unable to list agents.' });