@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,207 @@
1
+ /**
2
+ * CliProviderInstance — Runtime instance for CLI Provider
3
+ *
4
+ * Lifecycle layer on top of ProviderCliAdapter.
5
+ * collectCliData() + status transition logic from daemon-status.ts moved here.
6
+ */
7
+
8
+ import * as path from 'path';
9
+ import * as crypto from 'crypto';
10
+ import type { ProviderModule } from './contracts.js';
11
+ import type { ProviderInstance, ProviderState, ProviderEvent, InstanceContext } from './provider-instance.js';
12
+ import { ProviderCliAdapter } from '../cli-adapters/provider-cli-adapter.js';
13
+ import type { CliProviderModule } from '../cli-adapters/provider-cli-adapter.js';
14
+ import { StatusMonitor } from './status-monitor.js';
15
+ import { ChatHistoryWriter } from '../config/chat-history.js';
16
+
17
+ export class CliProviderInstance implements ProviderInstance {
18
+ readonly type: string;
19
+ readonly category = 'cli' as const;
20
+
21
+ private adapter: ProviderCliAdapter;
22
+ private context: InstanceContext | null = null;
23
+ private events: ProviderEvent[] = [];
24
+ private lastStatus: string = 'starting';
25
+ private generatingStartedAt: number = 0;
26
+ private settings: Record<string, any> = {};
27
+ private monitor: StatusMonitor;
28
+ private historyWriter: ChatHistoryWriter;
29
+ readonly instanceId: string;
30
+
31
+ constructor(
32
+ private provider: ProviderModule,
33
+ private workingDir: string,
34
+ private cliArgs: string[] = [],
35
+ instanceId?: string,
36
+ ) {
37
+ this.type = provider.type;
38
+ this.instanceId = instanceId || crypto.randomUUID();
39
+ this.adapter = new ProviderCliAdapter(provider as any as CliProviderModule, workingDir, cliArgs);
40
+ this.monitor = new StatusMonitor();
41
+ this.historyWriter = new ChatHistoryWriter();
42
+ }
43
+
44
+ // ─── Lifecycle ─────────────────────────────────
45
+
46
+ async init(context: InstanceContext): Promise<void> {
47
+ this.context = context;
48
+ this.settings = context.settings || {};
49
+ this.monitor.updateConfig({
50
+ approvalAlert: this.settings.approvalAlert !== false,
51
+ longGeneratingAlert: this.settings.longGeneratingAlert !== false,
52
+ longGeneratingThresholdSec: this.settings.longGeneratingThresholdSec || 180,
53
+ });
54
+
55
+ // Server connection
56
+ if (context.serverConn) {
57
+ this.adapter.setServerConn(context.serverConn);
58
+ }
59
+
60
+ // PTY output callback
61
+ if (context.onPtyData) {
62
+ this.adapter.setOnPtyData(context.onPtyData);
63
+ }
64
+
65
+ // Emit event on status change
66
+ this.adapter.setOnStatusChange(() => {
67
+ this.detectStatusTransition();
68
+ });
69
+
70
+ // PTY spawn
71
+ await this.adapter.spawn();
72
+ }
73
+
74
+ async onTick(): Promise<void> {
75
+ // CLI is event-based so tick is unnecessary
76
+ // Health check etc here if needed
77
+ }
78
+
79
+ getState(): ProviderState {
80
+ const adapterStatus = this.adapter.getStatus();
81
+ const dirName = this.workingDir.split('/').filter(Boolean).pop() || 'session';
82
+
83
+ // Message truncate (recent 50, 2000 char limit)
84
+ const recentMessages = adapterStatus.messages.slice(-50).map(m => ({
85
+ role: m.role,
86
+ content: m.content.length > 2000 ? m.content.slice(0, 2000) + '\n... (truncated)' : m.content,
87
+ timestamp: m.timestamp,
88
+ }));
89
+
90
+ // generating during partial response add
91
+ const partial = this.adapter.getPartialResponse();
92
+ if (adapterStatus.status === 'generating' && partial) {
93
+ const cleaned = partial.trim();
94
+ if (cleaned && cleaned !== '(generating...)') {
95
+ recentMessages.push({
96
+ role: 'assistant',
97
+ content: (cleaned.length > 2000 ? cleaned.slice(0, 2000) + '...' : cleaned) + '...',
98
+ timestamp: Date.now(),
99
+ });
100
+ }
101
+ }
102
+
103
+ // Save history
104
+ if (recentMessages.length > 0) {
105
+ const dirName = this.workingDir.split('/').filter(Boolean).pop() || 'session';
106
+ this.historyWriter.appendNewMessages(
107
+ this.type,
108
+ recentMessages,
109
+ `${this.provider.name} · ${dirName}`,
110
+ this.instanceId,
111
+ );
112
+ }
113
+
114
+ return {
115
+ type: this.type,
116
+ name: this.provider.name,
117
+ category: 'cli',
118
+ status: adapterStatus.status,
119
+ mode: (this.settings.mode as 'terminal' | 'chat') || 'terminal',
120
+ activeChat: {
121
+ id: `${this.type}_${this.workingDir}`,
122
+ title: `${this.provider.name} · ${dirName}`,
123
+ status: adapterStatus.status,
124
+ messages: recentMessages,
125
+ activeModal: adapterStatus.activeModal,
126
+ inputContent: '',
127
+ },
128
+ workingDir: this.workingDir,
129
+ instanceId: this.instanceId,
130
+ lastUpdated: Date.now(),
131
+ settings: this.settings,
132
+ pendingEvents: this.flushEvents(),
133
+ };
134
+ }
135
+
136
+ onEvent(event: string, data?: any): void {
137
+ if (event === 'send_message' && data?.text) {
138
+ this.adapter.sendMessage(data.text);
139
+ } else if (event === 'server_connected' && data?.serverConn) {
140
+ this.adapter.setServerConn(data.serverConn);
141
+ }
142
+ }
143
+
144
+ dispose(): void {
145
+ this.adapter.shutdown();
146
+ this.monitor.reset();
147
+ }
148
+
149
+ // ─── Status transition detection (moved from daemon-status.ts) ──────
150
+
151
+ private detectStatusTransition(): void {
152
+ const now = Date.now();
153
+ const adapterStatus = this.adapter.getStatus();
154
+ const newStatus = adapterStatus.status;
155
+ const dirName = this.workingDir.split('/').filter(Boolean).pop() || 'session';
156
+ const chatTitle = `${this.provider.name} · ${dirName}`;
157
+
158
+ if (newStatus !== this.lastStatus) {
159
+ if (this.lastStatus === 'idle' && newStatus === 'generating') {
160
+ this.generatingStartedAt = now;
161
+ this.pushEvent({ event: 'agent:generating_started', chatTitle, timestamp: now });
162
+ } else if (newStatus === 'waiting_approval') {
163
+ if (!this.generatingStartedAt) this.generatingStartedAt = now;
164
+ this.pushEvent({
165
+ event: 'agent:waiting_approval', chatTitle, timestamp: now,
166
+ modalMessage: adapterStatus.activeModal?.message,
167
+ modalButtons: adapterStatus.activeModal?.buttons,
168
+ });
169
+ } else if (newStatus === 'idle' && (this.lastStatus === 'generating' || this.lastStatus === 'waiting_approval')) {
170
+ const duration = this.generatingStartedAt ? Math.round((now - this.generatingStartedAt) / 1000) : 0;
171
+ this.pushEvent({ event: 'agent:generating_completed', chatTitle, duration, timestamp: now });
172
+ this.generatingStartedAt = 0;
173
+ } else if (newStatus === 'stopped') {
174
+ this.pushEvent({ event: 'agent:stopped', chatTitle, timestamp: now });
175
+ }
176
+ this.lastStatus = newStatus;
177
+ }
178
+
179
+ // Monitor check (cooldown based notification, IDE/CLI common)
180
+ const agentKey = `${this.type}:cli`;
181
+ const monitorEvents = this.monitor.check(agentKey, newStatus, now);
182
+ for (const me of monitorEvents) {
183
+ this.pushEvent({ event: me.type, agentKey: me.agentKey, message: me.message, elapsedSec: me.elapsedSec, timestamp: me.timestamp });
184
+ }
185
+ }
186
+
187
+ private pushEvent(event: ProviderEvent): void {
188
+ this.events.push(event);
189
+ // Max 50
190
+ if (this.events.length > 50) this.events = this.events.slice(-50);
191
+ }
192
+
193
+ private flushEvents(): ProviderEvent[] {
194
+ const events = [...this.events];
195
+ this.events = [];
196
+ return events;
197
+ }
198
+
199
+ // ─── Adapter access (backward compat) ──────────────────
200
+
201
+ getAdapter(): ProviderCliAdapter {
202
+ return this.adapter;
203
+ }
204
+
205
+ get cliType(): string { return this.type; }
206
+ get cliName(): string { return this.provider.name; }
207
+ }