@scotthuang/agent-knock-knock 0.2.44 → 0.2.47

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 (49) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +148 -242
  3. package/dist/src/approval-policy.d.ts +1 -0
  4. package/dist/src/approval-policy.js +6 -0
  5. package/dist/src/approval-policy.js.map +1 -1
  6. package/dist/src/claude-hook-installer.d.ts +65 -0
  7. package/dist/src/claude-hook-installer.js +410 -0
  8. package/dist/src/claude-hook-installer.js.map +1 -0
  9. package/dist/src/claude-hook-protocol.d.ts +89 -0
  10. package/dist/src/claude-hook-protocol.js +243 -0
  11. package/dist/src/claude-hook-protocol.js.map +1 -0
  12. package/dist/src/claude-hook-store.d.ts +247 -0
  13. package/dist/src/claude-hook-store.js +1064 -0
  14. package/dist/src/claude-hook-store.js.map +1 -0
  15. package/dist/src/claude-terminal-agent-adapter.d.ts +47 -0
  16. package/dist/src/claude-terminal-agent-adapter.js +920 -0
  17. package/dist/src/claude-terminal-agent-adapter.js.map +1 -0
  18. package/dist/src/cli.js +1565 -772
  19. package/dist/src/cli.js.map +1 -1
  20. package/dist/src/codex-session-provider.d.ts +6 -32
  21. package/dist/src/codex-session-provider.js +2 -1
  22. package/dist/src/codex-session-provider.js.map +1 -1
  23. package/dist/src/codex-store-adapter.d.ts +3 -9
  24. package/dist/src/codex-store-adapter.js +5 -55
  25. package/dist/src/codex-store-adapter.js.map +1 -1
  26. package/dist/src/codex-terminal-agent-adapter.d.ts +34 -0
  27. package/dist/src/codex-terminal-agent-adapter.js +386 -0
  28. package/dist/src/codex-terminal-agent-adapter.js.map +1 -0
  29. package/dist/src/openclaw-plugin.js +60 -11
  30. package/dist/src/openclaw-plugin.js.map +1 -1
  31. package/dist/src/protocol.d.ts +1 -1
  32. package/dist/src/terminal-agent-adapter.d.ts +158 -0
  33. package/dist/src/terminal-agent-adapter.js +109 -0
  34. package/dist/src/terminal-agent-adapter.js.map +1 -0
  35. package/dist/src/terminal-agent-bridge.d.ts +114 -0
  36. package/dist/src/terminal-agent-bridge.js +487 -0
  37. package/dist/src/terminal-agent-bridge.js.map +1 -0
  38. package/dist/src/terminal-agent-registry.d.ts +7 -0
  39. package/dist/src/terminal-agent-registry.js +24 -0
  40. package/dist/src/terminal-agent-registry.js.map +1 -0
  41. package/dist/src/terminal-control-provider.d.ts +8 -6
  42. package/dist/src/terminal-control-provider.js +5 -5
  43. package/dist/src/terminal-control-provider.js.map +1 -1
  44. package/dist/src/terminal-process-source.d.ts +25 -0
  45. package/dist/src/terminal-process-source.js +77 -0
  46. package/dist/src/terminal-process-source.js.map +1 -0
  47. package/openclaw.plugin.json +7 -3
  48. package/package.json +1 -1
  49. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +19 -16
@@ -0,0 +1,487 @@
1
+ import { createHash } from "node:crypto";
2
+ import { formatTerminalConversationId, parseTerminalConversationId, terminalControlCapabilitiesForAdapter } from "./terminal-agent-adapter.js";
3
+ import { enrichActiveProcessesWithTerminalControl, terminalRefFromPane } from "./terminal-control-provider.js";
4
+ export class TerminalAgentBridge {
5
+ registry;
6
+ terminalProvider;
7
+ constructor(options) {
8
+ this.registry = options.registry;
9
+ this.terminalProvider = options.terminalProvider;
10
+ }
11
+ adapterFor(agent) {
12
+ return this.registry.require(agent);
13
+ }
14
+ async listProcesses(snapshots, agents) {
15
+ const adapters = agents
16
+ ? agents.map((agent) => this.registry.require(agent))
17
+ : this.registry.list();
18
+ const discovered = [];
19
+ for (const adapter of adapters) {
20
+ if (!adapter.capabilities.processDiscovery) {
21
+ continue;
22
+ }
23
+ const classified = snapshots
24
+ .map((snapshot) => adapter.classifyProcess(snapshot))
25
+ .filter((process) => process !== undefined)
26
+ .map((process) => ({ ...process, agent: adapter.agent }));
27
+ discovered.push(...await this.attachProcesses(adapter.agent, classified));
28
+ }
29
+ return discovered;
30
+ }
31
+ async discoverProcesses(snapshots, agents) {
32
+ return this.listProcesses(snapshots, agents);
33
+ }
34
+ async attachProcesses(agent, processes) {
35
+ const adapter = this.registry.require(agent);
36
+ return enrichActiveProcessesWithTerminalControl(processes, this.terminalProvider, {
37
+ capabilities: terminalControlCapabilitiesForAdapter(adapter)
38
+ });
39
+ }
40
+ terminalConversationId(process) {
41
+ if (!process.terminalControl) {
42
+ throw new Error(`process ${process.pid} is not terminal-controlled`);
43
+ }
44
+ this.registry.require(process.agent);
45
+ return formatTerminalConversationId({
46
+ agent: process.agent,
47
+ target: process.terminalControl.target,
48
+ pid: process.pid
49
+ });
50
+ }
51
+ async resolveConversationId(conversationId) {
52
+ const parsed = parseTerminalConversationId(conversationId);
53
+ if (!parsed) {
54
+ return undefined;
55
+ }
56
+ const adapter = this.registry.require(parsed.agent);
57
+ const panes = await this.terminalProvider.listPanes();
58
+ const pane = panes.find((candidate) => candidate.kind === parsed.kind && candidate.target === parsed.target);
59
+ if (!pane) {
60
+ throw new Error(`terminal-controlled session ${parsed.conversationId} is no longer available`);
61
+ }
62
+ return {
63
+ conversationId: parsed.conversationId,
64
+ agent: parsed.agent,
65
+ pid: parsed.pid,
66
+ legacy: parsed.legacy,
67
+ adapter,
68
+ terminalControl: terminalRefFromPane(pane, terminalControlCapabilitiesForAdapter(adapter))
69
+ };
70
+ }
71
+ async status(agent, terminalControl, options = {}) {
72
+ const adapter = this.registry.require(agent);
73
+ if (!adapter.capabilities.screenStatus ||
74
+ !terminalControl.capabilities.includes("screen_status")) {
75
+ return unsupportedScreenStatus(adapter, terminalControl);
76
+ }
77
+ try {
78
+ const { inspection } = await this.captureInspection(adapter, terminalControl, options);
79
+ return statusFromInspection(adapter, terminalControl, inspection);
80
+ }
81
+ catch (error) {
82
+ const message = error instanceof Error ? error.message : String(error);
83
+ return {
84
+ provider: terminalControl.kind,
85
+ target: terminalControl.target,
86
+ agent: adapter.agent,
87
+ reachable: false,
88
+ capabilities: adapter.capabilities,
89
+ activity_state: "unknown",
90
+ activity_reason: message,
91
+ approval_state: {
92
+ scanned: false,
93
+ blocked: false,
94
+ approvable: false,
95
+ reason: message
96
+ },
97
+ screen: { error: message }
98
+ };
99
+ }
100
+ }
101
+ async send(agent, terminalControl, text) {
102
+ const adapter = this.registry.require(agent);
103
+ if (!terminalControl.capabilities.includes("send_keys")) {
104
+ throw new Error(`${adapter.displayName} terminal input is not supported`);
105
+ }
106
+ const normalized = text.trimEnd();
107
+ if (!normalized) {
108
+ throw new Error("terminal message is empty");
109
+ }
110
+ await this.terminalProvider.sendText(terminalControl.target, normalized, {
111
+ socketPath: terminalControl.socketPath
112
+ });
113
+ await this.terminalProvider.sendKeys(terminalControl.target, ["C-m"], {
114
+ socketPath: terminalControl.socketPath
115
+ });
116
+ }
117
+ async cancel(agent, terminalControl, options = {}) {
118
+ const adapter = this.registry.require(agent);
119
+ if (adapter.capabilities.terminalApproval &&
120
+ adapter.resolveApproval &&
121
+ terminalControl.capabilities.includes("terminal_approval") &&
122
+ adapter.capabilities.screenStatus &&
123
+ terminalControl.capabilities.includes("screen_status")) {
124
+ const { inspection } = await this.captureInspection(adapter, terminalControl, options);
125
+ if (inspection.approval.approvable && inspection.approval.action.mode === "structured") {
126
+ const fingerprint = terminalApprovalFingerprint(adapter.agent, terminalControl, inspection);
127
+ if (!fingerprint) {
128
+ return {
129
+ cancelRequested: false,
130
+ reason: `${adapter.displayName} structured approval has no fingerprint`
131
+ };
132
+ }
133
+ const decision = await adapter.resolveApproval({
134
+ decision: "deny",
135
+ expectedFingerprint: fingerprint,
136
+ actualFingerprint: fingerprint,
137
+ inspection,
138
+ runtime: options.runtime,
139
+ interrupt: true
140
+ });
141
+ return {
142
+ cancelRequested: decision.resolved,
143
+ deniedApproval: decision.resolved,
144
+ requestId: decision.requestId,
145
+ reason: decision.reason
146
+ };
147
+ }
148
+ if (inspection.approval.blocked && !inspection.approval.approvable) {
149
+ return {
150
+ cancelRequested: false,
151
+ reason: inspection.approval.reason
152
+ };
153
+ }
154
+ }
155
+ if (!adapter.capabilities.cancellation ||
156
+ adapter.cancelKeys.length === 0 ||
157
+ !terminalControl.capabilities.includes("terminal_cancel")) {
158
+ return {
159
+ cancelRequested: false,
160
+ reason: `${adapter.displayName} terminal cancellation is not supported`
161
+ };
162
+ }
163
+ await this.terminalProvider.sendKeys(terminalControl.target, adapter.cancelKeys, {
164
+ socketPath: terminalControl.socketPath
165
+ });
166
+ return {
167
+ cancelRequested: true,
168
+ key: adapter.cancelKeys.length === 1 ? adapter.cancelKeys[0] : undefined,
169
+ keys: adapter.cancelKeys
170
+ };
171
+ }
172
+ async approve(agent, terminalControl, options = {}) {
173
+ const adapter = this.registry.require(agent);
174
+ if (!adapter.capabilities.terminalApproval ||
175
+ !terminalControl.capabilities.includes("terminal_approval")) {
176
+ return {
177
+ approved: false,
178
+ blocked: true,
179
+ reason: `${adapter.displayName} terminal approval is not supported`
180
+ };
181
+ }
182
+ const { inspection } = await this.captureInspection(adapter, terminalControl, options);
183
+ if (!inspection.approval.approvable) {
184
+ return {
185
+ approved: false,
186
+ blocked: inspection.approval.blocked,
187
+ reason: inspection.approval.reason,
188
+ promptKind: inspection.approval.promptKind,
189
+ command: inspection.approval.command,
190
+ screenExcerpt: inspection.screenExcerpt
191
+ };
192
+ }
193
+ const decisionMode = inspection.approval.action.mode ?? "keys";
194
+ if (options.requiredDecisionMode && decisionMode !== options.requiredDecisionMode) {
195
+ return {
196
+ approved: false,
197
+ blocked: true,
198
+ reason: `${adapter.displayName} approval mode ${decisionMode} is not eligible for this decision`,
199
+ label: inspection.approval.action.label,
200
+ promptKind: inspection.approval.promptKind,
201
+ command: inspection.approval.command,
202
+ fingerprint: terminalApprovalFingerprint(adapter.agent, terminalControl, inspection),
203
+ screenExcerpt: inspection.screenExcerpt,
204
+ decisionMode,
205
+ requestId: inspection.approval.action.requestId
206
+ };
207
+ }
208
+ if (decisionMode === "keys" && inspection.approval.action.keys.length === 0) {
209
+ return {
210
+ approved: false,
211
+ blocked: true,
212
+ reason: `${adapter.displayName} approval action has no keys`,
213
+ label: inspection.approval.action.label,
214
+ promptKind: inspection.approval.promptKind,
215
+ command: inspection.approval.command,
216
+ screenExcerpt: inspection.screenExcerpt
217
+ };
218
+ }
219
+ const fingerprint = terminalApprovalFingerprint(adapter.agent, terminalControl, inspection);
220
+ if (options.expectedFingerprint && options.expectedFingerprint !== fingerprint) {
221
+ return {
222
+ approved: false,
223
+ blocked: true,
224
+ reason: "approval fingerprint changed before execution",
225
+ key: inspection.approval.action.keys.length === 1
226
+ ? inspection.approval.action.keys[0]
227
+ : undefined,
228
+ keys: inspection.approval.action.keys,
229
+ label: inspection.approval.action.label,
230
+ promptKind: inspection.approval.promptKind,
231
+ command: inspection.approval.command,
232
+ fingerprint,
233
+ screenExcerpt: inspection.screenExcerpt,
234
+ decisionMode,
235
+ requestId: inspection.approval.action.requestId
236
+ };
237
+ }
238
+ if (decisionMode === "structured") {
239
+ if (!options.expectedFingerprint) {
240
+ return {
241
+ approved: false,
242
+ blocked: true,
243
+ reason: "structured approval requires the latest expected fingerprint",
244
+ label: inspection.approval.action.label,
245
+ promptKind: inspection.approval.promptKind,
246
+ command: inspection.approval.command,
247
+ fingerprint,
248
+ screenExcerpt: inspection.screenExcerpt,
249
+ decisionMode,
250
+ requestId: inspection.approval.action.requestId
251
+ };
252
+ }
253
+ if (!fingerprint || !adapter.resolveApproval) {
254
+ return {
255
+ approved: false,
256
+ blocked: true,
257
+ reason: `${adapter.displayName} structured approval resolver is unavailable`,
258
+ fingerprint,
259
+ screenExcerpt: inspection.screenExcerpt,
260
+ decisionMode,
261
+ requestId: inspection.approval.action.requestId
262
+ };
263
+ }
264
+ const resolved = await adapter.resolveApproval({
265
+ decision: "allow",
266
+ expectedFingerprint: options.expectedFingerprint,
267
+ actualFingerprint: fingerprint,
268
+ inspection,
269
+ runtime: options.runtime
270
+ });
271
+ return {
272
+ approved: resolved.resolved,
273
+ blocked: !resolved.resolved,
274
+ reason: resolved.reason,
275
+ label: inspection.approval.action.label,
276
+ promptKind: inspection.approval.promptKind,
277
+ command: inspection.approval.command,
278
+ fingerprint,
279
+ screenExcerpt: inspection.screenExcerpt,
280
+ decisionMode,
281
+ requestId: resolved.requestId ?? inspection.approval.action.requestId
282
+ };
283
+ }
284
+ await this.terminalProvider.sendKeys(terminalControl.target, inspection.approval.action.keys, { socketPath: terminalControl.socketPath });
285
+ return {
286
+ approved: true,
287
+ blocked: false,
288
+ key: inspection.approval.action.keys.length === 1
289
+ ? inspection.approval.action.keys[0]
290
+ : undefined,
291
+ keys: inspection.approval.action.keys,
292
+ label: inspection.approval.action.label,
293
+ promptKind: inspection.approval.promptKind,
294
+ command: inspection.approval.command,
295
+ fingerprint,
296
+ screenExcerpt: inspection.screenExcerpt,
297
+ decisionMode,
298
+ requestId: inspection.approval.action.requestId
299
+ };
300
+ }
301
+ async monitorPoll(options) {
302
+ const adapter = this.registry.require(options.agent);
303
+ let inspection;
304
+ let status = unsupportedScreenStatus(adapter, options.terminalControl);
305
+ if (adapter.capabilities.screenStatus &&
306
+ options.terminalControl.capabilities.includes("screen_status")) {
307
+ try {
308
+ const captured = await this.captureInspection(adapter, options.terminalControl, options.screenOptions);
309
+ inspection = captured.inspection;
310
+ status = statusFromInspection(adapter, options.terminalControl, inspection);
311
+ }
312
+ catch (error) {
313
+ status = failedScreenStatus(adapter, options.terminalControl, error);
314
+ }
315
+ }
316
+ let durableCompletion;
317
+ let durableError;
318
+ try {
319
+ durableCompletion = adapter.capabilities.durableCompletion &&
320
+ options.terminalControl.capabilities.includes("durable_completion") &&
321
+ options.durableRequest
322
+ ? await adapter.detectDurableCompletion?.(options.durableRequest)
323
+ : undefined;
324
+ }
325
+ catch (error) {
326
+ durableError = error instanceof Error ? error.message : String(error);
327
+ }
328
+ const screenCompletion = adapter.capabilities.screenCompletion &&
329
+ options.terminalControl.capabilities.includes("screen_completion")
330
+ ? inspection?.completion
331
+ : undefined;
332
+ const limitations = [
333
+ status.capability_limitation,
334
+ durableError ? `durable completion failed: ${durableError}` : undefined,
335
+ !adapter.capabilities.screenCompletion && !adapter.capabilities.durableCompletion
336
+ ? `${adapter.displayName} terminal completion detection is not supported`
337
+ : undefined
338
+ ].filter((value) => Boolean(value));
339
+ return {
340
+ status: limitations.length > 0
341
+ ? { ...status, capability_limitation: limitations.join("; ") }
342
+ : status,
343
+ inspection,
344
+ durableCompletion,
345
+ completion: durableCompletion ?? screenCompletion
346
+ };
347
+ }
348
+ async captureInspection(adapter, terminalControl, options = {}) {
349
+ const screen = await this.terminalProvider.capture(terminalControl.target, {
350
+ scrollbackLines: options.scrollbackLines ?? 120,
351
+ socketPath: terminalControl.socketPath
352
+ });
353
+ return {
354
+ screen,
355
+ inspection: adapter.inspectScreen({
356
+ screen,
357
+ requestText: options.requestText,
358
+ screenChangedSinceSend: options.screenChangedSinceSend,
359
+ maxExcerptLength: options.maxExcerptLength,
360
+ runtime: options.runtime
361
+ })
362
+ };
363
+ }
364
+ }
365
+ export function terminalApprovalFingerprint(agent, terminalControl, inspection) {
366
+ if (!inspection.approval.approvable) {
367
+ return undefined;
368
+ }
369
+ const decisionMode = inspection.approval.action.mode ?? "keys";
370
+ return createHash("sha256")
371
+ .update(JSON.stringify({
372
+ agent,
373
+ provider: "tmux",
374
+ target: terminalControl.target,
375
+ keys: inspection.approval.action.keys,
376
+ label: inspection.approval.action.label,
377
+ prompt_kind: inspection.approval.promptKind,
378
+ command: inspection.approval.command,
379
+ tool_name: inspection.approval.toolName,
380
+ request_detail: inspection.approval.requestDetail,
381
+ screen_excerpt: decisionMode === "structured" ? undefined : inspection.screenExcerpt,
382
+ decision_mode: decisionMode,
383
+ request_id: inspection.approval.action.requestId
384
+ }))
385
+ .digest("hex");
386
+ }
387
+ function statusFromInspection(adapter, terminalControl, inspection) {
388
+ const approval = inspection.approval;
389
+ const fingerprint = terminalApprovalFingerprint(adapter.agent, terminalControl, inspection);
390
+ return {
391
+ provider: terminalControl.kind,
392
+ target: terminalControl.target,
393
+ agent: adapter.agent,
394
+ reachable: true,
395
+ capabilities: adapter.capabilities,
396
+ activity_state: inspection.activity.state,
397
+ activity_reason: inspection.activity.reason,
398
+ approval_state: {
399
+ scanned: true,
400
+ blocked: approval.blocked,
401
+ approvable: approval.approvable,
402
+ key: approval.approvable && approval.action.keys.length === 1
403
+ ? approval.action.keys[0]
404
+ : undefined,
405
+ keys: approval.approvable ? approval.action.keys : undefined,
406
+ label: approval.approvable ? approval.action.label : undefined,
407
+ prompt_kind: approval.promptKind,
408
+ command: approval.command,
409
+ tool_name: approval.toolName,
410
+ request_detail: approval.requestDetail,
411
+ reason: approval.approvable ? undefined : approval.reason,
412
+ fingerprint,
413
+ decision_mode: approval.approvable ? approval.action.mode ?? "keys" : undefined,
414
+ request_id: approval.approvable ? approval.action.requestId : undefined
415
+ },
416
+ screen: {
417
+ excerpt: inspection.screenExcerpt,
418
+ approval: approvalOutput(approval)
419
+ }
420
+ };
421
+ }
422
+ function failedScreenStatus(adapter, terminalControl, error) {
423
+ const message = error instanceof Error ? error.message : String(error);
424
+ return {
425
+ provider: terminalControl.kind,
426
+ target: terminalControl.target,
427
+ agent: adapter.agent,
428
+ reachable: false,
429
+ capabilities: adapter.capabilities,
430
+ activity_state: "unknown",
431
+ activity_reason: message,
432
+ approval_state: {
433
+ scanned: false,
434
+ blocked: false,
435
+ approvable: false,
436
+ reason: message
437
+ },
438
+ screen: { error: message }
439
+ };
440
+ }
441
+ function approvalOutput(approval) {
442
+ if (!approval.approvable) {
443
+ return {
444
+ blocked: approval.blocked,
445
+ approvable: false,
446
+ reason: approval.reason,
447
+ promptKind: approval.promptKind,
448
+ command: approval.command,
449
+ toolName: approval.toolName,
450
+ requestDetail: approval.requestDetail
451
+ };
452
+ }
453
+ return {
454
+ blocked: true,
455
+ approvable: true,
456
+ key: approval.action.keys.length === 1 ? approval.action.keys[0] : undefined,
457
+ keys: approval.action.keys,
458
+ label: approval.action.label,
459
+ promptKind: approval.promptKind,
460
+ command: approval.command,
461
+ toolName: approval.toolName,
462
+ requestDetail: approval.requestDetail,
463
+ decisionMode: approval.action.mode ?? "keys",
464
+ requestId: approval.action.requestId
465
+ };
466
+ }
467
+ function unsupportedScreenStatus(adapter, terminalControl) {
468
+ const reason = `${adapter.displayName} terminal screen status is not supported`;
469
+ return {
470
+ provider: terminalControl.kind,
471
+ target: terminalControl.target,
472
+ agent: adapter.agent,
473
+ reachable: true,
474
+ capabilities: adapter.capabilities,
475
+ activity_state: "unknown",
476
+ activity_reason: reason,
477
+ approval_state: {
478
+ scanned: false,
479
+ blocked: false,
480
+ approvable: false,
481
+ reason
482
+ },
483
+ screen: {},
484
+ capability_limitation: reason
485
+ };
486
+ }
487
+ //# sourceMappingURL=terminal-agent-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-agent-bridge.js","sourceRoot":"","sources":["../../src/terminal-agent-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type TerminalAgentAdapter } from "./terminal-agent-adapter.js";
2
+ import type { ExecutorKind } from "./executors.js";
3
+ export declare function createProductionTerminalAgentRegistry(options?: {
4
+ overrides?: readonly TerminalAgentAdapter[];
5
+ }): import("./terminal-agent-adapter.js").TerminalAgentAdapterRegistry;
6
+ export declare const terminalAgentAdapterRegistry: import("./terminal-agent-adapter.js").TerminalAgentAdapterRegistry;
7
+ export declare function terminalAgentAdapterFor(agent: ExecutorKind | string): TerminalAgentAdapter;
@@ -0,0 +1,24 @@
1
+ import { codexTerminalAgentAdapter } from "./codex-terminal-agent-adapter.js";
2
+ import { claudeTerminalAgentAdapter } from "./claude-terminal-agent-adapter.js";
3
+ import { createTerminalAgentAdapterRegistry } from "./terminal-agent-adapter.js";
4
+ /** New production terminal agents opt in once here after providing a complete adapter. */
5
+ const productionTerminalAgentAdapters = [
6
+ codexTerminalAgentAdapter,
7
+ claudeTerminalAgentAdapter
8
+ ];
9
+ export function createProductionTerminalAgentRegistry(options = {}) {
10
+ const overrides = new Map((options.overrides ?? []).map((adapter) => [adapter.agent, adapter]));
11
+ const adapters = productionTerminalAgentAdapters.map((adapter) => overrides.get(adapter.agent) ?? adapter);
12
+ const productionAgents = new Set(adapters.map((adapter) => adapter.agent));
13
+ for (const adapter of overrides.values()) {
14
+ if (!productionAgents.has(adapter.agent)) {
15
+ adapters.push(adapter);
16
+ }
17
+ }
18
+ return createTerminalAgentAdapterRegistry(adapters);
19
+ }
20
+ export const terminalAgentAdapterRegistry = createProductionTerminalAgentRegistry();
21
+ export function terminalAgentAdapterFor(agent) {
22
+ return terminalAgentAdapterRegistry.require(agent);
23
+ }
24
+ //# sourceMappingURL=terminal-agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-agent-registry.js","sourceRoot":"","sources":["../../src/terminal-agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EACL,kCAAkC,EAEnC,MAAM,6BAA6B,CAAC;AAGrC,0FAA0F;AAC1F,MAAM,+BAA+B,GAAoC;IACvE,yBAAyB;IACzB,0BAA0B;CAC3B,CAAC;AAEF,MAAM,UAAU,qCAAqC,CAAC,UAElD,EAAE;IACJ,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CACrE,CAAC;IACF,MAAM,QAAQ,GAAG,+BAA+B,CAAC,GAAG,CAClD,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CACrD,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,kCAAkC,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,qCAAqC,EAAE,CAAC;AAEpF,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,OAAO,4BAA4B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ActiveCodexProcess, TerminalControlRef } from "./codex-session-provider.js";
1
+ import type { ActiveTerminalProcess, TerminalControlCapability, TerminalControlRef } from "./terminal-agent-adapter.js";
2
2
  export interface TerminalPane {
3
3
  kind: "tmux";
4
4
  target: string;
@@ -19,7 +19,7 @@ export interface TerminalControlProvider {
19
19
  sendText(target: string, text: string, options?: {
20
20
  socketPath?: string;
21
21
  }): Promise<void>;
22
- sendKeys(target: string, keys: string[], options?: {
22
+ sendKeys(target: string, keys: readonly string[], options?: {
23
23
  socketPath?: string;
24
24
  }): Promise<void>;
25
25
  }
@@ -60,7 +60,7 @@ export declare class TmuxTerminalControlProvider implements TerminalControlProvi
60
60
  scrollbackLines?: number;
61
61
  socketPath?: string;
62
62
  }): Promise<string>;
63
- sendKeys(target: string, keys: string[], options?: {
63
+ sendKeys(target: string, keys: readonly string[], options?: {
64
64
  socketPath?: string;
65
65
  }): Promise<void>;
66
66
  sendText(target: string, text: string, options?: {
@@ -81,9 +81,11 @@ export declare class StaticTerminalControlProvider implements TerminalControlPro
81
81
  listPanes(): Promise<TerminalPane[]>;
82
82
  capture(target: string): Promise<string>;
83
83
  sendText(target: string, text: string): Promise<void>;
84
- sendKeys(target: string, keys: string[]): Promise<void>;
84
+ sendKeys(target: string, keys: readonly string[]): Promise<void>;
85
85
  }
86
86
  export declare function parseTmuxListPanes(output: string, socketPath?: string): TerminalPane[];
87
- export declare function enrichActiveProcessesWithTerminalControl(processes: ActiveCodexProcess[], provider: TerminalControlProvider): Promise<ActiveCodexProcess[]>;
88
- export declare function terminalRefFromPane(pane: TerminalPane): TerminalControlRef;
87
+ export declare function enrichActiveProcessesWithTerminalControl<T extends ActiveTerminalProcess>(processes: T[], provider: TerminalControlProvider, options?: {
88
+ capabilities?: readonly TerminalControlCapability[];
89
+ }): Promise<T[]>;
90
+ export declare function terminalRefFromPane(pane: TerminalPane, capabilities?: readonly TerminalControlCapability[]): TerminalControlRef;
89
91
  export declare function discoverTmuxSocketPaths(root: string): string[];
@@ -118,7 +118,7 @@ export class StaticTerminalControlProvider {
118
118
  this.sentKeys.push({ target, keys: ["-l", text] });
119
119
  }
120
120
  async sendKeys(target, keys) {
121
- this.sentKeys.push({ target, keys });
121
+ this.sentKeys.push({ target, keys: [...keys] });
122
122
  }
123
123
  }
124
124
  export function parseTmuxListPanes(output, socketPath) {
@@ -179,7 +179,7 @@ function parseUnderscoreTmuxPaneLine(line) {
179
179
  const match = /^(.+)_(\d+)_(\d+)_(\d+)_([^_]+)_(.+?)\s*$/u.exec(line.trim());
180
180
  return match ? match.slice(1) : undefined;
181
181
  }
182
- export async function enrichActiveProcessesWithTerminalControl(processes, provider) {
182
+ export async function enrichActiveProcessesWithTerminalControl(processes, provider, options = {}) {
183
183
  const panes = await provider.listPanes();
184
184
  if (panes.length === 0) {
185
185
  return processes;
@@ -208,11 +208,11 @@ export async function enrichActiveProcessesWithTerminalControl(processes, provid
208
208
  }
209
209
  return {
210
210
  ...process,
211
- terminalControl: terminalRefFromPane(pane)
211
+ terminalControl: terminalRefFromPane(pane, options.capabilities)
212
212
  };
213
213
  });
214
214
  }
215
- export function terminalRefFromPane(pane) {
215
+ export function terminalRefFromPane(pane, capabilities = ["screen_status", "send_keys"]) {
216
216
  return {
217
217
  kind: "tmux",
218
218
  target: pane.target,
@@ -223,7 +223,7 @@ export function terminalRefFromPane(pane) {
223
223
  panePid: pane.panePid,
224
224
  currentCommand: pane.currentCommand,
225
225
  currentPath: pane.currentPath,
226
- capabilities: ["screen_status", "send_keys", "terminal_approval"]
226
+ capabilities: [...capabilities]
227
227
  };
228
228
  }
229
229
  function processBelongsToPane(process, pane, processes) {