@codedeck/codedeck 2026.3.1-4.63

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 (239) hide show
  1. package/README.md +38 -0
  2. package/config/default.yaml +51 -0
  3. package/dist/agent/brain-dispatcher.d.ts +67 -0
  4. package/dist/agent/brain-dispatcher.d.ts.map +1 -0
  5. package/dist/agent/brain-dispatcher.js +136 -0
  6. package/dist/agent/brain-dispatcher.js.map +1 -0
  7. package/dist/agent/detect.d.ts +20 -0
  8. package/dist/agent/detect.d.ts.map +1 -0
  9. package/dist/agent/detect.js +187 -0
  10. package/dist/agent/detect.js.map +1 -0
  11. package/dist/agent/drivers/base.d.ts +57 -0
  12. package/dist/agent/drivers/base.d.ts.map +1 -0
  13. package/dist/agent/drivers/base.js +3 -0
  14. package/dist/agent/drivers/base.js.map +1 -0
  15. package/dist/agent/drivers/claude-code.d.ts +14 -0
  16. package/dist/agent/drivers/claude-code.d.ts.map +1 -0
  17. package/dist/agent/drivers/claude-code.js +112 -0
  18. package/dist/agent/drivers/claude-code.js.map +1 -0
  19. package/dist/agent/drivers/codex.d.ts +14 -0
  20. package/dist/agent/drivers/codex.d.ts.map +1 -0
  21. package/dist/agent/drivers/codex.js +77 -0
  22. package/dist/agent/drivers/codex.js.map +1 -0
  23. package/dist/agent/drivers/gemini.d.ts +24 -0
  24. package/dist/agent/drivers/gemini.d.ts.map +1 -0
  25. package/dist/agent/drivers/gemini.js +142 -0
  26. package/dist/agent/drivers/gemini.js.map +1 -0
  27. package/dist/agent/drivers/opencode.d.ts +18 -0
  28. package/dist/agent/drivers/opencode.d.ts.map +1 -0
  29. package/dist/agent/drivers/opencode.js +50 -0
  30. package/dist/agent/drivers/opencode.js.map +1 -0
  31. package/dist/agent/drivers/shell.d.ts +13 -0
  32. package/dist/agent/drivers/shell.d.ts.map +1 -0
  33. package/dist/agent/drivers/shell.js +30 -0
  34. package/dist/agent/drivers/shell.js.map +1 -0
  35. package/dist/agent/env-isolation.d.ts +26 -0
  36. package/dist/agent/env-isolation.d.ts.map +1 -0
  37. package/dist/agent/env-isolation.js +103 -0
  38. package/dist/agent/env-isolation.js.map +1 -0
  39. package/dist/agent/notify-setup.d.ts +18 -0
  40. package/dist/agent/notify-setup.d.ts.map +1 -0
  41. package/dist/agent/notify-setup.js +68 -0
  42. package/dist/agent/notify-setup.js.map +1 -0
  43. package/dist/agent/session-manager.d.ts +75 -0
  44. package/dist/agent/session-manager.d.ts.map +1 -0
  45. package/dist/agent/session-manager.js +407 -0
  46. package/dist/agent/session-manager.js.map +1 -0
  47. package/dist/agent/signal.d.ts +32 -0
  48. package/dist/agent/signal.d.ts.map +1 -0
  49. package/dist/agent/signal.js +199 -0
  50. package/dist/agent/signal.js.map +1 -0
  51. package/dist/agent/status-poller.d.ts +27 -0
  52. package/dist/agent/status-poller.d.ts.map +1 -0
  53. package/dist/agent/status-poller.js +76 -0
  54. package/dist/agent/status-poller.js.map +1 -0
  55. package/dist/agent/templates/brain-prompt.d.ts +14 -0
  56. package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
  57. package/dist/agent/templates/brain-prompt.js +57 -0
  58. package/dist/agent/templates/brain-prompt.js.map +1 -0
  59. package/dist/agent/templates/identity.d.ts +19 -0
  60. package/dist/agent/templates/identity.d.ts.map +1 -0
  61. package/dist/agent/templates/identity.js +97 -0
  62. package/dist/agent/templates/identity.js.map +1 -0
  63. package/dist/agent/tmux.d.ts +90 -0
  64. package/dist/agent/tmux.d.ts.map +1 -0
  65. package/dist/agent/tmux.js +386 -0
  66. package/dist/agent/tmux.js.map +1 -0
  67. package/dist/autofix/audit-engine.d.ts +35 -0
  68. package/dist/autofix/audit-engine.d.ts.map +1 -0
  69. package/dist/autofix/audit-engine.js +144 -0
  70. package/dist/autofix/audit-engine.js.map +1 -0
  71. package/dist/autofix/branch-manager.d.ts +44 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +97 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/decision-engine.d.ts +38 -0
  76. package/dist/autofix/decision-engine.d.ts.map +1 -0
  77. package/dist/autofix/decision-engine.js +115 -0
  78. package/dist/autofix/decision-engine.js.map +1 -0
  79. package/dist/autofix/index.d.ts +23 -0
  80. package/dist/autofix/index.d.ts.map +1 -0
  81. package/dist/autofix/index.js +192 -0
  82. package/dist/autofix/index.js.map +1 -0
  83. package/dist/autofix/prompt-builder.d.ts +25 -0
  84. package/dist/autofix/prompt-builder.d.ts.map +1 -0
  85. package/dist/autofix/prompt-builder.js +137 -0
  86. package/dist/autofix/prompt-builder.js.map +1 -0
  87. package/dist/autofix/report-parser.d.ts +18 -0
  88. package/dist/autofix/report-parser.d.ts.map +1 -0
  89. package/dist/autofix/report-parser.js +74 -0
  90. package/dist/autofix/report-parser.js.map +1 -0
  91. package/dist/autofix/state-machine.d.ts +40 -0
  92. package/dist/autofix/state-machine.d.ts.map +1 -0
  93. package/dist/autofix/state-machine.js +76 -0
  94. package/dist/autofix/state-machine.js.map +1 -0
  95. package/dist/bind/bind-flow.d.ts +15 -0
  96. package/dist/bind/bind-flow.d.ts.map +1 -0
  97. package/dist/bind/bind-flow.js +198 -0
  98. package/dist/bind/bind-flow.js.map +1 -0
  99. package/dist/config.d.ts +53 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +89 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/daemon/codex-watcher.d.ts +46 -0
  104. package/dist/daemon/codex-watcher.d.ts.map +1 -0
  105. package/dist/daemon/codex-watcher.js +533 -0
  106. package/dist/daemon/codex-watcher.js.map +1 -0
  107. package/dist/daemon/command-handler.d.ts +6 -0
  108. package/dist/daemon/command-handler.d.ts.map +1 -0
  109. package/dist/daemon/command-handler.js +770 -0
  110. package/dist/daemon/command-handler.js.map +1 -0
  111. package/dist/daemon/discussion-orchestrator.d.ts +63 -0
  112. package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
  113. package/dist/daemon/discussion-orchestrator.js +482 -0
  114. package/dist/daemon/discussion-orchestrator.js.map +1 -0
  115. package/dist/daemon/gemini-watcher.d.ts +42 -0
  116. package/dist/daemon/gemini-watcher.d.ts.map +1 -0
  117. package/dist/daemon/gemini-watcher.js +463 -0
  118. package/dist/daemon/gemini-watcher.js.map +1 -0
  119. package/dist/daemon/hook-server.d.ts +42 -0
  120. package/dist/daemon/hook-server.d.ts.map +1 -0
  121. package/dist/daemon/hook-server.js +160 -0
  122. package/dist/daemon/hook-server.js.map +1 -0
  123. package/dist/daemon/jsonl-watcher.d.ts +35 -0
  124. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  125. package/dist/daemon/jsonl-watcher.js +635 -0
  126. package/dist/daemon/jsonl-watcher.js.map +1 -0
  127. package/dist/daemon/lifecycle.d.ts +20 -0
  128. package/dist/daemon/lifecycle.d.ts.map +1 -0
  129. package/dist/daemon/lifecycle.js +331 -0
  130. package/dist/daemon/lifecycle.js.map +1 -0
  131. package/dist/daemon/server-link.d.ts +44 -0
  132. package/dist/daemon/server-link.d.ts.map +1 -0
  133. package/dist/daemon/server-link.js +232 -0
  134. package/dist/daemon/server-link.js.map +1 -0
  135. package/dist/daemon/subsession-manager.d.ts +37 -0
  136. package/dist/daemon/subsession-manager.d.ts.map +1 -0
  137. package/dist/daemon/subsession-manager.js +240 -0
  138. package/dist/daemon/subsession-manager.js.map +1 -0
  139. package/dist/daemon/terminal-parser.d.ts +42 -0
  140. package/dist/daemon/terminal-parser.d.ts.map +1 -0
  141. package/dist/daemon/terminal-parser.js +278 -0
  142. package/dist/daemon/terminal-parser.js.map +1 -0
  143. package/dist/daemon/terminal-streamer.d.ts +93 -0
  144. package/dist/daemon/terminal-streamer.d.ts.map +1 -0
  145. package/dist/daemon/terminal-streamer.js +451 -0
  146. package/dist/daemon/terminal-streamer.js.map +1 -0
  147. package/dist/daemon/timeline-emitter.d.ts +32 -0
  148. package/dist/daemon/timeline-emitter.d.ts.map +1 -0
  149. package/dist/daemon/timeline-emitter.js +97 -0
  150. package/dist/daemon/timeline-emitter.js.map +1 -0
  151. package/dist/daemon/timeline-event.d.ts +23 -0
  152. package/dist/daemon/timeline-event.d.ts.map +1 -0
  153. package/dist/daemon/timeline-event.js +7 -0
  154. package/dist/daemon/timeline-event.js.map +1 -0
  155. package/dist/daemon/timeline-store.d.ts +40 -0
  156. package/dist/daemon/timeline-store.d.ts.map +1 -0
  157. package/dist/daemon/timeline-store.js +153 -0
  158. package/dist/daemon/timeline-store.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +149 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/memory/claude-mem.d.ts +9 -0
  164. package/dist/memory/claude-mem.d.ts.map +1 -0
  165. package/dist/memory/claude-mem.js +58 -0
  166. package/dist/memory/claude-mem.js.map +1 -0
  167. package/dist/memory/context-builder.d.ts +4 -0
  168. package/dist/memory/context-builder.d.ts.map +1 -0
  169. package/dist/memory/context-builder.js +35 -0
  170. package/dist/memory/context-builder.js.map +1 -0
  171. package/dist/memory/detector.d.ts +7 -0
  172. package/dist/memory/detector.d.ts.map +1 -0
  173. package/dist/memory/detector.js +17 -0
  174. package/dist/memory/detector.js.map +1 -0
  175. package/dist/memory/extractor.d.ts +21 -0
  176. package/dist/memory/extractor.d.ts.map +1 -0
  177. package/dist/memory/extractor.js +83 -0
  178. package/dist/memory/extractor.js.map +1 -0
  179. package/dist/memory/injector.d.ts +7 -0
  180. package/dist/memory/injector.d.ts.map +1 -0
  181. package/dist/memory/injector.js +18 -0
  182. package/dist/memory/injector.js.map +1 -0
  183. package/dist/memory/interface.d.ts +25 -0
  184. package/dist/memory/interface.d.ts.map +1 -0
  185. package/dist/memory/interface.js +3 -0
  186. package/dist/memory/interface.js.map +1 -0
  187. package/dist/memory/mem0.d.ts +12 -0
  188. package/dist/memory/mem0.d.ts.map +1 -0
  189. package/dist/memory/mem0.js +93 -0
  190. package/dist/memory/mem0.js.map +1 -0
  191. package/dist/router/command-parser.d.ts +33 -0
  192. package/dist/router/command-parser.d.ts.map +1 -0
  193. package/dist/router/command-parser.js +66 -0
  194. package/dist/router/command-parser.js.map +1 -0
  195. package/dist/router/message-router.d.ts +42 -0
  196. package/dist/router/message-router.d.ts.map +1 -0
  197. package/dist/router/message-router.js +222 -0
  198. package/dist/router/message-router.js.map +1 -0
  199. package/dist/router/response-collector.d.ts +28 -0
  200. package/dist/router/response-collector.d.ts.map +1 -0
  201. package/dist/router/response-collector.js +164 -0
  202. package/dist/router/response-collector.js.map +1 -0
  203. package/dist/store/project-store.d.ts +37 -0
  204. package/dist/store/project-store.d.ts.map +1 -0
  205. package/dist/store/project-store.js +70 -0
  206. package/dist/store/project-store.js.map +1 -0
  207. package/dist/store/session-store.d.ts +32 -0
  208. package/dist/store/session-store.d.ts.map +1 -0
  209. package/dist/store/session-store.js +67 -0
  210. package/dist/store/session-store.js.map +1 -0
  211. package/dist/tracker/branch.d.ts +24 -0
  212. package/dist/tracker/branch.d.ts.map +1 -0
  213. package/dist/tracker/branch.js +55 -0
  214. package/dist/tracker/branch.js.map +1 -0
  215. package/dist/tracker/github.d.ts +31 -0
  216. package/dist/tracker/github.d.ts.map +1 -0
  217. package/dist/tracker/github.js +117 -0
  218. package/dist/tracker/github.js.map +1 -0
  219. package/dist/tracker/gitlab.d.ts +31 -0
  220. package/dist/tracker/gitlab.d.ts.map +1 -0
  221. package/dist/tracker/gitlab.js +116 -0
  222. package/dist/tracker/gitlab.js.map +1 -0
  223. package/dist/tracker/index.d.ts +9 -0
  224. package/dist/tracker/index.d.ts.map +1 -0
  225. package/dist/tracker/index.js +28 -0
  226. package/dist/tracker/index.js.map +1 -0
  227. package/dist/tracker/interface.d.ts +39 -0
  228. package/dist/tracker/interface.d.ts.map +1 -0
  229. package/dist/tracker/interface.js +7 -0
  230. package/dist/tracker/interface.js.map +1 -0
  231. package/dist/tracker/priority.d.ts +19 -0
  232. package/dist/tracker/priority.d.ts.map +1 -0
  233. package/dist/tracker/priority.js +40 -0
  234. package/dist/tracker/priority.js.map +1 -0
  235. package/dist/util/logger.d.ts +4 -0
  236. package/dist/util/logger.d.ts.map +1 -0
  237. package/dist/util/logger.js +14 -0
  238. package/dist/util/logger.js.map +1 -0
  239. package/package.json +65 -0
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeCodeDriver = void 0;
4
+ const detect_js_1 = require("../detect.js");
5
+ const OVERLAY_PATTERNS = [
6
+ /Allow|Deny/,
7
+ /\[Y\/n\]/i,
8
+ /Do you want to/i,
9
+ /Press Enter to/i,
10
+ /─{10,}/, // CC uses box-drawing chars for dialogs
11
+ ];
12
+ // Startup dialogs to auto-dismiss after launch
13
+ const STARTUP_PROMPTS = [
14
+ // "Do you trust the files in this folder?" — Enter to accept (Yes is default)
15
+ { pattern: /trust.*folder|do you trust/i, keys: ['Enter'], label: 'trust-folder' },
16
+ // Update available / Press enter to continue
17
+ { pattern: /update available|press enter to continue/i, keys: ['Enter'], label: 'update' },
18
+ // "Bypass Permissions mode" dialog — "No, exit" is selected, Down selects "Yes, I accept"
19
+ // Pattern matches "bypass" alone since tmux may split "Bypass\nPermissions" across lines
20
+ { pattern: /yes.*i accept|no.*exit.*bypass|bypass/i, keys: ['Down', 'Enter'], label: 'bypass-perms' },
21
+ // "Files with errors are skipped" / settings dialog — "Exit and fix" selected, Down → "Continue without these settings"
22
+ { pattern: /continue without these settings|files with errors are skipped|invalid settings/i, keys: ['Down', 'Enter'], label: 'settings-error' },
23
+ // Generic "[Y/n]" confirmation — Enter for default yes
24
+ { pattern: /\[Y\/n\]/i, keys: ['Enter'], label: 'confirm' },
25
+ ];
26
+ class ClaudeCodeDriver {
27
+ type = 'claude-code';
28
+ promptChar = '❯';
29
+ spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
30
+ buildLaunchCommand(_sessionName, opts) {
31
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
32
+ if (opts?.ccSessionId) {
33
+ // Sub-session: use deterministic session ID, always fresh start for that UUID
34
+ return `${cwd}claude --dangerously-skip-permissions --session-id ${opts.ccSessionId}`;
35
+ }
36
+ if (opts?.fresh) {
37
+ return `${cwd}claude --dangerously-skip-permissions`;
38
+ }
39
+ // Default: resume last conversation; fall back to fresh if no history
40
+ return `${cwd}claude --dangerously-skip-permissions -c || claude --dangerously-skip-permissions`;
41
+ }
42
+ buildResumeCommand(_sessionName, opts) {
43
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
44
+ if (opts?.ccSessionId) {
45
+ // Resume specific session by UUID
46
+ return `${cwd}claude --dangerously-skip-permissions --resume ${opts.ccSessionId}`;
47
+ }
48
+ return this.buildLaunchCommand(_sessionName, opts);
49
+ }
50
+ async postLaunch(capturePane, sendKey) {
51
+ const POLL_INTERVAL_MS = 1_500;
52
+ const MAX_POLLS = 12; // up to 18 seconds total
53
+ for (let i = 0; i < MAX_POLLS; i++) {
54
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
55
+ let lines;
56
+ try {
57
+ lines = await capturePane();
58
+ }
59
+ catch {
60
+ continue; // session may not be ready yet
61
+ }
62
+ const screen = lines.join('\n');
63
+ // Check startup prompts FIRST — dialogs contain ❯ in their menu cursors,
64
+ // so checking for idle ❯ before this would cause a false-positive early exit.
65
+ let handled = false;
66
+ for (const { pattern, keys } of STARTUP_PROMPTS) {
67
+ if (pattern.test(screen)) {
68
+ for (const key of keys) {
69
+ await sendKey(key);
70
+ await new Promise((r) => setTimeout(r, 200));
71
+ }
72
+ handled = true;
73
+ break;
74
+ }
75
+ }
76
+ if (handled) {
77
+ await new Promise((r) => setTimeout(r, 500));
78
+ continue; // re-poll — may be more dialogs, or idle prompt
79
+ }
80
+ // No dialog matched — check if agent is idle
81
+ if (screen.includes(this.promptChar))
82
+ return;
83
+ }
84
+ }
85
+ detectStatus(lines) {
86
+ return (0, detect_js_1.detectStatus)(lines, 'claude-code');
87
+ }
88
+ isOverlay(lines) {
89
+ const tail = lines.slice(-5).join('\n');
90
+ return OVERLAY_PATTERNS.some((p) => p.test(tail));
91
+ }
92
+ async captureLastResponse(capturePane, sendKeys, showBuffer, deleteBuffer) {
93
+ // Always local — use /copy for clean output
94
+ try {
95
+ await sendKeys('/copy');
96
+ await new Promise((r) => setTimeout(r, 2000));
97
+ const buf = await showBuffer();
98
+ if (buf.trim()) {
99
+ // Immediately clear the buffer — task 12.15 clipboard cleanup
100
+ await deleteBuffer?.();
101
+ return buf;
102
+ }
103
+ }
104
+ catch {
105
+ // fall through to capture-pane
106
+ }
107
+ const lines = await capturePane();
108
+ return lines.join('\n');
109
+ }
110
+ }
111
+ exports.ClaudeCodeDriver = ClaudeCodeDriver;
112
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agent/drivers/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AgentDriver, LaunchOptions } from './base.js';
2
+ import type { AgentStatus } from '../detect.js';
3
+ export declare class CodexDriver implements AgentDriver {
4
+ readonly type: "codex";
5
+ readonly promptChar = "\u203A";
6
+ readonly spinnerChars: string[];
7
+ buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
8
+ buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
9
+ postLaunch(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
10
+ detectStatus(lines: string[]): AgentStatus;
11
+ isOverlay(lines: string[]): boolean;
12
+ captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAahD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,UAAU,YAAO;IAC1B,QAAQ,CAAC,YAAY,WAA4C;IAEjE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAatE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIhE,UAAU,CACd,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAsChB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM7B,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CAKnB"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexDriver = void 0;
4
+ const detect_js_1 = require("../detect.js");
5
+ // Startup prompts to auto-dismiss after launch
6
+ const STARTUP_PROMPTS = [
7
+ // "Update available! X.Y.Z -> A.B.C" — select "Skip until next version" (option 3: Down Down Enter)
8
+ { pattern: /update available.*->|skip until next version/i, keys: ['Down', 'Down', 'Enter'], label: 'update' },
9
+ ];
10
+ class CodexDriver {
11
+ type = 'codex';
12
+ promptChar = '›';
13
+ spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
14
+ buildLaunchCommand(_sessionName, opts) {
15
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
16
+ const modelFlag = opts?.codexModel ? ` -m ${JSON.stringify(opts.codexModel)}` : '';
17
+ if (opts?.codexSessionId) {
18
+ return `${cwd}codex${modelFlag} -s danger-full-access resume ${opts.codexSessionId}`;
19
+ }
20
+ if (opts?.fresh) {
21
+ return `${cwd}codex${modelFlag} -s danger-full-access`;
22
+ }
23
+ // Default: resume last session; fall back to fresh if no history
24
+ return `${cwd}codex${modelFlag} -s danger-full-access resume --last || codex${modelFlag} -s danger-full-access`;
25
+ }
26
+ buildResumeCommand(_sessionName, opts) {
27
+ return this.buildLaunchCommand(_sessionName, opts);
28
+ }
29
+ async postLaunch(capturePane, sendKey) {
30
+ const POLL_INTERVAL_MS = 1_500;
31
+ const MAX_POLLS = 10; // up to 15 seconds
32
+ for (let i = 0; i < MAX_POLLS; i++) {
33
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
34
+ let lines;
35
+ try {
36
+ lines = await capturePane();
37
+ }
38
+ catch {
39
+ continue;
40
+ }
41
+ const screen = lines.join('\n');
42
+ let handled = false;
43
+ for (const { pattern, keys } of STARTUP_PROMPTS) {
44
+ if (pattern.test(screen)) {
45
+ for (const key of keys) {
46
+ await sendKey(key);
47
+ await new Promise((r) => setTimeout(r, 200));
48
+ }
49
+ handled = true;
50
+ break;
51
+ }
52
+ }
53
+ if (handled) {
54
+ await new Promise((r) => setTimeout(r, 500));
55
+ continue;
56
+ }
57
+ // No dialog — check if agent is at its idle prompt
58
+ if (screen.includes(this.promptChar))
59
+ return;
60
+ }
61
+ }
62
+ detectStatus(lines) {
63
+ return (0, detect_js_1.detectStatus)(lines, 'codex');
64
+ }
65
+ isOverlay(lines) {
66
+ // Codex shows context menu overlays when mid-action
67
+ const tail = lines.slice(-5).join('\n');
68
+ return /\[ESC\]|\[q\]/.test(tail);
69
+ }
70
+ async captureLastResponse(capturePane, _sendKeys, _showBuffer) {
71
+ // Codex has no /copy equivalent — always use capture-pane
72
+ const lines = await capturePane();
73
+ return lines.join('\n');
74
+ }
75
+ }
76
+ exports.CodexDriver = CodexDriver;
77
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/drivers/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AgentDriver, LaunchOptions, DeleteBufferFn } from './base.js';
2
+ import type { AgentStatus } from '../detect.js';
3
+ export declare class GeminiDriver implements AgentDriver {
4
+ readonly type: "gemini";
5
+ readonly promptChar = ">";
6
+ readonly spinnerChars: string[];
7
+ /**
8
+ * Run gemini once in stream-json mode to obtain a fresh session UUID from
9
+ * the `init` event, then kill the process. The UUID can then be passed to
10
+ * subsequent launches via `--resume <uuid>` so the session is deterministic.
11
+ *
12
+ * Calls are serialized: only one Gemini CLI process runs at a time to avoid
13
+ * contention/timeouts when starting multiple Gemini sub-sessions.
14
+ */
15
+ resolveSessionId(cwd?: string): Promise<string>;
16
+ private _doResolveSessionId;
17
+ buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
18
+ buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
19
+ postLaunch(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
20
+ detectStatus(lines: string[]): AgentStatus;
21
+ isOverlay(lines: string[]): boolean;
22
+ captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>, _deleteBuffer?: DeleteBufferFn): Promise<string>;
23
+ }
24
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA0BhD,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,WAAsD;IAE3E;;;;;;;OAOG;IACG,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD,OAAO,CAAC,mBAAmB;IA+C3B,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAStE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIhE,UAAU,CACd,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAqChB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAK7B,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAClC,aAAa,CAAC,EAAE,cAAc,GAC7B,OAAO,CAAC,MAAM,CAAC;CAKnB"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiDriver = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const detect_js_1 = require("../detect.js");
6
+ // Startup prompts to auto-dismiss after launch
7
+ const STARTUP_PROMPTS = [
8
+ // "Do you trust the files in this folder?" — Enter to accept
9
+ { pattern: /trust.*folder|do you trust/i, keys: ['Enter'], label: 'trust-folder' },
10
+ // Update available
11
+ { pattern: /update available|press enter to continue/i, keys: ['Enter'], label: 'update' },
12
+ // Generic [Y/n]
13
+ { pattern: /\[Y\/n\]/i, keys: ['Enter'], label: 'confirm' },
14
+ ];
15
+ const OVERLAY_PATTERNS = [
16
+ /Allow|Deny/,
17
+ /\[Y\/n\]/i,
18
+ /Do you want to/i,
19
+ ];
20
+ // Serialize resolveSessionId calls — concurrent Gemini CLI spawns cause timeouts
21
+ let _resolveQueue = Promise.resolve();
22
+ class GeminiDriver {
23
+ type = 'gemini';
24
+ promptChar = '>';
25
+ spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
26
+ /**
27
+ * Run gemini once in stream-json mode to obtain a fresh session UUID from
28
+ * the `init` event, then kill the process. The UUID can then be passed to
29
+ * subsequent launches via `--resume <uuid>` so the session is deterministic.
30
+ *
31
+ * Calls are serialized: only one Gemini CLI process runs at a time to avoid
32
+ * contention/timeouts when starting multiple Gemini sub-sessions.
33
+ */
34
+ async resolveSessionId(cwd) {
35
+ return new Promise((resolve, reject) => {
36
+ _resolveQueue = _resolveQueue
37
+ .then(() => this._doResolveSessionId(cwd))
38
+ .then(resolve, reject);
39
+ });
40
+ }
41
+ _doResolveSessionId(cwd) {
42
+ return new Promise((resolve, reject) => {
43
+ const timeout = setTimeout(() => {
44
+ proc.kill();
45
+ reject(new Error('Gemini session ID discovery timed out'));
46
+ }, 30_000);
47
+ const proc = (0, child_process_1.spawn)('gemini', ['-y', '-p', 'hi', '-o', 'stream-json'], {
48
+ cwd,
49
+ env: { ...process.env },
50
+ stdio: ['ignore', 'pipe', 'ignore'],
51
+ });
52
+ let buf = '';
53
+ proc.stdout.on('data', (chunk) => {
54
+ buf += chunk.toString();
55
+ const lines = buf.split('\n');
56
+ buf = lines.pop() ?? '';
57
+ for (const line of lines) {
58
+ if (!line.trim())
59
+ continue;
60
+ try {
61
+ const event = JSON.parse(line);
62
+ if (event.type === 'init' && event.session_id) {
63
+ clearTimeout(timeout);
64
+ proc.kill();
65
+ resolve(event.session_id);
66
+ }
67
+ }
68
+ catch {
69
+ // not JSON yet, keep buffering
70
+ }
71
+ }
72
+ });
73
+ proc.on('error', (err) => {
74
+ clearTimeout(timeout);
75
+ reject(err);
76
+ });
77
+ proc.on('close', (code) => {
78
+ clearTimeout(timeout);
79
+ if (code !== null && code !== 0 && code !== null) {
80
+ reject(new Error(`Gemini exited with code ${code} before emitting session_id`));
81
+ }
82
+ });
83
+ });
84
+ }
85
+ buildLaunchCommand(_sessionName, opts) {
86
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
87
+ if (opts?.geminiSessionId) {
88
+ return `${cwd}gemini --yolo --resume ${opts.geminiSessionId}`;
89
+ }
90
+ // Always launch fresh when no UUID — never use --resume latest
91
+ return `${cwd}gemini --yolo`;
92
+ }
93
+ buildResumeCommand(_sessionName, opts) {
94
+ return this.buildLaunchCommand(_sessionName, opts);
95
+ }
96
+ async postLaunch(capturePane, sendKey) {
97
+ const POLL_INTERVAL_MS = 1_500;
98
+ const MAX_POLLS = 12; // up to 18 seconds
99
+ for (let i = 0; i < MAX_POLLS; i++) {
100
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
101
+ let lines;
102
+ try {
103
+ lines = await capturePane();
104
+ }
105
+ catch {
106
+ continue;
107
+ }
108
+ const screen = lines.join('\n');
109
+ let handled = false;
110
+ for (const { pattern, keys } of STARTUP_PROMPTS) {
111
+ if (pattern.test(screen)) {
112
+ for (const key of keys) {
113
+ await sendKey(key);
114
+ await new Promise((r) => setTimeout(r, 200));
115
+ }
116
+ handled = true;
117
+ break;
118
+ }
119
+ }
120
+ if (handled) {
121
+ await new Promise((r) => setTimeout(r, 500));
122
+ continue;
123
+ }
124
+ if (screen.includes(this.promptChar) || screen.includes('>'))
125
+ return;
126
+ }
127
+ }
128
+ detectStatus(lines) {
129
+ return (0, detect_js_1.detectStatus)(lines, 'gemini');
130
+ }
131
+ isOverlay(lines) {
132
+ const tail = lines.slice(-5).join('\n');
133
+ return OVERLAY_PATTERNS.some((p) => p.test(tail));
134
+ }
135
+ async captureLastResponse(capturePane, _sendKeys, _showBuffer, _deleteBuffer) {
136
+ // Gemini has no /copy equivalent — use capture-pane
137
+ const lines = await capturePane();
138
+ return lines.join('\n');
139
+ }
140
+ }
141
+ exports.GeminiDriver = GeminiDriver;
142
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/agent/drivers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AgentDriver, LaunchOptions } from './base.js';
2
+ import type { AgentStatus } from '../detect.js';
3
+ export declare class OpenCodeDriver implements AgentDriver {
4
+ readonly type: "opencode";
5
+ readonly promptChar = ">";
6
+ readonly spinnerChars: string[];
7
+ buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
8
+ buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
9
+ detectStatus(lines: string[]): AgentStatus;
10
+ isOverlay(lines: string[]): boolean;
11
+ /**
12
+ * Ensure the project directory has opencode.json with full permissions.
13
+ * Called before launching the session.
14
+ */
15
+ ensurePermissions(cwd: string): Promise<void>;
16
+ captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>): Promise<string>;
17
+ }
18
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,WAAyB;IAE9C,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAStE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAItE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAInC;;;OAGG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CAInB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenCodeDriver = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const detect_js_1 = require("../detect.js");
10
+ class OpenCodeDriver {
11
+ type = 'opencode';
12
+ promptChar = '>';
13
+ spinnerChars = ['|', '/', '-', '\\'];
14
+ buildLaunchCommand(_sessionName, opts) {
15
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
16
+ if (opts?.fresh) {
17
+ return `${cwd}opencode`;
18
+ }
19
+ // Default: resume last conversation; fall back to fresh if no history
20
+ return `${cwd}opencode -c || opencode`;
21
+ }
22
+ buildResumeCommand(_sessionName, opts) {
23
+ return this.buildLaunchCommand(_sessionName, opts);
24
+ }
25
+ detectStatus(lines) {
26
+ return (0, detect_js_1.detectStatus)(lines, 'opencode');
27
+ }
28
+ isOverlay(lines) {
29
+ return false;
30
+ }
31
+ /**
32
+ * Ensure the project directory has opencode.json with full permissions.
33
+ * Called before launching the session.
34
+ */
35
+ async ensurePermissions(cwd) {
36
+ const configPath = path_1.default.join(cwd, 'opencode.json');
37
+ try {
38
+ await fs_1.promises.access(configPath);
39
+ }
40
+ catch {
41
+ await fs_1.promises.writeFile(configPath, JSON.stringify({ permission: { '*': 'allow' } }, null, 2));
42
+ }
43
+ }
44
+ async captureLastResponse(capturePane, _sendKeys, _showBuffer) {
45
+ const lines = await capturePane();
46
+ return lines.join('\n');
47
+ }
48
+ }
49
+ exports.OpenCodeDriver = OpenCodeDriver;
50
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/agent/drivers/opencode.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,gDAAwB;AAGxB,4CAA4C;AAE5C,MAAa,cAAc;IAChB,IAAI,GAAG,UAAmB,CAAC;IAC3B,UAAU,GAAG,GAAG,CAAC;IACjB,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAE9C,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,GAAG,UAAU,CAAC;QAC1B,CAAC;QACD,sEAAsE;QACtE,OAAO,GAAG,GAAG,yBAAyB,CAAC;IACzC,CAAC;IAED,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,KAAe;QAC1B,OAAO,IAAA,wBAAY,EAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,KAAe;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,aAAE,CAAC,SAAS,CAChB,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,WAAoC,EACpC,SAA0C,EAC1C,WAAkC;QAElC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAlDD,wCAkDC"}
@@ -0,0 +1,13 @@
1
+ import type { AgentDriver, LaunchOptions } from './base.js';
2
+ import type { AgentStatus } from '../detect.js';
3
+ export declare class ShellDriver implements AgentDriver {
4
+ readonly type: "shell";
5
+ readonly promptChar = "$";
6
+ readonly spinnerChars: string[];
7
+ buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
8
+ buildResumeCommand(sessionName: string, opts?: LaunchOptions): string;
9
+ detectStatus(lines: string[]): AgentStatus;
10
+ isOverlay(_lines: string[]): boolean;
11
+ captureLastResponse(capturePane: () => Promise<string[]>): Promise<string>;
12
+ }
13
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IAErC,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAQtE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIrE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO;IAI9B,mBAAmB,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAGjF"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShellDriver = void 0;
4
+ const detect_js_1 = require("../detect.js");
5
+ class ShellDriver {
6
+ type = 'shell';
7
+ promptChar = '$';
8
+ spinnerChars = [];
9
+ buildLaunchCommand(_sessionName, opts) {
10
+ const bin = opts?.shellBin
11
+ ?? process.env.SHELL
12
+ ?? '/bin/bash';
13
+ const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
14
+ return `${cwd}${bin}`;
15
+ }
16
+ buildResumeCommand(sessionName, opts) {
17
+ return this.buildLaunchCommand(sessionName, opts);
18
+ }
19
+ detectStatus(lines) {
20
+ return (0, detect_js_1.detectStatus)(lines, 'shell');
21
+ }
22
+ isOverlay(_lines) {
23
+ return false;
24
+ }
25
+ async captureLastResponse(capturePane) {
26
+ return (await capturePane()).join('\n');
27
+ }
28
+ }
29
+ exports.ShellDriver = ShellDriver;
30
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/agent/drivers/shell.ts"],"names":[],"mappings":";;;AAEA,4CAA4C;AAE5C,MAAa,WAAW;IACb,IAAI,GAAG,OAAgB,CAAC;IACxB,UAAU,GAAG,GAAG,CAAC;IACjB,YAAY,GAAa,EAAE,CAAC;IAErC,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,MAAM,GAAG,GAAI,IAA0C,EAAE,QAAQ;eAC5D,OAAO,CAAC,GAAG,CAAC,KAAK;eACjB,WAAW,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,kBAAkB,CAAC,WAAmB,EAAE,IAAoB;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,YAAY,CAAC,KAAe;QAC1B,OAAO,IAAA,wBAAY,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,MAAgB;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAoC;QAC5D,OAAO,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AA5BD,kCA4BC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Build a minimal explicit environment for spawning agent tmux sessions.
3
+ * Only pass through safe, non-secret env vars. Never pass secrets to child processes.
4
+ *
5
+ * Agents are spawned with ONLY these env vars — any secrets from the daemon's
6
+ * environment are explicitly excluded.
7
+ */
8
+ /**
9
+ * Build a minimal environment for an agent tmux session.
10
+ *
11
+ * @param agentSpecificVars Agent-specific vars to include (e.g., ANTHROPIC_API_KEY for CC).
12
+ * These must be explicitly opted-in — they are NOT automatically inherited.
13
+ * @returns Environment object safe to pass to `newSession({ env: ... })`.
14
+ */
15
+ export declare function buildAgentEnv(agentSpecificVars?: Record<string, string>): Record<string, string>;
16
+ /**
17
+ * Get the agent-specific env vars for a given agent type.
18
+ * Only includes the vars explicitly needed by that agent.
19
+ */
20
+ export declare function getAgentEnvVars(agentType: 'claude-code' | 'codex' | 'opencode'): string[];
21
+ /**
22
+ * Build agent env from process.env, extracting only the agent-specific API key vars.
23
+ * The caller must ensure these vars are set in process.env before calling this.
24
+ */
25
+ export declare function buildAgentEnvFromProcess(agentType: 'claude-code' | 'codex' | 'opencode'): Record<string, string>;
26
+ //# sourceMappingURL=env-isolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-isolation.d.ts","sourceRoot":"","sources":["../../src/agent/env-isolation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBpG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,EAAE,CASzF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}