@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.
Files changed (41) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +21 -15
  3. package/dist/src/cli-core.d.ts +48 -0
  4. package/dist/src/cli-core.js +20089 -0
  5. package/dist/src/cli-core.js.map +1 -0
  6. package/dist/src/cli.js +12 -19719
  7. package/dist/src/cli.js.map +1 -1
  8. package/dist/src/doctor-capabilities.d.ts +10 -2
  9. package/dist/src/doctor-capabilities.js +48 -7
  10. package/dist/src/doctor-capabilities.js.map +1 -1
  11. package/dist/src/herdr-terminal-control-provider.d.ts +115 -0
  12. package/dist/src/herdr-terminal-control-provider.js +961 -0
  13. package/dist/src/herdr-terminal-control-provider.js.map +1 -0
  14. package/dist/src/managed-session.d.ts +15 -0
  15. package/dist/src/managed-session.js +142 -15
  16. package/dist/src/managed-session.js.map +1 -1
  17. package/dist/src/native-thread-resume-snapshot.d.ts +13 -3
  18. package/dist/src/native-thread-resume-snapshot.js +105 -16
  19. package/dist/src/native-thread-resume-snapshot.js.map +1 -1
  20. package/dist/src/openclaw-plugin-helpers.js +4 -4
  21. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  22. package/dist/src/openclaw-plugin.js +28 -26
  23. package/dist/src/openclaw-plugin.js.map +1 -1
  24. package/dist/src/session-store.js +5 -0
  25. package/dist/src/session-store.js.map +1 -1
  26. package/dist/src/terminal-agent-adapter.d.ts +5 -16
  27. package/dist/src/terminal-agent-adapter.js +10 -6
  28. package/dist/src/terminal-agent-adapter.js.map +1 -1
  29. package/dist/src/terminal-agent-bridge.d.ts +11 -1
  30. package/dist/src/terminal-agent-bridge.js +199 -86
  31. package/dist/src/terminal-agent-bridge.js.map +1 -1
  32. package/dist/src/terminal-control-provider.d.ts +60 -21
  33. package/dist/src/terminal-control-provider.js +452 -30
  34. package/dist/src/terminal-control-provider.js.map +1 -1
  35. package/dist/src/terminal-control-ref.d.ts +141 -0
  36. package/dist/src/terminal-control-ref.js +557 -0
  37. package/dist/src/terminal-control-ref.js.map +1 -0
  38. package/docs/quickstart-herdr.md +37 -0
  39. package/openclaw.plugin.json +2 -2
  40. package/package.json +4 -2
  41. 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.
@@ -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 tmux terminals."
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.11.6",
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",