@tutti-os/workspace-terminal 0.0.6 → 0.0.7
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/{chunk-FEJT6FJ4.js → chunk-UWPZ5O4V.js} +233 -1
- package/dist/chunk-UWPZ5O4V.js.map +1 -0
- package/dist/contracts/index.d.ts +33 -1
- package/dist/react/index.d.ts +15 -3
- package/dist/react/index.js +185 -1
- package/dist/react/index.js.map +1 -1
- package/dist/styles/terminal.css +48 -0
- package/dist/workbench/index.d.ts +3 -2
- package/dist/workbench/index.js +15 -7
- package/dist/workbench/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-FEJT6FJ4.js.map +0 -1
|
@@ -730,6 +730,27 @@ function drainTerminalWriteBatch(chunks, maxBytes) {
|
|
|
730
730
|
|
|
731
731
|
// src/react/terminalSurfaceRuntime.ts
|
|
732
732
|
var terminalScreenStateCache = createTerminalScreenStateCache();
|
|
733
|
+
var terminalPreviewMaxRows = 24;
|
|
734
|
+
var terminalPreviewMaxCols = 160;
|
|
735
|
+
var terminalPreviewAnsiColors = [
|
|
736
|
+
"#2e3436",
|
|
737
|
+
"#cc0000",
|
|
738
|
+
"#4e9a06",
|
|
739
|
+
"#c4a000",
|
|
740
|
+
"#3465a4",
|
|
741
|
+
"#75507b",
|
|
742
|
+
"#06989a",
|
|
743
|
+
"#d3d7cf",
|
|
744
|
+
"#555753",
|
|
745
|
+
"#ef2929",
|
|
746
|
+
"#8ae234",
|
|
747
|
+
"#fce94f",
|
|
748
|
+
"#729fcf",
|
|
749
|
+
"#ad7fa8",
|
|
750
|
+
"#34e2e2",
|
|
751
|
+
"#eeeeec"
|
|
752
|
+
];
|
|
753
|
+
var terminalPreviewColorSteps = [0, 95, 135, 175, 215, 255];
|
|
733
754
|
function createTerminalSurfaceRuntime(input) {
|
|
734
755
|
let contentEpoch = 0;
|
|
735
756
|
let committedRawOutput = "";
|
|
@@ -742,6 +763,7 @@ function createTerminalSurfaceRuntime(input) {
|
|
|
742
763
|
let pendingWriteFrame = null;
|
|
743
764
|
let pendingWriteChunks = [];
|
|
744
765
|
let pendingRenderedWrite = null;
|
|
766
|
+
let lastPreviewRevision = null;
|
|
745
767
|
const terminal = new Terminal({
|
|
746
768
|
allowProposedApi: false,
|
|
747
769
|
convertEol: true,
|
|
@@ -850,6 +872,11 @@ function createTerminalSurfaceRuntime(input) {
|
|
|
850
872
|
terminalScreenStateCache.remove(input.nodeId, input.sessionId);
|
|
851
873
|
}
|
|
852
874
|
clearPendingWrites();
|
|
875
|
+
input.onPreviewChange?.({
|
|
876
|
+
nodeId: input.nodeId,
|
|
877
|
+
sessionId: input.sessionId,
|
|
878
|
+
snapshot: null
|
|
879
|
+
});
|
|
853
880
|
terminal.dispose();
|
|
854
881
|
},
|
|
855
882
|
findNext(query, options) {
|
|
@@ -864,6 +891,7 @@ function createTerminalSurfaceRuntime(input) {
|
|
|
864
891
|
},
|
|
865
892
|
setTheme(theme) {
|
|
866
893
|
terminal.options.theme = resolveXtermTheme(theme);
|
|
894
|
+
emitTerminalPreviewSnapshot();
|
|
867
895
|
},
|
|
868
896
|
syncOutput(rawOutput, nextContentEpoch) {
|
|
869
897
|
const plan = resolveTerminalSurfaceOutputPlan({
|
|
@@ -1000,6 +1028,22 @@ function createTerminalSurfaceRuntime(input) {
|
|
|
1000
1028
|
return;
|
|
1001
1029
|
}
|
|
1002
1030
|
terminal.refresh(0, terminal.rows - 1);
|
|
1031
|
+
emitTerminalPreviewSnapshot();
|
|
1032
|
+
}
|
|
1033
|
+
function emitTerminalPreviewSnapshot() {
|
|
1034
|
+
if (!input.onPreviewChange || terminal.cols <= 0 || terminal.rows <= 0) {
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
const snapshot = createTerminalPreviewSnapshot(terminal);
|
|
1038
|
+
if (snapshot.revision === lastPreviewRevision) {
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
lastPreviewRevision = snapshot.revision;
|
|
1042
|
+
input.onPreviewChange({
|
|
1043
|
+
nodeId: input.nodeId,
|
|
1044
|
+
sessionId: input.sessionId,
|
|
1045
|
+
snapshot
|
|
1046
|
+
});
|
|
1003
1047
|
}
|
|
1004
1048
|
function scheduleInitialLayoutSync() {
|
|
1005
1049
|
resizeTerminal();
|
|
@@ -1172,6 +1216,190 @@ function resolveXtermTheme(theme) {
|
|
|
1172
1216
|
selectionBackground: theme.selectionBackground
|
|
1173
1217
|
};
|
|
1174
1218
|
}
|
|
1219
|
+
function createTerminalPreviewSnapshot(terminal) {
|
|
1220
|
+
const buffer = terminal.buffer.active;
|
|
1221
|
+
const rowCount = Math.min(terminal.rows, terminalPreviewMaxRows);
|
|
1222
|
+
const colCount = Math.min(terminal.cols, terminalPreviewMaxCols);
|
|
1223
|
+
const viewportY = Math.max(0, buffer.viewportY);
|
|
1224
|
+
const theme = terminal.options.theme;
|
|
1225
|
+
const lines = [];
|
|
1226
|
+
const scratchCell = buffer.getNullCell();
|
|
1227
|
+
for (let index = 0; index < rowCount; index += 1) {
|
|
1228
|
+
lines.push(
|
|
1229
|
+
createTerminalPreviewLine({
|
|
1230
|
+
colCount,
|
|
1231
|
+
line: buffer.getLine(viewportY + index) ?? null,
|
|
1232
|
+
scratchCell,
|
|
1233
|
+
theme
|
|
1234
|
+
})
|
|
1235
|
+
);
|
|
1236
|
+
}
|
|
1237
|
+
const revision = [
|
|
1238
|
+
terminal.cols,
|
|
1239
|
+
terminal.rows,
|
|
1240
|
+
buffer.cursorX,
|
|
1241
|
+
buffer.cursorY,
|
|
1242
|
+
viewportY,
|
|
1243
|
+
JSON.stringify(lines)
|
|
1244
|
+
].join("\n");
|
|
1245
|
+
return {
|
|
1246
|
+
cols: terminal.cols,
|
|
1247
|
+
cursorX: buffer.cursorX,
|
|
1248
|
+
cursorY: buffer.cursorY,
|
|
1249
|
+
lines,
|
|
1250
|
+
revision,
|
|
1251
|
+
rows: terminal.rows,
|
|
1252
|
+
updatedAtUnixMs: Date.now()
|
|
1253
|
+
};
|
|
1254
|
+
}
|
|
1255
|
+
function createTerminalPreviewLine(input) {
|
|
1256
|
+
const line = input.line;
|
|
1257
|
+
if (!line || input.colCount <= 0) {
|
|
1258
|
+
return { segments: [] };
|
|
1259
|
+
}
|
|
1260
|
+
const segments = [];
|
|
1261
|
+
let currentStyle;
|
|
1262
|
+
let currentText = "";
|
|
1263
|
+
const lastColumn = resolveTerminalPreviewLastColumn({
|
|
1264
|
+
colCount: input.colCount,
|
|
1265
|
+
line,
|
|
1266
|
+
scratchCell: input.scratchCell,
|
|
1267
|
+
theme: input.theme
|
|
1268
|
+
});
|
|
1269
|
+
for (let column = 0; column < lastColumn; column += 1) {
|
|
1270
|
+
const cell = line.getCell(column, input.scratchCell);
|
|
1271
|
+
if (!cell) {
|
|
1272
|
+
continue;
|
|
1273
|
+
}
|
|
1274
|
+
const width = cell.getWidth();
|
|
1275
|
+
if (width === 0) {
|
|
1276
|
+
continue;
|
|
1277
|
+
}
|
|
1278
|
+
const style = resolveTerminalPreviewCellStyle(cell, input.theme);
|
|
1279
|
+
const text = cell.isInvisible() ? " ".repeat(Math.max(1, width)) : cell.getChars() || " ".repeat(Math.max(1, width));
|
|
1280
|
+
if (currentText && areTerminalPreviewStylesEqual(currentStyle, style)) {
|
|
1281
|
+
currentText += text;
|
|
1282
|
+
continue;
|
|
1283
|
+
}
|
|
1284
|
+
if (currentText) {
|
|
1285
|
+
segments.push(createTerminalPreviewSegment(currentText, currentStyle));
|
|
1286
|
+
}
|
|
1287
|
+
currentStyle = style;
|
|
1288
|
+
currentText = text;
|
|
1289
|
+
}
|
|
1290
|
+
if (currentText) {
|
|
1291
|
+
segments.push(createTerminalPreviewSegment(currentText, currentStyle));
|
|
1292
|
+
}
|
|
1293
|
+
return { segments };
|
|
1294
|
+
}
|
|
1295
|
+
function createTerminalPreviewSegment(text, style) {
|
|
1296
|
+
if (!style) {
|
|
1297
|
+
return { text };
|
|
1298
|
+
}
|
|
1299
|
+
return { style, text };
|
|
1300
|
+
}
|
|
1301
|
+
function resolveTerminalPreviewLastColumn(input) {
|
|
1302
|
+
for (let column = input.colCount - 1; column >= 0; column -= 1) {
|
|
1303
|
+
const cell = input.line.getCell(column, input.scratchCell);
|
|
1304
|
+
if (!cell || cell.getWidth() === 0) {
|
|
1305
|
+
continue;
|
|
1306
|
+
}
|
|
1307
|
+
if (!isTerminalPreviewCellEmptyDefault(cell, input.theme)) {
|
|
1308
|
+
return column + 1;
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
return 0;
|
|
1312
|
+
}
|
|
1313
|
+
function isTerminalPreviewCellEmptyDefault(cell, theme) {
|
|
1314
|
+
const style = resolveTerminalPreviewCellStyle(cell, theme);
|
|
1315
|
+
return (cell.getChars() || " ") === " " && !style;
|
|
1316
|
+
}
|
|
1317
|
+
function resolveTerminalPreviewCellStyle(cell, theme) {
|
|
1318
|
+
const style = {};
|
|
1319
|
+
const inverse = Boolean(cell.isInverse());
|
|
1320
|
+
const foreground = resolveTerminalPreviewColor(cell, "foreground", theme);
|
|
1321
|
+
const background = resolveTerminalPreviewColor(cell, "background", theme);
|
|
1322
|
+
const color = inverse ? background ?? theme.background : foreground;
|
|
1323
|
+
const backgroundColor = inverse ? foreground ?? theme.foreground : background;
|
|
1324
|
+
if (color) {
|
|
1325
|
+
style.color = color;
|
|
1326
|
+
}
|
|
1327
|
+
if (backgroundColor) {
|
|
1328
|
+
style.background = backgroundColor;
|
|
1329
|
+
}
|
|
1330
|
+
if (cell.isBold()) {
|
|
1331
|
+
style.bold = true;
|
|
1332
|
+
}
|
|
1333
|
+
if (cell.isDim()) {
|
|
1334
|
+
style.dim = true;
|
|
1335
|
+
}
|
|
1336
|
+
if (cell.isItalic()) {
|
|
1337
|
+
style.italic = true;
|
|
1338
|
+
}
|
|
1339
|
+
if (cell.isUnderline()) {
|
|
1340
|
+
style.underline = true;
|
|
1341
|
+
}
|
|
1342
|
+
if (cell.isStrikethrough()) {
|
|
1343
|
+
style.strikethrough = true;
|
|
1344
|
+
}
|
|
1345
|
+
if (cell.isOverline()) {
|
|
1346
|
+
style.overline = true;
|
|
1347
|
+
}
|
|
1348
|
+
return Object.keys(style).length > 0 ? style : void 0;
|
|
1349
|
+
}
|
|
1350
|
+
function resolveTerminalPreviewColor(cell, channel, theme) {
|
|
1351
|
+
const isDefault = channel === "foreground" ? cell.isFgDefault() : cell.isBgDefault();
|
|
1352
|
+
if (isDefault) {
|
|
1353
|
+
return void 0;
|
|
1354
|
+
}
|
|
1355
|
+
const isRgb = channel === "foreground" ? cell.isFgRGB() : cell.isBgRGB();
|
|
1356
|
+
const isPalette = channel === "foreground" ? cell.isFgPalette() : cell.isBgPalette();
|
|
1357
|
+
const rawColor = channel === "foreground" ? cell.getFgColor() : cell.getBgColor();
|
|
1358
|
+
if (isRgb) {
|
|
1359
|
+
return terminalPreviewColorToHex(rawColor);
|
|
1360
|
+
}
|
|
1361
|
+
if (!isPalette) {
|
|
1362
|
+
return void 0;
|
|
1363
|
+
}
|
|
1364
|
+
const paletteIndex = channel === "foreground" && cell.isBold() && rawColor >= 0 && rawColor <= 7 ? rawColor + 8 : rawColor;
|
|
1365
|
+
const paletteColor = resolveTerminalPreviewPaletteColor(paletteIndex);
|
|
1366
|
+
if (paletteColor) {
|
|
1367
|
+
return paletteColor;
|
|
1368
|
+
}
|
|
1369
|
+
return channel === "foreground" ? theme.foreground : theme.background;
|
|
1370
|
+
}
|
|
1371
|
+
function resolveTerminalPreviewPaletteColor(index) {
|
|
1372
|
+
if (index >= 0 && index < terminalPreviewAnsiColors.length) {
|
|
1373
|
+
return terminalPreviewAnsiColors[index];
|
|
1374
|
+
}
|
|
1375
|
+
if (index >= 16 && index <= 231) {
|
|
1376
|
+
const offset = index - 16;
|
|
1377
|
+
const red = terminalPreviewColorSteps[Math.floor(offset / 36) % 6] ?? 0;
|
|
1378
|
+
const green = terminalPreviewColorSteps[Math.floor(offset / 6) % 6] ?? 0;
|
|
1379
|
+
const blue = terminalPreviewColorSteps[offset % 6] ?? 0;
|
|
1380
|
+
return terminalPreviewRgbToHex(red, green, blue);
|
|
1381
|
+
}
|
|
1382
|
+
if (index >= 232 && index <= 255) {
|
|
1383
|
+
const value = 8 + (index - 232) * 10;
|
|
1384
|
+
return terminalPreviewRgbToHex(value, value, value);
|
|
1385
|
+
}
|
|
1386
|
+
return void 0;
|
|
1387
|
+
}
|
|
1388
|
+
function terminalPreviewColorToHex(color) {
|
|
1389
|
+
return `#${color.toString(16).padStart(6, "0").slice(-6)}`;
|
|
1390
|
+
}
|
|
1391
|
+
function terminalPreviewRgbToHex(red, green, blue) {
|
|
1392
|
+
return `#${[red, green, blue].map((value) => value.toString(16).padStart(2, "0")).join("")}`;
|
|
1393
|
+
}
|
|
1394
|
+
function areTerminalPreviewStylesEqual(left, right) {
|
|
1395
|
+
if (left === right) {
|
|
1396
|
+
return true;
|
|
1397
|
+
}
|
|
1398
|
+
if (!left || !right) {
|
|
1399
|
+
return false;
|
|
1400
|
+
}
|
|
1401
|
+
return left.background === right.background && left.bold === right.bold && left.color === right.color && left.dim === right.dim && left.italic === right.italic && left.overline === right.overline && left.strikethrough === right.strikethrough && left.underline === right.underline;
|
|
1402
|
+
}
|
|
1175
1403
|
|
|
1176
1404
|
// src/react/terminalFindShortcut.ts
|
|
1177
1405
|
function isTerminalFindShortcut(event) {
|
|
@@ -1283,6 +1511,7 @@ function TerminalSurface({
|
|
|
1283
1511
|
externalState,
|
|
1284
1512
|
feature,
|
|
1285
1513
|
nodeId,
|
|
1514
|
+
onPreviewChange,
|
|
1286
1515
|
sessionId,
|
|
1287
1516
|
status
|
|
1288
1517
|
}) {
|
|
@@ -1352,6 +1581,7 @@ function TerminalSurface({
|
|
|
1352
1581
|
surfaceDiagnostics.resize({ cols, rows });
|
|
1353
1582
|
void controller.resize({ cols, rows });
|
|
1354
1583
|
},
|
|
1584
|
+
onPreviewChange,
|
|
1355
1585
|
onUserInput: (data, encoding) => {
|
|
1356
1586
|
controller.write(data, encoding);
|
|
1357
1587
|
},
|
|
@@ -1512,6 +1742,7 @@ function TerminalNode({
|
|
|
1512
1742
|
headerAccessory,
|
|
1513
1743
|
nodeId,
|
|
1514
1744
|
onFocusRequest,
|
|
1745
|
+
onPreviewChange,
|
|
1515
1746
|
sessionId,
|
|
1516
1747
|
showHeader = true
|
|
1517
1748
|
}) {
|
|
@@ -1541,6 +1772,7 @@ function TerminalNode({
|
|
|
1541
1772
|
externalState,
|
|
1542
1773
|
feature,
|
|
1543
1774
|
nodeId,
|
|
1775
|
+
onPreviewChange,
|
|
1544
1776
|
sessionId: resolvedSessionId,
|
|
1545
1777
|
status
|
|
1546
1778
|
}
|
|
@@ -1719,4 +1951,4 @@ export {
|
|
|
1719
1951
|
TerminalNodeHeader,
|
|
1720
1952
|
TerminalCloseGuardDialog
|
|
1721
1953
|
};
|
|
1722
|
-
//# sourceMappingURL=chunk-
|
|
1954
|
+
//# sourceMappingURL=chunk-UWPZ5O4V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/sessionControllerRecovery.ts","../src/core/sessionControllerStore.ts","../src/core/sessionTransportRuntime.ts","../src/core/sessionController.ts","../src/react/TerminalNode.tsx","../src/react/headerActions.ts","../src/react/TerminalSurface.tsx","../src/react/terminalSurfaceRuntime.ts","../src/react/terminalFileLinkProvider.ts","../src/react/terminalSurfaceOutputPlan.ts","../src/react/terminalSurfaceResizePlan.ts","../src/react/terminalSurfaceScreenCachePlan.ts","../src/react/terminalWriteBatch.ts","../src/react/terminalFindShortcut.ts","../src/react/useTerminalFindController.ts","../src/react/useTerminalSessionController.ts"],"sourcesContent":["import type { BufferedTerminalInputQueue } from \"./inputQueue.ts\";\nimport { writeQueuedTerminalInput } from \"./inputQueue.ts\";\nimport type { TerminalTransport } from \"../contracts/index.ts\";\nimport type { TerminalSessionRecoveryDiagnostics } from \"./sessionDiagnostics.ts\";\nimport type { TerminalSessionControllerStore } from \"./sessionControllerStore.ts\";\nimport type { TerminalSessionTransportRuntime } from \"./sessionTransportRuntime.ts\";\n\nexport interface TerminalSessionRecoveryHandle {\n dispose(): void;\n start(): Promise<void>;\n}\n\nexport function createTerminalSessionRecovery(input: {\n diagnostics: TerminalSessionRecoveryDiagnostics;\n inputQueue: BufferedTerminalInputQueue;\n onRecoverableDetach: () => void;\n onWriteReadyChange: (ready: boolean) => void;\n replayGapMessage: string;\n sessionId: string;\n snapshotTruncatedMessage: string;\n store: TerminalSessionControllerStore;\n transport: TerminalTransport;\n transportRuntime: TerminalSessionTransportRuntime;\n}): TerminalSessionRecoveryHandle {\n let disposed = false;\n let hydrationReady = false;\n const hydrationReplayChunks: string[] = [];\n\n const disposeData = input.transportRuntime.onData((event) => {\n if (disposed || event.sessionId !== input.sessionId) {\n return;\n }\n if (!hydrationReady) {\n hydrationReplayChunks.push(event.data);\n return;\n }\n input.store.appendRawOutput(event.data);\n });\n\n const disposeState = input.transportRuntime.onState((event) => {\n if (disposed || event.sessionId !== input.sessionId) {\n return;\n }\n if (\n typeof event.gapStartSeq === \"number\" &&\n typeof event.gapEndSeq === \"number\"\n ) {\n input.diagnostics.hydrationGap({\n fromSeq: event.gapStartSeq,\n toSeq: event.gapEndSeq\n });\n input.store.setSurfaceError(input.replayGapMessage);\n return;\n }\n if (event.error) {\n input.store.setSurfaceError(event.error);\n }\n if (event.status === \"detached\") {\n input.onWriteReadyChange(false);\n input.store.setInputReady(false);\n input.onRecoverableDetach();\n return;\n }\n if (event.status === \"exited\") {\n input.onWriteReadyChange(false);\n input.store.setInputReady(false);\n }\n });\n\n const disposeExit = input.transportRuntime.onExit((event) => {\n if (disposed || event.sessionId !== input.sessionId) {\n return;\n }\n input.onWriteReadyChange(false);\n input.store.setInputReady(false);\n });\n\n const disposeMetadata = input.transportRuntime.onMetadata(() => undefined);\n\n return {\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n hydrationReady = false;\n hydrationReplayChunks.length = 0;\n disposeData();\n disposeState();\n disposeExit();\n disposeMetadata();\n },\n async start() {\n input.diagnostics.hydrationStart();\n input.diagnostics.snapshotStart();\n\n try {\n const snapshot = await input.transportRuntime.snapshot();\n if (disposed) {\n return;\n }\n input.store.replaceRawOutput(snapshot.data);\n const snapshotState = input.store.getState();\n input.diagnostics.outputProjected({\n contentEpoch: snapshotState.contentEpoch,\n previewHead: previewTerminalOutput(snapshot.data, \"head\"),\n previewTail: previewTerminalOutput(snapshot.data, \"tail\"),\n rawBytes: snapshotState.rawOutput.length,\n source: \"snapshot\",\n writeBytes: snapshot.data.length\n });\n if (snapshot.truncated) {\n input.store.setSurfaceError(input.snapshotTruncatedMessage);\n } else {\n input.store.setSurfaceError(null);\n }\n input.diagnostics.snapshotComplete({\n toSeq: snapshot.toSeq ?? null,\n truncated: snapshot.truncated ?? false\n });\n input.diagnostics.attachStart(snapshot.toSeq ?? null);\n await input.transportRuntime.attach(snapshot.toSeq);\n if (disposed) {\n return;\n }\n hydrationReady = true;\n const replayChunks = hydrationReplayChunks.splice(0);\n replayChunks.forEach((chunk) => {\n input.store.appendRawOutput(chunk);\n });\n if (replayChunks.length > 0) {\n const replayState = input.store.getState();\n input.diagnostics.outputProjected({\n contentEpoch: replayState.contentEpoch,\n previewHead: previewTerminalOutput(replayChunks.join(\"\"), \"head\"),\n previewTail: previewTerminalOutput(replayChunks.join(\"\"), \"tail\"),\n rawBytes: replayState.rawOutput.length,\n source: \"replay\",\n writeBytes: replayChunks.reduce(\n (total, chunk) => total + chunk.length,\n 0\n )\n });\n }\n input.onWriteReadyChange(true);\n input.store.setInputReady(true);\n await writeQueuedTerminalInput({\n queue: input.inputQueue,\n sessionId: input.sessionId,\n transport: input.transport\n });\n if (disposed) {\n return;\n }\n input.diagnostics.attachComplete();\n input.diagnostics.hydrationComplete(replayChunks.length);\n } catch (error) {\n if (disposed) {\n return;\n }\n input.diagnostics.attachError();\n input.store.setSurfaceError(errorMessage(error));\n }\n }\n };\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction previewTerminalOutput(\n value: string,\n side: \"head\" | \"tail\",\n maxChars = 48\n) {\n const slice =\n side === \"head\"\n ? value.slice(0, maxChars)\n : value.slice(Math.max(0, value.length - maxChars));\n return slice\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"\\r\", \"\\\\r\")\n .replaceAll(\"\\n\", \"\\\\n\");\n}\n","import { truncateTerminalScrollback } from \"./scrollback.ts\";\n\nexport interface TerminalSessionControllerState {\n contentEpoch: number;\n inputReady: boolean;\n rawOutput: string;\n surfaceError: string | null;\n}\n\nexport interface TerminalSessionControllerStore {\n appendRawOutput(data: string): void;\n clearListeners(): void;\n getState(): TerminalSessionControllerState;\n replaceRawOutput(rawOutput: string): void;\n setInputReady(inputReady: boolean): void;\n setSurfaceError(surfaceError: string | null): void;\n subscribe(listener: () => void): () => void;\n}\n\nconst initialState: TerminalSessionControllerState = {\n contentEpoch: 0,\n inputReady: false,\n rawOutput: \"\",\n surfaceError: null\n};\n\nexport function createTerminalSessionControllerStore(input: {\n maxScrollbackChars: number;\n}): TerminalSessionControllerStore {\n let state = initialState;\n const listeners = new Set<() => void>();\n\n return {\n appendRawOutput(data) {\n if (!data) {\n return;\n }\n const nextOutput = truncateTerminalScrollback(\n `${state.rawOutput}${data}`,\n {\n maxChars: input.maxScrollbackChars\n }\n );\n if (nextOutput === state.rawOutput) {\n return;\n }\n state = {\n ...state,\n rawOutput: nextOutput\n };\n emitState(listeners);\n },\n clearListeners() {\n listeners.clear();\n },\n getState() {\n return state;\n },\n replaceRawOutput(rawOutput) {\n state = {\n ...state,\n contentEpoch: state.contentEpoch + 1,\n rawOutput: truncateTerminalScrollback(rawOutput, {\n maxChars: input.maxScrollbackChars\n })\n };\n emitState(listeners);\n },\n setInputReady(inputReady) {\n if (state.inputReady === inputReady) {\n return;\n }\n state = {\n ...state,\n inputReady\n };\n emitState(listeners);\n },\n setSurfaceError(surfaceError) {\n if (state.surfaceError === surfaceError) {\n return;\n }\n state = {\n ...state,\n surfaceError\n };\n emitState(listeners);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n };\n}\n\nfunction emitState(listeners: Set<() => void>) {\n for (const listener of listeners) {\n listener();\n }\n}\n","import type {\n TerminalDataEvent,\n TerminalExitEvent,\n TerminalMetadataEvent,\n TerminalSnapshot,\n TerminalStateEvent,\n TerminalTransport\n} from \"../contracts/index.ts\";\nimport { createTerminalAttachmentController } from \"./attachmentController.ts\";\n\nexport interface TerminalSessionTransportRuntime {\n attach(afterSeq?: number): Promise<void>;\n onData(listener: (event: TerminalDataEvent) => void): () => void;\n onExit(listener: (event: TerminalExitEvent) => void): () => void;\n onMetadata(listener: (event: TerminalMetadataEvent) => void): () => void;\n onState(listener: (event: TerminalStateEvent) => void): () => void;\n release(): void;\n snapshot(): Promise<TerminalSnapshot>;\n}\n\ninterface TerminalSessionTransportRuntimeEntry {\n attach(afterSeq?: number): Promise<void>;\n dataBuffer: TerminalDataEvent[];\n dataListeners: Set<(event: TerminalDataEvent) => void>;\n detachGraceMs: number;\n detachTimer: ReturnType<typeof setTimeout> | null;\n exitBuffer: TerminalExitEvent[];\n exitListeners: Set<(event: TerminalExitEvent) => void>;\n metadataBuffer: TerminalMetadataEvent[];\n metadataListeners: Set<(event: TerminalMetadataEvent) => void>;\n refCount: number;\n release(): void;\n sessionId: string;\n snapshot(): Promise<TerminalSnapshot>;\n snapshotCache: TerminalSnapshot | null;\n snapshotPromise: Promise<TerminalSnapshot> | null;\n stateBuffer: TerminalStateEvent[];\n stateListeners: Set<(event: TerminalStateEvent) => void>;\n teardown(): void;\n}\n\nconst defaultDetachGraceMs = 200;\nconst runtimeRegistry = new Map<string, TerminalSessionTransportRuntimeEntry>();\nlet runtimeClientSequence = 0;\n\nexport function acquireTerminalSessionTransportRuntime(input: {\n detachGraceMs?: number;\n sessionId: string;\n transport: TerminalTransport;\n}): TerminalSessionTransportRuntime {\n const entry =\n runtimeRegistry.get(input.sessionId) ??\n createTerminalSessionTransportRuntimeEntry(input);\n if (!runtimeRegistry.has(input.sessionId)) {\n runtimeRegistry.set(input.sessionId, entry);\n }\n entry.refCount += 1;\n if (entry.detachTimer !== null) {\n clearTimeout(entry.detachTimer);\n entry.detachTimer = null;\n }\n\n return {\n attach(afterSeq) {\n return entry.attach(afterSeq);\n },\n onData(listener) {\n entry.dataListeners.add(listener);\n flushBufferedEvents(entry.dataBuffer, listener);\n return () => {\n entry.dataListeners.delete(listener);\n };\n },\n onExit(listener) {\n entry.exitListeners.add(listener);\n flushBufferedEvents(entry.exitBuffer, listener);\n return () => {\n entry.exitListeners.delete(listener);\n };\n },\n onMetadata(listener) {\n entry.metadataListeners.add(listener);\n flushBufferedEvents(entry.metadataBuffer, listener);\n return () => {\n entry.metadataListeners.delete(listener);\n };\n },\n onState(listener) {\n entry.stateListeners.add(listener);\n flushBufferedEvents(entry.stateBuffer, listener);\n return () => {\n entry.stateListeners.delete(listener);\n };\n },\n release() {\n entry.release();\n },\n snapshot() {\n return entry.snapshot();\n }\n };\n}\n\nfunction createTerminalSessionTransportRuntimeEntry(input: {\n detachGraceMs?: number;\n sessionId: string;\n transport: TerminalTransport;\n}): TerminalSessionTransportRuntimeEntry {\n const attachmentController = createTerminalAttachmentController({\n clientId: createTerminalTransportClientId(),\n sessionId: input.sessionId,\n transport: input.transport\n });\n\n const entry: TerminalSessionTransportRuntimeEntry = {\n attach(afterSeq) {\n return attachmentController.attach(afterSeq);\n },\n dataBuffer: [],\n dataListeners: new Set(),\n detachGraceMs: input.detachGraceMs ?? defaultDetachGraceMs,\n detachTimer: null,\n exitBuffer: [],\n exitListeners: new Set(),\n metadataBuffer: [],\n metadataListeners: new Set(),\n refCount: 0,\n release() {\n entry.refCount = Math.max(0, entry.refCount - 1);\n if (entry.refCount > 0 || entry.detachTimer !== null) {\n return;\n }\n entry.detachTimer = setTimeout(() => {\n entry.detachTimer = null;\n if (entry.refCount > 0) {\n return;\n }\n void attachmentController.detach().finally(() => {\n entry.teardown();\n runtimeRegistry.delete(entry.sessionId);\n });\n }, entry.detachGraceMs);\n },\n sessionId: input.sessionId,\n snapshot() {\n if (entry.snapshotPromise) {\n return entry.snapshotPromise;\n }\n if (entry.snapshotCache) {\n return Promise.resolve(entry.snapshotCache);\n }\n entry.snapshotPromise = input.transport\n .snapshot({ sessionId: input.sessionId })\n .then((snapshot) => {\n entry.snapshotCache = snapshot;\n return snapshot;\n })\n .finally(() => {\n entry.snapshotPromise = null;\n });\n return entry.snapshotPromise;\n },\n snapshotCache: null,\n snapshotPromise: null,\n stateBuffer: [],\n stateListeners: new Set(),\n teardown() {\n disposeData();\n disposeState();\n disposeExit();\n disposeMetadata?.();\n entry.dataBuffer.length = 0;\n entry.exitBuffer.length = 0;\n entry.metadataBuffer.length = 0;\n entry.stateBuffer.length = 0;\n entry.snapshotCache = null;\n entry.snapshotPromise = null;\n }\n };\n\n const disposeData = input.transport.onData((event) => {\n if (event.sessionId !== input.sessionId) {\n return;\n }\n entry.snapshotCache = null;\n dispatchOrBuffer(entry.dataListeners, entry.dataBuffer, event);\n });\n const disposeState = input.transport.onState((event) => {\n if (event.sessionId !== input.sessionId) {\n return;\n }\n if (event.status === \"detached\" || event.status === \"exited\") {\n attachmentController.markDetached();\n }\n if (\n typeof event.gapStartSeq === \"number\" ||\n typeof event.gapEndSeq === \"number\"\n ) {\n entry.snapshotCache = null;\n }\n dispatchOrBuffer(entry.stateListeners, entry.stateBuffer, event);\n });\n const disposeExit = input.transport.onExit((event) => {\n if (event.sessionId !== input.sessionId) {\n return;\n }\n dispatchOrBuffer(entry.exitListeners, entry.exitBuffer, event);\n });\n const disposeMetadata = input.transport.onMetadata?.((event) => {\n if (event.sessionId !== input.sessionId) {\n return;\n }\n dispatchOrBuffer(entry.metadataListeners, entry.metadataBuffer, event);\n });\n\n return entry;\n}\n\nfunction createTerminalTransportClientId(): string {\n runtimeClientSequence += 1;\n return `terminal-runtime-${runtimeClientSequence}`;\n}\n\nfunction dispatchOrBuffer<TEvent>(\n listeners: Set<(event: TEvent) => void>,\n buffer: TEvent[],\n event: TEvent\n) {\n if (listeners.size === 0) {\n buffer.push(event);\n return;\n }\n for (const listener of listeners) {\n listener(event);\n }\n}\n\nfunction flushBufferedEvents<TEvent>(\n buffer: TEvent[],\n listener: (event: TEvent) => void\n) {\n if (buffer.length === 0) {\n return;\n }\n const pending = buffer.splice(0);\n for (const event of pending) {\n listener(event);\n }\n}\n","import type {\n TerminalNodeLimits,\n TerminalWriteEncoding\n} from \"../contracts/index.ts\";\nimport type { TerminalNodeFeature } from \"./feature.ts\";\nimport {\n createBufferedTerminalInputQueue,\n type BufferedTerminalInputQueue\n} from \"./inputQueue.ts\";\nimport {\n createTerminalSessionRecovery,\n type TerminalSessionRecoveryHandle\n} from \"./sessionControllerRecovery.ts\";\nimport { createTerminalSessionRecoveryDiagnostics } from \"./sessionDiagnostics.ts\";\nimport {\n createTerminalSessionControllerStore,\n type TerminalSessionControllerState,\n type TerminalSessionControllerStore\n} from \"./sessionControllerStore.ts\";\nimport {\n acquireTerminalSessionTransportRuntime,\n type TerminalSessionTransportRuntime\n} from \"./sessionTransportRuntime.ts\";\n\nexport type { TerminalSessionControllerState } from \"./sessionControllerStore.ts\";\n\nexport interface TerminalSessionController {\n getState(): TerminalSessionControllerState;\n retain(): void;\n release(): void;\n resize(input: { cols: number; rows: number }): Promise<void>;\n subscribe(listener: () => void): () => void;\n write(data: string, encoding?: TerminalWriteEncoding): void;\n}\n\ninterface TerminalSessionControllerEntry {\n context: TerminalSessionControllerContext;\n disposed: boolean;\n inputQueue: BufferedTerminalInputQueue;\n recovery: TerminalSessionRecoveryHandle;\n refCount: number;\n release(): void;\n retainTimer: ReturnType<typeof setTimeout> | null;\n runtimeWriteReady: boolean;\n startPromise: Promise<void> | null;\n store: TerminalSessionControllerStore;\n teardown(): void;\n transportRuntime: TerminalSessionTransportRuntime;\n}\n\ninterface TerminalSessionControllerContext {\n feature: TerminalNodeFeature;\n nodeId: string;\n sessionId: string;\n}\n\nconst defaultControllerRetainMs = 5_000;\nconst controllerRegistry = new Map<string, TerminalSessionControllerEntry>();\n\nexport function acquireTerminalSessionController(input: {\n feature: TerminalNodeFeature;\n nodeId: string;\n retainMs?: number;\n sessionId: string;\n}): TerminalSessionController {\n const entry =\n controllerRegistry.get(input.sessionId) ??\n createTerminalSessionControllerEntry({\n feature: input.feature,\n nodeId: input.nodeId,\n retainMs: input.retainMs ?? defaultControllerRetainMs,\n sessionId: input.sessionId\n });\n if (!controllerRegistry.has(input.sessionId)) {\n controllerRegistry.set(input.sessionId, entry);\n }\n\n entry.context = {\n feature: input.feature,\n nodeId: input.nodeId,\n sessionId: input.sessionId\n };\n\n return {\n getState() {\n return entry.store.getState();\n },\n retain() {\n entry.refCount += 1;\n if (entry.retainTimer !== null) {\n clearTimeout(entry.retainTimer);\n entry.retainTimer = null;\n }\n ensureRecoveryStarted(entry);\n },\n release() {\n entry.release();\n },\n resize({ cols, rows }) {\n return entry.context.feature.transport.resize({\n cols,\n rows,\n sessionId: entry.context.sessionId\n });\n },\n subscribe(listener) {\n return entry.store.subscribe(listener);\n },\n write(data, encoding = \"utf8\") {\n if (!entry.runtimeWriteReady) {\n entry.inputQueue.enqueue(data, encoding);\n ensureRecoveryStarted(entry);\n return;\n }\n void writeTerminalInput(entry, data, encoding);\n }\n };\n}\n\nfunction createTerminalSessionControllerEntry(input: {\n feature: TerminalNodeFeature;\n nodeId: string;\n retainMs: number;\n sessionId: string;\n}) {\n const transportRuntime = acquireTerminalSessionTransportRuntime({\n sessionId: input.sessionId,\n transport: input.feature.transport\n });\n const inputQueue = createBufferedTerminalInputQueue();\n const store = createTerminalSessionControllerStore({\n maxScrollbackChars: resolveMaxScrollbackChars(input.feature.limits)\n });\n\n const entry = {\n context: {\n feature: input.feature,\n nodeId: input.nodeId,\n sessionId: input.sessionId\n },\n disposed: false,\n inputQueue,\n recovery: null as unknown as TerminalSessionRecoveryHandle,\n refCount: 0,\n release: () => undefined,\n retainTimer: null,\n runtimeWriteReady: false,\n startPromise: null,\n store,\n teardown: () => undefined,\n transportRuntime\n } as TerminalSessionControllerEntry;\n\n entry.release = () => {\n entry.refCount = Math.max(0, entry.refCount - 1);\n if (entry.refCount > 0 || entry.retainTimer !== null) {\n return;\n }\n entry.retainTimer = setTimeout(() => {\n entry.retainTimer = null;\n if (entry.refCount > 0) {\n return;\n }\n entry.teardown();\n controllerRegistry.delete(entry.context.sessionId);\n }, input.retainMs);\n };\n\n entry.teardown = () => {\n if (entry.disposed) {\n return;\n }\n entry.disposed = true;\n inputQueue.reset();\n entry.runtimeWriteReady = false;\n entry.recovery.dispose();\n transportRuntime.release();\n store.clearListeners();\n };\n\n entry.recovery = createTerminalSessionRecovery({\n diagnostics: createTerminalSessionRecoveryDiagnostics({\n diagnostics: input.feature.diagnostics,\n nodeId: input.nodeId,\n sessionId: input.sessionId\n }),\n inputQueue,\n onRecoverableDetach() {\n if (entry.disposed || entry.refCount === 0) {\n return;\n }\n ensureRecoveryStarted(entry);\n },\n onWriteReadyChange(ready) {\n if (entry.disposed) {\n return;\n }\n entry.runtimeWriteReady = ready;\n },\n replayGapMessage: input.feature.i18n.t(\"recovery.replayGap\"),\n sessionId: input.sessionId,\n snapshotTruncatedMessage: input.feature.i18n.t(\n \"recovery.snapshotTruncated\"\n ),\n store,\n transport: input.feature.transport,\n transportRuntime\n });\n\n return entry;\n}\n\nfunction ensureRecoveryStarted(entry: TerminalSessionControllerEntry) {\n if (\n entry.disposed ||\n entry.startPromise !== null ||\n entry.runtimeWriteReady\n ) {\n return;\n }\n entry.startPromise = entry.recovery.start().finally(() => {\n entry.startPromise = null;\n });\n}\n\nfunction resolveMaxScrollbackChars(limits: TerminalNodeLimits) {\n return Math.max(limits.maxScrollbackLines * 160, 400_000);\n}\n\nfunction writeTerminalInput(\n entry: TerminalSessionControllerEntry,\n data: string,\n encoding: TerminalWriteEncoding\n) {\n return entry.context.feature.transport\n .write({\n data,\n encoding,\n provenance: \"user\",\n sessionId: entry.context.sessionId\n })\n .catch((error: unknown) => {\n entry.runtimeWriteReady = false;\n entry.store.setInputReady(false);\n entry.inputQueue.enqueue(data, encoding);\n ensureRecoveryStarted(entry);\n entry.context.feature.diagnostics.log(\"write-error\", {\n nodeId: entry.context.nodeId,\n sessionId: entry.context.sessionId\n });\n entry.store.setSurfaceError(errorMessage(error));\n });\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Badge, StatusDot } from \"@tutti-os/ui-system\";\nimport type {\n TerminalCloseGuardResult,\n TerminalHeaderAccessoryRenderer,\n TerminalNodeExternalState,\n TerminalPreviewChangeHandler,\n TerminalSessionStatus\n} from \"../contracts/index.ts\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport { createTerminalCloseDiagnostics } from \"../core/sessionDiagnostics.ts\";\nimport { isTerminalSessionEndedStatus } from \"../core/index.ts\";\nimport { hasTerminalHeaderDefaultActions } from \"./headerActions.ts\";\nimport { TerminalSurface } from \"./TerminalSurface.tsx\";\n\nexport interface TerminalNodeProps {\n children?: ReactNode;\n controllerLeaseRetainedExternally?: boolean;\n externalState?: TerminalNodeExternalState | null;\n feature: TerminalNodeFeature;\n headerAccessory?: TerminalHeaderAccessoryRenderer;\n nodeId: string;\n onFocusRequest?: () => void;\n onPreviewChange?: TerminalPreviewChangeHandler;\n sessionId?: string | null;\n showHeader?: boolean;\n}\n\nexport interface TerminalNodeHeaderProps extends HTMLAttributes<HTMLElement> {\n className?: string;\n defaultActions?: ReactNode;\n externalState?: TerminalNodeExternalState | null;\n feature: TerminalNodeFeature;\n headerAccessory?: TerminalHeaderAccessoryRenderer;\n onCloseRequest?: () => void;\n sessionId?: string | null;\n}\n\nexport interface TerminalCloseGuardDialogProps {\n feature: TerminalNodeFeature;\n leaderCommand?: string | null;\n onCancel: () => void;\n onConfirm: () => void;\n open: boolean;\n}\n\nexport function TerminalNode({\n children,\n controllerLeaseRetainedExternally = false,\n externalState = null,\n feature,\n headerAccessory,\n nodeId,\n onFocusRequest,\n onPreviewChange,\n sessionId,\n showHeader = true\n}: TerminalNodeProps) {\n const resolvedSessionId = sessionId ?? externalState?.sessionId ?? null;\n const status = externalState?.status ?? \"created\";\n\n return (\n <section\n className=\"workspace-terminal\"\n data-terminal-node={nodeId}\n data-terminal-session-id={resolvedSessionId ?? undefined}\n onClick={onFocusRequest}\n >\n {showHeader ? (\n <TerminalNodeHeader\n externalState={externalState}\n feature={feature}\n headerAccessory={headerAccessory}\n sessionId={resolvedSessionId}\n />\n ) : null}\n <div className=\"workspace-terminal__body\">\n {children ??\n (resolvedSessionId ? (\n <TerminalSurface\n controllerLeaseRetainedExternally={\n controllerLeaseRetainedExternally\n }\n externalState={externalState}\n feature={feature}\n nodeId={nodeId}\n onPreviewChange={onPreviewChange}\n sessionId={resolvedSessionId}\n status={status}\n />\n ) : (\n <div className=\"workspace-terminal__placeholder\">\n {feature.i18n.t(\"emptySession\")}\n </div>\n ))}\n </div>\n </section>\n );\n}\n\nexport function TerminalNodeHeader({\n className,\n defaultActions,\n externalState = null,\n feature,\n headerAccessory,\n onCloseRequest,\n sessionId,\n ...headerProps\n}: TerminalNodeHeaderProps) {\n const status = externalState?.status ?? \"created\";\n const statusLabel = resolveTerminalStatusLabel(feature, status);\n const resolvedSessionId = sessionId ?? externalState?.sessionId ?? null;\n const hasDefaultActions = hasTerminalHeaderDefaultActions(defaultActions);\n const [pendingCloseGuard, setPendingCloseGuard] =\n useState<TerminalCloseGuardResult | null>(null);\n const [closeError, setCloseError] = useState<string | null>(null);\n const closeDiagnostics = resolvedSessionId\n ? createTerminalCloseDiagnostics({\n diagnostics: feature.diagnostics,\n sessionId: resolvedSessionId\n })\n : null;\n\n const closeTerminal = async (skipConfirmation: boolean) => {\n if (\n !resolvedSessionId ||\n isTerminalSessionEndedStatus(externalState?.status ?? \"created\")\n ) {\n onCloseRequest?.();\n return;\n }\n\n setCloseError(null);\n try {\n if (!skipConfirmation) {\n closeDiagnostics?.requested();\n const guard = await feature.closeGuard.check({\n sessionId: resolvedSessionId\n });\n if (guard.requiresConfirmation) {\n setPendingCloseGuard(guard);\n return;\n }\n }\n\n await feature.launchService.terminate({ sessionId: resolvedSessionId });\n closeDiagnostics?.confirmed();\n setPendingCloseGuard(null);\n onCloseRequest?.();\n } catch (error) {\n setCloseError(errorMessage(error));\n }\n };\n\n return (\n <header\n {...headerProps}\n className={joinClassName(\"workspace-terminal__header\", className)}\n >\n <div className=\"workspace-terminal__header-main\">\n <span className=\"workspace-terminal__title\">\n {externalState?.title?.trim() || feature.i18n.t(\"title\")}\n </span>\n <Badge className=\"workspace-terminal__status-tag\" variant=\"default\">\n <StatusDot\n pulse={status === \"running\" || status === \"starting\"}\n size=\"xs\"\n tone={resolveTerminalStatusTone(status)}\n />\n {statusLabel}\n </Badge>\n </div>\n {headerAccessory?.({\n externalState,\n sessionId: resolvedSessionId\n })}\n <div\n className=\"workspace-terminal__actions\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {defaultActions}\n {onCloseRequest && !hasDefaultActions ? (\n <button\n aria-label={feature.i18n.t(\"actions.close\")}\n className=\"workspace-terminal__icon-button\"\n onClick={() => {\n void closeTerminal(false);\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n type=\"button\"\n >\n x\n </button>\n ) : null}\n </div>\n <TerminalCloseGuardDialog\n feature={feature}\n leaderCommand={pendingCloseGuard?.leaderCommand}\n onCancel={() => setPendingCloseGuard(null)}\n onConfirm={() => {\n void closeTerminal(true);\n }}\n open={Boolean(pendingCloseGuard)}\n />\n {closeError ? (\n <div className=\"workspace-terminal__close-error\" role=\"status\">\n {closeError}\n </div>\n ) : null}\n </header>\n );\n}\n\nexport function TerminalCloseGuardDialog({\n feature,\n leaderCommand,\n onCancel,\n onConfirm,\n open\n}: TerminalCloseGuardDialogProps) {\n if (!open) {\n return null;\n }\n\n return (\n <div className=\"workspace-terminal__close-guard\" role=\"alertdialog\">\n <h2>{feature.i18n.t(\"closeGuard.title\")}</h2>\n <p>{feature.i18n.t(\"closeGuard.description\")}</p>\n {leaderCommand ? <code>{leaderCommand}</code> : null}\n <div className=\"workspace-terminal__close-guard-actions\">\n <button onClick={() => onCancel()} type=\"button\">\n {feature.i18n.t(\"closeGuard.cancel\")}\n </button>\n <button onClick={() => onConfirm()} type=\"button\">\n {feature.i18n.t(\"closeGuard.confirm\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction resolveTerminalStatusLabel(\n feature: TerminalNodeFeature,\n status: TerminalSessionStatus\n): string {\n return feature.i18n.t(`status.${status}`);\n}\n\nfunction resolveTerminalStatusTone(\n status: TerminalSessionStatus\n): \"amber\" | \"blue\" | \"green\" | \"neutral\" | \"red\" {\n switch (status) {\n case \"running\":\n case \"starting\":\n return \"blue\";\n case \"exited\":\n return \"green\";\n case \"failed\":\n return \"red\";\n case \"detached\":\n return \"amber\";\n case \"created\":\n return \"neutral\";\n }\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction joinClassName(...values: Array<string | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n","import type { ReactNode } from \"react\";\n\nexport function hasTerminalHeaderDefaultActions(\n defaultActions: ReactNode\n): boolean {\n return defaultActions !== undefined && defaultActions !== null;\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n TerminalNodeExternalState,\n TerminalPreviewChangeHandler,\n TerminalSessionStatus\n} from \"../contracts/index.ts\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport { createTerminalSurfaceDiagnostics } from \"../core/sessionDiagnostics.ts\";\nimport { createTerminalSurfaceRuntime } from \"./terminalSurfaceRuntime.ts\";\nimport { isTerminalFindShortcut } from \"./terminalFindShortcut.ts\";\nimport { useTerminalFindController } from \"./useTerminalFindController.ts\";\nimport { useTerminalSessionController } from \"./useTerminalSessionController.ts\";\n\nexport interface TerminalSurfaceProps {\n controllerLeaseRetainedExternally?: boolean;\n externalState: TerminalNodeExternalState | null;\n feature: TerminalNodeFeature;\n nodeId: string;\n onPreviewChange?: TerminalPreviewChangeHandler;\n sessionId: string;\n status: TerminalSessionStatus;\n}\n\nexport function TerminalSurface({\n controllerLeaseRetainedExternally = false,\n externalState,\n feature,\n nodeId,\n onPreviewChange,\n sessionId,\n status\n}: TerminalSurfaceProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const currentCwdRef = useRef<string | null>(externalState?.cwd ?? null);\n const featureRef = useRef(feature);\n const findInputRef = useRef<HTMLInputElement | null>(null);\n const runtimeRef = useRef<ReturnType<\n typeof createTerminalSurfaceRuntime\n > | null>(null);\n const [interactionError, setInteractionError] = useState<string | null>(null);\n const { controller, state } = useTerminalSessionController({\n feature,\n nodeId,\n retainLease: !controllerLeaseRetainedExternally,\n sessionId\n });\n const find = useTerminalFindController({\n getRuntime: () => runtimeRef.current\n });\n const theme = useMemo(\n () =>\n feature.resolveTheme({\n runtimeKind: externalState?.runtimeKind ?? \"local\",\n sessionId,\n status\n }),\n [externalState?.runtimeKind, feature, sessionId, status]\n );\n const surfaceDiagnostics = useMemo(\n () =>\n createTerminalSurfaceDiagnostics({\n diagnostics: feature.diagnostics,\n nodeId,\n sessionId\n }),\n [feature.diagnostics, nodeId, sessionId]\n );\n const surfaceError = interactionError ?? state.surfaceError;\n\n useEffect(() => {\n currentCwdRef.current = externalState?.cwd ?? null;\n }, [externalState?.cwd]);\n\n useEffect(() => {\n featureRef.current = feature;\n }, [feature]);\n\n useEffect(() => {\n if (!find.state.open) {\n return;\n }\n const input = findInputRef.current;\n if (!input) {\n return;\n }\n input.focus();\n input.select();\n }, [find.state.open]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n surfaceDiagnostics.mount();\n setInteractionError(null);\n\n const runtime = createTerminalSurfaceRuntime({\n container,\n diagnostics: surfaceDiagnostics,\n feature: featureRef.current,\n getCwd: () => currentCwdRef.current,\n nodeId,\n onResize: ({ cols, rows }) => {\n surfaceDiagnostics.resize({ cols, rows });\n void controller.resize({ cols, rows });\n },\n onPreviewChange,\n onUserInput: (data, encoding) => {\n controller.write(data, encoding);\n },\n sessionId,\n theme\n });\n runtimeRef.current = runtime;\n runtime.syncOutput(state.rawOutput, state.contentEpoch);\n runtime.focus();\n\n return () => {\n surfaceDiagnostics.dispose();\n runtime.dispose();\n if (runtimeRef.current === runtime) {\n runtimeRef.current = null;\n }\n };\n }, [controller, nodeId, sessionId, surfaceDiagnostics]);\n\n useEffect(() => {\n runtimeRef.current?.setTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n runtimeRef.current?.syncOutput(state.rawOutput, state.contentEpoch);\n }, [state.contentEpoch, state.rawOutput]);\n\n const writeInput = (data: string) => {\n controller.write(data);\n };\n\n return (\n <div\n className=\"workspace-terminal__surface-shell\"\n onKeyDownCapture={(event) => {\n if (!isTerminalFindShortcut(event)) {\n if (event.key === \"Escape\" && find.state.open) {\n find.actions.close();\n runtimeRef.current?.focus();\n }\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n find.actions.open();\n }}\n onDragOver={(event) => {\n if (feature.dropInput) {\n event.preventDefault();\n }\n }}\n onDrop={(event) => {\n if (!feature.dropInput) {\n return;\n }\n event.preventDefault();\n void Promise.resolve(\n feature.dropInput({\n cwd: externalState?.cwd ?? null,\n dataTransfer: event.dataTransfer,\n sessionId\n })\n )\n .then((input) => {\n if (input) {\n writeInput(input);\n }\n })\n .catch((error: unknown) => setInteractionError(errorMessage(error)));\n }}\n >\n {find.state.open ? (\n <form\n className=\"workspace-terminal__find\"\n onSubmit={(event) => {\n event.preventDefault();\n find.actions.onSubmit();\n }}\n >\n <input\n aria-label={feature.i18n.t(\"findPlaceholder\")}\n ref={findInputRef}\n onChange={(event) => {\n find.actions.onQueryChange(event.currentTarget.value);\n }}\n placeholder={feature.i18n.t(\"findPlaceholder\")}\n type=\"search\"\n value={find.state.query}\n />\n <button\n className=\"workspace-terminal__find-toggle\"\n aria-label={feature.i18n.t(\"actions.caseSensitive\")}\n aria-pressed={find.state.caseSensitive}\n onClick={() => find.actions.toggleCaseSensitive()}\n type=\"button\"\n >\n Aa\n </button>\n <button\n className=\"workspace-terminal__find-toggle\"\n aria-label={feature.i18n.t(\"actions.regex\")}\n aria-pressed={find.state.regex}\n onClick={() => find.actions.toggleRegex()}\n type=\"button\"\n >\n .*\n </button>\n <button\n className=\"workspace-terminal__find-nav workspace-terminal__find-nav--previous\"\n aria-label={feature.i18n.t(\"actions.previous\")}\n onClick={() => find.actions.findPrevious()}\n type=\"button\"\n />\n <button\n className=\"workspace-terminal__find-nav workspace-terminal__find-nav--next\"\n aria-label={feature.i18n.t(\"actions.next\")}\n onClick={() => find.actions.findNext()}\n type=\"submit\"\n />\n </form>\n ) : null}\n <div\n className=\"workspace-terminal__xterm\"\n data-terminal-xterm=\"\"\n ref={containerRef}\n />\n {surfaceError ? (\n <div className=\"workspace-terminal__surface-error\" role=\"status\">\n {surfaceError}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { FitAddon } from \"@xterm/addon-fit\";\nimport { SearchAddon } from \"@xterm/addon-search\";\nimport { SerializeAddon } from \"@xterm/addon-serialize\";\nimport { WebLinksAddon } from \"@xterm/addon-web-links\";\nimport { Terminal, type IBufferCell, type IBufferLine } from \"@xterm/xterm\";\nimport type {\n TerminalPreviewChangeHandler,\n TerminalPreviewLine,\n TerminalPreviewSegment,\n TerminalPreviewSegmentStyle,\n TerminalPreviewSnapshot,\n TerminalTheme,\n TerminalWriteEncoding\n} from \"../contracts/index.ts\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport { createTerminalScreenStateCache } from \"../core/index.ts\";\nimport type { TerminalSurfaceDiagnostics } from \"../core/sessionDiagnostics.ts\";\nimport { createTerminalFileLinkProvider } from \"./terminalFileLinkProvider.ts\";\nimport { resolveTerminalSurfaceOutputPlan } from \"./terminalSurfaceOutputPlan.ts\";\nimport { resolveTerminalSurfaceResizePlan } from \"./terminalSurfaceResizePlan.ts\";\nimport { resolveTerminalSurfaceScreenCachePlan } from \"./terminalSurfaceScreenCachePlan.ts\";\nimport { drainTerminalWriteBatch } from \"./terminalWriteBatch.ts\";\nimport type { TerminalFindRuntime } from \"./useTerminalFindController.ts\";\n\nconst terminalScreenStateCache = createTerminalScreenStateCache();\nconst terminalPreviewMaxRows = 24;\nconst terminalPreviewMaxCols = 160;\nconst terminalPreviewAnsiColors = [\n \"#2e3436\",\n \"#cc0000\",\n \"#4e9a06\",\n \"#c4a000\",\n \"#3465a4\",\n \"#75507b\",\n \"#06989a\",\n \"#d3d7cf\",\n \"#555753\",\n \"#ef2929\",\n \"#8ae234\",\n \"#fce94f\",\n \"#729fcf\",\n \"#ad7fa8\",\n \"#34e2e2\",\n \"#eeeeec\"\n] as const;\nconst terminalPreviewColorSteps = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n\nexport interface TerminalSurfaceRuntime extends TerminalFindRuntime {\n dispose(): void;\n focus(): void;\n setTheme(theme: TerminalTheme): void;\n syncOutput(rawOutput: string, contentEpoch: number): void;\n}\n\nexport function createTerminalSurfaceRuntime(input: {\n container: HTMLElement;\n diagnostics: TerminalSurfaceDiagnostics;\n feature: TerminalNodeFeature;\n getCwd: () => string | null;\n nodeId: string;\n onResize: (size: { cols: number; rows: number }) => void;\n onPreviewChange?: TerminalPreviewChangeHandler;\n onUserInput: (data: string, encoding?: TerminalWriteEncoding) => void;\n sessionId: string;\n theme: TerminalTheme;\n}): TerminalSurfaceRuntime {\n let contentEpoch = 0;\n let committedRawOutput = \"\";\n let initialLayoutFrame: number | null = null;\n let initialLayoutTimeout: number | null = null;\n let lastSize: { cols: number; rows: number } | null = null;\n let pendingRevealFinalizeFrame: number | null = null;\n let pendingRevealStartFrame: number | null = null;\n let pendingRevealWrite: {\n bytes: number;\n mode: \"cache\" | \"replace\";\n remainingChunkCount: number;\n } | null = null;\n let pendingWriteFrame: number | null = null;\n let pendingWriteChunks: string[] = [];\n let pendingRenderedWrite: {\n bytes: number;\n mode: \"append\" | \"cache\" | \"replace\";\n remainingChunkCount: number;\n } | null = null;\n let lastPreviewRevision: string | null = null;\n\n const terminal = new Terminal({\n allowProposedApi: false,\n convertEol: true,\n cursorBlink: true,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n fontSize: 13,\n scrollback: input.feature.limits.maxScrollbackLines,\n theme: resolveXtermTheme(input.theme)\n });\n const fitAddon = new FitAddon();\n const searchAddon = new SearchAddon();\n const serializeAddon = new SerializeAddon();\n const webLinksAddon = new WebLinksAddon((_event, uri) => {\n void input.feature.linkHandler?.open({ url: uri });\n });\n terminal.loadAddon(fitAddon);\n terminal.loadAddon(searchAddon);\n terminal.loadAddon(serializeAddon);\n terminal.loadAddon(webLinksAddon);\n const fileLinkDisposable = terminal.registerLinkProvider(\n createTerminalFileLinkProvider({\n feature: input.feature,\n getCwd: input.getCwd,\n terminal\n })\n );\n terminal.open(input.container);\n\n const dataSubscription = terminal.onData((data) => {\n input.onUserInput(data);\n });\n const binarySubscription = terminal.onBinary((data) => {\n input.onUserInput(data, \"binary\");\n });\n const writeParsedSubscription =\n typeof terminal.onWriteParsed === \"function\"\n ? terminal.onWriteParsed(() => {\n if (!pendingRenderedWrite) {\n refreshTerminalSurface();\n return;\n }\n const renderedWrite = pendingRenderedWrite;\n pendingRenderedWrite = null;\n if (\n renderedWrite.mode === \"cache\" ||\n renderedWrite.mode === \"replace\"\n ) {\n scheduleHydratedReveal({\n bytes: renderedWrite.bytes,\n mode: renderedWrite.mode,\n remainingChunkCount: renderedWrite.remainingChunkCount\n });\n return;\n }\n refreshTerminalSurface();\n logSurfaceWrite(\n renderedWrite.mode,\n renderedWrite.bytes,\n renderedWrite.remainingChunkCount\n );\n })\n : { dispose: () => undefined };\n\n const resizeTerminal = () => {\n try {\n fitAddon.fit();\n } catch {\n return;\n }\n const plan = resolveTerminalSurfaceResizePlan({\n lastSize,\n nextSize: { cols: terminal.cols, rows: terminal.rows }\n });\n if (!plan) {\n return;\n }\n lastSize = plan;\n input.onResize(plan);\n };\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(() => resizeTerminal());\n resizeObserver?.observe(input.container);\n scheduleInitialLayoutSync();\n\n const cached = terminalScreenStateCache.get(input.nodeId, input.sessionId);\n if (cached) {\n terminal.write(cached.serialized, () => {\n queueRenderedWrite(\"cache\", cached.serialized.length, 0);\n });\n committedRawOutput = cached.rawSnapshot;\n }\n\n return {\n dispose() {\n resizeObserver?.disconnect();\n dataSubscription.dispose();\n binarySubscription.dispose();\n writeParsedSubscription.dispose();\n fileLinkDisposable.dispose();\n clearInitialLayoutSync();\n clearPendingReveal();\n const hasPendingWrites =\n pendingWriteFrame !== null || pendingWriteChunks.length > 0;\n const cachePlan = resolveTerminalSurfaceScreenCachePlan({\n hasPendingWrites,\n rawSnapshot: committedRawOutput,\n serialized: hasPendingWrites ? \"\" : serializeAddon.serialize()\n });\n if (cachePlan.action === \"save\") {\n terminalScreenStateCache.set(input.nodeId, {\n cols: terminal.cols,\n rawSnapshot: cachePlan.rawSnapshot,\n rows: terminal.rows,\n serialized: cachePlan.serialized,\n sessionId: input.sessionId\n });\n } else if (cachePlan.action === \"remove\") {\n terminalScreenStateCache.remove(input.nodeId, input.sessionId);\n }\n clearPendingWrites();\n input.onPreviewChange?.({\n nodeId: input.nodeId,\n sessionId: input.sessionId,\n snapshot: null\n });\n terminal.dispose();\n },\n findNext(query, options) {\n searchAddon.findNext(query, options);\n },\n findPrevious(query, options) {\n searchAddon.findPrevious(query, options);\n },\n focus() {\n terminal.focus();\n resizeTerminal();\n },\n setTheme(theme) {\n terminal.options.theme = resolveXtermTheme(theme);\n emitTerminalPreviewSnapshot();\n },\n syncOutput(rawOutput, nextContentEpoch) {\n const plan = resolveTerminalSurfaceOutputPlan({\n committedRawOutput,\n contentEpoch,\n nextContentEpoch,\n rawOutput\n });\n input.diagnostics.outputSync({\n contentEpoch: nextContentEpoch,\n nextCommittedBytes:\n plan?.nextCommittedRawOutput.length ?? committedRawOutput.length,\n plan: resolveOutputSyncPlan(plan),\n previousCommittedBytes: committedRawOutput.length,\n rawBytes: rawOutput.length,\n writeBytes: plan?.write?.length ?? 0\n });\n if (!plan) {\n return;\n }\n contentEpoch = plan.nextContentEpoch;\n if (plan.reset && plan.write) {\n replaceTerminalView(plan.write, { reset: true });\n } else if (plan.reset) {\n resetTerminalView();\n }\n if (plan.write && !plan.reset) {\n writeToTerminal(plan.write);\n }\n committedRawOutput = plan.nextCommittedRawOutput;\n }\n };\n\n function clearPendingWrites() {\n pendingWriteChunks = [];\n if (pendingWriteFrame === null) {\n return;\n }\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(pendingWriteFrame);\n } else {\n clearTimeout(pendingWriteFrame);\n }\n pendingWriteFrame = null;\n }\n\n function clearInitialLayoutSync() {\n if (initialLayoutFrame !== null) {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(initialLayoutFrame);\n } else {\n clearTimeout(initialLayoutFrame);\n }\n initialLayoutFrame = null;\n }\n if (initialLayoutTimeout !== null) {\n clearTimeout(initialLayoutTimeout);\n initialLayoutTimeout = null;\n }\n }\n\n function clearPendingReveal() {\n if (pendingRevealStartFrame !== null) {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(pendingRevealStartFrame);\n } else {\n clearTimeout(pendingRevealStartFrame);\n }\n pendingRevealStartFrame = null;\n }\n if (pendingRevealFinalizeFrame !== null) {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(pendingRevealFinalizeFrame);\n } else {\n clearTimeout(pendingRevealFinalizeFrame);\n }\n pendingRevealFinalizeFrame = null;\n }\n pendingRevealWrite = null;\n }\n\n function flushPendingWrites() {\n pendingWriteFrame = null;\n const batch = drainTerminalWriteBatch(\n pendingWriteChunks,\n input.feature.limits.maxWriteBatchBytes\n );\n pendingWriteChunks = batch.remainingChunks;\n\n if (!batch.nextWrite) {\n return;\n }\n terminal.write(batch.nextWrite, () => {\n queueRenderedWrite(\n \"append\",\n batch.nextWrite.length,\n pendingWriteChunks.length\n );\n if (pendingWriteChunks.length > 0) {\n requestWriteFlush();\n }\n });\n }\n\n function requestWriteFlush() {\n if (pendingWriteFrame !== null) {\n return;\n }\n if (typeof requestAnimationFrame === \"function\") {\n pendingWriteFrame = requestAnimationFrame(flushPendingWrites);\n return;\n }\n pendingWriteFrame = window.setTimeout(flushPendingWrites, 0);\n }\n\n function resetTerminalView() {\n clearPendingReveal();\n clearPendingWrites();\n terminal.reset();\n refreshTerminalSurface();\n logSurfaceWrite(\"reset\", 0, 0);\n }\n\n function replaceTerminalView(\n data: string,\n options?: {\n reset?: boolean;\n }\n ) {\n const transformed =\n input.feature.outputTransform?.({\n data,\n sessionId: input.sessionId\n }) ?? data;\n if (transformed == null || transformed === \"\") {\n return;\n }\n clearPendingReveal();\n clearPendingWrites();\n if (options?.reset) {\n terminal.reset();\n }\n terminal.write(transformed, () => {\n queueRenderedWrite(\"replace\", transformed.length, 0);\n });\n }\n\n function refreshTerminalSurface() {\n if (terminal.rows <= 0) {\n return;\n }\n terminal.refresh(0, terminal.rows - 1);\n emitTerminalPreviewSnapshot();\n }\n\n function emitTerminalPreviewSnapshot() {\n if (!input.onPreviewChange || terminal.cols <= 0 || terminal.rows <= 0) {\n return;\n }\n const snapshot = createTerminalPreviewSnapshot(terminal);\n if (snapshot.revision === lastPreviewRevision) {\n return;\n }\n lastPreviewRevision = snapshot.revision;\n input.onPreviewChange({\n nodeId: input.nodeId,\n sessionId: input.sessionId,\n snapshot\n });\n }\n\n function scheduleInitialLayoutSync() {\n resizeTerminal();\n if (typeof requestAnimationFrame === \"function\") {\n initialLayoutFrame = requestAnimationFrame(() => {\n initialLayoutFrame = null;\n resizeTerminal();\n refreshTerminalSurface();\n });\n } else {\n initialLayoutFrame = window.setTimeout(() => {\n initialLayoutFrame = null;\n resizeTerminal();\n refreshTerminalSurface();\n }, 0);\n }\n initialLayoutTimeout = window.setTimeout(() => {\n initialLayoutTimeout = null;\n resizeTerminal();\n refreshTerminalSurface();\n }, 32);\n }\n\n function scheduleTerminalWrite(data: string) {\n pendingWriteChunks.push(data);\n requestWriteFlush();\n }\n\n function writeToTerminal(data: string) {\n const transformed =\n input.feature.outputTransform?.({\n data,\n sessionId: input.sessionId\n }) ?? data;\n if (transformed == null || transformed === \"\") {\n return;\n }\n scheduleTerminalWrite(transformed);\n }\n\n function queueRenderedWrite(\n mode: \"append\" | \"cache\" | \"replace\",\n bytes: number,\n remainingChunkCount: number\n ) {\n if (pendingRenderedWrite && pendingRenderedWrite.mode === mode) {\n pendingRenderedWrite = {\n bytes: pendingRenderedWrite.bytes + bytes,\n mode,\n remainingChunkCount\n };\n return;\n }\n pendingRenderedWrite = {\n bytes,\n mode,\n remainingChunkCount\n };\n }\n\n function scheduleHydratedReveal(write: {\n bytes: number;\n mode: \"cache\" | \"replace\";\n remainingChunkCount: number;\n }) {\n if (pendingRevealWrite) {\n pendingRevealWrite = {\n bytes: pendingRevealWrite.bytes + write.bytes,\n mode: write.mode,\n remainingChunkCount: write.remainingChunkCount\n };\n } else {\n pendingRevealWrite = write;\n }\n if (\n pendingRevealStartFrame !== null ||\n pendingRevealFinalizeFrame !== null\n ) {\n return;\n }\n pendingRevealStartFrame = requestTerminalFrame(() => {\n pendingRevealStartFrame = null;\n resizeTerminal();\n pendingRevealFinalizeFrame = requestTerminalFrame(() => {\n pendingRevealFinalizeFrame = null;\n refreshTerminalSurface();\n const revealWrite = pendingRevealWrite;\n pendingRevealWrite = null;\n if (!revealWrite) {\n return;\n }\n logSurfaceWrite(\n revealWrite.mode,\n revealWrite.bytes,\n revealWrite.remainingChunkCount\n );\n });\n });\n }\n\n function logSurfaceWrite(\n mode: \"append\" | \"cache\" | \"replace\" | \"reset\",\n bytes: number,\n remainingChunkCount: number\n ) {\n const buffer = terminal.buffer.active;\n const xtermElement =\n input.container.querySelector(\".xterm\") instanceof HTMLElement\n ? (input.container.querySelector(\".xterm\") as HTMLElement)\n : null;\n const screenElement =\n input.container.querySelector(\".xterm-screen\") instanceof HTMLElement\n ? (input.container.querySelector(\".xterm-screen\") as HTMLElement)\n : null;\n const helperElement =\n input.container.querySelector(\".xterm-helpers\") instanceof HTMLElement\n ? (input.container.querySelector(\".xterm-helpers\") as HTMLElement)\n : null;\n const rowContainerElement =\n input.container.querySelector(\".xterm-rows\") instanceof HTMLElement\n ? (input.container.querySelector(\".xterm-rows\") as HTMLElement)\n : null;\n const firstCanvas =\n screenElement?.querySelector(\"canvas\") instanceof HTMLCanvasElement\n ? (screenElement.querySelector(\"canvas\") as HTMLCanvasElement)\n : null;\n const firstLine = buffer.getLine(0)?.translateToString(true) ?? \"\";\n const cursorLine =\n buffer.getLine(buffer.cursorY)?.translateToString(true) ?? \"\";\n const xtermStyle = xtermElement\n ? window.getComputedStyle(xtermElement)\n : null;\n const screenStyle = screenElement\n ? window.getComputedStyle(screenElement)\n : null;\n const renderDimensions = resolveXtermRenderDimensions(terminal);\n input.diagnostics.outputWritten({\n bufferCursorX: buffer.cursorX,\n bufferCursorY: buffer.cursorY,\n bufferLength: buffer.length,\n bytes,\n canvasClientHeight: firstCanvas?.clientHeight ?? 0,\n canvasClientWidth: firstCanvas?.clientWidth ?? 0,\n canvasCount: screenElement?.querySelectorAll(\"canvas\").length ?? 0,\n cols: terminal.cols,\n containerClientHeight: input.container.clientHeight,\n containerClientWidth: input.container.clientWidth,\n cursorLinePreview: previewTerminalLine(cursorLine),\n firstLinePreview: previewTerminalLine(firstLine),\n helperChildCount: helperElement?.childElementCount ?? 0,\n mode,\n remainingChunkCount,\n renderDimensionsReady: renderDimensions !== undefined,\n rowContainerChildCount: rowContainerElement?.childElementCount ?? 0,\n rowContainerTextPreview: previewTerminalLine(\n rowContainerElement?.textContent ?? \"\"\n ),\n rows: terminal.rows,\n screenChildCount: screenElement?.childElementCount ?? 0,\n screenClientHeight: screenElement?.clientHeight ?? 0,\n screenClientWidth: screenElement?.clientWidth ?? 0,\n screenDisplay: screenStyle?.display ?? \"\",\n screenOpacity: screenStyle?.opacity ?? \"\",\n screenVisibility: screenStyle?.visibility ?? \"\",\n serializedBytes: serializeAddon.serialize().length,\n xtermClientHeight: xtermElement?.clientHeight ?? 0,\n xtermClientWidth: xtermElement?.clientWidth ?? 0,\n xtermDisplay: xtermStyle?.display ?? \"\",\n xtermOpacity: xtermStyle?.opacity ?? \"\",\n xtermVisibility: xtermStyle?.visibility ?? \"\"\n });\n }\n}\n\nfunction requestTerminalFrame(callback: () => void) {\n if (typeof requestAnimationFrame === \"function\") {\n return requestAnimationFrame(callback);\n }\n return window.setTimeout(callback, 0);\n}\n\nfunction resolveOutputSyncPlan(\n plan: ReturnType<typeof resolveTerminalSurfaceOutputPlan>\n): \"append\" | \"replace\" | \"reset\" | \"skip\" {\n if (!plan) {\n return \"skip\";\n }\n if (plan.reset && plan.write) {\n return \"replace\";\n }\n if (plan.reset) {\n return \"reset\";\n }\n return \"append\";\n}\n\nfunction resolveXtermRenderDimensions(terminal: Terminal): unknown {\n const core: unknown = Reflect.get(terminal, \"_core\");\n if (core == null || typeof core !== \"object\") {\n return undefined;\n }\n const renderService: unknown = Reflect.get(core, \"_renderService\");\n if (renderService == null || typeof renderService !== \"object\") {\n return undefined;\n }\n return Reflect.get(renderService, \"dimensions\");\n}\n\nfunction previewTerminalLine(value: string, maxChars = 80) {\n return value\n .slice(0, maxChars)\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"\\r\", \"\\\\r\")\n .replaceAll(\"\\n\", \"\\\\n\");\n}\n\nfunction resolveXtermTheme(theme: TerminalTheme) {\n return {\n background: theme.background,\n cursor: theme.cursor,\n foreground: theme.foreground,\n selectionBackground: theme.selectionBackground\n };\n}\n\nfunction createTerminalPreviewSnapshot(\n terminal: Terminal\n): TerminalPreviewSnapshot {\n const buffer = terminal.buffer.active;\n const rowCount = Math.min(terminal.rows, terminalPreviewMaxRows);\n const colCount = Math.min(terminal.cols, terminalPreviewMaxCols);\n const viewportY = Math.max(0, buffer.viewportY);\n const theme = terminal.options.theme as TerminalTheme;\n const lines: TerminalPreviewLine[] = [];\n const scratchCell = buffer.getNullCell();\n\n for (let index = 0; index < rowCount; index += 1) {\n lines.push(\n createTerminalPreviewLine({\n colCount,\n line: buffer.getLine(viewportY + index) ?? null,\n scratchCell,\n theme\n })\n );\n }\n\n const revision = [\n terminal.cols,\n terminal.rows,\n buffer.cursorX,\n buffer.cursorY,\n viewportY,\n JSON.stringify(lines)\n ].join(\"\\n\");\n\n return {\n cols: terminal.cols,\n cursorX: buffer.cursorX,\n cursorY: buffer.cursorY,\n lines,\n revision,\n rows: terminal.rows,\n updatedAtUnixMs: Date.now()\n };\n}\n\nfunction createTerminalPreviewLine(input: {\n colCount: number;\n line: IBufferLine | null;\n scratchCell: IBufferCell;\n theme: TerminalTheme;\n}): TerminalPreviewLine {\n const line = input.line;\n if (!line || input.colCount <= 0) {\n return { segments: [] };\n }\n\n const segments: TerminalPreviewSegment[] = [];\n let currentStyle: TerminalPreviewSegmentStyle | undefined;\n let currentText = \"\";\n const lastColumn = resolveTerminalPreviewLastColumn({\n colCount: input.colCount,\n line,\n scratchCell: input.scratchCell,\n theme: input.theme\n });\n\n for (let column = 0; column < lastColumn; column += 1) {\n const cell = line.getCell(column, input.scratchCell);\n if (!cell) {\n continue;\n }\n const width = cell.getWidth();\n if (width === 0) {\n continue;\n }\n const style = resolveTerminalPreviewCellStyle(cell, input.theme);\n const text = cell.isInvisible()\n ? \" \".repeat(Math.max(1, width))\n : cell.getChars() || \" \".repeat(Math.max(1, width));\n\n if (currentText && areTerminalPreviewStylesEqual(currentStyle, style)) {\n currentText += text;\n continue;\n }\n if (currentText) {\n segments.push(createTerminalPreviewSegment(currentText, currentStyle));\n }\n currentStyle = style;\n currentText = text;\n }\n\n if (currentText) {\n segments.push(createTerminalPreviewSegment(currentText, currentStyle));\n }\n\n return { segments };\n}\n\nfunction createTerminalPreviewSegment(\n text: string,\n style: TerminalPreviewSegmentStyle | undefined\n): TerminalPreviewSegment {\n if (!style) {\n return { text };\n }\n return { style, text };\n}\n\nfunction resolveTerminalPreviewLastColumn(input: {\n colCount: number;\n line: IBufferLine;\n scratchCell: IBufferCell;\n theme: TerminalTheme;\n}) {\n for (let column = input.colCount - 1; column >= 0; column -= 1) {\n const cell = input.line.getCell(column, input.scratchCell);\n if (!cell || cell.getWidth() === 0) {\n continue;\n }\n if (!isTerminalPreviewCellEmptyDefault(cell, input.theme)) {\n return column + 1;\n }\n }\n return 0;\n}\n\nfunction isTerminalPreviewCellEmptyDefault(\n cell: IBufferCell,\n theme: TerminalTheme\n) {\n const style = resolveTerminalPreviewCellStyle(cell, theme);\n return (cell.getChars() || \" \") === \" \" && !style;\n}\n\nfunction resolveTerminalPreviewCellStyle(\n cell: IBufferCell,\n theme: TerminalTheme\n): TerminalPreviewSegmentStyle | undefined {\n const style: TerminalPreviewSegmentStyle = {};\n const inverse = Boolean(cell.isInverse());\n const foreground = resolveTerminalPreviewColor(cell, \"foreground\", theme);\n const background = resolveTerminalPreviewColor(cell, \"background\", theme);\n const color = inverse ? (background ?? theme.background) : foreground;\n const backgroundColor = inverse\n ? (foreground ?? theme.foreground)\n : background;\n\n if (color) {\n style.color = color;\n }\n if (backgroundColor) {\n style.background = backgroundColor;\n }\n if (cell.isBold()) {\n style.bold = true;\n }\n if (cell.isDim()) {\n style.dim = true;\n }\n if (cell.isItalic()) {\n style.italic = true;\n }\n if (cell.isUnderline()) {\n style.underline = true;\n }\n if (cell.isStrikethrough()) {\n style.strikethrough = true;\n }\n if (cell.isOverline()) {\n style.overline = true;\n }\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction resolveTerminalPreviewColor(\n cell: IBufferCell,\n channel: \"background\" | \"foreground\",\n theme: TerminalTheme\n) {\n const isDefault =\n channel === \"foreground\" ? cell.isFgDefault() : cell.isBgDefault();\n if (isDefault) {\n return undefined;\n }\n const isRgb = channel === \"foreground\" ? cell.isFgRGB() : cell.isBgRGB();\n const isPalette =\n channel === \"foreground\" ? cell.isFgPalette() : cell.isBgPalette();\n const rawColor =\n channel === \"foreground\" ? cell.getFgColor() : cell.getBgColor();\n\n if (isRgb) {\n return terminalPreviewColorToHex(rawColor);\n }\n if (!isPalette) {\n return undefined;\n }\n\n const paletteIndex =\n channel === \"foreground\" && cell.isBold() && rawColor >= 0 && rawColor <= 7\n ? rawColor + 8\n : rawColor;\n const paletteColor = resolveTerminalPreviewPaletteColor(paletteIndex);\n if (paletteColor) {\n return paletteColor;\n }\n return channel === \"foreground\" ? theme.foreground : theme.background;\n}\n\nfunction resolveTerminalPreviewPaletteColor(index: number) {\n if (index >= 0 && index < terminalPreviewAnsiColors.length) {\n return terminalPreviewAnsiColors[index];\n }\n if (index >= 16 && index <= 231) {\n const offset = index - 16;\n const red = terminalPreviewColorSteps[Math.floor(offset / 36) % 6] ?? 0;\n const green = terminalPreviewColorSteps[Math.floor(offset / 6) % 6] ?? 0;\n const blue = terminalPreviewColorSteps[offset % 6] ?? 0;\n return terminalPreviewRgbToHex(red, green, blue);\n }\n if (index >= 232 && index <= 255) {\n const value = 8 + (index - 232) * 10;\n return terminalPreviewRgbToHex(value, value, value);\n }\n return undefined;\n}\n\nfunction terminalPreviewColorToHex(color: number) {\n return `#${color.toString(16).padStart(6, \"0\").slice(-6)}`;\n}\n\nfunction terminalPreviewRgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => value.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction areTerminalPreviewStylesEqual(\n left: TerminalPreviewSegmentStyle | undefined,\n right: TerminalPreviewSegmentStyle | undefined\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.background === right.background &&\n left.bold === right.bold &&\n left.color === right.color &&\n left.dim === right.dim &&\n left.italic === right.italic &&\n left.overline === right.overline &&\n left.strikethrough === right.strikethrough &&\n left.underline === right.underline\n );\n}\n","import type { ILink, ILinkProvider, Terminal } from \"@xterm/xterm\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport {\n detectTerminalFileLinks,\n toTerminalLinkTarget\n} from \"../core/index.ts\";\n\nexport function createTerminalFileLinkProvider(input: {\n feature: TerminalNodeFeature;\n getCwd: () => string | null;\n terminal: Terminal;\n}): ILinkProvider {\n return {\n provideLinks(bufferLineNumber, callback) {\n if (!input.feature.linkHandler) {\n callback(undefined);\n return;\n }\n\n const line = input.terminal.buffer.active.getLine(bufferLineNumber - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const text = line.translateToString(true);\n const links = detectTerminalFileLinks(text).map<ILink>((link) => ({\n activate: () => {\n void input.feature.linkHandler?.open({\n ...toTerminalLinkTarget(link),\n cwd: input.getCwd()\n });\n },\n range: {\n end: {\n x: link.index + link.text.length,\n y: bufferLineNumber\n },\n start: {\n x: link.index + 1,\n y: bufferLineNumber\n }\n },\n text: link.text\n }));\n\n callback(links.length > 0 ? links : undefined);\n }\n };\n}\n","import { resolveTerminalScrollbackDelta } from \"../core/index.ts\";\n\nexport interface TerminalSurfaceOutputPlanInput {\n committedRawOutput: string;\n contentEpoch: number;\n nextContentEpoch: number;\n rawOutput: string;\n}\n\nexport interface TerminalSurfaceOutputPlan {\n nextCommittedRawOutput: string;\n nextContentEpoch: number;\n reset: boolean;\n write: string | null;\n}\n\nexport function resolveTerminalSurfaceOutputPlan(\n input: TerminalSurfaceOutputPlanInput\n): TerminalSurfaceOutputPlan | null {\n if (\n input.nextContentEpoch === 0 &&\n input.rawOutput.length === 0 &&\n input.committedRawOutput.length > 0\n ) {\n return null;\n }\n\n if (input.nextContentEpoch !== input.contentEpoch) {\n if (input.rawOutput === input.committedRawOutput) {\n return {\n nextCommittedRawOutput: input.committedRawOutput,\n nextContentEpoch: input.nextContentEpoch,\n reset: false,\n write: null\n };\n }\n\n return {\n nextCommittedRawOutput: input.rawOutput,\n nextContentEpoch: input.nextContentEpoch,\n reset: true,\n write: input.rawOutput || null\n };\n }\n\n if (input.rawOutput === input.committedRawOutput) {\n return null;\n }\n\n const delta = resolveTerminalScrollbackDelta(\n input.committedRawOutput,\n input.rawOutput\n );\n\n return {\n nextCommittedRawOutput: input.rawOutput,\n nextContentEpoch: input.nextContentEpoch,\n reset: !delta,\n write: delta || input.rawOutput || null\n };\n}\n","export interface TerminalSurfaceSize {\n cols: number;\n rows: number;\n}\n\nexport function resolveTerminalSurfaceResizePlan(input: {\n lastSize: TerminalSurfaceSize | null;\n nextSize: TerminalSurfaceSize;\n}): TerminalSurfaceSize | null {\n if (\n input.lastSize?.cols === input.nextSize.cols &&\n input.lastSize.rows === input.nextSize.rows\n ) {\n return null;\n }\n return input.nextSize;\n}\n","export type TerminalSurfaceScreenCachePlan =\n | { action: \"remove\" }\n | {\n action: \"save\";\n rawSnapshot: string;\n serialized: string;\n }\n | { action: \"skip\" };\n\nexport function resolveTerminalSurfaceScreenCachePlan(input: {\n hasPendingWrites: boolean;\n rawSnapshot: string;\n serialized: string;\n}): TerminalSurfaceScreenCachePlan {\n if (input.hasPendingWrites) {\n return {\n action: input.serialized ? \"skip\" : \"remove\"\n };\n }\n\n if (!input.serialized) {\n return { action: \"skip\" };\n }\n\n return {\n action: \"save\",\n rawSnapshot: input.rawSnapshot,\n serialized: input.serialized\n };\n}\n","export interface TerminalWriteBatch {\n nextWrite: string;\n remainingChunks: string[];\n}\n\nexport function drainTerminalWriteBatch(\n chunks: string[],\n maxBytes: number\n): TerminalWriteBatch {\n let remaining = maxBytes;\n let nextWrite = \"\";\n const remainingChunks = chunks.slice();\n\n while (remaining > 0 && remainingChunks.length > 0) {\n const chunk = remainingChunks.shift() ?? \"\";\n if (chunk.length <= remaining) {\n nextWrite += chunk;\n remaining -= chunk.length;\n continue;\n }\n nextWrite += chunk.slice(0, remaining);\n remainingChunks.unshift(chunk.slice(remaining));\n remaining = 0;\n }\n\n return {\n nextWrite,\n remainingChunks\n };\n}\n","export function isTerminalFindShortcut(\n event: Pick<KeyboardEvent, \"altKey\" | \"ctrlKey\" | \"key\" | \"metaKey\">\n): boolean {\n if (event.altKey) {\n return false;\n }\n\n if (!(event.metaKey || event.ctrlKey)) {\n return false;\n }\n\n return event.key.toLowerCase() === \"f\";\n}\n","import { useState } from \"react\";\n\nexport interface TerminalFindRuntime {\n findNext(\n query: string,\n options: {\n caseSensitive: boolean;\n incremental?: boolean;\n regex: boolean;\n }\n ): void;\n findPrevious(\n query: string,\n options: {\n caseSensitive: boolean;\n regex: boolean;\n }\n ): void;\n}\n\nexport interface TerminalFindController {\n actions: {\n close(): void;\n findNext(): void;\n findPrevious(): void;\n open(): void;\n onQueryChange(query: string): void;\n onSubmit(): void;\n toggleCaseSensitive(): void;\n toggleOpen(): void;\n toggleRegex(): void;\n };\n state: {\n caseSensitive: boolean;\n open: boolean;\n query: string;\n regex: boolean;\n };\n}\n\nexport function useTerminalFindController(input: {\n getRuntime: () => TerminalFindRuntime | null;\n}): TerminalFindController {\n const [open, setOpen] = useState(false);\n const [caseSensitive, setCaseSensitive] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [regex, setRegex] = useState(false);\n\n const resolveFindOptions = () => ({\n caseSensitive,\n regex\n });\n\n return {\n actions: {\n close() {\n setOpen(false);\n },\n findNext() {\n input.getRuntime()?.findNext(query, resolveFindOptions());\n },\n findPrevious() {\n input.getRuntime()?.findPrevious(query, resolveFindOptions());\n },\n open() {\n setOpen(true);\n },\n onQueryChange(nextQuery) {\n setQuery(nextQuery);\n if (!nextQuery) {\n return;\n }\n input.getRuntime()?.findNext(nextQuery, {\n ...resolveFindOptions(),\n incremental: true\n });\n },\n onSubmit() {\n input.getRuntime()?.findNext(query, resolveFindOptions());\n },\n toggleCaseSensitive() {\n setCaseSensitive((enabled) => !enabled);\n },\n toggleOpen() {\n setOpen((enabled) => !enabled);\n },\n toggleRegex() {\n setRegex((enabled) => !enabled);\n }\n },\n state: {\n caseSensitive,\n open,\n query,\n regex\n }\n };\n}\n","import { useEffect, useMemo } from \"react\";\nimport { useExternalStoreSnapshot } from \"@tutti-os/ui-react-hooks\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport {\n acquireTerminalSessionController,\n type TerminalSessionControllerState\n} from \"../core/sessionController.ts\";\n\nexport function useTerminalSessionController(input: {\n feature: TerminalNodeFeature;\n nodeId: string;\n retainLease?: boolean;\n sessionId: string;\n}) {\n const controller = useMemo(\n () =>\n acquireTerminalSessionController({\n feature: input.feature,\n nodeId: input.nodeId,\n sessionId: input.sessionId\n }),\n [input.nodeId, input.sessionId]\n );\n\n useEffect(() => {\n if (input.retainLease === false) {\n return;\n }\n controller.retain();\n return () => {\n controller.release();\n };\n }, [controller, input.retainLease]);\n const state = useExternalStoreSnapshot<TerminalSessionControllerState>({\n getSnapshot() {\n return controller.getState();\n },\n subscribe(listener) {\n return controller.subscribe(listener);\n }\n });\n\n return {\n controller,\n state\n };\n}\n"],"mappings":"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","names":["errorMessage","useState","useEffect","useMemo","useState","useState","useMemo","useEffect","errorMessage","jsx","jsxs","useState","errorMessage"]}
|
|
@@ -153,6 +153,38 @@ interface TerminalTheme {
|
|
|
153
153
|
foreground?: string;
|
|
154
154
|
selectionBackground?: string;
|
|
155
155
|
}
|
|
156
|
+
interface TerminalPreviewSegmentStyle {
|
|
157
|
+
background?: string;
|
|
158
|
+
bold?: boolean;
|
|
159
|
+
color?: string;
|
|
160
|
+
dim?: boolean;
|
|
161
|
+
italic?: boolean;
|
|
162
|
+
overline?: boolean;
|
|
163
|
+
strikethrough?: boolean;
|
|
164
|
+
underline?: boolean;
|
|
165
|
+
}
|
|
166
|
+
interface TerminalPreviewSegment {
|
|
167
|
+
style?: TerminalPreviewSegmentStyle;
|
|
168
|
+
text: string;
|
|
169
|
+
}
|
|
170
|
+
interface TerminalPreviewLine {
|
|
171
|
+
segments: readonly TerminalPreviewSegment[];
|
|
172
|
+
}
|
|
173
|
+
interface TerminalPreviewSnapshot {
|
|
174
|
+
cols: number;
|
|
175
|
+
cursorX: number;
|
|
176
|
+
cursorY: number;
|
|
177
|
+
lines: readonly TerminalPreviewLine[];
|
|
178
|
+
revision: string;
|
|
179
|
+
rows: number;
|
|
180
|
+
updatedAtUnixMs: number;
|
|
181
|
+
}
|
|
182
|
+
interface TerminalPreviewChange {
|
|
183
|
+
nodeId: string;
|
|
184
|
+
sessionId: string;
|
|
185
|
+
snapshot: TerminalPreviewSnapshot | null;
|
|
186
|
+
}
|
|
187
|
+
type TerminalPreviewChangeHandler = (change: TerminalPreviewChange) => void;
|
|
156
188
|
type TerminalThemeResolver = (input: {
|
|
157
189
|
runtimeKind: TerminalRuntimeKind;
|
|
158
190
|
sessionId: string | null;
|
|
@@ -164,4 +196,4 @@ interface TerminalHeaderAccessoryContext {
|
|
|
164
196
|
}
|
|
165
197
|
type TerminalHeaderAccessoryRenderer = (context: TerminalHeaderAccessoryContext) => ReactNode;
|
|
166
198
|
|
|
167
|
-
export type { TerminalCloseGuardReason, TerminalCloseGuardResult, TerminalCloseGuardService, TerminalDataEvent, TerminalDiagnosticEvent, TerminalDiagnostics, TerminalDropInput, TerminalDropInputResolver, TerminalExitEvent, TerminalHeaderAccessoryContext, TerminalHeaderAccessoryRenderer, TerminalLaunchInput, TerminalLaunchService, TerminalLinkHandler, TerminalLinkTarget, TerminalMetadataEvent, TerminalNodeExternalState, TerminalNodeLimits, TerminalOutputTransform, TerminalRuntimeKind, TerminalSessionDescriptor, TerminalSessionStatus, TerminalSnapshot, TerminalStateEvent, TerminalTheme, TerminalThemeResolver, TerminalTransport, TerminalTransportAttachInput, TerminalTransportDetachInput, TerminalTransportResizeInput, TerminalTransportSnapshotInput, TerminalTransportWriteInput, TerminalWriteEncoding, TerminalWriteProvenance };
|
|
199
|
+
export type { TerminalCloseGuardReason, TerminalCloseGuardResult, TerminalCloseGuardService, TerminalDataEvent, TerminalDiagnosticEvent, TerminalDiagnostics, TerminalDropInput, TerminalDropInputResolver, TerminalExitEvent, TerminalHeaderAccessoryContext, TerminalHeaderAccessoryRenderer, TerminalLaunchInput, TerminalLaunchService, TerminalLinkHandler, TerminalLinkTarget, TerminalMetadataEvent, TerminalNodeExternalState, TerminalNodeLimits, TerminalOutputTransform, TerminalPreviewChange, TerminalPreviewChangeHandler, TerminalPreviewLine, TerminalPreviewSegment, TerminalPreviewSegmentStyle, TerminalPreviewSnapshot, TerminalRuntimeKind, TerminalSessionDescriptor, TerminalSessionStatus, TerminalSnapshot, TerminalStateEvent, TerminalTheme, TerminalThemeResolver, TerminalTransport, TerminalTransportAttachInput, TerminalTransportDetachInput, TerminalTransportResizeInput, TerminalTransportSnapshotInput, TerminalTransportWriteInput, TerminalWriteEncoding, TerminalWriteProvenance };
|