@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,113 @@
|
|
|
1
|
+
import { resolveMonitorHardTimeoutMinutes } from "./monitor-deadline-policy.js";
|
|
2
|
+
import { pushOptional, requiredControllerSessionKey, requiredString } from "./semantic-tool-arguments.js";
|
|
3
|
+
import { isRecord, nonBlankString } from "./value-guards.js";
|
|
4
|
+
const commands = new Set(["renew", "close", "recover", "retry-callback"]);
|
|
5
|
+
const backendIdentity = /^(?:desktop|codex-cli):/u;
|
|
6
|
+
const backendWatchPrefix = /^(?:desktop-watch|codex-cli-watch):/u;
|
|
7
|
+
const backendWatch = /^(?:desktop-watch|codex-cli-watch):[A-Za-z0-9_-]{8,128}$/u;
|
|
8
|
+
export function isBackendTaskWatchId(value) {
|
|
9
|
+
return typeof value === "string" && backendWatch.test(value);
|
|
10
|
+
}
|
|
11
|
+
export function normalizeBackendStatusTarget(params) {
|
|
12
|
+
if (typeof params.turn_id !== "string" || !backendWatchPrefix.test(params.turn_id.trim()))
|
|
13
|
+
return params;
|
|
14
|
+
if (Object.hasOwn(params, "watch_id") || Object.hasOwn(params, "conversation_id"))
|
|
15
|
+
throw new Error("status accepts exactly one of turn_id, conversation_id, or watch_id");
|
|
16
|
+
if (!backendWatch.test(params.turn_id))
|
|
17
|
+
throw new Error("status requires an exact backend Watch ID");
|
|
18
|
+
const { turn_id, ...rest } = params;
|
|
19
|
+
return { ...rest, watch_id: turn_id };
|
|
20
|
+
}
|
|
21
|
+
/** Backend maintenance is anchored to one persisted task, never the thread's current task. */
|
|
22
|
+
export function backendRecoveryTarget(params, command) {
|
|
23
|
+
const targets = ["watch_id", "turn_id", "conversation_id"].filter(key => Object.hasOwn(params, key));
|
|
24
|
+
if (targets.length !== 1)
|
|
25
|
+
throw new Error(`${command} accepts exactly one of watch_id, turn_id or conversation_id`);
|
|
26
|
+
const field = targets[0];
|
|
27
|
+
const id = requiredString(params[field], field);
|
|
28
|
+
if (backendIdentity.test(id.trim()) || field === "conversation_id" && backendWatchPrefix.test(id.trim())) {
|
|
29
|
+
throw new Error(`${command} requires the exact backend watch_id or send-produced turn_id; conversation_id cannot select a backend task`);
|
|
30
|
+
}
|
|
31
|
+
if (backendWatchPrefix.test(id.trim()) || field === "watch_id" || command === "recover") {
|
|
32
|
+
if (!backendWatch.test(id))
|
|
33
|
+
throw new Error(`${command} requires an exact backend Watch ID`);
|
|
34
|
+
return id;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
export function backendRecoveryToolArgs(command, params, context, options = {}) {
|
|
39
|
+
const id = backendRecoveryTarget(params, command);
|
|
40
|
+
if (!id) {
|
|
41
|
+
if (Object.hasOwn(params, "notification_id"))
|
|
42
|
+
throw new Error("notification_id is supported only for backend callback recovery");
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const fields = command === "renew" ? ["minutes"] : command === "close" ? ["reason"] : command === "retry-callback" ? ["notification_id"] : [];
|
|
46
|
+
const allowed = new Set(["watch_id", "turn_id", ...fields]);
|
|
47
|
+
const extra = Object.keys(params).filter(key => !allowed.has(key));
|
|
48
|
+
if (extra.length)
|
|
49
|
+
throw new Error(`Unsupported backend ${command} parameters: ${extra.join(", ")}`);
|
|
50
|
+
const args = [command, "--watch", id, "--openclaw-session", requiredControllerSessionKey(context.sessionKey)];
|
|
51
|
+
pushOptional(args, "--store-dir", options.storeDir);
|
|
52
|
+
pushOptional(args, "--codex-home", options.codexHome);
|
|
53
|
+
if (command === "renew") {
|
|
54
|
+
const supplied = params.minutes ?? options.defaultMinutes;
|
|
55
|
+
if (supplied !== undefined && (typeof supplied !== "number" || !Number.isFinite(supplied) || supplied <= 0)) {
|
|
56
|
+
throw new Error("minutes must be a positive number");
|
|
57
|
+
}
|
|
58
|
+
args.push("--minutes", String(resolveMonitorHardTimeoutMinutes(params.minutes, options.defaultMinutes)));
|
|
59
|
+
}
|
|
60
|
+
if (Object.hasOwn(params, "reason"))
|
|
61
|
+
args.push("--reason", requiredString(params.reason, "reason"));
|
|
62
|
+
if (Object.hasOwn(params, "notification_id"))
|
|
63
|
+
args.push("--notification-id", requiredString(params.notification_id, "notification_id"));
|
|
64
|
+
return args;
|
|
65
|
+
}
|
|
66
|
+
/** Run before conversation routing, which must never reinterpret a backend recovery target. */
|
|
67
|
+
export function assertBackendRecoveryCliTarget(command, options) {
|
|
68
|
+
if (!command || !commands.has(command))
|
|
69
|
+
return;
|
|
70
|
+
const fields = ["watch", "turn", "conversation", "conversationId", "terminal", "session"];
|
|
71
|
+
const targets = fields.filter(key => Object.hasOwn(options, key));
|
|
72
|
+
const hasBackend = targets.some(key => typeof options[key] === "string" &&
|
|
73
|
+
(backendIdentity.test(options[key].trim()) || backendWatchPrefix.test(options[key].trim())));
|
|
74
|
+
if (command !== "recover" && !hasBackend && !Object.hasOwn(options, "watch")) {
|
|
75
|
+
if (Object.hasOwn(options, "notificationId"))
|
|
76
|
+
throw new Error("--notification-id is supported only for backend callback recovery");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (targets.length !== 1 || !["watch", "turn"].includes(targets[0]) || !backendWatch.test(String(options[targets[0]]))) {
|
|
80
|
+
throw new Error(`${command} requires exactly one --watch or --turn containing an exact backend Watch ID`);
|
|
81
|
+
}
|
|
82
|
+
requiredControllerSessionKey(options.openclawSession);
|
|
83
|
+
const fences = Object.keys(options).filter(key => /^expected/u.test(key));
|
|
84
|
+
if (fences.length)
|
|
85
|
+
throw new Error(`Backend ${command} does not accept terminal recovery fences: ${fences.join(", ")}`);
|
|
86
|
+
if (command !== "retry-callback" && Object.hasOwn(options, "notificationId")) {
|
|
87
|
+
throw new Error("--notification-id is supported only by retry-callback");
|
|
88
|
+
}
|
|
89
|
+
if (Object.hasOwn(options, "notificationId"))
|
|
90
|
+
requiredString(options.notificationId, "notification-id");
|
|
91
|
+
}
|
|
92
|
+
/** Report observed delivery state without turning a retry attempt into a delivery receipt. */
|
|
93
|
+
export function formatBackendRecoveryCommandResult(result, command) {
|
|
94
|
+
if (!isRecord(result) || !backendWatch.test(String(result.watch_id)))
|
|
95
|
+
return undefined;
|
|
96
|
+
const fields = ["watch_id", "turn_id", "task_kind", "native_turn_id", "status", "management_state", "observation_state", "closed_at", "unwatched_at", "hard_timeout_at", "deadline_at"];
|
|
97
|
+
const lines = fields.flatMap(field => {
|
|
98
|
+
const value = nonBlankString(result[field]);
|
|
99
|
+
return value ? [`${field}: ${value}`] : [];
|
|
100
|
+
});
|
|
101
|
+
if (Array.isArray(result.callback_notifications)) {
|
|
102
|
+
for (const notification of result.callback_notifications) {
|
|
103
|
+
if (!isRecord(notification))
|
|
104
|
+
continue;
|
|
105
|
+
const id = nonBlankString(notification.notification_id) ?? nonBlankString(notification.id);
|
|
106
|
+
const status = nonBlankString(notification.status);
|
|
107
|
+
if (id && status)
|
|
108
|
+
lines.push(`callback ${id}: ${status}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return [`AKK backend ${command}.`, ...lines].join("\n");
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=backend-recovery-semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-recovery-semantic.js","sourceRoot":"","sources":["../../src/backend-recovery-semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { CallbackAttemptOutcome } from "./callback-transport.js";
|
|
2
|
+
/** Additive fields keep existing v1 backend records readable. Management and observation are separate. */
|
|
3
|
+
export interface BackendRecoveryFields {
|
|
4
|
+
closed_at?: string;
|
|
5
|
+
close_reason?: string;
|
|
6
|
+
unwatched_at?: string;
|
|
7
|
+
renewed_at?: string;
|
|
8
|
+
renewal_count?: number;
|
|
9
|
+
recovered_at?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BackendRetryFields {
|
|
12
|
+
/** Highest cumulative attempt explicitly authorized by a manual retry. */
|
|
13
|
+
retry_budget_until?: number;
|
|
14
|
+
retry_requested_at?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface BackendRecoveryNotification extends BackendRetryFields {
|
|
17
|
+
id: string;
|
|
18
|
+
status: string;
|
|
19
|
+
attempts: number;
|
|
20
|
+
retry_at?: string;
|
|
21
|
+
outcome?: CallbackAttemptOutcome;
|
|
22
|
+
}
|
|
23
|
+
export interface BackendRecoveryTask extends BackendRecoveryFields {
|
|
24
|
+
id: string;
|
|
25
|
+
kind: "send" | "watch";
|
|
26
|
+
status: string;
|
|
27
|
+
controller_session: string;
|
|
28
|
+
deadline_at: string;
|
|
29
|
+
notifications: BackendRecoveryNotification[];
|
|
30
|
+
}
|
|
31
|
+
export declare class BackendRecoveryError extends Error {
|
|
32
|
+
readonly code: string;
|
|
33
|
+
constructor(code: string, message: string);
|
|
34
|
+
}
|
|
35
|
+
export declare function assertBackendRecoveryOwner(task: BackendRecoveryTask, input: {
|
|
36
|
+
controllerSession: string;
|
|
37
|
+
}): void;
|
|
38
|
+
export declare function backendObservationStopped(task: BackendRecoveryFields & {
|
|
39
|
+
status: string;
|
|
40
|
+
}): boolean;
|
|
41
|
+
export declare function assertBackendRecoveryFields(task: BackendRecoveryTask): void;
|
|
42
|
+
export declare function assertBackendRecoveryUpdate(previous: BackendRecoveryTask, next: BackendRecoveryTask): void;
|
|
43
|
+
export declare function backendRenewalDeadline(task: BackendRecoveryTask, now: Date, timeoutMs?: number): string;
|
|
44
|
+
export declare function suppressBackendNotifications(task: BackendRecoveryTask, code: string): void;
|
|
45
|
+
export declare function closeBackendManagement(task: BackendRecoveryTask, input: {
|
|
46
|
+
controllerSession: string;
|
|
47
|
+
reason?: string;
|
|
48
|
+
}, now: Date): void;
|
|
49
|
+
export declare function stopBackendObservation(task: BackendRecoveryTask, now: Date): void;
|
|
50
|
+
export declare function isBackendCallbackRetryable(task: BackendRecoveryTask, note: BackendRecoveryNotification): boolean;
|
|
51
|
+
export declare function prepareBackendCallbackRetry(task: BackendRecoveryTask, input: {
|
|
52
|
+
controllerSession: string;
|
|
53
|
+
notificationId?: string;
|
|
54
|
+
}, now: Date): string;
|
|
55
|
+
export declare function backendCallbackMaxAttempts(note: BackendRetryFields, defaultMax: number): number;
|
|
56
|
+
export declare function backendTaskRecoveryProjection(task: BackendRecoveryTask): {
|
|
57
|
+
task_kind: "send" | "watch";
|
|
58
|
+
turn_id?: string | undefined;
|
|
59
|
+
management_state: string;
|
|
60
|
+
observation_state: string;
|
|
61
|
+
deadline_at: string;
|
|
62
|
+
renewal_count: number;
|
|
63
|
+
closed_at: string | undefined;
|
|
64
|
+
close_reason: string | undefined;
|
|
65
|
+
unwatched_at: string | undefined;
|
|
66
|
+
renewed_at: string | undefined;
|
|
67
|
+
recovered_at: string | undefined;
|
|
68
|
+
callback_in_flight: boolean;
|
|
69
|
+
retryable_callback_ids: string[];
|
|
70
|
+
recovery_actions: {
|
|
71
|
+
recover?: {
|
|
72
|
+
tool: string;
|
|
73
|
+
input: {
|
|
74
|
+
watch_id: string;
|
|
75
|
+
};
|
|
76
|
+
} | undefined;
|
|
77
|
+
renew?: {
|
|
78
|
+
tool: string;
|
|
79
|
+
input: {
|
|
80
|
+
watch_id: string;
|
|
81
|
+
};
|
|
82
|
+
} | undefined;
|
|
83
|
+
unwatch?: {
|
|
84
|
+
tool: string;
|
|
85
|
+
input: {
|
|
86
|
+
watch_id: string;
|
|
87
|
+
};
|
|
88
|
+
} | undefined;
|
|
89
|
+
close?: {
|
|
90
|
+
tool: string;
|
|
91
|
+
input: {
|
|
92
|
+
turn_id: string;
|
|
93
|
+
};
|
|
94
|
+
} | undefined;
|
|
95
|
+
retry_callback?: {
|
|
96
|
+
tool: string;
|
|
97
|
+
input: {
|
|
98
|
+
watch_id: string;
|
|
99
|
+
notification_id: string;
|
|
100
|
+
};
|
|
101
|
+
} | undefined;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { resolveMonitorHardTimeoutMs } from "./monitor-deadline-policy.js";
|
|
2
|
+
export class BackendRecoveryError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "BackendRecoveryError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function assertBackendRecoveryOwner(task, input) {
|
|
11
|
+
if (!input.controllerSession?.trim() || input.controllerSession !== task.controller_session) {
|
|
12
|
+
throw new BackendRecoveryError("backend_controller_mismatch", "Only the owning controller can recover this exact task");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function backendObservationStopped(task) {
|
|
16
|
+
return Boolean(task.closed_at || task.unwatched_at || task.status === "cancelled");
|
|
17
|
+
}
|
|
18
|
+
export function assertBackendRecoveryFields(task) {
|
|
19
|
+
assertRecoveryTimes(task);
|
|
20
|
+
if (task.closed_at && task.kind !== "send")
|
|
21
|
+
throw new Error("Only a managed send can be closed");
|
|
22
|
+
if (task.close_reason !== undefined && (!task.closed_at || typeof task.close_reason !== "string" || !task.close_reason.trim()))
|
|
23
|
+
throw new Error("Invalid backend close reason");
|
|
24
|
+
if (task.renewal_count !== undefined && (!Number.isSafeInteger(task.renewal_count) || task.renewal_count < 0))
|
|
25
|
+
throw new Error("Invalid backend renewal count");
|
|
26
|
+
if (Boolean(task.renewed_at) !== Boolean(task.renewal_count))
|
|
27
|
+
throw new Error("Backend renewal must include its time and generation");
|
|
28
|
+
for (const note of task.notifications)
|
|
29
|
+
assertRetryFields(note);
|
|
30
|
+
}
|
|
31
|
+
function assertRecoveryTimes(task) {
|
|
32
|
+
for (const field of ["closed_at", "unwatched_at", "renewed_at", "recovered_at"]) {
|
|
33
|
+
if (task[field] !== undefined && (typeof task[field] !== "string" || !Number.isFinite(Date.parse(task[field])))) {
|
|
34
|
+
throw new Error(`Invalid backend recovery ${field}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function assertRetryFields(note) {
|
|
39
|
+
if (note.retry_budget_until !== undefined && (!Number.isSafeInteger(note.retry_budget_until) || note.retry_budget_until < 1))
|
|
40
|
+
throw new Error("Invalid backend callback retry budget");
|
|
41
|
+
if (note.retry_requested_at !== undefined && (typeof note.retry_requested_at !== "string" || !Number.isFinite(Date.parse(note.retry_requested_at))))
|
|
42
|
+
throw new Error("Invalid backend callback retry time");
|
|
43
|
+
}
|
|
44
|
+
export function assertBackendRecoveryUpdate(previous, next) {
|
|
45
|
+
if (previous.closed_at && (next.closed_at !== previous.closed_at || next.close_reason !== previous.close_reason))
|
|
46
|
+
throw new Error("Closed backend management cannot be reopened");
|
|
47
|
+
const before = previous.renewal_count ?? 0;
|
|
48
|
+
const after = next.renewal_count ?? 0;
|
|
49
|
+
if (after !== before && after !== before + 1)
|
|
50
|
+
throw new Error("Backend renewal generation must advance once");
|
|
51
|
+
if (previous.deadline_at !== next.deadline_at && (after !== before + 1 ||
|
|
52
|
+
Date.parse(next.deadline_at) < Date.parse(previous.deadline_at) || !next.renewed_at || next.closed_at)) {
|
|
53
|
+
throw new Error("Backend deadline change requires an explicit monotonic renewal");
|
|
54
|
+
}
|
|
55
|
+
if (previous.unwatched_at && !next.unwatched_at && after !== before + 1)
|
|
56
|
+
throw new Error("Only renewal can resume stopped observation");
|
|
57
|
+
assertNotificationHistory(previous.notifications, next.notifications);
|
|
58
|
+
}
|
|
59
|
+
function assertNotificationHistory(previous, next) {
|
|
60
|
+
for (const old of previous) {
|
|
61
|
+
const current = next.find(note => note.id === old.id);
|
|
62
|
+
if (!current || current.attempts < old.attempts || (current.retry_budget_until ?? 0) < (old.retry_budget_until ?? 0))
|
|
63
|
+
throw new Error("Backend callback history cannot be reset");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function backendRenewalDeadline(task, now, timeoutMs = resolveMonitorHardTimeoutMs()) {
|
|
67
|
+
if (task.closed_at)
|
|
68
|
+
throw new BackendRecoveryError("backend_task_closed", "Closed management cannot be renewed");
|
|
69
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 7 * 24 * 3_600_000) {
|
|
70
|
+
throw new BackendRecoveryError("invalid_argument", "Renewal must be between one millisecond and seven days");
|
|
71
|
+
}
|
|
72
|
+
return new Date(Math.max(Date.parse(task.deadline_at), now.getTime() + timeoutMs)).toISOString();
|
|
73
|
+
}
|
|
74
|
+
export function suppressBackendNotifications(task, code) {
|
|
75
|
+
for (const note of task.notifications)
|
|
76
|
+
if (["ready", "retry_wait"].includes(note.status)) {
|
|
77
|
+
note.status = "failed";
|
|
78
|
+
note.outcome = { disposition: "permanent_failure", error_code: code };
|
|
79
|
+
delete note.retry_at;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function closeBackendManagement(task, input, now) {
|
|
83
|
+
assertBackendRecoveryOwner(task, input);
|
|
84
|
+
if (task.kind !== "send")
|
|
85
|
+
throw new BackendRecoveryError("backend_watch_not_managed", "Close requires a managed send; use Unwatch to stop an observation-only Watch");
|
|
86
|
+
if (task.closed_at)
|
|
87
|
+
return;
|
|
88
|
+
task.closed_at = now.toISOString();
|
|
89
|
+
if (input.reason?.trim())
|
|
90
|
+
task.close_reason = input.reason.trim();
|
|
91
|
+
suppressBackendNotifications(task, "backend_management_closed");
|
|
92
|
+
}
|
|
93
|
+
export function stopBackendObservation(task, now) {
|
|
94
|
+
task.unwatched_at ??= now.toISOString();
|
|
95
|
+
suppressBackendNotifications(task, "backend_watch_stopped");
|
|
96
|
+
}
|
|
97
|
+
export function isBackendCallbackRetryable(task, note) {
|
|
98
|
+
return !backendObservationStopped(task) && ["failed", "retry_wait"].includes(note.status) && note.outcome?.disposition === "retryable_failure";
|
|
99
|
+
}
|
|
100
|
+
export function prepareBackendCallbackRetry(task, input, now) {
|
|
101
|
+
assertBackendRecoveryOwner(task, input);
|
|
102
|
+
if (backendObservationStopped(task))
|
|
103
|
+
throw new BackendRecoveryError("backend_observation_stopped", "Stopped or closed observation cannot retry callbacks");
|
|
104
|
+
const selected = input.notificationId
|
|
105
|
+
? task.notifications.filter(note => note.id === input.notificationId)
|
|
106
|
+
: task.notifications.filter(note => isBackendCallbackRetryable(task, note));
|
|
107
|
+
if (selected.length !== 1 || !isBackendCallbackRetryable(task, selected[0]))
|
|
108
|
+
throw new BackendRecoveryError("backend_callback_not_retryable", "Select exactly one known retryable callback; accepted, uncertain, in-flight and obsolete notifications cannot be replayed");
|
|
109
|
+
const note = selected[0];
|
|
110
|
+
note.retry_budget_until = Math.max(note.retry_budget_until ?? 0, note.attempts + 1);
|
|
111
|
+
note.retry_requested_at = now.toISOString();
|
|
112
|
+
note.status = "ready";
|
|
113
|
+
delete note.retry_at;
|
|
114
|
+
return note.id;
|
|
115
|
+
}
|
|
116
|
+
export function backendCallbackMaxAttempts(note, defaultMax) {
|
|
117
|
+
return Math.max(defaultMax, note.retry_budget_until ?? 0);
|
|
118
|
+
}
|
|
119
|
+
export function backendTaskRecoveryProjection(task) {
|
|
120
|
+
const stopped = backendObservationStopped(task);
|
|
121
|
+
const settled = ["completed", "failed", "interrupted"].includes(task.status);
|
|
122
|
+
const input = { watch_id: task.id };
|
|
123
|
+
const retryable = task.notifications.filter(note => isBackendCallbackRetryable(task, note));
|
|
124
|
+
return {
|
|
125
|
+
task_kind: task.kind,
|
|
126
|
+
...(task.kind === "send" ? { turn_id: task.id } : {}),
|
|
127
|
+
management_state: task.kind === "watch" ? "unmanaged" : task.closed_at ? "closed" : "managed",
|
|
128
|
+
observation_state: stopped ? "stopped" : task.status === "timed_out" ? "expired" : settled ? "settled" : "watching",
|
|
129
|
+
deadline_at: task.deadline_at, renewal_count: task.renewal_count ?? 0,
|
|
130
|
+
closed_at: task.closed_at, close_reason: task.close_reason, unwatched_at: task.unwatched_at,
|
|
131
|
+
renewed_at: task.renewed_at, recovered_at: task.recovered_at,
|
|
132
|
+
callback_in_flight: task.notifications.some(note => note.status === "leased"),
|
|
133
|
+
retryable_callback_ids: retryable.map(note => note.id),
|
|
134
|
+
recovery_actions: {
|
|
135
|
+
...(!task.closed_at ? { recover: { tool: "agent_knock_knock_recover", input } } : {}),
|
|
136
|
+
...(!task.closed_at && !settled ? { renew: { tool: "agent_knock_knock_renew", input } } : {}),
|
|
137
|
+
...(!stopped ? { unwatch: { tool: "agent_knock_knock_unwatch", input } } : {}),
|
|
138
|
+
...(task.kind === "send" && !task.closed_at ? { close: { tool: "agent_knock_knock_close", input: { turn_id: task.id } } } : {}),
|
|
139
|
+
...(retryable.length === 1 ? { retry_callback: { tool: "agent_knock_knock_retry_callback", input: { ...input, notification_id: retryable[0].id } } } : {})
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=backend-task-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-task-recovery.js","sourceRoot":"","sources":["../../src/backend-task-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,14 @@ export type CallbackEnvelopeSourceV1 = {
|
|
|
29
29
|
kind: "terminal_watch";
|
|
30
30
|
watch_id: string;
|
|
31
31
|
terminal_id: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "desktop_watch";
|
|
34
|
+
watch_id: string;
|
|
35
|
+
desktop_id: string;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "codex_native_watch";
|
|
38
|
+
watch_id: string;
|
|
39
|
+
native_id: string;
|
|
32
40
|
};
|
|
33
41
|
export interface CallbackEnvelopeEventV1 {
|
|
34
42
|
id: string;
|
|
@@ -203,6 +203,20 @@ function parseEnvelopeSource(value) {
|
|
|
203
203
|
terminal_id: requiredRouteString(value.terminal_id, "source.terminal_id")
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
|
+
if (value.kind === "desktop_watch") {
|
|
207
|
+
return {
|
|
208
|
+
kind: "desktop_watch",
|
|
209
|
+
watch_id: requiredRouteString(value.watch_id, "source.watch_id"),
|
|
210
|
+
desktop_id: requiredRouteString(value.desktop_id, "source.desktop_id")
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (value.kind === "codex_native_watch") {
|
|
214
|
+
return {
|
|
215
|
+
kind: "codex_native_watch",
|
|
216
|
+
watch_id: requiredRouteString(value.watch_id, "source.watch_id"),
|
|
217
|
+
native_id: requiredRouteString(value.native_id, "source.native_id")
|
|
218
|
+
};
|
|
219
|
+
}
|
|
206
220
|
throw new Error(`unsupported callback envelope source ${JSON.stringify(value.kind)}`);
|
|
207
221
|
}
|
|
208
222
|
function parseEnvelopeEvent(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-transport.js","sourceRoot":"","sources":["../../src/callback-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,kCAAkC,CAAC;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAU,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,qCAAqC,CAAC;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"callback-transport.js","sourceRoot":"","sources":["../../src/callback-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli-core.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { DEFAULT_MONITOR_HARD_TIMEOUT_MINUTES } from "./monitor-deadline-policy.js";
|
|
2
|
+
import { dispatchLocalCodexCli, localCodexListForCli } from "./local-codex-cli-adapter.js";
|
|
3
|
+
import { assertBackendRecoveryCliTarget } from "./backend-recovery-semantic.js";
|
|
4
|
+
import { executeConversationCommand } from "./conversation-routing-cli-adapter.js";
|
|
1
5
|
import { randomUUID } from "node:crypto";
|
|
2
6
|
import { spawn } from "node:child_process";
|
|
3
7
|
import fs from "node:fs";
|
|
@@ -81,7 +85,6 @@ const resolveTerminalDispatchLedgerPaneIncarnation = terminalDispatchRepository.
|
|
|
81
85
|
const terminalDispatchRecordMatchesControl = terminalDispatchRepository.matchesControl;
|
|
82
86
|
const terminalDispatchRecordProcessAnchor = terminalDispatchRepository.processAnchor;
|
|
83
87
|
const DEFAULT_AGENT_TIMEOUT_MINUTES = 60;
|
|
84
|
-
const DEFAULT_AGENT_HARD_TIMEOUT_MINUTES = 720;
|
|
85
88
|
const CLAUDE_SCREEN_APPROVAL_TTL_MS = 10 * 60 * 1000;
|
|
86
89
|
const CALLBACK_ATTEMPT_LEASE_MS = 2 * 60 * 1000;
|
|
87
90
|
const CALLBACK_RETRY_DELAYS_MS = [5000, 15000, 60000, 60000];
|
|
@@ -181,6 +184,7 @@ const STORE_MUTATION_COMMANDS = new Set([
|
|
|
181
184
|
"approve",
|
|
182
185
|
"cancel",
|
|
183
186
|
"renew",
|
|
187
|
+
"recover",
|
|
184
188
|
"reconcile-monitors",
|
|
185
189
|
"reconcile-watches",
|
|
186
190
|
"watch-terminal",
|
|
@@ -226,9 +230,15 @@ export function parseCliCommand(argv) {
|
|
|
226
230
|
};
|
|
227
231
|
}
|
|
228
232
|
export async function executeCliCommand(commandName, options = {}, dependencies = {}) {
|
|
229
|
-
return runCliCommandExecution(commandName, options, dependencies, () =>
|
|
233
|
+
return runCliCommandExecution(commandName, options, dependencies, () => {
|
|
234
|
+
const scopedOptions = applyTrustedHostProfileCliOptions(commandName, options, cliEnv(), cliCwd());
|
|
235
|
+
assertBackendRecoveryCliTarget(commandName, scopedOptions);
|
|
236
|
+
return executeConversationCommand(commandName, scopedOptions, (request, terminalId) => terminalListCliFacade.buildTerminalListGroup({ options: request, agentFilter: "codex", terminalId }).then(scan => scan.terminalControlled), dispatchCliCommand);
|
|
237
|
+
});
|
|
230
238
|
}
|
|
231
239
|
async function dispatchCliCommand(commandName, options) {
|
|
240
|
+
if (await dispatchLocalCodexCli(commandName, options))
|
|
241
|
+
return;
|
|
232
242
|
if (commandName === "host-profile") {
|
|
233
243
|
runHostProfileCommand(options);
|
|
234
244
|
return;
|
|
@@ -245,9 +255,7 @@ async function dispatchCliCommand(commandName, options) {
|
|
|
245
255
|
if (((commandName === "send" && !stringValue(options.turn)) ||
|
|
246
256
|
commandName === "respond") &&
|
|
247
257
|
typeof (options.message ?? options.request) === "string") {
|
|
248
|
-
//
|
|
249
|
-
// lifecycle commands never need terminal, process, or Store observation.
|
|
250
|
-
// runSend retains the same check at the execution boundary.
|
|
258
|
+
// Reject native slash input before terminal discovery; runSend repeats this fence.
|
|
251
259
|
terminalSubmissionPayload(options.message ?? options.request);
|
|
252
260
|
}
|
|
253
261
|
if (!(commandName === "send" && options.turn)) {
|
|
@@ -787,6 +795,7 @@ const terminalListCliFacade = createTerminalListCliFacade({
|
|
|
787
795
|
reconcileMonitors: (options, request) => terminalMonitorSupervisionCliFacade.reconcileMonitors(options, request)
|
|
788
796
|
},
|
|
789
797
|
discovery: {
|
|
798
|
+
localCodexList: localCodexListForCli,
|
|
790
799
|
agentVersionForRunningProcess,
|
|
791
800
|
codexLatentClearResumeObservation,
|
|
792
801
|
codexManagedIdentityResolutionContext,
|
|
@@ -986,7 +995,7 @@ const terminalInteractionCliFacade = createTerminalInteractionCliAdapter({
|
|
|
986
995
|
const terminalMaintenanceCliFacade = createTerminalMaintenanceCliFacade({
|
|
987
996
|
runtime: {
|
|
988
997
|
defaultAgentTimeoutMinutes: DEFAULT_AGENT_TIMEOUT_MINUTES,
|
|
989
|
-
defaultAgentHardTimeoutMinutes:
|
|
998
|
+
defaultAgentHardTimeoutMinutes: DEFAULT_MONITOR_HARD_TIMEOUT_MINUTES,
|
|
990
999
|
monitorLockVersion: terminalMonitorSupervisionCliFacade.monitorLockVersion,
|
|
991
1000
|
loadConversation: loadConversationFromOptions,
|
|
992
1001
|
storeDir: storeDirFromOptions,
|
|
@@ -1247,7 +1256,7 @@ function usage() {
|
|
|
1247
1256
|
agent-knock-knock --help
|
|
1248
1257
|
agent-knock-knock --version
|
|
1249
1258
|
agent-knock-knock delegate --request <text> [--agent ${agentList}] [--workspace <path>] [--store-dir <dir>]
|
|
1250
|
-
agent-knock-knock list [--store-dir <dir>] [--agent ${agentList}] [--status <status>] [--all] [--reconcile] [--no-approval-scan] [--terminal-debug]
|
|
1259
|
+
agent-knock-knock list [--store-dir <dir>] [--agent ${agentList}] [--status <status>] [--all] [--reconcile] [--no-approval-scan] [--terminal-debug] [--desktop-view sidebar|history] [--desktop-search <text>] [--desktop-project <id|path>] [--desktop-limit <1-100>] [--desktop-cursor <cursor>]
|
|
1251
1260
|
agent-knock-knock watch-terminal --terminal <exact-terminal-id> --openclaw-session <session> [--hard-timeout-minutes <minutes>] [--store-dir <dir>] [--openclaw-bin <path>]
|
|
1252
1261
|
agent-knock-knock watch-status --watch <terminal-watch-id> [--store-dir <dir>]
|
|
1253
1262
|
agent-knock-knock unwatch-terminal --watch <terminal-watch-id> [--store-dir <dir>]
|
|
@@ -1271,9 +1280,10 @@ function usage() {
|
|
|
1271
1280
|
agent-knock-knock respond-interaction (--turn <turn-id|selector> | --watch <watch-id>) --interaction <id> --response-json <json> --expected-interaction-fingerprint <fingerprint> --expected-interaction-expires-at <timestamp> # async_question defaults to advertised steer_current_turn (delivery_mode may select queue_next_turn); questionnaire forbids it; never use raw keys or menu indexes
|
|
1272
1281
|
agent-knock-knock approve [--turn <turn-id|selector>] [--conversation <selector>] [--decision approve_once|reject] [--expected-terminal-token <token>] --expected-approval-fingerprint <fingerprint>
|
|
1273
1282
|
agent-knock-knock cancel [--turn <turn-id|selector>] [--conversation <selector>]
|
|
1274
|
-
agent-knock-knock renew
|
|
1275
|
-
agent-knock-knock
|
|
1276
|
-
agent-knock-knock
|
|
1283
|
+
agent-knock-knock renew (--watch <backend-watch-id> | --turn <turn-id|selector> | --conversation <legacy-selector>) [--minutes <positive-minutes>] [--openclaw-session <originating-controller>]
|
|
1284
|
+
agent-knock-knock recover (--watch <backend-watch-id> | --turn <backend-watch-id>) --openclaw-session <originating-controller>
|
|
1285
|
+
agent-knock-knock retry-callback (--watch <backend-watch-id> | --turn <turn-id|selector> | --conversation <legacy-selector>) [--notification-id <backend-notification-id>] [--openclaw-session <originating-controller>]
|
|
1286
|
+
agent-knock-knock close (--watch <backend-watch-id> | --turn <turn-id|selector> | --conversation <legacy-selector>) [--openclaw-session <originating-controller>] [--reason <text>] [--expected-message-id <message-id> | --expected-transition-id <transition-id> | --expected-handoff-token <token>] # recovery fences are terminal-only; passive backend Watches use unwatch-terminal
|
|
1277
1287
|
agent-knock-knock install-openclaw [--verify] [--openclaw-bin <path>] [--skill-path <path>] [--skill-only] [--no-restart]
|
|
1278
1288
|
agent-knock-knock doctor [--openclaw-bin <path>] [--tmux-bin <path>] [--herdr-bin <path>]
|
|
1279
1289
|
agent-knock-knock host-profile example
|