@juspay/shooter 1.14.0 → 1.16.0

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.
Files changed (151) hide show
  1. package/build/client/_app/immutable/assets/{0.BZLcOr5z.css → 0.DEfoFaGR.css} +1 -1
  2. package/build/client/_app/immutable/assets/0.DEfoFaGR.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.DEfoFaGR.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/Bkqjn62J.js +1 -0
  5. package/build/client/_app/immutable/chunks/Bkqjn62J.js.br +1 -0
  6. package/build/client/_app/immutable/chunks/Bkqjn62J.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{D8sAtVC-.js → DOHhmtDH.js} +1 -1
  8. package/build/client/_app/immutable/chunks/DOHhmtDH.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/DOHhmtDH.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{Bfg0k16X.js → DlS3abGJ.js} +1 -1
  11. package/build/client/_app/immutable/chunks/DlS3abGJ.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/DlS3abGJ.js.gz +0 -0
  13. package/build/client/_app/immutable/entry/{app.rri2K7zq.js → app.CSJG7N9H.js} +2 -2
  14. package/build/client/_app/immutable/entry/app.CSJG7N9H.js.br +0 -0
  15. package/build/client/_app/immutable/entry/app.CSJG7N9H.js.gz +0 -0
  16. package/build/client/_app/immutable/entry/start.CTt1901T.js +1 -0
  17. package/build/client/_app/immutable/entry/start.CTt1901T.js.br +2 -0
  18. package/build/client/_app/immutable/entry/start.CTt1901T.js.gz +0 -0
  19. package/build/client/_app/immutable/nodes/{0.DoDuvMbN.js → 0.qOL7xtFn.js} +1 -1
  20. package/build/client/_app/immutable/nodes/0.qOL7xtFn.js.br +0 -0
  21. package/build/client/_app/immutable/nodes/0.qOL7xtFn.js.gz +0 -0
  22. package/build/client/_app/immutable/nodes/{1.DZ0g9EOo.js → 1.Di708Ago.js} +1 -1
  23. package/build/client/_app/immutable/nodes/1.Di708Ago.js.br +0 -0
  24. package/build/client/_app/immutable/nodes/1.Di708Ago.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/{2.COrzaySY.js → 2.DSM1znqa.js} +1 -1
  26. package/build/client/_app/immutable/nodes/2.DSM1znqa.js.br +0 -0
  27. package/build/client/_app/immutable/nodes/2.DSM1znqa.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{3.sGijgjBd.js → 3.BPa5fh75.js} +1 -1
  29. package/build/client/_app/immutable/nodes/3.BPa5fh75.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/3.BPa5fh75.js.gz +0 -0
  31. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js +1 -0
  32. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js.br +0 -0
  33. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js.gz +0 -0
  34. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js +4 -0
  35. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js.br +0 -0
  36. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js +2 -0
  38. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js +2 -0
  41. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js.gz +0 -0
  43. package/build/client/_app/version.json +1 -1
  44. package/build/client/_app/version.json.br +0 -0
  45. package/build/client/_app/version.json.gz +0 -0
  46. package/build/server/chunks/{0-Cs7l_or5.js → 0-D8uPamNd.js} +3 -3
  47. package/build/server/chunks/{0-Cs7l_or5.js.map → 0-D8uPamNd.js.map} +1 -1
  48. package/build/server/chunks/{1-DrEnteaQ.js → 1-DhtioHbs.js} +2 -2
  49. package/build/server/chunks/{1-DrEnteaQ.js.map → 1-DhtioHbs.js.map} +1 -1
  50. package/build/server/chunks/{2-BxYq6tAd.js → 2-Cgh7ZFgE.js} +2 -2
  51. package/build/server/chunks/{2-BxYq6tAd.js.map → 2-Cgh7ZFgE.js.map} +1 -1
  52. package/build/server/chunks/{3-DvOZrxt7.js → 3-I6hnjssH.js} +2 -2
  53. package/build/server/chunks/{3-DvOZrxt7.js.map → 3-I6hnjssH.js.map} +1 -1
  54. package/build/server/chunks/{6-DyP4lraz.js → 6-bPDbH1_W.js} +2 -2
  55. package/build/server/chunks/{6-DyP4lraz.js.map → 6-bPDbH1_W.js.map} +1 -1
  56. package/build/server/chunks/{7-CS9SCFyS.js → 7-CpBrOkxQ.js} +2 -2
  57. package/build/server/chunks/{7-CS9SCFyS.js.map → 7-CpBrOkxQ.js.map} +1 -1
  58. package/build/server/chunks/{8-Np7VqiBA.js → 8-BRGAVfze.js} +2 -2
  59. package/build/server/chunks/{8-Np7VqiBA.js.map → 8-BRGAVfze.js.map} +1 -1
  60. package/build/server/chunks/{9-C55g3WsT.js → 9-C6xuAb_Y.js} +2 -2
  61. package/build/server/chunks/{9-C55g3WsT.js.map → 9-C6xuAb_Y.js.map} +1 -1
  62. package/build/server/chunks/{_server.ts-ByPExYfO.js → _server.ts-BLNDdFWC.js} +3 -3
  63. package/build/server/chunks/_server.ts-BLNDdFWC.js.map +1 -0
  64. package/build/server/chunks/{_server.ts-40c_epk8.js → _server.ts-BrRZXr-8.js} +5 -4
  65. package/build/server/chunks/_server.ts-BrRZXr-8.js.map +1 -0
  66. package/build/server/chunks/{_server.ts-BuYyCrnF.js → _server.ts-C6xbNz6d.js} +4 -3
  67. package/build/server/chunks/_server.ts-C6xbNz6d.js.map +1 -0
  68. package/build/server/chunks/{_server.ts-CjpQ10xh.js → _server.ts-CjK0g9dO.js} +18 -2
  69. package/build/server/chunks/_server.ts-CjK0g9dO.js.map +1 -0
  70. package/build/server/chunks/{_server.ts-0Xr2fWaq.js → _server.ts-Cq9_scaV.js} +17 -7
  71. package/build/server/chunks/_server.ts-Cq9_scaV.js.map +1 -0
  72. package/build/server/chunks/{_server.ts-CilRds58.js → _server.ts-D--_NXt2.js} +25 -16
  73. package/build/server/chunks/_server.ts-D--_NXt2.js.map +1 -0
  74. package/build/server/chunks/{_server.ts-2ixC-X3K.js → _server.ts-Dekgb6Hx.js} +4 -3
  75. package/build/server/chunks/_server.ts-Dekgb6Hx.js.map +1 -0
  76. package/build/server/chunks/opencode-db-path-CRgzBK5U.js +402 -0
  77. package/build/server/chunks/opencode-db-path-CRgzBK5U.js.map +1 -0
  78. package/build/server/chunks/{pty-manager-TyMUpDA9.js → pty-manager-aFpChJah.js} +35 -2
  79. package/build/server/chunks/pty-manager-aFpChJah.js.map +1 -0
  80. package/build/server/index.js +1 -1
  81. package/build/server/index.js.map +1 -1
  82. package/build/server/manifest.js +16 -16
  83. package/build/server/manifest.js.map +1 -1
  84. package/package.json +2 -2
  85. package/server.ts +12 -0
  86. package/src/lib/modules/client/common/index.ts +1 -0
  87. package/src/lib/modules/client/common/provider.ts +30 -0
  88. package/src/lib/modules/client/terminal/LaunchSheet.svelte +2 -0
  89. package/src/lib/modules/server/sessions/codex-parser.ts +286 -0
  90. package/src/lib/modules/server/sessions/codex-reader.ts +293 -0
  91. package/src/lib/modules/server/sessions/process-detector.ts +23 -0
  92. package/src/lib/modules/server/terminal/codex-watcher.ts +179 -0
  93. package/src/lib/modules/server/terminal/pty-manager.ts +41 -0
  94. package/src/lib/theme.css +21 -1
  95. package/src/lib/types/codex.ts +21 -0
  96. package/src/lib/types/generated/Sessions.ts +5 -1
  97. package/src/lib/types/index.ts +1 -0
  98. package/src/lib/types/server.ts +18 -5
  99. package/src/lib/types/sessions.ts +1 -1
  100. package/src/routes/api/device-token/+server.ts +7 -3
  101. package/src/routes/api/sessions/+server.ts +27 -15
  102. package/src/routes/api/sessions/connect/+server.ts +19 -11
  103. package/src/routes/api/terminals/+server.ts +1 -1
  104. package/src/routes/project/+page.svelte +7 -23
  105. package/src/routes/session/[id]/+page.svelte +3 -3
  106. package/src/routes/terminals/+page.svelte +1 -1
  107. package/src/routes/terminals/[id]/+page.svelte +1 -1
  108. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.br +0 -0
  109. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.gz +0 -0
  110. package/build/client/_app/immutable/chunks/Bfg0k16X.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/Bfg0k16X.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/CTchCNsn.js +0 -1
  113. package/build/client/_app/immutable/chunks/CTchCNsn.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/CTchCNsn.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/D8sAtVC-.js.br +0 -0
  116. package/build/client/_app/immutable/chunks/D8sAtVC-.js.gz +0 -0
  117. package/build/client/_app/immutable/entry/app.rri2K7zq.js.br +0 -0
  118. package/build/client/_app/immutable/entry/app.rri2K7zq.js.gz +0 -0
  119. package/build/client/_app/immutable/entry/start.BRqv-XKD.js +0 -1
  120. package/build/client/_app/immutable/entry/start.BRqv-XKD.js.br +0 -2
  121. package/build/client/_app/immutable/entry/start.BRqv-XKD.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/0.DoDuvMbN.js.br +0 -0
  123. package/build/client/_app/immutable/nodes/0.DoDuvMbN.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/1.DZ0g9EOo.js.br +0 -0
  125. package/build/client/_app/immutable/nodes/1.DZ0g9EOo.js.gz +0 -0
  126. package/build/client/_app/immutable/nodes/2.COrzaySY.js.br +0 -0
  127. package/build/client/_app/immutable/nodes/2.COrzaySY.js.gz +0 -0
  128. package/build/client/_app/immutable/nodes/3.sGijgjBd.js.br +0 -0
  129. package/build/client/_app/immutable/nodes/3.sGijgjBd.js.gz +0 -0
  130. package/build/client/_app/immutable/nodes/6.DfVtwT6x.js +0 -1
  131. package/build/client/_app/immutable/nodes/6.DfVtwT6x.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/6.DfVtwT6x.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/7.DFkQ9bmS.js +0 -4
  134. package/build/client/_app/immutable/nodes/7.DFkQ9bmS.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/7.DFkQ9bmS.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/8.BkFDeNg9.js +0 -2
  137. package/build/client/_app/immutable/nodes/8.BkFDeNg9.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/8.BkFDeNg9.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/9.g02G0hlL.js +0 -2
  140. package/build/client/_app/immutable/nodes/9.g02G0hlL.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/9.g02G0hlL.js.gz +0 -0
  142. package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +0 -1
  143. package/build/server/chunks/_server.ts-2ixC-X3K.js.map +0 -1
  144. package/build/server/chunks/_server.ts-40c_epk8.js.map +0 -1
  145. package/build/server/chunks/_server.ts-BuYyCrnF.js.map +0 -1
  146. package/build/server/chunks/_server.ts-ByPExYfO.js.map +0 -1
  147. package/build/server/chunks/_server.ts-CilRds58.js.map +0 -1
  148. package/build/server/chunks/_server.ts-CjpQ10xh.js.map +0 -1
  149. package/build/server/chunks/opencode-db-path-DcfhJtJy.js +0 -15
  150. package/build/server/chunks/opencode-db-path-DcfhJtJy.js.map +0 -1
  151. package/build/server/chunks/pty-manager-TyMUpDA9.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-2ixC-X3K.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n return json({\n args: terminal.args,\n clientCount: terminal.clients.size,\n command: terminal.command,\n createdAt: terminal.createdAt.toISOString(),\n cwd: terminal.cwd,\n exitCode: terminal.exitCode,\n exitedAt: terminal.exitedAt?.toISOString() ?? null,\n id: terminal.id,\n lastOutput: lastScrollbackLine(terminal.scrollback),\n pid: terminal.pid,\n sessionWs: `/ws/session/${terminal.id}`,\n status: terminal.status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ws: `/ws/terminal/${terminal.id}`\n });\n } catch (error) {\n console.error(\"[terminals] Failed to get terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to get terminal\" }, { status: 500 });\n }\n};\nconst DELETE = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n if (terminal.status === \"exited\") {\n ptyManager.remove(params.id);\n console.log(`[terminals] Removed exited terminal ${params.id}`);\n return json({\n removed: true,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n ptyManager.kill(params.id);\n console.log(`[terminals] Killed terminal ${params.id} (pid=${terminal.pid})`);\n return json({\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to kill terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to kill terminal\" }, { status: 500 });\n }\n};\nexport {\n DELETE,\n GET\n};\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-40c_epk8.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { realpathSync, statSync } from \"fs\";\nimport { basename, relative, isAbsolute } from \"path\";\nconst ALLOWED_COMMANDS = [\"zsh\", \"bash\", \"sh\", \"fish\", \"claude\", \"opencode\"];\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminals = ptyManager.list().map((t) => ({\n args: t.args,\n clientCount: t.clients.size,\n command: t.command,\n createdAt: t.createdAt.toISOString(),\n currentCwd: t.currentCwd,\n cwd: t.cwd,\n exitCode: t.exitCode,\n exitedAt: t.exitedAt?.toISOString() ?? null,\n id: t.id,\n isActive: t.isActive,\n lastOutput: lastScrollbackLine(t.scrollback),\n pid: t.pid,\n status: t.status\n }));\n return json({\n count: terminals.length,\n terminals,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to list terminals:\", toErrorMessage(error));\n return json({ error: \"Failed to list terminals\" }, { status: 500 });\n }\n};\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { args, cols, command, cwd, rows } = body;\n if (!command) {\n return json({ error: \"command is required\" }, { status: 400 });\n }\n const commandBasename = basename(command);\n if (!ALLOWED_COMMANDS.includes(commandBasename)) {\n return json(\n { error: `Command not allowed. Allowed: ${ALLOWED_COMMANDS.join(\", \")}` },\n { status: 400 }\n );\n }\n if (!cwd) {\n return json({ error: \"cwd is required\" }, { status: 400 });\n }\n let realCwd;\n try {\n realCwd = realpathSync(cwd);\n if (!statSync(realCwd).isDirectory()) {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n } catch {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n const home = process.env.HOME || \"\";\n if (home) {\n const rel = relative(home, realCwd);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n return json({ error: \"Working directory must be under home directory\" }, { status: 400 });\n }\n }\n if (args !== void 0 && !Array.isArray(args)) {\n return json({ error: \"args must be an array of strings\" }, { status: 400 });\n }\n if (args && !args.every((a) => typeof a === \"string\")) {\n return json({ error: \"All args must be strings\" }, { status: 400 });\n }\n if (cols !== void 0 && (typeof cols !== \"number\" || cols < 1)) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (rows !== void 0 && (typeof rows !== \"number\" || rows < 1)) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n const terminal = await ptyManager.create(command, args ?? [], realCwd, cols ?? 80, rows ?? 24);\n console.log(\n `[terminals] Created terminal ${terminal.id} (pid=${terminal.pid}, command=${command})`\n );\n return json(\n {\n command: terminal.command,\n createdAt: terminal.createdAt instanceof Date ? terminal.createdAt.toISOString() : terminal.createdAt,\n cwd: terminal.cwd,\n id: terminal.id,\n pid: terminal.pid,\n sessionWs: `/ws/session/${terminal.id}`,\n ws: `/ws/terminal/${terminal.id}`\n },\n { status: 201 }\n );\n } catch (error) {\n console.error(\"[terminals] Failed to create terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to create terminal\" }, { status: 500 });\n }\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAMA,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC5E,SAAS,kBAAkB,CAAC,UAAU,EAAE;AACxC,EAAE,IAAI,CAAC,UAAU,EAAE;AACnB,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AAChD,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC9C,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAChC,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC/B,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,IAAI;AACb;AACK,MAAC,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK;AAC7B,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACpD,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI;AAClB,MAAM,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;AACjC,MAAM,OAAO,EAAE,CAAC,CAAC,OAAO;AACxB,MAAM,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;AAC1C,MAAM,UAAU,EAAE,CAAC,CAAC,UAAU;AAC9B,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG;AAChB,MAAM,QAAQ,EAAE,CAAC,CAAC,QAAQ;AAC1B,MAAM,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,IAAI;AACjD,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE;AACd,MAAM,QAAQ,EAAE,CAAC,CAAC,QAAQ;AAC1B,MAAM,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;AAClD,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG;AAChB,MAAM,MAAM,EAAE,CAAC,CAAC;AAChB,KAAK,CAAC,CAAC;AACP,IAAI,OAAO,IAAI,CAAC;AAChB,MAAM,KAAK,EAAE,SAAS,CAAC,MAAM;AAC7B,MAAM,SAAS;AACf,MAAM,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AACzD,KAAK,CAAC;AACN,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AACjF,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACvE,EAAE;AACF;AACK,MAAC,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK;AACpC,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,IAAI,IAAI;AACV,EAAE,IAAI;AACN,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;AAC/B,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3E,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI;AACnD,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpE,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;AAC7C,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AACrD,MAAM,OAAO,IAAI;AACjB,QAAQ,EAAE,KAAK,EAAE,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AACjF,QAAQ,EAAE,MAAM,EAAE,GAAG;AACrB,OAAO;AACP,IAAI;AACJ,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAChE,IAAI;AACJ,IAAI,IAAI,OAAO;AACf,IAAI,IAAI;AACR,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC;AACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;AAC5C,QAAQ,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC1E,MAAM;AACN,IAAI,CAAC,CAAC,MAAM;AACZ,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxE,IAAI;AACJ,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;AACvC,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;AACzC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;AACnD,QAAQ,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACjG,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACjD,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACjF,IAAI;AACJ,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE;AAC3D,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzE,IAAI;AACJ,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE;AACnE,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,IAAI;AACJ,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE;AACnE,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;AAClG,IAAI,OAAO,CAAC,GAAG;AACf,MAAM,CAAC,6BAA6B,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC5F,KAAK;AACL,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,OAAO,EAAE,QAAQ,CAAC,OAAO;AACjC,QAAQ,SAAS,EAAE,QAAQ,CAAC,SAAS,YAAY,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,SAAS;AAC7G,QAAQ,GAAG,EAAE,QAAQ,CAAC,GAAG;AACzB,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE;AACvB,QAAQ,GAAG,EAAE,QAAQ,CAAC,GAAG;AACzB,QAAQ,SAAS,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/C,QAAQ,EAAE,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;AACxC,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AAClF,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxE,EAAE;AACF;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-BuYyCrnF.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/resize/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nconst POST = async ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { cols, rows } = body;\n if (cols === void 0 || rows === void 0) {\n return json({ error: \"cols and rows are required\" }, { status: 400 });\n }\n if (typeof cols !== \"number\" || cols < 1) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (typeof rows !== \"number\" || rows < 1) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n if (cols > 500 || rows > 200) {\n return json({ error: \"cols must be <= 500 and rows must be <= 200\" }, { status: 400 });\n }\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n if (terminal.status === \"exited\") {\n return json({ error: \"Terminal already exited\" }, { status: 409 });\n }\n ptyManager.resize(params.id, cols, rows);\n console.log(`[terminals] Resized terminal ${params.id} to ${cols}x${rows}`);\n return json({\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to resize terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to resize terminal\" }, { status: 500 });\n }\n};\nexport {\n POST\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIK,MAAC,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;AAC5C,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,IAAI,IAAI;AACV,EAAE,IAAI;AACN,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;AAC/B,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3E,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI;AAC/B,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE;AAC5C,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3E,IAAI;AACJ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,EAAE;AAC9C,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,IAAI;AACJ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,EAAE;AAC9C,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,IAAI;AACJ,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE;AAClC,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC5F,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9C,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnE,IAAI;AACJ,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;AACtC,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxE,IAAI;AACJ,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC;AAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,6BAA6B,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,IAAI,OAAO,IAAI,CAAC;AAChB,MAAM,OAAO,EAAE,IAAI;AACnB,MAAM,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AACzD,KAAK,CAAC;AACN,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AAClF,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxE,EAAE;AACF;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-ByPExYfO.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/device-token/_server.ts.js"],"sourcesContent":["import { b as private_env } from \"../../../../chunks/shared-server.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nconst TOKENS_DIR = join(homedir(), \".shooter\");\nconst TOKENS_FILE = join(TOKENS_DIR, \"device-tokens.json\");\nfunction readTokens() {\n try {\n if (existsSync(TOKENS_FILE)) {\n const parsed = JSON.parse(readFileSync(TOKENS_FILE, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed;\n }\n } catch {\n }\n return {};\n}\nfunction writeTokens(tokens) {\n if (!existsSync(TOKENS_DIR)) {\n mkdirSync(TOKENS_DIR, { mode: 448, recursive: true });\n }\n writeFileSync(TOKENS_FILE, JSON.stringify(tokens, null, 2), { encoding: \"utf-8\", mode: 384 });\n}\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n const parsed = await request.json();\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return json({ error: \"Invalid JSON body: expected an object\" }, { status: 400 });\n }\n body = parsed;\n } catch {\n return json({ error: \"Invalid JSON body\" }, { status: 400 });\n }\n const platform = body.platform;\n if (!platform || platform !== \"ios\" && platform !== \"android\") {\n return json(\n { error: 'Missing or invalid platform (must be \"ios\" or \"android\")' },\n { status: 400 }\n );\n }\n const rawToken = body.deviceToken || body.token;\n if (!rawToken || typeof rawToken !== \"string\" || rawToken.trim().length === 0) {\n return json({ error: \"Missing device token (deviceToken or token)\" }, { status: 400 });\n }\n const token = rawToken.trim();\n const tokens = readTokens();\n tokens[platform] = token;\n writeTokens(tokens);\n if (platform === \"ios\") {\n private_env.DEVICE_TOKEN = token;\n }\n console.log(`[device-token] Registered ${platform} token (length: ${token.length})`);\n return json({\n platform,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-CilRds58.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/sessions/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport Database from \"better-sqlite3\";\nimport { r as resolveOpenCodeDbPath } from \"../../../../chunks/opencode-db-path.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction extractToolResultText(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n return content.filter((c) => isRecord(c) && c.type === \"text\").map((c) => {\n const text = c.text;\n return typeof text === \"string\" ? text : \"\";\n }).join(\"\\n\");\n }\n return \"\";\n}\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction str(obj, key) {\n const v = obj[key];\n return typeof v === \"string\" ? v : \"\";\n}\nfunction toContentBlocks(raw) {\n if (Array.isArray(raw)) {\n return raw.filter((item) => isRecord(item));\n }\n if (isRecord(raw)) {\n return [raw];\n }\n return [];\n}\nconst SKIP_EVENT_TYPES = /* @__PURE__ */ new Set([\n \"config\",\n \"heartbeat\",\n \"metadata\",\n \"result\",\n \"summary\",\n \"system\"\n]);\nfunction parseAssistantBlock(block) {\n if (!block || typeof block !== \"object\") {\n return null;\n }\n switch (block.type) {\n case \"text\":\n return { content: block.text || \"\", type: \"text\" };\n case \"thinking\":\n return { content: block.thinking || \"\", type: \"thinking\" };\n case \"tool_use\":\n return {\n id: block.id || \"\",\n input: block.input || {},\n toolName: block.name || \"Unknown\",\n type: \"tool_use\"\n };\n default:\n return null;\n }\n}\nfunction parseJsonlLine(line, assistantTurns, messageIndex) {\n const messages = [];\n const assistantCompleted = [];\n const entry = JSON.parse(line);\n if (!isRecord(entry)) {\n return { assistantCompleted, messages };\n }\n const entryType = str(entry, \"type\");\n if (SKIP_EVENT_TYPES.has(entryType)) {\n return { assistantCompleted, messages };\n }\n const entryTimestamp = str(entry, \"timestamp\");\n const entryUuid = str(entry, \"uuid\");\n if (entryType === \"user\") {\n const msg = isRecord(entry.message) ? entry.message : null;\n if (!msg?.content) {\n return { assistantCompleted, messages };\n }\n const parts = [];\n const blocks = toContentBlocks(msg.content);\n if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (typeof item === \"string\") {\n parts.push({ content: item, type: \"text\" });\n }\n }\n } else if (typeof msg.content === \"string\") {\n parts.push({ content: msg.content, type: \"text\" });\n }\n for (const block of blocks) {\n const blockType = str(block, \"type\");\n if (!blockType) {\n continue;\n }\n if (blockType === \"text\") {\n parts.push({ content: str(block, \"text\"), type: \"text\" });\n } else if (blockType === \"tool_result\") {\n let output = extractToolResultText(block.content);\n const toolUseResult = isRecord(entry.toolUseResult) ? entry.toolUseResult : null;\n if (toolUseResult?.content !== void 0) {\n output = extractToolResultText(toolUseResult.content);\n }\n parts.push({\n isError: typeof block.is_error === \"boolean\" ? block.is_error : false,\n output: output.slice(0, 2e3),\n toolUseId: str(block, \"tool_use_id\"),\n type: \"tool_result\"\n });\n }\n }\n if (parts.length > 0 && parts.some((p) => p.type === \"text\")) {\n messages.push({\n id: entryUuid || `user-${messageIndex}`,\n parts: parts.filter((p) => p.type === \"text\"),\n role: \"user\",\n timestamp: entryTimestamp\n });\n }\n const toolResults = parts.filter((p) => p.type === \"tool_result\");\n if (toolResults.length > 0) {\n messages.push({\n id: `tool-result-${entryUuid || messageIndex}`,\n parts: toolResults,\n role: \"system\",\n timestamp: entryTimestamp\n });\n }\n } else if (entryType === \"assistant\") {\n const msg = isRecord(entry.message) ? entry.message : null;\n if (!msg?.content) {\n return { assistantCompleted, messages };\n }\n const blocks = toContentBlocks(msg.content);\n const msgId = str(msg, \"id\") || entryUuid;\n for (const block of blocks) {\n const part = parseAssistantBlock(block);\n if (!part) {\n continue;\n }\n if (!assistantTurns.has(msgId)) {\n assistantTurns.set(msgId, { parts: [], timestamp: entryTimestamp });\n }\n const turn = assistantTurns.get(msgId);\n if (turn) {\n turn.parts.push(part);\n }\n }\n if (msg.stop_reason) {\n const turn = assistantTurns.get(msgId);\n if (turn && turn.parts.length > 0) {\n assistantCompleted.push({\n id: msgId,\n parts: turn.parts,\n role: \"assistant\",\n timestamp: turn.timestamp\n });\n assistantTurns.delete(msgId);\n }\n }\n }\n return { assistantCompleted, messages };\n}\nfunction parseJsonlText(text, assistantTurns, startIndex) {\n const lines = text.split(\"\\n\").filter((line) => line.trim());\n const allMessages = [];\n let idx = startIndex;\n for (const line of lines) {\n try {\n const { assistantCompleted, messages } = parseJsonlLine(line, assistantTurns, idx);\n allMessages.push(...messages, ...assistantCompleted);\n idx++;\n } catch {\n }\n }\n return allMessages;\n}\nconst SYSTEM_TAG_PREFIXES = [\n \"<local-command\",\n \"<command-name>\",\n \"<command-message>\",\n \"<command-args>\",\n \"<local-command-stdout>\",\n \"<local-command-caveat>\",\n \"<system-reminder>\",\n \"<task-notification>\"\n];\nfunction extractContentText(content) {\n if (typeof content === \"string\") {\n return content.trim();\n }\n if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === \"string\" && b.trim()) {\n return b.trim();\n }\n if (typeof b === \"object\" && b !== null) {\n const block = b;\n if (block.type === \"text\" && typeof block.text === \"string\" && block.text.trim()) {\n return block.text.trim();\n }\n }\n }\n }\n return \"\";\n}\nfunction findFirstUserPrompt(content) {\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) {\n continue;\n }\n try {\n const entry = JSON.parse(line);\n if (entry.type !== \"user\") {\n continue;\n }\n const msg = entry.message;\n if (!msg?.content) {\n continue;\n }\n const text = extractContentText(msg.content);\n if (!text || SYSTEM_TAG_PREFIXES.some((p) => text.startsWith(p))) {\n continue;\n }\n return text;\n } catch {\n continue;\n }\n }\n return \"\";\n}\nfunction shortHash$1(input) {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\").slice(0, 8);\n}\nconst CLAUDE_PROJECTS_DIR = path.join(process.env.HOME || \"\", \".claude\", \"projects\");\nfunction getSessionConversation(sessionId, offset = 0, limit = 100, projectId) {\n const projectDir = projectId ? path.join(CLAUDE_PROJECTS_DIR, projectId) : getProjectDir();\n const jsonlPath = path.join(projectDir, `${sessionId}.jsonl`);\n if (!fs.existsSync(jsonlPath)) {\n return [];\n }\n try {\n const raw = fs.readFileSync(jsonlPath, \"utf-8\");\n const assistantTurns = /* @__PURE__ */ new Map();\n const messages = parseJsonlText(raw, assistantTurns, 0);\n for (const [msgId, turn] of assistantTurns) {\n if (turn.parts.length > 0) {\n messages.push({\n id: msgId,\n parts: turn.parts,\n role: \"assistant\",\n timestamp: turn.timestamp\n });\n }\n }\n const seenIds = /* @__PURE__ */ new Set();\n const deduped = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n if (!seenIds.has(messages[i].id)) {\n seenIds.add(messages[i].id);\n deduped.push(messages[i]);\n }\n }\n deduped.reverse();\n if (offset === 0 && deduped.length > limit) {\n let startIdx = deduped.length - limit;\n while (startIdx > 0 && startIdx < deduped.length && deduped[startIdx].role !== \"user\") {\n startIdx--;\n }\n return deduped.slice(startIdx);\n }\n return deduped.slice(offset, offset + limit);\n } catch (error) {\n console.error(\"[sessions] Failed to parse session JSONL:\", error);\n return [];\n }\n}\nfunction listProjectsWithSessions() {\n if (!fs.existsSync(CLAUDE_PROJECTS_DIR)) {\n return [];\n }\n let projectDirs;\n try {\n projectDirs = fs.readdirSync(CLAUDE_PROJECTS_DIR).filter((d) => {\n const fullPath = path.join(CLAUDE_PROJECTS_DIR, d);\n try {\n return fs.statSync(fullPath).isDirectory();\n } catch {\n return false;\n }\n });\n } catch {\n return [];\n }\n const projects = [];\n for (const dir of projectDirs) {\n const projectDir = path.join(CLAUDE_PROJECTS_DIR, dir);\n const sessions = listSessionsForProject(projectDir);\n if (sessions.length === 0) {\n continue;\n }\n sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n const realPath = sessions.find((s) => s.projectPath && !s.projectPath.includes(\".claude/projects\"))?.projectPath || readCwdFromProjectDir(projectDir, sessions) || decodeClaudeProjectDir(dir) || (dir.startsWith(\"-\") ? dir.replace(/-/g, \"/\") : `/${dir.replace(/-/g, \"/\")}`);\n const pathSegments = realPath.split(\"/\").filter(Boolean);\n const projectName = pathSegments.slice(-2).join(\"/\");\n projects.push({\n fullPath: realPath,\n id: shortHash$1(realPath),\n lastModified: sessions[0]?.modified || \"\",\n name: projectName,\n sessionCount: sessions.length,\n sessions\n });\n }\n return projects.sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n}\nfunction bytesReadEnded(chunk) {\n return chunk.length > 0 && chunk.charCodeAt(chunk.length - 1) === 10;\n}\nfunction cleanTitle(prompt) {\n let cleaned = prompt.replace(/<command-message>.*?<\\/command-message>/gs, \"\").replace(/<command-name>.*?<\\/command-name>/gs, \"\").replace(/<command-args>.*?<\\/command-args>/gs, \"\").replace(/<local-command-caveat>.*?<\\/local-command-caveat>/gs, \"\").replace(/<local-command-stdout>.*?<\\/local-command-stdout>/gs, \"\").replace(/<system-reminder>.*?<\\/system-reminder>/gs, \"\").replace(/<task-notification>.*?<\\/task-notification>/gs, \"\");\n let prev = \"\";\n while (prev !== cleaned) {\n prev = cleaned;\n cleaned = cleaned.replace(/<[^>]*>/g, \"\").replace(/</g, \"\");\n }\n cleaned = cleaned.trim();\n if (!cleaned) {\n return \"Untitled Session\";\n }\n const firstLine = cleaned.split(\"\\n\")[0].trim();\n if (!firstLine) {\n return \"Untitled Session\";\n }\n if (firstLine.length > 80) {\n return `${firstLine.slice(0, 77)}...`;\n }\n return firstLine;\n}\nfunction decodeClaudeProjectDir(encoded) {\n if (!encoded.startsWith(\"-\")) {\n return null;\n }\n const parts = encoded.slice(1).split(\"-\");\n if (parts.length === 0) {\n return null;\n }\n let currentPath = \"/\";\n let i = 0;\n while (i < parts.length) {\n let matchedTo = -1;\n for (let j = parts.length; j > i; j--) {\n const segment = parts.slice(i, j).join(\"-\");\n const candidate = path.join(currentPath, segment);\n try {\n if (fs.statSync(candidate).isDirectory()) {\n matchedTo = j;\n break;\n }\n } catch {\n }\n }\n if (matchedTo === -1) {\n return null;\n }\n currentPath = path.join(currentPath, parts.slice(i, matchedTo).join(\"-\"));\n i = matchedTo;\n }\n return currentPath;\n}\nfunction getProjectDir() {\n const projectPath = process.cwd();\n const encoded = projectPath.replace(/\\//g, \"-\");\n return path.join(CLAUDE_PROJECTS_DIR, encoded);\n}\nfunction listSessionsForProject(projectDir) {\n const indexPath = path.join(projectDir, \"sessions-index.json\");\n const hasIndex = fs.existsSync(indexPath);\n const indexedIds = /* @__PURE__ */ new Set();\n const sessions = [];\n if (hasIndex) {\n try {\n const raw = fs.readFileSync(indexPath, \"utf-8\");\n const index = JSON.parse(raw);\n for (const entry of index.entries) {\n if (entry.isSidechain) {\n continue;\n }\n const jsonlFile = path.join(projectDir, `${entry.sessionId}.jsonl`);\n if (!fs.existsSync(jsonlFile)) {\n continue;\n }\n indexedIds.add(entry.sessionId);\n sessions.push({\n created: entry.created || \"\",\n gitBranch: entry.gitBranch || \"\",\n id: entry.sessionId,\n messageCount: entry.messageCount || 0,\n modified: entry.modified || \"\",\n projectPath: entry.projectPath || \"\",\n source: \"claude-code\",\n summary: entry.summary || \"\",\n title: cleanTitle(entry.firstPrompt || entry.summary || \"Untitled Session\")\n });\n }\n } catch (error) {\n console.error(\"[sessions] Failed to read sessions index:\", error);\n }\n }\n try {\n const files = fs.readdirSync(projectDir);\n for (const file of files) {\n if (!file.endsWith(\".jsonl\")) {\n continue;\n }\n const sessionId = file.replace(\".jsonl\", \"\");\n if (indexedIds.has(sessionId)) {\n continue;\n }\n const filePath = path.join(projectDir, file);\n const stat = fs.statSync(filePath);\n let firstPrompt = \"Active Session\";\n let messageCount = 0;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n let countPos = 0;\n while (countPos < content.length) {\n const nl = content.indexOf(\"\\n\", countPos);\n const lineEnd = nl === -1 ? content.length : nl;\n const line = content.substring(countPos, lineEnd);\n if (line.includes('\"type\":\"user\"') || line.includes('\"type\":\"assistant\"')) {\n messageCount++;\n }\n if (nl === -1) {\n break;\n }\n countPos = nl + 1;\n }\n const prompt = findFirstUserPrompt(content);\n if (prompt) {\n firstPrompt = prompt;\n }\n } catch {\n }\n sessions.push({\n created: stat.birthtime.toISOString(),\n gitBranch: \"\",\n id: sessionId,\n messageCount,\n modified: stat.mtime.toISOString(),\n projectPath: \"\",\n source: \"claude-code\",\n summary: \"\",\n title: cleanTitle(firstPrompt)\n });\n }\n } catch {\n }\n return sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n}\nfunction readCwdFromProjectDir(projectDir, sessions) {\n const READ_BYTES = 65536;\n for (const session of sessions) {\n try {\n const filePath = path.join(projectDir, `${session.id}.jsonl`);\n if (!fs.existsSync(filePath)) {\n continue;\n }\n const fd = fs.openSync(filePath, \"r\");\n let chunk;\n try {\n const buf = Buffer.alloc(READ_BYTES);\n const bytesRead = fs.readSync(fd, buf, 0, READ_BYTES, 0);\n chunk = buf.toString(\"utf-8\", 0, bytesRead);\n } finally {\n fs.closeSync(fd);\n }\n const lines = chunk.split(\"\\n\");\n const completeLines = bytesReadEnded(chunk) ? lines : lines.slice(0, -1);\n for (const line of completeLines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const entry = JSON.parse(line);\n if (typeof entry.cwd === \"string\" && entry.cwd) {\n return entry.cwd;\n }\n } catch {\n }\n }\n } catch {\n }\n }\n return \"\";\n}\nfunction shortHash(input) {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\").slice(0, 8);\n}\nconst OPENCODE_DB_PATH = resolveOpenCodeDbPath();\nfunction getOpenCodeConversation(sessionId, offset = 0, limit = 200) {\n const db = getDb();\n if (!db) {\n return [];\n }\n try {\n const messages = db.prepare(\n `\n SELECT id, session_id, time_created, data FROM (\n SELECT id, session_id, time_created, data\n FROM message\n WHERE session_id = ?\n ORDER BY time_created DESC\n LIMIT ? OFFSET ?\n ) ORDER BY time_created ASC\n `\n ).all(sessionId, limit, offset);\n const messageIds = messages.map((m) => m.id);\n if (messageIds.length === 0) {\n return [];\n }\n const placeholders = messageIds.map(() => \"?\").join(\",\");\n const parts = db.prepare(\n `\n SELECT id, message_id, time_created, data\n FROM part\n WHERE message_id IN (${placeholders})\n ORDER BY time_created ASC\n `\n ).all(...messageIds);\n const partsByMessage = /* @__PURE__ */ new Map();\n for (const part of parts) {\n if (!partsByMessage.has(part.message_id)) {\n partsByMessage.set(part.message_id, []);\n }\n const bucket = partsByMessage.get(part.message_id);\n if (bucket) {\n bucket.push(part);\n }\n }\n const result = [];\n for (const msg of messages) {\n let msgData = {};\n try {\n msgData = JSON.parse(msg.data);\n } catch {\n }\n const role = msgData.role === \"user\" ? \"user\" : \"assistant\";\n const msgParts = partsByMessage.get(msg.id) || [];\n const convertedParts = [];\n for (const part of msgParts) {\n let partData = {};\n try {\n partData = JSON.parse(part.data);\n } catch {\n continue;\n }\n const converted = convertOpenCodePart(partData);\n if (converted) {\n convertedParts.push(converted);\n }\n }\n if (convertedParts.length > 0) {\n result.push({\n id: msg.id,\n parts: convertedParts,\n role,\n timestamp: new Date(msg.time_created).toISOString()\n });\n }\n }\n return result;\n } catch (error) {\n console.error(\"[opencode] Failed to read conversation:\", error);\n return [];\n } finally {\n db.close();\n }\n}\nfunction listOpenCodeProjects() {\n const db = getDb();\n if (!db) {\n return [];\n }\n try {\n const sessions = db.prepare(\n `\n SELECT id, directory, title, slug, time_created, time_updated, parent_id\n FROM session\n WHERE time_archived IS NULL OR time_archived = 0\n ORDER BY time_updated DESC\n `\n ).all();\n const msgCounts = db.prepare(`SELECT session_id, COUNT(*) as count FROM message GROUP BY session_id`).all();\n const msgCountMap = new Map(msgCounts.map((r) => [r.session_id, r.count]));\n const projectMap = /* @__PURE__ */ new Map();\n for (const row of sessions) {\n const dir = row.directory || \"unknown\";\n if (!projectMap.has(dir)) {\n projectMap.set(dir, []);\n }\n const sessionInfo = {\n created: new Date(row.time_created).toISOString(),\n gitBranch: \"\",\n id: row.id,\n messageCount: msgCountMap.get(row.id) || 0,\n modified: new Date(row.time_updated).toISOString(),\n projectPath: dir,\n source: \"opencode\",\n summary: \"\",\n title: row.title || row.slug || \"Untitled Session\"\n };\n const bucket = projectMap.get(dir);\n if (bucket) {\n bucket.push(sessionInfo);\n }\n }\n const projects = [];\n for (const [dir, dirSessions] of projectMap) {\n const pathSegments = dir.split(\"/\").filter(Boolean);\n const projectName = pathSegments.slice(-2).join(\"/\");\n dirSessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n projects.push({\n fullPath: dir,\n id: shortHash(dir),\n lastModified: dirSessions[0]?.modified || \"\",\n name: `${projectName} (OpenCode)`,\n sessionCount: dirSessions.length,\n sessions: dirSessions\n });\n }\n return projects.sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n } catch (error) {\n console.error(\"[opencode] Failed to read sessions:\", error);\n return [];\n } finally {\n db.close();\n }\n}\nfunction convertOpenCodePart(data) {\n const type = data.type;\n switch (type) {\n case \"reasoning\":\n return {\n content: data.text || \"\",\n type: \"thinking\"\n };\n case \"text\":\n return {\n content: data.text || \"\",\n type: \"text\"\n };\n case \"tool\": {\n const state = data.state;\n return {\n id: data.callID || data.id || \"\",\n input: state?.input || {},\n toolName: data.tool || \"Unknown\",\n type: \"tool_use\"\n };\n }\n default:\n return null;\n }\n}\nfunction getDb() {\n if (!fs.existsSync(OPENCODE_DB_PATH)) {\n return null;\n }\n try {\n return new Database(OPENCODE_DB_PATH, { readonly: true });\n } catch {\n return null;\n }\n}\nlet cachedProjects = null;\nlet cacheTimestamp = 0;\nconst CACHE_TTL_MS = 5e3;\nfunction getMergedProjects() {\n const now = Date.now();\n if (cachedProjects && now - cacheTimestamp < CACHE_TTL_MS) {\n return cachedProjects;\n }\n const claudeProjects = listProjectsWithSessions();\n const openCodeProjects = listOpenCodeProjects();\n const projectsByPath = /* @__PURE__ */ new Map();\n for (const p of claudeProjects) {\n projectsByPath.set(p.fullPath, { ...p });\n }\n for (const op of openCodeProjects) {\n const existing = projectsByPath.get(op.fullPath);\n if (existing) {\n existing.sessions.push(...op.sessions);\n existing.sessions.sort(\n (a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime()\n );\n existing.sessionCount = existing.sessions.length;\n existing.lastModified = existing.sessions[0]?.modified || existing.lastModified;\n existing.name = existing.name.replace(\" (OpenCode)\", \"\");\n } else {\n op.name = op.name.replace(\" (OpenCode)\", \"\");\n projectsByPath.set(op.fullPath, { ...op });\n }\n }\n cachedProjects = [...projectsByPath.values()].sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n cacheTimestamp = now;\n return cachedProjects;\n}\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n if (url.searchParams.get(\"refresh\") === \"true\") {\n cachedProjects = null;\n cacheTimestamp = 0;\n }\n const sessionId = url.searchParams.get(\"id\");\n if (sessionId) {\n const projectId = url.searchParams.get(\"project\") || \"\";\n const rawOffset = parseInt(url.searchParams.get(\"offset\") || \"0\");\n const rawLimit = parseInt(url.searchParams.get(\"limit\") || \"200\");\n const offset2 = Number.isFinite(rawOffset) && rawOffset >= 0 ? rawOffset : 0;\n const limit2 = Number.isFinite(rawLimit) && rawLimit >= 1 ? Math.min(rawLimit, 500) : 200;\n const allProjects2 = getMergedProjects();\n const matchesProject = (p) => p.id === projectId || p.fullPath === projectId;\n const matchedProject = projectId ? allProjects2.find(matchesProject) : void 0;\n const claudeProjectDir = matchedProject ? matchedProject.fullPath.replace(/\\//g, \"-\") : void 0;\n let messages = getSessionConversation(sessionId, offset2, limit2, claudeProjectDir);\n if (messages.length === 0) {\n messages = getOpenCodeConversation(sessionId, offset2, limit2);\n }\n let sessionInfo = matchedProject?.sessions.find((s) => s.id === sessionId) ?? null;\n if (!sessionInfo) {\n for (const project of allProjects2) {\n if (projectId && !matchesProject(project)) {\n continue;\n }\n const found = project.sessions.find((s) => s.id === sessionId);\n if (found) {\n sessionInfo = found;\n break;\n }\n }\n }\n if (!sessionInfo) {\n return json({ error: \"Session not found\" }, { status: 404 });\n }\n return json({\n messages,\n session: sessionInfo,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n const allProjects = getMergedProjects();\n const limit = parseInt(url.searchParams.get(\"limit\") || \"0\");\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\");\n const total = allProjects.length;\n const paginatedProjects = limit > 0 ? allProjects.slice(offset, offset + limit) : allProjects;\n return json({\n count: allProjects.reduce((sum, p) => sum + p.sessionCount, 0),\n projects: paginatedProjects,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n total\n });\n};\nexport {\n GET\n};\n"],"names":[],"mappings":";;;;;;;;;AAOA,SAAS,qBAAqB,CAAC,OAAO,EAAE;AACxC,EAAE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,IAAI,OAAO,OAAO;AAClB,EAAE;AACF,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC9B,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;AAC9E,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI;AACzB,MAAM,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,EAAE;AACjD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACjB,EAAE;AACF,EAAE,OAAO,EAAE;AACX;AACA,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,EAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC7E;AACA,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;AACvB,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AACpB,EAAE,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,EAAE;AACvC;AACA,SAAS,eAAe,CAAC,GAAG,EAAE;AAC9B,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC1B,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/C,EAAE;AACF,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;AACrB,IAAI,OAAO,CAAC,GAAG,CAAC;AAChB,EAAE;AACF,EAAE,OAAO,EAAE;AACX;AACA,MAAM,gBAAgB,mBAAmB,IAAI,GAAG,CAAC;AACjD,EAAE,QAAQ;AACV,EAAE,WAAW;AACb,EAAE,UAAU;AACZ,EAAE,QAAQ;AACV,EAAE,SAAS;AACX,EAAE;AACF,CAAC,CAAC;AACF,SAAS,mBAAmB,CAAC,KAAK,EAAE;AACpC,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC3C,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,MAAM;AACf,MAAM,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AACxD,IAAI,KAAK,UAAU;AACnB,MAAM,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;AAChE,IAAI,KAAK,UAAU;AACnB,MAAM,OAAO;AACb,QAAQ,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;AAC1B,QAAQ,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;AAChC,QAAQ,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;AACzC,QAAQ,IAAI,EAAE;AACd,OAAO;AACP,IAAI;AACJ,MAAM,OAAO,IAAI;AACjB;AACA;AACA,SAAS,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE;AAC5D,EAAE,MAAM,QAAQ,GAAG,EAAE;AACrB,EAAE,MAAM,kBAAkB,GAAG,EAAE;AAC/B,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACxB,IAAI,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE;AAC3C,EAAE;AACF,EAAE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACtC,EAAE,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACvC,IAAI,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE;AAC3C,EAAE;AACF,EAAE,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;AAChD,EAAE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACtC,EAAE,IAAI,SAAS,KAAK,MAAM,EAAE;AAC5B,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;AAC9D,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACvB,MAAM,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE;AAC7C,IAAI;AACJ,IAAI,MAAM,KAAK,GAAG,EAAE;AACpB,IAAI,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/C,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACpC,MAAM,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE;AACtC,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACtC,UAAU,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACrD,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE;AAChD,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,IAAI;AACJ,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAChC,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AAC1C,MAAM,IAAI,CAAC,SAAS,EAAE;AACtB,QAAQ;AACR,MAAM;AACN,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE;AAChC,QAAQ,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACjE,MAAM,CAAC,MAAM,IAAI,SAAS,KAAK,aAAa,EAAE;AAC9C,QAAQ,IAAI,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC;AACzD,QAAQ,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,aAAa,GAAG,IAAI;AACxF,QAAQ,IAAI,aAAa,EAAE,OAAO,KAAK,MAAM,EAAE;AAC/C,UAAU,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC,OAAO,CAAC;AAC/D,QAAQ;AACR,QAAQ,KAAK,CAAC,IAAI,CAAC;AACnB,UAAU,OAAO,EAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK;AAC/E,UAAU,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AACtC,UAAU,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC;AAC9C,UAAU,IAAI,EAAE;AAChB,SAAS,CAAC;AACV,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AAClE,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,QAAQ,EAAE,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC/C,QAAQ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AACrD,QAAQ,IAAI,EAAE,MAAM;AACpB,QAAQ,SAAS,EAAE;AACnB,OAAO,CAAC;AACR,IAAI;AACJ,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;AACrE,IAAI,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,QAAQ,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,IAAI,YAAY,CAAC,CAAC;AACtD,QAAQ,KAAK,EAAE,WAAW;AAC1B,QAAQ,IAAI,EAAE,QAAQ;AACtB,QAAQ,SAAS,EAAE;AACnB,OAAO,CAAC;AACR,IAAI;AACJ,EAAE,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AACxC,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;AAC9D,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACvB,MAAM,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE;AAC7C,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/C,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,SAAS;AAC7C,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAChC,MAAM,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC;AAC7C,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,QAAQ;AACR,MAAM;AACN,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACtC,QAAQ,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAC3E,MAAM;AACN,MAAM,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,MAAM,IAAI,IAAI,EAAE;AAChB,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE;AACzB,MAAM,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,QAAQ,kBAAkB,CAAC,IAAI,CAAC;AAChC,UAAU,EAAE,EAAE,KAAK;AACnB,UAAU,KAAK,EAAE,IAAI,CAAC,KAAK;AAC3B,UAAU,IAAI,EAAE,WAAW;AAC3B,UAAU,SAAS,EAAE,IAAI,CAAC;AAC1B,SAAS,CAAC;AACV,QAAQ,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;AACpC,MAAM;AACN,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE;AACzC;AACA,SAAS,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE;AAC1D,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9D,EAAE,MAAM,WAAW,GAAG,EAAE;AACxB,EAAE,IAAI,GAAG,GAAG,UAAU;AACtB,EAAE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAC5B,IAAI,IAAI;AACR,MAAM,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC;AACxF,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,kBAAkB,CAAC;AAC1D,MAAM,GAAG,EAAE;AACX,IAAI,CAAC,CAAC,MAAM;AACZ,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,WAAW;AACpB;AACA,MAAM,mBAAmB,GAAG;AAC5B,EAAE,gBAAgB;AAClB,EAAE,gBAAgB;AAClB,EAAE,mBAAmB;AACrB,EAAE,gBAAgB;AAClB,EAAE,wBAAwB;AAC1B,EAAE,wBAAwB;AAC1B,EAAE,mBAAmB;AACrB,EAAE;AACF,CAAC;AACD,SAAS,kBAAkB,CAAC,OAAO,EAAE;AACrC,EAAE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,IAAI,OAAO,OAAO,CAAC,IAAI,EAAE;AACzB,EAAE;AACF,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC9B,IAAI,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AAC7B,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;AAC7C,QAAQ,OAAO,CAAC,CAAC,IAAI,EAAE;AACvB,MAAM;AACN,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;AAC/C,QAAQ,MAAM,KAAK,GAAG,CAAC;AACvB,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAC1F,UAAU,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;AAClC,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,EAAE;AACX;AACA,SAAS,mBAAmB,CAAC,OAAO,EAAE;AACtC,EAAE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AACtB,MAAM;AACN,IAAI;AACJ,IAAI,IAAI;AACR,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACpC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACjC,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO;AAC/B,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACzB,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;AAClD,MAAM,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;AACxE,QAAQ;AACR,MAAM;AACN,MAAM,OAAO,IAAI;AACjB,IAAI,CAAC,CAAC,MAAM;AACZ,MAAM;AACN,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,EAAE;AACX;AACA,SAAS,WAAW,CAAC,KAAK,EAAE;AAC5B,EAAE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5E;AACA,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;AACpF,SAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,SAAS,EAAE;AAC/E,EAAE,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,GAAG,aAAa,EAAE;AAC5F,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/D,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AACjC,IAAI,OAAO,EAAE;AACb,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC;AACnD,IAAI,MAAM,cAAc,mBAAmB,IAAI,GAAG,EAAE;AACpD,IAAI,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;AAC3D,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE;AAChD,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,QAAQ,QAAQ,CAAC,IAAI,CAAC;AACtB,UAAU,EAAE,EAAE,KAAK;AACnB,UAAU,KAAK,EAAE,IAAI,CAAC,KAAK;AAC3B,UAAU,IAAI,EAAE,WAAW;AAC3B,UAAU,SAAS,EAAE,IAAI,CAAC;AAC1B,SAAS,CAAC;AACV,MAAM;AACN,IAAI;AACJ,IAAI,MAAM,OAAO,mBAAmB,IAAI,GAAG,EAAE;AAC7C,IAAI,MAAM,OAAO,GAAG,EAAE;AACtB,IAAI,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;AACxC,QAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,QAAQ,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjC,MAAM;AACN,IAAI;AACJ,IAAI,OAAO,CAAC,OAAO,EAAE;AACrB,IAAI,IAAI,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE;AAChD,MAAM,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK;AAC3C,MAAM,OAAO,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE;AAC7F,QAAQ,QAAQ,EAAE;AAClB,MAAM;AACN,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACpC,IAAI;AACJ,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;AAChD,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AACrE,IAAI,OAAO,EAAE;AACb,EAAE;AACF;AACA,SAAS,wBAAwB,GAAG;AACpC,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE;AAC3C,IAAI,OAAO,EAAE;AACb,EAAE;AACF,EAAE,IAAI,WAAW;AACjB,EAAE,IAAI;AACN,IAAI,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;AACpE,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACxD,MAAM,IAAI;AACV,QAAQ,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;AAClD,MAAM,CAAC,CAAC,MAAM;AACd,QAAQ,OAAO,KAAK;AACpB,MAAM;AACN,IAAI,CAAC,CAAC;AACN,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,EAAE;AACb,EAAE;AACF,EAAE,MAAM,QAAQ,GAAG,EAAE;AACrB,EAAE,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AACjC,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC;AAC1D,IAAI,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC;AACvD,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,MAAM;AACN,IAAI;AACJ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5F,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,IAAI,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACnR,IAAI,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5D,IAAI,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACxD,IAAI,QAAQ,CAAC,IAAI,CAAC;AAClB,MAAM,QAAQ,EAAE,QAAQ;AACxB,MAAM,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC;AAC/B,MAAM,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;AAC/C,MAAM,IAAI,EAAE,WAAW;AACvB,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM;AACnC,MAAM;AACN,KAAK,CAAC;AACN,EAAE;AACF,EAAE,OAAO,QAAQ,CAAC,IAAI;AACtB,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO;AACnF,GAAG;AACH;AACA,SAAS,cAAc,CAAC,KAAK,EAAE;AAC/B,EAAE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;AACtE;AACA,SAAS,UAAU,CAAC,MAAM,EAAE;AAC5B,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC;AACjb,EAAE,IAAI,IAAI,GAAG,EAAE;AACf,EAAE,OAAO,IAAI,KAAK,OAAO,EAAE;AAC3B,IAAI,IAAI,GAAG,OAAO;AAClB,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AAC/D,EAAE;AACF,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AAC1B,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,kBAAkB;AAC7B,EAAE;AACF,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACjD,EAAE,IAAI,CAAC,SAAS,EAAE;AAClB,IAAI,OAAO,kBAAkB;AAC7B,EAAE;AACF,EAAE,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE;AAC7B,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;AACzC,EAAE;AACF,EAAE,OAAO,SAAS;AAClB;AACA,SAAS,sBAAsB,CAAC,OAAO,EAAE;AACzC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAChC,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC3C,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAE,IAAI,WAAW,GAAG,GAAG;AACvB,EAAE,IAAI,CAAC,GAAG,CAAC;AACX,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE;AAC3B,IAAI,IAAI,SAAS,GAAG,EAAE;AACtB,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC3C,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;AACvD,MAAM,IAAI;AACV,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;AAClD,UAAU,SAAS,GAAG,CAAC;AACvB,UAAU;AACV,QAAQ;AACR,MAAM,CAAC,CAAC,MAAM;AACd,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,SAAS,KAAK,EAAE,EAAE;AAC1B,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7E,IAAI,CAAC,GAAG,SAAS;AACjB,EAAE;AACF,EAAE,OAAO,WAAW;AACpB;AACA,SAAS,aAAa,GAAG;AACzB,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;AACnC,EAAE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC;AAChD;AACA,SAAS,sBAAsB,CAAC,UAAU,EAAE;AAC5C,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC;AAChE,EAAE,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;AAC3C,EAAE,MAAM,UAAU,mBAAmB,IAAI,GAAG,EAAE;AAC9C,EAAE,MAAM,QAAQ,GAAG,EAAE;AACrB,EAAE,IAAI,QAAQ,EAAE;AAChB,IAAI,IAAI;AACR,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC;AACrD,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACnC,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;AACzC,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE;AAC/B,UAAU;AACV,QAAQ;AACR,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3E,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AACvC,UAAU;AACV,QAAQ;AACR,QAAQ,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;AACvC,QAAQ,QAAQ,CAAC,IAAI,CAAC;AACtB,UAAU,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;AACtC,UAAU,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;AAC1C,UAAU,EAAE,EAAE,KAAK,CAAC,SAAS;AAC7B,UAAU,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;AAC/C,UAAU,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;AACxC,UAAU,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;AAC9C,UAAU,MAAM,EAAE,aAAa;AAC/B,UAAU,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;AACtC,UAAU,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,IAAI,kBAAkB;AACpF,SAAS,CAAC;AACV,MAAM;AACN,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AACvE,IAAI;AACJ,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAC5C,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACpC,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AAClD,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACrC,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AAClD,MAAM,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACxC,MAAM,IAAI,WAAW,GAAG,gBAAgB;AACxC,MAAM,IAAI,YAAY,GAAG,CAAC;AAC1B,MAAM,IAAI;AACV,QAAQ,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC1D,QAAQ,IAAI,QAAQ,GAAG,CAAC;AACxB,QAAQ,OAAO,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE;AAC1C,UAAU,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpD,UAAU,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE;AACzD,UAAU,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC3D,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;AACrF,YAAY,YAAY,EAAE;AAC1B,UAAU;AACV,UAAU,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;AACzB,YAAY;AACZ,UAAU;AACV,UAAU,QAAQ,GAAG,EAAE,GAAG,CAAC;AAC3B,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC;AACnD,QAAQ,IAAI,MAAM,EAAE;AACpB,UAAU,WAAW,GAAG,MAAM;AAC9B,QAAQ;AACR,MAAM,CAAC,CAAC,MAAM;AACd,MAAM;AACN,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,QAAQ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC7C,QAAQ,SAAS,EAAE,EAAE;AACrB,QAAQ,EAAE,EAAE,SAAS;AACrB,QAAQ,YAAY;AACpB,QAAQ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1C,QAAQ,WAAW,EAAE,EAAE;AACvB,QAAQ,MAAM,EAAE,aAAa;AAC7B,QAAQ,OAAO,EAAE,EAAE;AACnB,QAAQ,KAAK,EAAE,UAAU,CAAC,WAAW;AACrC,OAAO,CAAC;AACR,IAAI;AACJ,EAAE,CAAC,CAAC,MAAM;AACV,EAAE;AACF,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;AACjG;AACA,SAAS,qBAAqB,CAAC,UAAU,EAAE,QAAQ,EAAE;AACrD,EAAE,MAAM,UAAU,GAAG,KAAK;AAC1B,EAAE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAClC,IAAI,IAAI;AACR,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACnE,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACpC,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC3C,MAAM,IAAI,KAAK;AACf,MAAM,IAAI;AACV,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AAC5C,QAAQ,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAChE,QAAQ,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC;AACnD,MAAM,CAAC,SAAS;AAChB,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;AACxB,MAAM;AACN,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AACrC,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9E,MAAM,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;AACxC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAC1B,UAAU;AACV,QAAQ;AACR,QAAQ,IAAI;AACZ,UAAU,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACxC,UAAU,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,EAAE;AAC1D,YAAY,OAAO,KAAK,CAAC,GAAG;AAC5B,UAAU;AACV,QAAQ,CAAC,CAAC,MAAM;AAChB,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,CAAC,MAAM;AACZ,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,EAAE;AACX;AACA,SAAS,SAAS,CAAC,KAAK,EAAE;AAC1B,EAAE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5E;AACA,MAAM,gBAAgB,GAAG,qBAAqB,EAAE;AAChD,SAAS,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE;AACrE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE;AACpB,EAAE,IAAI,CAAC,EAAE,EAAE;AACX,IAAI,OAAO,EAAE;AACb,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO;AAC/B,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;AACnC,IAAI,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AAChD,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,MAAM,OAAO,EAAE;AACf,IAAI;AACJ,IAAI,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO;AAC5B,MAAM;AACN;AACA;AACA,2BAA2B,EAAE,YAAY,CAAC;AAC1C;AACA,IAAI;AACJ,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AACxB,IAAI,MAAM,cAAc,mBAAmB,IAAI,GAAG,EAAE;AACpD,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAChD,QAAQ,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;AAC/C,MAAM;AACN,MAAM,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACxD,MAAM,IAAI,MAAM,EAAE;AAClB,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,MAAM;AACN,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG,EAAE;AACrB,IAAI,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAChC,MAAM,IAAI,OAAO,GAAG,EAAE;AACtB,MAAM,IAAI;AACV,QAAQ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,MAAM,CAAC,CAAC,MAAM;AACd,MAAM;AACN,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,WAAW;AACjE,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;AACvD,MAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,MAAM,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACnC,QAAQ,IAAI,QAAQ,GAAG,EAAE;AACzB,QAAQ,IAAI;AACZ,UAAU,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAQ,CAAC,CAAC,MAAM;AAChB,UAAU;AACV,QAAQ;AACR,QAAQ,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC;AACvD,QAAQ,IAAI,SAAS,EAAE;AACvB,UAAU,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACxC,QAAQ;AACR,MAAM;AACN,MAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE;AACpB,UAAU,KAAK,EAAE,cAAc;AAC/B,UAAU,IAAI;AACd,UAAU,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,WAAW;AAC3D,SAAS,CAAC;AACV,MAAM;AACN,IAAI;AACJ,IAAI,OAAO,MAAM;AACjB,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC;AACnE,IAAI,OAAO,EAAE;AACb,EAAE,CAAC,SAAS;AACZ,IAAI,EAAE,CAAC,KAAK,EAAE;AACd,EAAE;AACF;AACA,SAAS,oBAAoB,GAAG;AAChC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE;AACpB,EAAE,IAAI,CAAC,EAAE,EAAE;AACX,IAAI,OAAO,EAAE;AACb,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO;AAC/B,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ,KAAK,CAAC,GAAG,EAAE;AACX,IAAI,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,qEAAqE,CAAC,CAAC,CAAC,GAAG,EAAE;AAC/G,IAAI,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,IAAI,MAAM,UAAU,mBAAmB,IAAI,GAAG,EAAE;AAChD,IAAI,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAChC,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,IAAI,SAAS;AAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAChC,QAAQ,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;AAC/B,MAAM;AACN,MAAM,MAAM,WAAW,GAAG;AAC1B,QAAQ,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;AACzD,QAAQ,SAAS,EAAE,EAAE;AACrB,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE;AAClB,QAAQ,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;AAClD,QAAQ,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;AAC1D,QAAQ,WAAW,EAAE,GAAG;AACxB,QAAQ,MAAM,EAAE,UAAU;AAC1B,QAAQ,OAAO,EAAE,EAAE;AACnB,QAAQ,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI;AACxC,OAAO;AACP,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AACxC,MAAM,IAAI,MAAM,EAAE;AAClB,QAAQ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAChC,MAAM;AACN,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,EAAE;AACvB,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,UAAU,EAAE;AACjD,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1D,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;AACjG,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,QAAQ,QAAQ,EAAE,GAAG;AACrB,QAAQ,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC;AAC1B,QAAQ,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;AACpD,QAAQ,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC;AACzC,QAAQ,YAAY,EAAE,WAAW,CAAC,MAAM;AACxC,QAAQ,QAAQ,EAAE;AAClB,OAAO,CAAC;AACR,IAAI;AACJ,IAAI,OAAO,QAAQ,CAAC,IAAI;AACxB,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO;AACrF,KAAK;AACL,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;AAC/D,IAAI,OAAO,EAAE;AACb,EAAE,CAAC,SAAS;AACZ,IAAI,EAAE,CAAC,KAAK,EAAE;AACd,EAAE;AACF;AACA,SAAS,mBAAmB,CAAC,IAAI,EAAE;AACnC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACxB,EAAE,QAAQ,IAAI;AACd,IAAI,KAAK,WAAW;AACpB,MAAM,OAAO;AACb,QAAQ,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AAChC,QAAQ,IAAI,EAAE;AACd,OAAO;AACP,IAAI,KAAK,MAAM;AACf,MAAM,OAAO;AACb,QAAQ,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AAChC,QAAQ,IAAI,EAAE;AACd,OAAO;AACP,IAAI,KAAK,MAAM,EAAE;AACjB,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AAC9B,MAAM,OAAO;AACb,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE;AACxC,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;AACjC,QAAQ,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;AACxC,QAAQ,IAAI,EAAE;AACd,OAAO;AACP,IAAI;AACJ,IAAI;AACJ,MAAM,OAAO,IAAI;AACjB;AACA;AACA,SAAS,KAAK,GAAG;AACjB,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;AACxC,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAE,IAAI;AACN,IAAI,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7D,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI;AACf,EAAE;AACF;AACA,IAAI,cAAc,GAAG,IAAI;AACzB,IAAI,cAAc,GAAG,CAAC;AACtB,MAAM,YAAY,GAAG,GAAG;AACxB,SAAS,iBAAiB,GAAG;AAC7B,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACxB,EAAE,IAAI,cAAc,IAAI,GAAG,GAAG,cAAc,GAAG,YAAY,EAAE;AAC7D,IAAI,OAAO,cAAc;AACzB,EAAE;AACF,EAAE,MAAM,cAAc,GAAG,wBAAwB,EAAE;AACnD,EAAE,MAAM,gBAAgB,GAAG,oBAAoB,EAAE;AACjD,EAAE,MAAM,cAAc,mBAAmB,IAAI,GAAG,EAAE;AAClD,EAAE,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE;AAClC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AAC5C,EAAE;AACF,EAAE,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE;AACrC,IAAI,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;AACpD,IAAI,IAAI,QAAQ,EAAE;AAClB,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;AAC5C,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI;AAC5B,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO;AAC/E,OAAO;AACP,MAAM,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;AACtD,MAAM,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,QAAQ,CAAC,YAAY;AACrF,MAAM,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;AAC9D,IAAI,CAAC,MAAM;AACX,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;AAClD,MAAM,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;AAChD,IAAI;AACJ,EAAE;AACF,EAAE,cAAc,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;AACpD,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO;AACnF,GAAG;AACH,EAAE,cAAc,GAAG,GAAG;AACtB,EAAE,OAAO,cAAc;AACvB;AACK,MAAC,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK;AAClC,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE;AAClD,IAAI,cAAc,GAAG,IAAI;AACzB,IAAI,cAAc,GAAG,CAAC;AACtB,EAAE;AACF,EAAE,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9C,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;AAC3D,IAAI,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;AACrE,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AACrE,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC;AAChF,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,GAAG;AAC7F,IAAI,MAAM,YAAY,GAAG,iBAAiB,EAAE;AAC5C,IAAI,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;AAChF,IAAI,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,MAAM;AACjF,IAAI,MAAM,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM;AAClG,IAAI,IAAI,QAAQ,GAAG,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC;AACvF,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;AACpE,IAAI;AACJ,IAAI,IAAI,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI;AACtF,IAAI,IAAI,CAAC,WAAW,EAAE;AACtB,MAAM,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE;AAC1C,QAAQ,IAAI,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;AACnD,UAAU;AACV,QAAQ;AACR,QAAQ,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AACtE,QAAQ,IAAI,KAAK,EAAE;AACnB,UAAU,WAAW,GAAG,KAAK;AAC7B,UAAU;AACV,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,IAAI,IAAI,CAAC,WAAW,EAAE;AACtB,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAClE,IAAI;AACJ,IAAI,OAAO,IAAI,CAAC;AAChB,MAAM,QAAQ;AACd,MAAM,OAAO,EAAE,WAAW;AAC1B,MAAM,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AACzD,KAAK,CAAC;AACN,EAAE;AACF,EAAE,MAAM,WAAW,GAAG,iBAAiB,EAAE;AACzC,EAAE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;AAC9D,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;AAChE,EAAE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM;AAClC,EAAE,MAAM,iBAAiB,GAAG,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,WAAW;AAC/F,EAAE,OAAO,IAAI,CAAC;AACd,IAAI,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;AAClE,IAAI,QAAQ,EAAE,iBAAiB;AAC/B,IAAI,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AACzD,IAAI;AACJ,GAAG,CAAC;AACJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-CjpQ10xh.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/sessions/detect/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../chunks/auth.js\";\nimport { r as resolveOpenCodeDbPath } from \"../../../../../chunks/opencode-db-path.js\";\nimport Database from \"better-sqlite3\";\nimport { execSync } from \"child_process\";\nimport { readdirSync, readFileSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { t as toErrorMessage } from \"../../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction cwdToProjectPath(cwd) {\n return cwd.replace(/\\//g, \"-\");\n}\nfunction isOpenCodeRunning() {\n try {\n execSync(\"pgrep -x opencode\", { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\nfunction isProcessAlive(pid) {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\nconst CLAUDE_SESSIONS_DIR = join(homedir(), \".claude\", \"sessions\");\nconst OPENCODE_ACTIVE_THRESHOLD_MS = 3 * 6e4;\nfunction detectRunningAISessions() {\n const results = [];\n try {\n const files = readdirSync(CLAUDE_SESSIONS_DIR).filter((f) => f.endsWith(\".json\"));\n for (const file of files) {\n try {\n const raw = readFileSync(join(CLAUDE_SESSIONS_DIR, file), \"utf-8\");\n const data = JSON.parse(raw);\n if (!data.pid || !data.sessionId || !data.cwd) {\n continue;\n }\n if (!isProcessAlive(data.pid)) {\n continue;\n }\n results.push({\n command: \"claude\",\n cwd: data.cwd,\n kind: data.kind || \"interactive\",\n pid: data.pid,\n projectPath: cwdToProjectPath(data.cwd),\n sessionId: data.sessionId,\n startedAt: data.startedAt || 0\n });\n } catch {\n }\n }\n } catch {\n }\n if (isOpenCodeRunning()) {\n try {\n const dbPath = resolveOpenCodeDbPath();\n if (existsSync(dbPath)) {\n const db = new Database(dbPath, { readonly: true });\n try {\n const cutoff = Date.now() - OPENCODE_ACTIVE_THRESHOLD_MS;\n const cutoffSec = Math.floor(cutoff / 1e3);\n const rows = db.prepare(\n `SELECT id, directory, time_created, time_updated\n FROM session\n WHERE (time_archived IS NULL OR time_archived = 0)\n AND (\n (time_updated >= 1e12 AND time_updated > ?)\n OR (time_updated < 1e12 AND time_updated > ?)\n )\n ORDER BY time_updated DESC\n LIMIT 20`\n ).all(cutoff, cutoffSec);\n for (const row of rows) {\n const startMs = row.time_created >= 1e12 ? row.time_created : row.time_created * 1e3;\n results.push({\n command: \"opencode\",\n cwd: row.directory || \"\",\n kind: \"interactive\",\n pid: 0,\n // OpenCode doesn't expose per-session PIDs\n projectPath: cwdToProjectPath(row.directory || \"\"),\n sessionId: row.id,\n startedAt: startMs\n });\n }\n } finally {\n db.close();\n }\n }\n } catch {\n }\n }\n results.sort((a, b) => b.startedAt - a.startedAt);\n return results;\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const processes = detectRunningAISessions();\n return json({\n count: processes.length,\n processes,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[sessions/detect] Failed to detect running sessions:\", toErrorMessage(error));\n return json({ error: \"Failed to detect running sessions\" }, { status: 500 });\n }\n};\nexport {\n GET\n};\n"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import * as path from 'path';
2
-
3
- function resolveOpenCodeDbPath() {
4
- const home = process.env.HOME || "";
5
- if (process.env.XDG_DATA_HOME) {
6
- return path.join(process.env.XDG_DATA_HOME, "opencode", "opencode.db");
7
- }
8
- if (process.platform === "darwin") {
9
- return path.join(home, "Library", "Application Support", "opencode", "opencode.db");
10
- }
11
- return path.join(home, ".local", "share", "opencode", "opencode.db");
12
- }
13
-
14
- export { resolveOpenCodeDbPath as r };
15
- //# sourceMappingURL=opencode-db-path-DcfhJtJy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode-db-path-DcfhJtJy.js","sources":["../../../.svelte-kit/adapter-node/chunks/opencode-db-path.js"],"sourcesContent":["import * as path from \"path\";\nfunction resolveOpenCodeDbPath() {\n const home = process.env.HOME || \"\";\n if (process.env.XDG_DATA_HOME) {\n return path.join(process.env.XDG_DATA_HOME, \"opencode\", \"opencode.db\");\n }\n if (process.platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.db\");\n }\n return path.join(home, \".local\", \"share\", \"opencode\", \"opencode.db\");\n}\nexport {\n resolveOpenCodeDbPath as r\n};\n"],"names":[],"mappings":";;AACA,SAAS,qBAAqB,GAAG;AACjC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;AACrC,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;AACjC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC;AAC1E,EAAE;AACF,EAAE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACrC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,EAAE,aAAa,CAAC;AACvF,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACtE;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pty-manager-TyMUpDA9.js","sources":["../../../.svelte-kit/adapter-node/chunks/pty-manager.js"],"sourcesContent":["import { fork } from \"child_process\";\nimport { randomBytes } from \"crypto\";\nimport * as fs from \"fs\";\nimport { existsSync, readFileSync, unlinkSync, readdirSync, statSync } from \"fs\";\nimport * as path from \"path\";\nimport path__default from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { b as broadcastEvent } from \"./events-handler.js\";\nimport * as net from \"net\";\nimport Database from \"better-sqlite3\";\nimport { r as resolveOpenCodeDbPath } from \"./opencode-db-path.js\";\nclass HolderClient {\n connected = false;\n pid = 0;\n activityCb = null;\n cwdCb = null;\n disconnectCb = null;\n exitCb = null;\n lineBuf = \"\";\n outputCb = null;\n socket = null;\n /**\n * Connect to a holder process via its Unix domain socket.\n * Resolves once the initial `info` and `scrollback` handshake messages\n * have been received.\n */\n connect(socketPath) {\n return new Promise((resolve, reject) => {\n let settled = false;\n let info = null;\n let scrollback = \"\";\n const pendingMessages = [];\n const HANDSHAKE_TIMEOUT_MS = 1e4;\n const handshakeTimer = setTimeout(() => {\n if (!settled) {\n settled = true;\n this.connected = false;\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n reject(\n new Error(`Handshake timeout: holder did not respond within ${HANDSHAKE_TIMEOUT_MS}ms`)\n );\n }\n }, HANDSHAKE_TIMEOUT_MS);\n const socket = net.createConnection(socketPath);\n this.socket = socket;\n socket.setEncoding(\"utf8\");\n socket.on(\"connect\", () => {\n this.connected = true;\n });\n socket.on(\"data\", (chunk) => {\n this.lineBuf += chunk;\n const lines = this.lineBuf.split(\"\\n\");\n this.lineBuf = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line.length === 0) {\n continue;\n }\n let msg;\n try {\n msg = JSON.parse(line);\n } catch {\n continue;\n }\n if (!settled) {\n if (msg.type === \"info\") {\n info = { exitCode: msg.exitCode, exited: msg.exited, pid: msg.pid };\n this.pid = msg.pid;\n } else if (msg.type === \"scrollback\") {\n scrollback = msg.data;\n } else {\n pendingMessages.push(msg);\n }\n if (info !== null) {\n const settle = () => {\n if (settled || !info) {\n return;\n }\n settled = true;\n clearTimeout(handshakeTimer);\n resolve({\n exitCode: info.exitCode,\n exited: info.exited,\n pid: info.pid,\n scrollback\n });\n const queued = [...pendingMessages];\n pendingMessages.length = 0;\n setTimeout(() => {\n for (const pending of queued) {\n this.handleMessage(pending);\n }\n }, 0);\n };\n if (msg.type === \"scrollback\") {\n settle();\n } else if (msg.type === \"info\") {\n setTimeout(settle, 100);\n }\n }\n } else {\n this.handleMessage(msg);\n }\n }\n });\n socket.on(\"error\", (err) => {\n if (!settled) {\n settled = true;\n clearTimeout(handshakeTimer);\n this.connected = false;\n this.socket = null;\n reject(err);\n }\n });\n socket.on(\"close\", () => {\n const wasConnected = this.connected;\n this.connected = false;\n this.socket = null;\n this.lineBuf = \"\";\n if (!settled) {\n settled = true;\n clearTimeout(handshakeTimer);\n reject(new Error(\"Socket closed before handshake completed\"));\n return;\n }\n if (wasConnected && this.disconnectCb) {\n this.disconnectCb();\n }\n });\n });\n }\n /** Gracefully disconnect from the holder (does NOT kill the holder). */\n disconnect() {\n this.connected = false;\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n this.lineBuf = \"\";\n }\n /** Send a signal to the PTY process (default SIGTERM). */\n kill(signal) {\n const msg = { type: \"kill\" };\n if (signal) {\n msg.signal = signal;\n }\n this.send(msg);\n }\n /** Register callback for activity state changes. */\n onActivity(cb) {\n this.activityCb = cb;\n }\n /** Register callback for CWD changes. */\n onCwd(cb) {\n this.cwdCb = cb;\n }\n /** Register callback for unexpected disconnect from holder. */\n onDisconnect(cb) {\n this.disconnectCb = cb;\n }\n /** Register callback for PTY exit. */\n onExit(cb) {\n this.exitCb = cb;\n }\n /** Register callback for PTY output data. */\n onOutput(cb) {\n this.outputCb = cb;\n }\n /** Resize the PTY. */\n resize(cols, rows) {\n this.send({ cols, rows, type: \"resize\" });\n }\n /** Write data to the PTY stdin. */\n write(data) {\n this.send({ data, type: \"input\" });\n }\n // ── Private Helpers ────────────────────────────────────────────────\n /** Dispatch a post-handshake message from the holder. */\n handleMessage(msg) {\n switch (msg.type) {\n case \"activity\":\n if (this.activityCb) {\n this.activityCb(msg.active);\n }\n break;\n case \"cwd\":\n if (this.cwdCb) {\n this.cwdCb(msg.path);\n }\n break;\n case \"exit\":\n if (this.exitCb) {\n this.exitCb(msg.code);\n }\n break;\n case \"output\":\n if (this.outputCb) {\n this.outputCb(msg.data);\n }\n break;\n }\n }\n /** Send an ndjson message to the holder. */\n send(msg) {\n if (!this.socket || !this.connected) {\n return;\n }\n this.socket.write(`${JSON.stringify(msg)}\n`);\n }\n}\nconst OPENCODE_DB_PATH = resolveOpenCodeDbPath();\nconst POLL_INTERVAL_MS = 2e3;\nconst SQLITE_MAX_PARAMS = 500;\nclass OpenCodeWatcher {\n watchers = /* @__PURE__ */ new Map();\n /**\n * Find the most recent non-archived OpenCode session that matches\n * the given working directory. Checks session.directory equals or\n * starts with `cwd`.\n *\n * Returns the session ID or null if none found.\n */\n findSessionId(cwd, createdAfter) {\n const db = openDb();\n if (!db) {\n return null;\n }\n try {\n const millisFilter = createdAfter ?? 0;\n const secondsFilter = createdAfter ? Math.floor(createdAfter / 1e3) : 0;\n const cwdLikePattern = `${cwd.replace(/[%_\\\\]/g, \"\\\\$&\")}/%`;\n const row = db.prepare(\n `\n\t\t\t\tSELECT id\n\t\t\t\tFROM session\n\t\t\t\tWHERE (time_archived IS NULL OR time_archived = 0)\n\t\t\t\t AND (directory = ? OR directory LIKE ? ESCAPE '\\\\')\n\t\t\t\t AND (\n\t\t\t\t (time_updated >= 1e12 AND time_updated > ?)\n\t\t\t\t OR (time_updated < 1e12 AND time_updated > ?)\n\t\t\t\t )\n\t\t\t\tORDER BY time_updated DESC\n\t\t\t\tLIMIT 1\n\t\t\t`\n ).get(cwd, cwdLikePattern, millisFilter, secondsFilter);\n return row?.id ?? null;\n } catch (error) {\n console.error(\"[opencode-watcher] Failed to find session:\", error);\n return null;\n } finally {\n db.close();\n }\n }\n /**\n * Read all messages and parts for a session from SQLite, converting\n * them to ConversationMessage format.\n */\n getHistory(sessionId) {\n const db = openDb();\n if (!db) {\n return [];\n }\n try {\n const messages = db.prepare(\n `\n\t\t\t\tSELECT id, session_id, time_created, time_updated, data\n\t\t\t\tFROM message\n\t\t\t\tWHERE session_id = ?\n\t\t\t\tORDER BY time_created ASC\n\t\t\t`\n ).all(sessionId);\n if (messages.length === 0) {\n return [];\n }\n const messageIds = messages.map((m) => m.id);\n const parts = batchInQuery(\n db,\n `SELECT id, message_id, session_id, time_created, time_updated, data\n\t\t\t\tFROM part\n\t\t\t\tWHERE message_id IN (__PLACEHOLDERS__)\n\t\t\t\tORDER BY time_created ASC`,\n messageIds\n );\n const partsByMessage = /* @__PURE__ */ new Map();\n for (const part of parts) {\n if (!partsByMessage.has(part.message_id)) {\n partsByMessage.set(part.message_id, []);\n }\n const bucket = partsByMessage.get(part.message_id);\n if (bucket) {\n bucket.push(part);\n }\n }\n return this.buildMessages(messages, partsByMessage);\n } catch (error) {\n console.error(\"[opencode-watcher] Failed to read history:\", error);\n return [];\n } finally {\n db.close();\n }\n }\n /**\n * Stop watching a specific session. If a callback is provided, only that\n * subscriber is removed — the interval keeps running while other subscribers\n * remain. If no callback is provided, all subscribers and the interval are\n * cleared (backward compat).\n */\n stop(sessionId, callback) {\n const state = this.watchers.get(sessionId);\n if (!state) {\n return;\n }\n if (callback) {\n state.callbacks.delete(callback);\n console.log(\n `[opencode-watcher] Removed subscriber from session: ${sessionId} (remaining=${state.callbacks.size})`\n );\n if (state.callbacks.size > 0) {\n return;\n }\n }\n clearInterval(state.intervalHandle);\n this.watchers.delete(sessionId);\n console.log(`[opencode-watcher] Stopped watching session: ${sessionId}`);\n }\n /**\n * Stop all active watchers.\n */\n stopAll() {\n for (const [sessionId] of this.watchers) {\n this.stop(sessionId);\n }\n }\n /**\n * Start polling the SQLite DB every 2 seconds for new messages/parts\n * in the given session. Converts new data to ConversationMessage\n * format and invokes the callback.\n */\n watch(sessionId, callback) {\n const existing = this.watchers.get(sessionId);\n if (existing) {\n existing.callbacks.add(callback);\n console.log(\n `[opencode-watcher] Added subscriber to session: ${sessionId} (total=${existing.callbacks.size})`\n );\n return;\n }\n const { emittedMessageIds, emittedPartUpdatedAt, lastMessageTime, lastPartTime } = this.getHighWaterMarks(sessionId);\n const intervalHandle = setInterval(() => {\n this.poll(sessionId);\n }, POLL_INTERVAL_MS);\n const state = {\n callbacks: /* @__PURE__ */ new Set([callback]),\n emittedMessageIds,\n emittedPartUpdatedAt,\n intervalHandle,\n lastMessageTime,\n lastPartTime,\n sessionId\n };\n this.watchers.set(sessionId, state);\n console.log(\n `[opencode-watcher] Watching session: ${sessionId} (lastMsg=${lastMessageTime}, lastPart=${lastPartTime})`\n );\n }\n // ── Private Helpers ────────────────────────────────────────────────\n /**\n * Convert OpenCode messages + their parts into ConversationMessage\n * objects for consumption by the session handler.\n */\n buildMessages(messages, partsByMessage) {\n const result = [];\n for (const msg of messages) {\n let msgData = {};\n try {\n msgData = JSON.parse(msg.data);\n } catch {\n continue;\n }\n const role = msgData.role === \"user\" ? \"user\" : \"assistant\";\n const msgParts = partsByMessage.get(msg.id) || [];\n const parts = [];\n for (const part of msgParts) {\n let partData;\n try {\n partData = JSON.parse(part.data);\n } catch {\n continue;\n }\n const converted = convertPartToMessagePart(partData);\n if (converted) {\n parts.push(converted);\n }\n }\n if (parts.length === 0) {\n console.debug(`[opencode-watcher] Skipping message ${msg.id} (no usable parts)`);\n continue;\n }\n result.push({\n id: msg.id,\n parts,\n role,\n timestamp: new Date(toMillis(msg.time_created)).toISOString()\n });\n }\n return result;\n }\n /**\n * Scan existing messages/parts to determine the starting high-water\n * marks for time-based polling. Also collects the set of already-seen\n * message IDs so we do not re-emit them.\n */\n getHighWaterMarks(sessionId) {\n const db = openDb();\n if (!db) {\n return {\n emittedMessageIds: /* @__PURE__ */ new Set(),\n emittedPartUpdatedAt: /* @__PURE__ */ new Map(),\n lastMessageTime: 0,\n lastPartTime: 0\n };\n }\n try {\n const msgRow = db.prepare(\n `\n\t\t\t\tSELECT MAX(time_created) as maxTime\n\t\t\t\tFROM message\n\t\t\t\tWHERE session_id = ?\n\t\t\t`\n ).get(sessionId);\n const partRow = db.prepare(\n `\n\t\t\t\tSELECT MAX(time_updated) as maxTime\n\t\t\t\tFROM part\n\t\t\t\tWHERE session_id = ?\n\t\t\t`\n ).get(sessionId);\n const existingIds = db.prepare(\n `\n\t\t\t\tSELECT id FROM message WHERE session_id = ?\n\t\t\t`\n ).all(sessionId);\n const emittedMessageIds = new Set(existingIds.map((r) => r.id));\n const existingParts = db.prepare(\n `\n\t\t\t\tSELECT id, time_updated FROM part WHERE session_id = ?\n\t\t\t`\n ).all(sessionId);\n const emittedPartUpdatedAt = /* @__PURE__ */ new Map();\n for (const p of existingParts) {\n emittedPartUpdatedAt.set(p.id, p.time_updated);\n }\n return {\n emittedMessageIds,\n emittedPartUpdatedAt,\n lastMessageTime: msgRow?.maxTime ?? 0,\n lastPartTime: partRow?.maxTime ?? 0\n };\n } catch (error) {\n console.error(\"[opencode-watcher] Failed to get high-water marks:\", error);\n return {\n emittedMessageIds: /* @__PURE__ */ new Set(),\n emittedPartUpdatedAt: /* @__PURE__ */ new Map(),\n lastMessageTime: 0,\n lastPartTime: 0\n };\n } finally {\n db.close();\n }\n }\n /**\n * Single poll iteration. Opens the DB, queries for new messages and\n * updated parts, converts them to ConversationMessage[], and invokes\n * the watcher callbacks.\n */\n poll(sessionId) {\n const state = this.watchers.get(sessionId);\n if (!state) {\n return;\n }\n const db = openDb();\n if (!db) {\n return;\n }\n try {\n const results = [];\n const newMessages = db.prepare(\n `\n\t\t\t\tSELECT id, session_id, time_created, time_updated, data\n\t\t\t\tFROM message\n\t\t\t\tWHERE session_id = ? AND time_created > ?\n\t\t\t\tORDER BY time_created ASC\n\t\t\t`\n ).all(sessionId, state.lastMessageTime);\n if (newMessages.length > 0) {\n const dedupedMessages = newMessages.filter((m) => !state.emittedMessageIds.has(m.id));\n if (dedupedMessages.length > 0) {\n const newMsgIds = dedupedMessages.map((m) => m.id);\n const newParts = batchInQuery(\n db,\n `SELECT id, message_id, session_id, time_created, time_updated, data\n\t\t\t\t\t\tFROM part\n\t\t\t\t\t\tWHERE message_id IN (__PLACEHOLDERS__)\n\t\t\t\t\t\tORDER BY time_created ASC`,\n newMsgIds\n );\n const partsByMessage = /* @__PURE__ */ new Map();\n for (const part of newParts) {\n if (!partsByMessage.has(part.message_id)) {\n partsByMessage.set(part.message_id, []);\n }\n const bucket = partsByMessage.get(part.message_id);\n if (bucket) {\n bucket.push(part);\n }\n }\n const newEntries = this.buildMessages(dedupedMessages, partsByMessage);\n results.push(...newEntries);\n for (const part of newParts) {\n if (part.time_updated > state.lastPartTime) {\n state.lastPartTime = part.time_updated;\n }\n state.emittedPartUpdatedAt.set(part.id, part.time_updated);\n }\n }\n for (const msg of newMessages) {\n if (msg.time_created > state.lastMessageTime) {\n state.lastMessageTime = msg.time_created;\n }\n state.emittedMessageIds.add(msg.id);\n }\n }\n const updatedParts = db.prepare(\n `\n\t\t\t\tSELECT id, message_id, session_id, time_created, time_updated, data\n\t\t\t\tFROM part\n\t\t\t\tWHERE session_id = ? AND time_updated > ?\n\t\t\t\tORDER BY time_created ASC\n\t\t\t`\n ).all(sessionId, state.lastPartTime);\n if (updatedParts.length > 0) {\n const newMsgIdSet = new Set(newMessages.map((m) => m.id));\n const newParts = updatedParts.filter((p) => {\n if (newMsgIdSet.has(p.message_id)) {\n return false;\n }\n const lastSeen = state.emittedPartUpdatedAt.get(p.id);\n return lastSeen === void 0 || p.time_updated > lastSeen;\n });\n if (newParts.length > 0) {\n const partsByMessage = /* @__PURE__ */ new Map();\n for (const part of newParts) {\n if (!partsByMessage.has(part.message_id)) {\n partsByMessage.set(part.message_id, []);\n }\n const bucket = partsByMessage.get(part.message_id);\n if (bucket) {\n bucket.push(part);\n }\n }\n const affectedMsgIds = [...partsByMessage.keys()];\n const affectedMessages = batchInQuery(\n db,\n `SELECT id, session_id, time_created, time_updated, data\n\t\t\t\t\t\tFROM message\n\t\t\t\t\t\tWHERE id IN (__PLACEHOLDERS__)\n\t\t\t\t\t\tORDER BY time_created ASC`,\n affectedMsgIds\n );\n const updatedEntries = this.buildMessages(affectedMessages, partsByMessage);\n results.push(...updatedEntries);\n for (const part of newParts) {\n state.emittedPartUpdatedAt.set(part.id, part.time_updated);\n }\n }\n for (const part of updatedParts) {\n if (part.time_updated > state.lastPartTime) {\n state.lastPartTime = part.time_updated;\n }\n }\n }\n if (results.length > 0) {\n for (const cb of state.callbacks) {\n try {\n cb(results);\n } catch (cbError) {\n console.error(\"[opencode-watcher] Callback error:\", cbError);\n }\n }\n }\n } catch (error) {\n console.error(\"[opencode-watcher] Poll error:\", error);\n } finally {\n db.close();\n }\n }\n}\nfunction batchInQuery(db, sql, ids) {\n if (ids.length === 0) {\n return [];\n }\n const results = [];\n for (let i = 0; i < ids.length; i += SQLITE_MAX_PARAMS) {\n const chunk = ids.slice(i, i + SQLITE_MAX_PARAMS);\n const placeholders = chunk.map(() => \"?\").join(\",\");\n const query = sql.replace(\"__PLACEHOLDERS__\", placeholders);\n const rows = db.prepare(query).all(...chunk);\n results.push(...rows);\n }\n return results;\n}\nfunction convertPartToMessagePart(data) {\n switch (data.type) {\n case \"reasoning\":\n return { content: data.text || \"\", type: \"thinking\" };\n case \"text\":\n return { content: data.text || \"\", type: \"text\" };\n case \"tool\":\n return {\n id: data.callID || data.id || \"\",\n input: data.state?.input || {},\n toolName: data.tool || \"Unknown\",\n type: \"tool_use\"\n };\n default:\n return null;\n }\n}\nfunction openDb() {\n if (!fs.existsSync(OPENCODE_DB_PATH)) {\n return null;\n }\n try {\n return new Database(OPENCODE_DB_PATH, { readonly: true });\n } catch {\n return null;\n }\n}\nfunction toMillis(timestamp) {\n return timestamp < 1e12 ? timestamp * 1e3 : timestamp;\n}\nconst OW_GLOBAL_KEY = \"__shooter_opencode_watcher\";\nconst openCodeWatcher = globalThis[OW_GLOBAL_KEY] || new OpenCodeWatcher();\nglobalThis[OW_GLOBAL_KEY] = openCodeWatcher;\nconst DB_DIR = path.join(process.env.HOME || \"\", \".shooter\");\nconst DB_PATH = path.join(DB_DIR, \"shooter.db\");\nconst COLUMNS = [\n \"id\",\n \"command\",\n \"args\",\n \"cwd\",\n \"cols\",\n \"rows\",\n \"pid\",\n \"holder_pid\",\n \"socket_path\",\n \"session_file\",\n \"opencode_session_id\",\n \"status\",\n \"exit_code\",\n \"created_at\",\n \"exited_at\"\n];\nfunction rowToRecord(row) {\n return {\n args: row.args,\n cols: row.cols,\n command: row.command,\n createdAt: row.created_at,\n cwd: row.cwd,\n exitCode: row.exit_code ?? null,\n exitedAt: row.exited_at ?? null,\n holderPid: row.holder_pid ?? null,\n id: row.id,\n opencodeSessionId: row.opencode_session_id ?? null,\n pid: row.pid ?? null,\n rows: row.rows,\n sessionFile: row.session_file ?? null,\n socketPath: row.socket_path ?? null,\n status: row.status\n };\n}\nconst CAMEL_TO_SNAKE = {\n createdAt: \"created_at\",\n exitCode: \"exit_code\",\n exitedAt: \"exited_at\",\n holderPid: \"holder_pid\",\n opencodeSessionId: \"opencode_session_id\",\n sessionFile: \"session_file\",\n socketPath: \"socket_path\"\n};\nclass TerminalStore {\n db;\n constructor() {\n fs.mkdirSync(DB_DIR, { recursive: true });\n this.db = new Database(DB_PATH);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS terminals (\n\t\t\t\tid TEXT PRIMARY KEY,\n\t\t\t\tcommand TEXT NOT NULL,\n\t\t\t\targs TEXT NOT NULL DEFAULT '[]',\n\t\t\t\tcwd TEXT NOT NULL,\n\t\t\t\tcols INTEGER NOT NULL DEFAULT 80,\n\t\t\t\trows INTEGER NOT NULL DEFAULT 24,\n\t\t\t\tpid INTEGER,\n\t\t\t\tholder_pid INTEGER,\n\t\t\t\tsocket_path TEXT,\n\t\t\t\tsession_file TEXT,\n\t\t\t\topencode_session_id TEXT,\n\t\t\t\tstatus TEXT NOT NULL DEFAULT 'running',\n\t\t\t\texit_code INTEGER,\n\t\t\t\tcreated_at TEXT NOT NULL,\n\t\t\t\texited_at TEXT\n\t\t\t)\n\t\t`);\n }\n deleteOlderThan(ms) {\n const cutoff = new Date(Date.now() - ms).toISOString();\n const result = this.db.prepare(\n \"DELETE FROM terminals WHERE status IN ('exited', 'orphaned') AND COALESCE(exited_at, created_at) < ?\"\n ).run(cutoff);\n return result.changes;\n }\n get(id) {\n const row = this.db.prepare(\"SELECT * FROM terminals WHERE id = ?\").get(id);\n return row ? rowToRecord(row) : null;\n }\n insert(terminal) {\n const placeholders = COLUMNS.map(() => \"?\").join(\", \");\n const stmt = this.db.prepare(\n `INSERT INTO terminals (${COLUMNS.join(\", \")}) VALUES (${placeholders})`\n );\n stmt.run(\n terminal.id,\n terminal.command,\n terminal.args,\n terminal.cwd,\n terminal.cols,\n terminal.rows,\n terminal.pid,\n terminal.holderPid,\n terminal.socketPath,\n terminal.sessionFile,\n terminal.opencodeSessionId,\n terminal.status,\n terminal.exitCode,\n terminal.createdAt,\n terminal.exitedAt\n );\n }\n listAll() {\n const rows = this.db.prepare(\"SELECT * FROM terminals ORDER BY created_at DESC\").all();\n return rows.map(rowToRecord);\n }\n listRunning() {\n const rows = this.db.prepare(\"SELECT * FROM terminals WHERE status = 'running' ORDER BY created_at DESC\").all();\n return rows.map(rowToRecord);\n }\n markExited(id, exitCode) {\n this.db.prepare(\"UPDATE terminals SET status = 'exited', exit_code = ?, exited_at = ? WHERE id = ?\").run(exitCode, (/* @__PURE__ */ new Date()).toISOString(), id);\n }\n markOrphaned(id) {\n this.db.prepare(\n \"UPDATE terminals SET status = 'orphaned', exited_at = COALESCE(exited_at, ?) WHERE id = ?\"\n ).run((/* @__PURE__ */ new Date()).toISOString(), id);\n }\n update(id, fields) {\n const entries = Object.entries(fields).filter(\n ([key, val]) => key !== \"id\" && val !== void 0\n );\n if (entries.length === 0) {\n return;\n }\n const sets = entries.map(([key]) => `${toSnake(key)} = ?`).join(\", \");\n const values = entries.map(([, val]) => val ?? null);\n this.db.prepare(`UPDATE terminals SET ${sets} WHERE id = ?`).run(...values, id);\n }\n}\nfunction toSnake(key) {\n return CAMEL_TO_SNAKE[key] || key;\n}\nconst TS_GLOBAL_KEY = \"__shooter_terminal_store\";\nconst terminalStore = globalThis[TS_GLOBAL_KEY] || new TerminalStore();\nglobalThis[TS_GLOBAL_KEY] = terminalStore;\nconst MAX_SCROLLBACK_BYTES = 512 * 1024;\nconst MAX_OUTPUT_BUFFER_BYTES = 1024 * 1024;\nconst SCROLLBACK_CHUNK_SIZE = 50 * 1024;\nconst CLEANUP_INTERVAL_MS = 5 * 60 * 1e3;\nconst EXITED_TTL_MS = 60 * 60 * 1e3;\nconst MAX_EXITED_TERMINALS = 10;\nconst SIGKILL_DELAY_MS = 5e3;\nconst HOLDER_READY_TIMEOUT_MS = 5e3;\nconst DB_CLEANUP_TTL_MS = 24 * 60 * 60 * 1e3;\nconst __filename$1 = fileURLToPath(import.meta.url);\nconst __dirname$1 = path__default.dirname(__filename$1);\nclass PtyManager {\n cleanupTimer = null;\n terminals = /* @__PURE__ */ new Map();\n constructor() {\n this.cleanupTimer = setInterval(() => {\n this.cleanup();\n }, CLEANUP_INTERVAL_MS);\n }\n // -----------------------------------------------------------------------\n // create — now async: forks a holder process, connects via HolderClient,\n // persists to SQLite\n // -----------------------------------------------------------------------\n attach(id, ws) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return false;\n }\n terminal.clients.add(ws);\n terminal.outputBuffers.set(ws, { data: [], size: 0 });\n void this.sendScrollback(terminal, ws);\n return true;\n }\n // -----------------------------------------------------------------------\n // reconnectAll — recover persisted terminals on server startup\n // -----------------------------------------------------------------------\n cleanup() {\n const now = Date.now();\n const exited = [];\n for (const [id, terminal] of this.terminals) {\n if (terminal.status !== \"exited\") {\n continue;\n }\n const exitTime = terminal.exitedAt?.getTime() ?? terminal.createdAt.getTime();\n if (now - exitTime > EXITED_TTL_MS) {\n this.evict(id);\n continue;\n }\n exited.push({ exitedAt: exitTime, id });\n }\n if (exited.length > MAX_EXITED_TERMINALS) {\n exited.sort((a, b) => a.exitedAt - b.exitedAt);\n const toEvict = exited.slice(0, exited.length - MAX_EXITED_TERMINALS);\n for (const { id } of toEvict) {\n this.evict(id);\n }\n }\n try {\n const deleted = terminalStore.deleteOlderThan(DB_CLEANUP_TTL_MS);\n if (deleted > 0) {\n console.log(`[pty-manager] Cleaned up ${deleted} old terminal record(s) from SQLite`);\n }\n } catch {\n }\n }\n // -----------------------------------------------------------------------\n // disconnectAll — graceful shutdown: disconnect clients, keep holders alive\n // -----------------------------------------------------------------------\n async create(command, args, cwd, cols, rows) {\n const id = randomBytes(4).toString(\"hex\");\n const socketPath = `/tmp/shooter-term-${id}.sock`;\n const holderScript = resolveHolderPath();\n const holderArgs = [id, socketPath, cwd, String(cols), String(rows), command, ...args];\n const holder = fork(holderScript, holderArgs, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"]\n });\n holder.unref();\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n holder.kill();\n reject(new Error(\"Holder ready timeout\"));\n }, HOLDER_READY_TIMEOUT_MS);\n holder.on(\"message\", (msg) => {\n if (msg.type === \"ready\") {\n clearTimeout(timeout);\n holder.disconnect();\n resolve();\n }\n });\n holder.on(\"error\", (err) => {\n clearTimeout(timeout);\n reject(new Error(`Holder process error: ${err.message}`));\n });\n holder.on(\"exit\", (code) => {\n clearTimeout(timeout);\n reject(new Error(`Holder process exited with code ${code} before ready`));\n });\n });\n if (holder.pid === void 0 || holder.pid === null) {\n throw new Error(`Holder process forked but PID unavailable for terminal ${id}`);\n }\n const holderPid = holder.pid;\n const client = new HolderClient();\n const connectResult = await client.connect(socketPath);\n const now = /* @__PURE__ */ new Date();\n const terminal = {\n args,\n clients: /* @__PURE__ */ new Set(),\n cols,\n command,\n createdAt: now,\n currentCwd: null,\n cwd,\n exitCode: connectResult.exitCode,\n exitedAt: null,\n holderPid,\n id,\n isActive: false,\n openCodeNoopCb: null,\n openCodeSessionId: null,\n outputBuffers: /* @__PURE__ */ new Map(),\n pid: connectResult.pid,\n pollTimer: null,\n pty: client,\n rows,\n scrollback: connectResult.scrollback,\n sessionFile: null,\n socketPath,\n status: connectResult.exited ? \"exited\" : \"running\",\n watcherOffset: 0\n };\n this.wireHolderCallbacks(client, terminal);\n terminalStore.insert({\n args: JSON.stringify(args),\n cols,\n command,\n createdAt: now.toISOString(),\n cwd,\n exitCode: null,\n exitedAt: null,\n holderPid,\n id,\n opencodeSessionId: null,\n pid: connectResult.pid,\n rows,\n sessionFile: null,\n socketPath,\n status: \"running\"\n });\n this.startSessionDiscovery(terminal);\n this.terminals.set(id, terminal);\n broadcastEvent({\n command: terminal.command ?? command,\n terminalId: id,\n type: \"terminal-created\"\n });\n return terminal;\n }\n // -----------------------------------------------------------------------\n // get\n // -----------------------------------------------------------------------\n destroy() {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n for (const [id, terminal] of this.terminals) {\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n if (terminal.status === \"running\") {\n try {\n terminal.pty.kill(\"SIGTERM\");\n } catch {\n }\n if (terminal.holderPid > 0) {\n try {\n process.kill(terminal.holderPid, \"SIGKILL\");\n } catch {\n }\n }\n }\n terminal.pty.disconnect();\n for (const ws of terminal.clients) {\n try {\n ws.close();\n } catch {\n }\n }\n this.terminals.delete(id);\n }\n }\n // -----------------------------------------------------------------------\n // list — running first, then recently exited, each group sorted by\n // createdAt descending\n // -----------------------------------------------------------------------\n detach(id, ws) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return false;\n }\n terminal.clients.delete(ws);\n terminal.outputBuffers.delete(ws);\n return true;\n }\n // -----------------------------------------------------------------------\n // kill — route through holder: SIGTERM, then SIGKILL after 5 s\n // -----------------------------------------------------------------------\n disconnectAll() {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n for (const [, terminal] of this.terminals) {\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n terminal.pty.disconnect();\n for (const ws of terminal.clients) {\n try {\n ws.close();\n } catch {\n }\n }\n terminal.clients.clear();\n terminal.outputBuffers.clear();\n }\n this.terminals.clear();\n }\n // -----------------------------------------------------------------------\n // remove — remove an exited terminal from the map\n // -----------------------------------------------------------------------\n get(id) {\n return this.terminals.get(id) ?? null;\n }\n // -----------------------------------------------------------------------\n // resize\n // -----------------------------------------------------------------------\n getScrollback(id) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return null;\n }\n return terminal.scrollback;\n }\n // -----------------------------------------------------------------------\n // attach — register a WebSocket client and replay scrollback\n // -----------------------------------------------------------------------\n kill(id) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return false;\n }\n if (terminal.status === \"exited\") {\n return true;\n }\n try {\n terminal.pty.kill(\"SIGTERM\");\n } catch {\n terminal.status = \"exited\";\n terminal.exitedAt = /* @__PURE__ */ new Date();\n terminalStore.markExited(id, null);\n this.emitTerminalExited(id, null);\n return true;\n }\n setTimeout(() => {\n if (terminal.status === \"running\") {\n try {\n terminal.pty.kill(\"SIGKILL\");\n } catch {\n }\n terminal.status = \"exited\";\n terminal.exitedAt = terminal.exitedAt ?? /* @__PURE__ */ new Date();\n terminalStore.markExited(id, null);\n this.emitTerminalExited(id, null);\n }\n }, SIGKILL_DELAY_MS);\n return true;\n }\n // -----------------------------------------------------------------------\n // detach — remove a WebSocket client\n // -----------------------------------------------------------------------\n list() {\n const all = Array.from(this.terminals.values());\n const running = all.filter((t) => t.status === \"running\").sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n const exited = all.filter((t) => t.status === \"exited\").sort((a, b) => {\n const aTime = a.exitedAt?.getTime() ?? a.createdAt.getTime();\n const bTime = b.exitedAt?.getTime() ?? b.createdAt.getTime();\n return bTime - aTime;\n });\n return [...running, ...exited];\n }\n // -----------------------------------------------------------------------\n // getScrollback — return raw scrollback data for replay\n // -----------------------------------------------------------------------\n async reconnectAll() {\n const running = terminalStore.listRunning();\n if (running.length === 0) {\n console.log(\"[pty-manager] No persisted terminals to reconnect\");\n return;\n }\n console.log(`[pty-manager] Reconnecting to ${running.length} persisted terminal(s)...`);\n for (const record of running) {\n try {\n await this.reconnectOne(record);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.warn(`[pty-manager] Failed to reconnect terminal ${record.id}: ${errMsg}`);\n this.handleReconnectFailure(record);\n }\n }\n }\n // -----------------------------------------------------------------------\n // cleanup — evict exited terminals older than 1 hour, cap at 10 exited;\n // also clean up old SQLite records\n // -----------------------------------------------------------------------\n remove(id) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return false;\n }\n if (terminal.status === \"running\") {\n return false;\n }\n this.evict(id);\n return true;\n }\n // -----------------------------------------------------------------------\n // destroy — emergency forced kill (kills holder processes too)\n // -----------------------------------------------------------------------\n resize(id, cols, rows) {\n const terminal = this.terminals.get(id);\n if (!terminal || terminal.status === \"exited\") {\n return false;\n }\n try {\n terminal.pty.resize(cols, rows);\n terminal.cols = cols;\n terminal.rows = rows;\n return true;\n } catch {\n return false;\n }\n }\n // -----------------------------------------------------------------------\n // Private: reconnectOne — reconnect to a single persisted terminal\n // -----------------------------------------------------------------------\n appendScrollback(terminal, data) {\n terminal.scrollback += data;\n if (Buffer.byteLength(terminal.scrollback, \"utf8\") > MAX_SCROLLBACK_BYTES) {\n const mid = Math.floor(terminal.scrollback.length / 2);\n const newlineIdx = terminal.scrollback.indexOf(\"\\n\", mid);\n if (newlineIdx !== -1) {\n terminal.scrollback = terminal.scrollback.slice(newlineIdx + 1);\n } else {\n terminal.scrollback = terminal.scrollback.slice(mid);\n }\n }\n }\n // -----------------------------------------------------------------------\n // Private: handleReconnectFailure — handle failed reconnection\n // -----------------------------------------------------------------------\n broadcastOutput(terminal, data) {\n const msg = JSON.stringify({ data, type: \"output\" });\n for (const ws of terminal.clients) {\n if (ws.bufferedAmount > MAX_OUTPUT_BUFFER_BYTES) {\n this.safeSend(ws, JSON.stringify({ bytes: data.length, type: \"output-dropped\" }));\n continue;\n }\n const buffer = terminal.outputBuffers.get(ws);\n if (!buffer) {\n continue;\n }\n const msgSize = Buffer.byteLength(msg, \"utf8\");\n if (buffer.size + msgSize > MAX_OUTPUT_BUFFER_BYTES) {\n let droppedBytes = 0;\n while (buffer.size + msgSize > MAX_OUTPUT_BUFFER_BYTES && buffer.data.length > 0) {\n const dropped = buffer.data.shift();\n if (dropped) {\n const droppedSize = Buffer.byteLength(dropped, \"utf8\");\n buffer.size -= droppedSize;\n droppedBytes += droppedSize;\n }\n }\n if (droppedBytes > 0) {\n const dropMsg = JSON.stringify({\n bytes: droppedBytes,\n type: \"output-dropped\"\n });\n this.safeSend(ws, dropMsg);\n }\n }\n buffer.data.push(msg);\n buffer.size += msgSize;\n this.flushOutputBuffer(ws, buffer);\n }\n }\n // -----------------------------------------------------------------------\n // Private: startSessionDiscovery — polling for session files\n // -----------------------------------------------------------------------\n /** Broadcast a terminal-exited event to /ws/events for the activity feed. */\n emitTerminalExited(terminalId, exitCode) {\n broadcastEvent({\n code: exitCode ?? null,\n terminalId,\n type: \"terminal-exited\"\n });\n }\n /** Evict a terminal, freeing all resources. */\n evict(id) {\n const terminal = this.terminals.get(id);\n if (!terminal) {\n return;\n }\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n if (terminal.openCodeSessionId && terminal.openCodeNoopCb) {\n openCodeWatcher.stop(terminal.openCodeSessionId, terminal.openCodeNoopCb);\n terminal.openCodeNoopCb = null;\n }\n terminal.pty.disconnect();\n for (const ws of terminal.clients) {\n try {\n ws.close();\n } catch {\n }\n }\n terminal.clients.clear();\n terminal.outputBuffers.clear();\n terminal.scrollback = \"\";\n this.terminals.delete(id);\n }\n // -----------------------------------------------------------------------\n // Private: appendScrollback — append to cached scrollback string,\n // trim from midpoint when cap exceeded\n // -----------------------------------------------------------------------\n /** Attempt to flush buffered messages to a WebSocket client. */\n flushOutputBuffer(ws, buffer) {\n while (buffer.data.length > 0) {\n const msg = buffer.data[0];\n if (!this.safeSend(ws, msg)) {\n break;\n }\n buffer.data.shift();\n buffer.size -= Buffer.byteLength(msg, \"utf8\");\n }\n }\n // -----------------------------------------------------------------------\n // Private: broadcastOutput — send output to all connected WS clients\n // with backpressure management\n // -----------------------------------------------------------------------\n handleReconnectFailure(record) {\n if (record.holderPid) {\n try {\n process.kill(record.holderPid, 0);\n console.warn(\n `[pty-manager] Holder PID ${record.holderPid} alive but socket dead for ${record.id}`\n );\n } catch {\n }\n }\n if (record.socketPath) {\n const exitFilePath = `${record.socketPath}.exit`;\n if (existsSync(exitFilePath)) {\n try {\n const exitData = JSON.parse(readFileSync(exitFilePath, \"utf8\"));\n unlinkSync(exitFilePath);\n terminalStore.markExited(record.id, exitData.code);\n console.log(\n `[pty-manager] Terminal ${record.id} exited while disconnected (code=${exitData.code})`\n );\n return;\n } catch {\n }\n }\n }\n terminalStore.markOrphaned(record.id);\n console.log(`[pty-manager] Marked terminal ${record.id} as orphaned`);\n }\n async reconnectOne(record) {\n if (!record.socketPath) {\n throw new Error(\"No socket path stored\");\n }\n const exitFilePath = `${record.socketPath}.exit`;\n if (existsSync(exitFilePath)) {\n try {\n const exitData = JSON.parse(readFileSync(exitFilePath, \"utf8\"));\n unlinkSync(exitFilePath);\n terminalStore.markExited(record.id, exitData.code);\n console.log(\n `[pty-manager] Terminal ${record.id} exited while disconnected (code=${exitData.code})`\n );\n return;\n } catch {\n }\n }\n const client = new HolderClient();\n const connectResult = await client.connect(record.socketPath);\n let parsedArgs = [];\n try {\n parsedArgs = JSON.parse(record.args);\n } catch {\n }\n const terminal = {\n args: parsedArgs,\n clients: /* @__PURE__ */ new Set(),\n cols: record.cols,\n command: record.command,\n createdAt: new Date(record.createdAt),\n currentCwd: null,\n cwd: record.cwd,\n exitCode: connectResult.exitCode,\n exitedAt: record.exitedAt ? new Date(record.exitedAt) : null,\n holderPid: record.holderPid ?? 0,\n id: record.id,\n isActive: false,\n openCodeNoopCb: null,\n openCodeSessionId: record.opencodeSessionId ?? null,\n outputBuffers: /* @__PURE__ */ new Map(),\n pid: connectResult.pid,\n pollTimer: null,\n pty: client,\n rows: record.rows,\n scrollback: connectResult.scrollback,\n sessionFile: record.sessionFile ?? null,\n socketPath: record.socketPath,\n status: connectResult.exited ? \"exited\" : \"running\",\n watcherOffset: 0\n };\n if (connectResult.exited) {\n terminal.exitedAt = terminal.exitedAt ?? /* @__PURE__ */ new Date();\n terminalStore.markExited(record.id, connectResult.exitCode);\n }\n this.wireHolderCallbacks(client, terminal);\n if (terminal.sessionFile) ;\n if (terminal.openCodeSessionId) {\n const noopCb = (_messages) => {\n };\n terminal.openCodeNoopCb = noopCb;\n openCodeWatcher.watch(terminal.openCodeSessionId, noopCb);\n }\n if (!terminal.sessionFile && !terminal.openCodeSessionId && terminal.status === \"running\") {\n this.startSessionDiscovery(terminal);\n }\n if (record.pid !== connectResult.pid) {\n terminalStore.update(record.id, { pid: connectResult.pid });\n }\n this.terminals.set(record.id, terminal);\n console.log(\n `[pty-manager] Reconnected terminal ${record.id} (pid=${connectResult.pid}, holder=${record.holderPid}, status=${terminal.status})`\n );\n }\n /** Safely send a message to a WebSocket, returning false on failure. */\n safeSend(ws, msg) {\n try {\n if (ws.readyState !== 1) {\n return false;\n }\n ws.send(msg);\n return true;\n } catch {\n return false;\n }\n }\n /** Send cached scrollback data to a newly connected client in 50 KB chunks. */\n async sendScrollback(terminal, ws) {\n const fullData = terminal.scrollback;\n if (fullData.length === 0) {\n return;\n }\n const totalBytes = Buffer.byteLength(fullData, \"utf8\");\n const totalChunks = Math.ceil(totalBytes / SCROLLBACK_CHUNK_SIZE);\n if (totalChunks <= 1) {\n const msg = JSON.stringify({\n chunk: 1,\n data: fullData,\n total: 1,\n type: \"scrollback\"\n });\n this.safeSend(ws, msg);\n return;\n }\n const buf = Buffer.from(fullData, \"utf8\");\n let offset = 0;\n let chunkIndex = 1;\n while (offset < buf.length) {\n if (ws.bufferedAmount > SCROLLBACK_CHUNK_SIZE * 2) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n const end = Math.min(offset + SCROLLBACK_CHUNK_SIZE, buf.length);\n const chunkData = buf.subarray(offset, end).toString(\"utf8\");\n const msg = JSON.stringify({\n chunk: chunkIndex,\n data: chunkData,\n total: totalChunks,\n type: \"scrollback\"\n });\n this.safeSend(ws, msg);\n offset = end;\n chunkIndex++;\n }\n }\n startSessionDiscovery(terminal) {\n const { command, cwd, id } = terminal;\n if (command === \"claude\") {\n const projectDir = path__default.join(\n process.env.HOME || \"\",\n \".claude\",\n \"projects\",\n cwd.replace(/\\//g, \"-\")\n );\n const resumeIdx = terminal.args.indexOf(\"--resume\");\n if (resumeIdx !== -1 && resumeIdx + 1 < terminal.args.length) {\n const resumeId = terminal.args[resumeIdx + 1];\n if (!/^[0-9a-f-]+$/i.test(resumeId)) {\n console.warn(`[pty-manager] Invalid resume ID: ${resumeId}`);\n } else {\n const resumeFile = path__default.join(projectDir, `${resumeId}.jsonl`);\n if (existsSync(resumeFile)) {\n terminal.sessionFile = resumeFile;\n terminalStore.update(id, { sessionFile: resumeFile });\n return;\n }\n }\n }\n const launchTime = terminal.createdAt.getTime();\n terminal.pollTimer = setInterval(() => {\n if (terminal.status === \"exited\" || terminal.sessionFile) {\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n return;\n }\n try {\n if (!existsSync(projectDir)) {\n return;\n }\n const files = readdirSync(projectDir).filter((f) => f.endsWith(\".jsonl\")).map((f) => {\n const stat = statSync(path__default.join(projectDir, f));\n return {\n birthtime: stat.birthtimeMs,\n fullPath: path__default.join(projectDir, f),\n mtime: stat.mtimeMs,\n name: f\n };\n }).filter((f) => f.birthtime > launchTime).sort((a, b) => b.birthtime - a.birthtime);\n if (files.length > 0) {\n terminal.sessionFile = files[0].fullPath;\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n terminalStore.update(id, { sessionFile: terminal.sessionFile });\n }\n } catch {\n }\n }, 1500);\n setTimeout(\n () => {\n if (terminal.pollTimer) {\n clearInterval(terminal.pollTimer);\n terminal.pollTimer = null;\n }\n },\n 5 * 60 * 1e3\n );\n }\n if (command === \"opencode\") {\n const launchTime = terminal.createdAt.getTime();\n const pollInterval = setInterval(() => {\n if (terminal.status === \"exited\" || terminal.openCodeSessionId) {\n clearInterval(pollInterval);\n if (terminal.openCodeSessionId) {\n const noopCb = (_messages) => {\n };\n terminal.openCodeNoopCb = noopCb;\n openCodeWatcher.watch(terminal.openCodeSessionId, noopCb);\n }\n return;\n }\n const sessionId = openCodeWatcher.findSessionId(cwd, launchTime);\n if (sessionId) {\n terminal.openCodeSessionId = sessionId;\n clearInterval(pollInterval);\n const noopCb = (_messages) => {\n };\n terminal.openCodeNoopCb = noopCb;\n openCodeWatcher.watch(sessionId, noopCb);\n terminalStore.update(id, { opencodeSessionId: sessionId });\n }\n }, 2e3);\n terminal.pollTimer = pollInterval;\n setTimeout(\n () => {\n clearInterval(pollInterval);\n terminal.pollTimer = null;\n },\n 5 * 60 * 1e3\n );\n }\n }\n /** Wire up all HolderClient callbacks (activity, CWD, output, exit, disconnect). */\n wireHolderCallbacks(client, terminal) {\n client.onActivity((active) => {\n terminal.isActive = active;\n const msg = JSON.stringify({ active, type: \"activity\" });\n for (const ws of terminal.clients) {\n this.safeSend(ws, msg);\n }\n });\n client.onCwd((path2) => {\n terminal.currentCwd = path2;\n const msg = JSON.stringify({ path: path2, type: \"cwd\" });\n for (const ws of terminal.clients) {\n this.safeSend(ws, msg);\n }\n });\n client.onOutput((data) => {\n this.appendScrollback(terminal, data);\n this.broadcastOutput(terminal, data);\n });\n client.onExit((exitCode) => {\n terminal.status = \"exited\";\n terminal.exitCode = exitCode;\n terminal.exitedAt = /* @__PURE__ */ new Date();\n terminalStore.markExited(terminal.id, exitCode);\n this.emitTerminalExited(terminal.id, exitCode);\n const exitMsg = JSON.stringify({\n code: exitCode,\n signal: null,\n type: \"exit\"\n });\n for (const ws of terminal.clients) {\n this.safeSend(ws, exitMsg);\n }\n });\n client.onDisconnect(() => {\n if (terminal.status === \"running\") {\n console.warn(`[pty-manager] Holder disconnected unexpectedly for terminal ${terminal.id}`);\n terminal.status = \"exited\";\n terminal.exitedAt = /* @__PURE__ */ new Date();\n terminalStore.markOrphaned(terminal.id);\n this.emitTerminalExited(terminal.id, null);\n }\n });\n }\n}\nfunction resolveHolderPath() {\n if (process.env.SHOOTER_HOLDER_PATH) {\n return process.env.SHOOTER_HOLDER_PATH;\n }\n const colocated = path__default.join(__dirname$1, \"pty-holder.cjs\");\n if (existsSync(colocated)) {\n return colocated;\n }\n return path__default.resolve(__dirname$1, \"..\", \"..\", \"pty-holder.cjs\");\n}\nconst PTY_GLOBAL_KEY = \"__shooter_pty_manager\";\nconst ptyManager = globalThis[PTY_GLOBAL_KEY] || new PtyManager();\nglobalThis[PTY_GLOBAL_KEY] = ptyManager;\nexport {\n ptyManager as p\n};\n"],"names":[],"mappings":"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"}