botmux 1.0.0

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 (202) hide show
  1. package/.env.example +24 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +267 -0
  4. package/README.md +267 -0
  5. package/dist/adapters/backend/pty-backend.d.ts +13 -0
  6. package/dist/adapters/backend/pty-backend.d.ts.map +1 -0
  7. package/dist/adapters/backend/pty-backend.js +39 -0
  8. package/dist/adapters/backend/pty-backend.js.map +1 -0
  9. package/dist/adapters/backend/tmux-backend.d.ts +20 -0
  10. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -0
  11. package/dist/adapters/backend/tmux-backend.js +30 -0
  12. package/dist/adapters/backend/tmux-backend.js.map +1 -0
  13. package/dist/adapters/backend/types.d.ts +19 -0
  14. package/dist/adapters/backend/types.d.ts.map +1 -0
  15. package/dist/adapters/backend/types.js +2 -0
  16. package/dist/adapters/backend/types.js.map +1 -0
  17. package/dist/adapters/cli/aiden.d.ts +4 -0
  18. package/dist/adapters/cli/aiden.d.ts.map +1 -0
  19. package/dist/adapters/cli/aiden.js +63 -0
  20. package/dist/adapters/cli/aiden.js.map +1 -0
  21. package/dist/adapters/cli/claude-code.d.ts +4 -0
  22. package/dist/adapters/cli/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/cli/claude-code.js +59 -0
  24. package/dist/adapters/cli/claude-code.js.map +1 -0
  25. package/dist/adapters/cli/coco.d.ts +4 -0
  26. package/dist/adapters/cli/coco.d.ts.map +1 -0
  27. package/dist/adapters/cli/coco.js +46 -0
  28. package/dist/adapters/cli/coco.js.map +1 -0
  29. package/dist/adapters/cli/codex.d.ts +4 -0
  30. package/dist/adapters/cli/codex.d.ts.map +1 -0
  31. package/dist/adapters/cli/codex.js +47 -0
  32. package/dist/adapters/cli/codex.js.map +1 -0
  33. package/dist/adapters/cli/registry.d.ts +13 -0
  34. package/dist/adapters/cli/registry.d.ts.map +1 -0
  35. package/dist/adapters/cli/registry.js +42 -0
  36. package/dist/adapters/cli/registry.js.map +1 -0
  37. package/dist/adapters/cli/types.d.ts +39 -0
  38. package/dist/adapters/cli/types.d.ts.map +1 -0
  39. package/dist/adapters/cli/types.js +2 -0
  40. package/dist/adapters/cli/types.js.map +1 -0
  41. package/dist/cli.d.ts +3 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +245 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/config.d.ts +24 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +39 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/core/command-handler.d.ts +11 -0
  50. package/dist/core/command-handler.d.ts.map +1 -0
  51. package/dist/core/command-handler.js +322 -0
  52. package/dist/core/command-handler.js.map +1 -0
  53. package/dist/core/cost-calculator.d.ts +12 -0
  54. package/dist/core/cost-calculator.d.ts.map +1 -0
  55. package/dist/core/cost-calculator.js +61 -0
  56. package/dist/core/cost-calculator.js.map +1 -0
  57. package/dist/core/scheduler.d.ts +38 -0
  58. package/dist/core/scheduler.d.ts.map +1 -0
  59. package/dist/core/scheduler.js +221 -0
  60. package/dist/core/scheduler.js.map +1 -0
  61. package/dist/core/session-manager.d.ts +13 -0
  62. package/dist/core/session-manager.d.ts.map +1 -0
  63. package/dist/core/session-manager.js +125 -0
  64. package/dist/core/session-manager.js.map +1 -0
  65. package/dist/core/types.d.ts +29 -0
  66. package/dist/core/types.d.ts.map +1 -0
  67. package/dist/core/types.js +2 -0
  68. package/dist/core/types.js.map +1 -0
  69. package/dist/core/worker-pool.d.ts +26 -0
  70. package/dist/core/worker-pool.d.ts.map +1 -0
  71. package/dist/core/worker-pool.js +261 -0
  72. package/dist/core/worker-pool.js.map +1 -0
  73. package/dist/daemon.d.ts +3 -0
  74. package/dist/daemon.d.ts.map +1 -0
  75. package/dist/daemon.js +344 -0
  76. package/dist/daemon.js.map +1 -0
  77. package/dist/im/lark/card-builder.d.ts +18 -0
  78. package/dist/im/lark/card-builder.d.ts.map +1 -0
  79. package/dist/im/lark/card-builder.js +194 -0
  80. package/dist/im/lark/card-builder.js.map +1 -0
  81. package/dist/im/lark/card-handler.d.ts +9 -0
  82. package/dist/im/lark/card-handler.d.ts.map +1 -0
  83. package/dist/im/lark/card-handler.js +131 -0
  84. package/dist/im/lark/card-handler.js.map +1 -0
  85. package/dist/im/lark/client.d.ts +23 -0
  86. package/dist/im/lark/client.d.ts.map +1 -0
  87. package/dist/im/lark/client.js +259 -0
  88. package/dist/im/lark/client.js.map +1 -0
  89. package/dist/im/lark/event-dispatcher.d.ts +34 -0
  90. package/dist/im/lark/event-dispatcher.d.ts.map +1 -0
  91. package/dist/im/lark/event-dispatcher.js +195 -0
  92. package/dist/im/lark/event-dispatcher.js.map +1 -0
  93. package/dist/im/lark/message-parser.d.ts +45 -0
  94. package/dist/im/lark/message-parser.d.ts.map +1 -0
  95. package/dist/im/lark/message-parser.js +132 -0
  96. package/dist/im/lark/message-parser.js.map +1 -0
  97. package/dist/im/types.d.ts +78 -0
  98. package/dist/im/types.d.ts.map +1 -0
  99. package/dist/im/types.js +2 -0
  100. package/dist/im/types.js.map +1 -0
  101. package/dist/index-daemon.d.ts +3 -0
  102. package/dist/index-daemon.d.ts.map +1 -0
  103. package/dist/index-daemon.js +21 -0
  104. package/dist/index-daemon.js.map +1 -0
  105. package/dist/index.d.ts +3 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +16 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/scheduler.d.ts +38 -0
  110. package/dist/scheduler.d.ts.map +1 -0
  111. package/dist/scheduler.js +221 -0
  112. package/dist/scheduler.js.map +1 -0
  113. package/dist/server.d.ts +3 -0
  114. package/dist/server.d.ts.map +1 -0
  115. package/dist/server.js +23 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/services/lark-client.d.ts +22 -0
  118. package/dist/services/lark-client.d.ts.map +1 -0
  119. package/dist/services/lark-client.js +238 -0
  120. package/dist/services/lark-client.js.map +1 -0
  121. package/dist/services/lark-ws.d.ts +5 -0
  122. package/dist/services/lark-ws.d.ts.map +1 -0
  123. package/dist/services/lark-ws.js +79 -0
  124. package/dist/services/lark-ws.js.map +1 -0
  125. package/dist/services/message-queue.d.ts +9 -0
  126. package/dist/services/message-queue.d.ts.map +1 -0
  127. package/dist/services/message-queue.js +77 -0
  128. package/dist/services/message-queue.js.map +1 -0
  129. package/dist/services/message-router.d.ts +8 -0
  130. package/dist/services/message-router.d.ts.map +1 -0
  131. package/dist/services/message-router.js +73 -0
  132. package/dist/services/message-router.js.map +1 -0
  133. package/dist/services/project-scanner.d.ts +12 -0
  134. package/dist/services/project-scanner.d.ts.map +1 -0
  135. package/dist/services/project-scanner.js +109 -0
  136. package/dist/services/project-scanner.js.map +1 -0
  137. package/dist/services/schedule-store.d.ts +14 -0
  138. package/dist/services/schedule-store.d.ts.map +1 -0
  139. package/dist/services/schedule-store.js +89 -0
  140. package/dist/services/schedule-store.js.map +1 -0
  141. package/dist/services/session-store.d.ts +8 -0
  142. package/dist/services/session-store.d.ts.map +1 -0
  143. package/dist/services/session-store.js +93 -0
  144. package/dist/services/session-store.js.map +1 -0
  145. package/dist/tools/close-session.d.ts +22 -0
  146. package/dist/tools/close-session.d.ts.map +1 -0
  147. package/dist/tools/close-session.js +38 -0
  148. package/dist/tools/close-session.js.map +1 -0
  149. package/dist/tools/create-session.d.ts +28 -0
  150. package/dist/tools/create-session.d.ts.map +1 -0
  151. package/dist/tools/create-session.js +40 -0
  152. package/dist/tools/create-session.js.map +1 -0
  153. package/dist/tools/get-thread-messages.d.ts +26 -0
  154. package/dist/tools/get-thread-messages.d.ts.map +1 -0
  155. package/dist/tools/get-thread-messages.js +33 -0
  156. package/dist/tools/get-thread-messages.js.map +1 -0
  157. package/dist/tools/index.d.ts +9 -0
  158. package/dist/tools/index.d.ts.map +1 -0
  159. package/dist/tools/index.js +10 -0
  160. package/dist/tools/index.js.map +1 -0
  161. package/dist/tools/react-to-message.d.ts +41 -0
  162. package/dist/tools/react-to-message.d.ts.map +1 -0
  163. package/dist/tools/react-to-message.js +30 -0
  164. package/dist/tools/react-to-message.js.map +1 -0
  165. package/dist/tools/send-to-thread.d.ts +24 -0
  166. package/dist/tools/send-to-thread.d.ts.map +1 -0
  167. package/dist/tools/send-to-thread.js +83 -0
  168. package/dist/tools/send-to-thread.js.map +1 -0
  169. package/dist/tools/wait-for-reply.d.ts +17 -0
  170. package/dist/tools/wait-for-reply.d.ts.map +1 -0
  171. package/dist/tools/wait-for-reply.js +65 -0
  172. package/dist/tools/wait-for-reply.js.map +1 -0
  173. package/dist/types.d.ts +85 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/types.js +6 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/utils/card-builder.d.ts +16 -0
  178. package/dist/utils/card-builder.d.ts.map +1 -0
  179. package/dist/utils/card-builder.js +183 -0
  180. package/dist/utils/card-builder.js.map +1 -0
  181. package/dist/utils/idle-detector.d.ts +21 -0
  182. package/dist/utils/idle-detector.d.ts.map +1 -0
  183. package/dist/utils/idle-detector.js +95 -0
  184. package/dist/utils/idle-detector.js.map +1 -0
  185. package/dist/utils/logger.d.ts +7 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +22 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/message-parser.d.ts +45 -0
  190. package/dist/utils/message-parser.d.ts.map +1 -0
  191. package/dist/utils/message-parser.js +132 -0
  192. package/dist/utils/message-parser.js.map +1 -0
  193. package/dist/utils/terminal-renderer.d.ts +39 -0
  194. package/dist/utils/terminal-renderer.d.ts.map +1 -0
  195. package/dist/utils/terminal-renderer.js +186 -0
  196. package/dist/utils/terminal-renderer.js.map +1 -0
  197. package/dist/worker.d.ts +3 -0
  198. package/dist/worker.d.ts.map +1 -0
  199. package/dist/worker.js +411 -0
  200. package/dist/worker.js.map +1 -0
  201. package/ecosystem.config.cjs +15 -0
  202. package/package.json +60 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * TmuxBackend — experimental session backend using tmux.
3
+ * Enables: physical `tmux attach`, web terminal, and IM all on same session.
4
+ * TODO: Full implementation.
5
+ */
6
+ export class TmuxBackend {
7
+ sessionName = '';
8
+ spawn(bin, args, opts) {
9
+ throw new Error('TmuxBackend is not yet implemented');
10
+ }
11
+ write(data) {
12
+ throw new Error('TmuxBackend is not yet implemented');
13
+ }
14
+ resize(_cols, _rows) {
15
+ // tmux resize is handled by the attaching client
16
+ }
17
+ onData(_cb) {
18
+ throw new Error('TmuxBackend is not yet implemented');
19
+ }
20
+ onExit(_cb) {
21
+ throw new Error('TmuxBackend is not yet implemented');
22
+ }
23
+ kill() {
24
+ throw new Error('TmuxBackend is not yet implemented');
25
+ }
26
+ getAttachInfo() {
27
+ return { type: 'tmux', sessionName: this.sessionName };
28
+ }
29
+ }
30
+ //# sourceMappingURL=tmux-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACd,WAAW,GAAG,EAAE,CAAC;IAEzB,KAAK,CAAC,GAAW,EAAE,IAAc,EAAE,IAAe;QAChD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAAa;QACjC,iDAAiD;IACnD,CAAC;IAED,MAAM,CAAC,GAA2B;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,GAAyD;QAC9D,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI;QACF,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,aAAa;QACX,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ export interface SpawnOpts {
2
+ cwd: string;
3
+ cols: number;
4
+ rows: number;
5
+ env: Record<string, string>;
6
+ }
7
+ export interface SessionBackend {
8
+ spawn(bin: string, args: string[], opts: SpawnOpts): void;
9
+ write(data: string): void;
10
+ resize(cols: number, rows: number): void;
11
+ onData(cb: (data: string) => void): void;
12
+ onExit(cb: (code: number | null, signal: string | null) => void): void;
13
+ kill(): void;
14
+ getAttachInfo?(): {
15
+ type: 'tmux';
16
+ sessionName: string;
17
+ } | null;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACvE,IAAI,IAAI,IAAI,CAAC;IACb,aAAa,CAAC,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/backend/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createAidenAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createAidenAdapter;
4
+ //# sourceMappingURL=aiden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiden.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAmDpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { resolveCommand } from './registry.js';
5
+ function delay(ms) {
6
+ return new Promise(resolve => setTimeout(resolve, ms));
7
+ }
8
+ export function createAidenAdapter(pathOverride) {
9
+ const bin = resolveCommand(pathOverride ?? 'aiden');
10
+ return {
11
+ id: 'aiden',
12
+ resolvedBin: bin,
13
+ buildArgs({ sessionId, resume }) {
14
+ const args = [];
15
+ if (resume) {
16
+ args.push('--resume', sessionId);
17
+ }
18
+ // Aiden auto-generates session id for new sessions
19
+ args.push('--permission-mode', 'agentFull');
20
+ return args;
21
+ },
22
+ async writeInput(pty, content) {
23
+ pty.write(content);
24
+ await delay(200);
25
+ pty.write('\r');
26
+ if (content.includes('\n')) {
27
+ await delay(200);
28
+ pty.write('\r');
29
+ }
30
+ },
31
+ ensureMcpConfig(entry) {
32
+ const configPath = join(homedir(), '.aiden', '.mcp.json');
33
+ let data = {};
34
+ if (existsSync(configPath)) {
35
+ try {
36
+ data = JSON.parse(readFileSync(configPath, 'utf-8'));
37
+ }
38
+ catch { /* fresh */ }
39
+ }
40
+ if (!data.mcpServers)
41
+ data.mcpServers = {};
42
+ const existing = data.mcpServers[entry.name];
43
+ if (existing && existing.args?.[0] === entry.args[0])
44
+ return;
45
+ data.mcpServers[entry.name] = {
46
+ command: entry.command,
47
+ args: entry.args,
48
+ env: entry.env,
49
+ };
50
+ try {
51
+ mkdirSync(dirname(configPath), { recursive: true });
52
+ writeFileSync(configPath, JSON.stringify(data, null, 2) + '\n');
53
+ }
54
+ catch (err) {
55
+ console.warn(`[aiden] Failed to write MCP config: ${err.message}`);
56
+ }
57
+ },
58
+ completionPattern: undefined, // quiescence only
59
+ altScreen: false,
60
+ };
61
+ }
62
+ export const create = createAidenAdapter;
63
+ //# sourceMappingURL=aiden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiden.js","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createClaudeCodeAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createClaudeCodeAdapter;
4
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAIxE,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgDzE;AAED,eAAO,MAAM,MAAM,gCAA0B,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { resolveCommand } from './registry.js';
5
+ const COMPLETION_RE = /\u2733\s*(?:Worked|Crunched|Cogitated|Cooked|Churned|Saut[eé]ed) for \d+[smh]/;
6
+ export function createClaudeCodeAdapter(pathOverride) {
7
+ const bin = resolveCommand(pathOverride ?? 'claude');
8
+ return {
9
+ id: 'claude-code',
10
+ resolvedBin: bin,
11
+ buildArgs({ sessionId, resume }) {
12
+ const args = [];
13
+ if (resume) {
14
+ args.push('--resume', sessionId);
15
+ }
16
+ else {
17
+ args.push('--session-id', sessionId);
18
+ }
19
+ args.push('--dangerously-skip-permissions');
20
+ return args;
21
+ },
22
+ async writeInput(pty, content) {
23
+ pty.write(content + '\r');
24
+ },
25
+ ensureMcpConfig(entry) {
26
+ const configPath = join(homedir(), '.claude.json');
27
+ let data = {};
28
+ if (existsSync(configPath)) {
29
+ try {
30
+ data = JSON.parse(readFileSync(configPath, 'utf-8'));
31
+ }
32
+ catch { /* fresh */ }
33
+ }
34
+ if (!data.mcpServers)
35
+ data.mcpServers = {};
36
+ const existing = data.mcpServers[entry.name];
37
+ const envMatch = existing && JSON.stringify(existing.env) === JSON.stringify(entry.env);
38
+ if (existing && existing.args?.[0] === entry.args[0] && envMatch)
39
+ return;
40
+ data.mcpServers[entry.name] = {
41
+ command: entry.command,
42
+ args: entry.args,
43
+ env: entry.env,
44
+ };
45
+ try {
46
+ mkdirSync(dirname(configPath), { recursive: true });
47
+ writeFileSync(configPath, JSON.stringify(data, null, 2) + '\n');
48
+ }
49
+ catch (err) {
50
+ console.warn(`[claude-code] Failed to write MCP config: ${err.message}`);
51
+ }
52
+ },
53
+ completionPattern: COMPLETION_RE,
54
+ readyPattern: /❯/,
55
+ altScreen: false,
56
+ };
57
+ }
58
+ export const create = createClaudeCodeAdapter;
59
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,aAAa,GAAG,+EAA+E,CAAC;AAEtG,MAAM,UAAU,uBAAuB,CAAC,YAAqB;IAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC;IACrD,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO;YAC3B,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,eAAe,CAAC,KAAK;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;YACnD,IAAI,IAAI,GAAQ,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxF,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ;gBAAE,OAAO;YACzE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC;YACF,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,aAAa;QAChC,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createCocoAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createCocoAdapter;
4
+ //# sourceMappingURL=coco.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coco.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAExE,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA2CnE;AAED,eAAO,MAAM,MAAM,0BAAoB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { resolveCommand } from './registry.js';
3
+ export function createCocoAdapter(pathOverride) {
4
+ const bin = resolveCommand(pathOverride ?? 'coco');
5
+ return {
6
+ id: 'coco',
7
+ resolvedBin: bin,
8
+ buildArgs({ sessionId, resume }) {
9
+ const args = [];
10
+ if (resume) {
11
+ args.push('--resume', sessionId);
12
+ }
13
+ else {
14
+ args.push('--session-id', sessionId);
15
+ }
16
+ args.push('--yolo');
17
+ return args;
18
+ },
19
+ async writeInput(pty, content) {
20
+ pty.write(content + '\r');
21
+ },
22
+ ensureMcpConfig(entry) {
23
+ // Use `coco mcp add-json` CLI — coco stores config in ~/.trae/traecli.yaml
24
+ const json = JSON.stringify({
25
+ command: entry.command,
26
+ args: entry.args,
27
+ env: entry.env,
28
+ });
29
+ try {
30
+ execSync(`${bin} mcp add-json ${entry.name} ${JSON.stringify(json)}`, {
31
+ encoding: 'utf-8',
32
+ timeout: 10_000,
33
+ stdio: 'ignore',
34
+ });
35
+ }
36
+ catch (err) {
37
+ console.warn(`[coco] Failed to add MCP config: ${err.message}`);
38
+ }
39
+ },
40
+ completionPattern: undefined,
41
+ readyPattern: /⏵⏵/, // status bar indicator — present when CoCo's TUI is rendered
42
+ altScreen: false,
43
+ };
44
+ }
45
+ export const create = createCocoAdapter;
46
+ //# sourceMappingURL=coco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coco.js","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,UAAU,iBAAiB,CAAC,YAAqB;IACrD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;IACnD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,eAAe,CAAC,KAAqB;YACnC,2EAA2E;YAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,GAAG,iBAAiB,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE;oBACpE,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,oCAAoC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI,EAAI,6DAA6D;QACnF,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createCodexAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createCodexAdapter;
4
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA0CpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { resolveCommand } from './registry.js';
3
+ function delay(ms) {
4
+ return new Promise(resolve => setTimeout(resolve, ms));
5
+ }
6
+ export function createCodexAdapter(pathOverride) {
7
+ const bin = resolveCommand(pathOverride ?? 'codex');
8
+ return {
9
+ id: 'codex',
10
+ resolvedBin: bin,
11
+ buildArgs() {
12
+ // Codex manages its own session IDs internally — we cannot pass ours.
13
+ // Resume is not supported; daemon always starts a fresh Codex session.
14
+ return [
15
+ '--dangerously-bypass-approvals-and-sandbox',
16
+ '--no-alt-screen',
17
+ ];
18
+ },
19
+ async writeInput(pty, content) {
20
+ pty.write(content);
21
+ await delay(200);
22
+ pty.write('\r');
23
+ },
24
+ ensureMcpConfig(entry) {
25
+ // Remove first so re-registration picks up env changes (e.g. new SESSION_DATA_DIR)
26
+ try {
27
+ execSync(`${bin} mcp remove ${entry.name}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
28
+ }
29
+ catch { /* not registered yet — fine */ }
30
+ const envArgs = Object.entries(entry.env)
31
+ .map(([k, v]) => `--env ${k}=${v}`)
32
+ .join(' ');
33
+ const cmd = `${bin} mcp add ${entry.name} ${envArgs} -- ${entry.command} ${entry.args.join(' ')}`;
34
+ try {
35
+ execSync(cmd, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
36
+ }
37
+ catch (err) {
38
+ console.warn(`[codex] Failed to add MCP config: ${err.message}`);
39
+ }
40
+ },
41
+ completionPattern: undefined,
42
+ readyPattern: /›/, // prompt indicator — present when Codex's input box is rendered
43
+ altScreen: false, // --no-alt-screen disables alternate screen
44
+ };
45
+ }
46
+ export const create = createCodexAdapter;
47
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,GAAG;QAEhB,SAAS;YACP,sEAAsE;YACtE,uEAAuE;YACvE,OAAO;gBACL,4CAA4C;gBAC5C,iBAAiB;aAClB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,eAAe,CAAC,KAAqB;YACnC,mFAAmF;YACnF,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,GAAG,eAAe,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvG,CAAC;YAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;iBAClC,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,IAAI,IAAI,OAAO,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClG,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,qCAAqC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,GAAG,EAAG,gEAAgE;QACpF,SAAS,EAAE,KAAK,EAAI,4CAA4C;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CliAdapter, CliId } from './types.js';
2
+ import { createClaudeCodeAdapter } from './claude-code.js';
3
+ import { createAidenAdapter } from './aiden.js';
4
+ import { createCocoAdapter } from './coco.js';
5
+ import { createCodexAdapter } from './codex.js';
6
+ /** Resolve a command name to its absolute path via login-shell `which`. */
7
+ export declare function resolveCommand(cmd: string): string;
8
+ /** Async adapter factory (uses dynamic import for lazy loading in daemon process). */
9
+ export declare function createCliAdapter(id: CliId, pathOverride?: string): Promise<CliAdapter>;
10
+ export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter };
11
+ /** Synchronous version for use in worker process. */
12
+ export declare function createCliAdapterSync(id: CliId, pathOverride?: string): CliAdapter;
13
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUlD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5F;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAE9F,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAQjF"}
@@ -0,0 +1,42 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { isAbsolute } from 'node:path';
3
+ import { createClaudeCodeAdapter } from './claude-code.js';
4
+ import { createAidenAdapter } from './aiden.js';
5
+ import { createCocoAdapter } from './coco.js';
6
+ import { createCodexAdapter } from './codex.js';
7
+ /** Resolve a command name to its absolute path via login-shell `which`. */
8
+ export function resolveCommand(cmd) {
9
+ if (isAbsolute(cmd))
10
+ return cmd;
11
+ const shell = process.env.SHELL || '/bin/zsh';
12
+ const shells = [shell, '/bin/zsh', '/bin/bash'].filter((v, i, a) => a.indexOf(v) === i);
13
+ for (const sh of shells) {
14
+ try {
15
+ return execSync(`${sh} -lc 'which ${cmd}'`, { encoding: 'utf-8', timeout: 5_000 }).trim();
16
+ }
17
+ catch { /* try next shell */ }
18
+ }
19
+ return cmd;
20
+ }
21
+ const adapterCache = new Map();
22
+ /** Async adapter factory (uses dynamic import for lazy loading in daemon process). */
23
+ export async function createCliAdapter(id, pathOverride) {
24
+ const key = `${id}:${pathOverride ?? ''}`;
25
+ if (adapterCache.has(key))
26
+ return adapterCache.get(key);
27
+ const adapter = createCliAdapterSync(id, pathOverride);
28
+ adapterCache.set(key, adapter);
29
+ return adapter;
30
+ }
31
+ export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter };
32
+ /** Synchronous version for use in worker process. */
33
+ export function createCliAdapterSync(id, pathOverride) {
34
+ switch (id) {
35
+ case 'claude-code': return createClaudeCodeAdapter(pathOverride);
36
+ case 'aiden': return createAidenAdapter(pathOverride);
37
+ case 'coco': return createCocoAdapter(pathOverride);
38
+ case 'codex': return createCodexAdapter(pathOverride);
39
+ default: throw new Error(`Unknown CLI adapter: ${id}`);
40
+ }
41
+ }
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEnD,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAS,EAAE,YAAqB;IACrE,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;IAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACzD,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACvD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAE9F,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAC,EAAS,EAAE,YAAqB;IACnE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,aAAa,CAAC,CAAC,OAAO,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACjE,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,CAAC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpD,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface PtyHandle {
2
+ write(data: string): void;
3
+ }
4
+ export interface McpServerEntry {
5
+ name: string;
6
+ command: string;
7
+ args: string[];
8
+ env: Record<string, string>;
9
+ }
10
+ export interface CliAdapter {
11
+ /** Unique identifier */
12
+ readonly id: string;
13
+ /** Resolved absolute path to the CLI binary */
14
+ readonly resolvedBin: string;
15
+ /** Build spawn arguments (bin comes from resolvedBin).
16
+ * Note: workingDir is NOT passed here — it's the backend's cwd, not a CLI arg. */
17
+ buildArgs(opts: {
18
+ sessionId: string;
19
+ resume: boolean;
20
+ }): string[];
21
+ /** Write user input to PTY. May fire writes asynchronously (e.g. Aiden delayed Enter).
22
+ * Resolves when all writes are complete. */
23
+ writeInput(pty: PtyHandle, content: string): Promise<void>;
24
+ /** Install MCP server config. Idempotent — skips if up to date. */
25
+ ensureMcpConfig(entry: McpServerEntry): void;
26
+ /** Completion marker regex (beyond generic quiescence). undefined = quiescence only. */
27
+ readonly completionPattern?: RegExp;
28
+ /** Ready marker regex — matches when the CLI's input prompt is rendered and
29
+ * functional. When set, the idle detector suppresses quiescence-based idle
30
+ * until this pattern appears in the PTY output. Checked every cycle (reset
31
+ * after each prompt), so it gates EVERY idle detection, not just startup.
32
+ *
33
+ * Examples: CoCo `⏵⏵` status bar, Codex `›` prompt indicator. */
34
+ readonly readyPattern?: RegExp;
35
+ /** Whether CLI uses alternate screen buffer */
36
+ readonly altScreen: boolean;
37
+ }
38
+ export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex';
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;uFACmF;IACnF,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,GAAG,MAAM,EAAE,CAAC;IAEb;iDAC6C;IAC7C,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D,mEAAmE;IACnE,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAE7C,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;;;sEAKkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":""}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}