@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.
@@ -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-FEJT6FJ4.js.map
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 };