autodev-cli 1.4.0 → 1.4.4

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 (237) hide show
  1. package/bin/autodev.js +0 -0
  2. package/out/agentBackup/archive.d.ts +44 -0
  3. package/out/agentBackup/archive.js +131 -0
  4. package/out/agentBackup/archive.js.map +1 -0
  5. package/out/agentBackup/export.d.ts +18 -0
  6. package/out/agentBackup/export.js +92 -0
  7. package/out/agentBackup/export.js.map +1 -0
  8. package/out/agentBackup/import.d.ts +21 -0
  9. package/out/agentBackup/import.js +40 -0
  10. package/out/agentBackup/import.js.map +1 -0
  11. package/out/agentBackup/index.d.ts +6 -0
  12. package/out/agentBackup/index.js +11 -0
  13. package/out/agentBackup/index.js.map +1 -0
  14. package/out/agentBackup/layout.d.ts +30 -0
  15. package/out/agentBackup/layout.js +126 -0
  16. package/out/agentBackup/layout.js.map +1 -0
  17. package/out/agentBackup/manifest.d.ts +24 -0
  18. package/out/agentBackup/manifest.js +70 -0
  19. package/out/agentBackup/manifest.js.map +1 -0
  20. package/out/agentBackup/opencodeDb.d.ts +20 -0
  21. package/out/agentBackup/opencodeDb.js +213 -0
  22. package/out/agentBackup/opencodeDb.js.map +1 -0
  23. package/out/agentBackup/sessionProviders.d.ts +35 -0
  24. package/out/agentBackup/sessionProviders.js +263 -0
  25. package/out/agentBackup/sessionProviders.js.map +1 -0
  26. package/out/agentBackup/upload.d.ts +9 -0
  27. package/out/agentBackup/upload.js +121 -0
  28. package/out/agentBackup/upload.js.map +1 -0
  29. package/out/cli.d.ts +1 -0
  30. package/out/cli.js +8 -0
  31. package/out/cli.js.map +1 -1
  32. package/out/cliExit.d.ts +34 -0
  33. package/out/cliExit.js +159 -0
  34. package/out/cliExit.js.map +1 -0
  35. package/out/commands/config.d.ts +2 -0
  36. package/out/commands/config.js +7 -7
  37. package/out/commands/config.js.map +1 -1
  38. package/out/commands/connect.d.ts +2 -0
  39. package/out/commands/connect.js +11 -0
  40. package/out/commands/connect.js.map +1 -1
  41. package/out/commands/export.d.ts +2 -0
  42. package/out/commands/export.js +79 -0
  43. package/out/commands/export.js.map +1 -0
  44. package/out/commands/import.d.ts +2 -0
  45. package/out/commands/import.js +92 -0
  46. package/out/commands/import.js.map +1 -0
  47. package/out/commands/init.d.ts +16 -0
  48. package/out/commands/init.js +9 -5
  49. package/out/commands/init.js.map +1 -1
  50. package/out/commands/resume.d.ts +2 -0
  51. package/out/commands/resume.js +65 -0
  52. package/out/commands/resume.js.map +1 -0
  53. package/out/commands/sessions.d.ts +2 -0
  54. package/out/commands/sessions.js +64 -0
  55. package/out/commands/sessions.js.map +1 -0
  56. package/out/commands/start.d.ts +2 -0
  57. package/out/commands/start.js +40 -7
  58. package/out/commands/start.js.map +1 -1
  59. package/out/commands/status.d.ts +2 -0
  60. package/out/commands/status.js +3 -3
  61. package/out/commands/status.js.map +1 -1
  62. package/out/commands/tailOutput.d.ts +12 -0
  63. package/out/commands/up.d.ts +3 -0
  64. package/out/configManager.d.ts +42 -0
  65. package/out/configManager.js +447 -0
  66. package/out/configManager.js.map +1 -0
  67. package/out/connect.d.ts +4 -0
  68. package/out/connect.js +7 -7
  69. package/out/connect.js.map +1 -1
  70. package/out/core/adapters.d.ts +34 -0
  71. package/out/core/adapters.js +84 -0
  72. package/out/core/adapters.js.map +1 -0
  73. package/out/core/commandHelpers.d.ts +12 -0
  74. package/out/core/commandHelpers.js +96 -0
  75. package/out/core/commandHelpers.js.map +1 -0
  76. package/out/core/projectMcp.d.ts +34 -0
  77. package/out/core/projectMcp.js +160 -0
  78. package/out/core/projectMcp.js.map +1 -0
  79. package/out/core/provider/BaseProvider.d.ts +14 -0
  80. package/out/core/provider/BaseProvider.js +25 -0
  81. package/out/core/provider/BaseProvider.js.map +1 -0
  82. package/out/core/provider/ProviderRegistry.d.ts +12 -0
  83. package/out/core/provider/ProviderRegistry.js +40 -0
  84. package/out/core/provider/ProviderRegistry.js.map +1 -0
  85. package/out/core/provider/contract.d.ts +62 -0
  86. package/out/core/provider/contract.js +9 -0
  87. package/out/core/provider/contract.js.map +1 -0
  88. package/out/core/provider/implementations.d.ts +54 -0
  89. package/out/core/provider/implementations.js +147 -0
  90. package/out/core/provider/implementations.js.map +1 -0
  91. package/out/core/settingsLoader.d.ts +221 -0
  92. package/out/core/settingsLoader.js +176 -0
  93. package/out/core/settingsLoader.js.map +1 -0
  94. package/out/discordGateway.d.ts +26 -0
  95. package/out/discordGateway.js +230 -0
  96. package/out/discordGateway.js.map +1 -0
  97. package/out/discordPoller.d.ts +28 -0
  98. package/out/discordPoller.js +247 -0
  99. package/out/discordPoller.js.map +1 -0
  100. package/out/dispatcher.d.ts +12 -0
  101. package/out/dispatcher.js +214 -0
  102. package/out/dispatcher.js.map +1 -0
  103. package/out/emailPoller.d.ts +42 -0
  104. package/out/emailPoller.js +221 -0
  105. package/out/emailPoller.js.map +1 -0
  106. package/out/git/gitService.d.ts +36 -0
  107. package/out/git/gitService.js +165 -0
  108. package/out/git/gitService.js.map +1 -0
  109. package/out/hookEventNormalizer.d.ts +39 -0
  110. package/out/hookEventNormalizer.js +397 -0
  111. package/out/hookEventNormalizer.js.map +1 -0
  112. package/out/hooksManager.d.ts +25 -0
  113. package/out/hooksManager.js +471 -0
  114. package/out/hooksManager.js.map +1 -0
  115. package/out/launchIde.d.ts +14 -0
  116. package/out/logger.d.ts +12 -0
  117. package/out/mcpEmailTest.d.ts +29 -0
  118. package/out/mcpEmailTest.js +245 -0
  119. package/out/mcpEmailTest.js.map +1 -0
  120. package/out/mcpInstallCheck.d.ts +23 -0
  121. package/out/mcpInstallCheck.js +219 -0
  122. package/out/mcpInstallCheck.js.map +1 -0
  123. package/out/mcpManager.d.ts +35 -0
  124. package/out/mcpManager.js +371 -0
  125. package/out/mcpManager.js.map +1 -0
  126. package/out/messageBuilder.d.ts +54 -0
  127. package/out/messageBuilder.js +373 -0
  128. package/out/messageBuilder.js.map +1 -0
  129. package/out/openCodeHooksManager.d.ts +23 -0
  130. package/out/openCodeHooksManager.js +511 -0
  131. package/out/openCodeHooksManager.js.map +1 -0
  132. package/out/periodicActions.d.ts +63 -0
  133. package/out/periodicActions.js +237 -0
  134. package/out/periodicActions.js.map +1 -0
  135. package/out/profileBuilder.d.ts +29 -0
  136. package/out/profileBuilder.js +366 -0
  137. package/out/profileBuilder.js.map +1 -0
  138. package/out/prompt.d.ts +12 -0
  139. package/out/prompt.js +18 -0
  140. package/out/prompt.js.map +1 -0
  141. package/out/protocolSections.d.ts +26 -0
  142. package/out/protocolSections.js +209 -0
  143. package/out/protocolSections.js.map +1 -0
  144. package/out/providers/claudeCliProvider.d.ts +71 -0
  145. package/out/providers/claudeCliProvider.js +425 -0
  146. package/out/providers/claudeCliProvider.js.map +1 -0
  147. package/out/providers/claudeTuiProvider.d.ts +23 -0
  148. package/out/providers/claudeTuiProvider.js +296 -0
  149. package/out/providers/claudeTuiProvider.js.map +1 -0
  150. package/out/providers/copilotCliProvider.d.ts +16 -0
  151. package/out/providers/copilotCliProvider.js +44 -0
  152. package/out/providers/copilotCliProvider.js.map +1 -0
  153. package/out/providers/copilotSdkProvider.d.ts +12 -0
  154. package/out/providers/copilotSdkProvider.js +445 -0
  155. package/out/providers/copilotSdkProvider.js.map +1 -0
  156. package/out/providers/grokTuiProvider.d.ts +14 -0
  157. package/out/providers/grokTuiProvider.js +271 -0
  158. package/out/providers/grokTuiProvider.js.map +1 -0
  159. package/out/providers/opencodeCliProvider.d.ts +29 -0
  160. package/out/providers/opencodeCliProvider.js +199 -0
  161. package/out/providers/opencodeCliProvider.js.map +1 -0
  162. package/out/providers/opencodeSdkProvider.d.ts +22 -0
  163. package/out/providers/opencodeSdkProvider.js +557 -0
  164. package/out/providers/opencodeSdkProvider.js.map +1 -0
  165. package/out/providers.d.ts +9 -0
  166. package/out/providers.js +44 -0
  167. package/out/providers.js.map +1 -0
  168. package/out/rateLimit.d.ts +18 -0
  169. package/out/rateLimit.js +90 -0
  170. package/out/rateLimit.js.map +1 -0
  171. package/out/rdp/auth.d.ts +55 -0
  172. package/out/rdp/auth.js +197 -0
  173. package/out/rdp/auth.js.map +1 -0
  174. package/out/rdp/bridge.d.ts +86 -0
  175. package/out/rdp/bridge.js +1398 -0
  176. package/out/rdp/bridge.js.map +1 -0
  177. package/out/rdp/constants.d.ts +86 -0
  178. package/out/rdp/constants.js +182 -0
  179. package/out/rdp/constants.js.map +1 -0
  180. package/out/rdp/index.d.ts +7 -0
  181. package/out/rdp/index.js +14 -0
  182. package/out/rdp/index.js.map +1 -0
  183. package/out/rdp/session.d.ts +30 -0
  184. package/out/rdp/session.js +196 -0
  185. package/out/rdp/session.js.map +1 -0
  186. package/out/rdp/types.d.ts +27 -0
  187. package/out/rdp/types.js +6 -0
  188. package/out/rdp/types.js.map +1 -0
  189. package/out/sdk/index.d.ts +22 -0
  190. package/out/sdk/index.js +81 -0
  191. package/out/sdk/index.js.map +1 -0
  192. package/out/sessionState.d.ts +54 -0
  193. package/out/sessionState.js +284 -0
  194. package/out/sessionState.js.map +1 -0
  195. package/out/sessions.d.ts +11 -0
  196. package/out/sessions.js +32 -0
  197. package/out/sessions.js.map +1 -0
  198. package/out/taskLoop.d.ts +152 -0
  199. package/out/taskLoop.js +2505 -0
  200. package/out/taskLoop.js.map +1 -0
  201. package/out/todo.d.ts +42 -0
  202. package/out/todo.js +311 -0
  203. package/out/todo.js.map +1 -0
  204. package/out/todoWriteManager.d.ts +26 -0
  205. package/out/todoWriteManager.js +44 -0
  206. package/out/todoWriteManager.js.map +1 -0
  207. package/out/vnc/auth.d.ts +52 -0
  208. package/out/vnc/auth.js +181 -0
  209. package/out/vnc/auth.js.map +1 -0
  210. package/out/vnc/bridge.d.ts +40 -0
  211. package/out/vnc/bridge.js +540 -0
  212. package/out/vnc/bridge.js.map +1 -0
  213. package/out/vnc/constants.d.ts +8 -0
  214. package/out/vnc/constants.js +34 -0
  215. package/out/vnc/constants.js.map +1 -0
  216. package/out/vnc/des.d.ts +6 -0
  217. package/out/vnc/des.js +93 -0
  218. package/out/vnc/des.js.map +1 -0
  219. package/out/vnc/index.d.ts +7 -0
  220. package/out/vnc/index.js +13 -0
  221. package/out/vnc/index.js.map +1 -0
  222. package/out/vnc/session.d.ts +18 -0
  223. package/out/vnc/session.js +193 -0
  224. package/out/vnc/session.js.map +1 -0
  225. package/out/vnc/types.d.ts +16 -0
  226. package/out/vnc/types.js +6 -0
  227. package/out/vnc/types.js.map +1 -0
  228. package/out/webSocketPoller.d.ts +95 -0
  229. package/out/webSocketPoller.js +986 -0
  230. package/out/webSocketPoller.js.map +1 -0
  231. package/out/webhook.d.ts +37 -0
  232. package/out/webhook.js +265 -0
  233. package/out/webhook.js.map +1 -0
  234. package/out/webhookPoller.d.ts +40 -0
  235. package/out/webhookPoller.js +378 -0
  236. package/out/webhookPoller.js.map +1 -0
  237. package/package.json +54 -41
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // grokTuiProvider -- Grok tasks via `grok --prompt-file` (simple CLI, no ACP).
4
+ //
5
+ // Each task spawns a FRESH grok process without -c, so there is no context
6
+ // accumulation across tasks (which previously caused auto-compaction /
7
+ // "Loop: stopping" issues).
8
+ //
9
+ // Command:
10
+ // grok -m <model> --always-approve --cwd <root> --prompt-file <file>
11
+ // --output-format streaming-json
12
+ //
13
+ // streaming-json lines are parsed; assistant text chunks are appended to
14
+ // stdoutFile. exitFile is written when the process exits.
15
+ //
16
+ // Default model: sxs-claude-opus-4-6. Override via settings.grokModel.
17
+ // ---------------------------------------------------------------------------
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.GROK_DEFAULT_MODEL = void 0;
53
+ exports.isGrokTuiBusy = isGrokTuiBusy;
54
+ exports.sendGrokTuiPrompt = sendGrokTuiPrompt;
55
+ exports.closeGrokTuiSession = closeGrokTuiSession;
56
+ exports.closeAllGrokTuiSessions = closeAllGrokTuiSessions;
57
+ exports.detectGrokTuiRateLimit = detectGrokTuiRateLimit;
58
+ const path = __importStar(require("path"));
59
+ const fs = __importStar(require("fs"));
60
+ const readline = __importStar(require("readline"));
61
+ const child_process = __importStar(require("child_process"));
62
+ const rateLimit_1 = require("../rateLimit");
63
+ // ---------------------------------------------------------------------------
64
+ // Constants
65
+ // ---------------------------------------------------------------------------
66
+ /** Default model. Override via settings.grokModel. */
67
+ exports.GROK_DEFAULT_MODEL = 'sxs-claude-opus-4-6';
68
+ /** Path to the grok binary — use env override for non-default installs. */
69
+ const GROK_BIN = process.env['GROK_BIN'] ?? (() => {
70
+ // Prefer a grok on PATH; otherwise fall back to the default install location
71
+ // (~/.grok/bin/grok) so the provider works without PATH changes.
72
+ try {
73
+ const home = require('os').homedir();
74
+ const local = require('path').join(home, '.grok', 'bin', 'grok');
75
+ if (require('fs').existsSync(local)) {
76
+ return local;
77
+ }
78
+ }
79
+ catch { /* ignore */ }
80
+ return 'grok';
81
+ })();
82
+ // ---------------------------------------------------------------------------
83
+ // Per-workspace state
84
+ // ---------------------------------------------------------------------------
85
+ /** Roots with an actively-running grok turn. */
86
+ const _busyRoots = new Set();
87
+ /** Active child processes by root — used to kill them on extension deactivate. */
88
+ const _activeChildren = new Map();
89
+ /** True while a grok turn is running for the given workspace root. */
90
+ function isGrokTuiBusy(root) {
91
+ return _busyRoots.has(root);
92
+ }
93
+ /**
94
+ * Append a REAL grok activity event to `.autodev/hooks-events.jsonl` in the
95
+ * native Claude-Code hook schema (pixel-office reads `hook_event_name`). Grok
96
+ * has no hooks mechanism, but its `--output-format streaming-json` stream
97
+ * carries tool_use / tool_result events — we translate those into PreToolUse /
98
+ * PostToolUse so pixel-office shows real per-tool activity (no synthetic
99
+ * SessionStart/End padding beyond the genuine turn boundaries).
100
+ */
101
+ function _emitGrokHook(root, hookEventName, extra = {}) {
102
+ try {
103
+ const dir = path.join(root, '.autodev');
104
+ if (!fs.existsSync(dir)) {
105
+ fs.mkdirSync(dir, { recursive: true });
106
+ }
107
+ const ev = { hook_event_name: hookEventName, provider: 'grok-tui', cwd: root, timestamp: new Date().toISOString(), ...extra };
108
+ fs.appendFileSync(path.join(dir, 'hooks-events.jsonl'), JSON.stringify(ev) + '\n', 'utf8');
109
+ }
110
+ catch { /* non-critical */ }
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // sendGrokTuiPrompt
114
+ //
115
+ // Fire-and-forget: spawns grok with --prompt-file, streams output to
116
+ // stdoutFile, writes exit code to exitFile when the process exits.
117
+ // ---------------------------------------------------------------------------
118
+ function sendGrokTuiPrompt(root,
119
+ /** Absolute path to the combined agent-profile + message file. */
120
+ promptFilePath, stdoutFile, exitFile, log, model,
121
+ /** Optional callback invoked once to reveal the output panel to the user. */
122
+ showOutput) {
123
+ showOutput?.();
124
+ const resolvedModel = model || exports.GROK_DEFAULT_MODEL;
125
+ log(`Grok: spawning (model=${resolvedModel})`);
126
+ try {
127
+ fs.writeFileSync(stdoutFile, '', 'utf8');
128
+ }
129
+ catch { /* ignore */ }
130
+ try {
131
+ fs.writeFileSync(exitFile, '', 'utf8');
132
+ }
133
+ catch { /* ignore */ }
134
+ _busyRoots.add(root);
135
+ let child;
136
+ try {
137
+ child = child_process.spawn(GROK_BIN, [
138
+ '-m', resolvedModel,
139
+ '--always-approve',
140
+ '--cwd', root,
141
+ '--prompt-file', promptFilePath,
142
+ '--output-format', 'streaming-json',
143
+ ], {
144
+ cwd: root,
145
+ stdio: ['ignore', 'pipe', 'pipe'],
146
+ env: { ...process.env },
147
+ });
148
+ _activeChildren.set(root, child);
149
+ _emitGrokHook(root, 'SessionStart', { source: 'startup' });
150
+ }
151
+ catch (spawnErr) {
152
+ const msg = spawnErr?.message ?? String(spawnErr);
153
+ log(`Grok spawn error: ${msg}`);
154
+ try {
155
+ fs.appendFileSync(stdoutFile, `\n[Grok spawn error: ${msg}]\n`, 'utf8');
156
+ }
157
+ catch { /* ignore */ }
158
+ try {
159
+ fs.writeFileSync(exitFile, '1\n', 'utf8');
160
+ }
161
+ catch { /* ignore */ }
162
+ _busyRoots.delete(root);
163
+ return;
164
+ }
165
+ // -------------------------------------------------------------------------
166
+ // Stream stdout — each line is a streaming-json object.
167
+ // -------------------------------------------------------------------------
168
+ const rl = readline.createInterface({ input: child.stdout });
169
+ // Grok's streaming-json exposes `thought`, `text`, `end` — but NOT tool
170
+ // events (tool use is hidden under --always-approve). So per-tool activity
171
+ // isn't available; we surface the real turn boundaries instead: SessionStart
172
+ // at spawn and Stop/SessionEnd on the `end` event (a genuine grok signal, not
173
+ // synthetic padding). `_endSeen` avoids a duplicate SessionEnd on close.
174
+ let _endSeen = false;
175
+ rl.on('line', (line) => {
176
+ if (!line.trim()) {
177
+ return;
178
+ }
179
+ let msg;
180
+ try {
181
+ msg = JSON.parse(line);
182
+ }
183
+ catch {
184
+ // Plain text fallback (e.g. progress lines before JSON kicks in).
185
+ try {
186
+ fs.appendFileSync(stdoutFile, line + '\n', 'utf8');
187
+ }
188
+ catch { /* ignore */ }
189
+ return;
190
+ }
191
+ const type = msg.type ?? '';
192
+ if (type === 'assistant' || type === 'text') {
193
+ // Assistant response text.
194
+ const text = msg.content ?? msg.data ?? msg.text ?? msg.message ?? '';
195
+ if (text) {
196
+ try {
197
+ fs.appendFileSync(stdoutFile, text, 'utf8');
198
+ }
199
+ catch { /* ignore */ }
200
+ const preview = text.replace(/\r?\n/g, ' ').trim().substring(0, 120);
201
+ if (preview) {
202
+ log(` ${preview}`);
203
+ }
204
+ }
205
+ }
206
+ else if (type === 'error') {
207
+ const errMsg = msg.message ?? JSON.stringify(msg);
208
+ log(`Grok error: ${errMsg}`);
209
+ try {
210
+ fs.appendFileSync(stdoutFile, `\n[Grok error: ${errMsg}]\n`, 'utf8');
211
+ }
212
+ catch { /* ignore */ }
213
+ }
214
+ else if (type === 'end') {
215
+ // Genuine turn-end from grok's stream → real session boundary.
216
+ _endSeen = true;
217
+ _emitGrokHook(root, 'Stop', {});
218
+ _emitGrokHook(root, 'SessionEnd', { reason: 'completed' });
219
+ }
220
+ // `thought` and other event types stay out of the output file.
221
+ });
222
+ child.stderr?.on('data', (chunk) => {
223
+ const text = chunk.toString('utf8').trim();
224
+ if (text) {
225
+ log(`Grok stderr: ${text}`);
226
+ }
227
+ });
228
+ child.on('close', (code) => {
229
+ rl.close();
230
+ _activeChildren.delete(root);
231
+ _busyRoots.delete(root);
232
+ const exitCode = code ?? 1;
233
+ log(`Grok: exited (code=${exitCode})`);
234
+ // Fallback SessionEnd only if grok didn't already emit an `end` event
235
+ // (abnormal exit / killed) — avoids a duplicate from the normal path.
236
+ if (!_endSeen) {
237
+ _emitGrokHook(root, exitCode === 0 ? 'Stop' : 'StopFailure', { exit_code: exitCode });
238
+ _emitGrokHook(root, 'SessionEnd', { reason: exitCode === 0 ? 'completed' : 'error' });
239
+ }
240
+ try {
241
+ fs.writeFileSync(exitFile, `${exitCode}\n`, 'utf8');
242
+ }
243
+ catch { /* ignore */ }
244
+ });
245
+ }
246
+ // ---------------------------------------------------------------------------
247
+ // closeGrokTuiSession
248
+ // Called by taskLoop reset interval — nothing to clear with stateless approach.
249
+ // ---------------------------------------------------------------------------
250
+ function closeGrokTuiSession(root, _log) {
251
+ // Stateless per-task execution: no session state to clear.
252
+ void root;
253
+ }
254
+ /** Kill all active grok processes — called on extension deactivate. */
255
+ function closeAllGrokTuiSessions() {
256
+ for (const child of _activeChildren.values()) {
257
+ try {
258
+ child.kill('SIGKILL');
259
+ }
260
+ catch { /* ignore */ }
261
+ }
262
+ _activeChildren.clear();
263
+ _busyRoots.clear();
264
+ }
265
+ // ---------------------------------------------------------------------------
266
+ // detectGrokTuiRateLimit
267
+ // ---------------------------------------------------------------------------
268
+ function detectGrokTuiRateLimit(stdoutContent) {
269
+ return rateLimit_1.RateLimitDetector.detect(stdoutContent);
270
+ }
271
+ //# sourceMappingURL=grokTuiProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grokTuiProvider.js","sourceRoot":"","sources":["../../src/providers/grokTuiProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Build the shell command string for the opencode-cli provider.
3
+ * Accepts a pre-combined file written by the dispatcher and passes it as a
4
+ * single `@file` reference so opencode reads it directly.
5
+ */
6
+ export declare function buildOpenCodeCliCommand(combinedFile: string, sessionId?: string, model?: string, sessionName?: string): string;
7
+ /**
8
+ * List all OpenCode sessions for this workspace directory (newest first, capped at 20).
9
+ * Uses `opencode session list --format json`. Returns empty array on timeout/error.
10
+ */
11
+ export declare function listOpenCodeSessions(cwd: string): Promise<Array<{
12
+ id: string;
13
+ mtime: number;
14
+ }>>;
15
+ /**
16
+ * Get the latest OpenCode session ID for this workspace directory by querying
17
+ * `opencode session list`. No tokens consumed — purely a metadata read.
18
+ *
19
+ * @param notBefore Epoch-ms timestamp — ignore sessions created before this
20
+ * time (used after "New Session" to skip the old session).
21
+ */
22
+ export declare function getLatestOpenCodeSessionId(cwd: string, log: (msg: string) => void, notBefore?: number): Promise<string | undefined>;
23
+ /**
24
+ * Run `/compact` on an existing OpenCode session to summarise conversation
25
+ * history and free up context window space. Returns a promise that resolves
26
+ * when the compact command exits (success or failure — caller decides whether
27
+ * to treat an error as fatal).
28
+ */
29
+ export declare function runOpenCodeCompact(sessionId: string, cwd: string, log: (msg: string) => void): Promise<void>;
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildOpenCodeCliCommand = buildOpenCodeCliCommand;
4
+ exports.listOpenCodeSessions = listOpenCodeSessions;
5
+ exports.getLatestOpenCodeSessionId = getLatestOpenCodeSessionId;
6
+ exports.runOpenCodeCompact = runOpenCodeCompact;
7
+ const child_process_1 = require("child_process");
8
+ const fs_1 = require("fs");
9
+ // ---------------------------------------------------------------------------
10
+ // OpenCode CLI command builder
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Build the shell command string for the opencode-cli provider.
14
+ * Accepts a pre-combined file written by the dispatcher and passes it as a
15
+ * single `@file` reference so opencode reads it directly.
16
+ */
17
+ function buildOpenCodeCliCommand(combinedFile, sessionId, model, sessionName) {
18
+ // Resume an explicit session with `-s <id>`. On a FRESH run (no session id)
19
+ // do NOT pass `-c`/`--continue`: opencode's "continue the last session" is
20
+ // global, not workspace-scoped, so on the first run it attaches to a stale or
21
+ // non-existent session and emits no output (the task never really runs). A
22
+ // bare `opencode run` starts a new session; the dispatcher then captures its
23
+ // id and resumes it with `-s` on subsequent iterations.
24
+ const session = sessionId ? ` -s ${sessionId}` : '';
25
+ const modelFlag = model ? ` --model ${JSON.stringify(model)}` : '';
26
+ // Only title a FRESH session (resuming keeps the existing title).
27
+ const titleFlag = (!sessionId && sessionName) ? ` --title ${JSON.stringify(sessionName)}` : '';
28
+ const fileRef = JSON.stringify(`@${combinedFile}`);
29
+ return `opencode run${session}${modelFlag}${titleFlag} ${fileRef}`;
30
+ }
31
+ /**
32
+ * List all OpenCode sessions for this workspace directory (newest first, capped at 20).
33
+ * Uses `opencode session list --format json`. Returns empty array on timeout/error.
34
+ */
35
+ function listOpenCodeSessions(cwd) {
36
+ return new Promise(resolve => {
37
+ let done = false;
38
+ let stdout = '';
39
+ const child = (0, child_process_1.spawn)('opencode', ['session', 'list', '-n', '20', '--format', 'json'], {
40
+ cwd,
41
+ detached: true,
42
+ stdio: ['ignore', 'pipe', 'ignore'],
43
+ });
44
+ child.unref();
45
+ const timer = setTimeout(() => {
46
+ if (done) {
47
+ return;
48
+ }
49
+ done = true;
50
+ try {
51
+ if (child.pid !== undefined) {
52
+ process.kill(-child.pid, 'SIGKILL');
53
+ }
54
+ }
55
+ catch { /* ignore */ }
56
+ resolve([]);
57
+ }, 10_000);
58
+ child.stdout?.on('data', (chunk) => { stdout += chunk.toString('utf8'); });
59
+ child.on('close', () => {
60
+ if (done) {
61
+ return;
62
+ }
63
+ done = true;
64
+ clearTimeout(timer);
65
+ try {
66
+ const raw = JSON.parse(stdout);
67
+ // Realpath-aware match (same reasoning as getLatestOpenCodeSessionId) so
68
+ // symlinked/realpath cwds don't drop every session.
69
+ const norm = (p) => {
70
+ let resolved = p;
71
+ try {
72
+ resolved = (0, fs_1.realpathSync)(p);
73
+ }
74
+ catch { /* keep lexical */ }
75
+ return resolved.toLowerCase().replace(/\\/g, '/').replace(/\/+$/, '');
76
+ };
77
+ const cwdNorm = norm(cwd);
78
+ const filtered = raw
79
+ .filter(s => norm(s.directory) === cwdNorm)
80
+ .sort((a, b) => b.updated - a.updated)
81
+ .slice(0, 20)
82
+ .map(s => ({ id: s.id, mtime: s.updated ?? s.created ?? 0 }));
83
+ resolve(filtered);
84
+ }
85
+ catch {
86
+ resolve([]);
87
+ }
88
+ });
89
+ child.on('error', () => { if (done) {
90
+ return;
91
+ } done = true; clearTimeout(timer); resolve([]); });
92
+ });
93
+ }
94
+ /**
95
+ * Get the latest OpenCode session ID for this workspace directory by querying
96
+ * `opencode session list`. No tokens consumed — purely a metadata read.
97
+ *
98
+ * @param notBefore Epoch-ms timestamp — ignore sessions created before this
99
+ * time (used after "New Session" to skip the old session).
100
+ */
101
+ function getLatestOpenCodeSessionId(cwd, log, notBefore = 0) {
102
+ return new Promise(resolve => {
103
+ let done = false;
104
+ let stdout = '';
105
+ // Use spawn with detached=true so the child gets its own process group.
106
+ // On timeout we kill the entire group (SIGKILL) to avoid leaving the
107
+ // opencode binary alive as a zombie when the shell wrapper exits.
108
+ const child = (0, child_process_1.spawn)('opencode', ['session', 'list', '-n', '10', '--format', 'json'], {
109
+ cwd,
110
+ detached: true,
111
+ stdio: ['ignore', 'pipe', 'ignore'],
112
+ });
113
+ child.unref(); // don't prevent extension host from exiting
114
+ const timer = setTimeout(() => {
115
+ if (done) {
116
+ return;
117
+ }
118
+ done = true;
119
+ try {
120
+ if (child.pid !== undefined) {
121
+ process.kill(-child.pid, 'SIGKILL');
122
+ }
123
+ }
124
+ catch { /* process may have already exited */ }
125
+ resolve(undefined);
126
+ }, 10_000);
127
+ child.stdout?.on('data', (chunk) => { stdout += chunk.toString('utf8'); });
128
+ child.on('close', () => {
129
+ if (done) {
130
+ return;
131
+ }
132
+ done = true;
133
+ clearTimeout(timer);
134
+ try {
135
+ const sessions = JSON.parse(stdout);
136
+ // Normalise a path for comparison, resolving symlinks/realpath when the
137
+ // path exists (opencode may record a realpath, e.g. /tmp → /private/tmp,
138
+ // while the loop passes the raw cwd — an exact string match then misses
139
+ // every session). Fall back to the lexical normalisation when realpath
140
+ // fails (path gone / permission).
141
+ const norm = (p) => {
142
+ let resolved = p;
143
+ try {
144
+ resolved = (0, fs_1.realpathSync)(p);
145
+ }
146
+ catch { /* keep lexical */ }
147
+ return resolved.toLowerCase().replace(/\\/g, '/').replace(/\/+$/, '');
148
+ };
149
+ const cwdNorm = norm(cwd);
150
+ const inWindow = (s) => !notBefore || (s.created ?? 0) > notBefore;
151
+ const byRecency = (a, b) => b.updated - a.updated;
152
+ // Primary: sessions whose directory resolves to this workspace.
153
+ let match = sessions.filter(s => norm(s.directory) === cwdNorm).filter(inWindow).sort(byRecency)[0];
154
+ // Fallback: a directory that is a prefix of, or contained by, this cwd
155
+ // (handles nested-root / worktree differences) — still scoped, never global.
156
+ if (!match) {
157
+ match = sessions
158
+ .filter(s => { const d = norm(s.directory); return d && (cwdNorm.startsWith(d + '/') || d.startsWith(cwdNorm + '/')); })
159
+ .filter(inWindow).sort(byRecency)[0];
160
+ }
161
+ const id = match?.id;
162
+ log(`OpenCode session list: ${id ?? 'none found for this directory'} (of ${sessions.length} total)${notBefore ? ` (notBefore=${new Date(notBefore).toISOString()})` : ''}`);
163
+ resolve(id);
164
+ }
165
+ catch {
166
+ resolve(undefined);
167
+ }
168
+ });
169
+ child.on('error', () => {
170
+ if (done) {
171
+ return;
172
+ }
173
+ done = true;
174
+ clearTimeout(timer);
175
+ resolve(undefined);
176
+ });
177
+ });
178
+ }
179
+ /**
180
+ * Run `/compact` on an existing OpenCode session to summarise conversation
181
+ * history and free up context window space. Returns a promise that resolves
182
+ * when the compact command exits (success or failure — caller decides whether
183
+ * to treat an error as fatal).
184
+ */
185
+ function runOpenCodeCompact(sessionId, cwd, log) {
186
+ return new Promise((resolve, reject) => {
187
+ const cmd = `opencode run -s ${sessionId} /compact`;
188
+ log(`OpenCode compact: ${cmd}`);
189
+ (0, child_process_1.exec)(cmd, { cwd, encoding: 'utf8', timeout: 120_000 }, (err) => {
190
+ if (err) {
191
+ reject(err);
192
+ }
193
+ else {
194
+ resolve();
195
+ }
196
+ });
197
+ });
198
+ }
199
+ //# sourceMappingURL=opencodeCliProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodeCliProvider.js","sourceRoot":"","sources":["../../src/providers/opencodeCliProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** True while an opencode-sdk turn is running for the given workspace root. */
2
+ export declare function isOpencodeSdkBusy(root: string): boolean;
3
+ /** Current tool activity label for the given root (undefined = idle). */
4
+ export declare function getOpencodeSdkActivity(root: string): string | undefined;
5
+ export declare function getOpencodeSdkLatestSessionId(root: string): string | undefined;
6
+ export declare function sendOpencodeSdkPrompt(root: string,
7
+ /** Absolute path to the combined agent-profile + message file. */
8
+ promptFilePath: string, resumeSessionId: string | undefined, stdoutFile: string, exitFile: string, log: (msg: string) => void,
9
+ /** Optional model string "providerID/modelID" */
10
+ model?: string,
11
+ /** Optional callback invoked once to reveal the output panel to the user. */
12
+ showOutput?: () => void): void;
13
+ export declare function runOpencodeSdkCompact(root: string, log: (msg: string) => void): Promise<void>;
14
+ export declare function closeOpencodeSdkClient(root: string, log: (msg: string) => void): void;
15
+ /**
16
+ * Force-clear the busy flag for a root — used by the task loop when it detects
17
+ * via hooks-events.jsonl that the server was disposed while the SDK async was
18
+ * still running (i.e. the for-await loop never received the disposed event).
19
+ */
20
+ export declare function forceIdleOpencodeSdk(root: string): void;
21
+ /** Close all open SDK servers — called on extension deactivate to avoid orphaned processes. */
22
+ export declare function closeAllOpencodeSdkClients(): void;