autodev-cli 1.4.0 → 1.4.3

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 +430 -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 +25 -0
  77. package/out/core/projectMcp.js +144 -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,214 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readClaudeOutputSince = exports.hasClaudeEndTurnSince = exports.parseClaudeStateSince = exports.getClaudeSessionCursor = exports.setClaudeSessionName = exports.findLatestClaudeSession = void 0;
37
+ exports.sendPromptToAi = sendPromptToAi;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const providers_1 = require("./providers");
41
+ const sessionState_1 = require("./sessionState");
42
+ const settingsLoader_1 = require("./core/settingsLoader");
43
+ const claudeCliProvider_1 = require("./providers/claudeCliProvider");
44
+ const copilotCliProvider_1 = require("./providers/copilotCliProvider");
45
+ const opencodeCliProvider_1 = require("./providers/opencodeCliProvider");
46
+ const openCodeHooksManager_1 = require("./openCodeHooksManager");
47
+ const commandHelpers_1 = require("./core/commandHelpers");
48
+ const ProviderRegistry_1 = require("./core/provider/ProviderRegistry");
49
+ // Re-export session helpers so taskLoop.ts imports don't need to change.
50
+ var claudeCliProvider_2 = require("./providers/claudeCliProvider");
51
+ Object.defineProperty(exports, "findLatestClaudeSession", { enumerable: true, get: function () { return claudeCliProvider_2.findLatestClaudeSession; } });
52
+ Object.defineProperty(exports, "setClaudeSessionName", { enumerable: true, get: function () { return claudeCliProvider_2.setClaudeSessionName; } });
53
+ Object.defineProperty(exports, "getClaudeSessionCursor", { enumerable: true, get: function () { return claudeCliProvider_2.getClaudeSessionCursor; } });
54
+ Object.defineProperty(exports, "parseClaudeStateSince", { enumerable: true, get: function () { return claudeCliProvider_2.parseClaudeStateSince; } });
55
+ Object.defineProperty(exports, "hasClaudeEndTurnSince", { enumerable: true, get: function () { return claudeCliProvider_2.hasClaudeEndTurnSince; } });
56
+ Object.defineProperty(exports, "readClaudeOutputSince", { enumerable: true, get: function () { return claudeCliProvider_2.readClaudeOutputSince; } });
57
+ // ---------------------------------------------------------------------------
58
+ // Helpers
59
+ // ---------------------------------------------------------------------------
60
+ function ensureProjectGitignore(root, entry) {
61
+ const gitignorePath = path.join(root, '.gitignore');
62
+ try {
63
+ let content = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, 'utf8') : '';
64
+ if (content.split('\n').map(l => l.trim()).includes(entry)) {
65
+ return;
66
+ }
67
+ if (content.length > 0 && !content.endsWith('\n')) {
68
+ content += '\n';
69
+ }
70
+ fs.writeFileSync(gitignorePath, content + `${entry}\n`, 'utf8');
71
+ }
72
+ catch { /* ignore */ }
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // opencode-cli process-start cooldown
76
+ // ---------------------------------------------------------------------------
77
+ /** Epoch-ms timestamp of the last opencode-cli process launch. */
78
+ let _lastOpenCodeCliStart = 0;
79
+ /** Minimum milliseconds between consecutive opencode-cli process starts. */
80
+ const OPENCODE_CLI_COOLDOWN_MS = 30_000;
81
+ function _sleep(ms) {
82
+ return new Promise(resolve => setTimeout(resolve, ms));
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Main dispatcher
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * Build the CLI command and dispatch it via the injected `launcher`.
89
+ * `workspaceRoot` and `launcher` are provided by the caller (VS Code extension
90
+ * passes VsProcessLauncher + workspace root; the SDK passes NodeProcessLauncher
91
+ * + cwd).
92
+ */
93
+ async function sendPromptToAi(providerId, _prompt, log, launcher, workspaceRoot, includeProfile = true, messageFilePath,
94
+ /** Called once when a claude-tui task starts — use to reveal the output channel. */
95
+ showOutput) {
96
+ const providerCfg = providers_1.PROVIDERS[providerId];
97
+ if (providerCfg.isCli) {
98
+ const root = workspaceRoot;
99
+ if (!root) {
100
+ throw new Error('No workspace root provided');
101
+ }
102
+ const agentProfileFile = path.join(root, sessionState_1.AGENT_PROFILE_FILE);
103
+ const messageFile = messageFilePath ?? path.join(root, sessionState_1.AGENT_PROFILE_FILE.replace('AGENT_PROFILE.md', 'MESSAGE.md'));
104
+ (0, sessionState_1.autodevDir)(root);
105
+ ensureProjectGitignore(root, '.autodev/');
106
+ // Sensitive config files that may contain API keys or private server definitions
107
+ for (const entry of [
108
+ '.mcp.json', 'opencode.json', '.opencode.json', 'AGENTS.md', 'CLAUDE.md',
109
+ '.claude/settings.json', '.claude/settings.local.json',
110
+ '.vscode/mcp.json', '.vscode/settings.json',
111
+ '.openai.json', '.copilot-instructions.md',
112
+ ]) {
113
+ ensureProjectGitignore(root, entry);
114
+ }
115
+ // AI-managed task/state files that should not pollute the repo
116
+ for (const entry of [
117
+ 'TODO.md', 'DONE.md', 'TASKS.md', 'NOTES.md', 'SCRATCHPAD.md', 'JOURNAL.md', 'CONTRACTS.md',
118
+ '.autodev-journal/', 'media/profile/', 'media/skills/', 'media/templates/',
119
+ 'media/AUTODEV*.md', 'media/SUBAGENT_QUICK_REF.md',
120
+ ]) {
121
+ ensureProjectGitignore(root, entry);
122
+ }
123
+ const settings = (0, settingsLoader_1.loadSettingsForRoot)(root);
124
+ // Ensure the OpenCode hooks plugin is installed for opencode providers when
125
+ // hooks are enabled. Without it, opencode emits only the synthetic
126
+ // SessionStart/SessionEnd events the dispatcher wraps around the command —
127
+ // no live tool.execute stream — so the loop's activity/staleness check
128
+ // (isOpenCodeCliActive, 90s window) reports the agent IDLE while it is still
129
+ // working. The extension installs this on activate(); the CLI never did.
130
+ // Installing it here (idempotent) covers BOTH entry points.
131
+ if ((providerId === 'opencode-cli' || providerId === 'opencode-sdk') && settings.hooksEnabled) {
132
+ try {
133
+ if (!(0, openCodeHooksManager_1.isOpenCodeHooksInstalled)(root)) {
134
+ (0, openCodeHooksManager_1.installOpenCodeHooks)(root);
135
+ log('Installed OpenCode hooks plugin (.opencode/plugins) for live activity events');
136
+ }
137
+ }
138
+ catch (err) {
139
+ log(`OpenCode hooks plugin install skipped: ${err.message}`);
140
+ }
141
+ }
142
+ const storedSessionId = settings.resumeSession ? (0, sessionState_1.getSessionId)(root, providerId) : undefined;
143
+ let resolvedSessionId = storedSessionId;
144
+ if (!resolvedSessionId && settings.resumeSession) {
145
+ if (providerId === 'claude-cli') {
146
+ resolvedSessionId = await (0, claudeCliProvider_1.probeClaudeSession)(root, log);
147
+ }
148
+ else if (providerId === 'copilot-cli') {
149
+ resolvedSessionId = await (0, copilotCliProvider_1.probeCopilotSession)(root, log);
150
+ }
151
+ else if (providerId === 'opencode-cli') {
152
+ // Use session list (filters by directory) with notBefore to skip
153
+ // sessions created before the last "New Session" clear.
154
+ const clearedAt = (0, sessionState_1.getSessionClearedAt)(root, 'opencode-cli');
155
+ resolvedSessionId = await (0, opencodeCliProvider_1.getLatestOpenCodeSessionId)(root, log, clearedAt);
156
+ }
157
+ if (resolvedSessionId) {
158
+ (0, sessionState_1.captureAndSaveSessionId)(root, providerId, resolvedSessionId);
159
+ }
160
+ }
161
+ // Allocate a fresh per-message stdout + exit file pair so back-to-back
162
+ // tasks don't overwrite each other's output. The pointer file also moves
163
+ // so subsequent reads from taskLoop transparently target this message.
164
+ const { messageId, stdoutFile, exitFile } = (0, sessionState_1.newMessageOutput)(root, providerId);
165
+ try {
166
+ fs.writeFileSync(stdoutFile, '', 'utf8');
167
+ }
168
+ catch { /* ignore */ }
169
+ try {
170
+ fs.writeFileSync(exitFile, '', 'utf8');
171
+ }
172
+ catch { /* ignore */ }
173
+ log(`Message id: ${messageId} (output: ${path.basename(stdoutFile)})`);
174
+ // Build the combined profile+message file once and assemble the immutable
175
+ // dispatch DTO. The resolved IProvider strategy decides what to do with it
176
+ // (build a shell command, or spawn in-process) — no per-provider switch.
177
+ const combinedFile = (0, commandHelpers_1.writeCombinedFile)(root, agentProfileFile, messageFile, includeProfile);
178
+ const provider = ProviderRegistry_1.providerRegistry.get(providerId);
179
+ const req = {
180
+ root, agentProfileFile, messageFile, combinedFile,
181
+ resolvedSessionId, includeProfile, settings, stdoutFile, exitFile,
182
+ };
183
+ // Enforce a minimum cooldown between consecutive opencode-cli process starts
184
+ // to avoid racing a still-disposing previous server (immediate STOP).
185
+ if (providerId === 'opencode-cli') {
186
+ const elapsed = Date.now() - _lastOpenCodeCliStart;
187
+ if (elapsed < OPENCODE_CLI_COOLDOWN_MS && _lastOpenCodeCliStart > 0) {
188
+ const wait = OPENCODE_CLI_COOLDOWN_MS - elapsed;
189
+ log(`⏳ opencode-cli cooldown: waiting ${Math.round(wait / 1000)}s before next start…`);
190
+ await _sleep(wait);
191
+ }
192
+ _lastOpenCodeCliStart = Date.now();
193
+ }
194
+ const outcome = await provider.dispatch(req, { log, launcher, showOutput });
195
+ if (outcome.command) {
196
+ // CLI provider: launch the shell command via the injected launcher.
197
+ const termName = `AutoDev: ${providerCfg.label}`;
198
+ launcher.launch(outcome.command, termName, root);
199
+ log(`Sent to ${termName}: ${outcome.command}`);
200
+ if (providerId === 'claude-cli' && !resolvedSessionId) {
201
+ const jsonlSession = (0, claudeCliProvider_1.findLatestClaudeSession)(root);
202
+ if (jsonlSession) {
203
+ (0, sessionState_1.captureAndSaveSessionId)(root, providerId, jsonlSession);
204
+ }
205
+ }
206
+ }
207
+ else {
208
+ // In-process (sdk/tui) provider: already spawned inside dispatch().
209
+ log(`${providerCfg.label}: prompt dispatched (session=${resolvedSessionId ?? 'new'})`);
210
+ }
211
+ return;
212
+ }
213
+ }
214
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface EmailPollerOptions {
2
+ host: string;
3
+ port: number;
4
+ secure: boolean;
5
+ user: string;
6
+ pass: string;
7
+ /** Empty array = allow every sender. */
8
+ allowedSenders: string[];
9
+ /** Verify TLS cert. Default true. */
10
+ rejectUnauthorized?: boolean;
11
+ }
12
+ export declare class EmailTaskPoller {
13
+ private readonly opts;
14
+ private client;
15
+ private connecting;
16
+ private polling;
17
+ private readonly allowed;
18
+ /**
19
+ * Snapshot of UNSEEN UIDs that existed when the poller first connected.
20
+ * Those messages are ignored — they were already in the inbox before the
21
+ * loop started and aren't "new tasks". Cleared after the first poll.
22
+ */
23
+ private skipUids;
24
+ /** Wall-clock time of the last successful connect — used to force a periodic
25
+ * reconnect so a long-running session doesn't sit on a half-dead socket the
26
+ * IMAP server has silently dropped. */
27
+ private connectedAt;
28
+ /** Force a fresh IMAP connection every 15 minutes regardless of state. */
29
+ private static readonly MAX_CONN_AGE_MS;
30
+ constructor(opts: EmailPollerOptions);
31
+ /**
32
+ * Connect once. Any UNSEEN message in the inbox — both pre-existing and
33
+ * future arrivals — becomes a task. The poller marks each one \Seen after
34
+ * processing so a restart never re-ingests it.
35
+ */
36
+ initialize(): Promise<void>;
37
+ pollAndAppend(todoPath: string, workspaceRoot?: string): Promise<boolean>;
38
+ dispose(): Promise<void>;
39
+ private _ensureConnected;
40
+ private _senderAllowed;
41
+ private _buildTaskFromMessage;
42
+ }
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailTaskPoller = void 0;
4
+ const imapflow_1 = require("imapflow");
5
+ const mailparser_1 = require("mailparser");
6
+ const messageBuilder_1 = require("./messageBuilder");
7
+ const todo_1 = require("./todo");
8
+ const todoWriteManager_1 = require("./todoWriteManager");
9
+ class EmailTaskPoller {
10
+ opts;
11
+ client = null;
12
+ connecting = null;
13
+ polling = false;
14
+ allowed;
15
+ /**
16
+ * Snapshot of UNSEEN UIDs that existed when the poller first connected.
17
+ * Those messages are ignored — they were already in the inbox before the
18
+ * loop started and aren't "new tasks". Cleared after the first poll.
19
+ */
20
+ skipUids = null;
21
+ /** Wall-clock time of the last successful connect — used to force a periodic
22
+ * reconnect so a long-running session doesn't sit on a half-dead socket the
23
+ * IMAP server has silently dropped. */
24
+ connectedAt = 0;
25
+ /** Force a fresh IMAP connection every 15 minutes regardless of state. */
26
+ static MAX_CONN_AGE_MS = 15 * 60 * 1000;
27
+ constructor(opts) {
28
+ this.opts = opts;
29
+ // Pre-compile each pattern to a regex — '*' acts as a wildcard.
30
+ // e.g. "agent-*@company.com" matches "agent-bot@company.com".
31
+ this.allowed = opts.allowedSenders
32
+ .map(s => s.toLowerCase().trim())
33
+ .filter(Boolean)
34
+ .map(p => new RegExp('^' + p.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*') + '$'));
35
+ }
36
+ /**
37
+ * Connect once. Any UNSEEN message in the inbox — both pre-existing and
38
+ * future arrivals — becomes a task. The poller marks each one \Seen after
39
+ * processing so a restart never re-ingests it.
40
+ */
41
+ async initialize() {
42
+ await this._ensureConnected();
43
+ }
44
+ async pollAndAppend(todoPath, workspaceRoot) {
45
+ if (!workspaceRoot)
46
+ return false;
47
+ if (this.polling)
48
+ return false; // never overlap polls
49
+ this.polling = true;
50
+ let appended = false;
51
+ try {
52
+ await this._ensureConnected();
53
+ if (!this.client)
54
+ return false;
55
+ const lock = await this.client.getMailboxLock('INBOX');
56
+ try {
57
+ // NOOP forces the server to send any pending EXISTS responses so the
58
+ // SEARCH below sees mail that arrived since the last poll.
59
+ try {
60
+ await this.client.noop();
61
+ }
62
+ catch { /* non-fatal */ }
63
+ const uids = await this.client.search({ seen: false }, { uid: true });
64
+ if (!Array.isArray(uids) || uids.length === 0)
65
+ return false;
66
+ for (const uid of uids) {
67
+ if (this.skipUids?.has(uid))
68
+ continue;
69
+ let processed = false;
70
+ try {
71
+ const msg = await this.client.fetchOne(String(uid), { envelope: true, source: true }, { uid: true });
72
+ if (!msg || !msg.source) {
73
+ // Mark seen anyway so we don't loop on it.
74
+ await this.client.messageFlagsAdd({ uid }, ['\\Seen'], { uid: true });
75
+ continue;
76
+ }
77
+ if (!this._senderAllowed(msg.envelope?.from?.[0]?.address)) {
78
+ // Don't \Seen — leave for the human user to read.
79
+ processed = true;
80
+ continue;
81
+ }
82
+ const taskText = await this._buildTaskFromMessage(msg.source, msg.envelope, workspaceRoot);
83
+ if (taskText) {
84
+ await todoWriteManager_1.todoWriter.append(todoPath, taskText, (0, todo_1.shortId)());
85
+ appended = true;
86
+ }
87
+ await this.client.messageFlagsAdd({ uid }, ['\\Seen'], { uid: true });
88
+ processed = true;
89
+ }
90
+ catch {
91
+ // Skip this UID for now; another poll may succeed. To prevent a
92
+ // hot loop on a permanently broken message, mark it \Seen.
93
+ try {
94
+ await this.client.messageFlagsAdd({ uid }, ['\\Seen'], { uid: true });
95
+ }
96
+ catch { /* ignore */ }
97
+ }
98
+ finally {
99
+ if (processed)
100
+ this.skipUids?.delete(uid);
101
+ }
102
+ }
103
+ // After the first successful poll, the snapshot has done its job.
104
+ if (this.skipUids && this.skipUids.size === 0)
105
+ this.skipUids = null;
106
+ }
107
+ finally {
108
+ lock.release();
109
+ }
110
+ }
111
+ catch {
112
+ // Drop the connection so the next poll reconnects cleanly.
113
+ try {
114
+ await this.client?.logout();
115
+ }
116
+ catch { /* ignore */ }
117
+ this.client = null;
118
+ this.connecting = null;
119
+ // Reset the skip-uid snapshot so the fresh connection takes a new one.
120
+ this.skipUids = null;
121
+ }
122
+ finally {
123
+ this.polling = false;
124
+ }
125
+ return appended;
126
+ }
127
+ async dispose() {
128
+ try {
129
+ await this.client?.logout();
130
+ }
131
+ catch { /* ignore */ }
132
+ this.client = null;
133
+ this.connecting = null;
134
+ this.skipUids = null;
135
+ }
136
+ // -------------------------------------------------------------------------
137
+ async _ensureConnected() {
138
+ // Force a periodic reconnect — IMAP servers drop idle sockets without
139
+ // warning, and `client.usable` lies until the next round-trip fails.
140
+ if (this.client && this.client.usable && (Date.now() - this.connectedAt) > EmailTaskPoller.MAX_CONN_AGE_MS) {
141
+ try {
142
+ await this.client.logout();
143
+ }
144
+ catch { /* ignore */ }
145
+ this.client = null;
146
+ }
147
+ if (this.client && this.client.usable)
148
+ return;
149
+ if (this.connecting)
150
+ return this.connecting;
151
+ this.connecting = (async () => {
152
+ const c = new imapflow_1.ImapFlow({
153
+ host: this.opts.host,
154
+ port: this.opts.port,
155
+ secure: this.opts.secure,
156
+ auth: { user: this.opts.user, pass: this.opts.pass },
157
+ logger: false,
158
+ tls: { rejectUnauthorized: this.opts.rejectUnauthorized !== false },
159
+ });
160
+ try {
161
+ await c.connect();
162
+ }
163
+ catch (err) {
164
+ // Close the socket opened by ImapFlow before connect() threw so its
165
+ // internal event listeners and TLS socket are not leaked.
166
+ try {
167
+ await c.logout();
168
+ }
169
+ catch { /* ignore */ }
170
+ throw err;
171
+ }
172
+ this.client = c;
173
+ this.connectedAt = Date.now();
174
+ })().finally(() => { this.connecting = null; });
175
+ return this.connecting;
176
+ }
177
+ _senderAllowed(address) {
178
+ if (this.allowed.length === 0)
179
+ return true;
180
+ if (!address)
181
+ return false;
182
+ const addr = address.toLowerCase();
183
+ return this.allowed.some(p => p.test(addr));
184
+ }
185
+ async _buildTaskFromMessage(source, envelope, workspaceRoot) {
186
+ const parsed = await (0, mailparser_1.simpleParser)(source);
187
+ const subject = (parsed.subject || envelope?.subject || '(no subject)').trim();
188
+ const fromAddr = parsed.from?.value?.[0]?.address ?? envelope?.from?.[0]?.address ?? 'unknown';
189
+ const fromName = parsed.from?.value?.[0]?.name ?? '';
190
+ const dateStr = (parsed.date ?? envelope?.date ?? new Date()).toISOString();
191
+ const body = (parsed.text || '').trim();
192
+ // Group attachments + the message file under one folder so they stay together.
193
+ const groupId = `email_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
194
+ const attachmentLines = [];
195
+ if (parsed.attachments && parsed.attachments.length > 0) {
196
+ for (const att of parsed.attachments) {
197
+ const name = att.filename || `attachment_${attachmentLines.length + 1}`;
198
+ const rel = (0, messageBuilder_1.saveAttachment)(workspaceRoot, name, att.content, groupId);
199
+ attachmentLines.push(`- [${name}](/${rel})`);
200
+ }
201
+ }
202
+ // Write the full email as a markdown file so the TODO line stays short
203
+ // and the agent can read the whole message + attachment list from one file.
204
+ const messageMd = [
205
+ `# ${subject}`,
206
+ '',
207
+ `- **From:** ${fromName ? `${fromName} <${fromAddr}>` : fromAddr}`,
208
+ `- **Date:** ${dateStr}`,
209
+ attachmentLines.length ? `- **Attachments:** ${parsed.attachments.length}` : '',
210
+ '',
211
+ '---',
212
+ '',
213
+ body || '_(no text body)_',
214
+ attachmentLines.length ? '\n## Attachments\n\n' + attachmentLines.join('\n') : '',
215
+ ].filter(Boolean).join('\n');
216
+ const messageRel = (0, messageBuilder_1.saveAttachment)(workspaceRoot, 'message.md', messageMd, groupId);
217
+ return `Read the email message and work on the tasks mentioned: [${subject}](/${messageRel}) (from ${fromAddr})`;
218
+ }
219
+ }
220
+ exports.EmailTaskPoller = EmailTaskPoller;
221
+ //# sourceMappingURL=emailPoller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailPoller.js","sourceRoot":"","sources":["../src/emailPoller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface GitFile {
2
+ path: string;
3
+ staged: string;
4
+ unstaged: string;
5
+ }
6
+ export interface GitStatus {
7
+ branch: string;
8
+ upstream: string | null;
9
+ ahead: number;
10
+ behind: number;
11
+ files: GitFile[];
12
+ }
13
+ export interface GitCommit {
14
+ hash: string;
15
+ short: string;
16
+ subject: string;
17
+ author: string;
18
+ email: string;
19
+ date: string;
20
+ refs: string;
21
+ }
22
+ export declare function getStatus(cwd: string): Promise<GitStatus>;
23
+ export declare function getLog(cwd: string, limit?: number): Promise<GitCommit[]>;
24
+ export declare function getDiff(cwd: string, filePath: string, staged: boolean): Promise<string>;
25
+ export declare function getCommitDiff(cwd: string, hash: string, filePath?: string): Promise<string>;
26
+ export declare function stageFile(cwd: string, filePath: string): Promise<void>;
27
+ export declare function unstageFile(cwd: string, filePath: string): Promise<void>;
28
+ export declare function stageAll(cwd: string): Promise<void>;
29
+ export declare function commit(cwd: string, message: string): Promise<string>;
30
+ export declare function fetchOrigin(cwd: string): Promise<void>;
31
+ export declare function getBranches(cwd: string): Promise<{
32
+ name: string;
33
+ current: boolean;
34
+ remote: boolean;
35
+ }[]>;
36
+ export declare function checkoutBranch(cwd: string, branch: string): Promise<void>;