@scotthuang/agent-knock-knock 0.12.13 → 0.12.15
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 +44 -0
- package/README.md +13 -13
- package/dist/src/callback-cli-adapter.d.ts +9 -6
- package/dist/src/callback-cli-adapter.js +119 -30
- package/dist/src/callback-cli-adapter.js.map +1 -1
- package/dist/src/callback-outbox-policy.d.ts +39 -0
- package/dist/src/callback-outbox-policy.js +163 -6
- package/dist/src/callback-outbox-policy.js.map +1 -1
- package/dist/src/callback-outbox-service.d.ts +28 -1
- package/dist/src/callback-outbox-service.js +413 -82
- package/dist/src/callback-outbox-service.js.map +1 -1
- package/dist/src/callback-outbox-settlement.d.ts +14 -1
- package/dist/src/callback-outbox-settlement.js +151 -30
- package/dist/src/callback-outbox-settlement.js.map +1 -1
- package/dist/src/callback-route-authority.d.ts +59 -0
- package/dist/src/callback-route-authority.js +123 -0
- package/dist/src/callback-route-authority.js.map +1 -0
- package/dist/src/callback-transport.d.ts +134 -0
- package/dist/src/callback-transport.js +256 -0
- package/dist/src/callback-transport.js.map +1 -0
- package/dist/src/cli-core.js +56 -18
- package/dist/src/cli-core.js.map +1 -1
- package/dist/src/cli-runtime-context.d.ts +2 -0
- package/dist/src/cli-runtime-context.js.map +1 -1
- package/dist/src/codex-lifecycle-compatibility.js +2 -1
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/deferred-foreground-application-service.d.ts +18 -0
- package/dist/src/deferred-foreground-application-service.js +72 -0
- package/dist/src/deferred-foreground-application-service.js.map +1 -1
- package/dist/src/deferred-foreground-authority-cli-adapter.js +10 -1
- package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -1
- package/dist/src/deferred-foreground-recovery-cli-adapter.d.ts +1 -1
- package/dist/src/deferred-foreground-recovery-cli-adapter.js +108 -37
- package/dist/src/deferred-foreground-recovery-cli-adapter.js.map +1 -1
- package/dist/src/deferred-foreground-recovery-service.d.ts +1 -1
- package/dist/src/deferred-foreground-recovery-service.js +10 -3
- package/dist/src/deferred-foreground-recovery-service.js.map +1 -1
- package/dist/src/deferred-foreground-transfer-policy.d.ts +1 -1
- package/dist/src/deferred-foreground-transfer-policy.js +3 -2
- package/dist/src/deferred-foreground-transfer-policy.js.map +1 -1
- package/dist/src/deferred-foreground-transfer.d.ts +17 -1
- package/dist/src/deferred-foreground-transfer.js +244 -35
- package/dist/src/deferred-foreground-transfer.js.map +1 -1
- package/dist/src/deferred-foreground-user-close.d.ts +18 -0
- package/dist/src/deferred-foreground-user-close.js +180 -0
- package/dist/src/deferred-foreground-user-close.js.map +1 -0
- package/dist/src/install-doctor-command-adapter.js +1 -1
- package/dist/src/install-doctor-command-adapter.js.map +1 -1
- package/dist/src/openclaw-callback-transport.d.ts +4 -1
- package/dist/src/openclaw-callback-transport.js +403 -10
- package/dist/src/openclaw-callback-transport.js.map +1 -1
- package/dist/src/openclaw-doctor.js +16 -2
- package/dist/src/openclaw-doctor.js.map +1 -1
- package/dist/src/openclaw-managed-callback-cli-adapter.d.ts +23 -0
- package/dist/src/openclaw-managed-callback-cli-adapter.js +77 -0
- package/dist/src/openclaw-managed-callback-cli-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin-command-adapter.js +93 -39
- package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
- package/dist/src/openclaw-plugin-helpers.d.ts +1 -0
- package/dist/src/openclaw-plugin-helpers.js +9 -1
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin-schemas.d.ts +20 -1
- package/dist/src/openclaw-plugin-schemas.js +27 -3
- package/dist/src/openclaw-plugin-schemas.js.map +1 -1
- package/dist/src/protocol.d.ts +3 -0
- package/dist/src/protocol.js +4 -0
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/store.d.ts +12 -1
- package/dist/src/store.js +81 -3
- package/dist/src/store.js.map +1 -1
- package/dist/src/terminal-acceptance-cli-adapter.d.ts +2 -0
- package/dist/src/terminal-acceptance-cli-adapter.js +62 -12
- package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -1
- package/dist/src/terminal-action-projection.d.ts +31 -3
- package/dist/src/terminal-action-projection.js +64 -9
- package/dist/src/terminal-action-projection.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +82 -0
- package/dist/src/terminal-agent-bridge.js +553 -109
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-command-cli-adapter.d.ts +26 -2
- package/dist/src/terminal-command-cli-adapter.js +3162 -214
- package/dist/src/terminal-command-cli-adapter.js.map +1 -1
- package/dist/src/terminal-delegate-cli-adapter.d.ts +4 -22
- package/dist/src/terminal-delegate-cli-adapter.js +239 -192
- package/dist/src/terminal-delegate-cli-adapter.js.map +1 -1
- package/dist/src/terminal-delegate-send-binding.d.ts +63 -0
- package/dist/src/terminal-delegate-send-binding.js +360 -0
- package/dist/src/terminal-delegate-send-binding.js.map +1 -0
- package/dist/src/terminal-dispatch-application.d.ts +4 -1
- package/dist/src/terminal-dispatch-application.js +11 -2
- package/dist/src/terminal-dispatch-application.js.map +1 -1
- package/dist/src/terminal-dispatch-composition.d.ts +5 -0
- package/dist/src/terminal-dispatch-execution.js +3 -1
- package/dist/src/terminal-dispatch-execution.js.map +1 -1
- package/dist/src/terminal-dispatch-ledger-codec.d.ts +3 -0
- package/dist/src/terminal-dispatch-ledger-codec.js +46 -19
- package/dist/src/terminal-dispatch-ledger-codec.js.map +1 -1
- package/dist/src/terminal-dispatch-presenter.js +5 -3
- package/dist/src/terminal-dispatch-presenter.js.map +1 -1
- package/dist/src/terminal-dispatch-receipt.d.ts +3 -0
- package/dist/src/terminal-dispatch-receipt.js +15 -1
- package/dist/src/terminal-dispatch-receipt.js.map +1 -1
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js +68 -7
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
- package/dist/src/terminal-dispatch-recovery-service.d.ts +2 -0
- package/dist/src/terminal-dispatch-recovery-service.js +9 -0
- package/dist/src/terminal-dispatch-recovery-service.js.map +1 -1
- package/dist/src/terminal-dispatch-repository-cli-adapter.d.ts +4 -2
- package/dist/src/terminal-dispatch-repository-cli-adapter.js +10 -3
- package/dist/src/terminal-dispatch-repository-cli-adapter.js.map +1 -1
- package/dist/src/terminal-identity-authority-cli-adapter.d.ts +2 -0
- package/dist/src/terminal-identity-authority-cli-adapter.js +34 -27
- package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.d.ts +6 -0
- package/dist/src/terminal-list-cli-adapter.js +391 -177
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-renderer.d.ts +9 -1
- package/dist/src/terminal-list-renderer.js +226 -104
- package/dist/src/terminal-list-renderer.js.map +1 -1
- package/dist/src/terminal-maintenance-cli-adapter.js +253 -326
- package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-application-service.d.ts +5 -0
- package/dist/src/terminal-monitor-application-service.js +5 -0
- package/dist/src/terminal-monitor-application-service.js.map +1 -1
- package/dist/src/terminal-monitor-cli-adapter.d.ts +25 -1
- package/dist/src/terminal-monitor-cli-adapter.js +170 -27
- package/dist/src/terminal-monitor-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-reconciliation-eligibility.d.ts +1 -1
- package/dist/src/terminal-monitor-reconciliation-eligibility.js +220 -32
- package/dist/src/terminal-monitor-reconciliation-eligibility.js.map +1 -1
- package/dist/src/terminal-monitor-state-cli-adapter.d.ts +1 -1
- package/dist/src/terminal-monitor-state-cli-adapter.js +808 -147
- package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-state-reconciliation-service.d.ts +2 -1
- package/dist/src/terminal-monitor-state-reconciliation-service.js +12 -0
- package/dist/src/terminal-monitor-state-reconciliation-service.js.map +1 -1
- package/dist/src/terminal-monitor-supervision-cli-adapter.d.ts +2 -0
- package/dist/src/terminal-monitor-supervision-cli-adapter.js +31 -11
- package/dist/src/terminal-monitor-supervision-cli-adapter.js.map +1 -1
- package/dist/src/terminal-process-source.d.ts +13 -0
- package/dist/src/terminal-process-source.js +37 -0
- package/dist/src/terminal-process-source.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.js +14 -2
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-status-cli-adapter.d.ts +1 -0
- package/dist/src/terminal-status-cli-adapter.js +30 -28
- package/dist/src/terminal-status-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-acceptance.js +78 -25
- package/dist/src/terminal-submission-acceptance.js.map +1 -1
- package/dist/src/terminal-submission-retry-service.d.ts +114 -0
- package/dist/src/terminal-submission-retry-service.js +589 -0
- package/dist/src/terminal-submission-retry-service.js.map +1 -0
- package/dist/src/terminal-user-send-intent.d.ts +65 -0
- package/dist/src/terminal-user-send-intent.js +317 -0
- package/dist/src/terminal-user-send-intent.js.map +1 -0
- package/dist/src/terminal-watch-callback-cli-adapter.d.ts +10 -2
- package/dist/src/terminal-watch-callback-cli-adapter.js +76 -37
- package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-cli-adapter.js +41 -17
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-service.d.ts +11 -6
- package/dist/src/terminal-watch-service.js +210 -41
- package/dist/src/terminal-watch-service.js.map +1 -1
- package/dist/src/terminal-watch-store.d.ts +23 -0
- package/dist/src/terminal-watch-store.js +162 -4
- package/dist/src/terminal-watch-store.js.map +1 -1
- package/docs/quickstart-herdr.md +1 -1
- package/docs/quickstart-tmux.md +3 -3
- package/package.json +1 -1
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +14 -11
|
@@ -1,37 +1,19 @@
|
|
|
1
|
-
import type { ManagedSessionState } from "./managed-session.js";
|
|
2
|
-
import { type Conversation } from "./protocol.js";
|
|
3
1
|
import type { TerminalControlRef } from "./terminal-agent-adapter.js";
|
|
4
2
|
import type { TerminalCommandCliFacade, TerminalCommandCliOptions } from "./terminal-command-cli-adapter.js";
|
|
5
3
|
import type { TerminalListCliFacade, TerminalListCliOptions } from "./terminal-list-cli-adapter.js";
|
|
6
|
-
import type
|
|
7
|
-
import { type UnknownRecord } from "./value-guards.js";
|
|
4
|
+
import { type TerminalDelegateSendBindingRepository } from "./terminal-delegate-send-binding.js";
|
|
8
5
|
export interface TerminalDelegateCliOptions extends TerminalCommandCliOptions, TerminalListCliOptions {
|
|
9
6
|
request?: string;
|
|
10
7
|
}
|
|
11
8
|
interface DelegateRuntimePorts {
|
|
12
9
|
canonicalWorkspace(value: unknown): string;
|
|
13
10
|
required<Value>(value: Value | undefined, message: string): Value;
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
interface DelegateRepositoryPorts {
|
|
17
|
-
listConversations(storeDir: string): Conversation[];
|
|
18
|
-
readEvents(logPath: string): TranscriptEvent[];
|
|
19
|
-
storeDirForConversation(conversation: Conversation): string | undefined;
|
|
20
|
-
}
|
|
21
|
-
interface DelegateAuthorityPorts {
|
|
22
|
-
assertSafeAbortedTerminalRetryBinding(request: {
|
|
23
|
-
owner: Conversation;
|
|
24
|
-
receipt: UnknownRecord;
|
|
25
|
-
storeDir: string;
|
|
26
|
-
terminalControl: TerminalControlRef;
|
|
27
|
-
messageId: string;
|
|
28
|
-
}): ManagedSessionState | undefined;
|
|
11
|
+
terminalRuntimeKey(terminalControl: TerminalControlRef): string;
|
|
29
12
|
}
|
|
30
13
|
export interface TerminalDelegateCliDependencies {
|
|
31
14
|
runtime: DelegateRuntimePorts;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
terminalList: Pick<TerminalListCliFacade, "buildTerminalListGroup" | "terminalDispatchOwnership">;
|
|
15
|
+
terminalList: Pick<TerminalListCliFacade, "buildTerminalListGroup" | "observeExactTerminal">;
|
|
16
|
+
sendBinding: TerminalDelegateSendBindingRepository;
|
|
35
17
|
terminalCommand: Pick<TerminalCommandCliFacade, "runSend">;
|
|
36
18
|
}
|
|
37
19
|
export interface TerminalDelegateCliFacade {
|
|
@@ -1,149 +1,27 @@
|
|
|
1
1
|
// CLI composition for delegate discovery and exact idempotent replay routing.
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import path from "node:path";
|
|
4
3
|
import { executorDefinitionForKind, resolveExecutor } from "./executors.js";
|
|
5
|
-
import { executorForConversation } from "./protocol.js";
|
|
6
|
-
import { isCompleteNativeRollout, terminalControlsShareIncarnation } from "./terminal-authority-policy.js";
|
|
7
|
-
import { terminalBridgeRequestFingerprint, terminalBridgeSubmissionReceipts } from "./terminal-dispatch-receipt.js";
|
|
8
4
|
import { terminalSubmissionPayload } from "./terminal-dispatch-execution.js";
|
|
9
|
-
import {
|
|
5
|
+
import { TerminalDelegateSendBindingUncertainError } from "./terminal-delegate-send-binding.js";
|
|
6
|
+
/*
|
|
7
|
+
* This adapter deliberately has no Store/Turn/Session port. Omitted-target
|
|
8
|
+
* Send resolves only current physical terminal authority.
|
|
9
|
+
*/
|
|
10
10
|
import { isRecord, nonBlankString as stringValue } from "./value-guards.js";
|
|
11
|
-
function delegateEventMessage(dependencies, owner, messageId) {
|
|
12
|
-
const eventLogPath = stringValue(owner.event_log_path);
|
|
13
|
-
if (!eventLogPath) {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
let matches;
|
|
17
|
-
try {
|
|
18
|
-
matches = dependencies.repository.readEvents(eventLogPath)
|
|
19
|
-
.filter((event) => isRecord(event.message) && event.message.id === messageId)
|
|
20
|
-
.map((event) => event.message);
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
matches = [];
|
|
24
|
-
}
|
|
25
|
-
if (matches.length > 1) {
|
|
26
|
-
throw new Error(`terminal idempotency key ${messageId} has duplicate durable messages`);
|
|
27
|
-
}
|
|
28
|
-
return matches[0];
|
|
29
|
-
}
|
|
30
|
-
function routedDelegateReceipt(dependencies, boundary, owner, receipt) {
|
|
31
|
-
const ownerStoreDir = dependencies.repository.storeDirForConversation(owner);
|
|
32
|
-
const takeover = isRecord(owner.native_session_takeover)
|
|
33
|
-
? owner.native_session_takeover
|
|
34
|
-
: undefined;
|
|
35
|
-
const terminalControl = terminalControlFromTakeover(takeover);
|
|
36
|
-
const conversationId = stringValue(takeover?.native_session_id);
|
|
37
|
-
const eventMessage = delegateEventMessage(dependencies, owner, boundary.messageId);
|
|
38
|
-
const messageType = stringValue(receipt.message_type) ??
|
|
39
|
-
(isRecord(eventMessage) ? stringValue(eventMessage.type) : undefined);
|
|
40
|
-
const storedBodyHash = stringValue(receipt.message_body_hash) ??
|
|
41
|
-
(isRecord(eventMessage) && typeof eventMessage.body === "string"
|
|
42
|
-
? createHash("sha256").update(eventMessage.body).digest("hex")
|
|
43
|
-
: undefined);
|
|
44
|
-
const ownerWorkspace = dependencies.runtime.canonicalWorkspace(owner.workspace);
|
|
45
|
-
if (!ownerStoreDir ||
|
|
46
|
-
path.resolve(ownerStoreDir) !== boundary.storeDir ||
|
|
47
|
-
(stringValue(receipt.store_dir) !== undefined &&
|
|
48
|
-
path.resolve(String(receipt.store_dir)) !== boundary.storeDir) ||
|
|
49
|
-
!terminalControl ||
|
|
50
|
-
!conversationId ||
|
|
51
|
-
stringValue(receipt.request_hash) !== boundary.requestHash ||
|
|
52
|
-
messageType !== "task" ||
|
|
53
|
-
storedBodyHash !== boundary.bodyHash ||
|
|
54
|
-
(boundary.requestedOpenClawSession &&
|
|
55
|
-
(stringValue(receipt.openclaw_session) ?? owner.openclaw_session) !==
|
|
56
|
-
boundary.requestedOpenClawSession) ||
|
|
57
|
-
(boundary.requestedAgent &&
|
|
58
|
-
executorForConversation(owner).kind !== boundary.requestedAgent) ||
|
|
59
|
-
(boundary.workspace && ownerWorkspace !== boundary.workspace)) {
|
|
60
|
-
throw new Error(`terminal idempotency key ${boundary.messageId} does not match its ` +
|
|
61
|
-
"original delegate request boundary; no terminal input was sent");
|
|
62
|
-
}
|
|
63
|
-
return { owner, receipt, conversationId, workspace: ownerWorkspace,
|
|
64
|
-
terminalControl };
|
|
65
|
-
}
|
|
66
|
-
function selectedStableDelegateRoute(dependencies, routed, storeDir, messageId) {
|
|
67
|
-
const authoritative = routed.filter(({ receipt }) => !(receipt.status === "aborted" && receipt.safe_to_retry === true));
|
|
68
|
-
if (authoritative.length > 1) {
|
|
69
|
-
throw new Error(`terminal idempotency key ${messageId} has multiple durable delegate receipts`);
|
|
70
|
-
}
|
|
71
|
-
const firstRoute = routed[0];
|
|
72
|
-
if (!firstRoute ||
|
|
73
|
-
routed.some((entry) => entry.conversationId !== firstRoute.conversationId ||
|
|
74
|
-
!terminalControlsShareIncarnation(entry.terminalControl, firstRoute.terminalControl))) {
|
|
75
|
-
throw new Error(`terminal idempotency key ${messageId} has conflicting terminal routes`);
|
|
76
|
-
}
|
|
77
|
-
const selected = authoritative[0] ?? routed.at(-1);
|
|
78
|
-
if (!selected) {
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
if (selected.receipt.status === "aborted" &&
|
|
82
|
-
selected.receipt.safe_to_retry === true) {
|
|
83
|
-
const ownerControl = terminalControlFromTakeover(isRecord(selected.owner.native_session_takeover)
|
|
84
|
-
? selected.owner.native_session_takeover
|
|
85
|
-
: undefined);
|
|
86
|
-
if (!ownerControl) {
|
|
87
|
-
throw new Error(`terminal idempotency key ${messageId} has no durable terminal route`);
|
|
88
|
-
}
|
|
89
|
-
const retrySession = dependencies.authority.assertSafeAbortedTerminalRetryBinding({
|
|
90
|
-
owner: selected.owner,
|
|
91
|
-
receipt: selected.receipt,
|
|
92
|
-
storeDir,
|
|
93
|
-
terminalControl: ownerControl,
|
|
94
|
-
messageId
|
|
95
|
-
});
|
|
96
|
-
if (!retrySession) {
|
|
97
|
-
throw new Error(`terminal idempotency key ${messageId} has no restored retry Session`);
|
|
98
|
-
}
|
|
99
|
-
if (retrySession.agent === "codex" &&
|
|
100
|
-
isCompleteNativeRollout(retrySession.binding?.native_process.rollout)) {
|
|
101
|
-
// An unchanged safe-aborted binding still does not prove the Codex TUI
|
|
102
|
-
// foreground. Keep the terminal route so runSend captures fresh
|
|
103
|
-
// candidate authority and uses the v3 transfer instead of strict Session.
|
|
104
|
-
return { kind: "terminal", conversationId: selected.conversationId,
|
|
105
|
-
workspace: selected.workspace };
|
|
106
|
-
}
|
|
107
|
-
return { kind: "session", sessionId: retrySession.session_id,
|
|
108
|
-
workspace: selected.workspace };
|
|
109
|
-
}
|
|
110
|
-
return { kind: "terminal", conversationId: selected.conversationId,
|
|
111
|
-
workspace: selected.workspace };
|
|
112
|
-
}
|
|
113
|
-
function stableDelegateTerminalRoute(dependencies, boundary) {
|
|
114
|
-
const messageId = stringValue(boundary.options.messageId);
|
|
115
|
-
if (!messageId) {
|
|
116
|
-
return undefined;
|
|
117
|
-
}
|
|
118
|
-
const storeDir = path.resolve(dependencies.runtime.storeDir(boundary.options));
|
|
119
|
-
const requestHash = terminalBridgeRequestFingerprint(terminalSubmissionPayload(boundary.request));
|
|
120
|
-
const bodyHash = createHash("sha256").update(boundary.request).digest("hex");
|
|
121
|
-
const requestedOpenClawSession = stringValue(boundary.options.openclawSession);
|
|
122
|
-
const matches = dependencies.repository.listConversations(storeDir)
|
|
123
|
-
.flatMap((owner) => terminalBridgeSubmissionReceipts(owner)
|
|
124
|
-
.filter((receipt) => stringValue(receipt.message_id) === messageId)
|
|
125
|
-
.map((receipt) => ({ owner, receipt })));
|
|
126
|
-
if (matches.length === 0) {
|
|
127
|
-
return undefined;
|
|
128
|
-
}
|
|
129
|
-
const routed = matches.map(({ owner, receipt }) => routedDelegateReceipt(dependencies, { ...boundary, storeDir, requestHash, bodyHash,
|
|
130
|
-
requestedOpenClawSession, messageId }, owner, receipt));
|
|
131
|
-
return selectedStableDelegateRoute(dependencies, routed, storeDir, messageId);
|
|
132
|
-
}
|
|
133
11
|
function assertSingleDelegateCandidate(candidates, scopedCount, workspace, requestedAgent) {
|
|
134
12
|
if (candidates.length === 0) {
|
|
135
13
|
const observed = scopedCount > 0
|
|
136
|
-
? ` Found ${scopedCount} matching pane(s), but none
|
|
14
|
+
? ` Found ${scopedCount} matching pane(s), but none has an exact safe empty composer.`
|
|
137
15
|
: "";
|
|
138
16
|
const requestedExecutor = requestedAgent
|
|
139
17
|
? executorDefinitionForKind(requestedAgent)
|
|
140
18
|
: undefined;
|
|
141
19
|
const workspaceDetail = workspace ? ` in ${workspace}` : "";
|
|
142
|
-
throw new Error(`No
|
|
143
|
-
`Start ${requestedAgent ?? "codex or claude"} inside tmux or Herdr${workspaceDetail}, wait
|
|
20
|
+
throw new Error(`No send-ready ${requestedExecutor?.displayName ?? "Codex or Claude Code"} pane is available${workspaceDetail}.${observed} ` +
|
|
21
|
+
`Start ${requestedAgent ?? "codex or claude"} inside tmux or Herdr${workspaceDetail}, wait for an exact empty composer with no approval prompt, then retry.`);
|
|
144
22
|
}
|
|
145
23
|
if (candidates.length > 1) {
|
|
146
|
-
const rendered = candidates.map((candidate) => {
|
|
24
|
+
const rendered = candidates.map(({ terminal: candidate }) => {
|
|
147
25
|
const identity = `${candidate.agent}, ${candidate.terminal_control?.target ?? candidate.id}`;
|
|
148
26
|
return workspace
|
|
149
27
|
? `${candidate.short_ref} (${identity})`
|
|
@@ -155,11 +33,238 @@ function assertSingleDelegateCandidate(candidates, scopedCount, workspace, reque
|
|
|
155
33
|
const ambiguity = workspace
|
|
156
34
|
? `match ${workspace}`
|
|
157
35
|
: "are available across workspaces";
|
|
158
|
-
throw new Error(`Multiple
|
|
36
|
+
throw new Error(`Multiple send-ready ${scope} panes ${ambiguity}: ${rendered}. ` +
|
|
159
37
|
"Use /akk codex: <task>, /akk claude: <task>, or /akk @short-ref: <message> to choose one explicitly.");
|
|
160
38
|
}
|
|
161
39
|
return candidates[0];
|
|
162
40
|
}
|
|
41
|
+
function delegateUserExplicitSendCandidate(terminal) {
|
|
42
|
+
const action = isRecord(terminal._terminal_user_explicit_send_action)
|
|
43
|
+
? terminal._terminal_user_explicit_send_action
|
|
44
|
+
: isRecord(terminal.available_actions) &&
|
|
45
|
+
isRecord(terminal.available_actions.send)
|
|
46
|
+
? terminal.available_actions.send
|
|
47
|
+
: undefined;
|
|
48
|
+
const argumentsValue = isRecord(action?.arguments)
|
|
49
|
+
? action.arguments
|
|
50
|
+
: undefined;
|
|
51
|
+
const terminalId = stringValue(terminal.id);
|
|
52
|
+
const expectedTerminalToken = stringValue(argumentsValue?.expected_terminal_token);
|
|
53
|
+
if (action?.scope !== "terminal_user_explicit" ||
|
|
54
|
+
!terminalId ||
|
|
55
|
+
stringValue(argumentsValue?.selector ?? argumentsValue?.terminal_id) !== terminalId ||
|
|
56
|
+
!expectedTerminalToken) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
terminal,
|
|
61
|
+
expectedTerminalToken,
|
|
62
|
+
expectedManagedTerminalToken: stringValue(argumentsValue?.expected_managed_terminal_token)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function samePhysicalDelegateAuthority(candidate, terminalId, expectedTerminalToken) {
|
|
66
|
+
return stringValue(candidate.terminal.id) === terminalId &&
|
|
67
|
+
candidate.expectedTerminalToken === expectedTerminalToken;
|
|
68
|
+
}
|
|
69
|
+
async function discoverDelegatePhysicalRoute(dependencies, input) {
|
|
70
|
+
const { options, workspace, requestedAgent } = input;
|
|
71
|
+
const scan = await dependencies.terminalList.buildTerminalListGroup({
|
|
72
|
+
options: { ...options, workspace, noApprovalScan: false },
|
|
73
|
+
agentFilter: requestedAgent,
|
|
74
|
+
statusFilter: undefined
|
|
75
|
+
});
|
|
76
|
+
if (scan.summary.error) {
|
|
77
|
+
throw new Error(`terminal discovery failed: ${scan.summary.error}`);
|
|
78
|
+
}
|
|
79
|
+
const scopedCandidates = workspace === undefined
|
|
80
|
+
? scan.terminalControlled
|
|
81
|
+
: scan.terminalControlled.filter((candidate) => {
|
|
82
|
+
try {
|
|
83
|
+
return dependencies.runtime.canonicalWorkspace(candidate.workspace) ===
|
|
84
|
+
workspace;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
const eligible = scopedCandidates.flatMap((candidate) => {
|
|
91
|
+
const authority = delegateUserExplicitSendCandidate(candidate);
|
|
92
|
+
return authority ? [authority] : [];
|
|
93
|
+
});
|
|
94
|
+
const selected = assertSingleDelegateCandidate(eligible, scopedCandidates.length, workspace, requestedAgent);
|
|
95
|
+
const selectedTerminalId = dependencies.runtime.required(stringValue(selected.terminal.id), "selected terminal id is unavailable");
|
|
96
|
+
const terminalControl = isRecord(selected.terminal.terminal_control)
|
|
97
|
+
? selected.terminal.terminal_control
|
|
98
|
+
: undefined;
|
|
99
|
+
if (!terminalControl) {
|
|
100
|
+
throw new Error("selected terminal physical control is unavailable");
|
|
101
|
+
}
|
|
102
|
+
let expectedManagedTerminalToken = selected.expectedManagedTerminalToken;
|
|
103
|
+
try {
|
|
104
|
+
const observed = await dependencies.terminalList.observeExactTerminal({
|
|
105
|
+
options: { ...options, workspace, noApprovalScan: false },
|
|
106
|
+
terminalId: selectedTerminalId
|
|
107
|
+
});
|
|
108
|
+
const projectedAuthority = observed.state === "available"
|
|
109
|
+
? delegateUserExplicitSendCandidate(observed.terminal)
|
|
110
|
+
: undefined;
|
|
111
|
+
if (projectedAuthority &&
|
|
112
|
+
samePhysicalDelegateAuthority(projectedAuthority, selectedTerminalId, selected.expectedTerminalToken)) {
|
|
113
|
+
expectedManagedTerminalToken =
|
|
114
|
+
projectedAuthority.expectedManagedTerminalToken;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Managed fast-path discovery is optional. The raw physical action was
|
|
119
|
+
// already observed from this exact scan and execution revalidates it.
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
terminalId: selectedTerminalId,
|
|
123
|
+
workspace: dependencies.runtime.canonicalWorkspace(selected.terminal.workspace),
|
|
124
|
+
terminalRuntimeKey: dependencies.runtime.terminalRuntimeKey(terminalControl),
|
|
125
|
+
expectedTerminalToken: selected.expectedTerminalToken,
|
|
126
|
+
...(expectedManagedTerminalToken
|
|
127
|
+
? { expectedManagedTerminalToken }
|
|
128
|
+
: {})
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function delegateSendRequestBoundary(input) {
|
|
132
|
+
return {
|
|
133
|
+
messageId: input.messageId,
|
|
134
|
+
requestHash: createHash("sha256")
|
|
135
|
+
.update(terminalSubmissionPayload(input.request))
|
|
136
|
+
.digest("hex"),
|
|
137
|
+
...(input.workspace === undefined
|
|
138
|
+
? {}
|
|
139
|
+
: { requestedWorkspace: input.workspace }),
|
|
140
|
+
...(input.requestedAgent === undefined
|
|
141
|
+
? {}
|
|
142
|
+
: { requestedAgent: input.requestedAgent }),
|
|
143
|
+
...(stringValue(input.options.openclawSession) === undefined
|
|
144
|
+
? {}
|
|
145
|
+
: { openclawSession: stringValue(input.options.openclawSession) })
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async function routeForDelegateBinding(dependencies, options, binding) {
|
|
149
|
+
let expectedManagedTerminalToken;
|
|
150
|
+
try {
|
|
151
|
+
const observed = await dependencies.terminalList.observeExactTerminal({
|
|
152
|
+
options: {
|
|
153
|
+
...options,
|
|
154
|
+
workspace: binding.workspace,
|
|
155
|
+
noApprovalScan: false
|
|
156
|
+
},
|
|
157
|
+
terminalId: binding.terminalId
|
|
158
|
+
});
|
|
159
|
+
const projectedAuthority = observed.state === "available"
|
|
160
|
+
? delegateUserExplicitSendCandidate(observed.terminal)
|
|
161
|
+
: undefined;
|
|
162
|
+
if (projectedAuthority &&
|
|
163
|
+
samePhysicalDelegateAuthority(projectedAuthority, binding.terminalId, binding.physicalToken)) {
|
|
164
|
+
expectedManagedTerminalToken =
|
|
165
|
+
projectedAuthority.expectedManagedTerminalToken;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// The immutable physical binding remains authoritative. runSend performs
|
|
170
|
+
// the fresh process, approval, and empty-composer checks before any input.
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
terminalId: binding.terminalId,
|
|
174
|
+
workspace: binding.workspace,
|
|
175
|
+
terminalRuntimeKey: binding.terminalRuntimeKey,
|
|
176
|
+
expectedTerminalToken: binding.physicalToken,
|
|
177
|
+
...(expectedManagedTerminalToken
|
|
178
|
+
? { expectedManagedTerminalToken }
|
|
179
|
+
: {})
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async function resolveDelegateSendRoute(dependencies, input) {
|
|
183
|
+
const messageId = stringValue(input.options.messageId);
|
|
184
|
+
if (!messageId) {
|
|
185
|
+
return discoverDelegatePhysicalRoute(dependencies, input);
|
|
186
|
+
}
|
|
187
|
+
const boundary = delegateSendRequestBoundary({
|
|
188
|
+
...input,
|
|
189
|
+
messageId
|
|
190
|
+
});
|
|
191
|
+
let releaseBindingLock;
|
|
192
|
+
let discoveredRoute;
|
|
193
|
+
let resolvedRoute;
|
|
194
|
+
try {
|
|
195
|
+
const existingBinding = dependencies.sendBinding.load(boundary);
|
|
196
|
+
if (existingBinding) {
|
|
197
|
+
return routeForDelegateBinding(dependencies, input.options, existingBinding);
|
|
198
|
+
}
|
|
199
|
+
releaseBindingLock = dependencies.sendBinding.acquire(messageId);
|
|
200
|
+
let concurrentBinding = dependencies.sendBinding.load(boundary);
|
|
201
|
+
if (!concurrentBinding) {
|
|
202
|
+
discoveredRoute = await discoverDelegatePhysicalRoute(dependencies, input);
|
|
203
|
+
concurrentBinding = dependencies.sendBinding.bind(boundary, {
|
|
204
|
+
terminalId: discoveredRoute.terminalId,
|
|
205
|
+
workspace: discoveredRoute.workspace,
|
|
206
|
+
terminalRuntimeKey: discoveredRoute.terminalRuntimeKey,
|
|
207
|
+
physicalToken: discoveredRoute.expectedTerminalToken
|
|
208
|
+
}).binding;
|
|
209
|
+
}
|
|
210
|
+
const binding = dependencies.runtime.required(concurrentBinding, "terminal delegate send binding is unavailable");
|
|
211
|
+
if (discoveredRoute &&
|
|
212
|
+
discoveredRoute.terminalId === binding.terminalId &&
|
|
213
|
+
discoveredRoute.expectedTerminalToken === binding.physicalToken) {
|
|
214
|
+
resolvedRoute = discoveredRoute;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
resolvedRoute = await routeForDelegateBinding(dependencies, input.options, binding);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
if (!(error instanceof TerminalDelegateSendBindingUncertainError) ||
|
|
222
|
+
error.possibleExistingBinding) {
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
const route = discoveredRoute ?? await discoverDelegatePhysicalRoute(dependencies, input);
|
|
226
|
+
resolvedRoute = {
|
|
227
|
+
...route,
|
|
228
|
+
routingWarning: `durable omitted-target routing was unavailable: ${error.message}`
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
try {
|
|
233
|
+
releaseBindingLock?.();
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (resolvedRoute) {
|
|
237
|
+
const warning = `durable omitted-target routing lock cleanup failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
238
|
+
resolvedRoute = {
|
|
239
|
+
...resolvedRoute,
|
|
240
|
+
routingWarning: resolvedRoute.routingWarning
|
|
241
|
+
? `${resolvedRoute.routingWarning}; ${warning}`
|
|
242
|
+
: warning
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// A failed unlock cannot veto a route already selected before input.
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return dependencies.runtime.required(resolvedRoute, "terminal delegate physical Send route is unavailable");
|
|
249
|
+
}
|
|
250
|
+
async function sendDelegatePhysicalRoute(dependencies, options, request, route) {
|
|
251
|
+
await dependencies.terminalCommand.runSend({
|
|
252
|
+
...options,
|
|
253
|
+
conversation: route.terminalId,
|
|
254
|
+
message: request,
|
|
255
|
+
workspace: route.workspace,
|
|
256
|
+
background: true,
|
|
257
|
+
expectedTerminalToken: route.expectedTerminalToken,
|
|
258
|
+
...(route.routingWarning
|
|
259
|
+
? { terminalUserSendRoutingWarning: route.routingWarning }
|
|
260
|
+
: {}),
|
|
261
|
+
...(route.expectedManagedTerminalToken
|
|
262
|
+
? {
|
|
263
|
+
expectedManagedTerminalToken: route.expectedManagedTerminalToken
|
|
264
|
+
}
|
|
265
|
+
: {})
|
|
266
|
+
});
|
|
267
|
+
}
|
|
163
268
|
function createRunDelegate(dependencies) {
|
|
164
269
|
return async (options) => {
|
|
165
270
|
const request = dependencies.runtime.required(options.request, "--request is required");
|
|
@@ -169,71 +274,13 @@ function createRunDelegate(dependencies) {
|
|
|
169
274
|
const requestedAgent = options.agent === undefined
|
|
170
275
|
? undefined
|
|
171
276
|
: resolveExecutor({ kind: options.agent }).kind;
|
|
172
|
-
const
|
|
277
|
+
const resolved = await resolveDelegateSendRoute(dependencies, {
|
|
173
278
|
options,
|
|
174
279
|
request,
|
|
175
280
|
workspace,
|
|
176
281
|
requestedAgent
|
|
177
282
|
});
|
|
178
|
-
|
|
179
|
-
await dependencies.terminalCommand.runSend(stableRoute.kind === "session"
|
|
180
|
-
? {
|
|
181
|
-
...options,
|
|
182
|
-
session: stableRoute.sessionId,
|
|
183
|
-
conversation: undefined,
|
|
184
|
-
message: request,
|
|
185
|
-
workspace: stableRoute.workspace,
|
|
186
|
-
background: true
|
|
187
|
-
}
|
|
188
|
-
: {
|
|
189
|
-
...options,
|
|
190
|
-
conversation: stableRoute.conversationId,
|
|
191
|
-
session: undefined,
|
|
192
|
-
message: request,
|
|
193
|
-
workspace: stableRoute.workspace,
|
|
194
|
-
background: true
|
|
195
|
-
});
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
const scan = await dependencies.terminalList.buildTerminalListGroup({
|
|
199
|
-
options: { ...options, workspace, noApprovalScan: false },
|
|
200
|
-
agentFilter: requestedAgent,
|
|
201
|
-
statusFilter: undefined
|
|
202
|
-
});
|
|
203
|
-
if (scan.summary.error) {
|
|
204
|
-
throw new Error(`terminal discovery failed: ${scan.summary.error}`);
|
|
205
|
-
}
|
|
206
|
-
const scopedCandidates = workspace === undefined
|
|
207
|
-
? scan.terminalControlled
|
|
208
|
-
: scan.terminalControlled.filter((candidate) => {
|
|
209
|
-
try {
|
|
210
|
-
return dependencies.runtime.canonicalWorkspace(candidate.workspace) ===
|
|
211
|
-
workspace;
|
|
212
|
-
}
|
|
213
|
-
catch {
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
const eligible = scopedCandidates.filter((candidate) => {
|
|
218
|
-
if (candidate.activity_state !== "idle") {
|
|
219
|
-
return false;
|
|
220
|
-
}
|
|
221
|
-
const terminalControl = isRecord(candidate.terminal_control)
|
|
222
|
-
? candidate.terminal_control
|
|
223
|
-
: undefined;
|
|
224
|
-
return !terminalControl ||
|
|
225
|
-
dependencies.terminalList.terminalDispatchOwnership(terminalControl)
|
|
226
|
-
.state === "none";
|
|
227
|
-
});
|
|
228
|
-
const selected = assertSingleDelegateCandidate(eligible, scopedCandidates.length, workspace, requestedAgent);
|
|
229
|
-
const selectedWorkspace = dependencies.runtime.canonicalWorkspace(selected.workspace);
|
|
230
|
-
await dependencies.terminalCommand.runSend({
|
|
231
|
-
...options,
|
|
232
|
-
conversation: selected.id,
|
|
233
|
-
message: request,
|
|
234
|
-
workspace: selectedWorkspace,
|
|
235
|
-
background: true
|
|
236
|
-
});
|
|
283
|
+
await sendDelegatePhysicalRoute(dependencies, options, request, resolved);
|
|
237
284
|
};
|
|
238
285
|
}
|
|
239
286
|
export function createTerminalDelegateCliFacade(dependencies) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-delegate-cli-adapter.js","sourceRoot":"","sources":["../../src/terminal-delegate-cli-adapter.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-delegate-cli-adapter.js","sourceRoot":"","sources":["../../src/terminal-delegate-cli-adapter.ts"],"names":[],"mappings":"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"}
|