@aexol/spectral 0.9.212 → 0.9.216
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/generated-images.d.ts +180 -0
- package/dist/backend/generated-images.d.ts.map +1 -0
- package/dist/backend/generated-images.js +483 -0
- package/dist/backend/machine-routing.d.ts +25 -0
- package/dist/backend/machine-routing.d.ts.map +1 -0
- package/dist/backend/machine-routing.js +35 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +4 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +20 -2
- package/dist/extensions/browser/browser-service.d.ts +75 -1
- package/dist/extensions/browser/browser-service.d.ts.map +1 -1
- package/dist/extensions/browser/browser-service.js +600 -34
- package/dist/extensions/browser/index.d.ts +10 -4
- package/dist/extensions/browser/index.d.ts.map +1 -1
- package/dist/extensions/browser/index.js +44 -5
- package/dist/extensions/browser/stream/stream-tool.d.ts +10 -0
- package/dist/extensions/browser/stream/stream-tool.d.ts.map +1 -1
- package/dist/extensions/browser/stream/stream-tool.js +42 -14
- package/dist/extensions/browser/tools/core.d.ts.map +1 -1
- package/dist/extensions/browser/tools/core.js +63 -2
- package/dist/extensions/desktop-control/index.d.ts +55 -0
- package/dist/extensions/desktop-control/index.d.ts.map +1 -0
- package/dist/extensions/desktop-control/index.js +633 -0
- package/dist/extensions/desktop-control/keys.d.ts +33 -0
- package/dist/extensions/desktop-control/keys.d.ts.map +1 -0
- package/dist/extensions/desktop-control/keys.js +170 -0
- package/dist/extensions/desktop-control/linux.d.ts +26 -0
- package/dist/extensions/desktop-control/linux.d.ts.map +1 -0
- package/dist/extensions/desktop-control/linux.js +195 -0
- package/dist/extensions/desktop-control/macos.d.ts +53 -0
- package/dist/extensions/desktop-control/macos.d.ts.map +1 -0
- package/dist/extensions/desktop-control/macos.js +382 -0
- package/dist/extensions/desktop-control/safety.d.ts +89 -0
- package/dist/extensions/desktop-control/safety.d.ts.map +1 -0
- package/dist/extensions/desktop-control/safety.js +157 -0
- package/dist/extensions/desktop-control/types.d.ts +79 -0
- package/dist/extensions/desktop-control/types.d.ts.map +1 -0
- package/dist/extensions/desktop-control/types.js +10 -0
- package/dist/extensions/desktop-control/windows.d.ts +31 -0
- package/dist/extensions/desktop-control/windows.d.ts.map +1 -0
- package/dist/extensions/desktop-control/windows.js +276 -0
- package/dist/extensions/desktop-screenshot/index.d.ts +103 -0
- package/dist/extensions/desktop-screenshot/index.d.ts.map +1 -1
- package/dist/extensions/desktop-screenshot/index.js +363 -17
- package/dist/extensions/image-generation/index.d.ts.map +1 -1
- package/dist/extensions/image-generation/index.js +133 -34
- package/dist/extensions/seo/index.d.ts.map +1 -1
- package/dist/extensions/seo/index.js +4 -0
- package/dist/extensions/seo/tools/backend-bridge.d.ts +4 -0
- package/dist/extensions/seo/tools/backend-bridge.d.ts.map +1 -0
- package/dist/extensions/seo/tools/backend-bridge.js +378 -0
- package/dist/extensions/seo/tools/full-audit.d.ts +2 -0
- package/dist/extensions/seo/tools/full-audit.d.ts.map +1 -1
- package/dist/extensions/seo/tools/full-audit.js +1 -1
- package/dist/extensions/seo/tools/report.d.ts +10 -0
- package/dist/extensions/seo/tools/report.d.ts.map +1 -1
- package/dist/extensions/seo/tools/report.js +1 -1
- package/dist/extensions/spectral-vision-fallback.d.ts.map +1 -1
- package/dist/extensions/spectral-vision-fallback.js +11 -1
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +121 -4
- package/dist/generated/zeus/index.d.ts +527 -0
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/mcp/tool-registrar.d.ts.map +1 -1
- package/dist/mcp/tool-registrar.js +5 -2
- package/dist/mcp/types.d.ts +5 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/relay/dispatcher.d.ts +12 -1
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +44 -42
- package/dist/sdk/ai/providers/faux.js +1 -1
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +69 -16
- package/dist/sdk/ai/providers/openrouter-images.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openrouter-images.js +58 -9
- package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
- package/dist/sdk/ai/providers/simple-options.js +2 -0
- package/dist/sdk/ai/types.d.ts +37 -1
- package/dist/sdk/ai/types.d.ts.map +1 -1
- package/dist/sdk/ai/utils/hosted-image-resolver.d.ts +60 -0
- package/dist/sdk/ai/utils/hosted-image-resolver.d.ts.map +1 -0
- package/dist/sdk/ai/utils/hosted-image-resolver.js +75 -0
- package/dist/sdk/ai/utils/image-source.d.ts +168 -0
- package/dist/sdk/ai/utils/image-source.d.ts.map +1 -0
- package/dist/sdk/ai/utils/image-source.js +487 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/native-extensions.js +14 -0
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +9 -0
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.js +15 -9
- package/dist/sdk/coding-agent/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/sdk/coding-agent/modes/rpc/rpc-mode.js +16 -3
- package/dist/sdk/coding-agent/utils/image-resize.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/image-resize.js +7 -3
- package/dist/server/agent-bridge.d.ts +14 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +105 -26
- package/dist/server/handlers/queue.d.ts.map +1 -1
- package/dist/server/handlers/queue.js +11 -34
- package/dist/server/image-attachments.d.ts +109 -0
- package/dist/server/image-attachments.d.ts.map +1 -0
- package/dist/server/image-attachments.js +195 -0
- package/dist/server/session-stream.d.ts +67 -0
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +222 -23
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +10 -31
- package/dist/server/ui/terminal-confirm.d.ts +145 -0
- package/dist/server/ui/terminal-confirm.d.ts.map +1 -0
- package/dist/server/ui/terminal-confirm.js +333 -0
- package/dist/server/wire.d.ts +30 -5
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend routing for CLI-side image hosting.
|
|
3
|
+
*
|
|
4
|
+
* `uploadImage()` (see `./generated-images.ts`) needs the backend base url
|
|
5
|
+
* and the machine JWT. Those are exactly the credentials `agent-bridge.ts`
|
|
6
|
+
* receives for text models, so anything in the CLI that wants to host an
|
|
7
|
+
* image (generated images, tool screenshots, ...) resolves them the same way.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when the CLI is not logged in / the JWT expired — callers
|
|
10
|
+
* then keep the image local (inline base64 / file on disk) instead of
|
|
11
|
+
* failing the turn.
|
|
12
|
+
*
|
|
13
|
+
* @module @spectral/backend/machine-routing
|
|
14
|
+
*/
|
|
15
|
+
export interface BackendRouting {
|
|
16
|
+
backendUrl: string;
|
|
17
|
+
machineJwt: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve `backendUrl` + `machineJwt`, mirroring how `agent-bridge.ts` obtains
|
|
21
|
+
* them (`serve.ts` → `registration.record`). `SPECTRAL_BACKEND_URL` wins over
|
|
22
|
+
* the configured api url so dev/staging overrides keep working.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveBackendRouting(): Promise<BackendRouting | null>;
|
|
25
|
+
//# sourceMappingURL=machine-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-routing.d.ts","sourceRoot":"","sources":["../../src/backend/machine-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAY5E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend routing for CLI-side image hosting.
|
|
3
|
+
*
|
|
4
|
+
* `uploadImage()` (see `./generated-images.ts`) needs the backend base url
|
|
5
|
+
* and the machine JWT. Those are exactly the credentials `agent-bridge.ts`
|
|
6
|
+
* receives for text models, so anything in the CLI that wants to host an
|
|
7
|
+
* image (generated images, tool screenshots, ...) resolves them the same way.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when the CLI is not logged in / the JWT expired — callers
|
|
10
|
+
* then keep the image local (inline base64 / file on disk) instead of
|
|
11
|
+
* failing the turn.
|
|
12
|
+
*
|
|
13
|
+
* @module @spectral/backend/machine-routing
|
|
14
|
+
*/
|
|
15
|
+
import { getApiUrl, readConfig } from "../config.js";
|
|
16
|
+
import { loadMachine } from "../relay/machine-store.js";
|
|
17
|
+
import { isJwtExpired } from "../relay/registration.js";
|
|
18
|
+
/**
|
|
19
|
+
* Resolve `backendUrl` + `machineJwt`, mirroring how `agent-bridge.ts` obtains
|
|
20
|
+
* them (`serve.ts` → `registration.record`). `SPECTRAL_BACKEND_URL` wins over
|
|
21
|
+
* the configured api url so dev/staging overrides keep working.
|
|
22
|
+
*/
|
|
23
|
+
export async function resolveBackendRouting() {
|
|
24
|
+
const cfg = await readConfig();
|
|
25
|
+
if (!cfg)
|
|
26
|
+
return null;
|
|
27
|
+
const machine = await loadMachine();
|
|
28
|
+
if (machine?.machineJwt && !isJwtExpired(machine.machineJwt)) {
|
|
29
|
+
const backendUrl = process.env.SPECTRAL_BACKEND_URL ||
|
|
30
|
+
getApiUrl(cfg.apiUrl).replace(/\/mcp\/?$/, "");
|
|
31
|
+
return { backendUrl, machineJwt: machine.machineJwt };
|
|
32
|
+
}
|
|
33
|
+
// No usable machine JWT — let the caller fall back to the local path.
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB/C"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -5,10 +5,14 @@
|
|
|
5
5
|
* filesystem itself misbehaves (in which case we surface the OS error).
|
|
6
6
|
*/
|
|
7
7
|
import pc from "picocolors";
|
|
8
|
+
import { invalidateHostedImageUrl } from "../backend/generated-images.js";
|
|
8
9
|
import { CONFIG_FILE, deleteConfig } from "../config.js";
|
|
9
10
|
export async function runLogout() {
|
|
10
11
|
try {
|
|
11
12
|
const removed = await deleteConfig();
|
|
13
|
+
// Presigned urls are minted under the (now deleted) credentials — drop
|
|
14
|
+
// them so a later login cannot hand out a url minted by the old identity.
|
|
15
|
+
invalidateHostedImageUrl();
|
|
12
16
|
if (removed) {
|
|
13
17
|
process.stdout.write(pc.green(`✓ Logged out. Removed ${CONFIG_FILE}\n`));
|
|
14
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAYlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAarE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAYlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAarE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4kBlF;AAmFD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAc5E"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -312,7 +312,16 @@ export async function runServe(opts = {}) {
|
|
|
312
312
|
publishMetaEvent: deferredPublishMetaEvent,
|
|
313
313
|
mcpState: getLiveMcpState() ?? undefined,
|
|
314
314
|
devProcessRegistry,
|
|
315
|
-
refreshNativeExtensions: () =>
|
|
315
|
+
refreshNativeExtensions: async () => {
|
|
316
|
+
await refreshNativeExtensionsInfo(cwd, r, registration.record.machineId);
|
|
317
|
+
// Parity with the `config_patch` path: also hot-reload running
|
|
318
|
+
// sessions so a manual refresh applies immediately.
|
|
319
|
+
// Swallow: the manager isolates per-session failures, but the
|
|
320
|
+
// aggregate promise must never become an unhandled rejection.
|
|
321
|
+
void manager.reloadExtensions().catch((err) => {
|
|
322
|
+
process.stderr.write(`[serve] extension reload failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
323
|
+
});
|
|
324
|
+
},
|
|
316
325
|
refreshCloudAgents: (teamId) => refreshCloudAgentsImpl({ backendUrl, machineJwt: registration.record.machineJwt, teamId }),
|
|
317
326
|
}).then((response) => {
|
|
318
327
|
r.send(response);
|
|
@@ -360,11 +369,12 @@ export async function runServe(opts = {}) {
|
|
|
360
369
|
return;
|
|
361
370
|
}
|
|
362
371
|
if (frame.kind === "config_patch") {
|
|
363
|
-
handleConfigPatch(frame, {
|
|
372
|
+
void handleConfigPatch(frame, {
|
|
364
373
|
cwd,
|
|
365
374
|
agentDir: getAgentDir(),
|
|
366
375
|
relay: r,
|
|
367
376
|
machineId: registration.record.machineId,
|
|
377
|
+
manager,
|
|
368
378
|
});
|
|
369
379
|
return;
|
|
370
380
|
}
|
|
@@ -690,6 +700,14 @@ async function handleConfigPatch(frame, deps) {
|
|
|
690
700
|
settingsManager.setDisabledNativeExtensions([...disabledNative]);
|
|
691
701
|
settingsManager.setEnabledNativeExtensions([...enabledNative]);
|
|
692
702
|
await settingsManager.flush();
|
|
703
|
+
// Hot-reload already-running sessions so the toggle takes effect without
|
|
704
|
+
// restarting them. Fire-and-forget: busy sessions are skipped by the
|
|
705
|
+
// manager and pick the change up on their next session/bridge creation.
|
|
706
|
+
// Swallow: per-session failures are isolated by the manager; this only
|
|
707
|
+
// guards against an unhandled rejection from the aggregate promise.
|
|
708
|
+
void deps.manager?.reloadExtensions().catch((err) => {
|
|
709
|
+
process.stderr.write(`[serve] extension reload failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
710
|
+
});
|
|
693
711
|
// Broadcast updated state back to browsers
|
|
694
712
|
await refreshNativeExtensionsInfo(deps.cwd, deps.relay, deps.machineId);
|
|
695
713
|
}
|
|
@@ -36,6 +36,33 @@ export declare class BrowserService {
|
|
|
36
36
|
private _recording;
|
|
37
37
|
private closePromise;
|
|
38
38
|
private launchLock;
|
|
39
|
+
/** Unique marker identifying the process tree of the current launch. */
|
|
40
|
+
private launchToken;
|
|
41
|
+
/**
|
|
42
|
+
* Token of the current *or previous* launch — only cleared by the next
|
|
43
|
+
* launch. Post-close fallbacks (`forceKillBrowserProcess()` / `browser_quit`)
|
|
44
|
+
* still need it to find the process tree after `close()` nulled launchToken.
|
|
45
|
+
* Every kill through this token is marker-verified first, so a recycled pid
|
|
46
|
+
* is never signalled.
|
|
47
|
+
*/
|
|
48
|
+
private lastLaunchToken;
|
|
49
|
+
/**
|
|
50
|
+
* Root pid + full marker-matched tree, resolved once after a successful
|
|
51
|
+
* launch (single `ps` call) so exit/signal handlers can SIGKILL without
|
|
52
|
+
* running `execSync` from inside the handler.
|
|
53
|
+
*/
|
|
54
|
+
private browserPid;
|
|
55
|
+
private browserPids;
|
|
56
|
+
/**
|
|
57
|
+
* Evidence for the synchronous teardown path: the pids that were matched by
|
|
58
|
+
* *our* marker at launch time, when they were matched and under which token.
|
|
59
|
+
* `killBrowserProcessSync()` may only signal pids listed here — a pid that we
|
|
60
|
+
* never marker-verified (or that no longer carries the marker) can belong to
|
|
61
|
+
* somebody else by now.
|
|
62
|
+
*/
|
|
63
|
+
private verifiedBrowserPids;
|
|
64
|
+
private verifiedBrowserPidsAt;
|
|
65
|
+
private verifiedBrowserPidsToken;
|
|
39
66
|
constructor(config?: Partial<BrowserConfig>);
|
|
40
67
|
static getInstance(config?: Partial<BrowserConfig>): BrowserService;
|
|
41
68
|
static resetInstance(): void;
|
|
@@ -97,6 +124,45 @@ export declare class BrowserService {
|
|
|
97
124
|
getNetworkRequest(index: number): NetworkRequest | undefined;
|
|
98
125
|
clearNetworkRequests(): void;
|
|
99
126
|
close(): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Last-resort teardown used by the `browser_quit` tool: SIGKILL the browser
|
|
129
|
+
* process without waiting for a graceful close. Safe to call at any time.
|
|
130
|
+
*/
|
|
131
|
+
forceKillBrowserProcess(): void;
|
|
132
|
+
/**
|
|
133
|
+
* SIGKILL the browser process behind `browser` (defaults to the live one).
|
|
134
|
+
* `browser.close()` can hang, be rejected or be abandoned while the host
|
|
135
|
+
* process is shutting down, which leaves a visible Chromium window behind.
|
|
136
|
+
*
|
|
137
|
+
* `opts.scanProcessTable === false` skips `findBrowserPids()` (a `ps -eo`
|
|
138
|
+
* fork) — use it when nothing indicates a live browser. Only pids we already
|
|
139
|
+
* know about (or the one `browser.process()` exposes) are then signalled,
|
|
140
|
+
* each still marker-verified before the SIGKILL.
|
|
141
|
+
*/
|
|
142
|
+
killBrowserProcess(browser?: Browser | null, opts?: {
|
|
143
|
+
scanProcessTable?: boolean;
|
|
144
|
+
}): void;
|
|
145
|
+
/**
|
|
146
|
+
* Exit/signal-handler path: SIGKILL the pids resolved right after launch.
|
|
147
|
+
* Deliberately execSync-free — spawning `ps` from inside an `exit` handler is
|
|
148
|
+
* unreliable (and can silently no-op).
|
|
149
|
+
*
|
|
150
|
+
* Never signals a pid that may not be ours: only pids whose marker was
|
|
151
|
+
* verified at launch time are eligible, and each candidate still has to pass
|
|
152
|
+
* a synchronous identity check — a `process.kill(pid, 0)` probe plus, where
|
|
153
|
+
* the platform allows it, a `/proc/<pid>/cmdline` read. Where no synchronous
|
|
154
|
+
* verification exists (no `/proc`), the launch-time evidence is trusted only
|
|
155
|
+
* while it is fresh (`PID_VERIFY_TTL_MS`): an orphaned browser window is
|
|
156
|
+
* preferable to SIGKILLing a recycled pid that now belongs to someone else.
|
|
157
|
+
*/
|
|
158
|
+
killBrowserProcessSync(): void;
|
|
159
|
+
/**
|
|
160
|
+
* Resolve the browser's pids once, right after a successful launch, so the
|
|
161
|
+
* synchronous teardown path never has to inspect the process table again.
|
|
162
|
+
*/
|
|
163
|
+
private resolveBrowserPids;
|
|
164
|
+
/** Find the pids of the browser processes we spawned (marker match). */
|
|
165
|
+
private findBrowserPids;
|
|
100
166
|
startRecording(opts?: {
|
|
101
167
|
outputDir?: string;
|
|
102
168
|
filename?: string;
|
|
@@ -104,7 +170,15 @@ export declare class BrowserService {
|
|
|
104
170
|
outputPath: string;
|
|
105
171
|
startedAt: number;
|
|
106
172
|
}>;
|
|
107
|
-
|
|
173
|
+
/**
|
|
174
|
+
* @param opts.relaunch Re-open a fresh non-recording context afterwards
|
|
175
|
+
* (default true, what `browser_record_stop` needs). Pass `false` when the
|
|
176
|
+
* session is shutting down — otherwise a brand new Chromium window is
|
|
177
|
+
* spawned only to be closed again immediately.
|
|
178
|
+
*/
|
|
179
|
+
stopRecording(opts?: {
|
|
180
|
+
relaunch?: boolean;
|
|
181
|
+
}): Promise<{
|
|
108
182
|
outputPath: string;
|
|
109
183
|
durationSeconds: number;
|
|
110
184
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"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"}
|