@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
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # codedeck
2
+
3
+ Remote control AI coding agents (Claude Code, Codex, OpenCode) via Discord, Telegram, Feishu, web terminal, and native mobile apps.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g codedeck
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # Start the daemon
15
+ codedeck start
16
+
17
+ # Bind to Cloudflare central server
18
+ codedeck bind
19
+
20
+ # Check status
21
+ codedeck status
22
+
23
+ # Send a message to an agent session
24
+ codedeck send --session deck_myapp_w1 "fix the auth bug"
25
+
26
+ # Run auto-fix with two agents
27
+ codedeck autofix --project myapp "fix the authentication timeout bug"
28
+ ```
29
+
30
+ ## Requirements
31
+
32
+ - Node.js >= 20
33
+ - tmux
34
+ - One or more AI agents: Claude Code, Codex, or OpenCode
35
+
36
+ ## Documentation
37
+
38
+ See [design.md](openspec/changes/codedeck/design.md) for architecture decisions.
@@ -0,0 +1,51 @@
1
+ daemon:
2
+ pollInterval: 2000 # ms between status polls
3
+ signalCheckInterval: 100 # ms to check signal files
4
+ streamFps: 10 # tmux capture FPS when viewers connected
5
+ streamIdleFps: 1 # FPS when no viewers
6
+ maxRestarts: 3 # max restarts before marking error
7
+ restartWindow: 300000 # ms window for restart counting (5 min)
8
+ heartbeatInterval: 30000 # ms WebSocket heartbeat
9
+ reconnectBase: 1000 # ms initial reconnect backoff
10
+ reconnectMax: 60000 # ms max reconnect backoff
11
+
12
+ agents:
13
+ defaultType: claude-code
14
+ supportedTypes:
15
+ - claude-code
16
+ - codex
17
+ - opencode
18
+
19
+ sessions:
20
+ storePath: ~/.codedeck/sessions.json
21
+ signalDir: /tmp/codedeck/signals
22
+
23
+ projects:
24
+ storePath: ~/.codedeck/projects.json
25
+
26
+ autofix:
27
+ defaultCoder: claude-code
28
+ defaultAuditor: codex
29
+ maxDiscussionRounds: 3
30
+ autoMerge: false
31
+
32
+ tracker:
33
+ type: github # github | gitlab
34
+ apiUrl: '' # empty = hosted (github.com / gitlab.com); set for Enterprise/self-hosted
35
+ tokenEnv: TRACKER_TOKEN # env var holding the API token
36
+ repo: '' # GitHub: "owner/repo"; GitLab: leave empty, use projectId
37
+ projectId: '' # GitLab only: numeric ID or "namespace/project-path"
38
+ baseBranch: main # branch to create feature branches from
39
+
40
+ memory:
41
+ claudeMemUrl: ${CLAUDE_MEM_URL:-http://localhost:37777}
42
+ mem0Url: ${MEM0_URL:-http://localhost:37778}
43
+
44
+ server:
45
+ cfWorkerUrl: ${CF_WORKER_URL}
46
+ apiKey: ${CF_API_KEY}
47
+ credentialsPath: ~/.codedeck/server.json
48
+
49
+ log:
50
+ level: info
51
+ pretty: false
@@ -0,0 +1,67 @@
1
+ export type CoreCommand = {
2
+ type: 'worker';
3
+ workerId: string;
4
+ message: string;
5
+ } | {
6
+ type: 'brain';
7
+ message: string;
8
+ } | {
9
+ type: 'status';
10
+ args: string[];
11
+ } | {
12
+ type: 'screen';
13
+ args: string[];
14
+ } | {
15
+ type: 'reply';
16
+ message: string;
17
+ } | {
18
+ type: 'ask';
19
+ workerId: string;
20
+ question: string;
21
+ };
22
+ export type ExtensionCommand = {
23
+ type: 'audit';
24
+ workerId: string;
25
+ } | {
26
+ type: 'approve';
27
+ workerId: string;
28
+ } | {
29
+ type: 'reject';
30
+ workerId: string;
31
+ findings: string;
32
+ } | {
33
+ type: 'merge';
34
+ workerId: string;
35
+ } | {
36
+ type: 'custom';
37
+ name: string;
38
+ args: string[];
39
+ };
40
+ export type BrainCommand = CoreCommand | ExtensionCommand;
41
+ export interface BrainDispatcherOpts {
42
+ projectName: string;
43
+ sendToWorker: (workerId: string, message: string) => Promise<void>;
44
+ sendToBrain: (message: string) => Promise<void>;
45
+ }
46
+ type CommandHandler = (args: string[]) => Promise<unknown> | unknown;
47
+ export declare class BrainDispatcher {
48
+ private projectName;
49
+ private sendToWorker;
50
+ private sendToBrain;
51
+ private commandHandlers;
52
+ private autoFixEnabled;
53
+ constructor(opts: BrainDispatcherOpts);
54
+ /** Register a per-command-type handler. Called with parsed args as string array. */
55
+ registerCommand(type: string, handler: CommandHandler): void;
56
+ /** Enable auto-fix extension commands (@audit, @approve, @reject, @merge) */
57
+ registerAutoFixExtensions(): void;
58
+ /** Parse a single line. Returns undefined if not a recognized command. */
59
+ parseLine(line: string): BrainCommand | undefined;
60
+ private _callHandler;
61
+ /** Parse a line, execute built-in routing, and call registered handlers */
62
+ dispatch(line: string): Promise<void>;
63
+ /** Dispatch all @commands found in multi-line screen output */
64
+ dispatchAll(screenText: string): Promise<void>;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=brain-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agent/brain-dispatcher.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAErE,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAS;gBAEnB,IAAI,EAAE,mBAAmB;IAMrC,oFAAoF;IACpF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI5D,6EAA6E;IAC7E,yBAAyB,IAAI,IAAI;IAIjC,0EAA0E;IAC1E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAwFjD,OAAO,CAAC,YAAY;IAKpB,2EAA2E;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3C,+DAA+D;IACzD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrainDispatcher = void 0;
4
+ class BrainDispatcher {
5
+ projectName;
6
+ sendToWorker;
7
+ sendToBrain;
8
+ commandHandlers = new Map();
9
+ autoFixEnabled = false;
10
+ constructor(opts) {
11
+ this.projectName = opts.projectName;
12
+ this.sendToWorker = opts.sendToWorker;
13
+ this.sendToBrain = opts.sendToBrain;
14
+ }
15
+ /** Register a per-command-type handler. Called with parsed args as string array. */
16
+ registerCommand(type, handler) {
17
+ this.commandHandlers.set(type, handler);
18
+ }
19
+ /** Enable auto-fix extension commands (@audit, @approve, @reject, @merge) */
20
+ registerAutoFixExtensions() {
21
+ this.autoFixEnabled = true;
22
+ }
23
+ /** Parse a single line. Returns undefined if not a recognized command. */
24
+ parseLine(line) {
25
+ const trimmed = line.trim();
26
+ if (!trimmed.startsWith('@'))
27
+ return undefined;
28
+ let m;
29
+ // @w<N> <message>
30
+ m = trimmed.match(/^@w(\d+)\s+(.+)$/is);
31
+ if (m) {
32
+ this._callHandler('worker', [`w${m[1]}`, m[2].trim()]);
33
+ return { type: 'worker', workerId: `w${m[1]}`, message: m[2].trim() };
34
+ }
35
+ // @brain <message>
36
+ m = trimmed.match(/^@brain\s+(.+)$/is);
37
+ if (m) {
38
+ this._callHandler('brain', [m[1].trim()]);
39
+ return { type: 'brain', message: m[1].trim() };
40
+ }
41
+ // @status
42
+ if (/^@status\s*$/i.test(trimmed)) {
43
+ this._callHandler('status', []);
44
+ return { type: 'status', args: [] };
45
+ }
46
+ // @screen w<N>
47
+ m = trimmed.match(/^@screen\s+(w\d+)\s*$/i);
48
+ if (m) {
49
+ this._callHandler('screen', [m[1]]);
50
+ return { type: 'screen', args: [m[1]] };
51
+ }
52
+ // @reply <message>
53
+ m = trimmed.match(/^@reply\s+(.+)$/is);
54
+ if (m) {
55
+ this._callHandler('reply', [m[1].trim()]);
56
+ return { type: 'reply', message: m[1].trim() };
57
+ }
58
+ // @ask w<N> <question>
59
+ m = trimmed.match(/^@ask\s+(w\d+)\s+(.+)$/is);
60
+ if (m) {
61
+ this._callHandler('ask', [m[1], m[2].trim()]);
62
+ return { type: 'ask', workerId: m[1], question: m[2].trim() };
63
+ }
64
+ // Auto-fix extension commands
65
+ if (this.autoFixEnabled) {
66
+ m = trimmed.match(/^@audit\s+(w\d+)\s*$/i);
67
+ if (m) {
68
+ this._callHandler('audit', [m[1]]);
69
+ return { type: 'audit', workerId: m[1] };
70
+ }
71
+ m = trimmed.match(/^@approve\s+(w\d+)\s*$/i);
72
+ if (m) {
73
+ this._callHandler('approve', [m[1]]);
74
+ return { type: 'approve', workerId: m[1] };
75
+ }
76
+ m = trimmed.match(/^@reject\s+(w\d+)\s+(.+)$/is);
77
+ if (m) {
78
+ this._callHandler('reject', [m[1], m[2].trim()]);
79
+ return { type: 'reject', workerId: m[1], findings: m[2].trim() };
80
+ }
81
+ m = trimmed.match(/^@merge\s+(w\d+)\s*$/i);
82
+ if (m) {
83
+ this._callHandler('merge', [m[1]]);
84
+ return { type: 'merge', workerId: m[1] };
85
+ }
86
+ }
87
+ // Custom registered commands: @<name> [args...]
88
+ for (const [name] of this.commandHandlers) {
89
+ const pattern = new RegExp(`^@${name}(?:\\s+(.+))?$`, 'is');
90
+ m = trimmed.match(pattern);
91
+ if (m) {
92
+ const args = m[1] ? m[1].trim().split(/\s+/) : [];
93
+ this._callHandler(name, args);
94
+ return { type: 'custom', name, args };
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ _callHandler(type, args) {
100
+ const handler = this.commandHandlers.get(type);
101
+ if (handler)
102
+ void Promise.resolve(handler(args));
103
+ }
104
+ /** Parse a line, execute built-in routing, and call registered handlers */
105
+ async dispatch(line) {
106
+ const trimmed = line.trim();
107
+ if (!trimmed.startsWith('@'))
108
+ return;
109
+ const cmd = this.parseLine(trimmed);
110
+ if (!cmd)
111
+ return;
112
+ switch (cmd.type) {
113
+ case 'worker':
114
+ await this.sendToWorker(cmd.workerId, cmd.message);
115
+ break;
116
+ case 'brain':
117
+ await this.sendToBrain(cmd.message);
118
+ break;
119
+ case 'ask':
120
+ await this.sendToWorker(cmd.workerId, cmd.question);
121
+ break;
122
+ case 'reply':
123
+ await this.sendToBrain(cmd.message);
124
+ break;
125
+ }
126
+ }
127
+ /** Dispatch all @commands found in multi-line screen output */
128
+ async dispatchAll(screenText) {
129
+ const lines = screenText.split('\n');
130
+ for (const line of lines) {
131
+ await this.dispatch(line);
132
+ }
133
+ }
134
+ }
135
+ exports.BrainDispatcher = BrainDispatcher;
136
+ //# sourceMappingURL=brain-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-dispatcher.js","sourceRoot":"","sources":["../../src/agent/brain-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Port of cc_detect.py — multi-sample status detection for CC, Codex, OpenCode.
3
+ *
4
+ * Detection order: signal file (instant) → multi-sample polling (fallback).
5
+ * Status: 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown'
6
+ */
7
+ export type AgentStatus = 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown';
8
+ export type AgentType = 'claude-code' | 'codex' | 'opencode' | 'shell' | 'script' | 'gemini';
9
+ /** Detect agent status from a captured pane snapshot. */
10
+ export declare function detectStatus(lines: string[], agentType: AgentType): AgentStatus;
11
+ export interface MultiSampleOptions {
12
+ samples?: number;
13
+ intervalMs?: number;
14
+ }
15
+ /**
16
+ * Multi-sample detection: poll N times and return the most common status.
17
+ * Handles timing jitter — a single 'unknown' doesn't override a stable 'idle'.
18
+ */
19
+ export declare function detectStatusMulti(captureLines: () => Promise<string[]>, agentType: AgentType, opts?: MultiSampleOptions): Promise<AgentStatus>;
20
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/agent/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,WAAW,GACX,UAAU,GACV,cAAc,GACd,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA6G7F,yDAAyD;AACzD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,SAAS,GACnB,WAAW,CAsDb;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACrC,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,WAAW,CAAC,CAiCtB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Port of cc_detect.py — multi-sample status detection for CC, Codex, OpenCode.
4
+ *
5
+ * Detection order: signal file (instant) → multi-sample polling (fallback).
6
+ * Status: 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown'
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.detectStatus = detectStatus;
10
+ exports.detectStatusMulti = detectStatusMulti;
11
+ // ─── Claude Code patterns ─────────────────────────────────────────────────────
12
+ const CC_IDLE_PATTERNS = [
13
+ /❯\s*$/m, // ❯ prompt
14
+ /✓\s*$/m, // completion check
15
+ ];
16
+ const CC_SPINNER_CHARS = [
17
+ '⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏', // braille
18
+ ];
19
+ const CC_THINKING_PATTERNS = [
20
+ /\bThinking\b/i,
21
+ /\bAnalyz/i,
22
+ ];
23
+ const CC_TOOL_PATTERNS = [
24
+ /\bRunning\b/i,
25
+ /\bExecuting\b/i,
26
+ /ToolUse/,
27
+ /Bash\(|Read\(|Write\(|Edit\(/,
28
+ ];
29
+ const CC_PERMISSION_PATTERNS = [
30
+ /Allow|Deny/,
31
+ /\[Y\/n\]/i,
32
+ /Do you want to/i,
33
+ ];
34
+ // ─── Codex patterns ────────────────────────────────────────────────────────────
35
+ const CODEX_IDLE_PATTERNS = [
36
+ />\s*$/m, // > prompt
37
+ /›\s*$/m, // › prompt (alternate)
38
+ /context_pct:\s*\d+/, // context indicator (idle state)
39
+ ];
40
+ const CODEX_SPINNER_CHARS = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
41
+ const CODEX_THINKING_PATTERNS = [
42
+ /\bthinking\b/i,
43
+ /\breasoning\b/i,
44
+ ];
45
+ const CODEX_TOOL_PATTERNS = [
46
+ /shell\(/i,
47
+ /file\(/i,
48
+ ];
49
+ // ─── OpenCode patterns ─────────────────────────────────────────────────────────
50
+ const OC_IDLE_PATTERNS = [
51
+ /λ\s*$/m, // λ prompt
52
+ />\s*$/m, // > prompt (fallback)
53
+ ];
54
+ const OC_SPINNER_CHARS = ['|', '/', '-', '\\'];
55
+ const OC_THINKING_PATTERNS = [
56
+ /\bthinking\b/i,
57
+ ];
58
+ const OC_TOOL_PATTERNS = [
59
+ /\brun\b/i,
60
+ /\btool\b/i,
61
+ ];
62
+ // ─── Gemini CLI patterns ───────────────────────────────────────────────────────
63
+ const GEMINI_IDLE_PATTERNS = [
64
+ />\s*$/m, // > prompt (primary — confirmed from TUI)
65
+ /❯\s*$/m, // ❯ prompt (fallback)
66
+ ];
67
+ const GEMINI_SPINNER_CHARS = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
68
+ const GEMINI_THINKING_PATTERNS = [
69
+ /\bThinking\b/i,
70
+ /\bGenerating\b/i,
71
+ ];
72
+ const GEMINI_TOOL_PATTERNS = [
73
+ /\bRunning\b/i,
74
+ /\bExecuting\b/i,
75
+ /tool_use/i,
76
+ ];
77
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
78
+ function hasSpinner(lines, spinners) {
79
+ // Match spinner chars only when they appear at line boundaries or surrounded by spaces
80
+ // to avoid false positives from hyphens in words like "my-project"
81
+ const lastFew = lines.slice(-5).join('\n');
82
+ return spinners.some((s) => {
83
+ // For single ASCII chars that could appear in words, require word boundary context
84
+ if (s.length === 1 && /[-/\\|]/.test(s)) {
85
+ const escaped = s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
86
+ return new RegExp(`(?:^|\\s)${escaped}(?:\\s|$)`, 'm').test(lastFew);
87
+ }
88
+ return lastFew.includes(s);
89
+ });
90
+ }
91
+ function matchesAny(text, patterns) {
92
+ return patterns.some((p) => p.test(text));
93
+ }
94
+ /** Detect agent status from a captured pane snapshot. */
95
+ function detectStatus(lines, agentType) {
96
+ const text = lines.join('\n');
97
+ const tail = lines.slice(-10).join('\n');
98
+ switch (agentType) {
99
+ case 'claude-code':
100
+ if (matchesAny(tail, CC_PERMISSION_PATTERNS))
101
+ return 'permission';
102
+ if (matchesAny(tail, CC_IDLE_PATTERNS) && !hasSpinner(lines, CC_SPINNER_CHARS))
103
+ return 'idle';
104
+ if (matchesAny(text, CC_TOOL_PATTERNS))
105
+ return 'tool_running';
106
+ if (hasSpinner(lines, CC_SPINNER_CHARS)) {
107
+ if (matchesAny(text, CC_THINKING_PATTERNS))
108
+ return 'thinking';
109
+ return 'streaming';
110
+ }
111
+ break;
112
+ case 'codex':
113
+ if (matchesAny(tail, CODEX_IDLE_PATTERNS) && !hasSpinner(lines, CODEX_SPINNER_CHARS))
114
+ return 'idle';
115
+ if (matchesAny(text, CODEX_TOOL_PATTERNS))
116
+ return 'tool_running';
117
+ if (hasSpinner(lines, CODEX_SPINNER_CHARS)) {
118
+ if (matchesAny(text, CODEX_THINKING_PATTERNS))
119
+ return 'thinking';
120
+ return 'streaming';
121
+ }
122
+ break;
123
+ case 'opencode':
124
+ if (matchesAny(tail, OC_IDLE_PATTERNS) && !hasSpinner(lines, OC_SPINNER_CHARS))
125
+ return 'idle';
126
+ if (matchesAny(text, OC_TOOL_PATTERNS))
127
+ return 'tool_running';
128
+ if (hasSpinner(lines, OC_SPINNER_CHARS)) {
129
+ if (matchesAny(text, OC_THINKING_PATTERNS))
130
+ return 'thinking';
131
+ return 'streaming';
132
+ }
133
+ break;
134
+ case 'gemini':
135
+ if (matchesAny(tail, GEMINI_IDLE_PATTERNS) && !hasSpinner(lines, GEMINI_SPINNER_CHARS))
136
+ return 'idle';
137
+ if (matchesAny(text, GEMINI_TOOL_PATTERNS))
138
+ return 'tool_running';
139
+ if (hasSpinner(lines, GEMINI_SPINNER_CHARS)) {
140
+ if (matchesAny(text, GEMINI_THINKING_PATTERNS))
141
+ return 'thinking';
142
+ return 'streaming';
143
+ }
144
+ break;
145
+ case 'shell':
146
+ // Shell idle: last non-empty line ends with a common prompt char
147
+ if (/[$%›>#]\s*$/.test(tail.trimEnd()))
148
+ return 'idle';
149
+ break;
150
+ }
151
+ // No active signals (no spinner, no tool output) → assume idle
152
+ return 'idle';
153
+ }
154
+ /**
155
+ * Multi-sample detection: poll N times and return the most common status.
156
+ * Handles timing jitter — a single 'unknown' doesn't override a stable 'idle'.
157
+ */
158
+ async function detectStatusMulti(captureLines, agentType, opts) {
159
+ const samples = opts?.samples ?? 3;
160
+ const intervalMs = opts?.intervalMs ?? 500;
161
+ const results = [];
162
+ for (let i = 0; i < samples; i++) {
163
+ if (i > 0)
164
+ await new Promise((r) => setTimeout(r, intervalMs));
165
+ const lines = await captureLines();
166
+ results.push(detectStatus(lines, agentType));
167
+ }
168
+ // Count frequencies
169
+ const freq = new Map();
170
+ for (const s of results)
171
+ freq.set(s, (freq.get(s) ?? 0) + 1);
172
+ // Most common wins; ties broken by priority: idle > streaming > thinking > tool_running > permission > unknown
173
+ const priority = [
174
+ 'idle', 'streaming', 'thinking', 'tool_running', 'permission', 'unknown',
175
+ ];
176
+ let best = 'unknown';
177
+ let bestCount = 0;
178
+ for (const status of priority) {
179
+ const count = freq.get(status) ?? 0;
180
+ if (count > bestCount) {
181
+ bestCount = count;
182
+ best = status;
183
+ }
184
+ }
185
+ return best;
186
+ }
187
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/agent/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { AgentStatus, AgentType } from '../detect.js';
2
+ export type DeleteBufferFn = () => Promise<void>;
3
+ export interface LaunchOptions {
4
+ cwd?: string;
5
+ /** When true, start a fresh session without resuming the last conversation. */
6
+ fresh?: boolean;
7
+ /** CC session UUID for --session-id / --resume (CC sub-sessions only) */
8
+ ccSessionId?: string;
9
+ /** Codex session UUID for `codex resume <UUID>`. */
10
+ codexSessionId?: string;
11
+ /** Codex model override — passed as `-m MODEL` flag on launch. */
12
+ codexModel?: string;
13
+ /** Gemini session UUID for `gemini --resume <UUID>`. */
14
+ geminiSessionId?: string;
15
+ }
16
+ export interface AgentDriver {
17
+ readonly type: AgentType;
18
+ /** Primary idle prompt character(s) */
19
+ readonly promptChar: string;
20
+ /** Spinner characters used while active */
21
+ readonly spinnerChars: string[];
22
+ /** Build the shell command to launch the agent (fresh start). */
23
+ buildLaunchCommand(sessionName: string, opts?: LaunchOptions): string;
24
+ /**
25
+ * Build the shell command to resume the most recent session.
26
+ * Returns null if this agent does not support resume.
27
+ */
28
+ buildResumeCommand(sessionName: string, opts?: LaunchOptions): string | null;
29
+ /**
30
+ * Detect the current status from captured pane lines.
31
+ * May use agent-specific heuristics on top of the shared detect.ts logic.
32
+ */
33
+ detectStatus(lines: string[]): AgentStatus;
34
+ /**
35
+ * Returns true if the pane is currently showing an overlay (e.g. CC permission dialog,
36
+ * Codex context menu). When true, the agent is not idle.
37
+ */
38
+ isOverlay(lines: string[]): boolean;
39
+ /**
40
+ * Optional: Called after session launch to auto-dismiss startup prompts
41
+ * (trust folder, settings errors, update dialogs, etc.).
42
+ * Should return once the agent is ready (idle prompt visible) or after timeout.
43
+ */
44
+ postLaunch?(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
45
+ /**
46
+ * Capture the last agent response cleanly.
47
+ * CC: send /copy and read tmux buffer. Others: use capture-pane.
48
+ * @param capturePane - function to get current pane lines
49
+ * @param sendKeys - function to send keys to the session
50
+ * @param showBuffer - function to read tmux paste buffer
51
+ */
52
+ /**
53
+ * @param deleteBuffer - optional fn to clear tmux buffer after reading (task 12.15 clipboard cleanup)
54
+ */
55
+ captureLastResponse(capturePane: () => Promise<string[]>, sendKeys: (keys: string) => Promise<void>, showBuffer: () => Promise<string>, deleteBuffer?: DeleteBufferFn): Promise<string>;
56
+ }
57
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAEhC,iEAAiE;IACjE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAEtE;;;OAGG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IAE7E;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IAE3C;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpC;;;;OAIG;IACH,UAAU,CAAC,CACT,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,CAAC;IAEjB;;;;;;OAMG;IACH;;OAEG;IACH,mBAAmB,CACjB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACzC,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,cAAc,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/agent/drivers/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { AgentDriver, LaunchOptions, DeleteBufferFn } from './base.js';
2
+ import type { AgentStatus } from '../detect.js';
3
+ export declare class ClaudeCodeDriver implements AgentDriver {
4
+ readonly type: "claude-code";
5
+ readonly promptChar = "\u276F";
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>, deleteBuffer?: DeleteBufferFn): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA8BhD,qBAAa,gBAAiB,YAAW,WAAW;IAClD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,UAAU,YAAO;IAC1B,QAAQ,CAAC,YAAY,WAAsD;IAE3E,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;IAShE,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;IAwChB,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,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACzC,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,cAAc,GAC5B,OAAO,CAAC,MAAM,CAAC;CAiBnB"}