jev-codex-cua 0.1.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.
Files changed (92) hide show
  1. package/LICENSE +24 -0
  2. package/NOTICE.md +18 -0
  3. package/README.md +254 -0
  4. package/THIRD_PARTY_LICENSES.md +25 -0
  5. package/dist/add-app.d.ts +1 -0
  6. package/dist/add-app.js +19 -0
  7. package/dist/add-app.js.map +1 -0
  8. package/dist/app-grants.d.ts +10 -0
  9. package/dist/app-grants.js +104 -0
  10. package/dist/app-grants.js.map +1 -0
  11. package/dist/ax.d.ts +9 -0
  12. package/dist/ax.js +77 -0
  13. package/dist/ax.js.map +1 -0
  14. package/dist/cua-driver.d.ts +17 -0
  15. package/dist/cua-driver.js +66 -0
  16. package/dist/cua-driver.js.map +1 -0
  17. package/dist/eval.d.ts +1 -0
  18. package/dist/eval.js +28 -0
  19. package/dist/eval.js.map +1 -0
  20. package/dist/index.d.ts +6 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/install-skill.d.ts +1 -0
  24. package/dist/install-skill.js +44 -0
  25. package/dist/install-skill.js.map +1 -0
  26. package/dist/jev.d.ts +73 -0
  27. package/dist/jev.js +123 -0
  28. package/dist/jev.js.map +1 -0
  29. package/dist/loop.d.ts +28 -0
  30. package/dist/loop.js +244 -0
  31. package/dist/loop.js.map +1 -0
  32. package/dist/native-state.d.ts +17 -0
  33. package/dist/native-state.js +39 -0
  34. package/dist/native-state.js.map +1 -0
  35. package/dist/native-tools.d.ts +17 -0
  36. package/dist/native-tools.js +37 -0
  37. package/dist/native-tools.js.map +1 -0
  38. package/dist/pi-config.d.ts +8 -0
  39. package/dist/pi-config.js +31 -0
  40. package/dist/pi-config.js.map +1 -0
  41. package/dist/pi-extension.d.ts +13 -0
  42. package/dist/pi-extension.js +295 -0
  43. package/dist/pi-extension.js.map +1 -0
  44. package/dist/policy.d.ts +13 -0
  45. package/dist/policy.js +99 -0
  46. package/dist/policy.js.map +1 -0
  47. package/dist/sky/client.d.ts +68 -0
  48. package/dist/sky/client.js +274 -0
  49. package/dist/sky/client.js.map +1 -0
  50. package/dist/sky/runtime.d.ts +7 -0
  51. package/dist/sky/runtime.js +32 -0
  52. package/dist/sky/runtime.js.map +1 -0
  53. package/dist/sky-driver.d.ts +7 -0
  54. package/dist/sky-driver.js +42 -0
  55. package/dist/sky-driver.js.map +1 -0
  56. package/dist/trace.d.ts +33 -0
  57. package/dist/trace.js +77 -0
  58. package/dist/trace.js.map +1 -0
  59. package/dist/types.d.ts +112 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/docs/action-trace.md +66 -0
  63. package/docs/design.md +55 -0
  64. package/docs/local-acceptance.md +43 -0
  65. package/docs/npm-release.md +58 -0
  66. package/docs/requirements.md +40 -0
  67. package/docs/sky-diagnostics.md +29 -0
  68. package/fixtures/cases.json +26 -0
  69. package/package.json +39 -0
  70. package/skill/deskhand/SKILL.md +42 -0
  71. package/skills/jev-codex-cua/SKILL.md +47 -0
  72. package/skills/jev-cua-add-app/SKILL.md +43 -0
  73. package/src/add-app.ts +15 -0
  74. package/src/app-grants.ts +71 -0
  75. package/src/ax.ts +71 -0
  76. package/src/cua-driver.ts +62 -0
  77. package/src/eval.ts +23 -0
  78. package/src/index.ts +6 -0
  79. package/src/install-skill.ts +37 -0
  80. package/src/jev.ts +123 -0
  81. package/src/loop.ts +232 -0
  82. package/src/native-state.ts +40 -0
  83. package/src/native-tools.ts +41 -0
  84. package/src/pi-config.ts +30 -0
  85. package/src/pi-extension.ts +236 -0
  86. package/src/policy.ts +77 -0
  87. package/src/sky/LICENSE.pi-codex-cua +21 -0
  88. package/src/sky/client.ts +248 -0
  89. package/src/sky/runtime.ts +30 -0
  90. package/src/sky-driver.ts +41 -0
  91. package/src/trace.ts +89 -0
  92. package/src/types.ts +82 -0
@@ -0,0 +1,274 @@
1
+ // Adapted from manaflow-ai/pi-codex-cua (MIT). See LICENSE.pi-codex-cua.
2
+ // Changes: bounded framing, cancellation/deadlines, fail-closed lifecycle and redacted diagnostics.
3
+ import { spawn } from "node:child_process";
4
+ import { randomUUID } from "node:crypto";
5
+ import { StringDecoder } from "node:string_decoder";
6
+ export class SkyTimeoutError extends Error {
7
+ constructor(phase, timeoutMs) {
8
+ super(`Sky timeout after ${timeoutMs}ms during ${phase}. The connection was closed; no retry was attempted.`);
9
+ this.name = "SkyTimeoutError";
10
+ }
11
+ }
12
+ export function newTurnIdentity(sessionId, model, reasoningEffort) {
13
+ return { sessionId, threadId: sessionId, turnId: randomUUID(), startedAt: Date.now(), model, reasoningEffort };
14
+ }
15
+ export function requestMeta(turn) {
16
+ return {
17
+ "x-codex-turn-metadata": {
18
+ session_id: turn.sessionId, thread_id: turn.threadId, turn_id: turn.turnId,
19
+ turn_started_at_unix_ms: turn.startedAt, model: turn.model,
20
+ ...(turn.reasoningEffort ? { reasoning_effort: turn.reasoningEffort } : {}), sandbox: "danger-full-access",
21
+ },
22
+ "codex/plugin_id": "computer-use@openai-bundled", threadId: turn.threadId,
23
+ };
24
+ }
25
+ export function prepareArguments(args) {
26
+ return { ...args, ...(typeof args.element_index === "number" ? { element_index: String(args.element_index) } : {}) };
27
+ }
28
+ export class SkyClient {
29
+ child;
30
+ pending = new Map();
31
+ nextId = 1;
32
+ closed = false;
33
+ busy = false;
34
+ initialized = false;
35
+ phase = "not_started";
36
+ schemas = new Map();
37
+ approvalHandler;
38
+ callSignal;
39
+ pauseDeadline;
40
+ resumeDeadline;
41
+ approvalRequested = false;
42
+ buffer = "";
43
+ decoder = new StringDecoder("utf8");
44
+ runtime;
45
+ timeoutMs;
46
+ constructor(runtime, timeoutMs = 30_000) {
47
+ this.runtime = runtime;
48
+ this.timeoutMs = timeoutMs;
49
+ }
50
+ async callSky(method, args, turn, signal, approve) {
51
+ if (this.closed)
52
+ throw new Error("Sky connection closed. Start a new task and observe before acting.");
53
+ if (this.busy)
54
+ throw new Error("Sky connection is busy; concurrent CU calls are not supported.");
55
+ signal?.throwIfAborted();
56
+ this.busy = true;
57
+ const controller = new AbortController();
58
+ let remainingMs = this.timeoutMs;
59
+ let timer;
60
+ let armedAt = 0;
61
+ this.pauseDeadline = () => {
62
+ if (timer) {
63
+ clearTimeout(timer);
64
+ timer = undefined;
65
+ remainingMs -= performance.now() - armedAt;
66
+ }
67
+ };
68
+ this.resumeDeadline = () => {
69
+ if (timer || this.closed)
70
+ return;
71
+ armedAt = performance.now();
72
+ timer = setTimeout(() => controller.abort(new SkyTimeoutError(this.phase, this.timeoutMs)), Math.max(0, remainingMs));
73
+ };
74
+ this.resumeDeadline();
75
+ const combined = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
76
+ this.callSignal = combined;
77
+ this.approvalHandler = approve;
78
+ this.approvalRequested = false;
79
+ try {
80
+ if (!this.initialized)
81
+ await this.start(combined);
82
+ combined.throwIfAborted();
83
+ const schema = this.schemas.get(method);
84
+ if (!schema)
85
+ throw new Error(`Sky does not advertise tool ${method}.`);
86
+ const prepared = prepareArguments(args);
87
+ // Some Sky versions expose disableDiff at a higher-level JS layer only.
88
+ // Never send unsupported options through the strict native MCP interface.
89
+ if (method === "get_app_state" && !Object.hasOwn(schema.inputSchema?.properties ?? {}, "disableDiff"))
90
+ delete prepared.disableDiff;
91
+ if (method === "select_text" && prepared.selection_type !== undefined
92
+ && !Object.hasOwn(schema.inputSchema?.properties ?? {}, "selection_type") && Object.hasOwn(schema.inputSchema?.properties ?? {}, "selection")) {
93
+ prepared.selection = prepared.selection_type;
94
+ delete prepared.selection_type;
95
+ }
96
+ if (schema.inputSchema?.additionalProperties === false) {
97
+ const unexpected = Object.keys(prepared).filter((key) => !Object.hasOwn(schema.inputSchema?.properties ?? {}, key));
98
+ if (unexpected.length)
99
+ throw new Error(`Unsupported Sky arguments for ${method}: ${unexpected.join(", ")}`);
100
+ }
101
+ this.phase = method;
102
+ return await this.request("tools/call", { name: method, arguments: prepared, _meta: requestMeta(turn) }, combined);
103
+ }
104
+ catch (error) {
105
+ this.close();
106
+ if (controller.signal.aborted && !signal?.aborted)
107
+ throw controller.signal.reason;
108
+ throw error;
109
+ }
110
+ finally {
111
+ clearTimeout(timer);
112
+ this.approvalHandler = undefined;
113
+ this.callSignal = undefined;
114
+ this.pauseDeadline = undefined;
115
+ this.resumeDeadline = undefined;
116
+ this.busy = false;
117
+ }
118
+ }
119
+ async start(signal) {
120
+ signal.throwIfAborted();
121
+ const env = { ...process.env };
122
+ // The desktop bridge has no need for the Jev credential.
123
+ delete env.TYPESAFE_API_KEY;
124
+ // This is the first-party signed process chain used upstream, not a permission bypass.
125
+ const child = spawn(this.runtime.codexCliPath, [
126
+ "sandbox", "-P", ":danger-full-access", "--allow-unix-socket", this.runtime.socketDirectory,
127
+ this.runtime.clientPath, "mcp",
128
+ ], { stdio: ["pipe", "pipe", "pipe"], cwd: this.runtime.cwd, env });
129
+ this.child = child;
130
+ child.stdout.on("data", (chunk) => {
131
+ this.buffer += this.decoder.write(chunk);
132
+ if (Buffer.byteLength(this.buffer) > 64 * 1024 * 1024) {
133
+ this.fail(new Error("Sky response exceeded 64 MiB."));
134
+ return;
135
+ }
136
+ let newline;
137
+ while ((newline = this.buffer.indexOf("\n")) !== -1) {
138
+ const line = this.buffer.slice(0, newline);
139
+ this.buffer = this.buffer.slice(newline + 1);
140
+ this.onLine(line);
141
+ }
142
+ });
143
+ // Drain diagnostics without retaining or echoing possibly sensitive app content.
144
+ child.stderr.resume();
145
+ child.stdin.on("error", () => this.fail(new Error("Sky input pipe failed.")));
146
+ child.stdout.on("error", () => this.fail(new Error("Sky output pipe failed.")));
147
+ child.once("error", () => this.fail(new Error("Sky process failed to launch.")));
148
+ child.once("exit", () => this.fail(new Error("Sky process exited. Outcome may be unknown; do not replay actions.")));
149
+ this.phase = "initialize";
150
+ await this.request("initialize", {
151
+ protocolVersion: "2025-06-18", capabilities: { elicitation: {} }, clientInfo: { name: "jev-codex-cua", version: "0.1.0" },
152
+ }, signal);
153
+ signal.throwIfAborted();
154
+ this.write({ jsonrpc: "2.0", method: "notifications/initialized", params: {} });
155
+ this.phase = "tools/list";
156
+ const discovery = await this.request("tools/list", {}, signal);
157
+ if (!Array.isArray(discovery.tools) || discovery.tools.some((tool) => !tool || typeof tool.name !== "string"))
158
+ throw new Error("Sky returned an invalid tool catalog.");
159
+ this.schemas = new Map(discovery.tools.map((tool) => [tool.name, tool]));
160
+ this.initialized = true;
161
+ }
162
+ onLine(line) {
163
+ let message;
164
+ try {
165
+ const value = JSON.parse(line);
166
+ if (!value || typeof value !== "object" || Array.isArray(value))
167
+ throw new Error("bad frame");
168
+ message = value;
169
+ }
170
+ catch {
171
+ this.fail(new Error("Invalid Sky protocol frame."));
172
+ return;
173
+ }
174
+ // Server-initiated JSON-RPC requests may use STRING IDs, independent of our numeric IDs.
175
+ if (typeof message.method === "string" && (typeof message.id === "string" || typeof message.id === "number")) {
176
+ void this.onServerRequest(message.id, message.method, message.params);
177
+ return;
178
+ }
179
+ if (typeof message.id !== "number")
180
+ return;
181
+ const pending = this.pending.get(message.id);
182
+ if (pending && ("result" in message || "error" in message)) {
183
+ this.pending.delete(message.id);
184
+ if (message.error) {
185
+ const error = message.error;
186
+ pending.reject(new Error(`Sky RPC error ${typeof error.code === "number" ? error.code : "unknown"}. Check desktop permissions and runtime compatibility.`));
187
+ }
188
+ else if (message.result && typeof message.result === "object" && !Array.isArray(message.result)) {
189
+ pending.resolve(message.result);
190
+ }
191
+ else {
192
+ pending.reject(new Error("Invalid Sky RPC response."));
193
+ }
194
+ }
195
+ }
196
+ async onServerRequest(id, method, params) {
197
+ if (method !== "elicitation/create") {
198
+ this.write({ jsonrpc: "2.0", id, error: { code: -32601, message: "Unsupported client method" } });
199
+ return;
200
+ }
201
+ const request = params;
202
+ const schema = request?.requestedSchema;
203
+ // We support confirmation only: never collect credentials, fill arbitrary forms or open URLs.
204
+ const emptyObject = schema?.type === "object" && schema.properties != null && typeof schema.properties === "object"
205
+ && !Array.isArray(schema.properties) && Object.keys(schema.properties).length === 0
206
+ && (schema.required === undefined || (Array.isArray(schema.required) && schema.required.length === 0));
207
+ const valid = request && typeof request.message === "string" && request.message.length > 0 && request.message.length <= 4000
208
+ && (request.mode === undefined || request.mode === "form") && emptyObject;
209
+ const signal = this.callSignal;
210
+ if (!valid || !signal || signal.aborted || !this.approvalHandler || this.approvalRequested) {
211
+ this.write({ jsonrpc: "2.0", id, result: { action: "decline" } });
212
+ return;
213
+ }
214
+ this.approvalRequested = true;
215
+ this.pauseDeadline?.();
216
+ try {
217
+ const accepted = await this.approvalHandler(request.message, signal);
218
+ this.write({ jsonrpc: "2.0", id, result: signal.aborted ? { action: "cancel" } : accepted === true ? { action: "accept", content: {} } : { action: "decline" } });
219
+ }
220
+ catch {
221
+ this.write({ jsonrpc: "2.0", id, result: { action: "cancel" } });
222
+ }
223
+ finally {
224
+ this.resumeDeadline?.();
225
+ }
226
+ }
227
+ request(method, params, signal) {
228
+ signal.throwIfAborted();
229
+ if (!this.child || this.closed)
230
+ return Promise.reject(new Error("Sky is not running."));
231
+ const id = this.nextId++;
232
+ return new Promise((resolve, reject) => {
233
+ const abort = () => {
234
+ this.pending.delete(id);
235
+ signal.removeEventListener("abort", abort);
236
+ this.write({ jsonrpc: "2.0", method: "notifications/cancelled", params: { requestId: id, reason: "Task cancelled" } });
237
+ reject(signal.reason instanceof SkyTimeoutError ? signal.reason : new Error(`Sky call cancelled by caller during ${this.phase}; no retry was attempted.`));
238
+ this.close();
239
+ };
240
+ this.pending.set(id, {
241
+ resolve: (value) => { signal.removeEventListener("abort", abort); resolve(value); },
242
+ reject: (error) => { signal.removeEventListener("abort", abort); reject(error); },
243
+ });
244
+ signal.addEventListener("abort", abort, { once: true });
245
+ if (signal.aborted) {
246
+ abort();
247
+ return;
248
+ }
249
+ this.write({ jsonrpc: "2.0", id, method, params });
250
+ });
251
+ }
252
+ write(message) {
253
+ if (!this.closed)
254
+ this.child?.stdin.write(JSON.stringify(message) + "\n");
255
+ }
256
+ fail(error) {
257
+ for (const pending of this.pending.values())
258
+ pending.reject(error);
259
+ this.pending.clear();
260
+ this.close();
261
+ }
262
+ close() {
263
+ if (this.closed)
264
+ return;
265
+ this.closed = true;
266
+ for (const pending of this.pending.values())
267
+ pending.reject(new Error("Sky connection closed; pending outcome may be unknown."));
268
+ this.pending.clear();
269
+ this.child?.kill("SIGKILL");
270
+ this.child = undefined;
271
+ this.buffer = "";
272
+ }
273
+ }
274
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sky/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface SkyRuntime {
2
+ clientPath: string;
3
+ codexCliPath: string;
4
+ socketDirectory: string;
5
+ cwd: string;
6
+ }
7
+ export declare function resolveSkyRuntime(env?: NodeJS.ProcessEnv, home?: string): SkyRuntime;
@@ -0,0 +1,32 @@
1
+ // Adapted from manaflow-ai/pi-codex-cua (MIT). See LICENSE.pi-codex-cua.
2
+ import { accessSync, constants } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ function accessible(path, mode = constants.R_OK) {
6
+ try {
7
+ accessSync(path, mode);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ export function resolveSkyRuntime(env = process.env, home = homedir()) {
15
+ if (process.platform !== "darwin")
16
+ throw new Error("Sky Computer Use requires macOS.");
17
+ const service = env.PI_CODEX_CUA_SERVICE ?? join(home, ".codex/computer-use/Codex Computer Use.app");
18
+ const clientPath = env.PI_CODEX_CUA_CLIENT ?? join(service, "Contents/SharedSupport/SkyComputerUseClient.app/Contents/MacOS/SkyComputerUseClient");
19
+ const codexCliPath = env.PI_CODEX_CUA_CODEX ?? join(env.PI_CODEX_CUA_RESOURCES ?? "/Applications/ChatGPT.app/Contents/Resources", "codex");
20
+ const socketDirectory = env.PI_CODEX_CUA_SOCKET_DIRECTORY ?? join(home, "Library/Group Containers/2DC432GLL2.com.openai.sky.CUAService/IPC");
21
+ const cwd = env.CODEX_HOME ?? join(home, ".codex/computer-use");
22
+ const missing = [
23
+ !accessible(clientPath, constants.X_OK) && "SkyComputerUseClient",
24
+ !accessible(codexCliPath, constants.X_OK) && "Codex CLI",
25
+ !accessible(socketDirectory) && "Computer Use IPC directory",
26
+ !accessible(cwd) && "Computer Use working directory",
27
+ ].filter(Boolean);
28
+ if (missing.length)
29
+ throw new Error(`Codex Computer Use runtime unavailable: ${missing.join(", ")}. Install/update the official desktop runtime and grant its permissions.`);
30
+ return { clientPath, codexCliPath, socketDirectory, cwd };
31
+ }
32
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/sky/runtime.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,SAAS,UAAU,CAAC,IAAY,EAAE,IAAI,GAAG,SAAS,CAAC,IAAI;IACrD,IAAI,CAAC;QAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACtE,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,EAAE;IACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,IAAI,EAAE,4CAA4C,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,qFAAqF,CAAC,CAAC;IACnJ,MAAM,YAAY,GAAG,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,8CAA8C,EAAE,OAAO,CAAC,CAAC;IAC3I,MAAM,eAAe,GAAG,GAAG,CAAC,6BAA6B,IAAI,IAAI,CAAC,IAAI,EAAE,mEAAmE,CAAC,CAAC;IAC7I,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG;QACd,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,sBAAsB;QACjE,CAAC,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW;QACxD,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,4BAA4B;QAC5D,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,gCAAgC;KACrD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IAC7K,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Driver } from "./types.ts";
2
+ import type { SkyResult, TurnIdentity, SkyApprovalHandler } from "./sky/client.ts";
3
+ export interface SkyCaller {
4
+ callSky(method: string, args: Record<string, unknown>, turn: TurnIdentity, signal?: AbortSignal, approve?: SkyApprovalHandler): Promise<SkyResult>;
5
+ }
6
+ export declare function skyText(result: SkyResult): string;
7
+ export declare function createSkyDriver(client: SkyCaller, turn: TurnIdentity, signal?: AbortSignal, approve?: SkyApprovalHandler): Driver;
@@ -0,0 +1,42 @@
1
+ import { parseAX } from "./ax.js";
2
+ export function skyText(result) {
3
+ if (result.isError)
4
+ throw new Error("Sky reported an error; check app approval, permissions, screen lock and runtime compatibility.");
5
+ if (!Array.isArray(result.content))
6
+ throw new Error("Sky did not return content.");
7
+ const text = result.content.filter((item) => item.type === "text" && typeof item.text === "string").map((item) => item.type === "text" ? item.text : "").join("\n");
8
+ if (!text.trim())
9
+ throw new Error("Sky did not return AX text.");
10
+ if (Buffer.byteLength(text) > 1024 * 1024)
11
+ throw new Error("AX text exceeds 1 MiB; use a smaller window.");
12
+ // With native runtimes that omit disableDiff, never assume a partial update is a full tree.
13
+ if (!parseAX(text).some((element) => element.role === "standard window")) {
14
+ throw new Error("Sky did not return a recognizable full AX window tree; no decision or action is safe. Partial updates are not supported.");
15
+ }
16
+ return text;
17
+ }
18
+ export function createSkyDriver(client, turn, signal, approve) {
19
+ let app;
20
+ const call = async (method, args) => {
21
+ signal?.throwIfAborted();
22
+ if (!app)
23
+ throw new Error("Bind an app before using Sky.");
24
+ const result = await client.callSky(method, { app, ...args }, turn, signal, approve);
25
+ if (result.isError)
26
+ throw new Error("Sky action failed; do not replay it without fresh observation.");
27
+ return result;
28
+ };
29
+ return {
30
+ async bind(name) { signal?.throwIfAborted(); app = name; },
31
+ async observe() { return skyText(await call("get_app_state", { disableDiff: true })); },
32
+ async click(index) { return call("click", { element_index: index }); },
33
+ async setValue(index, value) { return call("set_value", { element_index: index, value }); },
34
+ async typeText(text) { return call("type_text", { text }); },
35
+ async pressKey(key) {
36
+ const canonical = { tab: "Tab", "shift+tab": "Shift_L+Tab", escape: "Escape", left: "Left", right: "Right", up: "Up", down: "Down", home: "Home", end: "End", pageup: "Page_Up", pagedown: "Page_Down" };
37
+ return call("press_key", { key: canonical[key.toLowerCase()] ?? key });
38
+ },
39
+ async scroll(index, direction, pages) { return call("scroll", { element_index: index, direction, pages }); },
40
+ };
41
+ }
42
+ //# sourceMappingURL=sky-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sky-driver.js","sourceRoot":"","sources":["../src/sky-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type TraceMode = "metadata" | "full";
2
+ export interface TraceEvent {
3
+ event: "start" | "decision" | "action" | "finish";
4
+ step?: number;
5
+ action?: string | null;
6
+ index?: number | null;
7
+ confidence?: number | null;
8
+ risk?: number | null;
9
+ done?: number | null;
10
+ latencyMs?: number;
11
+ status?: string;
12
+ reason?: string;
13
+ changed?: boolean;
14
+ elapsedMs?: number;
15
+ candidateCount?: number;
16
+ }
17
+ export interface FullTraceEvent {
18
+ event: "task" | "snapshot" | "decision_input" | "decision_output" | "jev" | "action_prepared" | "gate" | "dispatch_start" | "dispatch_return" | "verification" | "failure" | "outcome";
19
+ step?: number;
20
+ [key: string]: unknown;
21
+ }
22
+ export interface TraceOptions {
23
+ mode?: TraceMode;
24
+ secrets?: readonly string[];
25
+ maxBytes?: number;
26
+ }
27
+ export declare function createTrace(directory?: string, options?: TraceOptions): {
28
+ path: string | undefined;
29
+ readonly incomplete: boolean;
30
+ record(event: TraceEvent): void;
31
+ full(event: FullTraceEvent): void;
32
+ close(): void;
33
+ };
package/dist/trace.js ADDED
@@ -0,0 +1,77 @@
1
+ import { closeSync, constants, lstatSync, mkdirSync, openSync, writeSync } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { join } from "node:path";
4
+ export function createTrace(directory, options = {}) {
5
+ const mode = options.mode ?? "metadata";
6
+ if (mode === "full" && !directory)
7
+ throw new Error("Full tracing requires an explicit local directory.");
8
+ const runId = randomUUID();
9
+ let path;
10
+ let fd;
11
+ if (directory) {
12
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
13
+ if (mode === "full") {
14
+ const info = lstatSync(directory);
15
+ if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o077) !== 0 || (process.getuid && info.uid !== process.getuid())) {
16
+ throw new Error("Full trace directory must be an owner-only directory (700), not a symlink.");
17
+ }
18
+ }
19
+ path = join(directory, `${runId}.jsonl`);
20
+ fd = openSync(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_APPEND | constants.O_NOFOLLOW, 0o600);
21
+ }
22
+ let sequence = 0;
23
+ let bytes = 0;
24
+ let failed = false;
25
+ const started = performance.now();
26
+ const maxBytes = options.maxBytes ?? 64 * 1024 * 1024;
27
+ // Redact the credential after JSON serialization too (including escaped forms).
28
+ // Do not serialize process.env, provider headers or the JevOptions object.
29
+ const secrets = [...new Set((options.secrets ?? []).filter(Boolean).map((secret) => JSON.stringify(secret).slice(1, -1)))].sort((a, b) => b.length - a.length);
30
+ function append(event) {
31
+ if (fd === undefined)
32
+ return;
33
+ if (failed)
34
+ throw new Error("Trace is incomplete; no further desktop actions may be dispatched.");
35
+ try {
36
+ let line = JSON.stringify({ ...event, schemaVersion: 1, runId, mode, seq: ++sequence,
37
+ ts: new Date().toISOString(), sinceStartMs: Math.round(performance.now() - started) });
38
+ for (const secret of secrets)
39
+ line = line.replaceAll(secret, "[REDACTED]");
40
+ const buffer = Buffer.from(line + "\n");
41
+ if (bytes + buffer.length > maxBytes)
42
+ throw new Error("Trace exceeded its 64 MiB budget; task stopped instead of silently dropping events.");
43
+ let written = 0;
44
+ while (written < buffer.length) {
45
+ const count = writeSync(fd, buffer, written, buffer.length - written);
46
+ if (count === 0)
47
+ throw new Error("Trace write made no progress.");
48
+ written += count;
49
+ }
50
+ bytes += buffer.length;
51
+ }
52
+ catch (error) {
53
+ failed = true;
54
+ throw error;
55
+ }
56
+ }
57
+ return {
58
+ path,
59
+ get incomplete() { return failed; },
60
+ record(event) { append(event); },
61
+ full(event) { if (mode === "full")
62
+ append(event); },
63
+ close() {
64
+ if (fd !== undefined) {
65
+ const previous = fd;
66
+ fd = undefined;
67
+ try {
68
+ closeSync(previous);
69
+ }
70
+ catch {
71
+ failed = true;
72
+ }
73
+ }
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ export interface AXElement {
2
+ index: number;
3
+ role: string;
4
+ label: string;
5
+ depth: number;
6
+ raw: string;
7
+ }
8
+ export interface Candidate extends AXElement {
9
+ score: number;
10
+ }
11
+ export declare const ACTIONS: readonly ["click_element", "click_at", "drag", "set_value", "type_text", "press_key", "scroll", "wait", "ask_user"];
12
+ export type ActionKind = typeof ACTIONS[number];
13
+ export interface Decision {
14
+ action: ActionKind | null;
15
+ targetIndex: number | null;
16
+ confidence: number | null;
17
+ risk: number | null;
18
+ done: number | null;
19
+ latencyMs?: number;
20
+ usage?: Record<string, unknown>;
21
+ }
22
+ export interface DecisionInput {
23
+ goal: string;
24
+ app: string;
25
+ candidates: readonly AXElement[];
26
+ context: string;
27
+ recentActions: readonly string[];
28
+ constraints: string;
29
+ }
30
+ export type Decider = (input: DecisionInput) => Promise<Decision>;
31
+ export type Direction = "up" | "down" | "left" | "right";
32
+ export type Point = readonly [number, number];
33
+ export interface Resources {
34
+ text?: string;
35
+ key?: string;
36
+ direction?: Direction;
37
+ at?: Point;
38
+ from?: Point;
39
+ to?: Point;
40
+ }
41
+ export type PreparedAction = {
42
+ kind: "click_element";
43
+ index: number;
44
+ } | {
45
+ kind: "set_value" | "type_text";
46
+ index: number;
47
+ text: string;
48
+ } | {
49
+ kind: "press_key";
50
+ index: number;
51
+ key: string;
52
+ } | {
53
+ kind: "scroll";
54
+ index: number;
55
+ direction: Direction;
56
+ } | {
57
+ kind: "click_at";
58
+ at: Point;
59
+ } | {
60
+ kind: "drag";
61
+ from: Point;
62
+ to: Point;
63
+ } | {
64
+ kind: "wait";
65
+ } | {
66
+ kind: "ask_user";
67
+ };
68
+ export interface Driver {
69
+ bind(appName: string): Promise<unknown>;
70
+ observe(): Promise<string>;
71
+ click?(index: number): Promise<unknown>;
72
+ setValue?(index: number, value: string): Promise<unknown>;
73
+ typeText?(text: string): Promise<unknown>;
74
+ pressKey?(key: string): Promise<unknown>;
75
+ scroll?(index: number, direction: Direction, pages: number): Promise<unknown>;
76
+ }
77
+ export type Verdict = "proceed" | "confirm" | "escalate" | "stop" | "model_done";
78
+ export interface Gate {
79
+ verdict: Verdict;
80
+ reason: string;
81
+ }
82
+ export type Status = Exclude<Verdict, "proceed"> | "done" | "dry_run" | "max_steps" | "error" | "needs_planner";
83
+ export interface TaskResult {
84
+ status: Status;
85
+ steps: number;
86
+ verified: boolean;
87
+ elapsedMs: number;
88
+ reason: string;
89
+ planned?: PreparedAction;
90
+ target?: {
91
+ role: string;
92
+ label: string;
93
+ };
94
+ decision?: Decision;
95
+ tracePath?: string;
96
+ traceIncomplete?: boolean;
97
+ outcomeUnknown?: boolean;
98
+ handoff?: {
99
+ appName: string;
100
+ goal: string;
101
+ remainingSteps: number;
102
+ context: string;
103
+ recentActions: string[];
104
+ candidates: {
105
+ index: number;
106
+ role: string;
107
+ label: string;
108
+ }[];
109
+ candidatesTruncated: boolean;
110
+ instruction: string;
111
+ };
112
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const ACTIONS = ["click_element", "click_at", "drag", "set_value", "type_text", "press_key", "scroll", "wait", "ask_user"];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC"}