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,557 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // opencodeSdkProvider -- long-running OpenCode session via @opencode-ai/sdk.
4
+ //
5
+ // Uses createOpencode() to start the OpenCode server in-process and keeps it
6
+ // alive per workspace root. Each task calls session.promptAsync() and
7
+ // iterates the global event stream to collect streaming output, completing
8
+ // when session.idle fires for the active session.
9
+ //
10
+ // No terminal is spawned -- all I/O goes through the extension-host process.
11
+ // Mirrors the claude-tui provider pattern.
12
+ // ---------------------------------------------------------------------------
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.isOpencodeSdkBusy = isOpencodeSdkBusy;
48
+ exports.getOpencodeSdkActivity = getOpencodeSdkActivity;
49
+ exports.getOpencodeSdkLatestSessionId = getOpencodeSdkLatestSessionId;
50
+ exports.sendOpencodeSdkPrompt = sendOpencodeSdkPrompt;
51
+ exports.runOpencodeSdkCompact = runOpencodeSdkCompact;
52
+ exports.closeOpencodeSdkClient = closeOpencodeSdkClient;
53
+ exports.forceIdleOpencodeSdk = forceIdleOpencodeSdk;
54
+ exports.closeAllOpencodeSdkClients = closeAllOpencodeSdkClients;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ const net = __importStar(require("net"));
58
+ const url_1 = require("url");
59
+ const hookEventNormalizer_1 = require("../hookEventNormalizer");
60
+ const _state = new Map();
61
+ const _latestSessionIds = new Map();
62
+ /** Latest log function per root — updated every dispatch so the background logger always writes to the active channel. */
63
+ const _loggers = new Map();
64
+ /** Current tool activity per root — set from tool.execute.before events, cleared on idle. */
65
+ const _activity = new Map();
66
+ /** Roots that currently have an opencode-sdk turn actively running. */
67
+ const _busyRoots = new Set();
68
+ /** True while an opencode-sdk turn is running for the given workspace root. */
69
+ function isOpencodeSdkBusy(root) {
70
+ return _busyRoots.has(root);
71
+ }
72
+ /** Current tool activity label for the given root (undefined = idle). */
73
+ function getOpencodeSdkActivity(root) {
74
+ return _activity.get(root);
75
+ }
76
+ function getOpencodeSdkLatestSessionId(root) {
77
+ return _latestSessionIds.get(root) ?? _state.get(root)?.sessionId;
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Lazy SDK loader — uses dynamic import() so esbuild resolves the ESM-only
81
+ // package using its "import" export condition at bundle time.
82
+ // ---------------------------------------------------------------------------
83
+ let _sdkCache = null;
84
+ // Walk up from __dirname to find @opencode-ai/sdk/dist/index.js.
85
+ // We import by absolute path to bypass the exports map resolution entirely —
86
+ // bare specifier import('@opencode-ai/sdk') uses CJS resolution in a CJS bundle
87
+ // and fails because the package only defines an "import" condition (no "require").
88
+ function _findSdkEntryPath() {
89
+ let dir = __dirname;
90
+ // eslint-disable-next-line no-constant-condition
91
+ while (true) {
92
+ const candidate = path.join(dir, 'node_modules', '@opencode-ai', 'sdk', 'dist', 'index.js');
93
+ if (fs.existsSync(candidate)) {
94
+ return candidate;
95
+ }
96
+ const parent = path.dirname(dir);
97
+ if (parent === dir) {
98
+ throw new Error('@opencode-ai/sdk not found in any node_modules above ' + __dirname);
99
+ }
100
+ dir = parent;
101
+ }
102
+ }
103
+ // Use new Function() to prevent esbuild from transforming import(path) to require(path).
104
+ // require() cannot load ESM files; a native ESM import() is required.
105
+ const _dynamicImport = new Function('p', 'return import(p)');
106
+ async function _getSdk() {
107
+ if (!_sdkCache) {
108
+ const sdkPath = _findSdkEntryPath();
109
+ // pathToFileURL handles Windows drive-letter paths (e.g. H:\...) which
110
+ // Node's ESM loader rejects as unknown URL schemes unless converted to file://
111
+ const sdkUrl = (0, url_1.pathToFileURL)(sdkPath).href;
112
+ _sdkCache = (await _dynamicImport(sdkUrl));
113
+ }
114
+ return _sdkCache;
115
+ }
116
+ // ---------------------------------------------------------------------------
117
+ // Free-port finder — tries ports starting at BASE_PORT, increments until one
118
+ // is not bound, so multiple VS Code instances on the same machine each get
119
+ // their own port.
120
+ // ---------------------------------------------------------------------------
121
+ const BASE_PORT = 4096;
122
+ const MAX_PORT = 4200;
123
+ function isFree(port) {
124
+ return new Promise(resolve => {
125
+ const srv = net.createServer();
126
+ srv.once('error', () => resolve(false));
127
+ srv.once('listening', () => { srv.close(() => resolve(true)); });
128
+ srv.listen(port, '127.0.0.1');
129
+ });
130
+ }
131
+ async function findFreePort() {
132
+ for (let p = BASE_PORT; p <= MAX_PORT; p++) {
133
+ if (await isFree(p)) {
134
+ return p;
135
+ }
136
+ }
137
+ return 0; // let the OS pick if everything in range is busy
138
+ }
139
+ /** Returns the cached state for this root, or starts a fresh server + session. */
140
+ async function getOrCreate(root, resumeSessionId, log) {
141
+ const existing = _state.get(root);
142
+ if (existing) {
143
+ _loggers.set(root, log); // refresh in case output channel changed
144
+ log(`OpenCode SDK: reusing live session (session=${existing.sessionId})`);
145
+ return existing;
146
+ }
147
+ log('OpenCode SDK: starting server…');
148
+ const sdk = await _getSdk();
149
+ const port = await findFreePort();
150
+ log(`OpenCode SDK: using port ${port}`);
151
+ const { client, server } = await sdk.createOpencode(port ? { port } : {});
152
+ log(`OpenCode SDK: server ready at ${server.url}`);
153
+ let sessionId;
154
+ if (resumeSessionId) {
155
+ sessionId = resumeSessionId;
156
+ log(`OpenCode SDK: resuming session ${sessionId}`);
157
+ }
158
+ else {
159
+ const res = await client.session.create({ query: { directory: root } });
160
+ sessionId = res.data.id;
161
+ log(`OpenCode SDK: created session ${sessionId}`);
162
+ }
163
+ const st = { client, server, sessionId };
164
+ _state.set(root, st);
165
+ _latestSessionIds.set(root, sessionId);
166
+ // Start the persistent background event logger for this root.
167
+ void _startEventLogger(root, client);
168
+ return st;
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Background event logger — one persistent SSE connection per workspace root.
172
+ // Logs all events (except message.part.updated which is streamed as text)
173
+ // to the VS Code output channel via the stored logger for that root.
174
+ // ---------------------------------------------------------------------------
175
+ // Noisy / high-frequency / no-payload events that are NOT forwarded to
176
+ // pixel-office. Mirrors the skip set of the opencode-cli hooks plugin so the
177
+ // SDK and CLI provider emit the same event stream. `message.part.delta` is
178
+ // handled explicitly below (buffered into assistant text), not skipped here.
179
+ const _SKIP_LOG = new Set([
180
+ 'message.part.updated', 'message.part.removed', 'message.updated', 'message.removed',
181
+ 'session.diff', 'sync', 'server.heartbeat',
182
+ 'session.next.step.started', 'session.next.reasoning.started', 'session.next.text.started',
183
+ 'session.next.tool.input.started', 'session.next.tool.input.ended',
184
+ 'session.next.tool.called', 'session.next.tool.success',
185
+ ]);
186
+ /** Accumulated assistant text per root — flushed to the output channel on session.idle. */
187
+ const _textBuffer = new Map();
188
+ // ---------------------------------------------------------------------------
189
+ // JSONL sink — normalizes raw SDK events to the unified hook schema and
190
+ // appends them to <root>/.autodev/hooks-events.jsonl for the WS poller.
191
+ // ---------------------------------------------------------------------------
192
+ function _appendHookEvent(root, rawEv) {
193
+ try {
194
+ const normalized = (0, hookEventNormalizer_1.normalizeEvent)('opencode-sdk', rawEv);
195
+ if (!normalized) {
196
+ return;
197
+ }
198
+ const dir = path.join(root, '.autodev');
199
+ if (!fs.existsSync(dir)) {
200
+ fs.mkdirSync(dir, { recursive: true });
201
+ }
202
+ fs.appendFileSync(path.join(dir, 'hooks-events.jsonl'), JSON.stringify(normalized) + '\n', 'utf8');
203
+ }
204
+ catch { /* ignore write errors — non-critical */ }
205
+ }
206
+ async function _startEventLogger(root, client) {
207
+ try {
208
+ const evResult = await client.global.event();
209
+ for await (const raw of evResult.stream) {
210
+ // Stop if this client is no longer the active one (eviction / close).
211
+ if (_state.get(root)?.client !== client) {
212
+ break;
213
+ }
214
+ const logger = _loggers.get(root);
215
+ if (!logger) {
216
+ break;
217
+ }
218
+ const ev = raw;
219
+ const payload = (ev?.payload ?? ev);
220
+ const type = payload?.type;
221
+ const props = payload?.properties;
222
+ if (!type || _SKIP_LOG.has(type)) {
223
+ continue;
224
+ }
225
+ // --- Stream text deltas into a per-root buffer ---
226
+ if (type === 'message.part.delta') {
227
+ const field = props?.field;
228
+ if (field === 'text') {
229
+ const delta = props?.delta;
230
+ if (delta) {
231
+ _textBuffer.set(root, (_textBuffer.get(root) ?? '') + delta);
232
+ }
233
+ }
234
+ continue;
235
+ }
236
+ const st = _state.get(root);
237
+ // --- Permission auto-approval ---
238
+ if (type === 'permission.updated') {
239
+ const perm = props;
240
+ const permId = perm?.id;
241
+ const permSid = perm?.sessionID;
242
+ const permTitle = perm?.title;
243
+ if (permId && permSid && st) {
244
+ logger(`[OC] permission.updated — auto-approving: ${permTitle ?? permId}`);
245
+ try {
246
+ await st.client.session.postSessionIdPermissionsPermissionId({
247
+ path: { id: permSid, permissionID: permId },
248
+ body: { response: 'always' },
249
+ });
250
+ logger(`[OC] permission approved (always): ${permTitle ?? permId}`);
251
+ }
252
+ catch (e) {
253
+ logger(`[OC] permission approval failed: ${e instanceof Error ? e.message : String(e)}`);
254
+ }
255
+ }
256
+ _appendHookEvent(root, {
257
+ type: 'permission.updated',
258
+ payload: { type: 'permission.updated', properties: { id: permId, sessionID: permSid, title: permTitle } },
259
+ });
260
+ continue; // already logged above
261
+ }
262
+ // --- Activity tracking + JSONL hook events ---
263
+ if (type === 'tool.execute.before') {
264
+ const toolName = (props?.toolID ?? props?.name ?? props?.tool);
265
+ if (toolName) {
266
+ _activity.set(root, `${toolName}`);
267
+ logger(`[OC] ▶ tool: ${toolName}`);
268
+ }
269
+ _appendHookEvent(root, { payload: { type: 'tool.execute.before', properties: props ?? {} } });
270
+ continue;
271
+ }
272
+ if (type === 'tool.execute.after') {
273
+ const toolName = (props?.toolID ?? props?.name ?? props?.tool);
274
+ _activity.delete(root);
275
+ logger(`[OC] ✓ tool done: ${toolName ?? '?'}`);
276
+ const rawOut = props?.output ?? props?.result ?? props?.text;
277
+ const outText = typeof rawOut === 'string' ? rawOut.slice(0, 400) : null;
278
+ _appendHookEvent(root, { payload: { type: 'tool.execute.after', properties: props ?? {} } });
279
+ continue;
280
+ }
281
+ // --- Session status / retry ---
282
+ if (type === 'session.status') {
283
+ const status = props;
284
+ const statusType = status?.type;
285
+ if (statusType === 'retry') {
286
+ logger(`[OC] ↻ retry (attempt ${status?.attempt ?? '?'}): ${status?.message ?? ''}`);
287
+ }
288
+ else {
289
+ logger(`[OC] session.status: ${statusType ?? JSON.stringify(status)}`);
290
+ }
291
+ _appendHookEvent(root, { payload: { type: 'session.status', properties: props ?? {} } });
292
+ continue;
293
+ }
294
+ // --- Session compacted ---
295
+ if (type === 'session.compacted') {
296
+ logger(`[OC] 🗜 session compacted`);
297
+ _appendHookEvent(root, { payload: { type: 'session.compacted', properties: props ?? {} } });
298
+ continue;
299
+ }
300
+ // --- Session idle: flush buffered assistant text + clear activity ---
301
+ // Emit session.idle EXACTLY ONCE per turn (pixel-office keys turn-end on
302
+ // it). Attach the assistant text when present so the server can render the
303
+ // full message in the same event.
304
+ if (type === 'session.idle') {
305
+ _activity.delete(root);
306
+ const text = _textBuffer.get(root);
307
+ _textBuffer.delete(root);
308
+ if (text?.trim()) {
309
+ logger(`[OC] ── Assistant ──────────────────────────`);
310
+ for (const line of text.split('\n')) {
311
+ logger(line);
312
+ }
313
+ logger(`[OC] ────────────────────────────────────────`);
314
+ }
315
+ else {
316
+ logger(`[OC] session.idle`);
317
+ }
318
+ const idleProps = text?.trim() ? { ...(props ?? {}), _assistantText: text.slice(0, 3000) } : (props ?? {});
319
+ _appendHookEvent(root, { payload: { type: 'session.idle', properties: idleProps } });
320
+ continue;
321
+ }
322
+ // --- Default: log + forward every non-noisy event to the JSONL sink so
323
+ // pixel-office receives the full event stream (parity with the opencode-cli
324
+ // hooks plugin). Previously only session.error was forwarded here, so
325
+ // lifecycle/file/message events from the SDK never reached the server. ---
326
+ const propsStr = props ? JSON.stringify(props) : '{}';
327
+ logger(`[OC] ${type} ${propsStr}`);
328
+ _appendHookEvent(root, { payload: { type, properties: props ?? {} } });
329
+ }
330
+ }
331
+ catch { /* server closed or client evicted — exit silently */ }
332
+ }
333
+ /** Kill and remove a stale server so the next call starts fresh. */
334
+ function _evictClient(root) {
335
+ const s = _state.get(root);
336
+ if (s) {
337
+ try {
338
+ s.server.close();
339
+ }
340
+ catch { /* ignore */ }
341
+ _state.delete(root);
342
+ _loggers.delete(root);
343
+ _textBuffer.delete(root);
344
+ }
345
+ }
346
+ // ---------------------------------------------------------------------------
347
+ // sendOpencodeSdkPrompt
348
+ //
349
+ // Fire-and-forget: reads the combined prompt file, dispatches it to the
350
+ // persistent SDK session, streams output to stdoutFile + log(), writes the
351
+ // exit code to exitFile once session.idle fires.
352
+ // ---------------------------------------------------------------------------
353
+ function sendOpencodeSdkPrompt(root,
354
+ /** Absolute path to the combined agent-profile + message file. */
355
+ promptFilePath, resumeSessionId, stdoutFile, exitFile, log,
356
+ /** Optional model string "providerID/modelID" */
357
+ model,
358
+ /** Optional callback invoked once to reveal the output panel to the user. */
359
+ showOutput) {
360
+ showOutput?.();
361
+ // Keep the background event logger pointed at the freshest log function.
362
+ _loggers.set(root, log);
363
+ try {
364
+ fs.writeFileSync(stdoutFile, '', 'utf8');
365
+ }
366
+ catch { /* ignore */ }
367
+ try {
368
+ fs.writeFileSync(exitFile, '', 'utf8');
369
+ }
370
+ catch { /* ignore */ }
371
+ void (async () => {
372
+ _busyRoots.add(root);
373
+ try {
374
+ const promptText = fs.readFileSync(promptFilePath, 'utf8');
375
+ const { client, sessionId } = await getOrCreate(root, resumeSessionId, log);
376
+ // Parse optional model "providerID/modelID"
377
+ let modelSpec;
378
+ if (model) {
379
+ const slash = model.indexOf('/');
380
+ if (slash > 0) {
381
+ modelSpec = { providerID: model.slice(0, slash), modelID: model.slice(slash + 1) };
382
+ }
383
+ }
384
+ log(`OpenCode SDK: sending prompt to session ${sessionId} (${promptText.length} chars)`);
385
+ // Subscribe to events BEFORE sending the prompt so we don't miss early events.
386
+ const evResult = await client.global.event();
387
+ const evStream = evResult.stream;
388
+ // Fire-and-forget prompt — response arrives via event stream.
389
+ const promptPromise = client.session.promptAsync({
390
+ path: { id: sessionId },
391
+ body: {
392
+ parts: [{ type: 'text', text: promptText }],
393
+ ...(modelSpec ? { model: modelSpec } : {}),
394
+ },
395
+ });
396
+ // Drain the event stream until session.idle for this session.
397
+ const deadline = Date.now() + 30 * 60_000; // 30-minute safety cap
398
+ let _lineBuf = '';
399
+ for await (const raw of evStream) {
400
+ if (Date.now() > deadline) {
401
+ log('OpenCode SDK: ⚠ 30-minute deadline exceeded — stopping event stream');
402
+ break;
403
+ }
404
+ // GlobalEvent shape: { directory: string; payload: Event }
405
+ const ev = raw;
406
+ const payload = (ev?.payload ?? ev);
407
+ const type = payload?.type;
408
+ const props = payload?.properties;
409
+ if (type === 'message.part.updated') {
410
+ const delta = props?.delta ?? '';
411
+ if (delta) {
412
+ try {
413
+ fs.appendFileSync(stdoutFile, delta, 'utf8');
414
+ }
415
+ catch { /* ignore */ }
416
+ _lineBuf += delta;
417
+ let nl;
418
+ while ((nl = _lineBuf.indexOf('\n')) !== -1) {
419
+ const line = _lineBuf.slice(0, nl).replace(/\r$/, '');
420
+ _lineBuf = _lineBuf.slice(nl + 1);
421
+ if (line) {
422
+ log(` ${line}`);
423
+ }
424
+ }
425
+ }
426
+ }
427
+ else if (type === 'session.idle') {
428
+ // Accept the event if its sessionID matches ours, OR if the event
429
+ // doesn't carry a sessionID at all (some SDK versions omit it on
430
+ // single-session servers — safe to assume it's ours).
431
+ const idleSid = (props?.sessionID ?? props?.id);
432
+ if (!idleSid || idleSid === sessionId) {
433
+ log('OpenCode SDK: session.idle — turn complete');
434
+ break;
435
+ }
436
+ }
437
+ else if (type === 'session.error') {
438
+ const sid = props?.sessionID;
439
+ if (!sid || sid === sessionId) {
440
+ const errObj = props?.error;
441
+ const errMsg = String(errObj?.message ?? errObj ?? 'unknown error');
442
+ log(`OpenCode SDK: session.error — ${errMsg}`);
443
+ try {
444
+ fs.appendFileSync(stdoutFile, `\n[ERROR] ${errMsg}\n`, 'utf8');
445
+ }
446
+ catch { /* ignore */ }
447
+ break;
448
+ }
449
+ }
450
+ else if (type === 'server.instance.disposed') {
451
+ // Server is shutting down — abort the wait and evict the stale client
452
+ // so the next dispatch starts a fresh server instance.
453
+ log('OpenCode SDK: server.instance.disposed — aborting wait');
454
+ _evictClient(root);
455
+ try {
456
+ fs.appendFileSync(stdoutFile, `\n[server disposed]\n`, 'utf8');
457
+ }
458
+ catch { /* ignore */ }
459
+ break;
460
+ }
461
+ }
462
+ // Flush any remaining partial line.
463
+ if (_lineBuf.trim()) {
464
+ log(` ${_lineBuf}`);
465
+ }
466
+ // Await the promptAsync call (should have resolved long ago).
467
+ try {
468
+ await promptPromise;
469
+ }
470
+ catch { /* errors surfaced via session.error event */ }
471
+ _latestSessionIds.set(root, sessionId);
472
+ log('OpenCode SDK: prompt complete');
473
+ try {
474
+ fs.writeFileSync(exitFile, '0\n', 'utf8');
475
+ }
476
+ catch { /* ignore */ }
477
+ }
478
+ catch (err) {
479
+ const msg = err instanceof Error ? err.message : String(err);
480
+ log(`OpenCode SDK: error — ${msg}`);
481
+ try {
482
+ fs.appendFileSync(stdoutFile, `\n[ERROR] ${msg}\n`, 'utf8');
483
+ }
484
+ catch { /* ignore */ }
485
+ try {
486
+ fs.writeFileSync(exitFile, '1\n', 'utf8');
487
+ }
488
+ catch { /* ignore */ }
489
+ // Evict the stale state so the next call starts fresh.
490
+ _evictClient(root);
491
+ }
492
+ finally {
493
+ _busyRoots.delete(root);
494
+ _activity.delete(root);
495
+ }
496
+ })();
497
+ }
498
+ // ---------------------------------------------------------------------------
499
+ // Compact (summarise) the active session to free context window space.
500
+ // ---------------------------------------------------------------------------
501
+ function runOpencodeSdkCompact(root, log) {
502
+ return new Promise((resolve) => {
503
+ const s = _state.get(root);
504
+ if (!s) {
505
+ resolve();
506
+ return;
507
+ }
508
+ const { client, sessionId } = s;
509
+ log(`OpenCode SDK: requesting /compact for session ${sessionId}`);
510
+ client.session.promptAsync({
511
+ path: { id: sessionId },
512
+ body: { parts: [{ type: 'text', text: '/compact' }] },
513
+ }).then(() => resolve()).catch(() => resolve());
514
+ });
515
+ }
516
+ // ---------------------------------------------------------------------------
517
+ // Shutdown — cleanly close the server when the task loop stops.
518
+ // ---------------------------------------------------------------------------
519
+ function closeOpencodeSdkClient(root, log) {
520
+ const s = _state.get(root);
521
+ if (s) {
522
+ log('OpenCode SDK: closing persistent session + server');
523
+ try {
524
+ s.server.close();
525
+ }
526
+ catch { /* ignore */ }
527
+ _state.delete(root);
528
+ _loggers.delete(root);
529
+ _activity.delete(root);
530
+ _textBuffer.delete(root);
531
+ }
532
+ }
533
+ /**
534
+ * Force-clear the busy flag for a root — used by the task loop when it detects
535
+ * via hooks-events.jsonl that the server was disposed while the SDK async was
536
+ * still running (i.e. the for-await loop never received the disposed event).
537
+ */
538
+ function forceIdleOpencodeSdk(root) {
539
+ _busyRoots.delete(root);
540
+ _activity.delete(root);
541
+ _evictClient(root);
542
+ }
543
+ /** Close all open SDK servers — called on extension deactivate to avoid orphaned processes. */
544
+ function closeAllOpencodeSdkClients() {
545
+ for (const [root, s] of _state) {
546
+ try {
547
+ s.server.close();
548
+ }
549
+ catch { /* ignore */ }
550
+ _state.delete(root);
551
+ _loggers.delete(root);
552
+ _activity.delete(root);
553
+ _textBuffer.delete(root);
554
+ _busyRoots.delete(root);
555
+ }
556
+ }
557
+ //# sourceMappingURL=opencodeSdkProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodeSdkProvider.js","sourceRoot":"","sources":["../../src/providers/opencodeSdkProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ProviderId = 'claude-cli' | 'claude-tui' | 'copilot-cli' | 'copilot-sdk' | 'opencode-cli' | 'opencode-sdk' | 'grok-tui';
2
+ export interface ProviderConfig {
3
+ label: string;
4
+ /** VS Code extension ID required for this provider (empty string for CLI providers). */
5
+ extensionId: string;
6
+ /** True for providers that run in a VS Code terminal instead of the chat UI. */
7
+ isCli?: boolean;
8
+ }
9
+ export declare const PROVIDERS: Record<ProviderId, ProviderConfig>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // AI provider definitions — CLI-only providers
4
+ // ---------------------------------------------------------------------------
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PROVIDERS = void 0;
7
+ exports.PROVIDERS = {
8
+ 'claude-cli': {
9
+ label: 'Claude CLI',
10
+ extensionId: '',
11
+ isCli: true,
12
+ },
13
+ 'claude-tui': {
14
+ label: 'Claude TUI',
15
+ extensionId: '',
16
+ isCli: true,
17
+ },
18
+ 'copilot-cli': {
19
+ label: 'Copilot CLI',
20
+ extensionId: '',
21
+ isCli: true,
22
+ },
23
+ 'copilot-sdk': {
24
+ label: 'Copilot SDK',
25
+ extensionId: '',
26
+ isCli: true,
27
+ },
28
+ 'opencode-cli': {
29
+ label: 'OpenCode CLI',
30
+ extensionId: '',
31
+ isCli: true,
32
+ },
33
+ 'opencode-sdk': {
34
+ label: 'OpenCode SDK',
35
+ extensionId: '',
36
+ isCli: true,
37
+ },
38
+ 'grok-tui': {
39
+ label: 'Grok TUI',
40
+ extensionId: '',
41
+ isCli: true,
42
+ },
43
+ };
44
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;;;AAYjE,QAAA,SAAS,GAAuC;IAC3D,YAAY,EAAE;QACZ,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,cAAc,EAAE;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,cAAc,EAAE;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;IACD,UAAU,EAAE;QACV,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI;KACZ;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare class RateLimitError extends Error {
2
+ readonly rawMessage: string;
3
+ readonly resetAt: Date | undefined;
4
+ constructor(rawMessage: string, resetAt: Date | undefined);
5
+ }
6
+ export declare class RateLimitDetector {
7
+ /** True when text contains any known rate-limit phrase. */
8
+ static matches(text: string): boolean;
9
+ /** Build a RateLimitError from text, parsing the reset time if present. */
10
+ static toError(text: string): RateLimitError;
11
+ /** Match + build in one step. Returns null when text is not a rate limit. */
12
+ static detect(text: string): RateLimitError | null;
13
+ /**
14
+ * Parse "resets 9pm (Europe/Sofia)" / "resets 8:20pm (Europe/Sofia)" into a
15
+ * UTC Date. Returns undefined when no reset clause is present or parseable.
16
+ */
17
+ static parseResetTime(text: string): Date | undefined;
18
+ }