@scotthuang/agent-knock-knock 0.14.4 → 0.14.6

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 (91) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +1 -0
  3. package/dist/src/claude-native-public-projection.d.ts +2 -2
  4. package/dist/src/cli-core.js +1 -47
  5. package/dist/src/cli-core.js.map +1 -1
  6. package/dist/src/cli-runtime-context.d.ts +3 -0
  7. package/dist/src/cli-runtime-context.js.map +1 -1
  8. package/dist/src/cli-usage.d.ts +1 -0
  9. package/dist/src/cli-usage.js +51 -0
  10. package/dist/src/cli-usage.js.map +1 -0
  11. package/dist/src/conversation-list-presentation.d.ts +18 -0
  12. package/dist/src/conversation-list-presentation.js +79 -0
  13. package/dist/src/conversation-list-presentation.js.map +1 -0
  14. package/dist/src/conversation-list.d.ts +14 -2
  15. package/dist/src/conversation-list.js +28 -2
  16. package/dist/src/conversation-list.js.map +1 -1
  17. package/dist/src/desktop-cli-adapter.js +9 -6
  18. package/dist/src/desktop-cli-adapter.js.map +1 -1
  19. package/dist/src/desktop-cli-controls.js +9 -0
  20. package/dist/src/desktop-cli-controls.js.map +1 -1
  21. package/dist/src/desktop-compatibility.d.ts +17 -0
  22. package/dist/src/desktop-compatibility.js +15 -0
  23. package/dist/src/desktop-compatibility.js.map +1 -0
  24. package/dist/src/desktop-creation-cli.d.ts +4 -0
  25. package/dist/src/desktop-creation-cli.js +167 -0
  26. package/dist/src/desktop-creation-cli.js.map +1 -0
  27. package/dist/src/desktop-creation-native.d.ts +70 -0
  28. package/dist/src/desktop-creation-native.js +249 -0
  29. package/dist/src/desktop-creation-native.js.map +1 -0
  30. package/dist/src/desktop-creation-rpc.d.ts +25 -0
  31. package/dist/src/desktop-creation-rpc.js +198 -0
  32. package/dist/src/desktop-creation-rpc.js.map +1 -0
  33. package/dist/src/desktop-creation-semantic.d.ts +13 -0
  34. package/dist/src/desktop-creation-semantic.js +89 -0
  35. package/dist/src/desktop-creation-semantic.js.map +1 -0
  36. package/dist/src/desktop-creation-service.d.ts +27 -0
  37. package/dist/src/desktop-creation-service.js +268 -0
  38. package/dist/src/desktop-creation-service.js.map +1 -0
  39. package/dist/src/desktop-creation-store.d.ts +42 -0
  40. package/dist/src/desktop-creation-store.js +95 -0
  41. package/dist/src/desktop-creation-store.js.map +1 -0
  42. package/dist/src/desktop-interaction-projection.d.ts +2 -1
  43. package/dist/src/desktop-interaction-projection.js +8 -5
  44. package/dist/src/desktop-interaction-projection.js.map +1 -1
  45. package/dist/src/desktop-ipc-client.d.ts +1 -4
  46. package/dist/src/desktop-ipc-client.js +6 -6
  47. package/dist/src/desktop-ipc-client.js.map +1 -1
  48. package/dist/src/desktop-list.d.ts +1 -0
  49. package/dist/src/desktop-list.js +5 -4
  50. package/dist/src/desktop-list.js.map +1 -1
  51. package/dist/src/desktop-public-projection.d.ts +3 -2
  52. package/dist/src/desktop-public-projection.js +23 -18
  53. package/dist/src/desktop-public-projection.js.map +1 -1
  54. package/dist/src/desktop-runtime.js +4 -2
  55. package/dist/src/desktop-runtime.js.map +1 -1
  56. package/dist/src/desktop-semantic.js +2 -0
  57. package/dist/src/desktop-semantic.js.map +1 -1
  58. package/dist/src/desktop-state-store.js +5 -2
  59. package/dist/src/desktop-state-store.js.map +1 -1
  60. package/dist/src/desktop-task-interactions.d.ts +1 -1
  61. package/dist/src/desktop-task-interactions.js +5 -5
  62. package/dist/src/desktop-task-interactions.js.map +1 -1
  63. package/dist/src/desktop-task-service.d.ts +3 -0
  64. package/dist/src/desktop-task-service.js +6 -1
  65. package/dist/src/desktop-task-service.js.map +1 -1
  66. package/dist/src/host-profile-runtime.js +1 -1
  67. package/dist/src/host-profile-runtime.js.map +1 -1
  68. package/dist/src/local-codex-cli-adapter.js +2 -1
  69. package/dist/src/local-codex-cli-adapter.js.map +1 -1
  70. package/dist/src/semantic-tool-command-helpers.js +62 -0
  71. package/dist/src/semantic-tool-command-helpers.js.map +1 -1
  72. package/dist/src/semantic-tool-descriptions.d.ts +2 -1
  73. package/dist/src/semantic-tool-descriptions.js +14 -7
  74. package/dist/src/semantic-tool-descriptions.js.map +1 -1
  75. package/dist/src/semantic-tool-list-projection.d.ts +2 -0
  76. package/dist/src/semantic-tool-list-projection.js +89 -7
  77. package/dist/src/semantic-tool-list-projection.js.map +1 -1
  78. package/dist/src/semantic-tool-runtime.js +2 -0
  79. package/dist/src/semantic-tool-runtime.js.map +1 -1
  80. package/dist/src/semantic-tool-schemas.d.ts +52 -1
  81. package/dist/src/semantic-tool-schemas.js +17 -1
  82. package/dist/src/semantic-tool-schemas.js.map +1 -1
  83. package/dist/src/terminal-list-cli-adapter.js +1 -1
  84. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  85. package/docs/codex-cli-native-compatibility.md +20 -10
  86. package/docs/codex-desktop-compatibility.md +58 -10
  87. package/docs/desktop-create.md +144 -0
  88. package/docs/operator-guide.md +13 -7
  89. package/openclaw.plugin.json +4 -0
  90. package/package.json +1 -1
  91. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +18 -10
@@ -0,0 +1,249 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execFileSync } from "node:child_process";
4
+ import { createDesktopCreationRpc, DesktopCreationRpcError } from "./desktop-creation-rpc.js";
5
+ export const VERIFIED_DESKTOP_CREATION_BUILD = Object.freeze({
6
+ version: "26.1007.30912", build: "20156", backendVersion: "0.162.0-alpha.17.2"
7
+ });
8
+ export class DesktopCreationNativeError extends Error {
9
+ code;
10
+ dispatchState;
11
+ threadId;
12
+ requestId;
13
+ method;
14
+ constructor(code, message, dispatchState = "not_sent", threadId, requestId, method) {
15
+ super(message);
16
+ this.code = code;
17
+ this.dispatchState = dispatchState;
18
+ this.threadId = threadId;
19
+ this.requestId = requestId;
20
+ this.method = method;
21
+ this.name = "DesktopCreationNativeError";
22
+ }
23
+ }
24
+ const uuid = (value) => typeof value === "string"
25
+ && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu.test(value);
26
+ const record = (value) => !!value && typeof value === "object" && !Array.isArray(value);
27
+ function fail(code, message) { throw new DesktopCreationNativeError(code, message); }
28
+ function directory(value, label) {
29
+ if (typeof value !== "string" || !path.isAbsolute(value))
30
+ fail("invalid_argument", `${label} must be an absolute existing directory`);
31
+ try {
32
+ if (fs.statSync(value).isDirectory())
33
+ return fs.realpathSync(value);
34
+ }
35
+ catch { /* fail closed below */ }
36
+ return fail("invalid_argument", `${label} must be an absolute existing directory`);
37
+ }
38
+ function within(root, cwd) {
39
+ const relative = path.relative(root, cwd);
40
+ return relative === "" || (!path.isAbsolute(relative) && relative !== ".." && !relative.startsWith(`..${path.sep}`));
41
+ }
42
+ function inspectApplication(appPath) {
43
+ if (process.platform !== "darwin")
44
+ fail("incompatible_desktop", "Desktop creation requires the verified macOS application");
45
+ appPath = directory(appPath, "Desktop application");
46
+ const plist = path.join(appPath, "Contents", "Info.plist");
47
+ const read = (key) => execFileSync("/usr/libexec/PlistBuddy", ["-c", `Print :${key}`, plist], { encoding: "utf8", timeout: 3000, stdio: ["ignore", "pipe", "ignore"] }).trim();
48
+ try {
49
+ if (read("CFBundleIdentifier") !== "com.openai.codex")
50
+ fail("incompatible_desktop", "Desktop application identity is not Codex");
51
+ const appVersion = read("CFBundleShortVersionString"), appBuild = read("CFBundleVersion");
52
+ const binaryPath = fs.realpathSync(path.join(appPath, "Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex"));
53
+ if (!within(appPath, binaryPath))
54
+ fail("incompatible_desktop", "Desktop bundled binary escapes its application");
55
+ const output = execFileSync(binaryPath, ["--version"], { encoding: "utf8", timeout: 5000,
56
+ stdio: ["ignore", "pipe", "ignore"] }).trim();
57
+ const backendVersion = /^codex-cli (\S+)$/u.exec(output)?.[1];
58
+ if (!backendVersion)
59
+ fail("incompatible_desktop", "Desktop bundled version is unavailable");
60
+ return { appPath, binaryPath, appVersion, appBuild, backendVersion };
61
+ }
62
+ catch (error) {
63
+ if (error instanceof DesktopCreationNativeError)
64
+ throw error;
65
+ return fail("incompatible_desktop", "Could not verify the installed Desktop application and bundled binary");
66
+ }
67
+ }
68
+ function project(value) {
69
+ if (!record(value) || !uuid(value.id) || typeof value.name !== "string" || !value.name.trim()
70
+ || !Array.isArray(value.roots))
71
+ fail("invalid_response", "Invalid Desktop project identity or roots");
72
+ const roots = value.roots.map(root => {
73
+ if (!record(root) || typeof root.path !== "string" || !path.isAbsolute(root.path)) {
74
+ return fail("invalid_response", "Invalid Desktop project root");
75
+ }
76
+ return root.path;
77
+ });
78
+ return { id: value.id, name: value.name, roots };
79
+ }
80
+ function thread(value, expectedId) {
81
+ if (!record(value) || !record(value.thread))
82
+ fail("invalid_response", "Desktop creation has no thread receipt");
83
+ const t = value.thread;
84
+ if (!uuid(t.id) || (expectedId && t.id !== expectedId) || typeof t.cwd !== "string" || !path.isAbsolute(t.cwd)
85
+ || !(t.projectId === null || uuid(t.projectId)) || t.ephemeral !== false
86
+ || !(t.name == null || typeof t.name === "string"))
87
+ fail("invalid_response", "Desktop thread identity is invalid or changed");
88
+ return { threadId: t.id, cwd: t.cwd, projectId: t.projectId,
89
+ title: typeof t.name === "string" ? t.name : null };
90
+ }
91
+ /** Creates metadata only. A user task must be sent through the original Desktop owner after handoff. */
92
+ export async function createDesktopCreationNative(options) {
93
+ const codexHome = directory(options.codexHome, "Codex home");
94
+ const inspected = (options.inspectApplication ?? inspectApplication)(options.appPath ?? "/Applications/ChatGPT.app");
95
+ const verified = VERIFIED_DESKTOP_CREATION_BUILD;
96
+ if (options.compatibility.version !== verified.version || options.compatibility.build !== verified.build
97
+ || inspected.appVersion !== verified.version || inspected.appBuild !== verified.build
98
+ || inspected.backendVersion !== verified.backendVersion) {
99
+ fail("incompatible_desktop", "Desktop creation requires the verified application build and bundled backend");
100
+ }
101
+ const metadata = { ...inspected, codexHome };
102
+ let rpc;
103
+ try {
104
+ rpc = (options.rpcFactory ?? createDesktopCreationRpc)({ binaryPath: metadata.binaryPath, codexHome, timeoutMs: options.timeoutMs });
105
+ }
106
+ catch {
107
+ return fail("connection_failed", "Could not start the dedicated Desktop creation process");
108
+ }
109
+ try {
110
+ const initialized = await rpc.request("initialize", { clientInfo: {
111
+ name: "agent-knock-knock-desktop-create", title: "AKK Desktop creation", version: "1"
112
+ }, capabilities: { experimentalApi: true } });
113
+ if (!record(initialized) || typeof initialized.codexHome !== "string"
114
+ || directory(initialized.codexHome, "Backend Codex home") !== codexHome
115
+ || typeof initialized.userAgent !== "string"
116
+ || !initialized.userAgent.startsWith(`agent-knock-knock-desktop-create/${metadata.backendVersion} `)) {
117
+ fail("incompatible_desktop", "Desktop creation backend identity or Codex home does not match");
118
+ }
119
+ rpc.notifyInitialized();
120
+ }
121
+ catch (error) {
122
+ await rpc.close();
123
+ throw error;
124
+ }
125
+ return new DesktopCreationConnection(metadata, rpc);
126
+ }
127
+ class DesktopCreationConnection {
128
+ metadata;
129
+ rpc;
130
+ attempted = false;
131
+ creating = false;
132
+ constructor(metadata, rpc) {
133
+ this.metadata = metadata;
134
+ this.rpc = rpc;
135
+ }
136
+ async projects() {
137
+ const all = [], cursors = new Set(), ids = new Set();
138
+ let cursor;
139
+ for (let page = 0; page < 20; page++) {
140
+ const result = await this.rpc.request("project/list", { limit: 100, ...(cursor ? { cursor } : {}) });
141
+ if (!record(result) || !Array.isArray(result.data)
142
+ || !(result.nextCursor == null || typeof result.nextCursor === "string" && !!result.nextCursor)) {
143
+ fail("invalid_response", "Invalid Desktop project page");
144
+ }
145
+ for (const raw of result.data) {
146
+ const entry = project(raw);
147
+ if (ids.has(entry.id))
148
+ fail("invalid_response", "Desktop project pages contain duplicate identities");
149
+ ids.add(entry.id);
150
+ all.push(entry);
151
+ }
152
+ if (result.nextCursor == null)
153
+ return all;
154
+ cursor = result.nextCursor;
155
+ if (cursors.has(cursor))
156
+ fail("invalid_response", "Desktop project pagination did not advance");
157
+ cursors.add(cursor);
158
+ }
159
+ return fail("project_list_incomplete", "Desktop project discovery exceeded its bounded page limit");
160
+ }
161
+ async resolveProject(selector) {
162
+ if ((!selector.projectId && !selector.projectName) || (selector.projectId && !uuid(selector.projectId))) {
163
+ fail("invalid_argument", "An exact Desktop project ID or name is required");
164
+ }
165
+ const matches = (await this.projects()).filter(entry => (!selector.projectId || entry.id === selector.projectId)
166
+ && (!selector.projectName || entry.name === selector.projectName));
167
+ if (matches.length !== 1)
168
+ fail(matches.length ? "ambiguous_project" : "project_not_found", "Desktop project must match exactly one result");
169
+ const listed = matches[0], response = await this.rpc.request("project/read", { projectId: listed.id });
170
+ const exact = project(record(response) ? response.project : undefined);
171
+ if (exact.id !== listed.id || exact.name !== listed.name
172
+ || JSON.stringify([...exact.roots].sort()) !== JSON.stringify([...listed.roots].sort())) {
173
+ fail("project_changed", "Desktop project changed during exact discovery");
174
+ }
175
+ const roots = [...new Set(exact.roots.map(root => directory(root, "Desktop project root")))];
176
+ if (!roots.length)
177
+ fail("project_cwd_mismatch", "Desktop project has no local working directory");
178
+ if (!selector.cwd && roots.length !== 1)
179
+ fail("ambiguous_project_root", "A Desktop project with multiple roots requires an explicit working directory");
180
+ const cwd = directory(selector.cwd ?? roots[0], "Working directory");
181
+ if (!roots.some(root => within(root, cwd)))
182
+ fail("project_cwd_mismatch", "Working directory is outside the selected Desktop project roots");
183
+ return { project: exact, cwd };
184
+ }
185
+ async read(threadId) {
186
+ if (!uuid(threadId))
187
+ fail("invalid_argument", "A precise Desktop thread UUID is required");
188
+ return thread(await this.rpc.request("thread/read", { threadId, includeTurns: false }), threadId);
189
+ }
190
+ close() { return this.rpc.close(); }
191
+ async create(input) {
192
+ if (this.creating || this.attempted)
193
+ fail("duplicate_creation", "Desktop creation was already attempted; it will not be repeated");
194
+ this.creating = true;
195
+ let createdId;
196
+ try {
197
+ const cwd = directory(input.cwd, "Working directory");
198
+ validateCreationInput(input);
199
+ if (input.projectId !== undefined)
200
+ await this.resolveProject({ projectId: input.projectId, cwd });
201
+ const result = await this.rpc.request("thread/start", { cwd, projectId: input.projectId ?? null,
202
+ threadSource: "user", ephemeral: false,
203
+ ...(input.approvalPolicy ? { approvalPolicy: input.approvalPolicy } : {}),
204
+ ...(input.sandbox ? { sandbox: input.sandbox } : {})
205
+ }, { beforeDispatch: async () => { await input.beforeDispatch?.(); this.attempted = true; } });
206
+ if (record(result) && record(result.thread) && uuid(result.thread.id))
207
+ createdId = result.thread.id;
208
+ const created = thread(result);
209
+ // Persist the acknowledged identity before naming/readback can fail or this process exits.
210
+ await input.onCreated?.(created);
211
+ if (created.cwd !== cwd || created.projectId !== (input.projectId ?? null))
212
+ fail("thread_target_mismatch", "Created Desktop thread has an unexpected project or working directory");
213
+ if (input.title)
214
+ await this.rpc.request("thread/name/set", { threadId: created.threadId, name: input.title });
215
+ const confirmed = await this.read(created.threadId);
216
+ verifyReadback(confirmed, cwd, created.projectId, input.title);
217
+ return confirmed;
218
+ }
219
+ catch (error) {
220
+ throw creationError(error, this.attempted, createdId);
221
+ }
222
+ finally {
223
+ this.creating = false;
224
+ }
225
+ }
226
+ }
227
+ function validateCreationInput(input) {
228
+ if (input.title !== undefined && (typeof input.title !== "string" || !input.title.trim() || [...input.title].length > 200)) {
229
+ fail("invalid_argument", "Desktop thread title must contain 1 to 200 characters");
230
+ }
231
+ if ((input.approvalPolicy !== undefined && !["on-request", "untrusted"].includes(input.approvalPolicy))
232
+ || (input.sandbox !== undefined && !["read-only", "workspace-write"].includes(input.sandbox))) {
233
+ fail("invalid_argument", "Desktop creation does not accept permission-bypass settings");
234
+ }
235
+ }
236
+ function verifyReadback(confirmed, cwd, projectId, title) {
237
+ if (confirmed.cwd !== cwd || confirmed.projectId !== projectId || (title && confirmed.title !== title)) {
238
+ fail("thread_target_mismatch", "Desktop thread readback does not match its creation receipt");
239
+ }
240
+ }
241
+ function creationError(error, attempted, createdId) {
242
+ const dispatched = error instanceof DesktopCreationRpcError ? error.requestDispatched : attempted;
243
+ const state = createdId ? "created" : dispatched ? "unknown" : "not_sent";
244
+ if (error instanceof DesktopCreationNativeError) {
245
+ return new DesktopCreationNativeError(error.code, error.message, state, createdId);
246
+ }
247
+ return new DesktopCreationNativeError(error instanceof DesktopCreationRpcError ? error.code : "creation_failed", "Desktop creation did not complete; inspect the dispatch state before taking any further action", state, createdId, error instanceof DesktopCreationRpcError ? error.requestId : undefined, error instanceof DesktopCreationRpcError ? error.method : undefined);
248
+ }
249
+ //# sourceMappingURL=desktop-creation-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-creation-native.js","sourceRoot":"","sources":["../../src/desktop-creation-native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { spawn } from "node:child_process";
2
+ export declare class DesktopCreationRpcError extends Error {
3
+ readonly code: string;
4
+ readonly requestDispatched: boolean;
5
+ readonly method?: string | undefined;
6
+ readonly requestId?: number | undefined;
7
+ readonly rpcCode?: number | undefined;
8
+ constructor(code: string, message: string, requestDispatched: boolean, method?: string | undefined, requestId?: number | undefined, rpcCode?: number | undefined);
9
+ }
10
+ export interface DesktopCreationRpc {
11
+ request(method: string, params: Record<string, unknown>, options?: {
12
+ beforeDispatch?: () => void | Promise<void>;
13
+ }): Promise<unknown>;
14
+ notifyInitialized(): void;
15
+ close(): Promise<void>;
16
+ }
17
+ export interface DesktopCreationRpcOptions {
18
+ binaryPath: string;
19
+ codexHome: string;
20
+ timeoutMs?: number;
21
+ environment?: NodeJS.ProcessEnv;
22
+ spawnProcess?: typeof spawn;
23
+ }
24
+ /** A dedicated, short-lived bundled process. Never attaches to or kills an existing server. */
25
+ export declare function createDesktopCreationRpc(options: DesktopCreationRpcOptions): DesktopCreationRpc;
@@ -0,0 +1,198 @@
1
+ import { spawn } from "node:child_process";
2
+ export class DesktopCreationRpcError extends Error {
3
+ code;
4
+ requestDispatched;
5
+ method;
6
+ requestId;
7
+ rpcCode;
8
+ constructor(code, message, requestDispatched, method, requestId, rpcCode) {
9
+ super(message);
10
+ this.code = code;
11
+ this.requestDispatched = requestDispatched;
12
+ this.method = method;
13
+ this.requestId = requestId;
14
+ this.rpcCode = rpcCode;
15
+ this.name = "DesktopCreationRpcError";
16
+ }
17
+ }
18
+ const METHODS = new Set(["initialize", "project/list", "project/read", "thread/start", "thread/name/set", "thread/read"]);
19
+ const MAX_LINE_BYTES = 4 * 1024 * 1024;
20
+ /** A dedicated, short-lived bundled process. Never attaches to or kills an existing server. */
21
+ export function createDesktopCreationRpc(options) {
22
+ return new DesktopCreationProcess(options);
23
+ }
24
+ class DesktopCreationProcess {
25
+ child;
26
+ timeoutMs;
27
+ pending = new Map();
28
+ sequence = 0;
29
+ buffer = Buffer.alloc(0);
30
+ ended = false;
31
+ closed = false;
32
+ processExited = false;
33
+ spawnFailed = false;
34
+ closePromise;
35
+ resolveExit;
36
+ exited = new Promise(resolve => { this.resolveExit = resolve; });
37
+ constructor(options) {
38
+ this.timeoutMs = options.timeoutMs ?? 30_000;
39
+ if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 60_000) {
40
+ throw new DesktopCreationRpcError("invalid_argument", "Invalid Desktop creation request timeout", false);
41
+ }
42
+ this.child = (options.spawnProcess ?? spawn)(options.binaryPath, ["-c", "features.code_mode_host=true", "app-server", "--listen", "stdio://"], {
43
+ cwd: options.codexHome, env: { ...(options.environment ?? process.env), CODEX_HOME: options.codexHome },
44
+ stdio: ["pipe", "pipe", "pipe"]
45
+ });
46
+ this.child.on("error", () => {
47
+ this.fail("process_failed", "Desktop creation process could not run");
48
+ if (this.child.pid === undefined) {
49
+ this.spawnFailed = true;
50
+ this.resolveExit();
51
+ }
52
+ });
53
+ this.child.on("exit", () => { this.processExited = true; this.fail("closed", "Desktop creation process exited"); this.resolveExit(); });
54
+ this.child.stdin.on("error", () => this.fail("write_failed", "Desktop creation input transport failed"));
55
+ this.child.stdout.on("error", () => this.fail("read_failed", "Desktop creation output transport failed"));
56
+ this.child.stderr.resume(); // Diagnostics may contain local paths; never project raw stderr into receipts.
57
+ this.child.stdout.on("data", (chunk) => this.receive(chunk));
58
+ }
59
+ fail(code, message) {
60
+ this.ended = true;
61
+ for (const [id, item] of this.pending) {
62
+ clearTimeout(item.timer);
63
+ item.reject(new DesktopCreationRpcError(code, message, item.dispatched, item.method, id));
64
+ }
65
+ this.pending.clear();
66
+ }
67
+ receive(chunk) {
68
+ if (this.ended)
69
+ return;
70
+ this.buffer = Buffer.concat([this.buffer, chunk]);
71
+ while (this.buffer.includes(10)) {
72
+ const index = this.buffer.indexOf(10), line = this.buffer.subarray(0, index);
73
+ this.buffer = this.buffer.subarray(index + 1);
74
+ if (line.length > MAX_LINE_BYTES) {
75
+ this.fail("invalid_response", "Desktop creation response exceeds its limit");
76
+ return;
77
+ }
78
+ let message;
79
+ try {
80
+ const value = JSON.parse(line.toString("utf8"));
81
+ if (!value || typeof value !== "object" || Array.isArray(value))
82
+ throw new Error();
83
+ message = value;
84
+ }
85
+ catch {
86
+ this.fail("invalid_response", "Desktop creation returned malformed JSON");
87
+ return;
88
+ }
89
+ if (typeof message.method === "string") {
90
+ // Creation never starts a turn or authorizes server tool/approval requests.
91
+ if (message.id !== undefined) {
92
+ this.fail("unexpected_request", "Desktop creation received an unexpected server request");
93
+ return;
94
+ }
95
+ continue;
96
+ }
97
+ this.settle(message);
98
+ }
99
+ if (this.buffer.length > MAX_LINE_BYTES)
100
+ this.fail("invalid_response", "Desktop creation response exceeds its limit");
101
+ }
102
+ settle(message) {
103
+ const item = typeof message.id === "number" ? this.pending.get(message.id) : undefined;
104
+ if (!item)
105
+ return; // A late response never revives or repeats a timed-out mutation.
106
+ const requestId = message.id;
107
+ this.pending.delete(requestId);
108
+ clearTimeout(item.timer);
109
+ if (message.error && typeof message.error === "object") {
110
+ const rpcCode = message.error.code;
111
+ item.reject(new DesktopCreationRpcError("rpc_rejected", `Desktop ${item.method} returned an error`, item.dispatched, item.method, requestId, typeof rpcCode === "number" ? rpcCode : undefined));
112
+ }
113
+ else if (!Object.hasOwn(message, "result")) {
114
+ item.reject(new DesktopCreationRpcError("invalid_response", "Desktop creation response has no result", item.dispatched, item.method, requestId));
115
+ }
116
+ else
117
+ item.resolve(message.result);
118
+ }
119
+ async request(method, params, options) {
120
+ if (!METHODS.has(method))
121
+ throw new DesktopCreationRpcError("invalid_argument", "Desktop creation method is not permitted", false, method);
122
+ if (this.ended || this.closed)
123
+ throw new DesktopCreationRpcError("closed", "Desktop creation connection is closed", false, method);
124
+ // Serialize before the durable barrier, so malformed input cannot leave a false dispatch record.
125
+ const id = ++this.sequence, payload = `${JSON.stringify({ id, method, params })}\n`;
126
+ try {
127
+ await options?.beforeDispatch?.();
128
+ }
129
+ catch {
130
+ throw new DesktopCreationRpcError("dispatch_barrier_failed", "Desktop creation durable dispatch barrier failed", false, method, id);
131
+ }
132
+ if (this.ended || this.closed || this.child.stdin.destroyed || !this.child.stdin.writable) {
133
+ throw new DesktopCreationRpcError("closed", "Desktop creation connection closed before dispatch", false, method, id);
134
+ }
135
+ return new Promise((resolve, reject) => {
136
+ const item = { method, dispatched: false, resolve, reject,
137
+ timer: setTimeout(() => {
138
+ this.pending.delete(id);
139
+ reject(new DesktopCreationRpcError("timeout", "Desktop creation request timed out; no automatic retry", item.dispatched, method, id));
140
+ }, this.timeoutMs) };
141
+ this.pending.set(id, item);
142
+ try {
143
+ // Once write is called, a throwing/erroring pipe may still have submitted bytes.
144
+ item.dispatched = true;
145
+ this.child.stdin.write(payload);
146
+ }
147
+ catch {
148
+ this.pending.delete(id);
149
+ clearTimeout(item.timer);
150
+ reject(new DesktopCreationRpcError("write_failed", "Desktop creation dispatch outcome is unknown", true, method, id));
151
+ }
152
+ });
153
+ }
154
+ notifyInitialized() {
155
+ if (this.ended || this.closed)
156
+ throw new DesktopCreationRpcError("closed", "Desktop creation connection is closed", false);
157
+ this.child.stdin.write(`${JSON.stringify({ method: "initialized" })}\n`);
158
+ }
159
+ close() {
160
+ if (this.closePromise)
161
+ return this.closePromise;
162
+ this.closed = true;
163
+ this.fail("closed", "Desktop creation connection closed");
164
+ this.closePromise = this.closeProcess();
165
+ return this.closePromise;
166
+ }
167
+ async closeProcess() {
168
+ if (this.processExited || this.spawnFailed || this.child.exitCode !== null || this.child.signalCode !== null)
169
+ return;
170
+ const signal = (name) => {
171
+ if (this.processExited || this.spawnFailed)
172
+ return;
173
+ try {
174
+ this.child.kill(name);
175
+ }
176
+ catch { /* Exit must still be independently confirmed below. */ }
177
+ };
178
+ const terminate = setTimeout(() => signal("SIGTERM"), 1000);
179
+ const kill = setTimeout(() => signal("SIGKILL"), 3000);
180
+ let bound;
181
+ const deadline = new Promise((_resolve, reject) => {
182
+ bound = setTimeout(() => reject(new DesktopCreationRpcError("process_exit_unconfirmed", "Desktop creation process exit could not be confirmed; do not hand off its thread", false)), 4000);
183
+ });
184
+ try {
185
+ try {
186
+ this.child.stdin.end();
187
+ }
188
+ catch { /* Retain bounded signal cleanup if the input pipe fails. */ }
189
+ await Promise.race([this.exited, deadline]);
190
+ }
191
+ finally {
192
+ clearTimeout(terminate);
193
+ clearTimeout(kill);
194
+ clearTimeout(bound);
195
+ }
196
+ }
197
+ }
198
+ //# sourceMappingURL=desktop-creation-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-creation-rpc.js","sourceRoot":"","sources":["../../src/desktop-creation-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { SemanticToolCatalogEntry } from "./semantic-tool-catalog.js";
2
+ /** Creation identity belongs to a controller invocation, never a project/cwd guess. */
3
+ export declare function desktopCreationOperationId(params: Record<string, unknown>, context: {
4
+ sessionKey?: unknown;
5
+ sessionId?: unknown;
6
+ }, toolCallId: unknown): string;
7
+ export declare function desktopCreationToolArgs(params: Record<string, unknown>, config: Record<string, unknown>, context: {
8
+ sessionKey?: unknown;
9
+ sessionId?: unknown;
10
+ }, toolCallId: unknown): string[];
11
+ export declare function desktopCreationResultIsError(result: unknown): boolean;
12
+ /** Keep Desktop resource creation separate from the terminal lifecycle catalog. */
13
+ export declare function createDesktopCreationSemanticTool(api: object & Record<string, unknown>): SemanticToolCatalogEntry;
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { requiredString, pushOptional, numberString } from "./semantic-tool-arguments.js";
3
+ import { resolvePluginStoreDir } from "./semantic-tool-command-helpers.js";
4
+ import { isRecord } from "./value-guards.js";
5
+ import { semanticToolDescriptions } from "./semantic-tool-descriptions.js";
6
+ import { desktopCreateParameters } from "./semantic-tool-schemas.js";
7
+ import { runHostAwareCli, withHostBridgeInvocationSignal } from "./semantic-tool-relay.js";
8
+ import { modelFacingErrorMessage, toolResult } from "./semantic-tool-presentation.js";
9
+ const OPERATION_PATTERN = /^desktop-create:[0-9a-f]{64}$/u;
10
+ const CREATION_FIELDS = ["project", "cwd", "title", "request", "agentHardTimeoutMinutes"];
11
+ /** Creation identity belongs to a controller invocation, never a project/cwd guess. */
12
+ export function desktopCreationOperationId(params, context, toolCallId) {
13
+ const sessionKey = requiredString(context.sessionKey, "controller session");
14
+ if (Object.hasOwn(params, "operation_id")) {
15
+ const id = requiredString(params.operation_id, "operation_id");
16
+ if (!OPERATION_PATTERN.test(id))
17
+ throw new Error("Invalid Desktop creation operation_id");
18
+ return id;
19
+ }
20
+ const callId = requiredString(toolCallId, "stable Desktop creation tool call identity");
21
+ const sessionId = typeof context.sessionId === "string" && context.sessionId.trim() ? context.sessionId : null;
22
+ return "desktop-create:" + createHash("sha256").update(JSON.stringify([
23
+ sessionKey, sessionId, "agent_knock_knock_desktop_create", callId
24
+ ])).digest("hex");
25
+ }
26
+ export function desktopCreationToolArgs(params, config, context, toolCallId) {
27
+ if (Object.keys(params).some(key => ![...CREATION_FIELDS, "operation_id"].includes(key))) {
28
+ throw new Error("Desktop creation accepts only project, cwd, title, request and monitor lifetime, or operation_id to continue");
29
+ }
30
+ const resume = Object.hasOwn(params, "operation_id");
31
+ if (resume && CREATION_FIELDS.some(key => Object.hasOwn(params, key))) {
32
+ throw new Error("Continuing Desktop creation accepts only operation_id; its original payload cannot change");
33
+ }
34
+ const args = ["desktop-create", "--operation-id", desktopCreationOperationId(params, context, toolCallId),
35
+ "--openclaw-session", requiredString(context.sessionKey, "controller session")];
36
+ if (resume)
37
+ args.push("--resume-creation");
38
+ else {
39
+ for (const [key, flag] of [["project", "--project"], ["cwd", "--cwd"], ["title", "--title"], ["request", "--message"]]) {
40
+ if (Object.hasOwn(params, key))
41
+ args.push(flag, requiredString(params[key], key));
42
+ }
43
+ if (Object.hasOwn(params, "agentHardTimeoutMinutes") && (typeof params.agentHardTimeoutMinutes !== "number"
44
+ || !Number.isFinite(params.agentHardTimeoutMinutes) || params.agentHardTimeoutMinutes <= 0)) {
45
+ throw new Error("agentHardTimeoutMinutes must be a positive finite number");
46
+ }
47
+ pushOptional(args, "--agent-hard-timeout-minutes", numberString(params.agentHardTimeoutMinutes) ?? numberString(config.agentHardTimeoutMinutes));
48
+ }
49
+ pushOptional(args, "--store-dir", resolvePluginStoreDir(config));
50
+ pushOptional(args, "--codex-home", config.codexHome);
51
+ pushOptional(args, "--openclaw-bin", config.openclawBin);
52
+ return args;
53
+ }
54
+ export function desktopCreationResultIsError(result) {
55
+ return !isRecord(result) || result.source !== "codex_desktop"
56
+ || !["ready", "opening"].includes(String(result.status))
57
+ || (Object.hasOwn(result, "request_state") && result.request_state !== "accepted");
58
+ }
59
+ /** Keep Desktop resource creation separate from the terminal lifecycle catalog. */
60
+ export function createDesktopCreationSemanticTool(api) {
61
+ return {
62
+ label: "AKK Desktop Create",
63
+ name: "agent_knock_knock_desktop_create",
64
+ description: semanticToolDescriptions.desktop_create,
65
+ inputSchema: desktopCreateParameters,
66
+ async execute(toolContext, toolCallId, rawParams, signal) {
67
+ return withHostBridgeInvocationSignal(signal, async () => {
68
+ if (!isRecord(rawParams))
69
+ throw new Error("Desktop creation parameters must be an object");
70
+ const params = rawParams;
71
+ const args = desktopCreationToolArgs(params, isRecord(api.pluginConfig) ? api.pluginConfig : {}, toolContext, toolCallId);
72
+ const operationId = desktopCreationOperationId(params, toolContext, toolCallId);
73
+ try {
74
+ const result = await runHostAwareCli(api, args, { allowNonzeroJson: true });
75
+ return toolResult(result, { normalizeTurnIdentity: false, forceError: desktopCreationResultIsError(result) });
76
+ }
77
+ catch (error) {
78
+ // The child may already have persisted a thread or sent the first task.
79
+ // Keep its exact identity even when the relay loses the receipt.
80
+ return toolResult({ source: "codex_desktop", operation_id: operationId, status: "uncertain", created: null,
81
+ error_code: "desktop_creation_receipt_unavailable", reason: modelFacingErrorMessage(error),
82
+ next_action: { tool: "agent_knock_knock_desktop_create", input: { operation_id: operationId } },
83
+ warning: "Continue this exact operation only; do not create a replacement or resend the task." }, { normalizeTurnIdentity: false, forceError: true });
84
+ }
85
+ });
86
+ }
87
+ };
88
+ }
89
+ //# sourceMappingURL=desktop-creation-semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-creation-semantic.js","sourceRoot":"","sources":["../../src/desktop-creation-semantic.ts"],"names":[],"mappings":"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"}