@myagentroam/node 0.9.9 → 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.
- package/dist/capabilities.js +2 -92
- package/dist/claude-agent-sdk.js +2 -330
- package/dist/claude-channel.js +2 -44
- package/dist/codex-app-server.js +2 -503
- package/dist/config.js +2 -56
- package/dist/connector/node-connector-options.js +2 -1
- package/dist/connector/node-operation-router.js +2 -22
- package/dist/connector.js +2 -845
- package/dist/control-outbound-scheduler.js +2 -154
- package/dist/database.js +2 -1418
- package/dist/event-buffer.js +2 -19
- package/dist/fake-runner.js +2 -129
- package/dist/health.js +2 -3
- package/dist/main.js +2 -54
- package/dist/migrations/v001.js +3 -144
- package/dist/migrations/v002.js +2 -143
- package/dist/migrations/v003.js +2 -44
- package/dist/migrations/v004.js +34 -30
- package/dist/native-jsonl-reader.js +2 -186
- package/dist/native-session-history.js +2 -1119
- package/dist/opencode-runtime.js +2 -80
- package/dist/opencode-server.js +2 -263
- package/dist/operational.js +2 -122
- package/dist/process-tree.js +2 -18
- package/dist/rotating-log.js +2 -67
- package/dist/runner/abstract-runner.js +2 -232
- package/dist/runner/claude/managed-run-controller.js +2 -345
- package/dist/runner/claude-code-runner.js +2 -303
- package/dist/runner/codex/composer-image-markers.js +2 -0
- package/dist/runner/codex/conversation-parser.js +2 -861
- package/dist/runner/codex/managed-run-controller.js +2 -460
- package/dist/runner/codex-runner.js +2 -628
- package/dist/runner/fake-test-runner.js +2 -47
- package/dist/runner/opencode/conversation-parser.js +2 -221
- package/dist/runner/opencode/managed-run-controller.js +2 -537
- package/dist/runner/opencode-runner.js +2 -448
- package/dist/runner/runner-registry.js +2 -90
- package/dist/runner-command-engine.js +2 -70
- package/dist/runner-profiles.js +2 -215
- package/dist/runner-usage.js +2 -190
- package/dist/runtime-command-detector.js +2 -73
- package/dist/runtime-state.js +2 -982
- package/dist/service/attachment-domain-state.js +2 -7
- package/dist/service/conversation-history-service.js +2 -457
- package/dist/service/conversation-segment-service.js +2 -162
- package/dist/service/external-session-resume-service.js +2 -118
- package/dist/service/fake-managed-run-service.js +2 -60
- package/dist/service/managed-runner-session-service.js +2 -35
- package/dist/service/mcp-installation-verifier.js +2 -87
- package/dist/service/mcp-node-operation-service.js +2 -90
- package/dist/service/mcp-package-installer.js +2 -136
- package/dist/service/native-session-projection-service.js +2 -280
- package/dist/service/native-session-watch-service.js +2 -383
- package/dist/service/node-connection-lifecycle-service.js +2 -84
- package/dist/service/node-control-channel.js +2 -85
- package/dist/service/node-control-message-service.js +2 -107
- package/dist/service/node-request-service.js +2 -52
- package/dist/service/node-run-event-bridge.js +2 -83
- package/dist/service/node-terminal-channel.js +2 -182
- package/dist/service/node-upgrade-coordinator.js +2 -137
- package/dist/service/node-workspace-coordinator.js +2 -70
- package/dist/service/recent-run-projection-service.js +2 -78
- package/dist/service/run-attachment-service.js +2 -194
- package/dist/service/run-domain-state.js +2 -4
- package/dist/service/run-event-service.js +2 -193
- package/dist/service/run-workbench-service.js +2 -104
- package/dist/service/runner-channel-message-service.js +2 -20
- package/dist/service/runner-interaction-service.js +2 -243
- package/dist/service/runner-service.js +2 -71
- package/dist/service/session-catalog-service.js +2 -224
- package/dist/service/session-command-service.js +2 -76
- package/dist/service/session-context-service.js +2 -101
- package/dist/service/session-domain-state.js +2 -9
- package/dist/service/session-identity-service.js +2 -86
- package/dist/service/session-lifecycle-service.js +2 -240
- package/dist/service/session-message-service.js +2 -173
- package/dist/service/session-presentation-service.js +2 -43
- package/dist/service/session-query-service.js +2 -82
- package/dist/service/skill-directory-service.js +2 -238
- package/dist/service/skill-install-service.js +2 -434
- package/dist/service/skill-node-operation-service.js +2 -206
- package/dist/service/terminal-relay-state.js +2 -3
- package/dist/service/terminal-service.js +2 -52
- package/dist/service/workbench-event-service.js +2 -19
- package/dist/service/workbench-manifest-service.js +2 -69
- package/dist/service/workspace-change-service.js +2 -86
- package/dist/service/workspace-content-search-service.js +2 -477
- package/dist/service/workspace-domain-state.js +2 -41
- package/dist/service/workspace-file-service.js +2 -122
- package/dist/service/workspace-git-exclude-service.js +2 -119
- package/dist/service/workspace-queue-workbench-service.js +2 -304
- package/dist/service/workspace-service.js +2 -69
- package/dist/service/workspace-session-service.js +2 -139
- package/dist/service/workspace-upload-service.js +2 -262
- package/dist/service/workspace-watch-service.js +2 -146
- package/dist/service/workspace-workbench-service.js +2 -405
- package/dist/service.js +2 -38
- package/dist/storage.js +2 -32
- package/dist/supervisor.js +2 -136
- package/dist/terminal.js +2 -416
- package/dist/util/node-operation-parsers.js +2 -382
- package/dist/util/personal-instructions.js +2 -31
- package/dist/util/runner-error.js +2 -52
- package/dist/util/runner-native-session-parsers.js +2 -490
- package/dist/util/safe-error.js +2 -5
- package/dist/util/secret-environment.js +2 -25
- package/dist/workspace.js +2 -1519
- package/package.json +3 -3
- package/dist/capabilities.d.ts +0 -12
- package/dist/claude-agent-sdk.d.ts +0 -92
- package/dist/claude-channel.d.ts +0 -28
- package/dist/codex-app-server.d.ts +0 -133
- package/dist/config.d.ts +0 -18
- package/dist/connector/node-connector-options.d.ts +0 -27
- package/dist/connector/node-operation-router.d.ts +0 -9
- package/dist/connector.d.ts +0 -94
- package/dist/control-outbound-scheduler.d.ts +0 -29
- package/dist/database.d.ts +0 -305
- package/dist/event-buffer.d.ts +0 -9
- package/dist/fake-runner.d.ts +0 -42
- package/dist/health.d.ts +0 -4
- package/dist/main.d.ts +0 -2
- package/dist/migrations/v001.d.ts +0 -3
- package/dist/migrations/v002.d.ts +0 -4
- package/dist/migrations/v003.d.ts +0 -4
- package/dist/migrations/v004.d.ts +0 -4
- package/dist/native-jsonl-reader.d.ts +0 -35
- package/dist/native-session-history.d.ts +0 -126
- package/dist/opencode-runtime.d.ts +0 -33
- package/dist/opencode-server.d.ts +0 -49
- package/dist/operational.d.ts +0 -39
- package/dist/process-tree.d.ts +0 -9
- package/dist/rotating-log.d.ts +0 -17
- package/dist/runner/abstract-runner.d.ts +0 -172
- package/dist/runner/claude/managed-run-controller.d.ts +0 -51
- package/dist/runner/claude-code-runner.d.ts +0 -72
- package/dist/runner/codex/conversation-parser.d.ts +0 -59
- package/dist/runner/codex/managed-run-controller.d.ts +0 -90
- package/dist/runner/codex-runner.d.ts +0 -103
- package/dist/runner/fake-test-runner.d.ts +0 -26
- package/dist/runner/opencode/conversation-parser.d.ts +0 -31
- package/dist/runner/opencode/managed-run-controller.d.ts +0 -82
- package/dist/runner/opencode-runner.d.ts +0 -71
- package/dist/runner/runner-registry.d.ts +0 -19
- package/dist/runner-command-engine.d.ts +0 -28
- package/dist/runner-profiles.d.ts +0 -15
- package/dist/runner-usage.d.ts +0 -33
- package/dist/runtime-command-detector.d.ts +0 -3
- package/dist/runtime-state.d.ts +0 -171
- package/dist/service/attachment-domain-state.d.ts +0 -7
- package/dist/service/conversation-history-service.d.ts +0 -43
- package/dist/service/conversation-segment-service.d.ts +0 -20
- package/dist/service/external-session-resume-service.d.ts +0 -34
- package/dist/service/fake-managed-run-service.d.ts +0 -28
- package/dist/service/managed-runner-session-service.d.ts +0 -12
- package/dist/service/mcp-installation-verifier.d.ts +0 -9
- package/dist/service/mcp-node-operation-service.d.ts +0 -11
- package/dist/service/mcp-package-installer.d.ts +0 -8
- package/dist/service/native-session-projection-service.d.ts +0 -52
- package/dist/service/native-session-watch-service.d.ts +0 -62
- package/dist/service/node-connection-lifecycle-service.d.ts +0 -36
- package/dist/service/node-control-channel.d.ts +0 -32
- package/dist/service/node-control-message-service.d.ts +0 -27
- package/dist/service/node-request-service.d.ts +0 -14
- package/dist/service/node-run-event-bridge.d.ts +0 -40
- package/dist/service/node-terminal-channel.d.ts +0 -29
- package/dist/service/node-upgrade-coordinator.d.ts +0 -29
- package/dist/service/node-workspace-coordinator.d.ts +0 -29
- package/dist/service/recent-run-projection-service.d.ts +0 -14
- package/dist/service/run-attachment-service.d.ts +0 -38
- package/dist/service/run-domain-state.d.ts +0 -4
- package/dist/service/run-event-service.d.ts +0 -33
- package/dist/service/run-workbench-service.d.ts +0 -25
- package/dist/service/runner-channel-message-service.d.ts +0 -13
- package/dist/service/runner-interaction-service.d.ts +0 -39
- package/dist/service/runner-service.d.ts +0 -46
- package/dist/service/session-catalog-service.d.ts +0 -45
- package/dist/service/session-command-service.d.ts +0 -24
- package/dist/service/session-context-service.d.ts +0 -35
- package/dist/service/session-domain-state.d.ts +0 -9
- package/dist/service/session-identity-service.d.ts +0 -24
- package/dist/service/session-lifecycle-service.d.ts +0 -31
- package/dist/service/session-message-service.d.ts +0 -33
- package/dist/service/session-presentation-service.d.ts +0 -34
- package/dist/service/session-query-service.d.ts +0 -35
- package/dist/service/skill-directory-service.d.ts +0 -20
- package/dist/service/skill-install-service.d.ts +0 -21
- package/dist/service/skill-node-operation-service.d.ts +0 -44
- package/dist/service/terminal-relay-state.d.ts +0 -6
- package/dist/service/terminal-service.d.ts +0 -12
- package/dist/service/workbench-event-service.d.ts +0 -9
- package/dist/service/workbench-manifest-service.d.ts +0 -90
- package/dist/service/workspace-change-service.d.ts +0 -9
- package/dist/service/workspace-content-search-service.d.ts +0 -14
- package/dist/service/workspace-domain-state.d.ts +0 -79
- package/dist/service/workspace-file-service.d.ts +0 -18
- package/dist/service/workspace-git-exclude-service.d.ts +0 -4
- package/dist/service/workspace-queue-workbench-service.d.ts +0 -86
- package/dist/service/workspace-service.d.ts +0 -15
- package/dist/service/workspace-session-service.d.ts +0 -23
- package/dist/service/workspace-upload-service.d.ts +0 -39
- package/dist/service/workspace-watch-service.d.ts +0 -23
- package/dist/service/workspace-workbench-service.d.ts +0 -58
- package/dist/service.d.ts +0 -4
- package/dist/storage.d.ts +0 -2
- package/dist/supervisor.d.ts +0 -1
- package/dist/terminal.d.ts +0 -133
- package/dist/util/node-operation-parsers.d.ts +0 -92
- package/dist/util/personal-instructions.d.ts +0 -2
- package/dist/util/runner-error.d.ts +0 -6
- package/dist/util/runner-native-session-parsers.d.ts +0 -74
- package/dist/util/safe-error.d.ts +0 -2
- package/dist/util/secret-environment.d.ts +0 -1
- package/dist/workspace.d.ts +0 -217
package/dist/terminal.js
CHANGED
|
@@ -1,416 +1,2 @@
|
|
|
1
|
-
|
|
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;}
|