@adhdev/daemon-core 0.7.38 → 0.7.39
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/agent-stream/forward.d.ts +8 -0
- package/dist/agent-stream/index.d.ts +6 -0
- package/dist/agent-stream/manager.d.ts +59 -0
- package/dist/agent-stream/poller.d.ts +41 -0
- package/dist/agent-stream/provider-adapter.d.ts +29 -0
- package/dist/agent-stream/types.d.ts +62 -0
- package/dist/boot/daemon-lifecycle.d.ts +97 -0
- package/dist/cdp/devtools.d.ts +51 -0
- package/dist/cdp/initializer.d.ts +50 -0
- package/dist/cdp/manager.d.ts +145 -0
- package/dist/cdp/scanner.d.ts +58 -0
- package/dist/cdp/setup.d.ts +58 -0
- package/dist/cli-adapter-types.d.ts +25 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +229 -0
- package/dist/cli-adapters/pty-transport.d.ts +43 -0
- package/dist/cli-adapters/session-host-transport.d.ts +19 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +12 -0
- package/dist/cli-adapters/terminal-backends/types.d.ts +14 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +13 -0
- package/dist/cli-adapters/terminal-screen.d.ts +27 -0
- package/dist/commands/cdp-commands.d.ts +15 -0
- package/dist/commands/chat-commands.d.ts +15 -0
- package/dist/commands/cli-manager.d.ts +82 -0
- package/dist/commands/handler.d.ts +101 -0
- package/dist/commands/router.d.ts +69 -0
- package/dist/commands/stream-commands.d.ts +13 -0
- package/dist/commands/workspace-commands.d.ts +11 -0
- package/dist/config/chat-history.d.ts +60 -0
- package/dist/config/config.d.ts +101 -0
- package/dist/config/recent-activity.d.ts +27 -0
- package/dist/config/workspaces.d.ts +82 -0
- package/dist/daemon/dev-auto-implement.d.ts +26 -0
- package/dist/daemon/dev-cdp-handlers.d.ts +22 -0
- package/dist/daemon/dev-cli-debug.d.ts +24 -0
- package/dist/daemon/dev-server-types.d.ts +43 -0
- package/dist/daemon/dev-server.d.ts +133 -0
- package/dist/daemon/scaffold-template.d.ts +32 -0
- package/dist/daemon-core.d.ts +36 -0
- package/dist/detection/cli-detector.d.ts +27 -0
- package/dist/detection/ide-detector.d.ts +34 -0
- package/dist/index.d.ts +72 -2499
- package/dist/index.js +458 -637
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +465 -642
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +50 -0
- package/dist/ipc-protocol.d.ts +111 -0
- package/dist/launch.d.ts +46 -0
- package/dist/logging/command-log.d.ts +31 -0
- package/dist/logging/logger.d.ts +87 -0
- package/dist/providers/acp-provider-instance.d.ts +101 -0
- package/dist/providers/cli-provider-instance.d.ts +43 -0
- package/dist/providers/contracts.d.ts +483 -0
- package/dist/providers/extension-provider-instance.d.ts +44 -0
- package/dist/providers/ide-provider-instance.d.ts +61 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/provider-instance-manager.d.ts +84 -0
- package/dist/providers/provider-instance.d.ts +148 -0
- package/dist/providers/provider-loader.d.ts +270 -0
- package/dist/providers/status-monitor.d.ts +48 -0
- package/dist/providers/version-archive.d.ts +52 -0
- package/dist/session-host/runtime-support.d.ts +8 -0
- package/dist/sessions/registry.d.ts +24 -0
- package/dist/shared-types-extra.d.ts +29 -0
- package/dist/shared-types.d.ts +213 -0
- package/dist/status/builders.d.ts +33 -0
- package/dist/status/normalize.d.ts +14 -1
- package/dist/status/reporter.d.ts +69 -0
- package/dist/status/snapshot.d.ts +38 -0
- package/dist/system/host-memory.d.ts +19 -0
- package/dist/types.d.ts +123 -0
- package/node_modules/@adhdev/session-host-core/package.json +1 -1
- package/package.json +3 -2
- package/src/commands/cli-manager.ts +1 -26
- package/src/commands/handler.ts +0 -31
- package/src/commands/router.ts +1 -18
- package/src/commands/stream-commands.ts +2 -4
- package/src/commands/workspace-commands.ts +9 -23
- package/src/config/config.ts +1 -78
- package/src/config/workspaces.ts +0 -24
- package/src/index.ts +16 -15
- package/src/providers/provider-loader.ts +13 -5
- package/src/shared-types-extra.ts +34 -0
- package/src/shared-types.ts +14 -27
- package/src/status/builders.ts +12 -0
- package/src/status/reporter.ts +1 -0
- package/src/status/snapshot.ts +26 -13
- package/src/types.ts +3 -8
- package/dist/index.d.mts +0 -2504
- package/dist/normalize-DVI4Lo5I.d.mts +0 -947
- package/dist/normalize-DVI4Lo5I.d.ts +0 -947
- package/dist/status/normalize.d.mts +0 -1
- package/src/config/workspace-activity.ts +0 -65
package/dist/index.js
CHANGED
|
@@ -30,201 +30,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
30
|
));
|
|
31
31
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
32
|
|
|
33
|
-
// src/config/workspaces.ts
|
|
34
|
-
function expandPath(p) {
|
|
35
|
-
const t = (p || "").trim();
|
|
36
|
-
if (!t) return "";
|
|
37
|
-
if (t.startsWith("~")) return path.join(os.homedir(), t.slice(1).replace(/^\//, ""));
|
|
38
|
-
return path.resolve(t);
|
|
39
|
-
}
|
|
40
|
-
function validateWorkspacePath(absPath) {
|
|
41
|
-
try {
|
|
42
|
-
if (!absPath) return { ok: false, error: "Path required" };
|
|
43
|
-
if (!fs.existsSync(absPath)) return { ok: false, error: "Path does not exist" };
|
|
44
|
-
const st = fs.statSync(absPath);
|
|
45
|
-
if (!st.isDirectory()) return { ok: false, error: "Not a directory" };
|
|
46
|
-
return { ok: true };
|
|
47
|
-
} catch (e) {
|
|
48
|
-
return { ok: false, error: e?.message || "Invalid path" };
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function defaultWorkspaceLabel(absPath) {
|
|
52
|
-
const base = path.basename(absPath) || absPath;
|
|
53
|
-
return base;
|
|
54
|
-
}
|
|
55
|
-
function migrateWorkspacesFromRecent(config) {
|
|
56
|
-
if (!config.workspaces) config.workspaces = [];
|
|
57
|
-
if (config.workspaces.length > 0) return config;
|
|
58
|
-
const recent = config.recentCliWorkspaces || [];
|
|
59
|
-
const now = Date.now();
|
|
60
|
-
for (const raw of recent) {
|
|
61
|
-
const abs = expandPath(raw);
|
|
62
|
-
if (!abs || validateWorkspacePath(abs).ok !== true) continue;
|
|
63
|
-
if (config.workspaces.some((w) => path.resolve(w.path) === abs)) continue;
|
|
64
|
-
config.workspaces.push({
|
|
65
|
-
id: (0, import_crypto.randomUUID)(),
|
|
66
|
-
path: abs,
|
|
67
|
-
label: defaultWorkspaceLabel(abs),
|
|
68
|
-
addedAt: now
|
|
69
|
-
});
|
|
70
|
-
if (config.workspaces.length >= MAX_WORKSPACES) break;
|
|
71
|
-
}
|
|
72
|
-
return config;
|
|
73
|
-
}
|
|
74
|
-
function getDefaultWorkspacePath(config) {
|
|
75
|
-
const id = config.defaultWorkspaceId;
|
|
76
|
-
if (!id) return null;
|
|
77
|
-
const w = (config.workspaces || []).find((x) => x.id === id);
|
|
78
|
-
if (!w) return null;
|
|
79
|
-
const abs = expandPath(w.path);
|
|
80
|
-
if (validateWorkspacePath(abs).ok !== true) return null;
|
|
81
|
-
return abs;
|
|
82
|
-
}
|
|
83
|
-
function getWorkspaceState(config) {
|
|
84
|
-
const workspaces = [...config.workspaces || []].sort((a, b) => b.addedAt - a.addedAt);
|
|
85
|
-
const defaultWorkspacePath = getDefaultWorkspacePath(config);
|
|
86
|
-
return {
|
|
87
|
-
workspaces,
|
|
88
|
-
defaultWorkspaceId: config.defaultWorkspaceId ?? null,
|
|
89
|
-
defaultWorkspacePath
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function resolveLaunchDirectory(args, config) {
|
|
93
|
-
const a = args || {};
|
|
94
|
-
if (a.dir != null && String(a.dir).trim()) {
|
|
95
|
-
const abs = expandPath(String(a.dir).trim());
|
|
96
|
-
if (abs && validateWorkspacePath(abs).ok === true) {
|
|
97
|
-
return { ok: true, path: abs, source: "dir" };
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
ok: false,
|
|
101
|
-
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
102
|
-
message: abs ? "Directory path is not valid or does not exist" : "Invalid directory path"
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
if (a.workspaceId) {
|
|
106
|
-
const w = (config.workspaces || []).find((x) => x.id === a.workspaceId);
|
|
107
|
-
if (w) {
|
|
108
|
-
const abs = expandPath(w.path);
|
|
109
|
-
if (validateWorkspacePath(abs).ok === true) {
|
|
110
|
-
return { ok: true, path: abs, source: "workspaceId" };
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
ok: false,
|
|
115
|
-
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
116
|
-
message: "Saved workspace not found or path is no longer valid"
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (a.useDefaultWorkspace === true) {
|
|
120
|
-
const d = getDefaultWorkspacePath(config);
|
|
121
|
-
if (d) return { ok: true, path: d, source: "defaultWorkspace" };
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
125
|
-
message: "No default workspace is set"
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
if (a.useHome === true) {
|
|
129
|
-
return { ok: true, path: os.homedir(), source: "home" };
|
|
130
|
-
}
|
|
131
|
-
return {
|
|
132
|
-
ok: false,
|
|
133
|
-
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
134
|
-
message: "Choose a directory, saved workspace, default workspace, or home before launching."
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
function resolveIdeWorkspaceFromArgs(args, config) {
|
|
138
|
-
const ar = args || {};
|
|
139
|
-
if (ar.workspace) {
|
|
140
|
-
const abs = expandPath(ar.workspace);
|
|
141
|
-
if (abs && validateWorkspacePath(abs).ok === true) return abs;
|
|
142
|
-
}
|
|
143
|
-
if (ar.workspaceId) {
|
|
144
|
-
const w = (config.workspaces || []).find((x) => x.id === ar.workspaceId);
|
|
145
|
-
if (w) {
|
|
146
|
-
const abs = expandPath(w.path);
|
|
147
|
-
if (validateWorkspacePath(abs).ok === true) return abs;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (ar.useDefaultWorkspace === true) {
|
|
151
|
-
return getDefaultWorkspacePath(config) || void 0;
|
|
152
|
-
}
|
|
153
|
-
return void 0;
|
|
154
|
-
}
|
|
155
|
-
function resolveIdeLaunchWorkspace(args, config) {
|
|
156
|
-
const direct = resolveIdeWorkspaceFromArgs(args, config);
|
|
157
|
-
if (direct) return direct;
|
|
158
|
-
if (args?.useDefaultWorkspace === false) return void 0;
|
|
159
|
-
return getDefaultWorkspacePath(config) || void 0;
|
|
160
|
-
}
|
|
161
|
-
function findWorkspaceByPath(config, rawPath) {
|
|
162
|
-
const abs = path.resolve(expandPath(rawPath));
|
|
163
|
-
if (!abs) return void 0;
|
|
164
|
-
return (config.workspaces || []).find((w) => path.resolve(expandPath(w.path)) === abs);
|
|
165
|
-
}
|
|
166
|
-
function addWorkspaceEntry(config, rawPath, label, options) {
|
|
167
|
-
const abs = expandPath(rawPath);
|
|
168
|
-
const createIfMissing = options?.createIfMissing === true;
|
|
169
|
-
if (!abs) return { error: "Path required" };
|
|
170
|
-
if (!fs.existsSync(abs) && createIfMissing) {
|
|
171
|
-
try {
|
|
172
|
-
fs.mkdirSync(abs, { recursive: true });
|
|
173
|
-
} catch (e) {
|
|
174
|
-
return { error: e?.message || "Could not create directory" };
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const v = validateWorkspacePath(abs);
|
|
178
|
-
if (!v.ok) return { error: v.error };
|
|
179
|
-
const list = [...config.workspaces || []];
|
|
180
|
-
if (list.some((w) => path.resolve(w.path) === abs)) {
|
|
181
|
-
return { error: "Workspace already in list" };
|
|
182
|
-
}
|
|
183
|
-
if (list.length >= MAX_WORKSPACES) {
|
|
184
|
-
return { error: `Maximum ${MAX_WORKSPACES} workspaces` };
|
|
185
|
-
}
|
|
186
|
-
const entry = {
|
|
187
|
-
id: (0, import_crypto.randomUUID)(),
|
|
188
|
-
path: abs,
|
|
189
|
-
label: (label || "").trim() || defaultWorkspaceLabel(abs),
|
|
190
|
-
addedAt: Date.now()
|
|
191
|
-
};
|
|
192
|
-
list.push(entry);
|
|
193
|
-
return { config: { ...config, workspaces: list }, entry };
|
|
194
|
-
}
|
|
195
|
-
function removeWorkspaceEntry(config, id) {
|
|
196
|
-
const list = (config.workspaces || []).filter((w) => w.id !== id);
|
|
197
|
-
if (list.length === (config.workspaces || []).length) return { error: "Workspace not found" };
|
|
198
|
-
let defaultWorkspaceId = config.defaultWorkspaceId;
|
|
199
|
-
if (defaultWorkspaceId === id) defaultWorkspaceId = null;
|
|
200
|
-
return { config: { ...config, workspaces: list, defaultWorkspaceId } };
|
|
201
|
-
}
|
|
202
|
-
function setDefaultWorkspaceId(config, id) {
|
|
203
|
-
if (id === null) {
|
|
204
|
-
return { config: { ...config, defaultWorkspaceId: null } };
|
|
205
|
-
}
|
|
206
|
-
const w = (config.workspaces || []).find((x) => x.id === id);
|
|
207
|
-
if (!w) return { error: "Workspace not found" };
|
|
208
|
-
const abs = expandPath(w.path);
|
|
209
|
-
if (validateWorkspacePath(abs).ok !== true) return { error: "Workspace path is no longer valid" };
|
|
210
|
-
return { config: { ...config, defaultWorkspaceId: id } };
|
|
211
|
-
}
|
|
212
|
-
var fs, os, path, import_crypto, MAX_WORKSPACES;
|
|
213
|
-
var init_workspaces = __esm({
|
|
214
|
-
"src/config/workspaces.ts"() {
|
|
215
|
-
"use strict";
|
|
216
|
-
fs = __toESM(require("fs"));
|
|
217
|
-
os = __toESM(require("os"));
|
|
218
|
-
path = __toESM(require("path"));
|
|
219
|
-
import_crypto = require("crypto");
|
|
220
|
-
MAX_WORKSPACES = 50;
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
|
|
224
33
|
// src/config/config.ts
|
|
225
34
|
var config_exports = {};
|
|
226
35
|
__export(config_exports, {
|
|
227
|
-
addCliHistory: () => addCliHistory,
|
|
228
36
|
generateConnectionToken: () => generateConnectionToken,
|
|
229
37
|
generateMachineId: () => generateMachineId,
|
|
230
38
|
getConfigDir: () => getConfigDir,
|
|
@@ -237,7 +45,7 @@ __export(config_exports, {
|
|
|
237
45
|
updateConfig: () => updateConfig
|
|
238
46
|
});
|
|
239
47
|
function generateMachineId() {
|
|
240
|
-
return `${MACHINE_ID_PREFIX}${(0,
|
|
48
|
+
return `${MACHINE_ID_PREFIX}${(0, import_crypto.randomUUID)().replace(/-/g, "")}`;
|
|
241
49
|
}
|
|
242
50
|
function isStableMachineId(machineId) {
|
|
243
51
|
return typeof machineId === "string" && machineId.startsWith(MACHINE_ID_PREFIX);
|
|
@@ -284,15 +92,9 @@ function loadConfig() {
|
|
|
284
92
|
merged.defaultWorkspaceId = merged.activeWorkspaceId;
|
|
285
93
|
}
|
|
286
94
|
delete merged.activeWorkspaceId;
|
|
287
|
-
const hadStoredWorkspaces = Array.isArray(parsed.workspaces) && parsed.workspaces.length > 0;
|
|
288
95
|
const ensured = ensureMachineId(merged);
|
|
289
96
|
const normalized = ensured.config;
|
|
290
|
-
|
|
291
|
-
let configChanged = ensured.changed;
|
|
292
|
-
if (!hadStoredWorkspaces && (normalized.workspaces?.length || 0) > 0) {
|
|
293
|
-
configChanged = true;
|
|
294
|
-
}
|
|
295
|
-
if (configChanged) {
|
|
97
|
+
if (ensured.changed) {
|
|
296
98
|
try {
|
|
297
99
|
saveConfig(normalized);
|
|
298
100
|
} catch {
|
|
@@ -347,43 +149,14 @@ function generateConnectionToken() {
|
|
|
347
149
|
}
|
|
348
150
|
return token;
|
|
349
151
|
}
|
|
350
|
-
|
|
351
|
-
const config = loadConfig();
|
|
352
|
-
const history = config.cliHistory || [];
|
|
353
|
-
const argsKey = (entry.cliArgs || []).join(" ");
|
|
354
|
-
const category = entry.category || "cli";
|
|
355
|
-
const workspaceKey = entry.workspace || "";
|
|
356
|
-
const modelKey = entry.model || "";
|
|
357
|
-
const filtered = history.filter((h) => {
|
|
358
|
-
const hArgsKey = (h.cliArgs || []).join(" ");
|
|
359
|
-
return !((h.category || "cli") === category && h.cliType === entry.cliType && h.dir === entry.dir && hArgsKey === argsKey && (h.workspace || "") === workspaceKey && (h.model || "") === modelKey);
|
|
360
|
-
});
|
|
361
|
-
filtered.unshift({
|
|
362
|
-
...entry,
|
|
363
|
-
category,
|
|
364
|
-
timestamp: Date.now(),
|
|
365
|
-
label: entry.label || (() => {
|
|
366
|
-
const base = `${entry.cliType} \xB7 ${entry.dir.split("/").filter(Boolean).pop() || "root"}`;
|
|
367
|
-
const suffix = [];
|
|
368
|
-
if (entry.workspace && entry.workspace !== entry.dir) suffix.push(entry.workspace.split("/").filter(Boolean).pop() || entry.workspace);
|
|
369
|
-
if (entry.model) suffix.push(`model=${entry.model}`);
|
|
370
|
-
if (argsKey) suffix.push(argsKey);
|
|
371
|
-
if (entry.newWindow) suffix.push("new window");
|
|
372
|
-
return suffix.length > 0 ? `${base} (${suffix.join(" \xB7 ")})` : base;
|
|
373
|
-
})()
|
|
374
|
-
});
|
|
375
|
-
config.cliHistory = filtered.slice(0, 20);
|
|
376
|
-
saveConfig(config);
|
|
377
|
-
}
|
|
378
|
-
var import_os, import_path, import_fs, import_crypto2, DEFAULT_CONFIG, MACHINE_ID_PREFIX;
|
|
152
|
+
var import_os, import_path, import_fs, import_crypto, DEFAULT_CONFIG, MACHINE_ID_PREFIX;
|
|
379
153
|
var init_config = __esm({
|
|
380
154
|
"src/config/config.ts"() {
|
|
381
155
|
"use strict";
|
|
382
156
|
import_os = require("os");
|
|
383
157
|
import_path = require("path");
|
|
384
158
|
import_fs = require("fs");
|
|
385
|
-
|
|
386
|
-
init_workspaces();
|
|
159
|
+
import_crypto = require("crypto");
|
|
387
160
|
DEFAULT_CONFIG = {
|
|
388
161
|
serverUrl: "https://api.adhf.dev",
|
|
389
162
|
apiToken: null,
|
|
@@ -399,17 +172,14 @@ var init_config = __esm({
|
|
|
399
172
|
setupDate: null,
|
|
400
173
|
configuredCLIs: [],
|
|
401
174
|
enabledIdes: [],
|
|
402
|
-
recentCliWorkspaces: [],
|
|
403
175
|
workspaces: [],
|
|
404
176
|
defaultWorkspaceId: null,
|
|
405
|
-
recentWorkspaceActivity: [],
|
|
406
177
|
recentActivity: [],
|
|
407
178
|
recentSessionReads: {},
|
|
408
179
|
machineNickname: null,
|
|
409
180
|
machineId: void 0,
|
|
410
181
|
machineSecret: null,
|
|
411
182
|
registeredMachineId: void 0,
|
|
412
|
-
cliHistory: [],
|
|
413
183
|
providerSettings: {},
|
|
414
184
|
ideSettings: {},
|
|
415
185
|
disableUpstream: false
|
|
@@ -433,7 +203,7 @@ function checkDateRotation() {
|
|
|
433
203
|
const today = getDateStr();
|
|
434
204
|
if (today !== currentDate) {
|
|
435
205
|
currentDate = today;
|
|
436
|
-
currentLogFile =
|
|
206
|
+
currentLogFile = path3.join(LOG_DIR, `daemon-${currentDate}.log`);
|
|
437
207
|
cleanOldLogs();
|
|
438
208
|
}
|
|
439
209
|
}
|
|
@@ -447,7 +217,7 @@ function cleanOldLogs() {
|
|
|
447
217
|
const dateMatch = file.match(/daemon-(\d{4}-\d{2}-\d{2})/);
|
|
448
218
|
if (dateMatch && dateMatch[1] < cutoffStr) {
|
|
449
219
|
try {
|
|
450
|
-
fs2.unlinkSync(
|
|
220
|
+
fs2.unlinkSync(path3.join(LOG_DIR, file));
|
|
451
221
|
} catch {
|
|
452
222
|
}
|
|
453
223
|
}
|
|
@@ -564,17 +334,17 @@ function installGlobalInterceptor() {
|
|
|
564
334
|
writeToFile(`Log file: ${currentLogFile}`);
|
|
565
335
|
writeToFile(`Log level: ${currentLevel}`);
|
|
566
336
|
}
|
|
567
|
-
var fs2,
|
|
337
|
+
var fs2, path3, os4, LEVEL_NUM, LEVEL_LABEL, currentLevel, LOG_DIR, MAX_LOG_SIZE, MAX_LOG_DAYS, currentDate, currentLogFile, writeCount, RING_BUFFER_SIZE, ringBuffer, origConsoleLog, origConsoleError, origConsoleWarn, LOG, interceptorInstalled, LOG_PATH;
|
|
568
338
|
var init_logger = __esm({
|
|
569
339
|
"src/logging/logger.ts"() {
|
|
570
340
|
"use strict";
|
|
571
341
|
fs2 = __toESM(require("fs"));
|
|
572
|
-
|
|
342
|
+
path3 = __toESM(require("path"));
|
|
573
343
|
os4 = __toESM(require("os"));
|
|
574
344
|
LEVEL_NUM = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
575
345
|
LEVEL_LABEL = { debug: "DBG", info: "INF", warn: "WRN", error: "ERR" };
|
|
576
346
|
currentLevel = "info";
|
|
577
|
-
LOG_DIR = process.platform === "win32" ?
|
|
347
|
+
LOG_DIR = process.platform === "win32" ? path3.join(process.env.LOCALAPPDATA || process.env.APPDATA || path3.join(os4.homedir(), "AppData", "Local"), "adhdev", "logs") : process.platform === "darwin" ? path3.join(os4.homedir(), "Library", "Logs", "adhdev") : path3.join(os4.homedir(), ".local", "share", "adhdev", "logs");
|
|
578
348
|
MAX_LOG_SIZE = 5 * 1024 * 1024;
|
|
579
349
|
MAX_LOG_DAYS = 7;
|
|
580
350
|
try {
|
|
@@ -582,16 +352,16 @@ var init_logger = __esm({
|
|
|
582
352
|
} catch {
|
|
583
353
|
}
|
|
584
354
|
currentDate = getDateStr();
|
|
585
|
-
currentLogFile =
|
|
355
|
+
currentLogFile = path3.join(LOG_DIR, `daemon-${currentDate}.log`);
|
|
586
356
|
cleanOldLogs();
|
|
587
357
|
try {
|
|
588
|
-
const oldLog =
|
|
358
|
+
const oldLog = path3.join(LOG_DIR, "daemon.log");
|
|
589
359
|
if (fs2.existsSync(oldLog)) {
|
|
590
360
|
const stat = fs2.statSync(oldLog);
|
|
591
361
|
const oldDate = stat.mtime.toISOString().slice(0, 10);
|
|
592
|
-
fs2.renameSync(oldLog,
|
|
362
|
+
fs2.renameSync(oldLog, path3.join(LOG_DIR, `daemon-${oldDate}.log`));
|
|
593
363
|
}
|
|
594
|
-
const oldLogBackup =
|
|
364
|
+
const oldLogBackup = path3.join(LOG_DIR, "daemon.log.old");
|
|
595
365
|
if (fs2.existsSync(oldLogBackup)) {
|
|
596
366
|
fs2.unlinkSync(oldLogBackup);
|
|
597
367
|
}
|
|
@@ -623,7 +393,7 @@ var init_logger = __esm({
|
|
|
623
393
|
}
|
|
624
394
|
};
|
|
625
395
|
interceptorInstalled = false;
|
|
626
|
-
LOG_PATH =
|
|
396
|
+
LOG_PATH = path3.join(LOG_DIR, `daemon-${getDateStr()}.log`);
|
|
627
397
|
}
|
|
628
398
|
});
|
|
629
399
|
|
|
@@ -951,7 +721,7 @@ function findBinary(name) {
|
|
|
951
721
|
}
|
|
952
722
|
}
|
|
953
723
|
function isScriptBinary(binaryPath) {
|
|
954
|
-
if (!
|
|
724
|
+
if (!path9.isAbsolute(binaryPath)) return false;
|
|
955
725
|
try {
|
|
956
726
|
const fs12 = require("fs");
|
|
957
727
|
const resolved = fs12.realpathSync(binaryPath);
|
|
@@ -967,7 +737,7 @@ function isScriptBinary(binaryPath) {
|
|
|
967
737
|
}
|
|
968
738
|
}
|
|
969
739
|
function looksLikeMachOOrElf(filePath) {
|
|
970
|
-
if (!
|
|
740
|
+
if (!path9.isAbsolute(filePath)) return false;
|
|
971
741
|
try {
|
|
972
742
|
const fs12 = require("fs");
|
|
973
743
|
const resolved = fs12.realpathSync(filePath);
|
|
@@ -1081,12 +851,12 @@ function normalizeCliProviderForRuntime(raw) {
|
|
|
1081
851
|
}
|
|
1082
852
|
};
|
|
1083
853
|
}
|
|
1084
|
-
var os12,
|
|
854
|
+
var os12, path9, import_child_process5, pty2, ProviderCliAdapter;
|
|
1085
855
|
var init_provider_cli_adapter = __esm({
|
|
1086
856
|
"src/cli-adapters/provider-cli-adapter.ts"() {
|
|
1087
857
|
"use strict";
|
|
1088
858
|
os12 = __toESM(require("os"));
|
|
1089
|
-
|
|
859
|
+
path9 = __toESM(require("path"));
|
|
1090
860
|
import_child_process5 = require("child_process");
|
|
1091
861
|
init_logger();
|
|
1092
862
|
init_terminal_screen();
|
|
@@ -1096,9 +866,9 @@ var init_provider_cli_adapter = __esm({
|
|
|
1096
866
|
if (os12.platform() !== "win32") {
|
|
1097
867
|
try {
|
|
1098
868
|
const fs12 = require("fs");
|
|
1099
|
-
const ptyDir =
|
|
869
|
+
const ptyDir = path9.resolve(path9.dirname(require.resolve("node-pty")), "..");
|
|
1100
870
|
const platformArch = `${os12.platform()}-${os12.arch()}`;
|
|
1101
|
-
const helper =
|
|
871
|
+
const helper = path9.join(ptyDir, "prebuilds", platformArch, "spawn-helper");
|
|
1102
872
|
if (fs12.existsSync(helper)) {
|
|
1103
873
|
const stat = fs12.statSync(helper);
|
|
1104
874
|
if (!(stat.mode & 73)) {
|
|
@@ -1287,7 +1057,7 @@ var init_provider_cli_adapter = __esm({
|
|
|
1287
1057
|
LOG.info("CLI", `[${this.cliType}] Spawning in ${this.workingDir}`);
|
|
1288
1058
|
let shellCmd;
|
|
1289
1059
|
let shellArgs;
|
|
1290
|
-
const useShellUnix = !isWin && (!!spawnConfig.shell || !
|
|
1060
|
+
const useShellUnix = !isWin && (!!spawnConfig.shell || !path9.isAbsolute(binaryPath) || isScriptBinary(binaryPath) || !looksLikeMachOOrElf(binaryPath));
|
|
1291
1061
|
const useShell = isWin ? !!spawnConfig.shell : useShellUnix;
|
|
1292
1062
|
if (useShell) {
|
|
1293
1063
|
if (!spawnConfig.shell && !isWin) {
|
|
@@ -1712,7 +1482,7 @@ ${data.message || ""}`.trim();
|
|
|
1712
1482
|
if (this.startupParseGate) {
|
|
1713
1483
|
const deadline = Date.now() + 1e4;
|
|
1714
1484
|
while (this.startupParseGate && Date.now() < deadline) {
|
|
1715
|
-
await new Promise((
|
|
1485
|
+
await new Promise((resolve9) => setTimeout(resolve9, 50));
|
|
1716
1486
|
}
|
|
1717
1487
|
}
|
|
1718
1488
|
if (!this.ready) throw new Error(`${this.cliName} not ready (status: ${this.currentStatus})`);
|
|
@@ -1880,17 +1650,17 @@ ${data.message || ""}`.trim();
|
|
|
1880
1650
|
}
|
|
1881
1651
|
}
|
|
1882
1652
|
waitForStopped(timeoutMs) {
|
|
1883
|
-
return new Promise((
|
|
1653
|
+
return new Promise((resolve9) => {
|
|
1884
1654
|
const startedAt = Date.now();
|
|
1885
1655
|
const timer = setInterval(() => {
|
|
1886
1656
|
if (!this.ptyProcess || this.currentStatus === "stopped") {
|
|
1887
1657
|
clearInterval(timer);
|
|
1888
|
-
|
|
1658
|
+
resolve9(true);
|
|
1889
1659
|
return;
|
|
1890
1660
|
}
|
|
1891
1661
|
if (Date.now() - startedAt >= timeoutMs) {
|
|
1892
1662
|
clearInterval(timer);
|
|
1893
|
-
|
|
1663
|
+
resolve9(false);
|
|
1894
1664
|
}
|
|
1895
1665
|
}, 100);
|
|
1896
1666
|
});
|
|
@@ -2106,7 +1876,6 @@ __export(index_exports, {
|
|
|
2106
1876
|
ProviderLoader: () => ProviderLoader,
|
|
2107
1877
|
SessionHostPtyTransportFactory: () => SessionHostPtyTransportFactory,
|
|
2108
1878
|
VersionArchive: () => VersionArchive,
|
|
2109
|
-
addCliHistory: () => addCliHistory,
|
|
2110
1879
|
appendRecentActivity: () => appendRecentActivity,
|
|
2111
1880
|
buildSessionEntries: () => buildSessionEntries,
|
|
2112
1881
|
buildStatusSnapshot: () => buildStatusSnapshot,
|
|
@@ -2124,7 +1893,6 @@ __export(index_exports, {
|
|
|
2124
1893
|
getRecentActivity: () => getRecentActivity,
|
|
2125
1894
|
getRecentCommands: () => getRecentCommands,
|
|
2126
1895
|
getRecentLogs: () => getRecentLogs,
|
|
2127
|
-
getWorkspaceActivity: () => getWorkspaceActivity,
|
|
2128
1896
|
getWorkspaceState: () => getWorkspaceState,
|
|
2129
1897
|
hasCdpManager: () => hasCdpManager,
|
|
2130
1898
|
initDaemonComponents: () => initDaemonComponents,
|
|
@@ -2158,58 +1926,182 @@ __export(index_exports, {
|
|
|
2158
1926
|
});
|
|
2159
1927
|
module.exports = __toCommonJS(index_exports);
|
|
2160
1928
|
init_config();
|
|
2161
|
-
init_workspaces();
|
|
2162
1929
|
|
|
2163
|
-
// src/config/
|
|
2164
|
-
var
|
|
2165
|
-
|
|
2166
|
-
var
|
|
2167
|
-
|
|
1930
|
+
// src/config/workspaces.ts
|
|
1931
|
+
var fs = __toESM(require("fs"));
|
|
1932
|
+
var os = __toESM(require("os"));
|
|
1933
|
+
var path = __toESM(require("path"));
|
|
1934
|
+
var import_crypto2 = require("crypto");
|
|
1935
|
+
var MAX_WORKSPACES = 50;
|
|
1936
|
+
function expandPath(p) {
|
|
1937
|
+
const t = (p || "").trim();
|
|
1938
|
+
if (!t) return "";
|
|
1939
|
+
if (t.startsWith("~")) return path.join(os.homedir(), t.slice(1).replace(/^\//, ""));
|
|
1940
|
+
return path.resolve(t);
|
|
1941
|
+
}
|
|
1942
|
+
function validateWorkspacePath(absPath) {
|
|
2168
1943
|
try {
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
1944
|
+
if (!absPath) return { ok: false, error: "Path required" };
|
|
1945
|
+
if (!fs.existsSync(absPath)) return { ok: false, error: "Path does not exist" };
|
|
1946
|
+
const st = fs.statSync(absPath);
|
|
1947
|
+
if (!st.isDirectory()) return { ok: false, error: "Not a directory" };
|
|
1948
|
+
return { ok: true };
|
|
1949
|
+
} catch (e) {
|
|
1950
|
+
return { ok: false, error: e?.message || "Invalid path" };
|
|
2172
1951
|
}
|
|
2173
1952
|
}
|
|
2174
|
-
function
|
|
2175
|
-
const
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
1953
|
+
function defaultWorkspaceLabel(absPath) {
|
|
1954
|
+
const base = path.basename(absPath) || absPath;
|
|
1955
|
+
return base;
|
|
1956
|
+
}
|
|
1957
|
+
function getDefaultWorkspacePath(config) {
|
|
1958
|
+
const id = config.defaultWorkspaceId;
|
|
1959
|
+
if (!id) return null;
|
|
1960
|
+
const w = (config.workspaces || []).find((x) => x.id === id);
|
|
1961
|
+
if (!w) return null;
|
|
1962
|
+
const abs = expandPath(w.path);
|
|
1963
|
+
if (validateWorkspacePath(abs).ok !== true) return null;
|
|
1964
|
+
return abs;
|
|
1965
|
+
}
|
|
1966
|
+
function getWorkspaceState(config) {
|
|
1967
|
+
const workspaces = [...config.workspaces || []].sort((a, b) => b.addedAt - a.addedAt);
|
|
1968
|
+
const defaultWorkspacePath = getDefaultWorkspacePath(config);
|
|
1969
|
+
return {
|
|
1970
|
+
workspaces,
|
|
1971
|
+
defaultWorkspaceId: config.defaultWorkspaceId ?? null,
|
|
1972
|
+
defaultWorkspacePath
|
|
1973
|
+
};
|
|
1974
|
+
}
|
|
1975
|
+
function resolveLaunchDirectory(args, config) {
|
|
1976
|
+
const a = args || {};
|
|
1977
|
+
if (a.dir != null && String(a.dir).trim()) {
|
|
1978
|
+
const abs = expandPath(String(a.dir).trim());
|
|
1979
|
+
if (abs && validateWorkspacePath(abs).ok === true) {
|
|
1980
|
+
return { ok: true, path: abs, source: "dir" };
|
|
1981
|
+
}
|
|
1982
|
+
return {
|
|
1983
|
+
ok: false,
|
|
1984
|
+
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
1985
|
+
message: abs ? "Directory path is not valid or does not exist" : "Invalid directory path"
|
|
1986
|
+
};
|
|
1987
|
+
}
|
|
1988
|
+
if (a.workspaceId) {
|
|
1989
|
+
const w = (config.workspaces || []).find((x) => x.id === a.workspaceId);
|
|
1990
|
+
if (w) {
|
|
1991
|
+
const abs = expandPath(w.path);
|
|
1992
|
+
if (validateWorkspacePath(abs).ok === true) {
|
|
1993
|
+
return { ok: true, path: abs, source: "workspaceId" };
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
return {
|
|
1997
|
+
ok: false,
|
|
1998
|
+
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
1999
|
+
message: "Saved workspace not found or path is no longer valid"
|
|
2000
|
+
};
|
|
2001
|
+
}
|
|
2002
|
+
if (a.useDefaultWorkspace === true) {
|
|
2003
|
+
const d = getDefaultWorkspacePath(config);
|
|
2004
|
+
if (d) return { ok: true, path: d, source: "defaultWorkspace" };
|
|
2005
|
+
return {
|
|
2006
|
+
ok: false,
|
|
2007
|
+
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
2008
|
+
message: "No default workspace is set"
|
|
2009
|
+
};
|
|
2010
|
+
}
|
|
2011
|
+
if (a.useHome === true) {
|
|
2012
|
+
return { ok: true, path: os.homedir(), source: "home" };
|
|
2013
|
+
}
|
|
2014
|
+
return {
|
|
2015
|
+
ok: false,
|
|
2016
|
+
code: "WORKSPACE_LAUNCH_CONTEXT_REQUIRED",
|
|
2017
|
+
message: "Choose a directory, saved workspace, default workspace, or home before launching."
|
|
2018
|
+
};
|
|
2019
|
+
}
|
|
2020
|
+
function resolveIdeWorkspaceFromArgs(args, config) {
|
|
2021
|
+
const ar = args || {};
|
|
2022
|
+
if (ar.workspace) {
|
|
2023
|
+
const abs = expandPath(ar.workspace);
|
|
2024
|
+
if (abs && validateWorkspacePath(abs).ok === true) return abs;
|
|
2025
|
+
}
|
|
2026
|
+
if (ar.workspaceId) {
|
|
2027
|
+
const w = (config.workspaces || []).find((x) => x.id === ar.workspaceId);
|
|
2028
|
+
if (w) {
|
|
2029
|
+
const abs = expandPath(w.path);
|
|
2030
|
+
if (validateWorkspacePath(abs).ok === true) return abs;
|
|
2031
|
+
}
|
|
2032
|
+
}
|
|
2033
|
+
if (ar.useDefaultWorkspace === true) {
|
|
2034
|
+
return getDefaultWorkspacePath(config) || void 0;
|
|
2035
|
+
}
|
|
2036
|
+
return void 0;
|
|
2037
|
+
}
|
|
2038
|
+
function resolveIdeLaunchWorkspace(args, config) {
|
|
2039
|
+
const direct = resolveIdeWorkspaceFromArgs(args, config);
|
|
2040
|
+
if (direct) return direct;
|
|
2041
|
+
if (args?.useDefaultWorkspace === false) return void 0;
|
|
2042
|
+
return getDefaultWorkspacePath(config) || void 0;
|
|
2043
|
+
}
|
|
2044
|
+
function findWorkspaceByPath(config, rawPath) {
|
|
2045
|
+
const abs = path.resolve(expandPath(rawPath));
|
|
2046
|
+
if (!abs) return void 0;
|
|
2047
|
+
return (config.workspaces || []).find((w) => path.resolve(expandPath(w.path)) === abs);
|
|
2048
|
+
}
|
|
2049
|
+
function addWorkspaceEntry(config, rawPath, label, options) {
|
|
2050
|
+
const abs = expandPath(rawPath);
|
|
2051
|
+
const createIfMissing = options?.createIfMissing === true;
|
|
2052
|
+
if (!abs) return { error: "Path required" };
|
|
2053
|
+
if (!fs.existsSync(abs) && createIfMissing) {
|
|
2054
|
+
try {
|
|
2055
|
+
fs.mkdirSync(abs, { recursive: true });
|
|
2056
|
+
} catch (e) {
|
|
2057
|
+
return { error: e?.message || "Could not create directory" };
|
|
2058
|
+
}
|
|
2059
|
+
}
|
|
2060
|
+
const v = validateWorkspacePath(abs);
|
|
2061
|
+
if (!v.ok) return { error: v.error };
|
|
2062
|
+
const list = [...config.workspaces || []];
|
|
2063
|
+
if (list.some((w) => path.resolve(w.path) === abs)) {
|
|
2064
|
+
return { error: "Workspace already in list" };
|
|
2065
|
+
}
|
|
2066
|
+
if (list.length >= MAX_WORKSPACES) {
|
|
2067
|
+
return { error: `Maximum ${MAX_WORKSPACES} workspaces` };
|
|
2068
|
+
}
|
|
2179
2069
|
const entry = {
|
|
2070
|
+
id: (0, import_crypto2.randomUUID)(),
|
|
2180
2071
|
path: abs,
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
agentType: meta?.agentType
|
|
2072
|
+
label: (label || "").trim() || defaultWorkspaceLabel(abs),
|
|
2073
|
+
addedAt: Date.now()
|
|
2184
2074
|
};
|
|
2185
|
-
|
|
2186
|
-
return { ...config,
|
|
2075
|
+
list.push(entry);
|
|
2076
|
+
return { config: { ...config, workspaces: list }, entry };
|
|
2187
2077
|
}
|
|
2188
|
-
function
|
|
2189
|
-
const list =
|
|
2190
|
-
list.
|
|
2191
|
-
|
|
2078
|
+
function removeWorkspaceEntry(config, id) {
|
|
2079
|
+
const list = (config.workspaces || []).filter((w) => w.id !== id);
|
|
2080
|
+
if (list.length === (config.workspaces || []).length) return { error: "Workspace not found" };
|
|
2081
|
+
let defaultWorkspaceId = config.defaultWorkspaceId;
|
|
2082
|
+
if (defaultWorkspaceId === id) defaultWorkspaceId = null;
|
|
2083
|
+
return { config: { ...config, workspaces: list, defaultWorkspaceId } };
|
|
2192
2084
|
}
|
|
2193
|
-
function
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
};
|
|
2085
|
+
function setDefaultWorkspaceId(config, id) {
|
|
2086
|
+
if (id === null) {
|
|
2087
|
+
return { config: { ...config, defaultWorkspaceId: null } };
|
|
2088
|
+
}
|
|
2089
|
+
const w = (config.workspaces || []).find((x) => x.id === id);
|
|
2090
|
+
if (!w) return { error: "Workspace not found" };
|
|
2091
|
+
const abs = expandPath(w.path);
|
|
2092
|
+
if (validateWorkspacePath(abs).ok !== true) return { error: "Workspace path is no longer valid" };
|
|
2093
|
+
return { config: { ...config, defaultWorkspaceId: id } };
|
|
2201
2094
|
}
|
|
2202
2095
|
|
|
2203
2096
|
// src/config/recent-activity.ts
|
|
2204
|
-
var
|
|
2205
|
-
|
|
2206
|
-
var MAX_ACTIVITY2 = 30;
|
|
2097
|
+
var path2 = __toESM(require("path"));
|
|
2098
|
+
var MAX_ACTIVITY = 30;
|
|
2207
2099
|
function normalizeWorkspace(workspace) {
|
|
2208
2100
|
if (!workspace) return "";
|
|
2209
2101
|
try {
|
|
2210
|
-
return
|
|
2102
|
+
return path2.resolve(expandPath(workspace));
|
|
2211
2103
|
} catch {
|
|
2212
|
-
return
|
|
2104
|
+
return path2.resolve(workspace);
|
|
2213
2105
|
}
|
|
2214
2106
|
}
|
|
2215
2107
|
function buildRecentActivityKey(entry) {
|
|
@@ -2225,7 +2117,7 @@ function appendRecentActivity(config, entry) {
|
|
|
2225
2117
|
const filtered = (config.recentActivity || []).filter((item) => item.id !== nextEntry.id);
|
|
2226
2118
|
return {
|
|
2227
2119
|
...config,
|
|
2228
|
-
recentActivity: [nextEntry, ...filtered].slice(0,
|
|
2120
|
+
recentActivity: [nextEntry, ...filtered].slice(0, MAX_ACTIVITY)
|
|
2229
2121
|
};
|
|
2230
2122
|
}
|
|
2231
2123
|
function getRecentActivity(config, limit = 20) {
|
|
@@ -2353,15 +2245,15 @@ function parseVersion(raw) {
|
|
|
2353
2245
|
return match ? match[1] : raw.split("\n")[0].slice(0, 100);
|
|
2354
2246
|
}
|
|
2355
2247
|
function execAsync(cmd, timeoutMs = 5e3) {
|
|
2356
|
-
return new Promise((
|
|
2248
|
+
return new Promise((resolve9) => {
|
|
2357
2249
|
const child = (0, import_child_process2.exec)(cmd, { encoding: "utf-8", timeout: timeoutMs }, (err, stdout) => {
|
|
2358
2250
|
if (err || !stdout?.trim()) {
|
|
2359
|
-
|
|
2251
|
+
resolve9(null);
|
|
2360
2252
|
} else {
|
|
2361
|
-
|
|
2253
|
+
resolve9(stdout.trim());
|
|
2362
2254
|
}
|
|
2363
2255
|
});
|
|
2364
|
-
child.on("error", () =>
|
|
2256
|
+
child.on("error", () => resolve9(null));
|
|
2365
2257
|
});
|
|
2366
2258
|
}
|
|
2367
2259
|
async function detectCLIs(providerLoader) {
|
|
@@ -2528,7 +2420,7 @@ var DaemonCdpManager = class {
|
|
|
2528
2420
|
* Returns multiple entries if multiple IDE windows are open on same port
|
|
2529
2421
|
*/
|
|
2530
2422
|
static listAllTargets(port) {
|
|
2531
|
-
return new Promise((
|
|
2423
|
+
return new Promise((resolve9) => {
|
|
2532
2424
|
const req = http.get(`http://127.0.0.1:${port}/json`, (res) => {
|
|
2533
2425
|
let data = "";
|
|
2534
2426
|
res.on("data", (chunk) => data += chunk.toString());
|
|
@@ -2544,16 +2436,16 @@ var DaemonCdpManager = class {
|
|
|
2544
2436
|
(t) => !isNonMain(t.title || "") && t.url?.includes("workbench.html") && !t.url?.includes("agent")
|
|
2545
2437
|
);
|
|
2546
2438
|
const fallbackPages = pages.filter((t) => !isNonMain(t.title || ""));
|
|
2547
|
-
|
|
2439
|
+
resolve9(mainPages.length > 0 ? mainPages : fallbackPages);
|
|
2548
2440
|
} catch {
|
|
2549
|
-
|
|
2441
|
+
resolve9([]);
|
|
2550
2442
|
}
|
|
2551
2443
|
});
|
|
2552
2444
|
});
|
|
2553
|
-
req.on("error", () =>
|
|
2445
|
+
req.on("error", () => resolve9([]));
|
|
2554
2446
|
req.setTimeout(2e3, () => {
|
|
2555
2447
|
req.destroy();
|
|
2556
|
-
|
|
2448
|
+
resolve9([]);
|
|
2557
2449
|
});
|
|
2558
2450
|
});
|
|
2559
2451
|
}
|
|
@@ -2593,7 +2485,7 @@ var DaemonCdpManager = class {
|
|
|
2593
2485
|
}
|
|
2594
2486
|
}
|
|
2595
2487
|
findTargetOnPort(port) {
|
|
2596
|
-
return new Promise((
|
|
2488
|
+
return new Promise((resolve9) => {
|
|
2597
2489
|
const req = http.get(`http://127.0.0.1:${port}/json`, (res) => {
|
|
2598
2490
|
let data = "";
|
|
2599
2491
|
res.on("data", (chunk) => data += chunk.toString());
|
|
@@ -2604,7 +2496,7 @@ var DaemonCdpManager = class {
|
|
|
2604
2496
|
(t) => (t.type === "page" || t.type === "browser" || t.type === "Page") && t.webSocketDebuggerUrl
|
|
2605
2497
|
);
|
|
2606
2498
|
if (pages.length === 0) {
|
|
2607
|
-
|
|
2499
|
+
resolve9(targets.find((t) => t.webSocketDebuggerUrl) || null);
|
|
2608
2500
|
return;
|
|
2609
2501
|
}
|
|
2610
2502
|
const mainPages = pages.filter((t) => !this.isNonMainTitle(t.title || ""));
|
|
@@ -2614,24 +2506,24 @@ var DaemonCdpManager = class {
|
|
|
2614
2506
|
const specific = list.find((t) => t.id === this._targetId);
|
|
2615
2507
|
if (specific) {
|
|
2616
2508
|
this._pageTitle = specific.title || "";
|
|
2617
|
-
|
|
2509
|
+
resolve9(specific);
|
|
2618
2510
|
} else {
|
|
2619
2511
|
this.log(`[CDP] Target ${this._targetId} not found in page list`);
|
|
2620
|
-
|
|
2512
|
+
resolve9(null);
|
|
2621
2513
|
}
|
|
2622
2514
|
return;
|
|
2623
2515
|
}
|
|
2624
2516
|
this._pageTitle = list[0]?.title || "";
|
|
2625
|
-
|
|
2517
|
+
resolve9(list[0]);
|
|
2626
2518
|
} catch {
|
|
2627
|
-
|
|
2519
|
+
resolve9(null);
|
|
2628
2520
|
}
|
|
2629
2521
|
});
|
|
2630
2522
|
});
|
|
2631
|
-
req.on("error", () =>
|
|
2523
|
+
req.on("error", () => resolve9(null));
|
|
2632
2524
|
req.setTimeout(2e3, () => {
|
|
2633
2525
|
req.destroy();
|
|
2634
|
-
|
|
2526
|
+
resolve9(null);
|
|
2635
2527
|
});
|
|
2636
2528
|
});
|
|
2637
2529
|
}
|
|
@@ -2642,7 +2534,7 @@ var DaemonCdpManager = class {
|
|
|
2642
2534
|
this.extensionProviders = providers;
|
|
2643
2535
|
}
|
|
2644
2536
|
connectToTarget(wsUrl) {
|
|
2645
|
-
return new Promise((
|
|
2537
|
+
return new Promise((resolve9) => {
|
|
2646
2538
|
this.ws = new import_ws.default(wsUrl);
|
|
2647
2539
|
this.ws.on("open", async () => {
|
|
2648
2540
|
this._connected = true;
|
|
@@ -2652,17 +2544,17 @@ var DaemonCdpManager = class {
|
|
|
2652
2544
|
}
|
|
2653
2545
|
this.connectBrowserWs().catch(() => {
|
|
2654
2546
|
});
|
|
2655
|
-
|
|
2547
|
+
resolve9(true);
|
|
2656
2548
|
});
|
|
2657
2549
|
this.ws.on("message", (data) => {
|
|
2658
2550
|
try {
|
|
2659
2551
|
const msg = JSON.parse(data.toString());
|
|
2660
2552
|
if (msg.id && this.pending.has(msg.id)) {
|
|
2661
|
-
const { resolve:
|
|
2553
|
+
const { resolve: resolve10, reject } = this.pending.get(msg.id);
|
|
2662
2554
|
this.pending.delete(msg.id);
|
|
2663
2555
|
this.failureCount = 0;
|
|
2664
2556
|
if (msg.error) reject(new Error(msg.error.message));
|
|
2665
|
-
else
|
|
2557
|
+
else resolve10(msg.result);
|
|
2666
2558
|
} else if (msg.method === "Runtime.executionContextCreated") {
|
|
2667
2559
|
this.contexts.add(msg.params.context.id);
|
|
2668
2560
|
} else if (msg.method === "Runtime.executionContextDestroyed") {
|
|
@@ -2685,7 +2577,7 @@ var DaemonCdpManager = class {
|
|
|
2685
2577
|
this.ws.on("error", (err) => {
|
|
2686
2578
|
this.log(`[CDP] WebSocket error: ${err.message}`);
|
|
2687
2579
|
this._connected = false;
|
|
2688
|
-
|
|
2580
|
+
resolve9(false);
|
|
2689
2581
|
});
|
|
2690
2582
|
});
|
|
2691
2583
|
}
|
|
@@ -2699,7 +2591,7 @@ var DaemonCdpManager = class {
|
|
|
2699
2591
|
return;
|
|
2700
2592
|
}
|
|
2701
2593
|
this.log(`[CDP] Connecting browser WS for target discovery...`);
|
|
2702
|
-
await new Promise((
|
|
2594
|
+
await new Promise((resolve9, reject) => {
|
|
2703
2595
|
this.browserWs = new import_ws.default(browserWsUrl);
|
|
2704
2596
|
this.browserWs.on("open", async () => {
|
|
2705
2597
|
this._browserConnected = true;
|
|
@@ -2709,16 +2601,16 @@ var DaemonCdpManager = class {
|
|
|
2709
2601
|
} catch (e) {
|
|
2710
2602
|
this.log(`[CDP] setDiscoverTargets failed: ${e.message}`);
|
|
2711
2603
|
}
|
|
2712
|
-
|
|
2604
|
+
resolve9();
|
|
2713
2605
|
});
|
|
2714
2606
|
this.browserWs.on("message", (data) => {
|
|
2715
2607
|
try {
|
|
2716
2608
|
const msg = JSON.parse(data.toString());
|
|
2717
2609
|
if (msg.id && this.browserPending.has(msg.id)) {
|
|
2718
|
-
const { resolve:
|
|
2610
|
+
const { resolve: resolve10, reject: reject2 } = this.browserPending.get(msg.id);
|
|
2719
2611
|
this.browserPending.delete(msg.id);
|
|
2720
2612
|
if (msg.error) reject2(new Error(msg.error.message));
|
|
2721
|
-
else
|
|
2613
|
+
else resolve10(msg.result);
|
|
2722
2614
|
}
|
|
2723
2615
|
} catch {
|
|
2724
2616
|
}
|
|
@@ -2738,31 +2630,31 @@ var DaemonCdpManager = class {
|
|
|
2738
2630
|
}
|
|
2739
2631
|
}
|
|
2740
2632
|
getBrowserWsUrl() {
|
|
2741
|
-
return new Promise((
|
|
2633
|
+
return new Promise((resolve9) => {
|
|
2742
2634
|
const req = http.get(`http://127.0.0.1:${this.port}/json/version`, (res) => {
|
|
2743
2635
|
let data = "";
|
|
2744
2636
|
res.on("data", (chunk) => data += chunk.toString());
|
|
2745
2637
|
res.on("end", () => {
|
|
2746
2638
|
try {
|
|
2747
2639
|
const info = JSON.parse(data);
|
|
2748
|
-
|
|
2640
|
+
resolve9(info.webSocketDebuggerUrl || null);
|
|
2749
2641
|
} catch {
|
|
2750
|
-
|
|
2642
|
+
resolve9(null);
|
|
2751
2643
|
}
|
|
2752
2644
|
});
|
|
2753
2645
|
});
|
|
2754
|
-
req.on("error", () =>
|
|
2646
|
+
req.on("error", () => resolve9(null));
|
|
2755
2647
|
req.setTimeout(3e3, () => {
|
|
2756
2648
|
req.destroy();
|
|
2757
|
-
|
|
2649
|
+
resolve9(null);
|
|
2758
2650
|
});
|
|
2759
2651
|
});
|
|
2760
2652
|
}
|
|
2761
2653
|
sendBrowser(method, params = {}, timeoutMs = 15e3) {
|
|
2762
|
-
return new Promise((
|
|
2654
|
+
return new Promise((resolve9, reject) => {
|
|
2763
2655
|
if (!this.browserWs || !this._browserConnected) return reject(new Error("Browser WS not connected"));
|
|
2764
2656
|
const id = this.browserMsgId++;
|
|
2765
|
-
this.browserPending.set(id, { resolve:
|
|
2657
|
+
this.browserPending.set(id, { resolve: resolve9, reject });
|
|
2766
2658
|
this.browserWs.send(JSON.stringify({ id, method, params }));
|
|
2767
2659
|
setTimeout(() => {
|
|
2768
2660
|
if (this.browserPending.has(id)) {
|
|
@@ -2802,11 +2694,11 @@ var DaemonCdpManager = class {
|
|
|
2802
2694
|
}
|
|
2803
2695
|
// ─── CDP Protocol ────────────────────────────────────────
|
|
2804
2696
|
sendInternal(method, params = {}, timeoutMs = 15e3) {
|
|
2805
|
-
return new Promise((
|
|
2697
|
+
return new Promise((resolve9, reject) => {
|
|
2806
2698
|
if (!this.ws || !this._connected) return reject(new Error("CDP not connected"));
|
|
2807
2699
|
if (this.ws.readyState !== import_ws.default.OPEN) return reject(new Error("WebSocket not open"));
|
|
2808
2700
|
const id = this.msgId++;
|
|
2809
|
-
this.pending.set(id, { resolve:
|
|
2701
|
+
this.pending.set(id, { resolve: resolve9, reject });
|
|
2810
2702
|
this.ws.send(JSON.stringify({ id, method, params }));
|
|
2811
2703
|
setTimeout(() => {
|
|
2812
2704
|
if (this.pending.has(id)) {
|
|
@@ -3055,7 +2947,7 @@ var DaemonCdpManager = class {
|
|
|
3055
2947
|
const browserWs = this.browserWs;
|
|
3056
2948
|
let msgId = this.browserMsgId;
|
|
3057
2949
|
const sendWs = (method, params = {}, sessionId) => {
|
|
3058
|
-
return new Promise((
|
|
2950
|
+
return new Promise((resolve9, reject) => {
|
|
3059
2951
|
const mid = msgId++;
|
|
3060
2952
|
this.browserMsgId = msgId;
|
|
3061
2953
|
const handler = (raw) => {
|
|
@@ -3064,7 +2956,7 @@ var DaemonCdpManager = class {
|
|
|
3064
2956
|
if (msg.id === mid) {
|
|
3065
2957
|
browserWs.removeListener("message", handler);
|
|
3066
2958
|
if (msg.error) reject(new Error(msg.error.message || JSON.stringify(msg.error)));
|
|
3067
|
-
else
|
|
2959
|
+
else resolve9(msg.result);
|
|
3068
2960
|
}
|
|
3069
2961
|
} catch {
|
|
3070
2962
|
}
|
|
@@ -3255,14 +3147,14 @@ var DaemonCdpManager = class {
|
|
|
3255
3147
|
if (!ws || ws.readyState !== import_ws.default.OPEN) {
|
|
3256
3148
|
throw new Error("CDP not connected");
|
|
3257
3149
|
}
|
|
3258
|
-
return new Promise((
|
|
3150
|
+
return new Promise((resolve9, reject) => {
|
|
3259
3151
|
const id = getNextId();
|
|
3260
3152
|
pendingMap.set(id, {
|
|
3261
3153
|
resolve: (result) => {
|
|
3262
3154
|
if (result?.result?.subtype === "error") {
|
|
3263
3155
|
reject(new Error(result.result.description));
|
|
3264
3156
|
} else {
|
|
3265
|
-
|
|
3157
|
+
resolve9(result?.result?.value);
|
|
3266
3158
|
}
|
|
3267
3159
|
},
|
|
3268
3160
|
reject
|
|
@@ -3294,10 +3186,10 @@ var DaemonCdpManager = class {
|
|
|
3294
3186
|
throw new Error("CDP not connected");
|
|
3295
3187
|
}
|
|
3296
3188
|
const sendViaSession = (method, params = {}) => {
|
|
3297
|
-
return new Promise((
|
|
3189
|
+
return new Promise((resolve9, reject) => {
|
|
3298
3190
|
const pendingMap = this._browserConnected ? this.browserPending : this.pending;
|
|
3299
3191
|
const id = this._browserConnected ? this.browserMsgId++ : this.msgId++;
|
|
3300
|
-
pendingMap.set(id, { resolve:
|
|
3192
|
+
pendingMap.set(id, { resolve: resolve9, reject });
|
|
3301
3193
|
ws.send(JSON.stringify({ id, sessionId, method, params }));
|
|
3302
3194
|
setTimeout(() => {
|
|
3303
3195
|
if (pendingMap.has(id)) {
|
|
@@ -4004,9 +3896,9 @@ var ExtensionProviderInstance = class {
|
|
|
4004
3896
|
|
|
4005
3897
|
// src/config/chat-history.ts
|
|
4006
3898
|
var fs3 = __toESM(require("fs"));
|
|
4007
|
-
var
|
|
3899
|
+
var path4 = __toESM(require("path"));
|
|
4008
3900
|
var os5 = __toESM(require("os"));
|
|
4009
|
-
var HISTORY_DIR =
|
|
3901
|
+
var HISTORY_DIR = path4.join(os5.homedir(), ".adhdev", "history");
|
|
4010
3902
|
var RETAIN_DAYS = 30;
|
|
4011
3903
|
var ChatHistoryWriter = class {
|
|
4012
3904
|
/** Last seen message count per agent (deduplication) */
|
|
@@ -4049,11 +3941,11 @@ var ChatHistoryWriter = class {
|
|
|
4049
3941
|
});
|
|
4050
3942
|
}
|
|
4051
3943
|
if (newMessages.length === 0) return;
|
|
4052
|
-
const dir =
|
|
3944
|
+
const dir = path4.join(HISTORY_DIR, this.sanitize(agentType));
|
|
4053
3945
|
fs3.mkdirSync(dir, { recursive: true });
|
|
4054
3946
|
const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
4055
3947
|
const filePrefix = instanceId ? `${this.sanitize(instanceId)}_` : "";
|
|
4056
|
-
const filePath =
|
|
3948
|
+
const filePath = path4.join(dir, `${filePrefix}${date}.jsonl`);
|
|
4057
3949
|
const lines = newMessages.map((m) => JSON.stringify(m)).join("\n") + "\n";
|
|
4058
3950
|
fs3.appendFileSync(filePath, lines, "utf-8");
|
|
4059
3951
|
const prevCount = this.lastSeenCounts.get(dedupKey) || 0;
|
|
@@ -4097,11 +3989,11 @@ ${next}`;
|
|
|
4097
3989
|
this.lastSeenTerminal.set(dedupKey, next);
|
|
4098
3990
|
return;
|
|
4099
3991
|
}
|
|
4100
|
-
const dir =
|
|
3992
|
+
const dir = path4.join(HISTORY_DIR, this.sanitize(agentType));
|
|
4101
3993
|
fs3.mkdirSync(dir, { recursive: true });
|
|
4102
3994
|
const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
4103
3995
|
const filePrefix = instanceId ? `${this.sanitize(instanceId)}_` : "";
|
|
4104
|
-
const filePath =
|
|
3996
|
+
const filePath = path4.join(dir, `${filePrefix}${date}.terminal.log`);
|
|
4105
3997
|
fs3.appendFileSync(filePath, delta, "utf-8");
|
|
4106
3998
|
this.lastSeenTerminal.set(dedupKey, next);
|
|
4107
3999
|
if (!this.rotated) {
|
|
@@ -4125,10 +4017,10 @@ ${next}`;
|
|
|
4125
4017
|
const cutoff = Date.now() - RETAIN_DAYS * 24 * 60 * 60 * 1e3;
|
|
4126
4018
|
const agentDirs = fs3.readdirSync(HISTORY_DIR, { withFileTypes: true }).filter((d) => d.isDirectory());
|
|
4127
4019
|
for (const dir of agentDirs) {
|
|
4128
|
-
const dirPath =
|
|
4020
|
+
const dirPath = path4.join(HISTORY_DIR, dir.name);
|
|
4129
4021
|
const files = fs3.readdirSync(dirPath).filter((f) => f.endsWith(".jsonl") || f.endsWith(".terminal.log"));
|
|
4130
4022
|
for (const file of files) {
|
|
4131
|
-
const filePath =
|
|
4023
|
+
const filePath = path4.join(dirPath, file);
|
|
4132
4024
|
const stat = fs3.statSync(filePath);
|
|
4133
4025
|
if (stat.mtimeMs < cutoff) {
|
|
4134
4026
|
fs3.unlinkSync(filePath);
|
|
@@ -4146,7 +4038,7 @@ ${next}`;
|
|
|
4146
4038
|
function readChatHistory(agentType, offset = 0, limit = 30, instanceId) {
|
|
4147
4039
|
try {
|
|
4148
4040
|
const sanitized = agentType.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
4149
|
-
const dir =
|
|
4041
|
+
const dir = path4.join(HISTORY_DIR, sanitized);
|
|
4150
4042
|
if (!fs3.existsSync(dir)) return { messages: [], hasMore: false };
|
|
4151
4043
|
const sanitizedInstance = instanceId?.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
4152
4044
|
const files = fs3.readdirSync(dir).filter((f) => {
|
|
@@ -4160,7 +4052,7 @@ function readChatHistory(agentType, offset = 0, limit = 30, instanceId) {
|
|
|
4160
4052
|
const needed = offset + limit + 1;
|
|
4161
4053
|
for (const file of files) {
|
|
4162
4054
|
if (allMessages.length >= needed) break;
|
|
4163
|
-
const filePath =
|
|
4055
|
+
const filePath = path4.join(dir, file);
|
|
4164
4056
|
const content = fs3.readFileSync(filePath, "utf-8");
|
|
4165
4057
|
const lines = content.trim().split("\n").filter(Boolean);
|
|
4166
4058
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
@@ -5228,11 +5120,18 @@ function buildSessionEntries(allStates, cdpManagers) {
|
|
|
5228
5120
|
for (const state of acpStates) {
|
|
5229
5121
|
sessions.push(buildAcpSession(state));
|
|
5230
5122
|
}
|
|
5123
|
+
const extensionParentIds = new Set(
|
|
5124
|
+
sessions.filter((session) => session.transport === "cdp-webview" && !!session.parentId).map((session) => session.parentId)
|
|
5125
|
+
);
|
|
5126
|
+
for (const session of sessions) {
|
|
5127
|
+
if (session.transport === "cdp-page" && extensionParentIds.has(session.id)) {
|
|
5128
|
+
session.surfaceHidden = true;
|
|
5129
|
+
}
|
|
5130
|
+
}
|
|
5231
5131
|
return sessions;
|
|
5232
5132
|
}
|
|
5233
5133
|
|
|
5234
5134
|
// src/commands/handler.ts
|
|
5235
|
-
init_config();
|
|
5236
5135
|
init_logger();
|
|
5237
5136
|
|
|
5238
5137
|
// src/commands/chat-commands.ts
|
|
@@ -6057,7 +5956,7 @@ async function handleResolveAction(h, args) {
|
|
|
6057
5956
|
|
|
6058
5957
|
// src/commands/cdp-commands.ts
|
|
6059
5958
|
var fs4 = __toESM(require("fs"));
|
|
6060
|
-
var
|
|
5959
|
+
var path5 = __toESM(require("path"));
|
|
6061
5960
|
var os6 = __toESM(require("os"));
|
|
6062
5961
|
var KEY_TO_VK = {
|
|
6063
5962
|
Backspace: 8,
|
|
@@ -6288,11 +6187,11 @@ function resolveSafePath(requestedPath) {
|
|
|
6288
6187
|
const home = os6.homedir();
|
|
6289
6188
|
let resolved;
|
|
6290
6189
|
if (requestedPath.startsWith("~")) {
|
|
6291
|
-
resolved =
|
|
6292
|
-
} else if (
|
|
6190
|
+
resolved = path5.join(home, requestedPath.slice(1));
|
|
6191
|
+
} else if (path5.isAbsolute(requestedPath)) {
|
|
6293
6192
|
resolved = requestedPath;
|
|
6294
6193
|
} else {
|
|
6295
|
-
resolved =
|
|
6194
|
+
resolved = path5.resolve(requestedPath);
|
|
6296
6195
|
}
|
|
6297
6196
|
return resolved;
|
|
6298
6197
|
}
|
|
@@ -6308,7 +6207,7 @@ async function handleFileRead(h, args) {
|
|
|
6308
6207
|
async function handleFileWrite(h, args) {
|
|
6309
6208
|
try {
|
|
6310
6209
|
const filePath = resolveSafePath(args?.path);
|
|
6311
|
-
fs4.mkdirSync(
|
|
6210
|
+
fs4.mkdirSync(path5.dirname(filePath), { recursive: true });
|
|
6312
6211
|
fs4.writeFileSync(filePath, args?.content || "", "utf-8");
|
|
6313
6212
|
return { success: true, path: filePath };
|
|
6314
6213
|
} catch (e) {
|
|
@@ -6322,7 +6221,7 @@ async function handleFileList(h, args) {
|
|
|
6322
6221
|
const files = entries.map((e) => ({
|
|
6323
6222
|
name: e.name,
|
|
6324
6223
|
type: e.isDirectory() ? "directory" : "file",
|
|
6325
|
-
size: e.isFile() ? fs4.statSync(
|
|
6224
|
+
size: e.isFile() ? fs4.statSync(path5.join(dirPath, e.name)).size : void 0
|
|
6326
6225
|
}));
|
|
6327
6226
|
return { success: true, files, path: dirPath };
|
|
6328
6227
|
} catch (e) {
|
|
@@ -6334,7 +6233,6 @@ async function handleFileListBrowse(h, args) {
|
|
|
6334
6233
|
}
|
|
6335
6234
|
|
|
6336
6235
|
// src/commands/stream-commands.ts
|
|
6337
|
-
init_config();
|
|
6338
6236
|
init_logger();
|
|
6339
6237
|
async function handleFocusSession(h, args) {
|
|
6340
6238
|
if (!h.agentStream || !h.getCdp()) return { success: false, error: "AgentStream or CDP not available" };
|
|
@@ -6488,13 +6386,12 @@ function handleGetIdeExtensions(h, args) {
|
|
|
6488
6386
|
const loader = h.ctx.providerLoader;
|
|
6489
6387
|
if (!loader) return { success: false, error: "ProviderLoader not initialized" };
|
|
6490
6388
|
const allExtProviders = loader.getByCategory?.("extension") || [];
|
|
6491
|
-
const config = loadConfig();
|
|
6492
6389
|
if (ideType) {
|
|
6493
6390
|
const extensions = allExtProviders.map((p) => ({
|
|
6494
6391
|
type: p.type,
|
|
6495
6392
|
name: p.name,
|
|
6496
6393
|
extensionId: p.extensionId,
|
|
6497
|
-
enabled:
|
|
6394
|
+
enabled: loader.getIdeExtensionEnabledState?.(ideType, p.type) === true
|
|
6498
6395
|
}));
|
|
6499
6396
|
return { success: true, ideType, extensions };
|
|
6500
6397
|
}
|
|
@@ -6505,7 +6402,7 @@ function handleGetIdeExtensions(h, args) {
|
|
|
6505
6402
|
type: p.type,
|
|
6506
6403
|
name: p.name,
|
|
6507
6404
|
extensionId: p.extensionId,
|
|
6508
|
-
enabled:
|
|
6405
|
+
enabled: loader.getIdeExtensionEnabledState?.(ide, p.type) === true
|
|
6509
6406
|
}));
|
|
6510
6407
|
}
|
|
6511
6408
|
return { success: true, ideExtensions: result };
|
|
@@ -6528,7 +6425,6 @@ function handleSetIdeExtension(h, args) {
|
|
|
6528
6425
|
|
|
6529
6426
|
// src/commands/workspace-commands.ts
|
|
6530
6427
|
init_config();
|
|
6531
|
-
init_workspaces();
|
|
6532
6428
|
function handleWorkspaceList() {
|
|
6533
6429
|
const config = loadConfig();
|
|
6534
6430
|
const state = getWorkspaceState(config);
|
|
@@ -6536,9 +6432,7 @@ function handleWorkspaceList() {
|
|
|
6536
6432
|
success: true,
|
|
6537
6433
|
workspaces: state.workspaces,
|
|
6538
6434
|
defaultWorkspaceId: state.defaultWorkspaceId,
|
|
6539
|
-
defaultWorkspacePath: state.defaultWorkspacePath
|
|
6540
|
-
legacyRecentPaths: config.recentCliWorkspaces || [],
|
|
6541
|
-
activity: getWorkspaceActivity(config, 25)
|
|
6435
|
+
defaultWorkspacePath: state.defaultWorkspacePath
|
|
6542
6436
|
};
|
|
6543
6437
|
}
|
|
6544
6438
|
function handleWorkspaceAdd(args) {
|
|
@@ -6549,10 +6443,9 @@ function handleWorkspaceAdd(args) {
|
|
|
6549
6443
|
const config = loadConfig();
|
|
6550
6444
|
const result = addWorkspaceEntry(config, rawPath, label, { createIfMissing });
|
|
6551
6445
|
if ("error" in result) return { success: false, error: result.error };
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
return { success: true, entry: result.entry, ...state, activity: getWorkspaceActivity(cfg, 25) };
|
|
6446
|
+
saveConfig(result.config);
|
|
6447
|
+
const state = getWorkspaceState(result.config);
|
|
6448
|
+
return { success: true, entry: result.entry, ...state };
|
|
6556
6449
|
}
|
|
6557
6450
|
function handleWorkspaceRemove(args) {
|
|
6558
6451
|
const id = (args?.id || "").trim();
|
|
@@ -6561,13 +6454,9 @@ function handleWorkspaceRemove(args) {
|
|
|
6561
6454
|
const removed = (config.workspaces || []).find((w) => w.id === id);
|
|
6562
6455
|
const result = removeWorkspaceEntry(config, id);
|
|
6563
6456
|
if ("error" in result) return { success: false, error: result.error };
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
}
|
|
6568
|
-
saveConfig(cfg);
|
|
6569
|
-
const state = getWorkspaceState(cfg);
|
|
6570
|
-
return { success: true, removedId: id, ...state, activity: getWorkspaceActivity(cfg, 25) };
|
|
6457
|
+
saveConfig(result.config);
|
|
6458
|
+
const state = getWorkspaceState(result.config);
|
|
6459
|
+
return { success: true, removedId: id, ...state };
|
|
6571
6460
|
}
|
|
6572
6461
|
function handleWorkspaceSetDefault(args) {
|
|
6573
6462
|
const clear = args?.clear === true || args?.id === null || args?.id === "";
|
|
@@ -6579,8 +6468,7 @@ function handleWorkspaceSetDefault(args) {
|
|
|
6579
6468
|
const state2 = getWorkspaceState(result2.config);
|
|
6580
6469
|
return {
|
|
6581
6470
|
success: true,
|
|
6582
|
-
...state2
|
|
6583
|
-
activity: getWorkspaceActivity(result2.config, 25)
|
|
6471
|
+
...state2
|
|
6584
6472
|
};
|
|
6585
6473
|
}
|
|
6586
6474
|
const pathArg = args?.path != null && String(args.path).trim() ? String(args.path).trim() : "";
|
|
@@ -6604,18 +6492,12 @@ function handleWorkspaceSetDefault(args) {
|
|
|
6604
6492
|
}
|
|
6605
6493
|
const result = setDefaultWorkspaceId(config, nextId);
|
|
6606
6494
|
if ("error" in result) return { success: false, error: result.error };
|
|
6607
|
-
|
|
6608
|
-
const
|
|
6609
|
-
|
|
6610
|
-
out = appendWorkspaceActivity(out, ap, { kind: "default" });
|
|
6611
|
-
}
|
|
6612
|
-
saveConfig(out);
|
|
6613
|
-
const state = getWorkspaceState(out);
|
|
6614
|
-
return { success: true, ...state, activity: getWorkspaceActivity(out, 25) };
|
|
6495
|
+
saveConfig(result.config);
|
|
6496
|
+
const state = getWorkspaceState(result.config);
|
|
6497
|
+
return { success: true, ...state };
|
|
6615
6498
|
}
|
|
6616
6499
|
|
|
6617
6500
|
// src/commands/handler.ts
|
|
6618
|
-
init_workspaces();
|
|
6619
6501
|
var COMMAND_DEBUG_LEVELS = /* @__PURE__ */ new Set([
|
|
6620
6502
|
"pty_input",
|
|
6621
6503
|
"pty_resize",
|
|
@@ -6942,22 +6824,7 @@ var DaemonCommandHandler = class {
|
|
|
6942
6824
|
return handleFileList(this, args);
|
|
6943
6825
|
case "file_list_browse":
|
|
6944
6826
|
return handleFileListBrowse(this, args);
|
|
6945
|
-
// ─── VSCode API commands (not available) ────
|
|
6946
|
-
case "vscode_command_exec":
|
|
6947
|
-
case "execute_vscode_command": {
|
|
6948
|
-
const resolvedCmd = args?.commandId || args?.command;
|
|
6949
|
-
if (resolvedCmd === "adhdev.captureCdpScreenshot") {
|
|
6950
|
-
return handleScreenshot(this, args);
|
|
6951
|
-
}
|
|
6952
|
-
return { success: false, error: `VSCode command not available: ${resolvedCmd || cmd}` };
|
|
6953
|
-
}
|
|
6954
6827
|
// ─── Workspace cmds ──────────────
|
|
6955
|
-
case "get_recent_workspaces":
|
|
6956
|
-
return this.handleGetRecentWorkspaces(args);
|
|
6957
|
-
case "get_cli_history": {
|
|
6958
|
-
const config = loadConfig();
|
|
6959
|
-
return { success: true, history: config.cliHistory || [] };
|
|
6960
|
-
}
|
|
6961
6828
|
case "workspace_list":
|
|
6962
6829
|
return handleWorkspaceList();
|
|
6963
6830
|
case "workspace_add":
|
|
@@ -6965,7 +6832,6 @@ var DaemonCommandHandler = class {
|
|
|
6965
6832
|
case "workspace_remove":
|
|
6966
6833
|
return handleWorkspaceRemove(args);
|
|
6967
6834
|
case "workspace_set_default":
|
|
6968
|
-
case "workspace_set_active":
|
|
6969
6835
|
return handleWorkspaceSetDefault(args);
|
|
6970
6836
|
// ─── Script manage ───────────────────
|
|
6971
6837
|
case "refresh_scripts":
|
|
@@ -7011,19 +6877,6 @@ var DaemonCommandHandler = class {
|
|
|
7011
6877
|
}
|
|
7012
6878
|
}
|
|
7013
6879
|
// ─── Misc (kept in handler — too small to extract) ───────
|
|
7014
|
-
async handleGetRecentWorkspaces(_args) {
|
|
7015
|
-
const config = loadConfig();
|
|
7016
|
-
const cliRecent = config.recentCliWorkspaces || [];
|
|
7017
|
-
const ws = getWorkspaceState(config);
|
|
7018
|
-
return {
|
|
7019
|
-
success: true,
|
|
7020
|
-
result: cliRecent,
|
|
7021
|
-
workspaces: ws.workspaces,
|
|
7022
|
-
defaultWorkspaceId: ws.defaultWorkspaceId,
|
|
7023
|
-
defaultWorkspacePath: ws.defaultWorkspacePath,
|
|
7024
|
-
activity: getWorkspaceActivity(config, 25)
|
|
7025
|
-
};
|
|
7026
|
-
}
|
|
7027
6880
|
async handleRefreshScripts(_args) {
|
|
7028
6881
|
if (this._ctx.providerLoader) {
|
|
7029
6882
|
await this._ctx.providerLoader.fetchLatest().catch(() => {
|
|
@@ -7041,7 +6894,7 @@ var DaemonCommandHandler = class {
|
|
|
7041
6894
|
try {
|
|
7042
6895
|
const http3 = await import("http");
|
|
7043
6896
|
const postData = JSON.stringify(body);
|
|
7044
|
-
const result = await new Promise((
|
|
6897
|
+
const result = await new Promise((resolve9, reject) => {
|
|
7045
6898
|
const req = http3.request({
|
|
7046
6899
|
hostname: "127.0.0.1",
|
|
7047
6900
|
port: 19280,
|
|
@@ -7053,9 +6906,9 @@ var DaemonCommandHandler = class {
|
|
|
7053
6906
|
res.on("data", (chunk) => data += chunk);
|
|
7054
6907
|
res.on("end", () => {
|
|
7055
6908
|
try {
|
|
7056
|
-
|
|
6909
|
+
resolve9(JSON.parse(data));
|
|
7057
6910
|
} catch {
|
|
7058
|
-
|
|
6911
|
+
resolve9({ raw: data });
|
|
7059
6912
|
}
|
|
7060
6913
|
});
|
|
7061
6914
|
});
|
|
@@ -7073,15 +6926,15 @@ var DaemonCommandHandler = class {
|
|
|
7073
6926
|
if (!providerType) return { success: false, error: "providerType required" };
|
|
7074
6927
|
try {
|
|
7075
6928
|
const http3 = await import("http");
|
|
7076
|
-
const result = await new Promise((
|
|
6929
|
+
const result = await new Promise((resolve9, reject) => {
|
|
7077
6930
|
http3.get(`http://127.0.0.1:19280/api/providers/${providerType}/${endpoint}`, (res) => {
|
|
7078
6931
|
let data = "";
|
|
7079
6932
|
res.on("data", (chunk) => data += chunk);
|
|
7080
6933
|
res.on("end", () => {
|
|
7081
6934
|
try {
|
|
7082
|
-
|
|
6935
|
+
resolve9(JSON.parse(data));
|
|
7083
6936
|
} catch {
|
|
7084
|
-
|
|
6937
|
+
resolve9({ raw: data });
|
|
7085
6938
|
}
|
|
7086
6939
|
});
|
|
7087
6940
|
}).on("error", reject);
|
|
@@ -7095,7 +6948,7 @@ var DaemonCommandHandler = class {
|
|
|
7095
6948
|
try {
|
|
7096
6949
|
const http3 = await import("http");
|
|
7097
6950
|
const postData = JSON.stringify(args || {});
|
|
7098
|
-
const result = await new Promise((
|
|
6951
|
+
const result = await new Promise((resolve9, reject) => {
|
|
7099
6952
|
const req = http3.request({
|
|
7100
6953
|
hostname: "127.0.0.1",
|
|
7101
6954
|
port: 19280,
|
|
@@ -7107,9 +6960,9 @@ var DaemonCommandHandler = class {
|
|
|
7107
6960
|
res.on("data", (chunk) => data += chunk);
|
|
7108
6961
|
res.on("end", () => {
|
|
7109
6962
|
try {
|
|
7110
|
-
|
|
6963
|
+
resolve9(JSON.parse(data));
|
|
7111
6964
|
} catch {
|
|
7112
|
-
|
|
6965
|
+
resolve9({ raw: data });
|
|
7113
6966
|
}
|
|
7114
6967
|
});
|
|
7115
6968
|
});
|
|
@@ -7128,11 +6981,11 @@ var DaemonCommandHandler = class {
|
|
|
7128
6981
|
var import_child_process4 = require("child_process");
|
|
7129
6982
|
var net = __toESM(require("net"));
|
|
7130
6983
|
var os8 = __toESM(require("os"));
|
|
7131
|
-
var
|
|
6984
|
+
var path7 = __toESM(require("path"));
|
|
7132
6985
|
|
|
7133
6986
|
// src/providers/provider-loader.ts
|
|
7134
6987
|
var fs5 = __toESM(require("fs"));
|
|
7135
|
-
var
|
|
6988
|
+
var path6 = __toESM(require("path"));
|
|
7136
6989
|
var os7 = __toESM(require("os"));
|
|
7137
6990
|
var chokidar = __toESM(require("chokidar"));
|
|
7138
6991
|
init_logger();
|
|
@@ -7153,12 +7006,12 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7153
7006
|
static META_FILE = ".meta.json";
|
|
7154
7007
|
constructor(options) {
|
|
7155
7008
|
this.logFn = options?.logFn || LOG.forComponent("Provider").asLogFn();
|
|
7156
|
-
const defaultProvidersDir =
|
|
7009
|
+
const defaultProvidersDir = path6.join(os7.homedir(), ".adhdev", "providers");
|
|
7157
7010
|
if (options?.userDir) {
|
|
7158
7011
|
this.userDir = options.userDir;
|
|
7159
7012
|
this.log(`Config 'providerDir' applied: ${this.userDir}`);
|
|
7160
7013
|
} else {
|
|
7161
|
-
const localRepoPath =
|
|
7014
|
+
const localRepoPath = path6.resolve(__dirname, "../../../../../adhdev-providers");
|
|
7162
7015
|
if (fs5.existsSync(localRepoPath)) {
|
|
7163
7016
|
this.userDir = localRepoPath;
|
|
7164
7017
|
this.log(`Auto-detected local public repository: ${this.userDir} (Dev workspace speedup)`);
|
|
@@ -7167,7 +7020,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7167
7020
|
this.log(`Using default user providers directory: ${this.userDir}`);
|
|
7168
7021
|
}
|
|
7169
7022
|
}
|
|
7170
|
-
this.upstreamDir =
|
|
7023
|
+
this.upstreamDir = path6.join(defaultProvidersDir, ".upstream");
|
|
7171
7024
|
this.disableUpstream = options?.disableUpstream ?? false;
|
|
7172
7025
|
}
|
|
7173
7026
|
log(msg) {
|
|
@@ -7197,7 +7050,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7197
7050
|
* Canonical provider directory shape for a given root.
|
|
7198
7051
|
*/
|
|
7199
7052
|
getProviderDir(root, category, type) {
|
|
7200
|
-
return
|
|
7053
|
+
return path6.join(root, category, type);
|
|
7201
7054
|
}
|
|
7202
7055
|
/**
|
|
7203
7056
|
* Canonical user override directory for a provider.
|
|
@@ -7224,7 +7077,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7224
7077
|
resolveProviderFile(type, ...segments) {
|
|
7225
7078
|
const dir = this.findProviderDirInternal(type);
|
|
7226
7079
|
if (!dir) return null;
|
|
7227
|
-
return
|
|
7080
|
+
return path6.join(dir, ...segments);
|
|
7228
7081
|
}
|
|
7229
7082
|
/**
|
|
7230
7083
|
* Load all providers (3-tier priority)
|
|
@@ -7262,7 +7115,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7262
7115
|
if (!fs5.existsSync(this.upstreamDir)) return false;
|
|
7263
7116
|
try {
|
|
7264
7117
|
return fs5.readdirSync(this.upstreamDir).some(
|
|
7265
|
-
(d) => fs5.statSync(
|
|
7118
|
+
(d) => fs5.statSync(path6.join(this.upstreamDir, d)).isDirectory()
|
|
7266
7119
|
);
|
|
7267
7120
|
} catch {
|
|
7268
7121
|
return false;
|
|
@@ -7347,16 +7200,23 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7347
7200
|
isEnabled(type, ideType) {
|
|
7348
7201
|
if (!ideType) return true;
|
|
7349
7202
|
try {
|
|
7350
|
-
|
|
7351
|
-
const config = loadConfig2();
|
|
7352
|
-
const baseIdeType = ideType.split("_")[0];
|
|
7353
|
-
const val = config.ideSettings?.[baseIdeType]?.extensions?.[type]?.enabled;
|
|
7354
|
-
return val === true;
|
|
7203
|
+
return this.getIdeExtensionEnabledState(ideType, type);
|
|
7355
7204
|
} catch {
|
|
7356
7205
|
return false;
|
|
7357
7206
|
}
|
|
7358
7207
|
}
|
|
7359
7208
|
/**
|
|
7209
|
+
* Resolve per-IDE extension enabled state using the same normalization
|
|
7210
|
+
* that runtime attach/remove uses.
|
|
7211
|
+
*/
|
|
7212
|
+
getIdeExtensionEnabledState(ideType, extensionType) {
|
|
7213
|
+
const { loadConfig: loadConfig2 } = (init_config(), __toCommonJS(config_exports));
|
|
7214
|
+
const config = loadConfig2();
|
|
7215
|
+
const baseIdeType = ideType.split("_")[0];
|
|
7216
|
+
const val = config.ideSettings?.[baseIdeType]?.extensions?.[extensionType]?.enabled;
|
|
7217
|
+
return val === true;
|
|
7218
|
+
}
|
|
7219
|
+
/**
|
|
7360
7220
|
* Save IDE extension enabled setting
|
|
7361
7221
|
*/
|
|
7362
7222
|
setIdeExtensionEnabled(ideType, extensionType, enabled) {
|
|
@@ -7554,14 +7414,14 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7554
7414
|
this.log(` [loadScriptsFromDir] ${type}: providerDir not found`);
|
|
7555
7415
|
return null;
|
|
7556
7416
|
}
|
|
7557
|
-
const dir =
|
|
7417
|
+
const dir = path6.join(providerDir, scriptDir);
|
|
7558
7418
|
if (!fs5.existsSync(dir)) {
|
|
7559
7419
|
this.log(` [loadScriptsFromDir] ${type}: dir not found: ${dir}`);
|
|
7560
7420
|
return null;
|
|
7561
7421
|
}
|
|
7562
7422
|
const cached = this.scriptsCache.get(dir);
|
|
7563
7423
|
if (cached) return cached;
|
|
7564
|
-
const scriptsJs =
|
|
7424
|
+
const scriptsJs = path6.join(dir, "scripts.js");
|
|
7565
7425
|
if (fs5.existsSync(scriptsJs)) {
|
|
7566
7426
|
try {
|
|
7567
7427
|
delete require.cache[require.resolve(scriptsJs)];
|
|
@@ -7600,7 +7460,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7600
7460
|
});
|
|
7601
7461
|
const handleChange = (filePath) => {
|
|
7602
7462
|
if (filePath.endsWith(".js") || filePath.endsWith(".json")) {
|
|
7603
|
-
this.log(`File changed: ${
|
|
7463
|
+
this.log(`File changed: ${path6.basename(filePath)}, reloading...`);
|
|
7604
7464
|
this.reload();
|
|
7605
7465
|
}
|
|
7606
7466
|
};
|
|
@@ -7655,7 +7515,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7655
7515
|
}
|
|
7656
7516
|
const https = require("https");
|
|
7657
7517
|
const { execSync: execSync7 } = require("child_process");
|
|
7658
|
-
const metaPath =
|
|
7518
|
+
const metaPath = path6.join(this.upstreamDir, _ProviderLoader.META_FILE);
|
|
7659
7519
|
let prevEtag = "";
|
|
7660
7520
|
let prevTimestamp = 0;
|
|
7661
7521
|
try {
|
|
@@ -7672,7 +7532,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7672
7532
|
return { updated: false };
|
|
7673
7533
|
}
|
|
7674
7534
|
try {
|
|
7675
|
-
const etag = await new Promise((
|
|
7535
|
+
const etag = await new Promise((resolve9, reject) => {
|
|
7676
7536
|
const options = {
|
|
7677
7537
|
method: "HEAD",
|
|
7678
7538
|
hostname: "github.com",
|
|
@@ -7690,7 +7550,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7690
7550
|
headers: { "User-Agent": "adhdev-launcher" },
|
|
7691
7551
|
timeout: 1e4
|
|
7692
7552
|
}, (res2) => {
|
|
7693
|
-
|
|
7553
|
+
resolve9(res2.headers.etag || res2.headers["last-modified"] || "");
|
|
7694
7554
|
});
|
|
7695
7555
|
req2.on("error", reject);
|
|
7696
7556
|
req2.on("timeout", () => {
|
|
@@ -7699,7 +7559,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7699
7559
|
});
|
|
7700
7560
|
req2.end();
|
|
7701
7561
|
} else {
|
|
7702
|
-
|
|
7562
|
+
resolve9(res.headers.etag || res.headers["last-modified"] || "");
|
|
7703
7563
|
}
|
|
7704
7564
|
});
|
|
7705
7565
|
req.on("error", reject);
|
|
@@ -7715,17 +7575,17 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7715
7575
|
return { updated: false };
|
|
7716
7576
|
}
|
|
7717
7577
|
this.log("Downloading latest providers from GitHub...");
|
|
7718
|
-
const tmpTar =
|
|
7719
|
-
const tmpExtract =
|
|
7578
|
+
const tmpTar = path6.join(os7.tmpdir(), `adhdev-providers-${Date.now()}.tar.gz`);
|
|
7579
|
+
const tmpExtract = path6.join(os7.tmpdir(), `adhdev-providers-extract-${Date.now()}`);
|
|
7720
7580
|
await this.downloadFile(_ProviderLoader.GITHUB_TARBALL_URL, tmpTar);
|
|
7721
7581
|
fs5.mkdirSync(tmpExtract, { recursive: true });
|
|
7722
7582
|
execSync7(`tar -xzf "${tmpTar}" -C "${tmpExtract}"`, { timeout: 3e4 });
|
|
7723
7583
|
const extracted = fs5.readdirSync(tmpExtract);
|
|
7724
7584
|
const rootDir = extracted.find(
|
|
7725
|
-
(d) => fs5.statSync(
|
|
7585
|
+
(d) => fs5.statSync(path6.join(tmpExtract, d)).isDirectory() && d.startsWith("adhdev-providers")
|
|
7726
7586
|
);
|
|
7727
7587
|
if (!rootDir) throw new Error("Unexpected tarball structure");
|
|
7728
|
-
const sourceDir =
|
|
7588
|
+
const sourceDir = path6.join(tmpExtract, rootDir);
|
|
7729
7589
|
const backupDir = this.upstreamDir + ".bak";
|
|
7730
7590
|
if (fs5.existsSync(this.upstreamDir)) {
|
|
7731
7591
|
if (fs5.existsSync(backupDir)) fs5.rmSync(backupDir, { recursive: true, force: true });
|
|
@@ -7763,7 +7623,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7763
7623
|
downloadFile(url, destPath) {
|
|
7764
7624
|
const https = require("https");
|
|
7765
7625
|
const http3 = require("http");
|
|
7766
|
-
return new Promise((
|
|
7626
|
+
return new Promise((resolve9, reject) => {
|
|
7767
7627
|
const doRequest = (reqUrl, redirectCount = 0) => {
|
|
7768
7628
|
if (redirectCount > 5) {
|
|
7769
7629
|
reject(new Error("Too many redirects"));
|
|
@@ -7783,7 +7643,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7783
7643
|
res.pipe(ws);
|
|
7784
7644
|
ws.on("finish", () => {
|
|
7785
7645
|
ws.close();
|
|
7786
|
-
|
|
7646
|
+
resolve9();
|
|
7787
7647
|
});
|
|
7788
7648
|
ws.on("error", reject);
|
|
7789
7649
|
});
|
|
@@ -7800,8 +7660,8 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7800
7660
|
copyDirRecursive(src, dest) {
|
|
7801
7661
|
fs5.mkdirSync(dest, { recursive: true });
|
|
7802
7662
|
for (const entry of fs5.readdirSync(src, { withFileTypes: true })) {
|
|
7803
|
-
const srcPath =
|
|
7804
|
-
const destPath =
|
|
7663
|
+
const srcPath = path6.join(src, entry.name);
|
|
7664
|
+
const destPath = path6.join(dest, entry.name);
|
|
7805
7665
|
if (entry.isDirectory()) {
|
|
7806
7666
|
this.copyDirRecursive(srcPath, destPath);
|
|
7807
7667
|
} else {
|
|
@@ -7812,7 +7672,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7812
7672
|
/** .meta.json save */
|
|
7813
7673
|
writeMeta(metaPath, etag, timestamp) {
|
|
7814
7674
|
try {
|
|
7815
|
-
fs5.mkdirSync(
|
|
7675
|
+
fs5.mkdirSync(path6.dirname(metaPath), { recursive: true });
|
|
7816
7676
|
fs5.writeFileSync(metaPath, JSON.stringify({
|
|
7817
7677
|
etag,
|
|
7818
7678
|
timestamp,
|
|
@@ -7829,7 +7689,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7829
7689
|
const scan = (d) => {
|
|
7830
7690
|
try {
|
|
7831
7691
|
for (const entry of fs5.readdirSync(d, { withFileTypes: true })) {
|
|
7832
|
-
if (entry.isDirectory()) scan(
|
|
7692
|
+
if (entry.isDirectory()) scan(path6.join(d, entry.name));
|
|
7833
7693
|
else if (entry.name === "provider.json") count++;
|
|
7834
7694
|
}
|
|
7835
7695
|
} catch {
|
|
@@ -7928,17 +7788,17 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7928
7788
|
for (const root of searchRoots) {
|
|
7929
7789
|
if (!fs5.existsSync(root)) continue;
|
|
7930
7790
|
const candidate = this.getProviderDir(root, cat, type);
|
|
7931
|
-
if (fs5.existsSync(
|
|
7932
|
-
const catDir =
|
|
7791
|
+
if (fs5.existsSync(path6.join(candidate, "provider.json"))) return candidate;
|
|
7792
|
+
const catDir = path6.join(root, cat);
|
|
7933
7793
|
if (fs5.existsSync(catDir)) {
|
|
7934
7794
|
try {
|
|
7935
7795
|
for (const entry of fs5.readdirSync(catDir, { withFileTypes: true })) {
|
|
7936
7796
|
if (!entry.isDirectory()) continue;
|
|
7937
|
-
const jsonPath =
|
|
7797
|
+
const jsonPath = path6.join(catDir, entry.name, "provider.json");
|
|
7938
7798
|
if (fs5.existsSync(jsonPath)) {
|
|
7939
7799
|
try {
|
|
7940
7800
|
const data = JSON.parse(fs5.readFileSync(jsonPath, "utf-8"));
|
|
7941
|
-
if (data.type === type) return
|
|
7801
|
+
if (data.type === type) return path6.join(catDir, entry.name);
|
|
7942
7802
|
} catch {
|
|
7943
7803
|
}
|
|
7944
7804
|
}
|
|
@@ -7955,7 +7815,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7955
7815
|
* (template substitution is NOT applied here — scripts.js handles that)
|
|
7956
7816
|
*/
|
|
7957
7817
|
buildScriptWrappersFromDir(dir) {
|
|
7958
|
-
const scriptsJs =
|
|
7818
|
+
const scriptsJs = path6.join(dir, "scripts.js");
|
|
7959
7819
|
if (fs5.existsSync(scriptsJs)) {
|
|
7960
7820
|
try {
|
|
7961
7821
|
delete require.cache[require.resolve(scriptsJs)];
|
|
@@ -7969,7 +7829,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
7969
7829
|
for (const file of fs5.readdirSync(dir)) {
|
|
7970
7830
|
if (!file.endsWith(".js")) continue;
|
|
7971
7831
|
const scriptName = toCamel(file.replace(".js", ""));
|
|
7972
|
-
const filePath =
|
|
7832
|
+
const filePath = path6.join(dir, file);
|
|
7973
7833
|
result[scriptName] = (...args) => {
|
|
7974
7834
|
try {
|
|
7975
7835
|
let content = fs5.readFileSync(filePath, "utf-8");
|
|
@@ -8029,7 +7889,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
8029
7889
|
}
|
|
8030
7890
|
const hasJson = entries.some((e) => e.name === "provider.json");
|
|
8031
7891
|
if (hasJson) {
|
|
8032
|
-
const jsonPath =
|
|
7892
|
+
const jsonPath = path6.join(d, "provider.json");
|
|
8033
7893
|
try {
|
|
8034
7894
|
const raw = fs5.readFileSync(jsonPath, "utf-8");
|
|
8035
7895
|
const mod = JSON.parse(raw);
|
|
@@ -8042,7 +7902,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
8042
7902
|
delete mod.extensionIdPattern_flags;
|
|
8043
7903
|
}
|
|
8044
7904
|
const hasCompatibility = Array.isArray(mod.compatibility);
|
|
8045
|
-
const scriptsPath =
|
|
7905
|
+
const scriptsPath = path6.join(d, "scripts.js");
|
|
8046
7906
|
if (!hasCompatibility && fs5.existsSync(scriptsPath)) {
|
|
8047
7907
|
try {
|
|
8048
7908
|
delete require.cache[require.resolve(scriptsPath)];
|
|
@@ -8068,7 +7928,7 @@ var ProviderLoader = class _ProviderLoader {
|
|
|
8068
7928
|
if (!entry.isDirectory()) continue;
|
|
8069
7929
|
if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
|
|
8070
7930
|
if (excludeDirs && d === dir && excludeDirs.includes(entry.name)) continue;
|
|
8071
|
-
scan(
|
|
7931
|
+
scan(path6.join(d, entry.name));
|
|
8072
7932
|
}
|
|
8073
7933
|
}
|
|
8074
7934
|
};
|
|
@@ -8148,17 +8008,17 @@ async function findFreePort(ports) {
|
|
|
8148
8008
|
throw new Error("No free port found");
|
|
8149
8009
|
}
|
|
8150
8010
|
function checkPortFree(port) {
|
|
8151
|
-
return new Promise((
|
|
8011
|
+
return new Promise((resolve9) => {
|
|
8152
8012
|
const server = net.createServer();
|
|
8153
8013
|
server.unref();
|
|
8154
|
-
server.on("error", () =>
|
|
8014
|
+
server.on("error", () => resolve9(false));
|
|
8155
8015
|
server.listen(port, "127.0.0.1", () => {
|
|
8156
|
-
server.close(() =>
|
|
8016
|
+
server.close(() => resolve9(true));
|
|
8157
8017
|
});
|
|
8158
8018
|
});
|
|
8159
8019
|
}
|
|
8160
8020
|
async function isCdpActive(port) {
|
|
8161
|
-
return new Promise((
|
|
8021
|
+
return new Promise((resolve9) => {
|
|
8162
8022
|
const req = require("http").get(`http://127.0.0.1:${port}/json/version`, {
|
|
8163
8023
|
timeout: 2e3
|
|
8164
8024
|
}, (res) => {
|
|
@@ -8167,16 +8027,16 @@ async function isCdpActive(port) {
|
|
|
8167
8027
|
res.on("end", () => {
|
|
8168
8028
|
try {
|
|
8169
8029
|
const info = JSON.parse(data);
|
|
8170
|
-
|
|
8030
|
+
resolve9(!!info["WebKit-Version"] || !!info["Browser"]);
|
|
8171
8031
|
} catch {
|
|
8172
|
-
|
|
8032
|
+
resolve9(false);
|
|
8173
8033
|
}
|
|
8174
8034
|
});
|
|
8175
8035
|
});
|
|
8176
|
-
req.on("error", () =>
|
|
8036
|
+
req.on("error", () => resolve9(false));
|
|
8177
8037
|
req.on("timeout", () => {
|
|
8178
8038
|
req.destroy();
|
|
8179
|
-
|
|
8039
|
+
resolve9(false);
|
|
8180
8040
|
});
|
|
8181
8041
|
});
|
|
8182
8042
|
}
|
|
@@ -8295,8 +8155,8 @@ function detectCurrentWorkspace(ideId) {
|
|
|
8295
8155
|
const appNameMap = getMacAppIdentifiers();
|
|
8296
8156
|
const appName = appNameMap[ideId];
|
|
8297
8157
|
if (appName) {
|
|
8298
|
-
const storagePath =
|
|
8299
|
-
process.env.APPDATA ||
|
|
8158
|
+
const storagePath = path7.join(
|
|
8159
|
+
process.env.APPDATA || path7.join(os8.homedir(), "AppData", "Roaming"),
|
|
8300
8160
|
appName,
|
|
8301
8161
|
"storage.json"
|
|
8302
8162
|
);
|
|
@@ -8465,15 +8325,13 @@ function getAvailableIdeIds() {
|
|
|
8465
8325
|
|
|
8466
8326
|
// src/commands/router.ts
|
|
8467
8327
|
init_config();
|
|
8468
|
-
init_workspaces();
|
|
8469
|
-
init_config();
|
|
8470
8328
|
init_logger();
|
|
8471
8329
|
|
|
8472
8330
|
// src/logging/command-log.ts
|
|
8473
8331
|
var fs6 = __toESM(require("fs"));
|
|
8474
|
-
var
|
|
8332
|
+
var path8 = __toESM(require("path"));
|
|
8475
8333
|
var os9 = __toESM(require("os"));
|
|
8476
|
-
var LOG_DIR2 = process.platform === "win32" ?
|
|
8334
|
+
var LOG_DIR2 = process.platform === "win32" ? path8.join(process.env.LOCALAPPDATA || process.env.APPDATA || path8.join(os9.homedir(), "AppData", "Local"), "adhdev", "logs") : process.platform === "darwin" ? path8.join(os9.homedir(), "Library", "Logs", "adhdev") : path8.join(os9.homedir(), ".local", "share", "adhdev", "logs");
|
|
8477
8335
|
var MAX_FILE_SIZE = 5 * 1024 * 1024;
|
|
8478
8336
|
var MAX_DAYS = 7;
|
|
8479
8337
|
try {
|
|
@@ -8511,13 +8369,13 @@ function getDateStr2() {
|
|
|
8511
8369
|
return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
8512
8370
|
}
|
|
8513
8371
|
var currentDate2 = getDateStr2();
|
|
8514
|
-
var currentFile =
|
|
8372
|
+
var currentFile = path8.join(LOG_DIR2, `commands-${currentDate2}.jsonl`);
|
|
8515
8373
|
var writeCount2 = 0;
|
|
8516
8374
|
function checkRotation() {
|
|
8517
8375
|
const today = getDateStr2();
|
|
8518
8376
|
if (today !== currentDate2) {
|
|
8519
8377
|
currentDate2 = today;
|
|
8520
|
-
currentFile =
|
|
8378
|
+
currentFile = path8.join(LOG_DIR2, `commands-${currentDate2}.jsonl`);
|
|
8521
8379
|
cleanOldFiles();
|
|
8522
8380
|
}
|
|
8523
8381
|
}
|
|
@@ -8531,7 +8389,7 @@ function cleanOldFiles() {
|
|
|
8531
8389
|
const dateMatch = file.match(/commands-(\d{4}-\d{2}-\d{2})/);
|
|
8532
8390
|
if (dateMatch && dateMatch[1] < cutoffStr) {
|
|
8533
8391
|
try {
|
|
8534
|
-
fs6.unlinkSync(
|
|
8392
|
+
fs6.unlinkSync(path8.join(LOG_DIR2, file));
|
|
8535
8393
|
} catch {
|
|
8536
8394
|
}
|
|
8537
8395
|
}
|
|
@@ -8732,18 +8590,6 @@ var DaemonCommandRouter = class {
|
|
|
8732
8590
|
};
|
|
8733
8591
|
LOG.info("LaunchIDE", `target=${ideKey || "auto"}`);
|
|
8734
8592
|
const result = await launchWithCdp(launchArgs);
|
|
8735
|
-
if (result.success && (result.ideId || ideKey)) {
|
|
8736
|
-
try {
|
|
8737
|
-
addCliHistory({
|
|
8738
|
-
category: "ide",
|
|
8739
|
-
cliType: result.ideId || ideKey,
|
|
8740
|
-
dir: resolvedWorkspace || "",
|
|
8741
|
-
workspace: resolvedWorkspace || "",
|
|
8742
|
-
newWindow: args?.newWindow === true
|
|
8743
|
-
});
|
|
8744
|
-
} catch {
|
|
8745
|
-
}
|
|
8746
|
-
}
|
|
8747
8593
|
if (result.success && result.port && result.ideId && !this.deps.cdpManagers.has(result.ideId)) {
|
|
8748
8594
|
const logFn = this.deps.getCdpLogFn ? this.deps.getCdpLogFn(result.ideId) : LOG.forComponent(`CDP:${result.ideId}`).asLogFn();
|
|
8749
8595
|
const provider = this.deps.providerLoader.getMeta(result.ideId);
|
|
@@ -8760,11 +8606,7 @@ var DaemonCommandRouter = class {
|
|
|
8760
8606
|
this.deps.onIdeConnected?.();
|
|
8761
8607
|
if (result.success && resolvedWorkspace) {
|
|
8762
8608
|
try {
|
|
8763
|
-
|
|
8764
|
-
kind: "ide",
|
|
8765
|
-
agentType: result.ideId
|
|
8766
|
-
});
|
|
8767
|
-
next = appendRecentActivity(next, {
|
|
8609
|
+
const next = appendRecentActivity(loadConfig(), {
|
|
8768
8610
|
kind: "ide",
|
|
8769
8611
|
providerType: result.ideId || ideKey,
|
|
8770
8612
|
providerName: result.ideId || ideKey,
|
|
@@ -8842,9 +8684,9 @@ var DaemonCommandRouter = class {
|
|
|
8842
8684
|
setTimeout(() => {
|
|
8843
8685
|
LOG.info("Upgrade", "Restarting daemon with new version...");
|
|
8844
8686
|
try {
|
|
8845
|
-
const
|
|
8687
|
+
const path15 = require("path");
|
|
8846
8688
|
const fs12 = require("fs");
|
|
8847
|
-
const pidFile =
|
|
8689
|
+
const pidFile = path15.join(process.env.HOME || process.env.USERPROFILE || "", ".adhdev", "daemon.pid");
|
|
8848
8690
|
if (fs12.existsSync(pidFile)) fs12.unlinkSync(pidFile);
|
|
8849
8691
|
} catch {
|
|
8850
8692
|
}
|
|
@@ -8942,7 +8784,6 @@ init_logger();
|
|
|
8942
8784
|
// src/status/snapshot.ts
|
|
8943
8785
|
var os10 = __toESM(require("os"));
|
|
8944
8786
|
init_config();
|
|
8945
|
-
init_workspaces();
|
|
8946
8787
|
init_terminal_screen();
|
|
8947
8788
|
function buildDetectedIdeInfos(detectedIdes, cdpManagers) {
|
|
8948
8789
|
return detectedIdes.filter((ide) => ide.installed !== false).map((ide) => ({
|
|
@@ -8996,7 +8837,9 @@ function getUnreadState(hasContentChange, status, lastUsedAt, lastSeenAt, lastRo
|
|
|
8996
8837
|
return { unread, inboxBucket: unread ? "task_complete" : "idle" };
|
|
8997
8838
|
}
|
|
8998
8839
|
function buildRecentSessions(sessions, recentActivity, readState) {
|
|
8999
|
-
const
|
|
8840
|
+
const visibleKeys = /* @__PURE__ */ new Set();
|
|
8841
|
+
const hiddenKeys = /* @__PURE__ */ new Set();
|
|
8842
|
+
const live = sessions.filter((session) => !session.surfaceHidden && session.status !== "stopped").map((session) => {
|
|
9000
8843
|
const kind = getSessionKind(session);
|
|
9001
8844
|
const recentKey = buildRecentActivityKey({
|
|
9002
8845
|
kind,
|
|
@@ -9026,11 +8869,21 @@ function buildRecentSessions(sessions, recentActivity, readState) {
|
|
|
9026
8869
|
lastUsedAt,
|
|
9027
8870
|
unread,
|
|
9028
8871
|
lastSeenAt,
|
|
9029
|
-
inboxBucket
|
|
8872
|
+
inboxBucket,
|
|
8873
|
+
surfaceHidden: false
|
|
9030
8874
|
};
|
|
9031
8875
|
});
|
|
9032
|
-
const
|
|
9033
|
-
|
|
8876
|
+
for (const item of live) {
|
|
8877
|
+
visibleKeys.add(`${item.kind}:${item.providerType}:${item.workspace || ""}`);
|
|
8878
|
+
}
|
|
8879
|
+
for (const session of sessions) {
|
|
8880
|
+
if (!session.surfaceHidden) continue;
|
|
8881
|
+
hiddenKeys.add(`${getSessionKind(session)}:${session.providerType}:${session.workspace || ""}`);
|
|
8882
|
+
}
|
|
8883
|
+
const persisted = recentActivity.filter((item) => {
|
|
8884
|
+
const key = `${item.kind}:${item.providerType}:${item.workspace || ""}`;
|
|
8885
|
+
return !visibleKeys.has(key) && !hiddenKeys.has(key);
|
|
8886
|
+
}).map((item) => {
|
|
9034
8887
|
const lastSeenAt = readState[item.id] || 0;
|
|
9035
8888
|
const unread = item.lastUsedAt > lastSeenAt;
|
|
9036
8889
|
return {
|
|
@@ -9046,7 +8899,8 @@ function buildRecentSessions(sessions, recentActivity, readState) {
|
|
|
9046
8899
|
lastUsedAt: item.lastUsedAt,
|
|
9047
8900
|
unread,
|
|
9048
8901
|
lastSeenAt,
|
|
9049
|
-
inboxBucket: unread ? "task_complete" : "idle"
|
|
8902
|
+
inboxBucket: unread ? "task_complete" : "idle",
|
|
8903
|
+
surfaceHidden: false
|
|
9050
8904
|
};
|
|
9051
8905
|
});
|
|
9052
8906
|
return [...live, ...persisted].sort((a, b) => b.lastUsedAt - a.lastUsedAt).slice(0, 12);
|
|
@@ -9070,7 +8924,7 @@ function buildStatusSnapshot(options) {
|
|
|
9070
8924
|
});
|
|
9071
8925
|
const lastSeenAt = getRecentSessionSeenAt(cfg, recentKey);
|
|
9072
8926
|
const lastUsedAt = getSessionLastUsedAt(session);
|
|
9073
|
-
const { unread, inboxBucket } = getUnreadState(
|
|
8927
|
+
const { unread, inboxBucket } = session.surfaceHidden ? { unread: false, inboxBucket: "idle" } : getUnreadState(
|
|
9074
8928
|
getSessionMessageUpdatedAt(session) > 0,
|
|
9075
8929
|
session.status,
|
|
9076
8930
|
lastUsedAt,
|
|
@@ -9107,7 +8961,6 @@ function buildStatusSnapshot(options) {
|
|
|
9107
8961
|
workspaces: wsState.workspaces,
|
|
9108
8962
|
defaultWorkspaceId: wsState.defaultWorkspaceId,
|
|
9109
8963
|
defaultWorkspacePath: wsState.defaultWorkspacePath,
|
|
9110
|
-
workspaceActivity: getWorkspaceActivity(cfg, 15),
|
|
9111
8964
|
recentSessions: buildRecentSessions(sessions, recentActivity, readState),
|
|
9112
8965
|
terminalBackend,
|
|
9113
8966
|
availableProviders: buildAvailableProviders(options.providerLoader)
|
|
@@ -9266,6 +9119,7 @@ var DaemonStatusReporter = class {
|
|
|
9266
9119
|
unread: session.unread,
|
|
9267
9120
|
lastSeenAt: session.lastSeenAt,
|
|
9268
9121
|
inboxBucket: session.inboxBucket,
|
|
9122
|
+
surfaceHidden: session.surfaceHidden,
|
|
9269
9123
|
controlValues: session.controlValues,
|
|
9270
9124
|
providerControls: session.providerControls,
|
|
9271
9125
|
acpConfigOptions: session.acpConfigOptions,
|
|
@@ -9307,12 +9161,11 @@ init_logger();
|
|
|
9307
9161
|
|
|
9308
9162
|
// src/commands/cli-manager.ts
|
|
9309
9163
|
var os13 = __toESM(require("os"));
|
|
9310
|
-
var
|
|
9164
|
+
var path10 = __toESM(require("path"));
|
|
9311
9165
|
var crypto4 = __toESM(require("crypto"));
|
|
9312
9166
|
var import_chalk = __toESM(require("chalk"));
|
|
9313
9167
|
init_provider_cli_adapter();
|
|
9314
9168
|
init_config();
|
|
9315
|
-
init_workspaces();
|
|
9316
9169
|
|
|
9317
9170
|
// src/providers/cli-provider-instance.ts
|
|
9318
9171
|
var crypto3 = __toESM(require("crypto"));
|
|
@@ -9988,13 +9841,13 @@ var AcpProviderInstance = class {
|
|
|
9988
9841
|
}
|
|
9989
9842
|
this.currentStatus = "waiting_approval";
|
|
9990
9843
|
this.detectStatusTransition();
|
|
9991
|
-
const approved = await new Promise((
|
|
9992
|
-
this.permissionResolvers.push(
|
|
9844
|
+
const approved = await new Promise((resolve9) => {
|
|
9845
|
+
this.permissionResolvers.push(resolve9);
|
|
9993
9846
|
setTimeout(() => {
|
|
9994
|
-
const idx = this.permissionResolvers.indexOf(
|
|
9847
|
+
const idx = this.permissionResolvers.indexOf(resolve9);
|
|
9995
9848
|
if (idx >= 0) {
|
|
9996
9849
|
this.permissionResolvers.splice(idx, 1);
|
|
9997
|
-
|
|
9850
|
+
resolve9(false);
|
|
9998
9851
|
}
|
|
9999
9852
|
}, 3e5);
|
|
10000
9853
|
});
|
|
@@ -10469,24 +10322,6 @@ var DaemonCliManager = class {
|
|
|
10469
10322
|
const hash = require("crypto").createHash("md5").update(require("path").resolve(dir)).digest("hex").slice(0, 8);
|
|
10470
10323
|
return `${cliType}_${hash}`;
|
|
10471
10324
|
}
|
|
10472
|
-
persistRecentDir(cliType, dir) {
|
|
10473
|
-
try {
|
|
10474
|
-
const normalizedType = this.providerLoader.resolveAlias(cliType);
|
|
10475
|
-
const provider = this.providerLoader.getByAlias(cliType);
|
|
10476
|
-
const actKind = provider?.category === "acp" ? "acp" : "cli";
|
|
10477
|
-
let next = loadConfig();
|
|
10478
|
-
console.log(colorize("cyan", ` \u{1F4C2} Saving recent workspace: ${dir}`));
|
|
10479
|
-
const recent = next.recentCliWorkspaces || [];
|
|
10480
|
-
if (!recent.includes(dir)) {
|
|
10481
|
-
next = { ...next, recentCliWorkspaces: [dir, ...recent].slice(0, 10) };
|
|
10482
|
-
}
|
|
10483
|
-
next = appendWorkspaceActivity(next, dir, { kind: actKind, agentType: normalizedType });
|
|
10484
|
-
saveConfig(next);
|
|
10485
|
-
console.log(colorize("green", ` \u2713 Recent workspace saved: ${dir}`));
|
|
10486
|
-
} catch (e) {
|
|
10487
|
-
console.error(colorize("red", ` \u2717 Failed to save recent workspace: ${e}`));
|
|
10488
|
-
}
|
|
10489
|
-
}
|
|
10490
10325
|
persistRecentActivity(entry) {
|
|
10491
10326
|
try {
|
|
10492
10327
|
saveConfig(appendRecentActivity(loadConfig(), entry));
|
|
@@ -10576,7 +10411,7 @@ var DaemonCliManager = class {
|
|
|
10576
10411
|
async startSession(cliType, workingDir, cliArgs, initialModel) {
|
|
10577
10412
|
const trimmed = (workingDir || "").trim();
|
|
10578
10413
|
if (!trimmed) throw new Error("working directory required");
|
|
10579
|
-
const resolvedDir = trimmed.startsWith("~") ? trimmed.replace(/^~/, os13.homedir()) :
|
|
10414
|
+
const resolvedDir = trimmed.startsWith("~") ? trimmed.replace(/^~/, os13.homedir()) : path10.resolve(trimmed);
|
|
10580
10415
|
const normalizedType = this.providerLoader.resolveAlias(cliType);
|
|
10581
10416
|
const provider = this.providerLoader.getByAlias(cliType);
|
|
10582
10417
|
const key = crypto4.randomUUID();
|
|
@@ -10647,11 +10482,6 @@ ${installInfo}`
|
|
|
10647
10482
|
LOG.warn("CLI", `[ACP] Initial model set failed: ${e?.message}`);
|
|
10648
10483
|
}
|
|
10649
10484
|
}
|
|
10650
|
-
try {
|
|
10651
|
-
addCliHistory({ category: "acp", cliType: normalizedType, dir: resolvedDir, workspace: resolvedDir, cliArgs, model: initialModel });
|
|
10652
|
-
} catch (e) {
|
|
10653
|
-
LOG.warn("CLI", `ACP history save failed: ${e?.message}`);
|
|
10654
|
-
}
|
|
10655
10485
|
this.persistRecentActivity({
|
|
10656
10486
|
kind: "acp",
|
|
10657
10487
|
providerType: normalizedType,
|
|
@@ -10718,11 +10548,6 @@ ${installInfo}`
|
|
|
10718
10548
|
this.adapters.set(key, adapter);
|
|
10719
10549
|
console.log(colorize("green", ` \u2713 CLI started: ${cliInfo.displayName} v${cliInfo.version || "unknown"} in ${resolvedDir}`));
|
|
10720
10550
|
}
|
|
10721
|
-
try {
|
|
10722
|
-
addCliHistory({ category: "cli", cliType, dir: resolvedDir, workspace: resolvedDir, cliArgs, model: initialModel });
|
|
10723
|
-
} catch (e) {
|
|
10724
|
-
LOG.warn("CLI", `CLI history save failed: ${e?.message}`);
|
|
10725
|
-
}
|
|
10726
10551
|
this.persistRecentActivity({
|
|
10727
10552
|
kind: "cli",
|
|
10728
10553
|
providerType: normalizedType,
|
|
@@ -10875,7 +10700,6 @@ ${installInfo}`
|
|
|
10875
10700
|
newKey = k;
|
|
10876
10701
|
}
|
|
10877
10702
|
}
|
|
10878
|
-
this.persistRecentDir(cliType, dir);
|
|
10879
10703
|
return { success: true, cliType, dir, id: newKey, launchSource };
|
|
10880
10704
|
}
|
|
10881
10705
|
case "stop_cli": {
|
|
@@ -10918,7 +10742,6 @@ ${installInfo}`
|
|
|
10918
10742
|
const found = this.findAdapter(cliType, { instanceKey: args?.targetSessionId, dir });
|
|
10919
10743
|
if (found) await this.stopSession(found.key);
|
|
10920
10744
|
await this.startSession(cliType, dir);
|
|
10921
|
-
this.persistRecentDir(cliType, dir);
|
|
10922
10745
|
return { success: true, restarted: true };
|
|
10923
10746
|
}
|
|
10924
10747
|
case "agent_command": {
|
|
@@ -11741,11 +11564,11 @@ var ProviderInstanceManager = class {
|
|
|
11741
11564
|
|
|
11742
11565
|
// src/providers/version-archive.ts
|
|
11743
11566
|
var fs8 = __toESM(require("fs"));
|
|
11744
|
-
var
|
|
11567
|
+
var path11 = __toESM(require("path"));
|
|
11745
11568
|
var os14 = __toESM(require("os"));
|
|
11746
11569
|
var import_child_process7 = require("child_process");
|
|
11747
11570
|
var import_os3 = require("os");
|
|
11748
|
-
var ARCHIVE_PATH =
|
|
11571
|
+
var ARCHIVE_PATH = path11.join(os14.homedir(), ".adhdev", "version-history.json");
|
|
11749
11572
|
var MAX_ENTRIES_PER_PROVIDER = 20;
|
|
11750
11573
|
var VersionArchive = class {
|
|
11751
11574
|
history = {};
|
|
@@ -11792,7 +11615,7 @@ var VersionArchive = class {
|
|
|
11792
11615
|
}
|
|
11793
11616
|
save() {
|
|
11794
11617
|
try {
|
|
11795
|
-
fs8.mkdirSync(
|
|
11618
|
+
fs8.mkdirSync(path11.dirname(ARCHIVE_PATH), { recursive: true });
|
|
11796
11619
|
fs8.writeFileSync(ARCHIVE_PATH, JSON.stringify(this.history, null, 2));
|
|
11797
11620
|
} catch {
|
|
11798
11621
|
}
|
|
@@ -11833,7 +11656,7 @@ function checkPathExists2(paths) {
|
|
|
11833
11656
|
for (const p of paths) {
|
|
11834
11657
|
if (p.includes("*")) {
|
|
11835
11658
|
const home = os14.homedir();
|
|
11836
|
-
const resolved = p.replace(/\*/g, home.split(
|
|
11659
|
+
const resolved = p.replace(/\*/g, home.split(path11.sep).pop() || "");
|
|
11837
11660
|
if (fs8.existsSync(resolved)) return resolved;
|
|
11838
11661
|
} else {
|
|
11839
11662
|
if (fs8.existsSync(p)) return p;
|
|
@@ -11843,7 +11666,7 @@ function checkPathExists2(paths) {
|
|
|
11843
11666
|
}
|
|
11844
11667
|
function getMacAppVersion(appPath) {
|
|
11845
11668
|
if ((0, import_os3.platform)() !== "darwin" || !appPath.endsWith(".app")) return null;
|
|
11846
|
-
const plistPath =
|
|
11669
|
+
const plistPath = path11.join(appPath, "Contents", "Info.plist");
|
|
11847
11670
|
if (!fs8.existsSync(plistPath)) return null;
|
|
11848
11671
|
const raw = runCommand(`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${plistPath}"`);
|
|
11849
11672
|
return raw || null;
|
|
@@ -11870,7 +11693,7 @@ async function detectAllVersions(loader, archive) {
|
|
|
11870
11693
|
const cliBin = provider.cli ? findBinary2(provider.cli) : null;
|
|
11871
11694
|
let resolvedBin = cliBin;
|
|
11872
11695
|
if (!resolvedBin && appPath && currentOs === "darwin") {
|
|
11873
|
-
const bundled =
|
|
11696
|
+
const bundled = path11.join(appPath, "Contents", "Resources", "app", "bin", provider.cli || "");
|
|
11874
11697
|
if (provider.cli && fs8.existsSync(bundled)) resolvedBin = bundled;
|
|
11875
11698
|
}
|
|
11876
11699
|
info.installed = !!(appPath || resolvedBin);
|
|
@@ -11911,7 +11734,7 @@ async function detectAllVersions(loader, archive) {
|
|
|
11911
11734
|
// src/daemon/dev-server.ts
|
|
11912
11735
|
var http2 = __toESM(require("http"));
|
|
11913
11736
|
var fs11 = __toESM(require("fs"));
|
|
11914
|
-
var
|
|
11737
|
+
var path14 = __toESM(require("path"));
|
|
11915
11738
|
|
|
11916
11739
|
// src/daemon/scaffold-template.ts
|
|
11917
11740
|
function generateFiles(type, name, category, opts = {}) {
|
|
@@ -12247,7 +12070,7 @@ init_logger();
|
|
|
12247
12070
|
|
|
12248
12071
|
// src/daemon/dev-cdp-handlers.ts
|
|
12249
12072
|
var fs9 = __toESM(require("fs"));
|
|
12250
|
-
var
|
|
12073
|
+
var path12 = __toESM(require("path"));
|
|
12251
12074
|
init_logger();
|
|
12252
12075
|
async function handleCdpEvaluate(ctx, req, res) {
|
|
12253
12076
|
const body = await ctx.readBody(req);
|
|
@@ -12426,17 +12249,17 @@ async function handleScriptHints(ctx, type, _req, res) {
|
|
|
12426
12249
|
return;
|
|
12427
12250
|
}
|
|
12428
12251
|
let scriptsPath = "";
|
|
12429
|
-
const directScripts =
|
|
12252
|
+
const directScripts = path12.join(dir, "scripts.js");
|
|
12430
12253
|
if (fs9.existsSync(directScripts)) {
|
|
12431
12254
|
scriptsPath = directScripts;
|
|
12432
12255
|
} else {
|
|
12433
|
-
const scriptsDir =
|
|
12256
|
+
const scriptsDir = path12.join(dir, "scripts");
|
|
12434
12257
|
if (fs9.existsSync(scriptsDir)) {
|
|
12435
12258
|
const versions = fs9.readdirSync(scriptsDir).filter((d) => {
|
|
12436
|
-
return fs9.statSync(
|
|
12259
|
+
return fs9.statSync(path12.join(scriptsDir, d)).isDirectory();
|
|
12437
12260
|
}).sort().reverse();
|
|
12438
12261
|
for (const ver of versions) {
|
|
12439
|
-
const p =
|
|
12262
|
+
const p = path12.join(scriptsDir, ver, "scripts.js");
|
|
12440
12263
|
if (fs9.existsSync(p)) {
|
|
12441
12264
|
scriptsPath = p;
|
|
12442
12265
|
break;
|
|
@@ -13491,7 +13314,7 @@ async function handleCliRaw(ctx, req, res) {
|
|
|
13491
13314
|
|
|
13492
13315
|
// src/daemon/dev-auto-implement.ts
|
|
13493
13316
|
var fs10 = __toESM(require("fs"));
|
|
13494
|
-
var
|
|
13317
|
+
var path13 = __toESM(require("path"));
|
|
13495
13318
|
var os15 = __toESM(require("os"));
|
|
13496
13319
|
function getDefaultAutoImplReference(ctx, category, type) {
|
|
13497
13320
|
if (category === "cli") {
|
|
@@ -13511,22 +13334,22 @@ function getLatestScriptVersionDir(scriptsDir) {
|
|
|
13511
13334
|
if (!fs10.existsSync(scriptsDir)) return null;
|
|
13512
13335
|
const versions = fs10.readdirSync(scriptsDir).filter((d) => {
|
|
13513
13336
|
try {
|
|
13514
|
-
return fs10.statSync(
|
|
13337
|
+
return fs10.statSync(path13.join(scriptsDir, d)).isDirectory();
|
|
13515
13338
|
} catch {
|
|
13516
13339
|
return false;
|
|
13517
13340
|
}
|
|
13518
13341
|
}).sort((a, b) => b.localeCompare(a, void 0, { numeric: true, sensitivity: "base" }));
|
|
13519
13342
|
if (versions.length === 0) return null;
|
|
13520
|
-
return
|
|
13343
|
+
return path13.join(scriptsDir, versions[0]);
|
|
13521
13344
|
}
|
|
13522
13345
|
function resolveAutoImplWritableProviderDir(ctx, category, type, requestedDir) {
|
|
13523
|
-
const canonicalUserDir =
|
|
13524
|
-
const desiredDir = requestedDir ?
|
|
13525
|
-
const upstreamRoot =
|
|
13526
|
-
if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${
|
|
13346
|
+
const canonicalUserDir = path13.resolve(ctx.providerLoader.getUserProviderDir(category, type));
|
|
13347
|
+
const desiredDir = requestedDir ? path13.resolve(requestedDir) : canonicalUserDir;
|
|
13348
|
+
const upstreamRoot = path13.resolve(ctx.providerLoader.getUpstreamDir());
|
|
13349
|
+
if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${path13.sep}`)) {
|
|
13527
13350
|
return { dir: null, reason: `Refusing to write into upstream provider directory: ${desiredDir}` };
|
|
13528
13351
|
}
|
|
13529
|
-
if (
|
|
13352
|
+
if (path13.basename(desiredDir) !== type) {
|
|
13530
13353
|
return { dir: null, reason: `Requested writable provider directory must end with '${type}': ${desiredDir}` };
|
|
13531
13354
|
}
|
|
13532
13355
|
const sourceDir = ctx.findProviderDir(type);
|
|
@@ -13534,11 +13357,11 @@ function resolveAutoImplWritableProviderDir(ctx, category, type, requestedDir) {
|
|
|
13534
13357
|
return { dir: null, reason: `Provider source directory not found for '${type}'` };
|
|
13535
13358
|
}
|
|
13536
13359
|
if (!fs10.existsSync(desiredDir)) {
|
|
13537
|
-
fs10.mkdirSync(
|
|
13360
|
+
fs10.mkdirSync(path13.dirname(desiredDir), { recursive: true });
|
|
13538
13361
|
fs10.cpSync(sourceDir, desiredDir, { recursive: true });
|
|
13539
13362
|
ctx.log(`Auto-implement writable copy created: ${desiredDir}`);
|
|
13540
13363
|
}
|
|
13541
|
-
const providerJson =
|
|
13364
|
+
const providerJson = path13.join(desiredDir, "provider.json");
|
|
13542
13365
|
if (!fs10.existsSync(providerJson)) {
|
|
13543
13366
|
return { dir: null, reason: `provider.json not found in writable provider directory: ${desiredDir}` };
|
|
13544
13367
|
}
|
|
@@ -13561,13 +13384,13 @@ function loadAutoImplReferenceScripts(ctx, referenceType) {
|
|
|
13561
13384
|
const refDir = ctx.findProviderDir(referenceType);
|
|
13562
13385
|
if (!refDir || !fs10.existsSync(refDir)) return {};
|
|
13563
13386
|
const referenceScripts = {};
|
|
13564
|
-
const scriptsDir =
|
|
13387
|
+
const scriptsDir = path13.join(refDir, "scripts");
|
|
13565
13388
|
const latestDir = getLatestScriptVersionDir(scriptsDir);
|
|
13566
13389
|
if (!latestDir) return referenceScripts;
|
|
13567
13390
|
for (const file of fs10.readdirSync(latestDir)) {
|
|
13568
13391
|
if (!file.endsWith(".js")) continue;
|
|
13569
13392
|
try {
|
|
13570
|
-
referenceScripts[file] = fs10.readFileSync(
|
|
13393
|
+
referenceScripts[file] = fs10.readFileSync(path13.join(latestDir, file), "utf-8");
|
|
13571
13394
|
} catch {
|
|
13572
13395
|
}
|
|
13573
13396
|
}
|
|
@@ -13618,9 +13441,9 @@ async function handleAutoImplement(ctx, type, req, res) {
|
|
|
13618
13441
|
});
|
|
13619
13442
|
const referenceScripts = loadAutoImplReferenceScripts(ctx, resolvedReference);
|
|
13620
13443
|
const prompt = buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domContext, referenceScripts, comment, resolvedReference);
|
|
13621
|
-
const tmpDir =
|
|
13444
|
+
const tmpDir = path13.join(os15.tmpdir(), "adhdev-autoimpl");
|
|
13622
13445
|
if (!fs10.existsSync(tmpDir)) fs10.mkdirSync(tmpDir, { recursive: true });
|
|
13623
|
-
const promptFile =
|
|
13446
|
+
const promptFile = path13.join(tmpDir, `prompt-${type}-${Date.now()}.md`);
|
|
13624
13447
|
fs10.writeFileSync(promptFile, prompt, "utf-8");
|
|
13625
13448
|
ctx.log(`Auto-implement prompt written to ${promptFile} (${prompt.length} chars)`);
|
|
13626
13449
|
const agentProvider = ctx.providerLoader.resolve(agent) || ctx.providerLoader.getMeta(agent);
|
|
@@ -13991,7 +13814,7 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
|
|
|
13991
13814
|
setMode: "set_mode.js"
|
|
13992
13815
|
};
|
|
13993
13816
|
const targetFileNames = new Set(functions.map((fn) => funcToFile[fn]).filter(Boolean));
|
|
13994
|
-
const scriptsDir =
|
|
13817
|
+
const scriptsDir = path13.join(providerDir, "scripts");
|
|
13995
13818
|
const latestScriptsDir = getLatestScriptVersionDir(scriptsDir);
|
|
13996
13819
|
if (latestScriptsDir) {
|
|
13997
13820
|
lines.push(`Scripts version directory: \`${latestScriptsDir}\``);
|
|
@@ -14002,7 +13825,7 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
|
|
|
14002
13825
|
for (const file of fs10.readdirSync(latestScriptsDir)) {
|
|
14003
13826
|
if (file.endsWith(".js") && targetFileNames.has(file)) {
|
|
14004
13827
|
try {
|
|
14005
|
-
const content = fs10.readFileSync(
|
|
13828
|
+
const content = fs10.readFileSync(path13.join(latestScriptsDir, file), "utf-8");
|
|
14006
13829
|
lines.push(`### \`${file}\` \u270F\uFE0F EDIT`);
|
|
14007
13830
|
lines.push("```javascript");
|
|
14008
13831
|
lines.push(content);
|
|
@@ -14019,7 +13842,7 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
|
|
|
14019
13842
|
lines.push("");
|
|
14020
13843
|
for (const file of refFiles) {
|
|
14021
13844
|
try {
|
|
14022
|
-
const content = fs10.readFileSync(
|
|
13845
|
+
const content = fs10.readFileSync(path13.join(latestScriptsDir, file), "utf-8");
|
|
14023
13846
|
lines.push(`### \`${file}\` \u{1F512}`);
|
|
14024
13847
|
lines.push("```javascript");
|
|
14025
13848
|
lines.push(content);
|
|
@@ -14060,10 +13883,10 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
|
|
|
14060
13883
|
lines.push("");
|
|
14061
13884
|
}
|
|
14062
13885
|
}
|
|
14063
|
-
const docsDir =
|
|
13886
|
+
const docsDir = path13.join(providerDir, "../../docs");
|
|
14064
13887
|
const loadGuide = (name) => {
|
|
14065
13888
|
try {
|
|
14066
|
-
const p =
|
|
13889
|
+
const p = path13.join(docsDir, name);
|
|
14067
13890
|
if (fs10.existsSync(p)) return fs10.readFileSync(p, "utf-8");
|
|
14068
13891
|
} catch {
|
|
14069
13892
|
}
|
|
@@ -14237,7 +14060,7 @@ function buildCliAutoImplPrompt(ctx, type, provider, providerDir, functions, ref
|
|
|
14237
14060
|
parseApproval: "parse_approval.js"
|
|
14238
14061
|
};
|
|
14239
14062
|
const targetFileNames = new Set(functions.map((fn) => funcToFile[fn]).filter(Boolean));
|
|
14240
|
-
const scriptsDir =
|
|
14063
|
+
const scriptsDir = path13.join(providerDir, "scripts");
|
|
14241
14064
|
const latestScriptsDir = getLatestScriptVersionDir(scriptsDir);
|
|
14242
14065
|
if (latestScriptsDir) {
|
|
14243
14066
|
lines.push(`Scripts version directory: \`${latestScriptsDir}\``);
|
|
@@ -14249,7 +14072,7 @@ function buildCliAutoImplPrompt(ctx, type, provider, providerDir, functions, ref
|
|
|
14249
14072
|
if (!file.endsWith(".js")) continue;
|
|
14250
14073
|
if (!targetFileNames.has(file)) continue;
|
|
14251
14074
|
try {
|
|
14252
|
-
const content = fs10.readFileSync(
|
|
14075
|
+
const content = fs10.readFileSync(path13.join(latestScriptsDir, file), "utf-8");
|
|
14253
14076
|
lines.push(`### \`${file}\` \u270F\uFE0F EDIT`);
|
|
14254
14077
|
lines.push("```javascript");
|
|
14255
14078
|
lines.push(content);
|
|
@@ -14265,7 +14088,7 @@ function buildCliAutoImplPrompt(ctx, type, provider, providerDir, functions, ref
|
|
|
14265
14088
|
lines.push("");
|
|
14266
14089
|
for (const file of refFiles) {
|
|
14267
14090
|
try {
|
|
14268
|
-
const content = fs10.readFileSync(
|
|
14091
|
+
const content = fs10.readFileSync(path13.join(latestScriptsDir, file), "utf-8");
|
|
14269
14092
|
lines.push(`### \`${file}\` \u{1F512}`);
|
|
14270
14093
|
lines.push("```javascript");
|
|
14271
14094
|
lines.push(content);
|
|
@@ -14298,10 +14121,10 @@ function buildCliAutoImplPrompt(ctx, type, provider, providerDir, functions, ref
|
|
|
14298
14121
|
lines.push("");
|
|
14299
14122
|
}
|
|
14300
14123
|
}
|
|
14301
|
-
const docsDir =
|
|
14124
|
+
const docsDir = path13.join(providerDir, "../../docs");
|
|
14302
14125
|
const loadGuide = (name) => {
|
|
14303
14126
|
try {
|
|
14304
|
-
const p =
|
|
14127
|
+
const p = path13.join(docsDir, name);
|
|
14305
14128
|
if (fs10.existsSync(p)) return fs10.readFileSync(p, "utf-8");
|
|
14306
14129
|
} catch {
|
|
14307
14130
|
}
|
|
@@ -14559,8 +14382,8 @@ var DevServer = class _DevServer {
|
|
|
14559
14382
|
}
|
|
14560
14383
|
getEndpointList() {
|
|
14561
14384
|
return this.routes.map((r) => {
|
|
14562
|
-
const
|
|
14563
|
-
return `${r.method.padEnd(5)} ${
|
|
14385
|
+
const path15 = typeof r.pattern === "string" ? r.pattern : r.pattern.source.replace(/\\\//g, "/").replace(/\(\[.*?\]\+\)/g, ":type").replace(/[\^$]/g, "");
|
|
14386
|
+
return `${r.method.padEnd(5)} ${path15}`;
|
|
14564
14387
|
});
|
|
14565
14388
|
}
|
|
14566
14389
|
async start(port = DEV_SERVER_PORT) {
|
|
@@ -14591,15 +14414,15 @@ var DevServer = class _DevServer {
|
|
|
14591
14414
|
this.json(res, 500, { error: e.message });
|
|
14592
14415
|
}
|
|
14593
14416
|
});
|
|
14594
|
-
return new Promise((
|
|
14417
|
+
return new Promise((resolve9, reject) => {
|
|
14595
14418
|
this.server.listen(port, "127.0.0.1", () => {
|
|
14596
14419
|
this.log(`Dev server listening on http://127.0.0.1:${port}`);
|
|
14597
|
-
|
|
14420
|
+
resolve9();
|
|
14598
14421
|
});
|
|
14599
14422
|
this.server.on("error", (e) => {
|
|
14600
14423
|
if (e.code === "EADDRINUSE") {
|
|
14601
14424
|
this.log(`Port ${port} in use, skipping dev server`);
|
|
14602
|
-
|
|
14425
|
+
resolve9();
|
|
14603
14426
|
} else {
|
|
14604
14427
|
reject(e);
|
|
14605
14428
|
}
|
|
@@ -14682,20 +14505,20 @@ var DevServer = class _DevServer {
|
|
|
14682
14505
|
child.stderr?.on("data", (d) => {
|
|
14683
14506
|
stderr += d.toString().slice(0, 2e3);
|
|
14684
14507
|
});
|
|
14685
|
-
await new Promise((
|
|
14508
|
+
await new Promise((resolve9) => {
|
|
14686
14509
|
const timer = setTimeout(() => {
|
|
14687
14510
|
child.kill();
|
|
14688
|
-
|
|
14511
|
+
resolve9();
|
|
14689
14512
|
}, 3e3);
|
|
14690
14513
|
child.on("exit", () => {
|
|
14691
14514
|
clearTimeout(timer);
|
|
14692
|
-
|
|
14515
|
+
resolve9();
|
|
14693
14516
|
});
|
|
14694
14517
|
child.stdout?.once("data", () => {
|
|
14695
14518
|
setTimeout(() => {
|
|
14696
14519
|
child.kill();
|
|
14697
14520
|
clearTimeout(timer);
|
|
14698
|
-
|
|
14521
|
+
resolve9();
|
|
14699
14522
|
}, 500);
|
|
14700
14523
|
});
|
|
14701
14524
|
});
|
|
@@ -14842,12 +14665,12 @@ var DevServer = class _DevServer {
|
|
|
14842
14665
|
// ─── DevConsole SPA ───
|
|
14843
14666
|
getConsoleDistDir() {
|
|
14844
14667
|
const candidates = [
|
|
14845
|
-
|
|
14846
|
-
|
|
14847
|
-
|
|
14668
|
+
path14.resolve(__dirname, "../../web-devconsole/dist"),
|
|
14669
|
+
path14.resolve(__dirname, "../../../web-devconsole/dist"),
|
|
14670
|
+
path14.join(process.cwd(), "packages/web-devconsole/dist")
|
|
14848
14671
|
];
|
|
14849
14672
|
for (const dir of candidates) {
|
|
14850
|
-
if (fs11.existsSync(
|
|
14673
|
+
if (fs11.existsSync(path14.join(dir, "index.html"))) return dir;
|
|
14851
14674
|
}
|
|
14852
14675
|
return null;
|
|
14853
14676
|
}
|
|
@@ -14857,7 +14680,7 @@ var DevServer = class _DevServer {
|
|
|
14857
14680
|
this.json(res, 500, { error: "DevConsole not found. Run: npm run build -w packages/web-devconsole" });
|
|
14858
14681
|
return;
|
|
14859
14682
|
}
|
|
14860
|
-
const htmlPath =
|
|
14683
|
+
const htmlPath = path14.join(distDir, "index.html");
|
|
14861
14684
|
try {
|
|
14862
14685
|
const html = fs11.readFileSync(htmlPath, "utf-8");
|
|
14863
14686
|
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
@@ -14882,15 +14705,15 @@ var DevServer = class _DevServer {
|
|
|
14882
14705
|
this.json(res, 404, { error: "Not found" });
|
|
14883
14706
|
return;
|
|
14884
14707
|
}
|
|
14885
|
-
const safePath =
|
|
14886
|
-
const filePath =
|
|
14708
|
+
const safePath = path14.normalize(pathname).replace(/^\.\.\//, "");
|
|
14709
|
+
const filePath = path14.join(distDir, safePath);
|
|
14887
14710
|
if (!filePath.startsWith(distDir)) {
|
|
14888
14711
|
this.json(res, 403, { error: "Forbidden" });
|
|
14889
14712
|
return;
|
|
14890
14713
|
}
|
|
14891
14714
|
try {
|
|
14892
14715
|
const content = fs11.readFileSync(filePath);
|
|
14893
|
-
const ext =
|
|
14716
|
+
const ext = path14.extname(filePath);
|
|
14894
14717
|
const contentType = _DevServer.MIME_MAP[ext] || "application/octet-stream";
|
|
14895
14718
|
res.writeHead(200, { "Content-Type": contentType, "Cache-Control": "public, max-age=31536000, immutable" });
|
|
14896
14719
|
res.end(content);
|
|
@@ -15003,9 +14826,9 @@ var DevServer = class _DevServer {
|
|
|
15003
14826
|
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
15004
14827
|
if (entry.isDirectory()) {
|
|
15005
14828
|
files.push({ path: rel, size: 0, type: "dir" });
|
|
15006
|
-
scan(
|
|
14829
|
+
scan(path14.join(d, entry.name), rel);
|
|
15007
14830
|
} else {
|
|
15008
|
-
const stat = fs11.statSync(
|
|
14831
|
+
const stat = fs11.statSync(path14.join(d, entry.name));
|
|
15009
14832
|
files.push({ path: rel, size: stat.size, type: "file" });
|
|
15010
14833
|
}
|
|
15011
14834
|
}
|
|
@@ -15028,7 +14851,7 @@ var DevServer = class _DevServer {
|
|
|
15028
14851
|
this.json(res, 404, { error: `Provider directory not found: ${type}` });
|
|
15029
14852
|
return;
|
|
15030
14853
|
}
|
|
15031
|
-
const fullPath =
|
|
14854
|
+
const fullPath = path14.resolve(dir, path14.normalize(filePath));
|
|
15032
14855
|
if (!fullPath.startsWith(dir)) {
|
|
15033
14856
|
this.json(res, 403, { error: "Forbidden" });
|
|
15034
14857
|
return;
|
|
@@ -15053,14 +14876,14 @@ var DevServer = class _DevServer {
|
|
|
15053
14876
|
this.json(res, 404, { error: `Provider directory not found: ${type}` });
|
|
15054
14877
|
return;
|
|
15055
14878
|
}
|
|
15056
|
-
const fullPath =
|
|
14879
|
+
const fullPath = path14.resolve(dir, path14.normalize(filePath));
|
|
15057
14880
|
if (!fullPath.startsWith(dir)) {
|
|
15058
14881
|
this.json(res, 403, { error: "Forbidden" });
|
|
15059
14882
|
return;
|
|
15060
14883
|
}
|
|
15061
14884
|
try {
|
|
15062
14885
|
if (fs11.existsSync(fullPath)) fs11.copyFileSync(fullPath, fullPath + ".bak");
|
|
15063
|
-
fs11.mkdirSync(
|
|
14886
|
+
fs11.mkdirSync(path14.dirname(fullPath), { recursive: true });
|
|
15064
14887
|
fs11.writeFileSync(fullPath, content, "utf-8");
|
|
15065
14888
|
this.log(`File saved: ${fullPath} (${content.length} chars)`);
|
|
15066
14889
|
this.providerLoader.reload();
|
|
@@ -15077,7 +14900,7 @@ var DevServer = class _DevServer {
|
|
|
15077
14900
|
return;
|
|
15078
14901
|
}
|
|
15079
14902
|
for (const name of ["scripts.js", "provider.json"]) {
|
|
15080
|
-
const p =
|
|
14903
|
+
const p = path14.join(dir, name);
|
|
15081
14904
|
if (fs11.existsSync(p)) {
|
|
15082
14905
|
const source = fs11.readFileSync(p, "utf-8");
|
|
15083
14906
|
this.json(res, 200, { type, path: p, source, lines: source.split("\n").length });
|
|
@@ -15098,8 +14921,8 @@ var DevServer = class _DevServer {
|
|
|
15098
14921
|
this.json(res, 404, { error: `Provider not found: ${type}` });
|
|
15099
14922
|
return;
|
|
15100
14923
|
}
|
|
15101
|
-
const target = fs11.existsSync(
|
|
15102
|
-
const targetPath =
|
|
14924
|
+
const target = fs11.existsSync(path14.join(dir, "scripts.js")) ? "scripts.js" : "provider.json";
|
|
14925
|
+
const targetPath = path14.join(dir, target);
|
|
15103
14926
|
try {
|
|
15104
14927
|
if (fs11.existsSync(targetPath)) fs11.copyFileSync(targetPath, targetPath + ".bak");
|
|
15105
14928
|
fs11.writeFileSync(targetPath, source, "utf-8");
|
|
@@ -15204,14 +15027,14 @@ var DevServer = class _DevServer {
|
|
|
15204
15027
|
child.stderr?.on("data", (d) => {
|
|
15205
15028
|
stderr += d.toString();
|
|
15206
15029
|
});
|
|
15207
|
-
await new Promise((
|
|
15030
|
+
await new Promise((resolve9) => {
|
|
15208
15031
|
const timer = setTimeout(() => {
|
|
15209
15032
|
child.kill();
|
|
15210
|
-
|
|
15033
|
+
resolve9();
|
|
15211
15034
|
}, timeout);
|
|
15212
15035
|
child.on("exit", () => {
|
|
15213
15036
|
clearTimeout(timer);
|
|
15214
|
-
|
|
15037
|
+
resolve9();
|
|
15215
15038
|
});
|
|
15216
15039
|
});
|
|
15217
15040
|
const elapsed = Date.now() - start;
|
|
@@ -15259,7 +15082,7 @@ var DevServer = class _DevServer {
|
|
|
15259
15082
|
}
|
|
15260
15083
|
let targetDir;
|
|
15261
15084
|
targetDir = this.providerLoader.getUserProviderDir(category, type);
|
|
15262
|
-
const jsonPath =
|
|
15085
|
+
const jsonPath = path14.join(targetDir, "provider.json");
|
|
15263
15086
|
if (fs11.existsSync(jsonPath)) {
|
|
15264
15087
|
this.json(res, 409, { error: `Provider already exists at ${targetDir}`, path: targetDir });
|
|
15265
15088
|
return;
|
|
@@ -15271,8 +15094,8 @@ var DevServer = class _DevServer {
|
|
|
15271
15094
|
const createdFiles = ["provider.json"];
|
|
15272
15095
|
if (result.files) {
|
|
15273
15096
|
for (const [relPath, content] of Object.entries(result.files)) {
|
|
15274
|
-
const fullPath =
|
|
15275
|
-
fs11.mkdirSync(
|
|
15097
|
+
const fullPath = path14.join(targetDir, relPath);
|
|
15098
|
+
fs11.mkdirSync(path14.dirname(fullPath), { recursive: true });
|
|
15276
15099
|
fs11.writeFileSync(fullPath, content, "utf-8");
|
|
15277
15100
|
createdFiles.push(relPath);
|
|
15278
15101
|
}
|
|
@@ -15325,22 +15148,22 @@ var DevServer = class _DevServer {
|
|
|
15325
15148
|
if (!fs11.existsSync(scriptsDir)) return null;
|
|
15326
15149
|
const versions = fs11.readdirSync(scriptsDir).filter((d) => {
|
|
15327
15150
|
try {
|
|
15328
|
-
return fs11.statSync(
|
|
15151
|
+
return fs11.statSync(path14.join(scriptsDir, d)).isDirectory();
|
|
15329
15152
|
} catch {
|
|
15330
15153
|
return false;
|
|
15331
15154
|
}
|
|
15332
15155
|
}).sort((a, b) => b.localeCompare(a, void 0, { numeric: true, sensitivity: "base" }));
|
|
15333
15156
|
if (versions.length === 0) return null;
|
|
15334
|
-
return
|
|
15157
|
+
return path14.join(scriptsDir, versions[0]);
|
|
15335
15158
|
}
|
|
15336
15159
|
resolveAutoImplWritableProviderDir(category, type, requestedDir) {
|
|
15337
|
-
const canonicalUserDir =
|
|
15338
|
-
const desiredDir = requestedDir ?
|
|
15339
|
-
const upstreamRoot =
|
|
15340
|
-
if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${
|
|
15160
|
+
const canonicalUserDir = path14.resolve(this.providerLoader.getUserProviderDir(category, type));
|
|
15161
|
+
const desiredDir = requestedDir ? path14.resolve(requestedDir) : canonicalUserDir;
|
|
15162
|
+
const upstreamRoot = path14.resolve(this.providerLoader.getUpstreamDir());
|
|
15163
|
+
if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${path14.sep}`)) {
|
|
15341
15164
|
return { dir: null, reason: `Refusing to write into upstream provider directory: ${desiredDir}` };
|
|
15342
15165
|
}
|
|
15343
|
-
if (
|
|
15166
|
+
if (path14.basename(desiredDir) !== type) {
|
|
15344
15167
|
return { dir: null, reason: `Requested writable provider directory must end with '${type}': ${desiredDir}` };
|
|
15345
15168
|
}
|
|
15346
15169
|
const sourceDir = this.findProviderDir(type);
|
|
@@ -15348,11 +15171,11 @@ var DevServer = class _DevServer {
|
|
|
15348
15171
|
return { dir: null, reason: `Provider source directory not found for '${type}'` };
|
|
15349
15172
|
}
|
|
15350
15173
|
if (!fs11.existsSync(desiredDir)) {
|
|
15351
|
-
fs11.mkdirSync(
|
|
15174
|
+
fs11.mkdirSync(path14.dirname(desiredDir), { recursive: true });
|
|
15352
15175
|
fs11.cpSync(sourceDir, desiredDir, { recursive: true });
|
|
15353
15176
|
this.log(`Auto-implement writable copy created: ${desiredDir}`);
|
|
15354
15177
|
}
|
|
15355
|
-
const providerJson =
|
|
15178
|
+
const providerJson = path14.join(desiredDir, "provider.json");
|
|
15356
15179
|
if (!fs11.existsSync(providerJson)) {
|
|
15357
15180
|
return { dir: null, reason: `provider.json not found in writable provider directory: ${desiredDir}` };
|
|
15358
15181
|
}
|
|
@@ -15400,7 +15223,7 @@ var DevServer = class _DevServer {
|
|
|
15400
15223
|
setMode: "set_mode.js"
|
|
15401
15224
|
};
|
|
15402
15225
|
const targetFileNames = new Set(functions.map((fn) => funcToFile[fn]).filter(Boolean));
|
|
15403
|
-
const scriptsDir =
|
|
15226
|
+
const scriptsDir = path14.join(providerDir, "scripts");
|
|
15404
15227
|
const latestScriptsDir = this.getLatestScriptVersionDir(scriptsDir);
|
|
15405
15228
|
if (latestScriptsDir) {
|
|
15406
15229
|
lines.push(`Scripts version directory: \`${latestScriptsDir}\``);
|
|
@@ -15411,7 +15234,7 @@ var DevServer = class _DevServer {
|
|
|
15411
15234
|
for (const file of fs11.readdirSync(latestScriptsDir)) {
|
|
15412
15235
|
if (file.endsWith(".js") && targetFileNames.has(file)) {
|
|
15413
15236
|
try {
|
|
15414
|
-
const content = fs11.readFileSync(
|
|
15237
|
+
const content = fs11.readFileSync(path14.join(latestScriptsDir, file), "utf-8");
|
|
15415
15238
|
lines.push(`### \`${file}\` \u270F\uFE0F EDIT`);
|
|
15416
15239
|
lines.push("```javascript");
|
|
15417
15240
|
lines.push(content);
|
|
@@ -15428,7 +15251,7 @@ var DevServer = class _DevServer {
|
|
|
15428
15251
|
lines.push("");
|
|
15429
15252
|
for (const file of refFiles) {
|
|
15430
15253
|
try {
|
|
15431
|
-
const content = fs11.readFileSync(
|
|
15254
|
+
const content = fs11.readFileSync(path14.join(latestScriptsDir, file), "utf-8");
|
|
15432
15255
|
lines.push(`### \`${file}\` \u{1F512}`);
|
|
15433
15256
|
lines.push("```javascript");
|
|
15434
15257
|
lines.push(content);
|
|
@@ -15469,10 +15292,10 @@ var DevServer = class _DevServer {
|
|
|
15469
15292
|
lines.push("");
|
|
15470
15293
|
}
|
|
15471
15294
|
}
|
|
15472
|
-
const docsDir =
|
|
15295
|
+
const docsDir = path14.join(providerDir, "../../docs");
|
|
15473
15296
|
const loadGuide = (name) => {
|
|
15474
15297
|
try {
|
|
15475
|
-
const p =
|
|
15298
|
+
const p = path14.join(docsDir, name);
|
|
15476
15299
|
if (fs11.existsSync(p)) return fs11.readFileSync(p, "utf-8");
|
|
15477
15300
|
} catch {
|
|
15478
15301
|
}
|
|
@@ -15646,7 +15469,7 @@ var DevServer = class _DevServer {
|
|
|
15646
15469
|
parseApproval: "parse_approval.js"
|
|
15647
15470
|
};
|
|
15648
15471
|
const targetFileNames = new Set(functions.map((fn) => funcToFile[fn]).filter(Boolean));
|
|
15649
|
-
const scriptsDir =
|
|
15472
|
+
const scriptsDir = path14.join(providerDir, "scripts");
|
|
15650
15473
|
const latestScriptsDir = this.getLatestScriptVersionDir(scriptsDir);
|
|
15651
15474
|
if (latestScriptsDir) {
|
|
15652
15475
|
lines.push(`Scripts version directory: \`${latestScriptsDir}\``);
|
|
@@ -15658,7 +15481,7 @@ var DevServer = class _DevServer {
|
|
|
15658
15481
|
if (!file.endsWith(".js")) continue;
|
|
15659
15482
|
if (!targetFileNames.has(file)) continue;
|
|
15660
15483
|
try {
|
|
15661
|
-
const content = fs11.readFileSync(
|
|
15484
|
+
const content = fs11.readFileSync(path14.join(latestScriptsDir, file), "utf-8");
|
|
15662
15485
|
lines.push(`### \`${file}\` \u270F\uFE0F EDIT`);
|
|
15663
15486
|
lines.push("```javascript");
|
|
15664
15487
|
lines.push(content);
|
|
@@ -15674,7 +15497,7 @@ var DevServer = class _DevServer {
|
|
|
15674
15497
|
lines.push("");
|
|
15675
15498
|
for (const file of refFiles) {
|
|
15676
15499
|
try {
|
|
15677
|
-
const content = fs11.readFileSync(
|
|
15500
|
+
const content = fs11.readFileSync(path14.join(latestScriptsDir, file), "utf-8");
|
|
15678
15501
|
lines.push(`### \`${file}\` \u{1F512}`);
|
|
15679
15502
|
lines.push("```javascript");
|
|
15680
15503
|
lines.push(content);
|
|
@@ -15707,10 +15530,10 @@ var DevServer = class _DevServer {
|
|
|
15707
15530
|
lines.push("");
|
|
15708
15531
|
}
|
|
15709
15532
|
}
|
|
15710
|
-
const docsDir =
|
|
15533
|
+
const docsDir = path14.join(providerDir, "../../docs");
|
|
15711
15534
|
const loadGuide = (name) => {
|
|
15712
15535
|
try {
|
|
15713
|
-
const p =
|
|
15536
|
+
const p = path14.join(docsDir, name);
|
|
15714
15537
|
if (fs11.existsSync(p)) return fs11.readFileSync(p, "utf-8");
|
|
15715
15538
|
} catch {
|
|
15716
15539
|
}
|
|
@@ -15867,14 +15690,14 @@ data: ${JSON.stringify(msg.data)}
|
|
|
15867
15690
|
res.end(JSON.stringify(data, null, 2));
|
|
15868
15691
|
}
|
|
15869
15692
|
async readBody(req) {
|
|
15870
|
-
return new Promise((
|
|
15693
|
+
return new Promise((resolve9) => {
|
|
15871
15694
|
let body = "";
|
|
15872
15695
|
req.on("data", (chunk) => body += chunk);
|
|
15873
15696
|
req.on("end", () => {
|
|
15874
15697
|
try {
|
|
15875
|
-
|
|
15698
|
+
resolve9(JSON.parse(body));
|
|
15876
15699
|
} catch {
|
|
15877
|
-
|
|
15700
|
+
resolve9({});
|
|
15878
15701
|
}
|
|
15879
15702
|
});
|
|
15880
15703
|
});
|
|
@@ -16291,7 +16114,7 @@ async function waitForReady(endpoint, timeoutMs = STARTUP_TIMEOUT_MS) {
|
|
|
16291
16114
|
const deadline = Date.now() + timeoutMs;
|
|
16292
16115
|
while (Date.now() < deadline) {
|
|
16293
16116
|
if (await canConnect(endpoint)) return;
|
|
16294
|
-
await new Promise((
|
|
16117
|
+
await new Promise((resolve9) => setTimeout(resolve9, STARTUP_POLL_MS));
|
|
16295
16118
|
}
|
|
16296
16119
|
throw new Error(`Session host did not become ready within ${timeoutMs}ms`);
|
|
16297
16120
|
}
|
|
@@ -16446,10 +16269,10 @@ async function installExtension(ide, extension) {
|
|
|
16446
16269
|
const buffer = Buffer.from(await res.arrayBuffer());
|
|
16447
16270
|
const fs12 = await import("fs");
|
|
16448
16271
|
fs12.writeFileSync(vsixPath, buffer);
|
|
16449
|
-
return new Promise((
|
|
16272
|
+
return new Promise((resolve9) => {
|
|
16450
16273
|
const cmd = `"${ide.cliCommand}" --install-extension "${vsixPath}" --force`;
|
|
16451
16274
|
(0, import_child_process8.exec)(cmd, { timeout: 6e4 }, (error, _stdout, stderr) => {
|
|
16452
|
-
|
|
16275
|
+
resolve9({
|
|
16453
16276
|
extensionId: extension.id,
|
|
16454
16277
|
marketplaceId: extension.marketplaceId,
|
|
16455
16278
|
success: !error,
|
|
@@ -16462,11 +16285,11 @@ async function installExtension(ide, extension) {
|
|
|
16462
16285
|
} catch (e) {
|
|
16463
16286
|
}
|
|
16464
16287
|
}
|
|
16465
|
-
return new Promise((
|
|
16288
|
+
return new Promise((resolve9) => {
|
|
16466
16289
|
const cmd = `"${ide.cliCommand}" --install-extension ${extension.marketplaceId} --force`;
|
|
16467
16290
|
(0, import_child_process8.exec)(cmd, { timeout: 6e4 }, (error, stdout, stderr) => {
|
|
16468
16291
|
if (error) {
|
|
16469
|
-
|
|
16292
|
+
resolve9({
|
|
16470
16293
|
extensionId: extension.id,
|
|
16471
16294
|
marketplaceId: extension.marketplaceId,
|
|
16472
16295
|
success: false,
|
|
@@ -16474,7 +16297,7 @@ async function installExtension(ide, extension) {
|
|
|
16474
16297
|
error: stderr || error.message
|
|
16475
16298
|
});
|
|
16476
16299
|
} else {
|
|
16477
|
-
|
|
16300
|
+
resolve9({
|
|
16478
16301
|
extensionId: extension.id,
|
|
16479
16302
|
marketplaceId: extension.marketplaceId,
|
|
16480
16303
|
success: true,
|
|
@@ -16778,7 +16601,6 @@ async function shutdownDaemonComponents(components) {
|
|
|
16778
16601
|
ProviderLoader,
|
|
16779
16602
|
SessionHostPtyTransportFactory,
|
|
16780
16603
|
VersionArchive,
|
|
16781
|
-
addCliHistory,
|
|
16782
16604
|
appendRecentActivity,
|
|
16783
16605
|
buildSessionEntries,
|
|
16784
16606
|
buildStatusSnapshot,
|
|
@@ -16796,7 +16618,6 @@ async function shutdownDaemonComponents(components) {
|
|
|
16796
16618
|
getRecentActivity,
|
|
16797
16619
|
getRecentCommands,
|
|
16798
16620
|
getRecentLogs,
|
|
16799
|
-
getWorkspaceActivity,
|
|
16800
16621
|
getWorkspaceState,
|
|
16801
16622
|
hasCdpManager,
|
|
16802
16623
|
initDaemonComponents,
|