@myagentroam/node 0.9.8 → 0.9.10

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 (213) hide show
  1. package/dist/capabilities.js +2 -92
  2. package/dist/claude-agent-sdk.js +2 -330
  3. package/dist/claude-channel.js +2 -44
  4. package/dist/codex-app-server.js +2 -503
  5. package/dist/config.js +2 -56
  6. package/dist/connector/node-connector-options.js +2 -1
  7. package/dist/connector/node-operation-router.js +2 -22
  8. package/dist/connector.js +2 -841
  9. package/dist/control-outbound-scheduler.js +2 -154
  10. package/dist/database.js +2 -1418
  11. package/dist/event-buffer.js +2 -19
  12. package/dist/fake-runner.js +2 -129
  13. package/dist/health.js +2 -3
  14. package/dist/main.js +2 -54
  15. package/dist/migrations/v001.js +3 -144
  16. package/dist/migrations/v002.js +2 -143
  17. package/dist/migrations/v003.js +2 -44
  18. package/dist/migrations/v004.js +34 -30
  19. package/dist/native-jsonl-reader.js +2 -186
  20. package/dist/native-session-history.js +2 -1119
  21. package/dist/opencode-runtime.js +2 -80
  22. package/dist/opencode-server.js +2 -263
  23. package/dist/operational.js +2 -122
  24. package/dist/process-tree.js +2 -18
  25. package/dist/rotating-log.js +2 -67
  26. package/dist/runner/abstract-runner.js +2 -232
  27. package/dist/runner/claude/managed-run-controller.js +2 -345
  28. package/dist/runner/claude-code-runner.js +2 -303
  29. package/dist/runner/codex/composer-image-markers.js +2 -0
  30. package/dist/runner/codex/conversation-parser.js +2 -861
  31. package/dist/runner/codex/managed-run-controller.js +2 -460
  32. package/dist/runner/codex-runner.js +2 -628
  33. package/dist/runner/fake-test-runner.js +2 -47
  34. package/dist/runner/opencode/conversation-parser.js +2 -221
  35. package/dist/runner/opencode/managed-run-controller.js +2 -537
  36. package/dist/runner/opencode-runner.js +2 -448
  37. package/dist/runner/runner-registry.js +2 -90
  38. package/dist/runner-command-engine.js +2 -70
  39. package/dist/runner-profiles.js +2 -215
  40. package/dist/runner-usage.js +2 -190
  41. package/dist/runtime-command-detector.js +2 -73
  42. package/dist/runtime-state.js +2 -973
  43. package/dist/service/attachment-domain-state.js +2 -7
  44. package/dist/service/conversation-history-service.js +2 -457
  45. package/dist/service/conversation-segment-service.js +2 -162
  46. package/dist/service/external-session-resume-service.js +2 -118
  47. package/dist/service/fake-managed-run-service.js +2 -60
  48. package/dist/service/managed-runner-session-service.js +2 -35
  49. package/dist/service/mcp-installation-verifier.js +2 -87
  50. package/dist/service/mcp-node-operation-service.js +2 -90
  51. package/dist/service/mcp-package-installer.js +2 -136
  52. package/dist/service/native-session-projection-service.js +2 -280
  53. package/dist/service/native-session-watch-service.js +2 -383
  54. package/dist/service/node-connection-lifecycle-service.js +2 -83
  55. package/dist/service/node-control-channel.js +2 -85
  56. package/dist/service/node-control-message-service.js +2 -107
  57. package/dist/service/node-request-service.js +2 -52
  58. package/dist/service/node-run-event-bridge.js +2 -83
  59. package/dist/service/node-terminal-channel.js +2 -182
  60. package/dist/service/node-upgrade-coordinator.js +2 -137
  61. package/dist/service/node-workspace-coordinator.js +2 -70
  62. package/dist/service/recent-run-projection-service.js +2 -0
  63. package/dist/service/run-attachment-service.js +2 -194
  64. package/dist/service/run-domain-state.js +2 -4
  65. package/dist/service/run-event-service.js +2 -193
  66. package/dist/service/run-workbench-service.js +2 -104
  67. package/dist/service/runner-channel-message-service.js +2 -20
  68. package/dist/service/runner-interaction-service.js +2 -243
  69. package/dist/service/runner-service.js +2 -71
  70. package/dist/service/session-catalog-service.js +2 -224
  71. package/dist/service/session-command-service.js +2 -76
  72. package/dist/service/session-context-service.js +2 -101
  73. package/dist/service/session-domain-state.js +2 -9
  74. package/dist/service/session-identity-service.js +2 -86
  75. package/dist/service/session-lifecycle-service.js +2 -240
  76. package/dist/service/session-message-service.js +2 -173
  77. package/dist/service/session-presentation-service.js +2 -43
  78. package/dist/service/session-query-service.js +2 -82
  79. package/dist/service/skill-directory-service.js +2 -238
  80. package/dist/service/skill-install-service.js +2 -434
  81. package/dist/service/skill-node-operation-service.js +2 -206
  82. package/dist/service/terminal-relay-state.js +2 -3
  83. package/dist/service/terminal-service.js +2 -52
  84. package/dist/service/workbench-event-service.js +2 -19
  85. package/dist/service/workbench-manifest-service.js +2 -69
  86. package/dist/service/workspace-change-service.js +2 -86
  87. package/dist/service/workspace-content-search-service.js +2 -477
  88. package/dist/service/workspace-domain-state.js +2 -41
  89. package/dist/service/workspace-file-service.js +2 -122
  90. package/dist/service/workspace-git-exclude-service.js +2 -119
  91. package/dist/service/workspace-queue-workbench-service.js +2 -304
  92. package/dist/service/workspace-service.js +2 -69
  93. package/dist/service/workspace-session-service.js +2 -139
  94. package/dist/service/workspace-upload-service.js +2 -262
  95. package/dist/service/workspace-watch-service.js +2 -146
  96. package/dist/service/workspace-workbench-service.js +2 -405
  97. package/dist/service.js +2 -38
  98. package/dist/storage.js +2 -32
  99. package/dist/supervisor.js +2 -136
  100. package/dist/terminal.js +2 -416
  101. package/dist/util/node-operation-parsers.js +2 -382
  102. package/dist/util/personal-instructions.js +2 -31
  103. package/dist/util/runner-error.js +2 -52
  104. package/dist/util/runner-native-session-parsers.js +2 -490
  105. package/dist/util/safe-error.js +2 -5
  106. package/dist/util/secret-environment.js +2 -25
  107. package/dist/workspace.js +2 -1519
  108. package/package.json +3 -3
  109. package/dist/capabilities.d.ts +0 -12
  110. package/dist/claude-agent-sdk.d.ts +0 -92
  111. package/dist/claude-channel.d.ts +0 -28
  112. package/dist/codex-app-server.d.ts +0 -133
  113. package/dist/config.d.ts +0 -18
  114. package/dist/connector/node-connector-options.d.ts +0 -27
  115. package/dist/connector/node-operation-router.d.ts +0 -9
  116. package/dist/connector.d.ts +0 -93
  117. package/dist/control-outbound-scheduler.d.ts +0 -29
  118. package/dist/database.d.ts +0 -305
  119. package/dist/event-buffer.d.ts +0 -9
  120. package/dist/fake-runner.d.ts +0 -42
  121. package/dist/health.d.ts +0 -4
  122. package/dist/main.d.ts +0 -2
  123. package/dist/migrations/v001.d.ts +0 -3
  124. package/dist/migrations/v002.d.ts +0 -4
  125. package/dist/migrations/v003.d.ts +0 -4
  126. package/dist/migrations/v004.d.ts +0 -4
  127. package/dist/native-jsonl-reader.d.ts +0 -35
  128. package/dist/native-session-history.d.ts +0 -126
  129. package/dist/opencode-runtime.d.ts +0 -33
  130. package/dist/opencode-server.d.ts +0 -49
  131. package/dist/operational.d.ts +0 -39
  132. package/dist/process-tree.d.ts +0 -9
  133. package/dist/rotating-log.d.ts +0 -17
  134. package/dist/runner/abstract-runner.d.ts +0 -172
  135. package/dist/runner/claude/managed-run-controller.d.ts +0 -51
  136. package/dist/runner/claude-code-runner.d.ts +0 -72
  137. package/dist/runner/codex/conversation-parser.d.ts +0 -59
  138. package/dist/runner/codex/managed-run-controller.d.ts +0 -90
  139. package/dist/runner/codex-runner.d.ts +0 -103
  140. package/dist/runner/fake-test-runner.d.ts +0 -26
  141. package/dist/runner/opencode/conversation-parser.d.ts +0 -31
  142. package/dist/runner/opencode/managed-run-controller.d.ts +0 -82
  143. package/dist/runner/opencode-runner.d.ts +0 -71
  144. package/dist/runner/runner-registry.d.ts +0 -19
  145. package/dist/runner-command-engine.d.ts +0 -28
  146. package/dist/runner-profiles.d.ts +0 -15
  147. package/dist/runner-usage.d.ts +0 -33
  148. package/dist/runtime-command-detector.d.ts +0 -3
  149. package/dist/runtime-state.d.ts +0 -169
  150. package/dist/service/attachment-domain-state.d.ts +0 -7
  151. package/dist/service/conversation-history-service.d.ts +0 -43
  152. package/dist/service/conversation-segment-service.d.ts +0 -20
  153. package/dist/service/external-session-resume-service.d.ts +0 -34
  154. package/dist/service/fake-managed-run-service.d.ts +0 -28
  155. package/dist/service/managed-runner-session-service.d.ts +0 -12
  156. package/dist/service/mcp-installation-verifier.d.ts +0 -9
  157. package/dist/service/mcp-node-operation-service.d.ts +0 -11
  158. package/dist/service/mcp-package-installer.d.ts +0 -8
  159. package/dist/service/native-session-projection-service.d.ts +0 -52
  160. package/dist/service/native-session-watch-service.d.ts +0 -62
  161. package/dist/service/node-connection-lifecycle-service.d.ts +0 -35
  162. package/dist/service/node-control-channel.d.ts +0 -32
  163. package/dist/service/node-control-message-service.d.ts +0 -27
  164. package/dist/service/node-request-service.d.ts +0 -14
  165. package/dist/service/node-run-event-bridge.d.ts +0 -40
  166. package/dist/service/node-terminal-channel.d.ts +0 -29
  167. package/dist/service/node-upgrade-coordinator.d.ts +0 -29
  168. package/dist/service/node-workspace-coordinator.d.ts +0 -29
  169. package/dist/service/run-attachment-service.d.ts +0 -38
  170. package/dist/service/run-domain-state.d.ts +0 -4
  171. package/dist/service/run-event-service.d.ts +0 -33
  172. package/dist/service/run-workbench-service.d.ts +0 -25
  173. package/dist/service/runner-channel-message-service.d.ts +0 -13
  174. package/dist/service/runner-interaction-service.d.ts +0 -39
  175. package/dist/service/runner-service.d.ts +0 -46
  176. package/dist/service/session-catalog-service.d.ts +0 -45
  177. package/dist/service/session-command-service.d.ts +0 -24
  178. package/dist/service/session-context-service.d.ts +0 -35
  179. package/dist/service/session-domain-state.d.ts +0 -9
  180. package/dist/service/session-identity-service.d.ts +0 -24
  181. package/dist/service/session-lifecycle-service.d.ts +0 -31
  182. package/dist/service/session-message-service.d.ts +0 -33
  183. package/dist/service/session-presentation-service.d.ts +0 -34
  184. package/dist/service/session-query-service.d.ts +0 -35
  185. package/dist/service/skill-directory-service.d.ts +0 -20
  186. package/dist/service/skill-install-service.d.ts +0 -21
  187. package/dist/service/skill-node-operation-service.d.ts +0 -44
  188. package/dist/service/terminal-relay-state.d.ts +0 -6
  189. package/dist/service/terminal-service.d.ts +0 -12
  190. package/dist/service/workbench-event-service.d.ts +0 -9
  191. package/dist/service/workbench-manifest-service.d.ts +0 -90
  192. package/dist/service/workspace-change-service.d.ts +0 -9
  193. package/dist/service/workspace-content-search-service.d.ts +0 -14
  194. package/dist/service/workspace-domain-state.d.ts +0 -79
  195. package/dist/service/workspace-file-service.d.ts +0 -18
  196. package/dist/service/workspace-git-exclude-service.d.ts +0 -4
  197. package/dist/service/workspace-queue-workbench-service.d.ts +0 -86
  198. package/dist/service/workspace-service.d.ts +0 -15
  199. package/dist/service/workspace-session-service.d.ts +0 -23
  200. package/dist/service/workspace-upload-service.d.ts +0 -39
  201. package/dist/service/workspace-watch-service.d.ts +0 -23
  202. package/dist/service/workspace-workbench-service.d.ts +0 -58
  203. package/dist/service.d.ts +0 -4
  204. package/dist/storage.d.ts +0 -2
  205. package/dist/supervisor.d.ts +0 -1
  206. package/dist/terminal.d.ts +0 -133
  207. package/dist/util/node-operation-parsers.d.ts +0 -92
  208. package/dist/util/personal-instructions.d.ts +0 -2
  209. package/dist/util/runner-error.d.ts +0 -6
  210. package/dist/util/runner-native-session-parsers.d.ts +0 -74
  211. package/dist/util/safe-error.d.ts +0 -2
  212. package/dist/util/secret-environment.d.ts +0 -1
  213. package/dist/workspace.d.ts +0 -217
package/dist/terminal.js CHANGED
@@ -1,416 +1,2 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { homedir } from 'node:os';
3
- import { spawn } from 'node-pty';
4
- import { terminalDataFrameSchema } from '@myagentroam/protocol';
5
- import { terminateProcessTree } from './process-tree.js';
6
- const MAX_FRAME_CHARACTERS = 65_536;
7
- const DEFAULT_MAX_TERMINALS = 10;
8
- const DEFAULT_MAX_TERMINALS_PER_WORKSPACE = 5;
9
- const DEFAULT_MAX_REPLAY_BYTES = 512 * 1024;
10
- const DEFAULT_IDLE_TIMEOUT_MS = 60 * 60_000;
11
- /**
12
- * Owns Node-local PTY/ConPTY processes and their bounded output replay.
13
- * Browser relay transport intentionally lives outside this class: callers pass
14
- * only schema-validated TerminalDataFrame values after Server authorization.
15
- */
16
- export class TerminalManager {
17
- platform;
18
- cwd;
19
- profiles;
20
- maxTerminals;
21
- maxTerminalsPerWorkspace;
22
- maxReplayBytes;
23
- idleTimeoutMs;
24
- now;
25
- ptyFactory;
26
- terminate;
27
- terminals = new Map();
28
- attachments = new Map();
29
- frameListeners = new Set();
30
- summaryListeners = new Set();
31
- idleTimer;
32
- constructor(options = {}) {
33
- this.platform = options.platform ?? (process.platform === 'win32' ? 'win32' : 'linux');
34
- this.cwd = options.cwd ?? homedir();
35
- this.profiles = options.profiles ?? defaultTerminalProfiles(this.platform);
36
- if (this.profiles.length === 0 || !this.profiles.some((profile) => profile.isDefault)) {
37
- throw new Error('TERMINAL_PROFILE_INVALID');
38
- }
39
- this.maxTerminals = options.maxTerminals ?? DEFAULT_MAX_TERMINALS;
40
- this.maxTerminalsPerWorkspace =
41
- options.maxTerminalsPerWorkspace ?? DEFAULT_MAX_TERMINALS_PER_WORKSPACE;
42
- this.maxReplayBytes = options.maxReplayBytes ?? DEFAULT_MAX_REPLAY_BYTES;
43
- this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
44
- if (!Number.isSafeInteger(this.maxTerminals) ||
45
- this.maxTerminals < 1 ||
46
- this.maxTerminals > 64 ||
47
- !Number.isSafeInteger(this.maxTerminalsPerWorkspace) ||
48
- this.maxTerminalsPerWorkspace < 1 ||
49
- this.maxTerminalsPerWorkspace > this.maxTerminals ||
50
- !Number.isSafeInteger(this.maxReplayBytes) ||
51
- this.maxReplayBytes < 1 ||
52
- this.maxReplayBytes > 16 * 1024 * 1024 ||
53
- !Number.isSafeInteger(this.idleTimeoutMs) ||
54
- this.idleTimeoutMs < 1_000) {
55
- throw new Error('TERMINAL_CONFIG_INVALID');
56
- }
57
- this.now = options.now ?? Date.now;
58
- this.ptyFactory = options.ptyFactory ?? nodePtyFactory;
59
- this.terminate =
60
- options.terminate ?? ((child, platform) => terminateProcessTree(child, platform));
61
- this.idleTimer = setInterval(() => void this.closeExpired(), Math.min(this.idleTimeoutMs, 60_000));
62
- this.idleTimer.unref();
63
- }
64
- availableProfiles() {
65
- return this.profiles.map(({ id, label, isDefault }) => ({ id, label, isDefault }));
66
- }
67
- limits() {
68
- return {
69
- maxTerminals: this.maxTerminals,
70
- maxTerminalsPerWorkspace: this.maxTerminalsPerWorkspace,
71
- maxReplayBytes: this.maxReplayBytes,
72
- reconnectWindowMs: this.idleTimeoutMs
73
- };
74
- }
75
- open(input = {}) {
76
- const profileId = input.profileId ?? this.profiles.find((profile) => profile.isDefault)?.id;
77
- if (typeof profileId !== 'string')
78
- throw new Error('TERMINAL_PROFILE_INVALID');
79
- const profile = this.profiles.find((candidate) => candidate.id === profileId);
80
- if (profile === undefined)
81
- throw new Error('TERMINAL_PROFILE_INVALID');
82
- const rows = terminalDimension(input.rows, 24);
83
- const cols = terminalDimension(input.cols, 80);
84
- if (input.cwd !== undefined && typeof input.cwd !== 'string')
85
- throw new Error('TERMINAL_OPEN_INVALID');
86
- if (input.workspaceId !== undefined &&
87
- input.workspaceId !== null &&
88
- typeof input.workspaceId !== 'string')
89
- throw new Error('TERMINAL_OPEN_INVALID');
90
- this.evictForNewTerminal(input.workspaceId ?? null);
91
- const pty = this.ptyFactory(profile.shell, profile.args, {
92
- name: 'xterm-256color',
93
- cols,
94
- rows,
95
- cwd: typeof input.cwd === 'string' ? input.cwd : this.cwd,
96
- env: { ...process.env, ...input.environment }
97
- });
98
- const createdAt = this.now();
99
- const terminal = {
100
- id: randomUUID(),
101
- workspaceId: input.workspaceId ?? null,
102
- profile,
103
- pty,
104
- createdAt,
105
- state: 'RUNNING',
106
- updatedAt: createdAt,
107
- exitCode: null,
108
- rows,
109
- cols,
110
- sequence: 0,
111
- replayBytes: 0,
112
- replay: [],
113
- writerAttachmentId: undefined,
114
- lastUsedAt: createdAt,
115
- detachedAt: createdAt
116
- };
117
- this.terminals.set(terminal.id, terminal);
118
- pty.onData((data) => this.recordOutput(terminal, data));
119
- pty.onExit((event) => this.exited(terminal, event.exitCode));
120
- return this.notifySummary(terminal);
121
- }
122
- list() {
123
- return [...this.terminals.values()].map((terminal) => this.summary(terminal));
124
- }
125
- get(terminalId) {
126
- return this.summary(this.requireTerminal(terminalId));
127
- }
128
- /** One attachment may write. A new writer must explicitly take over. */
129
- authorizeAttach(input) {
130
- if (typeof input.terminalId !== 'string')
131
- throw new Error('TERMINAL_NOT_FOUND');
132
- const terminal = this.requireTerminal(input.terminalId);
133
- if (terminal.state !== 'RUNNING')
134
- throw new Error('TERMINAL_CLOSED');
135
- const afterSequence = terminalSequence(input.afterSequence);
136
- const readonly = input.readonly === true;
137
- if (input.readonly !== undefined && typeof input.readonly !== 'boolean')
138
- throw new Error('TERMINAL_ATTACH_INVALID');
139
- if (input.takeover !== undefined && typeof input.takeover !== 'boolean')
140
- throw new Error('TERMINAL_ATTACH_INVALID');
141
- if (!readonly && terminal.writerAttachmentId !== undefined && input.takeover !== true) {
142
- throw new Error('TERMINAL_ATTACH_CONFLICT');
143
- }
144
- if (!readonly && terminal.writerAttachmentId !== undefined) {
145
- this.attachments.delete(terminal.writerAttachmentId);
146
- }
147
- const attachmentId = randomUUID();
148
- this.attachments.set(attachmentId, { terminalId: terminal.id, readonly });
149
- if (!readonly)
150
- terminal.writerAttachmentId = attachmentId;
151
- terminal.updatedAt = this.now();
152
- terminal.lastUsedAt = terminal.updatedAt;
153
- terminal.detachedAt = undefined;
154
- return {
155
- attachmentId,
156
- terminalId: terminal.id,
157
- readonly,
158
- frames: this.replayFrames(terminal, afterSequence)
159
- };
160
- }
161
- detach(attachmentId) {
162
- const attachment = this.attachments.get(attachmentId);
163
- if (attachment === undefined)
164
- return;
165
- this.attachments.delete(attachmentId);
166
- const terminal = this.terminals.get(attachment.terminalId);
167
- if (terminal?.writerAttachmentId === attachmentId)
168
- terminal.writerAttachmentId = undefined;
169
- if (terminal !== undefined && !this.hasAttachment(terminal.id)) {
170
- terminal.detachedAt = this.now();
171
- terminal.lastUsedAt = terminal.detachedAt;
172
- this.notifySummary(terminal);
173
- }
174
- }
175
- /** Processes data frames from an already-authorized Server relay attachment. */
176
- async acceptFrame(attachmentId, frame) {
177
- const parsed = terminalDataFrameSchema.safeParse(frame);
178
- if (!parsed.success)
179
- throw new Error('TERMINAL_FRAME_INVALID');
180
- const attachment = this.attachments.get(attachmentId);
181
- if (attachment === undefined || attachment.terminalId !== parsed.data.terminalId)
182
- throw new Error('TERMINAL_ATTACH_INVALID');
183
- const terminal = this.requireTerminal(attachment.terminalId);
184
- if (terminal.state !== 'RUNNING')
185
- throw new Error('TERMINAL_CLOSED');
186
- if (parsed.data.type === 'attach' ||
187
- parsed.data.type === 'output' ||
188
- parsed.data.type === 'exit' ||
189
- parsed.data.type === 'error') {
190
- throw new Error('TERMINAL_FRAME_INVALID');
191
- }
192
- if (attachment.readonly || terminal.writerAttachmentId !== attachmentId)
193
- throw new Error('TERMINAL_WRITE_DENIED');
194
- terminal.updatedAt = this.now();
195
- terminal.lastUsedAt = terminal.updatedAt;
196
- if (parsed.data.type === 'input') {
197
- terminal.pty.write(parsed.data.data);
198
- return;
199
- }
200
- if (parsed.data.type === 'resize') {
201
- terminal.pty.resize(parsed.data.cols, parsed.data.rows);
202
- terminal.cols = parsed.data.cols;
203
- terminal.rows = parsed.data.rows;
204
- this.notifySummary(terminal);
205
- return;
206
- }
207
- await this.close(terminal.id);
208
- }
209
- async close(terminalId) {
210
- const terminal = this.requireTerminal(terminalId);
211
- if (terminal.state !== 'RUNNING')
212
- return this.summary(terminal);
213
- terminal.state = 'CLOSED';
214
- terminal.updatedAt = this.now();
215
- this.detachAll(terminal);
216
- const summary = this.notifySummary(terminal);
217
- try {
218
- await this.terminate(terminal.pty, this.platform);
219
- }
220
- finally {
221
- this.emit({ type: 'exit', terminalId: terminal.id, exitCode: terminal.exitCode });
222
- }
223
- return summary;
224
- }
225
- async shutdown() {
226
- if (this.idleTimer !== undefined)
227
- clearInterval(this.idleTimer);
228
- this.idleTimer = undefined;
229
- await Promise.all([...this.terminals.values()]
230
- .filter((terminal) => terminal.state === 'RUNNING')
231
- .map((terminal) => this.close(terminal.id)));
232
- }
233
- onFrame(listener) {
234
- this.frameListeners.add(listener);
235
- return () => this.frameListeners.delete(listener);
236
- }
237
- onSummary(listener) {
238
- this.summaryListeners.add(listener);
239
- return () => this.summaryListeners.delete(listener);
240
- }
241
- async closeExpired() {
242
- const expired = [...this.terminals.values()].filter((terminal) => terminal.state === 'RUNNING' &&
243
- terminal.detachedAt !== undefined &&
244
- this.now() - terminal.detachedAt >= this.idleTimeoutMs);
245
- await Promise.all(expired.map((terminal) => this.close(terminal.id)));
246
- }
247
- recordOutput(terminal, data) {
248
- if (terminal.state !== 'RUNNING' || data.length === 0)
249
- return;
250
- for (const part of splitFrameData(data)) {
251
- const frame = {
252
- sequence: ++terminal.sequence,
253
- data: part,
254
- bytes: Buffer.byteLength(part, 'utf8')
255
- };
256
- terminal.replay.push(frame);
257
- terminal.replayBytes += frame.bytes;
258
- while (terminal.replayBytes > this.maxReplayBytes && terminal.replay.length > 0) {
259
- const removed = terminal.replay.shift();
260
- if (removed !== undefined)
261
- terminal.replayBytes -= removed.bytes;
262
- }
263
- this.emit({
264
- type: 'output',
265
- terminalId: terminal.id,
266
- sequence: frame.sequence,
267
- data: frame.data
268
- });
269
- }
270
- }
271
- exited(terminal, exitCode) {
272
- if (terminal.state !== 'RUNNING')
273
- return;
274
- terminal.state = 'EXITED';
275
- terminal.exitCode = exitCode;
276
- terminal.updatedAt = this.now();
277
- this.detachAll(terminal);
278
- this.notifySummary(terminal);
279
- this.emit({ type: 'exit', terminalId: terminal.id, exitCode });
280
- }
281
- replayFrames(terminal, afterSequence) {
282
- const first = terminal.replay[0]?.sequence;
283
- const frames = [];
284
- if (first !== undefined && afterSequence < first - 1) {
285
- frames.push({ type: 'error', terminalId: terminal.id, code: 'TERMINAL_REPLAY_GAP' });
286
- }
287
- for (const replay of terminal.replay) {
288
- if (replay.sequence > afterSequence) {
289
- frames.push({
290
- type: 'output',
291
- terminalId: terminal.id,
292
- sequence: replay.sequence,
293
- data: replay.data
294
- });
295
- }
296
- }
297
- return frames;
298
- }
299
- summary(terminal) {
300
- return {
301
- id: terminal.id,
302
- workspaceId: terminal.workspaceId,
303
- profileId: terminal.profile.id,
304
- state: terminal.state,
305
- createdAt: terminal.createdAt,
306
- updatedAt: terminal.updatedAt,
307
- exitCode: terminal.exitCode,
308
- rows: terminal.rows,
309
- cols: terminal.cols,
310
- latestSequence: terminal.sequence
311
- };
312
- }
313
- notifySummary(terminal) {
314
- const summary = this.summary(terminal);
315
- for (const listener of this.summaryListeners)
316
- listener(summary);
317
- return summary;
318
- }
319
- requireTerminal(terminalId) {
320
- const terminal = this.terminals.get(terminalId);
321
- if (terminal === undefined)
322
- throw new Error('TERMINAL_NOT_FOUND');
323
- return terminal;
324
- }
325
- runningCount() {
326
- return [...this.terminals.values()].filter((terminal) => terminal.state === 'RUNNING').length;
327
- }
328
- evictForNewTerminal(workspaceId) {
329
- if (workspaceId !== null &&
330
- this.runningCountForWorkspace(workspaceId) >= this.maxTerminalsPerWorkspace) {
331
- this.evictLeastRecentlyUsed((terminal) => terminal.workspaceId === workspaceId);
332
- }
333
- if (this.runningCount() >= this.maxTerminals)
334
- this.evictLeastRecentlyUsed(() => true);
335
- }
336
- evictLeastRecentlyUsed(predicate) {
337
- const candidate = [...this.terminals.values()]
338
- .filter((terminal) => terminal.state === 'RUNNING' && predicate(terminal))
339
- .sort((left, right) => left.lastUsedAt - right.lastUsedAt || left.createdAt - right.createdAt)[0];
340
- if (candidate !== undefined)
341
- void this.close(candidate.id);
342
- }
343
- runningCountForWorkspace(workspaceId) {
344
- return [...this.terminals.values()].filter((terminal) => terminal.state === 'RUNNING' && terminal.workspaceId === workspaceId).length;
345
- }
346
- hasAttachment(terminalId) {
347
- return [...this.attachments.values()].some((attachment) => attachment.terminalId === terminalId);
348
- }
349
- detachAll(terminal) {
350
- for (const [attachmentId, attachment] of this.attachments) {
351
- if (attachment.terminalId === terminal.id)
352
- this.attachments.delete(attachmentId);
353
- }
354
- terminal.writerAttachmentId = undefined;
355
- terminal.detachedAt = undefined;
356
- }
357
- emit(frame) {
358
- for (const listener of this.frameListeners)
359
- listener(frame);
360
- }
361
- }
362
- function nodePtyFactory(shell, args, options) {
363
- const pty = spawn(shell, [...args], {
364
- name: options.name,
365
- cols: options.cols,
366
- rows: options.rows,
367
- cwd: options.cwd,
368
- env: options.env
369
- });
370
- return pty;
371
- }
372
- function defaultTerminalProfiles(platform) {
373
- if (platform === 'win32') {
374
- return [
375
- {
376
- id: 'default',
377
- label: 'Windows Command Prompt',
378
- shell: process.env['ComSpec'] ?? 'C:\\Windows\\System32\\cmd.exe',
379
- args: [],
380
- isDefault: true
381
- }
382
- ];
383
- }
384
- return [
385
- {
386
- id: 'default',
387
- label: 'User Shell',
388
- shell: process.env['SHELL']?.trim() || '/bin/bash',
389
- args: ['-l', '-i'],
390
- isDefault: true
391
- }
392
- ];
393
- }
394
- function terminalDimension(value, fallback) {
395
- if (value === undefined)
396
- return fallback;
397
- if (typeof value !== 'number' || !Number.isInteger(value) || value < 1 || value > 1000)
398
- throw new Error('TERMINAL_DIMENSIONS_INVALID');
399
- return value;
400
- }
401
- function terminalSequence(value) {
402
- if (value === undefined)
403
- return 0;
404
- if (typeof value !== 'number' || !Number.isInteger(value) || value < 0)
405
- throw new Error('TERMINAL_REPLAY_INVALID');
406
- return value;
407
- }
408
- function splitFrameData(value) {
409
- if (value.length <= MAX_FRAME_CHARACTERS)
410
- return [value];
411
- const chunks = [];
412
- for (let start = 0; start < value.length; start += MAX_FRAME_CHARACTERS) {
413
- chunks.push(value.slice(start, start + MAX_FRAME_CHARACTERS));
414
- }
415
- return chunks;
416
- }
1
+ /* mar-release-protected */
2
+ const _0x19811e=_0x1660;(function(_0x1f38c8,_0x1bb656){const _0x9cea3f=_0x1660,_0x351db1=_0x1f38c8();while(!![]){try{const _0x5f0eb5=-parseInt(_0x9cea3f(0x79))/(0x41*0x5c+-0x185d+0x102)+-parseInt(_0x9cea3f(0xaf))/(0xc5b+-0x3ab*-0x1+0x29*-0x64)+parseInt(_0x9cea3f(0xa0))/(-0x1bf6+0x1a65+0x194*0x1)+parseInt(_0x9cea3f(0xda))/(-0x1aec*0x1+0x166e+0x482)+parseInt(_0x9cea3f(0x83))/(0x21*0xfd+0x1d26+-0x3dbe)*(-parseInt(_0x9cea3f(0xb7))/(0x1e21+-0x18c4+-0x1*0x557))+-parseInt(_0x9cea3f(0xa4))/(-0x70*0x10+-0x30e+-0x1*-0xa15)*(-parseInt(_0x9cea3f(0x95))/(0x1132+0x1ff0+-0x9d2*0x5))+parseInt(_0x9cea3f(0xe9))/(-0x18ea+0x10c7+0x82c)*(parseInt(_0x9cea3f(0x9a))/(-0x1*0x15a7+-0x1*-0x18e5+-0x334));if(_0x5f0eb5===_0x1bb656)break;else _0x351db1['push'](_0x351db1['shift']());}catch(_0x5a06e6){_0x351db1['push'](_0x351db1['shift']());}}}(_0x4e37,0x4b98*0x40+-0xa2*-0x24b3+-0x1e5c9a));import{randomUUID}from'node:crypto';import{homedir}from'node:os';import{spawn}from'node-pty';import{terminalDataFrameSchema}from'@myagentroam/protocol';import{terminateProcessTree}from'./process-tree.js';const MAX_FRAME_CHARACTERS=-0x293c*0x7+0x4*-0x364b+-0xbe74*-0x4,DEFAULT_MAX_TERMINALS=-0x10f+0x15e1+-0x14c8,DEFAULT_MAX_TERMINALS_PER_WORKSPACE=-0x4*-0x3e9+-0x57+-0x1*0xf48,DEFAULT_MAX_REPLAY_BYTES=(0xd0*-0x3+-0x2*0x12cd+0x2*0x1505)*(-0x1eb4+-0x2131+-0x7*-0x9b3),DEFAULT_IDLE_TIMEOUT_MS=(-0x227e+0x18d2+0x9e8)*(-0x1728+0x1*0xd72f+0x25*0x125);function _0x4e37(){const _0x1b8f2c=['BgfZDfvZzwrbDa','DgfRzw92zxi','yNL0zuXLBMD0Aa','mZC4C0vxug5A','B25gCMfTzq','zxHPDenVzgu','yxjNCW','zgvMyxvSDa','DxbKyxrLzef0','vevstuLoquXFuKvqtefzx0LovKfmsuq','CMvWBgf5qNL0zxm','D3jPDgvYqxr0ywnOBwvUDeLK','zgv0ywnOzwrbDa','ChjVzMLSzuLK','C2vXDwvUy2u','Aw5WDxq','Bwf4vgvYBwLUywXZ','Chr5','zw1PDa','B3bLBG','BM93','Bwf4uMvWBgf5qNL0zxm','DhLWzq','BMfTzq','C29Tzq','CMvHzg9UBhK','ChjVzMLSzq','C29YDa','qZPCv2LUzg93C1XtExn0zw0ZmLXJBwqUzxHL','AxntywzLsw50zwDLCG','AxnjBNrLz2vY','CMvWBgf5','ywXS','zxzPy3rmzwfZDfjLy2vUDgX5vxnLza','Bwf4vgvYBwLUywXZugvYv29YA3nWywnL','vevstuLoquXFq0Xpu0ve','C3rYAw5N','DgvYBwLUyxrL','mZm3otyWnhPtCw51sa','vevstuLoquXFv1jjvevFrevosuve','BgLZDa','y2XVC2u','zxzPy3rgB3jozxDuzxjTAw5HBa','D29YA3nWywnLswq','AxnezwzHDwX0','D3jPDgu','ChvZAa','BgvUz3rO','z2v0','D2LUmZi','C2v0','yxzHAwXHyMXLuhjVzMLSzxm','CNvUBMLUz0nVDw50','oty3nxn3y2PfrG','DMfSDwvZ','C3vTBwfYEq','CMvWBgf5rNjHBwvZ','zxHPDgvK','ywnJzxb0rNjHBwu','vevstuLoquXFqvruqunix0LovKfmsuq','zxHPDa','vxnLCIbtAgvSBa','DgvYBwLUywXZ','C2HPzNq','BgLUDxG','zxjYB3i','zgv0ywnOqwXS','zNjHBwvmAxn0zw5LCNm','ChjVzMLSzxm','y29SCW','DgvYBwLUywXjza','zgv0ywnO','B25eyxrH','C2H1DgrVD24','y3jLyxrLzef0','yxr0ywnO','C2XPy2u','l2jPBI9IyxnO','B3v0Chv0','mta3mZu3yuTgqNDs','CMvZAxPL','vevstuLoquXFrLjbtuvFsu5wquXjra','vevstuLoquXFufjprKLmrv9jtLzbteLe','B25tDw1Tyxj5','ywrK','vevstuLoquXFqvruqunix0nptKzmsunu','C2fMzvbHCNnL','vevstuLoquXFreLnru5tsu9ou19jtLzbteLe','AwrSzvrPBwvY','nZi4mZv3Bejnsu0','uLvotKLorW','vevstuLoquXFuKvqtefzx0Dbua','EhrLCM0TmJu2y29SB3i','Dw5Yzwy','zgf0yq','C3rHDgu','AgfZqxr0ywnOBwvUDa','CMvXDwLYzvrLCM1PBMfS','zMLUza','y2XVC2vfEhbPCMvK','ywz0zxjtzxf1zw5Jzq','CgXHDgzVCM0','C3vJy2vZCW','Chr5rMfJDg9YEq','zgvSzxrL','AwrSzvrPBwvVDxrnCW','vevstuLoquXFt1bftL9jtLzbteLe','og1pBKjZwq','q0Xpu0ve','C3vTBwfYEuXPC3rLBMvYCW','yxr0ywnOBwvUDhm','CM93CW','mte0otbqyxzWBNu','BwfW','BNvTyMvY','yxv0Ag9YAxPLqxr0ywnO','v2LUzg93CYbdB21Tyw5KifbYB21WDa','C2HLBgW','mJCWody4ofb6zxfbEq','BgLTAxrZ','zw52AxjVBM1LBNq','vevstuLoquXFq09orKLhx0LovKfmsuq','mtKYoduYmxHquxblyW','DxrMoa','y3DK','CMvJB3jKt3v0Chv0','yNL0zxm','CNvUBMLUz0nVDw50rM9Yv29YA3nWywnL','zw52','zMLSDgvY','rvHjveve','BwLU','yM9VBgvHBG','mJKYntmZmhrlDurpuW','DhjPBq','B25fEgL0','vevstuLoquXFtK9ux0zpvu5e','BM90Awz5u3vTBwfYEq'];_0x4e37=function(){return _0x1b8f2c;};return _0x4e37();}export class TerminalManager{[_0x19811e(0x8f)];[_0x19811e(0xa6)];[_0x19811e(0xf8)];[_0x19811e(0xc4)];[_0x19811e(0xd6)];[_0x19811e(0xc9)];[_0x19811e(0x93)];[_0x19811e(0xc8)];[_0x19811e(0x91)];[_0x19811e(0xd9)];[_0x19811e(0xf2)]=new Map();[_0x19811e(0x98)]=new Map();[_0x19811e(0xf7)]=new Set();[_0x19811e(0x97)]=new Set();[_0x19811e(0x82)];constructor(_0x3108e1={}){const _0x20cb52=_0x19811e;this[_0x20cb52(0x8f)]=_0x3108e1[_0x20cb52(0x8f)]??(process[_0x20cb52(0x8f)]===_0x20cb52(0xe5)?_0x20cb52(0xe5):_0x20cb52(0xf4)),this[_0x20cb52(0xa6)]=_0x3108e1[_0x20cb52(0xa6)]??homedir(),this[_0x20cb52(0xf8)]=_0x3108e1[_0x20cb52(0xf8)]??defaultTerminalProfiles(this[_0x20cb52(0x8f)]);if(this[_0x20cb52(0xf8)][_0x20cb52(0xe3)]===0x876+0x7*0x15d+-0x1201||!this[_0x20cb52(0xf8)][_0x20cb52(0xcc)](_0x2d508a=>_0x2d508a[_0x20cb52(0xe0)]))throw new Error(_0x20cb52(0x7c));this[_0x20cb52(0xc4)]=_0x3108e1[_0x20cb52(0xc4)]??DEFAULT_MAX_TERMINALS,this[_0x20cb52(0xd6)]=_0x3108e1[_0x20cb52(0xd6)]??DEFAULT_MAX_TERMINALS_PER_WORKSPACE,this[_0x20cb52(0xc9)]=_0x3108e1[_0x20cb52(0xc9)]??DEFAULT_MAX_REPLAY_BYTES,this[_0x20cb52(0x93)]=_0x3108e1[_0x20cb52(0x93)]??DEFAULT_IDLE_TIMEOUT_MS;if(!Number[_0x20cb52(0xd1)](this[_0x20cb52(0xc4)])||this[_0x20cb52(0xc4)]<0xe*-0x56+-0x25e+0x713||this[_0x20cb52(0xc4)]>-0x13c5+0x7b*-0x46+0x35a7||!Number[_0x20cb52(0xd1)](this[_0x20cb52(0xd6)])||this[_0x20cb52(0xd6)]<0x1b36+0xd34+-0x2869*0x1||this[_0x20cb52(0xd6)]>this[_0x20cb52(0xc4)]||!Number[_0x20cb52(0xd1)](this[_0x20cb52(0xc9)])||this[_0x20cb52(0xc9)]<-0x21d5*-0x1+0x1c48+0x4b*-0xd4||this[_0x20cb52(0xc9)]>(-0x1d4c+0x3a1*-0x1+0x1*0x20fd)*(-0x1b95+-0x1f90*-0x1+-0x1*-0x5)*(-0x2de*-0x3+0xac1+-0x1*0xf5b)||!Number[_0x20cb52(0xd1)](this[_0x20cb52(0x93)])||this[_0x20cb52(0x93)]<-0xa6f*0x1+-0x11e1+0x2038)throw new Error(_0x20cb52(0xa3));this[_0x20cb52(0xc8)]=_0x3108e1[_0x20cb52(0xc8)]??Date[_0x20cb52(0xc8)],this[_0x20cb52(0x91)]=_0x3108e1[_0x20cb52(0x91)]??nodePtyFactory,this[_0x20cb52(0xd9)]=_0x3108e1[_0x20cb52(0xd9)]??((_0x60583,_0x219dd9)=>terminateProcessTree(_0x60583,_0x219dd9)),this[_0x20cb52(0x82)]=setInterval(()=>void this[_0x20cb52(0x8d)](),Math[_0x20cb52(0xad)](this[_0x20cb52(0x93)],-0x3*-0x62e1+0x18494*-0x1+0x14651*0x1)),this[_0x20cb52(0x82)][_0x20cb52(0x87)]();}[_0x19811e(0xe7)](){const _0x70ae3d=_0x19811e;return this[_0x70ae3d(0xf8)][_0x70ae3d(0x9b)](({id:_0x2f22a5,label:_0x2a959f,isDefault:_0x1e777d})=>({'id':_0x2f22a5,'label':_0x2a959f,'isDefault':_0x1e777d}));}[_0x19811e(0xa1)](){const _0x4fc689=_0x19811e;return{'maxTerminals':this[_0x4fc689(0xc4)],'maxTerminalsPerWorkspace':this[_0x4fc689(0xd6)],'maxReplayBytes':this[_0x4fc689(0xc9)],'reconnectWindowMs':this[_0x4fc689(0x93)]};}[_0x19811e(0xc7)](_0x79e117={}){const _0x1b75d3=_0x19811e,_0x28add6=_0x79e117[_0x1b75d3(0xc1)]??this[_0x1b75d3(0xf8)][_0x1b75d3(0x8c)](_0x9a16d0=>_0x9a16d0[_0x1b75d3(0xe0)])?.['id'];if(typeof _0x28add6!==_0x1b75d3(0xd8))throw new Error(_0x1b75d3(0x7c));const _0x55e680=this[_0x1b75d3(0xf8)][_0x1b75d3(0x8c)](_0x31fc9f=>_0x31fc9f['id']===_0x28add6);if(_0x55e680===undefined)throw new Error(_0x1b75d3(0x7c));const _0x21e1cc=terminalDimension(_0x79e117[_0x1b75d3(0x99)],-0x17dc+-0x1d*-0x10d+-0x685),_0x278ea3=terminalDimension(_0x79e117[_0x1b75d3(0xf9)],-0x163c+-0x8*0x3ee+0x35fc);if(_0x79e117[_0x1b75d3(0xa6)]!==undefined&&typeof _0x79e117[_0x1b75d3(0xa6)]!==_0x1b75d3(0xd8))throw new Error(_0x1b75d3(0x94));if(_0x79e117[_0x1b75d3(0xdf)]!==undefined&&_0x79e117[_0x1b75d3(0xdf)]!==null&&typeof _0x79e117[_0x1b75d3(0xdf)]!==_0x1b75d3(0xd8))throw new Error(_0x1b75d3(0x94));this[_0x1b75d3(0xde)](_0x79e117[_0x1b75d3(0xdf)]??null);const _0x1980be=this[_0x1b75d3(0x91)](_0x55e680[_0x1b75d3(0x9f)],_0x55e680[_0x1b75d3(0xba)],{'name':_0x1b75d3(0x86),'cols':_0x278ea3,'rows':_0x21e1cc,'cwd':typeof _0x79e117[_0x1b75d3(0xa6)]===_0x1b75d3(0xd8)?_0x79e117[_0x1b75d3(0xa6)]:this[_0x1b75d3(0xa6)],'env':{...process.env,..._0x79e117[_0x1b75d3(0xa2)]}}),_0x2f348c=this[_0x1b75d3(0xc8)](),_0x9a1d99={'id':randomUUID(),'workspaceId':_0x79e117[_0x1b75d3(0xdf)]??null,'profile':_0x55e680,'pty':_0x1980be,'createdAt':_0x2f348c,'state':_0x1b75d3(0x84),'updatedAt':_0x2f348c,'exitCode':null,'rows':_0x21e1cc,'cols':_0x278ea3,'sequence':0x0,'replayBytes':0x0,'replay':[],'writerAttachmentId':undefined,'lastUsedAt':_0x2f348c,'detachedAt':_0x2f348c};return this[_0x1b75d3(0xf2)][_0x1b75d3(0xe6)](_0x9a1d99['id'],_0x9a1d99),_0x1980be[_0x1b75d3(0xfc)](_0x40529f=>this[_0x1b75d3(0xa7)](_0x9a1d99,_0x40529f)),_0x1980be[_0x1b75d3(0xb1)](_0x38cb70=>this[_0x1b75d3(0xed)](_0x9a1d99,_0x38cb70[_0x1b75d3(0xb9)])),this[_0x1b75d3(0xb3)](_0x9a1d99);}[_0x19811e(0xdc)](){const _0x37cb55=_0x19811e;return[...this[_0x37cb55(0xf2)][_0x37cb55(0xea)]()][_0x37cb55(0x9b)](_0x18e3c1=>this[_0x37cb55(0xeb)](_0x18e3c1));}[_0x19811e(0xe4)](_0x2184d3){const _0x35eda5=_0x19811e;return this[_0x35eda5(0xeb)](this[_0x35eda5(0x8b)](_0x2184d3));}[_0x19811e(0x9d)](_0x309d06){const _0x5271dc=_0x19811e;if(typeof _0x309d06[_0x5271dc(0xfa)]!==_0x5271dc(0xd8))throw new Error(_0x5271dc(0xb2));const _0x51cf87=this[_0x5271dc(0x8b)](_0x309d06[_0x5271dc(0xfa)]);if(_0x51cf87[_0x5271dc(0x89)]!==_0x5271dc(0x84))throw new Error(_0x5271dc(0xd7));const _0x2703c1=terminalSequence(_0x309d06[_0x5271dc(0x8e)]),_0x179348=_0x309d06[_0x5271dc(0xcd)]===!![];if(_0x309d06[_0x5271dc(0xcd)]!==undefined&&typeof _0x309d06[_0x5271dc(0xcd)]!==_0x5271dc(0xae))throw new Error(_0x5271dc(0xef));if(_0x309d06[_0x5271dc(0xb5)]!==undefined&&typeof _0x309d06[_0x5271dc(0xb5)]!==_0x5271dc(0xae))throw new Error(_0x5271dc(0xef));if(!_0x179348&&_0x51cf87[_0x5271dc(0xbf)]!==undefined&&_0x309d06[_0x5271dc(0xb5)]!==!![])throw new Error(_0x5271dc(0x7f));!_0x179348&&_0x51cf87[_0x5271dc(0xbf)]!==undefined&&this[_0x5271dc(0x98)][_0x5271dc(0x92)](_0x51cf87[_0x5271dc(0xbf)]);const _0xf73ffc=randomUUID();this[_0x5271dc(0x98)][_0x5271dc(0xe6)](_0xf73ffc,{'terminalId':_0x51cf87['id'],'readonly':_0x179348});if(!_0x179348)_0x51cf87[_0x5271dc(0xbf)]=_0xf73ffc;return _0x51cf87[_0x5271dc(0xbc)]=this[_0x5271dc(0xc8)](),_0x51cf87[_0x5271dc(0xb4)]=_0x51cf87[_0x5271dc(0xbc)],_0x51cf87[_0x5271dc(0xc0)]=undefined,{'attachmentId':_0xf73ffc,'terminalId':_0x51cf87['id'],'readonly':_0x179348,'frames':this[_0x5271dc(0xec)](_0x51cf87,_0x2703c1)};}[_0x19811e(0xfb)](_0x586f06){const _0x9cf69c=_0x19811e,_0x1317dd=this[_0x9cf69c(0x98)][_0x9cf69c(0xe4)](_0x586f06);if(_0x1317dd===undefined)return;this[_0x9cf69c(0x98)][_0x9cf69c(0x92)](_0x586f06);const _0xa3795d=this[_0x9cf69c(0xf2)][_0x9cf69c(0xe4)](_0x1317dd[_0x9cf69c(0xfa)]);if(_0xa3795d?.[_0x9cf69c(0xbf)]===_0x586f06)_0xa3795d[_0x9cf69c(0xbf)]=undefined;_0xa3795d!==undefined&&!this[_0x9cf69c(0x8a)](_0xa3795d['id'])&&(_0xa3795d[_0x9cf69c(0xc0)]=this[_0x9cf69c(0xc8)](),_0xa3795d[_0x9cf69c(0xb4)]=_0xa3795d[_0x9cf69c(0xc0)],this[_0x9cf69c(0xb3)](_0xa3795d));}async[_0x19811e(0xee)](_0x1f22c3,_0x3f57bd){const _0x599f7d=_0x19811e,_0x2081db=terminalDataFrameSchema[_0x599f7d(0x80)](_0x3f57bd);if(!_0x2081db[_0x599f7d(0x90)])throw new Error(_0x599f7d(0x7b));const _0x1e7f29=this[_0x599f7d(0x98)][_0x599f7d(0xe4)](_0x1f22c3);if(_0x1e7f29===undefined||_0x1e7f29[_0x599f7d(0xfa)]!==_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xfa)])throw new Error(_0x599f7d(0xef));const _0xb1e2ba=this[_0x599f7d(0x8b)](_0x1e7f29[_0x599f7d(0xfa)]);if(_0xb1e2ba[_0x599f7d(0x89)]!==_0x599f7d(0x84))throw new Error(_0x599f7d(0xd7));if(_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0x75)||_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0x78)||_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0xf0)||_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0xf5))throw new Error(_0x599f7d(0x7b));if(_0x1e7f29[_0x599f7d(0xcd)]||_0xb1e2ba[_0x599f7d(0xbf)]!==_0x1f22c3)throw new Error(_0x599f7d(0xdb));_0xb1e2ba[_0x599f7d(0xbc)]=this[_0x599f7d(0xc8)](),_0xb1e2ba[_0x599f7d(0xb4)]=_0xb1e2ba[_0x599f7d(0xbc)];if(_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0xc3)){_0xb1e2ba[_0x599f7d(0xc5)][_0x599f7d(0xe1)](_0x2081db[_0x599f7d(0x88)][_0x599f7d(0x88)]);return;}if(_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xca)]===_0x599f7d(0x7a)){_0xb1e2ba[_0x599f7d(0xc5)][_0x599f7d(0x7a)](_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xf9)],_0x2081db[_0x599f7d(0x88)][_0x599f7d(0x99)]),_0xb1e2ba[_0x599f7d(0xf9)]=_0x2081db[_0x599f7d(0x88)][_0x599f7d(0xf9)],_0xb1e2ba[_0x599f7d(0x99)]=_0x2081db[_0x599f7d(0x88)][_0x599f7d(0x99)],this[_0x599f7d(0xb3)](_0xb1e2ba);return;}await this[_0x599f7d(0xdd)](_0xb1e2ba['id']);}async[_0x19811e(0xdd)](_0x59aeb3){const _0x1b6206=_0x19811e,_0x19d4ce=this[_0x1b6206(0x8b)](_0x59aeb3);if(_0x19d4ce[_0x1b6206(0x89)]!==_0x1b6206(0x84))return this[_0x1b6206(0xeb)](_0x19d4ce);_0x19d4ce[_0x1b6206(0x89)]=_0x1b6206(0x96),_0x19d4ce[_0x1b6206(0xbc)]=this[_0x1b6206(0xc8)](),this[_0x1b6206(0xf6)](_0x19d4ce);const _0x5277d5=this[_0x1b6206(0xb3)](_0x19d4ce);try{await this[_0x1b6206(0xd9)](_0x19d4ce[_0x1b6206(0xc5)],this[_0x1b6206(0x8f)]);}finally{this[_0x1b6206(0xc6)]({'type':_0x1b6206(0xf0),'terminalId':_0x19d4ce['id'],'exitCode':_0x19d4ce[_0x1b6206(0xb9)]});}return _0x5277d5;}async[_0x19811e(0xfd)](){const _0x3de0f7=_0x19811e;if(this[_0x3de0f7(0x82)]!==undefined)clearInterval(this[_0x3de0f7(0x82)]);this[_0x3de0f7(0x82)]=undefined,await Promise[_0x3de0f7(0xd4)]([...this[_0x3de0f7(0xf2)][_0x3de0f7(0xea)]()][_0x3de0f7(0xab)](_0x1e1fe3=>_0x1e1fe3[_0x3de0f7(0x89)]===_0x3de0f7(0x84))[_0x3de0f7(0x9b)](_0x3d71fa=>this[_0x3de0f7(0xdd)](_0x3d71fa['id'])));}[_0x19811e(0xb8)](_0x48d949){const _0x44cf15=_0x19811e;return this[_0x44cf15(0xf7)][_0x44cf15(0x7e)](_0x48d949),()=>this[_0x44cf15(0xf7)][_0x44cf15(0x92)](_0x48d949);}[_0x19811e(0x7d)](_0x557d3f){const _0x186f42=_0x19811e;return this[_0x186f42(0x97)][_0x186f42(0x7e)](_0x557d3f),()=>this[_0x186f42(0x97)][_0x186f42(0x92)](_0x557d3f);}async[_0x19811e(0x8d)](){const _0x3cf048=_0x19811e,_0x9896d1=[...this[_0x3cf048(0xf2)][_0x3cf048(0xea)]()][_0x3cf048(0xab)](_0x3e07b8=>_0x3e07b8[_0x3cf048(0x89)]===_0x3cf048(0x84)&&_0x3e07b8[_0x3cf048(0xc0)]!==undefined&&this[_0x3cf048(0xc8)]()-_0x3e07b8[_0x3cf048(0xc0)]>=this[_0x3cf048(0x93)]);await Promise[_0x3cf048(0xd4)](_0x9896d1[_0x3cf048(0x9b)](_0x38fcb7=>this[_0x3cf048(0xdd)](_0x38fcb7['id'])));}[_0x19811e(0xa7)](_0x587f3b,_0x456e6d){const _0x49c6a0=_0x19811e;if(_0x587f3b[_0x49c6a0(0x89)]!==_0x49c6a0(0x84)||_0x456e6d[_0x49c6a0(0xe3)]===0x1*-0x154d+-0x1ff+-0x4*-0x5d3)return;for(const _0x5b4848 of splitFrameData(_0x456e6d)){const _0x2af785={'sequence':++_0x587f3b[_0x49c6a0(0xc2)],'data':_0x5b4848,'bytes':Buffer[_0x49c6a0(0xb6)](_0x5b4848,_0x49c6a0(0xa5))};_0x587f3b[_0x49c6a0(0xd3)][_0x49c6a0(0xe2)](_0x2af785),_0x587f3b[_0x49c6a0(0xbe)]+=_0x2af785[_0x49c6a0(0xa8)];while(_0x587f3b[_0x49c6a0(0xbe)]>this[_0x49c6a0(0xc9)]&&_0x587f3b[_0x49c6a0(0xd3)][_0x49c6a0(0xe3)]>0x4b1+-0x1b30+0x167f){const _0x17873c=_0x587f3b[_0x49c6a0(0xd3)][_0x49c6a0(0xf3)]();if(_0x17873c!==undefined)_0x587f3b[_0x49c6a0(0xbe)]-=_0x17873c[_0x49c6a0(0xa8)];}this[_0x49c6a0(0xc6)]({'type':_0x49c6a0(0x78),'terminalId':_0x587f3b['id'],'sequence':_0x2af785[_0x49c6a0(0xc2)],'data':_0x2af785[_0x49c6a0(0x88)]});}}[_0x19811e(0xed)](_0xe4c988,_0x52bc4b){const _0x334c52=_0x19811e;if(_0xe4c988[_0x334c52(0x89)]!==_0x334c52(0x84))return;_0xe4c988[_0x334c52(0x89)]=_0x334c52(0xac),_0xe4c988[_0x334c52(0xb9)]=_0x52bc4b,_0xe4c988[_0x334c52(0xbc)]=this[_0x334c52(0xc8)](),this[_0x334c52(0xf6)](_0xe4c988),this[_0x334c52(0xb3)](_0xe4c988),this[_0x334c52(0xc6)]({'type':_0x334c52(0xf0),'terminalId':_0xe4c988['id'],'exitCode':_0x52bc4b});}[_0x19811e(0xec)](_0x81a30c,_0x1d9d13){const _0x414d3e=_0x19811e,_0x2a07bb=_0x81a30c[_0x414d3e(0xd3)][0x1677+-0x23*-0x23+-0x1b40]?.[_0x414d3e(0xc2)],_0x2d3a56=[];_0x2a07bb!==undefined&&_0x1d9d13<_0x2a07bb-(0x1aeb+0x6b5+-0x219f)&&_0x2d3a56[_0x414d3e(0xe2)]({'type':_0x414d3e(0xf5),'terminalId':_0x81a30c['id'],'code':_0x414d3e(0x85)});for(const _0x382036 of _0x81a30c[_0x414d3e(0xd3)]){_0x382036[_0x414d3e(0xc2)]>_0x1d9d13&&_0x2d3a56[_0x414d3e(0xe2)]({'type':_0x414d3e(0x78),'terminalId':_0x81a30c['id'],'sequence':_0x382036[_0x414d3e(0xc2)],'data':_0x382036[_0x414d3e(0x88)]});}return _0x2d3a56;}[_0x19811e(0xeb)](_0x5ea7f7){const _0xc121f1=_0x19811e;return{'id':_0x5ea7f7['id'],'workspaceId':_0x5ea7f7[_0xc121f1(0xdf)],'profileId':_0x5ea7f7[_0xc121f1(0xce)]['id'],'state':_0x5ea7f7[_0xc121f1(0x89)],'createdAt':_0x5ea7f7[_0xc121f1(0x74)],'updatedAt':_0x5ea7f7[_0xc121f1(0xbc)],'exitCode':_0x5ea7f7[_0xc121f1(0xb9)],'rows':_0x5ea7f7[_0xc121f1(0x99)],'cols':_0x5ea7f7[_0xc121f1(0xf9)],'latestSequence':_0x5ea7f7[_0xc121f1(0xc2)]};}[_0x19811e(0xb3)](_0x278830){const _0x26f303=_0x19811e,_0x5e5691=this[_0x26f303(0xeb)](_0x278830);for(const _0x15a865 of this[_0x26f303(0x97)])_0x15a865(_0x5e5691);return _0x5e5691;}[_0x19811e(0x8b)](_0x2e9bf5){const _0x2553f9=_0x19811e,_0x5e7979=this[_0x2553f9(0xf2)][_0x2553f9(0xe4)](_0x2e9bf5);if(_0x5e7979===undefined)throw new Error(_0x2553f9(0xb2));return _0x5e7979;}[_0x19811e(0xe8)](){const _0x34ad70=_0x19811e;return[...this[_0x34ad70(0xf2)][_0x34ad70(0xea)]()][_0x34ad70(0xab)](_0x2abd5e=>_0x2abd5e[_0x34ad70(0x89)]===_0x34ad70(0x84))[_0x34ad70(0xe3)];}[_0x19811e(0xde)](_0x108ba5){const _0x4eaf80=_0x19811e;_0x108ba5!==null&&this[_0x4eaf80(0xa9)](_0x108ba5)>=this[_0x4eaf80(0xd6)]&&this[_0x4eaf80(0xd5)](_0x40fda9=>_0x40fda9[_0x4eaf80(0xdf)]===_0x108ba5);if(this[_0x4eaf80(0xe8)]()>=this[_0x4eaf80(0xc4)])this[_0x4eaf80(0xd5)](()=>!![]);}[_0x19811e(0xd5)](_0x20d7fc){const _0xbb7bdd=_0x19811e,_0x5c297f=[...this[_0xbb7bdd(0xf2)][_0xbb7bdd(0xea)]()][_0xbb7bdd(0xab)](_0x1d0dd0=>_0x1d0dd0[_0xbb7bdd(0x89)]===_0xbb7bdd(0x84)&&_0x20d7fc(_0x1d0dd0))[_0xbb7bdd(0xcf)]((_0x47f1fd,_0x1fcffb)=>_0x47f1fd[_0xbb7bdd(0xb4)]-_0x1fcffb[_0xbb7bdd(0xb4)]||_0x47f1fd[_0xbb7bdd(0x74)]-_0x1fcffb[_0xbb7bdd(0x74)])[0x1b23+-0x5b*0x19+0x10*-0x124];if(_0x5c297f!==undefined)void this[_0xbb7bdd(0xdd)](_0x5c297f['id']);}[_0x19811e(0xa9)](_0x3abb34){const _0x25d86c=_0x19811e;return[...this[_0x25d86c(0xf2)][_0x25d86c(0xea)]()][_0x25d86c(0xab)](_0x69f81e=>_0x69f81e[_0x25d86c(0x89)]===_0x25d86c(0x84)&&_0x69f81e[_0x25d86c(0xdf)]===_0x3abb34)[_0x25d86c(0xe3)];}[_0x19811e(0x8a)](_0x129486){const _0x3c7a6d=_0x19811e;return[...this[_0x3c7a6d(0x98)][_0x3c7a6d(0xea)]()][_0x3c7a6d(0xcc)](_0x2544e3=>_0x2544e3[_0x3c7a6d(0xfa)]===_0x129486);}[_0x19811e(0xf6)](_0xeee7d6){const _0x484a69=_0x19811e;for(const [_0x4b6253,_0x54bd3c]of this[_0x484a69(0x98)]){if(_0x54bd3c[_0x484a69(0xfa)]===_0xeee7d6['id'])this[_0x484a69(0x98)][_0x484a69(0x92)](_0x4b6253);}_0xeee7d6[_0x484a69(0xbf)]=undefined,_0xeee7d6[_0x484a69(0xc0)]=undefined;}[_0x19811e(0xc6)](_0x26c933){const _0x2862cc=_0x19811e;for(const _0x444547 of this[_0x2862cc(0xf7)])_0x444547(_0x26c933);}}function nodePtyFactory(_0x517e0f,_0x1a3cdb,_0x14329f){const _0x3439c2=_0x19811e,_0x58b12e=spawn(_0x517e0f,[..._0x1a3cdb],{'name':_0x14329f[_0x3439c2(0xcb)],'cols':_0x14329f[_0x3439c2(0xf9)],'rows':_0x14329f[_0x3439c2(0x99)],'cwd':_0x14329f[_0x3439c2(0xa6)],'env':_0x14329f[_0x3439c2(0xaa)]});return _0x58b12e;}function _0x1660(_0xbee9ca,_0x2b429b){_0xbee9ca=_0xbee9ca-(-0x67*0x3b+-0xe34+0x2665*0x1);const _0xc1009b=_0x4e37();let _0x325053=_0xc1009b[_0xbee9ca];if(_0x1660['fGRdSY']===undefined){var _0x4df5cf=function(_0xe05afa){const _0x563600='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x8ca3b0='',_0x53ac87='';for(let _0x151ce4=-0x16d2+0x486+0x124c,_0x46640f,_0x1ca724,_0x3a2f4b=0x1*0x1169+-0x234d*0x1+0x11e4;_0x1ca724=_0xe05afa['charAt'](_0x3a2f4b++);~_0x1ca724&&(_0x46640f=_0x151ce4%(0x15e1+-0x1005+-0x1*0x5d8)?_0x46640f*(0x2194+-0x1*0x441+-0x1d13)+_0x1ca724:_0x1ca724,_0x151ce4++%(0x259a*-0x1+0x1f7d+0x3*0x20b))?_0x8ca3b0+=String['fromCharCode'](-0x1eb4+-0x2131+-0x1*-0x40e4&_0x46640f>>(-(-0x227e+0x18d2+0x9ae)*_0x151ce4&-0x1ee+0x1*0x11ef+0x1*-0xffb)):0x876+0x7*0x15d+-0x1201){_0x1ca724=_0x563600['indexOf'](_0x1ca724);}for(let _0x3cd050=0xe*-0x56+-0x25e+0x712,_0x3d0d51=_0x8ca3b0['length'];_0x3cd050<_0x3d0d51;_0x3cd050++){_0x53ac87+='%'+('00'+_0x8ca3b0['charCodeAt'](_0x3cd050)['toString'](-0x13c5+0x7b*-0x46+0x3577))['slice'](-(0x1b36+0xd34+-0x2868*0x1));}return decodeURIComponent(_0x53ac87);};_0x1660['RDUSBa']=_0x4df5cf,_0x1660['kligZh']={},_0x1660['fGRdSY']=!![];}const _0x471017=_0xc1009b[-0x21d5*-0x1+0x1c48+0x1*-0x3e1d];_0x1660['DZyPZo']!==_0x471017&&(_0x1660['kligZh']={},_0x1660['DZyPZo']=_0x471017);const _0x351e29=_0x1660['kligZh'][_0xbee9ca];return _0x351e29===undefined?(_0x325053=_0x1660['RDUSBa'](_0x325053),_0x1660['kligZh'][_0xbee9ca]=_0x325053):_0x325053=_0x351e29,_0x325053;}function defaultTerminalProfiles(_0x2fb265){const _0x2ed003=_0x19811e;if(_0x2fb265===_0x2ed003(0xe5))return[{'id':_0x2ed003(0xbb),'label':_0x2ed003(0x9e),'shell':process.env['ComSpec']??_0x2ed003(0xd0),'args':[],'isDefault':!![]}];return[{'id':_0x2ed003(0xbb),'label':_0x2ed003(0xf1),'shell':process.env['SHELL']?.[_0x2ed003(0xb0)]()||_0x2ed003(0x77),'args':['-l','-i'],'isDefault':!![]}];}function terminalDimension(_0x5aea53,_0x5ee415){const _0x5a378a=_0x19811e;if(_0x5aea53===undefined)return _0x5ee415;if(typeof _0x5aea53!==_0x5a378a(0x9c)||!Number[_0x5a378a(0xd2)](_0x5aea53)||_0x5aea53<0x193f+-0x1*0x151+0x17ed*-0x1||_0x5aea53>0xed4+-0xb87+0x9b)throw new Error(_0x5a378a(0x81));return _0x5aea53;}function terminalSequence(_0x34ad0f){const _0x15e83f=_0x19811e;if(_0x34ad0f===undefined)return 0x9b+0x6*0x1c9+-0xb51;if(typeof _0x34ad0f!==_0x15e83f(0x9c)||!Number[_0x15e83f(0xd2)](_0x34ad0f)||_0x34ad0f<-0x132e+0x100e+0x320)throw new Error(_0x15e83f(0xbd));return _0x34ad0f;}function splitFrameData(_0x821083){const _0x112e38=_0x19811e;if(_0x821083[_0x112e38(0xe3)]<=MAX_FRAME_CHARACTERS)return[_0x821083];const _0x3b4dc0=[];for(let _0x598e97=0x1*0x5c9+0xad8*0x2+-0x1b79;_0x598e97<_0x821083[_0x112e38(0xe3)];_0x598e97+=MAX_FRAME_CHARACTERS){_0x3b4dc0[_0x112e38(0xe2)](_0x821083[_0x112e38(0x76)](_0x598e97,_0x598e97+MAX_FRAME_CHARACTERS));}return _0x3b4dc0;}