@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.
- package/dist/index.d.ts +2662 -0
- package/dist/index.js +11341 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
- package/providers/_builtin/.github/workflows/generate-registry.yml +57 -0
- package/providers/_builtin/COMPATIBILITY.md +217 -0
- package/providers/_builtin/CONTRIBUTING.md +200 -0
- package/providers/_builtin/README.md +119 -0
- package/providers/_builtin/_helpers/index.js +188 -0
- package/providers/_builtin/acp/agentpool/provider.json +54 -0
- package/providers/_builtin/acp/amp/provider.json +52 -0
- package/providers/_builtin/acp/auggie/provider.json +57 -0
- package/providers/_builtin/acp/autodev/provider.json +54 -0
- package/providers/_builtin/acp/autohand/provider.json +52 -0
- package/providers/_builtin/acp/blackbox-ai/provider.json +54 -0
- package/providers/_builtin/acp/claude-agent/provider.json +57 -0
- package/providers/_builtin/acp/cline-acp/provider.json +54 -0
- package/providers/_builtin/acp/codebuddy/provider.json +54 -0
- package/providers/_builtin/acp/codex-cli/provider.json +57 -0
- package/providers/_builtin/acp/corust-agent/provider.json +52 -0
- package/providers/_builtin/acp/crow-cli/provider.json +54 -0
- package/providers/_builtin/acp/cursor-acp/provider.json +54 -0
- package/providers/_builtin/acp/deepagents/provider.json +52 -0
- package/providers/_builtin/acp/dimcode/provider.json +54 -0
- package/providers/_builtin/acp/docker-cagent/provider.json +57 -0
- package/providers/_builtin/acp/factory-droid/provider.json +60 -0
- package/providers/_builtin/acp/fast-agent/provider.json +52 -0
- package/providers/_builtin/acp/gemini-cli/provider.json +114 -0
- package/providers/_builtin/acp/github-copilot/provider.json +54 -0
- package/providers/_builtin/acp/goose/provider.json +57 -0
- package/providers/_builtin/acp/junie/provider.json +52 -0
- package/providers/_builtin/acp/kilo/provider.json +54 -0
- package/providers/_builtin/acp/kimi-cli/provider.json +57 -0
- package/providers/_builtin/acp/minion-code/provider.json +52 -0
- package/providers/_builtin/acp/mistral-vibe/provider.json +57 -0
- package/providers/_builtin/acp/nova/provider.json +54 -0
- package/providers/_builtin/acp/openclaw/provider.json +54 -0
- package/providers/_builtin/acp/opencode/provider.json +52 -0
- package/providers/_builtin/acp/openhands/provider.json +54 -0
- package/providers/_builtin/acp/pi-acp/provider.json +52 -0
- package/providers/_builtin/acp/qoder/provider.json +54 -0
- package/providers/_builtin/acp/qwen-code/provider.json +60 -0
- package/providers/_builtin/acp/stakpak/provider.json +54 -0
- package/providers/_builtin/acp/vtcode/provider.json +54 -0
- package/providers/_builtin/cli/claude-cli/provider.json +100 -0
- package/providers/_builtin/cli/codex-cli/provider.json +89 -0
- package/providers/_builtin/cli/gemini-cli/provider.json +93 -0
- package/providers/_builtin/docs/CDP_SELECTOR_GUIDE.md +370 -0
- package/providers/_builtin/docs/PROVIDER_GUIDE.md +916 -0
- package/providers/_builtin/extension/cline/provider.json +35 -0
- package/providers/_builtin/extension/cline/scripts/focus_editor.js +48 -0
- package/providers/_builtin/extension/cline/scripts/list_chats.js +100 -0
- package/providers/_builtin/extension/cline/scripts/list_models.js +43 -0
- package/providers/_builtin/extension/cline/scripts/list_modes.js +35 -0
- package/providers/_builtin/extension/cline/scripts/new_session.js +85 -0
- package/providers/_builtin/extension/cline/scripts/open_panel.js +25 -0
- package/providers/_builtin/extension/cline/scripts/read_chat.js +257 -0
- package/providers/_builtin/extension/cline/scripts/resolve_action.js +83 -0
- package/providers/_builtin/extension/cline/scripts/send_message.js +95 -0
- package/providers/_builtin/extension/cline/scripts/set_mode.js +36 -0
- package/providers/_builtin/extension/cline/scripts/set_model.js +36 -0
- package/providers/_builtin/extension/cline/scripts/switch_session.js +206 -0
- package/providers/_builtin/extension/cline/scripts.js +73 -0
- package/providers/_builtin/extension/roo-code/provider.json +35 -0
- package/providers/_builtin/extension/roo-code/scripts.js +659 -0
- package/providers/_builtin/ide/antigravity/provider.json +68 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/focus_editor.js +20 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/list_chats.js +137 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/list_models.js +38 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/list_modes.js +48 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/new_session.js +75 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/read_chat.js +262 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/resolve_action.js +68 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/scripts.js +57 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/send_message.js +56 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/set_mode.js +34 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/set_model.js +47 -0
- package/providers/_builtin/ide/antigravity/scripts/1.106/switch_session.js +114 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/focus_editor.js +20 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/list_chats.js +137 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/list_models.js +61 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/list_modes.js +72 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/new_session.js +75 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/read_chat.js +262 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/resolve_action.js +68 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/scripts.js +67 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/send_message.js +56 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/set_mode.js +67 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/set_model.js +72 -0
- package/providers/_builtin/ide/antigravity/scripts/1.107/switch_session.js +114 -0
- package/providers/_builtin/ide/cursor/provider.json +70 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/dismiss_notification.js +30 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/focus_editor.js +13 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/list_models.js +78 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/list_modes.js +40 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/list_notifications.js +23 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/list_sessions.js +42 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/new_session.js +20 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/open_panel.js +23 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/read_chat.js +75 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/resolve_action.js +19 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/scripts.js +78 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/send_message.js +23 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/set_mode.js +38 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/set_model.js +81 -0
- package/providers/_builtin/ide/cursor/scripts/0.49/switch_session.js +28 -0
- package/providers/_builtin/ide/kiro/provider.json +67 -0
- package/providers/_builtin/ide/kiro/scripts/focus_editor.js +20 -0
- package/providers/_builtin/ide/kiro/scripts/open_panel.js +47 -0
- package/providers/_builtin/ide/kiro/scripts/resolve_action.js +54 -0
- package/providers/_builtin/ide/kiro/scripts/send_message.js +29 -0
- package/providers/_builtin/ide/kiro/scripts/webview_list_models.js +39 -0
- package/providers/_builtin/ide/kiro/scripts/webview_list_modes.js +39 -0
- package/providers/_builtin/ide/kiro/scripts/webview_list_sessions.js +21 -0
- package/providers/_builtin/ide/kiro/scripts/webview_new_session.js +34 -0
- package/providers/_builtin/ide/kiro/scripts/webview_read_chat.js +68 -0
- package/providers/_builtin/ide/kiro/scripts/webview_send_message.js +72 -0
- package/providers/_builtin/ide/kiro/scripts/webview_set_mode.js +15 -0
- package/providers/_builtin/ide/kiro/scripts/webview_set_model.js +15 -0
- package/providers/_builtin/ide/kiro/scripts/webview_switch_session.js +26 -0
- package/providers/_builtin/ide/kiro/scripts.js +62 -0
- package/providers/_builtin/ide/pearai/provider.json +67 -0
- package/providers/_builtin/ide/pearai/scripts/focus_editor.js +20 -0
- package/providers/_builtin/ide/pearai/scripts/list_sessions.js +38 -0
- package/providers/_builtin/ide/pearai/scripts/new_session.js +55 -0
- package/providers/_builtin/ide/pearai/scripts/open_panel.js +46 -0
- package/providers/_builtin/ide/pearai/scripts/resolve_action.js +54 -0
- package/providers/_builtin/ide/pearai/scripts/send_message.js +29 -0
- package/providers/_builtin/ide/pearai/scripts/webview_list_models.js +43 -0
- package/providers/_builtin/ide/pearai/scripts/webview_list_modes.js +35 -0
- package/providers/_builtin/ide/pearai/scripts/webview_list_sessions.js +62 -0
- package/providers/_builtin/ide/pearai/scripts/webview_new_session.js +49 -0
- package/providers/_builtin/ide/pearai/scripts/webview_read_chat.js +92 -0
- package/providers/_builtin/ide/pearai/scripts/webview_resolve_action.js +59 -0
- package/providers/_builtin/ide/pearai/scripts/webview_send_message.js +72 -0
- package/providers/_builtin/ide/pearai/scripts/webview_set_mode.js +36 -0
- package/providers/_builtin/ide/pearai/scripts/webview_set_model.js +36 -0
- package/providers/_builtin/ide/pearai/scripts/webview_switch_session.js +34 -0
- package/providers/_builtin/ide/pearai/scripts.js +74 -0
- package/providers/_builtin/ide/trae/provider.json +66 -0
- package/providers/_builtin/ide/trae/scripts/focus_editor.js +20 -0
- package/providers/_builtin/ide/trae/scripts/list_chats.js +24 -0
- package/providers/_builtin/ide/trae/scripts/list_models.js +39 -0
- package/providers/_builtin/ide/trae/scripts/list_modes.js +39 -0
- package/providers/_builtin/ide/trae/scripts/new_session.js +30 -0
- package/providers/_builtin/ide/trae/scripts/open_panel.js +44 -0
- package/providers/_builtin/ide/trae/scripts/read_chat.js +113 -0
- package/providers/_builtin/ide/trae/scripts/resolve_action.js +54 -0
- package/providers/_builtin/ide/trae/scripts/send_message.js +69 -0
- package/providers/_builtin/ide/trae/scripts/set_mode.js +15 -0
- package/providers/_builtin/ide/trae/scripts/set_model.js +15 -0
- package/providers/_builtin/ide/trae/scripts/switch_session.js +23 -0
- package/providers/_builtin/ide/trae/scripts.js +57 -0
- package/providers/_builtin/ide/vscode/provider.json +64 -0
- package/providers/_builtin/ide/vscode-insiders/provider.json +62 -0
- package/providers/_builtin/ide/vscodium/provider.json +63 -0
- package/providers/_builtin/ide/windsurf/provider.json +53 -0
- package/providers/_builtin/ide/windsurf/scripts/focus_editor.js +30 -0
- package/providers/_builtin/ide/windsurf/scripts/list_chats.js +117 -0
- package/providers/_builtin/ide/windsurf/scripts/list_models.js +39 -0
- package/providers/_builtin/ide/windsurf/scripts/list_modes.js +39 -0
- package/providers/_builtin/ide/windsurf/scripts/new_session.js +69 -0
- package/providers/_builtin/ide/windsurf/scripts/open_panel.js +58 -0
- package/providers/_builtin/ide/windsurf/scripts/read_chat.js +297 -0
- package/providers/_builtin/ide/windsurf/scripts/resolve_action.js +68 -0
- package/providers/_builtin/ide/windsurf/scripts/send_message.js +87 -0
- package/providers/_builtin/ide/windsurf/scripts/set_mode.js +15 -0
- package/providers/_builtin/ide/windsurf/scripts/set_model.js +15 -0
- package/providers/_builtin/ide/windsurf/scripts/switch_session.js +58 -0
- package/providers/_builtin/ide/windsurf/scripts.js +57 -0
- package/providers/_builtin/registry.json +266 -0
- package/providers/_builtin/validate.js +156 -0
- package/src/agent-stream/index.ts +6 -0
- package/src/agent-stream/manager.ts +286 -0
- package/src/agent-stream/poller.ts +154 -0
- package/src/agent-stream/provider-adapter.ts +138 -0
- package/src/agent-stream/types.ts +61 -0
- package/src/boot/daemon-lifecycle.ts +252 -0
- package/src/cdp/devtools.ts +335 -0
- package/src/cdp/initializer.ts +191 -0
- package/src/cdp/manager.ts +897 -0
- package/src/cdp/scanner.ts +185 -0
- package/src/cdp/setup.ts +150 -0
- package/src/cli-adapter-types.ts +25 -0
- package/src/cli-adapters/provider-cli-adapter.ts +448 -0
- package/src/commands/cdp-commands.ts +208 -0
- package/src/commands/chat-commands.ts +675 -0
- package/src/commands/cli-manager.ts +353 -0
- package/src/commands/handler.ts +328 -0
- package/src/commands/router.ts +258 -0
- package/src/commands/stream-commands.ts +325 -0
- package/src/config/chat-history.ts +211 -0
- package/src/config/config.ts +219 -0
- package/src/daemon/dev-server.ts +2378 -0
- package/src/daemon/scaffold-template.ts +394 -0
- package/src/daemon-core.ts +50 -0
- package/src/detection/cli-detector.ts +89 -0
- package/src/detection/ide-detector.ts +157 -0
- package/src/index.ts +103 -0
- package/src/installer.ts +263 -0
- package/src/ipc-protocol.ts +133 -0
- package/src/launch.ts +433 -0
- package/src/logging/command-log.ts +180 -0
- package/src/logging/logger.ts +316 -0
- package/src/providers/acp-provider-instance.ts +1140 -0
- package/src/providers/cli-provider-instance.ts +207 -0
- package/src/providers/contracts.ts +524 -0
- package/src/providers/extension-provider-instance.ts +156 -0
- package/src/providers/ide-provider-instance.ts +377 -0
- package/src/providers/index.ts +18 -0
- package/src/providers/provider-instance-manager.ts +182 -0
- package/src/providers/provider-instance.ts +112 -0
- package/src/providers/provider-loader.ts +1031 -0
- package/src/providers/status-monitor.ts +125 -0
- package/src/providers/version-archive.ts +266 -0
- package/src/status/reporter.ts +294 -0
- package/src/types.ts +206 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProviderStreamAdapter — generic Extension adapter based on provider.js
|
|
3
|
+
*
|
|
4
|
+
* Consolidates ClineAdapter, RooCodeAdapter, ContinueAdapter.
|
|
5
|
+
* Auto-configured using provider.js scripts + metadata.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
IAgentStreamAdapter,
|
|
10
|
+
AgentStreamState,
|
|
11
|
+
AgentChatListItem,
|
|
12
|
+
AgentEvaluateFn,
|
|
13
|
+
} from './types.js';
|
|
14
|
+
import type { ProviderModule } from '../providers/contracts.js';
|
|
15
|
+
|
|
16
|
+
export class ProviderStreamAdapter implements IAgentStreamAdapter {
|
|
17
|
+
readonly agentType: string;
|
|
18
|
+
readonly agentName: string;
|
|
19
|
+
readonly extensionId: string;
|
|
20
|
+
readonly extensionIdPattern: RegExp;
|
|
21
|
+
private provider: ProviderModule;
|
|
22
|
+
private lastSuccessState: AgentStreamState | null = null;
|
|
23
|
+
|
|
24
|
+
constructor(provider: ProviderModule) {
|
|
25
|
+
this.provider = provider;
|
|
26
|
+
this.agentType = provider.type;
|
|
27
|
+
this.agentName = provider.displayName || provider.name;
|
|
28
|
+
this.extensionId = provider.extensionId || provider.type;
|
|
29
|
+
this.extensionIdPattern = provider.extensionIdPattern
|
|
30
|
+
|| new RegExp(`extensionId=${this.extensionId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'i');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private callScript(name: string, ...args: any[]): string | null {
|
|
34
|
+
const fn = (this.provider.scripts as any)?.[name];
|
|
35
|
+
if (typeof fn !== 'function') return null;
|
|
36
|
+
return fn(...args) || null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private hasScript(name: string): boolean {
|
|
40
|
+
return typeof (this.provider.scripts as any)?.[name] === 'function';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async readChat(evaluate: AgentEvaluateFn): Promise<AgentStreamState> {
|
|
44
|
+
const script = this.callScript('readChat');
|
|
45
|
+
if (!script) return this.errorState('readChat script not available');
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
const raw = await evaluate(script) as string;
|
|
49
|
+
const data = typeof raw === 'string' ? JSON.parse(raw) : raw;
|
|
50
|
+
if (data?.error) {
|
|
51
|
+
const state = this.errorState(data.error);
|
|
52
|
+
if (this.lastSuccessState?.messages?.length) {
|
|
53
|
+
state.messages = this.lastSuccessState.messages;
|
|
54
|
+
}
|
|
55
|
+
return state;
|
|
56
|
+
}
|
|
57
|
+
const state: AgentStreamState = {
|
|
58
|
+
agentType: this.agentType,
|
|
59
|
+
agentName: this.agentName,
|
|
60
|
+
extensionId: this.extensionId,
|
|
61
|
+
status: data.status || 'idle',
|
|
62
|
+
messages: data.messages || [],
|
|
63
|
+
inputContent: data.inputContent || '',
|
|
64
|
+
model: data.model,
|
|
65
|
+
activeModal: data.activeModal,
|
|
66
|
+
};
|
|
67
|
+
if (state.messages.length > 0) {
|
|
68
|
+
this.lastSuccessState = state;
|
|
69
|
+
}
|
|
70
|
+
return state;
|
|
71
|
+
} catch {
|
|
72
|
+
const state = this.errorState(`Failed to parse ${this.agentName} state`);
|
|
73
|
+
if (this.lastSuccessState?.messages?.length) {
|
|
74
|
+
state.messages = this.lastSuccessState.messages;
|
|
75
|
+
}
|
|
76
|
+
return state;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async sendMessage(evaluate: AgentEvaluateFn, text: string): Promise<void> {
|
|
81
|
+
const script = this.callScript('sendMessage', text);
|
|
82
|
+
if (!script) throw new Error(`[${this.agentName}] sendMessage script not available`);
|
|
83
|
+
const result = await evaluate(script) as string;
|
|
84
|
+
if (result && typeof result === 'string' && result.startsWith('error:')) {
|
|
85
|
+
throw new Error(`[${this.agentName}] sendMessage failed: ${result}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async resolveAction(evaluate: AgentEvaluateFn, action: string, button?: string): Promise<boolean> {
|
|
90
|
+
const script = this.callScript('resolveAction', { action, button });
|
|
91
|
+
if (!script) return false; // Not supported if provider has no resolveAction
|
|
92
|
+
return (await evaluate(script)) === true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async newSession(evaluate: AgentEvaluateFn): Promise<void> {
|
|
96
|
+
const script = this.callScript('newSession');
|
|
97
|
+
if (!script) throw new Error(`[${this.agentName}] newSession script not available`);
|
|
98
|
+
const result = await evaluate(script) as string;
|
|
99
|
+
if (result && typeof result === 'string' && result.startsWith('error:')) {
|
|
100
|
+
throw new Error(`[${this.agentName}] newSession failed: ${result}`);
|
|
101
|
+
}
|
|
102
|
+
this.lastSuccessState = null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async listChats(evaluate: AgentEvaluateFn): Promise<AgentChatListItem[]> {
|
|
106
|
+
const script = this.callScript('listSessions');
|
|
107
|
+
if (!script) return [];
|
|
108
|
+
try {
|
|
109
|
+
const raw = await evaluate(script, 10000) as string;
|
|
110
|
+
const data = typeof raw === 'string' ? JSON.parse(raw) : raw;
|
|
111
|
+
if (data?.error) return [];
|
|
112
|
+
return Array.isArray(data) ? data : [];
|
|
113
|
+
} catch { return []; }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async switchSession(evaluate: AgentEvaluateFn, sessionId: string): Promise<boolean> {
|
|
117
|
+
const script = this.callScript('switchSession', sessionId);
|
|
118
|
+
if (!script) return false;
|
|
119
|
+
return (await evaluate(script, 10000)) === true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async focusEditor(evaluate: AgentEvaluateFn): Promise<void> {
|
|
123
|
+
const script = this.callScript('focusEditor');
|
|
124
|
+
if (!script) return;
|
|
125
|
+
await evaluate(script);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private errorState(message: string): AgentStreamState {
|
|
129
|
+
return {
|
|
130
|
+
agentType: this.agentType,
|
|
131
|
+
agentName: this.agentName,
|
|
132
|
+
extensionId: this.extensionId,
|
|
133
|
+
status: 'error',
|
|
134
|
+
messages: [],
|
|
135
|
+
inputContent: '',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Stream Types — ported for Daemon (identical to original)
|
|
3
|
+
*
|
|
4
|
+
* Agent stream types.
|
|
5
|
+
* No vscode dependency — can be used as-is.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Agent chat message */
|
|
9
|
+
export interface AgentChatMessage {
|
|
10
|
+
role: 'user' | 'assistant' | 'system';
|
|
11
|
+
content: string;
|
|
12
|
+
timestamp?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Agent chat history item */
|
|
16
|
+
export interface AgentChatListItem {
|
|
17
|
+
title: string;
|
|
18
|
+
id: string;
|
|
19
|
+
status?: string;
|
|
20
|
+
time?: string;
|
|
21
|
+
cost?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Agent stream status */
|
|
25
|
+
export interface AgentStreamState {
|
|
26
|
+
agentType: string;
|
|
27
|
+
agentName: string;
|
|
28
|
+
extensionId: string;
|
|
29
|
+
status: 'idle' | 'streaming' | 'waiting_approval' | 'error' | 'disconnected' | 'panel_hidden' | 'not_monitored';
|
|
30
|
+
messages: AgentChatMessage[];
|
|
31
|
+
inputContent: string;
|
|
32
|
+
model?: string;
|
|
33
|
+
activeModal?: { message: string; buttons: string[] };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Agent webview target info */
|
|
37
|
+
export interface AgentWebviewTarget {
|
|
38
|
+
targetId: string;
|
|
39
|
+
extensionId: string;
|
|
40
|
+
agentType: string;
|
|
41
|
+
url: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Agent stream adapter interface */
|
|
45
|
+
export interface IAgentStreamAdapter {
|
|
46
|
+
readonly agentType: string;
|
|
47
|
+
readonly agentName: string;
|
|
48
|
+
readonly extensionId: string;
|
|
49
|
+
readonly extensionIdPattern: RegExp;
|
|
50
|
+
|
|
51
|
+
readChat(evaluate: AgentEvaluateFn): Promise<AgentStreamState>;
|
|
52
|
+
sendMessage(evaluate: AgentEvaluateFn, text: string): Promise<void>;
|
|
53
|
+
resolveAction(evaluate: AgentEvaluateFn, action: string, button?: string): Promise<boolean>;
|
|
54
|
+
newSession(evaluate: AgentEvaluateFn): Promise<void>;
|
|
55
|
+
listChats?(evaluate: AgentEvaluateFn): Promise<AgentChatListItem[]>;
|
|
56
|
+
switchSession?(evaluate: AgentEvaluateFn, sessionId: string): Promise<boolean>;
|
|
57
|
+
focusEditor?(evaluate: AgentEvaluateFn): Promise<void>;
|
|
58
|
+
setProvider?(provider: any): void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type AgentEvaluateFn = (expression: string, timeoutMs?: number) => Promise<unknown>;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon Lifecycle — Shared init + shutdown for cloud/standalone
|
|
3
|
+
*
|
|
4
|
+
* initDaemonComponents(): Creates all core daemon components in correct order.
|
|
5
|
+
* shutdownDaemonComponents(): Graceful shutdown of all components.
|
|
6
|
+
*
|
|
7
|
+
* Transport-specific setup (ServerConnection, P2P, HTTP/WS) remains in each daemon.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { DaemonCdpManager } from '../cdp/manager.js';
|
|
11
|
+
import { DaemonCdpInitializer, type CdpInitializerConfig } from '../cdp/initializer.js';
|
|
12
|
+
import { setupIdeInstance, type CdpSetupContext } from '../cdp/setup.js';
|
|
13
|
+
import { DaemonCommandHandler } from '../commands/handler.js';
|
|
14
|
+
import { DaemonCommandRouter, type CommandRouterDeps } from '../commands/router.js';
|
|
15
|
+
import { DaemonCliManager } from '../commands/cli-manager.js';
|
|
16
|
+
import { DaemonAgentStreamManager } from '../agent-stream/manager.js';
|
|
17
|
+
import { AgentStreamPoller } from '../agent-stream/poller.js';
|
|
18
|
+
import { ProviderLoader } from '../providers/provider-loader.js';
|
|
19
|
+
import { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
|
|
20
|
+
import { detectIDEs } from '../detection/ide-detector.js';
|
|
21
|
+
import { installGlobalInterceptor, LOG } from '../logging/logger.js';
|
|
22
|
+
import { loadConfig } from '../config/config.js';
|
|
23
|
+
|
|
24
|
+
// ─── Init Config ───
|
|
25
|
+
|
|
26
|
+
export interface DaemonInitConfig {
|
|
27
|
+
/** ProviderLoader log function */
|
|
28
|
+
providerLogFn?: (msg: string) => void;
|
|
29
|
+
|
|
30
|
+
/** CLI Manager deps (transport-specific) */
|
|
31
|
+
cliManagerDeps: {
|
|
32
|
+
getServerConn: () => any;
|
|
33
|
+
getP2p: () => any;
|
|
34
|
+
onStatusChange: () => void;
|
|
35
|
+
removeAgentTracking: (key: string) => void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** CDP config */
|
|
39
|
+
enabledIdes?: string[];
|
|
40
|
+
|
|
41
|
+
/** Router transport-specific callbacks */
|
|
42
|
+
onStatusChange?: () => void;
|
|
43
|
+
onPostChatCommand?: () => void;
|
|
44
|
+
getCdpLogFn?: (ideType: string) => (msg: string) => void;
|
|
45
|
+
|
|
46
|
+
/** Additional callback after CDP manager created (transport-specific extras) */
|
|
47
|
+
onCdpManagerSetup?: (ideType: string, manager: DaemonCdpManager, managerKey: string) => void | Promise<void>;
|
|
48
|
+
|
|
49
|
+
/** Poller callback (transport-specific) */
|
|
50
|
+
onStreamsUpdated?: (ideType: string, streams: any[]) => void;
|
|
51
|
+
|
|
52
|
+
/** Instance ticking interval (ms), default 5000 */
|
|
53
|
+
tickIntervalMs?: number;
|
|
54
|
+
|
|
55
|
+
/** CDP scan interval (ms), default 30000 */
|
|
56
|
+
cdpScanIntervalMs?: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ─── Result ───
|
|
60
|
+
|
|
61
|
+
export interface DaemonComponents {
|
|
62
|
+
providerLoader: ProviderLoader;
|
|
63
|
+
instanceManager: ProviderInstanceManager;
|
|
64
|
+
cliManager: DaemonCliManager;
|
|
65
|
+
commandHandler: DaemonCommandHandler;
|
|
66
|
+
agentStreamManager: DaemonAgentStreamManager;
|
|
67
|
+
router: DaemonCommandRouter;
|
|
68
|
+
poller: AgentStreamPoller;
|
|
69
|
+
cdpInitializer: DaemonCdpInitializer;
|
|
70
|
+
cdpManagers: Map<string, DaemonCdpManager>;
|
|
71
|
+
instanceIdMap: Map<string, string>;
|
|
72
|
+
detectedIdes: { value: any[] };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ─── Init ───
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Initialize all daemon core components.
|
|
79
|
+
* Shared by both cloud and standalone daemons.
|
|
80
|
+
*
|
|
81
|
+
* Order:
|
|
82
|
+
* 1. Global log interceptor
|
|
83
|
+
* 2. ProviderLoader
|
|
84
|
+
* 3. InstanceManager + CliManager
|
|
85
|
+
* 4. Detect IDEs
|
|
86
|
+
* 5. CdpInitializer → connectAll + periodic scan + discovery
|
|
87
|
+
* 6. CommandHandler + AgentStreamManager
|
|
88
|
+
* 7. Router + Poller
|
|
89
|
+
* 8. Start instance ticking
|
|
90
|
+
*/
|
|
91
|
+
export async function initDaemonComponents(config: DaemonInitConfig): Promise<DaemonComponents> {
|
|
92
|
+
// 1. Global log interceptor
|
|
93
|
+
installGlobalInterceptor();
|
|
94
|
+
|
|
95
|
+
// 2. ProviderLoader
|
|
96
|
+
const providerLoader = new ProviderLoader({
|
|
97
|
+
logFn: config.providerLogFn,
|
|
98
|
+
});
|
|
99
|
+
providerLoader.loadAll();
|
|
100
|
+
providerLoader.registerToDetector();
|
|
101
|
+
|
|
102
|
+
// 3. Shared state
|
|
103
|
+
const instanceManager = new ProviderInstanceManager();
|
|
104
|
+
const cdpManagers = new Map<string, DaemonCdpManager>();
|
|
105
|
+
const instanceIdMap = new Map<string, string>();
|
|
106
|
+
const detectedIdesRef = { value: [] as any[] };
|
|
107
|
+
|
|
108
|
+
// 4. CLI Manager
|
|
109
|
+
const cliManager = new DaemonCliManager({
|
|
110
|
+
...config.cliManagerDeps,
|
|
111
|
+
getInstanceManager: () => instanceManager,
|
|
112
|
+
}, providerLoader);
|
|
113
|
+
|
|
114
|
+
// 5. Detect IDEs
|
|
115
|
+
LOG.info('Init', 'Detecting IDEs...');
|
|
116
|
+
detectedIdesRef.value = await detectIDEs();
|
|
117
|
+
const installed = detectedIdesRef.value.filter((i: any) => i.installed);
|
|
118
|
+
LOG.info('Init', `Found ${installed.length} IDE(s): ${installed.map((i: any) => i.id).join(', ') || 'none'}`);
|
|
119
|
+
|
|
120
|
+
// 6. CDP Initializer — connect + register instances
|
|
121
|
+
const cdpSetupContext: CdpSetupContext = {
|
|
122
|
+
providerLoader,
|
|
123
|
+
instanceManager,
|
|
124
|
+
cdpManagers,
|
|
125
|
+
instanceIdMap,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const cdpInitializer = new DaemonCdpInitializer({
|
|
129
|
+
providerLoader,
|
|
130
|
+
cdpManagers,
|
|
131
|
+
enabledIdes: config.enabledIdes || loadConfig().enabledIdes || undefined,
|
|
132
|
+
onConnected: async (ideType, manager, managerKey) => {
|
|
133
|
+
// Register IDE instance (shared logic)
|
|
134
|
+
await setupIdeInstance(cdpSetupContext, { ideType, manager, managerKey });
|
|
135
|
+
// Transport-specific extras
|
|
136
|
+
await config.onCdpManagerSetup?.(ideType, manager, managerKey);
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
await cdpInitializer.connectAll(detectedIdesRef.value);
|
|
140
|
+
cdpInitializer.startPeriodicScan(config.cdpScanIntervalMs ?? 30_000);
|
|
141
|
+
cdpInitializer.startDiscovery(30_000);
|
|
142
|
+
|
|
143
|
+
// 7. CommandHandler
|
|
144
|
+
const commandHandler = new DaemonCommandHandler({
|
|
145
|
+
cdpManagers,
|
|
146
|
+
ideType: 'unknown',
|
|
147
|
+
adapters: cliManager.adapters,
|
|
148
|
+
providerLoader,
|
|
149
|
+
instanceManager,
|
|
150
|
+
instanceIdMap,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// 8. AgentStreamManager
|
|
154
|
+
const agentStreamManager = new DaemonAgentStreamManager(
|
|
155
|
+
LOG.forComponent('AgentStream').asLogFn(),
|
|
156
|
+
providerLoader,
|
|
157
|
+
);
|
|
158
|
+
commandHandler.setAgentStreamManager(agentStreamManager);
|
|
159
|
+
|
|
160
|
+
// 9. Router + Poller (with internal cross-wiring)
|
|
161
|
+
// Note: poller is declared first so router's onIdeConnected closure captures it
|
|
162
|
+
let poller: AgentStreamPoller;
|
|
163
|
+
|
|
164
|
+
const router = new DaemonCommandRouter({
|
|
165
|
+
commandHandler,
|
|
166
|
+
cliManager,
|
|
167
|
+
cdpManagers,
|
|
168
|
+
providerLoader,
|
|
169
|
+
instanceManager,
|
|
170
|
+
detectedIdes: detectedIdesRef,
|
|
171
|
+
instanceIdMap,
|
|
172
|
+
onCdpManagerCreated: async (ideType: string, manager: DaemonCdpManager) => {
|
|
173
|
+
// For launch_ide: register instance + extension providers
|
|
174
|
+
await setupIdeInstance(cdpSetupContext, { ideType, manager });
|
|
175
|
+
await config.onCdpManagerSetup?.(ideType, manager, ideType);
|
|
176
|
+
},
|
|
177
|
+
onIdeConnected: () => poller?.start(),
|
|
178
|
+
onStatusChange: config.onStatusChange,
|
|
179
|
+
onPostChatCommand: config.onPostChatCommand,
|
|
180
|
+
getCdpLogFn: config.getCdpLogFn || ((ideType: string) => LOG.forComponent(`CDP:${ideType}`).asLogFn()),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
poller = new AgentStreamPoller({
|
|
184
|
+
agentStreamManager,
|
|
185
|
+
providerLoader,
|
|
186
|
+
instanceManager,
|
|
187
|
+
cdpManagers,
|
|
188
|
+
onStreamsUpdated: config.onStreamsUpdated,
|
|
189
|
+
});
|
|
190
|
+
poller.start();
|
|
191
|
+
|
|
192
|
+
// 10. Start instance ticking
|
|
193
|
+
instanceManager.startTicking(config.tickIntervalMs ?? 5_000);
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
providerLoader,
|
|
197
|
+
instanceManager,
|
|
198
|
+
cliManager,
|
|
199
|
+
commandHandler,
|
|
200
|
+
agentStreamManager,
|
|
201
|
+
router,
|
|
202
|
+
poller,
|
|
203
|
+
cdpInitializer,
|
|
204
|
+
cdpManagers,
|
|
205
|
+
instanceIdMap,
|
|
206
|
+
detectedIdes: detectedIdesRef,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ─── Shutdown ───
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Graceful shutdown of all daemon components.
|
|
214
|
+
* Shared by both cloud and standalone daemons.
|
|
215
|
+
*
|
|
216
|
+
* Order:
|
|
217
|
+
* 1. Stop timers (poller, cdpInitializer)
|
|
218
|
+
* 2. Dispose agent stream
|
|
219
|
+
* 3. Shutdown CLIs
|
|
220
|
+
* 4. Dispose instances
|
|
221
|
+
* 5. Disconnect CDPs
|
|
222
|
+
*/
|
|
223
|
+
export async function shutdownDaemonComponents(components: DaemonComponents): Promise<void> {
|
|
224
|
+
const {
|
|
225
|
+
poller, cdpInitializer, agentStreamManager,
|
|
226
|
+
cliManager, instanceManager, cdpManagers,
|
|
227
|
+
} = components;
|
|
228
|
+
|
|
229
|
+
// 1. Stop timers
|
|
230
|
+
poller.stop();
|
|
231
|
+
cdpInitializer.stop();
|
|
232
|
+
|
|
233
|
+
// 2. Dispose agent stream
|
|
234
|
+
try {
|
|
235
|
+
const anyCdp = [...cdpManagers.values()].find(m => m.isConnected);
|
|
236
|
+
if (agentStreamManager && anyCdp) {
|
|
237
|
+
await agentStreamManager.dispose(anyCdp);
|
|
238
|
+
}
|
|
239
|
+
} catch (e: any) { LOG.warn('Shutdown', `AgentStream dispose: ${e?.message}`); }
|
|
240
|
+
|
|
241
|
+
// 3. Shutdown CLIs
|
|
242
|
+
try { await cliManager.shutdownAll(); } catch { /* noop */ }
|
|
243
|
+
|
|
244
|
+
// 4. Dispose instances
|
|
245
|
+
try { instanceManager.disposeAll(); } catch { /* noop */ }
|
|
246
|
+
|
|
247
|
+
// 5. Disconnect CDPs
|
|
248
|
+
for (const m of cdpManagers.values()) {
|
|
249
|
+
try { m.disconnect(); } catch { /* noop */ }
|
|
250
|
+
}
|
|
251
|
+
cdpManagers.clear();
|
|
252
|
+
}
|