nterminal 1.2.66 → 1.2.68

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 (39) hide show
  1. package/dist/client/assets/MarkdownPreview-DOXE7Rl3.js +1 -0
  2. package/dist/client/assets/{TranscriptMarkdownBody-Ct0CseQH.js → TranscriptMarkdownBody-BunI06BW.js} +1 -1
  3. package/dist/client/assets/index-Br4cNNw1.css +1 -0
  4. package/dist/client/assets/{index-DC8H8aYn.js → index-BwvExbdl.js} +1 -1
  5. package/dist/client/assets/index-DeiwbfGQ.js +55 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/server/agent/agentRoutes.js +13 -1
  8. package/dist/server/agent/agentRoutes.js.map +1 -1
  9. package/dist/server/config.d.ts +2 -0
  10. package/dist/server/config.js +10 -0
  11. package/dist/server/config.js.map +1 -1
  12. package/dist/server/index.js +4 -2
  13. package/dist/server/index.js.map +1 -1
  14. package/dist/server/routes/agentManagementRoutes.js +5 -0
  15. package/dist/server/routes/agentManagementRoutes.js.map +1 -1
  16. package/dist/server/routes/authRoutes.js +8 -5
  17. package/dist/server/routes/authRoutes.js.map +1 -1
  18. package/dist/server/routes/terminalWebSocket.js +13 -1
  19. package/dist/server/routes/terminalWebSocket.js.map +1 -1
  20. package/dist/server/routes/updateRoutes.js +3 -0
  21. package/dist/server/routes/updateRoutes.js.map +1 -1
  22. package/dist/server/terminal/PtyAdapter.d.ts +2 -0
  23. package/dist/server/terminal/TerminalManager.d.ts +9 -1
  24. package/dist/server/terminal/TerminalManager.js +88 -6
  25. package/dist/server/terminal/TerminalManager.js.map +1 -1
  26. package/dist/server/terminal/TmuxPtyAdapter.d.ts +6 -0
  27. package/dist/server/terminal/TmuxPtyAdapter.js +87 -0
  28. package/dist/server/terminal/TmuxPtyAdapter.js.map +1 -1
  29. package/dist/server/terminal/agentTranscriptStatus.d.ts +11 -0
  30. package/dist/server/terminal/agentTranscriptStatus.js +187 -0
  31. package/dist/server/terminal/agentTranscriptStatus.js.map +1 -0
  32. package/dist/shared/protocol.d.ts +8 -0
  33. package/dist/shared/protocol.js +27 -6
  34. package/dist/shared/protocol.js.map +1 -1
  35. package/dist/shared/types.d.ts +8 -0
  36. package/package.json +1 -1
  37. package/dist/client/assets/MarkdownPreview-BBxs32JK.js +0 -1
  38. package/dist/client/assets/index-CCAlcWtm.js +0 -55
  39. package/dist/client/assets/index-fCHYZN40.css +0 -1
@@ -0,0 +1,187 @@
1
+ import { closeSync, fstatSync, openSync, readSync, statSync } from 'node:fs';
2
+ import { StringDecoder } from 'node:string_decoder';
3
+ const TRANSCRIPT_TAIL_BYTES = 512 * 1024;
4
+ const MAX_APPEND_BYTES = 1024 * 1024;
5
+ const statusCache = new Map();
6
+ export function readAgentTranscriptStatus(source) {
7
+ const stat = statSync(source.filePath);
8
+ const cacheKey = sourceIdentity(source);
9
+ const cached = statusCache.get(cacheKey);
10
+ if (cached &&
11
+ cached.dev === stat.dev &&
12
+ cached.ino === stat.ino &&
13
+ cached.size === stat.size &&
14
+ cached.mtimeMs === stat.mtimeMs) {
15
+ return cached.status;
16
+ }
17
+ const status = inspectTranscriptTail(source);
18
+ statusCache.set(cacheKey, { dev: stat.dev, ino: stat.ino, size: stat.size, mtimeMs: stat.mtimeMs, status });
19
+ return status;
20
+ }
21
+ export class AgentTranscriptTracker {
22
+ tracked = new Map();
23
+ readStatus(terminalId, source) {
24
+ const stat = statSync(source.filePath);
25
+ const identity = sourceIdentity(source);
26
+ const current = this.tracked.get(terminalId);
27
+ if (!current ||
28
+ current.identity !== identity ||
29
+ current.dev !== stat.dev ||
30
+ current.ino !== stat.ino ||
31
+ stat.size < current.offset) {
32
+ return this.resetFromTail(terminalId, source, stat);
33
+ }
34
+ if (current.offset === stat.size && current.size === stat.size && current.mtimeMs === stat.mtimeMs) {
35
+ return current.status;
36
+ }
37
+ const appendBytes = stat.size - current.offset;
38
+ if (appendBytes <= 0) {
39
+ return this.resetFromTail(terminalId, source, stat);
40
+ }
41
+ if (appendBytes > MAX_APPEND_BYTES) {
42
+ return this.resetFromTail(terminalId, source, stat);
43
+ }
44
+ const { buffer, bytesRead } = readFileRange(source.filePath, current.offset, appendBytes);
45
+ if (bytesRead === 0) {
46
+ return this.resetFromTail(terminalId, source, stat);
47
+ }
48
+ current.offset += bytesRead;
49
+ current.size = stat.size;
50
+ current.mtimeMs = stat.mtimeMs;
51
+ const text = current.remainder + current.decoder.write(buffer);
52
+ const lines = text.split('\n');
53
+ current.remainder = lines.pop() ?? '';
54
+ current.status = {
55
+ provider: source.provider,
56
+ state: inspectLines(source.provider, current.status.state, lines)
57
+ };
58
+ return current.status;
59
+ }
60
+ reset(terminalId) {
61
+ this.tracked.delete(terminalId);
62
+ }
63
+ resetFromTail(terminalId, source, stat) {
64
+ const tail = readTail(source.filePath, stat.size);
65
+ const status = { provider: source.provider, state: inspectLines(source.provider, 'unknown', tail.lines) };
66
+ this.tracked.set(terminalId, {
67
+ identity: sourceIdentity(source),
68
+ dev: stat.dev,
69
+ ino: stat.ino,
70
+ size: stat.size,
71
+ mtimeMs: stat.mtimeMs,
72
+ offset: stat.size,
73
+ status,
74
+ remainder: tail.remainder,
75
+ decoder: new StringDecoder('utf8')
76
+ });
77
+ return status;
78
+ }
79
+ }
80
+ function inspectTranscriptTail(source) {
81
+ const lines = readTail(source.filePath).lines;
82
+ return { provider: source.provider, state: inspectLines(source.provider, 'unknown', lines) };
83
+ }
84
+ function inspectLines(provider, currentState, lines) {
85
+ if (provider === 'codex') {
86
+ return inspectCodexLines(lines, currentState);
87
+ }
88
+ return inspectClaudeLines(lines, currentState);
89
+ }
90
+ function inspectCodexLines(lines, currentState) {
91
+ let state = currentState;
92
+ for (const line of lines) {
93
+ const value = parseJsonLine(line);
94
+ if (!value || value.type !== 'event_msg') {
95
+ continue;
96
+ }
97
+ const payload = isJsonObject(value.payload) ? value.payload : null;
98
+ const payloadType = payload?.type;
99
+ if (payloadType === 'task_started') {
100
+ state = 'working';
101
+ }
102
+ else if (payloadType === 'task_complete') {
103
+ state = 'done';
104
+ }
105
+ else if (payloadType === 'turn_aborted') {
106
+ state = 'idle';
107
+ }
108
+ }
109
+ return state;
110
+ }
111
+ function inspectClaudeLines(lines, currentState) {
112
+ let state = currentState;
113
+ for (const line of lines) {
114
+ const value = parseJsonLine(line);
115
+ if (!value || value.type !== 'assistant') {
116
+ continue;
117
+ }
118
+ const message = isJsonObject(value.message) ? value.message : null;
119
+ const stopReason = message?.stop_reason;
120
+ if (stopReason === 'tool_use') {
121
+ state = 'working';
122
+ }
123
+ else if (stopReason === 'end_turn') {
124
+ state = 'done';
125
+ }
126
+ else if (typeof stopReason === 'string' && stopReason.length > 0) {
127
+ state = 'idle';
128
+ }
129
+ }
130
+ return state;
131
+ }
132
+ function readTail(filePath, knownSize) {
133
+ const fd = openSync(filePath, 'r');
134
+ try {
135
+ const size = knownSize ?? fstatSync(fd).size;
136
+ const start = Math.max(0, size - TRANSCRIPT_TAIL_BYTES);
137
+ const length = size - start;
138
+ const { buffer } = readRangeFromFd(fd, start, length);
139
+ const text = new StringDecoder('utf8').write(buffer);
140
+ const lines = text.split('\n');
141
+ if (start > 0) {
142
+ lines.shift();
143
+ }
144
+ const remainder = text.endsWith('\n') ? '' : (lines.pop() ?? '');
145
+ return { lines: lines.filter((line) => line.trim().length > 0), remainder };
146
+ }
147
+ finally {
148
+ closeSync(fd);
149
+ }
150
+ }
151
+ function readFileRange(filePath, offset, length) {
152
+ const fd = openSync(filePath, 'r');
153
+ try {
154
+ return readRangeFromFd(fd, offset, length);
155
+ }
156
+ finally {
157
+ closeSync(fd);
158
+ }
159
+ }
160
+ function readRangeFromFd(fd, offset, length) {
161
+ const buffer = Buffer.allocUnsafe(length);
162
+ let totalRead = 0;
163
+ while (totalRead < length) {
164
+ const bytesRead = readSync(fd, buffer, totalRead, length - totalRead, offset + totalRead);
165
+ if (bytesRead === 0) {
166
+ break;
167
+ }
168
+ totalRead += bytesRead;
169
+ }
170
+ return { buffer: buffer.subarray(0, totalRead), bytesRead: totalRead };
171
+ }
172
+ function sourceIdentity(source) {
173
+ return `${source.provider}\0${source.sessionId}\0${source.filePath}`;
174
+ }
175
+ function parseJsonLine(line) {
176
+ try {
177
+ const value = JSON.parse(line);
178
+ return isJsonObject(value) ? value : null;
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ function isJsonObject(value) {
185
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
186
+ }
187
+ //# sourceMappingURL=agentTranscriptStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentTranscriptStatus.js","sourceRoot":"","sources":["../../../src/server/terminal/agentTranscriptStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMpD,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AACzC,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAsBrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAElD,MAAM,UAAU,yBAAyB,CAAC,MAA2B;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IACE,MAAM;QACN,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;QACvB,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;QACvB,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QACzB,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAC/B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,sBAAsB;IAChB,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEhE,UAAU,CAAC,UAAkB,EAAE,MAA2B;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,IACE,CAAC,OAAO;YACR,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC7B,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;YACxB,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;YACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAC1B,CAAC;YACD,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACnG,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC1F,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;QAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;SAClE,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAkB;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAEO,aAAa,CACnB,UAAkB,EAClB,MAA2B,EAC3B,IAAiE;QAEjE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAwB,CAAC;QAChI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;YAC3B,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC;YAChC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,aAAa,CAAC,MAAM,CAAC;SACnC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,qBAAqB,CAAC,MAA2B;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,YAAY,CACnB,QAAiC,EACjC,YAAkC,EAClC,KAAe;IAEf,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe,EAAE,YAAkC;IAC5E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,CAAC;QAClC,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YACnC,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;aAAM,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;YAC3C,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;aAAM,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YAC1C,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe,EAAE,YAAkC;IAC7E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,UAAU,GAAG,OAAO,EAAE,WAAW,CAAC;QACxC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC9B,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;aAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB,EAAE,SAAkB;IACpD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,qBAAqB,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9E,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAc;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,MAAc,EAAE,MAAc;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,SAAS,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC1F,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QACD,SAAS,IAAI,SAAS,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CAAC,MAA2B;IACjD,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC1C,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -309,6 +309,7 @@ export type ClientTerminalMessage = {
309
309
  type: 'input';
310
310
  terminalId: TerminalId;
311
311
  data: string;
312
+ cancelScrollbackMode?: boolean;
312
313
  } | {
313
314
  type: 'refresh_cwd';
314
315
  terminalId: TerminalId;
@@ -317,6 +318,13 @@ export type ClientTerminalMessage = {
317
318
  terminalId: TerminalId;
318
319
  cols: number;
319
320
  rows: number;
321
+ } | {
322
+ type: 'scrollback_scroll';
323
+ terminalId: TerminalId;
324
+ lines: number;
325
+ } | {
326
+ type: 'cancel_scrollback';
327
+ terminalId: TerminalId;
320
328
  } | {
321
329
  type: 'ping';
322
330
  nonce: string;
@@ -7,19 +7,40 @@ export function parseClientTerminalMessage(raw) {
7
7
  }
8
8
  const message = parsed;
9
9
  if (message.type === 'input' && typeof message.terminalId === 'string' && typeof message.data === 'string') {
10
- return message;
10
+ return {
11
+ type: 'input',
12
+ terminalId: message.terminalId,
13
+ data: message.data,
14
+ ...(message.cancelScrollbackMode === true ? { cancelScrollbackMode: true } : {})
15
+ };
11
16
  }
12
17
  if (message.type === 'refresh_cwd' && typeof message.terminalId === 'string') {
13
- return message;
18
+ return { type: 'refresh_cwd', terminalId: message.terminalId };
14
19
  }
20
+ const cols = message.cols;
21
+ const rows = message.rows;
15
22
  if (message.type === 'resize' &&
16
23
  typeof message.terminalId === 'string' &&
17
- Number.isInteger(message.cols) &&
18
- Number.isInteger(message.rows)) {
19
- return message;
24
+ typeof cols === 'number' &&
25
+ Number.isInteger(cols) &&
26
+ typeof rows === 'number' &&
27
+ Number.isInteger(rows)) {
28
+ return { type: 'resize', terminalId: message.terminalId, cols, rows };
29
+ }
30
+ const lines = message.lines;
31
+ if (message.type === 'scrollback_scroll' &&
32
+ typeof message.terminalId === 'string' &&
33
+ typeof lines === 'number' &&
34
+ Number.isInteger(lines) &&
35
+ lines !== 0 &&
36
+ Math.abs(lines) <= 240) {
37
+ return { type: 'scrollback_scroll', terminalId: message.terminalId, lines };
38
+ }
39
+ if (message.type === 'cancel_scrollback' && typeof message.terminalId === 'string') {
40
+ return { type: 'cancel_scrollback', terminalId: message.terminalId };
20
41
  }
21
42
  if (message.type === 'ping' && typeof message.nonce === 'string') {
22
- return message;
43
+ return { type: 'ping', nonce: message.nonce };
23
44
  }
24
45
  return null;
25
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAiYzC,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MAAwC,CAAC;QACzD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3G,OAAO,OAAgC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,OAAgC,CAAC;QAC1C,CAAC;QACD,IACE,OAAO,CAAC,IAAI,KAAK,QAAQ;YACzB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAC9B,CAAC;YACD,OAAO,OAAgC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,OAAgC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAmYzC,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MASf,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3G,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IACE,OAAO,CAAC,IAAI,KAAK,QAAQ;YACzB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IACE,OAAO,CAAC,IAAI,KAAK,mBAAmB;YACpC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YACvB,KAAK,KAAK,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnF,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACvE,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -12,6 +12,13 @@ export interface TerminalSummary {
12
12
  exitCode: number | null;
13
13
  activity?: 'idle' | 'busy';
14
14
  currentCommand?: string | null;
15
+ agentStatus?: {
16
+ provider: 'codex' | 'claude';
17
+ state: 'working' | 'done' | 'idle' | 'unknown';
18
+ };
19
+ capabilities?: {
20
+ tmuxScrollback?: boolean;
21
+ };
15
22
  }
16
23
  export interface AuthSessionStatus {
17
24
  passwordSet: boolean;
@@ -20,6 +27,7 @@ export interface AuthSessionStatus {
20
27
  deviceTrusted: boolean;
21
28
  currentIpWhitelisted: boolean;
22
29
  expiresAt: string | null;
30
+ previewMode?: boolean;
23
31
  }
24
32
  export interface SplitNode {
25
33
  type: 'split';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nterminal",
3
- "version": "1.2.66",
3
+ "version": "1.2.68",
4
4
  "license": "GPL-3.0-only",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.7",
@@ -1 +0,0 @@
1
- import{j as a}from"./index-CCAlcWtm.js";import{M as e,r as o}from"./index-DC8H8aYn.js";function s({content:r}){return a.jsx(e,{remarkPlugins:[o],children:r})}export{s as default};