@scotthuang/agent-knock-knock 0.12.12 → 0.12.13
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 +22 -0
- package/README.md +39 -26
- package/dist/src/approval-policy.d.ts +11 -2
- package/dist/src/approval-policy.js +33 -7
- package/dist/src/approval-policy.js.map +1 -1
- package/dist/src/claude-local-transcript-provider.d.ts +81 -0
- package/dist/src/claude-local-transcript-provider.js +854 -18
- package/dist/src/claude-local-transcript-provider.js.map +1 -1
- package/dist/src/cli-core.js +85 -0
- package/dist/src/cli-core.js.map +1 -1
- package/dist/src/deferred-foreground-authority-cli-adapter.js +90 -19
- package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -1
- package/dist/src/deferred-foreground-transfer.js +3 -4
- package/dist/src/deferred-foreground-transfer.js.map +1 -1
- package/dist/src/openclaw-callback-transport.d.ts +5 -0
- package/dist/src/openclaw-callback-transport.js +1 -1
- package/dist/src/openclaw-callback-transport.js.map +1 -1
- package/dist/src/openclaw-plugin-callback-adapter.js +96 -14
- package/dist/src/openclaw-plugin-callback-adapter.js.map +1 -1
- package/dist/src/openclaw-plugin-command-adapter.js +548 -107
- package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
- package/dist/src/openclaw-plugin-helpers.d.ts +27 -4
- package/dist/src/openclaw-plugin-helpers.js +309 -44
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin-schemas.d.ts +44 -68
- package/dist/src/openclaw-plugin-schemas.js +63 -91
- package/dist/src/openclaw-plugin-schemas.js.map +1 -1
- package/dist/src/openclaw-plugin-supervisor.js +48 -10
- package/dist/src/openclaw-plugin-supervisor.js.map +1 -1
- package/dist/src/openclaw-private-authority-offers.d.ts +22 -0
- package/dist/src/openclaw-private-authority-offers.js +177 -0
- package/dist/src/openclaw-private-authority-offers.js.map +1 -0
- package/dist/src/store.d.ts +1 -0
- package/dist/src/store.js +3 -1
- package/dist/src/store.js.map +1 -1
- package/dist/src/terminal-action-projection.d.ts +19 -1
- package/dist/src/terminal-action-projection.js +23 -0
- package/dist/src/terminal-action-projection.js.map +1 -1
- package/dist/src/terminal-command-cli-adapter.d.ts +5 -0
- package/dist/src/terminal-command-cli-adapter.js +249 -89
- package/dist/src/terminal-command-cli-adapter.js.map +1 -1
- package/dist/src/terminal-dispatch-repository-cli-adapter.js +305 -79
- package/dist/src/terminal-dispatch-repository-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.d.ts +31 -7
- package/dist/src/terminal-list-cli-adapter.js +285 -67
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-renderer.d.ts +2 -0
- package/dist/src/terminal-list-renderer.js +116 -41
- package/dist/src/terminal-list-renderer.js.map +1 -1
- package/dist/src/terminal-monitor-cli-adapter.js +1 -1
- package/dist/src/terminal-monitor-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-state-cli-adapter.js +6 -15
- package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
- package/dist/src/terminal-status-cli-adapter.d.ts +10 -0
- package/dist/src/terminal-status-cli-adapter.js +89 -7
- package/dist/src/terminal-status-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-acceptance.d.ts +60 -1
- package/dist/src/terminal-submission-acceptance.js +560 -0
- package/dist/src/terminal-submission-acceptance.js.map +1 -1
- package/dist/src/terminal-watch-callback-cli-adapter.d.ts +20 -0
- package/dist/src/terminal-watch-callback-cli-adapter.js +55 -0
- package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-cli-adapter.d.ts +64 -0
- package/dist/src/terminal-watch-cli-adapter.js +508 -0
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-service.d.ts +97 -0
- package/dist/src/terminal-watch-service.js +714 -0
- package/dist/src/terminal-watch-service.js.map +1 -0
- package/dist/src/terminal-watch-store.d.ts +149 -0
- package/dist/src/terminal-watch-store.js +861 -0
- package/dist/src/terminal-watch-store.js.map +1 -0
- package/docs/quickstart-herdr.md +8 -0
- package/docs/quickstart-tmux.md +33 -6
- package/openclaw.plugin.json +11 -3
- package/package.json +1 -1
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +57 -39
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { captureClaudeHumanStartedActiveTaskAnchor, observeClaudeHumanStartedActiveTask } from "./claude-local-transcript-provider.js";
|
|
4
|
+
import { turnIdForConversation } from "./protocol.js";
|
|
5
|
+
import { decideTerminalWatchExternalTaskAuthority } from "./terminal-action-projection.js";
|
|
6
|
+
import { exactTerminalWatchAction } from "./terminal-list-renderer.js";
|
|
7
|
+
import { captureCodexHumanStartedActiveTaskAnchor, observeCodexHumanStartedActiveTask } from "./terminal-submission-acceptance.js";
|
|
8
|
+
import { sameTerminalControlEvidenceIncarnation, terminalControlEvidence } from "./terminal-control-ref.js";
|
|
9
|
+
import { createTerminalWatchCallbackCliAdapter } from "./terminal-watch-callback-cli-adapter.js";
|
|
10
|
+
import { createTerminalWatchService, terminalWatchObservationFence } from "./terminal-watch-service.js";
|
|
11
|
+
import { createTerminalWatchStore, terminalWatchIdentityFingerprint } from "./terminal-watch-store.js";
|
|
12
|
+
import { isRecord, nonBlankString as stringValue } from "./value-guards.js";
|
|
13
|
+
const DEFAULT_TERMINAL_WATCH_HARD_TIMEOUT_MINUTES = 720;
|
|
14
|
+
export function createTerminalWatchCliAdapter(dependencies) {
|
|
15
|
+
const callback = dependencies.callback ??
|
|
16
|
+
createTerminalWatchCallbackCliAdapter();
|
|
17
|
+
function serviceFor(options) {
|
|
18
|
+
const repository = createTerminalWatchStore(dependencies.storeDirFromOptions(options), { acquire: dependencies.acquireFileLock });
|
|
19
|
+
return createTerminalWatchService({
|
|
20
|
+
repository,
|
|
21
|
+
now: dependencies.now,
|
|
22
|
+
randomUUID: dependencies.randomUUID,
|
|
23
|
+
observe: (watch) => observeTerminalWatch(watch, options, dependencies),
|
|
24
|
+
deliver: async ({ watch, notification }) => {
|
|
25
|
+
callback.deliver({
|
|
26
|
+
watchId: watch.watch_id,
|
|
27
|
+
idempotencyKey: notification.idempotency_key,
|
|
28
|
+
event: callbackEvent(notification),
|
|
29
|
+
agent: watch.agent,
|
|
30
|
+
terminalId: watch.terminal.terminal_id,
|
|
31
|
+
openclawSession: watch.openclaw_session,
|
|
32
|
+
openclawBin: watch.openclaw_bin,
|
|
33
|
+
detail: notification.reason_code ?? watch.settlement?.reason_code,
|
|
34
|
+
completionText: notification.kind === "completed" || notification.kind === "failed"
|
|
35
|
+
? watch.settlement?.completion_text
|
|
36
|
+
: undefined
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function runWatch(options) {
|
|
42
|
+
const terminalId = requiredString(options.terminal, "--terminal");
|
|
43
|
+
const openclawSession = requiredString(options.openclawSession, "--openclaw-session");
|
|
44
|
+
const storeDir = dependencies.storeDirFromOptions(options);
|
|
45
|
+
const initiallyObserved = await exactTerminalForWatch(terminalId, options, dependencies);
|
|
46
|
+
const initiallyObservedBindingToken = bindingTokenForWatch(initiallyObserved.rawTerminal);
|
|
47
|
+
const initialTerminalControl = terminalControlForWatch(initiallyObserved.rawTerminal);
|
|
48
|
+
const releaseTerminal = dependencies.acquireTerminalLock(storeDir, initialTerminalControl);
|
|
49
|
+
let watch;
|
|
50
|
+
try {
|
|
51
|
+
const observed = await exactTerminalForWatch(terminalId, options, dependencies);
|
|
52
|
+
const rawTerminal = observed.rawTerminal;
|
|
53
|
+
const projectedTerminal = observed.terminal;
|
|
54
|
+
const expectedBindingToken = bindingTokenForWatch(rawTerminal);
|
|
55
|
+
const terminalControl = terminalControlForWatch(rawTerminal);
|
|
56
|
+
if (!sameTerminalControlEvidenceIncarnation(initialTerminalControl, terminalControl) || expectedBindingToken !== initiallyObservedBindingToken) {
|
|
57
|
+
throw new Error("terminal binding changed while AKK acquired authority; refresh " +
|
|
58
|
+
"AKK list and retry");
|
|
59
|
+
}
|
|
60
|
+
assertExternalTerminalWatchAuthority(storeDir, terminalControl, dependencies);
|
|
61
|
+
const watchService = serviceFor(options);
|
|
62
|
+
const existing = watchService.list().find((candidate) => candidate.status === "active" &&
|
|
63
|
+
candidate.terminal.terminal_id === terminalId);
|
|
64
|
+
if (existing) {
|
|
65
|
+
throw new Error(`terminal ${terminalId} is already monitored by Terminal Watch ` +
|
|
66
|
+
`${existing.watch_id}; use watch-status instead of creating another`);
|
|
67
|
+
}
|
|
68
|
+
assertExactPublicWatchAction(projectedTerminal, terminalId);
|
|
69
|
+
const agent = terminalAgent(rawTerminal);
|
|
70
|
+
const anchor = captureTerminalWatchAnchor(agent, rawTerminal, options, dependencies);
|
|
71
|
+
if (!anchor) {
|
|
72
|
+
throw new Error("the exact terminal has no unique supported human-started active task");
|
|
73
|
+
}
|
|
74
|
+
watch = watchService.create({
|
|
75
|
+
agent,
|
|
76
|
+
terminal: terminalWatchIdentity(rawTerminal, expectedBindingToken),
|
|
77
|
+
anchor,
|
|
78
|
+
openclaw_session: openclawSession,
|
|
79
|
+
openclaw_bin: stringValue(options.openclawBin) ?? "openclaw",
|
|
80
|
+
timeout_ms: positiveMinutes(options.hardTimeoutMinutes, DEFAULT_TERMINAL_WATCH_HARD_TIMEOUT_MINUTES) * 60_000,
|
|
81
|
+
approval_fingerprint: approvalFingerprint(projectedTerminal),
|
|
82
|
+
approval_reason_code: approvalFingerprint(projectedTerminal)
|
|
83
|
+
? "terminal_waiting_for_approval"
|
|
84
|
+
: undefined
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
releaseTerminal();
|
|
89
|
+
}
|
|
90
|
+
dependencies.printJson({ watch: publicTerminalWatch(watch) });
|
|
91
|
+
}
|
|
92
|
+
async function runUnwatch(options) {
|
|
93
|
+
const service = serviceFor(options);
|
|
94
|
+
const watch = service.cancel(requiredWatchId(options.watch));
|
|
95
|
+
dependencies.printJson({ watch: publicTerminalWatch(watch) });
|
|
96
|
+
}
|
|
97
|
+
function runWatchStatus(options) {
|
|
98
|
+
const watch = serviceFor(options).get(requiredWatchId(options.watch));
|
|
99
|
+
dependencies.printJson({ watch: publicTerminalWatch(watch) });
|
|
100
|
+
}
|
|
101
|
+
async function runReconcileWatches(options) {
|
|
102
|
+
dependencies.printJson(await serviceFor(options).reconcileAll());
|
|
103
|
+
}
|
|
104
|
+
function listPublicWatches(storeDir, options = {}) {
|
|
105
|
+
const service = serviceFor({ storeDir });
|
|
106
|
+
return publicTerminalWatches(service.list(), options);
|
|
107
|
+
}
|
|
108
|
+
function scanPublicWatchesForExactObservation(storeDir, options = {}) {
|
|
109
|
+
const repository = createTerminalWatchStore(storeDir, {
|
|
110
|
+
acquire: dependencies.acquireFileLock
|
|
111
|
+
});
|
|
112
|
+
const scan = repository.scanForReconciliation();
|
|
113
|
+
return {
|
|
114
|
+
watches: publicTerminalWatches(scan.watches, options),
|
|
115
|
+
activeOverlayTrusted: scan.errors.length === 0
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function publicTerminalWatches(watches, options) {
|
|
119
|
+
return watches
|
|
120
|
+
.filter((watch) => options.includeAll || watch.status === "active")
|
|
121
|
+
.map(publicTerminalWatch);
|
|
122
|
+
}
|
|
123
|
+
return Object.freeze({
|
|
124
|
+
runWatch,
|
|
125
|
+
runUnwatch,
|
|
126
|
+
runWatchStatus,
|
|
127
|
+
runReconcileWatches,
|
|
128
|
+
listPublicWatches,
|
|
129
|
+
scanPublicWatchesForExactObservation
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function exactTerminalForWatch(terminalId, options, dependencies) {
|
|
133
|
+
const observation = await dependencies.observeExactTerminal({
|
|
134
|
+
options,
|
|
135
|
+
terminalId
|
|
136
|
+
});
|
|
137
|
+
if (observation.state === "unavailable") {
|
|
138
|
+
throw new Error("authoritative observation of the exact terminal is temporarily " +
|
|
139
|
+
"unavailable; retry after refreshing AKK list");
|
|
140
|
+
}
|
|
141
|
+
if (observation.state === "absent") {
|
|
142
|
+
throw new Error(`expected exact terminal ${terminalId}; observed none`);
|
|
143
|
+
}
|
|
144
|
+
return observation;
|
|
145
|
+
}
|
|
146
|
+
function bindingTokenForWatch(terminal) {
|
|
147
|
+
return requiredSha256(terminal.lifecycle_binding_token, "current terminal binding token");
|
|
148
|
+
}
|
|
149
|
+
function assertExactPublicWatchAction(terminal, terminalId) {
|
|
150
|
+
if (!exactTerminalWatchAction(terminal, terminalId)) {
|
|
151
|
+
throw new Error("the exact terminal is not currently watchable; refresh AKK list and " +
|
|
152
|
+
"use only its current available_actions.watch");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function terminalControlForWatch(terminal) {
|
|
156
|
+
if (!isRecord(terminal.terminal_control)) {
|
|
157
|
+
throw new Error("the exact terminal has no terminal control authority");
|
|
158
|
+
}
|
|
159
|
+
return terminal.terminal_control;
|
|
160
|
+
}
|
|
161
|
+
function assertExternalTerminalWatchAuthority(storeDir, terminalControl, dependencies) {
|
|
162
|
+
const blockingTurn = dependencies.terminalIncarnationBlockingTurns(storeDir, terminalControl)[0];
|
|
163
|
+
const authority = decideTerminalWatchExternalTaskAuthority({
|
|
164
|
+
blockingTurn,
|
|
165
|
+
dispatchOwnership: blockingTurn
|
|
166
|
+
? { state: "none" }
|
|
167
|
+
: dependencies.terminalDispatchOwnership(terminalControl)
|
|
168
|
+
});
|
|
169
|
+
if (authority.state === "external_task") {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (authority.state === "managed_turn") {
|
|
173
|
+
const turn = authority.conversation;
|
|
174
|
+
throw new Error(`Terminal Watch is unavailable: this task already belongs to AKK Turn ` +
|
|
175
|
+
`${turnIdForConversation(turn)} (${turn.status}) and is covered by the ` +
|
|
176
|
+
"managed Turn monitor/callback path. Use AKK status for that Turn.");
|
|
177
|
+
}
|
|
178
|
+
const reason = stringValue(authority.conflict.reason) ??
|
|
179
|
+
"terminal dispatch ownership is conflicted";
|
|
180
|
+
throw new Error(`Terminal Watch is unavailable because AKK cannot prove this is external ` +
|
|
181
|
+
`work: ${reason}. Refresh AKK list and resolve the ownership conflict.`);
|
|
182
|
+
}
|
|
183
|
+
function captureTerminalWatchAnchor(agent, terminal, options, dependencies) {
|
|
184
|
+
if (agent === "codex") {
|
|
185
|
+
return captureCodexHumanStartedActiveTaskAnchor({
|
|
186
|
+
currentIdentity: codexIdentity(terminal),
|
|
187
|
+
now: dependencies.now()
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return captureClaudeHumanStartedActiveTaskAnchor({
|
|
191
|
+
sessionId: requiredString(terminal.native_agent_session_id, "Claude native session id"),
|
|
192
|
+
cwd: terminalWorkspace(terminal),
|
|
193
|
+
pid: positiveInteger(terminal.pid, "Claude PID"),
|
|
194
|
+
claudeHome: stringValue(options.claudeHome),
|
|
195
|
+
agentRows: dependencies.loadClaudeAgentRows(options, { required: true }),
|
|
196
|
+
now: dependencies.now()
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async function observeTerminalWatch(watch, options, dependencies) {
|
|
200
|
+
const observedAt = dependencies.now().toISOString();
|
|
201
|
+
const fence = terminalWatchObservationFence(watch);
|
|
202
|
+
const exactTerminal = await currentTerminalForWatch(watch, options, dependencies);
|
|
203
|
+
const rawTerminal = exactTerminal.state === "available"
|
|
204
|
+
? exactTerminal.rawTerminal
|
|
205
|
+
: undefined;
|
|
206
|
+
const projectedTerminal = exactTerminal.state === "available"
|
|
207
|
+
? exactTerminal.terminal
|
|
208
|
+
: undefined;
|
|
209
|
+
const terminalMatches = rawTerminal
|
|
210
|
+
? terminalMatchesWatch(rawTerminal, watch)
|
|
211
|
+
: false;
|
|
212
|
+
const observation = watch.anchor.schema ===
|
|
213
|
+
"agent-knock-knock/codex-human-started-active-task-anchor"
|
|
214
|
+
? observeCodexHumanStartedActiveTask({
|
|
215
|
+
anchor: watch.anchor,
|
|
216
|
+
currentIdentity: rawTerminal
|
|
217
|
+
? codexIdentity(rawTerminal)
|
|
218
|
+
: codexIdentityForWatch(watch),
|
|
219
|
+
resumeOffsetBytes: watch.observation_checkpoint.safe_resume_offset_bytes
|
|
220
|
+
})
|
|
221
|
+
: observeClaudeHumanStartedActiveTask({
|
|
222
|
+
anchor: watch.anchor,
|
|
223
|
+
claudeHome: stringValue(options.claudeHome),
|
|
224
|
+
agentRows: dependencies.loadClaudeAgentRows(options, { required: true }),
|
|
225
|
+
resumeOffsetBytes: watch.observation_checkpoint.safe_resume_offset_bytes,
|
|
226
|
+
checkpoint: claudeObservationCheckpoint(watch)
|
|
227
|
+
});
|
|
228
|
+
if (observation.status === "invalidated") {
|
|
229
|
+
return invalidatedObservation(watch, observedAt, "task_anchor_invalidated");
|
|
230
|
+
}
|
|
231
|
+
if (observation.status === "completed") {
|
|
232
|
+
const completion = observation.completion;
|
|
233
|
+
const kind = completion.outcome === "failure" ? "failed" : "completed";
|
|
234
|
+
return {
|
|
235
|
+
...fence,
|
|
236
|
+
kind,
|
|
237
|
+
observed_at: observedAt,
|
|
238
|
+
evidence_fingerprint: sha256({
|
|
239
|
+
kind,
|
|
240
|
+
watch_id: watch.watch_id,
|
|
241
|
+
completion_id: completion.id ?? null,
|
|
242
|
+
completion_timestamp: completion.timestamp ?? null,
|
|
243
|
+
anchor_fingerprint: watch.anchor.anchor_fingerprint
|
|
244
|
+
}),
|
|
245
|
+
reason_code: completion.outcome === "failure"
|
|
246
|
+
? "anchored_task_failed"
|
|
247
|
+
: "anchored_task_completed",
|
|
248
|
+
completion_text: completion.text.slice(0, 4000),
|
|
249
|
+
completion_id: completion.id,
|
|
250
|
+
completion_timestamp: completion.timestamp
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (observation.status === "unavailable") {
|
|
254
|
+
return {
|
|
255
|
+
...fence,
|
|
256
|
+
kind: "unavailable",
|
|
257
|
+
observed_at: observedAt,
|
|
258
|
+
reason_code: "provider_observation_unavailable"
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const safeResumeOffsetBytes = observation.safeResumeOffsetBytes;
|
|
262
|
+
const observationCheckpoint = "checkpoint" in observation
|
|
263
|
+
? observation.checkpoint
|
|
264
|
+
: undefined;
|
|
265
|
+
if (exactTerminal.state === "unavailable") {
|
|
266
|
+
return {
|
|
267
|
+
...fence,
|
|
268
|
+
kind: "unavailable",
|
|
269
|
+
observed_at: observedAt,
|
|
270
|
+
safe_resume_offset_bytes: safeResumeOffsetBytes,
|
|
271
|
+
observation_checkpoint: observationCheckpoint,
|
|
272
|
+
reason_code: "terminal_observation_unavailable"
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
if (rawTerminal && !terminalMatches) {
|
|
276
|
+
return invalidatedObservation(watch, observedAt, "terminal_identity_changed");
|
|
277
|
+
}
|
|
278
|
+
if (exactTerminal.state === "absent") {
|
|
279
|
+
return invalidatedObservation(watch, observedAt, "terminal_process_unavailable");
|
|
280
|
+
}
|
|
281
|
+
if (!projectedTerminal) {
|
|
282
|
+
throw new Error("exact terminal observation is inconsistent");
|
|
283
|
+
}
|
|
284
|
+
const approval = approvalFingerprint(projectedTerminal);
|
|
285
|
+
if (approval) {
|
|
286
|
+
return {
|
|
287
|
+
...fence,
|
|
288
|
+
kind: "approval",
|
|
289
|
+
observed_at: observedAt,
|
|
290
|
+
last_activity_at: observedAt,
|
|
291
|
+
safe_resume_offset_bytes: safeResumeOffsetBytes,
|
|
292
|
+
observation_checkpoint: observationCheckpoint,
|
|
293
|
+
evidence_fingerprint: approval,
|
|
294
|
+
reason_code: "terminal_waiting_for_approval"
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
...fence,
|
|
299
|
+
kind: "pending",
|
|
300
|
+
observed_at: observedAt,
|
|
301
|
+
safe_resume_offset_bytes: safeResumeOffsetBytes,
|
|
302
|
+
observation_checkpoint: observationCheckpoint
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function claudeObservationCheckpoint(watch) {
|
|
306
|
+
const checkpoint = watch.observation_checkpoint;
|
|
307
|
+
if (!("schema" in checkpoint) ||
|
|
308
|
+
checkpoint.schema !==
|
|
309
|
+
"agent-knock-knock/claude-human-started-active-task-checkpoint") {
|
|
310
|
+
throw new Error("Claude terminal Watch has no continuation checkpoint");
|
|
311
|
+
}
|
|
312
|
+
return checkpoint;
|
|
313
|
+
}
|
|
314
|
+
async function currentTerminalForWatch(watch, options, dependencies) {
|
|
315
|
+
return dependencies.observeExactTerminal({
|
|
316
|
+
options,
|
|
317
|
+
terminalId: watch.terminal.terminal_id
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function terminalMatchesWatch(terminal, watch) {
|
|
321
|
+
try {
|
|
322
|
+
const agent = terminalAgent(terminal);
|
|
323
|
+
const current = terminalWatchIdentity(terminal, bindingTokenForWatch(terminal));
|
|
324
|
+
return agent === watch.agent &&
|
|
325
|
+
terminalWatchIdentityFingerprint({
|
|
326
|
+
agent,
|
|
327
|
+
terminal: current,
|
|
328
|
+
anchor: watch.anchor
|
|
329
|
+
}) === terminalWatchIdentityFingerprint(watch) &&
|
|
330
|
+
sameTerminalControlEvidenceIncarnation(current.terminal_endpoint, watch.terminal.terminal_endpoint);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function terminalWatchIdentity(terminal, bindingToken) {
|
|
337
|
+
const terminalControl = terminal.terminal_control;
|
|
338
|
+
return {
|
|
339
|
+
terminal_id: requiredString(terminal.id, "terminal id"),
|
|
340
|
+
terminal_endpoint: terminalControlEvidence(terminalControl),
|
|
341
|
+
workspace: terminalWorkspace(terminal),
|
|
342
|
+
binding_token: bindingToken
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function codexIdentity(terminal) {
|
|
346
|
+
if (!isRecord(terminal.native_agent_rollout)) {
|
|
347
|
+
throw new Error("Codex terminal has no exact rollout identity");
|
|
348
|
+
}
|
|
349
|
+
return {
|
|
350
|
+
sessionId: requiredString(terminal.native_agent_session_id, "Codex native thread id"),
|
|
351
|
+
processUuid: requiredString(terminal.native_agent_process_uuid, "Codex process UUID"),
|
|
352
|
+
processBirth: requiredString(terminal.native_agent_process_birth, "Codex process birth"),
|
|
353
|
+
rollout: {
|
|
354
|
+
fd: requiredString(terminal.native_agent_rollout.fd, "Codex rollout fd"),
|
|
355
|
+
device: requiredString(terminal.native_agent_rollout.device, "Codex rollout device"),
|
|
356
|
+
inode: requiredString(terminal.native_agent_rollout.inode, "Codex rollout inode"),
|
|
357
|
+
path: requiredString(terminal.native_agent_rollout.path, "Codex rollout path")
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function codexIdentityForWatch(watch) {
|
|
362
|
+
if (watch.agent !== "codex" ||
|
|
363
|
+
watch.anchor.schema !==
|
|
364
|
+
"agent-knock-knock/codex-human-started-active-task-anchor") {
|
|
365
|
+
throw new Error("terminal Watch has no Codex identity");
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
sessionId: watch.anchor.native_thread_id,
|
|
369
|
+
processUuid: watch.anchor.process_uuid,
|
|
370
|
+
processBirth: watch.anchor.process_birth,
|
|
371
|
+
rollout: watch.anchor.rollout
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
function publicTerminalWatch(watch) {
|
|
375
|
+
const pending = watch.notification_outbox.filter(({ status }) => status === "pending" || status === "delivering" || status === "failed").length;
|
|
376
|
+
return {
|
|
377
|
+
watch_id: watch.watch_id,
|
|
378
|
+
source: "human_started_terminal_watch",
|
|
379
|
+
agent: watch.agent,
|
|
380
|
+
terminal_id: watch.terminal.terminal_id,
|
|
381
|
+
native_thread_id: watch.anchor.schema ===
|
|
382
|
+
"agent-knock-knock/codex-human-started-active-task-anchor"
|
|
383
|
+
? watch.anchor.native_thread_id
|
|
384
|
+
: watch.anchor.session_id,
|
|
385
|
+
workspace: watch.terminal.workspace,
|
|
386
|
+
status: watch.status,
|
|
387
|
+
activity_state: watch.status === "active" ? "watching" : "settled",
|
|
388
|
+
created_at: watch.created_at,
|
|
389
|
+
deadline_at: watch.deadline_at,
|
|
390
|
+
updated_at: watch.updated_at,
|
|
391
|
+
last_activity_at: watch.last_activity_at,
|
|
392
|
+
callback: {
|
|
393
|
+
pending,
|
|
394
|
+
delivered: watch.notification_outbox.filter(({ status }) => status === "delivered").length,
|
|
395
|
+
failed: watch.notification_outbox.filter(({ status }) => status === "failed").length,
|
|
396
|
+
superseded: watch.notification_outbox.filter(({ status }) => status === "superseded").length
|
|
397
|
+
},
|
|
398
|
+
...(watch.settlement
|
|
399
|
+
? {
|
|
400
|
+
settlement: {
|
|
401
|
+
kind: watch.settlement.kind,
|
|
402
|
+
observed_at: watch.settlement.observed_at,
|
|
403
|
+
reason_code: watch.settlement.reason_code,
|
|
404
|
+
completion_text: watch.settlement.completion_text,
|
|
405
|
+
completion_id: watch.settlement.completion_id,
|
|
406
|
+
completion_timestamp: watch.settlement.completion_timestamp
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
: {}),
|
|
410
|
+
available_actions: {
|
|
411
|
+
status: {
|
|
412
|
+
tool: "agent_knock_knock_status",
|
|
413
|
+
arguments: { watch_id: watch.watch_id }
|
|
414
|
+
},
|
|
415
|
+
...(watch.status === "active"
|
|
416
|
+
? {
|
|
417
|
+
unwatch: {
|
|
418
|
+
tool: "agent_knock_knock_unwatch",
|
|
419
|
+
arguments: { watch_id: watch.watch_id },
|
|
420
|
+
requires_user_intent: true
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
: {})
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
function callbackEvent(notification) {
|
|
428
|
+
return notification.kind === "approval"
|
|
429
|
+
? "approval_required"
|
|
430
|
+
: notification.kind;
|
|
431
|
+
}
|
|
432
|
+
function approvalFingerprint(terminal) {
|
|
433
|
+
if (terminal.activity_state !== "awaiting_approval")
|
|
434
|
+
return undefined;
|
|
435
|
+
const approval = isRecord(terminal.approval_state)
|
|
436
|
+
? terminal.approval_state
|
|
437
|
+
: undefined;
|
|
438
|
+
const fingerprint = stringValue(approval?.fingerprint);
|
|
439
|
+
return fingerprint && /^[a-f0-9]{64}$/u.test(fingerprint)
|
|
440
|
+
? fingerprint
|
|
441
|
+
: undefined;
|
|
442
|
+
}
|
|
443
|
+
function invalidatedObservation(watch, observedAt, reasonCode) {
|
|
444
|
+
return {
|
|
445
|
+
...terminalWatchObservationFence(watch),
|
|
446
|
+
kind: "invalidated",
|
|
447
|
+
observed_at: observedAt,
|
|
448
|
+
evidence_fingerprint: sha256({
|
|
449
|
+
watch_id: watch.watch_id,
|
|
450
|
+
reason_code: reasonCode,
|
|
451
|
+
anchor_fingerprint: watch.anchor.anchor_fingerprint
|
|
452
|
+
}),
|
|
453
|
+
reason_code: reasonCode
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function terminalAgent(terminal) {
|
|
457
|
+
const agent = stringValue(terminal.agent);
|
|
458
|
+
if (agent !== "codex" && agent !== "claude") {
|
|
459
|
+
throw new Error("terminal Watch supports only Codex or Claude Code");
|
|
460
|
+
}
|
|
461
|
+
return agent;
|
|
462
|
+
}
|
|
463
|
+
function terminalWorkspace(terminal) {
|
|
464
|
+
const workspace = requiredString(terminal.workspace ?? terminal.cwd, "terminal workspace");
|
|
465
|
+
if (!path.isAbsolute(workspace)) {
|
|
466
|
+
throw new Error("terminal workspace must be absolute");
|
|
467
|
+
}
|
|
468
|
+
return path.resolve(workspace);
|
|
469
|
+
}
|
|
470
|
+
function requiredWatchId(value) {
|
|
471
|
+
const watchId = requiredString(value, "--watch");
|
|
472
|
+
if (!/^terminal-watch-[A-Za-z0-9._:-]+$/u.test(watchId)) {
|
|
473
|
+
throw new Error("--watch must be an exact Terminal Watch id");
|
|
474
|
+
}
|
|
475
|
+
return watchId;
|
|
476
|
+
}
|
|
477
|
+
function requiredString(value, label) {
|
|
478
|
+
const result = stringValue(value);
|
|
479
|
+
if (!result || result.includes("\0")) {
|
|
480
|
+
throw new Error(`${label} is required`);
|
|
481
|
+
}
|
|
482
|
+
return result;
|
|
483
|
+
}
|
|
484
|
+
function requiredSha256(value, label) {
|
|
485
|
+
const result = requiredString(value, label);
|
|
486
|
+
if (!/^[a-f0-9]{64}$/u.test(result)) {
|
|
487
|
+
throw new Error(`${label} must be exactly 64 lowercase ASCII hexadecimal characters`);
|
|
488
|
+
}
|
|
489
|
+
return result;
|
|
490
|
+
}
|
|
491
|
+
function positiveInteger(value, label) {
|
|
492
|
+
const result = Number(value);
|
|
493
|
+
if (!Number.isSafeInteger(result) || result <= 0) {
|
|
494
|
+
throw new Error(`${label} must be a positive integer`);
|
|
495
|
+
}
|
|
496
|
+
return result;
|
|
497
|
+
}
|
|
498
|
+
function positiveMinutes(value, fallback) {
|
|
499
|
+
const result = value === undefined ? fallback : Number(value);
|
|
500
|
+
if (!Number.isFinite(result) || result <= 0) {
|
|
501
|
+
throw new Error("--hard-timeout-minutes must be a positive number");
|
|
502
|
+
}
|
|
503
|
+
return result;
|
|
504
|
+
}
|
|
505
|
+
function sha256(value) {
|
|
506
|
+
return createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=terminal-watch-cli-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-watch-cli-adapter.js","sourceRoot":"","sources":["../../src/terminal-watch-cli-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { type TerminalWatch, type TerminalWatchAnchor, type TerminalWatchNotification, type TerminalWatchObservationCheckpoint, type TerminalWatchStatus, type TerminalWatchStore, type TerminalWatchTerminalIdentity } from "./terminal-watch-store.js";
|
|
2
|
+
import type { ExecutorKind } from "./executors.js";
|
|
3
|
+
export interface CreateTerminalWatchInput {
|
|
4
|
+
watch_id?: string;
|
|
5
|
+
agent: ExecutorKind;
|
|
6
|
+
terminal: TerminalWatchTerminalIdentity;
|
|
7
|
+
anchor: TerminalWatchAnchor;
|
|
8
|
+
openclaw_session: string;
|
|
9
|
+
openclaw_bin: string;
|
|
10
|
+
timeout_ms: number;
|
|
11
|
+
last_activity_at?: string;
|
|
12
|
+
approval_fingerprint?: string;
|
|
13
|
+
approval_reason_code?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TerminalWatchObservationFence {
|
|
16
|
+
watch_id: string;
|
|
17
|
+
terminal_identity_fingerprint: string;
|
|
18
|
+
anchor_fingerprint: string;
|
|
19
|
+
}
|
|
20
|
+
interface TerminalWatchObservationBase extends TerminalWatchObservationFence {
|
|
21
|
+
observed_at: string;
|
|
22
|
+
last_activity_at?: string;
|
|
23
|
+
safe_resume_offset_bytes?: number;
|
|
24
|
+
observation_checkpoint?: TerminalWatchObservationCheckpoint;
|
|
25
|
+
}
|
|
26
|
+
export type TerminalWatchObservation = (TerminalWatchObservationBase & {
|
|
27
|
+
kind: "pending";
|
|
28
|
+
}) | (TerminalWatchObservationBase & {
|
|
29
|
+
kind: "unavailable";
|
|
30
|
+
reason_code?: string;
|
|
31
|
+
}) | (TerminalWatchObservationBase & {
|
|
32
|
+
kind: "approval";
|
|
33
|
+
evidence_fingerprint: string;
|
|
34
|
+
reason_code?: string;
|
|
35
|
+
}) | (TerminalWatchObservationBase & {
|
|
36
|
+
kind: "completed" | "failed";
|
|
37
|
+
evidence_fingerprint: string;
|
|
38
|
+
reason_code?: string;
|
|
39
|
+
completion_text?: string;
|
|
40
|
+
completion_id?: string;
|
|
41
|
+
completion_timestamp?: string;
|
|
42
|
+
}) | (TerminalWatchObservationBase & {
|
|
43
|
+
kind: "invalidated";
|
|
44
|
+
evidence_fingerprint: string;
|
|
45
|
+
reason_code?: string;
|
|
46
|
+
});
|
|
47
|
+
export interface TerminalWatchDeliveryInput {
|
|
48
|
+
watch: TerminalWatch;
|
|
49
|
+
notification: TerminalWatchNotification;
|
|
50
|
+
}
|
|
51
|
+
export interface TerminalWatchServiceDependencies {
|
|
52
|
+
repository: TerminalWatchStore;
|
|
53
|
+
now(): Date;
|
|
54
|
+
randomUUID(): string;
|
|
55
|
+
observe(watch: TerminalWatch): Promise<TerminalWatchObservation>;
|
|
56
|
+
deliver(input: TerminalWatchDeliveryInput): Promise<void>;
|
|
57
|
+
notificationLeaseMs?: number;
|
|
58
|
+
notificationRetryDelayMs?: number | ((attempt: number) => number);
|
|
59
|
+
notificationMaxRetryDelayMs?: number;
|
|
60
|
+
reconciliationDeliveryLimit?: number;
|
|
61
|
+
classifyDeliveryError?(error: unknown): string;
|
|
62
|
+
}
|
|
63
|
+
export interface TerminalWatchReconciliationItem {
|
|
64
|
+
watch_id: string;
|
|
65
|
+
status: TerminalWatchStatus | "error";
|
|
66
|
+
changed: boolean;
|
|
67
|
+
callbacks_delivered: number;
|
|
68
|
+
error_code?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface TerminalWatchReconciliationSummary {
|
|
71
|
+
checked: number;
|
|
72
|
+
changed: number;
|
|
73
|
+
callbacks_delivered: number;
|
|
74
|
+
errors: number;
|
|
75
|
+
items: TerminalWatchReconciliationItem[];
|
|
76
|
+
}
|
|
77
|
+
export interface TerminalWatchService {
|
|
78
|
+
create(input: CreateTerminalWatchInput): TerminalWatch;
|
|
79
|
+
cancel(watchId: string): TerminalWatch;
|
|
80
|
+
get(watchId: string): TerminalWatch;
|
|
81
|
+
list(): TerminalWatch[];
|
|
82
|
+
reconcile(watchId: string): Promise<TerminalWatch>;
|
|
83
|
+
reconcileAll(): Promise<TerminalWatchReconciliationSummary>;
|
|
84
|
+
}
|
|
85
|
+
export declare class ActiveTerminalWatchConflictError extends Error {
|
|
86
|
+
readonly code = "AKK_ACTIVE_TERMINAL_WATCH_CONFLICT";
|
|
87
|
+
readonly existingWatchId: string;
|
|
88
|
+
constructor(existingWatchId: string);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create the durable Watch application service. Terminal observation and
|
|
92
|
+
* callback transport are the only effects; the API intentionally has no port
|
|
93
|
+
* capable of writing to, approving, cancelling, or taking ownership of a TUI.
|
|
94
|
+
*/
|
|
95
|
+
export declare function createTerminalWatchService(dependencies: TerminalWatchServiceDependencies): TerminalWatchService;
|
|
96
|
+
export declare function terminalWatchObservationFence(watch: TerminalWatch): TerminalWatchObservationFence;
|
|
97
|
+
export {};
|