one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 33.7 kB
Source Map (JSON)
{"version":3,"file":"tui.js","names":[],"sources":["esm/daemon/tui.js"],"sourcesContent":["import { getAllServers, setRoute, clearRoute, getLastActiveServer } from \"./registry\";\nimport { getBootedSimulators } from \"./picker\";\nimport {\n setRouteMode,\n setPendingMapping,\n clearMappingsForSimulator,\n getSimulatorMappings,\n setSimulatorMapping\n} from \"./server\";\nimport colors from \"picocolors\";\nconst CABLE_COLORS = [\n colors.green,\n colors.cyan,\n colors.magenta,\n colors.blue,\n colors.yellow\n];\nconst ESC = \"\\x1B\";\nconst CSI = `${ESC}[`;\nconst ansi = {\n hideCursor: `${CSI}?25l`,\n showCursor: `${CSI}?25h`,\n clearScreen: `${CSI}2J`,\n home: `${CSI}H`\n};\nlet tuiState = null;\nlet daemonState = null;\nlet refreshInterval = null;\nlet physicsInterval = null;\nlet stdinListener = null;\nlet resizeListener = null;\nfunction getRouteMode() {\n return tuiState?.routeMode || \"ask\";\n}\nfunction calcLayout(width) {\n const simEndX = Math.floor(width * 0.25);\n const serverStartX = Math.floor(width * 0.65);\n return { simEndX, serverStartX };\n}\nfunction showPopup(message, durationMs = 2e3) {\n if (!tuiState) return;\n if (tuiState.popup) {\n clearTimeout(tuiState.popup.timeout);\n }\n const timeout = setTimeout(() => {\n if (tuiState) {\n tuiState.popup = null;\n render();\n }\n }, durationMs);\n tuiState.popup = { message, timeout };\n render();\n}\nfunction startTUI(state) {\n daemonState = state;\n const width = process.stdout.columns || 80;\n const height = process.stdout.rows || 24;\n const { simEndX, serverStartX } = calcLayout(width);\n tuiState = {\n simulators: [],\n servers: [],\n cables: /* @__PURE__ */ new Map(),\n draggingSimIndex: null,\n modeBeforeDrag: null,\n selectedCol: 0,\n selectedRow: 0,\n routeMode: \"most-recent\",\n lastRender: \"\",\n width,\n height,\n simEndX,\n serverStartX,\n rowStartY: 5,\n popup: null\n };\n process.stdout.write(ansi.clearScreen + ansi.home + ansi.hideCursor);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n let resizePending = false;\n resizeListener = () => {\n if (!tuiState) return;\n tuiState.width = process.stdout.columns || 80;\n tuiState.height = process.stdout.rows || 24;\n const layout = calcLayout(tuiState.width);\n tuiState.simEndX = layout.simEndX;\n tuiState.serverStartX = layout.serverStartX;\n tuiState.lastRender = \"\";\n if (!resizePending) {\n resizePending = true;\n setImmediate(() => {\n resizePending = false;\n process.stdout.write(ansi.clearScreen + ansi.home);\n render();\n });\n }\n };\n process.stdout.on(\"resize\", resizeListener);\n stdinListener = (key) => {\n const str = key.toString();\n if (str === \"\u0003\" || str === \"q\") {\n stopTUI();\n process.exit(0);\n }\n if (!tuiState || !daemonState) return;\n if (str === \"\\x1B[A\") {\n tuiState.selectedRow = Math.max(0, tuiState.selectedRow - 1);\n } else if (str === \"\\x1B[B\") {\n const max = tuiState.selectedCol === 0 ? Math.max(0, tuiState.simulators.length - 1) : Math.max(0, tuiState.servers.length - 1);\n tuiState.selectedRow = Math.min(max, tuiState.selectedRow + 1);\n } else if (str === \"\\x1B[C\") {\n if (tuiState.selectedCol === 0) {\n tuiState.selectedCol = 1;\n tuiState.selectedRow = Math.min(\n tuiState.selectedRow,\n Math.max(0, tuiState.servers.length - 1)\n );\n }\n } else if (str === \"\\x1B[D\") {\n if (tuiState.selectedCol === 1) {\n tuiState.selectedCol = 0;\n tuiState.selectedRow = Math.min(\n tuiState.selectedRow,\n Math.max(0, tuiState.simulators.length - 1)\n );\n }\n } else if (str === \" \" || str === \"\\r\") {\n handleAction();\n } else if (str === \"d\") {\n handleDisconnect();\n } else if (str === \"m\") {\n tuiState.routeMode = tuiState.routeMode === \"most-recent\" ? \"ask\" : \"most-recent\";\n setRouteMode(tuiState.routeMode);\n } else if (str === \"b\") {\n stopTUI();\n console.log(colors.dim(\"\\nDaemon running in background.\"));\n return;\n }\n render();\n };\n process.stdin.on(\"data\", stdinListener);\n const signalHandler = () => {\n stopTUI();\n process.exit(0);\n };\n process.on(\"SIGINT\", signalHandler);\n process.on(\"SIGTERM\", signalHandler);\n physicsInterval = setInterval(updatePhysics, 50);\n refreshInterval = setInterval(refreshData, 1e3);\n refreshData();\n}\nfunction getRouteKey(sim) {\n return `sim:${sim.udid}`;\n}\nfunction handleAction() {\n if (!tuiState || !daemonState) return;\n const isDragging = tuiState.draggingSimIndex !== null;\n if (isDragging) {\n if (tuiState.selectedCol === 1 && tuiState.servers.length > 0) {\n const simIndex = tuiState.draggingSimIndex;\n const sim = tuiState.simulators[simIndex];\n const serverIndex = tuiState.selectedRow;\n const server = tuiState.servers[serverIndex];\n if (server && sim) {\n setSimulatorMapping(sim.udid, server.id);\n setPendingMapping(server.id, sim.udid);\n setRoute(daemonState, getRouteKey(sim), server.id);\n const cable = tuiState.cables.get(simIndex);\n if (cable) {\n cable.serverIndex = serverIndex;\n }\n tuiState.draggingSimIndex = null;\n if (tuiState.modeBeforeDrag === \"most-recent\") {\n tuiState.routeMode = \"most-recent\";\n setRouteMode(\"most-recent\");\n }\n tuiState.modeBeforeDrag = null;\n }\n }\n return;\n }\n if (tuiState.selectedCol === 0 && tuiState.simulators.length > 0) {\n const simIndex = tuiState.selectedRow;\n const sim = tuiState.simulators[simIndex];\n if (!sim) return;\n tuiState.modeBeforeDrag = tuiState.routeMode;\n if (tuiState.routeMode === \"most-recent\") {\n tuiState.routeMode = \"ask\";\n setRouteMode(\"ask\");\n }\n clearRoute(daemonState, getRouteKey(sim));\n clearMappingsForSimulator(sim.udid);\n let cable = tuiState.cables.get(simIndex);\n if (!cable) {\n cable = {\n serverIndex: null,\n controlPoint: { x: tuiState.simEndX + 5, y: tuiState.rowStartY + simIndex },\n velocity: { x: 0, y: 0 }\n };\n tuiState.cables.set(simIndex, cable);\n }\n cable.serverIndex = null;\n cable.velocity = { x: 3, y: -2 };\n tuiState.draggingSimIndex = simIndex;\n } else if (tuiState.selectedCol === 1 && tuiState.servers.length > 0) {\n const serverIndex = tuiState.selectedRow;\n for (const [simIndex, cable] of tuiState.cables) {\n if (cable.serverIndex === serverIndex) {\n const sim = tuiState.simulators[simIndex];\n if (sim) {\n tuiState.modeBeforeDrag = tuiState.routeMode;\n if (tuiState.routeMode === \"most-recent\") {\n tuiState.routeMode = \"ask\";\n setRouteMode(\"ask\");\n }\n clearRoute(daemonState, getRouteKey(sim));\n cable.serverIndex = null;\n cable.velocity = { x: -3, y: 2 };\n tuiState.draggingSimIndex = simIndex;\n }\n break;\n }\n }\n }\n}\nfunction handleDisconnect() {\n if (!tuiState || !daemonState) return;\n if (tuiState.selectedCol === 0) {\n const simIndex = tuiState.selectedRow;\n const sim = tuiState.simulators[simIndex];\n const cable = tuiState.cables.get(simIndex);\n if (!sim || !cable || cable.serverIndex === null) return;\n if (tuiState.routeMode === \"most-recent\") {\n tuiState.routeMode = \"ask\";\n setRouteMode(\"ask\");\n showPopup(\"Switched to manual mode\", 1500);\n }\n clearRoute(daemonState, getRouteKey(sim));\n clearMappingsForSimulator(sim.udid);\n cable.serverIndex = null;\n cable.velocity = { x: -4, y: 3 };\n } else {\n const serverIndex = tuiState.selectedRow;\n for (const [simIndex, cable] of tuiState.cables) {\n if (cable.serverIndex === serverIndex) {\n const sim = tuiState.simulators[simIndex];\n if (sim) {\n if (tuiState.routeMode === \"most-recent\") {\n tuiState.routeMode = \"ask\";\n setRouteMode(\"ask\");\n showPopup(\"Switched to manual mode\", 1500);\n }\n clearRoute(daemonState, getRouteKey(sim));\n clearMappingsForSimulator(sim.udid);\n cable.serverIndex = null;\n cable.velocity = { x: -4, y: 3 };\n }\n break;\n }\n }\n }\n}\nfunction updatePhysics() {\n if (!tuiState) return;\n const gravity = 0.3;\n const damping = 0.85;\n let needsRender = false;\n for (const [simIndex, cable] of tuiState.cables) {\n const simY = tuiState.rowStartY + simIndex;\n if (cable.serverIndex !== null) {\n const sagCurve = (i) => {\n if (i <= 4) return 6 - i;\n return 2 + (i - 4) * 0.8;\n };\n const sag = sagCurve(simIndex);\n const serverY = tuiState.rowStartY + cable.serverIndex;\n const targetX = (tuiState.simEndX + tuiState.serverStartX) / 2;\n const targetY = (simY + serverY) / 2 + sag;\n const dx = targetX - cable.controlPoint.x;\n const dy = targetY - cable.controlPoint.y;\n cable.velocity.x += dx * 0.15;\n cable.velocity.y += dy * 0.15;\n cable.velocity.x *= damping;\n cable.velocity.y *= damping;\n cable.controlPoint.x += cable.velocity.x;\n cable.controlPoint.y += cable.velocity.y;\n if (Math.abs(cable.velocity.x) > 0.05 || Math.abs(cable.velocity.y) > 0.05) {\n needsRender = true;\n }\n } else {\n cable.velocity.y += gravity;\n cable.velocity.x *= damping;\n cable.velocity.y *= damping;\n cable.controlPoint.x += cable.velocity.x;\n cable.controlPoint.y += cable.velocity.y;\n const anchorX = tuiState.simEndX;\n const anchorY = simY;\n if (cable.controlPoint.x < anchorX) {\n cable.controlPoint.x = anchorX;\n cable.velocity.x = Math.abs(cable.velocity.x) * 0.5;\n }\n if (cable.controlPoint.x > tuiState.serverStartX) {\n cable.controlPoint.x = tuiState.serverStartX;\n cable.velocity.x = -Math.abs(cable.velocity.x) * 0.5;\n }\n if (cable.controlPoint.y < anchorY) {\n cable.controlPoint.y = anchorY;\n cable.velocity.y = Math.abs(cable.velocity.y) * 0.3;\n }\n if (cable.controlPoint.y > tuiState.height - 5) {\n cable.controlPoint.y = tuiState.height - 5;\n cable.velocity.y = -Math.abs(cable.velocity.y) * 0.5;\n }\n needsRender = true;\n }\n }\n if (needsRender) render();\n}\nasync function refreshData() {\n if (!tuiState || !daemonState) return;\n const newSims = await getBootedSimulators();\n const newServers = getAllServers(daemonState);\n tuiState.simulators = newSims;\n tuiState.servers = newServers;\n const simMappings = getSimulatorMappings();\n for (let simIndex = 0; simIndex < newSims.length; simIndex++) {\n const sim = newSims[simIndex];\n const mappedServerId = simMappings.get(sim.udid);\n let routedServerIndex = null;\n if (mappedServerId) {\n routedServerIndex = newServers.findIndex((s) => s.id === mappedServerId);\n if (routedServerIndex === -1) routedServerIndex = null;\n }\n let cable = tuiState.cables.get(simIndex);\n if (!cable) {\n cable = {\n serverIndex: routedServerIndex,\n controlPoint: { x: tuiState.simEndX + 5, y: tuiState.rowStartY + simIndex },\n velocity: { x: 0, y: 0 }\n };\n tuiState.cables.set(simIndex, cable);\n }\n if (tuiState.draggingSimIndex !== simIndex) {\n if (routedServerIndex !== cable.serverIndex) {\n cable.serverIndex = routedServerIndex;\n if (routedServerIndex !== null) {\n cable.velocity = { x: 0, y: -2 };\n }\n }\n }\n }\n for (const simIndex of tuiState.cables.keys()) {\n if (simIndex >= newSims.length) {\n tuiState.cables.delete(simIndex);\n }\n }\n if (tuiState.selectedCol === 0) {\n tuiState.selectedRow = Math.min(tuiState.selectedRow, Math.max(0, newSims.length - 1));\n } else {\n tuiState.selectedRow = Math.min(\n tuiState.selectedRow,\n Math.max(0, newServers.length - 1)\n );\n }\n render();\n}\nfunction render() {\n if (!tuiState) return;\n const { width, height, simEndX, serverStartX } = tuiState;\n const lines = [];\n const title = \" one daemon \";\n const headerPad = Math.max(0, width - title.length - 10);\n lines.push(colors.cyan(`\\u250C\\u2500${title}${\"\\u2500\".repeat(headerPad)}\\u2500:8081\\u2500\\u2510`));\n const isAuto = tuiState.routeMode === \"most-recent\";\n const toggleLeft = isAuto ? colors.green(\"\\u25B6\") : colors.dim(\"\\u25B7\");\n const toggleRight = isAuto ? colors.dim(\"\\u25C1\") : colors.yellow(\"\\u25C0\");\n const autoLabel = isAuto ? colors.green(\"AUTO\") : colors.dim(\"auto\");\n const askLabel = isAuto ? colors.dim(\"ask\") : colors.yellow(\"ASK\");\n const toggle = ` ${autoLabel} ${toggleLeft}\\u2550\\u2550\\u2550${toggleRight} ${askLabel} [m] toggle`;\n const togglePad = Math.max(0, width - stripAnsi(toggle).length - 2);\n lines.push(colors.cyan(\"\\u2502\") + toggle + \" \".repeat(togglePad) + colors.cyan(\"\\u2502\"));\n const simHeader = \" SIMULATORS\";\n const srvHeader = \"SERVERS \";\n const gap = \" \".repeat(Math.max(0, serverStartX - simEndX));\n lines.push(\n colors.cyan(\"\\u2502\") + colors.bold(simHeader.padEnd(simEndX - 1)) + gap + colors.bold(srvHeader.padStart(width - serverStartX - 1)) + colors.cyan(\"\\u2502\")\n );\n lines.push(colors.cyan(\"\\u2502\") + colors.dim(\"\\u2500\".repeat(width - 2)) + colors.cyan(\"\\u2502\"));\n const contentRows = height - 7;\n for (let row = 0; row < contentRows; row++) {\n const y = tuiState.rowStartY + row;\n let line = \"\";\n line += colors.cyan(\"\\u2502\");\n const sim = tuiState.simulators[row];\n let simText = \"\";\n if (sim) {\n const isSelected = tuiState.selectedCol === 0 && tuiState.selectedRow === row;\n const cable = tuiState.cables.get(row);\n const hasConnection = cable?.serverIndex !== null;\n const cableColor = CABLE_COLORS[row % CABLE_COLORS.length];\n const plug = hasConnection ? cableColor(\"\\u25CF\") : colors.dim(\"\\u25CB\");\n const name = truncate(sim.name, simEndX - 5);\n simText = `${name} ${plug}`;\n if (isSelected) simText = colors.inverse(simText);\n }\n const simTextLen = stripAnsi(simText).length;\n const simPad = Math.max(0, simEndX - 1 - simTextLen);\n line += \" \".repeat(simPad) + simText;\n let cableZone = \"\";\n for (let x = simEndX; x < serverStartX; x++) {\n const char = getCableCharAt(x, y);\n cableZone += char || \" \";\n }\n line += cableZone;\n const server = tuiState.servers[row];\n let srvLeft = \"\";\n let srvRight = \"\";\n if (server) {\n const isSelected = tuiState.selectedCol === 1 && tuiState.selectedRow === row;\n let connectedColor = null;\n for (const [simIndex, cable] of tuiState.cables) {\n if (cable.serverIndex === row) {\n connectedColor = CABLE_COLORS[simIndex % CABLE_COLORS.length];\n break;\n }\n }\n const lastActive = daemonState ? getLastActiveServer(daemonState) : null;\n const isLastActive = lastActive?.id === server.id;\n const plug = connectedColor ? connectedColor(\"\\u25CF\") : colors.dim(\"\\u25CB\");\n const star = isLastActive ? colors.yellow(\"\\u2605\") : \" \";\n const shortRoot = truncate(\n server.root.replace(process.env.HOME || \"\", \"~\"),\n width - serverStartX - 14\n );\n srvLeft = `${plug} ${star}${shortRoot}`;\n srvRight = colors.bold(colors.yellow(`:${server.port}`));\n if (isSelected) {\n srvLeft = colors.inverse(srvLeft);\n srvRight = colors.inverse(srvRight);\n }\n }\n const srvLeftLen = stripAnsi(srvLeft).length;\n const srvRightLen = stripAnsi(srvRight).length;\n const srvColWidth = width - serverStartX - 2;\n const srvGap = Math.max(1, srvColWidth - srvLeftLen - srvRightLen);\n line += srvLeft + \" \".repeat(srvGap) + srvRight;\n line += colors.cyan(\"\\u2502\");\n lines.push(line);\n }\n if (tuiState.popup) {\n const msg = tuiState.popup.message;\n const padLeft = Math.floor((width - msg.length - 4) / 2);\n const padRight = width - msg.length - padLeft - 4;\n lines.push(\n colors.cyan(\"\\u2502\") + \" \".repeat(Math.max(0, padLeft)) + colors.bgYellow(colors.black(` ${msg} `)) + \" \".repeat(Math.max(0, padRight)) + colors.cyan(\"\\u2502\")\n );\n } else {\n lines.push(\n colors.cyan(\"\\u2502\") + colors.dim(\" \\u2191\\u2193 select \\u2190\\u2192 move space grab/plug d disconnect b bg q quit\").padEnd(width - 2) + colors.cyan(\"\\u2502\")\n );\n }\n lines.push(colors.cyan(`\\u2514${\"\\u2500\".repeat(width - 2)}\\u2518`));\n const output = lines.join(\"\\n\");\n if (output !== tuiState.lastRender) {\n tuiState.lastRender = output;\n process.stdout.write(ansi.home + output);\n }\n}\nfunction getCableCharAt(x, y) {\n if (!tuiState) return null;\n if (tuiState.simulators.length === 0) return null;\n for (const [simIndex, cable] of tuiState.cables) {\n const startX = tuiState.simEndX;\n const startY = tuiState.rowStartY + simIndex;\n let endX, endY;\n if (cable.serverIndex !== null) {\n endX = tuiState.serverStartX;\n endY = tuiState.rowStartY + cable.serverIndex;\n } else {\n endX = Math.round(cable.controlPoint.x);\n endY = Math.round(cable.controlPoint.y);\n }\n const ctrlX = Math.round(cable.controlPoint.x);\n const ctrlY = Math.round(cable.controlPoint.y);\n const steps = 30;\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n const px = Math.round(invT * invT * startX + 2 * invT * t * ctrlX + t * t * endX);\n const py = Math.round(invT * invT * startY + 2 * invT * t * ctrlY + t * t * endY);\n if (px === x && py === y) {\n const connected = cable.serverIndex !== null;\n const baseColor = CABLE_COLORS[simIndex % CABLE_COLORS.length];\n const color = connected ? baseColor : colors.dim;\n const tPrev = Math.max(0, (i - 1) / steps);\n const tNext = Math.min(1, (i + 1) / steps);\n const prevX = Math.round(\n (1 - tPrev) * (1 - tPrev) * startX + 2 * (1 - tPrev) * tPrev * ctrlX + tPrev * tPrev * endX\n );\n const prevY = Math.round(\n (1 - tPrev) * (1 - tPrev) * startY + 2 * (1 - tPrev) * tPrev * ctrlY + tPrev * tPrev * endY\n );\n const nextX = Math.round(\n (1 - tNext) * (1 - tNext) * startX + 2 * (1 - tNext) * tNext * ctrlX + tNext * tNext * endX\n );\n const nextY = Math.round(\n (1 - tNext) * (1 - tNext) * startY + 2 * (1 - tNext) * tNext * ctrlY + tNext * tNext * endY\n );\n const dx = nextX - prevX;\n const dy = nextY - prevY;\n let char;\n if (Math.abs(dx) > Math.abs(dy) * 2) {\n char = \"\\u2500\";\n } else if (Math.abs(dy) > Math.abs(dx) * 2) {\n char = \"\\u2502\";\n } else if (dx > 0 && dy > 0 || dx < 0 && dy < 0) {\n char = \"\\u2572\";\n } else {\n char = \"\\u2571\";\n }\n return color(char);\n }\n }\n }\n return null;\n}\nfunction truncate(str, maxLen) {\n if (maxLen <= 0) return \"\";\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + \"\\u2026\";\n}\nfunction stripAnsi(str) {\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\nfunction stopTUI() {\n if (refreshInterval) {\n clearInterval(refreshInterval);\n refreshInterval = null;\n }\n if (physicsInterval) {\n clearInterval(physicsInterval);\n physicsInterval = null;\n }\n if (stdinListener) {\n process.stdin.removeListener(\"data\", stdinListener);\n stdinListener = null;\n }\n if (resizeListener) {\n process.stdout.removeListener(\"resize\", resizeListener);\n resizeListener = null;\n }\n process.stdout.write(ansi.clearScreen + ansi.home + ansi.showCursor);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n tuiState = null;\n daemonState = null;\n}\nfunction triggerPulse(_serverId, _direction) {\n}\nexport {\n getRouteMode,\n startTUI,\n stopTUI,\n triggerPulse\n};\n//# sourceMappingURL=tui.js.map\n"],"mappings":"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"}