@adhdev/daemon-core 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/dist/index.d.ts +2662 -0
  2. package/dist/index.js +11341 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +48 -0
  5. package/providers/_builtin/.github/workflows/generate-registry.yml +57 -0
  6. package/providers/_builtin/COMPATIBILITY.md +217 -0
  7. package/providers/_builtin/CONTRIBUTING.md +200 -0
  8. package/providers/_builtin/README.md +119 -0
  9. package/providers/_builtin/_helpers/index.js +188 -0
  10. package/providers/_builtin/acp/agentpool/provider.json +54 -0
  11. package/providers/_builtin/acp/amp/provider.json +52 -0
  12. package/providers/_builtin/acp/auggie/provider.json +57 -0
  13. package/providers/_builtin/acp/autodev/provider.json +54 -0
  14. package/providers/_builtin/acp/autohand/provider.json +52 -0
  15. package/providers/_builtin/acp/blackbox-ai/provider.json +54 -0
  16. package/providers/_builtin/acp/claude-agent/provider.json +57 -0
  17. package/providers/_builtin/acp/cline-acp/provider.json +54 -0
  18. package/providers/_builtin/acp/codebuddy/provider.json +54 -0
  19. package/providers/_builtin/acp/codex-cli/provider.json +57 -0
  20. package/providers/_builtin/acp/corust-agent/provider.json +52 -0
  21. package/providers/_builtin/acp/crow-cli/provider.json +54 -0
  22. package/providers/_builtin/acp/cursor-acp/provider.json +54 -0
  23. package/providers/_builtin/acp/deepagents/provider.json +52 -0
  24. package/providers/_builtin/acp/dimcode/provider.json +54 -0
  25. package/providers/_builtin/acp/docker-cagent/provider.json +57 -0
  26. package/providers/_builtin/acp/factory-droid/provider.json +60 -0
  27. package/providers/_builtin/acp/fast-agent/provider.json +52 -0
  28. package/providers/_builtin/acp/gemini-cli/provider.json +114 -0
  29. package/providers/_builtin/acp/github-copilot/provider.json +54 -0
  30. package/providers/_builtin/acp/goose/provider.json +57 -0
  31. package/providers/_builtin/acp/junie/provider.json +52 -0
  32. package/providers/_builtin/acp/kilo/provider.json +54 -0
  33. package/providers/_builtin/acp/kimi-cli/provider.json +57 -0
  34. package/providers/_builtin/acp/minion-code/provider.json +52 -0
  35. package/providers/_builtin/acp/mistral-vibe/provider.json +57 -0
  36. package/providers/_builtin/acp/nova/provider.json +54 -0
  37. package/providers/_builtin/acp/openclaw/provider.json +54 -0
  38. package/providers/_builtin/acp/opencode/provider.json +52 -0
  39. package/providers/_builtin/acp/openhands/provider.json +54 -0
  40. package/providers/_builtin/acp/pi-acp/provider.json +52 -0
  41. package/providers/_builtin/acp/qoder/provider.json +54 -0
  42. package/providers/_builtin/acp/qwen-code/provider.json +60 -0
  43. package/providers/_builtin/acp/stakpak/provider.json +54 -0
  44. package/providers/_builtin/acp/vtcode/provider.json +54 -0
  45. package/providers/_builtin/cli/claude-cli/provider.json +100 -0
  46. package/providers/_builtin/cli/codex-cli/provider.json +89 -0
  47. package/providers/_builtin/cli/gemini-cli/provider.json +93 -0
  48. package/providers/_builtin/docs/CDP_SELECTOR_GUIDE.md +370 -0
  49. package/providers/_builtin/docs/PROVIDER_GUIDE.md +916 -0
  50. package/providers/_builtin/extension/cline/provider.json +35 -0
  51. package/providers/_builtin/extension/cline/scripts/focus_editor.js +48 -0
  52. package/providers/_builtin/extension/cline/scripts/list_chats.js +100 -0
  53. package/providers/_builtin/extension/cline/scripts/list_models.js +43 -0
  54. package/providers/_builtin/extension/cline/scripts/list_modes.js +35 -0
  55. package/providers/_builtin/extension/cline/scripts/new_session.js +85 -0
  56. package/providers/_builtin/extension/cline/scripts/open_panel.js +25 -0
  57. package/providers/_builtin/extension/cline/scripts/read_chat.js +257 -0
  58. package/providers/_builtin/extension/cline/scripts/resolve_action.js +83 -0
  59. package/providers/_builtin/extension/cline/scripts/send_message.js +95 -0
  60. package/providers/_builtin/extension/cline/scripts/set_mode.js +36 -0
  61. package/providers/_builtin/extension/cline/scripts/set_model.js +36 -0
  62. package/providers/_builtin/extension/cline/scripts/switch_session.js +206 -0
  63. package/providers/_builtin/extension/cline/scripts.js +73 -0
  64. package/providers/_builtin/extension/roo-code/provider.json +35 -0
  65. package/providers/_builtin/extension/roo-code/scripts.js +659 -0
  66. package/providers/_builtin/ide/antigravity/provider.json +68 -0
  67. package/providers/_builtin/ide/antigravity/scripts/1.106/focus_editor.js +20 -0
  68. package/providers/_builtin/ide/antigravity/scripts/1.106/list_chats.js +137 -0
  69. package/providers/_builtin/ide/antigravity/scripts/1.106/list_models.js +38 -0
  70. package/providers/_builtin/ide/antigravity/scripts/1.106/list_modes.js +48 -0
  71. package/providers/_builtin/ide/antigravity/scripts/1.106/new_session.js +75 -0
  72. package/providers/_builtin/ide/antigravity/scripts/1.106/read_chat.js +262 -0
  73. package/providers/_builtin/ide/antigravity/scripts/1.106/resolve_action.js +68 -0
  74. package/providers/_builtin/ide/antigravity/scripts/1.106/scripts.js +57 -0
  75. package/providers/_builtin/ide/antigravity/scripts/1.106/send_message.js +56 -0
  76. package/providers/_builtin/ide/antigravity/scripts/1.106/set_mode.js +34 -0
  77. package/providers/_builtin/ide/antigravity/scripts/1.106/set_model.js +47 -0
  78. package/providers/_builtin/ide/antigravity/scripts/1.106/switch_session.js +114 -0
  79. package/providers/_builtin/ide/antigravity/scripts/1.107/focus_editor.js +20 -0
  80. package/providers/_builtin/ide/antigravity/scripts/1.107/list_chats.js +137 -0
  81. package/providers/_builtin/ide/antigravity/scripts/1.107/list_models.js +61 -0
  82. package/providers/_builtin/ide/antigravity/scripts/1.107/list_modes.js +72 -0
  83. package/providers/_builtin/ide/antigravity/scripts/1.107/new_session.js +75 -0
  84. package/providers/_builtin/ide/antigravity/scripts/1.107/read_chat.js +262 -0
  85. package/providers/_builtin/ide/antigravity/scripts/1.107/resolve_action.js +68 -0
  86. package/providers/_builtin/ide/antigravity/scripts/1.107/scripts.js +67 -0
  87. package/providers/_builtin/ide/antigravity/scripts/1.107/send_message.js +56 -0
  88. package/providers/_builtin/ide/antigravity/scripts/1.107/set_mode.js +67 -0
  89. package/providers/_builtin/ide/antigravity/scripts/1.107/set_model.js +72 -0
  90. package/providers/_builtin/ide/antigravity/scripts/1.107/switch_session.js +114 -0
  91. package/providers/_builtin/ide/cursor/provider.json +70 -0
  92. package/providers/_builtin/ide/cursor/scripts/0.49/dismiss_notification.js +30 -0
  93. package/providers/_builtin/ide/cursor/scripts/0.49/focus_editor.js +13 -0
  94. package/providers/_builtin/ide/cursor/scripts/0.49/list_models.js +78 -0
  95. package/providers/_builtin/ide/cursor/scripts/0.49/list_modes.js +40 -0
  96. package/providers/_builtin/ide/cursor/scripts/0.49/list_notifications.js +23 -0
  97. package/providers/_builtin/ide/cursor/scripts/0.49/list_sessions.js +42 -0
  98. package/providers/_builtin/ide/cursor/scripts/0.49/new_session.js +20 -0
  99. package/providers/_builtin/ide/cursor/scripts/0.49/open_panel.js +23 -0
  100. package/providers/_builtin/ide/cursor/scripts/0.49/read_chat.js +75 -0
  101. package/providers/_builtin/ide/cursor/scripts/0.49/resolve_action.js +19 -0
  102. package/providers/_builtin/ide/cursor/scripts/0.49/scripts.js +78 -0
  103. package/providers/_builtin/ide/cursor/scripts/0.49/send_message.js +23 -0
  104. package/providers/_builtin/ide/cursor/scripts/0.49/set_mode.js +38 -0
  105. package/providers/_builtin/ide/cursor/scripts/0.49/set_model.js +81 -0
  106. package/providers/_builtin/ide/cursor/scripts/0.49/switch_session.js +28 -0
  107. package/providers/_builtin/ide/kiro/provider.json +67 -0
  108. package/providers/_builtin/ide/kiro/scripts/focus_editor.js +20 -0
  109. package/providers/_builtin/ide/kiro/scripts/open_panel.js +47 -0
  110. package/providers/_builtin/ide/kiro/scripts/resolve_action.js +54 -0
  111. package/providers/_builtin/ide/kiro/scripts/send_message.js +29 -0
  112. package/providers/_builtin/ide/kiro/scripts/webview_list_models.js +39 -0
  113. package/providers/_builtin/ide/kiro/scripts/webview_list_modes.js +39 -0
  114. package/providers/_builtin/ide/kiro/scripts/webview_list_sessions.js +21 -0
  115. package/providers/_builtin/ide/kiro/scripts/webview_new_session.js +34 -0
  116. package/providers/_builtin/ide/kiro/scripts/webview_read_chat.js +68 -0
  117. package/providers/_builtin/ide/kiro/scripts/webview_send_message.js +72 -0
  118. package/providers/_builtin/ide/kiro/scripts/webview_set_mode.js +15 -0
  119. package/providers/_builtin/ide/kiro/scripts/webview_set_model.js +15 -0
  120. package/providers/_builtin/ide/kiro/scripts/webview_switch_session.js +26 -0
  121. package/providers/_builtin/ide/kiro/scripts.js +62 -0
  122. package/providers/_builtin/ide/pearai/provider.json +67 -0
  123. package/providers/_builtin/ide/pearai/scripts/focus_editor.js +20 -0
  124. package/providers/_builtin/ide/pearai/scripts/list_sessions.js +38 -0
  125. package/providers/_builtin/ide/pearai/scripts/new_session.js +55 -0
  126. package/providers/_builtin/ide/pearai/scripts/open_panel.js +46 -0
  127. package/providers/_builtin/ide/pearai/scripts/resolve_action.js +54 -0
  128. package/providers/_builtin/ide/pearai/scripts/send_message.js +29 -0
  129. package/providers/_builtin/ide/pearai/scripts/webview_list_models.js +43 -0
  130. package/providers/_builtin/ide/pearai/scripts/webview_list_modes.js +35 -0
  131. package/providers/_builtin/ide/pearai/scripts/webview_list_sessions.js +62 -0
  132. package/providers/_builtin/ide/pearai/scripts/webview_new_session.js +49 -0
  133. package/providers/_builtin/ide/pearai/scripts/webview_read_chat.js +92 -0
  134. package/providers/_builtin/ide/pearai/scripts/webview_resolve_action.js +59 -0
  135. package/providers/_builtin/ide/pearai/scripts/webview_send_message.js +72 -0
  136. package/providers/_builtin/ide/pearai/scripts/webview_set_mode.js +36 -0
  137. package/providers/_builtin/ide/pearai/scripts/webview_set_model.js +36 -0
  138. package/providers/_builtin/ide/pearai/scripts/webview_switch_session.js +34 -0
  139. package/providers/_builtin/ide/pearai/scripts.js +74 -0
  140. package/providers/_builtin/ide/trae/provider.json +66 -0
  141. package/providers/_builtin/ide/trae/scripts/focus_editor.js +20 -0
  142. package/providers/_builtin/ide/trae/scripts/list_chats.js +24 -0
  143. package/providers/_builtin/ide/trae/scripts/list_models.js +39 -0
  144. package/providers/_builtin/ide/trae/scripts/list_modes.js +39 -0
  145. package/providers/_builtin/ide/trae/scripts/new_session.js +30 -0
  146. package/providers/_builtin/ide/trae/scripts/open_panel.js +44 -0
  147. package/providers/_builtin/ide/trae/scripts/read_chat.js +113 -0
  148. package/providers/_builtin/ide/trae/scripts/resolve_action.js +54 -0
  149. package/providers/_builtin/ide/trae/scripts/send_message.js +69 -0
  150. package/providers/_builtin/ide/trae/scripts/set_mode.js +15 -0
  151. package/providers/_builtin/ide/trae/scripts/set_model.js +15 -0
  152. package/providers/_builtin/ide/trae/scripts/switch_session.js +23 -0
  153. package/providers/_builtin/ide/trae/scripts.js +57 -0
  154. package/providers/_builtin/ide/vscode/provider.json +64 -0
  155. package/providers/_builtin/ide/vscode-insiders/provider.json +62 -0
  156. package/providers/_builtin/ide/vscodium/provider.json +63 -0
  157. package/providers/_builtin/ide/windsurf/provider.json +53 -0
  158. package/providers/_builtin/ide/windsurf/scripts/focus_editor.js +30 -0
  159. package/providers/_builtin/ide/windsurf/scripts/list_chats.js +117 -0
  160. package/providers/_builtin/ide/windsurf/scripts/list_models.js +39 -0
  161. package/providers/_builtin/ide/windsurf/scripts/list_modes.js +39 -0
  162. package/providers/_builtin/ide/windsurf/scripts/new_session.js +69 -0
  163. package/providers/_builtin/ide/windsurf/scripts/open_panel.js +58 -0
  164. package/providers/_builtin/ide/windsurf/scripts/read_chat.js +297 -0
  165. package/providers/_builtin/ide/windsurf/scripts/resolve_action.js +68 -0
  166. package/providers/_builtin/ide/windsurf/scripts/send_message.js +87 -0
  167. package/providers/_builtin/ide/windsurf/scripts/set_mode.js +15 -0
  168. package/providers/_builtin/ide/windsurf/scripts/set_model.js +15 -0
  169. package/providers/_builtin/ide/windsurf/scripts/switch_session.js +58 -0
  170. package/providers/_builtin/ide/windsurf/scripts.js +57 -0
  171. package/providers/_builtin/registry.json +266 -0
  172. package/providers/_builtin/validate.js +156 -0
  173. package/src/agent-stream/index.ts +6 -0
  174. package/src/agent-stream/manager.ts +286 -0
  175. package/src/agent-stream/poller.ts +154 -0
  176. package/src/agent-stream/provider-adapter.ts +138 -0
  177. package/src/agent-stream/types.ts +61 -0
  178. package/src/boot/daemon-lifecycle.ts +252 -0
  179. package/src/cdp/devtools.ts +335 -0
  180. package/src/cdp/initializer.ts +191 -0
  181. package/src/cdp/manager.ts +897 -0
  182. package/src/cdp/scanner.ts +185 -0
  183. package/src/cdp/setup.ts +150 -0
  184. package/src/cli-adapter-types.ts +25 -0
  185. package/src/cli-adapters/provider-cli-adapter.ts +448 -0
  186. package/src/commands/cdp-commands.ts +208 -0
  187. package/src/commands/chat-commands.ts +675 -0
  188. package/src/commands/cli-manager.ts +353 -0
  189. package/src/commands/handler.ts +328 -0
  190. package/src/commands/router.ts +258 -0
  191. package/src/commands/stream-commands.ts +325 -0
  192. package/src/config/chat-history.ts +211 -0
  193. package/src/config/config.ts +219 -0
  194. package/src/daemon/dev-server.ts +2378 -0
  195. package/src/daemon/scaffold-template.ts +394 -0
  196. package/src/daemon-core.ts +50 -0
  197. package/src/detection/cli-detector.ts +89 -0
  198. package/src/detection/ide-detector.ts +157 -0
  199. package/src/index.ts +103 -0
  200. package/src/installer.ts +263 -0
  201. package/src/ipc-protocol.ts +133 -0
  202. package/src/launch.ts +433 -0
  203. package/src/logging/command-log.ts +180 -0
  204. package/src/logging/logger.ts +316 -0
  205. package/src/providers/acp-provider-instance.ts +1140 -0
  206. package/src/providers/cli-provider-instance.ts +207 -0
  207. package/src/providers/contracts.ts +524 -0
  208. package/src/providers/extension-provider-instance.ts +156 -0
  209. package/src/providers/ide-provider-instance.ts +377 -0
  210. package/src/providers/index.ts +18 -0
  211. package/src/providers/provider-instance-manager.ts +182 -0
  212. package/src/providers/provider-instance.ts +112 -0
  213. package/src/providers/provider-loader.ts +1031 -0
  214. package/src/providers/status-monitor.ts +125 -0
  215. package/src/providers/version-archive.ts +266 -0
  216. package/src/status/reporter.ts +294 -0
  217. package/src/types.ts +206 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * DaemonCdpScanner — Periodic CDP port scanning & auto-connect
3
+ *
4
+ * Extracted from daemon-cloud initCdp() and daemon-standalone initCdp().
5
+ * Provides a unified approach to:
6
+ * 1. Initial CDP port discovery
7
+ * 2. Periodic scanning for newly launched IDEs
8
+ * 3. Multi-window support (multiple pages on same port)
9
+ */
10
+
11
+ import { DaemonCdpManager } from './manager.js';
12
+ import { ProviderLoader } from '../providers/provider-loader.js';
13
+ import { connectCdpManager, probeCdpPort, registerExtensionProviders, setupIdeInstance, type CdpSetupContext } from './setup.js';
14
+ import { LOG } from '../logging/logger.js';
15
+
16
+ export interface CdpScannerOptions {
17
+ /** Context for setup operations */
18
+ ctx: CdpSetupContext;
19
+ /** Log function for per-IDE CDP logs */
20
+ logFn?: (ideType: string) => (msg: string) => void;
21
+ /** Whether to support multi-window (multiple pages per port) */
22
+ multiWindow?: boolean;
23
+ /** Scan interval in ms (default: 30000) */
24
+ scanIntervalMs?: number;
25
+ /** Callback when a new CDP connection is established */
26
+ onConnected?: (ideType: string, managerKey: string, manager: DaemonCdpManager) => void;
27
+ }
28
+
29
+ export class DaemonCdpScanner {
30
+ private ctx: CdpSetupContext;
31
+ private opts: CdpScannerOptions;
32
+ private scanTimer: NodeJS.Timeout | null = null;
33
+ private discoveryTimer: NodeJS.Timeout | null = null;
34
+
35
+ constructor(opts: CdpScannerOptions) {
36
+ this.ctx = opts.ctx;
37
+ this.opts = opts;
38
+ }
39
+
40
+ /**
41
+ * Initial CDP discovery — connect to all available IDEs.
42
+ * Supports both single-window and multi-window modes.
43
+ */
44
+ async initialScan(enabledIdes?: string[]): Promise<void> {
45
+ const portMap = this.ctx.providerLoader.getCdpPortMap();
46
+ const portsToTry: { port: number; ide: string }[] = [];
47
+
48
+ for (const [ide, ports] of Object.entries(portMap)) {
49
+ portsToTry.push({ port: ports[0], ide });
50
+ }
51
+
52
+ // Apply enabledIdes filter if provided
53
+ const filtered = enabledIdes?.length
54
+ ? portsToTry.filter(p => enabledIdes.includes(p.ide))
55
+ : portsToTry;
56
+
57
+ for (const { port, ide } of filtered) {
58
+ if (this.opts.multiWindow) {
59
+ await this.connectMultiWindow(port, ide);
60
+ } else {
61
+ await this.connectSingleWindow(port, ide);
62
+ }
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Start periodic scanning for newly launched IDEs.
68
+ */
69
+ startPeriodicScan(): void {
70
+ if (this.scanTimer) return;
71
+ const interval = this.opts.scanIntervalMs || 30_000;
72
+
73
+ this.scanTimer = setInterval(async () => {
74
+ const portMap = this.ctx.providerLoader.getCdpPortMap();
75
+ for (const [ide, ports] of Object.entries(portMap)) {
76
+ const primaryPort = ports[0];
77
+ // Skip if already connected
78
+ const alreadyConnected = [...this.ctx.cdpManagers.entries()].some(([key, m]) =>
79
+ m.isConnected && (key === ide || key.startsWith(ide + '_'))
80
+ );
81
+ if (alreadyConnected) continue;
82
+
83
+ if (this.opts.multiWindow) {
84
+ await this.connectMultiWindow(primaryPort, ide);
85
+ } else {
86
+ await this.connectSingleWindow(primaryPort, ide);
87
+ }
88
+ }
89
+ }, interval);
90
+ }
91
+
92
+ /**
93
+ * Start periodic agent webview discovery on all connected CDPs.
94
+ */
95
+ startWebviewDiscovery(intervalMs = 30_000): void {
96
+ if (this.discoveryTimer) return;
97
+ this.discoveryTimer = setInterval(async () => {
98
+ for (const m of this.ctx.cdpManagers.values()) {
99
+ if (m.isConnected) {
100
+ await m.discoverAgentWebviews();
101
+ }
102
+ }
103
+ }, intervalMs);
104
+ }
105
+
106
+ /**
107
+ * Stop all timers.
108
+ */
109
+ stop(): void {
110
+ if (this.scanTimer) { clearInterval(this.scanTimer); this.scanTimer = null; }
111
+ if (this.discoveryTimer) { clearInterval(this.discoveryTimer); this.discoveryTimer = null; }
112
+ }
113
+
114
+ // ── Internal ────────────────────────────
115
+
116
+ private getLogFn(ideType: string): (msg: string) => void {
117
+ if (this.opts.logFn) return this.opts.logFn(ideType);
118
+ return (msg: string) => LOG.info(`CDP:${ideType}`, msg);
119
+ }
120
+
121
+ /**
122
+ * Single-window connection (standalone mode).
123
+ * One CDP manager per IDE, first working port wins.
124
+ */
125
+ private async connectSingleWindow(port: number, ide: string): Promise<void> {
126
+ if (this.ctx.cdpManagers.has(ide)) return;
127
+ const available = await probeCdpPort(port);
128
+ if (!available) return;
129
+
130
+ const manager = await connectCdpManager(
131
+ port, ide, this.getLogFn(ide), this.ctx.providerLoader,
132
+ );
133
+ if (!manager) return;
134
+
135
+ registerExtensionProviders(this.ctx.providerLoader, manager, ide);
136
+ this.ctx.cdpManagers.set(ide, manager);
137
+ LOG.info('CDP', `Connected: ${ide} (port ${port})`);
138
+
139
+ // Setup IDE instance
140
+ await setupIdeInstance(this.ctx, { ideType: ide, manager });
141
+ this.opts.onConnected?.(ide, ide, manager);
142
+ }
143
+
144
+ /**
145
+ * Multi-window connection (cloud mode).
146
+ * Multiple CDP managers per IDE — one per workbench page.
147
+ */
148
+ private async connectMultiWindow(port: number, ide: string): Promise<void> {
149
+ const allTargets = await DaemonCdpManager.listAllTargets(port);
150
+
151
+ if (allTargets.length === 0) {
152
+ // Fallback: single-window approach
153
+ await this.connectSingleWindow(port, ide);
154
+ return;
155
+ }
156
+
157
+ for (let i = 0; i < allTargets.length; i++) {
158
+ const target = allTargets[i];
159
+ let managerKey: string;
160
+ if (allTargets.length === 1) {
161
+ managerKey = ide;
162
+ } else {
163
+ const workspaceName = (target.title || '').split(' — ')[0].trim() || `window_${i}`;
164
+ managerKey = `${ide}_${workspaceName}`;
165
+ }
166
+
167
+ if (this.ctx.cdpManagers.has(managerKey)) continue;
168
+
169
+ const manager = await connectCdpManager(
170
+ port, ide, this.getLogFn(managerKey), this.ctx.providerLoader, target.id,
171
+ );
172
+ if (!manager) continue;
173
+
174
+ this.ctx.cdpManagers.set(managerKey, manager);
175
+ LOG.info('CDP', `Connected: ${managerKey} (port ${port}, page "${target.title}")`);
176
+
177
+ await setupIdeInstance(this.ctx, {
178
+ ideType: ide,
179
+ manager,
180
+ managerKey,
181
+ });
182
+ this.opts.onConnected?.(ide, managerKey, manager);
183
+ }
184
+ }
185
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * DaemonCdpSetup — Shared CDP initialization helpers
3
+ *
4
+ * Extracted from daemon-cloud/adhdev-daemon.ts setupCdpManager()
5
+ * and daemon-standalone/index.ts inline CDP setup logic.
6
+ *
7
+ * Used by both daemon-cloud and daemon-standalone to ensure
8
+ * consistent CDP → ProviderInstance registration.
9
+ */
10
+
11
+ import { DaemonCdpManager } from './manager.js';
12
+ import { ProviderLoader } from '../providers/provider-loader.js';
13
+ import { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
14
+ import { IdeProviderInstance } from '../providers/ide-provider-instance.js';
15
+ import type { ProviderModule } from '../providers/contracts.js';
16
+
17
+ export interface CdpSetupContext {
18
+ providerLoader: ProviderLoader;
19
+ instanceManager: ProviderInstanceManager;
20
+ cdpManagers: Map<string, DaemonCdpManager>;
21
+ /** UUID instanceId → CDP manager key mapping */
22
+ instanceIdMap: Map<string, string>;
23
+ /** Server connection (optional, cloud-only) */
24
+ serverConn?: any;
25
+ }
26
+
27
+ export interface SetupIdeInstanceOptions {
28
+ /** Provider-based IDE type (e.g., 'antigravity', 'cursor') */
29
+ ideType: string;
30
+ /** Connected CDP manager */
31
+ manager: DaemonCdpManager;
32
+ /** CDP manager key (for multi-window: 'antigravity_remote_vs', single: 'antigravity') */
33
+ managerKey?: string;
34
+ /** Provider settings override */
35
+ settings?: Record<string, any>;
36
+ }
37
+
38
+ /**
39
+ * Register extension providers on a CDP manager.
40
+ * Common pattern used during CDP init and periodic scans.
41
+ */
42
+ export function registerExtensionProviders(
43
+ providerLoader: ProviderLoader,
44
+ manager: DaemonCdpManager,
45
+ ideType: string,
46
+ ): void {
47
+ const enabledExtProviders = providerLoader.getEnabledExtensionProviders(ideType)
48
+ .map((p: any) => ({
49
+ agentType: p.type,
50
+ extensionId: p.extensionId || '',
51
+ extensionIdPattern: p.extensionIdPattern!,
52
+ }));
53
+ manager.setExtensionProviders(enabledExtProviders);
54
+ }
55
+
56
+ /**
57
+ * Setup a CDP-connected IDE as a ProviderInstance.
58
+ *
59
+ * Performs:
60
+ * 1. providerLoader.resolve() to get scripts
61
+ * 2. Create IdeProviderInstance
62
+ * 3. Register in InstanceManager
63
+ * 4. Register enabled extensions
64
+ * 5. Update instanceIdMap (IDE + extension UUIDs)
65
+ *
66
+ * @returns The created IdeProviderInstance, or null if provider not found
67
+ */
68
+ export async function setupIdeInstance(
69
+ ctx: CdpSetupContext,
70
+ opts: SetupIdeInstanceOptions,
71
+ ): Promise<IdeProviderInstance | null> {
72
+ const { providerLoader, instanceManager, instanceIdMap } = ctx;
73
+ const { ideType, manager, settings } = opts;
74
+ const managerKey = opts.managerKey || ideType;
75
+
76
+ // 1. Register extension providers on CDP manager
77
+ registerExtensionProviders(providerLoader, manager, ideType);
78
+
79
+ // 2. Resolve provider with scripts
80
+ const ideProvider = providerLoader.resolve(ideType);
81
+ if (!ideProvider) return null;
82
+
83
+ // 3. Create IdeProviderInstance
84
+ const ideInstance = new IdeProviderInstance(
85
+ ideProvider,
86
+ managerKey !== ideType ? managerKey : undefined,
87
+ );
88
+
89
+ // 4. Register in InstanceManager
90
+ const resolvedSettings = settings || providerLoader.getSettings(ideType);
91
+ await instanceManager.addInstance(`ide:${managerKey}`, ideInstance, {
92
+ cdp: manager,
93
+ serverConn: ctx.serverConn,
94
+ settings: resolvedSettings,
95
+ });
96
+
97
+ // 5. Map IDE instance UUID → manager key
98
+ instanceIdMap.set(ideInstance.getInstanceId(), managerKey);
99
+
100
+ // 6. Register enabled extensions
101
+ const extensionProviders = providerLoader.getEnabledByCategory('extension', ideType);
102
+ for (const extProvider of extensionProviders) {
103
+ const extSettings = providerLoader.getSettings(extProvider.type);
104
+ await ideInstance.addExtension(extProvider, extSettings);
105
+ // Map extension UUIDs too (CDP uses parent IDE)
106
+ for (const ext of ideInstance.getExtensionInstances()) {
107
+ instanceIdMap.set(ext.getInstanceId(), managerKey);
108
+ }
109
+ }
110
+
111
+ return ideInstance;
112
+ }
113
+
114
+ /**
115
+ * Create and connect a DaemonCdpManager for a given port.
116
+ *
117
+ * @returns Connected manager or null if connection failed
118
+ */
119
+ export async function connectCdpManager(
120
+ port: number,
121
+ ideType: string,
122
+ logFn: (msg: string) => void,
123
+ providerLoader: ProviderLoader,
124
+ targetId?: string,
125
+ ): Promise<DaemonCdpManager | null> {
126
+ const provider = providerLoader.getMeta(ideType);
127
+ const manager = new DaemonCdpManager(
128
+ port,
129
+ logFn,
130
+ targetId,
131
+ (provider as any)?.targetFilter,
132
+ );
133
+ const connected = await manager.connect();
134
+ return connected ? manager : null;
135
+ }
136
+
137
+ /**
138
+ * Probe a CDP port to check if it's listening.
139
+ * @returns true if CDP is available on this port
140
+ */
141
+ export async function probeCdpPort(port: number, timeoutMs = 1000): Promise<boolean> {
142
+ try {
143
+ const probe = await fetch(`http://localhost:${port}/json/version`, {
144
+ signal: AbortSignal.timeout(timeoutMs),
145
+ }).then(r => r.json()).catch(() => null);
146
+ return !!probe;
147
+ } catch {
148
+ return false;
149
+ }
150
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CliAdapter — common interface for CLI agents
3
+ *
4
+ * Contract implemented by all CLI adapters (ProviderCliAdapter etc).
5
+ */
6
+
7
+ export interface CliAdapter {
8
+ cliType: string;
9
+ cliName: string;
10
+ workingDir: string;
11
+ spawn(): Promise<void>;
12
+ sendMessage(text: string): Promise<void>;
13
+ getStatus(): any;
14
+ getPartialResponse(): string;
15
+ shutdown(): void;
16
+ cancel(): void;
17
+ isProcessing(): boolean;
18
+ isReady(): boolean;
19
+ setOnStatusChange(callback: () => void): void;
20
+ setServerConn?(serverConn: any): void;
21
+ // Raw PTY I/O (for terminal view)
22
+ setOnPtyData?(callback: (data: string) => void): void;
23
+ writeRaw?(data: string): void;
24
+ resize?(cols: number, rows: number): void;
25
+ }