@scotthuang/agent-knock-knock 0.11.6 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +21 -15
- package/dist/src/cli-core.d.ts +48 -0
- package/dist/src/cli-core.js +20089 -0
- package/dist/src/cli-core.js.map +1 -0
- package/dist/src/cli.js +12 -19719
- package/dist/src/cli.js.map +1 -1
- package/dist/src/doctor-capabilities.d.ts +10 -2
- package/dist/src/doctor-capabilities.js +48 -7
- package/dist/src/doctor-capabilities.js.map +1 -1
- package/dist/src/herdr-terminal-control-provider.d.ts +115 -0
- package/dist/src/herdr-terminal-control-provider.js +961 -0
- package/dist/src/herdr-terminal-control-provider.js.map +1 -0
- package/dist/src/managed-session.d.ts +15 -0
- package/dist/src/managed-session.js +142 -15
- package/dist/src/managed-session.js.map +1 -1
- package/dist/src/native-thread-resume-snapshot.d.ts +13 -3
- package/dist/src/native-thread-resume-snapshot.js +105 -16
- package/dist/src/native-thread-resume-snapshot.js.map +1 -1
- package/dist/src/openclaw-plugin-helpers.js +4 -4
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin.js +28 -26
- package/dist/src/openclaw-plugin.js.map +1 -1
- package/dist/src/session-store.js +5 -0
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/terminal-agent-adapter.d.ts +5 -16
- package/dist/src/terminal-agent-adapter.js +10 -6
- package/dist/src/terminal-agent-adapter.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +11 -1
- package/dist/src/terminal-agent-bridge.js +199 -86
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-control-provider.d.ts +60 -21
- package/dist/src/terminal-control-provider.js +452 -30
- package/dist/src/terminal-control-provider.js.map +1 -1
- package/dist/src/terminal-control-ref.d.ts +141 -0
- package/dist/src/terminal-control-ref.js +557 -0
- package/dist/src/terminal-control-ref.js.map +1 -0
- package/docs/quickstart-herdr.md +37 -0
- package/openclaw.plugin.json +2 -2
- package/package.json +4 -2
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +17 -17
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral terminal identity and routing primitives.
|
|
3
|
+
*
|
|
4
|
+
* Persisted/public terminal control records intentionally keep their current
|
|
5
|
+
* provider-owned shape. Generic lifecycle code must project those records
|
|
6
|
+
* through the helpers in this module instead of rebuilding identity from
|
|
7
|
+
* route fields such as a selector or socket path.
|
|
8
|
+
*/
|
|
9
|
+
const associatedEndpoints = new WeakMap();
|
|
10
|
+
export function createTerminalEndpointRef(value) {
|
|
11
|
+
const terminal = {
|
|
12
|
+
identity: { ...value.identity },
|
|
13
|
+
route: { ...value.route },
|
|
14
|
+
processAnchorPid: value.processAnchorPid,
|
|
15
|
+
capabilities: [...value.capabilities],
|
|
16
|
+
providerRef: value.providerRef
|
|
17
|
+
};
|
|
18
|
+
if (isObject(value.providerRef)) {
|
|
19
|
+
associatedEndpoints.set(value.providerRef, terminal);
|
|
20
|
+
}
|
|
21
|
+
return terminal;
|
|
22
|
+
}
|
|
23
|
+
export function terminalEndpointFromControlRef(terminalControl) {
|
|
24
|
+
const associated = associatedEndpoints.get(terminalControl);
|
|
25
|
+
if (associated) {
|
|
26
|
+
return associated;
|
|
27
|
+
}
|
|
28
|
+
switch (terminalControl.kind) {
|
|
29
|
+
case "tmux": {
|
|
30
|
+
assertTmuxControlIdentity(terminalControl);
|
|
31
|
+
const endpointKey = terminalControl.socketPath
|
|
32
|
+
? `socket:${terminalControl.socketPath}`
|
|
33
|
+
: "default-server-route";
|
|
34
|
+
const routeKey = tmuxTerminalRouteKey(endpointKey, terminalControl.target, terminalControl.socketPath);
|
|
35
|
+
return {
|
|
36
|
+
identity: {
|
|
37
|
+
providerKind: "tmux",
|
|
38
|
+
endpointKey,
|
|
39
|
+
// Modern discovery reports tmux's stable pane id. Legacy persisted
|
|
40
|
+
// refs deliberately retain their complete route+PID identity; a PID
|
|
41
|
+
// alone is never sufficient because it can be reused.
|
|
42
|
+
resourceKey: `legacy:${routeKey}:pane-pid:${terminalControl.panePid}`
|
|
43
|
+
},
|
|
44
|
+
route: {
|
|
45
|
+
routeKey,
|
|
46
|
+
label: terminalControl.target,
|
|
47
|
+
currentCommand: terminalControl.currentCommand,
|
|
48
|
+
currentPath: terminalControl.currentPath
|
|
49
|
+
},
|
|
50
|
+
processAnchorPid: terminalControl.panePid,
|
|
51
|
+
capabilities: [...terminalControl.capabilities],
|
|
52
|
+
providerRef: terminalControl
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
case "herdr": {
|
|
56
|
+
assertHerdrControlIdentity(terminalControl);
|
|
57
|
+
const endpointKey = `socket:${terminalControl.socketPath}`;
|
|
58
|
+
return {
|
|
59
|
+
identity: {
|
|
60
|
+
providerKind: "herdr",
|
|
61
|
+
endpointKey,
|
|
62
|
+
resourceKey: `terminal-id:${terminalControl.terminalId}`
|
|
63
|
+
},
|
|
64
|
+
route: {
|
|
65
|
+
routeKey: herdrTerminalRouteKey(endpointKey, terminalControl.session, terminalControl.paneId),
|
|
66
|
+
label: terminalControl.target,
|
|
67
|
+
currentCommand: terminalControl.currentCommand,
|
|
68
|
+
currentPath: terminalControl.currentPath
|
|
69
|
+
},
|
|
70
|
+
processAnchorPid: terminalControl.panePid,
|
|
71
|
+
capabilities: [...terminalControl.capabilities],
|
|
72
|
+
providerRef: terminalControl
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function hasCanonicalTerminalEndpoint(terminalControl) {
|
|
78
|
+
if (associatedEndpoints.has(terminalControl)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (terminalControl.kind !== "herdr") {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
terminalEndpointFromControlRef(terminalControl);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function terminalEndpointIdentityKey(value) {
|
|
93
|
+
const identity = isTerminalEndpointRef(value)
|
|
94
|
+
? value.identity
|
|
95
|
+
: isTerminalEndpointIdentity(value)
|
|
96
|
+
? value
|
|
97
|
+
: terminalEndpointFromControlRef(value).identity;
|
|
98
|
+
return JSON.stringify({
|
|
99
|
+
version: 1,
|
|
100
|
+
provider_kind: identity.providerKind,
|
|
101
|
+
endpoint_key: identity.endpointKey,
|
|
102
|
+
resource_key: identity.resourceKey
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
export function sameTerminalEndpointIdentity(left, right) {
|
|
106
|
+
return terminalEndpointIdentityKey(left) === terminalEndpointIdentityKey(right);
|
|
107
|
+
}
|
|
108
|
+
export function sameTerminalControlRoute(left, right) {
|
|
109
|
+
if (!isTerminalEndpointRef(left) &&
|
|
110
|
+
!isTerminalEndpointRef(right) &&
|
|
111
|
+
(!hasCanonicalTerminalEndpoint(left) || !hasCanonicalTerminalEndpoint(right))) {
|
|
112
|
+
return sameLegacyTerminalRoute(left, right);
|
|
113
|
+
}
|
|
114
|
+
if (!sameTerminalEndpointIdentity(left, right)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const leftRoute = isTerminalEndpointRef(left)
|
|
118
|
+
? left.route.routeKey
|
|
119
|
+
: terminalEndpointFromControlRef(left).route.routeKey;
|
|
120
|
+
const rightRoute = isTerminalEndpointRef(right)
|
|
121
|
+
? right.route.routeKey
|
|
122
|
+
: terminalEndpointFromControlRef(right).route.routeKey;
|
|
123
|
+
return leftRoute === rightRoute;
|
|
124
|
+
}
|
|
125
|
+
export function sameTerminalControlIncarnation(left, right) {
|
|
126
|
+
if (!isTerminalEndpointRef(left) &&
|
|
127
|
+
!isTerminalEndpointRef(right) &&
|
|
128
|
+
(!hasCanonicalTerminalEndpoint(left) || !hasCanonicalTerminalEndpoint(right))) {
|
|
129
|
+
return sameLegacyTerminalIncarnation(left, right);
|
|
130
|
+
}
|
|
131
|
+
const leftEndpoint = isTerminalEndpointRef(left)
|
|
132
|
+
? left
|
|
133
|
+
: terminalEndpointFromControlRef(left);
|
|
134
|
+
const rightEndpoint = isTerminalEndpointRef(right)
|
|
135
|
+
? right
|
|
136
|
+
: terminalEndpointFromControlRef(right);
|
|
137
|
+
return sameTerminalEndpointIdentity(leftEndpoint, rightEndpoint) &&
|
|
138
|
+
leftEndpoint.processAnchorPid === rightEndpoint.processAnchorPid;
|
|
139
|
+
}
|
|
140
|
+
export function terminalControlEvidence(terminalControl) {
|
|
141
|
+
const endpoint = terminalEndpointFromControlRef(terminalControl);
|
|
142
|
+
switch (terminalControl.kind) {
|
|
143
|
+
case "tmux":
|
|
144
|
+
return {
|
|
145
|
+
schema: "agent-knock-knock/terminal-endpoint",
|
|
146
|
+
version: 1,
|
|
147
|
+
kind: endpoint.identity.providerKind,
|
|
148
|
+
endpoint_key: endpoint.identity.endpointKey,
|
|
149
|
+
resource_key: endpoint.identity.resourceKey,
|
|
150
|
+
route_key: endpoint.route.routeKey,
|
|
151
|
+
process_anchor_pid: endpoint.processAnchorPid ?? null,
|
|
152
|
+
target: terminalControl.target,
|
|
153
|
+
socket_path: terminalControl.socketPath ?? null,
|
|
154
|
+
pane_pid: terminalControl.panePid ?? null,
|
|
155
|
+
server_socket_path: endpoint.identity.endpointKey.startsWith("socket:")
|
|
156
|
+
? endpoint.identity.endpointKey.slice("socket:".length)
|
|
157
|
+
: null,
|
|
158
|
+
pane_id: endpoint.identity.resourceKey.startsWith("pane-id:")
|
|
159
|
+
? endpoint.identity.resourceKey.slice("pane-id:".length)
|
|
160
|
+
: null,
|
|
161
|
+
current_path: terminalControl.currentPath ?? null
|
|
162
|
+
};
|
|
163
|
+
case "herdr":
|
|
164
|
+
return {
|
|
165
|
+
schema: "agent-knock-knock/terminal-endpoint",
|
|
166
|
+
version: 1,
|
|
167
|
+
kind: endpoint.identity.providerKind,
|
|
168
|
+
endpoint_key: endpoint.identity.endpointKey,
|
|
169
|
+
resource_key: endpoint.identity.resourceKey,
|
|
170
|
+
route_key: endpoint.route.routeKey,
|
|
171
|
+
process_anchor_pid: endpoint.processAnchorPid ?? null,
|
|
172
|
+
target: terminalControl.target,
|
|
173
|
+
socket_path: terminalControl.socketPath ?? null,
|
|
174
|
+
pane_pid: terminalControl.panePid,
|
|
175
|
+
server_socket_path: terminalControl.socketPath ?? null,
|
|
176
|
+
pane_id: terminalControl.paneId,
|
|
177
|
+
session_name: terminalControl.session,
|
|
178
|
+
session_dir: terminalControl.sessionDir ?? null,
|
|
179
|
+
workspace_id: terminalControl.workspaceId,
|
|
180
|
+
tab_id: terminalControl.tabId,
|
|
181
|
+
terminal_id: terminalControl.terminalId,
|
|
182
|
+
current_path: terminalControl.currentPath ?? null
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Read canonical identity from a new evidence record or derive it from the
|
|
188
|
+
* exact v0.11.x tmux fields. Unknown/malformed evidence fails closed.
|
|
189
|
+
*/
|
|
190
|
+
export function terminalEndpointIdentityFromEvidence(value) {
|
|
191
|
+
if (!isRecord(value)) {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
const providerKind = nonEmptyString(value.kind);
|
|
195
|
+
const endpointKey = nonEmptyString(value.endpoint_key);
|
|
196
|
+
const resourceKey = nonEmptyString(value.resource_key);
|
|
197
|
+
if (providerKind && endpointKey && resourceKey) {
|
|
198
|
+
if (providerKind === "tmux") {
|
|
199
|
+
const legacy = tmuxIdentityFromEvidence(value);
|
|
200
|
+
if (!legacy ||
|
|
201
|
+
legacy.identity.endpointKey !== endpointKey ||
|
|
202
|
+
legacy.identity.resourceKey !== resourceKey ||
|
|
203
|
+
(nonEmptyString(value.route_key) !== undefined &&
|
|
204
|
+
nonEmptyString(value.route_key) !== legacy.routeKey)) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else if (providerKind === "herdr") {
|
|
209
|
+
const herdr = herdrIdentityFromEvidence(value);
|
|
210
|
+
if (!herdr ||
|
|
211
|
+
herdr.identity.endpointKey !== endpointKey ||
|
|
212
|
+
herdr.identity.resourceKey !== resourceKey ||
|
|
213
|
+
(nonEmptyString(value.route_key) !== undefined &&
|
|
214
|
+
nonEmptyString(value.route_key) !== herdr.routeKey)) {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
return { providerKind, endpointKey, resourceKey };
|
|
222
|
+
}
|
|
223
|
+
const legacy = tmuxIdentityFromEvidence(value);
|
|
224
|
+
const legacyKind = providerKind ?? (legacy ? "tmux" : undefined);
|
|
225
|
+
if (legacyKind !== "tmux" || !legacy) {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
return legacy.identity;
|
|
229
|
+
}
|
|
230
|
+
export function terminalRouteKeyFromEvidence(value) {
|
|
231
|
+
if (!isRecord(value)) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
const canonical = nonEmptyString(value.route_key);
|
|
235
|
+
if (canonical) {
|
|
236
|
+
const derived = value.kind === "herdr"
|
|
237
|
+
? herdrIdentityFromEvidence(value)
|
|
238
|
+
: tmuxIdentityFromEvidence(value);
|
|
239
|
+
if (derived?.routeKey !== canonical) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
return canonical;
|
|
243
|
+
}
|
|
244
|
+
return tmuxIdentityFromEvidence(value)?.routeKey;
|
|
245
|
+
}
|
|
246
|
+
export function terminalControlEvidenceMatches(evidence, terminalControl, options = {}) {
|
|
247
|
+
if (!hasCanonicalEvidence(evidence)) {
|
|
248
|
+
const legacy = legacyTerminalEvidence(evidence);
|
|
249
|
+
if (!legacy ||
|
|
250
|
+
(options.requireProcessAnchor === false
|
|
251
|
+
? !sameLegacyTerminalRoute(legacy, terminalControl)
|
|
252
|
+
: !sameLegacyTerminalIncarnation(legacy, terminalControl))) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return options.requireCurrentRoute !== true ||
|
|
256
|
+
sameLegacyTerminalRoute(legacy, terminalControl);
|
|
257
|
+
}
|
|
258
|
+
const evidenceIdentity = terminalEndpointIdentityFromEvidence(evidence);
|
|
259
|
+
if (!evidenceIdentity ||
|
|
260
|
+
!sameTerminalEndpointIdentity(evidenceIdentity, terminalControl)) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
const endpoint = terminalEndpointFromControlRef(terminalControl);
|
|
264
|
+
const evidenceAnchor = isRecord(evidence)
|
|
265
|
+
? positiveInteger(evidence.process_anchor_pid ?? evidence.pane_pid ?? evidence.panePid)
|
|
266
|
+
: undefined;
|
|
267
|
+
if (options.requireProcessAnchor !== false &&
|
|
268
|
+
evidenceAnchor !== undefined &&
|
|
269
|
+
endpoint.processAnchorPid !== evidenceAnchor) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
if (options.requireCurrentRoute === true) {
|
|
273
|
+
return terminalRouteKeyFromEvidence(evidence) ===
|
|
274
|
+
endpoint.route.routeKey;
|
|
275
|
+
}
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
export function sameTerminalControlEvidenceIncarnation(left, right) {
|
|
279
|
+
if (hasCanonicalEvidence(left) && hasCanonicalEvidence(right)) {
|
|
280
|
+
const leftIdentity = terminalEndpointIdentityFromEvidence(left);
|
|
281
|
+
const rightIdentity = terminalEndpointIdentityFromEvidence(right);
|
|
282
|
+
const leftAnchor = isRecord(left)
|
|
283
|
+
? positiveInteger(left.process_anchor_pid ?? left.pane_pid ?? left.panePid)
|
|
284
|
+
: undefined;
|
|
285
|
+
const rightAnchor = isRecord(right)
|
|
286
|
+
? positiveInteger(right.process_anchor_pid ?? right.pane_pid ?? right.panePid)
|
|
287
|
+
: undefined;
|
|
288
|
+
return Boolean(leftIdentity &&
|
|
289
|
+
rightIdentity &&
|
|
290
|
+
leftAnchor !== undefined &&
|
|
291
|
+
leftAnchor === rightAnchor &&
|
|
292
|
+
sameTerminalEndpointIdentity(leftIdentity, rightIdentity));
|
|
293
|
+
}
|
|
294
|
+
const leftLegacy = legacyTerminalEvidence(left);
|
|
295
|
+
const rightLegacy = legacyTerminalEvidence(right);
|
|
296
|
+
return Boolean(leftLegacy &&
|
|
297
|
+
rightLegacy &&
|
|
298
|
+
sameLegacyTerminalIncarnation(leftLegacy, rightLegacy));
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Restore a persisted additive endpoint record onto its legacy public control
|
|
302
|
+
* ref. The association is deliberately non-enumerable and never rewrites the
|
|
303
|
+
* Store object. Conflicting canonical and legacy fields fail closed.
|
|
304
|
+
*/
|
|
305
|
+
export function associateTerminalEndpointEvidence(terminalControl, evidence) {
|
|
306
|
+
if (!hasCanonicalEvidence(evidence) || !isRecord(evidence)) {
|
|
307
|
+
throw new Error("terminal endpoint evidence is not canonical");
|
|
308
|
+
}
|
|
309
|
+
const identity = terminalEndpointIdentityFromEvidence(evidence);
|
|
310
|
+
const routeKey = terminalRouteKeyFromEvidence(evidence);
|
|
311
|
+
if (terminalControl.kind === "herdr") {
|
|
312
|
+
const endpoint = terminalEndpointFromControlRef(terminalControl);
|
|
313
|
+
if (!identity ||
|
|
314
|
+
!routeKey ||
|
|
315
|
+
!sameTerminalEndpointIdentity(identity, endpoint) ||
|
|
316
|
+
routeKey !== endpoint.route.routeKey ||
|
|
317
|
+
positiveInteger(evidence.process_anchor_pid ?? evidence.pane_pid) !==
|
|
318
|
+
endpoint.processAnchorPid) {
|
|
319
|
+
throw new Error("terminal endpoint evidence conflicts with its Herdr control reference");
|
|
320
|
+
}
|
|
321
|
+
createTerminalEndpointRef({
|
|
322
|
+
identity,
|
|
323
|
+
route: {
|
|
324
|
+
routeKey,
|
|
325
|
+
label: terminalControl.target,
|
|
326
|
+
currentCommand: terminalControl.currentCommand,
|
|
327
|
+
currentPath: nonEmptyString(evidence.current_path) ??
|
|
328
|
+
terminalControl.currentPath
|
|
329
|
+
},
|
|
330
|
+
processAnchorPid: endpoint.processAnchorPid,
|
|
331
|
+
capabilities: terminalControl.capabilities,
|
|
332
|
+
providerRef: terminalControl
|
|
333
|
+
});
|
|
334
|
+
return terminalControl;
|
|
335
|
+
}
|
|
336
|
+
const legacy = legacyTerminalEvidence(evidence);
|
|
337
|
+
if (!identity ||
|
|
338
|
+
!routeKey ||
|
|
339
|
+
!legacy ||
|
|
340
|
+
!sameLegacyTerminalIncarnation(legacy, terminalControl)) {
|
|
341
|
+
throw new Error("terminal endpoint evidence conflicts with its legacy control reference");
|
|
342
|
+
}
|
|
343
|
+
createTerminalEndpointRef({
|
|
344
|
+
identity,
|
|
345
|
+
route: {
|
|
346
|
+
routeKey,
|
|
347
|
+
label: terminalControl.target,
|
|
348
|
+
currentCommand: terminalControl.currentCommand,
|
|
349
|
+
currentPath: nonEmptyString(evidence.current_path) ??
|
|
350
|
+
terminalControl.currentPath
|
|
351
|
+
},
|
|
352
|
+
processAnchorPid: positiveInteger(evidence.process_anchor_pid ?? evidence.pane_pid),
|
|
353
|
+
capabilities: terminalControl.capabilities,
|
|
354
|
+
providerRef: terminalControl
|
|
355
|
+
});
|
|
356
|
+
return terminalControl;
|
|
357
|
+
}
|
|
358
|
+
/** Exact v0.11.x selector/incarnation tuple for compatibility artifacts. */
|
|
359
|
+
export function terminalLegacyControlEvidence(terminalControl) {
|
|
360
|
+
return {
|
|
361
|
+
kind: terminalControl.kind,
|
|
362
|
+
target: terminalControl.target,
|
|
363
|
+
socket_path: terminalControl.socketPath ?? null,
|
|
364
|
+
pane_pid: terminalControl.panePid
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/** Exact legacy runtime route serialized by v0.11.x ledgers and locks. */
|
|
368
|
+
export function terminalLegacyRuntimeRoute(terminalControl) {
|
|
369
|
+
if (terminalControl.kind === "herdr") {
|
|
370
|
+
return {
|
|
371
|
+
kind: "herdr",
|
|
372
|
+
target: terminalControl.target,
|
|
373
|
+
socket_path: terminalControl.socketPath ?? null
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
target: terminalControl.target,
|
|
378
|
+
socket_path: terminalControl.socketPath ?? null
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
export function terminalControlWithCapabilities(terminalControl, capabilities) {
|
|
382
|
+
const next = {
|
|
383
|
+
...terminalControl,
|
|
384
|
+
capabilities: [...capabilities]
|
|
385
|
+
};
|
|
386
|
+
const endpoint = associatedEndpoints.get(terminalControl);
|
|
387
|
+
if (endpoint) {
|
|
388
|
+
createTerminalEndpointRef({
|
|
389
|
+
...endpoint,
|
|
390
|
+
capabilities,
|
|
391
|
+
providerRef: next
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return next;
|
|
395
|
+
}
|
|
396
|
+
export function tmuxTerminalRouteKey(endpointKey, target, socketPath) {
|
|
397
|
+
return JSON.stringify({
|
|
398
|
+
provider_kind: "tmux",
|
|
399
|
+
endpoint_key: endpointKey,
|
|
400
|
+
target,
|
|
401
|
+
socket_path: socketPath ?? null
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
export function herdrTerminalRouteKey(endpointKey, session, paneId) {
|
|
405
|
+
return JSON.stringify({
|
|
406
|
+
provider_kind: "herdr",
|
|
407
|
+
endpoint_key: endpointKey,
|
|
408
|
+
session,
|
|
409
|
+
pane_id: paneId
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
function tmuxIdentityFromEvidence(value) {
|
|
413
|
+
const target = nonEmptyString(value.target);
|
|
414
|
+
const panePid = positiveInteger(value.pane_pid ?? value.panePid);
|
|
415
|
+
const processAnchorPid = positiveInteger(value.process_anchor_pid);
|
|
416
|
+
if (!target ||
|
|
417
|
+
panePid === undefined ||
|
|
418
|
+
(processAnchorPid !== undefined && processAnchorPid !== panePid)) {
|
|
419
|
+
return undefined;
|
|
420
|
+
}
|
|
421
|
+
const socketPath = nonEmptyString(value.socket_path ?? value.socketPath);
|
|
422
|
+
const serverSocketPath = nonEmptyString(value.server_socket_path ?? value.serverSocketPath);
|
|
423
|
+
const paneId = nonEmptyString(value.pane_id ?? value.paneId);
|
|
424
|
+
const endpointKey = serverSocketPath
|
|
425
|
+
? `socket:${serverSocketPath}`
|
|
426
|
+
: socketPath
|
|
427
|
+
? `socket:${socketPath}`
|
|
428
|
+
: "default-server-route";
|
|
429
|
+
const routeKey = tmuxTerminalRouteKey(endpointKey, target, socketPath);
|
|
430
|
+
return {
|
|
431
|
+
identity: {
|
|
432
|
+
providerKind: "tmux",
|
|
433
|
+
endpointKey,
|
|
434
|
+
resourceKey: paneId
|
|
435
|
+
? `pane-id:${paneId}`
|
|
436
|
+
: `legacy:${routeKey}:pane-pid:${panePid}`
|
|
437
|
+
},
|
|
438
|
+
routeKey
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
function herdrIdentityFromEvidence(value) {
|
|
442
|
+
const socketPath = nonEmptyString(value.server_socket_path ?? value.socket_path ?? value.socketPath);
|
|
443
|
+
const session = nonEmptyString(value.session_name ?? value.session);
|
|
444
|
+
const paneId = nonEmptyString(value.pane_id ?? value.paneId);
|
|
445
|
+
const terminalId = nonEmptyString(value.terminal_id ?? value.terminalId);
|
|
446
|
+
const panePid = positiveInteger(value.pane_pid ?? value.panePid);
|
|
447
|
+
const processAnchorPid = positiveInteger(value.process_anchor_pid);
|
|
448
|
+
if (!socketPath ||
|
|
449
|
+
!session ||
|
|
450
|
+
!paneId ||
|
|
451
|
+
!terminalId ||
|
|
452
|
+
panePid === undefined ||
|
|
453
|
+
(processAnchorPid !== undefined && processAnchorPid !== panePid)) {
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
const endpointKey = `socket:${socketPath}`;
|
|
457
|
+
return {
|
|
458
|
+
identity: {
|
|
459
|
+
providerKind: "herdr",
|
|
460
|
+
endpointKey,
|
|
461
|
+
resourceKey: `terminal-id:${terminalId}`
|
|
462
|
+
},
|
|
463
|
+
routeKey: herdrTerminalRouteKey(endpointKey, session, paneId)
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
function hasCanonicalEvidence(value) {
|
|
467
|
+
return isRecord(value) &&
|
|
468
|
+
value.schema === "agent-knock-knock/terminal-endpoint" &&
|
|
469
|
+
value.version === 1 &&
|
|
470
|
+
Boolean(nonEmptyString(value.kind)) &&
|
|
471
|
+
Boolean(nonEmptyString(value.endpoint_key)) &&
|
|
472
|
+
Boolean(nonEmptyString(value.resource_key)) &&
|
|
473
|
+
Boolean(nonEmptyString(value.route_key)) &&
|
|
474
|
+
Object.prototype.hasOwnProperty.call(value, "process_anchor_pid") &&
|
|
475
|
+
(value.process_anchor_pid === null ||
|
|
476
|
+
positiveInteger(value.process_anchor_pid) !== undefined);
|
|
477
|
+
}
|
|
478
|
+
function legacyTerminalEvidence(value) {
|
|
479
|
+
if (!isRecord(value)) {
|
|
480
|
+
return undefined;
|
|
481
|
+
}
|
|
482
|
+
const target = nonEmptyString(value.target);
|
|
483
|
+
const panePid = positiveInteger(value.pane_pid ?? value.panePid);
|
|
484
|
+
if (!target || panePid === undefined) {
|
|
485
|
+
return undefined;
|
|
486
|
+
}
|
|
487
|
+
const [session = target, route = "0.0"] = target.split(":", 2);
|
|
488
|
+
const [windowText = "0", paneText = "0"] = route.split(".", 2);
|
|
489
|
+
return {
|
|
490
|
+
kind: "tmux",
|
|
491
|
+
target,
|
|
492
|
+
socketPath: nonEmptyString(value.socket_path ?? value.socketPath),
|
|
493
|
+
session,
|
|
494
|
+
window: Number.parseInt(windowText, 10) || 0,
|
|
495
|
+
pane: Number.parseInt(paneText, 10) || 0,
|
|
496
|
+
panePid,
|
|
497
|
+
capabilities: []
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
function sameLegacyTerminalRoute(left, right) {
|
|
501
|
+
return left.kind === right.kind &&
|
|
502
|
+
left.target === right.target &&
|
|
503
|
+
left.socketPath === right.socketPath;
|
|
504
|
+
}
|
|
505
|
+
function sameLegacyTerminalIncarnation(left, right) {
|
|
506
|
+
return sameLegacyTerminalRoute(left, right) &&
|
|
507
|
+
left.panePid === right.panePid;
|
|
508
|
+
}
|
|
509
|
+
function assertTmuxControlIdentity(value) {
|
|
510
|
+
if (!value.target ||
|
|
511
|
+
!Number.isSafeInteger(value.panePid) ||
|
|
512
|
+
value.panePid <= 0) {
|
|
513
|
+
throw new Error("tmux terminal control requires a target and positive pane PID");
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
function assertHerdrControlIdentity(value) {
|
|
517
|
+
if (!value.target ||
|
|
518
|
+
!value.socketPath ||
|
|
519
|
+
!value.session ||
|
|
520
|
+
!value.workspaceId ||
|
|
521
|
+
!value.tabId ||
|
|
522
|
+
!value.paneId ||
|
|
523
|
+
!value.terminalId ||
|
|
524
|
+
!Number.isSafeInteger(value.panePid) ||
|
|
525
|
+
value.panePid <= 0) {
|
|
526
|
+
throw new Error("Herdr terminal control requires a session socket, stable terminal ID, " +
|
|
527
|
+
"current pane route, and positive shell PID");
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
function isTerminalEndpointRef(value) {
|
|
531
|
+
return isRecord(value) &&
|
|
532
|
+
isTerminalEndpointIdentity(value.identity) &&
|
|
533
|
+
isRecord(value.route) &&
|
|
534
|
+
typeof value.route.routeKey === "string";
|
|
535
|
+
}
|
|
536
|
+
function isTerminalEndpointIdentity(value) {
|
|
537
|
+
return isRecord(value) &&
|
|
538
|
+
Boolean(nonEmptyString(value.providerKind)) &&
|
|
539
|
+
Boolean(nonEmptyString(value.endpointKey)) &&
|
|
540
|
+
Boolean(nonEmptyString(value.resourceKey));
|
|
541
|
+
}
|
|
542
|
+
function isRecord(value) {
|
|
543
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
544
|
+
}
|
|
545
|
+
function isObject(value) {
|
|
546
|
+
return value !== null && typeof value === "object";
|
|
547
|
+
}
|
|
548
|
+
function nonEmptyString(value) {
|
|
549
|
+
return typeof value === "string" && value.trim().length > 0
|
|
550
|
+
? value
|
|
551
|
+
: undefined;
|
|
552
|
+
}
|
|
553
|
+
function positiveInteger(value) {
|
|
554
|
+
const parsed = Number(value);
|
|
555
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=terminal-control-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-control-ref.js","sourceRoot":"","sources":["../../src/terminal-control-ref.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Quick Start with Herdr
|
|
2
|
+
|
|
3
|
+
AKK supports local Herdr `0.8.0` (socket protocol 19) as a terminal provider alongside tmux. AKK does not start Herdr or a coding agent.
|
|
4
|
+
|
|
5
|
+
Install and open Herdr, then start Codex or Claude Code in a pane:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
brew install herdr
|
|
9
|
+
herdr
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Inside a Herdr pane, run one of:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
codex --yolo
|
|
16
|
+
# or
|
|
17
|
+
claude
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Wait for the empty idle composer. After the AKK OpenClaw plugin is installed and its Gateway restarted, use:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
/akk list
|
|
24
|
+
/akk inspect this repository and summarize it
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
AKK enumerates every running local Herdr session, identifies a terminal by its session socket plus stable `terminal_id`, and treats the current `pane_id` only as a refreshable route. Moving a live pane does not silently rebind ownership. Every side effect revalidates the terminal resource, shell PID, agent PID, cwd, native-session evidence, and current composer first.
|
|
28
|
+
|
|
29
|
+
Herdr's raw `pane send-text` command is not used for task delivery. AKK uses the Unix-socket `pane.send_input` method so multiline text follows Herdr's bracketed-paste-aware path, persists the text-injected stage, resolves the stable terminal again, and then dispatches one separate Enter.
|
|
30
|
+
|
|
31
|
+
Current boundary:
|
|
32
|
+
|
|
33
|
+
- local Unix-domain sockets only;
|
|
34
|
+
- exact Herdr `0.8.0`, protocol 19;
|
|
35
|
+
- Codex and Claude Code versions listed in the main compatibility matrix;
|
|
36
|
+
- remote/SSH Herdr sessions and Windows named pipes are not yet supported;
|
|
37
|
+
- Herdr's agent status is diagnostic only—AKK's existing screen, transcript, rollout, and native identity fences remain authoritative.
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "agent-knock-knock",
|
|
3
3
|
"name": "Agent Knock Knock",
|
|
4
|
-
"description": "Control local Codex and Claude Code through shared tmux terminals, with exact-version native status inspection, native-thread lifecycle controls, live monitoring, approvals, and human takeover.",
|
|
4
|
+
"description": "Control local Codex and Claude Code through shared tmux or Herdr terminals, with exact-version native status inspection, native-thread lifecycle controls, live monitoring, approvals, and human takeover.",
|
|
5
5
|
"icon": "https://raw.githubusercontent.com/scotthuang/agent-knock-knock/main/docs/assets/agent-knock-knock-icon.png",
|
|
6
6
|
"activation": {
|
|
7
7
|
"onStartup": true,
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"codexHome": {
|
|
94
94
|
"type": "string",
|
|
95
|
-
"description": "Optional CODEX_HOME path used to correlate Codex session metadata with eligible
|
|
95
|
+
"description": "Optional CODEX_HOME path used to correlate Codex session metadata with eligible terminal panes."
|
|
96
96
|
},
|
|
97
97
|
"idleTimeoutMinutes": {
|
|
98
98
|
"type": "number",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scotthuang/agent-knock-knock",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Control local Codex and Claude Code from OpenClaw through shared tmux terminals, with seamless human-agent handoff.",
|
|
3
|
+
"version": "0.12.0",
|
|
4
|
+
"description": "Control local Codex and Claude Code from OpenClaw through shared tmux or Herdr terminals, with seamless human-agent handoff.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/scotthuang/agent-knock-knock#readme",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"templates",
|
|
59
59
|
"docs/assets/agent-knock-knock-cover.jpg",
|
|
60
60
|
"docs/assets/agent-knock-knock-icon.png",
|
|
61
|
+
"docs/quickstart-herdr.md",
|
|
61
62
|
"docs/quickstart-tmux.md",
|
|
62
63
|
"openclaw.plugin.json",
|
|
63
64
|
"README.md",
|
|
@@ -76,6 +77,7 @@
|
|
|
76
77
|
"test:fast": "npm run build && node scripts/run-test-tier.js fast",
|
|
77
78
|
"test:integration": "npm run build && node scripts/run-test-tier.js integration",
|
|
78
79
|
"test:full": "npm run build && node scripts/run-test-tier.js full",
|
|
80
|
+
"test:affected": "npm run build && node scripts/run-affected-tests.js",
|
|
79
81
|
"test:profile": "npm run build && node scripts/profile-test-tier.js",
|
|
80
82
|
"test:release": "node scripts/run-release-tests.js",
|
|
81
83
|
"test:release:live": "node scripts/run-release-tests.js --live",
|