@c0sc0s/orbit 0.5.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/README.md +38 -0
- package/assets/README.md +9 -0
- package/assets/app-icon.png +0 -0
- package/assets/icon.icns +0 -0
- package/assets/logo.png +0 -0
- package/dist/cdp/client.d.ts +33 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +159 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/expressions.d.ts +8 -0
- package/dist/cdp/expressions.d.ts.map +1 -0
- package/dist/cdp/expressions.js +27 -0
- package/dist/cdp/expressions.js.map +1 -0
- package/dist/cdp/target-registry.d.ts +33 -0
- package/dist/cdp/target-registry.d.ts.map +1 -0
- package/dist/cdp/target-registry.js +139 -0
- package/dist/cdp/target-registry.js.map +1 -0
- package/dist/cli/arguments.d.ts +13 -0
- package/dist/cli/arguments.d.ts.map +1 -0
- package/dist/cli/arguments.js +29 -0
- package/dist/cli/arguments.js.map +1 -0
- package/dist/cli/platform.d.ts +2 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +68 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +148 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/manifest.d.ts +12 -0
- package/dist/config/manifest.d.ts.map +1 -0
- package/dist/config/manifest.js +71 -0
- package/dist/config/manifest.js.map +1 -0
- package/dist/host/daemon.d.ts +54 -0
- package/dist/host/daemon.d.ts.map +1 -0
- package/dist/host/daemon.js +185 -0
- package/dist/host/daemon.js.map +1 -0
- package/dist/host/plugin-host.d.ts +50 -0
- package/dist/host/plugin-host.d.ts.map +1 -0
- package/dist/host/plugin-host.js +230 -0
- package/dist/host/plugin-host.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/installation/entry.d.ts +2 -0
- package/dist/installation/entry.d.ts.map +1 -0
- package/dist/installation/entry.js +14 -0
- package/dist/installation/entry.js.map +1 -0
- package/dist/installation/files.d.ts +5 -0
- package/dist/installation/files.d.ts.map +1 -0
- package/dist/installation/files.js +101 -0
- package/dist/installation/files.js.map +1 -0
- package/dist/installation/legacy.d.ts +19 -0
- package/dist/installation/legacy.d.ts.map +1 -0
- package/dist/installation/legacy.js +52 -0
- package/dist/installation/legacy.js.map +1 -0
- package/dist/installation/lock.d.ts +2 -0
- package/dist/installation/lock.d.ts.map +1 -0
- package/dist/installation/lock.js +18 -0
- package/dist/installation/lock.js.map +1 -0
- package/dist/installation/manager.d.ts +180 -0
- package/dist/installation/manager.d.ts.map +1 -0
- package/dist/installation/manager.js +469 -0
- package/dist/installation/manager.js.map +1 -0
- package/dist/lifecycle/resource-scope.d.ts +11 -0
- package/dist/lifecycle/resource-scope.d.ts.map +1 -0
- package/dist/lifecycle/resource-scope.js +40 -0
- package/dist/lifecycle/resource-scope.js.map +1 -0
- package/dist/platform/codex-process.d.ts +33 -0
- package/dist/platform/codex-process.d.ts.map +1 -0
- package/dist/platform/codex-process.js +122 -0
- package/dist/platform/codex-process.js.map +1 -0
- package/dist/platform/launcher.d.ts +12 -0
- package/dist/platform/launcher.d.ts.map +1 -0
- package/dist/platform/launcher.js +46 -0
- package/dist/platform/launcher.js.map +1 -0
- package/dist/plugins/codex-extension.d.ts +12 -0
- package/dist/plugins/codex-extension.d.ts.map +1 -0
- package/dist/plugins/codex-extension.js +100 -0
- package/dist/plugins/codex-extension.js.map +1 -0
- package/dist/plugins/manifest.d.ts +20 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +51 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/registry.d.ts +3 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +26 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/protocol/ipc.d.ts +38 -0
- package/dist/protocol/ipc.d.ts.map +1 -0
- package/dist/protocol/ipc.js +5 -0
- package/dist/protocol/ipc.js.map +1 -0
- package/dist/protocol/types.d.ts +55 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/renderer/loader.d.ts +32 -0
- package/dist/renderer/loader.d.ts.map +1 -0
- package/dist/renderer/loader.js +130 -0
- package/dist/renderer/loader.js.map +1 -0
- package/dist/renderer/transport.d.ts +28 -0
- package/dist/renderer/transport.d.ts.map +1 -0
- package/dist/renderer/transport.js +89 -0
- package/dist/renderer/transport.js.map +1 -0
- package/dist/sdk/contracts.d.ts +50 -0
- package/dist/sdk/contracts.d.ts.map +1 -0
- package/dist/sdk/contracts.js +2 -0
- package/dist/sdk/contracts.js.map +1 -0
- package/dist/service/module.d.ts +24 -0
- package/dist/service/module.d.ts.map +1 -0
- package/dist/service/module.js +97 -0
- package/dist/service/module.js.map +1 -0
- package/dist/service/process.d.ts +32 -0
- package/dist/service/process.d.ts.map +1 -0
- package/dist/service/process.js +95 -0
- package/dist/service/process.js.map +1 -0
- package/dist/service/worker.d.ts +2 -0
- package/dist/service/worker.d.ts.map +1 -0
- package/dist/service/worker.js +116 -0
- package/dist/service/worker.js.map +1 -0
- package/examples/hello.js +10 -0
- package/examples/loader.json +4 -0
- package/examples/service-loader.json +4 -0
- package/examples/service.js +10 -0
- package/examples/service.mjs +3 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Orbit
|
|
2
|
+
|
|
3
|
+
An independently installed extension platform for Codex desktop on macOS, built on Node.js 22+. Orbit owns the launcher, versioned runtime, plugin installation, compatibility checks, configuration locking and activation recovery. It has no Tags or SQLite dependency.
|
|
4
|
+
|
|
5
|
+
Orbit 0.5.0 is an unpublished npm candidate. Install the local tarball following [installation](../../docs/distribution.md). From a built checkout:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
orbit install
|
|
9
|
+
orbit plugin add ./packages/orbit-tags
|
|
10
|
+
orbit start
|
|
11
|
+
orbit plugin list
|
|
12
|
+
orbit plugin disable orbit-tags
|
|
13
|
+
orbit plugin enable orbit-tags
|
|
14
|
+
orbit plugin uninstall orbit-tags
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Use `~/Applications/Orbit.app` for subsequent launches. A zero-plugin platform is valid. `orbit plugin add /path/to/package` snapshots a built local package. The package must provide an explicit `files` allowlist and `orbit-plugin.json` with `schemaVersion`, `id`, `version`, `runtimeVersion`, `orbit: {min, maxExclusive}`, `renderer` and optional `service`/`codex` declarations. Runtime dependencies are copied into its private snapshot. Registry installs disable npm lifecycle scripts.
|
|
18
|
+
|
|
19
|
+
Business modules import types from `@c0sc0s/orbit/sdk`; installation clients use `@c0sc0s/orbit/installation`. Platform data defaults to `~/Library/Application Support/Orbit`, configurable with `ORBIT_HOME`. Disable preserves files/data; uninstall removes only that plugin and preserves data by default. `--purge` never recursively removes external data. Registry `orbit update`, `orbit plugin update orbit-tags` and `orbit plugin install @c0sc0s/orbit-tags` require published compatible packages; `orbit rollback` selects a retained compatible runtime.
|
|
20
|
+
|
|
21
|
+
## Advanced runtime entry
|
|
22
|
+
|
|
23
|
+
Orbit also owns loopback CDP, isolated renderer globals, per-plugin service processes, RPC/events and cleanup. These explicit-config commands are available for unmanaged development manifests:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
orbit start --config ./loader.json
|
|
27
|
+
orbit status --config ./loader.json
|
|
28
|
+
orbit remove --config ./loader.json --plugin hello
|
|
29
|
+
orbit stop --config ./loader.json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
A manifest has `apiVersion: 1` and `plugins: [{id, version, entry, service?, config?, enabled?}]`. `entry` is a local IIFE defining `CodexPlugin.activate(context)`; optional `service` is a Node ESM file exporting `activate(context)`. Paths must stay inside the manifest directory. `examples/loader.json` provides a renderer-only module; `examples/service-loader.json` adds RPC.
|
|
33
|
+
|
|
34
|
+
Both contexts provide `id`, `config`, `signal` and `onDispose`. Renderer code uses `rpc.call(method, payload, options?)` and `events.subscribe(topic, handler)`. Services use `rpc.handle(method, handler)`, `events.publish(topic, payload, clientId?)`, `clients.onConnect/onDisconnect`, and a persistent `stateDirectory`. The implementation is strict TypeScript. Generated contracts ship in `dist/index.d.ts` alongside compiled ESM JavaScript; consumers do not need a TypeScript runtime. Low-level exports and `createLauncher` support custom infrastructure entry points.
|
|
35
|
+
|
|
36
|
+
Use `--attach` to require an already debug-enabled app. `watch` runs in the foreground; `apply` injects renderer-only bundles once. Increment the module version after code changes. Cleanup runs in reverse registration order. RPC has timeouts, cancellation, payload and concurrency limits. Service crashes do not stop peer services. Fix and disable/re-enable a failed module; no automatic crash restart is performed.
|
|
37
|
+
|
|
38
|
+
Plugins are trusted local code. Services run with Node privileges; renderers share the DOM/thread despite isolated globals. Renderer blocking code can block Codex. Do not put conversation bodies or secrets in diagnostics. Bundle all renderer assets locally. The official Codex bundle is never modified.
|
package/assets/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Orbit application assets
|
|
2
|
+
|
|
3
|
+
- `logo.png`: cobalt-blue pixel planet, stepped white orbit and lime-green star.
|
|
4
|
+
- `app-icon.png`: square application composition emphasizing the complete silhouette.
|
|
5
|
+
- `icon.icns`: packaged macOS icon, including 16, 32, 128, 256 and 512-point representations at 1× and 2×.
|
|
6
|
+
|
|
7
|
+
These assets belong to Orbit and ship without requiring Tags.
|
|
8
|
+
|
|
9
|
+
Run `npm run build:icon -w @c0sc0s/orbit` on macOS to convert `app-icon.png` with `sips` and `iconutil`. Consumers use the prebuilt ICNS and need no conversion tools.
|
|
Binary file
|
package/assets/icon.icns
ADDED
|
Binary file
|
package/assets/logo.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MaybePromise } from "../sdk/contracts.js";
|
|
2
|
+
import type { Target, BindingCall } from "../protocol/types.js";
|
|
3
|
+
interface PendingCommand {
|
|
4
|
+
resolve(value: unknown): void;
|
|
5
|
+
reject(error: unknown): void;
|
|
6
|
+
timer: ReturnType<typeof setTimeout>;
|
|
7
|
+
method: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class CdpClient {
|
|
10
|
+
#private;
|
|
11
|
+
readonly target: Target;
|
|
12
|
+
readonly socket: WebSocket;
|
|
13
|
+
nextCommandId: number;
|
|
14
|
+
pendingCommands: Map<number, PendingCommand>;
|
|
15
|
+
bindingHandlers: Map<string, (params: BindingCall) => MaybePromise<unknown>>;
|
|
16
|
+
generation: number;
|
|
17
|
+
closed: boolean;
|
|
18
|
+
worldContextId?: number;
|
|
19
|
+
worldPending?: Promise<void> | null;
|
|
20
|
+
static connect(target: Target, { createSocket }?: {
|
|
21
|
+
createSocket?: ((url: string) => WebSocket) | undefined;
|
|
22
|
+
}): Promise<CdpClient>;
|
|
23
|
+
constructor(target: Target, socket: WebSocket);
|
|
24
|
+
get connected(): boolean;
|
|
25
|
+
command<T = unknown>(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
26
|
+
useIsolatedWorld(): Promise<void>;
|
|
27
|
+
evaluate<T = unknown>(expression: string, executionContextId?: number | undefined): Promise<T>;
|
|
28
|
+
addBinding(name: string, handler: (params: BindingCall) => MaybePromise<unknown>): Promise<void>;
|
|
29
|
+
removeBinding(name: string): Promise<void>;
|
|
30
|
+
close(): void;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,UAAU,cAAc;IAAG,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAI9I,qBAAa,SAAS;;IA6BR,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS;IA5B/D,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,OAAa,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,YAAkD,EAAE;8BAA/B,MAAM;KAA8B,sBAmB/F;IAED,YAAqB,MAAM,EAAE,MAAM,EAAW,MAAM,EAAE,SAAS,EAS9D;IAED,IAAI,SAAS,YAEZ;IAEK,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAa/G;IAEK,gBAAgB,kBAarB;IAEK,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,qBAAsB,GAAG,OAAO,CAAC,CAAC,CAAC,CASpG;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,iBAIrF;IAEK,aAAa,CAAC,IAAI,EAAE,MAAM,iBAG/B;IAED,KAAK,SAKJ;CAsCF"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
export class CdpClient {
|
|
2
|
+
target;
|
|
3
|
+
socket;
|
|
4
|
+
nextCommandId;
|
|
5
|
+
pendingCommands;
|
|
6
|
+
bindingHandlers;
|
|
7
|
+
generation;
|
|
8
|
+
closed;
|
|
9
|
+
worldContextId;
|
|
10
|
+
worldPending;
|
|
11
|
+
static async connect(target, { createSocket = (url) => new WebSocket(url) } = {}) {
|
|
12
|
+
const socket = createSocket(target.webSocketDebuggerUrl);
|
|
13
|
+
await new Promise((resolve, reject) => {
|
|
14
|
+
const finish = (error) => {
|
|
15
|
+
clearTimeout(timer);
|
|
16
|
+
socket.removeEventListener("open", onOpen);
|
|
17
|
+
socket.removeEventListener("error", onError);
|
|
18
|
+
socket.removeEventListener("close", onClose);
|
|
19
|
+
if (error) {
|
|
20
|
+
socket.close();
|
|
21
|
+
reject(error);
|
|
22
|
+
}
|
|
23
|
+
else
|
|
24
|
+
resolve();
|
|
25
|
+
};
|
|
26
|
+
const onOpen = () => finish();
|
|
27
|
+
const onError = () => finish(new Error(`CDP websocket open failed for target ${target.id}`));
|
|
28
|
+
const onClose = () => finish(new Error(`CDP websocket closed before opening for target ${target.id}`));
|
|
29
|
+
const timer = setTimeout(() => finish(new Error(`CDP websocket open timed out for target ${target.id}`)), 3000);
|
|
30
|
+
socket.addEventListener("open", onOpen);
|
|
31
|
+
socket.addEventListener("error", onError);
|
|
32
|
+
socket.addEventListener("close", onClose);
|
|
33
|
+
});
|
|
34
|
+
return new CdpClient(target, socket);
|
|
35
|
+
}
|
|
36
|
+
constructor(target, socket) {
|
|
37
|
+
this.target = target;
|
|
38
|
+
this.socket = socket;
|
|
39
|
+
this.nextCommandId = 1;
|
|
40
|
+
this.pendingCommands = new Map();
|
|
41
|
+
this.bindingHandlers = new Map();
|
|
42
|
+
this.generation = 0;
|
|
43
|
+
this.closed = false;
|
|
44
|
+
socket.addEventListener("message", (event) => this.#handleMessage(event.data));
|
|
45
|
+
socket.addEventListener("close", () => this.#rejectPending(new Error(`CDP target ${target.id} disconnected`)));
|
|
46
|
+
socket.addEventListener("error", () => this.#rejectPending(new Error(`CDP target ${target.id} failed`)));
|
|
47
|
+
}
|
|
48
|
+
get connected() {
|
|
49
|
+
return !this.closed && this.socket.readyState === 1;
|
|
50
|
+
}
|
|
51
|
+
async command(method, params = {}, timeoutMs = 15_000) {
|
|
52
|
+
if (!this.connected)
|
|
53
|
+
throw new Error(`CDP target ${this.target.id} is not connected`);
|
|
54
|
+
const id = this.nextCommandId;
|
|
55
|
+
this.nextCommandId += 1;
|
|
56
|
+
return await new Promise((resolve, reject) => {
|
|
57
|
+
const timer = setTimeout(() => {
|
|
58
|
+
this.pendingCommands.delete(id);
|
|
59
|
+
reject(new Error(`${method} timed out for target ${this.target.id}`));
|
|
60
|
+
}, timeoutMs);
|
|
61
|
+
this.pendingCommands.set(id, { resolve, reject, timer, method });
|
|
62
|
+
try {
|
|
63
|
+
this.socket.send(JSON.stringify({ id, method, params }));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
this.pendingCommands.delete(id);
|
|
68
|
+
reject(error);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async useIsolatedWorld() {
|
|
73
|
+
if (this.worldContextId !== undefined)
|
|
74
|
+
return;
|
|
75
|
+
this.worldPending ??= (async () => {
|
|
76
|
+
const generation = this.generation;
|
|
77
|
+
await this.command("Runtime.enable");
|
|
78
|
+
const { frameTree } = await this.command("Page.getFrameTree");
|
|
79
|
+
const { executionContextId } = await this.command("Page.createIsolatedWorld", {
|
|
80
|
+
frameId: frameTree.frame.id, worldName: "codex-plugin-loader", grantUniveralAccess: false,
|
|
81
|
+
});
|
|
82
|
+
if (this.generation !== generation)
|
|
83
|
+
throw new Error("Renderer changed during world creation");
|
|
84
|
+
this.worldContextId = executionContextId;
|
|
85
|
+
})().finally(() => { this.worldPending = null; });
|
|
86
|
+
await this.worldPending;
|
|
87
|
+
}
|
|
88
|
+
async evaluate(expression, executionContextId = this.worldContextId) {
|
|
89
|
+
const params = { expression, awaitPromise: true, returnByValue: true };
|
|
90
|
+
if (Number.isSafeInteger(executionContextId))
|
|
91
|
+
params.contextId = executionContextId;
|
|
92
|
+
const response = await this.command("Runtime.evaluate", params);
|
|
93
|
+
if (response?.exceptionDetails) {
|
|
94
|
+
const description = response.exceptionDetails.exception?.description ?? response.exceptionDetails.text;
|
|
95
|
+
throw new Error(description ?? `Runtime.evaluate failed for target ${this.target.id}`);
|
|
96
|
+
}
|
|
97
|
+
return response?.result?.value;
|
|
98
|
+
}
|
|
99
|
+
async addBinding(name, handler) {
|
|
100
|
+
await this.command("Runtime.enable");
|
|
101
|
+
await this.command("Runtime.addBinding", { name, ...(this.worldContextId === undefined ? {} : { executionContextName: "codex-plugin-loader" }) });
|
|
102
|
+
this.bindingHandlers.set(name, handler);
|
|
103
|
+
}
|
|
104
|
+
async removeBinding(name) {
|
|
105
|
+
this.bindingHandlers.delete(name);
|
|
106
|
+
if (this.connected)
|
|
107
|
+
await this.command("Runtime.removeBinding", { name });
|
|
108
|
+
}
|
|
109
|
+
close() {
|
|
110
|
+
this.closed = true;
|
|
111
|
+
this.bindingHandlers.clear();
|
|
112
|
+
this.#rejectPending(new Error(`CDP target ${this.target.id} closed`));
|
|
113
|
+
this.socket.close();
|
|
114
|
+
}
|
|
115
|
+
#handleMessage(rawMessage) {
|
|
116
|
+
let message;
|
|
117
|
+
try {
|
|
118
|
+
message = JSON.parse(rawMessage);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!message || typeof message !== "object")
|
|
124
|
+
return;
|
|
125
|
+
if (message.id !== undefined) {
|
|
126
|
+
const pending = this.pendingCommands.get(message.id);
|
|
127
|
+
if (!pending)
|
|
128
|
+
return;
|
|
129
|
+
this.pendingCommands.delete(message.id);
|
|
130
|
+
clearTimeout(pending.timer);
|
|
131
|
+
if (message.error)
|
|
132
|
+
pending.reject(new Error(`${pending.method} failed: ${message.error.message ?? "unknown CDP error"}`));
|
|
133
|
+
else
|
|
134
|
+
pending.resolve(message.result);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (message.method === "Runtime.executionContextsCleared" || (message.method === "Runtime.executionContextDestroyed" && message.params?.executionContextId === this.worldContextId)) {
|
|
138
|
+
this.generation += 1;
|
|
139
|
+
this.worldContextId = undefined;
|
|
140
|
+
}
|
|
141
|
+
if (message.method !== "Runtime.bindingCalled")
|
|
142
|
+
return;
|
|
143
|
+
const params = message.params;
|
|
144
|
+
if (!params)
|
|
145
|
+
return;
|
|
146
|
+
const handler = this.bindingHandlers.get(params.name);
|
|
147
|
+
if (!handler)
|
|
148
|
+
return;
|
|
149
|
+
Promise.resolve().then(() => handler(params)).catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
#rejectPending(error) {
|
|
152
|
+
for (const { reject, timer } of this.pendingCommands.values()) {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
reject(error);
|
|
155
|
+
}
|
|
156
|
+
this.pendingCommands.clear();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PluginSource } from "../protocol/types.js";
|
|
2
|
+
export declare const LOADER_VERSION = "0.5.0";
|
|
3
|
+
/** Bootstrap only infrastructure; it never loads a product module. */
|
|
4
|
+
export declare function buildLoaderExpression(): string;
|
|
5
|
+
export declare function buildPluginExpression({ id, version, apiVersion, source, config, owner, endpoint }: PluginSource): string;
|
|
6
|
+
export declare function buildPluginRemovalExpression(id: string): string;
|
|
7
|
+
export declare function buildPluginMessageExpression(id: string, message: unknown): string;
|
|
8
|
+
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/cdp/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,sEAAsE;AACtE,wBAAgB,qBAAqB,WAEpC;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAc,EAAE,MAAM,EAAE,MAAW,EAAE,KAAY,EAAE,QAAoB,EAAE,EAAE,YAAY,UAU3I;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,UAEtD;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,UAExE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createRendererTransport } from "../renderer/transport.js";
|
|
2
|
+
import { installLoader } from "../renderer/loader.js";
|
|
3
|
+
import { createResourceScope } from "../lifecycle/resource-scope.js";
|
|
4
|
+
export const LOADER_VERSION = "0.5.0";
|
|
5
|
+
/** Bootstrap only infrastructure; it never loads a product module. */
|
|
6
|
+
export function buildLoaderExpression() {
|
|
7
|
+
return `(${installLoader.toString()})(${createResourceScope.toString()}, ${JSON.stringify(LOADER_VERSION)}, ${createRendererTransport.toString()})`;
|
|
8
|
+
}
|
|
9
|
+
export function buildPluginExpression({ id, version, apiVersion = 1, source, config = {}, owner = null, endpoint = undefined }) {
|
|
10
|
+
if (apiVersion !== 1 || typeof id !== "string" || !/^[a-z][a-z0-9.-]{0,63}$/.test(id)
|
|
11
|
+
|| typeof version !== "string" || !version || typeof source !== "string")
|
|
12
|
+
throw new Error("Invalid plugin descriptor");
|
|
13
|
+
return `(async () => {
|
|
14
|
+
const loader = ${buildLoaderExpression()};
|
|
15
|
+
return loader.load(${JSON.stringify({ id, version, apiVersion, owner, endpoint, instanceId: endpoint?.token })}, async (context) => {
|
|
16
|
+
${source}\n;
|
|
17
|
+
return CodexPlugin.activate(context);
|
|
18
|
+
}, ${JSON.stringify(config)});
|
|
19
|
+
})()`;
|
|
20
|
+
}
|
|
21
|
+
export function buildPluginRemovalExpression(id) {
|
|
22
|
+
return `window.__codexPluginLoader?.unload(${JSON.stringify(id)}) ?? false`;
|
|
23
|
+
}
|
|
24
|
+
export function buildPluginMessageExpression(id, message) {
|
|
25
|
+
return `window.__codexPluginLoader?.dispatch(${JSON.stringify(id)}, ${JSON.stringify(message)}) ?? false`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=expressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../src/cdp/expressions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,sEAAsE;AACtE,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,mBAAmB,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC;AACtJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAgB;IAC1I,IAAI,UAAU,KAAK,CAAC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;WAChF,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACzH,OAAO;qBACY,qBAAqB,EAAE;yBACnB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC1G,MAAM;;SAEL,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;OACxB,CAAC;AACR,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,sCAAsC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU,EAAE,OAAgB;IACvE,OAAO,wCAAwC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;AAC5G,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Target, PluginDescriptor, PluginResult } from "../protocol/types.js";
|
|
2
|
+
type RegistryOptions = {
|
|
3
|
+
port?: number;
|
|
4
|
+
owner?: string | null;
|
|
5
|
+
ownsEndpoint(): Promise<boolean>;
|
|
6
|
+
connect?: typeof CdpClient.connect;
|
|
7
|
+
};
|
|
8
|
+
import { CdpClient } from "./client.js";
|
|
9
|
+
export declare function isCodexRendererTarget(value: unknown): value is Target;
|
|
10
|
+
/** Owns reusable CDP connections and rejects unowned/non-loopback targets. */
|
|
11
|
+
export declare class PluginTargetRegistry {
|
|
12
|
+
port: number;
|
|
13
|
+
owner: string | null;
|
|
14
|
+
ownsEndpoint: RegistryOptions["ownsEndpoint"];
|
|
15
|
+
connect: typeof CdpClient.connect;
|
|
16
|
+
clients: Map<string, CdpClient>;
|
|
17
|
+
constructor({ port, ownsEndpoint, connect, owner }: RegistryOptions);
|
|
18
|
+
assertOwnership(): Promise<void>;
|
|
19
|
+
discover(): Promise<Target[]>;
|
|
20
|
+
client(target: Target): Promise<CdpClient>;
|
|
21
|
+
evaluate<T = unknown>(target: Target, expression: string): Promise<T>;
|
|
22
|
+
prune(targets: Target[]): void;
|
|
23
|
+
close(): void;
|
|
24
|
+
claimPlugin(target: Target, id: string): Promise<void>;
|
|
25
|
+
ensurePlugins(plugins: PluginDescriptor[], targets?: Target[]): Promise<{
|
|
26
|
+
targets: Target[];
|
|
27
|
+
results: PluginResult[];
|
|
28
|
+
injectedTargetIds: Set<string>;
|
|
29
|
+
}>;
|
|
30
|
+
removePlugins(ids: string[]): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=target-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-registry.d.ts","sourceRoot":"","sources":["../../src/cdp/target-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAiB,MAAM,sBAAsB,CAAC;AAClG,KAAK,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,SAAS,CAAC,OAAO,CAAA;CAAE,CAAC;AACtI,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAKrE;AAED,8EAA8E;AAC9E,qBAAa,oBAAoB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,SAAS,CAAC,OAAO,CAAC;IAClC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,YAAY,EAAE,IAAW,EAAE,YAAY,EAAE,OAA2B,EAAE,KAAY,EAAE,EAAE,eAAe,EAOpG;IAEK,eAAe,kBAKpB;IAEK,QAAQ,sBASb;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,sBAY1B;IAEK,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE1E;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAKtB;IAED,KAAK,SAGJ;IAEK,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,iBAG3C;IAEK,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;;;;OA8BlE;IAEK,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,iBAUhC;CACF"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { CdpClient } from "./client.js";
|
|
2
|
+
import { buildLoaderExpression, buildPluginRemovalExpression } from "./expressions.js";
|
|
3
|
+
export function isCodexRendererTarget(value) {
|
|
4
|
+
if (!value || typeof value !== "object")
|
|
5
|
+
return false;
|
|
6
|
+
const target = value;
|
|
7
|
+
return target?.type === "page" && typeof target.url === "string" && target.url.startsWith("app://-")
|
|
8
|
+
&& typeof target.webSocketDebuggerUrl === "string";
|
|
9
|
+
}
|
|
10
|
+
/** Owns reusable CDP connections and rejects unowned/non-loopback targets. */
|
|
11
|
+
export class PluginTargetRegistry {
|
|
12
|
+
port;
|
|
13
|
+
owner;
|
|
14
|
+
ownsEndpoint;
|
|
15
|
+
connect;
|
|
16
|
+
clients;
|
|
17
|
+
constructor({ port = 9341, ownsEndpoint, connect = CdpClient.connect, owner = null }) {
|
|
18
|
+
if (!Number.isSafeInteger(port) || port < 1024 || port > 65535 || typeof ownsEndpoint !== "function")
|
|
19
|
+
throw new Error("Invalid CDP endpoint configuration");
|
|
20
|
+
this.port = port;
|
|
21
|
+
this.owner = owner;
|
|
22
|
+
this.ownsEndpoint = ownsEndpoint;
|
|
23
|
+
this.connect = connect;
|
|
24
|
+
this.clients = new Map();
|
|
25
|
+
}
|
|
26
|
+
async assertOwnership() {
|
|
27
|
+
if (!(await this.ownsEndpoint())) {
|
|
28
|
+
this.close();
|
|
29
|
+
throw new Error(`CDP endpoint 127.0.0.1:${this.port} is not owned by Codex`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async discover() {
|
|
33
|
+
await this.assertOwnership();
|
|
34
|
+
const response = await fetch(`http://127.0.0.1:${this.port}/json/list`, {
|
|
35
|
+
redirect: "error", signal: AbortSignal.timeout(800),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok)
|
|
38
|
+
throw new Error(`CDP discovery failed: HTTP ${response.status}`);
|
|
39
|
+
const targets = await response.json();
|
|
40
|
+
if (!Array.isArray(targets))
|
|
41
|
+
throw new Error("Invalid CDP target list");
|
|
42
|
+
return targets.filter(isCodexRendererTarget);
|
|
43
|
+
}
|
|
44
|
+
async client(target) {
|
|
45
|
+
const url = new URL(target.webSocketDebuggerUrl);
|
|
46
|
+
if (url.protocol !== "ws:" || url.hostname !== "127.0.0.1" || Number(url.port) !== this.port
|
|
47
|
+
|| url.username || url.password)
|
|
48
|
+
throw new Error("CDP target must use the owned loopback endpoint");
|
|
49
|
+
await this.assertOwnership();
|
|
50
|
+
const previous = this.clients.get(target.id);
|
|
51
|
+
if (previous?.connected && previous.target.webSocketDebuggerUrl === target.webSocketDebuggerUrl) {
|
|
52
|
+
await previous.useIsolatedWorld?.();
|
|
53
|
+
return previous;
|
|
54
|
+
}
|
|
55
|
+
previous?.close();
|
|
56
|
+
const client = await this.connect(target);
|
|
57
|
+
this.clients.set(target.id, client);
|
|
58
|
+
await client.useIsolatedWorld?.();
|
|
59
|
+
return client;
|
|
60
|
+
}
|
|
61
|
+
async evaluate(target, expression) {
|
|
62
|
+
return (await this.client(target)).evaluate(expression);
|
|
63
|
+
}
|
|
64
|
+
prune(targets) {
|
|
65
|
+
const ids = new Set(targets.map(({ id }) => id));
|
|
66
|
+
for (const [id, client] of this.clients) {
|
|
67
|
+
if (!ids.has(id)) {
|
|
68
|
+
client.close();
|
|
69
|
+
this.clients.delete(id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
close() {
|
|
74
|
+
for (const client of this.clients.values())
|
|
75
|
+
client.close();
|
|
76
|
+
this.clients.clear();
|
|
77
|
+
}
|
|
78
|
+
async claimPlugin(target, id) {
|
|
79
|
+
await this.evaluate(target, `${buildLoaderExpression()}; true`);
|
|
80
|
+
if (this.owner && !(await this.evaluate(target, `window.__codexPluginLoader.claim(${JSON.stringify(id)}, ${JSON.stringify(this.owner)})`)))
|
|
81
|
+
throw new Error("Plugin owner conflict");
|
|
82
|
+
}
|
|
83
|
+
async ensurePlugins(plugins, targets) {
|
|
84
|
+
await this.assertOwnership();
|
|
85
|
+
targets ??= await this.discover();
|
|
86
|
+
if (!targets.length)
|
|
87
|
+
throw new Error("No Codex renderer found");
|
|
88
|
+
const results = [];
|
|
89
|
+
const injectedTargetIds = new Set();
|
|
90
|
+
await Promise.all(targets.map(async (target) => {
|
|
91
|
+
try {
|
|
92
|
+
await this.evaluate(target, `${buildLoaderExpression()}; true`);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
results.push({ targetId: target.id, pluginId: null, stage: "bootstrap", error: "Loader bootstrap failed" });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
for (const plugin of plugins) {
|
|
99
|
+
let stage = "inspect";
|
|
100
|
+
try {
|
|
101
|
+
if (this.owner && !(await this.evaluate(target, `window.__codexPluginLoader.claim(${JSON.stringify(plugin.id)}, ${JSON.stringify(this.owner)})`)))
|
|
102
|
+
throw new Error("Plugin owner conflict");
|
|
103
|
+
const state = await this.evaluate(target, `window.__codexPluginLoader.status(${JSON.stringify(plugin.id)})`);
|
|
104
|
+
let injected = false;
|
|
105
|
+
if (state?.state !== "active" || state.version !== plugin.version || (plugin.instanceId && state.instanceId !== plugin.instanceId)) {
|
|
106
|
+
stage = "activate";
|
|
107
|
+
await this.evaluate(target, plugin.expression);
|
|
108
|
+
injectedTargetIds.add(target.id);
|
|
109
|
+
injected = true;
|
|
110
|
+
}
|
|
111
|
+
stage = "status";
|
|
112
|
+
const status = await this.evaluate(target, `window.__codexPluginLoader.inspect(${JSON.stringify(plugin.id)})`);
|
|
113
|
+
results.push({ targetId: target.id, pluginId: plugin.id, status, injected });
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
results.push({ targetId: target.id, pluginId: plugin.id, error: `Plugin ${stage} failed`, stage });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}));
|
|
120
|
+
return { targets, results, injectedTargetIds };
|
|
121
|
+
}
|
|
122
|
+
async removePlugins(ids) {
|
|
123
|
+
const targets = await this.discover();
|
|
124
|
+
const failures = [];
|
|
125
|
+
await Promise.all(targets.map(async (target) => {
|
|
126
|
+
for (const id of ids) {
|
|
127
|
+
try {
|
|
128
|
+
await this.evaluate(target, this.owner ? `window.__codexPluginLoader?.release ? window.__codexPluginLoader.release(${JSON.stringify(id)}, ${JSON.stringify(this.owner)}) : (${buildPluginRemovalExpression(id)})` : buildPluginRemovalExpression(id));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
failures.push(`${target.id}/${id}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
135
|
+
if (failures.length)
|
|
136
|
+
throw new Error(`Plugin removal failed: ${failures.join(", ")}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=target-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-registry.js","sourceRoot":"","sources":["../../src/cdp/target-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const commands: readonly ["start", "apply", "watch", "status", "remove", "stop"];
|
|
2
|
+
type Command = typeof commands[number] | "--help";
|
|
3
|
+
export declare function parseArguments(argv: string[]): {
|
|
4
|
+
readonly command: "--help";
|
|
5
|
+
readonly options: Record<string, string | undefined>;
|
|
6
|
+
} | {
|
|
7
|
+
command: Exclude<Command, "--help">;
|
|
8
|
+
options: Record<string, string | undefined> & {
|
|
9
|
+
"--config": string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=arguments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,QAAQ,YAAI,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAClF,KAAK,OAAO,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;AAElD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;;;;aAkBd,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;;oBADa,MAAM;;EAE3E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const commands = ["start", "apply", "watch", "status", "remove", "stop"];
|
|
2
|
+
export function parseArguments(argv) {
|
|
3
|
+
const [command = "--help", ...args] = argv;
|
|
4
|
+
const options = {};
|
|
5
|
+
if (command === "--help")
|
|
6
|
+
return { command, options };
|
|
7
|
+
if (!commands.some(value => value === command))
|
|
8
|
+
throw new Error("Unknown loader command");
|
|
9
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
10
|
+
const key = args[i];
|
|
11
|
+
if (!["--config", "--port", "--token", "--attach", "--plugin"].includes(key) || options[key] !== undefined)
|
|
12
|
+
throw new Error("Invalid loader options");
|
|
13
|
+
if (key === "--attach")
|
|
14
|
+
options[key] = "true";
|
|
15
|
+
else {
|
|
16
|
+
if (!args[i + 1] || args[i + 1].startsWith("--"))
|
|
17
|
+
throw new Error(`Missing ${key} value`);
|
|
18
|
+
options[key] = args[++i];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!options["--config"] || (options["--token"] && command !== "watch") || (options["--attach"] && command !== "start") || (options["--plugin"] && command !== "remove"))
|
|
22
|
+
throw new Error("Invalid options for Loader command; --config is required");
|
|
23
|
+
const port = Number(options["--port"] ?? 9341);
|
|
24
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
25
|
+
throw new Error("Port must be an integer between 1 and 65535");
|
|
26
|
+
const validated = { ...options, "--config": options["--config"] };
|
|
27
|
+
return { command: command, options: validated };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAGlF,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAuC,EAAE,CAAC;IACvD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAW,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACtJ,IAAI,GAAG,KAAK,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;aACzC,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,KAAK,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACtP,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACxH,MAAM,SAAS,GAAgE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/H,OAAO,EAAE,OAAO,EAAE,OAAqC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/cli/platform.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,oBAgElD"}
|