@comecaramelos/dsh-chrome-mcp 0.0.1 → 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 (214) hide show
  1. package/README.md +44 -95
  2. package/assets/dsh-chrome-mcp-social.png +0 -0
  3. package/assets/icon.svg +71 -0
  4. package/assets/prelaunch-windows-chrome.html +277 -0
  5. package/lib/client.js +3005 -568
  6. package/lib/client.js.map +7 -0
  7. package/lib/host/apply.d.ts +40 -0
  8. package/lib/host/apply.d.ts.map +1 -0
  9. package/lib/host/apply.js +57 -0
  10. package/lib/host/apply.js.map +1 -0
  11. package/lib/host/bridge.d.ts +74 -0
  12. package/lib/host/bridge.d.ts.map +1 -0
  13. package/lib/host/bridge.js +168 -0
  14. package/lib/host/bridge.js.map +1 -0
  15. package/lib/host/catalog.d.ts +31 -0
  16. package/lib/host/catalog.d.ts.map +1 -0
  17. package/lib/host/catalog.js +92 -0
  18. package/lib/host/catalog.js.map +1 -0
  19. package/lib/host/commands/chrome-path.d.ts +4 -0
  20. package/lib/host/commands/chrome-path.d.ts.map +1 -0
  21. package/lib/host/commands/chrome-path.js +65 -0
  22. package/lib/host/commands/chrome-path.js.map +1 -0
  23. package/lib/host/commands/chrome-refresh.d.ts +17 -0
  24. package/lib/host/commands/chrome-refresh.d.ts.map +1 -0
  25. package/lib/host/commands/chrome-refresh.js +37 -0
  26. package/lib/host/commands/chrome-refresh.js.map +1 -0
  27. package/lib/host/commands/index.d.ts +26 -0
  28. package/lib/host/commands/index.d.ts.map +1 -0
  29. package/lib/host/commands/index.js +41 -0
  30. package/lib/host/commands/index.js.map +1 -0
  31. package/lib/host/constants.d.ts +306 -0
  32. package/lib/host/constants.d.ts.map +1 -0
  33. package/lib/host/constants.js +319 -0
  34. package/lib/host/constants.js.map +1 -0
  35. package/lib/host/controller/_trace.d.ts +3 -0
  36. package/lib/host/controller/_trace.d.ts.map +1 -0
  37. package/lib/host/controller/_trace.js +14 -0
  38. package/lib/host/controller/_trace.js.map +1 -0
  39. package/lib/host/controller/bridge-run.d.ts +40 -0
  40. package/lib/host/controller/bridge-run.d.ts.map +1 -0
  41. package/lib/host/controller/bridge-run.js +85 -0
  42. package/lib/host/controller/bridge-run.js.map +1 -0
  43. package/lib/host/controller/captures.d.ts +15 -0
  44. package/lib/host/controller/captures.d.ts.map +1 -0
  45. package/lib/host/controller/captures.js +85 -0
  46. package/lib/host/controller/captures.js.map +1 -0
  47. package/lib/host/controller/commits.d.ts +4 -0
  48. package/lib/host/controller/commits.d.ts.map +1 -0
  49. package/lib/host/controller/commits.js +131 -0
  50. package/lib/host/controller/commits.js.map +1 -0
  51. package/lib/host/controller/connections.d.ts +38 -0
  52. package/lib/host/controller/connections.d.ts.map +1 -0
  53. package/lib/host/controller/connections.js +71 -0
  54. package/lib/host/controller/connections.js.map +1 -0
  55. package/lib/host/controller/controller.d.ts +35 -0
  56. package/lib/host/controller/controller.d.ts.map +1 -0
  57. package/lib/host/controller/controller.js +234 -0
  58. package/lib/host/controller/controller.js.map +1 -0
  59. package/lib/host/controller/index.d.ts +30 -0
  60. package/lib/host/controller/index.d.ts.map +1 -0
  61. package/lib/host/controller/index.js +27 -0
  62. package/lib/host/controller/index.js.map +1 -0
  63. package/lib/host/controller/notes.d.ts +26 -0
  64. package/lib/host/controller/notes.d.ts.map +1 -0
  65. package/lib/host/controller/notes.js +44 -0
  66. package/lib/host/controller/notes.js.map +1 -0
  67. package/lib/host/controller/persist.d.ts +16 -0
  68. package/lib/host/controller/persist.d.ts.map +1 -0
  69. package/lib/host/controller/persist.js +98 -0
  70. package/lib/host/controller/persist.js.map +1 -0
  71. package/lib/host/controller/publish.d.ts +4 -0
  72. package/lib/host/controller/publish.d.ts.map +1 -0
  73. package/lib/host/controller/publish.js +56 -0
  74. package/lib/host/controller/publish.js.map +1 -0
  75. package/lib/host/controller/runs.d.ts +80 -0
  76. package/lib/host/controller/runs.d.ts.map +1 -0
  77. package/lib/host/controller/runs.js +394 -0
  78. package/lib/host/controller/runs.js.map +1 -0
  79. package/lib/host/controller/state.d.ts +172 -0
  80. package/lib/host/controller/state.d.ts.map +1 -0
  81. package/lib/host/controller/state.js +2 -0
  82. package/lib/host/controller/state.js.map +1 -0
  83. package/lib/host/controller/windows-run.d.ts +17 -0
  84. package/lib/host/controller/windows-run.d.ts.map +1 -0
  85. package/lib/host/controller/windows-run.js +109 -0
  86. package/lib/host/controller/windows-run.js.map +1 -0
  87. package/lib/host/discovery/candidates.d.ts +47 -0
  88. package/lib/host/discovery/candidates.d.ts.map +1 -0
  89. package/lib/host/discovery/candidates.js +68 -0
  90. package/lib/host/discovery/candidates.js.map +1 -0
  91. package/lib/host/discovery/index.d.ts +19 -0
  92. package/lib/host/discovery/index.d.ts.map +1 -0
  93. package/lib/host/discovery/index.js +19 -0
  94. package/lib/host/discovery/index.js.map +1 -0
  95. package/lib/host/discovery/probe.d.ts +29 -0
  96. package/lib/host/discovery/probe.d.ts.map +1 -0
  97. package/lib/host/discovery/probe.js +155 -0
  98. package/lib/host/discovery/probe.js.map +1 -0
  99. package/lib/host/discovery/scan.d.ts +72 -0
  100. package/lib/host/discovery/scan.d.ts.map +1 -0
  101. package/lib/host/discovery/scan.js +195 -0
  102. package/lib/host/discovery/scan.js.map +1 -0
  103. package/lib/host/flags.d.ts +65 -0
  104. package/lib/host/flags.d.ts.map +1 -0
  105. package/lib/host/flags.js +186 -0
  106. package/lib/host/flags.js.map +1 -0
  107. package/lib/host/kind.d.ts +45 -0
  108. package/lib/host/kind.d.ts.map +1 -0
  109. package/lib/host/kind.js +251 -0
  110. package/lib/host/kind.js.map +1 -0
  111. package/lib/host/manager.d.ts +21 -0
  112. package/lib/host/manager.d.ts.map +1 -0
  113. package/lib/host/manager.js +113 -0
  114. package/lib/host/manager.js.map +1 -0
  115. package/lib/host/migration.d.ts +26 -0
  116. package/lib/host/migration.d.ts.map +1 -0
  117. package/lib/host/migration.js +127 -0
  118. package/lib/host/migration.js.map +1 -0
  119. package/lib/host/platform.d.ts +38 -0
  120. package/lib/host/platform.d.ts.map +1 -0
  121. package/lib/host/platform.js +64 -0
  122. package/lib/host/platform.js.map +1 -0
  123. package/lib/host/plugin-meta.d.ts +21 -0
  124. package/lib/host/plugin-meta.d.ts.map +1 -0
  125. package/lib/host/plugin-meta.js +21 -0
  126. package/lib/host/plugin-meta.js.map +1 -0
  127. package/lib/host/schema.d.ts +361 -0
  128. package/lib/host/schema.d.ts.map +1 -0
  129. package/lib/host/schema.js +196 -0
  130. package/lib/host/schema.js.map +1 -0
  131. package/lib/host/settings.d.ts +28 -0
  132. package/lib/host/settings.d.ts.map +1 -0
  133. package/lib/host/settings.js +91 -0
  134. package/lib/host/settings.js.map +1 -0
  135. package/lib/host/status.d.ts +25 -0
  136. package/lib/host/status.d.ts.map +1 -0
  137. package/lib/host/status.js +45 -0
  138. package/lib/host/status.js.map +1 -0
  139. package/lib/host/tool.d.ts +65 -0
  140. package/lib/host/tool.d.ts.map +1 -0
  141. package/lib/host/tool.js +52 -0
  142. package/lib/host/tool.js.map +1 -0
  143. package/lib/host/types/config.d.ts +101 -0
  144. package/lib/host/types/config.d.ts.map +1 -0
  145. package/lib/host/types/config.js +2 -0
  146. package/lib/host/types/config.js.map +1 -0
  147. package/lib/host/types/executable.d.ts +35 -0
  148. package/lib/host/types/executable.d.ts.map +1 -0
  149. package/lib/host/types/executable.js +9 -0
  150. package/lib/host/types/executable.js.map +1 -0
  151. package/lib/host/types/index.d.ts +24 -0
  152. package/lib/host/types/index.d.ts.map +1 -0
  153. package/lib/host/types/index.js +2 -0
  154. package/lib/host/types/index.js.map +1 -0
  155. package/lib/host/types/plugin.d.ts +38 -0
  156. package/lib/host/types/plugin.d.ts.map +1 -0
  157. package/lib/host/types/plugin.js +10 -0
  158. package/lib/host/types/plugin.js.map +1 -0
  159. package/lib/host/types/services.d.ts +26 -0
  160. package/lib/host/types/services.d.ts.map +1 -0
  161. package/lib/host/types/services.js +9 -0
  162. package/lib/host/types/services.js.map +1 -0
  163. package/lib/host/types/settings.d.ts +180 -0
  164. package/lib/host/types/settings.d.ts.map +1 -0
  165. package/lib/host/types/settings.js +2 -0
  166. package/lib/host/types/settings.js.map +1 -0
  167. package/lib/host/types/stderr.d.ts +51 -0
  168. package/lib/host/types/stderr.d.ts.map +1 -0
  169. package/lib/host/types/stderr.js +9 -0
  170. package/lib/host/types/stderr.js.map +1 -0
  171. package/lib/host/types/windows.d.ts +39 -0
  172. package/lib/host/types/windows.d.ts.map +1 -0
  173. package/lib/host/types/windows.js +9 -0
  174. package/lib/host/types/windows.js.map +1 -0
  175. package/lib/host/values.d.ts +204 -0
  176. package/lib/host/values.d.ts.map +1 -0
  177. package/lib/host/values.js +404 -0
  178. package/lib/host/values.js.map +1 -0
  179. package/lib/host/windows/connect-flags.d.ts +27 -0
  180. package/lib/host/windows/connect-flags.d.ts.map +1 -0
  181. package/lib/host/windows/connect-flags.js +97 -0
  182. package/lib/host/windows/connect-flags.js.map +1 -0
  183. package/lib/host/windows/index.d.ts +31 -0
  184. package/lib/host/windows/index.d.ts.map +1 -0
  185. package/lib/host/windows/index.js +30 -0
  186. package/lib/host/windows/index.js.map +1 -0
  187. package/lib/host/windows/landing.d.ts +47 -0
  188. package/lib/host/windows/landing.d.ts.map +1 -0
  189. package/lib/host/windows/landing.js +174 -0
  190. package/lib/host/windows/landing.js.map +1 -0
  191. package/lib/host/windows/link.d.ts +11 -0
  192. package/lib/host/windows/link.d.ts.map +1 -0
  193. package/lib/host/windows/link.js +52 -0
  194. package/lib/host/windows/link.js.map +1 -0
  195. package/lib/host/windows/paths.d.ts +64 -0
  196. package/lib/host/windows/paths.d.ts.map +1 -0
  197. package/lib/host/windows/paths.js +148 -0
  198. package/lib/host/windows/paths.js.map +1 -0
  199. package/lib/host/windows/run.d.ts +74 -0
  200. package/lib/host/windows/run.d.ts.map +1 -0
  201. package/lib/host/windows/run.js +211 -0
  202. package/lib/host/windows/run.js.map +1 -0
  203. package/lib/host/windows/spawn.d.ts +22 -0
  204. package/lib/host/windows/spawn.d.ts.map +1 -0
  205. package/lib/host/windows/spawn.js +73 -0
  206. package/lib/host/windows/spawn.js.map +1 -0
  207. package/lib/index.d.ts +102 -0
  208. package/lib/index.d.ts.map +1 -0
  209. package/lib/index.js +102 -636
  210. package/lib/index.js.map +1 -0
  211. package/locale/en.json +6 -0
  212. package/locale/zh.json +6 -0
  213. package/package.json +57 -14
  214. package/cordis.patch.yml +0 -5
@@ -0,0 +1,204 @@
1
+ import type { BridgeStderrMode, ChromeExecutableEntry, ChromeMcpConfig, ConfigField, ConfigLayers, ConfigLiveFields, SettingsFormRow, SettingsForms } from "./types/index.js";
2
+ /**
3
+ * Environment variable that seeds the launch flags for one dsh run: a
4
+ * whitespace-separated extraFlags list, e.g.
5
+ * `DSH_CHROME_MCP_FLAGS="--headless --isolated"`.
6
+ */
7
+ export { FLAGS_ENV_VAR } from "./constants.js";
8
+ /**
9
+ * Read one config field. A `.volatile()` field arrives as a reference the fiber
10
+ * resolves live (dsh 0.2.0: `apply` hands references, ordinary fields plain
11
+ * values), so reading the field's type is not enough — this is the one way every
12
+ * volatile read answers, whether what it holds is a reference or, on the cold
13
+ * path of a hand-built config, the plain value itself.
14
+ *
15
+ * A reference hands a snapshot, so arrays come back copied: the running state
16
+ * holds values, never the reference's own object.
17
+ * @param field - what the config carries for that field.
18
+ * @param fallback - what to answer when it holds nothing.
19
+ */
20
+ export declare function readConfigField<T>(field: ConfigField<T> | undefined, fallback: T): T;
21
+ /**
22
+ * The canonical default extra-flags list — the live mirror's answer for the
23
+ * card's **Restore defaults** control (the card carries no copy of it).
24
+ */
25
+ export declare function readDefaultExtraFlags(): string[];
26
+ /**
27
+ * The recommended WSL ↔ Windows extra-flags list — the live mirror's answer for
28
+ * the card's **Flags WSL** control (a fixed recommendation, never persisted).
29
+ */
30
+ export declare function readWslExtraFlags(): string[];
31
+ /**
32
+ * Parse a whitespace-separated flags list from the environment.
33
+ * @param configured - what the row config answers.
34
+ * @param envValue - `DSH_CHROME_MCP_FLAGS` as seen in the launch env.
35
+ * @returns the env flags when the value is a non-empty string whose every
36
+ * entry is valid, else `configured` (the caller decides on warnings).
37
+ */
38
+ export declare function resolveEnvFlags(configured: string[], envValue: unknown): string[];
39
+ /**
40
+ * One read of the configuration form's layers. `value` answers what runs now —
41
+ * the references resolve the user layer over the row config, which is exactly
42
+ * what the bridge launches with. `user` answers "did the user edit this?" (the
43
+ * selection source, and where the launch environment sits in the flags
44
+ * precedence), `base` "what does the row config say?", and both stay undefined
45
+ * until the form answers.
46
+ *
47
+ * The live-only volatile fields are not consulted here: they are Host answers,
48
+ * held in the controller's mirror and published, not read.
49
+ * @param config - the config `apply` received (references included).
50
+ * @param row - the described form row, when the service is already up.
51
+ */
52
+ export declare function readConfigLayers(config: ChromeMcpConfig, row?: SettingsFormRow): ConfigLayers;
53
+ /**
54
+ * The effective launch flags for one read of the layers (highest first: the
55
+ * user layer, `DSH_CHROME_MCP_FLAGS`, the row config, the schema default).
56
+ * Before the layers answer the references stand in, exactly the way the old cold
57
+ * path did. The executable-pinning flag never reaches argv — the picker owns
58
+ * that flag, so a layer that still carries one is answered as the selection
59
+ * source instead (see ./flags.ts), never as a second source of truth.
60
+ * @param layers - the last read of the form's layers.
61
+ * @param envValue - the launch environment's `DSH_CHROME_MCP_FLAGS` value.
62
+ */
63
+ export declare function resolveLaunchFlags(layers: ConfigLayers, envValue: unknown): string[];
64
+ /**
65
+ * The effective executable selection for one read of the layers: the user layer
66
+ * (the card's pick, or the host's one seed) wins, then the row config — its
67
+ * legacy `--executablePath` folded in — and, before either answers, nothing.
68
+ * There is no auto source and nothing is re-resolved here: a path that breaks
69
+ * keeps breaking so what the pill claims keeps being what the bridge runs.
70
+ */
71
+ export declare function resolveSelection(layers: ConfigLayers): {
72
+ path: string;
73
+ source: "" | "selected" | "row-config";
74
+ pinned: boolean;
75
+ };
76
+ /**
77
+ * Resolve the effective bridge stderr mode. The user layer's toggle
78
+ * (`stderrMode`) wins when it states one; otherwise the row config's
79
+ * `bridgeStderr`. An invalid/empty override falls back to the row config.
80
+ * @param override - the persisted `stderrMode` value, or "".
81
+ * @param rowDefault - the validated row-config `bridgeStderr` ("log"/"console").
82
+ * @returns "log" | "console".
83
+ */
84
+ export declare function resolveStderrMode(override: unknown, rowDefault: unknown): BridgeStderrMode;
85
+ /**
86
+ * The effective bridge stderr mode from one read of the form's layers, in the
87
+ * precedence every other layer-resolved field follows: what the user layer says
88
+ * wins, the **row config** answers under it, and what the references resolved at
89
+ * boot sits under that again (the references answer both layers before the form
90
+ * attaches, so the cold path keeps answering).
91
+ *
92
+ * The `base` step is what keeps the answer single. The references can resolve an
93
+ * empty `stderrMode` for a row that states one — no user layer ever wrote it —
94
+ * while the described row still serves it, and then the card states one mode
95
+ * while the bridge runs the other. A control that diffs its own flip against
96
+ * what is *effective* drops every flip as "already served" against a stale
97
+ * mirror, which is exactly the dead toggle: the profile that configures the
98
+ * switch in its own row is the profile that can never switch it. Reading the
99
+ * row-config layer here makes the Host state the same mode the card states, and
100
+ * the mirror it publishes then stays honest on its own.
101
+ * @param layers - the last read of the form's layers.
102
+ * @param rowDefault - the validated row-config `bridgeStderr` ("log"/"console").
103
+ * @returns "log" | "console".
104
+ */
105
+ export declare function resolveStderrModeFromLayers(layers: ConfigLayers, rowDefault: unknown): BridgeStderrMode;
106
+ /**
107
+ * The effective Chrome executable path (highest first):
108
+ *
109
+ * 1. the `chromePath` the user picked in the card — or that the host seeded
110
+ * once during the first scan, which is written into the same field,
111
+ * 2. the row-config `chromePath` (a legacy row-level `--executablePath` flag
112
+ * folded into it before this call),
113
+ * 3. `""` — nothing resolved yet, which is not a runnable executable and is
114
+ * reported as such.
115
+ *
116
+ * Nothing here consults the scan list: a fixed path stays fixed even when it
117
+ * breaks, because re-resolving would be an auto mode in disguise.
118
+ *
119
+ * @param userLayer - the persisted `chromePath` value ("" when unset).
120
+ * @param rowConfig - validated row-config `chromePath` value.
121
+ * @returns the trimmed effective path, possibly "".
122
+ */
123
+ export declare function resolveEffectiveChromePath(userLayer: unknown, rowConfig: unknown): string;
124
+ /**
125
+ * The persisted user-layer `extraFlags` list (undefined = the user never said
126
+ * anything, so the launch environment answers instead).
127
+ * @param layers - the last read of the form's layers.
128
+ */
129
+ export declare function readPersistedFlags(layers: ConfigLayers): string[] | undefined;
130
+ /**
131
+ * The last UI-seeded (or host-seeded) `chromePath` from the user layer ("" means
132
+ * "nothing picked yet" → fall back to the row config).
133
+ * @param layers - the last read of the form's layers.
134
+ */
135
+ export declare function readPersistedChromePath(layers: ConfigLayers): string;
136
+ /**
137
+ * The last persisted "Reduce log output" mode from the user layer.
138
+ * Empty/absent/invalid means "follow the row config".
139
+ * @param layers - the last read of the form's layers.
140
+ * @returns "log" | "console" when explicitly set, "" otherwise.
141
+ */
142
+ export declare function readPersistedStderrMode(layers: ConfigLayers): "" | BridgeStderrMode;
143
+ /**
144
+ * The persisted custom-executable MRU from the user layer — a **legacy** field
145
+ * nothing writes any more, read once to fold the older hand-typed paths into
146
+ * the rows. Invalid entries (non-string, empty, control characters) are dropped
147
+ * rather than poisoning the candidate list.
148
+ * @param layers - the last read of the form's layers.
149
+ * @returns the stored paths, trimmed and deduplicated ("" list when absent).
150
+ */
151
+ export declare function readPersistedCustomPaths(layers: ConfigLayers): string[];
152
+ /**
153
+ * Normalized form of a **legacy** custom-path list: trimmed, empty entries
154
+ * dropped, control characters dropped, duplicates folded (first spelling wins),
155
+ * capped most-recent-first so the list stays bounded. Nothing writes this list
156
+ * any more (the saved executable rows replace it) — it is only ever read, once,
157
+ * to fold the older hand-typed paths into the rows.
158
+ * @param value - candidate list (any shape).
159
+ * @param cap - entry cap (default `CUSTOM_PATHS_CAP`).
160
+ */
161
+ export declare function normalizeCustomPaths(value: unknown, cap?: number): string[];
162
+ /**
163
+ * The saved executable rows the picker shows: re-normalized on every read, since
164
+ * what a form write hands may carry any shape.
165
+ * @param layers - the last read of the form's layers.
166
+ */
167
+ export declare function readSavedExecutables(layers: ConfigLayers): ChromeExecutableEntry[];
168
+ /**
169
+ * The ids of rows the user has dropped — the ids every merge step must skip so a
170
+ * deletion outlives the run behind the write that made it (see ./schema.ts
171
+ * `droppedExecutables`). Deduped; a malformed entry drops out exactly like a
172
+ * malformed row id.
173
+ * @param layers - the last read of the form's layers.
174
+ */
175
+ export declare function readDroppedExecutables(layers: ConfigLayers): string[];
176
+ /**
177
+ * The live mirror's field names — the fields the Host answers through the
178
+ * volatile references and never authors by hand. Every write that lands in the
179
+ * stored row carries this list as **unset** ops: each unset returns the field to
180
+ * the answer beneath its own patch layer — what the row config says — so what
181
+ * only the live references stand drops out of what the write lands instead of
182
+ * riding the write into the file. This is what keeps the persistence boundary
183
+ * from the inside: a live commit answers, a persisted write clears (measured
184
+ * live 2026-10-12: booting the plugin with no user write at all filled the row
185
+ * with the whole live mirror; with the clear riding the write the row stays
186
+ * clean, and a row that already carries leaked live keys is healed by its first
187
+ * write).
188
+ */
189
+ export declare function liveMirrorKeys(): readonly string[];
190
+ /**
191
+ * The mirror the Host publishes: what every live field answers when nothing has
192
+ * run yet. The whole point of starting from the defaults is that a card reads
193
+ * exactly what a Host with no answers would serve, never a hole.
194
+ */
195
+ export declare function createLiveMirror(): ConfigLiveFields;
196
+ /**
197
+ * Read the row's two layers through the settings service. Undefined when the
198
+ * service (or this entry) is not described yet — the cold path, where only the
199
+ * references answer.
200
+ * @param settings - the settings service (`SettingsForms`), when resolved.
201
+ * @param entryId - the profile entry id this row is keyed by.
202
+ */
203
+ export declare function readConfigForm(settings: SettingsForms | undefined, entryId: string): SettingsFormRow | undefined;
204
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/host/values.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACR,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,EAEZ,gBAAgB,EAEhB,eAAe,EACf,aAAa,EAChB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CASpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CASjF;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,YAAY,CA2C7F;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAMpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,EAAE,GAAG,UAAU,GAAG,YAAY,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAQhI;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,gBAAgB,CAG1F;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,GAAG,gBAAgB,CAEvG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAIzF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,GAAG,SAAS,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,EAAE,GAAG,gBAAgB,CAGnF;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAIvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,MAAyB,GAAG,MAAM,EAAE,CAc7F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,EAAE,CAElF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAarE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,IAAI,SAAS,MAAM,EAAE,CAElD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAkBnD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAGhH"}
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Precedence resolution + the configuration form's answers.
3
+ *
4
+ * Two levers resolve upward. The launch flags come from one of four sources
5
+ * (highest first): the user layer (the card's last edit), the launch environment
6
+ * (`DSH_CHROME_MCP_FLAGS`, read through `launchEnvironmentOf`), the row-config
7
+ * `extraFlags`, and the schema default. The executable comes from three (highest
8
+ * first): the `chromePath` the card picked or the host seeded once, the row
9
+ * config (a legacy row-level `--executablePath` folded in — see ./flags.ts), and
10
+ * nothing. There is no auto resolution: nothing is inferred on every start, and
11
+ * nothing is re-inferred when the chosen path breaks.
12
+ *
13
+ * The reads are one `readConfigLayers` wide: since dsh 0.2.0 the *references*
14
+ * apply() handed answer the effective value (they resolve the user layer over the
15
+ * row config), while the two layers the distinction needs ride the described settings row (`readFormRow`)
16
+ * — `user` is what the profile patch carries (presence is the answer), `base` what
17
+ * the row config carries under it. Before the form attaches only the references
18
+ * answer, so the first commit settles the distinction.
19
+ */
20
+ import { readFormRow } from "@comecaramelos/dsh-ancesters/host";
21
+ import { CUSTOM_PATHS_CAP, DEFAULT_EXTRA_FLAGS, WSL_EXTRA_FLAGS } from "./constants.js";
22
+ import { extractExecutablePathFlag, stripExecutablePathFlags, validateExtraFlags } from "./flags.js";
23
+ import { normalizeEntries } from "./catalog.js";
24
+ /**
25
+ * Environment variable that seeds the launch flags for one dsh run: a
26
+ * whitespace-separated extraFlags list, e.g.
27
+ * `DSH_CHROME_MCP_FLAGS="--headless --isolated"`.
28
+ */
29
+ export { FLAGS_ENV_VAR } from "./constants.js";
30
+ /**
31
+ * Read one config field. A `.volatile()` field arrives as a reference the fiber
32
+ * resolves live (dsh 0.2.0: `apply` hands references, ordinary fields plain
33
+ * values), so reading the field's type is not enough — this is the one way every
34
+ * volatile read answers, whether what it holds is a reference or, on the cold
35
+ * path of a hand-built config, the plain value itself.
36
+ *
37
+ * A reference hands a snapshot, so arrays come back copied: the running state
38
+ * holds values, never the reference's own object.
39
+ * @param field - what the config carries for that field.
40
+ * @param fallback - what to answer when it holds nothing.
41
+ */
42
+ export function readConfigField(field, fallback) {
43
+ const holder = field;
44
+ if (typeof holder?.get === "function") {
45
+ const value = holder.get();
46
+ if (value === void 0)
47
+ return fallback;
48
+ return Array.isArray(value) ? value.slice() : value;
49
+ }
50
+ if (field === void 0 || field === null)
51
+ return fallback;
52
+ return Array.isArray(field) ? field.slice() : field;
53
+ }
54
+ /**
55
+ * The canonical default extra-flags list — the live mirror's answer for the
56
+ * card's **Restore defaults** control (the card carries no copy of it).
57
+ */
58
+ export function readDefaultExtraFlags() {
59
+ return [...DEFAULT_EXTRA_FLAGS];
60
+ }
61
+ /**
62
+ * The recommended WSL ↔ Windows extra-flags list — the live mirror's answer for
63
+ * the card's **Flags WSL** control (a fixed recommendation, never persisted).
64
+ */
65
+ export function readWslExtraFlags() {
66
+ return [...WSL_EXTRA_FLAGS];
67
+ }
68
+ /**
69
+ * Parse a whitespace-separated flags list from the environment.
70
+ * @param configured - what the row config answers.
71
+ * @param envValue - `DSH_CHROME_MCP_FLAGS` as seen in the launch env.
72
+ * @returns the env flags when the value is a non-empty string whose every
73
+ * entry is valid, else `configured` (the caller decides on warnings).
74
+ */
75
+ export function resolveEnvFlags(configured, envValue) {
76
+ if (typeof envValue !== "string" || envValue.trim() === "")
77
+ return configured;
78
+ const flags = envValue.split(/\s+/u).filter((flag) => flag !== "");
79
+ try {
80
+ validateExtraFlags(flags);
81
+ }
82
+ catch {
83
+ return configured;
84
+ }
85
+ return flags;
86
+ }
87
+ /** Normalize one layer's `extraFlags` answer (undefined = the layer is silent). */
88
+ function readLayerFlags(value) {
89
+ if (!Array.isArray(value))
90
+ return void 0;
91
+ if (!value.every((flag) => typeof flag === "string" && flag !== ""))
92
+ return void 0;
93
+ return value;
94
+ }
95
+ /** Normalize one layer's `chromePath` answer ("" when absent or unusable). */
96
+ function readLayerChromePath(value) {
97
+ return typeof value === "string" ? value.trim() : "";
98
+ }
99
+ /**
100
+ * One read of the configuration form's layers. `value` answers what runs now —
101
+ * the references resolve the user layer over the row config, which is exactly
102
+ * what the bridge launches with. `user` answers "did the user edit this?" (the
103
+ * selection source, and where the launch environment sits in the flags
104
+ * precedence), `base` "what does the row config say?", and both stay undefined
105
+ * until the form answers.
106
+ *
107
+ * The live-only volatile fields are not consulted here: they are Host answers,
108
+ * held in the controller's mirror and published, not read.
109
+ * @param config - the config `apply` received (references included).
110
+ * @param row - the described form row, when the service is already up.
111
+ */
112
+ export function readConfigLayers(config, row) {
113
+ const described = (row === null || typeof row !== "object" ? {} : row);
114
+ const describedLayer = (layer) => {
115
+ const source = layer === null || typeof layer !== "object" || Array.isArray(layer) ? {} : layer;
116
+ const flags = readLayerFlags(source.extraFlags);
117
+ const executables = Array.isArray(source.executables) ? normalizeEntries(source.executables) : void 0;
118
+ const paths = Array.isArray(source.chromeCustomPaths) ? normalizeCustomPaths(source.chromeCustomPaths) : void 0;
119
+ const stderrMode = source.stderrMode === "log" || source.stderrMode === "console" ? source.stderrMode : void 0;
120
+ const chromePath = typeof source.chromePath === "string" ? source.chromePath.trim() : void 0;
121
+ const dropped = Array.isArray(source.droppedExecutables)
122
+ ? source.droppedExecutables.filter((item) => typeof item === "string")
123
+ : void 0;
124
+ return {
125
+ ...(flags === void 0 ? {} : { extraFlags: flags }),
126
+ ...(chromePath === void 0 || chromePath === "" ? {} : { chromePath }),
127
+ ...(executables === void 0 ? {} : { executables }),
128
+ ...(dropped === void 0 ? {} : { droppedExecutables: dropped }),
129
+ ...(paths === void 0 ? {} : { chromeCustomPaths: paths }),
130
+ ...(stderrMode === void 0 ? {} : { stderrMode }),
131
+ ...(typeof source.refreshExecutablesNonce === "number" ? { refreshExecutablesNonce: source.refreshExecutablesNonce } : {}),
132
+ ...(typeof source.openWindowsChromeNonce === "number" ? { openWindowsChromeNonce: source.openWindowsChromeNonce } : {})
133
+ };
134
+ };
135
+ const value = {
136
+ extraFlags: readConfigField(config.extraFlags, [...DEFAULT_EXTRA_FLAGS]),
137
+ chromePath: readConfigField(config.chromePath, "").trim(),
138
+ executables: normalizeEntries(readConfigField(config.executables, [])),
139
+ droppedExecutables: readConfigField(config.droppedExecutables, []).filter((item) => typeof item === "string"),
140
+ chromeCustomPaths: normalizeCustomPaths(readConfigField(config.chromeCustomPaths, [])),
141
+ stderrMode: readConfigField(config.stderrMode, ""),
142
+ refreshExecutablesNonce: readConfigField(config.refreshExecutablesNonce, 0),
143
+ openWindowsChromeNonce: readConfigField(config.openWindowsChromeNonce, 0)
144
+ };
145
+ const base = describedLayer(described.base);
146
+ const hasLayers = described.user !== void 0 || described.base !== void 0;
147
+ return {
148
+ value,
149
+ // Before the form attaches nothing distinguishes the layers, so the
150
+ // references answer for the row config as well; the first commit reads the
151
+ // real layers and settles the distinction.
152
+ user: hasLayers ? describedLayer(described.user) : {},
153
+ base: hasLayers ? base : { ...value }
154
+ };
155
+ }
156
+ /**
157
+ * The effective launch flags for one read of the layers (highest first: the
158
+ * user layer, `DSH_CHROME_MCP_FLAGS`, the row config, the schema default).
159
+ * Before the layers answer the references stand in, exactly the way the old cold
160
+ * path did. The executable-pinning flag never reaches argv — the picker owns
161
+ * that flag, so a layer that still carries one is answered as the selection
162
+ * source instead (see ./flags.ts), never as a second source of truth.
163
+ * @param layers - the last read of the form's layers.
164
+ * @param envValue - the launch environment's `DSH_CHROME_MCP_FLAGS` value.
165
+ */
166
+ export function resolveLaunchFlags(layers, envValue) {
167
+ const user = readLayerFlags(layers.user.extraFlags);
168
+ if (user !== void 0)
169
+ return stripExecutablePathFlags(user);
170
+ const row = readLayerFlags(layers.base.extraFlags) ?? layers.value.extraFlags;
171
+ const fromEnv = resolveEnvFlags(row, envValue);
172
+ return stripExecutablePathFlags(fromEnv);
173
+ }
174
+ /**
175
+ * The effective executable selection for one read of the layers: the user layer
176
+ * (the card's pick, or the host's one seed) wins, then the row config — its
177
+ * legacy `--executablePath` folded in — and, before either answers, nothing.
178
+ * There is no auto source and nothing is re-resolved here: a path that breaks
179
+ * keeps breaking so what the pill claims keeps being what the bridge runs.
180
+ */
181
+ export function resolveSelection(layers) {
182
+ const userPath = readLayerChromePath(layers.user.chromePath);
183
+ if (userPath !== "")
184
+ return { path: userPath, source: "selected", pinned: false };
185
+ const baseChromePath = readLayerChromePath(layers.base.chromePath);
186
+ if (baseChromePath !== "")
187
+ return { path: baseChromePath, source: "row-config", pinned: false };
188
+ const pinned = extractExecutablePathFlag(readLayerFlags(layers.base.extraFlags) ?? []);
189
+ if (pinned !== "")
190
+ return { path: pinned, source: "row-config", pinned: true };
191
+ return { path: "", source: "", pinned: false };
192
+ }
193
+ /**
194
+ * Resolve the effective bridge stderr mode. The user layer's toggle
195
+ * (`stderrMode`) wins when it states one; otherwise the row config's
196
+ * `bridgeStderr`. An invalid/empty override falls back to the row config.
197
+ * @param override - the persisted `stderrMode` value, or "".
198
+ * @param rowDefault - the validated row-config `bridgeStderr` ("log"/"console").
199
+ * @returns "log" | "console".
200
+ */
201
+ export function resolveStderrMode(override, rowDefault) {
202
+ if (override === "log" || override === "console")
203
+ return override;
204
+ return rowDefault === "console" ? "console" : "log";
205
+ }
206
+ /**
207
+ * The effective bridge stderr mode from one read of the form's layers, in the
208
+ * precedence every other layer-resolved field follows: what the user layer says
209
+ * wins, the **row config** answers under it, and what the references resolved at
210
+ * boot sits under that again (the references answer both layers before the form
211
+ * attaches, so the cold path keeps answering).
212
+ *
213
+ * The `base` step is what keeps the answer single. The references can resolve an
214
+ * empty `stderrMode` for a row that states one — no user layer ever wrote it —
215
+ * while the described row still serves it, and then the card states one mode
216
+ * while the bridge runs the other. A control that diffs its own flip against
217
+ * what is *effective* drops every flip as "already served" against a stale
218
+ * mirror, which is exactly the dead toggle: the profile that configures the
219
+ * switch in its own row is the profile that can never switch it. Reading the
220
+ * row-config layer here makes the Host state the same mode the card states, and
221
+ * the mirror it publishes then stays honest on its own.
222
+ * @param layers - the last read of the form's layers.
223
+ * @param rowDefault - the validated row-config `bridgeStderr` ("log"/"console").
224
+ * @returns "log" | "console".
225
+ */
226
+ export function resolveStderrModeFromLayers(layers, rowDefault) {
227
+ return resolveStderrMode(layers.user.stderrMode ?? layers.base.stderrMode ?? layers.value.stderrMode, rowDefault);
228
+ }
229
+ /**
230
+ * The effective Chrome executable path (highest first):
231
+ *
232
+ * 1. the `chromePath` the user picked in the card — or that the host seeded
233
+ * once during the first scan, which is written into the same field,
234
+ * 2. the row-config `chromePath` (a legacy row-level `--executablePath` flag
235
+ * folded into it before this call),
236
+ * 3. `""` — nothing resolved yet, which is not a runnable executable and is
237
+ * reported as such.
238
+ *
239
+ * Nothing here consults the scan list: a fixed path stays fixed even when it
240
+ * breaks, because re-resolving would be an auto mode in disguise.
241
+ *
242
+ * @param userLayer - the persisted `chromePath` value ("" when unset).
243
+ * @param rowConfig - validated row-config `chromePath` value.
244
+ * @returns the trimmed effective path, possibly "".
245
+ */
246
+ export function resolveEffectiveChromePath(userLayer, rowConfig) {
247
+ const user = typeof userLayer === "string" ? userLayer.trim() : "";
248
+ if (user !== "")
249
+ return user;
250
+ return typeof rowConfig === "string" ? rowConfig.trim() : "";
251
+ }
252
+ /**
253
+ * The persisted user-layer `extraFlags` list (undefined = the user never said
254
+ * anything, so the launch environment answers instead).
255
+ * @param layers - the last read of the form's layers.
256
+ */
257
+ export function readPersistedFlags(layers) {
258
+ return readLayerFlags(layers.user.extraFlags);
259
+ }
260
+ /**
261
+ * The last UI-seeded (or host-seeded) `chromePath` from the user layer ("" means
262
+ * "nothing picked yet" → fall back to the row config).
263
+ * @param layers - the last read of the form's layers.
264
+ */
265
+ export function readPersistedChromePath(layers) {
266
+ return readLayerChromePath(layers.user.chromePath);
267
+ }
268
+ /**
269
+ * The last persisted "Reduce log output" mode from the user layer.
270
+ * Empty/absent/invalid means "follow the row config".
271
+ * @param layers - the last read of the form's layers.
272
+ * @returns "log" | "console" when explicitly set, "" otherwise.
273
+ */
274
+ export function readPersistedStderrMode(layers) {
275
+ const mode = layers.user.stderrMode;
276
+ return mode === "log" || mode === "console" ? mode : "";
277
+ }
278
+ /**
279
+ * The persisted custom-executable MRU from the user layer — a **legacy** field
280
+ * nothing writes any more, read once to fold the older hand-typed paths into
281
+ * the rows. Invalid entries (non-string, empty, control characters) are dropped
282
+ * rather than poisoning the candidate list.
283
+ * @param layers - the last read of the form's layers.
284
+ * @returns the stored paths, trimmed and deduplicated ("" list when absent).
285
+ */
286
+ export function readPersistedCustomPaths(layers) {
287
+ const paths = layers.user.chromeCustomPaths;
288
+ if (paths === void 0)
289
+ return normalizeCustomPaths(layers.value.chromeCustomPaths);
290
+ return normalizeCustomPaths(paths);
291
+ }
292
+ /**
293
+ * Normalized form of a **legacy** custom-path list: trimmed, empty entries
294
+ * dropped, control characters dropped, duplicates folded (first spelling wins),
295
+ * capped most-recent-first so the list stays bounded. Nothing writes this list
296
+ * any more (the saved executable rows replace it) — it is only ever read, once,
297
+ * to fold the older hand-typed paths into the rows.
298
+ * @param value - candidate list (any shape).
299
+ * @param cap - entry cap (default `CUSTOM_PATHS_CAP`).
300
+ */
301
+ export function normalizeCustomPaths(value, cap = CUSTOM_PATHS_CAP) {
302
+ if (!Array.isArray(value))
303
+ return [];
304
+ const seen = new Set();
305
+ const paths = [];
306
+ for (const entry of value) {
307
+ if (typeof entry !== "string")
308
+ continue;
309
+ const path = entry.trim();
310
+ if (path === "" || /[\x00-\x1f\x7f]/u.test(path))
311
+ continue;
312
+ if (seen.has(path))
313
+ continue;
314
+ seen.add(path);
315
+ paths.push(path);
316
+ }
317
+ if (paths.length <= cap)
318
+ return paths;
319
+ return paths.slice(0, cap);
320
+ }
321
+ /**
322
+ * The saved executable rows the picker shows: re-normalized on every read, since
323
+ * what a form write hands may carry any shape.
324
+ * @param layers - the last read of the form's layers.
325
+ */
326
+ export function readSavedExecutables(layers) {
327
+ return normalizeEntries(layers.user.executables ?? layers.value.executables);
328
+ }
329
+ /**
330
+ * The ids of rows the user has dropped — the ids every merge step must skip so a
331
+ * deletion outlives the run behind the write that made it (see ./schema.ts
332
+ * `droppedExecutables`). Deduped; a malformed entry drops out exactly like a
333
+ * malformed row id.
334
+ * @param layers - the last read of the form's layers.
335
+ */
336
+ export function readDroppedExecutables(layers) {
337
+ const raw = (layers.user.droppedExecutables ?? layers.value.droppedExecutables);
338
+ if (!Array.isArray(raw))
339
+ return [];
340
+ const out = [];
341
+ const seen = new Set();
342
+ for (const item of raw) {
343
+ if (typeof item !== "string")
344
+ continue;
345
+ const id = item.trim();
346
+ if (id === "" || seen.has(id))
347
+ continue;
348
+ seen.add(id);
349
+ out.push(id);
350
+ }
351
+ return out;
352
+ }
353
+ /**
354
+ * The live mirror's field names — the fields the Host answers through the
355
+ * volatile references and never authors by hand. Every write that lands in the
356
+ * stored row carries this list as **unset** ops: each unset returns the field to
357
+ * the answer beneath its own patch layer — what the row config says — so what
358
+ * only the live references stand drops out of what the write lands instead of
359
+ * riding the write into the file. This is what keeps the persistence boundary
360
+ * from the inside: a live commit answers, a persisted write clears (measured
361
+ * live 2026-10-12: booting the plugin with no user write at all filled the row
362
+ * with the whole live mirror; with the clear riding the write the row stays
363
+ * clean, and a row that already carries leaked live keys is healed by its first
364
+ * write).
365
+ */
366
+ export function liveMirrorKeys() {
367
+ return Object.keys(createLiveMirror());
368
+ }
369
+ /**
370
+ * The mirror the Host publishes: what every live field answers when nothing has
371
+ * run yet. The whole point of starting from the defaults is that a card reads
372
+ * exactly what a Host with no answers would serve, never a hole.
373
+ */
374
+ export function createLiveMirror() {
375
+ return {
376
+ lastError: "",
377
+ chromeMissing: false,
378
+ executableDiscoveryRevision: 0,
379
+ chromeVersion: "",
380
+ executableStatus: [],
381
+ effectiveChromePath: "",
382
+ effectiveSource: "",
383
+ stderrEffective: "log",
384
+ defaultExtraFlags: readDefaultExtraFlags(),
385
+ wslExtraFlags: readWslExtraFlags(),
386
+ wslWindowsExecutable: false,
387
+ windowsChromeStatus: { state: "off", port: 0, error: "" },
388
+ carriesConnectionMode: false,
389
+ runningFlags: [],
390
+ runningNote: ""
391
+ };
392
+ }
393
+ /**
394
+ * Read the row's two layers through the settings service. Undefined when the
395
+ * service (or this entry) is not described yet — the cold path, where only the
396
+ * references answer.
397
+ * @param settings - the settings service (`SettingsForms`), when resolved.
398
+ * @param entryId - the profile entry id this row is keyed by.
399
+ */
400
+ export function readConfigForm(settings, entryId) {
401
+ // A service that cannot answer is the same cold path as no service.
402
+ return readFormRow(settings, entryId);
403
+ }
404
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/host/values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** The connect address one debugging port answers for. */
2
+ export declare function windowsChromeUrl(port: number): string;
3
+ /** The debugging port the live connect entry carries, 0 when the list carries
4
+ * none. The entry's **spelling** is irrelevant: the port is read through the
5
+ * very predicate that decides connect mode (`carriesConnectionMode` in
6
+ * `./flags.ts`), so `--browserUrl=<url>`, `--browserUrl <url>` (the two-entry
7
+ * form the whitespace-split env source produces), one string carrying its
8
+ * value after whitespace, and `--wsEndpoint=<url>` all answer with the live
9
+ * port instead of reading as "no live session". */
10
+ export declare function browserUrlFlagPort(flags: unknown): number;
11
+ /**
12
+ * Collapse every connect entry the list carries into the run's own address, so
13
+ * the saved list keeps exactly **one** connect source whatever spelling it was
14
+ * stored in — the same idempotency rule the saved-executable merge follows for
15
+ * a repeated id, keyed now on the whole connect-mode predicate rather than one
16
+ * flag spelling. An entry that carries its value as the *following* entry (the
17
+ * `--browserUrl <url>` form the whitespace-split env source produces) consumes
18
+ * that value with it, so no bare URL survives as a stray argv item.
19
+ *
20
+ * The one thing that does not survive is a `--user-data-dir` row: connect
21
+ * carries no local profile to hand the browser, upstream refuses both at once,
22
+ * so keeping a saved Flags-WSL row would leave the bridge unspawnable
23
+ * (`Arguments userDataDir and browserUrl are mutually exclusive`, measured live
24
+ * with chrome-devtools-mcp).
25
+ */
26
+ export declare function withBrowserUrlFlag(flags: unknown, url: string): string[];
27
+ //# sourceMappingURL=connect-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-flags.d.ts","sourceRoot":"","sources":["../../../src/host/windows/connect-flags.ts"],"names":[],"mappings":"AAaA,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;mDAMmD;AACnD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAoBzD;AAQD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BxE"}