@scotthuang/agent-knock-knock 0.13.17 → 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 +38 -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-async-question-adapter.js +14 -4
- package/dist/src/codex-async-question-adapter.js.map +1 -1
- package/dist/src/codex-lifecycle-compatibility.d.ts +1 -1
- package/dist/src/codex-lifecycle-compatibility.js +9 -3
- package/dist/src/codex-lifecycle-compatibility.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/codex-permission-surface.d.ts +1 -1
- package/dist/src/codex-permission-surface.js +1 -1
- package/dist/src/codex-permission-surface.js.map +1 -1
- package/dist/src/codex-terminal-agent-adapter.js +3 -1
- package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
- 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-model-control-profile.d.ts +3 -1
- package/dist/src/terminal-model-control-profile.js +15 -7
- package/dist/src/terminal-model-control-profile.js.map +1 -1
- package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
- package/dist/src/terminal-native-inspection-profile.js +4 -0
- package/dist/src/terminal-native-inspection-profile.js.map +1 -1
- package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
- package/dist/src/terminal-permission-control.js +5 -1
- package/dist/src/terminal-permission-control.js.map +1 -1
- package/dist/src/terminal-questionnaire-adapter.js +5 -2
- package/dist/src/terminal-questionnaire-adapter.js.map +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-0.160.0-compatibility.md +126 -0
- package/docs/codex-cli-native-compatibility.md +246 -0
- package/docs/codex-desktop-compatibility.md +414 -0
- package/docs/codex-permissions.md +12 -1
- 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 -12
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +69 -18
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { connectDesktopIpcTransport } from "./desktop-ipc-transport.js";
|
|
4
|
+
import { sendDesktopAsyncAnswer } from "./desktop-ipc-async-answer.js";
|
|
5
|
+
import { respondDesktopRequest, readDesktopModelSettings, updateDesktopSettings, interruptDesktopTurn } from "./desktop-ipc-native-operations.js";
|
|
6
|
+
import { desktopRecord, reduceDesktopSnapshot } from "./desktop-snapshot.js";
|
|
7
|
+
import { DesktopIpcError } from "./desktop-types.js";
|
|
8
|
+
export const VERIFIED_DESKTOP_BUILD = Object.freeze({ version: "26.1002.52244", build: "13536" });
|
|
9
|
+
const MIN_TIMEOUT_MS = 12_000;
|
|
10
|
+
const DISCOVERY_TIMEOUT_MS = 10_000;
|
|
11
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
12
|
+
function id(value, label) {
|
|
13
|
+
if (typeof value !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,511}$/u.test(value)) {
|
|
14
|
+
throw new DesktopIpcError("invalid_argument", `Invalid Desktop ${label}`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function acceptedTurnId(response) {
|
|
19
|
+
const outer = response.result;
|
|
20
|
+
const inner = desktopRecord(outer) ? outer.result : undefined;
|
|
21
|
+
const turn = desktopRecord(inner) ? inner.turn : undefined;
|
|
22
|
+
if (!desktopRecord(turn) || typeof turn.id !== "string" || !turn.id
|
|
23
|
+
|| !["inProgress", "completed", "failed", "interrupted"].includes(String(turn.status))) {
|
|
24
|
+
throw new DesktopIpcError("invalid_response", "Desktop start receipt did not identify an accepted turn", "unknown");
|
|
25
|
+
}
|
|
26
|
+
return turn.id;
|
|
27
|
+
}
|
|
28
|
+
function isExactStreamMessage(message, target, clientId) {
|
|
29
|
+
return message.type === "broadcast" && message.method === "thread-stream-state-changed"
|
|
30
|
+
&& message.sourceClientId === target.ownerClientId && desktopRecord(message.params)
|
|
31
|
+
&& message.params.hostId === "local" && message.params.conversationId === target.threadId
|
|
32
|
+
&& (message.targetClientIds == null || (Array.isArray(message.targetClientIds) && message.targetClientIds.includes(clientId)));
|
|
33
|
+
}
|
|
34
|
+
/** Scoped native operations only; no generic RPC entry point or ownership acquisition. */
|
|
35
|
+
export class DesktopIpcClient {
|
|
36
|
+
transport;
|
|
37
|
+
options;
|
|
38
|
+
timeoutMs;
|
|
39
|
+
pending = new Map();
|
|
40
|
+
unsubscribe;
|
|
41
|
+
clientId;
|
|
42
|
+
closed;
|
|
43
|
+
target;
|
|
44
|
+
snapshot;
|
|
45
|
+
observedRevision = -1;
|
|
46
|
+
dirty = true;
|
|
47
|
+
generation = 0;
|
|
48
|
+
sending = false;
|
|
49
|
+
sentMessageIds = new Set();
|
|
50
|
+
snapshotWaiter;
|
|
51
|
+
constructor(transport, options, timeoutMs) {
|
|
52
|
+
this.transport = transport;
|
|
53
|
+
this.options = options;
|
|
54
|
+
this.timeoutMs = timeoutMs;
|
|
55
|
+
this.unsubscribe = [transport.onMessage((message) => {
|
|
56
|
+
try {
|
|
57
|
+
this.receive(message);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.finish(error instanceof Error ? error : new DesktopIpcError("invalid_response", "Invalid Desktop IPC message"));
|
|
61
|
+
}
|
|
62
|
+
}), transport.onDisconnect((error) => this.finish(error))];
|
|
63
|
+
}
|
|
64
|
+
static async connect(options) {
|
|
65
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
66
|
+
if (!path.isAbsolute(options.socketPath) || !Number.isSafeInteger(timeoutMs)
|
|
67
|
+
|| timeoutMs < MIN_TIMEOUT_MS || timeoutMs > 60_000) {
|
|
68
|
+
throw new DesktopIpcError("invalid_argument", "Desktop IPC needs an absolute socket path and timeout between 12000 and 60000 ms");
|
|
69
|
+
}
|
|
70
|
+
const transport = await (options.transportFactory ?? connectDesktopIpcTransport)({ socketPath: options.socketPath, timeoutMs });
|
|
71
|
+
const client = new DesktopIpcClient(transport, options, timeoutMs);
|
|
72
|
+
try {
|
|
73
|
+
const initialized = await client.request("initialize", 0, { clientType: "agent-knock-knock" });
|
|
74
|
+
if (!desktopRecord(initialized.result) || typeof initialized.result.clientId !== "string") {
|
|
75
|
+
throw new DesktopIpcError("invalid_response", "Desktop IPC initialization has no client identity");
|
|
76
|
+
}
|
|
77
|
+
client.clientId = id(initialized.result.clientId, "client identity");
|
|
78
|
+
return client;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
client.close();
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async discoverOwner(threadId, expectedOwnerId) {
|
|
86
|
+
id(threadId, "thread identity");
|
|
87
|
+
if (expectedOwnerId)
|
|
88
|
+
id(expectedOwnerId, "owner identity");
|
|
89
|
+
const response = await this.request("thread-owner-discovery", 1, { hostId: "local", conversationId: threadId }, expectedOwnerId, DISCOVERY_TIMEOUT_MS);
|
|
90
|
+
const ownerClientId = response.handledByClientId;
|
|
91
|
+
if (typeof ownerClientId !== "string" || ownerClientId === this.clientId) {
|
|
92
|
+
throw new DesktopIpcError("invalid_response", "Desktop owner discovery returned an invalid owner");
|
|
93
|
+
}
|
|
94
|
+
id(ownerClientId, "owner identity");
|
|
95
|
+
if (expectedOwnerId && ownerClientId !== expectedOwnerId)
|
|
96
|
+
throw new DesktopIpcError("owner_changed", "Desktop owner changed");
|
|
97
|
+
return { ownerClientId, supportsUntrustedAppInput: desktopRecord(response.result)
|
|
98
|
+
&& response.result.supportsUntrustedAppInput === true };
|
|
99
|
+
}
|
|
100
|
+
async observeThread(target) {
|
|
101
|
+
this.assertOpen();
|
|
102
|
+
id(target.threadId, "thread identity");
|
|
103
|
+
id(target.ownerClientId, "owner identity");
|
|
104
|
+
if (this.snapshotWaiter)
|
|
105
|
+
throw new DesktopIpcError("invalid_argument", "A Desktop snapshot request is already pending");
|
|
106
|
+
if (this.target && (this.target.threadId !== target.threadId || this.target.ownerClientId !== target.ownerClientId)) {
|
|
107
|
+
this.follow(false);
|
|
108
|
+
this.snapshot = undefined;
|
|
109
|
+
this.observedRevision = -1;
|
|
110
|
+
this.dirty = true;
|
|
111
|
+
this.generation++;
|
|
112
|
+
}
|
|
113
|
+
// sendTurnOnce passes a structurally compatible options object here. Keep
|
|
114
|
+
// only native identity; prompts and durable-barrier functions are not state.
|
|
115
|
+
this.target = { threadId: target.threadId, ownerClientId: target.ownerClientId };
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
const timer = setTimeout(() => {
|
|
118
|
+
this.snapshotWaiter = undefined;
|
|
119
|
+
reject(new DesktopIpcError("timeout", "Exact Desktop owner snapshot timed out"));
|
|
120
|
+
}, this.timeoutMs);
|
|
121
|
+
this.snapshotWaiter = { resolve, reject, timer };
|
|
122
|
+
try {
|
|
123
|
+
this.follow(true);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
clearTimeout(timer);
|
|
127
|
+
this.snapshotWaiter = undefined;
|
|
128
|
+
reject(error);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async sendTurnOnce(options) {
|
|
133
|
+
this.assertOpen();
|
|
134
|
+
this.validateSubmission(options);
|
|
135
|
+
this.sending = true;
|
|
136
|
+
let dispatchState = "not_sent";
|
|
137
|
+
try {
|
|
138
|
+
const baseline = await this.prepareSubmission(options);
|
|
139
|
+
this.sentMessageIds.add(options.clientUserMessageId);
|
|
140
|
+
dispatchState = "unknown";
|
|
141
|
+
const response = await this.request("thread-follower-start-turn", 2, {
|
|
142
|
+
conversationId: options.threadId,
|
|
143
|
+
turnStart: { request: { threadId: options.threadId, clientUserMessageId: options.clientUserMessageId,
|
|
144
|
+
input: [{ type: "text", text: options.prompt, text_elements: [] }] }, context: { inheritThreadSettings: true } }
|
|
145
|
+
}, options.ownerClientId);
|
|
146
|
+
const turnId = acceptedTurnId(response);
|
|
147
|
+
dispatchState = "accepted";
|
|
148
|
+
if (baseline.turns.some((previous) => previous.turnId === turnId)) {
|
|
149
|
+
throw new DesktopIpcError("unexpected_existing_turn", "Desktop attached input to an existing turn; do not claim a new task or retry", "accepted", turnId);
|
|
150
|
+
}
|
|
151
|
+
return { turnId, clientUserMessageId: options.clientUserMessageId, revision: baseline.revision, atomicIdlePrecondition: false };
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error instanceof DesktopIpcError && (dispatchState === "not_sent" || error.dispatchState !== "not_sent"))
|
|
155
|
+
throw error;
|
|
156
|
+
throw new DesktopIpcError(error instanceof DesktopIpcError ? error.code : "closed", error instanceof Error ? error.message : "Desktop submission failed", dispatchState);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
this.sending = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async answerAsyncOnce(options) {
|
|
163
|
+
this.assertOpen();
|
|
164
|
+
this.validateWrite(options.clientUserMessageId);
|
|
165
|
+
this.sending = true;
|
|
166
|
+
try {
|
|
167
|
+
return await sendDesktopAsyncAnswer(options, {
|
|
168
|
+
discoverOwner: (threadId, ownerId) => this.discoverOwner(threadId, ownerId),
|
|
169
|
+
observeThread: target => this.observeThread(target),
|
|
170
|
+
request: (params, ownerId) => this.request("thread-follower-steer-turn", 1, params, ownerId),
|
|
171
|
+
markDispatched: () => { this.assertOpen(); this.sentMessageIds.add(options.clientUserMessageId); }
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
this.sending = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
respondRequestOnce(options) {
|
|
179
|
+
return this.nativeOperation(options.operationId, port => respondDesktopRequest(options, port));
|
|
180
|
+
}
|
|
181
|
+
readModelSettings(target) {
|
|
182
|
+
return readDesktopModelSettings(target, this.nativePort());
|
|
183
|
+
}
|
|
184
|
+
updateThreadSettingsOnce(options) {
|
|
185
|
+
return this.nativeOperation(options.operationId, port => updateDesktopSettings(options, port));
|
|
186
|
+
}
|
|
187
|
+
interruptTurnOnce(options) {
|
|
188
|
+
return this.nativeOperation(options.operationId, port => interruptDesktopTurn(options, port));
|
|
189
|
+
}
|
|
190
|
+
nativePort(operationKey) {
|
|
191
|
+
return { discoverOwner: (thread, owner) => this.discoverOwner(thread, owner), observeThread: target => this.observeThread(target),
|
|
192
|
+
request: (method, version, params, owner) => this.request(method, version, params, owner),
|
|
193
|
+
markDispatched: () => {
|
|
194
|
+
this.assertOpen();
|
|
195
|
+
if (!operationKey)
|
|
196
|
+
throw new DesktopIpcError("invalid_argument", "Readonly Desktop operation cannot dispatch");
|
|
197
|
+
this.sentMessageIds.add(operationKey);
|
|
198
|
+
} };
|
|
199
|
+
}
|
|
200
|
+
async nativeOperation(operationId, operation) {
|
|
201
|
+
if (typeof operationId !== "string" || !operationId.trim() || operationId.length > 512)
|
|
202
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop operation identity");
|
|
203
|
+
const key = crypto.createHash("sha256").update(`desktop-operation:${operationId}`).digest("hex");
|
|
204
|
+
this.assertOpen();
|
|
205
|
+
this.validateWrite(key);
|
|
206
|
+
this.sending = true;
|
|
207
|
+
try {
|
|
208
|
+
return await operation(this.nativePort(key));
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
this.sending = false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
validateSubmission(options) {
|
|
215
|
+
this.validateWrite(options.clientUserMessageId);
|
|
216
|
+
if (typeof options.prompt !== "string" || !options.prompt.trim() || Buffer.byteLength(options.prompt) > 1024 * 1024
|
|
217
|
+
|| !Number.isSafeInteger(options.expectedRevision) || options.expectedRevision < 0
|
|
218
|
+
|| (options.expectedLatestTurnId !== null && typeof options.expectedLatestTurnId !== "string")) {
|
|
219
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop turn submission");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
validateWrite(clientUserMessageId) {
|
|
223
|
+
if (this.options.compatibility.version !== VERIFIED_DESKTOP_BUILD.version
|
|
224
|
+
|| this.options.compatibility.build !== VERIFIED_DESKTOP_BUILD.build) {
|
|
225
|
+
throw new DesktopIpcError("incompatible_desktop", "Desktop write capability requires the verified version and build");
|
|
226
|
+
}
|
|
227
|
+
id(clientUserMessageId, "user message identity");
|
|
228
|
+
if (this.sending || this.sentMessageIds.has(clientUserMessageId)) {
|
|
229
|
+
throw new DesktopIpcError("duplicate_submission", "Desktop submission is already attempted; it will not be retried");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async prepareSubmission(options) {
|
|
233
|
+
const owner = await this.discoverOwner(options.threadId, options.ownerClientId);
|
|
234
|
+
if (!owner.supportsUntrustedAppInput)
|
|
235
|
+
throw new DesktopIpcError("incompatible_desktop", "Desktop owner does not advertise untrusted app input support");
|
|
236
|
+
const baseline = await this.observeThread(options);
|
|
237
|
+
if (!baseline.canSend)
|
|
238
|
+
throw new DesktopIpcError("thread_not_idle", `Desktop thread is not sendable: ${baseline.idleBlockedReason}`);
|
|
239
|
+
// A first follower can increment revision solely by subscribing. Revisions must never regress.
|
|
240
|
+
if (baseline.revision < options.expectedRevision || baseline.latestTurnId !== options.expectedLatestTurnId) {
|
|
241
|
+
throw new DesktopIpcError("snapshot_changed", "Desktop history changed since submission was prepared");
|
|
242
|
+
}
|
|
243
|
+
if (baseline.turns.some((turn) => turn.items.some((entry) => entry.clientId === options.clientUserMessageId))) {
|
|
244
|
+
throw new DesktopIpcError("duplicate_submission", "Desktop already contains this client user message identity");
|
|
245
|
+
}
|
|
246
|
+
const generation = this.generation;
|
|
247
|
+
await options.beforeDispatch?.(structuredClone(baseline));
|
|
248
|
+
this.assertOpen();
|
|
249
|
+
if (this.dirty || generation !== this.generation || this.snapshot?.revision !== baseline.revision
|
|
250
|
+
|| this.target?.threadId !== options.threadId || this.target.ownerClientId !== options.ownerClientId) {
|
|
251
|
+
throw new DesktopIpcError("snapshot_changed", "Desktop state changed before dispatch; nothing was sent");
|
|
252
|
+
}
|
|
253
|
+
return baseline;
|
|
254
|
+
}
|
|
255
|
+
close() {
|
|
256
|
+
if (!this.closed && this.target) {
|
|
257
|
+
try {
|
|
258
|
+
this.follow(false);
|
|
259
|
+
}
|
|
260
|
+
catch { /* best effort unsubscribe on close */ }
|
|
261
|
+
}
|
|
262
|
+
this.finish(new DesktopIpcError("closed", "Desktop IPC client closed"));
|
|
263
|
+
}
|
|
264
|
+
assertOpen() { if (this.closed)
|
|
265
|
+
throw this.closed; }
|
|
266
|
+
follow(following) {
|
|
267
|
+
this.assertOpen();
|
|
268
|
+
if (!this.target || !this.clientId)
|
|
269
|
+
throw new DesktopIpcError("closed", "Desktop IPC has no initialized target");
|
|
270
|
+
this.transport.send({ type: "broadcast", sourceClientId: this.clientId, method: "thread-stream-following-changed",
|
|
271
|
+
version: 1, targetClientIds: [this.target.ownerClientId],
|
|
272
|
+
params: { conversationId: this.target.threadId, hostId: "local", following } });
|
|
273
|
+
}
|
|
274
|
+
request(method, version, params, target, backendTimeoutMs = this.timeoutMs - 2000) {
|
|
275
|
+
this.assertOpen();
|
|
276
|
+
if (this.pending.size >= 16)
|
|
277
|
+
throw new DesktopIpcError("invalid_argument", "Too many pending Desktop requests");
|
|
278
|
+
const requestId = crypto.randomUUID();
|
|
279
|
+
return new Promise((resolve, reject) => {
|
|
280
|
+
const timer = setTimeout(() => {
|
|
281
|
+
this.pending.delete(requestId);
|
|
282
|
+
reject(new DesktopIpcError("timeout", `Desktop ${method} response timed out; not retried`));
|
|
283
|
+
}, this.timeoutMs);
|
|
284
|
+
this.pending.set(requestId, { method, version, target, resolve, reject, timer });
|
|
285
|
+
try {
|
|
286
|
+
this.transport.send({ type: "request", requestId, sourceClientId: this.clientId ?? "initializing-client",
|
|
287
|
+
method, version, params, timeoutMs: backendTimeoutMs, ...(target ? { targetClientId: target } : {}) });
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
this.pending.delete(requestId);
|
|
291
|
+
clearTimeout(timer);
|
|
292
|
+
reject(error);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
receive(message) {
|
|
297
|
+
if (this.closed || !desktopRecord(message))
|
|
298
|
+
return;
|
|
299
|
+
if (message.type === "client-discovery-request" && typeof message.requestId === "string") {
|
|
300
|
+
this.transport.send({ type: "client-discovery-response", requestId: message.requestId, response: { canHandle: false } });
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (message.type === "response" && typeof message.requestId === "string") {
|
|
304
|
+
this.receiveResponse(message, message.requestId);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// All incoming RPC requests (including approval/questions) are deliberately left unanswered.
|
|
308
|
+
const target = this.target;
|
|
309
|
+
if (!target || !isExactStreamMessage(message, target, this.clientId))
|
|
310
|
+
return;
|
|
311
|
+
if (message.version !== 11)
|
|
312
|
+
throw new DesktopIpcError("incompatible_desktop", "Unsupported Desktop snapshot protocol version");
|
|
313
|
+
this.receiveStreamChange(message.params.change, target);
|
|
314
|
+
}
|
|
315
|
+
receiveResponse(message, requestId) {
|
|
316
|
+
const pending = this.pending.get(requestId);
|
|
317
|
+
if (!pending)
|
|
318
|
+
return;
|
|
319
|
+
this.pending.delete(requestId);
|
|
320
|
+
clearTimeout(pending.timer);
|
|
321
|
+
// The router rejects owner discovery before dispatch with no method/version
|
|
322
|
+
// or handledByClientId. This negative receipt is not a protocol mismatch.
|
|
323
|
+
if (message.resultType === "error" && message.error === "no-client-found"
|
|
324
|
+
&& message.handledByClientId === undefined
|
|
325
|
+
&& (message.method === undefined || message.method === pending.method)
|
|
326
|
+
&& (message.version === undefined || message.version === pending.version)) {
|
|
327
|
+
pending.reject(new DesktopIpcError("no_live_owner", "Desktop conversation has no connected owner; open it in Desktop and refresh"));
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (message.method !== pending.method || (message.version !== undefined && message.version !== pending.version)) {
|
|
331
|
+
pending.reject(new DesktopIpcError("invalid_response", "Desktop RPC response method/version mismatch"));
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
if (pending.target && message.handledByClientId !== pending.target) {
|
|
335
|
+
pending.reject(new DesktopIpcError("owner_changed", "Desktop RPC response came from a different owner"));
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (message.resultType !== "success") {
|
|
339
|
+
pending.reject(new DesktopIpcError("rpc_error", `Desktop ${pending.method} was not accepted`));
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
pending.resolve(message);
|
|
343
|
+
}
|
|
344
|
+
receiveStreamChange(change, target) {
|
|
345
|
+
if (!desktopRecord(change) || !Number.isSafeInteger(change.revision) || change.revision < this.observedRevision) {
|
|
346
|
+
throw new DesktopIpcError("invalid_response", "Desktop snapshot revision regressed or is invalid");
|
|
347
|
+
}
|
|
348
|
+
if (change.type !== "snapshot") {
|
|
349
|
+
if (!Number.isSafeInteger(change.baseRevision) || change.baseRevision < 0
|
|
350
|
+
|| change.revision <= change.baseRevision || !Array.isArray(change.patches)) {
|
|
351
|
+
throw new DesktopIpcError("invalid_response", "Unsupported Desktop stream change");
|
|
352
|
+
}
|
|
353
|
+
// Do not implement the private patch language. Even a missed base invalidates cached state.
|
|
354
|
+
this.dirty = true;
|
|
355
|
+
this.generation++;
|
|
356
|
+
this.observedRevision = change.revision;
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const snapshot = reduceDesktopSnapshot(change.conversationState, {
|
|
360
|
+
threadId: target.threadId, ownerClientId: target.ownerClientId, revision: change.revision
|
|
361
|
+
});
|
|
362
|
+
if (this.snapshot && snapshot.revision === this.snapshot.revision && JSON.stringify(snapshot) !== JSON.stringify(this.snapshot)) {
|
|
363
|
+
throw new DesktopIpcError("invalid_response", "Desktop changed a snapshot without advancing revision");
|
|
364
|
+
}
|
|
365
|
+
if (snapshot.revision !== this.observedRevision || this.dirty)
|
|
366
|
+
this.generation++;
|
|
367
|
+
this.snapshot = snapshot;
|
|
368
|
+
this.observedRevision = snapshot.revision;
|
|
369
|
+
this.dirty = false;
|
|
370
|
+
const waiter = this.snapshotWaiter;
|
|
371
|
+
if (waiter) {
|
|
372
|
+
// Leave the waiter registered until projection succeeds: receive's error
|
|
373
|
+
// handler must still be able to reject it and cancel its timer on failure.
|
|
374
|
+
const projected = structuredClone(snapshot);
|
|
375
|
+
this.snapshotWaiter = undefined;
|
|
376
|
+
clearTimeout(waiter.timer);
|
|
377
|
+
waiter.resolve(projected);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
finish(error) {
|
|
381
|
+
if (this.closed)
|
|
382
|
+
return;
|
|
383
|
+
this.closed = error;
|
|
384
|
+
for (const pending of this.pending.values()) {
|
|
385
|
+
clearTimeout(pending.timer);
|
|
386
|
+
pending.reject(error);
|
|
387
|
+
}
|
|
388
|
+
this.pending.clear();
|
|
389
|
+
if (this.snapshotWaiter) {
|
|
390
|
+
clearTimeout(this.snapshotWaiter.timer);
|
|
391
|
+
this.snapshotWaiter.reject(error);
|
|
392
|
+
this.snapshotWaiter = undefined;
|
|
393
|
+
}
|
|
394
|
+
for (const unsubscribe of this.unsubscribe ?? [])
|
|
395
|
+
unsubscribe();
|
|
396
|
+
this.transport.close();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
export const connectDesktopIpcClient = DesktopIpcClient.connect;
|
|
400
|
+
//# sourceMappingURL=desktop-ipc-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-ipc-client.js","sourceRoot":"","sources":["../../src/desktop-ipc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type DesktopObserveTarget, type DesktopOwner, type DesktopSnapshot, type DesktopRequestOptions, type DesktopRequestReceipt, type DesktopModelSettings, type DesktopSettingsOptions, type DesktopSettingsReceipt, type DesktopInterruptOptions, type DesktopInterruptReceipt } from "./desktop-types.js";
|
|
2
|
+
export interface DesktopNativeOperationPort {
|
|
3
|
+
discoverOwner(threadId: string, ownerId: string): Promise<DesktopOwner>;
|
|
4
|
+
observeThread(target: DesktopObserveTarget): Promise<DesktopSnapshot>;
|
|
5
|
+
request(method: string, version: number, params: Record<string, unknown>, ownerId: string): Promise<Record<string, unknown>>;
|
|
6
|
+
markDispatched(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function respondDesktopRequest(options: DesktopRequestOptions, port: DesktopNativeOperationPort): Promise<DesktopRequestReceipt>;
|
|
9
|
+
export declare function readDesktopModelSettings(target: DesktopObserveTarget, port: DesktopNativeOperationPort): Promise<DesktopModelSettings>;
|
|
10
|
+
export declare function updateDesktopSettings(options: DesktopSettingsOptions, port: DesktopNativeOperationPort): Promise<DesktopSettingsReceipt>;
|
|
11
|
+
export declare function interruptDesktopTurn(options: DesktopInterruptOptions, port: DesktopNativeOperationPort): Promise<DesktopInterruptReceipt>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { desktopInteractions, desktopObject, desktopRequestResponse } from "./desktop-request-interactions.js";
|
|
2
|
+
import { desktopCollaborationMode } from "./desktop-snapshot-details.js";
|
|
3
|
+
import { DesktopIpcError } from "./desktop-types.js";
|
|
4
|
+
async function observeOwner(target, port) {
|
|
5
|
+
await port.discoverOwner(target.threadId, target.ownerClientId);
|
|
6
|
+
return port.observeThread(target);
|
|
7
|
+
}
|
|
8
|
+
function assertActive(snapshot, target, turnId) {
|
|
9
|
+
const active = snapshot.turns.filter(turn => turn.status === "inProgress");
|
|
10
|
+
if (snapshot.threadId !== target.threadId || snapshot.ownerClientId !== target.ownerClientId || !snapshot.tailKnown
|
|
11
|
+
|| snapshot.runtimeStatus !== "active" || active.length !== 1 || active[0].turnId !== turnId || snapshot.latestTurnId !== turnId) {
|
|
12
|
+
throw new DesktopIpcError("stale_interaction", "Desktop operation no longer targets its exact active task");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function requestInteraction(snapshot, options) {
|
|
16
|
+
assertActive(snapshot, options, options.expectedTurnId);
|
|
17
|
+
if (!Number.isSafeInteger(options.expectedRevision) || snapshot.revision < options.expectedRevision) {
|
|
18
|
+
throw new DesktopIpcError("snapshot_changed", "Desktop request revision regressed");
|
|
19
|
+
}
|
|
20
|
+
const matches = desktopInteractions(snapshot, options.expectedTurnId).filter((value) => value.kind !== "async_question" && value.id === options.interactionId);
|
|
21
|
+
if (matches.length !== 1)
|
|
22
|
+
throw new DesktopIpcError("stale_interaction", "Desktop native request is changed or no longer pending");
|
|
23
|
+
return matches[0];
|
|
24
|
+
}
|
|
25
|
+
function unknown(error) {
|
|
26
|
+
if (error instanceof DesktopIpcError && error.dispatchState !== "not_sent")
|
|
27
|
+
throw error;
|
|
28
|
+
throw new DesktopIpcError(error instanceof DesktopIpcError ? error.code : "closed", error instanceof Error ? error.message : "Desktop native operation outcome is unknown", "unknown");
|
|
29
|
+
}
|
|
30
|
+
const methods = { command_approval: "thread-follower-command-approval-decision", file_approval: "thread-follower-file-approval-decision",
|
|
31
|
+
blocking_question: "thread-follower-submit-user-input" };
|
|
32
|
+
export async function respondDesktopRequest(options, port) {
|
|
33
|
+
const baseline = await observeOwner(options, port);
|
|
34
|
+
const interaction = requestInteraction(baseline, options);
|
|
35
|
+
const response = desktopRequestResponse(interaction, options.response);
|
|
36
|
+
await options.beforeDispatch?.(structuredClone(baseline));
|
|
37
|
+
const current = await port.observeThread(options);
|
|
38
|
+
const fresh = requestInteraction(current, options);
|
|
39
|
+
if (fresh.requestId !== interaction.requestId)
|
|
40
|
+
throw new DesktopIpcError("stale_interaction", "Desktop request identity changed");
|
|
41
|
+
const params = { conversationId: options.threadId, requestId: interaction.requestId,
|
|
42
|
+
...(interaction.kind === "blocking_question" ? { response } : response) };
|
|
43
|
+
port.markDispatched();
|
|
44
|
+
try {
|
|
45
|
+
const receipt = await port.request(methods[interaction.kind], 1, params, options.ownerClientId);
|
|
46
|
+
if (!desktopObject(receipt.result) || receipt.result.ok !== true)
|
|
47
|
+
throw new DesktopIpcError("invalid_response", "Desktop request handler did not acknowledge the response", "unknown");
|
|
48
|
+
return { turnId: interaction.turnId, interactionId: interaction.id, requestId: interaction.requestId,
|
|
49
|
+
revision: current.revision, acknowledged: true };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return unknown(error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function readDesktopModelSettings(target, port) {
|
|
56
|
+
await port.discoverOwner(target.threadId, target.ownerClientId);
|
|
57
|
+
const result = await port.request("thread-follower-read-model-settings", 1, { conversationId: target.threadId }, target.ownerClientId);
|
|
58
|
+
const settings = desktopObject(result.result) ? result.result.settings : undefined;
|
|
59
|
+
if (!desktopObject(settings) || !(settings.model === null || typeof settings.model === "string")
|
|
60
|
+
|| !(settings.reasoningEffort === null || typeof settings.reasoningEffort === "string")) {
|
|
61
|
+
throw new DesktopIpcError("invalid_response", "Desktop current model settings are unavailable");
|
|
62
|
+
}
|
|
63
|
+
const output = { model: settings.model, reasoningEffort: settings.reasoningEffort };
|
|
64
|
+
if (typeof settings.resumeState === "string")
|
|
65
|
+
output.resumeState = settings.resumeState;
|
|
66
|
+
for (const key of ["mode", "modelProvider"])
|
|
67
|
+
if (settings[key] === null || typeof settings[key] === "string")
|
|
68
|
+
output[key] = settings[key];
|
|
69
|
+
return output;
|
|
70
|
+
}
|
|
71
|
+
function validateSettings(settings) {
|
|
72
|
+
const fields = ["model", "effort", "collaborationMode", "permissions", "approvalPolicy", "approvalsReviewer"];
|
|
73
|
+
if (!desktopObject(settings) || !Object.keys(settings).length || Object.keys(settings).some(key => !fields.includes(key))) {
|
|
74
|
+
throw new DesktopIpcError("invalid_argument", "Unsupported Desktop settings update");
|
|
75
|
+
}
|
|
76
|
+
for (const key of ["model", "permissions", "approvalPolicy", "approvalsReviewer"]) {
|
|
77
|
+
if (settings[key] !== undefined && (typeof settings[key] !== "string" || !settings[key]))
|
|
78
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop setting");
|
|
79
|
+
}
|
|
80
|
+
if (settings.effort !== undefined && settings.effort !== null && typeof settings.effort !== "string")
|
|
81
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop effort");
|
|
82
|
+
if (settings.collaborationMode !== undefined)
|
|
83
|
+
desktopCollaborationMode(settings.collaborationMode);
|
|
84
|
+
}
|
|
85
|
+
function assertIdle(snapshot) {
|
|
86
|
+
if (!snapshot.canSend || snapshot.runtimeStatus !== "idle")
|
|
87
|
+
throw new DesktopIpcError("thread_not_idle", "Desktop settings updates require the existing thread to be idle");
|
|
88
|
+
}
|
|
89
|
+
export async function updateDesktopSettings(options, port) {
|
|
90
|
+
validateSettings(options.settings);
|
|
91
|
+
const baseline = await observeOwner(options, port);
|
|
92
|
+
assertIdle(baseline);
|
|
93
|
+
await options.beforeDispatch?.(structuredClone(baseline));
|
|
94
|
+
const current = await port.observeThread(options);
|
|
95
|
+
assertIdle(current);
|
|
96
|
+
port.markDispatched();
|
|
97
|
+
try {
|
|
98
|
+
const receipt = await port.request("thread-follower-update-thread-settings", 2, { conversationId: options.threadId, threadSettings: options.settings }, options.ownerClientId);
|
|
99
|
+
if (!desktopObject(receipt.result) || receipt.result.applied !== true)
|
|
100
|
+
throw new DesktopIpcError("invalid_response", "Desktop settings were not acknowledged", "unknown");
|
|
101
|
+
const modelSettings = await readDesktopModelSettings(options, port);
|
|
102
|
+
return { applied: true, snapshot: await port.observeThread(options), modelSettings };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
return unknown(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function interruptDesktopTurn(options, port) {
|
|
109
|
+
const baseline = await observeOwner(options, port);
|
|
110
|
+
assertActive(baseline, options, options.expectedTurnId);
|
|
111
|
+
await options.beforeDispatch?.(structuredClone(baseline));
|
|
112
|
+
const current = await port.observeThread(options);
|
|
113
|
+
assertActive(current, options, options.expectedTurnId);
|
|
114
|
+
port.markDispatched();
|
|
115
|
+
try {
|
|
116
|
+
const receipt = await port.request("thread-follower-interrupt-turn", 4, { conversationId: options.threadId, mode: "user-stop", expectedTurnId: options.expectedTurnId }, options.ownerClientId);
|
|
117
|
+
if (!desktopObject(receipt.result) || receipt.result.ok !== true || receipt.result.interruptedTurnId !== options.expectedTurnId) {
|
|
118
|
+
throw new DesktopIpcError("invalid_response", "Desktop interrupt did not acknowledge the exact turn", "unknown");
|
|
119
|
+
}
|
|
120
|
+
return { interruptedTurnId: options.expectedTurnId, snapshot: await port.observeThread(options) };
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return unknown(error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=desktop-ipc-native-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-ipc-native-operations.js","sourceRoot":"","sources":["../../src/desktop-ipc-native-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC/G,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,eAAe,EAGsC,MAAM,oBAAoB,CAAC;AASzF,KAAK,UAAU,YAAY,CAAC,MAA4B,EAAE,IAAgC;IACxF,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,YAAY,CAAC,QAAyB,EAAE,MAA4B,EAAE,MAAc;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,SAAS;WAC9G,QAAQ,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACnI,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,2DAA2D,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AACD,SAAS,kBAAkB,CAAC,QAAyB,EAAE,OAA8B;IACnF,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpG,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,oCAAoC,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CACzH,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,wDAAwD,CAAC,CAAC;IACnI,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AACD,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU;QAAE,MAAM,KAAK,CAAC;IACxF,MAAM,IAAI,eAAe,CAAC,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAChF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6CAA6C,EAAE,SAAS,CAAC,CAAC;AACvG,CAAC;AACD,MAAM,OAAO,GAAG,EAAE,gBAAgB,EAAE,2CAA2C,EAAE,aAAa,EAAE,wCAAwC;IACtI,iBAAiB,EAAE,mCAAmC,EAAW,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA8B,EAAE,IAAgC;IAC1G,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,SAAS;QAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,kCAAkC,CAAC,CAAC;IAClI,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS;QACjF,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5E,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAChG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,0DAA0D,EAAE,SAAS,CAAC,CAAC;QACvL,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS;YAClG,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAA4B,EAAE,IAAgC;IAC3G,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qCAAqC,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACvI,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC;WAC3F,CAAC,CAAC,QAAQ,CAAC,eAAe,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,gDAAgD,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,MAAM,GAAyB,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC1G,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ;QAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACxF,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAU;QAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA+B;IACvD,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC9G,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1H,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,qCAAqC,CAAC,CAAC;IACvF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,CAAU,EAAE,CAAC;QAC3F,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;IACrK,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;IAC9K,IAAI,QAAQ,CAAC,iBAAiB,KAAK,SAAS;QAAE,wBAAwB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AACrG,CAAC;AACD,SAAS,UAAU,CAAC,QAAyB;IAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,iEAAiE,CAAC,CAAC;AAC9K,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA+B,EAAE,IAAgC;IAC3G,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wCAAwC,EAAE,CAAC,EAC5E,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,SAAS,CAAC,CAAC;QAC1K,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgC,EAAE,IAAgC;IAC3G,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5G,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1G,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,CAAC,EACpE,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1H,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;YAChI,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,sDAAsD,EAAE,SAAS,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACpG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DesktopIpcTransport } from "./desktop-types.js";
|
|
2
|
+
/** A private parent prevents another OS user replacing a trusted socket path. */
|
|
3
|
+
export declare function readDesktopSocketIdentity(socketPath: string): string;
|
|
4
|
+
/** Desktop's private IPC uses a uint32 little-endian length followed by UTF-8 JSON. */
|
|
5
|
+
export declare class DesktopFrameDecoder {
|
|
6
|
+
private buffered;
|
|
7
|
+
push(chunk: Buffer): unknown[];
|
|
8
|
+
}
|
|
9
|
+
export declare function encodeDesktopFrame(message: Record<string, unknown>): Buffer;
|
|
10
|
+
export declare function connectDesktopIpcTransport(options: {
|
|
11
|
+
socketPath: string;
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}): Promise<DesktopIpcTransport>;
|