@scotthuang/agent-knock-knock 0.13.18 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/CONTRIBUTING.md +212 -0
- package/README.md +105 -166
- package/connectors/deepseek-harness/LICENSE +21 -0
- package/connectors/deepseek-harness/README.md +406 -0
- package/connectors/pi/LICENSE +21 -0
- package/connectors/pi/README.md +446 -0
- package/dist/src/backend-recovery-semantic.d.ts +16 -0
- package/dist/src/backend-recovery-semantic.js +113 -0
- package/dist/src/backend-recovery-semantic.js.map +1 -0
- package/dist/src/backend-task-recovery.d.ts +103 -0
- package/dist/src/backend-task-recovery.js +142 -0
- package/dist/src/backend-task-recovery.js.map +1 -0
- package/dist/src/callback-transport.d.ts +8 -0
- package/dist/src/callback-transport.js +14 -0
- package/dist/src/callback-transport.js.map +1 -1
- package/dist/src/cli-core.js +18 -8
- package/dist/src/cli-core.js.map +1 -1
- package/dist/src/cli-runtime-context.d.ts +5 -0
- package/dist/src/cli-runtime-context.js.map +1 -1
- package/dist/src/codex-native-cli-adapter.d.ts +6 -0
- package/dist/src/codex-native-cli-adapter.js +273 -0
- package/dist/src/codex-native-cli-adapter.js.map +1 -0
- package/dist/src/codex-native-client-interactions.d.ts +6 -0
- package/dist/src/codex-native-client-interactions.js +124 -0
- package/dist/src/codex-native-client-interactions.js.map +1 -0
- package/dist/src/codex-native-client-rpc.d.ts +21 -0
- package/dist/src/codex-native-client-rpc.js +137 -0
- package/dist/src/codex-native-client-rpc.js.map +1 -0
- package/dist/src/codex-native-client.d.ts +42 -0
- package/dist/src/codex-native-client.js +326 -0
- package/dist/src/codex-native-client.js.map +1 -0
- package/dist/src/codex-native-identity.d.ts +6 -0
- package/dist/src/codex-native-identity.js +42 -0
- package/dist/src/codex-native-identity.js.map +1 -0
- package/dist/src/codex-native-monitor.d.ts +4 -0
- package/dist/src/codex-native-monitor.js +92 -0
- package/dist/src/codex-native-monitor.js.map +1 -0
- package/dist/src/codex-native-outbox.d.ts +16 -0
- package/dist/src/codex-native-outbox.js +120 -0
- package/dist/src/codex-native-outbox.js.map +1 -0
- package/dist/src/codex-native-public-projection.d.ts +545 -0
- package/dist/src/codex-native-public-projection.js +182 -0
- package/dist/src/codex-native-public-projection.js.map +1 -0
- package/dist/src/codex-native-record-store.d.ts +27 -0
- package/dist/src/codex-native-record-store.js +111 -0
- package/dist/src/codex-native-record-store.js.map +1 -0
- package/dist/src/codex-native-response-service.d.ts +69 -0
- package/dist/src/codex-native-response-service.js +244 -0
- package/dist/src/codex-native-response-service.js.map +1 -0
- package/dist/src/codex-native-runtime.d.ts +46 -0
- package/dist/src/codex-native-runtime.js +112 -0
- package/dist/src/codex-native-runtime.js.map +1 -0
- package/dist/src/codex-native-semantic.d.ts +17 -0
- package/dist/src/codex-native-semantic.js +175 -0
- package/dist/src/codex-native-semantic.js.map +1 -0
- package/dist/src/codex-native-snapshot.d.ts +19 -0
- package/dist/src/codex-native-snapshot.js +160 -0
- package/dist/src/codex-native-snapshot.js.map +1 -0
- package/dist/src/codex-native-state-store.d.ts +61 -0
- package/dist/src/codex-native-state-store.js +132 -0
- package/dist/src/codex-native-state-store.js.map +1 -0
- package/dist/src/codex-native-task-service.d.ts +71 -0
- package/dist/src/codex-native-task-service.js +502 -0
- package/dist/src/codex-native-task-service.js.map +1 -0
- package/dist/src/codex-native-types.d.ts +92 -0
- package/dist/src/codex-native-types.js +15 -0
- package/dist/src/codex-native-types.js.map +1 -0
- package/dist/src/conversation-list.d.ts +12 -0
- package/dist/src/conversation-list.js +30 -0
- package/dist/src/conversation-list.js.map +1 -0
- package/dist/src/conversation-route-dispatch.d.ts +13 -0
- package/dist/src/conversation-route-dispatch.js +66 -0
- package/dist/src/conversation-route-dispatch.js.map +1 -0
- package/dist/src/conversation-route-legacy.d.ts +18 -0
- package/dist/src/conversation-route-legacy.js +54 -0
- package/dist/src/conversation-route-legacy.js.map +1 -0
- package/dist/src/conversation-route-store.d.ts +51 -0
- package/dist/src/conversation-route-store.js +126 -0
- package/dist/src/conversation-route-store.js.map +1 -0
- package/dist/src/conversation-routing-cli-adapter.d.ts +12 -0
- package/dist/src/conversation-routing-cli-adapter.js +211 -0
- package/dist/src/conversation-routing-cli-adapter.js.map +1 -0
- package/dist/src/conversation-routing-commands.d.ts +11 -0
- package/dist/src/conversation-routing-commands.js +85 -0
- package/dist/src/conversation-routing-commands.js.map +1 -0
- package/dist/src/conversation-routing-home.d.ts +26 -0
- package/dist/src/conversation-routing-home.js +105 -0
- package/dist/src/conversation-routing-home.js.map +1 -0
- package/dist/src/conversation-routing-identity.d.ts +40 -0
- package/dist/src/conversation-routing-identity.js +174 -0
- package/dist/src/conversation-routing-identity.js.map +1 -0
- package/dist/src/conversation-runtime-route-store.d.ts +11 -0
- package/dist/src/conversation-runtime-route-store.js +118 -0
- package/dist/src/conversation-runtime-route-store.js.map +1 -0
- package/dist/src/desktop-async-interactions.d.ts +15 -0
- package/dist/src/desktop-async-interactions.js +88 -0
- package/dist/src/desktop-async-interactions.js.map +1 -0
- package/dist/src/desktop-async-state.d.ts +5 -0
- package/dist/src/desktop-async-state.js +53 -0
- package/dist/src/desktop-async-state.js.map +1 -0
- package/dist/src/desktop-cli-adapter.d.ts +7 -0
- package/dist/src/desktop-cli-adapter.js +322 -0
- package/dist/src/desktop-cli-adapter.js.map +1 -0
- package/dist/src/desktop-cli-controls.d.ts +9 -0
- package/dist/src/desktop-cli-controls.js +45 -0
- package/dist/src/desktop-cli-controls.js.map +1 -0
- package/dist/src/desktop-command-presentation.d.ts +2 -0
- package/dist/src/desktop-command-presentation.js +31 -0
- package/dist/src/desktop-command-presentation.js.map +1 -0
- package/dist/src/desktop-control-semantic.d.ts +8 -0
- package/dist/src/desktop-control-semantic.js +68 -0
- package/dist/src/desktop-control-semantic.js.map +1 -0
- package/dist/src/desktop-identity.d.ts +5 -0
- package/dist/src/desktop-identity.js +40 -0
- package/dist/src/desktop-identity.js.map +1 -0
- package/dist/src/desktop-interaction-projection.d.ts +57 -0
- package/dist/src/desktop-interaction-projection.js +196 -0
- package/dist/src/desktop-interaction-projection.js.map +1 -0
- package/dist/src/desktop-interaction-state.d.ts +3 -0
- package/dist/src/desktop-interaction-state.js +48 -0
- package/dist/src/desktop-interaction-state.js.map +1 -0
- package/dist/src/desktop-ipc-async-answer.d.ts +9 -0
- package/dist/src/desktop-ipc-async-answer.js +71 -0
- package/dist/src/desktop-ipc-async-answer.js.map +1 -0
- package/dist/src/desktop-ipc-client.d.ts +47 -0
- package/dist/src/desktop-ipc-client.js +400 -0
- package/dist/src/desktop-ipc-client.js.map +1 -0
- package/dist/src/desktop-ipc-native-operations.d.ts +11 -0
- package/dist/src/desktop-ipc-native-operations.js +126 -0
- package/dist/src/desktop-ipc-native-operations.js.map +1 -0
- package/dist/src/desktop-ipc-transport.d.ts +13 -0
- package/dist/src/desktop-ipc-transport.js +123 -0
- package/dist/src/desktop-ipc-transport.js.map +1 -0
- package/dist/src/desktop-list.d.ts +25 -0
- package/dist/src/desktop-list.js +55 -0
- package/dist/src/desktop-list.js.map +1 -0
- package/dist/src/desktop-metadata-reader.d.ts +30 -0
- package/dist/src/desktop-metadata-reader.js +182 -0
- package/dist/src/desktop-metadata-reader.js.map +1 -0
- package/dist/src/desktop-monitor.d.ts +4 -0
- package/dist/src/desktop-monitor.js +101 -0
- package/dist/src/desktop-monitor.js.map +1 -0
- package/dist/src/desktop-public-projection.d.ts +6 -0
- package/dist/src/desktop-public-projection.js +134 -0
- package/dist/src/desktop-public-projection.js.map +1 -0
- package/dist/src/desktop-request-interactions.d.ts +14 -0
- package/dist/src/desktop-request-interactions.js +144 -0
- package/dist/src/desktop-request-interactions.js.map +1 -0
- package/dist/src/desktop-response-dispatch.d.ts +14 -0
- package/dist/src/desktop-response-dispatch.js +19 -0
- package/dist/src/desktop-response-dispatch.js.map +1 -0
- package/dist/src/desktop-response-evidence.d.ts +4 -0
- package/dist/src/desktop-response-evidence.js +19 -0
- package/dist/src/desktop-response-evidence.js.map +1 -0
- package/dist/src/desktop-response-service.d.ts +11 -0
- package/dist/src/desktop-response-service.js +188 -0
- package/dist/src/desktop-response-service.js.map +1 -0
- package/dist/src/desktop-response-store.d.ts +35 -0
- package/dist/src/desktop-response-store.js +58 -0
- package/dist/src/desktop-response-store.js.map +1 -0
- package/dist/src/desktop-response-types.d.ts +20 -0
- package/dist/src/desktop-response-types.js +2 -0
- package/dist/src/desktop-response-types.js.map +1 -0
- package/dist/src/desktop-response-value.d.ts +6 -0
- package/dist/src/desktop-response-value.js +31 -0
- package/dist/src/desktop-response-value.js.map +1 -0
- package/dist/src/desktop-runtime.d.ts +153 -0
- package/dist/src/desktop-runtime.js +88 -0
- package/dist/src/desktop-runtime.js.map +1 -0
- package/dist/src/desktop-semantic.d.ts +21 -0
- package/dist/src/desktop-semantic.js +140 -0
- package/dist/src/desktop-semantic.js.map +1 -0
- package/dist/src/desktop-session-catalog.d.ts +68 -0
- package/dist/src/desktop-session-catalog.js +225 -0
- package/dist/src/desktop-session-catalog.js.map +1 -0
- package/dist/src/desktop-session-controls.d.ts +145 -0
- package/dist/src/desktop-session-controls.js +176 -0
- package/dist/src/desktop-session-controls.js.map +1 -0
- package/dist/src/desktop-sidebar-metadata.d.ts +27 -0
- package/dist/src/desktop-sidebar-metadata.js +83 -0
- package/dist/src/desktop-sidebar-metadata.js.map +1 -0
- package/dist/src/desktop-sidebar-projects.d.ts +10 -0
- package/dist/src/desktop-sidebar-projects.js +31 -0
- package/dist/src/desktop-sidebar-projects.js.map +1 -0
- package/dist/src/desktop-sidebar-selection.d.ts +28 -0
- package/dist/src/desktop-sidebar-selection.js +85 -0
- package/dist/src/desktop-sidebar-selection.js.map +1 -0
- package/dist/src/desktop-snapshot-details.d.ts +4 -0
- package/dist/src/desktop-snapshot-details.js +116 -0
- package/dist/src/desktop-snapshot-details.js.map +1 -0
- package/dist/src/desktop-snapshot.d.ts +11 -0
- package/dist/src/desktop-snapshot.js +276 -0
- package/dist/src/desktop-snapshot.js.map +1 -0
- package/dist/src/desktop-state-store.d.ts +72 -0
- package/dist/src/desktop-state-store.js +269 -0
- package/dist/src/desktop-state-store.js.map +1 -0
- package/dist/src/desktop-task-interactions.d.ts +10 -0
- package/dist/src/desktop-task-interactions.js +93 -0
- package/dist/src/desktop-task-interactions.js.map +1 -0
- package/dist/src/desktop-task-recovery.d.ts +38 -0
- package/dist/src/desktop-task-recovery.js +171 -0
- package/dist/src/desktop-task-recovery.js.map +1 -0
- package/dist/src/desktop-task-service.d.ts +54 -0
- package/dist/src/desktop-task-service.js +441 -0
- package/dist/src/desktop-task-service.js.map +1 -0
- package/dist/src/desktop-types.d.ts +281 -0
- package/dist/src/desktop-types.js +13 -0
- package/dist/src/desktop-types.js.map +1 -0
- package/dist/src/host-monitor-reconciliation.js +36 -4
- package/dist/src/host-monitor-reconciliation.js.map +1 -1
- package/dist/src/host-profile-runtime.js +7 -3
- package/dist/src/host-profile-runtime.js.map +1 -1
- package/dist/src/local-codex-cli-adapter.d.ts +7 -0
- package/dist/src/local-codex-cli-adapter.js +13 -0
- package/dist/src/local-codex-cli-adapter.js.map +1 -0
- package/dist/src/openclaw-callback-transport.js +2 -1
- package/dist/src/openclaw-callback-transport.js.map +1 -1
- package/dist/src/semantic-conversation-target.d.ts +4 -0
- package/dist/src/semantic-conversation-target.js +20 -0
- package/dist/src/semantic-conversation-target.js.map +1 -0
- package/dist/src/semantic-permission-control.js +47 -9
- package/dist/src/semantic-permission-control.js.map +1 -1
- package/dist/src/semantic-private-authority-offers.d.ts +1 -1
- package/dist/src/semantic-private-authority-offers.js +3 -1
- package/dist/src/semantic-private-authority-offers.js.map +1 -1
- package/dist/src/semantic-tool-command-helpers.d.ts +6 -0
- package/dist/src/semantic-tool-command-helpers.js +199 -78
- package/dist/src/semantic-tool-command-helpers.js.map +1 -1
- package/dist/src/semantic-tool-descriptions.d.ts +2 -1
- package/dist/src/semantic-tool-descriptions.js +81 -35
- package/dist/src/semantic-tool-descriptions.js.map +1 -1
- package/dist/src/semantic-tool-list-projection.js +66 -2
- package/dist/src/semantic-tool-list-projection.js.map +1 -1
- package/dist/src/semantic-tool-presentation.js +76 -7
- package/dist/src/semantic-tool-presentation.js.map +1 -1
- package/dist/src/semantic-tool-runtime.js +129 -29
- package/dist/src/semantic-tool-runtime.js.map +1 -1
- package/dist/src/semantic-tool-schemas.d.ts +410 -27
- package/dist/src/semantic-tool-schemas.js +176 -88
- package/dist/src/semantic-tool-schemas.js.map +1 -1
- package/dist/src/terminal-action-contracts.js +10 -6
- package/dist/src/terminal-action-contracts.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
- package/dist/src/terminal-list-cli-adapter.js +6 -3
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
- package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
- package/dist/src/terminal-user-send-intent.d.ts +2 -0
- package/dist/src/terminal-user-send-intent.js +11 -3
- package/dist/src/terminal-user-send-intent.js.map +1 -1
- package/docs/architecture/current-architecture.md +313 -0
- package/docs/architecture/interactive-terminal-response.md +276 -0
- package/docs/architecture/issue-126-final-report.md +248 -0
- package/docs/architecture/orchestration-refactor-history.md +2987 -0
- package/docs/architecture/orchestration-refactor.md +21 -0
- package/docs/backend-task-recovery.md +89 -0
- package/docs/bidirectional-agent-protocol.md +260 -0
- package/docs/codex-cli-native-compatibility.md +246 -0
- package/docs/codex-desktop-compatibility.md +414 -0
- package/docs/openclaw-operations.md +281 -0
- package/docs/openclaw-session-turn-delivery-requirement.md +45 -0
- package/docs/operator-guide.md +543 -0
- package/docs/storage-and-logging.md +91 -0
- package/docs/test-performance-issue-108.md +80 -0
- package/docs/test-performance-issue-120.md +226 -0
- package/docs/testing.md +628 -0
- package/openclaw.plugin.json +7 -3
- package/package.json +6 -13
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +66 -15
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { connectCodexUnixWebSocket } from "./codex-app-server-transport.js";
|
|
3
|
+
import { parseCodexAppServerMetadata } from "./codex-app-server-read-client.js";
|
|
4
|
+
import { CodexNativeError } from "./codex-native-types.js";
|
|
5
|
+
import { nativeRecord, nativeInvalid } from "./codex-native-snapshot.js";
|
|
6
|
+
/** Internal RPC transport, deliberately not exported through the public adapter. */
|
|
7
|
+
export class CodexNativeRpc {
|
|
8
|
+
transport;
|
|
9
|
+
timeoutMs;
|
|
10
|
+
metadata;
|
|
11
|
+
sequence = 0;
|
|
12
|
+
closed = false;
|
|
13
|
+
pending = new Map();
|
|
14
|
+
listeners = new Set();
|
|
15
|
+
unlisten;
|
|
16
|
+
constructor(transport, timeoutMs, socketPath) {
|
|
17
|
+
this.transport = transport;
|
|
18
|
+
this.timeoutMs = timeoutMs;
|
|
19
|
+
this.metadata = { socketPath, codexHome: "", serverVersion: "", platformFamily: "", platformOs: "" };
|
|
20
|
+
this.unlisten = [transport.onMessage(message => this.receive(message)),
|
|
21
|
+
transport.onDisconnect(() => this.finish(new CodexNativeError("closed", "Codex native connection closed")))];
|
|
22
|
+
}
|
|
23
|
+
static async connect(options) {
|
|
24
|
+
if (!path.isAbsolute(options.codexHome))
|
|
25
|
+
throw new CodexNativeError("invalid_argument", "Codex home must be absolute");
|
|
26
|
+
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
27
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 30_000)
|
|
28
|
+
throw new CodexNativeError("invalid_argument", "Invalid native timeout");
|
|
29
|
+
const socketPath = path.join(options.codexHome, "app-server-control", "app-server-control.sock");
|
|
30
|
+
const transport = await (options.transportFactory ?? connectCodexUnixWebSocket)({ socketPath, timeoutMs });
|
|
31
|
+
const rpc = new CodexNativeRpc(transport, timeoutMs, socketPath);
|
|
32
|
+
try {
|
|
33
|
+
const result = await rpc.call("initialize", { clientInfo: { name: "agent-knock-knock-native", title: "AKK native CLI", version: "1" },
|
|
34
|
+
capabilities: { experimentalApi: true } });
|
|
35
|
+
Object.assign(rpc.metadata, parseCodexAppServerMetadata(result, { codexHome: options.codexHome, expectedServerVersion: "", compatibility: "read_contract" }, socketPath));
|
|
36
|
+
transport.send(JSON.stringify({ method: "initialized" }));
|
|
37
|
+
return rpc;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
rpc.close();
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
onEvent(listener) {
|
|
45
|
+
this.listeners.add(listener);
|
|
46
|
+
return () => this.listeners.delete(listener);
|
|
47
|
+
}
|
|
48
|
+
call(method, params, mutation = false) {
|
|
49
|
+
if (this.closed)
|
|
50
|
+
return Promise.reject(new CodexNativeError("closed", "Codex native connection closed"));
|
|
51
|
+
if (this.pending.size >= 100)
|
|
52
|
+
return Promise.reject(new CodexNativeError("invalid_argument", "Too many native requests"));
|
|
53
|
+
const id = `akk-native-${++this.sequence}`;
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const timer = setTimeout(() => {
|
|
56
|
+
this.pending.delete(id);
|
|
57
|
+
reject(new CodexNativeError("timeout", `Codex native ${method} timed out`, mutation ? "unknown" : "not_sent"));
|
|
58
|
+
}, this.timeoutMs);
|
|
59
|
+
this.pending.set(id, { resolve, reject, timer, mutation, method, params });
|
|
60
|
+
try {
|
|
61
|
+
this.transport.send(JSON.stringify({ id, method, params }));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
this.pending.delete(id);
|
|
66
|
+
reject(new CodexNativeError("closed", "Codex native send failed", mutation ? "unknown" : "not_sent"));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
respond(id, result) {
|
|
71
|
+
if (this.closed)
|
|
72
|
+
throw new CodexNativeError("closed", "Codex native connection closed");
|
|
73
|
+
try {
|
|
74
|
+
this.transport.send(JSON.stringify({ id, result }));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
throw new CodexNativeError("closed", "Codex native response delivery uncertain", "unknown");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
close() { this.finish(new CodexNativeError("closed", "Codex native connection closed")); this.transport.close(); }
|
|
81
|
+
receive(message) {
|
|
82
|
+
try {
|
|
83
|
+
if (Buffer.byteLength(message) > 8 * 1024 * 1024)
|
|
84
|
+
nativeInvalid("Native message exceeds bound");
|
|
85
|
+
const raw = nativeRecord(JSON.parse(message));
|
|
86
|
+
if (typeof raw.method === "string") {
|
|
87
|
+
for (const listener of this.listeners)
|
|
88
|
+
listener(raw);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.receiveResponse(raw);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
this.finish(new CodexNativeError("invalid_response", "Malformed Codex native protocol message"));
|
|
95
|
+
this.transport.close();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
receiveResponse(raw) {
|
|
99
|
+
if (typeof raw.id !== "string")
|
|
100
|
+
return;
|
|
101
|
+
const pending = this.pending.get(raw.id);
|
|
102
|
+
if (!pending)
|
|
103
|
+
return;
|
|
104
|
+
// Validate before removing the pending request, so malformed errors also reject it on disconnect.
|
|
105
|
+
const responseError = raw.error !== undefined ? nativeRecord(raw.error) : undefined;
|
|
106
|
+
this.pending.delete(raw.id);
|
|
107
|
+
clearTimeout(pending.timer);
|
|
108
|
+
if (responseError)
|
|
109
|
+
pending.reject(nativeRpcError(responseError, pending));
|
|
110
|
+
else if (Object.hasOwn(raw, "result"))
|
|
111
|
+
pending.resolve(raw.result);
|
|
112
|
+
else
|
|
113
|
+
pending.reject(new CodexNativeError("invalid_response", "Native response omitted result", pending.mutation ? "unknown" : "not_sent"));
|
|
114
|
+
}
|
|
115
|
+
finish(error) {
|
|
116
|
+
if (this.closed)
|
|
117
|
+
return;
|
|
118
|
+
this.closed = true;
|
|
119
|
+
for (const p of this.pending.values()) {
|
|
120
|
+
clearTimeout(p.timer);
|
|
121
|
+
p.reject(new CodexNativeError(error.code, error.message, p.mutation ? "unknown" : "not_sent"));
|
|
122
|
+
}
|
|
123
|
+
this.pending.clear();
|
|
124
|
+
this.listeners.clear();
|
|
125
|
+
this.unlisten.forEach(stop => stop());
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function nativeRpcError(error, pending) {
|
|
129
|
+
const code = typeof error.code === "number" ? error.code : undefined;
|
|
130
|
+
const unsupported = code === -32601;
|
|
131
|
+
const threadId = pending.params && typeof pending.params === "object" ? pending.params.threadId : undefined;
|
|
132
|
+
const unmaterialized = pending.method === "thread/turns/list" && code === -32600 && typeof threadId === "string"
|
|
133
|
+
&& error.message === `thread ${threadId} is not materialized yet; thread/turns/list is unavailable before first user message`;
|
|
134
|
+
// Raw RPC error messages can contain prompts and private paths. Keep them local to the server.
|
|
135
|
+
return new CodexNativeError(unmaterialized ? "unmaterialized_thread" : unsupported ? "unsupported_capability" : "rpc_error", unsupported ? "Codex backend does not expose this native capability" : "Codex backend rejected the native request", pending.mutation && code !== -32601 && code !== -32602 ? "unknown" : "not_sent", code);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=codex-native-client-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-native-client-rpc.js","sourceRoot":"","sources":["../../src/codex-native-client-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type CodexNativeClientOptions, type CodexNativeSnapshot, type CodexNativeThread, type CodexNativeMetadata, type NativeInteraction, type NativeInteractionResponse, type CodexNativeReceipt, type CodexNativePermissionPreset, type CodexNativePermissions } from "./codex-native-types.js";
|
|
2
|
+
/** Native shared-daemon connection. No terminal ownership inference and no historical thread loading. */
|
|
3
|
+
export declare class CodexNativeClient {
|
|
4
|
+
private readonly rpc;
|
|
5
|
+
readonly metadata: CodexNativeMetadata;
|
|
6
|
+
private subscribed;
|
|
7
|
+
private requests;
|
|
8
|
+
private answered;
|
|
9
|
+
private settings;
|
|
10
|
+
private liveFileChanges;
|
|
11
|
+
private constructor();
|
|
12
|
+
static connect(options: CodexNativeClientOptions): Promise<CodexNativeClient>;
|
|
13
|
+
close(): void;
|
|
14
|
+
listLoaded(): Promise<string[]>;
|
|
15
|
+
readThread(threadId: string): Promise<CodexNativeThread>;
|
|
16
|
+
discover(): Promise<CodexNativeThread[]>;
|
|
17
|
+
readSnapshot(threadId: string, exactTurnId?: string): Promise<CodexNativeSnapshot>;
|
|
18
|
+
subscribe(threadId: string): Promise<void>;
|
|
19
|
+
getInteractions(threadId: string): NativeInteraction[];
|
|
20
|
+
start(threadId: string, options: {
|
|
21
|
+
text: string;
|
|
22
|
+
clientUserMessageId: string;
|
|
23
|
+
beforeDispatch?: (snapshot: CodexNativeSnapshot) => Promise<void>;
|
|
24
|
+
}): Promise<CodexNativeReceipt>;
|
|
25
|
+
respond(interaction: NativeInteraction, response: NativeInteractionResponse): Promise<{
|
|
26
|
+
dispatchState: "sent";
|
|
27
|
+
}>;
|
|
28
|
+
answerAsync(interaction: NativeInteraction, options: {
|
|
29
|
+
answer: string;
|
|
30
|
+
clientUserMessageId: string;
|
|
31
|
+
}): Promise<CodexNativeReceipt>;
|
|
32
|
+
readPermissions(threadId: string): Promise<CodexNativePermissions>;
|
|
33
|
+
updatePermissions(threadId: string, preset: CodexNativePermissionPreset): Promise<CodexNativePermissions>;
|
|
34
|
+
private requireLoaded;
|
|
35
|
+
private resume;
|
|
36
|
+
private readTurns;
|
|
37
|
+
private readItems;
|
|
38
|
+
private receive;
|
|
39
|
+
private receiveItemEvent;
|
|
40
|
+
private clearRequests;
|
|
41
|
+
private validateInput;
|
|
42
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { CodexNativeRpc } from "./codex-native-client-rpc.js";
|
|
2
|
+
import { buildNativeAsyncReply, nativeResponse, parseNativeRequest, hydrateNativeFileApproval } from "./codex-native-client-interactions.js";
|
|
3
|
+
import { nativeId, nativeRecord, nativeInvalid, nativePage, parseNativeThread, parseNativeTurn, parseNativeItem, isMainCodexCliThread, nativeAsyncInteractions, parseNativePermissions } from "./codex-native-snapshot.js";
|
|
4
|
+
import { CodexNativeError } from "./codex-native-types.js";
|
|
5
|
+
const MAX_PAGES = 100;
|
|
6
|
+
const PRESETS = { "read-only": [":read-only", "on-request"], default: [":workspace", "on-request"],
|
|
7
|
+
"full-access": [":danger-full-access", "never"] };
|
|
8
|
+
/** Native shared-daemon connection. No terminal ownership inference and no historical thread loading. */
|
|
9
|
+
export class CodexNativeClient {
|
|
10
|
+
rpc;
|
|
11
|
+
metadata;
|
|
12
|
+
subscribed = new Set();
|
|
13
|
+
requests = new Map();
|
|
14
|
+
answered = new Set();
|
|
15
|
+
settings = new Map();
|
|
16
|
+
liveFileChanges = new Map();
|
|
17
|
+
constructor(rpc) {
|
|
18
|
+
this.rpc = rpc;
|
|
19
|
+
this.metadata = rpc.metadata;
|
|
20
|
+
rpc.onEvent(raw => this.receive(raw));
|
|
21
|
+
}
|
|
22
|
+
static async connect(options) {
|
|
23
|
+
return new CodexNativeClient(await CodexNativeRpc.connect(options));
|
|
24
|
+
}
|
|
25
|
+
close() { this.rpc.close(); this.subscribed.clear(); this.requests.clear(); this.liveFileChanges.clear(); }
|
|
26
|
+
async listLoaded() {
|
|
27
|
+
const ids = [], cursors = new Set();
|
|
28
|
+
let cursor;
|
|
29
|
+
for (let pageIndex = 0; pageIndex < MAX_PAGES; pageIndex++) {
|
|
30
|
+
const page = nativePage(await this.rpc.call("thread/loaded/list", { limit: 100, ...(cursor ? { cursor } : {}) }), value => nativeId(value));
|
|
31
|
+
for (const id of page.data) {
|
|
32
|
+
if (ids.includes(id))
|
|
33
|
+
nativeInvalid("Duplicate loaded thread identity");
|
|
34
|
+
ids.push(id);
|
|
35
|
+
}
|
|
36
|
+
if (page.nextCursor === null)
|
|
37
|
+
return ids;
|
|
38
|
+
cursor = nextCursor(page.nextCursor, cursors);
|
|
39
|
+
}
|
|
40
|
+
throw new CodexNativeError("pagination_limit", "Loaded thread list exceeds bounded pagination");
|
|
41
|
+
}
|
|
42
|
+
async readThread(threadId) {
|
|
43
|
+
nativeId(threadId);
|
|
44
|
+
const result = nativeRecord(await this.rpc.call("thread/read", { threadId, includeTurns: false }));
|
|
45
|
+
return parseNativeThread(result.thread, threadId);
|
|
46
|
+
}
|
|
47
|
+
async discover() {
|
|
48
|
+
const rows = [];
|
|
49
|
+
for (const id of await this.listLoaded()) {
|
|
50
|
+
const thread = await this.readThread(id);
|
|
51
|
+
if (thread.status.type !== "notLoaded" && isMainCodexCliThread(thread))
|
|
52
|
+
rows.push(thread);
|
|
53
|
+
}
|
|
54
|
+
return rows;
|
|
55
|
+
}
|
|
56
|
+
async readSnapshot(threadId, exactTurnId) {
|
|
57
|
+
nativeId(threadId);
|
|
58
|
+
if (exactTurnId !== undefined)
|
|
59
|
+
nativeId(exactTurnId);
|
|
60
|
+
const thread = await this.readThread(threadId);
|
|
61
|
+
const loaded = thread.status.type !== "notLoaded" && (await this.listLoaded()).includes(threadId);
|
|
62
|
+
const turns = await this.readTurns(thread, exactTurnId);
|
|
63
|
+
const latestTurnId = turns[0]?.id ?? null;
|
|
64
|
+
const selectedTurn = exactTurnId ? turns.find(t => t.id === exactTurnId) : turns[0];
|
|
65
|
+
const wanted = new Set([latestTurnId, selectedTurn?.id]);
|
|
66
|
+
for (const turn of turns)
|
|
67
|
+
if (wanted.has(turn.id) && !turn.itemsComplete) {
|
|
68
|
+
turn.items = await this.readItems(threadId, turn.id);
|
|
69
|
+
turn.itemsComplete = true;
|
|
70
|
+
}
|
|
71
|
+
const liveIds = new Set(turns.filter(t => t.status === "inProgress").map(t => t.id));
|
|
72
|
+
const pendingInteractions = [...this.getInteractions(threadId).filter(i => liveIds.has(i.turnId)).map(i => hydrateNativeFileApproval(i, turns, this.liveFileChanges.get(itemKey(i.threadId, i.turnId, i.itemId))?.item)),
|
|
73
|
+
...turns.flatMap(t => nativeAsyncInteractions(threadId, t))];
|
|
74
|
+
return { threadId, thread, loaded, latestTurnId, turns, ...(selectedTurn ? { selectedTurn } : {}), pendingInteractions,
|
|
75
|
+
canSend: loaded && isMainCodexCliThread(thread) && thread.status.type === "idle"
|
|
76
|
+
&& !turns.some(t => t.status === "inProgress") && pendingInteractions.length === 0 };
|
|
77
|
+
}
|
|
78
|
+
async subscribe(threadId) {
|
|
79
|
+
await this.requireLoaded(threadId);
|
|
80
|
+
if (this.subscribed.has(threadId))
|
|
81
|
+
return;
|
|
82
|
+
this.subscribed.add(threadId);
|
|
83
|
+
try {
|
|
84
|
+
await this.resume(threadId);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
this.subscribed.delete(threadId);
|
|
88
|
+
this.clearRequests(threadId);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
getInteractions(threadId) {
|
|
93
|
+
return [...this.requests.values()].filter(i => i.threadId === threadId).map(i => structuredClone(i));
|
|
94
|
+
}
|
|
95
|
+
async start(threadId, options) {
|
|
96
|
+
this.validateInput(options.text, options.clientUserMessageId);
|
|
97
|
+
await this.requireLoaded(threadId);
|
|
98
|
+
const snapshot = await this.readSnapshot(threadId);
|
|
99
|
+
if (!snapshot.canSend)
|
|
100
|
+
throw new CodexNativeError("thread_not_idle", "Codex native thread is not idle");
|
|
101
|
+
if (snapshot.turns.some(t => t.items.some(i => i.clientId === options.clientUserMessageId))) {
|
|
102
|
+
throw new CodexNativeError("duplicate_submission", "Native submission ID already exists");
|
|
103
|
+
}
|
|
104
|
+
await options.beforeDispatch?.(snapshot);
|
|
105
|
+
const result = await this.rpc.call("turn/start", { threadId, clientUserMessageId: options.clientUserMessageId,
|
|
106
|
+
input: [{ type: "text", text: options.text, text_elements: [] }] }, true);
|
|
107
|
+
try {
|
|
108
|
+
const turn = parseNativeTurn(nativeRecord(result).turn);
|
|
109
|
+
if (snapshot.turns.some(t => t.id === turn.id))
|
|
110
|
+
throw new CodexNativeError("thread_not_idle", "Codex accepted input into an existing turn", "accepted", undefined, turn.id);
|
|
111
|
+
return { turnId: turn.id, clientUserMessageId: options.clientUserMessageId };
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof CodexNativeError && error.dispatchState === "accepted")
|
|
115
|
+
throw error;
|
|
116
|
+
throw new CodexNativeError("invalid_response", "Invalid native send receipt; do not resend", "unknown");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async respond(interaction, response) {
|
|
120
|
+
await this.requireLoaded(interaction.threadId);
|
|
121
|
+
await this.subscribe(interaction.threadId);
|
|
122
|
+
const current = this.getInteractions(interaction.threadId).find(i => i.id === interaction.id);
|
|
123
|
+
if (!current || current.requestId === undefined || current.turnId !== interaction.turnId || current.itemId !== interaction.itemId
|
|
124
|
+
|| this.answered.has(current.id))
|
|
125
|
+
throw new CodexNativeError("stale_interaction", "Native request is no longer pending");
|
|
126
|
+
const snapshot = await this.readSnapshot(interaction.threadId, interaction.turnId);
|
|
127
|
+
if (snapshot.selectedTurn?.status !== "inProgress" || !this.requests.has(requestKey(current.threadId, current.requestId))) {
|
|
128
|
+
throw new CodexNativeError("stale_interaction", "Native request no longer belongs to an active turn");
|
|
129
|
+
}
|
|
130
|
+
if (current.kind === "file_approval") {
|
|
131
|
+
const hydrated = snapshot.pendingInteractions.find(i => i.id === current.id);
|
|
132
|
+
// Pending file items may not be materialized until approved. Preview availability is not native authority.
|
|
133
|
+
if (interaction.changes && hydrated?.changes && JSON.stringify(interaction.changes) !== JSON.stringify(hydrated.changes)) {
|
|
134
|
+
throw new CodexNativeError("stale_interaction", "Native file approval changes no longer match the displayed request");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const result = nativeResponse(current, response);
|
|
138
|
+
this.answered.add(current.id);
|
|
139
|
+
this.rpc.respond(current.requestId, result);
|
|
140
|
+
return { dispatchState: "sent" };
|
|
141
|
+
}
|
|
142
|
+
async answerAsync(interaction, options) {
|
|
143
|
+
const text = buildNativeAsyncReply(interaction, options.answer);
|
|
144
|
+
this.validateInput(text, options.clientUserMessageId);
|
|
145
|
+
await this.requireLoaded(interaction.threadId);
|
|
146
|
+
const snapshot = await this.readSnapshot(interaction.threadId, interaction.turnId);
|
|
147
|
+
const current = snapshot.pendingInteractions.find(i => i.id === interaction.id && i.kind === "async_question");
|
|
148
|
+
if (!current || snapshot.selectedTurn?.status !== "inProgress" || this.answered.has(current.id)) {
|
|
149
|
+
throw new CodexNativeError("stale_interaction", "Native asynchronous question is no longer pending");
|
|
150
|
+
}
|
|
151
|
+
this.answered.add(current.id);
|
|
152
|
+
const raw = await this.rpc.call("turn/steer", { threadId: interaction.threadId, expectedTurnId: interaction.turnId,
|
|
153
|
+
clientUserMessageId: options.clientUserMessageId, input: [{ type: "text", text, textElements: [] }] }, true);
|
|
154
|
+
if (!raw || typeof raw !== "object" || raw.turnId !== interaction.turnId) {
|
|
155
|
+
throw new CodexNativeError("invalid_response", "Native answer returned a different turn", "unknown");
|
|
156
|
+
}
|
|
157
|
+
return { turnId: interaction.turnId, clientUserMessageId: options.clientUserMessageId };
|
|
158
|
+
}
|
|
159
|
+
async readPermissions(threadId) {
|
|
160
|
+
await this.requireLoaded(threadId);
|
|
161
|
+
await this.subscribe(threadId);
|
|
162
|
+
return parseNativePermissions(await this.resume(threadId));
|
|
163
|
+
}
|
|
164
|
+
async updatePermissions(threadId, preset) {
|
|
165
|
+
if (!Object.hasOwn(PRESETS, preset))
|
|
166
|
+
throw new CodexNativeError("invalid_argument", "Unknown permission preset");
|
|
167
|
+
await this.requireLoaded(threadId);
|
|
168
|
+
await this.subscribe(threadId);
|
|
169
|
+
const [permissions, approvalPolicy] = PRESETS[preset];
|
|
170
|
+
this.settings.delete(threadId);
|
|
171
|
+
await this.rpc.call("thread/settings/update", { threadId, permissions, approvalPolicy, approvalsReviewer: "user" }, true);
|
|
172
|
+
// The update acknowledgement only queues settings. Check an event or readback, including a no-op update.
|
|
173
|
+
const deadline = Date.now() + this.rpc.timeoutMs;
|
|
174
|
+
try {
|
|
175
|
+
do {
|
|
176
|
+
const event = this.settings.get(threadId);
|
|
177
|
+
if (event) {
|
|
178
|
+
const current = parseNativePermissions(event);
|
|
179
|
+
if (current.preset === preset && current.approvalsReviewer === "user")
|
|
180
|
+
return current;
|
|
181
|
+
}
|
|
182
|
+
const current = await this.readPermissions(threadId);
|
|
183
|
+
if (current.preset === preset && current.approvalsReviewer === "user")
|
|
184
|
+
return current;
|
|
185
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(100, this.rpc.timeoutMs)));
|
|
186
|
+
} while (Date.now() < deadline);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
throw new CodexNativeError(error instanceof CodexNativeError ? error.code : "invalid_response", "Native permission update confirmation failed", "unknown");
|
|
190
|
+
}
|
|
191
|
+
throw new CodexNativeError("timeout", "Native permission update was not confirmed", "unknown");
|
|
192
|
+
}
|
|
193
|
+
async requireLoaded(threadId) {
|
|
194
|
+
nativeId(threadId);
|
|
195
|
+
if (!(await this.listLoaded()).includes(threadId))
|
|
196
|
+
throw new CodexNativeError("thread_not_loaded", "Codex thread is not loaded in this backend");
|
|
197
|
+
const thread = await this.readThread(threadId);
|
|
198
|
+
if (thread.status.type === "notLoaded")
|
|
199
|
+
throw new CodexNativeError("thread_not_loaded", "Codex thread is no longer loaded");
|
|
200
|
+
if (!isMainCodexCliThread(thread))
|
|
201
|
+
throw new CodexNativeError("unsupported_thread", "Target is not a main interactive Codex CLI thread");
|
|
202
|
+
return thread;
|
|
203
|
+
}
|
|
204
|
+
async resume(threadId) {
|
|
205
|
+
const result = nativeRecord(await this.rpc.call("thread/resume", { threadId, excludeTurns: true }, true));
|
|
206
|
+
parseNativeThread(result.thread, threadId);
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
async readTurns(thread, exactTurnId) {
|
|
210
|
+
if (thread.historyMode === "legacy") {
|
|
211
|
+
const result = nativeRecord(await this.rpc.call("thread/read", { threadId: thread.id, includeTurns: true }));
|
|
212
|
+
const read = parseNativeThread(result.thread, thread.id);
|
|
213
|
+
return read.turns.map(t => parseNativeTurn({ ...t, itemsView: "full" })).reverse();
|
|
214
|
+
}
|
|
215
|
+
const turns = [], cursors = new Set();
|
|
216
|
+
let cursor;
|
|
217
|
+
for (let index = 0; index < MAX_PAGES; index++) {
|
|
218
|
+
let page;
|
|
219
|
+
try {
|
|
220
|
+
page = nativePage(await this.rpc.call("thread/turns/list", { threadId: thread.id, limit: 100,
|
|
221
|
+
sortDirection: "desc", itemsView: "notLoaded", ...(cursor ? { cursor } : {}) }), parseNativeTurn);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (index === 0 && thread.status.type === "idle" && error instanceof CodexNativeError && error.code === "unmaterialized_thread")
|
|
225
|
+
return [];
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
for (const turn of page.data) {
|
|
229
|
+
if (turns.some(t => t.id === turn.id))
|
|
230
|
+
nativeInvalid("Duplicate native turn identity");
|
|
231
|
+
turns.push(turn);
|
|
232
|
+
}
|
|
233
|
+
if (!exactTurnId || turns.some(t => t.id === exactTurnId) || page.nextCursor === null)
|
|
234
|
+
return turns;
|
|
235
|
+
cursor = nextCursor(page.nextCursor, cursors);
|
|
236
|
+
}
|
|
237
|
+
throw new CodexNativeError("pagination_limit", "Exact native task exceeds bounded history lookup");
|
|
238
|
+
}
|
|
239
|
+
async readItems(threadId, turnId) {
|
|
240
|
+
const items = [], cursors = new Set();
|
|
241
|
+
let cursor;
|
|
242
|
+
for (let index = 0; index < MAX_PAGES; index++) {
|
|
243
|
+
const page = nativePage(await this.rpc.call("thread/items/list", { threadId, turnId, limit: 100, sortDirection: "asc",
|
|
244
|
+
...(cursor ? { cursor } : {}) }), raw => {
|
|
245
|
+
const entry = nativeRecord(raw);
|
|
246
|
+
if (entry.turnId !== turnId)
|
|
247
|
+
nativeInvalid("Native history crossed the exact turn");
|
|
248
|
+
return parseNativeItem(entry.item);
|
|
249
|
+
});
|
|
250
|
+
for (const item of page.data) {
|
|
251
|
+
if (items.some(i => i.id === item.id))
|
|
252
|
+
nativeInvalid("Duplicate native task item");
|
|
253
|
+
items.push(item);
|
|
254
|
+
}
|
|
255
|
+
if (page.nextCursor === null)
|
|
256
|
+
return items;
|
|
257
|
+
cursor = nextCursor(page.nextCursor, cursors);
|
|
258
|
+
}
|
|
259
|
+
throw new CodexNativeError("pagination_limit", "Exact native task items exceed bounded pagination");
|
|
260
|
+
}
|
|
261
|
+
receive(raw) {
|
|
262
|
+
if (!raw.params || typeof raw.params !== "object")
|
|
263
|
+
return;
|
|
264
|
+
const p = nativeRecord(raw.params);
|
|
265
|
+
if (typeof p.threadId !== "string" || !this.subscribed.has(p.threadId))
|
|
266
|
+
return;
|
|
267
|
+
if (this.receiveItemEvent(raw.method, p))
|
|
268
|
+
return;
|
|
269
|
+
if (raw.method === "serverRequest/resolved" && (typeof p.requestId === "string" || typeof p.requestId === "number")) {
|
|
270
|
+
this.requests.delete(requestKey(p.threadId, p.requestId));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (raw.method === "thread/settings/updated") {
|
|
274
|
+
this.settings.set(p.threadId, p.threadSettings);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (raw.id === undefined)
|
|
278
|
+
return;
|
|
279
|
+
const interaction = parseNativeRequest(raw);
|
|
280
|
+
if (interaction?.requestId !== undefined) {
|
|
281
|
+
// Replaying one logical request may allocate a new connection-local request ID.
|
|
282
|
+
for (const [key, previous] of this.requests)
|
|
283
|
+
if (previous.id === interaction.id)
|
|
284
|
+
this.requests.delete(key);
|
|
285
|
+
this.requests.set(requestKey(interaction.threadId, interaction.requestId), interaction);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
receiveItemEvent(method, p) {
|
|
289
|
+
if (method === "turn/completed") {
|
|
290
|
+
const turnId = nativeRecord(p.turn).id;
|
|
291
|
+
for (const [key, entry] of this.liveFileChanges)
|
|
292
|
+
if (entry.threadId === p.threadId && entry.turnId === turnId)
|
|
293
|
+
this.liveFileChanges.delete(key);
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
if (method !== "item/started" && method !== "item/completed")
|
|
297
|
+
return false;
|
|
298
|
+
const rawItem = nativeRecord(p.item);
|
|
299
|
+
if (rawItem.type !== "fileChange")
|
|
300
|
+
return true;
|
|
301
|
+
const threadId = nativeId(p.threadId), turnId = nativeId(p.turnId), item = parseNativeItem(rawItem);
|
|
302
|
+
this.liveFileChanges.set(itemKey(threadId, turnId, item.id), { threadId, turnId, item });
|
|
303
|
+
if (this.liveFileChanges.size > 2000)
|
|
304
|
+
this.liveFileChanges.delete(this.liveFileChanges.keys().next().value);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
clearRequests(threadId) {
|
|
308
|
+
for (const [key, value] of this.requests)
|
|
309
|
+
if (value.threadId === threadId)
|
|
310
|
+
this.requests.delete(key);
|
|
311
|
+
}
|
|
312
|
+
validateInput(text, clientId) {
|
|
313
|
+
nativeId(clientId);
|
|
314
|
+
if (typeof text !== "string" || !text.trim() || text.length > 1_000_000)
|
|
315
|
+
throw new CodexNativeError("invalid_argument", "Invalid native task input");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function nextCursor(cursor, seen) {
|
|
319
|
+
if (seen.has(cursor))
|
|
320
|
+
nativeInvalid("Codex native pagination cursor repeated");
|
|
321
|
+
seen.add(cursor);
|
|
322
|
+
return cursor;
|
|
323
|
+
}
|
|
324
|
+
function requestKey(threadId, requestId) { return JSON.stringify([threadId, requestId]); }
|
|
325
|
+
function itemKey(threadId, turnId, itemId) { return JSON.stringify([threadId, turnId, itemId]); }
|
|
326
|
+
//# sourceMappingURL=codex-native-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-native-client.js","sourceRoot":"","sources":["../../src/codex-native-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CodexNativeIdentity } from "./codex-native-types.js";
|
|
2
|
+
export declare function createCodexNativeConversationId(identity: CodexNativeIdentity): string;
|
|
3
|
+
export declare function parseCodexNativeConversationId(value: string): CodexNativeIdentity;
|
|
4
|
+
export declare function isCodexNativeConversationId(value: unknown): value is string;
|
|
5
|
+
/** Both send-derived digest IDs and externally watched task UUIDs are durable Watch IDs. */
|
|
6
|
+
export declare function isCodexNativeWatchId(value: unknown): value is string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
const PREFIX = "codex-cli:v1:";
|
|
3
|
+
export function createCodexNativeConversationId(identity) {
|
|
4
|
+
const { codexHome, threadId } = validate(identity);
|
|
5
|
+
return PREFIX + Buffer.from(JSON.stringify([codexHome, threadId])).toString("base64url");
|
|
6
|
+
}
|
|
7
|
+
export function parseCodexNativeConversationId(value) {
|
|
8
|
+
if (!isCodexNativeConversationId(value) || value.length > 4096)
|
|
9
|
+
throw new Error("Invalid Codex CLI conversation ID");
|
|
10
|
+
const encoded = value.slice(PREFIX.length);
|
|
11
|
+
if (!/^[A-Za-z0-9_-]+$/u.test(encoded))
|
|
12
|
+
throw new Error("Invalid Codex CLI conversation encoding");
|
|
13
|
+
let tuple;
|
|
14
|
+
try {
|
|
15
|
+
tuple = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error("Invalid Codex CLI conversation payload");
|
|
19
|
+
}
|
|
20
|
+
if (!Array.isArray(tuple) || tuple.length !== 2)
|
|
21
|
+
throw new Error("Invalid Codex CLI conversation payload");
|
|
22
|
+
const identity = validate({ codexHome: tuple[0], threadId: tuple[1] });
|
|
23
|
+
if (createCodexNativeConversationId(identity) !== value)
|
|
24
|
+
throw new Error("Non-canonical Codex CLI conversation ID");
|
|
25
|
+
return identity;
|
|
26
|
+
}
|
|
27
|
+
export function isCodexNativeConversationId(value) {
|
|
28
|
+
return typeof value === "string" && value.startsWith(PREFIX);
|
|
29
|
+
}
|
|
30
|
+
/** Both send-derived digest IDs and externally watched task UUIDs are durable Watch IDs. */
|
|
31
|
+
export function isCodexNativeWatchId(value) {
|
|
32
|
+
return typeof value === "string" && /^codex-cli-watch:[A-Za-z0-9_-]{8,128}$/u.test(value);
|
|
33
|
+
}
|
|
34
|
+
function validate(value) {
|
|
35
|
+
if (typeof value.codexHome !== "string" || !path.isAbsolute(value.codexHome)
|
|
36
|
+
|| value.codexHome.length > 2048 || /[\u0000-\u001f\u007f]/u.test(value.codexHome)
|
|
37
|
+
|| typeof value.threadId !== "string" || !/^[A-Za-z0-9][A-Za-z0-9_-]{1,160}$/u.test(value.threadId)) {
|
|
38
|
+
throw new Error("Invalid Codex CLI native identity");
|
|
39
|
+
}
|
|
40
|
+
return { codexHome: path.resolve(value.codexHome), threadId: value.threadId };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=codex-native-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-native-identity.js","sourceRoot":"","sources":["../../src/codex-native-identity.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,MAAM,GAAG,eAAe,CAAC;AAC/B,MAAM,UAAU,+BAA+B,CAAC,QAA6B;IAC3E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC3F,CAAC;AACD,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnG,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAC/E,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAAC,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3G,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,IAAI,+BAA+B,CAAC,QAAQ,CAAC,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACpH,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AACD,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,yCAAyC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC;AACD,SAAS,QAAQ,CAAC,KAA0B;IAC1C,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;WACvE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;WAC/E,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type CodexNativeRuntimeOptions } from "./codex-native-runtime.js";
|
|
2
|
+
export declare function launchCodexNativeMonitor(watchId: string, options: CodexNativeRuntimeOptions): Promise<number>;
|
|
3
|
+
/** Keep one scoped observer connected; polling recovers exact turn state after missed events. */
|
|
4
|
+
export declare function runCodexNativeMonitor(watchId: string, options: CodexNativeRuntimeOptions): Promise<void>;
|