@secure-exec/browser 0.0.0-agentos-dylib-base.edaa4a4

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 (66) hide show
  1. package/README.md +6 -0
  2. package/dist/child-process-bridge.d.ts +25 -0
  3. package/dist/child-process-bridge.js +50 -0
  4. package/dist/converged-base64.d.ts +2 -0
  5. package/dist/converged-base64.js +41 -0
  6. package/dist/converged-dgram-bridge.d.ts +11 -0
  7. package/dist/converged-dgram-bridge.js +147 -0
  8. package/dist/converged-driver-setup.d.ts +22 -0
  9. package/dist/converged-driver-setup.js +72 -0
  10. package/dist/converged-execution-host-bridge.d.ts +7 -0
  11. package/dist/converged-execution-host-bridge.js +85 -0
  12. package/dist/converged-executor-session.d.ts +60 -0
  13. package/dist/converged-executor-session.js +127 -0
  14. package/dist/converged-fs-bridge.d.ts +42 -0
  15. package/dist/converged-fs-bridge.js +245 -0
  16. package/dist/converged-module-servicer.d.ts +8 -0
  17. package/dist/converged-module-servicer.js +79 -0
  18. package/dist/converged-net-bridge.d.ts +28 -0
  19. package/dist/converged-net-bridge.js +155 -0
  20. package/dist/converged-permissions.d.ts +9 -0
  21. package/dist/converged-permissions.js +46 -0
  22. package/dist/converged-sync-bridge-handler.d.ts +47 -0
  23. package/dist/converged-sync-bridge-handler.js +140 -0
  24. package/dist/converged-sync-bridge-router.d.ts +33 -0
  25. package/dist/converged-sync-bridge-router.js +41 -0
  26. package/dist/driver.d.ts +91 -0
  27. package/dist/driver.js +386 -0
  28. package/dist/encoding.d.ts +4 -0
  29. package/dist/encoding.js +102 -0
  30. package/dist/generated/util-polyfill.d.ts +1 -0
  31. package/dist/generated/util-polyfill.js +2 -0
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.js +5 -0
  34. package/dist/kernel-backed-filesystem.d.ts +33 -0
  35. package/dist/kernel-backed-filesystem.js +205 -0
  36. package/dist/os-filesystem.d.ts +47 -0
  37. package/dist/os-filesystem.js +409 -0
  38. package/dist/permission-validation.d.ts +15 -0
  39. package/dist/permission-validation.js +62 -0
  40. package/dist/root-filesystem-from-vfs.d.ts +13 -0
  41. package/dist/root-filesystem-from-vfs.js +95 -0
  42. package/dist/runtime-driver.d.ts +66 -0
  43. package/dist/runtime-driver.js +611 -0
  44. package/dist/runtime.d.ts +248 -0
  45. package/dist/runtime.js +2296 -0
  46. package/dist/sidecar-wasm-module.d.ts +62 -0
  47. package/dist/sidecar-wasm-module.js +28 -0
  48. package/dist/sidecar-worker-protocol.d.ts +14 -0
  49. package/dist/sidecar-worker-protocol.js +9 -0
  50. package/dist/sidecar-worker.d.ts +19 -0
  51. package/dist/sidecar-worker.js +63 -0
  52. package/dist/signals.d.ts +13 -0
  53. package/dist/signals.js +89 -0
  54. package/dist/sync-bridge.d.ts +50 -0
  55. package/dist/sync-bridge.js +93 -0
  56. package/dist/wasi-polyfill.d.ts +1 -0
  57. package/dist/wasi-polyfill.js +2154 -0
  58. package/dist/worker-adapter.d.ts +21 -0
  59. package/dist/worker-adapter.js +41 -0
  60. package/dist/worker-protocol.d.ts +104 -0
  61. package/dist/worker-protocol.js +1 -0
  62. package/dist/worker-sidecar-client.d.ts +71 -0
  63. package/dist/worker-sidecar-client.js +152 -0
  64. package/dist/worker.d.ts +1 -0
  65. package/dist/worker.js +2125 -0
  66. package/package.json +111 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Browser worker adapter.
3
+ *
4
+ * Wraps the Web Worker API for spawning Workers.
5
+ * Requires COOP/COEP headers for SharedArrayBuffer support.
6
+ */
7
+ export interface WorkerHandle {
8
+ postMessage(data: unknown, transferList?: Transferable[]): void;
9
+ onMessage(handler: (data: unknown) => void): void;
10
+ onError(handler: (err: Error) => void): void;
11
+ onExit(handler: (code: number) => void): void;
12
+ terminate(): void;
13
+ }
14
+ export declare class BrowserWorkerAdapter {
15
+ /**
16
+ * Spawn a Web Worker for the given script URL.
17
+ */
18
+ static create(scriptUrl: string | URL, options?: {
19
+ workerData?: unknown;
20
+ }): WorkerHandle;
21
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Browser worker adapter.
3
+ *
4
+ * Wraps the Web Worker API for spawning Workers.
5
+ * Requires COOP/COEP headers for SharedArrayBuffer support.
6
+ */
7
+ // biome-ignore lint/complexity/noStaticOnlyClass: This class is part of the public browser package API.
8
+ export class BrowserWorkerAdapter {
9
+ /**
10
+ * Spawn a Web Worker for the given script URL.
11
+ */
12
+ static create(scriptUrl, options) {
13
+ const worker = new Worker(scriptUrl, { type: "module" });
14
+ // Send workerData as the initial message (Web Workers don't have
15
+ // a constructor option for this like Node's worker_threads)
16
+ if (options?.workerData !== undefined) {
17
+ worker.postMessage({
18
+ type: "init",
19
+ workerData: options.workerData,
20
+ });
21
+ }
22
+ return {
23
+ postMessage(data, transferList) {
24
+ worker.postMessage(data, transferList ?? []);
25
+ },
26
+ onMessage(handler) {
27
+ worker.addEventListener("message", (e) => handler(e.data));
28
+ },
29
+ onError(handler) {
30
+ worker.addEventListener("error", (e) => handler(new Error(e.message)));
31
+ },
32
+ onExit(_handler) {
33
+ // Web Workers don't have an exit event — the terminate()
34
+ // caller is responsible for cleanup
35
+ },
36
+ terminate() {
37
+ worker.terminate();
38
+ },
39
+ };
40
+ }
41
+ }
@@ -0,0 +1,104 @@
1
+ import type { ExecResult, OSConfig, ProcessConfig, RunResult, StdioChannel, TimingMitigation } from "./runtime.js";
2
+ import type { BrowserSyncBridgePayload, BrowserWorkerSyncRequestMessage } from "./sync-bridge.js";
3
+ export type SerializedPermissions = {
4
+ fs?: string;
5
+ network?: string;
6
+ childProcess?: string;
7
+ env?: string;
8
+ };
9
+ export type BrowserWorkerExecOptions = {
10
+ filePath?: string;
11
+ env?: Record<string, string>;
12
+ cwd?: string;
13
+ stdin?: string;
14
+ timingMitigation?: TimingMitigation;
15
+ };
16
+ export type BrowserWorkerExtensionRequestPayload = {
17
+ namespace: string;
18
+ payload: Uint8Array;
19
+ };
20
+ export type BrowserWorkerExtensionResponse = {
21
+ namespace: string;
22
+ payload: Uint8Array;
23
+ };
24
+ export type BrowserWorkerInitPayload = {
25
+ processConfig?: ProcessConfig;
26
+ osConfig?: OSConfig;
27
+ permissions?: SerializedPermissions;
28
+ filesystem?: "opfs" | "memory";
29
+ networkEnabled?: boolean;
30
+ timingMitigation?: TimingMitigation;
31
+ payloadLimits?: {
32
+ base64TransferBytes?: number;
33
+ jsonPayloadBytes?: number;
34
+ };
35
+ syncBridge?: BrowserSyncBridgePayload;
36
+ };
37
+ type BrowserWorkerControlMessage = {
38
+ controlToken: string;
39
+ };
40
+ export type BrowserWorkerRequestMessage = (BrowserWorkerControlMessage & {
41
+ id: number;
42
+ type: "init";
43
+ payload: BrowserWorkerInitPayload;
44
+ }) | {
45
+ controlToken: string;
46
+ id: number;
47
+ type: "exec";
48
+ payload: {
49
+ executionId: string;
50
+ code: string;
51
+ options?: BrowserWorkerExecOptions;
52
+ captureStdio?: boolean;
53
+ };
54
+ } | {
55
+ controlToken: string;
56
+ id: number;
57
+ type: "run";
58
+ payload: {
59
+ executionId: string;
60
+ code: string;
61
+ filePath?: string;
62
+ captureStdio?: boolean;
63
+ };
64
+ } | {
65
+ controlToken: string;
66
+ id: number;
67
+ type: "signal";
68
+ payload: {
69
+ executionId: string;
70
+ signal: number;
71
+ };
72
+ } | (BrowserWorkerControlMessage & {
73
+ id: number;
74
+ type: "extension";
75
+ payload: BrowserWorkerExtensionRequestPayload;
76
+ }) | (BrowserWorkerControlMessage & {
77
+ id: number;
78
+ type: "dispose";
79
+ });
80
+ export type BrowserWorkerResponseMessage = (BrowserWorkerControlMessage & {
81
+ type: "response";
82
+ id: number;
83
+ ok: true;
84
+ result: ExecResult | RunResult | BrowserWorkerExtensionResponse | true;
85
+ }) | {
86
+ controlToken: string;
87
+ type: "response";
88
+ id: number;
89
+ ok: false;
90
+ error: {
91
+ message: string;
92
+ stack?: string;
93
+ code?: string;
94
+ };
95
+ };
96
+ export type BrowserWorkerStdioMessage = BrowserWorkerControlMessage & {
97
+ type: "stdio";
98
+ executionId: string;
99
+ requestId: number;
100
+ channel: StdioChannel;
101
+ message: string;
102
+ };
103
+ export type BrowserWorkerOutboundMessage = BrowserWorkerResponseMessage | BrowserWorkerStdioMessage | BrowserWorkerSyncRequestMessage;
104
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import type { SidecarProcessTransport } from "@secure-exec/core/sidecar-client";
2
+ import { SidecarProcess } from "@secure-exec/core/sidecar-process";
3
+ import { BROWSER_SIDECAR_ERROR_MESSAGE, BROWSER_SIDECAR_READY_MESSAGE, BROWSER_SIDECAR_READY_TIMEOUT_MS, isBrowserSidecarControlMessage, type BrowserSidecarControlMessage, type BrowserSidecarErrorMessage, type BrowserSidecarReadyMessage } from "./sidecar-worker-protocol.js";
4
+ import type { LiveSidecarEventSelector } from "@secure-exec/core/event-buffer";
5
+ import type { LiveOwnershipScope } from "@secure-exec/core/ownership";
6
+ import { type LiveEventFrame, type LiveResponseFrame, type LiveSidecarRequestHandler, type ProtocolFramePayloadCodec } from "@secure-exec/core/protocol-frames";
7
+ import type { LiveRequestPayload } from "@secure-exec/core/request-payloads";
8
+ export declare const BROWSER_SIDECAR_FRAME_TIMEOUT_MS = 120000;
9
+ export declare const BROWSER_SIDECAR_EVENT_BUFFER_CAPACITY = 4096;
10
+ export { BROWSER_SIDECAR_ERROR_MESSAGE, BROWSER_SIDECAR_READY_MESSAGE, BROWSER_SIDECAR_READY_TIMEOUT_MS, isBrowserSidecarControlMessage, type BrowserSidecarControlMessage, type BrowserSidecarErrorMessage, type BrowserSidecarReadyMessage, };
11
+ export type BrowserSidecarWorkerMessageEvent = {
12
+ data: unknown;
13
+ };
14
+ export type BrowserSidecarWorkerErrorEvent = {
15
+ message?: string;
16
+ error?: unknown;
17
+ };
18
+ export interface BrowserSidecarWorker {
19
+ postMessage(message: unknown, transfer?: readonly unknown[]): void;
20
+ addEventListener(type: "message", listener: (event: BrowserSidecarWorkerMessageEvent) => void): void;
21
+ addEventListener(type: "error", listener: (event: BrowserSidecarWorkerErrorEvent) => void): void;
22
+ removeEventListener(type: "message", listener: (event: BrowserSidecarWorkerMessageEvent) => void): void;
23
+ removeEventListener(type: "error", listener: (event: BrowserSidecarWorkerErrorEvent) => void): void;
24
+ terminate?(): void;
25
+ }
26
+ export interface BrowserSidecarWorkerConstructor {
27
+ new (scriptUrl: string | URL, options?: {
28
+ type?: "classic" | "module";
29
+ name?: string;
30
+ }): BrowserSidecarWorker;
31
+ }
32
+ export interface WorkerSidecarProtocolClientOptions {
33
+ endpoint: {
34
+ postMessage(message: unknown, transfer?: readonly unknown[]): void;
35
+ };
36
+ listen(handler: (message: unknown) => void): () => void;
37
+ listenError?: (handler: (error: Error) => void) => () => void;
38
+ disposeEndpoint?: () => void | Promise<void>;
39
+ frameTimeoutMs?: number;
40
+ eventBufferCapacity?: number;
41
+ payloadCodec?: ProtocolFramePayloadCodec;
42
+ disposedErrorMessage?: string;
43
+ transfer?: (payload: Uint8Array) => readonly unknown[];
44
+ }
45
+ export interface CreateWorkerSidecarProcessFromUrlOptions extends Omit<WorkerSidecarProtocolClientOptions, "endpoint" | "listen" | "disposeEndpoint"> {
46
+ workerUrl: string | URL;
47
+ WorkerConstructor?: BrowserSidecarWorkerConstructor;
48
+ workerName?: string;
49
+ readyTimeoutMs?: number;
50
+ }
51
+ export declare class WorkerSidecarProtocolClient implements SidecarProcessTransport {
52
+ private readonly protocolClient;
53
+ private readonly disposeEndpoint?;
54
+ private readonly disposedErrorMessage;
55
+ private readonly stopErrorListening?;
56
+ constructor(options: WorkerSidecarProtocolClientOptions);
57
+ static fromWorker(worker: BrowserSidecarWorker, options?: Omit<WorkerSidecarProtocolClientOptions, "endpoint" | "listen" | "disposeEndpoint">): WorkerSidecarProtocolClient;
58
+ setSidecarRequestHandler(handler: LiveSidecarRequestHandler | null): void;
59
+ onEvent(handler: (event: LiveEventFrame) => void): () => void;
60
+ sendRequest(input: {
61
+ ownership: LiveOwnershipScope;
62
+ payload: LiveRequestPayload;
63
+ }): Promise<LiveResponseFrame>;
64
+ waitForEvent(matcher: LiveSidecarEventSelector | ((event: LiveEventFrame) => boolean), timeoutMs?: number, options?: {
65
+ signal?: AbortSignal;
66
+ }): Promise<LiveEventFrame>;
67
+ failPermanently(error: Error): void;
68
+ dispose(): Promise<void>;
69
+ }
70
+ export declare function createWorkerSidecarProcess(worker: BrowserSidecarWorker, options?: Omit<WorkerSidecarProtocolClientOptions, "endpoint" | "listen" | "disposeEndpoint">): SidecarProcess;
71
+ export declare function createWorkerSidecarProcessFromUrl(options: CreateWorkerSidecarProcessFromUrlOptions): Promise<SidecarProcess>;
@@ -0,0 +1,152 @@
1
+ import { MessageFrameTransport } from "@secure-exec/core/message-frame-transport";
2
+ import { SidecarProtocolClient } from "@secure-exec/core/protocol-client";
3
+ import { SidecarProcess } from "@secure-exec/core/sidecar-process";
4
+ import { BROWSER_SIDECAR_ERROR_MESSAGE, BROWSER_SIDECAR_READY_MESSAGE, BROWSER_SIDECAR_READY_TIMEOUT_MS, isBrowserSidecarControlMessage, } from "./sidecar-worker-protocol.js";
5
+ import { decodeProtocolFramePayload, encodeProtocolFramePayload, } from "@secure-exec/core/protocol-frames";
6
+ export const BROWSER_SIDECAR_FRAME_TIMEOUT_MS = 120_000;
7
+ export const BROWSER_SIDECAR_EVENT_BUFFER_CAPACITY = 4_096;
8
+ export { BROWSER_SIDECAR_ERROR_MESSAGE, BROWSER_SIDECAR_READY_MESSAGE, BROWSER_SIDECAR_READY_TIMEOUT_MS, isBrowserSidecarControlMessage, };
9
+ export class WorkerSidecarProtocolClient {
10
+ protocolClient;
11
+ disposeEndpoint;
12
+ disposedErrorMessage;
13
+ stopErrorListening;
14
+ constructor(options) {
15
+ const payloadCodec = options.payloadCodec ?? "bare";
16
+ const frameTransport = new MessageFrameTransport({
17
+ endpoint: options.endpoint,
18
+ listen: options.listen,
19
+ encodeFrame: (frame) => encodeProtocolFramePayload(frame, payloadCodec),
20
+ decodeFrame: (payload) => decodeProtocolFramePayload(payload, payloadCodec),
21
+ transfer: options.transfer ?? transferProtocolPayload,
22
+ });
23
+ this.protocolClient = new SidecarProtocolClient({
24
+ frameTransport,
25
+ frameTimeoutMs: options.frameTimeoutMs ?? BROWSER_SIDECAR_FRAME_TIMEOUT_MS,
26
+ eventBufferCapacity: options.eventBufferCapacity ??
27
+ BROWSER_SIDECAR_EVENT_BUFFER_CAPACITY,
28
+ payloadCodec,
29
+ stderrText: () => "",
30
+ });
31
+ this.disposeEndpoint = options.disposeEndpoint;
32
+ this.disposedErrorMessage =
33
+ options.disposedErrorMessage ?? "browser sidecar client disposed";
34
+ this.stopErrorListening = options.listenError?.((error) => {
35
+ this.failPermanently(error);
36
+ });
37
+ }
38
+ static fromWorker(worker, options = {}) {
39
+ return new WorkerSidecarProtocolClient({
40
+ ...options,
41
+ endpoint: worker,
42
+ listen: (handler) => {
43
+ const listener = (event) => {
44
+ handler(event.data);
45
+ };
46
+ worker.addEventListener("message", listener);
47
+ return () => {
48
+ worker.removeEventListener("message", listener);
49
+ };
50
+ },
51
+ disposeEndpoint: () => {
52
+ worker.terminate?.();
53
+ },
54
+ });
55
+ }
56
+ setSidecarRequestHandler(handler) {
57
+ this.protocolClient.setSidecarRequestHandler(handler);
58
+ }
59
+ onEvent(handler) {
60
+ return this.protocolClient.onEvent(handler);
61
+ }
62
+ async sendRequest(input) {
63
+ return await this.protocolClient.sendRequest(input);
64
+ }
65
+ async waitForEvent(matcher, timeoutMs, options) {
66
+ return await this.protocolClient.waitForEvent(matcher, timeoutMs, options);
67
+ }
68
+ failPermanently(error) {
69
+ this.protocolClient.failPermanently(error);
70
+ }
71
+ async dispose() {
72
+ this.protocolClient.failPermanently(new Error(this.disposedErrorMessage));
73
+ this.protocolClient.dispose();
74
+ this.stopErrorListening?.();
75
+ await this.disposeEndpoint?.();
76
+ }
77
+ }
78
+ export function createWorkerSidecarProcess(worker, options = {}) {
79
+ return SidecarProcess.fromClient(WorkerSidecarProtocolClient.fromWorker(worker, options));
80
+ }
81
+ export async function createWorkerSidecarProcessFromUrl(options) {
82
+ const WorkerConstructor = options.WorkerConstructor ?? globalThis.Worker;
83
+ if (typeof WorkerConstructor !== "function") {
84
+ throw new Error("browser sidecar Worker constructor is not available");
85
+ }
86
+ const worker = new WorkerConstructor(options.workerUrl, {
87
+ type: "module",
88
+ ...(options.workerName ? { name: options.workerName } : {}),
89
+ });
90
+ try {
91
+ await waitForBrowserSidecarReady(worker, {
92
+ timeoutMs: options.readyTimeoutMs ?? BROWSER_SIDECAR_READY_TIMEOUT_MS,
93
+ });
94
+ }
95
+ catch (error) {
96
+ worker.terminate?.();
97
+ throw error;
98
+ }
99
+ return createWorkerSidecarProcess(worker, options);
100
+ }
101
+ async function waitForBrowserSidecarReady(worker, options) {
102
+ await new Promise((resolve, reject) => {
103
+ let settled = false;
104
+ let timer = null;
105
+ const cleanup = () => {
106
+ worker.removeEventListener("message", onMessage);
107
+ worker.removeEventListener("error", onError);
108
+ if (timer !== null) {
109
+ clearTimeout(timer);
110
+ timer = null;
111
+ }
112
+ };
113
+ const settle = (callback) => {
114
+ if (settled) {
115
+ return;
116
+ }
117
+ settled = true;
118
+ cleanup();
119
+ callback();
120
+ };
121
+ const onMessage = (event) => {
122
+ const message = event.data;
123
+ if (!isBrowserSidecarControlMessage(message)) {
124
+ return;
125
+ }
126
+ if (message.type === BROWSER_SIDECAR_READY_MESSAGE) {
127
+ settle(resolve);
128
+ return;
129
+ }
130
+ settle(() => {
131
+ reject(new Error(message.message));
132
+ });
133
+ };
134
+ const onError = (event) => {
135
+ settle(() => {
136
+ reject(event.error instanceof Error
137
+ ? event.error
138
+ : new Error(event.message ?? "browser sidecar Worker failed"));
139
+ });
140
+ };
141
+ worker.addEventListener("message", onMessage);
142
+ worker.addEventListener("error", onError);
143
+ timer = setTimeout(() => {
144
+ settle(() => {
145
+ reject(new Error(`timed out waiting for browser sidecar Worker ready message after ${options.timeoutMs}ms`));
146
+ });
147
+ }, options.timeoutMs);
148
+ });
149
+ }
150
+ function transferProtocolPayload(payload) {
151
+ return [payload.buffer];
152
+ }
@@ -0,0 +1 @@
1
+ export {};