@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,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 {};
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { assertBackendRecoveryCliTarget } from "./backend-recovery-semantic.js";
|
|
2
|
+
import { desktopObservationStopped } from "./desktop-task-recovery.js";
|
|
3
|
+
import { desktopControlForCli } from "./desktop-cli-controls.js";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
7
|
+
import { cliCwd, cliEnv, cliDependencies, writeCliStdout } from "./cli-runtime-context.js";
|
|
8
|
+
import { isDesktopConversationId, parseDesktopConversationId } from "./desktop-identity.js";
|
|
9
|
+
import { isDesktopWatchId } from "./desktop-semantic.js";
|
|
10
|
+
import { createDesktopRuntime, desktopWritesVerified } from "./desktop-runtime.js";
|
|
11
|
+
import { createTerminalWatchOpenClawCallbackRoute, parseCallbackRoute } from "./callback-transport.js";
|
|
12
|
+
import { desktopResponseId } from "./desktop-response-store.js";
|
|
13
|
+
import { desktopInteractionFingerprint, desktopInteractionIsApproval, desktopQuestionAnswer, desktopQuestionResponse } from "./desktop-interaction-projection.js";
|
|
14
|
+
import { desktopSessionProjection, desktopTaskProjection } from "./desktop-public-projection.js";
|
|
15
|
+
import { desktopTaskNeedsReconciliation } from "./desktop-task-service.js";
|
|
16
|
+
import { listDesktopSessions } from "./desktop-list.js";
|
|
17
|
+
import { launchDesktopMonitor, runDesktopMonitor } from "./desktop-monitor.js";
|
|
18
|
+
import { DesktopIpcError } from "./desktop-types.js";
|
|
19
|
+
const NATIVE_COMMANDS = ["desktop-list", "monitor-desktop", "reconcile-desktop-watches"];
|
|
20
|
+
const RECOVERY_COMMANDS = ["close", "renew", "recover", "retry-callback"];
|
|
21
|
+
const SUPPORTED_COMMANDS = [...NATIVE_COMMANDS, ...RECOVERY_COMMANDS, "send", "status", "watch-terminal", "watch-status", "unwatch-terminal", "respond-interaction", "approve", "native-inspect", "permission-options", "set-permissions", "model-options", "set-model", "cancel"];
|
|
22
|
+
const str = (value) => typeof value === "string" && value.trim() ? value : undefined;
|
|
23
|
+
const required = (value, label) => {
|
|
24
|
+
const result = str(value);
|
|
25
|
+
if (!result)
|
|
26
|
+
throw new Error(`Desktop ${label} is required`);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
const output = (value) => writeCliStdout(JSON.stringify(value, null, 2) + "\n");
|
|
30
|
+
export function desktopRuntimeOptions(options) {
|
|
31
|
+
const env = cliEnv();
|
|
32
|
+
const home = env.HOME ?? os.homedir();
|
|
33
|
+
const resolve = (value) => path.resolve(cliCwd(), value.startsWith("~/") ? path.join(home, value.slice(2)) : value);
|
|
34
|
+
let homes = [path.join(home, ".codex"), ...(str(options.codexHome) ? [str(options.codexHome)] : env.CODEX_HOME ? [env.CODEX_HOME] : [])];
|
|
35
|
+
if (env.AKK_DESKTOP_CODEX_HOMES) {
|
|
36
|
+
const saved = JSON.parse(env.AKK_DESKTOP_CODEX_HOMES);
|
|
37
|
+
if (!Array.isArray(saved) || !saved.length || saved.some(item => typeof item !== "string" || !path.isAbsolute(item))) {
|
|
38
|
+
throw new Error("Invalid configured Desktop homes");
|
|
39
|
+
}
|
|
40
|
+
homes = saved;
|
|
41
|
+
}
|
|
42
|
+
return { storeDir: resolve(str(options.storeDir ?? options.logDir) ?? path.join(home, ".agent-knock-knock", "store")),
|
|
43
|
+
codexHomes: [...new Set(homes.map(resolve))], openclawBin: str(options.openclawBin) };
|
|
44
|
+
}
|
|
45
|
+
export async function desktopListForCli(options) {
|
|
46
|
+
if (options.agent && options.agent !== "codex")
|
|
47
|
+
return { desktop_sessions: [], desktop_watches: [], desktop_scan: { status: "filtered" } };
|
|
48
|
+
const runtime = (cliDependencies().createDesktopRuntime ?? createDesktopRuntime)(desktopRuntimeOptions(options));
|
|
49
|
+
try {
|
|
50
|
+
return await listDesktopSessions(runtime, options);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await runtime.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function reconcileDesktopWatches(runtime) {
|
|
57
|
+
const before = new Map();
|
|
58
|
+
try {
|
|
59
|
+
for (const task of runtime.tasks.list())
|
|
60
|
+
before.set(task.id, task);
|
|
61
|
+
}
|
|
62
|
+
catch { /* reconcileAll isolates damaged records */ }
|
|
63
|
+
const result = await runtime.tasks.reconcileAll();
|
|
64
|
+
const callbacksDelivered = result.tasks.reduce((count, task) => count + task.notifications.filter(note => note.status === "accepted" && !before.get(task.id)?.notifications.some(old => old.id === note.id && old.status === "accepted")).length, 0);
|
|
65
|
+
output({
|
|
66
|
+
checked: result.tasks.length + result.errors.length,
|
|
67
|
+
changed: result.tasks.filter(task => task.status !== before.get(task.id)?.status).length,
|
|
68
|
+
callbacks_delivered: callbacksDelivered,
|
|
69
|
+
errors: result.errors.length,
|
|
70
|
+
diagnostics: result.errors
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async function inspectOrStopDesktopWatch(runtime, command, options, watch, target) {
|
|
74
|
+
if (target || options.turn && (options.watch !== undefined || options.turn !== watch))
|
|
75
|
+
throw new Error("Desktop Watch accepts exactly one target");
|
|
76
|
+
const task = runtime.tasks.status(watch);
|
|
77
|
+
const controller = str(options.openclawSession);
|
|
78
|
+
if (controller && controller !== task.controller_session)
|
|
79
|
+
throw new Error("Desktop Watch belongs to a different controller");
|
|
80
|
+
if (command === "cancel") {
|
|
81
|
+
if (desktopObservationStopped(task))
|
|
82
|
+
throw new Error("Desktop Watch observation has stopped");
|
|
83
|
+
if (!task.native_turn_id)
|
|
84
|
+
throw new Error("Desktop Watch has no exact native task to interrupt");
|
|
85
|
+
required(controller, "controller session");
|
|
86
|
+
const result = await desktopControlForCli(runtime, command, { ...options, expectedNativeTurnId: task.native_turn_id }, { id: task.desktop_id, identity: task.target }, watch);
|
|
87
|
+
output(result);
|
|
88
|
+
}
|
|
89
|
+
else if (command === "unwatch-terminal") {
|
|
90
|
+
output(desktopTaskProjection(runtime.tasks.unwatch(watch, { controllerSession: required(controller, "controller session") })));
|
|
91
|
+
}
|
|
92
|
+
else if (command === "watch-status" || command === "status") {
|
|
93
|
+
const current = await runtime.tasks.reconcile(watch);
|
|
94
|
+
output({ ...desktopTaskProjection(current, desktopWritesVerified(runtime.compatibility)),
|
|
95
|
+
response_state: await desktopResponseStates(runtime, current.desktop_id, current.native_turn_id, controller) });
|
|
96
|
+
}
|
|
97
|
+
else
|
|
98
|
+
throw new Error("Desktop Watch ID is only valid for status or unwatch");
|
|
99
|
+
}
|
|
100
|
+
async function getDesktopConversation(runtime, options, target) {
|
|
101
|
+
const id = required(target, "conversation ID");
|
|
102
|
+
const identity = parseDesktopConversationId(id);
|
|
103
|
+
if (["conversation", "conversationId", "session", "terminal"].filter(key => options[key] !== undefined).length !== 1 || options.turn) {
|
|
104
|
+
throw new Error("Desktop command accepts exactly one conversation target");
|
|
105
|
+
}
|
|
106
|
+
const entry = await runtime.catalog.get(identity);
|
|
107
|
+
if (!entry)
|
|
108
|
+
throw new Error("Desktop conversation is absent from the configured local catalog; refresh List");
|
|
109
|
+
return { id, identity, entry };
|
|
110
|
+
}
|
|
111
|
+
function latestTurnProjection(turn) {
|
|
112
|
+
if (!turn)
|
|
113
|
+
return null;
|
|
114
|
+
const text = turn.items.filter(item => item.type === "agentMessage" &&
|
|
115
|
+
item.phase !== "analysis" && item.phase !== "commentary" && item.delivery !== "async").map(item => item.text ?? "").join("\n\n");
|
|
116
|
+
const isFinal = turn.itemsComplete && ["completed", "failed", "interrupted"].includes(turn.status);
|
|
117
|
+
return { id: turn.turnId, status: turn.status, items_complete: turn.itemsComplete,
|
|
118
|
+
...(isFinal ? { final_text: text } : { response_text: text }) };
|
|
119
|
+
}
|
|
120
|
+
async function inspectDesktopConversation(runtime, { identity, entry }, options) {
|
|
121
|
+
try {
|
|
122
|
+
const snapshot = await runtime.transport.observe(identity);
|
|
123
|
+
const current = snapshot.turns.find(turn => turn.turnId === snapshot.latestTurnId);
|
|
124
|
+
output({ ...desktopSessionProjection(entry, snapshot, desktopWritesVerified(runtime.compatibility)),
|
|
125
|
+
source: "codex_desktop", latest_turn: latestTurnProjection(current),
|
|
126
|
+
response_state: await desktopResponseStates(runtime, entry.conversationId, snapshot.latestTurnId ?? undefined, str(options.openclawSession)) });
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
output(desktopSessionProjection(entry, undefined, false, error instanceof DesktopIpcError ? error.code : "live_owner_not_confirmed"));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function sendOrWatchDesktopTask(runtime, command, options, config, { id, identity }) {
|
|
133
|
+
const controllerSession = required(options.openclawSession, "controller session");
|
|
134
|
+
const route = options.callbackRoute ? parseCallbackRoute(options.callbackRoute)
|
|
135
|
+
: createTerminalWatchOpenClawCallbackRoute({ controllerSessionId: controllerSession, openclawBin: config.openclawBin });
|
|
136
|
+
const timeout = Number(options.hardTimeoutMinutes ?? options.agentHardTimeoutMinutes ?? 60) * 60_000;
|
|
137
|
+
const input = { target: identity, desktopId: id, controllerSession, timeoutMs: timeout,
|
|
138
|
+
callbackRoute: { ...route, capabilities: { wake: true, respond: false } } };
|
|
139
|
+
const task = command === "send" ? await runtime.tasks.send({ ...input,
|
|
140
|
+
text: required(options.message ?? options.request, "message"), messageId: str(options.messageId) ?? randomUUID() })
|
|
141
|
+
: await runtime.tasks.watch(input);
|
|
142
|
+
const result = desktopTaskProjection(task, desktopWritesVerified(runtime.compatibility));
|
|
143
|
+
if (desktopTaskNeedsReconciliation(task)) {
|
|
144
|
+
try {
|
|
145
|
+
result.monitor_pid = await (cliDependencies().launchDesktopMonitor ?? launchDesktopMonitor)(task.id, config);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
result.monitor_error = "desktop_monitor_launch_failed";
|
|
149
|
+
result.callback_expected = false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
output(result);
|
|
153
|
+
}
|
|
154
|
+
function desktopCliTarget(command, options) {
|
|
155
|
+
const target = str(options.conversation ?? options.conversationId ?? options.session ?? options.terminal);
|
|
156
|
+
const recovery = RECOVERY_COMMANDS.includes(command ?? "");
|
|
157
|
+
if (recovery)
|
|
158
|
+
assertBackendRecoveryCliTarget(command, options);
|
|
159
|
+
const turn = str(options.turn);
|
|
160
|
+
const taskAlias = recovery || command === "status" || command === "watch-status";
|
|
161
|
+
const watch = str(options.watch) ?? (taskAlias && turn?.startsWith("desktop-watch:") ? turn : undefined);
|
|
162
|
+
if (!isDesktopConversationId(target) && !watch?.startsWith("desktop-watch:") && !NATIVE_COMMANDS.includes(command ?? ""))
|
|
163
|
+
return undefined;
|
|
164
|
+
return { target, watch, recovery };
|
|
165
|
+
}
|
|
166
|
+
/** Return false only for non-Desktop targets. Unsupported Desktop actions never fall through to terminals. */
|
|
167
|
+
export async function dispatchDesktopCli(command, options) {
|
|
168
|
+
const resolved = desktopCliTarget(command, options);
|
|
169
|
+
if (!resolved)
|
|
170
|
+
return false;
|
|
171
|
+
const { target, watch, recovery } = resolved;
|
|
172
|
+
if (!SUPPORTED_COMMANDS.includes(command ?? "")) {
|
|
173
|
+
throw new Error("Desktop supports List, Send, Status, Watch, typed interactions, current-thread settings and exact task cancellation; new/resume are unsupported.");
|
|
174
|
+
}
|
|
175
|
+
if (command === "desktop-list") {
|
|
176
|
+
output(await desktopListForCli(options));
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
const config = desktopRuntimeOptions(options);
|
|
180
|
+
if (command === "monitor-desktop") {
|
|
181
|
+
await runDesktopMonitor(required(watch, "Watch ID"), config);
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
const runtime = (cliDependencies().createDesktopRuntime ?? createDesktopRuntime)(config);
|
|
185
|
+
try {
|
|
186
|
+
if (recovery) {
|
|
187
|
+
await recoverDesktopTaskForCli(runtime, command, options, config, watch);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
if (command === "reconcile-desktop-watches") {
|
|
191
|
+
await reconcileDesktopWatches(runtime);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
if (command === "respond-interaction" || command === "approve") {
|
|
195
|
+
await respondToDesktopInteraction(runtime, options, target, watch, command);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
if (watch) {
|
|
199
|
+
await inspectOrStopDesktopWatch(runtime, command, options, watch, target);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
await dispatchDesktopConversation(runtime, command, options, config, await getDesktopConversation(runtime, options, target));
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
await runtime.close();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Once the exact conversation is resolved, route its read, setting, or task operation. */
|
|
210
|
+
async function dispatchDesktopConversation(runtime, command, options, config, conversation) {
|
|
211
|
+
if (command === "status" || command === "native-inspect" && (options.action ?? options.inspection) === "status") {
|
|
212
|
+
await inspectDesktopConversation(runtime, conversation, options);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const control = await desktopControlForCli(runtime, command, options, conversation);
|
|
216
|
+
if (control) {
|
|
217
|
+
output(control);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (command !== "send" && command !== "watch-terminal")
|
|
221
|
+
throw new Error("Unsupported Desktop command or inspection");
|
|
222
|
+
await sendOrWatchDesktopTask(runtime, command, options, config, conversation);
|
|
223
|
+
}
|
|
224
|
+
async function desktopResponseSubject(runtime, options, target, watch, controllerSession) {
|
|
225
|
+
if (!watch)
|
|
226
|
+
return getDesktopConversation(runtime, options, target);
|
|
227
|
+
if (["conversation", "conversationId", "session", "terminal", "turn"].some(key => options[key] !== undefined)) {
|
|
228
|
+
throw new Error("Desktop response accepts exactly one target");
|
|
229
|
+
}
|
|
230
|
+
const task = runtime.tasks.status(watch);
|
|
231
|
+
if (task.controller_session !== controllerSession)
|
|
232
|
+
throw new Error("Desktop Watch belongs to a different controller");
|
|
233
|
+
if (desktopObservationStopped(task))
|
|
234
|
+
throw new Error("Desktop Watch observation has stopped");
|
|
235
|
+
return { id: task.desktop_id, identity: task.target };
|
|
236
|
+
}
|
|
237
|
+
function desktopResponseFingerprint(interaction, options) {
|
|
238
|
+
const fingerprint = options.expectedInteractionFingerprint;
|
|
239
|
+
const expiresAt = options.expectedInteractionExpiresAt;
|
|
240
|
+
if (fingerprint === undefined && expiresAt === undefined)
|
|
241
|
+
return;
|
|
242
|
+
if (typeof fingerprint !== "string" || fingerprint !== desktopInteractionFingerprint(interaction)
|
|
243
|
+
|| typeof expiresAt !== "string" || !Number.isFinite(Date.parse(expiresAt)))
|
|
244
|
+
throw new Error("Desktop question changed; refresh Status before answering");
|
|
245
|
+
// Expiry triggers live revalidation by the response service, not refusal of the same pending question.
|
|
246
|
+
}
|
|
247
|
+
async function respondToDesktopInteraction(runtime, options, target, watch, command) {
|
|
248
|
+
const controllerSession = required(options.openclawSession, "controller session");
|
|
249
|
+
const subject = await desktopResponseSubject(runtime, options, target, watch, controllerSession);
|
|
250
|
+
const interactionId = required(options.interaction, "interaction ID");
|
|
251
|
+
const previous = runtime.responses.list().find(record => record.id === desktopResponseId(subject.identity, interactionId));
|
|
252
|
+
if (previous && previous.controller_session !== controllerSession)
|
|
253
|
+
throw new Error("Desktop response belongs to a different controller");
|
|
254
|
+
const snapshot = previous && previous.state !== "not_sent" ? undefined : await runtime.transport.observe(subject.identity);
|
|
255
|
+
const freshInteraction = (snapshot?.pendingInteractions ?? snapshot?.asyncQuestions)?.find(item => item.id === interactionId);
|
|
256
|
+
const interaction = previous?.state === "not_sent" ? freshInteraction : previous?.interaction ?? freshInteraction;
|
|
257
|
+
if (!interaction)
|
|
258
|
+
throw new Error("Desktop interaction is no longer pending; refresh Status");
|
|
259
|
+
desktopResponseFingerprint(interaction, options);
|
|
260
|
+
const response = desktopTypedResponse(interaction, command, options);
|
|
261
|
+
const responseId = str(options.responseId) ?? previous?.response_id ?? createHash("sha256").update(JSON.stringify([controllerSession, subject.id, interactionId, response])).digest("hex");
|
|
262
|
+
const input = { controllerSession, interactionId, responseId, ...response };
|
|
263
|
+
const record = watch ? await runtime.responses.respondWatch(watch, input)
|
|
264
|
+
: await runtime.responses.respond({ ...input, desktopId: subject.id, target: subject.identity });
|
|
265
|
+
output({ source: "codex_desktop", conversation_id: subject.id, ...(watch ? { watch_id: watch } : {}),
|
|
266
|
+
native_thread_id: subject.identity.threadId, ...desktopResponseProjection(record) });
|
|
267
|
+
}
|
|
268
|
+
function desktopTypedResponse(interaction, command, options) {
|
|
269
|
+
if (command === "approve") {
|
|
270
|
+
if (!desktopInteractionIsApproval(interaction))
|
|
271
|
+
throw new Error("Desktop interaction is not an approval");
|
|
272
|
+
const decision = options.decision ?? "approve_once";
|
|
273
|
+
if (decision !== "approve_once" && decision !== "reject")
|
|
274
|
+
throw new Error("decision must be approve_once or reject");
|
|
275
|
+
return { response: { decision: decision === "approve_once" ? "accept" : "decline" } };
|
|
276
|
+
}
|
|
277
|
+
const value = JSON.parse(required(options.responseJson, "typed response JSON"));
|
|
278
|
+
return interaction.kind === "async_question" ? { answer: desktopQuestionAnswer(interaction, value) }
|
|
279
|
+
: { response: desktopQuestionResponse(interaction, value) };
|
|
280
|
+
}
|
|
281
|
+
function desktopResponseProjection(record) {
|
|
282
|
+
return { interaction_id: record.interaction.id, response_id: record.id, state: record.state, evidence: record.evidence,
|
|
283
|
+
native_turn_id: record.interaction.turnId, attempts: record.attempts,
|
|
284
|
+
not_sent_history: record.not_sent_history, error_code: record.error_code, resend_allowed: record.state === "not_sent" };
|
|
285
|
+
}
|
|
286
|
+
/** Status recovers response evidence without re-dispatching an answer that may already have arrived. */
|
|
287
|
+
async function desktopResponseStates(runtime, desktopId, turnId, controller) {
|
|
288
|
+
if (!turnId)
|
|
289
|
+
return [];
|
|
290
|
+
const records = runtime.responses.list().filter(record => record.desktop_id === desktopId
|
|
291
|
+
&& record.interaction.turnId === turnId && (!controller || record.controller_session === controller));
|
|
292
|
+
const projections = [];
|
|
293
|
+
for (const record of records) {
|
|
294
|
+
const current = ["sent", "uncertain"].includes(record.state) ? await runtime.responses.reconcile(record.id) : record;
|
|
295
|
+
projections.push(desktopResponseProjection(current));
|
|
296
|
+
}
|
|
297
|
+
return projections;
|
|
298
|
+
}
|
|
299
|
+
/** Recovery has an exact persisted task address, never a catalog or latest-turn selector. */
|
|
300
|
+
async function recoverDesktopTaskForCli(runtime, command, options, config, id) {
|
|
301
|
+
if (!isDesktopWatchId(id) || ["watch", "turn", "conversation", "conversationId", "session", "terminal"]
|
|
302
|
+
.filter(key => options[key] !== undefined).length !== 1)
|
|
303
|
+
throw new Error("Desktop recovery accepts exactly one --watch or --turn Desktop Watch ID");
|
|
304
|
+
const controllerSession = required(options.openclawSession, "controller session");
|
|
305
|
+
const minutes = options.minutes ?? options.hardTimeoutMinutes ?? options.agentHardTimeoutMinutes;
|
|
306
|
+
const task = command === "close" ? runtime.tasks.close(id, { controllerSession, reason: str(options.reason) })
|
|
307
|
+
: command === "renew" ? await runtime.tasks.renew(id, { controllerSession, ...(minutes === undefined ? {} : { timeoutMs: Number(minutes) * 60_000 }) })
|
|
308
|
+
: command === "recover" ? await runtime.tasks.recover(id, { controllerSession })
|
|
309
|
+
: await runtime.tasks.retryCallback(id, { controllerSession, notificationId: str(options.notificationId) });
|
|
310
|
+
const result = desktopTaskProjection(task, desktopWritesVerified(runtime.compatibility));
|
|
311
|
+
if (["renew", "recover", "retry-callback"].includes(command) && desktopTaskNeedsReconciliation(task)) {
|
|
312
|
+
try {
|
|
313
|
+
result.monitor_pid = await (cliDependencies().launchDesktopMonitor ?? launchDesktopMonitor)(task.id, config);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
result.monitor_error = "desktop_monitor_launch_failed";
|
|
317
|
+
result.callback_expected = false;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
output(result);
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=desktop-cli-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-cli-adapter.js","sourceRoot":"","sources":["../../src/desktop-cli-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DesktopRuntime } from "./desktop-runtime.js";
|
|
2
|
+
import type { DesktopThreadIdentity } from "./desktop-types.js";
|
|
3
|
+
type Options = Record<string, unknown>;
|
|
4
|
+
/** Typed controls operate on the original Desktop owner; they never launch or resume a CLI. */
|
|
5
|
+
export declare function desktopControlForCli(runtime: DesktopRuntime, command: string, options: Options, subject: {
|
|
6
|
+
id: string;
|
|
7
|
+
identity: DesktopThreadIdentity;
|
|
8
|
+
}, watchId?: string): Promise<Record<string, unknown> | undefined>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const required = (value, label) => {
|
|
2
|
+
if (typeof value !== "string" || !value.trim())
|
|
3
|
+
throw new Error(`Desktop ${label} is required`);
|
|
4
|
+
return value;
|
|
5
|
+
};
|
|
6
|
+
/** Typed controls operate on the original Desktop owner; they never launch or resume a CLI. */
|
|
7
|
+
export async function desktopControlForCli(runtime, command, options, subject, watchId) {
|
|
8
|
+
let result;
|
|
9
|
+
if (command === "permission-options" || command === "native-inspect" && options.action === "permissions") {
|
|
10
|
+
result = await runtime.controls.permissionOptions(subject.identity);
|
|
11
|
+
}
|
|
12
|
+
else if (command === "set-permissions") {
|
|
13
|
+
const mode = required(options.mode, "permission mode");
|
|
14
|
+
if (mode !== "read-only" && mode !== "default" && mode !== "full-access")
|
|
15
|
+
throw new Error("Invalid Desktop permission mode");
|
|
16
|
+
result = await runtime.controls.setPermissions(subject.identity, mode);
|
|
17
|
+
}
|
|
18
|
+
else if (command === "model-options") {
|
|
19
|
+
result = await runtime.controls.modelOptions(subject.identity);
|
|
20
|
+
}
|
|
21
|
+
else if (command === "set-model") {
|
|
22
|
+
result = await runtime.controls.setModel(subject.identity, { model: required(options.model, "model"),
|
|
23
|
+
reasoningEffort: required(options.reasoningEffort, "reasoning effort"),
|
|
24
|
+
...(options.collaborationMode === undefined ? {} : { collaborationMode: desktopMode(options.collaborationMode) }) });
|
|
25
|
+
}
|
|
26
|
+
else if (command === "cancel") {
|
|
27
|
+
result = await runtime.controls.interrupt(subject.identity, required(options.expectedNativeTurnId, "expected native turn ID"));
|
|
28
|
+
if (watchId)
|
|
29
|
+
await runtime.tasks.reconcile(watchId);
|
|
30
|
+
}
|
|
31
|
+
else
|
|
32
|
+
return undefined;
|
|
33
|
+
const input = { conversation_id: subject.id };
|
|
34
|
+
const available_actions = command === "permission-options" || command === "native-inspect" && options.action === "permissions"
|
|
35
|
+
? { set_permissions: { tool: "agent_knock_knock_set_permissions", input } }
|
|
36
|
+
: command === "model-options" ? { set_model: { tool: "agent_knock_knock_set_model", input } } : undefined;
|
|
37
|
+
return { ...result, ...(available_actions ? { available_actions } : {}), source: "codex_desktop", conversation_id: subject.id, native_thread_id: subject.identity.threadId,
|
|
38
|
+
...(watchId ? { watch_id: watchId } : {}) };
|
|
39
|
+
}
|
|
40
|
+
function desktopMode(value) {
|
|
41
|
+
if (value !== "plan" && value !== "default")
|
|
42
|
+
throw new Error("Desktop collaboration_mode must be plan or default");
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=desktop-cli-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-cli-controls.js","sourceRoot":"","sources":["../../src/desktop-cli-controls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isRecord, nonBlankString } from "./value-guards.js";
|
|
2
|
+
/** Desktop commands have native task identities, never fabricated managed Session or Turn ids. */
|
|
3
|
+
export function formatDesktopCommandResult(result, action) {
|
|
4
|
+
const state = nonBlankString(result.state) ?? nonBlankString(result.status) ?? nonBlankString(result.outcome) ?? nonBlankString(result.activity_state) ?? "unknown";
|
|
5
|
+
return [`AKK Desktop ${action}: ${state}`,
|
|
6
|
+
`conversation: ${nonBlankString(result.conversation_id) ?? "unknown"}`,
|
|
7
|
+
...optionalLine(result, "watch_id", "watch"), ...optionalLine(result, "native_turn_id", "native task"),
|
|
8
|
+
...modelLines(result), ...effectLines(result, state), ...optionalLine(result, "final_text", "result")].join("\n");
|
|
9
|
+
}
|
|
10
|
+
function optionalLine(result, field, label) {
|
|
11
|
+
const value = nonBlankString(result[field]);
|
|
12
|
+
return value ? [`${label}: ${value}`] : [];
|
|
13
|
+
}
|
|
14
|
+
function modelLines(result) {
|
|
15
|
+
if (result.catalog_available !== false)
|
|
16
|
+
return [];
|
|
17
|
+
const current = isRecord(result.current) ? result.current : {};
|
|
18
|
+
return ["The Desktop owner exposes current settings, not an available model catalog.",
|
|
19
|
+
`current model: ${nonBlankString(current.model) ?? "unknown"}`,
|
|
20
|
+
`current reasoning: ${nonBlankString(current.reasoning_effort) ?? "unknown"}`,
|
|
21
|
+
`current collaboration mode: ${nonBlankString(current.collaboration_mode) ?? "unknown"}`,
|
|
22
|
+
"Use only a model/effort explicitly requested by the user."];
|
|
23
|
+
}
|
|
24
|
+
function effectLines(result, state) {
|
|
25
|
+
const effective = isRecord(result.effective) ? result.effective : {};
|
|
26
|
+
return [...(Object.keys(effective).length ? [`verified effective settings: ${JSON.stringify(effective)}`] : []),
|
|
27
|
+
...optionalLine(result, "evidence", "evidence"),
|
|
28
|
+
...(result.do_not_retry === true || state === "uncertain" ? ["The native effect is unconfirmed. Refresh Status; do not retry automatically."] : []),
|
|
29
|
+
...(state === "sent" ? ["The response was dispatched; native acceptance has not yet been confirmed."] : [])];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=desktop-command-presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-command-presentation.js","sourceRoot":"","sources":["../../src/desktop-command-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE7D,kGAAkG;AAClG,MAAM,UAAU,0BAA0B,CAAC,MAA+B,EAAE,MAAc;IACxF,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IACpK,OAAO,CAAC,eAAe,MAAM,KAAK,KAAK,EAAE;QACvC,iBAAiB,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,SAAS,EAAE;QACtE,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,CAAC;QACtG,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtH,CAAC;AACD,SAAS,YAAY,CAAC,MAA+B,EAAE,KAAa,EAAE,KAAa;IACjF,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AACD,SAAS,UAAU,CAAC,MAA+B;IACjD,IAAI,MAAM,CAAC,iBAAiB,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO,CAAC,6EAA6E;QACnF,kBAAkB,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE;QAC9D,sBAAsB,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,SAAS,EAAE;QAC7E,+BAA+B,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,SAAS,EAAE;QACxF,2DAA2D,CAAC,CAAC;AACjE,CAAC;AACD,SAAS,WAAW,CAAC,MAA+B,EAAE,KAAa;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7G,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,+EAA+E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnJ,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,4EAA4E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type Params = Record<string, unknown>;
|
|
2
|
+
type Context = {
|
|
3
|
+
sessionKey?: unknown;
|
|
4
|
+
};
|
|
5
|
+
export declare function desktopConversationTarget(params: Params): string | undefined;
|
|
6
|
+
export declare function desktopControlToolArgs(params: Params, config: Params, context: Context, action: "status" | "permissions" | "set-permissions" | "model-options" | "set-model"): string[] | undefined;
|
|
7
|
+
export declare function desktopCancelToolArgs(params: Params, config: Params, context: Context): string[] | undefined;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isDesktopConversationId, parseDesktopConversationId } from "./desktop-identity.js";
|
|
2
|
+
import { isDesktopWatchId } from "./desktop-semantic.js";
|
|
3
|
+
import { pushOptional, requiredString, requiredTerminalInteractionIdentifier } from "./semantic-tool-arguments.js";
|
|
4
|
+
import { resolvePluginStoreDir } from "./semantic-tool-command-helpers.js";
|
|
5
|
+
export function desktopConversationTarget(params) {
|
|
6
|
+
if (!isDesktopConversationId(params.conversation_id))
|
|
7
|
+
return undefined;
|
|
8
|
+
const id = String(params.conversation_id);
|
|
9
|
+
parseDesktopConversationId(id);
|
|
10
|
+
if (["terminal_id", "session_id", "turn_id", "watch_id"].some(key => Object.hasOwn(params, key))) {
|
|
11
|
+
throw new Error("Desktop conversation_id cannot be combined with another target");
|
|
12
|
+
}
|
|
13
|
+
return id;
|
|
14
|
+
}
|
|
15
|
+
function scoped(command, id, config, context, watch = false) {
|
|
16
|
+
const args = [command, watch ? "--watch" : "--conversation", id,
|
|
17
|
+
"--openclaw-session", requiredString(context.sessionKey, "controller session")];
|
|
18
|
+
pushOptional(args, "--store-dir", resolvePluginStoreDir(config));
|
|
19
|
+
pushOptional(args, "--codex-home", config.codexHome);
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
function only(params, allowed) {
|
|
23
|
+
if (Object.keys(params).some(key => !allowed.includes(key)))
|
|
24
|
+
throw new Error("Unexpected Desktop control parameters");
|
|
25
|
+
}
|
|
26
|
+
export function desktopControlToolArgs(params, config, context, action) {
|
|
27
|
+
const id = desktopConversationTarget(params);
|
|
28
|
+
if (!id)
|
|
29
|
+
return undefined;
|
|
30
|
+
const fields = action === "set-model" ? ["model", "reasoning_effort", "collaboration_mode"]
|
|
31
|
+
: action === "set-permissions" ? ["mode"] : action === "status" ? ["inspection"] : [];
|
|
32
|
+
only(params, ["conversation_id", ...fields]);
|
|
33
|
+
const args = scoped(action === "status" ? "native-inspect" : action === "permissions" ? "permission-options" : action, id, config, context);
|
|
34
|
+
if (action === "status")
|
|
35
|
+
args.push("--action", "status");
|
|
36
|
+
if (action === "set-permissions") {
|
|
37
|
+
if (!["read-only", "default", "full-access"].includes(String(params.mode)))
|
|
38
|
+
throw new Error("mode must be read-only, default, or full-access");
|
|
39
|
+
args.push("--mode", String(params.mode));
|
|
40
|
+
}
|
|
41
|
+
if (action === "set-model")
|
|
42
|
+
appendModel(args, params);
|
|
43
|
+
return args;
|
|
44
|
+
}
|
|
45
|
+
function appendModel(args, params) {
|
|
46
|
+
const model = requiredString(params.model, "model"), effort = requiredString(params.reasoning_effort, "reasoning_effort");
|
|
47
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._:/+\-]{0,159}$/u.test(model) || !/^[a-z][a-z0-9_-]{0,63}$/u.test(effort))
|
|
48
|
+
throw new Error("Invalid Desktop model/effort tuple");
|
|
49
|
+
args.push("--model", model, "--reasoning-effort", effort);
|
|
50
|
+
if (params.collaboration_mode !== undefined) {
|
|
51
|
+
if (params.collaboration_mode !== "plan" && params.collaboration_mode !== "default")
|
|
52
|
+
throw new Error("Desktop collaboration_mode must be plan or default");
|
|
53
|
+
args.push("--collaboration-mode", params.collaboration_mode);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function desktopCancelToolArgs(params, config, context) {
|
|
57
|
+
const id = desktopConversationTarget(params);
|
|
58
|
+
if (id) {
|
|
59
|
+
only(params, ["conversation_id", "expected_native_turn_id"]);
|
|
60
|
+
return [...scoped("cancel", id, config, context), "--expected-native-turn-id",
|
|
61
|
+
requiredTerminalInteractionIdentifier(params.expected_native_turn_id, "expected_native_turn_id")];
|
|
62
|
+
}
|
|
63
|
+
if (!isDesktopWatchId(params.watch_id))
|
|
64
|
+
return undefined;
|
|
65
|
+
only(params, ["watch_id"]);
|
|
66
|
+
return scoped("cancel", params.watch_id, config, context, true);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=desktop-control-semantic.js.map
|