@adhdev/daemon-core 0.7.37 → 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.
Files changed (93) hide show
  1. package/dist/agent-stream/forward.d.ts +8 -0
  2. package/dist/agent-stream/index.d.ts +6 -0
  3. package/dist/agent-stream/manager.d.ts +59 -0
  4. package/dist/agent-stream/poller.d.ts +41 -0
  5. package/dist/agent-stream/provider-adapter.d.ts +29 -0
  6. package/dist/agent-stream/types.d.ts +62 -0
  7. package/dist/boot/daemon-lifecycle.d.ts +97 -0
  8. package/dist/cdp/devtools.d.ts +51 -0
  9. package/dist/cdp/initializer.d.ts +50 -0
  10. package/dist/cdp/manager.d.ts +145 -0
  11. package/dist/cdp/scanner.d.ts +58 -0
  12. package/dist/cdp/setup.d.ts +58 -0
  13. package/dist/cli-adapter-types.d.ts +25 -0
  14. package/dist/cli-adapters/provider-cli-adapter.d.ts +229 -0
  15. package/dist/cli-adapters/pty-transport.d.ts +43 -0
  16. package/dist/cli-adapters/session-host-transport.d.ts +19 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +12 -0
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +14 -0
  19. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +13 -0
  20. package/dist/cli-adapters/terminal-screen.d.ts +27 -0
  21. package/dist/commands/cdp-commands.d.ts +15 -0
  22. package/dist/commands/chat-commands.d.ts +15 -0
  23. package/dist/commands/cli-manager.d.ts +82 -0
  24. package/dist/commands/handler.d.ts +101 -0
  25. package/dist/commands/router.d.ts +69 -0
  26. package/dist/commands/stream-commands.d.ts +13 -0
  27. package/dist/commands/workspace-commands.d.ts +11 -0
  28. package/dist/config/chat-history.d.ts +60 -0
  29. package/dist/config/config.d.ts +101 -0
  30. package/dist/config/recent-activity.d.ts +27 -0
  31. package/dist/config/workspaces.d.ts +82 -0
  32. package/dist/daemon/dev-auto-implement.d.ts +26 -0
  33. package/dist/daemon/dev-cdp-handlers.d.ts +22 -0
  34. package/dist/daemon/dev-cli-debug.d.ts +24 -0
  35. package/dist/daemon/dev-server-types.d.ts +43 -0
  36. package/dist/daemon/dev-server.d.ts +133 -0
  37. package/dist/daemon/scaffold-template.d.ts +32 -0
  38. package/dist/daemon-core.d.ts +36 -0
  39. package/dist/detection/cli-detector.d.ts +27 -0
  40. package/dist/detection/ide-detector.d.ts +34 -0
  41. package/dist/index.d.ts +72 -2499
  42. package/dist/index.js +458 -637
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +465 -642
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/installer.d.ts +50 -0
  47. package/dist/ipc-protocol.d.ts +111 -0
  48. package/dist/launch.d.ts +46 -0
  49. package/dist/logging/command-log.d.ts +31 -0
  50. package/dist/logging/logger.d.ts +87 -0
  51. package/dist/providers/acp-provider-instance.d.ts +101 -0
  52. package/dist/providers/cli-provider-instance.d.ts +43 -0
  53. package/dist/providers/contracts.d.ts +483 -0
  54. package/dist/providers/extension-provider-instance.d.ts +44 -0
  55. package/dist/providers/ide-provider-instance.d.ts +61 -0
  56. package/dist/providers/index.d.ts +5 -0
  57. package/dist/providers/provider-instance-manager.d.ts +84 -0
  58. package/dist/providers/provider-instance.d.ts +148 -0
  59. package/dist/providers/provider-loader.d.ts +270 -0
  60. package/dist/providers/status-monitor.d.ts +48 -0
  61. package/dist/providers/version-archive.d.ts +52 -0
  62. package/dist/session-host/runtime-support.d.ts +8 -0
  63. package/dist/sessions/registry.d.ts +24 -0
  64. package/dist/shared-types-extra.d.ts +29 -0
  65. package/dist/shared-types.d.ts +213 -0
  66. package/dist/status/builders.d.ts +33 -0
  67. package/dist/status/normalize.d.ts +14 -1
  68. package/dist/status/reporter.d.ts +69 -0
  69. package/dist/status/snapshot.d.ts +38 -0
  70. package/dist/system/host-memory.d.ts +19 -0
  71. package/dist/types.d.ts +123 -0
  72. package/node_modules/@adhdev/session-host-core/package.json +1 -1
  73. package/package.json +3 -2
  74. package/src/commands/cli-manager.ts +1 -26
  75. package/src/commands/handler.ts +0 -31
  76. package/src/commands/router.ts +1 -18
  77. package/src/commands/stream-commands.ts +2 -4
  78. package/src/commands/workspace-commands.ts +9 -23
  79. package/src/config/config.ts +1 -78
  80. package/src/config/workspaces.ts +0 -24
  81. package/src/index.ts +16 -15
  82. package/src/providers/provider-loader.ts +13 -5
  83. package/src/shared-types-extra.ts +34 -0
  84. package/src/shared-types.ts +14 -27
  85. package/src/status/builders.ts +12 -0
  86. package/src/status/reporter.ts +1 -0
  87. package/src/status/snapshot.ts +26 -13
  88. package/src/types.ts +3 -8
  89. package/dist/index.d.mts +0 -2504
  90. package/dist/normalize-DVI4Lo5I.d.mts +0 -947
  91. package/dist/normalize-DVI4Lo5I.d.ts +0 -947
  92. package/dist/status/normalize.d.mts +0 -1
  93. 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, import_crypto2.randomUUID)().replace(/-/g, "")}`;
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
- migrateWorkspacesFromRecent(normalized);
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
- function addCliHistory(entry) {
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
- import_crypto2 = require("crypto");
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 = path4.join(LOG_DIR, `daemon-${currentDate}.log`);
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(path4.join(LOG_DIR, file));
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, path4, 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;
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
- path4 = __toESM(require("path"));
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" ? path4.join(process.env.LOCALAPPDATA || process.env.APPDATA || path4.join(os4.homedir(), "AppData", "Local"), "adhdev", "logs") : process.platform === "darwin" ? path4.join(os4.homedir(), "Library", "Logs", "adhdev") : path4.join(os4.homedir(), ".local", "share", "adhdev", "logs");
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 = path4.join(LOG_DIR, `daemon-${currentDate}.log`);
355
+ currentLogFile = path3.join(LOG_DIR, `daemon-${currentDate}.log`);
586
356
  cleanOldLogs();
587
357
  try {
588
- const oldLog = path4.join(LOG_DIR, "daemon.log");
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, path4.join(LOG_DIR, `daemon-${oldDate}.log`));
362
+ fs2.renameSync(oldLog, path3.join(LOG_DIR, `daemon-${oldDate}.log`));
593
363
  }
594
- const oldLogBackup = path4.join(LOG_DIR, "daemon.log.old");
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 = path4.join(LOG_DIR, `daemon-${getDateStr()}.log`);
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 (!path10.isAbsolute(binaryPath)) return false;
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 (!path10.isAbsolute(filePath)) return false;
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, path10, import_child_process5, pty2, ProviderCliAdapter;
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
- path10 = __toESM(require("path"));
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 = path10.resolve(path10.dirname(require.resolve("node-pty")), "..");
869
+ const ptyDir = path9.resolve(path9.dirname(require.resolve("node-pty")), "..");
1100
870
  const platformArch = `${os12.platform()}-${os12.arch()}`;
1101
- const helper = path10.join(ptyDir, "prebuilds", platformArch, "spawn-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 || !path10.isAbsolute(binaryPath) || isScriptBinary(binaryPath) || !looksLikeMachOOrElf(binaryPath));
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((resolve10) => setTimeout(resolve10, 50));
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((resolve10) => {
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
- resolve10(true);
1658
+ resolve9(true);
1889
1659
  return;
1890
1660
  }
1891
1661
  if (Date.now() - startedAt >= timeoutMs) {
1892
1662
  clearInterval(timer);
1893
- resolve10(false);
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/workspace-activity.ts
2164
- var path2 = __toESM(require("path"));
2165
- init_workspaces();
2166
- var MAX_ACTIVITY = 30;
2167
- function normWorkspacePath(p) {
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
- return path2.resolve(expandPath(p));
2170
- } catch {
2171
- return path2.resolve(p);
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 appendWorkspaceActivity(config, rawPath, meta) {
2175
- const abs = normWorkspacePath(rawPath);
2176
- if (!abs) return config;
2177
- const prev = config.recentWorkspaceActivity || [];
2178
- const filtered = prev.filter((e) => normWorkspacePath(e.path) !== abs);
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
- lastUsedAt: Date.now(),
2182
- kind: meta?.kind,
2183
- agentType: meta?.agentType
2072
+ label: (label || "").trim() || defaultWorkspaceLabel(abs),
2073
+ addedAt: Date.now()
2184
2074
  };
2185
- const recentWorkspaceActivity = [entry, ...filtered].slice(0, MAX_ACTIVITY);
2186
- return { ...config, recentWorkspaceActivity };
2075
+ list.push(entry);
2076
+ return { config: { ...config, workspaces: list }, entry };
2187
2077
  }
2188
- function getWorkspaceActivity(config, limit = 20) {
2189
- const list = [...config.recentWorkspaceActivity || []];
2190
- list.sort((a, b) => b.lastUsedAt - a.lastUsedAt);
2191
- return list.slice(0, limit);
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 removeActivityForPath(config, rawPath) {
2194
- const n = normWorkspacePath(rawPath);
2195
- return {
2196
- ...config,
2197
- recentWorkspaceActivity: (config.recentWorkspaceActivity || []).filter(
2198
- (e) => normWorkspacePath(e.path) !== n
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 path3 = __toESM(require("path"));
2205
- init_workspaces();
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 path3.resolve(expandPath(workspace));
2102
+ return path2.resolve(expandPath(workspace));
2211
2103
  } catch {
2212
- return path3.resolve(workspace);
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, MAX_ACTIVITY2)
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((resolve10) => {
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
- resolve10(null);
2251
+ resolve9(null);
2360
2252
  } else {
2361
- resolve10(stdout.trim());
2253
+ resolve9(stdout.trim());
2362
2254
  }
2363
2255
  });
2364
- child.on("error", () => resolve10(null));
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((resolve10) => {
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
- resolve10(mainPages.length > 0 ? mainPages : fallbackPages);
2439
+ resolve9(mainPages.length > 0 ? mainPages : fallbackPages);
2548
2440
  } catch {
2549
- resolve10([]);
2441
+ resolve9([]);
2550
2442
  }
2551
2443
  });
2552
2444
  });
2553
- req.on("error", () => resolve10([]));
2445
+ req.on("error", () => resolve9([]));
2554
2446
  req.setTimeout(2e3, () => {
2555
2447
  req.destroy();
2556
- resolve10([]);
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((resolve10) => {
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
- resolve10(targets.find((t) => t.webSocketDebuggerUrl) || null);
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
- resolve10(specific);
2509
+ resolve9(specific);
2618
2510
  } else {
2619
2511
  this.log(`[CDP] Target ${this._targetId} not found in page list`);
2620
- resolve10(null);
2512
+ resolve9(null);
2621
2513
  }
2622
2514
  return;
2623
2515
  }
2624
2516
  this._pageTitle = list[0]?.title || "";
2625
- resolve10(list[0]);
2517
+ resolve9(list[0]);
2626
2518
  } catch {
2627
- resolve10(null);
2519
+ resolve9(null);
2628
2520
  }
2629
2521
  });
2630
2522
  });
2631
- req.on("error", () => resolve10(null));
2523
+ req.on("error", () => resolve9(null));
2632
2524
  req.setTimeout(2e3, () => {
2633
2525
  req.destroy();
2634
- resolve10(null);
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((resolve10) => {
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
- resolve10(true);
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: resolve11, reject } = this.pending.get(msg.id);
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 resolve11(msg.result);
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
- resolve10(false);
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((resolve10, reject) => {
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
- resolve10();
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: resolve11, reject: reject2 } = this.browserPending.get(msg.id);
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 resolve11(msg.result);
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((resolve10) => {
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
- resolve10(info.webSocketDebuggerUrl || null);
2640
+ resolve9(info.webSocketDebuggerUrl || null);
2749
2641
  } catch {
2750
- resolve10(null);
2642
+ resolve9(null);
2751
2643
  }
2752
2644
  });
2753
2645
  });
2754
- req.on("error", () => resolve10(null));
2646
+ req.on("error", () => resolve9(null));
2755
2647
  req.setTimeout(3e3, () => {
2756
2648
  req.destroy();
2757
- resolve10(null);
2649
+ resolve9(null);
2758
2650
  });
2759
2651
  });
2760
2652
  }
2761
2653
  sendBrowser(method, params = {}, timeoutMs = 15e3) {
2762
- return new Promise((resolve10, reject) => {
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: resolve10, reject });
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((resolve10, reject) => {
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: resolve10, reject });
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((resolve10, reject) => {
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 resolve10(msg.result);
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((resolve10, reject) => {
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
- resolve10(result?.result?.value);
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((resolve10, reject) => {
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: resolve10, reject });
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 path5 = __toESM(require("path"));
3899
+ var path4 = __toESM(require("path"));
4008
3900
  var os5 = __toESM(require("os"));
4009
- var HISTORY_DIR = path5.join(os5.homedir(), ".adhdev", "history");
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 = path5.join(HISTORY_DIR, this.sanitize(agentType));
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 = path5.join(dir, `${filePrefix}${date}.jsonl`);
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 = path5.join(HISTORY_DIR, this.sanitize(agentType));
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 = path5.join(dir, `${filePrefix}${date}.terminal.log`);
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 = path5.join(HISTORY_DIR, dir.name);
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 = path5.join(dirPath, file);
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 = path5.join(HISTORY_DIR, sanitized);
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 = path5.join(dir, file);
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 path6 = __toESM(require("path"));
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 = path6.join(home, requestedPath.slice(1));
6292
- } else if (path6.isAbsolute(requestedPath)) {
6190
+ resolved = path5.join(home, requestedPath.slice(1));
6191
+ } else if (path5.isAbsolute(requestedPath)) {
6293
6192
  resolved = requestedPath;
6294
6193
  } else {
6295
- resolved = path6.resolve(requestedPath);
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(path6.dirname(filePath), { recursive: true });
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(path6.join(dirPath, e.name)).size : void 0
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: config.ideSettings?.[ideType]?.extensions?.[p.type]?.enabled === true
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: config.ideSettings?.[ide]?.extensions?.[p.type]?.enabled === true
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
- let cfg = appendWorkspaceActivity(result.config, result.entry.path, {});
6553
- saveConfig(cfg);
6554
- const state = getWorkspaceState(cfg);
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
- let cfg = result.config;
6565
- if (removed) {
6566
- cfg = removeActivityForPath(cfg, removed.path);
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
- let out = result.config;
6608
- const ap = getDefaultWorkspacePath(out);
6609
- if (ap) {
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((resolve10, reject) => {
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
- resolve10(JSON.parse(data));
6909
+ resolve9(JSON.parse(data));
7057
6910
  } catch {
7058
- resolve10({ raw: data });
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((resolve10, reject) => {
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
- resolve10(JSON.parse(data));
6935
+ resolve9(JSON.parse(data));
7083
6936
  } catch {
7084
- resolve10({ raw: data });
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((resolve10, reject) => {
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
- resolve10(JSON.parse(data));
6963
+ resolve9(JSON.parse(data));
7111
6964
  } catch {
7112
- resolve10({ raw: data });
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 path8 = __toESM(require("path"));
6984
+ var path7 = __toESM(require("path"));
7132
6985
 
7133
6986
  // src/providers/provider-loader.ts
7134
6987
  var fs5 = __toESM(require("fs"));
7135
- var path7 = __toESM(require("path"));
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 = path7.join(os7.homedir(), ".adhdev", "providers");
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 = path7.resolve(__dirname, "../../../../../adhdev-providers");
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 = path7.join(defaultProvidersDir, ".upstream");
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 path7.join(root, category, type);
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 path7.join(dir, ...segments);
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(path7.join(this.upstreamDir, d)).isDirectory()
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
- const { loadConfig: loadConfig2 } = (init_config(), __toCommonJS(config_exports));
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 = path7.join(providerDir, scriptDir);
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 = path7.join(dir, "scripts.js");
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: ${path7.basename(filePath)}, reloading...`);
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 = path7.join(this.upstreamDir, _ProviderLoader.META_FILE);
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((resolve10, reject) => {
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
- resolve10(res2.headers.etag || res2.headers["last-modified"] || "");
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
- resolve10(res.headers.etag || res.headers["last-modified"] || "");
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 = path7.join(os7.tmpdir(), `adhdev-providers-${Date.now()}.tar.gz`);
7719
- const tmpExtract = path7.join(os7.tmpdir(), `adhdev-providers-extract-${Date.now()}`);
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(path7.join(tmpExtract, d)).isDirectory() && d.startsWith("adhdev-providers")
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 = path7.join(tmpExtract, rootDir);
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((resolve10, reject) => {
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
- resolve10();
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 = path7.join(src, entry.name);
7804
- const destPath = path7.join(dest, entry.name);
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(path7.dirname(metaPath), { recursive: true });
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(path7.join(d, entry.name));
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(path7.join(candidate, "provider.json"))) return candidate;
7932
- const catDir = path7.join(root, cat);
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 = path7.join(catDir, entry.name, "provider.json");
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 path7.join(catDir, entry.name);
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 = path7.join(dir, "scripts.js");
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 = path7.join(dir, file);
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 = path7.join(d, "provider.json");
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 = path7.join(d, "scripts.js");
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(path7.join(d, entry.name));
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((resolve10) => {
8011
+ return new Promise((resolve9) => {
8152
8012
  const server = net.createServer();
8153
8013
  server.unref();
8154
- server.on("error", () => resolve10(false));
8014
+ server.on("error", () => resolve9(false));
8155
8015
  server.listen(port, "127.0.0.1", () => {
8156
- server.close(() => resolve10(true));
8016
+ server.close(() => resolve9(true));
8157
8017
  });
8158
8018
  });
8159
8019
  }
8160
8020
  async function isCdpActive(port) {
8161
- return new Promise((resolve10) => {
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
- resolve10(!!info["WebKit-Version"] || !!info["Browser"]);
8030
+ resolve9(!!info["WebKit-Version"] || !!info["Browser"]);
8171
8031
  } catch {
8172
- resolve10(false);
8032
+ resolve9(false);
8173
8033
  }
8174
8034
  });
8175
8035
  });
8176
- req.on("error", () => resolve10(false));
8036
+ req.on("error", () => resolve9(false));
8177
8037
  req.on("timeout", () => {
8178
8038
  req.destroy();
8179
- resolve10(false);
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 = path8.join(
8299
- process.env.APPDATA || path8.join(os8.homedir(), "AppData", "Roaming"),
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 path9 = __toESM(require("path"));
8332
+ var path8 = __toESM(require("path"));
8475
8333
  var os9 = __toESM(require("os"));
8476
- var LOG_DIR2 = process.platform === "win32" ? path9.join(process.env.LOCALAPPDATA || process.env.APPDATA || path9.join(os9.homedir(), "AppData", "Local"), "adhdev", "logs") : process.platform === "darwin" ? path9.join(os9.homedir(), "Library", "Logs", "adhdev") : path9.join(os9.homedir(), ".local", "share", "adhdev", "logs");
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 = path9.join(LOG_DIR2, `commands-${currentDate2}.jsonl`);
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 = path9.join(LOG_DIR2, `commands-${currentDate2}.jsonl`);
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(path9.join(LOG_DIR2, file));
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
- let next = appendWorkspaceActivity(loadConfig(), resolvedWorkspace, {
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 path16 = require("path");
8687
+ const path15 = require("path");
8846
8688
  const fs12 = require("fs");
8847
- const pidFile = path16.join(process.env.HOME || process.env.USERPROFILE || "", ".adhdev", "daemon.pid");
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 live = sessions.filter((session) => !session.parentId && session.status !== "stopped").map((session) => {
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 seen = new Set(live.map((item) => `${item.kind}:${item.providerType}:${item.workspace || ""}`));
9033
- const persisted = recentActivity.filter((item) => !seen.has(`${item.kind}:${item.providerType}:${item.workspace || ""}`)).map((item) => {
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 path11 = __toESM(require("path"));
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((resolve10) => {
9992
- this.permissionResolvers.push(resolve10);
9844
+ const approved = await new Promise((resolve9) => {
9845
+ this.permissionResolvers.push(resolve9);
9993
9846
  setTimeout(() => {
9994
- const idx = this.permissionResolvers.indexOf(resolve10);
9847
+ const idx = this.permissionResolvers.indexOf(resolve9);
9995
9848
  if (idx >= 0) {
9996
9849
  this.permissionResolvers.splice(idx, 1);
9997
- resolve10(false);
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()) : path11.resolve(trimmed);
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 path12 = __toESM(require("path"));
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 = path12.join(os14.homedir(), ".adhdev", "version-history.json");
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(path12.dirname(ARCHIVE_PATH), { recursive: true });
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(path12.sep).pop() || "");
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 = path12.join(appPath, "Contents", "Info.plist");
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 = path12.join(appPath, "Contents", "Resources", "app", "bin", provider.cli || "");
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 path15 = __toESM(require("path"));
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 path13 = __toESM(require("path"));
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 = path13.join(dir, "scripts.js");
12252
+ const directScripts = path12.join(dir, "scripts.js");
12430
12253
  if (fs9.existsSync(directScripts)) {
12431
12254
  scriptsPath = directScripts;
12432
12255
  } else {
12433
- const scriptsDir = path13.join(dir, "scripts");
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(path13.join(scriptsDir, d)).isDirectory();
12259
+ return fs9.statSync(path12.join(scriptsDir, d)).isDirectory();
12437
12260
  }).sort().reverse();
12438
12261
  for (const ver of versions) {
12439
- const p = path13.join(scriptsDir, ver, "scripts.js");
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 path14 = __toESM(require("path"));
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(path14.join(scriptsDir, d)).isDirectory();
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 path14.join(scriptsDir, versions[0]);
13343
+ return path13.join(scriptsDir, versions[0]);
13521
13344
  }
13522
13345
  function resolveAutoImplWritableProviderDir(ctx, category, type, requestedDir) {
13523
- const canonicalUserDir = path14.resolve(ctx.providerLoader.getUserProviderDir(category, type));
13524
- const desiredDir = requestedDir ? path14.resolve(requestedDir) : canonicalUserDir;
13525
- const upstreamRoot = path14.resolve(ctx.providerLoader.getUpstreamDir());
13526
- if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${path14.sep}`)) {
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 (path14.basename(desiredDir) !== type) {
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(path14.dirname(desiredDir), { recursive: true });
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 = path14.join(desiredDir, "provider.json");
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 = path14.join(refDir, "scripts");
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(path14.join(latestDir, file), "utf-8");
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 = path14.join(os15.tmpdir(), "adhdev-autoimpl");
13444
+ const tmpDir = path13.join(os15.tmpdir(), "adhdev-autoimpl");
13622
13445
  if (!fs10.existsSync(tmpDir)) fs10.mkdirSync(tmpDir, { recursive: true });
13623
- const promptFile = path14.join(tmpDir, `prompt-${type}-${Date.now()}.md`);
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 = path14.join(providerDir, "scripts");
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(path14.join(latestScriptsDir, file), "utf-8");
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(path14.join(latestScriptsDir, file), "utf-8");
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 = path14.join(providerDir, "../../docs");
13886
+ const docsDir = path13.join(providerDir, "../../docs");
14064
13887
  const loadGuide = (name) => {
14065
13888
  try {
14066
- const p = path14.join(docsDir, name);
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 = path14.join(providerDir, "scripts");
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(path14.join(latestScriptsDir, file), "utf-8");
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(path14.join(latestScriptsDir, file), "utf-8");
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 = path14.join(providerDir, "../../docs");
14124
+ const docsDir = path13.join(providerDir, "../../docs");
14302
14125
  const loadGuide = (name) => {
14303
14126
  try {
14304
- const p = path14.join(docsDir, name);
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 path16 = typeof r.pattern === "string" ? r.pattern : r.pattern.source.replace(/\\\//g, "/").replace(/\(\[.*?\]\+\)/g, ":type").replace(/[\^$]/g, "");
14563
- return `${r.method.padEnd(5)} ${path16}`;
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((resolve10, reject) => {
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
- resolve10();
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
- resolve10();
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((resolve10) => {
14508
+ await new Promise((resolve9) => {
14686
14509
  const timer = setTimeout(() => {
14687
14510
  child.kill();
14688
- resolve10();
14511
+ resolve9();
14689
14512
  }, 3e3);
14690
14513
  child.on("exit", () => {
14691
14514
  clearTimeout(timer);
14692
- resolve10();
14515
+ resolve9();
14693
14516
  });
14694
14517
  child.stdout?.once("data", () => {
14695
14518
  setTimeout(() => {
14696
14519
  child.kill();
14697
14520
  clearTimeout(timer);
14698
- resolve10();
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
- path15.resolve(__dirname, "../../web-devconsole/dist"),
14846
- path15.resolve(__dirname, "../../../web-devconsole/dist"),
14847
- path15.join(process.cwd(), "packages/web-devconsole/dist")
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(path15.join(dir, "index.html"))) return dir;
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 = path15.join(distDir, "index.html");
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 = path15.normalize(pathname).replace(/^\.\.\//, "");
14886
- const filePath = path15.join(distDir, safePath);
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 = path15.extname(filePath);
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(path15.join(d, entry.name), rel);
14829
+ scan(path14.join(d, entry.name), rel);
15007
14830
  } else {
15008
- const stat = fs11.statSync(path15.join(d, entry.name));
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 = path15.resolve(dir, path15.normalize(filePath));
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 = path15.resolve(dir, path15.normalize(filePath));
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(path15.dirname(fullPath), { recursive: true });
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 = path15.join(dir, name);
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(path15.join(dir, "scripts.js")) ? "scripts.js" : "provider.json";
15102
- const targetPath = path15.join(dir, target);
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((resolve10) => {
15030
+ await new Promise((resolve9) => {
15208
15031
  const timer = setTimeout(() => {
15209
15032
  child.kill();
15210
- resolve10();
15033
+ resolve9();
15211
15034
  }, timeout);
15212
15035
  child.on("exit", () => {
15213
15036
  clearTimeout(timer);
15214
- resolve10();
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 = path15.join(targetDir, "provider.json");
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 = path15.join(targetDir, relPath);
15275
- fs11.mkdirSync(path15.dirname(fullPath), { recursive: true });
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(path15.join(scriptsDir, d)).isDirectory();
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 path15.join(scriptsDir, versions[0]);
15157
+ return path14.join(scriptsDir, versions[0]);
15335
15158
  }
15336
15159
  resolveAutoImplWritableProviderDir(category, type, requestedDir) {
15337
- const canonicalUserDir = path15.resolve(this.providerLoader.getUserProviderDir(category, type));
15338
- const desiredDir = requestedDir ? path15.resolve(requestedDir) : canonicalUserDir;
15339
- const upstreamRoot = path15.resolve(this.providerLoader.getUpstreamDir());
15340
- if (desiredDir === upstreamRoot || desiredDir.startsWith(`${upstreamRoot}${path15.sep}`)) {
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 (path15.basename(desiredDir) !== type) {
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(path15.dirname(desiredDir), { recursive: true });
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 = path15.join(desiredDir, "provider.json");
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 = path15.join(providerDir, "scripts");
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(path15.join(latestScriptsDir, file), "utf-8");
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(path15.join(latestScriptsDir, file), "utf-8");
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 = path15.join(providerDir, "../../docs");
15295
+ const docsDir = path14.join(providerDir, "../../docs");
15473
15296
  const loadGuide = (name) => {
15474
15297
  try {
15475
- const p = path15.join(docsDir, name);
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 = path15.join(providerDir, "scripts");
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(path15.join(latestScriptsDir, file), "utf-8");
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(path15.join(latestScriptsDir, file), "utf-8");
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 = path15.join(providerDir, "../../docs");
15533
+ const docsDir = path14.join(providerDir, "../../docs");
15711
15534
  const loadGuide = (name) => {
15712
15535
  try {
15713
- const p = path15.join(docsDir, name);
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((resolve10) => {
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
- resolve10(JSON.parse(body));
15698
+ resolve9(JSON.parse(body));
15876
15699
  } catch {
15877
- resolve10({});
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((resolve10) => setTimeout(resolve10, STARTUP_POLL_MS));
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((resolve10) => {
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
- resolve10({
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((resolve10) => {
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
- resolve10({
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
- resolve10({
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,