@zenalexa/unicli 0.223.0 → 0.223.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -1
- package/README.md +16 -5
- package/README.zh-CN.md +2 -2
- package/dist/browser/auth-sync.d.ts +32 -0
- package/dist/browser/auth-sync.d.ts.map +1 -0
- package/dist/browser/auth-sync.js +119 -0
- package/dist/browser/auth-sync.js.map +1 -0
- package/dist/browser/bridge.d.ts +2 -0
- package/dist/browser/bridge.d.ts.map +1 -1
- package/dist/browser/bridge.js +4 -3
- package/dist/browser/bridge.js.map +1 -1
- package/dist/browser/cdp-client.d.ts +5 -0
- package/dist/browser/cdp-client.d.ts.map +1 -1
- package/dist/browser/cdp-client.js +18 -3
- package/dist/browser/cdp-client.js.map +1 -1
- package/dist/browser/chrome-policy.d.ts +38 -0
- package/dist/browser/chrome-policy.d.ts.map +1 -0
- package/dist/browser/chrome-policy.js +261 -0
- package/dist/browser/chrome-policy.js.map +1 -0
- package/dist/browser/daemon-client.d.ts +3 -0
- package/dist/browser/daemon-client.d.ts.map +1 -1
- package/dist/browser/daemon-client.js +13 -15
- package/dist/browser/daemon-client.js.map +1 -1
- package/dist/browser/doctor.d.ts +147 -0
- package/dist/browser/doctor.d.ts.map +1 -0
- package/dist/browser/doctor.js +784 -0
- package/dist/browser/doctor.js.map +1 -0
- package/dist/browser/launcher.d.ts +17 -8
- package/dist/browser/launcher.d.ts.map +1 -1
- package/dist/browser/launcher.js +51 -11
- package/dist/browser/launcher.js.map +1 -1
- package/dist/browser/local-profiles.d.ts +55 -0
- package/dist/browser/local-profiles.d.ts.map +1 -0
- package/dist/browser/local-profiles.js +333 -0
- package/dist/browser/local-profiles.js.map +1 -0
- package/dist/commands/browser/index.d.ts +2 -2
- package/dist/commands/browser/index.d.ts.map +1 -1
- package/dist/commands/browser/index.js +195 -14
- package/dist/commands/browser/index.js.map +1 -1
- package/dist/engine/executor.d.ts +6 -1
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +2 -0
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts.map +1 -1
- package/dist/engine/kernel/stages.js +4 -0
- package/dist/engine/kernel/stages.js.map +1 -1
- package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
- package/dist/engine/steps/browser-helpers.js +29 -1
- package/dist/engine/steps/browser-helpers.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/docs/operate/focus-behavior.md +25 -0
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/unicli/SKILL.md +54 -38
- package/skills/unicli-browser/SKILL.md +56 -10
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/skills/unicli-operate/SKILL.md +1 -1
- package/skills/unicli-smart-search/SKILL.md +7 -5
- package/skills/unicli-usage/SKILL.md +39 -1
- package/src/hub/external-clis.yaml +6 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/browser/chrome-policy.ts
|
|
3
|
+
* @does Detect Chrome remote-debugging policy state and publish Chrome 136+ CDP hardening guidance.
|
|
4
|
+
* @needs node:child_process, node:fs, node:path, Chrome Enterprise policy conventions
|
|
5
|
+
* @feeds src/browser/doctor.ts, tests/unit/chrome-policy.test.ts
|
|
6
|
+
* @breaks Policy probe failures become unknown diagnostics; the module never writes browser policy.
|
|
7
|
+
*/
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
export const CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES = [
|
|
12
|
+
"https://developer.chrome.com/blog/remote-debugging-port",
|
|
13
|
+
"https://support.google.com/chrome/a/answer/10314655",
|
|
14
|
+
"https://chromeenterprise.google/policies/remote-debugging-allowed/",
|
|
15
|
+
];
|
|
16
|
+
export function buildChrome136RemoteDebuggingGuidance() {
|
|
17
|
+
return {
|
|
18
|
+
default_user_data_dir_cdp_supported: false,
|
|
19
|
+
policy_can_bypass_default_user_data_dir: false,
|
|
20
|
+
automatic_fix: "custom-user-data-dir",
|
|
21
|
+
safe_command: "unicli browser doctor --repair",
|
|
22
|
+
supported_paths: [
|
|
23
|
+
"Launch Chrome with a Uni-CLI-owned non-default --user-data-dir under ~/.unicli.",
|
|
24
|
+
"Reuse login state by importing cookies from the selected local browser profile.",
|
|
25
|
+
"Use Chrome for Testing or Chromium when a fully automation-owned browser is acceptable.",
|
|
26
|
+
"Use the daemon extension bridge when extension state is connected.",
|
|
27
|
+
"Use UNICLI_CDP_ENDPOINT for a remote/cloud CDP browser.",
|
|
28
|
+
],
|
|
29
|
+
unsupported_paths: [
|
|
30
|
+
"Do not retry Google Chrome --remote-debugging-port against the browser default user-data-dir.",
|
|
31
|
+
"Do not rely on RemoteDebuggingAllowed policy to bypass the Chrome 136+ default-directory restriction.",
|
|
32
|
+
"Do not use unstable DevToolsDebuggingRestrictions feature flags as a supported repair path.",
|
|
33
|
+
],
|
|
34
|
+
user_visible_warning: "Chrome 136+ ignores remote debugging switches for the default user-data-dir; Uni-CLI repairs this by starting a separate automation profile and reusing auth through cookie import.",
|
|
35
|
+
official_docs: [...CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function detectChromeRemoteDebuggingPolicy() {
|
|
39
|
+
try {
|
|
40
|
+
const detected = detectMacPolicy() ?? detectLinuxPolicy() ?? detectWindowsPolicy();
|
|
41
|
+
if (detected)
|
|
42
|
+
return detected;
|
|
43
|
+
return policyReportFromValue(null, {
|
|
44
|
+
source: "not-found",
|
|
45
|
+
detail: "No RemoteDebuggingAllowed policy was detected; Chrome treats remote debugging as allowed, subject to the Chrome 136+ non-default data-dir requirement.",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return {
|
|
50
|
+
name: "RemoteDebuggingAllowed",
|
|
51
|
+
state: "unknown",
|
|
52
|
+
source: "probe-error",
|
|
53
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
54
|
+
next_step: "Open chrome://policy and confirm RemoteDebuggingAllowed is not false.",
|
|
55
|
+
commands: ["open chrome://policy", "unicli browser doctor --json"],
|
|
56
|
+
official_docs: [...CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function policyReportFromValue(value, input) {
|
|
61
|
+
if (value === false) {
|
|
62
|
+
return {
|
|
63
|
+
name: "RemoteDebuggingAllowed",
|
|
64
|
+
state: "disabled",
|
|
65
|
+
value,
|
|
66
|
+
source: input.source,
|
|
67
|
+
...(input.source_path ? { source_path: input.source_path } : {}),
|
|
68
|
+
detail: input.detail ??
|
|
69
|
+
"Chrome policy RemoteDebuggingAllowed=false blocks all remote-debugging switches, including Uni-CLI automation profiles.",
|
|
70
|
+
next_step: "Remove the false Chrome policy or set RemoteDebuggingAllowed=true, then fully restart Chrome.",
|
|
71
|
+
commands: policyRepairCommands(),
|
|
72
|
+
official_docs: [...CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (value === true) {
|
|
76
|
+
return {
|
|
77
|
+
name: "RemoteDebuggingAllowed",
|
|
78
|
+
state: "allowed",
|
|
79
|
+
value,
|
|
80
|
+
source: input.source,
|
|
81
|
+
...(input.source_path ? { source_path: input.source_path } : {}),
|
|
82
|
+
detail: input.detail ??
|
|
83
|
+
"Chrome policy explicitly allows remote debugging, but Chrome 136+ still requires a non-default user-data-dir.",
|
|
84
|
+
next_step: "Use `unicli browser doctor --repair` for local CDP.",
|
|
85
|
+
commands: ["unicli browser doctor --repair"],
|
|
86
|
+
official_docs: [...CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
name: "RemoteDebuggingAllowed",
|
|
91
|
+
state: "not-configured",
|
|
92
|
+
source: input.source,
|
|
93
|
+
...(input.source_path ? { source_path: input.source_path } : {}),
|
|
94
|
+
detail: input.detail ??
|
|
95
|
+
"RemoteDebuggingAllowed is not configured, so Chrome allows remote debugging except for the Chrome 136+ default data-dir restriction.",
|
|
96
|
+
next_step: "Use `unicli browser doctor --repair` for local CDP.",
|
|
97
|
+
commands: ["unicli browser doctor --repair"],
|
|
98
|
+
official_docs: [...CHROME_REMOTE_DEBUGGING_OFFICIAL_SOURCES],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function parsePolicyBoolean(raw) {
|
|
102
|
+
const normalized = raw.trim().toLowerCase();
|
|
103
|
+
if (["1", "true", "yes", "enabled", "0x1", "0x00000001"].includes(normalized))
|
|
104
|
+
return true;
|
|
105
|
+
if (["0", "false", "no", "disabled", "0x0", "0x00000000"].includes(normalized))
|
|
106
|
+
return false;
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function detectMacPolicy() {
|
|
110
|
+
if (process.platform !== "darwin")
|
|
111
|
+
return null;
|
|
112
|
+
const candidates = [
|
|
113
|
+
"/Library/Managed Preferences/com.google.Chrome",
|
|
114
|
+
"/Library/Preferences/com.google.Chrome",
|
|
115
|
+
"com.google.Chrome",
|
|
116
|
+
];
|
|
117
|
+
for (const domain of candidates) {
|
|
118
|
+
const value = readMacDefaultsBoolean(domain, "RemoteDebuggingAllowed");
|
|
119
|
+
if (value === null)
|
|
120
|
+
continue;
|
|
121
|
+
return policyReportFromValue(value, {
|
|
122
|
+
source: "mac-defaults",
|
|
123
|
+
source_path: domain,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function detectLinuxPolicy() {
|
|
129
|
+
if (process.platform !== "linux")
|
|
130
|
+
return null;
|
|
131
|
+
const dirs = [
|
|
132
|
+
"/etc/opt/chrome/policies/managed",
|
|
133
|
+
"/etc/opt/chrome/policies/recommended",
|
|
134
|
+
"/etc/chromium/policies/managed",
|
|
135
|
+
"/etc/chromium/policies/recommended",
|
|
136
|
+
"/etc/chrome/policies/managed",
|
|
137
|
+
"/etc/chrome/policies/recommended",
|
|
138
|
+
];
|
|
139
|
+
for (const dir of dirs) {
|
|
140
|
+
const value = readLinuxPolicyBoolean(dir, "RemoteDebuggingAllowed");
|
|
141
|
+
if (value === null)
|
|
142
|
+
continue;
|
|
143
|
+
return policyReportFromValue(value.value, {
|
|
144
|
+
source: "linux-json-policy",
|
|
145
|
+
source_path: value.sourcePath,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
function detectWindowsPolicy() {
|
|
151
|
+
if (process.platform !== "win32")
|
|
152
|
+
return null;
|
|
153
|
+
const keys = [
|
|
154
|
+
"HKLM\\Software\\Policies\\Google\\Chrome",
|
|
155
|
+
"HKCU\\Software\\Policies\\Google\\Chrome",
|
|
156
|
+
];
|
|
157
|
+
for (const key of keys) {
|
|
158
|
+
const value = readWindowsRegistryBoolean(key, "RemoteDebuggingAllowed");
|
|
159
|
+
if (value === null)
|
|
160
|
+
continue;
|
|
161
|
+
return policyReportFromValue(value, {
|
|
162
|
+
source: "windows-registry",
|
|
163
|
+
source_path: `${key}\\RemoteDebuggingAllowed`,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
function readMacDefaultsBoolean(domain, key) {
|
|
169
|
+
try {
|
|
170
|
+
const raw = execFileSync("defaults", ["read", domain, key], {
|
|
171
|
+
encoding: "utf8",
|
|
172
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
173
|
+
timeout: 1000,
|
|
174
|
+
});
|
|
175
|
+
return parsePolicyBoolean(raw);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function readLinuxPolicyBoolean(dir, key) {
|
|
182
|
+
if (!existsSync(dir))
|
|
183
|
+
return null;
|
|
184
|
+
let files;
|
|
185
|
+
try {
|
|
186
|
+
files = readdirSync(dir)
|
|
187
|
+
.filter((file) => file.endsWith(".json"))
|
|
188
|
+
.sort();
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
for (const file of files) {
|
|
194
|
+
const sourcePath = join(dir, file);
|
|
195
|
+
try {
|
|
196
|
+
const parsed = JSON.parse(readFileSync(sourcePath, "utf8"));
|
|
197
|
+
const raw = parsed[key];
|
|
198
|
+
if (typeof raw === "boolean")
|
|
199
|
+
return { value: raw, sourcePath };
|
|
200
|
+
if (typeof raw === "number") {
|
|
201
|
+
const value = parsePolicyBoolean(String(raw));
|
|
202
|
+
if (value !== null)
|
|
203
|
+
return { value, sourcePath };
|
|
204
|
+
}
|
|
205
|
+
if (typeof raw === "string") {
|
|
206
|
+
const value = parsePolicyBoolean(raw);
|
|
207
|
+
if (value !== null)
|
|
208
|
+
return { value, sourcePath };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
function readWindowsRegistryBoolean(key, valueName) {
|
|
218
|
+
try {
|
|
219
|
+
const raw = execFileSync("reg", ["query", key, "/v", valueName], {
|
|
220
|
+
encoding: "utf8",
|
|
221
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
222
|
+
timeout: 1000,
|
|
223
|
+
});
|
|
224
|
+
const line = raw.split(/\r?\n/).find((entry) => entry.includes(valueName));
|
|
225
|
+
if (!line)
|
|
226
|
+
return null;
|
|
227
|
+
const value = line.trim().split(/\s+/).at(-1);
|
|
228
|
+
return value ? parsePolicyBoolean(value) : null;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function policyRepairCommands() {
|
|
235
|
+
switch (process.platform) {
|
|
236
|
+
case "darwin":
|
|
237
|
+
return [
|
|
238
|
+
"open chrome://policy",
|
|
239
|
+
"Remove any managed profile setting RemoteDebuggingAllowed=false, or install an admin-approved Chrome policy with RemoteDebuggingAllowed=true.",
|
|
240
|
+
"Fully quit Chrome, then run `unicli browser doctor --repair`.",
|
|
241
|
+
];
|
|
242
|
+
case "linux":
|
|
243
|
+
return [
|
|
244
|
+
"Open chrome://policy",
|
|
245
|
+
"Remove RemoteDebuggingAllowed=false from /etc/opt/chrome/policies/* or /etc/chromium/policies/*, or set it to true.",
|
|
246
|
+
"Restart Chrome, then run `unicli browser doctor --repair`.",
|
|
247
|
+
];
|
|
248
|
+
case "win32":
|
|
249
|
+
return [
|
|
250
|
+
"Open chrome://policy",
|
|
251
|
+
"Remove RemoteDebuggingAllowed=0 from HKLM/HKCU Software\\Policies\\Google\\Chrome, or set it to 1.",
|
|
252
|
+
"Restart Chrome, then run `unicli browser doctor --repair`.",
|
|
253
|
+
];
|
|
254
|
+
default:
|
|
255
|
+
return [
|
|
256
|
+
"Open chrome://policy",
|
|
257
|
+
"Ensure RemoteDebuggingAllowed is not false, restart Chrome, then run `unicli browser doctor --repair`.",
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=chrome-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-policy.js","sourceRoot":"","sources":["../../src/browser/chrome-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* Retry logic: max 4 attempts, 500ms for network errors, 1500ms for extension restarts.
|
|
6
6
|
*/
|
|
7
7
|
import { type DaemonAction, type DaemonCommand, type DaemonStatus, type BrowserSessionInfo } from "./protocol.js";
|
|
8
|
+
export declare const BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS = 4;
|
|
9
|
+
export declare const BROWSER_DAEMON_NETWORK_RETRY_DELAY_MS = 500;
|
|
10
|
+
export declare const BROWSER_DAEMON_EXTENSION_RETRY_DELAY_MS = 1500;
|
|
8
11
|
export declare function fetchDaemonStatus(opts?: {
|
|
9
12
|
timeout?: number;
|
|
10
13
|
}): Promise<DaemonStatus | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../../src/browser/daemon-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../../src/browser/daemon-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,mCAAmC,IAAI,CAAC;AACrD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AACzD,eAAO,MAAM,uCAAuC,OAAO,CAAC;AAmD5D,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAe/B;AAED,wBAAsB,uBAAuB,CAAC,IAAI,CAAC,EAAE;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBzB;AAED,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlB;AAED,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAGxD;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG7D;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,GAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,QAAQ,CAAM,GAChD,OAAO,CAAC,OAAO,CAAC,CAiElB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAGlE;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
import { randomBytes } from "node:crypto";
|
|
8
8
|
import { DAEMON_PORT, DAEMON_PORT_CANDIDATES, DAEMON_HOST, } from "./protocol.js";
|
|
9
9
|
const DEFAULT_COMMAND_TIMEOUT = 30_000;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
10
|
+
export const BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS = 4;
|
|
11
|
+
export const BROWSER_DAEMON_NETWORK_RETRY_DELAY_MS = 500;
|
|
12
|
+
export const BROWSER_DAEMON_EXTENSION_RETRY_DELAY_MS = 1500;
|
|
13
13
|
const COMPAT_DAEMON_PORT_ENV = "UNICLI_COMPAT_DAEMON_PORT";
|
|
14
14
|
const COMPAT_DAEMON_HEADER = "X-Unicli-Compat";
|
|
15
15
|
function getPort() {
|
|
@@ -139,12 +139,8 @@ export async function sendCommand(action, params = {}) {
|
|
|
139
139
|
const status = await fetchDaemonStatus({ timeout: 500 });
|
|
140
140
|
const port = status?.port ?? getPort();
|
|
141
141
|
const focusEnv = process.env.UNICLI_WINDOW_FOCUSED;
|
|
142
|
-
const windowFocused = focusEnv === "1" || focusEnv === "true"
|
|
143
|
-
|
|
144
|
-
: focusEnv === "0" || focusEnv === "false"
|
|
145
|
-
? false
|
|
146
|
-
: undefined;
|
|
147
|
-
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
142
|
+
const windowFocused = focusEnv === "1" || focusEnv === "true" ? true : false;
|
|
143
|
+
for (let attempt = 1; attempt <= BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS; attempt++) {
|
|
148
144
|
const id = generateId(); // Fresh ID per attempt
|
|
149
145
|
try {
|
|
150
146
|
const resp = await fetch(`${baseUrl(port)}/command`, {
|
|
@@ -157,15 +153,16 @@ export async function sendCommand(action, params = {}) {
|
|
|
157
153
|
id,
|
|
158
154
|
action,
|
|
159
155
|
...params,
|
|
160
|
-
|
|
156
|
+
windowFocused,
|
|
161
157
|
}),
|
|
162
158
|
signal: AbortSignal.timeout(timeout),
|
|
163
159
|
});
|
|
164
160
|
const result = (await resp.json());
|
|
165
161
|
if (!result.ok) {
|
|
166
162
|
const err = new Error(result.error ?? `Command failed: ${action}`);
|
|
167
|
-
if (isTransientBrowserError(err) &&
|
|
168
|
-
|
|
163
|
+
if (isTransientBrowserError(err) &&
|
|
164
|
+
attempt < BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS) {
|
|
165
|
+
await new Promise((r) => setTimeout(r, BROWSER_DAEMON_EXTENSION_RETRY_DELAY_MS));
|
|
169
166
|
continue;
|
|
170
167
|
}
|
|
171
168
|
throw err;
|
|
@@ -173,9 +170,10 @@ export async function sendCommand(action, params = {}) {
|
|
|
173
170
|
return result.data ?? result;
|
|
174
171
|
}
|
|
175
172
|
catch (err) {
|
|
176
|
-
if (err instanceof TypeError &&
|
|
173
|
+
if (err instanceof TypeError &&
|
|
174
|
+
attempt < BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS) {
|
|
177
175
|
// Network error (daemon unreachable)
|
|
178
|
-
await new Promise((r) => setTimeout(r,
|
|
176
|
+
await new Promise((r) => setTimeout(r, BROWSER_DAEMON_NETWORK_RETRY_DELAY_MS));
|
|
179
177
|
continue;
|
|
180
178
|
}
|
|
181
179
|
if (err instanceof DOMException && err.name === "AbortError") {
|
|
@@ -184,7 +182,7 @@ export async function sendCommand(action, params = {}) {
|
|
|
184
182
|
throw err;
|
|
185
183
|
}
|
|
186
184
|
}
|
|
187
|
-
throw new Error(`Command failed after ${
|
|
185
|
+
throw new Error(`Command failed after ${String(BROWSER_DAEMON_COMMAND_MAX_ATTEMPTS)} attempts: ${action}`);
|
|
188
186
|
}
|
|
189
187
|
export async function listSessions() {
|
|
190
188
|
const result = await sendCommand("sessions");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/browser/daemon-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,WAAW,GAMZ,MAAM,eAAe,CAAC;AAEvB,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/browser/daemon-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/browser/doctor.ts
|
|
3
|
+
* @does Build a machine-readable browser reliability report from live daemon, profile, CDP, layering, repair, and retry state.
|
|
4
|
+
* @needs src/browser local-profiles/launcher/cdp-client/daemon-client/bridge/protocol
|
|
5
|
+
* @feeds src/commands/browser/index.ts, tests/unit/commands/browser.test.ts
|
|
6
|
+
* @breaks Probe failures are returned as diagnostics in the report; raw cookies, auth headers, and endpoint secrets are never emitted.
|
|
7
|
+
*/
|
|
8
|
+
import { type Chrome136RemoteDebuggingGuidance, type ChromeRemoteDebuggingPolicyReport } from "./chrome-policy.js";
|
|
9
|
+
export type BrowserDoctorStatus = "ready" | "needs-action";
|
|
10
|
+
export type BrowserCapabilityId = "cookie_reuse" | "background_operation" | "browser_use" | "page_layering" | "direct_connect" | "stability" | "reliability" | "repair" | "retry";
|
|
11
|
+
export type BrowserCapabilityStatus = "ready" | "needs-action";
|
|
12
|
+
export interface BrowserCapabilityCheck {
|
|
13
|
+
status: BrowserCapabilityStatus;
|
|
14
|
+
evidence: string[];
|
|
15
|
+
repair_commands: string[];
|
|
16
|
+
diagnostics?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface BrowserDoctorCheck {
|
|
19
|
+
name: string;
|
|
20
|
+
ok: boolean;
|
|
21
|
+
status: BrowserCapabilityStatus;
|
|
22
|
+
detail: string;
|
|
23
|
+
next_step: string;
|
|
24
|
+
commands?: string[];
|
|
25
|
+
evidence?: string[];
|
|
26
|
+
auto_repairable?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface BrowserSelfRepairAction {
|
|
29
|
+
id: string;
|
|
30
|
+
status: "available" | "not-needed" | "manual" | "blocked";
|
|
31
|
+
command: string;
|
|
32
|
+
safe: boolean;
|
|
33
|
+
detail: string;
|
|
34
|
+
expected_result: string;
|
|
35
|
+
}
|
|
36
|
+
export interface BrowserRepairAttempt {
|
|
37
|
+
status: "repaired" | "already-ready" | "failed";
|
|
38
|
+
actions: Array<{
|
|
39
|
+
id: string;
|
|
40
|
+
status: "repaired" | "skipped" | "failed";
|
|
41
|
+
command: string;
|
|
42
|
+
detail: string;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export interface BrowserDoctorReport {
|
|
46
|
+
status: BrowserDoctorStatus;
|
|
47
|
+
cookie_reuse: {
|
|
48
|
+
status: "ready" | "needs-profile";
|
|
49
|
+
profiles_count: number;
|
|
50
|
+
raw_cookie_values_returned: false;
|
|
51
|
+
raw_cookie_export_supported: true;
|
|
52
|
+
direct_browser_cookie_import_supported: true;
|
|
53
|
+
command: "unicli browser profiles --json";
|
|
54
|
+
direct_browser_cookie_import_command: "unicli auth import <site> --domain <domain> --browser <id> --profile <name>";
|
|
55
|
+
explicit_cookie_export_command: "unicli browser cookies <domain> --profile-id <id>";
|
|
56
|
+
strategy: string[];
|
|
57
|
+
reuse_paths: string[];
|
|
58
|
+
profiles: Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
browser_name: string;
|
|
61
|
+
profile_dir: string;
|
|
62
|
+
profile_name: string;
|
|
63
|
+
debug_port_state: string;
|
|
64
|
+
}>;
|
|
65
|
+
};
|
|
66
|
+
background_operation: {
|
|
67
|
+
status: "ready" | "needs-extension" | "stopped" | "blocked";
|
|
68
|
+
daemon: {
|
|
69
|
+
status: "running" | "stopped" | "blocked";
|
|
70
|
+
port?: number;
|
|
71
|
+
extension_connected: boolean;
|
|
72
|
+
pending?: number;
|
|
73
|
+
memory_mb?: number;
|
|
74
|
+
conflict?: string;
|
|
75
|
+
error?: string;
|
|
76
|
+
};
|
|
77
|
+
sessions_count: number;
|
|
78
|
+
session_error?: string;
|
|
79
|
+
controls: string[];
|
|
80
|
+
};
|
|
81
|
+
browser_use: {
|
|
82
|
+
modes: string[];
|
|
83
|
+
layers: Array<{
|
|
84
|
+
name: string;
|
|
85
|
+
owner: string;
|
|
86
|
+
proves: string;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
direct_connect: {
|
|
90
|
+
local_cdp: {
|
|
91
|
+
port: number;
|
|
92
|
+
reachable: boolean;
|
|
93
|
+
command: "unicli browser start";
|
|
94
|
+
error?: string;
|
|
95
|
+
};
|
|
96
|
+
remote_cdp: {
|
|
97
|
+
configured: boolean;
|
|
98
|
+
endpoint?: string;
|
|
99
|
+
header_count: number;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
chrome_remote_debugging: {
|
|
103
|
+
chrome_136: Chrome136RemoteDebuggingGuidance;
|
|
104
|
+
policy: ChromeRemoteDebuggingPolicyReport;
|
|
105
|
+
};
|
|
106
|
+
stability_reliability: {
|
|
107
|
+
guards: string[];
|
|
108
|
+
evidence: string[];
|
|
109
|
+
background_safe: boolean;
|
|
110
|
+
};
|
|
111
|
+
repair_retry: {
|
|
112
|
+
retry_policy: Array<{
|
|
113
|
+
surface: string;
|
|
114
|
+
max_attempts: number;
|
|
115
|
+
retry_delay_ms?: number;
|
|
116
|
+
network_retry_delay_ms?: number;
|
|
117
|
+
extension_retry_delay_ms?: number;
|
|
118
|
+
min_delay_ms?: number;
|
|
119
|
+
max_delay_ms?: number;
|
|
120
|
+
}>;
|
|
121
|
+
recovery_commands: string[];
|
|
122
|
+
};
|
|
123
|
+
default_path: {
|
|
124
|
+
status: "ready" | "needs-action";
|
|
125
|
+
mode: "local-cdp-automation-profile" | "remote-cdp" | "daemon-extension" | "none";
|
|
126
|
+
ready: boolean;
|
|
127
|
+
next_step: string;
|
|
128
|
+
commands: string[];
|
|
129
|
+
detail: string;
|
|
130
|
+
};
|
|
131
|
+
checks: BrowserDoctorCheck[];
|
|
132
|
+
self_repair: {
|
|
133
|
+
safe_command: "unicli browser doctor --repair";
|
|
134
|
+
actions: BrowserSelfRepairAction[];
|
|
135
|
+
};
|
|
136
|
+
repair_attempt?: BrowserRepairAttempt;
|
|
137
|
+
next_actions: string[];
|
|
138
|
+
completeness: {
|
|
139
|
+
complete: boolean;
|
|
140
|
+
required_capabilities: BrowserCapabilityId[];
|
|
141
|
+
missing: BrowserCapabilityId[];
|
|
142
|
+
matrix: Record<BrowserCapabilityId, BrowserCapabilityCheck>;
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export declare function runBrowserDoctor(repairAttempt?: BrowserRepairAttempt): Promise<BrowserDoctorReport>;
|
|
146
|
+
export declare function repairBrowserDoctor(): Promise<BrowserRepairAttempt>;
|
|
147
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/browser/doctor.ts"],"names":[],"mappings":"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"}
|