@scotthuang/agent-knock-knock 0.13.18 → 0.14.1
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 +41 -0
- package/CONTRIBUTING.md +212 -0
- package/README.md +106 -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-public-progress.d.ts +38 -0
- package/dist/src/backend-public-progress.js +106 -0
- package/dist/src/backend-public-progress.js.map +1 -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 +143 -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 +20 -10
- 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-app-server-read-client.d.ts +3 -0
- package/dist/src/codex-app-server-read-client.js.map +1 -1
- package/dist/src/codex-native-cli-adapter.d.ts +6 -0
- package/dist/src/codex-native-cli-adapter.js +303 -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 +331 -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 +503 -0
- package/dist/src/codex-native-task-service.js.map +1 -0
- package/dist/src/codex-native-types.d.ts +92 -0
- package/dist/src/codex-native-types.js +15 -0
- package/dist/src/codex-native-types.js.map +1 -0
- package/dist/src/conversation-list.d.ts +12 -0
- package/dist/src/conversation-list.js +30 -0
- package/dist/src/conversation-list.js.map +1 -0
- package/dist/src/conversation-route-dispatch.d.ts +13 -0
- package/dist/src/conversation-route-dispatch.js +66 -0
- package/dist/src/conversation-route-dispatch.js.map +1 -0
- package/dist/src/conversation-route-legacy.d.ts +18 -0
- package/dist/src/conversation-route-legacy.js +54 -0
- package/dist/src/conversation-route-legacy.js.map +1 -0
- package/dist/src/conversation-route-store.d.ts +51 -0
- package/dist/src/conversation-route-store.js +126 -0
- package/dist/src/conversation-route-store.js.map +1 -0
- package/dist/src/conversation-routing-cli-adapter.d.ts +12 -0
- package/dist/src/conversation-routing-cli-adapter.js +211 -0
- package/dist/src/conversation-routing-cli-adapter.js.map +1 -0
- package/dist/src/conversation-routing-commands.d.ts +11 -0
- package/dist/src/conversation-routing-commands.js +85 -0
- package/dist/src/conversation-routing-commands.js.map +1 -0
- package/dist/src/conversation-routing-home.d.ts +26 -0
- package/dist/src/conversation-routing-home.js +105 -0
- package/dist/src/conversation-routing-home.js.map +1 -0
- package/dist/src/conversation-routing-identity.d.ts +40 -0
- package/dist/src/conversation-routing-identity.js +174 -0
- package/dist/src/conversation-routing-identity.js.map +1 -0
- package/dist/src/conversation-runtime-route-store.d.ts +11 -0
- package/dist/src/conversation-runtime-route-store.js +118 -0
- package/dist/src/conversation-runtime-route-store.js.map +1 -0
- package/dist/src/desktop-async-interactions.d.ts +15 -0
- package/dist/src/desktop-async-interactions.js +88 -0
- package/dist/src/desktop-async-interactions.js.map +1 -0
- package/dist/src/desktop-async-state.d.ts +5 -0
- package/dist/src/desktop-async-state.js +53 -0
- package/dist/src/desktop-async-state.js.map +1 -0
- package/dist/src/desktop-cli-adapter.d.ts +7 -0
- package/dist/src/desktop-cli-adapter.js +343 -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 +281 -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 +172 -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 +442 -0
- package/dist/src/desktop-task-service.js.map +1 -0
- package/dist/src/desktop-types.d.ts +283 -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/monitor-deadline-policy.d.ts +8 -0
- package/dist/src/monitor-deadline-policy.js +16 -0
- package/dist/src/monitor-deadline-policy.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 +84 -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-command-cli-adapter.js +4 -4
- package/dist/src/terminal-command-cli-adapter.js.map +1 -1
- package/dist/src/terminal-command-dispatch-preparation.js +2 -1
- package/dist/src/terminal-command-dispatch-preparation.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
- package/dist/src/terminal-list-cli-adapter.js +6 -3
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
- package/dist/src/terminal-monitor-launch-plan.js +3 -2
- package/dist/src/terminal-monitor-launch-plan.js.map +1 -1
- package/dist/src/terminal-monitor-supervision-cli-adapter.js +2 -2
- package/dist/src/terminal-monitor-supervision-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-retry-reconciliation.js +2 -2
- package/dist/src/terminal-submission-retry-reconciliation.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/dist/src/terminal-watch-cli-adapter.js +4 -4
- package/dist/src/terminal-watch-cli-adapter.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 +98 -0
- package/docs/bidirectional-agent-protocol.md +260 -0
- package/docs/codex-cli-native-compatibility.md +246 -0
- package/docs/codex-desktop-compatibility.md +414 -0
- package/docs/openclaw-operations.md +281 -0
- package/docs/openclaw-session-turn-delivery-requirement.md +45 -0
- package/docs/operator-guide.md +572 -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 +8 -4
- package/package.json +6 -13
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +66 -15
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { parseCodexNativeConversationId } from "./codex-native-identity.js";
|
|
3
|
+
import { formatTerminalConversationId, parseTerminalConversationId } from "./terminal-agent-adapter.js";
|
|
4
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
|
|
5
|
+
/** Legacy terminal IDs name the same exact provider, agent, endpoint and process. */
|
|
6
|
+
export function canonicalTerminalRouteId(value) {
|
|
7
|
+
const identity = parseTerminalConversationId(value);
|
|
8
|
+
if (!identity)
|
|
9
|
+
throw new Error("Invalid exact terminal route identity");
|
|
10
|
+
return formatTerminalConversationId(identity);
|
|
11
|
+
}
|
|
12
|
+
export function terminalRouteIdsMatch(left, right) {
|
|
13
|
+
if (typeof left !== "string")
|
|
14
|
+
return false;
|
|
15
|
+
try {
|
|
16
|
+
return canonicalTerminalRouteId(left) === canonicalTerminalRouteId(right);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Link only fresh physical identity evidence. A same-cwd or resume command match never participates. */
|
|
23
|
+
export function associateConversationRoutes(terminals, nativeRows, options = {}) {
|
|
24
|
+
const associations = [];
|
|
25
|
+
const unassociated = [];
|
|
26
|
+
for (const terminal of terminals) {
|
|
27
|
+
const identity = terminalIdentity(terminal, options);
|
|
28
|
+
const terminalId = text(terminal.id) ?? text(terminal.terminal_id) ?? "";
|
|
29
|
+
if ("status" in identity) {
|
|
30
|
+
unassociated.push({ terminalId, reason: identity.reason });
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const candidates = nativeRows.flatMap(row => {
|
|
34
|
+
const id = liveNativeId(row);
|
|
35
|
+
if (!id)
|
|
36
|
+
return [];
|
|
37
|
+
const proof = proveIdentity(id, identity);
|
|
38
|
+
return proof.status === "exact" ? [proof.association] : [];
|
|
39
|
+
});
|
|
40
|
+
if (candidates.length === 1)
|
|
41
|
+
associations.push(candidates[0]);
|
|
42
|
+
else
|
|
43
|
+
unassociated.push({ terminalId, reason: candidates.length ? "ambiguous_native_identity" : "matching_loaded_backend_not_found" });
|
|
44
|
+
}
|
|
45
|
+
return { associations, unassociated };
|
|
46
|
+
}
|
|
47
|
+
/** Native-offline fallback still requires the exact fresh terminal thread and home.
|
|
48
|
+
* This proves identity only; dispatch certainty and terminal input safety remain separate gates.
|
|
49
|
+
*/
|
|
50
|
+
export function proveNativeTerminalRoute(nativeId, terminal, options = {}) {
|
|
51
|
+
const identity = terminalIdentity(terminal, options);
|
|
52
|
+
return "status" in identity ? identity : proveIdentity(nativeId, identity);
|
|
53
|
+
}
|
|
54
|
+
/** Multiple exact aliases are useful for List but cannot select a fallback terminal implicitly. */
|
|
55
|
+
export function resolveNativeTerminalRoute(nativeId, terminals, options = {}) {
|
|
56
|
+
const matches = terminals.map(terminal => proveNativeTerminalRoute(nativeId, terminal, options))
|
|
57
|
+
.filter((proof) => proof.status === "exact");
|
|
58
|
+
if (matches.length === 1)
|
|
59
|
+
return matches[0];
|
|
60
|
+
return { status: matches.length ? "ambiguous" : "unavailable",
|
|
61
|
+
reason: matches.length ? "multiple_exact_terminal_aliases" : "no_exact_terminal_alias" };
|
|
62
|
+
}
|
|
63
|
+
/** The closed inspection transaction is internal evidence, never a user-supplied routing hint. */
|
|
64
|
+
export function withClosedStatusInspection(before, after, observation) {
|
|
65
|
+
const beforeId = liveTerminalId(before), afterId = liveTerminalId(after);
|
|
66
|
+
if (typeof beforeId !== "string" || typeof afterId !== "string" || !terminalRouteIdsMatch(beforeId, afterId)) {
|
|
67
|
+
throw new Error("Native status inspection lost its exact terminal identity; no task input was sent");
|
|
68
|
+
}
|
|
69
|
+
for (const key of ["pid", "native_agent_process_uuid", "native_agent_process_birth"]) {
|
|
70
|
+
if (before[key] !== after[key])
|
|
71
|
+
throw new Error("Native status inspection changed terminal process incarnation; no task input was sent");
|
|
72
|
+
}
|
|
73
|
+
const threadId = uuid(observation.native_thread_id);
|
|
74
|
+
if (observation.status !== "observed" || observation.inspection !== "status" || observation.agent !== "codex" ||
|
|
75
|
+
!terminalRouteIdsMatch(observation.terminal_id, beforeId) || !threadId) {
|
|
76
|
+
throw new Error("Native status inspection did not prove the exact selected Codex thread; no task input was sent");
|
|
77
|
+
}
|
|
78
|
+
const row = { ...after, _routing_inspection_thread_id: threadId };
|
|
79
|
+
const proof = currentThreadIdentity(row);
|
|
80
|
+
if ("status" in proof || proof.evidence !== "closed_status_inspection") {
|
|
81
|
+
throw new Error("Native status inspection conflicted with current terminal identity or readiness; no task input was sent");
|
|
82
|
+
}
|
|
83
|
+
return row;
|
|
84
|
+
}
|
|
85
|
+
function terminalIdentity(terminal, options) {
|
|
86
|
+
const terminalId = liveTerminalId(terminal);
|
|
87
|
+
if (typeof terminalId !== "string")
|
|
88
|
+
return terminalId;
|
|
89
|
+
const home = terminalHome(terminal, options);
|
|
90
|
+
if (typeof home !== "string")
|
|
91
|
+
return home;
|
|
92
|
+
const thread = currentThreadIdentity(terminal);
|
|
93
|
+
return "status" in thread ? thread : { terminalId, codexHome: home, ...thread };
|
|
94
|
+
}
|
|
95
|
+
function currentThreadIdentity(terminal) {
|
|
96
|
+
const nativeId = uuid(terminal.native_agent_session_id), cardId = uuid(terminal.native_agent_status_card_session_id);
|
|
97
|
+
const inspected = uuid(terminal._routing_inspection_thread_id);
|
|
98
|
+
const conflict = threadIdentityConflict(nativeId, cardId, inspected);
|
|
99
|
+
if (conflict)
|
|
100
|
+
return conflict;
|
|
101
|
+
const ready = terminal.activity_state === "idle" && record(terminal.approval_state)?.blocked !== true;
|
|
102
|
+
if (inspected && ready)
|
|
103
|
+
return { threadId: inspected, evidence: "closed_status_inspection" };
|
|
104
|
+
const observation = record(terminal.native_agent_identity_observation);
|
|
105
|
+
const resolved = observation?.status === "resolved" || !observation && terminal.native_identity_state === "resolved";
|
|
106
|
+
if (nativeId && resolved)
|
|
107
|
+
return { threadId: nativeId, evidence: "resolved_native_identity" };
|
|
108
|
+
if (cardId && ready)
|
|
109
|
+
return { threadId: cardId, evidence: "visible_status_card" };
|
|
110
|
+
return unavailable("current_native_thread_identity_missing");
|
|
111
|
+
}
|
|
112
|
+
function threadIdentityConflict(nativeId, cardId, inspected) {
|
|
113
|
+
if (nativeId && cardId && nativeId !== cardId)
|
|
114
|
+
return { status: "conflict", reason: "native_identity_status_card_conflict" };
|
|
115
|
+
if (inspected && [nativeId, cardId].some(id => id !== undefined && id !== inspected)) {
|
|
116
|
+
return { status: "conflict", reason: "native_identity_inspection_conflict" };
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
function liveTerminalId(terminal) {
|
|
121
|
+
const terminalId = text(terminal.id) ?? text(terminal.terminal_id);
|
|
122
|
+
if (terminal.agent !== "codex" || terminal.process_state !== "active" || !terminalId?.startsWith("terminal:")) {
|
|
123
|
+
return unavailable("not_a_live_codex_terminal");
|
|
124
|
+
}
|
|
125
|
+
if (!Number.isSafeInteger(terminal.pid) || Number(terminal.pid) < 2 ||
|
|
126
|
+
!text(terminal.native_agent_process_uuid) || !text(terminal.native_agent_process_birth)) {
|
|
127
|
+
return unavailable("physical_process_incarnation_missing");
|
|
128
|
+
}
|
|
129
|
+
return terminalId;
|
|
130
|
+
}
|
|
131
|
+
function terminalHome(terminal, _options) {
|
|
132
|
+
const supplied = [terminal.codex_home, terminal.native_agent_codex_home, terminal._codex_home].filter(value => value !== undefined);
|
|
133
|
+
const homes = supplied.map(normalizeHome);
|
|
134
|
+
if (homes.some(home => home === undefined))
|
|
135
|
+
return unavailable("invalid_codex_home_evidence");
|
|
136
|
+
const unique = [...new Set(homes)];
|
|
137
|
+
if (unique.length > 1)
|
|
138
|
+
return { status: "conflict", reason: "codex_home_evidence_conflict" };
|
|
139
|
+
const home = unique[0];
|
|
140
|
+
return home ?? unavailable("codex_home_evidence_missing");
|
|
141
|
+
}
|
|
142
|
+
function proveIdentity(nativeId, identity) {
|
|
143
|
+
let native;
|
|
144
|
+
try {
|
|
145
|
+
native = parseCodexNativeConversationId(nativeId);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return unavailable("invalid_native_conversation_id");
|
|
149
|
+
}
|
|
150
|
+
if (native.codexHome !== identity.codexHome || uuid(native.threadId) !== identity.threadId) {
|
|
151
|
+
return { status: "conflict", reason: "native_terminal_identity_mismatch" };
|
|
152
|
+
}
|
|
153
|
+
return { status: "exact", association: { ...identity, nativeId, threadId: native.threadId } };
|
|
154
|
+
}
|
|
155
|
+
function liveNativeId(row) {
|
|
156
|
+
if (row.agent !== "codex" || row.source !== "codex_cli" || row.connection_state !== "loaded_backend_verified")
|
|
157
|
+
return undefined;
|
|
158
|
+
const id = text(row.conversation_id) ?? text(row.id);
|
|
159
|
+
if (!id)
|
|
160
|
+
return undefined;
|
|
161
|
+
try {
|
|
162
|
+
const identity = parseCodexNativeConversationId(id);
|
|
163
|
+
return uuid(row.native_thread_id) === uuid(identity.threadId) ? id : undefined;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function normalizeHome(value) { return typeof value === "string" && path.isAbsolute(value) ? path.resolve(value) : undefined; }
|
|
170
|
+
function uuid(value) { return typeof value === "string" && UUID.test(value) ? value.toLowerCase() : undefined; }
|
|
171
|
+
function text(value) { return typeof value === "string" && value.trim() ? value : undefined; }
|
|
172
|
+
function record(value) { return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined; }
|
|
173
|
+
function unavailable(reason) { return { status: "unavailable", reason }; }
|
|
174
|
+
//# sourceMappingURL=conversation-routing-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-routing-identity.js","sourceRoot":"","sources":["../../src/conversation-routing-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ConversationRouteStore } from "./conversation-route-store.js";
|
|
2
|
+
/** New reservations never acquire the managed Store writer lease. Existing development
|
|
3
|
+
* journals remain read-only authority; migration preserves their provider and outcome.
|
|
4
|
+
* Writers using this wrapper share a message lock. Older binaries that write only the
|
|
5
|
+
* legacy journal are not coordinated; any observed disagreement fails closed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createConversationRuntimeRouteStore(storeDir: string, runtimeDir: string, locks: {
|
|
8
|
+
acquire(lockPath: string): () => void;
|
|
9
|
+
}, options?: {
|
|
10
|
+
now?(): Date;
|
|
11
|
+
}): ConversationRouteStore;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { isDeepStrictEqual } from "node:util";
|
|
5
|
+
import { isNodeError } from "./durable-json-file.js";
|
|
6
|
+
import { ensureDir } from "./store.js";
|
|
7
|
+
import { ConversationRouteError, conversationRouteId, createConversationRouteStore } from "./conversation-route-store.js";
|
|
8
|
+
/** Resolve aliases even before the configured directory itself exists. */
|
|
9
|
+
function canonicalPath(directory) {
|
|
10
|
+
let current = path.resolve(directory);
|
|
11
|
+
const suffix = [];
|
|
12
|
+
while (true) {
|
|
13
|
+
try {
|
|
14
|
+
return path.join(fs.realpathSync(current), ...suffix);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (!isNodeError(error, "ENOENT"))
|
|
18
|
+
throw error;
|
|
19
|
+
const parent = path.dirname(current);
|
|
20
|
+
if (parent === current)
|
|
21
|
+
throw error;
|
|
22
|
+
suffix.unshift(path.basename(current));
|
|
23
|
+
current = parent;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function privateDirectory(directory) {
|
|
28
|
+
try {
|
|
29
|
+
const stat = fs.lstatSync(directory);
|
|
30
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || (stat.mode & 0o077) !== 0 ||
|
|
31
|
+
process.getuid && stat.uid !== process.getuid()) {
|
|
32
|
+
throw new Error("Conversation routing runtime must be an owner-private real directory");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (!isNodeError(error, "ENOENT"))
|
|
37
|
+
throw error;
|
|
38
|
+
ensureDir(directory);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function reconcileRecords(legacy, current) {
|
|
42
|
+
if (!legacy || !current)
|
|
43
|
+
return legacy ?? current;
|
|
44
|
+
const immutable = ["id", "controller_session", "message_id", "request_text", "canonical_target", "route", "target_id"];
|
|
45
|
+
if (immutable.some(key => legacy[key] !== current[key]) ||
|
|
46
|
+
legacy.receipt !== undefined && current.receipt !== undefined && !isDeepStrictEqual(legacy.receipt, current.receipt)) {
|
|
47
|
+
throw new ConversationRouteError("conversation_route_conflict", "Managed Store and runtime journals disagree on this message's immutable route or receipt");
|
|
48
|
+
}
|
|
49
|
+
if (legacy.receipt)
|
|
50
|
+
return legacy;
|
|
51
|
+
if (current.receipt || current.state === "uncertain")
|
|
52
|
+
return current;
|
|
53
|
+
return legacy.state === "uncertain" ? legacy : current;
|
|
54
|
+
}
|
|
55
|
+
const choiceOf = (record) => ({ route: record.route, targetId: record.target_id });
|
|
56
|
+
/** New reservations never acquire the managed Store writer lease. Existing development
|
|
57
|
+
* journals remain read-only authority; migration preserves their provider and outcome.
|
|
58
|
+
* Writers using this wrapper share a message lock. Older binaries that write only the
|
|
59
|
+
* legacy journal are not coordinated; any observed disagreement fails closed.
|
|
60
|
+
*/
|
|
61
|
+
export function createConversationRuntimeRouteStore(storeDir, runtimeDir, locks, options = {}) {
|
|
62
|
+
const runtimeRoot = canonicalPath(runtimeDir);
|
|
63
|
+
const routingRoot = path.join(runtimeRoot, "conversation-routing");
|
|
64
|
+
const scope = path.join(routingRoot, createHash("sha256").update(canonicalPath(storeDir)).digest("hex"));
|
|
65
|
+
const legacy = createConversationRouteStore(storeDir, locks, options);
|
|
66
|
+
const current = createConversationRouteStore(path.join(scope, "state"), locks, options);
|
|
67
|
+
const read = (input) => reconcileRecords(legacy.load(input), current.load(input));
|
|
68
|
+
const locked = (input, action) => {
|
|
69
|
+
const id = conversationRouteId(input.controllerSession, input.messageId);
|
|
70
|
+
for (const directory of [runtimeRoot, routingRoot, scope])
|
|
71
|
+
privateDirectory(directory);
|
|
72
|
+
const release = locks.acquire(path.join(scope, `${id}.lock`));
|
|
73
|
+
try {
|
|
74
|
+
return action();
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
release();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const copyPin = (input, record) => {
|
|
81
|
+
const choice = choiceOf(record);
|
|
82
|
+
current.reserve(input, choice);
|
|
83
|
+
read(input); // Never overwrite a conflicting reservation or a newly observed legacy outcome.
|
|
84
|
+
if (record.receipt)
|
|
85
|
+
current.recordReceipt(input, choice, record.receipt);
|
|
86
|
+
else if (record.state === "uncertain")
|
|
87
|
+
current.markUncertain(input, choice, record.error_code);
|
|
88
|
+
};
|
|
89
|
+
const update = (input, action) => locked(input, () => {
|
|
90
|
+
const record = read(input);
|
|
91
|
+
if (record)
|
|
92
|
+
copyPin(input, record);
|
|
93
|
+
const result = action();
|
|
94
|
+
read(input);
|
|
95
|
+
return result;
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
load: input => locked(input, () => {
|
|
99
|
+
const record = read(input);
|
|
100
|
+
if (record && !record.receipt)
|
|
101
|
+
copyPin(input, record);
|
|
102
|
+
return read(input);
|
|
103
|
+
}),
|
|
104
|
+
reserve: (input, choice) => locked(input, () => {
|
|
105
|
+
const previous = read(input);
|
|
106
|
+
if (previous) {
|
|
107
|
+
if (!previous.receipt)
|
|
108
|
+
copyPin(input, previous);
|
|
109
|
+
return { record: read(input), created: false };
|
|
110
|
+
}
|
|
111
|
+
const result = current.reserve(input, choice);
|
|
112
|
+
return { record: read(input), created: result.created };
|
|
113
|
+
}),
|
|
114
|
+
recordReceipt: (input, choice, receipt) => update(input, () => current.recordReceipt(input, choice, receipt)),
|
|
115
|
+
markUncertain: (input, choice, errorCode) => update(input, () => current.markUncertain(input, choice, errorCode))
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=conversation-runtime-route-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-runtime-route-store.js","sourceRoot":"","sources":["../../src/conversation-runtime-route-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type DesktopAsyncInteraction, type DesktopSnapshot, type DesktopTurn, type DesktopTurnItem } from "./desktop-types.js";
|
|
2
|
+
/** Match Desktop's accepted reply history; pending or rejected steering is not an answer. */
|
|
3
|
+
export declare function desktopAsyncQuestions(snapshot: Pick<DesktopSnapshot, "threadId" | "turns">, turnId?: string): DesktopAsyncInteraction[];
|
|
4
|
+
export declare function buildDesktopAsyncReply(interaction: DesktopAsyncInteraction, answer: string): string;
|
|
5
|
+
export interface DesktopAsyncAnswerEvidence {
|
|
6
|
+
turnId: string;
|
|
7
|
+
interaction: DesktopAsyncInteraction;
|
|
8
|
+
answer: string;
|
|
9
|
+
clientUserMessageId: string;
|
|
10
|
+
}
|
|
11
|
+
/** Native correlation proves receipt, including steering-to-canonical item materialization. */
|
|
12
|
+
export declare function findDesktopAsyncAnswer(snapshot: DesktopSnapshot, input: DesktopAsyncAnswerEvidence): {
|
|
13
|
+
turn: DesktopTurn;
|
|
14
|
+
item: DesktopTurnItem;
|
|
15
|
+
} | null;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { DesktopIpcError } from "./desktop-types.js";
|
|
3
|
+
const opening = "<send_user_message_question_reply>", closing = "</send_user_message_question_reply>";
|
|
4
|
+
function messageText(item, turnId) {
|
|
5
|
+
if (item.type === "steeringUserMessage" && (item.status !== "accepted" || item.targetTurnId !== turnId))
|
|
6
|
+
return;
|
|
7
|
+
if (item.type !== "steeringUserMessage" && item.type !== "userMessage")
|
|
8
|
+
return;
|
|
9
|
+
const content = item.type === "userMessage" ? item.content : item.input;
|
|
10
|
+
return content?.length === 1 && content[0].type === "text" ? content[0].text : undefined;
|
|
11
|
+
}
|
|
12
|
+
function replies(item, turnId) {
|
|
13
|
+
const text = messageText(item, turnId)?.trim();
|
|
14
|
+
if (!text?.startsWith(opening) || !text.endsWith(closing) || text.length > 1024 * 1024)
|
|
15
|
+
return [];
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(text.slice(opening.length, -closing.length));
|
|
18
|
+
const values = Array.isArray(parsed) ? parsed : [parsed];
|
|
19
|
+
if (values.length < 1 || values.length > 64)
|
|
20
|
+
return [];
|
|
21
|
+
return values.every((value) => Boolean(value && typeof value === "object"
|
|
22
|
+
&& !Array.isArray(value) && typeof value.questionItemId === "string"
|
|
23
|
+
&& typeof value.question === "string" && typeof value.answer === "string")) ? values : [];
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Match Desktop's accepted reply history; pending or rejected steering is not an answer. */
|
|
30
|
+
export function desktopAsyncQuestions(snapshot, turnId) {
|
|
31
|
+
return snapshot.turns.flatMap(turn => {
|
|
32
|
+
if (!turn.itemsComplete || turn.status !== "inProgress" || (turnId !== undefined && turn.turnId !== turnId))
|
|
33
|
+
return [];
|
|
34
|
+
const answered = new Set(turn.items.flatMap(item => replies(item, turn.turnId).map(reply => reply.questionItemId)));
|
|
35
|
+
return turn.items.flatMap(item => item.type === "agentMessage" && item.delivery === "async"
|
|
36
|
+
? (item.questions ?? []).flatMap((question, index) => {
|
|
37
|
+
const nativeId = JSON.stringify(["request_user_input_async", item.id, index]);
|
|
38
|
+
if (answered.has(nativeId) || answered.has(item.id))
|
|
39
|
+
return [];
|
|
40
|
+
const options = question.options ?? [];
|
|
41
|
+
const digest = createHash("sha256").update(JSON.stringify([
|
|
42
|
+
snapshot.threadId, turn.turnId, item.id, nativeId, question.title, options
|
|
43
|
+
])).digest("hex");
|
|
44
|
+
return [{ id: `desktop-async-interaction:${digest}`, kind: "async_question", threadId: snapshot.threadId,
|
|
45
|
+
turnId: turn.turnId, itemId: item.id, method: "request_user_input_async",
|
|
46
|
+
questions: [{ id: nativeId, title: question.title, options: [...options], isOther: true }] }];
|
|
47
|
+
}) : []);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function buildDesktopAsyncReply(interaction, answer) {
|
|
51
|
+
if (interaction.kind !== "async_question" || interaction.questions.length !== 1 || typeof answer !== "string"
|
|
52
|
+
|| !answer.trim() || answer.length > 16_384)
|
|
53
|
+
throw new DesktopIpcError("invalid_argument", "Invalid Desktop asynchronous answer");
|
|
54
|
+
const question = interaction.questions[0];
|
|
55
|
+
return `${opening}\n${JSON.stringify([{ questionItemId: question.id, question: question.title, answer }])}\n${closing}`;
|
|
56
|
+
}
|
|
57
|
+
function hasClientId(item, clientId) {
|
|
58
|
+
if (item.type === "userMessage")
|
|
59
|
+
return item.clientId === clientId;
|
|
60
|
+
return item.type === "steeringUserMessage" && item.clientUserMessageId === clientId
|
|
61
|
+
&& (item.serverClientUserMessageId == null || item.serverClientUserMessageId === clientId);
|
|
62
|
+
}
|
|
63
|
+
function sameReply(item, input) {
|
|
64
|
+
const matches = replies(item, input.turnId);
|
|
65
|
+
const question = input.interaction.questions[0];
|
|
66
|
+
return matches.length === 1 && matches[0].questionItemId === question.id
|
|
67
|
+
&& matches[0].question === question.title && matches[0].answer === input.answer;
|
|
68
|
+
}
|
|
69
|
+
/** Native correlation proves receipt, including steering-to-canonical item materialization. */
|
|
70
|
+
export function findDesktopAsyncAnswer(snapshot, input) {
|
|
71
|
+
if (snapshot.threadId !== input.interaction.threadId || input.turnId !== input.interaction.turnId)
|
|
72
|
+
return null;
|
|
73
|
+
const correlated = snapshot.turns.flatMap(turn => turn.items.filter(item => hasClientId(item, input.clientUserMessageId))
|
|
74
|
+
.map(item => ({ turn, item })));
|
|
75
|
+
if (!correlated.length || correlated.some(({ turn, item }) => turn.turnId !== input.turnId
|
|
76
|
+
|| !turn.itemsComplete || !sameReply(item, input)))
|
|
77
|
+
return null;
|
|
78
|
+
if (correlated.length === 1)
|
|
79
|
+
return correlated[0];
|
|
80
|
+
// Desktop can retain the accepted steering item alongside its canonical user message.
|
|
81
|
+
if (correlated.length !== 2)
|
|
82
|
+
return null;
|
|
83
|
+
const steering = correlated.find(({ item }) => item.type === "steeringUserMessage");
|
|
84
|
+
const canonical = correlated.find(({ item }) => item.type === "userMessage");
|
|
85
|
+
return steering && canonical && (steering.item.serverUserMessageId == null
|
|
86
|
+
|| steering.item.serverUserMessageId === canonical.item.id) ? canonical : null;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=desktop-async-interactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-async-interactions.js","sourceRoot":"","sources":["../../src/desktop-async-interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DesktopAsyncInteraction, DesktopThreadIdentity } from "./desktop-types.js";
|
|
2
|
+
export declare function desktopNonblank(value: unknown): value is string;
|
|
3
|
+
/** Persist native question identity, not a connection-local owner or a UI position. */
|
|
4
|
+
export declare function assertDesktopAsyncInteraction(value: unknown, target?: DesktopThreadIdentity, turnId?: string): asserts value is DesktopAsyncInteraction;
|
|
5
|
+
export declare function persistDesktopAsyncInteraction(interaction: DesktopAsyncInteraction): DesktopAsyncInteraction;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export function desktopNonblank(value) {
|
|
3
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
4
|
+
}
|
|
5
|
+
function assertAsyncIdentity(value) {
|
|
6
|
+
const interaction = value;
|
|
7
|
+
if (!interaction || interaction.kind !== "async_question" || interaction.method !== "request_user_input_async" ||
|
|
8
|
+
!desktopNonblank(interaction.id) || !desktopNonblank(interaction.threadId) || !desktopNonblank(interaction.turnId) ||
|
|
9
|
+
!desktopNonblank(interaction.itemId) || !Array.isArray(interaction.questions) || interaction.questions.length !== 1) {
|
|
10
|
+
throw new Error("Invalid Desktop async interaction");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function assertAsyncQuestion(interaction) {
|
|
14
|
+
const question = interaction.questions[0];
|
|
15
|
+
if (!question || !desktopNonblank(question.id) || !desktopNonblank(question.title) ||
|
|
16
|
+
question.isOther !== true || !Array.isArray(question.options) || question.options.some(option => !desktopNonblank(option))) {
|
|
17
|
+
throw new Error("Invalid Desktop async question");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assertNativeQuestionTuple(interaction) {
|
|
21
|
+
const question = interaction.questions[0];
|
|
22
|
+
let nativeId;
|
|
23
|
+
try {
|
|
24
|
+
nativeId = JSON.parse(question.id);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error("Invalid Desktop native question identity");
|
|
28
|
+
}
|
|
29
|
+
if (!Array.isArray(nativeId) || nativeId.length !== 3 || nativeId[0] !== "request_user_input_async" ||
|
|
30
|
+
nativeId[1] !== interaction.itemId || !Number.isSafeInteger(nativeId[2]) || nativeId[2] < 0 ||
|
|
31
|
+
JSON.stringify(nativeId) !== question.id)
|
|
32
|
+
throw new Error("Desktop native question identity does not match its item");
|
|
33
|
+
}
|
|
34
|
+
/** Persist native question identity, not a connection-local owner or a UI position. */
|
|
35
|
+
export function assertDesktopAsyncInteraction(value, target, turnId) {
|
|
36
|
+
assertAsyncIdentity(value);
|
|
37
|
+
const interaction = value;
|
|
38
|
+
if (target && interaction.threadId !== target.threadId || turnId && interaction.turnId !== turnId) {
|
|
39
|
+
throw new Error("Desktop async interaction belongs to a different native task");
|
|
40
|
+
}
|
|
41
|
+
assertAsyncQuestion(interaction);
|
|
42
|
+
assertNativeQuestionTuple(interaction);
|
|
43
|
+
const question = interaction.questions[0];
|
|
44
|
+
const hash = createHash("sha256").update(JSON.stringify([interaction.threadId, interaction.turnId, interaction.itemId,
|
|
45
|
+
question.id, question.title, question.options])).digest("hex");
|
|
46
|
+
if (interaction.id !== `desktop-async-interaction:${hash}`)
|
|
47
|
+
throw new Error("Desktop async interaction payload does not match its identity");
|
|
48
|
+
}
|
|
49
|
+
export function persistDesktopAsyncInteraction(interaction) {
|
|
50
|
+
assertDesktopAsyncInteraction(interaction);
|
|
51
|
+
return structuredClone(interaction);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=desktop-async-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-async-state.js","sourceRoot":"","sources":["../../src/desktop-async-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type DesktopRuntimeOptions } from "./desktop-runtime.js";
|
|
2
|
+
type Options = Record<string, unknown>;
|
|
3
|
+
export declare function desktopRuntimeOptions(options: Options): DesktopRuntimeOptions;
|
|
4
|
+
export declare function desktopListForCli(options: Options): Promise<Record<string, unknown>>;
|
|
5
|
+
/** Return false only for non-Desktop targets. Unsupported Desktop actions never fall through to terminals. */
|
|
6
|
+
export declare function dispatchDesktopCli(command: string | undefined, options: Options): Promise<boolean>;
|
|
7
|
+
export {};
|