termify-agent 1.0.24 → 1.0.26

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.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAStC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,KAAM,SAAQ,YAAY;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;;IAmBxC;;OAEG;IACH,OAAO,CAAC,aAAa;IAuHrB;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCzD;;OAEG;IACH,IAAI,IAAI,IAAI;IAuBZ;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,GAAG,IAAI,CAEtB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;SAC9B,CAAC;KACH;CAeF"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAatC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,KAAM,SAAQ,YAAY;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;;IAmBxC;;OAEG;IACH,OAAO,CAAC,aAAa;IAkLrB;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCzD;;OAEG;IACH,IAAI,IAAI,IAAI;IAuBZ;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,GAAG,IAAI,CAEtB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;SAC9B,CAAC;KACH;CAeF"}
package/dist/agent.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { EventEmitter } from 'events';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { promises as fs } from 'fs';
2
5
  import { WSClient } from './ws-client.js';
3
6
  import { PTYManager } from './pty-manager.js';
4
7
  import { SSHManager } from './ssh-manager.js';
@@ -44,12 +47,25 @@ export class Agent extends EventEmitter {
44
47
  return;
45
48
  }
46
49
  logger.info(`Creating local terminal ${terminalId}`);
50
+ const config = getConfig();
51
+ const serverUrl = (config.serverUrl || '').replace(/\/$/, '');
52
+ const termifyStatusUrl = serverUrl ? `${serverUrl}/api/mcp/status` : undefined;
53
+ const termifySessionId = config.agentId || config.machineId || terminalId;
54
+ const env = {
55
+ ...(options.env || {}),
56
+ };
57
+ if (!env.TERMIFY_STATUS_URL && termifyStatusUrl)
58
+ env.TERMIFY_STATUS_URL = termifyStatusUrl;
59
+ if (!env.TERMIFY_TERMINAL_ID)
60
+ env.TERMIFY_TERMINAL_ID = terminalId;
61
+ if (!env.TERMIFY_SESSION_ID)
62
+ env.TERMIFY_SESSION_ID = termifySessionId;
47
63
  const created = this.ptyManager.create(terminalId, {
48
64
  cols,
49
65
  rows,
50
66
  cwd: options.cwd,
51
67
  shell: options.shell,
52
- env: options.env,
68
+ env,
53
69
  });
54
70
  if (created) {
55
71
  this.wsClient.sendTerminalStatus(terminalId, 'RUNNING');
@@ -78,6 +94,50 @@ export class Agent extends EventEmitter {
78
94
  this.ptyManager.write(terminalId, data);
79
95
  }
80
96
  });
97
+ // Terminal paste files - write to disk locally and paste @paths into the terminal.
98
+ this.wsClient.on('terminalPasteFiles', async (terminalId, files) => {
99
+ try {
100
+ if (!Array.isArray(files) || files.length === 0)
101
+ return;
102
+ if (files.length > 10) {
103
+ logger.warn(`[PasteFiles] Too many files for terminal ${terminalId} (${files.length})`);
104
+ return;
105
+ }
106
+ const totalB64 = files.reduce((sum, f) => sum + ((f?.dataBase64?.length) || 0), 0);
107
+ if (totalB64 > 25 * 1024 * 1024) {
108
+ logger.warn(`[PasteFiles] Payload too large for terminal ${terminalId}`);
109
+ return;
110
+ }
111
+ const baseDir = path.join(os.tmpdir(), 'termify-pastes', terminalId, String(Date.now()));
112
+ await fs.mkdir(baseDir, { recursive: true });
113
+ const sanitize = (name) => {
114
+ const base = (name || 'attachment').split('/').pop() || 'attachment';
115
+ return base.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 180) || 'attachment';
116
+ };
117
+ const writtenPaths = [];
118
+ for (const f of files) {
119
+ const fileName = sanitize(f.name);
120
+ const outPath = path.join(baseDir, fileName);
121
+ const buf = Buffer.from(f.dataBase64 || '', 'base64');
122
+ await fs.writeFile(outPath, buf);
123
+ writtenPaths.push(outPath);
124
+ }
125
+ // Paste paths into whichever terminal type is active.
126
+ // NOTE: For SSH terminals, these files exist locally on the agent, not on the remote host.
127
+ for (const p of writtenPaths) {
128
+ const text = `@${p}\r`;
129
+ if (this.sshManager.has(terminalId)) {
130
+ this.sshManager.write(terminalId, text);
131
+ }
132
+ else {
133
+ this.ptyManager.write(terminalId, text);
134
+ }
135
+ }
136
+ }
137
+ catch (err) {
138
+ logger.warn(`[PasteFiles] Failed for terminal ${terminalId}: ${err instanceof Error ? err.message : String(err)}`);
139
+ }
140
+ });
81
141
  // Terminal resize - route to appropriate manager
82
142
  this.wsClient.on('terminalResize', (terminalId, cols, rows) => {
83
143
  if (this.sshManager.has(terminalId)) {
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@ export interface PTYInstance {
17
17
  rows: number;
18
18
  isWorking: boolean;
19
19
  lastInputTime: number;
20
+ lastWriteAt?: number;
21
+ lastWriteHadNewline?: boolean;
20
22
  idleTimeout: NodeJS.Timeout | null;
21
23
  processCheckInterval: NodeJS.Timeout | null;
22
24
  processCheckGeneration: number;
@@ -31,6 +33,8 @@ export interface PTYInstance {
31
33
  lastOutputTime?: number;
32
34
  mcpAutoActive?: boolean;
33
35
  lastMcpStatusSent?: MCPStatus;
36
+ lastMcpMessageSent?: string;
37
+ lastMcpNeedsInputPromptSent?: string;
34
38
  mcpKeepaliveTimer?: NodeJS.Timeout | null;
35
39
  }
36
40
  type DataCallback = (terminalId: string, data: string) => void;
@@ -56,6 +60,8 @@ export declare class PTYManager {
56
60
  private nodePtyModule;
57
61
  private static PROCESS_CHECK_INTERVAL_MS;
58
62
  private static AI_TOOL_PATTERNS;
63
+ private static MCP_AUTHORITATIVE_PATTERNS;
64
+ private static MCP_AUTO_ENABLED;
59
65
  private static REPL_PROCESS_PATTERNS;
60
66
  /**
61
67
  * Check if a file exists and is executable
@@ -95,7 +101,13 @@ export declare class PTYManager {
95
101
  * Check if process appears to be an AI terminal tool (Claude/Codex/etc.).
96
102
  */
97
103
  private isAiToolProcess;
104
+ private getSilenceTimeout;
105
+ private isMcpAuthoritativeProcess;
98
106
  private static readonly MCP_KEEPALIVE_MS;
107
+ private stripAnsi;
108
+ private detectNeedsInputPrompt;
109
+ private detectErrorMessage;
110
+ private sendMcpStatusIfChanged;
99
111
  private mapDaemonStateToMcpStatus;
100
112
  private stopMcpKeepalive;
101
113
  private startMcpKeepalive;
@@ -107,6 +119,7 @@ export declare class PTYManager {
107
119
  * Only applies to REPL processes - normal commands trust daemon state directly.
108
120
  */
109
121
  private static readonly OUTPUT_SILENCE_TIMEOUT;
122
+ private static readonly AI_SILENCE_TIMEOUT;
110
123
  private startOutputSilenceTimer;
111
124
  private clearOutputSilenceTimer;
112
125
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,15 @@ export class PTYManager {
27
27
  static PROCESS_CHECK_INTERVAL_MS = 300;
28
28
  // AI tool patterns for MCP detection
29
29
  static AI_TOOL_PATTERNS = ['claude', 'codex', 'aider', 'cursor'];
30
+ // Processes where MCP is the source of truth for terminal state.
31
+ // For these, we suppress legacy `working` inference to avoid conflicting UI.
32
+ static MCP_AUTHORITATIVE_PATTERNS = ['claude', 'codex'];
33
+ // Maestro-style behavior: AI tools (Claude/Codex) should own status by calling
34
+ // the MCP tool (`termify_status`). Agent-side auto-MCP can fight the model and
35
+ // cause incorrect states (e.g. keypresses flipping state).
36
+ //
37
+ // Set TERMIFY_MCP_AUTO=1 only if you explicitly want agent-side inference.
38
+ static MCP_AUTO_ENABLED = process.env.TERMIFY_MCP_AUTO === '1';
30
39
  // REPL/long-lived processes where event loop stays active even when idle.
31
40
  // For these, output silence = idle. For all others, trust daemon state directly.
32
41
  static REPL_PROCESS_PATTERNS = ['node', 'python', 'python3', 'ruby', 'irb', 'julia', 'R', 'ghci', 'claude', 'codex', 'aider', 'cursor'];
@@ -129,12 +138,15 @@ export class PTYManager {
129
138
  instance.daemonState = event.state;
130
139
  instance.activeProcess = effectiveProcessName;
131
140
  this.maybeSendAutoMcpStatus(event.terminalId, instance, event.state, effectiveProcessName);
141
+ // For MCP-authoritative tools (Claude/Codex), MCP can be the source of truth
142
+ // when present, but we still allow legacy working detection as a fallback.
143
+ // The server will suppress legacy updates when a fresh MCP override exists.
132
144
  // Map daemon state to working state.
133
145
  // For generic REPLs (node/python/etc.) on macOS, daemon can report
134
146
  // NeedsInput while process is still active (event loop SSLEEP). Keep these
135
147
  // as working and rely on output silence to mark idle.
136
148
  // For AI tools (claude/codex/etc.), NeedsInput means "waiting for user",
137
- // so treat it as NOT working.
149
+ // so treat it as NOT working and send MCP needs_input.
138
150
  const isReplActive = this.isReplProcess(effectiveProcessName);
139
151
  const isAiToolActive = this.isAiToolProcess(effectiveProcessName);
140
152
  if (event.state === TerminalState.Working ||
@@ -163,6 +175,11 @@ export class PTYManager {
163
175
  this.onWorking(event.terminalId, false, effectiveProcessName);
164
176
  }
165
177
  }
178
+ // For AI tools, NeedsInput → send MCP needs_input so the UI shows
179
+ // the orange banner (works even when MCP_AUTO is disabled).
180
+ if (event.state === TerminalState.NeedsInput && isAiToolActive) {
181
+ this.wsClient?.sendTerminalMcpStatus(event.terminalId, 'needs_input');
182
+ }
166
183
  }
167
184
  // Handle terminal finished (shell died)
168
185
  if (event.state === TerminalState.Finished) {
@@ -190,7 +207,82 @@ export class PTYManager {
190
207
  const lower = processName.toLowerCase();
191
208
  return PTYManager.AI_TOOL_PATTERNS.some((p) => lower.includes(p));
192
209
  }
210
+ getSilenceTimeout(processName) {
211
+ return this.isAiToolProcess(processName) ? PTYManager.AI_SILENCE_TIMEOUT : PTYManager.OUTPUT_SILENCE_TIMEOUT;
212
+ }
213
+ isMcpAuthoritativeProcess(processName) {
214
+ if (!processName)
215
+ return false;
216
+ const lower = processName.toLowerCase();
217
+ return PTYManager.MCP_AUTHORITATIVE_PATTERNS.some((p) => lower.includes(p));
218
+ }
193
219
  static MCP_KEEPALIVE_MS = 15_000;
220
+ stripAnsi(input) {
221
+ // Basic ANSI escape stripping for prompt detection.
222
+ return input.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
223
+ }
224
+ detectNeedsInputPrompt(output) {
225
+ const text = this.stripAnsi(output);
226
+ const lower = text.toLowerCase();
227
+ // Be conservative: "needs_input" should only light up for explicit selection / confirmation prompts,
228
+ // not just because the AI is waiting for normal chat input (that's "idle").
229
+ const explicit =
230
+ // English
231
+ /(select|choose|pick)\s+(an?\s+)?(option|one)\b/.test(lower) ||
232
+ /(enter|type)\s+(your\s+)?(choice|selection|option|number)\b/.test(lower) ||
233
+ /\benter\s+to\s+select\b/.test(lower) ||
234
+ /\besc\s+to\s+cancel\b/.test(lower) ||
235
+ /\b(choice|selection)\s*:\s*$/.test(lower) ||
236
+ /\b(y\/n)\b|\[y\/n\]|\(y\/n\)|\bcontinue\?\s*\[y\/n\]|\bproceed\?\s*\[y\/n\]/.test(lower) ||
237
+ /\bpress\s+(enter|return)\s+to\s+continue\b/.test(lower) ||
238
+ // Spanish
239
+ /elige\s+(una|un|la|el)\b/.test(lower) ||
240
+ /selecciona\b/.test(lower) ||
241
+ /[¿?]?\s*cu[aá]l\s+elig(e|es)\b/.test(lower) ||
242
+ /(opci[oó]n|opciones)\b.*\b(elige|selecciona)\b/.test(lower) ||
243
+ /\bpulsa\s+(enter|intro|retorno)\b/.test(lower) ||
244
+ /\bpresiona\s+(enter|intro|retorno)\b/.test(lower) ||
245
+ /\b(enter|intro)\s+para\s+(seleccionar|elegir|continuar)\b/.test(lower) ||
246
+ /\besc\s+para\s+cancelar\b/.test(lower) ||
247
+ /\bintro\s+para\s+seleccionar\b/.test(lower);
248
+ // Numbered options often come with an "enter your choice" style line; don't trigger on numbers alone.
249
+ if (!explicit)
250
+ return null;
251
+ // Keep prompt short for UI.
252
+ const snippet = text.trim().slice(-220);
253
+ return snippet.length ? snippet : null;
254
+ }
255
+ detectErrorMessage(output) {
256
+ const text = this.stripAnsi(output);
257
+ const lower = text.toLowerCase();
258
+ // Keep conservative: only obvious failures should flip the terminal into "error".
259
+ const explicit = /\berror\b\s*[:\]]/.test(lower) ||
260
+ /\bfailed\b/.test(lower) ||
261
+ /\bexception\b/.test(lower) ||
262
+ /\btraceback\b/.test(lower) ||
263
+ /\bpanic\b/.test(lower) ||
264
+ /\bunhandled\b/.test(lower);
265
+ if (!explicit)
266
+ return null;
267
+ const snippet = text.trim().slice(-220);
268
+ return snippet.length ? snippet : 'Error';
269
+ }
270
+ sendMcpStatusIfChanged(terminalId, instance, state, message, needsInputPrompt) {
271
+ if (!PTYManager.MCP_AUTO_ENABLED)
272
+ return;
273
+ if (instance.lastMcpStatusSent === state &&
274
+ instance.lastMcpMessageSent === message &&
275
+ instance.lastMcpNeedsInputPromptSent === needsInputPrompt) {
276
+ return;
277
+ }
278
+ instance.lastMcpStatusSent = state;
279
+ instance.lastMcpMessageSent = message;
280
+ instance.lastMcpNeedsInputPromptSent = needsInputPrompt;
281
+ if (process.env.TERMIFY_MCP_DEBUG === '1') {
282
+ logger.info(`[MCP] terminal=${terminalId.substring(0, 8)}... state=${state} proc=${instance.activeProcess || 'null'}`);
283
+ }
284
+ this.wsClient?.sendTerminalMcpStatus(terminalId, state, message, needsInputPrompt);
285
+ }
194
286
  mapDaemonStateToMcpStatus(state) {
195
287
  switch (state) {
196
288
  case TerminalState.Idle:
@@ -208,12 +300,16 @@ export class PTYManager {
208
300
  }
209
301
  }
210
302
  stopMcpKeepalive(instance) {
303
+ if (!PTYManager.MCP_AUTO_ENABLED)
304
+ return;
211
305
  if (instance.mcpKeepaliveTimer) {
212
306
  clearInterval(instance.mcpKeepaliveTimer);
213
307
  instance.mcpKeepaliveTimer = null;
214
308
  }
215
309
  }
216
310
  startMcpKeepalive(terminalId, instance) {
311
+ if (!PTYManager.MCP_AUTO_ENABLED)
312
+ return;
217
313
  if (instance.mcpKeepaliveTimer)
218
314
  return;
219
315
  instance.mcpKeepaliveTimer = setInterval(() => {
@@ -225,15 +321,15 @@ export class PTYManager {
225
321
  }, PTYManager.MCP_KEEPALIVE_MS);
226
322
  }
227
323
  maybeSendAutoMcpStatus(terminalId, instance, state, processName) {
228
- const mapped = this.mapDaemonStateToMcpStatus(state);
324
+ if (!PTYManager.MCP_AUTO_ENABLED)
325
+ return;
229
326
  const isAi = this.isAiToolProcess(processName);
327
+ const isMcpAuth = this.isMcpAuthoritativeProcess(processName);
230
328
  // Start/stop auto MCP reporting based on whether an AI tool is the active process.
231
329
  if (!isAi) {
232
330
  if (instance.mcpAutoActive) {
233
331
  // Leaving an AI tool: clear overrides server-side.
234
- if (instance.lastMcpStatusSent !== 'idle') {
235
- this.wsClient?.sendTerminalMcpStatus(terminalId, 'idle');
236
- }
332
+ this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
237
333
  instance.mcpAutoActive = false;
238
334
  instance.lastMcpStatusSent = 'idle';
239
335
  this.stopMcpKeepalive(instance);
@@ -242,10 +338,32 @@ export class PTYManager {
242
338
  }
243
339
  instance.mcpAutoActive = true;
244
340
  this.startMcpKeepalive(terminalId, instance);
245
- if (instance.lastMcpStatusSent === mapped)
341
+ // For MCP-authoritative tools (Claude/Codex), use local heuristics:
342
+ // - default to idle when entering the tool
343
+ // - set working on real output / Enter (see write + handleTerminalOutput)
344
+ // - set idle on typing + output silence timer
345
+ // - set needs_input only on explicit option/confirmation prompts in output
346
+ if (isMcpAuth) {
347
+ if (state === TerminalState.Finished) {
348
+ this.sendMcpStatusIfChanged(terminalId, instance, 'finished');
349
+ return;
350
+ }
351
+ if (state === TerminalState.Error) {
352
+ this.sendMcpStatusIfChanged(terminalId, instance, 'error');
353
+ return;
354
+ }
355
+ // Forward daemon NeedsInput for AI tools that don't call termify_status (e.g. Codex)
356
+ if (state === TerminalState.NeedsInput) {
357
+ this.sendMcpStatusIfChanged(terminalId, instance, 'needs_input');
358
+ return;
359
+ }
360
+ if (!instance.lastMcpStatusSent) {
361
+ this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
362
+ }
246
363
  return;
247
- instance.lastMcpStatusSent = mapped;
248
- this.wsClient?.sendTerminalMcpStatus(terminalId, mapped);
364
+ }
365
+ const mapped = this.mapDaemonStateToMcpStatus(state);
366
+ this.sendMcpStatusIfChanged(terminalId, instance, mapped);
249
367
  }
250
368
  /**
251
369
  * Output-based idle detection: if daemon says Working but no output for N seconds,
@@ -253,22 +371,41 @@ export class PTYManager {
253
371
  * Node.js event loop stays active even when idle, so daemon can't tell the difference.
254
372
  * Only applies to REPL processes - normal commands trust daemon state directly.
255
373
  */
256
- static OUTPUT_SILENCE_TIMEOUT = 3000; // 3 seconds
374
+ static OUTPUT_SILENCE_TIMEOUT = 3000; // 3 seconds for regular REPLs
375
+ static AI_SILENCE_TIMEOUT = 15000; // 15 seconds for AI tools (longer thinking pauses)
257
376
  startOutputSilenceTimer(terminalId, instance) {
258
377
  this.clearOutputSilenceTimer(instance);
378
+ const timeoutMs = this.getSilenceTimeout(instance.activeProcess);
259
379
  instance.outputSilenceTimer = setTimeout(() => {
260
380
  // Mark timer as consumed so future command cycles can re-arm it.
261
381
  instance.outputSilenceTimer = null;
262
- // No output for 3 seconds → REPL is likely idle (waiting for user input).
382
+ // For MCP-authoritative tools, silence means "idle" (normal prompt).
383
+ // This prevents sticky "working" on TUIs that keep the process alive.
384
+ if (this.isMcpAuthoritativeProcess(instance.activeProcess)) {
385
+ // If agent-side MCP is enabled, drop "working" or "needs_input" back to "idle" on silence.
386
+ if (PTYManager.MCP_AUTO_ENABLED && (instance.lastMcpStatusSent === 'working' || instance.lastMcpStatusSent === 'needs_input')) {
387
+ this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
388
+ }
389
+ // Legacy fallback: clear working after silence so Claude/Codex don't stay "working".
390
+ if (instance.isWorking) {
391
+ instance.isWorking = false;
392
+ logger.debug(`[OUTPUT IDLE][AI] terminal=${terminalId.substring(0, 8)}... marking idle after ${timeoutMs}ms silence`);
393
+ if (this.onWorking) {
394
+ this.onWorking(terminalId, false, instance.activeProcess);
395
+ }
396
+ }
397
+ return;
398
+ }
399
+ // No output for N seconds → REPL is likely idle (waiting for user input).
263
400
  // Works regardless of daemon state (daemon may not emit events on macOS).
264
401
  if (instance.isWorking && this.isReplProcess(instance.activeProcess)) {
265
402
  instance.isWorking = false;
266
- logger.debug(`[OUTPUT IDLE] terminal=${terminalId.substring(0, 8)}... no output for ${PTYManager.OUTPUT_SILENCE_TIMEOUT}ms, marking idle`);
403
+ logger.debug(`[OUTPUT IDLE] terminal=${terminalId.substring(0, 8)}... no output for ${timeoutMs}ms, marking idle`);
267
404
  if (this.onWorking) {
268
405
  this.onWorking(terminalId, false, instance.activeProcess);
269
406
  }
270
407
  }
271
- }, PTYManager.OUTPUT_SILENCE_TIMEOUT);
408
+ }, timeoutMs);
272
409
  }
273
410
  clearOutputSilenceTimer(instance) {
274
411
  if (instance.outputSilenceTimer) {
@@ -401,11 +538,24 @@ export class PTYManager {
401
538
  if (!current || current.processCheckGeneration !== generation) {
402
539
  return;
403
540
  }
541
+ // If the user is in an MCP-authoritative AI tool (Claude/Codex), do not let
542
+ // legacy heuristics hold the terminal in "working". MCP will drive status.
543
+ if (this.isMcpAuthoritativeProcess(processName)) {
544
+ current.activeProcess = processName;
545
+ this.clearOutputSilenceTimer(current);
546
+ if (current.isWorking) {
547
+ current.isWorking = false;
548
+ if (this.onWorking) {
549
+ this.onWorking(terminalId, false, processName);
550
+ }
551
+ }
552
+ return;
553
+ }
404
554
  if (processName !== current.activeProcess) {
405
555
  current.activeProcess = processName;
406
556
  // Only emit WORKING if terminal is actually in working mode.
407
557
  // This avoids stale async ticks re-enabling working after command end.
408
- if (current.isWorking && this.onWorking) {
558
+ if (current.isWorking && this.onWorking && !this.isMcpAuthoritativeProcess(processName)) {
409
559
  this.onWorking(terminalId, true, processName);
410
560
  }
411
561
  }
@@ -413,7 +563,9 @@ export class PTYManager {
413
563
  // timer for idle detection instead of staying working forever.
414
564
  // Only start timer once (check !outputSilenceTimer to avoid resetting
415
565
  // the countdown every 300ms tick).
416
- if (this.isReplProcess(current.activeProcess) && !current.outputSilenceTimer) {
566
+ if (this.isReplProcess(current.activeProcess) &&
567
+ !this.isMcpAuthoritativeProcess(current.activeProcess) &&
568
+ !current.outputSilenceTimer) {
417
569
  this.startOutputSilenceTimer(terminalId, current);
418
570
  }
419
571
  }
@@ -506,8 +658,13 @@ export class PTYManager {
506
658
  });
507
659
  term.kill();
508
660
  `;
661
+ // Important: the child process must be able to resolve `node-pty`.
662
+ // If we use the user's current working directory, `require('node-pty')` can fail
663
+ // even though termify-agent has it installed as a dependency (or it is hoisted).
664
+ const nodePtyDir = this.getNodePtyDir();
665
+ const smokeTestCwd = nodePtyDir ? path.resolve(nodePtyDir, '..', '..') : process.cwd();
509
666
  const result = spawnSync(process.execPath, ['-e', script], {
510
- cwd: process.cwd(),
667
+ cwd: smokeTestCwd,
511
668
  env: process.env,
512
669
  stdio: 'pipe',
513
670
  encoding: 'utf8',
@@ -726,6 +883,12 @@ export class PTYManager {
726
883
  return false;
727
884
  }
728
885
  try {
886
+ const isMcpAuth = this.isMcpAuthoritativeProcess(instance.activeProcess);
887
+ instance.lastWriteAt = Date.now();
888
+ instance.lastWriteHadNewline = data.includes('\r') || data.includes('\n');
889
+ // IMPORTANT: For MCP-authoritative AI tools (Claude/Codex), the AI itself should
890
+ // report status via the `termify_status` MCP tool (Maestro pattern).
891
+ // The agent must not infer MCP status from keystrokes.
729
892
  // For AI tools, typing means the tool is waiting for user input (idle),
730
893
  // not "working". Avoid sticky working indicators when users compose prompts.
731
894
  // We'll mark working again on Enter (newline) and on real (non-echo) output.
@@ -748,21 +911,27 @@ export class PTYManager {
748
911
  instance.pendingEcho = next;
749
912
  instance.pendingEchoUpdatedAt = Date.now();
750
913
  }
751
- // Detect command execution (newline/carriage return)
914
+ // Detect command execution (newline/carriage return).
915
+ // This includes AI TUIs (Claude/Codex): we want a responsive "working" fallback
916
+ // even if the model doesn't call the MCP status tool.
752
917
  if (data.includes('\r') || data.includes('\n')) {
753
918
  instance.lastInputTime = Date.now();
754
919
  // Set optimistic working state immediately for responsive UI
755
920
  if (!instance.isWorking) {
756
921
  instance.isWorking = true;
757
922
  if (this.onWorking) {
758
- this.onWorking(terminalId, true, null);
923
+ this.onWorking(terminalId, true, instance.activeProcess || null);
759
924
  }
760
925
  }
761
926
  // Always start process check as reliable fallback.
762
927
  // Daemon events provide faster detection when working,
763
928
  // but process check ensures commands are always detected
764
929
  // (daemon may not emit events reliably on macOS).
765
- this.startProcessCheck(terminalId);
930
+ // For MCP-authoritative tools, process check isn't useful (they're long-lived).
931
+ // For normal commands, process check ensures we detect completion.
932
+ if (!isMcpAuth) {
933
+ this.startProcessCheck(terminalId);
934
+ }
766
935
  }
767
936
  return true;
768
937
  }