{"version":3,"file":"picker.js","names":[],"sources":["esm/daemon/picker.js"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport * as readline from \"node:readline\";\nconst execAsync = promisify(exec);\nlet activePickerContext = null;\nlet rl = null;\nlet stdinDataListener = null;\nasync function getBootedSimulators() {\n  try {\n    const { stdout } = await execAsync(\"xcrun simctl list devices booted -j\");\n    const data = JSON.parse(stdout);\n    const simulators = [];\n    for (const [runtime, devices] of Object.entries(data.devices || {})) {\n      const versionMatch = runtime.match(/iOS-(\\d+)-(\\d+)/);\n      const iosVersion = versionMatch ? `${versionMatch[1]}.${versionMatch[2]}` : void 0;\n      for (const device of devices) {\n        if (device.state === \"Booted\") {\n          simulators.push({\n            name: device.name,\n            udid: device.udid,\n            state: device.state,\n            iosVersion\n          });\n        }\n      }\n    }\n    return simulators;\n  } catch {\n    return [];\n  }\n}\nasync function showMacOSDialog(bundleId, servers) {\n  if (process.platform !== \"darwin\") {\n    return null;\n  }\n  const simulators = await getBootedSimulators();\n  let simInfo = \"\";\n  if (simulators.length > 0) {\n    const seen = /* @__PURE__ */ new Set();\n    const uniqueSims = [];\n    for (const sim of simulators) {\n      const key = `${sim.name}-${sim.iosVersion || \"\"}`;\n      if (!seen.has(key)) {\n        seen.add(key);\n        uniqueSims.push(sim.iosVersion ? `${sim.name} (iOS ${sim.iosVersion})` : sim.name);\n      }\n    }\n    if (uniqueSims.length === 1) {\n      simInfo = `\\\\n\\\\nFrom: ${uniqueSims[0]}`;\n    } else {\n      simInfo = `\\\\n\\\\nActive simulators: ${uniqueSims.slice(0, 3).join(\", \")}${uniqueSims.length > 3 ? \"...\" : \"\"}`;\n    }\n  }\n  const choices = servers.map((s, i) => {\n    const shortRoot = s.root.replace(process.env.HOME || \"\", \"~\");\n    return `${i + 1}. ${shortRoot} (port ${s.port})`;\n  });\n  const choicesStr = choices.map((c) => `\"${c.replace(/\"/g, '\\\\\"')}\"`).join(\", \");\n  const prompt = `${bundleId} bundle requested${simInfo}\\\\n\\\\nWhich project should serve it?`;\n  const script = `choose from list {${choicesStr}} with title \"one daemon\" with prompt \"${prompt}\" default items {\"${choices[0].replace(/\"/g, '\\\\\"')}\"}`;\n  try {\n    const { stdout } = await execAsync(`osascript -e '${script}'`);\n    const result = stdout.trim();\n    if (result === \"false\" || !result) {\n      return null;\n    }\n    const match = result.match(/^(\\d+)\\./);\n    if (match) {\n      const index = parseInt(match[1], 10) - 1;\n      if (index >= 0 && index < servers.length) {\n        return { server: servers[index], remember: false };\n      }\n    }\n    return null;\n  } catch {\n    return null;\n  }\n}\nfunction showPicker(context) {\n  activePickerContext = context;\n  if (process.platform === \"darwin\") {\n    showMacOSDialog(context.bundleId, context.servers).then((result) => {\n      if (result) {\n        cleanupPicker();\n        context.onSelect(result.server, result.remember);\n      } else if (activePickerContext === context) {\n        showTerminalPicker(context);\n      }\n    });\n    return;\n  }\n  showTerminalPicker(context);\n}\nfunction showTerminalPicker(context) {\n  console.log(\"\\n\" + \"\\u2500\".repeat(60));\n  console.log(`\\u{1F500} ${context.bundleId} bundle requested`);\n  console.log(\"\\u2500\".repeat(60));\n  getBootedSimulators().then((sims) => {\n    if (sims.length > 0) {\n      const seen = /* @__PURE__ */ new Set();\n      const uniqueSims = [];\n      for (const sim of sims) {\n        const key = `${sim.name}-${sim.iosVersion || \"\"}`;\n        if (!seen.has(key)) {\n          seen.add(key);\n          uniqueSims.push(sim);\n        }\n      }\n      if (uniqueSims.length === 1) {\n        const sim = uniqueSims[0];\n        console.log(\n          `\nFrom: ${sim.name}${sim.iosVersion ? ` (iOS ${sim.iosVersion})` : \"\"}`\n        );\n      } else {\n        console.log(\"\\nActive simulators:\");\n        for (const sim of uniqueSims.slice(0, 5)) {\n          console.log(\n            `  \\u2022 ${sim.name}${sim.iosVersion ? ` (iOS ${sim.iosVersion})` : \"\"}`\n          );\n        }\n      }\n    }\n  });\n  console.log(\"\\nWhich project should serve it?\");\n  context.servers.forEach((server, i) => {\n    const shortRoot = server.root.replace(process.env.HOME || \"\", \"~\");\n    console.log(`  [${i + 1}] ${shortRoot} (port ${server.port})`);\n  });\n  console.log(\"\\nPress 1-\" + context.servers.length + \" to select\");\n  console.log(\"Or 'r' + number to remember (e.g., 'r1')\");\n  console.log(\"Press 'c' to cancel\\n\");\n  setupKeyboardInput();\n}\nfunction setupKeyboardInput() {\n  if (rl) return;\n  rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout\n  });\n  if (process.stdin.isTTY) {\n    process.stdin.setRawMode(true);\n  }\n  process.stdin.resume();\n  let buffer = \"\";\n  stdinDataListener = (key) => {\n    const str = key.toString();\n    if (str === \"\u0003\") {\n      cancelPicker();\n      return;\n    }\n    if (str === \"\\x1B\") {\n      cancelPicker();\n      return;\n    }\n    if (str === \"\\x7F\") {\n      buffer = buffer.slice(0, -1);\n      return;\n    }\n    if (str === \"\\r\" || str === \"\\n\") {\n      processInput(buffer);\n      buffer = \"\";\n      return;\n    }\n    buffer += str;\n    if (buffer.length === 1 && /^[1-9]$/.test(buffer)) {\n      processInput(buffer);\n      buffer = \"\";\n    } else if (buffer.length === 2 && /^r[1-9]$/i.test(buffer)) {\n      processInput(buffer);\n      buffer = \"\";\n    } else if (buffer.toLowerCase() === \"c\") {\n      cancelPicker();\n      buffer = \"\";\n    }\n  };\n  process.stdin.on(\"data\", stdinDataListener);\n  const signalHandler = () => {\n    cleanupPicker();\n    process.exit(0);\n  };\n  process.on(\"SIGINT\", signalHandler);\n  process.on(\"SIGTERM\", signalHandler);\n}\nfunction processInput(input) {\n  if (!activePickerContext) return;\n  const remember = input.toLowerCase().startsWith(\"r\");\n  const numStr = remember ? input.slice(1) : input;\n  const num = parseInt(numStr, 10);\n  if (isNaN(num) || num < 1 || num > activePickerContext.servers.length) {\n    console.log(`Invalid selection: ${input}`);\n    return;\n  }\n  const server = activePickerContext.servers[num - 1];\n  const context = activePickerContext;\n  cleanupPicker();\n  context.onSelect(server, remember);\n}\nfunction cancelPicker() {\n  const context = activePickerContext;\n  cleanupPicker();\n  if (context) {\n    context.onCancel();\n  }\n}\nfunction cleanupPicker() {\n  activePickerContext = null;\n  if (stdinDataListener) {\n    process.stdin.removeListener(\"data\", stdinDataListener);\n    stdinDataListener = null;\n  }\n  if (rl) {\n    rl.close();\n    rl = null;\n  }\n  if (process.stdin.isTTY) {\n    process.stdin.setRawMode(false);\n  }\n}\nlet pendingPickerResolvers = /* @__PURE__ */ new Map();\nfunction resolvePendingPicker(bundleId, serverId) {\n  const resolver = pendingPickerResolvers.get(bundleId);\n  if (!resolver || !activePickerContext) return false;\n  const server = activePickerContext.servers.find((s) => s.id === serverId);\n  if (!server) return false;\n  pendingPickerResolvers.delete(bundleId);\n  cleanupPicker();\n  resolver.resolve(server);\n  return true;\n}\nfunction pickServer(bundleId, servers) {\n  return new Promise((resolve, reject) => {\n    pendingPickerResolvers.set(bundleId, {\n      resolve: (server) => resolve({ server, remember: false }),\n      reject\n    });\n    showPicker({\n      bundleId,\n      servers,\n      onSelect: (server, remember) => {\n        pendingPickerResolvers.delete(bundleId);\n        resolve({ server, remember });\n      },\n      onCancel: () => {\n        pendingPickerResolvers.delete(bundleId);\n        reject(new Error(\"Selection cancelled\"));\n      }\n    });\n  });\n}\nexport {\n  getBootedSimulators,\n  pickServer,\n  resolvePendingPicker,\n  showPicker\n};\n//# sourceMappingURL=picker.js.map\n"],"mappings":"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"}