@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 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-control-semantic.js","sourceRoot":"","sources":["../../src/desktop-control-semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DesktopThreadIdentity } from "./desktop-types.js";
|
|
2
|
+
/** Desktop identity is independent of a window, mutable title, or current IPC owner. */
|
|
3
|
+
export declare function createDesktopConversationId(identity: DesktopThreadIdentity): string;
|
|
4
|
+
export declare function parseDesktopConversationId(value: string): DesktopThreadIdentity;
|
|
5
|
+
export declare function isDesktopConversationId(value: unknown): value is string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
const PREFIX = "desktop:v1:";
|
|
3
|
+
/** Desktop identity is independent of a window, mutable title, or current IPC owner. */
|
|
4
|
+
export function createDesktopConversationId(identity) {
|
|
5
|
+
const value = validate(identity);
|
|
6
|
+
return PREFIX + Buffer.from(JSON.stringify([value.codexHome, value.hostId, value.threadId])).toString("base64url");
|
|
7
|
+
}
|
|
8
|
+
export function parseDesktopConversationId(value) {
|
|
9
|
+
if (!isDesktopConversationId(value) || value.length > 4096)
|
|
10
|
+
throw new Error("Invalid Desktop conversation ID");
|
|
11
|
+
const encoded = value.slice(PREFIX.length);
|
|
12
|
+
if (!/^[A-Za-z0-9_-]+$/u.test(encoded))
|
|
13
|
+
throw new Error("Invalid Desktop conversation ID encoding");
|
|
14
|
+
let tuple;
|
|
15
|
+
try {
|
|
16
|
+
tuple = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error("Invalid Desktop conversation ID payload");
|
|
20
|
+
}
|
|
21
|
+
if (!Array.isArray(tuple) || tuple.length !== 3)
|
|
22
|
+
throw new Error("Invalid Desktop conversation ID payload");
|
|
23
|
+
const identity = validate({ codexHome: tuple[0], hostId: tuple[1], threadId: tuple[2] });
|
|
24
|
+
if (createDesktopConversationId(identity) !== value)
|
|
25
|
+
throw new Error("Non-canonical Desktop conversation ID");
|
|
26
|
+
return identity;
|
|
27
|
+
}
|
|
28
|
+
export function isDesktopConversationId(value) {
|
|
29
|
+
return typeof value === "string" && value.startsWith(PREFIX);
|
|
30
|
+
}
|
|
31
|
+
function validate(value) {
|
|
32
|
+
if (typeof value.codexHome !== "string" || !path.isAbsolute(value.codexHome) ||
|
|
33
|
+
/[\u0000-\u001f\u007f]/u.test(value.codexHome) || value.codexHome.length > 2048 ||
|
|
34
|
+
typeof value.hostId !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/u.test(value.hostId) ||
|
|
35
|
+
typeof value.threadId !== "string" || !/^[A-Za-z0-9][A-Za-z0-9_-]{1,160}$/u.test(value.threadId)) {
|
|
36
|
+
throw new Error("Invalid Desktop native identity");
|
|
37
|
+
}
|
|
38
|
+
return { codexHome: path.resolve(value.codexHome), hostId: value.hostId, threadId: value.threadId };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=desktop-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-identity.js","sourceRoot":"","sources":["../../src/desktop-identity.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,MAAM,GAAG,aAAa,CAAC;AAE7B,wFAAwF;AACxF,MAAM,UAAU,2BAA2B,CAAC,QAA+B;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/G,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,0CAA0C,CAAC,CAAC;IACpG,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,yCAAyC,CAAC,CAAC;IAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC5G,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF,IAAI,2BAA2B,CAAC,QAAQ,CAAC,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC9G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,KAA4B;IAC5C,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;QACxE,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI;QAC/E,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9F,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { DesktopAsyncInteraction, DesktopInteraction, DesktopRequestResponse } from "./desktop-types.js";
|
|
2
|
+
type ProjectedQuestion = {
|
|
3
|
+
question_id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
response_kind: string;
|
|
6
|
+
allow_free_text: boolean;
|
|
7
|
+
is_secret?: boolean;
|
|
8
|
+
options: {
|
|
9
|
+
option_id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
}[];
|
|
12
|
+
};
|
|
13
|
+
export interface ProjectedDesktopInteraction {
|
|
14
|
+
conversation_id?: string;
|
|
15
|
+
watch_id?: string;
|
|
16
|
+
interaction_id: string;
|
|
17
|
+
kind: DesktopInteraction["kind"];
|
|
18
|
+
status: "pending";
|
|
19
|
+
native_thread_id: string;
|
|
20
|
+
native_turn_id: string;
|
|
21
|
+
delivery_modes?: string[];
|
|
22
|
+
expires_at: string;
|
|
23
|
+
interaction_prompt_fingerprint: string;
|
|
24
|
+
questions: ProjectedQuestion[];
|
|
25
|
+
command?: string;
|
|
26
|
+
reason?: string;
|
|
27
|
+
cwd?: string;
|
|
28
|
+
network?: {
|
|
29
|
+
host: string;
|
|
30
|
+
protocol: string;
|
|
31
|
+
};
|
|
32
|
+
file_changes?: {
|
|
33
|
+
path: string;
|
|
34
|
+
kind?: string;
|
|
35
|
+
diff?: string;
|
|
36
|
+
diffTruncated?: boolean;
|
|
37
|
+
}[];
|
|
38
|
+
available_actions: Record<string, {
|
|
39
|
+
tool: string;
|
|
40
|
+
input: Record<string, string>;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export declare function desktopInteractionIsApproval(item: {
|
|
44
|
+
kind: string;
|
|
45
|
+
}): boolean;
|
|
46
|
+
/** Exact request content, never stream revision or elapsed time, defines freshness. */
|
|
47
|
+
export declare function desktopInteractionFingerprint(item: DesktopInteraction): string;
|
|
48
|
+
export declare function desktopInteractionProjection(item: DesktopInteraction, desktopId: string, watchId?: string): ProjectedDesktopInteraction;
|
|
49
|
+
/** Reconstruct a whitelist after checking exact subject and task; raw request fields never escape. */
|
|
50
|
+
export declare function validateDesktopInteractionProjections(value: unknown, desktopId: unknown, watchId?: unknown, turnId?: unknown): ProjectedDesktopInteraction[];
|
|
51
|
+
export declare function desktopQuestionAnswer(interaction: DesktopAsyncInteraction, value: unknown): string;
|
|
52
|
+
/** Answer every question from one exact native request in a single structured response. */
|
|
53
|
+
export declare function desktopQuestionResponse(interaction: DesktopInteraction, value: unknown): Extract<DesktopRequestResponse, {
|
|
54
|
+
answers: unknown;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function validateDesktopProjectedAnswer(projection: ProjectedDesktopInteraction, value: unknown): void;
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { parseDesktopConversationId } from "./desktop-identity.js";
|
|
3
|
+
import { isRecord } from "./value-guards.js";
|
|
4
|
+
const digest = (parts) => createHash("sha256").update(JSON.stringify(parts)).digest("hex");
|
|
5
|
+
const questionId = (item, nativeId) => `q:${digest([item.id, nativeId])}`;
|
|
6
|
+
const optionId = (item, nativeId, label) => `o:${digest([item.id, nativeId, label])}`;
|
|
7
|
+
const interactionPattern = /^desktop-(?:async|request)-interaction:[0-9a-f]{64}$/u;
|
|
8
|
+
const questionPattern = /^q:[0-9a-f]{64}$/u;
|
|
9
|
+
const optionPattern = /^o:[0-9a-f]{64}$/u;
|
|
10
|
+
export function desktopInteractionIsApproval(item) {
|
|
11
|
+
return item.kind === "command_approval" || item.kind === "file_approval";
|
|
12
|
+
}
|
|
13
|
+
/** Exact request content, never stream revision or elapsed time, defines freshness. */
|
|
14
|
+
export function desktopInteractionFingerprint(item) {
|
|
15
|
+
const request = item.kind === "async_question" ? [] : [item.requestId, item.command, item.reason, item.cwd,
|
|
16
|
+
item.approvalId, item.nativeApprovalKind, item.networkApprovalContext, item.changes];
|
|
17
|
+
return digest([item.id, item.threadId, item.turnId, item.itemId, item.method, item.questions, ...request]);
|
|
18
|
+
}
|
|
19
|
+
export function desktopInteractionProjection(item, desktopId, watchId) {
|
|
20
|
+
const target = watchId ? { watch_id: watchId } : { conversation_id: desktopId };
|
|
21
|
+
const approval = desktopInteractionIsApproval(item);
|
|
22
|
+
return {
|
|
23
|
+
...target, interaction_id: item.id, kind: item.kind, status: "pending",
|
|
24
|
+
native_thread_id: item.threadId, native_turn_id: item.turnId,
|
|
25
|
+
...(item.kind === "async_question" ? { delivery_modes: ["steer_current_turn"] } : {}),
|
|
26
|
+
...(item.kind === "async_question" ? {} : approvalDetails(item)),
|
|
27
|
+
expires_at: new Date(Date.now() + 10 * 60_000).toISOString(),
|
|
28
|
+
interaction_prompt_fingerprint: desktopInteractionFingerprint(item),
|
|
29
|
+
questions: item.questions.map(question => desktopQuestionProjection(item, question)),
|
|
30
|
+
available_actions: { [approval ? "approve" : "respond"]: {
|
|
31
|
+
tool: approval ? "agent_knock_knock_approve" : "agent_knock_knock_respond_interaction",
|
|
32
|
+
input: { ...target, interaction_id: item.id }
|
|
33
|
+
} }
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function approvalDetails(item) {
|
|
37
|
+
return { ...(item.command ? { command: item.command } : {}), ...(item.reason ? { reason: item.reason } : {}),
|
|
38
|
+
...(item.cwd ? { cwd: item.cwd } : {}), ...(item.networkApprovalContext ? { network: item.networkApprovalContext } : {}),
|
|
39
|
+
...(item.changes ? { file_changes: item.changes } : {}) };
|
|
40
|
+
}
|
|
41
|
+
function desktopQuestionProjection(item, question) {
|
|
42
|
+
return { question_id: questionId(item, question.id), title: question.title,
|
|
43
|
+
response_kind: question.options.length ? "single_select" : "free_text",
|
|
44
|
+
allow_free_text: !question.options.length || question.isOther === true || item.kind === "async_question",
|
|
45
|
+
...(question.isSecret ? { is_secret: true } : {}),
|
|
46
|
+
options: question.options.map(label => ({ option_id: optionId(item, question.id, label), label })) };
|
|
47
|
+
}
|
|
48
|
+
/** Reconstruct a whitelist after checking exact subject and task; raw request fields never escape. */
|
|
49
|
+
export function validateDesktopInteractionProjections(value, desktopId, watchId, turnId) {
|
|
50
|
+
if (typeof desktopId !== "string" || !Array.isArray(value) || value.length > 128)
|
|
51
|
+
throw new Error("Invalid Desktop interaction projection");
|
|
52
|
+
const identity = parseDesktopConversationId(desktopId);
|
|
53
|
+
if (watchId !== undefined && (typeof watchId !== "string" || !/^desktop-watch:[A-Za-z0-9_-]{8,128}$/u.test(watchId)))
|
|
54
|
+
throw new Error("Invalid Desktop Watch identity");
|
|
55
|
+
const ids = new Set();
|
|
56
|
+
return value.map(item => {
|
|
57
|
+
assertProjectedInteraction(item, { desktopId, watchId, threadId: identity.threadId, turnId });
|
|
58
|
+
if (ids.has(item.interaction_id))
|
|
59
|
+
throw new Error("Duplicate Desktop interaction");
|
|
60
|
+
ids.add(item.interaction_id);
|
|
61
|
+
return copyProjectedInteraction(item, desktopId, typeof watchId === "string" ? watchId : undefined);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function copyProjectedInteraction(item, desktopId, watchId) {
|
|
65
|
+
const target = watchId ? { watch_id: watchId } : { conversation_id: desktopId };
|
|
66
|
+
const approval = desktopInteractionIsApproval(item);
|
|
67
|
+
return { ...copyProjectedApprovalDetails(item), ...target, interaction_id: item.interaction_id, kind: item.kind, status: "pending",
|
|
68
|
+
native_thread_id: item.native_thread_id, native_turn_id: item.native_turn_id,
|
|
69
|
+
...(item.kind === "async_question" ? { delivery_modes: ["steer_current_turn"] } : {}),
|
|
70
|
+
expires_at: item.expires_at,
|
|
71
|
+
interaction_prompt_fingerprint: item.interaction_prompt_fingerprint,
|
|
72
|
+
questions: item.questions.map(q => ({ question_id: q.question_id, title: q.title, response_kind: q.response_kind,
|
|
73
|
+
allow_free_text: q.allow_free_text, ...(q.is_secret ? { is_secret: true } : {}),
|
|
74
|
+
options: q.options.map(o => ({ option_id: o.option_id, label: o.label })) })),
|
|
75
|
+
available_actions: { [approval ? "approve" : "respond"]: {
|
|
76
|
+
tool: approval ? "agent_knock_knock_approve" : "agent_knock_knock_respond_interaction",
|
|
77
|
+
input: { ...target, interaction_id: item.interaction_id }
|
|
78
|
+
} } };
|
|
79
|
+
}
|
|
80
|
+
function copyProjectedApprovalDetails(item) {
|
|
81
|
+
const details = {};
|
|
82
|
+
for (const field of ["command", "reason", "cwd"]) {
|
|
83
|
+
if (typeof item[field] === "string")
|
|
84
|
+
details[field] = item[field];
|
|
85
|
+
}
|
|
86
|
+
if (isRecord(item.network) && typeof item.network.host === "string" && typeof item.network.protocol === "string") {
|
|
87
|
+
details.network = { host: item.network.host, protocol: item.network.protocol };
|
|
88
|
+
}
|
|
89
|
+
if (Array.isArray(item.file_changes))
|
|
90
|
+
details.file_changes = item.file_changes
|
|
91
|
+
.filter(change => isRecord(change) && typeof change.path === "string").map(projectedFileChange);
|
|
92
|
+
return details;
|
|
93
|
+
}
|
|
94
|
+
function projectedFileChange(change) {
|
|
95
|
+
return { path: change.path, ...(typeof change.kind === "string" ? { kind: change.kind } : {}),
|
|
96
|
+
...(typeof change.diff === "string" ? { diff: change.diff } : {}), ...(change.diffTruncated === true ? { diffTruncated: true } : {}) };
|
|
97
|
+
}
|
|
98
|
+
function assertProjectedInteraction(item, target) {
|
|
99
|
+
if (!isRecord(item) || typeof item.interaction_id !== "string" || !interactionPattern.test(item.interaction_id)
|
|
100
|
+
|| !["async_question", "blocking_question", "command_approval", "file_approval"].includes(String(item.kind))
|
|
101
|
+
|| item.status !== "pending" || item.native_thread_id !== target.threadId
|
|
102
|
+
|| typeof item.native_turn_id !== "string" || !item.native_turn_id || (typeof target.turnId === "string" && item.native_turn_id !== target.turnId)
|
|
103
|
+
|| (target.watchId ? item.watch_id !== target.watchId : item.conversation_id !== target.desktopId))
|
|
104
|
+
throw new Error("Desktop interaction identity mismatch");
|
|
105
|
+
if ((item.kind === "async_question") !== item.interaction_id.startsWith("desktop-async-interaction:"))
|
|
106
|
+
throw new Error("Desktop interaction identity mismatch");
|
|
107
|
+
assertProjectedQuestionDetails(item);
|
|
108
|
+
}
|
|
109
|
+
function assertProjectedQuestionDetails(item) {
|
|
110
|
+
if (!Array.isArray(item.questions) || item.questions.length > 16 || typeof item.expires_at !== "string"
|
|
111
|
+
|| !Number.isFinite(Date.parse(item.expires_at)))
|
|
112
|
+
throw new Error("Invalid Desktop interaction projection");
|
|
113
|
+
if (item.kind === "async_question" && (item.questions.length !== 1 || !Array.isArray(item.delivery_modes)
|
|
114
|
+
|| item.delivery_modes.length !== 1 || item.delivery_modes[0] !== "steer_current_turn"))
|
|
115
|
+
throw new Error("Invalid Desktop async projection");
|
|
116
|
+
if (item.kind !== "async_question" && item.delivery_modes !== undefined)
|
|
117
|
+
throw new Error("Blocking Desktop interactions cannot steer replies");
|
|
118
|
+
if (item.kind === "blocking_question" && !item.questions.length)
|
|
119
|
+
throw new Error("Empty Desktop questionnaire");
|
|
120
|
+
if (["command_approval", "file_approval"].includes(String(item.kind)) && item.questions.length)
|
|
121
|
+
throw new Error("Desktop approval cannot contain question answers");
|
|
122
|
+
const ids = new Set();
|
|
123
|
+
for (const question of item.questions) {
|
|
124
|
+
assertProjectedQuestion(question);
|
|
125
|
+
if (ids.has(question.question_id))
|
|
126
|
+
throw new Error("Duplicate Desktop question");
|
|
127
|
+
ids.add(question.question_id);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function assertProjectedQuestion(q) {
|
|
131
|
+
if (!isRecord(q) || typeof q.question_id !== "string" || !questionPattern.test(q.question_id)
|
|
132
|
+
|| typeof q.title !== "string" || !q.title || !["single_select", "free_text"].includes(String(q.response_kind))
|
|
133
|
+
|| typeof q.allow_free_text !== "boolean" || !Array.isArray(q.options) || q.options.length > 32
|
|
134
|
+
|| q.options.some(option => !validProjectedOption(option)))
|
|
135
|
+
throw new Error("Invalid Desktop question");
|
|
136
|
+
}
|
|
137
|
+
function validProjectedOption(option) {
|
|
138
|
+
return isRecord(option) && typeof option.option_id === "string" && optionPattern.test(option.option_id) && typeof option.label === "string";
|
|
139
|
+
}
|
|
140
|
+
export function desktopQuestionAnswer(interaction, value) {
|
|
141
|
+
const answers = desktopQuestionResponse(interaction, value);
|
|
142
|
+
return answers.answers[interaction.questions[0].id][0];
|
|
143
|
+
}
|
|
144
|
+
/** Answer every question from one exact native request in a single structured response. */
|
|
145
|
+
export function desktopQuestionResponse(interaction, value) {
|
|
146
|
+
const projection = desktopInteractionProjection(interaction, "unused");
|
|
147
|
+
const selected = projectedAnswers(projection, value);
|
|
148
|
+
const answers = {};
|
|
149
|
+
for (const question of interaction.questions) {
|
|
150
|
+
Object.defineProperty(answers, question.id, { value: [selected.get(questionId(interaction, question.id))], enumerable: true });
|
|
151
|
+
}
|
|
152
|
+
return { answers };
|
|
153
|
+
}
|
|
154
|
+
export function validateDesktopProjectedAnswer(projection, value) {
|
|
155
|
+
projectedAnswers(projection, value);
|
|
156
|
+
}
|
|
157
|
+
function projectedAnswers(projection, value) {
|
|
158
|
+
assertAnswerEnvelope(projection, value);
|
|
159
|
+
const answers = new Map();
|
|
160
|
+
for (const answer of value.answers) {
|
|
161
|
+
if (!isRecord(answer))
|
|
162
|
+
throw new Error("Invalid Desktop answer");
|
|
163
|
+
const question = projection.questions.find(q => q.question_id === answer.question_id);
|
|
164
|
+
if (!question || answers.has(question.question_id))
|
|
165
|
+
throw new Error("Desktop question ID does not match or is duplicated");
|
|
166
|
+
answers.set(question.question_id, projectedDesktopAnswerText(question, answer));
|
|
167
|
+
}
|
|
168
|
+
return answers;
|
|
169
|
+
}
|
|
170
|
+
function assertAnswerEnvelope(projection, value) {
|
|
171
|
+
if (desktopInteractionIsApproval(projection) || !isRecord(value) || value.interaction_id !== projection.interaction_id
|
|
172
|
+
|| !Array.isArray(value.answers) || value.answers.length !== projection.questions.length
|
|
173
|
+
|| Object.keys(value).some(key => !["interaction_id", "answers", "delivery_mode"].includes(key)))
|
|
174
|
+
throw new Error("Answer must match every question in one current Desktop interaction");
|
|
175
|
+
if (value.delivery_mode !== undefined && (projection.kind !== "async_question" || value.delivery_mode !== "steer_current_turn")) {
|
|
176
|
+
throw new Error("Answer must use one current Desktop async delivery mode");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function projectedDesktopAnswerText(question, answer) {
|
|
180
|
+
if (answer.response_kind === "single_select") {
|
|
181
|
+
if (Object.keys(answer).some(key => !["question_id", "response_kind", "selected_option_ids"].includes(key))
|
|
182
|
+
|| !Array.isArray(answer.selected_option_ids) || answer.selected_option_ids.length !== 1)
|
|
183
|
+
throw new Error("Select one advertised Desktop option");
|
|
184
|
+
const option = question.options.find(item => item.option_id === answer.selected_option_ids[0]);
|
|
185
|
+
if (!option)
|
|
186
|
+
throw new Error("Selected Desktop option is absent");
|
|
187
|
+
return option.label;
|
|
188
|
+
}
|
|
189
|
+
if (answer.response_kind !== "free_text" || !question.allow_free_text
|
|
190
|
+
|| Object.keys(answer).some(key => !["question_id", "response_kind", "text"].includes(key))
|
|
191
|
+
|| typeof answer.text !== "string" || !answer.text.trim() || answer.text.length > 4096
|
|
192
|
+
|| /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/u.test(answer.text))
|
|
193
|
+
throw new Error("Invalid Desktop free-text answer");
|
|
194
|
+
return answer.text;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=desktop-interaction-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-interaction-projection.js","sourceRoot":"","sources":["../../src/desktop-interaction-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DesktopInteraction, DesktopThreadIdentity } from "./desktop-types.js";
|
|
2
|
+
export declare function assertDesktopInteraction(value: unknown, target?: DesktopThreadIdentity, turnId?: string): asserts value is DesktopInteraction;
|
|
3
|
+
export declare function persistDesktopInteraction(interaction: DesktopInteraction): DesktopInteraction;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { assertDesktopAsyncInteraction, desktopNonblank } from "./desktop-async-state.js";
|
|
2
|
+
import { desktopRequestInteractionId } from "./desktop-request-interactions.js";
|
|
3
|
+
const methods = {
|
|
4
|
+
command_approval: "item/commandExecution/requestApproval",
|
|
5
|
+
file_approval: "item/fileChange/requestApproval",
|
|
6
|
+
blocking_question: "item/tool/requestUserInput"
|
|
7
|
+
};
|
|
8
|
+
function assertRequestIdentity(interaction) {
|
|
9
|
+
if (!interaction || !(interaction.kind in methods) || interaction.method !== methods[interaction.kind] ||
|
|
10
|
+
!desktopNonblank(interaction.id) || !desktopNonblank(interaction.threadId) || !desktopNonblank(interaction.turnId) ||
|
|
11
|
+
!desktopNonblank(interaction.itemId) || !Array.isArray(interaction.questions))
|
|
12
|
+
throw new Error("Invalid Desktop request interaction");
|
|
13
|
+
if (!(typeof interaction.requestId === "number" && Number.isSafeInteger(interaction.requestId)) &&
|
|
14
|
+
!desktopNonblank(interaction.requestId))
|
|
15
|
+
throw new Error("Desktop interaction requires its native request identity");
|
|
16
|
+
}
|
|
17
|
+
function assertRequestQuestions(interaction) {
|
|
18
|
+
if (interaction.kind === "blocking_question" && !interaction.questions.length)
|
|
19
|
+
throw new Error("Desktop blocking question has no questions");
|
|
20
|
+
if (interaction.kind !== "blocking_question" && interaction.questions.length)
|
|
21
|
+
throw new Error("Desktop approval cannot contain answer questions");
|
|
22
|
+
const ids = new Set();
|
|
23
|
+
for (const question of interaction.questions) {
|
|
24
|
+
if (!desktopNonblank(question.id) || !desktopNonblank(question.title) || ids.has(question.id) ||
|
|
25
|
+
!Array.isArray(question.options) || question.options.some(option => !desktopNonblank(option)))
|
|
26
|
+
throw new Error("Invalid Desktop blocking question");
|
|
27
|
+
ids.add(question.id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function assertDesktopInteraction(value, target, turnId) {
|
|
31
|
+
const interaction = value;
|
|
32
|
+
if (interaction?.kind === "async_question") {
|
|
33
|
+
assertDesktopAsyncInteraction(value, target, turnId);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
assertRequestIdentity(interaction);
|
|
37
|
+
assertRequestQuestions(interaction);
|
|
38
|
+
if (target && interaction.threadId !== target.threadId || turnId && interaction.turnId !== turnId) {
|
|
39
|
+
throw new Error("Desktop interaction belongs to a different native task");
|
|
40
|
+
}
|
|
41
|
+
if (interaction.id !== desktopRequestInteractionId(interaction))
|
|
42
|
+
throw new Error("Desktop request payload does not match its identity");
|
|
43
|
+
}
|
|
44
|
+
export function persistDesktopInteraction(interaction) {
|
|
45
|
+
assertDesktopInteraction(interaction);
|
|
46
|
+
return structuredClone(interaction);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=desktop-interaction-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-interaction-state.js","sourceRoot":"","sources":["../../src/desktop-interaction-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DesktopAsyncAnswerOptions, type DesktopAsyncAnswerReceipt, type DesktopObserveTarget, type DesktopOwner, type DesktopSnapshot } from "./desktop-types.js";
|
|
2
|
+
export interface DesktopAsyncAnswerPort {
|
|
3
|
+
discoverOwner(threadId: string, ownerId: string): Promise<DesktopOwner>;
|
|
4
|
+
observeThread(target: DesktopObserveTarget): Promise<DesktopSnapshot>;
|
|
5
|
+
request(params: Record<string, unknown>, ownerId: string): Promise<Record<string, unknown>>;
|
|
6
|
+
markDispatched(): void;
|
|
7
|
+
}
|
|
8
|
+
/** One targeted steer attempt. An RPC acknowledgement is not the final native answer proof. */
|
|
9
|
+
export declare function sendDesktopAsyncAnswer(options: DesktopAsyncAnswerOptions, port: DesktopAsyncAnswerPort): Promise<DesktopAsyncAnswerReceipt>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { buildDesktopAsyncReply, desktopAsyncQuestions } from "./desktop-async-interactions.js";
|
|
2
|
+
import { desktopRecord } from "./desktop-snapshot.js";
|
|
3
|
+
import { DesktopIpcError } from "./desktop-types.js";
|
|
4
|
+
function validateOptions(options) {
|
|
5
|
+
if (!Number.isSafeInteger(options.expectedRevision) || options.expectedRevision < 0
|
|
6
|
+
|| typeof options.expectedTurnId !== "string" || !options.expectedTurnId
|
|
7
|
+
|| typeof options.interactionId !== "string" || !options.interactionId
|
|
8
|
+
|| typeof options.answer !== "string" || !options.answer.trim() || options.answer.length > 16_384) {
|
|
9
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop asynchronous response");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function activeQuestion(snapshot, options) {
|
|
13
|
+
const active = snapshot.turns.filter(turn => turn.status === "inProgress");
|
|
14
|
+
if (snapshot.threadId !== options.threadId || snapshot.ownerClientId !== options.ownerClientId
|
|
15
|
+
|| snapshot.revision < options.expectedRevision || !snapshot.tailKnown || snapshot.mode !== "default"
|
|
16
|
+
|| snapshot.resumeState !== "resumed" || snapshot.runtimeStatus !== "active"
|
|
17
|
+
|| snapshot.latestTurnId !== options.expectedTurnId || active.length !== 1 || active[0].turnId !== options.expectedTurnId) {
|
|
18
|
+
throw new DesktopIpcError("stale_interaction", "Desktop asynchronous question no longer belongs to the exact active task");
|
|
19
|
+
}
|
|
20
|
+
const matches = desktopAsyncQuestions(snapshot, options.expectedTurnId).filter(question => question.id === options.interactionId);
|
|
21
|
+
if (matches.length !== 1)
|
|
22
|
+
throw new DesktopIpcError("stale_interaction", "Desktop asynchronous question is answered, changed, or unavailable");
|
|
23
|
+
if (snapshot.turns.some(turn => turn.items.some(item => item.clientId === options.clientUserMessageId
|
|
24
|
+
|| item.clientUserMessageId === options.clientUserMessageId || item.serverClientUserMessageId === options.clientUserMessageId))) {
|
|
25
|
+
throw new DesktopIpcError("duplicate_submission", "Desktop already contains this answer identity; it will not be replayed");
|
|
26
|
+
}
|
|
27
|
+
return matches[0];
|
|
28
|
+
}
|
|
29
|
+
function steerParams(options, snapshot, text) {
|
|
30
|
+
const id = options.clientUserMessageId;
|
|
31
|
+
return { conversationId: options.threadId, input: [{ type: "text", text, text_elements: [] }],
|
|
32
|
+
clientUserMessageId: id, attachments: [], restoreMessage: {
|
|
33
|
+
id, text, createdAt: Date.now(), ...(snapshot.cwd ? { cwd: snapshot.cwd } : {}),
|
|
34
|
+
context: { prompt: text, addedFiles: [], fileAttachments: [], ideContext: null, imageAttachments: [],
|
|
35
|
+
commentAttachments: [], workspaceRoots: snapshot.cwd ? [snapshot.cwd] : [] }
|
|
36
|
+
} };
|
|
37
|
+
}
|
|
38
|
+
function receiptTurnId(response) {
|
|
39
|
+
const outer = response.result;
|
|
40
|
+
const result = desktopRecord(outer) ? outer.result : undefined;
|
|
41
|
+
return desktopRecord(result) && typeof result.turnId === "string" ? result.turnId : undefined;
|
|
42
|
+
}
|
|
43
|
+
/** One targeted steer attempt. An RPC acknowledgement is not the final native answer proof. */
|
|
44
|
+
export async function sendDesktopAsyncAnswer(options, port) {
|
|
45
|
+
validateOptions(options);
|
|
46
|
+
const owner = await port.discoverOwner(options.threadId, options.ownerClientId);
|
|
47
|
+
if (!owner.supportsUntrustedAppInput)
|
|
48
|
+
throw new DesktopIpcError("incompatible_desktop", "Desktop owner does not support untrusted app input");
|
|
49
|
+
const baseline = await port.observeThread(options);
|
|
50
|
+
const question = activeQuestion(baseline, options);
|
|
51
|
+
const text = buildDesktopAsyncReply(question, options.answer);
|
|
52
|
+
await options.beforeDispatch?.(structuredClone(baseline));
|
|
53
|
+
// Normal progress changes revisions. Recheck the question and exact task, not byte-identical snapshots.
|
|
54
|
+
const current = await port.observeThread(options);
|
|
55
|
+
activeQuestion(current, options);
|
|
56
|
+
port.markDispatched();
|
|
57
|
+
try {
|
|
58
|
+
const response = await port.request(steerParams(options, current, text), options.ownerClientId);
|
|
59
|
+
const turnId = receiptTurnId(response);
|
|
60
|
+
if (turnId !== options.expectedTurnId) {
|
|
61
|
+
throw new DesktopIpcError("unexpected_existing_turn", "Desktop did not acknowledge the expected asynchronous answer task", "unknown", turnId);
|
|
62
|
+
}
|
|
63
|
+
return { turnId, clientUserMessageId: options.clientUserMessageId, revision: current.revision, atomicTurnPrecondition: false };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof DesktopIpcError && error.dispatchState !== "not_sent")
|
|
67
|
+
throw error;
|
|
68
|
+
throw new DesktopIpcError(error instanceof DesktopIpcError ? error.code : "closed", error instanceof Error ? error.message : "Desktop asynchronous response outcome is unknown", "unknown");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=desktop-ipc-async-answer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-ipc-async-answer.js","sourceRoot":"","sources":["../../src/desktop-ipc-async-answer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type DesktopIpcClientOptions, type DesktopOwner, type DesktopObserveTarget, type DesktopSendTurnOptions, type DesktopSnapshot, type DesktopTurnReceipt, type DesktopAsyncAnswerOptions, type DesktopAsyncAnswerReceipt, type DesktopRequestOptions, type DesktopRequestReceipt, type DesktopModelSettings, type DesktopSettingsOptions, type DesktopSettingsReceipt, type DesktopInterruptOptions, type DesktopInterruptReceipt } from "./desktop-types.js";
|
|
2
|
+
export declare const VERIFIED_DESKTOP_BUILD: Readonly<{
|
|
3
|
+
version: "26.1002.52244";
|
|
4
|
+
build: "13536";
|
|
5
|
+
}>;
|
|
6
|
+
/** Scoped native operations only; no generic RPC entry point or ownership acquisition. */
|
|
7
|
+
export declare class DesktopIpcClient {
|
|
8
|
+
private readonly transport;
|
|
9
|
+
private readonly options;
|
|
10
|
+
private readonly timeoutMs;
|
|
11
|
+
private readonly pending;
|
|
12
|
+
private readonly unsubscribe;
|
|
13
|
+
private clientId;
|
|
14
|
+
private closed;
|
|
15
|
+
private target;
|
|
16
|
+
private snapshot;
|
|
17
|
+
private observedRevision;
|
|
18
|
+
private dirty;
|
|
19
|
+
private generation;
|
|
20
|
+
private sending;
|
|
21
|
+
private readonly sentMessageIds;
|
|
22
|
+
private snapshotWaiter;
|
|
23
|
+
private constructor();
|
|
24
|
+
static connect(options: DesktopIpcClientOptions): Promise<DesktopIpcClient>;
|
|
25
|
+
discoverOwner(threadId: string, expectedOwnerId?: string): Promise<DesktopOwner>;
|
|
26
|
+
observeThread(target: DesktopObserveTarget): Promise<DesktopSnapshot>;
|
|
27
|
+
sendTurnOnce(options: DesktopSendTurnOptions): Promise<DesktopTurnReceipt>;
|
|
28
|
+
answerAsyncOnce(options: DesktopAsyncAnswerOptions): Promise<DesktopAsyncAnswerReceipt>;
|
|
29
|
+
respondRequestOnce(options: DesktopRequestOptions): Promise<DesktopRequestReceipt>;
|
|
30
|
+
readModelSettings(target: DesktopObserveTarget): Promise<DesktopModelSettings>;
|
|
31
|
+
updateThreadSettingsOnce(options: DesktopSettingsOptions): Promise<DesktopSettingsReceipt>;
|
|
32
|
+
interruptTurnOnce(options: DesktopInterruptOptions): Promise<DesktopInterruptReceipt>;
|
|
33
|
+
private nativePort;
|
|
34
|
+
private nativeOperation;
|
|
35
|
+
private validateSubmission;
|
|
36
|
+
private validateWrite;
|
|
37
|
+
private prepareSubmission;
|
|
38
|
+
close(): void;
|
|
39
|
+
private assertOpen;
|
|
40
|
+
private follow;
|
|
41
|
+
private request;
|
|
42
|
+
private receive;
|
|
43
|
+
private receiveResponse;
|
|
44
|
+
private receiveStreamChange;
|
|
45
|
+
private finish;
|
|
46
|
+
}
|
|
47
|
+
export declare const connectDesktopIpcClient: typeof DesktopIpcClient.connect;
|