@comecaramelos/dsh-chrome-mcp 1.0.0 → 2.0.0

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 (172) hide show
  1. package/README.md +44 -39
  2. package/lib/client.js +2186 -614
  3. package/lib/client.js.map +4 -4
  4. package/lib/host/apply.d.ts +38 -1
  5. package/lib/host/apply.d.ts.map +1 -1
  6. package/lib/host/apply.js +43 -17
  7. package/lib/host/apply.js.map +1 -1
  8. package/lib/host/bridge.d.ts +28 -19
  9. package/lib/host/bridge.d.ts.map +1 -1
  10. package/lib/host/bridge.js +71 -79
  11. package/lib/host/bridge.js.map +1 -1
  12. package/lib/host/catalog.d.ts +2 -2
  13. package/lib/host/catalog.js +2 -2
  14. package/lib/host/commands/chrome-path.d.ts +4 -0
  15. package/lib/host/commands/chrome-path.d.ts.map +1 -0
  16. package/lib/host/commands/chrome-path.js +65 -0
  17. package/lib/host/commands/chrome-path.js.map +1 -0
  18. package/lib/host/commands/chrome-refresh.d.ts +17 -0
  19. package/lib/host/commands/chrome-refresh.d.ts.map +1 -0
  20. package/lib/host/commands/chrome-refresh.js +37 -0
  21. package/lib/host/commands/chrome-refresh.js.map +1 -0
  22. package/lib/host/commands/index.d.ts +26 -0
  23. package/lib/host/commands/index.d.ts.map +1 -0
  24. package/lib/host/commands/index.js +41 -0
  25. package/lib/host/commands/index.js.map +1 -0
  26. package/lib/host/constants.d.ts +107 -30
  27. package/lib/host/constants.d.ts.map +1 -1
  28. package/lib/host/constants.js +107 -30
  29. package/lib/host/constants.js.map +1 -1
  30. package/lib/host/controller/_trace.d.ts +3 -0
  31. package/lib/host/controller/_trace.d.ts.map +1 -0
  32. package/lib/host/controller/_trace.js +14 -0
  33. package/lib/host/controller/_trace.js.map +1 -0
  34. package/lib/host/controller/bridge-run.d.ts +4 -2
  35. package/lib/host/controller/bridge-run.d.ts.map +1 -1
  36. package/lib/host/controller/bridge-run.js +24 -8
  37. package/lib/host/controller/bridge-run.js.map +1 -1
  38. package/lib/host/controller/captures.d.ts +9 -16
  39. package/lib/host/controller/captures.d.ts.map +1 -1
  40. package/lib/host/controller/captures.js +73 -48
  41. package/lib/host/controller/captures.js.map +1 -1
  42. package/lib/host/controller/commits.d.ts +2 -2
  43. package/lib/host/controller/commits.d.ts.map +1 -1
  44. package/lib/host/controller/commits.js +97 -41
  45. package/lib/host/controller/commits.js.map +1 -1
  46. package/lib/host/controller/connections.d.ts +38 -0
  47. package/lib/host/controller/connections.d.ts.map +1 -0
  48. package/lib/host/controller/connections.js +71 -0
  49. package/lib/host/controller/connections.js.map +1 -0
  50. package/lib/host/controller/controller.d.ts +19 -24
  51. package/lib/host/controller/controller.d.ts.map +1 -1
  52. package/lib/host/controller/controller.js +181 -114
  53. package/lib/host/controller/controller.js.map +1 -1
  54. package/lib/host/controller/index.d.ts +18 -14
  55. package/lib/host/controller/index.d.ts.map +1 -1
  56. package/lib/host/controller/index.js +16 -14
  57. package/lib/host/controller/index.js.map +1 -1
  58. package/lib/host/controller/notes.d.ts +9 -9
  59. package/lib/host/controller/notes.d.ts.map +1 -1
  60. package/lib/host/controller/notes.js +16 -21
  61. package/lib/host/controller/notes.js.map +1 -1
  62. package/lib/host/controller/persist.d.ts +10 -3
  63. package/lib/host/controller/persist.d.ts.map +1 -1
  64. package/lib/host/controller/persist.js +89 -42
  65. package/lib/host/controller/persist.js.map +1 -1
  66. package/lib/host/controller/publish.d.ts +4 -0
  67. package/lib/host/controller/publish.d.ts.map +1 -0
  68. package/lib/host/controller/publish.js +56 -0
  69. package/lib/host/controller/publish.js.map +1 -0
  70. package/lib/host/controller/runs.d.ts +34 -10
  71. package/lib/host/controller/runs.d.ts.map +1 -1
  72. package/lib/host/controller/runs.js +241 -58
  73. package/lib/host/controller/runs.js.map +1 -1
  74. package/lib/host/controller/state.d.ts +122 -20
  75. package/lib/host/controller/state.d.ts.map +1 -1
  76. package/lib/host/controller/windows-run.d.ts +10 -2
  77. package/lib/host/controller/windows-run.d.ts.map +1 -1
  78. package/lib/host/controller/windows-run.js +66 -35
  79. package/lib/host/controller/windows-run.js.map +1 -1
  80. package/lib/host/discovery/candidates.d.ts +23 -13
  81. package/lib/host/discovery/candidates.d.ts.map +1 -1
  82. package/lib/host/discovery/candidates.js +20 -8
  83. package/lib/host/discovery/candidates.js.map +1 -1
  84. package/lib/host/discovery/index.d.ts +1 -0
  85. package/lib/host/discovery/index.d.ts.map +1 -1
  86. package/lib/host/discovery/index.js +1 -0
  87. package/lib/host/discovery/index.js.map +1 -1
  88. package/lib/host/discovery/probe.d.ts +16 -5
  89. package/lib/host/discovery/probe.d.ts.map +1 -1
  90. package/lib/host/discovery/probe.js +68 -10
  91. package/lib/host/discovery/probe.js.map +1 -1
  92. package/lib/host/discovery/scan.d.ts +14 -9
  93. package/lib/host/discovery/scan.d.ts.map +1 -1
  94. package/lib/host/discovery/scan.js +56 -30
  95. package/lib/host/discovery/scan.js.map +1 -1
  96. package/lib/host/flags.d.ts +28 -5
  97. package/lib/host/flags.d.ts.map +1 -1
  98. package/lib/host/flags.js +75 -7
  99. package/lib/host/flags.js.map +1 -1
  100. package/lib/host/kind.d.ts +45 -0
  101. package/lib/host/kind.d.ts.map +1 -0
  102. package/lib/host/kind.js +251 -0
  103. package/lib/host/kind.js.map +1 -0
  104. package/lib/host/manager.d.ts +21 -0
  105. package/lib/host/manager.d.ts.map +1 -0
  106. package/lib/host/manager.js +113 -0
  107. package/lib/host/manager.js.map +1 -0
  108. package/lib/host/migration.d.ts +26 -0
  109. package/lib/host/migration.d.ts.map +1 -0
  110. package/lib/host/migration.js +127 -0
  111. package/lib/host/migration.js.map +1 -0
  112. package/lib/host/plugin-meta.d.ts +12 -3
  113. package/lib/host/plugin-meta.d.ts.map +1 -1
  114. package/lib/host/plugin-meta.js +13 -4
  115. package/lib/host/plugin-meta.js.map +1 -1
  116. package/lib/host/schema.d.ts +301 -247
  117. package/lib/host/schema.d.ts.map +1 -1
  118. package/lib/host/schema.js +145 -120
  119. package/lib/host/schema.js.map +1 -1
  120. package/lib/host/settings.d.ts +22 -3
  121. package/lib/host/settings.d.ts.map +1 -1
  122. package/lib/host/settings.js +81 -60
  123. package/lib/host/settings.js.map +1 -1
  124. package/lib/host/status.d.ts +7 -10
  125. package/lib/host/status.d.ts.map +1 -1
  126. package/lib/host/status.js +8 -23
  127. package/lib/host/status.js.map +1 -1
  128. package/lib/host/tool.d.ts +13 -7
  129. package/lib/host/tool.d.ts.map +1 -1
  130. package/lib/host/tool.js +4 -3
  131. package/lib/host/tool.js.map +1 -1
  132. package/lib/host/types/config.d.ts +66 -12
  133. package/lib/host/types/config.d.ts.map +1 -1
  134. package/lib/host/types/executable.d.ts +8 -3
  135. package/lib/host/types/executable.d.ts.map +1 -1
  136. package/lib/host/types/index.d.ts +5 -4
  137. package/lib/host/types/index.d.ts.map +1 -1
  138. package/lib/host/types/services.d.ts +26 -0
  139. package/lib/host/types/services.d.ts.map +1 -0
  140. package/lib/host/types/services.js +9 -0
  141. package/lib/host/types/services.js.map +1 -0
  142. package/lib/host/types/settings.d.ts +118 -65
  143. package/lib/host/types/settings.d.ts.map +1 -1
  144. package/lib/host/types/stderr.d.ts +3 -5
  145. package/lib/host/types/stderr.d.ts.map +1 -1
  146. package/lib/host/values.d.ts +152 -37
  147. package/lib/host/values.d.ts.map +1 -1
  148. package/lib/host/values.js +304 -112
  149. package/lib/host/values.js.map +1 -1
  150. package/lib/host/windows/connect-flags.d.ts +19 -8
  151. package/lib/host/windows/connect-flags.d.ts.map +1 -1
  152. package/lib/host/windows/connect-flags.js +50 -20
  153. package/lib/host/windows/connect-flags.js.map +1 -1
  154. package/lib/host/windows/index.d.ts +1 -1
  155. package/lib/host/windows/index.d.ts.map +1 -1
  156. package/lib/host/windows/index.js +1 -1
  157. package/lib/host/windows/index.js.map +1 -1
  158. package/lib/host/windows/paths.d.ts +27 -6
  159. package/lib/host/windows/paths.d.ts.map +1 -1
  160. package/lib/host/windows/paths.js +40 -13
  161. package/lib/host/windows/paths.js.map +1 -1
  162. package/lib/host/windows/run.d.ts.map +1 -1
  163. package/lib/host/windows/run.js +3 -2
  164. package/lib/host/windows/run.js.map +1 -1
  165. package/lib/index.d.ts +72 -56
  166. package/lib/index.d.ts.map +1 -1
  167. package/lib/index.js +74 -55
  168. package/lib/index.js.map +1 -1
  169. package/locale/en.json +6 -0
  170. package/locale/zh.json +6 -0
  171. package/package.json +35 -14
  172. package/cordis.patch.yml +0 -5
@@ -8,18 +8,43 @@
8
8
  * seeded. A `probe` is the follow-up probe of the selection that answers the
9
9
  * version line the card shows; the Windows Chrome run shares this same
10
10
  * one-run-at-a-time chain.
11
+ *
12
+ * Since the component model there is no bridge of this row's own to restart:
13
+ * an executable or flag change changes what a future `resolve` would answer,
14
+ * and what is running today keeps running until the manager's pool says
15
+ * otherwise — so the drift paths re-mirror the default and hand the live
16
+ * connections that follow it back to the pool (./connections.ts).
11
17
  */
12
- import { bridgeConfig } from "../bridge.js";
13
- import { entryIds, mergeEntries, normalizeEntries } from "../catalog.js";
18
+ import { AsyncResource } from "node:async_hooks";
19
+ import { entryIds, mergeEntries } from "../catalog.js";
20
+ import { DISCOVERY_RETRY_DELAY_MS, DISCOVERY_RETRY_MAX, ERROR_CAP, KIND_FIELDS, KIND_ID_WINDOWS } from "../constants.js";
14
21
  import { checkChrome, chromeExecutableCandidates, scanChromeExecutables } from "../discovery/index.js";
15
- import { flagsSkipCheck } from "../flags.js";
22
+ import { flagsSkipCheck, flagsSkipProbe } from "../flags.js";
16
23
  import { firstLine, isChromeMissing } from "../status.js";
17
24
  import { windowsChromeUrl } from "../windows/index.js";
18
- import { readPersistedCustomPaths } from "../values.js";
19
- import { configForBridge, restartBridge } from "./bridge-run.js";
20
- import { noteSelection, noteStderr } from "./notes.js";
21
- import { persistChromePath, persistExecutables } from "./persist.js";
22
- import { runWindowsChrome } from "./windows-run.js";
25
+ import { readDroppedExecutables, readPersistedCustomPaths, readSavedExecutables, resolveSelection } from "../values.js";
26
+ import { invalidateOwnedForField } from "./connections.js";
27
+ import { noteSelection } from "./notes.js";
28
+ import { persistChromePath, persistDroppedExecutables, persistExecutables } from "./persist.js";
29
+ import { publishLive } from "./publish.js";
30
+ import { prelaunchWindowsForConnection, runWindowsChrome } from "./windows-run.js";
31
+ /**
32
+ * The runs answer from a neutral async context, never from the one that
33
+ * scheduled them. A form commit is a config **write** — and the commit handler
34
+ * runs synchronously inside the HMR write transaction it opened. A run
35
+ * scheduled from that handler inherits the transaction's async-local store
36
+ * through the promise continuation, so every follow-up config write the run
37
+ * answers — the seeded `chromePath`, the merged executable rows, the
38
+ * connect-mode flag — reads as a *nested* transaction, which HMR refuses
39
+ * outright ("HMR transactions cannot be nested", measured live 2026-10-12):
40
+ * the run settles, the mirror says `connected`, and the write-back silently
41
+ * never lands. This resource carries no async context of its own, so binding
42
+ * the run body to it starts the whole chain clean; the same write queues
43
+ * normally behind the transaction that is no longer open. (The option that drops
44
+ * the context predates the typed surface of `AsyncResourceOptions`.)
45
+ */
46
+ const contextlessOptions = { keepAsyncContext: false };
47
+ const runContext = new AsyncResource("dsh-chrome-mcp run", contextlessOptions);
23
48
  /** Element-wise equality of two saved-row lists (order is the dropdown order). */
24
49
  export function sameEntries(a, b) {
25
50
  if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
@@ -33,19 +58,19 @@ export function sameEntries(a, b) {
33
58
  * missing, and the result lands in the persisted rows instead of staying
34
59
  * readable forever as a second source.
35
60
  */
36
- export function mergeLegacyPaths(controller) {
61
+ export function mergeLegacyPaths(controller, skip) {
37
62
  const { state } = controller;
38
63
  if (state.legacyPathsMerged)
39
64
  return state.runningExecutables;
40
65
  state.legacyPathsMerged = true;
41
- const legacy = readPersistedCustomPaths(controller.ctx);
66
+ const legacy = readPersistedCustomPaths(state.source());
42
67
  if (legacy.length === 0)
43
68
  return state.runningExecutables;
44
- const merged = mergeEntries(state.runningExecutables, legacy);
69
+ const merged = mergeEntries(state.runningExecutables, skip === void 0 ? legacy : legacy.filter((id) => !skip.has(id)));
45
70
  if (merged.changed) {
46
71
  state.runningExecutables = merged.entries;
47
72
  void persistExecutables(controller, merged.entries);
48
- controller.ctx.logger.info(`chrome-devtools-mcp(${controller.config.serverName}): folded ${String(legacy.length)} saved path(s) from the legacy chromeCustomPaths list into the executable rows`);
73
+ controller.ctx.logger.info(`dsh-chrome-mcp(${controller.config.serverName}): folded ${String(legacy.length)} saved path(s) from the legacy chromeCustomPaths list into the executable rows`);
49
74
  }
50
75
  return state.runningExecutables;
51
76
  }
@@ -62,47 +87,93 @@ export function mergeLegacyPaths(controller) {
62
87
  */
63
88
  export async function runExecutableDiscovery(controller) {
64
89
  const { state } = controller;
65
- const live = state.source();
90
+ const layers = state.source();
66
91
  // Rows are user-authored; re-normalize on every read (the client writes them
67
92
  // in one shot, so the shape it hands may be anything).
68
- const stored = normalizeEntries(live.executables);
93
+ const stored = readSavedExecutables(layers);
94
+ // An id the stored list has lost since the last run rode the run that is
95
+ // reading it now — and a found path re-folds into the rows on every merge
96
+ // step, so a deleted row would stand straight back up behind its own
97
+ // deletion (measured live 2026-10-12: the (x86) Windows-executable row read
98
+ // as a delete that never landed). What stands dropped lives in
99
+ // `droppedExecutables` and no merge step folds it back; an id the list
100
+ // carries again clears its record.
101
+ const storedIds = new Set(entryIds(stored));
102
+ const deleted = readDroppedExecutables(layers);
103
+ const skipIds = new Set(deleted);
104
+ for (const id of entryIds(state.runningExecutables)) {
105
+ if (!storedIds.has(id))
106
+ skipIds.add(id);
107
+ }
108
+ for (const id of deleted) {
109
+ if (storedIds.has(id))
110
+ skipIds.delete(id);
111
+ }
112
+ if (skipIds.size !== deleted.length || !deleted.every((id) => skipIds.has(id))) {
113
+ void persistDroppedExecutables(controller, [...skipIds]);
114
+ }
69
115
  const storedChanged = !sameEntries(stored, state.runningExecutables);
70
- state.runningExecutables = storedChanged ? stored : mergeLegacyPaths(controller);
116
+ state.runningExecutables = storedChanged ? stored : mergeLegacyPaths(controller, skipIds);
71
117
  const savedIds = entryIds(state.runningExecutables);
72
- const candidates = chromeExecutableCandidates(controller.config, savedIds, state.runningChromePath);
118
+ // What the profile configures, what this host carries (the Windows-side
119
+ // executables a WSL host reaches through the interop mount — offered, never
120
+ // probed), what the rows saved, and what the bridge runs.
121
+ const candidates = chromeExecutableCandidates(controller.config, savedIds, state.runningChromePath, controller.windowsExecutables());
73
122
  let statuses = [];
74
123
  try {
75
124
  statuses = await scanChromeExecutables(candidates, controller.blockedForPlatform);
76
125
  }
77
126
  catch (error) {
78
- controller.ctx.logger.warn(`chrome-devtools-mcp(${controller.config.serverName}): executable run failed: ${String(error)}`);
127
+ controller.ctx.logger.warn(`dsh-chrome-mcp(${controller.config.serverName}): executable run failed: ${String(error)}`);
79
128
  }
80
- state.entry.executableStatus = statuses;
129
+ state.live.executableStatus = statuses;
81
130
  // A found path that is not a row yet becomes one, nameless; a row the user
82
131
  // named keeps that name. A path that vanished is dropped by the scan and so
83
- // stops being offered — the reference's "Fetch executables" rule.
84
- const merged = mergeEntries(state.runningExecutables, statuses.map((status) => status.path));
132
+ // stops being offered — the reference's "Fetch executables" rule. A path the
133
+ // user dropped answers too (a located Windows executable keeps answering
134
+ // forever) and must not be folded back.
135
+ const merged = mergeEntries(state.runningExecutables, statuses.map((status) => status.path).filter((path) => !skipIds.has(path)));
85
136
  if (merged.changed) {
86
137
  state.runningExecutables = merged.entries;
87
138
  void persistExecutables(controller, merged.entries);
88
139
  }
89
140
  if (state.runningChromePath === "") {
90
141
  const seeded = statuses.find((status) => status.version !== "" && status.error === "");
91
- if (seeded !== void 0 && !flagsSkipCheck(state.runningFlags)) {
92
- // Seeding is a selection change like any other: the bridge has to
93
- // restart carrying it, otherwise the card would claim a path the
94
- // running argv does not carry.
95
- controller.ctx.logger.info(`chrome-devtools-mcp(${controller.config.serverName}): no executable configured — seeding chromePath = ${seeded.path} (found by scan)`);
142
+ if (seeded !== void 0 && !flagsSkipProbe(state.runningFlags)) {
143
+ // Seeding is a selection change like any other: it follows the same
144
+ // drift path a pick takes, otherwise the card would claim a path no
145
+ // answer launches with.
146
+ controller.ctx.logger.info(`dsh-chrome-mcp(${controller.config.serverName}): no executable configured — seeding chromePath = ${seeded.path} (found by scan)`);
96
147
  state.seededPath = seeded.path;
97
148
  void persistChromePath(controller, seeded.path);
98
149
  // Already inside this run: the status list above already carries the
99
150
  // seeded path's own answer, so no follow-up run.
100
151
  applyChromePath(controller, seeded.path, "selected", false);
101
152
  }
102
- else if (candidates.length > 0 && !flagsSkipCheck(state.runningFlags) && statuses.every((status) => status.error !== "" || status.version === "")) {
103
- // Nothing present at all: the known executable-missing state.
104
- state.entry.lastError = firstLine(`Chrome executable not found: no executable detected (checked: ${candidates.join(", ")})`);
105
- state.entry.chromeMissing = isChromeMissing(state.entry.lastError);
153
+ else if (candidates.length > 0 && !flagsSkipProbe(state.runningFlags) && statuses.every((status) => status.error !== "" || status.version === "")) {
154
+ // Nothing runnable at all: the known executable-missing state. A
155
+ // candidate that answered a note instead of a version says why —
156
+ // the one case is the Windows executable a WSL host cannot launch
157
+ // but drives through the **Prelaunch Windows Chrome** run — so the
158
+ // line names what to run instead of leaving a bare "not found".
159
+ const noted = statuses.find((status) => status.note !== "");
160
+ const detail = noted === void 0
161
+ ? `no executable detected (checked: ${candidates.join(", ")})`
162
+ : `no executable detected for this host (checked: ${candidates.join(", ")}); ${firstLine(noted.note)}`;
163
+ // The official troubleshooting advice for this state on a Linux
164
+ // host (docs/troubleshooting.md): nothing local answered, and the
165
+ // candidate list only knows where a `stable` install of this kernel
166
+ // lives — the line says what to do about it instead of leaving a
167
+ // bare "not found". On a WSL host the Windows side joins the answer
168
+ // as the **run**, never a launch: a Windows `chrome.exe` cannot be
169
+ // launched from WSL (see AGENTS.md, which is why the run exists).
170
+ const advice = noted === void 0 && controller.linuxHost
171
+ ? controller.wslHost
172
+ ? "; install Google Chrome inside the Linux environment, or run Prelaunch Windows Chrome to drive the Windows side (connect mode)"
173
+ : "; install Google Chrome inside the Linux environment (chrome-devtools-mcp never downloads one)"
174
+ : "";
175
+ state.live.lastError = firstLine(`Chrome executable not found: ${detail}${advice}`, ERROR_CAP + advice.length);
176
+ state.live.chromeMissing = isChromeMissing(state.live.lastError);
106
177
  }
107
178
  }
108
179
  noteSelection(controller);
@@ -120,88 +191,200 @@ export async function probeSelection(controller) {
120
191
  // answer for: the card mutes the pill and shows no version line for a probe
121
192
  // the host cannot run.
122
193
  if (flagsSkipCheck(state.runningFlags)) {
123
- state.entry.chromeVersion = "";
194
+ state.live.chromeVersion = "";
195
+ publishLive(controller);
124
196
  return "";
125
197
  }
126
198
  if (state.runningChromePath === "") {
127
- state.entry.chromeVersion = "";
199
+ state.live.chromeVersion = "";
200
+ publishLive(controller);
128
201
  return "";
129
202
  }
130
203
  try {
131
204
  const version = await checkChrome({ ...controller.config, extraFlags: state.runningFlags, chromePath: state.runningChromePath }, state.runningFlags, controller.blockedForPlatform);
132
- state.entry.chromeVersion = version;
205
+ state.live.chromeVersion = version;
133
206
  if (version !== "") {
134
- state.entry.lastError = "";
135
- state.entry.chromeMissing = false;
207
+ state.live.lastError = "";
208
+ state.live.chromeMissing = false;
136
209
  }
210
+ publishLive(controller);
137
211
  return version;
138
212
  }
139
213
  catch (error) {
140
- state.entry.lastError = firstLine(error instanceof Error ? error.message : String(error));
214
+ state.live.lastError = firstLine(error instanceof Error ? error.message : String(error));
141
215
  // A failed probe says nothing about the version: keep no stale answer
142
216
  // behind the error.
143
- state.entry.chromeVersion = "";
144
- state.entry.chromeMissing = isChromeMissing(state.entry.lastError);
145
- controller.ctx.logger.warn(`chrome-devtools-mcp(${controller.config.serverName}): executable probe failed: ${state.entry.lastError}`);
217
+ state.live.chromeVersion = "";
218
+ state.live.chromeMissing = isChromeMissing(state.live.lastError);
219
+ publishLive(controller);
220
+ controller.ctx.logger.warn(`dsh-chrome-mcp(${controller.config.serverName}): executable probe failed: ${state.live.lastError}`);
146
221
  return "";
147
222
  }
148
223
  }
149
224
  /**
150
- * Restart the bridge connection with a different executable selected — the argv
151
- * tail carries `--executablePath=<path>`, so unlike a flag change this one is
152
- * what the card's pill claims is running. `rerun` schedules the scan+probe that
153
- * follows a selection change; a caller that is already inside that run (the
154
- * seeding branch above) passes `false`.
225
+ * Write one executable selection through the Host write-back channel — the same
226
+ * persisted `chromePath` field every other surface reads — and re-fire the run
227
+ * behind it, the way the card's own selection commit does: a changed selection
228
+ * shifts the default answers (connections follow, the run re-runs), an
229
+ * unchanged write just re-probes. This is the command-side mirror of the
230
+ * picker — pill, command and catalog read and write one field — so a headless
231
+ * selection lands exactly where a GUI pick would.
232
+ */
233
+ export function selectChromePath(controller, path) {
234
+ return persistChromePath(controller, path).then(() => {
235
+ const { state } = controller;
236
+ // Layers read *after* the write: what the user layer answers is the
237
+ // written path — or, on a cleared write ("" = fall back to the row
238
+ // config), whatever the row config carries under it.
239
+ const selection = resolveSelection(state.source());
240
+ const nextChromePath = selection.path;
241
+ const nextSource = nextChromePath === "" ? "" : selection.source !== "" ? selection.source : "selected";
242
+ if (nextChromePath !== state.runningChromePath || nextSource !== state.runningChromeSource)
243
+ applyChromePath(controller, nextChromePath, nextSource);
244
+ else
245
+ queue(controller, "probe");
246
+ });
247
+ }
248
+ /**
249
+ * Carry a different executable into the live answers — the argv tail carries
250
+ * `--executablePath=<path>`, so unlike a flags edit this one is what the card's
251
+ * pill claims is running. What lives stands on is not restarted here: a
252
+ * connection that follows the row's default is handed back to the pool for a
253
+ * re-resolve, and one that picked its own executable was never following it.
254
+ * `rerun` schedules the scan+probe that follows a selection change; a caller
255
+ * that is already inside that run (the seeding branch above) passes `false`.
155
256
  */
156
257
  export function applyChromePath(controller, path, nextSource, rerun = true) {
157
258
  const { state } = controller;
158
259
  state.runningChromePath = path;
159
260
  state.runningChromeSource = nextSource;
261
+ state.live.runningNote = "";
160
262
  noteSelection(controller);
161
- controller.ctx.logger.info(`chrome-devtools-mcp(${controller.config.serverName}): executable → "${path || "(none)"}" (restarting the bridge connection)`);
162
- const built = bridgeConfig(configForBridge(controller, state.runningFlags), state.runningFlags, state.runningStderrMode);
163
- noteStderr(controller, built);
164
- restartBridge(controller, built, "executable update failed");
263
+ controller.ctx.logger.info(`dsh-chrome-mcp(${controller.config.serverName}): executable → "${path || "(none)"}" (the default answers shift with it)`);
264
+ invalidateOwnedForField(controller, KIND_FIELDS.executable);
165
265
  // A different executable reads a different machine: refresh the list and
166
266
  // probe what is now selected, so the pill's version is the new one's.
167
267
  if (rerun)
168
268
  queue(controller, "probe");
169
269
  }
270
+ /**
271
+ * The bounded retry of one FAILED executable run.
272
+ *
273
+ * The failure this answers is not "Chrome is not installed" — that answer is a
274
+ * settled result and re-probing it forever would just be churn. It is the
275
+ * host that is not ready *yet*: on a WSL boot the Windows executables arrive
276
+ * through the interop mount, and the first run can fire seconds before that
277
+ * mount answers, so what the run states — `chromeMissing`, the known
278
+ * executable-missing state — reads "no found" for a machine that is about to
279
+ * answer. Today nothing re-fires: the card states that answer until someone
280
+ * presses **Fetch** again. So a run that settles standing failed arms exactly
281
+ * one retry behind the delay, capped (`DISCOVERY_RETRY_MAX` retries per run
282
+ * chain, reset the moment a run stops failing), and cancelled with the
283
+ * instance.
284
+ *
285
+ * The rule that decides where the retry sits is the persistence of the known
286
+ * error: the retry never touches `lastError`/`chromeMissing` — it *re-runs the
287
+ * same run*, whose own answers already follow the evidence rule (the run clears
288
+ * those fields only through a probe that answered a version). So the retry
289
+ * cannot clobber what the user is already being told: either the later run finds
290
+ * the executable (its probe answers a version, which is exactly the evidence
291
+ * that clears the state), or it does not (the same answer re-states, still
292
+ * standing). Nothing else distinguishes them — which is why arming the retry is
293
+ * safe and why it arms only while the state stands.
294
+ */
295
+ function noteRunFailure(controller, statuses) {
296
+ const { state } = controller;
297
+ // Only a run that settled standing in the known executable-missing state is
298
+ // failed. And of those, the candidates that answered a platform *note* say
299
+ // why no run on this host will ever launch them (the one case is the Windows
300
+ // executable a WSL host drives through **Prelaunch Windows Chrome**) — that
301
+ // is a settled answer, not a host not ready yet, so a retry would answer the
302
+ // same note forever and is not armed.
303
+ const noteOnly = statuses.length > 0 && statuses.every((status) => status.note !== "");
304
+ if (state.live.chromeMissing !== true || noteOnly) {
305
+ state.retriesPending = 0;
306
+ return;
307
+ }
308
+ if (state.disposed)
309
+ return;
310
+ if (state.retryTimer !== void 0)
311
+ return;
312
+ if (state.retriesPending >= DISCOVERY_RETRY_MAX)
313
+ return;
314
+ state.retriesPending += 1;
315
+ state.retryTimer = setTimeout(() => {
316
+ state.retryTimer = void 0;
317
+ // Only while the failure still stands: an instance whose later run found
318
+ // the executable has nothing left to retry.
319
+ if (state.disposed || state.live.chromeMissing !== true)
320
+ return;
321
+ void queue(controller, "probe");
322
+ }, DISCOVERY_RETRY_DELAY_MS);
323
+ }
324
+ /** Cancel the pending bounded retry — what the instance's dispose calls. */
325
+ export function cancelDiscoveryRetry(controller) {
326
+ const { state } = controller;
327
+ if (state.retryTimer !== void 0) {
328
+ clearTimeout(state.retryTimer);
329
+ state.retryTimer = void 0;
330
+ }
331
+ }
170
332
  /**
171
333
  * Serialize one unit of work: a rows-only refresh, a run that also re-probes
172
334
  * what is selected, or the Windows Chrome launch. Windows runs share this chain
173
335
  * because the invariant is "one run at a time" — nothing about it interacts with
174
- * the local probe.
336
+ * the local probe. The body answers from a neutral async context (see
337
+ * `runContext`): a run scheduled from a form commit must not carry that
338
+ * commit's write transaction, or every write the run answers would be refused
339
+ * as a nested transaction.
175
340
  */
176
341
  export function queue(controller, kind) {
177
342
  const { state } = controller;
178
343
  state.runs = state.runs
179
- .then(async () => {
344
+ .then(runContext.bind(async () => {
180
345
  if (kind === "windows") {
181
346
  await runWindowsChrome(controller);
182
347
  }
183
348
  else {
184
- await runExecutableDiscovery(controller);
349
+ const statuses = await runExecutableDiscovery(controller);
185
350
  if (kind === "probe")
186
351
  await probeSelection(controller);
352
+ // A run that settled standing failed arms one bounded retry; a
353
+ // run that no longer stands failed resets the retry counter.
354
+ noteRunFailure(controller, statuses);
187
355
  }
188
- state.entry.executableDiscoveryRevision += 1;
189
- })
356
+ state.live.executableDiscoveryRevision += 1;
357
+ publishLive(controller);
358
+ }))
190
359
  .catch(() => { });
191
360
  return state.runs;
192
361
  }
193
362
  /**
194
363
  * One Windows Chrome run on demand: queued on the same chain as the button (one
195
- * run at a time), resolved once it settled. The answer is the base-layer mirror
196
- * read after the run — the tool surface says what `windowsChromeStatus` says,
197
- * never more than the run answered.
364
+ * run at a time), resolved once it settled. The answer is the live mirror read
365
+ * after the run — the tool surface says what `windowsChromeStatus` says, never
366
+ * more than the run answered.
367
+ *
368
+ * With the manager mounted this is also the surface that keeps the live
369
+ * `chrome-windows` connections honest: a run that connected while such a
370
+ * connection stands is a reason to answer that connection again (the run is
371
+ * idempotent — the live port rides into `currentFlags` — so re-answering is not
372
+ * a second browser), and a run that connected without one is said to be worth
373
+ * one.
198
374
  */
199
375
  export async function prelaunchWindowsChrome(controller) {
200
376
  const { state } = controller;
201
- await queue(controller, "windows");
202
- const status = state.entry.windowsChromeStatus;
377
+ await prelaunchWindowsForConnection(controller);
378
+ const status = state.live.windowsChromeStatus;
203
379
  if (status.state === "connected" && status.port > 0) {
204
- return `Windows Chrome connected at ${windowsChromeUrl(status.port)} — the bridge connects to it instead of launching one.`;
380
+ const url = windowsChromeUrl(status.port);
381
+ if (state.connections !== void 0) {
382
+ const windowsEntries = state.connections.entries().filter((entry) => entry.kind === KIND_ID_WINDOWS);
383
+ if (windowsEntries.length > 0)
384
+ return `Windows Chrome connected at ${url} — the manager's Windows Chrome connections stand live against it.`;
385
+ return `Windows Chrome connected at ${url}. No Windows Chrome connection exists yet — add one under the "Windows Chrome (WSL debug port)" kind, or use the Chrome connection kind with a "--browserUrl=${url}" flag.`;
386
+ }
387
+ return `Windows Chrome connected at ${url}. Without the MCP manager there is no connection to drive it — install the MCP manager bundle.`;
205
388
  }
206
389
  if (status.state === "not-applicable") {
207
390
  return "This host is not a WSL instance: there is no Windows-side browser here to drive.";
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/host/controller/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/host/controller/runs.ts"],"names":[],"mappings":"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"}