@modelprofile.com/browser-runtime 1.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.
- package/.smartconfig.json +34 -0
- package/changelog.md +11 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/actions.d.ts +3 -0
- package/dist_ts/actions.js +215 -0
- package/dist_ts/classes.artifactstore.d.ts +38 -0
- package/dist_ts/classes.artifactstore.js +344 -0
- package/dist_ts/classes.egressproxy.d.ts +67 -0
- package/dist_ts/classes.egressproxy.js +830 -0
- package/dist_ts/classes.flexprovider.d.ts +9 -0
- package/dist_ts/classes.flexprovider.js +117 -0
- package/dist_ts/classes.framed.d.ts +52 -0
- package/dist_ts/classes.framed.js +557 -0
- package/dist_ts/classes.runtime.d.ts +202 -0
- package/dist_ts/classes.runtime.js +1667 -0
- package/dist_ts/confinement.d.ts +2 -0
- package/dist_ts/confinement.js +63 -0
- package/dist_ts/errors.d.ts +7 -0
- package/dist_ts/errors.js +40 -0
- package/dist_ts/index.d.ts +11 -0
- package/dist_ts/index.js +9 -0
- package/dist_ts/interfaces.d.ts +287 -0
- package/dist_ts/interfaces.js +2 -0
- package/dist_ts/internal.testing.d.ts +9 -0
- package/dist_ts/internal.testing.js +2 -0
- package/dist_ts/mcp.d.ts +4 -0
- package/dist_ts/mcp.js +196 -0
- package/dist_ts/plugins.d.ts +20 -0
- package/dist_ts/plugins.js +24 -0
- package/dist_ts/utils.d.ts +25 -0
- package/dist_ts/utils.js +143 -0
- package/license.md +21 -0
- package/package.json +59 -0
- package/readme.hints.md +35 -0
- package/readme.md +181 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/actions.ts +241 -0
- package/ts/classes.artifactstore.ts +432 -0
- package/ts/classes.egressproxy.ts +1005 -0
- package/ts/classes.flexprovider.ts +134 -0
- package/ts/classes.framed.ts +649 -0
- package/ts/classes.runtime.ts +2135 -0
- package/ts/confinement.ts +90 -0
- package/ts/errors.ts +63 -0
- package/ts/index.ts +52 -0
- package/ts/interfaces.ts +375 -0
- package/ts/internal.testing.ts +18 -0
- package/ts/mcp.ts +230 -0
- package/ts/plugins.ts +28 -0
- package/ts/utils.ts +188 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { BrowserRuntimeError } from './errors.js';
|
|
3
|
+
const listenOnUnsupportedPort = async (allowedPorts, onRequest) => {
|
|
4
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
5
|
+
const server = plugins.http.createServer((_request, response) => {
|
|
6
|
+
onRequest();
|
|
7
|
+
response.writeHead(204);
|
|
8
|
+
response.end();
|
|
9
|
+
});
|
|
10
|
+
await new Promise((resolve, reject) => {
|
|
11
|
+
server.once('error', reject);
|
|
12
|
+
server.listen(0, '127.0.0.1', resolve);
|
|
13
|
+
});
|
|
14
|
+
const address = server.address();
|
|
15
|
+
if (address && typeof address !== 'string' && !allowedPorts.has(address.port)) {
|
|
16
|
+
return { server, port: address.port };
|
|
17
|
+
}
|
|
18
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
19
|
+
}
|
|
20
|
+
throw new BrowserRuntimeError('CONFINEMENT_FAILED');
|
|
21
|
+
};
|
|
22
|
+
export const runProductionConfinementProbe = async (context) => {
|
|
23
|
+
let originHits = 0;
|
|
24
|
+
const fixture = await listenOnUnsupportedPort(new Set(context.proxy.allowedTargetPorts), () => { originHits += 1; });
|
|
25
|
+
const closeFixture = async () => new Promise((resolve) => {
|
|
26
|
+
fixture.server.close(() => resolve());
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
const beforeLoopback = context.proxy.getStats();
|
|
30
|
+
await context.session.navigate({ url: `http://127.0.0.1:${fixture.port}/browser-runtime-probe`, timeoutMs: 3000 }, { signal: context.signal }).catch(() => undefined);
|
|
31
|
+
const afterLoopback = context.proxy.getStats();
|
|
32
|
+
if (originHits !== 0
|
|
33
|
+
|| afterLoopback.ordinaryRequests <= beforeLoopback.ordinaryRequests
|
|
34
|
+
|| afterLoopback.rejectedRequests <= beforeLoopback.rejectedRequests) {
|
|
35
|
+
throw new BrowserRuntimeError('CONFINEMENT_FAILED');
|
|
36
|
+
}
|
|
37
|
+
const beforeInvalid = context.proxy.getStats();
|
|
38
|
+
await context.session.navigate({ url: 'http://browser-runtime-confinement.invalid/', timeoutMs: 3000 }, { signal: context.signal }).catch(() => undefined);
|
|
39
|
+
const afterInvalid = context.proxy.getStats();
|
|
40
|
+
if (afterInvalid.ordinaryRequests <= beforeInvalid.ordinaryRequests
|
|
41
|
+
|| afterInvalid.rejectedRequests <= beforeInvalid.rejectedRequests) {
|
|
42
|
+
throw new BrowserRuntimeError('CONFINEMENT_FAILED');
|
|
43
|
+
}
|
|
44
|
+
const result = await context.session.evaluate(`new Promise(async (resolve) => {
|
|
45
|
+
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:1.1.1.1:3478' }] });
|
|
46
|
+
let emitted = false;
|
|
47
|
+
pc.onicecandidate = (event) => { if (event.candidate) emitted = true; };
|
|
48
|
+
pc.createDataChannel('probe');
|
|
49
|
+
try { await pc.setLocalDescription(await pc.createOffer()); } catch {}
|
|
50
|
+
setTimeout(() => { pc.close(); resolve({ candidateEmitted: emitted }); }, 1000);
|
|
51
|
+
})`, { timeoutMs: 2500, maxOutputBytes: 1024 }, { signal: context.signal });
|
|
52
|
+
if (!result
|
|
53
|
+
|| typeof result !== 'object'
|
|
54
|
+
|| Array.isArray(result)
|
|
55
|
+
|| result.candidateEmitted !== false) {
|
|
56
|
+
throw new BrowserRuntimeError('CONFINEMENT_FAILED');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await closeFixture();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmluZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jb25maW5lbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEQsTUFBTSx1QkFBdUIsR0FBRyxLQUFLLEVBQ25DLFlBQWlDLEVBQ2pDLFNBQXFCLEVBQ21DLEVBQUU7SUFDMUQsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDOUQsU0FBUyxFQUFFLENBQUM7WUFDWixRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type TBrowserRuntimeErrorCode = 'ABORTED' | 'AUTHORIZATION_DENIED' | 'BUSY' | 'CAPABILITY_EXPIRED' | 'CAPABILITY_INVALID' | 'CAPABILITY_REVOKED' | 'CONFINEMENT_FAILED' | 'EGRESS_DENIED' | 'FENCED' | 'FRAME_TOO_LARGE' | 'INVALID_INPUT' | 'LOCKED' | 'NOT_RUNNING' | 'PROTOCOL_ERROR' | 'QUOTA_EXCEEDED' | 'TIMEOUT';
|
|
2
|
+
export declare class BrowserRuntimeError extends Error {
|
|
3
|
+
readonly code: TBrowserRuntimeErrorCode;
|
|
4
|
+
constructor(code: TBrowserRuntimeErrorCode, internalMessage?: string);
|
|
5
|
+
get publicMessage(): string;
|
|
6
|
+
}
|
|
7
|
+
export declare const toBrowserRuntimeError: (error: unknown) => BrowserRuntimeError;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const publicMessages = {
|
|
2
|
+
ABORTED: 'The operation was aborted.',
|
|
3
|
+
AUTHORIZATION_DENIED: 'Capability authorization was denied.',
|
|
4
|
+
BUSY: 'The browser project is busy.',
|
|
5
|
+
CAPABILITY_EXPIRED: 'The capability has expired.',
|
|
6
|
+
CAPABILITY_INVALID: 'The capability is invalid.',
|
|
7
|
+
CAPABILITY_REVOKED: 'The capability has been revoked.',
|
|
8
|
+
CONFINEMENT_FAILED: 'Browser confinement could not be confirmed.',
|
|
9
|
+
EGRESS_DENIED: 'The egress target was denied.',
|
|
10
|
+
FENCED: 'The browser project is permanently fenced.',
|
|
11
|
+
FRAME_TOO_LARGE: 'The browser frame exceeded its limit.',
|
|
12
|
+
INVALID_INPUT: 'The request is invalid.',
|
|
13
|
+
LOCKED: 'The browser runtime is already locked.',
|
|
14
|
+
NOT_RUNNING: 'The browser runtime is not running.',
|
|
15
|
+
PROTOCOL_ERROR: 'The framed protocol request is invalid.',
|
|
16
|
+
QUOTA_EXCEEDED: 'A browser runtime quota was exceeded.',
|
|
17
|
+
TIMEOUT: 'The operation timed out.',
|
|
18
|
+
};
|
|
19
|
+
export class BrowserRuntimeError extends Error {
|
|
20
|
+
code;
|
|
21
|
+
constructor(code, internalMessage) {
|
|
22
|
+
super(internalMessage ?? publicMessages[code]);
|
|
23
|
+
this.name = 'BrowserRuntimeError';
|
|
24
|
+
this.code = code;
|
|
25
|
+
}
|
|
26
|
+
get publicMessage() {
|
|
27
|
+
return publicMessages[this.code];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export const toBrowserRuntimeError = (error) => {
|
|
31
|
+
if (error instanceof BrowserRuntimeError) {
|
|
32
|
+
return error;
|
|
33
|
+
}
|
|
34
|
+
if (error instanceof Error
|
|
35
|
+
&& (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
36
|
+
return new BrowserRuntimeError(error.name === 'TimeoutError' ? 'TIMEOUT' : 'ABORTED');
|
|
37
|
+
}
|
|
38
|
+
return new BrowserRuntimeError('ABORTED');
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQSxNQUFNLGNBQWMsR0FBNkM7SUFDL0QsT0FBTyxFQUFFLDRCQUE0QjtJQUNyQyxvQkFBb0IsRUFBRSxzQ0FBc0M7SUFDNUQsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQyxrQkFBa0IsRUFBRSw2QkFBNkI7SUFDakQsa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGtCQUFrQixFQUFFLGtDQUFrQztJQUN0RCxrQkFBa0IsRUFBRSw2Q0FBNkM7SUFDakUsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxNQUFNLEVBQUUsNENBQTRDO0lBQ3BELGVBQWUsRUFBRSx1Q0FBdUM7SUFDeEQsYUFBYSxFQUFFLHlCQUF5QjtJQUN4QyxNQUFNLEVBQUUsd0NBQXdDO0lBQ2hELFdBQVcsRUFBRSxxQ0FBcUM7SUFDbEQsY0FBYyxFQUFFLHlDQUF5QztJQUN6RCxjQUFjLEVBQUUsdUNBQXVDO0lBQ3ZELE9BQU8sRUFBRSwwQkFBMEI7Q0FDcEMsQ0FBQztBQUVGLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxLQUFLO0lBQzVCLElBQUksQ0FBMkI7SUFFL0MsWUFBWSxJQUE4QixFQUFFLGVBQXdCO1FBQ2xFLEtBQUssQ0FBQyxlQUFlLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWMsRUFBdUIsRUFBRTtJQUMzRSxJQUFJLEtBQUssWUFBWSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQ0UsS0FBSyxZQUFZLEtBQUs7V0FDbkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxFQUNqRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFDRCxPQUFPLElBQUksbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { validateAgentAction, validateAgentActionResult } from './actions.js';
|
|
2
|
+
export { BrowserArtifactStore } from './classes.artifactstore.js';
|
|
3
|
+
export { BrowserEgressProxy } from './classes.egressproxy.js';
|
|
4
|
+
export { BrowserRuntimeFlexToolProvider } from './classes.flexprovider.js';
|
|
5
|
+
export { BrowserRuntimeFramedClient, BrowserRuntimeFramedServerPeer, } from './classes.framed.js';
|
|
6
|
+
export { BrowserRuntime, BrowserRuntimeLease } from './classes.runtime.js';
|
|
7
|
+
export { BrowserRuntimeError } from './errors.js';
|
|
8
|
+
export { createBrowserRuntimeMcpHttpHandler } from './mcp.js';
|
|
9
|
+
export type { IAcquireBrowserRuntimeLeaseOptions } from './classes.runtime.js';
|
|
10
|
+
export type { TBrowserRuntimeErrorCode } from './errors.js';
|
|
11
|
+
export type { IAttachTrustedFramedPeerOptions, IBrowserActionStateResult, IBrowserArtifactMetadata, IBrowserArtifactStoreOptions, IBrowserCapabilityAuthorizationRequest, IBrowserCapabilityDescriptor, IBrowserClickAction, IBrowserEgressConnectionOptions, IBrowserEgressProxyOptions, IBrowserEgressProxyStats, IBrowserFillAction, IBrowserNavigateAction, IBrowserObservationResult, IBrowserPressAction, IBrowserRuntimeAuditEvent, IBrowserRuntimeFlexToolProviderOptions, IBrowserRuntimeFrameSubscription, IBrowserRuntimeFramedClientOptions, IBrowserRuntimeMcpOptions, IBrowserRuntimeOperationOptions, IBrowserRuntimeOptions, IBrowserRuntimeState, IBrowserRuntimeTabState, IBrowserScreenshotAction, IBrowserScreenshotResult, IBrowserSnapshotAction, IIssueBrowserCapabilityRequest, IIssuedBrowserCapability, IResolvedBrowserFlexCapability, TBrowserActorRole, TBrowserAgentAction, TBrowserAgentActionResult, TBrowserCapabilitySource, TBrowserDnsResolver, TBrowserEgressConnector, TBrowserRuntimeEvent, } from './interfaces.js';
|
package/dist_ts/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { validateAgentAction, validateAgentActionResult } from './actions.js';
|
|
2
|
+
export { BrowserArtifactStore } from './classes.artifactstore.js';
|
|
3
|
+
export { BrowserEgressProxy } from './classes.egressproxy.js';
|
|
4
|
+
export { BrowserRuntimeFlexToolProvider } from './classes.flexprovider.js';
|
|
5
|
+
export { BrowserRuntimeFramedClient, BrowserRuntimeFramedServerPeer, } from './classes.framed.js';
|
|
6
|
+
export { BrowserRuntime, BrowserRuntimeLease } from './classes.runtime.js';
|
|
7
|
+
export { BrowserRuntimeError } from './errors.js';
|
|
8
|
+
export { createBrowserRuntimeMcpHttpHandler } from './mcp.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUNMLDBCQUEwQixFQUMxQiw4QkFBOEIsR0FDL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLFVBQVUsQ0FBQyJ9
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
export type TBrowserActorRole = 'human' | 'agent';
|
|
3
|
+
export type TBrowserCapabilitySource = 'human' | 'flex' | 'mcp';
|
|
4
|
+
export interface IBrowserCapabilityAuthorizationRequest {
|
|
5
|
+
projectId: string;
|
|
6
|
+
actorId: string;
|
|
7
|
+
role: TBrowserActorRole;
|
|
8
|
+
peerId: string;
|
|
9
|
+
source: TBrowserCapabilitySource;
|
|
10
|
+
scopeId?: string;
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IIssueBrowserCapabilityRequest extends IBrowserCapabilityAuthorizationRequest {
|
|
14
|
+
expiresInMs?: number;
|
|
15
|
+
disconnect?: (signal: AbortSignal) => Promise<void> | void;
|
|
16
|
+
}
|
|
17
|
+
export interface IBrowserCapabilityDescriptor extends IBrowserCapabilityAuthorizationRequest {
|
|
18
|
+
capabilityId: string;
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
}
|
|
21
|
+
export interface IIssuedBrowserCapability extends IBrowserCapabilityDescriptor {
|
|
22
|
+
capabilityToken: string;
|
|
23
|
+
}
|
|
24
|
+
export interface IResolvedBrowserFlexCapability {
|
|
25
|
+
capabilityToken: string;
|
|
26
|
+
}
|
|
27
|
+
export interface IBrowserRuntimeAuditEvent {
|
|
28
|
+
operationId: string;
|
|
29
|
+
capabilityId: string;
|
|
30
|
+
projectId: string;
|
|
31
|
+
actorId: string;
|
|
32
|
+
role: TBrowserActorRole;
|
|
33
|
+
source: TBrowserCapabilitySource;
|
|
34
|
+
action: string;
|
|
35
|
+
phase: 'completed' | 'failed';
|
|
36
|
+
startedAt: number;
|
|
37
|
+
finishedAt: number;
|
|
38
|
+
errorCode?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ILiveBrowserSessionLike {
|
|
41
|
+
start(options?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
terminate(options?: plugins.smartpuppeteer.ILiveBrowserTerminationOptions): Promise<plugins.smartpuppeteer.ILiveBrowserTerminationResult>;
|
|
44
|
+
getState(): plugins.smartpuppeteer.ILiveBrowserState;
|
|
45
|
+
getProcessState(): plugins.smartpuppeteer.ILiveBrowserProcessState;
|
|
46
|
+
onEvent(listener: plugins.smartpuppeteer.TLiveBrowserEventListener): () => void;
|
|
47
|
+
acknowledgeFrame(request: plugins.smartpuppeteer.ILiveBrowserFrameAcknowledgementRequest): Promise<plugins.smartpuppeteer.ILiveBrowserFrameAcknowledgement>;
|
|
48
|
+
createTab(options?: plugins.smartpuppeteer.ILiveBrowserCreateTabOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<plugins.smartpuppeteer.ILiveBrowserTabState>;
|
|
49
|
+
activateTab(tabId: string, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
50
|
+
closeTab(tabId: string, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
51
|
+
navigate(options: plugins.smartpuppeteer.ILiveBrowserNavigateOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
52
|
+
back(options?: plugins.smartpuppeteer.ILiveBrowserNavigationOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
53
|
+
forward(options?: plugins.smartpuppeteer.ILiveBrowserNavigationOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
54
|
+
reload(options?: plugins.smartpuppeteer.ILiveBrowserNavigationOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
55
|
+
setViewport(viewport: plugins.smartpuppeteer.ILiveBrowserViewport, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
56
|
+
dispatchMouse(input: plugins.smartpuppeteer.ILiveBrowserMouseInput): Promise<void>;
|
|
57
|
+
dispatchWheel(input: plugins.smartpuppeteer.ILiveBrowserWheelInput): Promise<void>;
|
|
58
|
+
dispatchKey(input: plugins.smartpuppeteer.ILiveBrowserKeyInput): Promise<void>;
|
|
59
|
+
insertText(input: plugins.smartpuppeteer.ILiveBrowserInsertTextInput): Promise<void>;
|
|
60
|
+
captureSnapshot(options?: plugins.smartpuppeteer.ILiveBrowserSnapshotOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<plugins.smartpuppeteer.ILiveBrowserSnapshot>;
|
|
61
|
+
observe(options?: plugins.smartpuppeteer.ILiveBrowserObserveOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<plugins.smartpuppeteer.ILiveBrowserObservation>;
|
|
62
|
+
evaluate(expression: string, options?: plugins.smartpuppeteer.ILiveBrowserEvaluateOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<plugins.smartpuppeteer.TLiveBrowserJsonValue>;
|
|
63
|
+
click(options: plugins.smartpuppeteer.ILiveBrowserClickOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
64
|
+
fill(options: plugins.smartpuppeteer.ILiveBrowserFillOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
65
|
+
press(options: plugins.smartpuppeteer.ILiveBrowserPressOptions, operationOptions?: plugins.smartpuppeteer.ILiveBrowserOperationOptions): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export interface IBrowserConfinementProbeContext {
|
|
68
|
+
session: ILiveBrowserSessionLike;
|
|
69
|
+
proxy: import('./classes.egressproxy.js').BrowserEgressProxy;
|
|
70
|
+
signal: AbortSignal;
|
|
71
|
+
}
|
|
72
|
+
export interface IBrowserRuntimeEnvironment {
|
|
73
|
+
platform: NodeJS.Platform;
|
|
74
|
+
uid: number | undefined;
|
|
75
|
+
}
|
|
76
|
+
export interface IBrowserRuntimeOptions {
|
|
77
|
+
runtimeDirectory: string;
|
|
78
|
+
authorizeCapability(request: IBrowserCapabilityAuthorizationRequest, signal: AbortSignal): Promise<boolean> | boolean;
|
|
79
|
+
audit?(event: IBrowserRuntimeAuditEvent, signal: AbortSignal): Promise<void> | void;
|
|
80
|
+
maxProjectSlots?: number;
|
|
81
|
+
maxCapabilities?: number;
|
|
82
|
+
maxCapabilitiesPerProject?: number;
|
|
83
|
+
capabilityDefaultTtlMs?: number;
|
|
84
|
+
capabilityMaximumTtlMs?: number;
|
|
85
|
+
authorizationTimeoutMs?: number;
|
|
86
|
+
maxTabsPerProject?: number;
|
|
87
|
+
operationTimeoutMs?: number;
|
|
88
|
+
quiescenceTimeoutMs?: number;
|
|
89
|
+
terminationGraceMs?: number;
|
|
90
|
+
terminationForceMs?: number;
|
|
91
|
+
auditTimeoutMs?: number;
|
|
92
|
+
confinementProbeTimeoutMs?: number;
|
|
93
|
+
idleRetirementMs?: number;
|
|
94
|
+
maxFrameBytes?: number;
|
|
95
|
+
frameAcknowledgementTimeoutMs?: number;
|
|
96
|
+
egress?: Omit<IBrowserEgressProxyOptions, 'projectId'>;
|
|
97
|
+
artifacts?: Omit<IBrowserArtifactStoreOptions, 'rootDirectory'>;
|
|
98
|
+
}
|
|
99
|
+
export interface IBrowserRuntimeTabState {
|
|
100
|
+
id: string;
|
|
101
|
+
url: string;
|
|
102
|
+
title: string;
|
|
103
|
+
active: boolean;
|
|
104
|
+
status: 'open' | 'crashed';
|
|
105
|
+
generation: number;
|
|
106
|
+
appliedViewportRevision: number;
|
|
107
|
+
streaming: boolean;
|
|
108
|
+
}
|
|
109
|
+
export interface IBrowserRuntimeState {
|
|
110
|
+
status: 'stopped' | 'starting' | 'running' | 'stopping';
|
|
111
|
+
activeTabId: string | null;
|
|
112
|
+
viewportRevision: number;
|
|
113
|
+
viewport: {
|
|
114
|
+
width: number;
|
|
115
|
+
height: number;
|
|
116
|
+
deviceScaleFactor: number;
|
|
117
|
+
};
|
|
118
|
+
tabs: IBrowserRuntimeTabState[];
|
|
119
|
+
lastError?: {
|
|
120
|
+
code: string;
|
|
121
|
+
fatal: boolean;
|
|
122
|
+
tabId?: string;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export interface IBrowserArtifactMetadata {
|
|
126
|
+
artifactId: string;
|
|
127
|
+
projectId: string;
|
|
128
|
+
mimeType: string;
|
|
129
|
+
size: number;
|
|
130
|
+
createdAt: number;
|
|
131
|
+
expiresAt: number;
|
|
132
|
+
}
|
|
133
|
+
export interface IBrowserArtifactStoreOptions {
|
|
134
|
+
rootDirectory: string;
|
|
135
|
+
maxFileBytes?: number;
|
|
136
|
+
maxArtifactsPerProject?: number;
|
|
137
|
+
maxProjectBytes?: number;
|
|
138
|
+
maxProjects?: number;
|
|
139
|
+
maxTotalArtifacts?: number;
|
|
140
|
+
maxTotalBytes?: number;
|
|
141
|
+
artifactTtlMs?: number;
|
|
142
|
+
now?: () => number;
|
|
143
|
+
}
|
|
144
|
+
export interface IBrowserNavigateAction {
|
|
145
|
+
action: 'navigate';
|
|
146
|
+
url: string;
|
|
147
|
+
tabId?: string;
|
|
148
|
+
timeoutMs?: number;
|
|
149
|
+
}
|
|
150
|
+
export interface IBrowserSnapshotAction {
|
|
151
|
+
action: 'snapshot';
|
|
152
|
+
tabId?: string;
|
|
153
|
+
maxCharacters?: number;
|
|
154
|
+
}
|
|
155
|
+
export interface IBrowserScreenshotAction {
|
|
156
|
+
action: 'screenshot';
|
|
157
|
+
tabId?: string;
|
|
158
|
+
format?: 'jpeg' | 'png';
|
|
159
|
+
quality?: number;
|
|
160
|
+
}
|
|
161
|
+
export interface IBrowserClickAction {
|
|
162
|
+
action: 'click';
|
|
163
|
+
selector: string;
|
|
164
|
+
tabId?: string;
|
|
165
|
+
timeoutMs?: number;
|
|
166
|
+
}
|
|
167
|
+
export interface IBrowserFillAction {
|
|
168
|
+
action: 'fill';
|
|
169
|
+
selector: string;
|
|
170
|
+
text: string;
|
|
171
|
+
tabId?: string;
|
|
172
|
+
timeoutMs?: number;
|
|
173
|
+
}
|
|
174
|
+
export interface IBrowserPressAction {
|
|
175
|
+
action: 'press';
|
|
176
|
+
selector: string;
|
|
177
|
+
key: string;
|
|
178
|
+
tabId?: string;
|
|
179
|
+
timeoutMs?: number;
|
|
180
|
+
}
|
|
181
|
+
export type TBrowserAgentAction = IBrowserNavigateAction | IBrowserSnapshotAction | IBrowserScreenshotAction | IBrowserClickAction | IBrowserFillAction | IBrowserPressAction;
|
|
182
|
+
export interface IBrowserActionStateResult {
|
|
183
|
+
action: 'navigate' | 'click' | 'fill' | 'press';
|
|
184
|
+
state: IBrowserRuntimeState;
|
|
185
|
+
}
|
|
186
|
+
export interface IBrowserObservationResult {
|
|
187
|
+
action: 'snapshot';
|
|
188
|
+
tabId: string;
|
|
189
|
+
url: string;
|
|
190
|
+
title: string;
|
|
191
|
+
text: string;
|
|
192
|
+
truncated: boolean;
|
|
193
|
+
state: IBrowserRuntimeState;
|
|
194
|
+
}
|
|
195
|
+
export interface IBrowserScreenshotResult {
|
|
196
|
+
action: 'screenshot';
|
|
197
|
+
artifact: IBrowserArtifactMetadata;
|
|
198
|
+
}
|
|
199
|
+
export type TBrowserAgentActionResult = IBrowserActionStateResult | IBrowserObservationResult | IBrowserScreenshotResult;
|
|
200
|
+
export type TBrowserRuntimeEvent = {
|
|
201
|
+
type: 'state';
|
|
202
|
+
state: IBrowserRuntimeState;
|
|
203
|
+
} | {
|
|
204
|
+
type: 'error';
|
|
205
|
+
error: {
|
|
206
|
+
code: string;
|
|
207
|
+
fatal: boolean;
|
|
208
|
+
tabId?: string;
|
|
209
|
+
};
|
|
210
|
+
} | {
|
|
211
|
+
type: 'frame';
|
|
212
|
+
frame: plugins.smartpuppeteer.ILiveBrowserFrame;
|
|
213
|
+
};
|
|
214
|
+
export interface IBrowserRuntimeOperationOptions {
|
|
215
|
+
signal?: AbortSignal;
|
|
216
|
+
timeoutMs?: number;
|
|
217
|
+
onOperationStarted?(operationId: string): void;
|
|
218
|
+
}
|
|
219
|
+
export interface IBrowserRuntimeFrameSubscription {
|
|
220
|
+
close(): Promise<void>;
|
|
221
|
+
}
|
|
222
|
+
export type TBrowserDnsResolver = (hostname: string, options: {
|
|
223
|
+
all: true;
|
|
224
|
+
verbatim: true;
|
|
225
|
+
signal: AbortSignal;
|
|
226
|
+
}) => Promise<plugins.dns.LookupAddress[]>;
|
|
227
|
+
export interface IBrowserEgressConnectionOptions {
|
|
228
|
+
address: string;
|
|
229
|
+
family: 4 | 6;
|
|
230
|
+
port: number;
|
|
231
|
+
hostname: string;
|
|
232
|
+
signal: AbortSignal;
|
|
233
|
+
}
|
|
234
|
+
export type TBrowserEgressConnector = (options: IBrowserEgressConnectionOptions) => plugins.net.Socket;
|
|
235
|
+
export interface IBrowserEgressProxyOptions {
|
|
236
|
+
projectId: string;
|
|
237
|
+
allowedPorts?: number[];
|
|
238
|
+
maxConnections?: number;
|
|
239
|
+
maxActiveRequests?: number;
|
|
240
|
+
maxHeaderBytes?: number;
|
|
241
|
+
connectTimeoutMs?: number;
|
|
242
|
+
idleTimeoutMs?: number;
|
|
243
|
+
tunnelLifetimeMs?: number;
|
|
244
|
+
requestTimeoutMs?: number;
|
|
245
|
+
maxRequestBytes?: number;
|
|
246
|
+
maxResponseBytes?: number;
|
|
247
|
+
maxTunnelBytes?: number;
|
|
248
|
+
resolver?: TBrowserDnsResolver;
|
|
249
|
+
connector?: TBrowserEgressConnector;
|
|
250
|
+
}
|
|
251
|
+
export interface IBrowserEgressProxyStats {
|
|
252
|
+
ordinaryRequests: number;
|
|
253
|
+
upgradeRequests: number;
|
|
254
|
+
connectRequests: number;
|
|
255
|
+
rejectedRequests: number;
|
|
256
|
+
activeConnections: number;
|
|
257
|
+
}
|
|
258
|
+
export interface IAttachTrustedFramedPeerOptions {
|
|
259
|
+
peerId: string;
|
|
260
|
+
scopeId: string;
|
|
261
|
+
sessionId: string;
|
|
262
|
+
readable: plugins.stream.Readable;
|
|
263
|
+
writable: plugins.stream.Writable;
|
|
264
|
+
}
|
|
265
|
+
export interface IBrowserRuntimeFramedClientOptions {
|
|
266
|
+
scopeId: string;
|
|
267
|
+
sessionId: string;
|
|
268
|
+
readable: plugins.stream.Readable;
|
|
269
|
+
writable: plugins.stream.Writable;
|
|
270
|
+
maxFrameBytes?: number;
|
|
271
|
+
maxPendingRequests?: number;
|
|
272
|
+
requestTimeoutMs?: number;
|
|
273
|
+
}
|
|
274
|
+
export interface IBrowserRuntimeMcpOptions {
|
|
275
|
+
authenticateMcpRequest(request: Request): Promise<{
|
|
276
|
+
peerId: string;
|
|
277
|
+
}>;
|
|
278
|
+
trustedOrigins?: string[];
|
|
279
|
+
allowedHosts?: string[];
|
|
280
|
+
allowMissingOrigin?: boolean;
|
|
281
|
+
maxRequestBytes?: number;
|
|
282
|
+
maxToolResultBytes?: number;
|
|
283
|
+
}
|
|
284
|
+
export interface IBrowserRuntimeFlexToolProviderOptions<TScope> {
|
|
285
|
+
client: import('./classes.framed.js').BrowserRuntimeFramedClient;
|
|
286
|
+
resolveCapability(context: plugins.flexharness.IFlexToolProviderContext<TScope>): Promise<IResolvedBrowserFlexCapability> | IResolvedBrowserFlexCapability;
|
|
287
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
import type { IBrowserConfinementProbeContext, IBrowserRuntimeOptions, IBrowserRuntimeEnvironment, ILiveBrowserSessionLike } from './interfaces.js';
|
|
3
|
+
export declare const browserRuntimeTesting: unique symbol;
|
|
4
|
+
export interface IBrowserRuntimeTestingOptions extends IBrowserRuntimeOptions {
|
|
5
|
+
[browserRuntimeTesting]: true;
|
|
6
|
+
environment: IBrowserRuntimeEnvironment;
|
|
7
|
+
sessionFactory(options: plugins.smartpuppeteer.ILiveBrowserSessionOptions): ILiveBrowserSessionLike;
|
|
8
|
+
confinementProbe(context: IBrowserConfinementProbeContext): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const browserRuntimeTesting = Symbol('browserRuntimeTesting');
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2ludGVybmFsLnRlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMifQ==
|
package/dist_ts/mcp.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { BrowserRuntime } from './classes.runtime.js';
|
|
3
|
+
import type { IBrowserRuntimeMcpOptions } from './interfaces.js';
|
|
4
|
+
export declare const createBrowserRuntimeMcpHttpHandler: (runtime: BrowserRuntime, options: IBrowserRuntimeMcpOptions) => plugins.smartmcp.ISmartMcpHttpHandler;
|