@scotthuang/agent-knock-knock 0.13.11 → 0.13.13

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 (127) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +8 -9
  3. package/dist/src/codex-app-server-interaction-client.d.ts +72 -0
  4. package/dist/src/codex-app-server-interaction-client.js +311 -0
  5. package/dist/src/codex-app-server-interaction-client.js.map +1 -0
  6. package/dist/src/codex-app-server-questionnaire.d.ts +73 -0
  7. package/dist/src/codex-app-server-questionnaire.js +366 -0
  8. package/dist/src/codex-app-server-questionnaire.js.map +1 -0
  9. package/dist/src/codex-app-server-read-client.d.ts +118 -0
  10. package/dist/src/codex-app-server-read-client.js +300 -0
  11. package/dist/src/codex-app-server-read-client.js.map +1 -0
  12. package/dist/src/codex-app-server-transport.d.ts +11 -0
  13. package/dist/src/codex-app-server-transport.js +47 -0
  14. package/dist/src/codex-app-server-transport.js.map +1 -0
  15. package/dist/src/codex-async-question-adapter.d.ts +5 -0
  16. package/dist/src/codex-async-question-adapter.js +61 -17
  17. package/dist/src/codex-async-question-adapter.js.map +1 -1
  18. package/dist/src/codex-fullscreen-composer-proof.d.ts +23 -0
  19. package/dist/src/codex-fullscreen-composer-proof.js +125 -0
  20. package/dist/src/codex-fullscreen-composer-proof.js.map +1 -0
  21. package/dist/src/codex-lifecycle-compatibility.d.ts +5 -0
  22. package/dist/src/codex-lifecycle-compatibility.js +13 -1
  23. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  24. package/dist/src/codex-paginated-answer-proof.d.ts +25 -0
  25. package/dist/src/codex-paginated-answer-proof.js +189 -0
  26. package/dist/src/codex-paginated-answer-proof.js.map +1 -0
  27. package/dist/src/codex-paginated-async-answer.d.ts +36 -0
  28. package/dist/src/codex-paginated-async-answer.js +322 -0
  29. package/dist/src/codex-paginated-async-answer.js.map +1 -0
  30. package/dist/src/codex-paginated-async-response.d.ts +21 -0
  31. package/dist/src/codex-paginated-async-response.js +118 -0
  32. package/dist/src/codex-paginated-async-response.js.map +1 -0
  33. package/dist/src/codex-paginated-observation.d.ts +30 -0
  34. package/dist/src/codex-paginated-observation.js +139 -0
  35. package/dist/src/codex-paginated-observation.js.map +1 -0
  36. package/dist/src/codex-paginated-questionnaire-runtime.d.ts +33 -0
  37. package/dist/src/codex-paginated-questionnaire-runtime.js +157 -0
  38. package/dist/src/codex-paginated-questionnaire-runtime.js.map +1 -0
  39. package/dist/src/codex-paginated-task.d.ts +78 -0
  40. package/dist/src/codex-paginated-task.js +441 -0
  41. package/dist/src/codex-paginated-task.js.map +1 -0
  42. package/dist/src/codex-paginated-thread-binding.d.ts +18 -0
  43. package/dist/src/codex-paginated-thread-binding.js +56 -0
  44. package/dist/src/codex-paginated-thread-binding.js.map +1 -0
  45. package/dist/src/codex-paginated-thread-facts.d.ts +11 -0
  46. package/dist/src/codex-paginated-thread-facts.js +2 -0
  47. package/dist/src/codex-paginated-thread-facts.js.map +1 -0
  48. package/dist/src/codex-paginated-watch.d.ts +29 -0
  49. package/dist/src/codex-paginated-watch.js +107 -0
  50. package/dist/src/codex-paginated-watch.js.map +1 -0
  51. package/dist/src/codex-terminal-agent-adapter.js +127 -7
  52. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  53. package/dist/src/store.d.ts +1 -1
  54. package/dist/src/store.js +2 -2
  55. package/dist/src/store.js.map +1 -1
  56. package/dist/src/terminal-agent-adapter.d.ts +3 -0
  57. package/dist/src/terminal-agent-adapter.js.map +1 -1
  58. package/dist/src/terminal-agent-bridge.d.ts +13 -5
  59. package/dist/src/terminal-agent-bridge.js +28 -103
  60. package/dist/src/terminal-agent-bridge.js.map +1 -1
  61. package/dist/src/terminal-approval-fingerprint.d.ts +7 -0
  62. package/dist/src/terminal-approval-fingerprint.js +107 -0
  63. package/dist/src/terminal-approval-fingerprint.js.map +1 -0
  64. package/dist/src/terminal-command-cli-ports.d.ts +1 -0
  65. package/dist/src/terminal-composer-classifier.js +39 -1
  66. package/dist/src/terminal-composer-classifier.js.map +1 -1
  67. package/dist/src/terminal-control-provider.d.ts +6 -2
  68. package/dist/src/terminal-control-provider.js +4 -4
  69. package/dist/src/terminal-control-provider.js.map +1 -1
  70. package/dist/src/terminal-human-explicit-send-cli-adapter.js +22 -15
  71. package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -1
  72. package/dist/src/terminal-interaction-core.js +3 -1
  73. package/dist/src/terminal-interaction-core.js.map +1 -1
  74. package/dist/src/terminal-interaction-response-bridge.d.ts +21 -1
  75. package/dist/src/terminal-interaction-response-bridge.js +148 -3
  76. package/dist/src/terminal-interaction-response-bridge.js.map +1 -1
  77. package/dist/src/terminal-list-cli-adapter.js +4 -4
  78. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  79. package/dist/src/terminal-list-facts.d.ts +1 -1
  80. package/dist/src/terminal-list-facts.js +1 -1
  81. package/dist/src/terminal-list-facts.js.map +1 -1
  82. package/dist/src/terminal-managed-send-cli-adapter.d.ts +1 -1
  83. package/dist/src/terminal-managed-send-cli-adapter.js +27 -0
  84. package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -1
  85. package/dist/src/terminal-model-control-bridge.d.ts +1 -1
  86. package/dist/src/terminal-model-control-bridge.js +1 -1
  87. package/dist/src/terminal-model-control-bridge.js.map +1 -1
  88. package/dist/src/terminal-model-control-profile.d.ts +3 -1
  89. package/dist/src/terminal-model-control-profile.js +47 -1
  90. package/dist/src/terminal-model-control-profile.js.map +1 -1
  91. package/dist/src/terminal-model-control.js +63 -21
  92. package/dist/src/terminal-model-control.js.map +1 -1
  93. package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
  94. package/dist/src/terminal-native-inspection-bridge.d.ts +6 -1
  95. package/dist/src/terminal-native-inspection-bridge.js +126 -79
  96. package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
  97. package/dist/src/terminal-questionnaire-adapter.js +20 -16
  98. package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
  99. package/dist/src/terminal-runtime-cli-adapter.js +17 -0
  100. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  101. package/dist/src/terminal-send-watch-policy.d.ts +38 -0
  102. package/dist/src/terminal-send-watch-policy.js +79 -0
  103. package/dist/src/terminal-send-watch-policy.js.map +1 -0
  104. package/dist/src/terminal-submission-facts.d.ts +1 -1
  105. package/dist/src/terminal-submission-facts.js +11 -9
  106. package/dist/src/terminal-submission-facts.js.map +1 -1
  107. package/dist/src/terminal-watch-cli-adapter.d.ts +9 -1
  108. package/dist/src/terminal-watch-cli-adapter.js +199 -210
  109. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  110. package/dist/src/terminal-watch-codec.js +23 -1
  111. package/dist/src/terminal-watch-codec.js.map +1 -1
  112. package/dist/src/terminal-watch-interaction-runtime.js +27 -6
  113. package/dist/src/terminal-watch-interaction-runtime.js.map +1 -1
  114. package/dist/src/terminal-watch-presentation.d.ts +4 -0
  115. package/dist/src/terminal-watch-presentation.js +153 -0
  116. package/dist/src/terminal-watch-presentation.js.map +1 -0
  117. package/dist/src/terminal-watch-record.d.ts +4 -2
  118. package/dist/src/terminal-watch-record.js +15 -10
  119. package/dist/src/terminal-watch-record.js.map +1 -1
  120. package/dist/src/terminal-watch-service.js +13 -1
  121. package/dist/src/terminal-watch-service.js.map +1 -1
  122. package/docs/codex-0.158.0-compatibility.md +129 -0
  123. package/docs/codex-0.159.0-compatibility.md +150 -0
  124. package/docs/quickstart-herdr.md +3 -3
  125. package/docs/quickstart-tmux.md +5 -5
  126. package/package.json +7 -3
  127. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +14 -12
@@ -0,0 +1,300 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { connectCodexUnixWebSocket } from "./codex-app-server-transport.js";
4
+ const MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
5
+ const MAX_PENDING_REQUESTS = 16;
6
+ const DEFAULT_TIMEOUT_MS = 5_000;
7
+ const TURN_STATUSES = new Set(["completed", "interrupted", "failed", "inProgress"]);
8
+ export class CodexAppServerReadError extends Error {
9
+ code;
10
+ rpcCode;
11
+ rpcMessage;
12
+ constructor(code, message, rpcCode, rpcMessage) {
13
+ super(message);
14
+ this.code = code;
15
+ this.rpcCode = rpcCode;
16
+ this.rpcMessage = rpcMessage;
17
+ this.name = "CodexAppServerReadError";
18
+ }
19
+ }
20
+ export class CodexAppServerReadClient {
21
+ transport;
22
+ timeoutMs;
23
+ metadata;
24
+ pending = new Map();
25
+ unsubscribe;
26
+ nextRequestId = 1;
27
+ closed = false;
28
+ constructor(transport, timeoutMs, metadata) {
29
+ this.transport = transport;
30
+ this.timeoutMs = timeoutMs;
31
+ this.metadata = metadata;
32
+ this.unsubscribe = [
33
+ transport.onMessage((message) => this.receive(message)),
34
+ transport.onDisconnect((error) => this.finish(error))
35
+ ];
36
+ }
37
+ static async connect(options) {
38
+ if (!path.isAbsolute(options.codexHome))
39
+ throw new Error("Codex home must be absolute");
40
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
41
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 30_000) {
42
+ throw new Error("Codex app-server timeout must be between 1 and 30000 milliseconds");
43
+ }
44
+ const socketPath = path.join(options.codexHome, "app-server-control", "app-server-control.sock");
45
+ const transport = await (options.transportFactory ?? connectCodexUnixWebSocket)({ socketPath, timeoutMs });
46
+ const metadata = { socketPath, serverVersion: "", codexHome: "", platformFamily: "", platformOs: "" };
47
+ const client = new CodexAppServerReadClient(transport, timeoutMs, metadata);
48
+ try {
49
+ const result = await client.request("initialize", {
50
+ clientInfo: { name: "agent-knock-knock-read", title: "AKK read-only history", version: "1" },
51
+ capabilities: { experimentalApi: true }
52
+ });
53
+ Object.assign(metadata, parseCodexAppServerMetadata(result, options, socketPath));
54
+ transport.send(JSON.stringify({ method: "initialized" }));
55
+ return client;
56
+ }
57
+ catch (error) {
58
+ client.close();
59
+ throw error;
60
+ }
61
+ }
62
+ async readThread(threadId) {
63
+ const result = record(await this.request("thread/read", { threadId: identifier(threadId), includeTurns: false }));
64
+ const thread = record(result.thread);
65
+ if (thread.id !== threadId)
66
+ invalid("Codex app-server returned a different thread");
67
+ identifier(thread.sessionId);
68
+ if (typeof thread.cwd !== "string" || !path.isAbsolute(thread.cwd))
69
+ invalid("Invalid thread cwd");
70
+ if (thread.historyMode !== "legacy" && thread.historyMode !== "paginated")
71
+ invalid("Unknown thread history mode");
72
+ if (typeof thread.cliVersion !== "string")
73
+ invalid("Invalid thread CLI version");
74
+ validateThreadStatus(thread.status);
75
+ if (!Array.isArray(thread.turns))
76
+ invalid("Invalid thread turns");
77
+ thread.turns.forEach(validateTurn);
78
+ return thread;
79
+ }
80
+ async listTurns(options) {
81
+ if (options.itemsView && !["notLoaded", "summary", "full"].includes(options.itemsView)) {
82
+ throw new Error("Invalid Codex turn items view");
83
+ }
84
+ const result = await this.request("thread/turns/list", {
85
+ ...listParams(options), itemsView: options.itemsView ?? "notLoaded"
86
+ });
87
+ return parsePage(result, validateTurn);
88
+ }
89
+ async listItems(options) {
90
+ const params = listParams(options);
91
+ if (options.turnId !== undefined)
92
+ params.turnId = identifier(options.turnId);
93
+ const page = parsePage(await this.request("thread/items/list", params), validateItemEntry);
94
+ if (options.turnId && page.data.some((entry) => entry.turnId !== options.turnId)) {
95
+ invalid("Codex app-server returned items from a different turn");
96
+ }
97
+ return page;
98
+ }
99
+ close() {
100
+ if (!this.closed) {
101
+ this.finish(new CodexAppServerReadError("closed", "Codex app-server read connection closed"));
102
+ }
103
+ this.transport.close();
104
+ }
105
+ request(method, params) {
106
+ if (this.closed)
107
+ return Promise.reject(new CodexAppServerReadError("closed", "Codex app-server read connection closed"));
108
+ if (this.pending.size >= MAX_PENDING_REQUESTS)
109
+ return Promise.reject(new Error("Too many Codex app-server reads"));
110
+ const id = `akk-read-${this.nextRequestId++}`;
111
+ return new Promise((resolve, reject) => {
112
+ const timer = setTimeout(() => {
113
+ this.pending.delete(id);
114
+ reject(new CodexAppServerReadError("timeout", `Codex app-server ${method} timed out`));
115
+ }, this.timeoutMs);
116
+ this.pending.set(id, { resolve, reject, timer });
117
+ try {
118
+ this.transport.send(JSON.stringify({ id, method, params }));
119
+ }
120
+ catch (error) {
121
+ clearTimeout(timer);
122
+ this.pending.delete(id);
123
+ reject(error);
124
+ }
125
+ });
126
+ }
127
+ receive(message) {
128
+ try {
129
+ if (Buffer.byteLength(message) > MAX_MESSAGE_BYTES)
130
+ invalid("Codex app-server message exceeded its bound");
131
+ const response = record(JSON.parse(message));
132
+ // Never respond to server requests: doing so could answer another client's question.
133
+ if (response.method !== undefined || typeof response.id !== "string")
134
+ return;
135
+ const pending = this.pending.get(response.id);
136
+ if (!pending)
137
+ return;
138
+ clearTimeout(pending.timer);
139
+ this.pending.delete(response.id);
140
+ if (response.error !== undefined) {
141
+ const error = record(response.error);
142
+ pending.reject(new CodexAppServerReadError("rpc_error", "Codex app-server read was rejected", Number.isInteger(error.code) ? error.code : undefined, typeof error.message === "string" ? error.message.slice(0, 1024) : undefined));
143
+ }
144
+ else if (Object.hasOwn(response, "result")) {
145
+ pending.resolve(response.result);
146
+ }
147
+ else {
148
+ pending.reject(new CodexAppServerReadError("invalid_response", "Codex app-server response omitted result"));
149
+ }
150
+ }
151
+ catch (error) {
152
+ this.finish(error instanceof Error ? error : new Error("Invalid Codex app-server response"));
153
+ this.transport.close();
154
+ }
155
+ }
156
+ finish(error) {
157
+ this.closed = true;
158
+ for (const pending of this.pending.values()) {
159
+ clearTimeout(pending.timer);
160
+ pending.reject(error);
161
+ }
162
+ this.pending.clear();
163
+ this.unsubscribe.forEach((unsubscribe) => unsubscribe());
164
+ }
165
+ }
166
+ export const connectCodexAppServerReadClient = CodexAppServerReadClient.connect;
167
+ // Official app-server emits this only for an existing, loaded thread before its first input.
168
+ // Callers must separately verify the selected thread's paginated/idle metadata before
169
+ // interpreting this as an empty submission baseline.
170
+ export function isCodexUnmaterializedThreadError(error, threadId) {
171
+ return error instanceof CodexAppServerReadError
172
+ && error.code === "rpc_error"
173
+ && error.rpcCode === -32600
174
+ && error.rpcMessage === `thread ${threadId} is not materialized yet; thread/turns/list is unavailable before first user message`;
175
+ }
176
+ export function parseCodexAppServerMetadata(value, options, socketPath) {
177
+ const result = record(value);
178
+ const version = typeof result.userAgent === "string" ? /^[^/]+\/([^\s]+)(?:\s|$)/u.exec(result.userAgent)?.[1] : undefined;
179
+ if (version !== options.expectedServerVersion) {
180
+ throw new CodexAppServerReadError("incompatible_server", "Codex app-server backend version does not match the required version");
181
+ }
182
+ if (typeof result.codexHome !== "string" || !path.isAbsolute(result.codexHome) || !sameHome(result.codexHome, options.codexHome)) {
183
+ throw new CodexAppServerReadError("incompatible_server", "Codex app-server backend home does not match the selected home");
184
+ }
185
+ if (typeof result.platformFamily !== "string" || typeof result.platformOs !== "string")
186
+ invalid("Missing Codex app-server platform metadata");
187
+ return { serverVersion: version, codexHome: result.codexHome, socketPath, platformFamily: result.platformFamily, platformOs: result.platformOs };
188
+ }
189
+ function sameHome(left, right) {
190
+ if (path.resolve(left) === path.resolve(right))
191
+ return true;
192
+ try {
193
+ return fs.realpathSync(left) === fs.realpathSync(right);
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }
199
+ function listParams(options) {
200
+ const params = { threadId: identifier(options.threadId), limit: options.limit ?? 100 };
201
+ if (!Number.isSafeInteger(params.limit) || params.limit < 1 || params.limit > 100)
202
+ throw new Error("Codex history page limit must be between 1 and 100");
203
+ if (options.cursor !== undefined)
204
+ params.cursor = identifier(options.cursor, 4096);
205
+ if (options.sortDirection !== undefined) {
206
+ if (options.sortDirection !== "asc" && options.sortDirection !== "desc")
207
+ throw new Error("Invalid Codex history sort direction");
208
+ params.sortDirection = options.sortDirection;
209
+ }
210
+ return params;
211
+ }
212
+ function parsePage(value, validate) {
213
+ const page = record(value);
214
+ if (!Array.isArray(page.data) || page.data.length > 100)
215
+ invalid("Invalid bounded Codex history page");
216
+ const cursor = (value) => value == null ? null : identifier(value, 4096);
217
+ return { data: page.data.map(validate), nextCursor: cursor(page.nextCursor), backwardsCursor: cursor(page.backwardsCursor) };
218
+ }
219
+ function validateThreadStatus(value) {
220
+ const status = record(value);
221
+ if (["notLoaded", "idle", "systemError"].includes(status.type))
222
+ return;
223
+ if (status.type !== "active" || !Array.isArray(status.activeFlags) || status.activeFlags.some((flag) => flag !== "waitingOnApproval" && flag !== "waitingOnUserInput"))
224
+ invalid("Unknown Codex thread status");
225
+ }
226
+ function validateTurn(value) {
227
+ const turn = record(value);
228
+ identifier(turn.id);
229
+ if (!TURN_STATUSES.has(turn.status))
230
+ invalid("Unknown Codex turn status");
231
+ if (!Array.isArray(turn.items))
232
+ invalid("Invalid Codex turn items");
233
+ turn.items.forEach(validateItem);
234
+ if (!["notLoaded", "summary", "full"].includes(turn.itemsView))
235
+ invalid("Unknown Codex turn items view");
236
+ for (const field of ["startedAt", "completedAt", "durationMs"])
237
+ nullableNumber(turn[field]);
238
+ if (turn.error !== null && (typeof record(turn.error).message !== "string"))
239
+ invalid("Invalid Codex turn error");
240
+ return turn;
241
+ }
242
+ function validateItemEntry(value) {
243
+ const entry = record(value);
244
+ identifier(entry.turnId);
245
+ validateItem(entry.item);
246
+ nullableNumber(entry.startedAtMs);
247
+ nullableNumber(entry.completedAtMs);
248
+ return entry;
249
+ }
250
+ function validateItem(value) {
251
+ const item = record(value);
252
+ identifier(item.id);
253
+ identifier(item.type);
254
+ if (item.type === "userMessage") {
255
+ if (!Array.isArray(item.content))
256
+ invalid("Invalid Codex user message content");
257
+ for (const input of item.content) {
258
+ const content = record(input);
259
+ identifier(content.type);
260
+ if (content.type === "text" && typeof content.text !== "string")
261
+ invalid("Invalid Codex user message text");
262
+ }
263
+ }
264
+ if (item.type === "agentMessage") {
265
+ if (typeof item.text !== "string")
266
+ invalid("Invalid Codex agent message text");
267
+ if (item.delivery != null && item.delivery !== "async")
268
+ invalid("Unknown Codex agent message delivery");
269
+ if (item.questions != null) {
270
+ if (!Array.isArray(item.questions))
271
+ invalid("Invalid Codex async questions");
272
+ for (const value of item.questions) {
273
+ const question = record(value);
274
+ if (typeof question.title !== "string" || (question.options !== null && (!Array.isArray(question.options) || question.options.some((option) => typeof option !== "string"))))
275
+ invalid("Invalid Codex async question");
276
+ }
277
+ }
278
+ }
279
+ if (item.type === "plan" && typeof item.text !== "string")
280
+ invalid("Invalid Codex proposed plan text");
281
+ return item;
282
+ }
283
+ function nullableNumber(value) {
284
+ if (value !== null && (typeof value !== "number" || !Number.isSafeInteger(value)))
285
+ invalid("Invalid Codex history timestamp");
286
+ }
287
+ function record(value) {
288
+ if (!value || typeof value !== "object" || Array.isArray(value))
289
+ invalid("Invalid Codex app-server object");
290
+ return value;
291
+ }
292
+ function identifier(value, limit = 512) {
293
+ if (typeof value !== "string" || value.length === 0 || value.length > limit || /[\u0000-\u001f\u007f]/u.test(value))
294
+ invalid("Invalid Codex app-server identifier");
295
+ return value;
296
+ }
297
+ function invalid(message) {
298
+ throw new CodexAppServerReadError("invalid_response", message);
299
+ }
300
+ //# sourceMappingURL=codex-app-server-read-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server-read-client.js","sourceRoot":"","sources":["../../src/codex-app-server-read-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Internal transport; public read and interaction clients each restrict its methods. */
2
+ export interface CodexAppServerReadTransport {
3
+ send(message: string): void;
4
+ onMessage(listener: (message: string) => void): () => void;
5
+ onDisconnect(listener: (error: Error) => void): () => void;
6
+ close(): void;
7
+ }
8
+ export declare function connectCodexUnixWebSocket(options: {
9
+ socketPath: string;
10
+ timeoutMs: number;
11
+ }): Promise<CodexAppServerReadTransport>;
@@ -0,0 +1,47 @@
1
+ import fs from "node:fs";
2
+ import net from "node:net";
3
+ const MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
4
+ export async function connectCodexUnixWebSocket(options) {
5
+ const stat = fs.statSync(options.socketPath);
6
+ if (!stat.isSocket() || (stat.mode & 0o077) !== 0 || (process.getuid && stat.uid !== process.getuid())) {
7
+ throw new Error("Codex app-server control socket is not private to the current user");
8
+ }
9
+ const WebSocketClient = (await import("ws")).default;
10
+ return new Promise((resolve, reject) => {
11
+ const socket = new WebSocketClient("ws://localhost/", {
12
+ createConnection: () => net.createConnection({ path: options.socketPath }),
13
+ handshakeTimeout: options.timeoutMs,
14
+ maxPayload: MAX_MESSAGE_BYTES,
15
+ perMessageDeflate: false,
16
+ followRedirects: false
17
+ });
18
+ const failed = (error) => { socket.terminate(); reject(error); };
19
+ socket.once("error", failed);
20
+ socket.once("open", () => {
21
+ socket.removeListener("error", failed);
22
+ socket.on("error", () => { });
23
+ resolve({
24
+ send: (message) => socket.send(message),
25
+ close: () => socket.terminate(),
26
+ onMessage: (listener) => {
27
+ const receive = (data, binary) => {
28
+ if (binary) {
29
+ socket.terminate();
30
+ return;
31
+ }
32
+ listener(data.toString());
33
+ };
34
+ socket.on("message", receive);
35
+ return () => socket.removeListener("message", receive);
36
+ },
37
+ onDisconnect: (listener) => {
38
+ const closed = () => listener(new Error("Codex app-server disconnected"));
39
+ socket.on("error", listener);
40
+ socket.on("close", closed);
41
+ return () => { socket.removeListener("error", listener); socket.removeListener("close", closed); };
42
+ }
43
+ });
44
+ });
45
+ });
46
+ }
47
+ //# sourceMappingURL=codex-app-server-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server-transport.js","sourceRoot":"","sources":["../../src/codex-app-server-transport.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,8 @@ export interface CodexAsyncQuestionMatch {
52
52
  readonly source_question_index: number;
53
53
  readonly question: CodexAsyncQuestionSemanticQuestion;
54
54
  readonly selected_option_id?: string;
55
+ /** Exact paginated-history AnsweredQuestion tuple, never a public identifier. */
56
+ readonly native_question_id?: string;
55
57
  }
56
58
  export interface CodexAsyncQuestionPromptEvidence {
57
59
  readonly profile: string;
@@ -83,6 +85,9 @@ export type CodexAsyncQuestionOwnerPrivateActionPlan = {
83
85
  readonly max_characters: number;
84
86
  };
85
87
  readonly delivery: Readonly<Record<CodexAsyncQuestionDeliveryMode, "submit" | "queue">>;
88
+ /** Only a fully visible, profiled empty editor may authorize this navigation. */
89
+ readonly prompt_stack_back?: "shift_right" | "alt_down";
90
+ readonly prompt_stack_forward?: "shift_left" | "alt_up";
86
91
  readonly expected_region_sha256: string;
87
92
  };
88
93
  export type CodexAsyncQuestionInspection = {
@@ -1,4 +1,6 @@
1
+ import { isCodexPaginatedVersion } from "./codex-lifecycle-compatibility.js";
1
2
  import { createHash } from "node:crypto";
3
+ import { captureCodexFullscreenComposerFrame } from "./codex-fullscreen-composer-proof.js";
2
4
  /**
3
5
  * This adapter is deliberately version-bound. Later Codex releases gained
4
6
  * different durable answer identities; callers must not silently reuse this
@@ -6,7 +8,9 @@ import { createHash } from "node:crypto";
6
8
  */
7
9
  export const CODEX_ASYNC_QUESTION_PROFILES = Object.freeze({
8
10
  "0.154.0": "codex/0.154.0/request-user-input-async-v1",
9
- "0.155.1": "codex/0.155.1/request-user-input-async-v1"
11
+ "0.155.1": "codex/0.155.1/request-user-input-async-v1",
12
+ "0.158.0": "codex/0.158.0/request-user-input-async-v2",
13
+ "0.159.0": "codex/0.159.0/request-user-input-async-v2"
10
14
  });
11
15
  export const CODEX_ASYNC_QUESTION_LIMITS = Object.freeze({
12
16
  maxRecords: 4_096,
@@ -19,7 +23,7 @@ export const CODEX_ASYNC_QUESTION_LIMITS = Object.freeze({
19
23
  maxScreenCharacters: 128 * 1024,
20
24
  maxScreenLines: 160
21
25
  });
22
- const ANSI_SEQUENCE_PATTERN = /[\u001B\u009B](?:(?:\[[0-?]*[ -/]*[@-~])|(?:\][^\u0007]*(?:\u0007|\u001B\\))|.)/gu;
26
+ const ANSI_SEQUENCE_PATTERN = /[\u001B\u009B](?:(?:\[[0-?]*[ -/]*[@-~])|(?:\][^\u0007\u001B]*(?:\u0007|\u001B\\))|.)/gu;
23
27
  const UNSAFE_CONTROL_PATTERN = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/u;
24
28
  const IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/u;
25
29
  export function codexAsyncQuestionProfile(version) {
@@ -85,7 +89,7 @@ export function inspectCodexAsyncQuestion(input) {
85
89
  if (!normalizedEvidence) {
86
90
  return { state: "ambiguous", reason: "invalid_durable_evidence", profile };
87
91
  }
88
- const collapsed = parseCollapsed(captured.lines);
92
+ const collapsed = parseCollapsed(captured.lines, profile);
89
93
  const expandedMarker = hasExpandedMarker(captured.lines);
90
94
  if (collapsed.status === "exact" && !expandedMarker) {
91
95
  return inspectCollapsedQuestion(collapsed, normalizedEvidence, profile);
@@ -157,6 +161,10 @@ export function codexAsyncQuestionMainComposerVisible(input) {
157
161
  return false;
158
162
  }
159
163
  const footer = captured.lines.at(-1)?.trim() ?? "";
164
+ if (isCodexPaginatedVersion(input.version)) {
165
+ return captureCodexFullscreenComposerFrame(input.screen, input.version)
166
+ ?.hasShortcutFooter === true;
167
+ }
160
168
  return /^(?:gpt-[\w.-]+(?:\s+\S+)?|[-\w.]+ default)\s+·\s+\S.*$/u
161
169
  .test(footer) && captured.lines.slice(0, -1).some((line) => /^[›»](?:\s|$)/u.test(line));
162
170
  }
@@ -241,6 +249,12 @@ function inspectExpandedQuestion(expanded, profile) {
241
249
  steer_current_turn: "submit",
242
250
  queue_next_turn: "queue"
243
251
  },
252
+ ...(expanded.promptStackBack === undefined
253
+ ? {}
254
+ : { prompt_stack_back: expanded.promptStackBack }),
255
+ ...(expanded.promptStackForward === undefined
256
+ ? {}
257
+ : { prompt_stack_forward: expanded.promptStackForward }),
244
258
  expected_region_sha256: exactDigest
245
259
  }
246
260
  };
@@ -277,7 +291,12 @@ function normalizeEvidenceEntry(value, profile) {
277
291
  const normalized = normalizeQuestion(question, sourceId, index);
278
292
  if (!normalized)
279
293
  return undefined;
280
- questions.push(normalized);
294
+ questions.push({
295
+ ...normalized,
296
+ ...(isFullscreenProfile(profile)
297
+ ? { nativeQuestionId: JSON.stringify(["request_user_input_async", itemId, index]) }
298
+ : {})
299
+ });
281
300
  }
282
301
  return {
283
302
  itemId,
@@ -372,7 +391,10 @@ function collapsedMatch(evidence, pendingCount, profile) {
372
391
  return {
373
392
  source_id: current.entry.sourceId,
374
393
  source_question_index: current.question.sourceIndex,
375
- question: current.question.semantic
394
+ question: current.question.semantic,
395
+ ...(current.question.nativeQuestionId === undefined
396
+ ? {}
397
+ : { native_question_id: current.question.nativeQuestionId })
376
398
  };
377
399
  }
378
400
  function captureLines(screen) {
@@ -392,7 +414,7 @@ function captureLines(screen) {
392
414
  lines.pop();
393
415
  return { status: "ok", lines };
394
416
  }
395
- function parseCollapsed(lines) {
417
+ function parseCollapsed(lines, profile) {
396
418
  let header = -1;
397
419
  for (let index = lines.length - 1; index >= 0; index -= 1) {
398
420
  if (lines[index] === "• Queued follow-up inputs") {
@@ -427,12 +449,7 @@ function parseCollapsed(lines) {
427
449
  let hint = summary + 1;
428
450
  while (hint < lines.length && lines[hint].trim().length === 0)
429
451
  hint += 1;
430
- const hintLine = lines[hint] ?? "";
431
- const binding = hintLine === " shift + ← to answer"
432
- ? "shift_left"
433
- : hintLine === " ⌥ + ↑ to answer"
434
- ? "alt_up"
435
- : undefined;
452
+ const binding = collapsedOpenBinding(lines[hint] ?? "", profile);
436
453
  if (!binding)
437
454
  return { status: "partial" };
438
455
  return {
@@ -445,6 +462,14 @@ function parseCollapsed(lines) {
445
462
  exactLines: lines.slice(header, hint + 1)
446
463
  };
447
464
  }
465
+ function collapsedOpenBinding(line, profile) {
466
+ const compact = isFullscreenProfile(profile);
467
+ if (line === (compact ? " shift+← to answer" : " shift + ← to answer")) {
468
+ return "shift_left";
469
+ }
470
+ return line === (compact ? " ⌥+↑ to answer" : " ⌥ + ↑ to answer")
471
+ ? "alt_up" : undefined;
472
+ }
448
473
  function hasExpandedMarker(lines) {
449
474
  return lines.some((line) => /^ {2}enter submit\b/u.test(line) ||
450
475
  /^ {2}\d+ of(?: \d+)?/u.test(line) ||
@@ -472,8 +497,9 @@ function parseExpanded(lines, evidence, profile) {
472
497
  lines.slice(Math.max(0, footerStart - 5), footerStart).some((line) => normalizeText(line) === "Expand terminal to read the entire option")) {
473
498
  return { status: "ambiguous", reason: "clipped_question" };
474
499
  }
475
- if (!/^enter submit ctrl \+ \] skip ⌥ \+ ↓ (?:main prompt|prev question)(?: (?:⌥ \+ ↑|shift \+ ←) (?:next question|queued messages))?$/u
476
- .test(footer)) {
500
+ const compactFooter = /^enter submit ctrl\+\] skip (shift\+→|⌥\+↓) (main prompt|prev question)(?: (⌥\+↑|shift\+←) (next question|queued messages))?$/u.exec(footer);
501
+ if (isFullscreenProfile(profile) ? !compactFooter :
502
+ !/^enter submit ctrl \+ \] skip ⌥ \+ ↓ (?:main prompt|prev question)(?: (?:⌥ \+ ↑|shift \+ ←) (?:next question|queued messages))?$/u.test(footer)) {
477
503
  return { status: "ambiguous", reason: "unsupported_keymap" };
478
504
  }
479
505
  if (evidence.length === 0) {
@@ -508,13 +534,24 @@ function parseExpanded(lines, evidence, profile) {
508
534
  return { status: "ambiguous", reason: "question_match_ambiguous" };
509
535
  }
510
536
  const exact = unique[0];
511
- void profile;
537
+ if (compactFooter &&
538
+ (exact.currentStep === 1) !== (compactFooter[2] === "main prompt")) {
539
+ return { status: "ambiguous", reason: "partial_or_unknown_surface" };
540
+ }
512
541
  return {
513
542
  status: "exact",
514
543
  currentStep: exact.currentStep,
515
544
  totalSteps: exact.totalSteps,
516
545
  match: exact.match,
517
- exactLines: lines.slice(exact.start, lines.length)
546
+ exactLines: lines.slice(exact.start, lines.length),
547
+ ...(isFullscreenProfile(profile) && compactFooter
548
+ ? { promptStackBack: compactFooter[1] === "shift+→"
549
+ ? "shift_right" : "alt_down" }
550
+ : {}),
551
+ ...(isFullscreenProfile(profile) && compactFooter?.[4] === "next question"
552
+ ? { promptStackForward: compactFooter[3] === "shift+←"
553
+ ? "shift_left" : "alt_up" }
554
+ : {})
518
555
  };
519
556
  }
520
557
  function parseQuestionBody(lines, bodyStart, question, source, questionStart, footerStart, maximumPending) {
@@ -537,7 +574,10 @@ function parseAnswerRegion(lines, question, source) {
537
574
  const match = {
538
575
  source_id: source.sourceId,
539
576
  source_question_index: question.sourceIndex,
540
- question: question.semantic
577
+ question: question.semantic,
578
+ ...(question.nativeQuestionId === undefined
579
+ ? {}
580
+ : { native_question_id: question.nativeQuestionId })
541
581
  };
542
582
  if (question.modelOptions.length === 0) {
543
583
  return normalizeText(lines[0] ?? "") === "Type your answer" &&
@@ -753,4 +793,8 @@ function stableJson(value) {
753
793
  function isRecord(value) {
754
794
  return typeof value === "object" && value !== null && !Array.isArray(value);
755
795
  }
796
+ function isFullscreenProfile(profile) {
797
+ return profile === CODEX_ASYNC_QUESTION_PROFILES["0.158.0"] ||
798
+ profile === CODEX_ASYNC_QUESTION_PROFILES["0.159.0"];
799
+ }
756
800
  //# sourceMappingURL=codex-async-question-adapter.js.map