@tutti-os/workspace-terminal 0.0.1

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.
@@ -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 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 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 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 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 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 sessionId: string;\n status: TerminalSessionStatus;\n}\n\nexport function TerminalSurface({\n controllerLeaseRetainedExternally = false,\n externalState,\n feature,\n nodeId,\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 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 } from \"@xterm/xterm\";\nimport type {\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();\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 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\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 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 },\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 }\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","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"]}
@@ -0,0 +1,167 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ type TerminalRuntimeKind = "local" | "vm" | "remote" | (string & {});
4
+ type TerminalSessionStatus = "created" | "starting" | "running" | "detached" | "exited" | "failed";
5
+ type TerminalWriteEncoding = "utf8" | "binary";
6
+ type TerminalWriteProvenance = "auto" | "user";
7
+ interface TerminalTransportAttachInput {
8
+ afterSeq?: number;
9
+ clientId?: string;
10
+ sessionId: string;
11
+ }
12
+ interface TerminalTransportDetachInput {
13
+ clientId?: string;
14
+ sessionId: string;
15
+ }
16
+ interface TerminalTransportWriteInput {
17
+ data: string;
18
+ encoding?: TerminalWriteEncoding;
19
+ provenance?: TerminalWriteProvenance;
20
+ sessionId: string;
21
+ }
22
+ interface TerminalTransportResizeInput {
23
+ cols: number;
24
+ rows: number;
25
+ sessionId: string;
26
+ }
27
+ interface TerminalTransportSnapshotInput {
28
+ sessionId: string;
29
+ }
30
+ interface TerminalSnapshot {
31
+ data: string;
32
+ fromSeq?: number;
33
+ toSeq?: number;
34
+ truncated?: boolean;
35
+ updatedAt?: number;
36
+ }
37
+ interface TerminalDataEvent {
38
+ data: string;
39
+ seq?: number;
40
+ sessionId: string;
41
+ }
42
+ interface TerminalExitEvent {
43
+ code?: number | null;
44
+ reason?: string | null;
45
+ sessionId: string;
46
+ signal?: string | null;
47
+ }
48
+ interface TerminalMetadataEvent {
49
+ cwd?: string | null;
50
+ profileId?: string | null;
51
+ resumeSessionId?: string | null;
52
+ runtimeKind?: TerminalRuntimeKind;
53
+ sessionId: string;
54
+ title?: string | null;
55
+ }
56
+ interface TerminalStateEvent {
57
+ error?: string | null;
58
+ gapEndSeq?: number | null;
59
+ gapStartSeq?: number | null;
60
+ sessionId: string;
61
+ status: TerminalSessionStatus;
62
+ }
63
+ interface TerminalTransport {
64
+ attach(input: TerminalTransportAttachInput): Promise<void>;
65
+ detach(input: TerminalTransportDetachInput): Promise<void>;
66
+ onData(listener: (event: TerminalDataEvent) => void): () => void;
67
+ onExit(listener: (event: TerminalExitEvent) => void): () => void;
68
+ onMetadata?(listener: (event: TerminalMetadataEvent) => void): () => void;
69
+ onState(listener: (event: TerminalStateEvent) => void): () => void;
70
+ resize(input: TerminalTransportResizeInput): Promise<void>;
71
+ snapshot(input: TerminalTransportSnapshotInput): Promise<TerminalSnapshot>;
72
+ write(input: TerminalTransportWriteInput): Promise<void>;
73
+ }
74
+ interface TerminalLaunchInput {
75
+ cwd?: string | null;
76
+ initialInput?: string | null;
77
+ profileId?: string | null;
78
+ reason: "dock" | "intent" | "restore";
79
+ workspaceId: string;
80
+ }
81
+ interface TerminalSessionDescriptor {
82
+ cwd: string | null;
83
+ profileId: string | null;
84
+ runtimeKind: TerminalRuntimeKind;
85
+ sessionId: string;
86
+ status: TerminalSessionStatus;
87
+ title: string;
88
+ }
89
+ interface TerminalLaunchService {
90
+ create(input: TerminalLaunchInput): Promise<TerminalSessionDescriptor>;
91
+ get?(sessionId: string): Promise<TerminalSessionDescriptor | null>;
92
+ terminate(input: {
93
+ sessionId: string;
94
+ }): Promise<void>;
95
+ }
96
+ type TerminalCloseGuardReason = "foreground-process" | "not-running" | "running" | "unknown";
97
+ interface TerminalCloseGuardResult {
98
+ leaderCommand?: string | null;
99
+ reason: TerminalCloseGuardReason;
100
+ requiresConfirmation: boolean;
101
+ status: TerminalSessionStatus;
102
+ }
103
+ interface TerminalCloseGuardService {
104
+ check(input: {
105
+ sessionId: string;
106
+ }): Promise<TerminalCloseGuardResult>;
107
+ }
108
+ interface TerminalLinkTarget {
109
+ cwd?: string | null;
110
+ column?: number;
111
+ line?: number;
112
+ path?: string;
113
+ url?: string;
114
+ }
115
+ interface TerminalLinkHandler {
116
+ open(target: TerminalLinkTarget): Promise<void> | void;
117
+ }
118
+ interface TerminalDropInput {
119
+ cwd: string | null;
120
+ dataTransfer: DataTransfer;
121
+ sessionId: string;
122
+ }
123
+ type TerminalDropInputResolver = (input: TerminalDropInput) => Promise<string | null> | string | null;
124
+ type TerminalOutputTransform = (input: {
125
+ data: string;
126
+ sessionId: string;
127
+ }) => string | null;
128
+ type TerminalDiagnosticEvent = "attach-complete" | "attach-error" | "attach-start" | "close-confirmed" | "close-requested" | "dispose" | "hydration-complete" | "hydration-gap" | "hydration-start" | "mount" | "output-projected" | "resize" | "snapshot-complete" | "snapshot-start" | "surface-output-sync" | "surface-output-written" | "write-error";
129
+ interface TerminalDiagnostics {
130
+ log(event: TerminalDiagnosticEvent, details?: Record<string, string | number | boolean | null>): void;
131
+ }
132
+ interface TerminalNodeExternalState<THostMetadata extends Record<string, unknown> = Record<string, unknown>> {
133
+ createdAt: string | null;
134
+ cwd: string | null;
135
+ endedAt: string | null;
136
+ host: THostMetadata | null;
137
+ lastError: string | null;
138
+ profileId: string | null;
139
+ runtimeKind: TerminalRuntimeKind;
140
+ sessionId: string | null;
141
+ status: TerminalSessionStatus;
142
+ title: string;
143
+ updatedAt: string | null;
144
+ }
145
+ interface TerminalNodeLimits {
146
+ maxScrollbackLines: number;
147
+ maxWriteBatchBytes: number;
148
+ snapshotChunkBytes: number;
149
+ }
150
+ interface TerminalTheme {
151
+ background?: string;
152
+ cursor?: string;
153
+ foreground?: string;
154
+ selectionBackground?: string;
155
+ }
156
+ type TerminalThemeResolver = (input: {
157
+ runtimeKind: TerminalRuntimeKind;
158
+ sessionId: string | null;
159
+ status: TerminalSessionStatus;
160
+ }) => TerminalTheme;
161
+ interface TerminalHeaderAccessoryContext {
162
+ externalState: TerminalNodeExternalState | null;
163
+ sessionId: string | null;
164
+ }
165
+ type TerminalHeaderAccessoryRenderer = (context: TerminalHeaderAccessoryContext) => ReactNode;
166
+
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 };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,32 @@
1
+ import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
2
+ import { TerminalNodeI18nRuntime } from './i18n/index.js';
3
+ import { TerminalCloseGuardService, TerminalDiagnostics, TerminalDropInputResolver, TerminalLaunchService, TerminalNodeLimits, TerminalLinkHandler, TerminalOutputTransform, TerminalThemeResolver, TerminalTransport } from './contracts/index.js';
4
+
5
+ interface TerminalNodeFeature {
6
+ closeGuard: TerminalCloseGuardService;
7
+ diagnostics: TerminalDiagnostics;
8
+ dropInput?: TerminalDropInputResolver;
9
+ i18n: TerminalNodeI18nRuntime;
10
+ launchService: TerminalLaunchService;
11
+ limits: TerminalNodeLimits;
12
+ linkHandler?: TerminalLinkHandler;
13
+ outputTransform?: TerminalOutputTransform;
14
+ resolveTheme: TerminalThemeResolver;
15
+ transport: TerminalTransport;
16
+ }
17
+ interface CreateTerminalNodeFeatureInput {
18
+ closeGuard: TerminalCloseGuardService;
19
+ diagnostics?: TerminalDiagnostics;
20
+ dropInput?: TerminalDropInputResolver;
21
+ i18n?: I18nRuntime<string>;
22
+ launchService: TerminalLaunchService;
23
+ limits?: Partial<TerminalNodeLimits>;
24
+ linkHandler?: TerminalLinkHandler;
25
+ outputTransform?: TerminalOutputTransform;
26
+ resolveTheme?: TerminalThemeResolver;
27
+ transport: TerminalTransport;
28
+ }
29
+ declare const defaultTerminalNodeLimits: TerminalNodeLimits;
30
+ declare function createTerminalNodeFeature(input: CreateTerminalNodeFeatureInput): TerminalNodeFeature;
31
+
32
+ export { type CreateTerminalNodeFeatureInput as C, type TerminalNodeFeature as T, createTerminalNodeFeature as c, defaultTerminalNodeLimits as d };
@@ -0,0 +1,18 @@
1
+ import * as _tutti_os_ui_i18n_runtime from '@tutti-os/ui-i18n-runtime';
2
+ import { I18nRuntime, I18nDictionary } from '@tutti-os/ui-i18n-runtime';
3
+
4
+ declare const terminalNodeI18nNamespace = "terminalNode";
5
+ declare const terminalNodeI18nModule: _tutti_os_ui_i18n_runtime.ScopedLocaleObjectsI18nModuleManifest;
6
+ type TerminalNodeI18nKey = "actions.caseSensitive" | "actions.close" | "actions.find" | "actions.next" | "actions.previous" | "actions.regex" | "closeGuard.cancel" | "closeGuard.confirm" | "closeGuard.description" | "closeGuard.title" | "dockLabel" | "emptySession" | "findPlaceholder" | "recovery.replayGap" | "recovery.snapshotTruncated" | "status.created" | "status.detached" | "status.exited" | "status.failed" | "status.running" | "status.starting" | "title";
7
+ type TerminalNodeI18nRuntime = I18nRuntime<TerminalNodeI18nKey>;
8
+ declare const terminalNodeI18nResources: {
9
+ readonly en: {
10
+ readonly terminalNode: I18nDictionary;
11
+ };
12
+ readonly "zh-CN": {
13
+ readonly terminalNode: I18nDictionary;
14
+ };
15
+ };
16
+ declare function createTerminalNodeI18nRuntime(runtime: I18nRuntime<string> | undefined): TerminalNodeI18nRuntime;
17
+
18
+ export { type TerminalNodeI18nKey, type TerminalNodeI18nRuntime, createTerminalNodeI18nRuntime, terminalNodeI18nModule, terminalNodeI18nNamespace, terminalNodeI18nResources };
@@ -0,0 +1,13 @@
1
+ import {
2
+ createTerminalNodeI18nRuntime,
3
+ terminalNodeI18nModule,
4
+ terminalNodeI18nNamespace,
5
+ terminalNodeI18nResources
6
+ } from "../chunk-65BWWZQV.js";
7
+ export {
8
+ createTerminalNodeI18nRuntime,
9
+ terminalNodeI18nModule,
10
+ terminalNodeI18nNamespace,
11
+ terminalNodeI18nResources
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,20 @@
1
+ import { TerminalCloseGuardResult, TerminalLaunchService, TerminalSessionStatus } from './contracts/index.js';
2
+ import { T as TerminalNodeFeature } from './feature-sh6KDO7B.js';
3
+ export { C as CreateTerminalNodeFeatureInput, c as createTerminalNodeFeature, d as defaultTerminalNodeLimits } from './feature-sh6KDO7B.js';
4
+ import 'react';
5
+ import '@tutti-os/ui-i18n-runtime';
6
+ import './i18n/index.js';
7
+
8
+ type TerminalCloseConfirmation = (guard: TerminalCloseGuardResult) => Promise<boolean> | boolean;
9
+ type TerminalCloseResult = "closed" | "kept-open";
10
+ interface CloseTerminalSessionInput {
11
+ confirm?: TerminalCloseConfirmation;
12
+ feature: Pick<TerminalNodeFeature, "closeGuard" | "diagnostics"> & {
13
+ launchService: Pick<TerminalLaunchService, "terminate">;
14
+ };
15
+ sessionId: string | null | undefined;
16
+ status?: TerminalSessionStatus | null | undefined;
17
+ }
18
+ declare function closeTerminalSession({ confirm, feature, sessionId, status }: CloseTerminalSessionInput): Promise<TerminalCloseResult>;
19
+
20
+ export { type TerminalCloseConfirmation, type TerminalCloseResult, TerminalNodeFeature, closeTerminalSession };
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import {
2
+ closeTerminalSession,
3
+ createTerminalNodeFeature,
4
+ defaultTerminalNodeLimits
5
+ } from "./chunk-56B5GYMU.js";
6
+ import "./chunk-65BWWZQV.js";
7
+ export {
8
+ closeTerminalSession,
9
+ createTerminalNodeFeature,
10
+ defaultTerminalNodeLimits
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,39 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, HTMLAttributes } from 'react';
3
+ import { TerminalNodeExternalState, TerminalHeaderAccessoryRenderer } from '../contracts/index.js';
4
+ import { T as TerminalNodeFeature } from '../feature-sh6KDO7B.js';
5
+ import '@tutti-os/ui-i18n-runtime';
6
+ import '../i18n/index.js';
7
+
8
+ interface TerminalNodeProps {
9
+ children?: ReactNode;
10
+ controllerLeaseRetainedExternally?: boolean;
11
+ externalState?: TerminalNodeExternalState | null;
12
+ feature: TerminalNodeFeature;
13
+ headerAccessory?: TerminalHeaderAccessoryRenderer;
14
+ nodeId: string;
15
+ onFocusRequest?: () => void;
16
+ sessionId?: string | null;
17
+ showHeader?: boolean;
18
+ }
19
+ interface TerminalNodeHeaderProps extends HTMLAttributes<HTMLElement> {
20
+ className?: string;
21
+ defaultActions?: ReactNode;
22
+ externalState?: TerminalNodeExternalState | null;
23
+ feature: TerminalNodeFeature;
24
+ headerAccessory?: TerminalHeaderAccessoryRenderer;
25
+ onCloseRequest?: () => void;
26
+ sessionId?: string | null;
27
+ }
28
+ interface TerminalCloseGuardDialogProps {
29
+ feature: TerminalNodeFeature;
30
+ leaderCommand?: string | null;
31
+ onCancel: () => void;
32
+ onConfirm: () => void;
33
+ open: boolean;
34
+ }
35
+ declare function TerminalNode({ children, controllerLeaseRetainedExternally, externalState, feature, headerAccessory, nodeId, onFocusRequest, sessionId, showHeader }: TerminalNodeProps): react_jsx_runtime.JSX.Element;
36
+ declare function TerminalNodeHeader({ className, defaultActions, externalState, feature, headerAccessory, onCloseRequest, sessionId, ...headerProps }: TerminalNodeHeaderProps): react_jsx_runtime.JSX.Element;
37
+ declare function TerminalCloseGuardDialog({ feature, leaderCommand, onCancel, onConfirm, open }: TerminalCloseGuardDialogProps): react_jsx_runtime.JSX.Element | null;
38
+
39
+ export { TerminalCloseGuardDialog, type TerminalCloseGuardDialogProps, TerminalNode, TerminalNodeHeader, type TerminalNodeHeaderProps, type TerminalNodeProps };
@@ -0,0 +1,13 @@
1
+ import {
2
+ TerminalCloseGuardDialog,
3
+ TerminalNode,
4
+ TerminalNodeHeader
5
+ } from "../chunk-FEJT6FJ4.js";
6
+ import "../chunk-56B5GYMU.js";
7
+ import "../chunk-65BWWZQV.js";
8
+ export {
9
+ TerminalCloseGuardDialog,
10
+ TerminalNode,
11
+ TerminalNodeHeader
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}