@straiffi/archon 1.11.5 → 1.11.6

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 (162) hide show
  1. package/README.md +8 -0
  2. package/dist/client/assets/{ActivityView-Dw7Bl18C.js → ActivityView-D9dXuvls.js} +1 -1
  3. package/dist/client/assets/{GitHubActionsDialog-9w5XtP5x.js → GitHubActionsDialog-DFB9FNX0.js} +1 -1
  4. package/dist/client/assets/{VerificationDialog-dOSv05QS.js → VerificationDialog-CCpZtj3u.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BU-dnVWz.js → architectureDiagram-3BPJPVTR-C5QNVdbR.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-GPEHLZMM-D1fhZ9K3.js → blockDiagram-GPEHLZMM-ygrKiT2B.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AAUBKEIU-C5cs67FJ.js → c4Diagram-AAUBKEIU-p6pvarzH.js} +1 -1
  8. package/dist/client/assets/channel-CjCFIS-2.js +1 -0
  9. package/dist/client/assets/{chunk-2J33WTMH-BuofkrUv.js → chunk-2J33WTMH-BEZXyYSy.js} +1 -1
  10. package/dist/client/assets/{chunk-3OPIFGDE-BSLbHStu.js → chunk-3OPIFGDE-CxmfjZmF.js} +1 -1
  11. package/dist/client/assets/{chunk-5ZQYHXKU-CV_reqn5.js → chunk-5ZQYHXKU-B2X60oxE.js} +1 -1
  12. package/dist/client/assets/{chunk-727SXJPM-DuL4OL6p.js → chunk-727SXJPM-P03pDtRv.js} +1 -1
  13. package/dist/client/assets/{chunk-AQP2D5EJ-B7ebIXsD.js → chunk-AQP2D5EJ-DE0MLi-X.js} +1 -1
  14. package/dist/client/assets/{chunk-CSCIHK7Q-CfvfKS81.js → chunk-CSCIHK7Q-C3QVx-Wf.js} +1 -1
  15. package/dist/client/assets/{chunk-KSCS5N6A-B8yAPh8_.js → chunk-KSCS5N6A-BvajGF5R.js} +1 -1
  16. package/dist/client/assets/{chunk-L5ZTLDWV-CLAA9PrV.js → chunk-L5ZTLDWV-HtpQP1op.js} +1 -1
  17. package/dist/client/assets/{chunk-LZXEDZCA-BWDUNHyY.js → chunk-LZXEDZCA-CWfF3VMY.js} +2 -2
  18. package/dist/client/assets/{chunk-ND2GUHAM-DDtkY0aA.js → chunk-ND2GUHAM-kEAduwJl.js} +1 -1
  19. package/dist/client/assets/{chunk-NZK2D7GU-Cqw_WclD.js → chunk-NZK2D7GU-DNG4qBtm.js} +1 -1
  20. package/dist/client/assets/{chunk-O5CBEL6O-yk76d2Ne.js → chunk-O5CBEL6O-CS4J6DbD.js} +1 -1
  21. package/dist/client/assets/{chunk-WU5MYG2G-C9RL4ic0.js → chunk-WU5MYG2G-B2-mpLQ2.js} +1 -1
  22. package/dist/client/assets/classDiagram-4FO5ZUOK-DQ1lcUTi.js +1 -0
  23. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-tiWbaJIg.js +1 -0
  24. package/dist/client/assets/{dagre-BM42HDAG-D1R8Uoz3.js → dagre-BM42HDAG-CNK_Lkn1.js} +1 -1
  25. package/dist/client/assets/{diagram-2AECGRRQ-CUwS3hk7.js → diagram-2AECGRRQ-BGKodAdj.js} +1 -1
  26. package/dist/client/assets/{diagram-5GNKFQAL-BQGwWZ5M.js → diagram-5GNKFQAL-O7IcwCBh.js} +1 -1
  27. package/dist/client/assets/{diagram-KO2AKTUF-C7ErzACC.js → diagram-KO2AKTUF-BzuzpIm4.js} +1 -1
  28. package/dist/client/assets/{diagram-LMA3HP47-z4blMZQD.js → diagram-LMA3HP47-C6xFuQYj.js} +1 -1
  29. package/dist/client/assets/{diagram-OG6HWLK6-DTdMXNXF.js → diagram-OG6HWLK6-hp2uvo99.js} +1 -1
  30. package/dist/client/assets/{erDiagram-TEJ5UH35-Dzq40m7g.js → erDiagram-TEJ5UH35-CiiZ8B7W.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-I6XJVG4X-DZee4-lQ.js → flowDiagram-I6XJVG4X-CMXv6xN7.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BrvahLDI.js → ganttDiagram-6RSMTGT7-EP8OVqmy.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DFl7NFyp.js → gitGraphDiagram-PVQCEYII-Dacq4hgw.js} +1 -1
  34. package/dist/client/assets/index-a8IeMnRR.css +2 -0
  35. package/dist/client/assets/index-uGt4qt5t.js +287 -0
  36. package/dist/client/assets/{infoDiagram-5YYISTIA-DcbIRnzw.js → infoDiagram-5YYISTIA-DpTIfB1a.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CCLSDPWU.js → ishikawaDiagram-YF4QCWOH-DOcryUZC.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-JHISSGLW-DBybnxZb.js → journeyDiagram-JHISSGLW-DgEfwhed.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-UN3LZRKU-0vXnDc2p.js → kanban-definition-UN3LZRKU-Bg9Kz1IT.js} +1 -1
  40. package/dist/client/assets/{line-CmuG_mnn.js → line-DGt3zplT.js} +1 -1
  41. package/dist/client/assets/{mermaid-parser.core-2bcA4BZv.js → mermaid-parser.core-CeZgcMLs.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-BtCKaSS-.js → mermaid.core-Bp6d14EP.js} +3 -3
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BS3GYH1w.js → mindmap-definition-RKZ34NQL-CyJdo6SE.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-DnSf3dLi.js → pieDiagram-4H26LBE5-elm12Uf5.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CvU26PT6.js → quadrantDiagram-W4KKPZXB-BXuIBixh.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-9BKyfU_D.js → requirementDiagram-4Y6WPE33-C5rIaCf4.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-9EYmPhr5.js → sankeyDiagram-5OEKKPKP-CIYPcDTl.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BcBk_wZZ.js → sequenceDiagram-3UESZ5HK-CX_go9-1.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-2m55Kpig.js → stateDiagram-AJRCARHV-CYbsPFSQ.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-QZ_UdR0J.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-J3NEOuRz.js → timeline-definition-PNZ67QCA-B3pBx_YB.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-D_3D_Pp4.js → vennDiagram-CIIHVFJN-B1Z6hLI-.js} +1 -1
  53. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Wln2PbKU.js → wardleyDiagram-YWT4CUSO-BvJEPN2P.js} +1 -1
  54. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DfvF03Zn.js → xychartDiagram-2RQKCTM6-CKavkWIt.js} +1 -1
  55. package/dist/client/index.html +2 -2
  56. package/dist/server/db.js +63 -4
  57. package/dist/server/db.js.map +1 -1
  58. package/dist/server/index.js +24 -0
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/lib/agent.js +277 -299
  61. package/dist/server/lib/agent.js.map +1 -1
  62. package/dist/server/lib/agentOutputLanguage.js +11 -0
  63. package/dist/server/lib/agentOutputLanguage.js.map +1 -0
  64. package/dist/server/lib/agentProvider.js.map +1 -1
  65. package/dist/server/lib/agentRuns.js +68 -4
  66. package/dist/server/lib/agentRuns.js.map +1 -1
  67. package/dist/server/lib/appLocale.js +19 -0
  68. package/dist/server/lib/appLocale.js.map +1 -0
  69. package/dist/server/lib/buildExecutionEnvironment.js +92 -1
  70. package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
  71. package/dist/server/lib/chatOperations.js +10 -3
  72. package/dist/server/lib/chatOperations.js.map +1 -1
  73. package/dist/server/lib/conversationResume.js +56 -3
  74. package/dist/server/lib/conversationResume.js.map +1 -1
  75. package/dist/server/lib/dockerSandboxOpencodeSessionOperations.js +81 -25
  76. package/dist/server/lib/dockerSandboxOpencodeSessionOperations.js.map +1 -1
  77. package/dist/server/lib/dockerSandboxReleaseProfiles.js +36 -7
  78. package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -1
  79. package/dist/server/lib/executionEnvironmentRoutes.js +71 -4
  80. package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
  81. package/dist/server/lib/executionEnvironmentValidation.js +199 -19
  82. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
  83. package/dist/server/lib/executionEnvironmentValidationEvidence.js +140 -0
  84. package/dist/server/lib/executionEnvironmentValidationEvidence.js.map +1 -0
  85. package/dist/server/lib/executionEnvironmentValidationOperations.js +13 -0
  86. package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
  87. package/dist/server/lib/executionRetryContext.js +13 -0
  88. package/dist/server/lib/executionRetryContext.js.map +1 -1
  89. package/dist/server/lib/hostExecutionEnvironment.js +14 -2
  90. package/dist/server/lib/hostExecutionEnvironment.js.map +1 -1
  91. package/dist/server/lib/i18n/index.js +3 -2
  92. package/dist/server/lib/i18n/index.js.map +1 -1
  93. package/dist/server/lib/i18n/resources.js +0 -1
  94. package/dist/server/lib/i18n/resources.js.map +1 -1
  95. package/dist/server/lib/lightweightPrompt.js +4 -0
  96. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  97. package/dist/server/lib/models.js +58 -18
  98. package/dist/server/lib/models.js.map +1 -1
  99. package/dist/server/lib/opencodeAgentProvider.js +54 -48
  100. package/dist/server/lib/opencodeAgentProvider.js.map +1 -1
  101. package/dist/server/lib/opencodeCli.js +244 -0
  102. package/dist/server/lib/opencodeCli.js.map +1 -0
  103. package/dist/server/lib/opencodePromptOutput.js +11 -65
  104. package/dist/server/lib/opencodePromptOutput.js.map +1 -1
  105. package/dist/server/lib/opencodeSessionOperations.js +44 -28
  106. package/dist/server/lib/opencodeSessionOperations.js.map +1 -1
  107. package/dist/server/lib/opencodeSessionProvenance.js +23 -0
  108. package/dist/server/lib/opencodeSessionProvenance.js.map +1 -0
  109. package/dist/server/lib/opencodeStream.js +263 -0
  110. package/dist/server/lib/opencodeStream.js.map +1 -0
  111. package/dist/server/lib/opencodeTaskSessions.js +3 -4
  112. package/dist/server/lib/opencodeTaskSessions.js.map +1 -1
  113. package/dist/server/lib/opencodeV2SessionOperations.js +453 -0
  114. package/dist/server/lib/opencodeV2SessionOperations.js.map +1 -0
  115. package/dist/server/lib/run.js +27 -41
  116. package/dist/server/lib/run.js.map +1 -1
  117. package/dist/server/lib/runProcessIdentity.js +10 -2
  118. package/dist/server/lib/runProcessIdentity.js.map +1 -1
  119. package/dist/server/lib/runProcesses.js +52 -19
  120. package/dist/server/lib/runProcesses.js.map +1 -1
  121. package/dist/server/lib/runServiceStop.js +62 -0
  122. package/dist/server/lib/runServiceStop.js.map +1 -0
  123. package/dist/server/lib/runServices.js +63 -4
  124. package/dist/server/lib/runServices.js.map +1 -1
  125. package/dist/server/lib/runSessionLifecycle.js +25 -0
  126. package/dist/server/lib/runSessionLifecycle.js.map +1 -1
  127. package/dist/server/lib/runtimePaths.js +7 -4
  128. package/dist/server/lib/runtimePaths.js.map +1 -1
  129. package/dist/server/lib/serviceRunLogs.js +179 -0
  130. package/dist/server/lib/serviceRunLogs.js.map +1 -0
  131. package/dist/server/lib/specOperations.js +7 -2
  132. package/dist/server/lib/specOperations.js.map +1 -1
  133. package/dist/server/lib/specReviewContext.js +3 -2
  134. package/dist/server/lib/specReviewContext.js.map +1 -1
  135. package/dist/server/lib/toolUpgrade.js +54 -5
  136. package/dist/server/lib/toolUpgrade.js.map +1 -1
  137. package/dist/server/lib/types.js.map +1 -1
  138. package/dist/server/workers/build.js +47 -9
  139. package/dist/server/workers/build.js.map +1 -1
  140. package/dist/server/workers/chat.js +74 -10
  141. package/dist/server/workers/chat.js.map +1 -1
  142. package/dist/server/workers/followUp.js +59 -22
  143. package/dist/server/workers/followUp.js.map +1 -1
  144. package/dist/server/workers/plan.js +109 -169
  145. package/dist/server/workers/plan.js.map +1 -1
  146. package/dist/server/workers/planFollowUp.js +27 -7
  147. package/dist/server/workers/planFollowUp.js.map +1 -1
  148. package/dist/server/workers/review.js +43 -10
  149. package/dist/server/workers/review.js.map +1 -1
  150. package/dist/server/workers/specReview.js +1 -0
  151. package/dist/server/workers/specReview.js.map +1 -1
  152. package/dist/server/workers/specSession.js +42 -5
  153. package/dist/server/workers/specSession.js.map +1 -1
  154. package/dist/shared/i18n/locales.js +12 -0
  155. package/dist/shared/i18n/locales.js.map +1 -0
  156. package/package.json +1 -1
  157. package/dist/client/assets/channel-DUX4Nl-Q.js +0 -1
  158. package/dist/client/assets/classDiagram-4FO5ZUOK-_vWY0Wm5.js +0 -1
  159. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Boom-t3w.js +0 -1
  160. package/dist/client/assets/index-D8_nS8Kw.js +0 -287
  161. package/dist/client/assets/index-RM0FaS4q.css +0 -2
  162. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DuYuP5AB.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"opencodeAgentProvider.js","sourceRoot":"","sources":["../../../server/lib/opencodeAgentProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencodeAgentProvider.js","sourceRoot":"","sources":["../../../server/lib/opencodeAgentProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ import { execFileSync, spawnSync } from 'child_process';
2
+ const VERSION_OUTPUT_RE = /^(?:opencode(?:\s+version)?\s+)?v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/i;
3
+ export const OPENCODE_V1_REGRESSION_BASELINE = '1.18.30';
4
+ export const OPENCODE_V2_FIXTURE_BASELINE = '2.0.7';
5
+ export const OPENCODE_RELEASE_POLICIES = [
6
+ {
7
+ major: 1,
8
+ minimum: [1, 18, 30],
9
+ maximumExclusive: [2, 0, 0],
10
+ fixtureBaseline: OPENCODE_V1_REGRESSION_BASELINE,
11
+ sessionBackend: 'sqlite-v1',
12
+ capabilities: {
13
+ jsonOutput: true,
14
+ sessionContinuation: true,
15
+ modelSelection: true,
16
+ modelVariant: 'flag',
17
+ fileAttachments: true,
18
+ agentSelection: true,
19
+ thinkingOutput: true,
20
+ standaloneServer: false,
21
+ },
22
+ },
23
+ {
24
+ major: 2,
25
+ minimum: [2, 0, 0],
26
+ maximumExclusive: [2, 1, 0],
27
+ fixtureBaseline: OPENCODE_V2_FIXTURE_BASELINE,
28
+ sessionBackend: 'service-v2',
29
+ capabilities: {
30
+ jsonOutput: true,
31
+ sessionContinuation: true,
32
+ modelSelection: true,
33
+ modelVariant: 'model-suffix',
34
+ fileAttachments: true,
35
+ agentSelection: true,
36
+ thinkingOutput: true,
37
+ standaloneServer: true,
38
+ },
39
+ },
40
+ ];
41
+ const parseSemanticVersion = (output) => {
42
+ const normalizedOutput = output.trim();
43
+ const match = VERSION_OUTPUT_RE.exec(normalizedOutput);
44
+ if (!match) {
45
+ return null;
46
+ }
47
+ const major = Number(match[1]);
48
+ const minor = Number(match[2]);
49
+ const patch = Number(match[3]);
50
+ if (![major, minor, patch].every(Number.isSafeInteger)) {
51
+ return null;
52
+ }
53
+ const prerelease = match[4] ?? null;
54
+ if (prerelease?.split('.').some(identifier => /^\d+$/.test(identifier) && identifier.length > 1 && identifier.startsWith('0'))) {
55
+ return null;
56
+ }
57
+ return {
58
+ version: `${major}.${minor}.${patch}${prerelease ? `-${prerelease}` : ''}${match[5] ? `+${match[5]}` : ''}`,
59
+ major,
60
+ minor,
61
+ patch,
62
+ prerelease,
63
+ build: match[5] ?? null,
64
+ };
65
+ };
66
+ const compareVersion = (version, boundary) => {
67
+ const parts = [version.major, version.minor, version.patch];
68
+ for (let index = 0; index < parts.length; index += 1) {
69
+ if (parts[index] !== boundary[index]) {
70
+ return parts[index] < boundary[index] ? -1 : 1;
71
+ }
72
+ }
73
+ return 0;
74
+ };
75
+ export const inspectOpencodeRelease = (output) => {
76
+ const parsed = parseSemanticVersion(output);
77
+ if (!parsed) {
78
+ return { status: 'unrecognized', reason: 'malformed-version', output: output.trim() };
79
+ }
80
+ if (parsed.prerelease) {
81
+ return {
82
+ status: 'unsupported',
83
+ reason: 'prerelease',
84
+ runtimeIdentity: { version: parsed.version, major: parsed.major },
85
+ };
86
+ }
87
+ const policy = OPENCODE_RELEASE_POLICIES.find(candidate => (compareVersion(parsed, candidate.minimum) >= 0
88
+ && compareVersion(parsed, candidate.maximumExclusive) < 0));
89
+ if (!policy) {
90
+ return {
91
+ status: 'unsupported',
92
+ reason: 'version-out-of-range',
93
+ runtimeIdentity: { version: parsed.version, major: parsed.major },
94
+ };
95
+ }
96
+ return {
97
+ status: 'supported',
98
+ runtimeIdentity: { version: parsed.version, major: policy.major },
99
+ sessionBackend: policy.sessionBackend,
100
+ capabilities: policy.capabilities,
101
+ };
102
+ };
103
+ export class OpencodeCompatibilityError extends Error {
104
+ compatibility;
105
+ constructor(compatibility) {
106
+ const observed = compatibility.status === 'unrecognized'
107
+ ? compatibility.output || 'empty output'
108
+ : compatibility.runtimeIdentity.version;
109
+ super(`OpenCode CLI release is ${compatibility.status}: ${observed}`);
110
+ this.name = 'OpencodeCompatibilityError';
111
+ this.compatibility = compatibility;
112
+ }
113
+ }
114
+ export class OpencodeCapabilityError extends Error {
115
+ capability;
116
+ runtimeIdentity;
117
+ constructor(capability, compatibility) {
118
+ super(`OpenCode ${compatibility.runtimeIdentity.version} does not support the required ${capability} capability`);
119
+ this.name = 'OpencodeCapabilityError';
120
+ this.capability = capability;
121
+ this.runtimeIdentity = compatibility.runtimeIdentity;
122
+ }
123
+ }
124
+ const defaultReleaseProbe = () => execFileSync('opencode', ['--version'], {
125
+ encoding: 'utf8',
126
+ stdio: ['ignore', 'pipe', 'pipe'],
127
+ timeout: 5_000,
128
+ windowsHide: true,
129
+ });
130
+ const defaultCapabilityProbe = () => {
131
+ const result = spawnSync('opencode', ['run', '--help'], {
132
+ encoding: 'utf8',
133
+ timeout: 5_000,
134
+ windowsHide: true,
135
+ });
136
+ if (result.error) {
137
+ throw result.error;
138
+ }
139
+ if (result.status !== 0) {
140
+ throw new Error(result.stderr.trim() || `OpenCode run help exited with code ${String(result.status)}`);
141
+ }
142
+ return `${result.stdout}\n${result.stderr}`;
143
+ };
144
+ export const inspectOpencodeCliFeatureSurface = (compatibility, output) => {
145
+ const hasFlag = (flag) => new RegExp(`(?:^|\\s)${flag.replace('-', '\\-')}(?:[=\\s,]|$)`, 'm').test(output);
146
+ const capabilities = {
147
+ ...compatibility.capabilities,
148
+ jsonOutput: hasFlag('--format'),
149
+ sessionContinuation: hasFlag('--session'),
150
+ modelSelection: hasFlag('--model'),
151
+ modelVariant: compatibility.capabilities.modelVariant === 'flag'
152
+ ? hasFlag('--variant') ? 'flag' : false
153
+ : hasFlag('--model') ? 'model-suffix' : false,
154
+ fileAttachments: hasFlag('--file'),
155
+ agentSelection: hasFlag('--agent'),
156
+ thinkingOutput: hasFlag('--thinking'),
157
+ };
158
+ return { ...compatibility, capabilities };
159
+ };
160
+ let cachedCompatibility = null;
161
+ export const getOpencodeCliCompatibility = ({ force = false, probe = defaultReleaseProbe, capabilityProbe, } = {}) => {
162
+ if (!force && cachedCompatibility) {
163
+ return cachedCompatibility;
164
+ }
165
+ try {
166
+ const release = inspectOpencodeRelease(probe());
167
+ const resolvedCapabilityProbe = capabilityProbe ?? (probe === defaultReleaseProbe ? defaultCapabilityProbe : null);
168
+ cachedCompatibility = release.status === 'supported' && resolvedCapabilityProbe
169
+ ? inspectOpencodeCliFeatureSurface(release, resolvedCapabilityProbe())
170
+ : release;
171
+ }
172
+ catch (error) {
173
+ cachedCompatibility = {
174
+ status: 'unrecognized',
175
+ reason: 'inspection-failed',
176
+ output: error instanceof Error ? error.message : String(error),
177
+ };
178
+ }
179
+ return cachedCompatibility;
180
+ };
181
+ export const invalidateOpencodeCliCapabilityCache = () => {
182
+ cachedCompatibility = null;
183
+ };
184
+ export const requireSupportedOpencodeCompatibility = (compatibility) => {
185
+ if (compatibility.status !== 'supported') {
186
+ throw new OpencodeCompatibilityError(compatibility);
187
+ }
188
+ return compatibility;
189
+ };
190
+ const resolveOption = (value) => (typeof value === 'string' && value.trim() !== '' ? value.trim() : null);
191
+ const requireCapability = (compatibility, capability) => {
192
+ if (!compatibility.capabilities[capability]) {
193
+ throw new OpencodeCapabilityError(capability, compatibility);
194
+ }
195
+ };
196
+ export const buildOpencodeRunInvocation = (compatibility, { prompt, agent, format = 'json', thinking = false, sessionId, model, variant, files = [], }) => {
197
+ const resolvedAgent = resolveOption(agent);
198
+ const resolvedSessionId = resolveOption(sessionId);
199
+ const resolvedModel = resolveOption(model);
200
+ const resolvedVariant = resolveOption(variant);
201
+ requireCapability(compatibility, 'jsonOutput');
202
+ if (resolvedAgent) {
203
+ requireCapability(compatibility, 'agentSelection');
204
+ }
205
+ if (thinking) {
206
+ requireCapability(compatibility, 'thinkingOutput');
207
+ }
208
+ if (resolvedSessionId) {
209
+ requireCapability(compatibility, 'sessionContinuation');
210
+ }
211
+ if (resolvedModel) {
212
+ requireCapability(compatibility, 'modelSelection');
213
+ }
214
+ if (resolvedVariant && !compatibility.capabilities.modelVariant) {
215
+ throw new OpencodeCapabilityError('modelVariant', compatibility);
216
+ }
217
+ if (resolvedVariant && compatibility.capabilities.modelVariant === 'model-suffix' && !resolvedModel) {
218
+ throw new OpencodeCapabilityError('modelVariantRequiresModel', compatibility);
219
+ }
220
+ if (files.length > 0) {
221
+ requireCapability(compatibility, 'fileAttachments');
222
+ }
223
+ const resolvedModelArgument = resolvedModel && resolvedVariant && compatibility.capabilities.modelVariant === 'model-suffix'
224
+ ? `${resolvedModel.replace(/#.*$/, '')}#${resolvedVariant}`
225
+ : resolvedModel;
226
+ return {
227
+ command: 'opencode',
228
+ args: [
229
+ 'run',
230
+ ...(resolvedAgent ? ['--agent', resolvedAgent] : []),
231
+ '--format',
232
+ format,
233
+ ...(thinking ? ['--thinking'] : []),
234
+ ...(resolvedSessionId ? ['--session', resolvedSessionId] : []),
235
+ ...(resolvedModelArgument ? ['--model', resolvedModelArgument] : []),
236
+ ...(resolvedVariant && compatibility.capabilities.modelVariant === 'flag' ? ['--variant', resolvedVariant] : []),
237
+ ...files.flatMap(filePath => ['--file', filePath]),
238
+ ...(files.length > 0 ? ['--'] : []),
239
+ prompt,
240
+ ],
241
+ stdio: ['ignore', 'pipe', 'pipe'],
242
+ };
243
+ };
244
+ //# sourceMappingURL=opencodeCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodeCli.js","sourceRoot":"","sources":["../../../server/lib/opencodeCli.ts"],"names":[],"mappings":"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"}
@@ -1,57 +1,7 @@
1
1
  import { parseOpencodeError } from './opencodeErrors.js';
2
+ import { parseOpencodeStreamLine } from './opencodeStream.js';
3
+ export { extractLeadingOpencodeJsonObjects } from './opencodeStream.js';
2
4
  const stripSystemReminderBlocks = (output) => (output.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, '').trim());
3
- export const extractLeadingOpencodeJsonObjects = (value) => {
4
- const jsonObjects = [];
5
- let remaining = value.trim();
6
- while (remaining.startsWith('{')) {
7
- let depth = 0;
8
- let inString = false;
9
- let escaping = false;
10
- let endIndex = -1;
11
- for (let index = 0; index < remaining.length; index += 1) {
12
- const char = remaining[index];
13
- if (inString) {
14
- if (escaping) {
15
- escaping = false;
16
- }
17
- else if (char === '\\') {
18
- escaping = true;
19
- }
20
- else if (char === '"') {
21
- inString = false;
22
- }
23
- continue;
24
- }
25
- if (char === '"') {
26
- inString = true;
27
- }
28
- else if (char === '{') {
29
- depth += 1;
30
- }
31
- else if (char === '}') {
32
- depth -= 1;
33
- if (depth === 0) {
34
- endIndex = index + 1;
35
- break;
36
- }
37
- }
38
- }
39
- if (endIndex < 0) {
40
- break;
41
- }
42
- jsonObjects.push(remaining.slice(0, endIndex));
43
- remaining = remaining.slice(endIndex).trim();
44
- }
45
- return { jsonObjects, remainder: remaining };
46
- };
47
- const parseEvent = (jsonObject) => {
48
- try {
49
- return JSON.parse(jsonObject);
50
- }
51
- catch {
52
- return null;
53
- }
54
- };
55
5
  export const extractOpencodePromptOutput = (rawOutput) => {
56
6
  const trimmedOutput = rawOutput.trim();
57
7
  if (!trimmedOutput) {
@@ -65,32 +15,28 @@ export const extractOpencodePromptOutput = (rawOutput) => {
65
15
  let latestError = null;
66
16
  let latestRecoveryEvent = null;
67
17
  for (const line of trimmedOutput.split('\n')) {
68
- const { jsonObjects } = extractLeadingOpencodeJsonObjects(line);
69
- if (jsonObjects.length === 0) {
18
+ const parsedLine = parseOpencodeStreamLine(line);
19
+ if (!parsedLine.structured) {
70
20
  continue;
71
21
  }
72
22
  sawStructuredOutput = true;
73
- for (const jsonObject of jsonObjects) {
74
- const event = parseEvent(jsonObject);
75
- if (!event) {
76
- continue;
77
- }
23
+ for (const event of parsedLine.events) {
78
24
  if (event.type === 'error') {
79
25
  sawError = true;
80
- latestError = parseOpencodeError(event.error, event.part?.text);
26
+ latestError = parseOpencodeError(event.error, event.fallbackText ?? undefined);
81
27
  latestRecoveryEvent = 'error';
82
28
  recoveredParts.length = 0;
83
29
  continue;
84
30
  }
85
- if (event.type !== 'text' || event.part?.type !== 'text' || !event.part.text) {
31
+ if (event.type !== 'text' || !event.text) {
86
32
  continue;
87
33
  }
88
- textParts.push(event.part.text);
89
- if (event.part.metadata?.openai?.phase === 'final_answer') {
90
- finalParts.push(event.part.text);
34
+ textParts.push(event.text);
35
+ if (!event.metadata.phase || event.metadata.phase === 'final_answer') {
36
+ finalParts.push(event.text);
91
37
  latestRecoveryEvent = 'final_answer';
92
38
  if (sawError) {
93
- recoveredParts.push(event.part.text);
39
+ recoveredParts.push(event.text);
94
40
  }
95
41
  }
96
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"opencodePromptOutput.js","sourceRoot":"","sources":["../../../server/lib/opencodePromptOutput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencodePromptOutput.js","sourceRoot":"","sources":["../../../server/lib/opencodePromptOutput.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,16 @@
1
1
  import Database from 'better-sqlite3';
2
2
  import { resolveOpencodeDbPath } from './runtimePaths.js';
3
+ export const createDeferredOpencodeSessionOperations = (resolve) => ({
4
+ supportsTaskSessions: async () => (await resolve()).supportsTaskSessions(),
5
+ findSessionById: async (sessionId) => (await resolve()).findSessionById(sessionId),
6
+ findLatestSessionAfter: async (createdAfter, scope) => ((await resolve()).findLatestSessionAfter(createdAfter, scope)),
7
+ findParentSessionSince: async (createdSince, scope) => ((await resolve()).findParentSessionSince(createdSince, scope)),
8
+ hasCompletedAssistantSince: async (sessionId, createdSince) => ((await resolve()).hasCompletedAssistantSince(sessionId, createdSince)),
9
+ readUsageSnapshot: async (sessionId, createdSince) => ((await resolve()).readUsageSnapshot(sessionId, createdSince)),
10
+ listTaskInvocations: async (parentSessionId, createdSince) => ((await resolve()).listTaskInvocations(parentSessionId, createdSince)),
11
+ listChildSessions: async (parentSessionId, createdSince, scope) => ((await resolve()).listChildSessions(parentSessionId, createdSince, scope)),
12
+ listSessionParts: async (sessionId, createdSince) => ((await resolve()).listSessionParts(sessionId, createdSince)),
13
+ });
3
14
  export const EMPTY_OPENCODE_USAGE_SNAPSHOT = {
4
15
  usage_snapshot_context_window: null,
5
16
  usage_snapshot_max_output_tokens: null,
@@ -160,19 +171,25 @@ export const parseOpencodeTaskEnvelope = (value) => {
160
171
  if (!value) {
161
172
  return null;
162
173
  }
163
- const taskStart = value.match(/<task\b([^>]*)>/i);
164
- if (!taskStart) {
174
+ const envelopeStart = value.match(/<(task|subagent)\b([^>]*)>/i);
175
+ if (!envelopeStart) {
165
176
  return null;
166
177
  }
167
- const attributes = taskStart[1] ?? '';
168
- const childSessionId = attributes.match(/\bid=["']([^"']+)["']/i)?.[1]?.trim() || null;
178
+ const envelopeType = envelopeStart[1]?.toLowerCase();
179
+ const attributes = envelopeStart[2] ?? '';
180
+ const childSessionId = attributes.match(/\b(?:id|sessionID)=["']([^"']+)["']/i)?.[1]?.trim() || null;
169
181
  const state = attributes.match(/\bstate=["']([^"']+)["']/i)?.[1]?.trim() || null;
170
- const taskContent = value.slice((taskStart.index ?? 0) + taskStart[0].length);
171
- const resultStart = taskContent.match(/<task_result>/i);
182
+ const envelopeContent = value.slice((envelopeStart.index ?? 0) + envelopeStart[0].length);
183
+ if (envelopeType === 'subagent') {
184
+ const resultEndIndex = envelopeContent.search(/<\/subagent>/i);
185
+ const result = (resultEndIndex >= 0 ? envelopeContent.slice(0, resultEndIndex) : envelopeContent).trim() || null;
186
+ return { childSessionId, state, result };
187
+ }
188
+ const resultStart = envelopeContent.match(/<task_result>/i);
172
189
  if (!resultStart) {
173
190
  return { childSessionId, state, result: null };
174
191
  }
175
- const resultContent = taskContent.slice((resultStart.index ?? 0) + resultStart[0].length);
192
+ const resultContent = envelopeContent.slice((resultStart.index ?? 0) + resultStart[0].length);
176
193
  const resultEndIndex = resultContent.search(/<\/task_result>|<\/task>/i);
177
194
  const result = (resultEndIndex >= 0 ? resultContent.slice(0, resultEndIndex) : resultContent).trim() || null;
178
195
  return { childSessionId, state, result };
@@ -223,23 +240,20 @@ export const createQueryOpencodeSessionOperations = (queryRows) => {
223
240
  return hasColumns(columns, ['id', 'session_id', 'time_created', 'data']);
224
241
  }),
225
242
  findSessionById: sessionId => bestEffort(null, () => findSession(`WHERE id = ${sqlString(sessionId)}`)),
226
- findLatestSessionAfter: (createdAfter, directory) => bestEffort(null, async () => {
243
+ findLatestSessionAfter: (createdAfter, scope) => bestEffort(null, async () => {
227
244
  const columns = await getColumnsForTable('session');
228
- if (!hasColumns(columns, ['id', 'time_created'])) {
245
+ if (!hasColumns(columns, ['id', 'time_created', 'directory']) || !scope.directory) {
229
246
  return null;
230
247
  }
231
- const directoryFilter = directory && columns.has('directory')
232
- ? ` AND directory = ${sqlString(directory)}`
233
- : '';
234
- return findSession(`WHERE time_created > ${sqlNumber(createdAfter)}${directoryFilter} ORDER BY time_created DESC`);
248
+ return findSession(`WHERE time_created > ${sqlNumber(createdAfter)} AND directory = ${sqlString(scope.directory)} ORDER BY time_created DESC, id DESC`);
235
249
  }),
236
- findParentSessionSince: createdSince => bestEffort(null, async () => {
250
+ findParentSessionSince: (createdSince, scope) => bestEffort(null, async () => {
237
251
  const columns = await getColumnsForTable('session');
238
- if (!hasColumns(columns, ['id', 'time_created'])) {
252
+ if (!hasColumns(columns, ['id', 'time_created', 'directory']) || !scope.directory) {
239
253
  return null;
240
254
  }
241
255
  const parentFilter = columns.has('parent_id') ? 'AND parent_id IS NULL' : '';
242
- const [row] = await queryRows(`SELECT id FROM session WHERE time_created >= ${sqlNumber(createdSince)} ${parentFilter} ORDER BY time_created ASC LIMIT 1`);
256
+ const [row] = await queryRows(`SELECT id FROM session WHERE time_created >= ${sqlNumber(createdSince)} AND directory = ${sqlString(scope.directory)} ${parentFilter} ORDER BY time_created ASC, id ASC LIMIT 1`);
243
257
  return getString(row?.id);
244
258
  }),
245
259
  hasCompletedAssistantSince: (sessionId, createdSince) => bestEffort(false, async () => {
@@ -347,7 +361,13 @@ export const createQueryOpencodeSessionOperations = (queryRows) => {
347
361
  };
348
362
  };
349
363
  export const createHostOpencodeSessionOperations = (options = {}) => {
350
- const openDatabase = options.openDatabase ?? (() => new Database(resolveOpencodeDbPath(), { readonly: true }));
364
+ const openDatabase = options.openDatabase ?? (() => {
365
+ const databasePath = resolveOpencodeDbPath({ runtimeMajor: 1 });
366
+ if (!databasePath) {
367
+ throw new Error('OpenCode v1 session database path is unavailable');
368
+ }
369
+ return new Database(databasePath, { readonly: true });
370
+ });
351
371
  const closeDatabase = options.closeDatabase ?? true;
352
372
  const columnsByTable = new Map();
353
373
  const getCachedColumns = (database, table) => {
@@ -400,28 +420,24 @@ export const createHostOpencodeSessionOperations = (options = {}) => {
400
420
  return hasColumns(columns, ['id', 'session_id', 'time_created', 'data']);
401
421
  }),
402
422
  findSessionById: async (sessionId) => findSession('SELECT id, {title} FROM session WHERE id = ? LIMIT 1', sessionId),
403
- // Compatibility limitation: concurrent runs can still make this select another run's newest session.
404
- findLatestSessionAfter: async (createdAfter, directory) => withDatabase(null, database => {
423
+ findLatestSessionAfter: async (createdAfter, scope) => withDatabase(null, database => {
405
424
  const columns = getCachedColumns(database, 'session');
406
- if (!hasColumns(columns, ['id', 'time_created'])) {
425
+ if (!hasColumns(columns, ['id', 'time_created', 'directory']) || !scope.directory) {
407
426
  return null;
408
427
  }
409
428
  const title = columns.has('title') ? 'title' : 'NULL AS title';
410
- const directoryFilter = directory && columns.has('directory') ? ' AND directory = ?' : '';
411
- const query = `SELECT id, ${title} FROM session WHERE time_created > ?${directoryFilter} ORDER BY time_created DESC LIMIT 1`;
412
- const row = directoryFilter
413
- ? database.prepare(query).get(createdAfter, directory)
414
- : database.prepare(query).get(createdAfter);
429
+ const query = `SELECT id, ${title} FROM session WHERE time_created > ? AND directory = ? ORDER BY time_created DESC, id DESC LIMIT 1`;
430
+ const row = database.prepare(query).get(createdAfter, scope.directory);
415
431
  return normalizeSession(row);
416
432
  }),
417
- findParentSessionSince: async (createdSince) => withDatabase(null, database => {
433
+ findParentSessionSince: async (createdSince, scope) => withDatabase(null, database => {
418
434
  const columns = getCachedColumns(database, 'session');
419
- if (!hasColumns(columns, ['id', 'time_created'])) {
435
+ if (!hasColumns(columns, ['id', 'time_created', 'directory']) || !scope.directory) {
420
436
  return null;
421
437
  }
422
438
  const title = columns.has('title') ? 'title' : 'NULL AS title';
423
439
  const parentFilter = columns.has('parent_id') ? 'AND parent_id IS NULL' : '';
424
- const row = database.prepare(`SELECT id, ${title}, time_created FROM session WHERE time_created >= ? ${parentFilter} ORDER BY time_created ASC LIMIT 1`).get(createdSince);
440
+ const row = database.prepare(`SELECT id, ${title}, time_created FROM session WHERE time_created >= ? AND directory = ? ${parentFilter} ORDER BY time_created ASC, id ASC LIMIT 1`).get(createdSince, scope.directory);
425
441
  return getString(row?.id);
426
442
  }),
427
443
  hasCompletedAssistantSince: async (sessionId, createdSince) => withDatabase(false, database => {