cli-jaw 2.17.62 → 2.17.63

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 (360) hide show
  1. package/README.ja.md +17 -17
  2. package/README.ko.md +17 -17
  3. package/README.md +17 -17
  4. package/README.zh-CN.md +17 -17
  5. package/dist/bin/commands/tui/input-handler.js +19 -0
  6. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  7. package/dist/bin/commands/tui/overlays.js +8 -4
  8. package/dist/bin/commands/tui/overlays.js.map +1 -1
  9. package/dist/bin/star-prompt.js +1 -1
  10. package/dist/bin/star-prompt.js.map +1 -1
  11. package/dist/server.js +14 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/src/agent/claude-runtime-pool.js +2 -1
  14. package/dist/src/agent/claude-runtime-pool.js.map +1 -1
  15. package/dist/src/agent/claude-runtime-run.js +28 -7
  16. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  17. package/dist/src/agent/lifecycle-handler.js +34 -6
  18. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  19. package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
  20. package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
  21. package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
  22. package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
  23. package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
  24. package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
  25. package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
  26. package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
  27. package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
  28. package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
  29. package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
  30. package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
  31. package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
  32. package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
  33. package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
  34. package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
  35. package/dist/src/agent/spawn/backend-codex-app.js +619 -0
  36. package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
  37. package/dist/src/agent/spawn/backend-context.js +2 -0
  38. package/dist/src/agent/spawn/backend-context.js.map +1 -0
  39. package/dist/src/agent/spawn/backend-copilot.js +385 -0
  40. package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
  41. package/dist/src/agent/spawn/backend-native-acp.js +379 -0
  42. package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
  43. package/dist/src/agent/spawn/backend-pi.js +565 -0
  44. package/dist/src/agent/spawn/backend-pi.js.map +1 -0
  45. package/dist/src/agent/spawn/types.js +2 -0
  46. package/dist/src/agent/spawn/types.js.map +1 -0
  47. package/dist/src/agent/spawn.js +44 -1858
  48. package/dist/src/agent/spawn.js.map +1 -1
  49. package/dist/src/cli/claude-default-model-boot.js +36 -0
  50. package/dist/src/cli/claude-default-model-boot.js.map +1 -0
  51. package/dist/src/cli/claude-model-discovery.js +13 -1
  52. package/dist/src/cli/claude-model-discovery.js.map +1 -1
  53. package/dist/src/cli/claude-models.js +7 -1
  54. package/dist/src/cli/claude-models.js.map +1 -1
  55. package/dist/src/cli/commands.js +5 -15
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/tui/composer.js +3 -3
  58. package/dist/src/cli/tui/composer.js.map +1 -1
  59. package/dist/src/cli/tui/skill-mention.js +15 -0
  60. package/dist/src/cli/tui/skill-mention.js.map +1 -0
  61. package/dist/src/code-mode/manager.js +174 -9
  62. package/dist/src/code-mode/manager.js.map +1 -1
  63. package/dist/src/code-mode/providers/catalog.js +5 -3
  64. package/dist/src/code-mode/providers/catalog.js.map +1 -1
  65. package/dist/src/code-mode/providers/claude-history.js +132 -0
  66. package/dist/src/code-mode/providers/claude-history.js.map +1 -0
  67. package/dist/src/code-mode/providers/claude.js +74 -7
  68. package/dist/src/code-mode/providers/claude.js.map +1 -1
  69. package/dist/src/code-mode/providers/codex-app.js +7 -1
  70. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  71. package/dist/src/code-mode/session.js +158 -11
  72. package/dist/src/code-mode/session.js.map +1 -1
  73. package/dist/src/code-mode/store.js +416 -28
  74. package/dist/src/code-mode/store.js.map +1 -1
  75. package/dist/src/command-contract/catalog.js +3 -22
  76. package/dist/src/command-contract/catalog.js.map +1 -1
  77. package/dist/src/core/codex-config.js +3 -62
  78. package/dist/src/core/codex-config.js.map +1 -1
  79. package/dist/src/core/config.js +116 -14
  80. package/dist/src/core/config.js.map +1 -1
  81. package/dist/src/core/runtime-settings.js +20 -10
  82. package/dist/src/core/runtime-settings.js.map +1 -1
  83. package/dist/src/core/settings-watch.js +1 -0
  84. package/dist/src/core/settings-watch.js.map +1 -1
  85. package/dist/src/core/skill-mentions.js +83 -0
  86. package/dist/src/core/skill-mentions.js.map +1 -0
  87. package/dist/src/manager/registry.js +5 -1
  88. package/dist/src/manager/registry.js.map +1 -1
  89. package/dist/src/manager/routes/desktop-status.js +1 -1
  90. package/dist/src/manager/routes/desktop-status.js.map +1 -1
  91. package/dist/src/orchestrator/pipeline.js +11 -1
  92. package/dist/src/orchestrator/pipeline.js.map +1 -1
  93. package/dist/src/prompt/builder.js +10 -4
  94. package/dist/src/prompt/builder.js.map +1 -1
  95. package/dist/src/prompt/templates/a1-system.md +1 -1
  96. package/dist/src/routes/code-native.js +51 -3
  97. package/dist/src/routes/code-native.js.map +1 -1
  98. package/dist/src/routes/settings.js +1 -4
  99. package/dist/src/routes/settings.js.map +1 -1
  100. package/dist/src/routes/skills.js +7 -0
  101. package/dist/src/routes/skills.js.map +1 -1
  102. package/dist/src/shared/skill-mention.js +61 -0
  103. package/dist/src/shared/skill-mention.js.map +1 -0
  104. package/dist/src/shared/tool-input.js +137 -0
  105. package/dist/src/shared/tool-input.js.map +1 -0
  106. package/package.json +7 -5
  107. package/public/css/activity.css +83 -20
  108. package/public/css/layout.css +2 -2
  109. package/public/css/sidebar.css +18 -0
  110. package/public/css/variables.css +23 -2
  111. package/public/dist/.vite/manifest.json +302 -334
  112. package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
  113. package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
  114. package/public/dist/assets/Agent-O_U8ny90.js +1 -0
  115. package/public/dist/assets/Browser-m6VynQXV.js +1 -0
  116. package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
  117. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
  118. package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
  119. package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
  120. package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
  121. package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
  122. package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
  123. package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
  124. package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
  125. package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
  126. package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
  127. package/public/dist/assets/Display-C0Zdamcb.js +1 -0
  128. package/public/dist/assets/Display-DU4_76cS.js +1 -0
  129. package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
  130. package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
  131. package/public/dist/assets/Employees-BanvF58d.js +1 -0
  132. package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
  133. package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
  134. package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
  135. package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
  136. package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
  137. package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
  138. package/public/dist/assets/Memory-C9I33pIi.js +1 -0
  139. package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
  140. package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
  141. package/public/dist/assets/Network-CuqFrOvR.js +1 -0
  142. package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
  143. package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
  144. package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
  145. package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
  146. package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
  147. package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
  148. package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
  149. package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
  150. package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
  151. package/public/dist/assets/app-BjKzqXCv.css +1 -0
  152. package/public/dist/assets/app-CZwx0V6K.js +59 -0
  153. package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
  154. package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
  155. package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
  156. package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
  157. package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
  158. package/public/dist/assets/fields-CicOWY-X.js +1 -0
  159. package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
  160. package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
  161. package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
  162. package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
  163. package/public/dist/assets/manager-D9rhKFKc.css +1 -0
  164. package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
  165. package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
  166. package/public/dist/assets/memory-PPofQPeB.js +1 -0
  167. package/public/dist/assets/message-history-DcjBuubA.js +4 -0
  168. package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
  169. package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
  170. package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
  171. package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
  172. package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
  173. package/public/dist/assets/settings-DMiQe469.js +1 -0
  174. package/public/dist/assets/settings-DgAlohx9.js +1 -0
  175. package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
  176. package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
  177. package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
  178. package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
  179. package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
  180. package/public/dist/assets/shared-D1begqvi.js +1 -0
  181. package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
  182. package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
  183. package/public/dist/assets/skills-DeNVAVgt.js +1 -0
  184. package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
  185. package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
  186. package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
  187. package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
  188. package/public/dist/assets/ui-BbR_fFiK.js +1 -0
  189. package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
  190. package/public/dist/index.html +11 -3
  191. package/public/dist/manager/index.html +3 -3
  192. package/public/dist/settings/index.html +2 -2
  193. package/public/index.html +9 -1
  194. package/public/js/features/activity-history.ts +50 -21
  195. package/public/js/features/activity-rows.ts +158 -10
  196. package/public/js/features/activity-view.ts +5 -5
  197. package/public/js/features/chat.ts +2 -0
  198. package/public/js/features/employees.ts +1 -0
  199. package/public/js/features/resize-guard.ts +39 -0
  200. package/public/js/features/settings-cli-status.ts +49 -17
  201. package/public/js/features/settings-types.ts +39 -1
  202. package/public/js/features/skill-mentions.ts +143 -0
  203. package/public/js/main.ts +15 -0
  204. package/public/js/virtual-scroll.ts +67 -1
  205. package/public/locales/en.json +2 -0
  206. package/public/locales/ja.json +2 -0
  207. package/public/locales/ko.json +2 -0
  208. package/public/locales/zh.json +2 -0
  209. package/public/manager/src/AppChrome.tsx +2 -0
  210. package/public/manager/src/InstancePreview.tsx +1 -1
  211. package/public/manager/src/SidebarRailRouter.tsx +3 -1
  212. package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
  213. package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
  214. package/public/manager/src/client-platform.ts +18 -0
  215. package/public/manager/src/code/CodeCanvas.tsx +4 -2
  216. package/public/manager/src/code/CodeComposer.tsx +22 -10
  217. package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
  218. package/public/manager/src/code/CodeSessionList.tsx +154 -40
  219. package/public/manager/src/code/CodeTranscript.tsx +104 -16
  220. package/public/manager/src/code/CodeWorkbench.tsx +21 -11
  221. package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
  222. package/public/manager/src/code/ComposerFooter.tsx +9 -1
  223. package/public/manager/src/code/code-composer.css +1 -1
  224. package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
  225. package/public/manager/src/code/code-controller-drafts.ts +33 -6
  226. package/public/manager/src/code/code-controller-runtime.ts +189 -17
  227. package/public/manager/src/code/code-controller-types.ts +19 -1
  228. package/public/manager/src/code/code-recent-workspaces.ts +25 -0
  229. package/public/manager/src/code/code-session-client.ts +19 -1
  230. package/public/manager/src/code/code-session-sidebar.css +38 -0
  231. package/public/manager/src/code/code-session-state.ts +2 -0
  232. package/public/manager/src/code/code-types.ts +47 -0
  233. package/public/manager/src/code/code-workbench.css +36 -1
  234. package/public/manager/src/code/code.css +171 -7
  235. package/public/manager/src/code/session-order.ts +80 -0
  236. package/public/manager/src/code/tool-summary.ts +45 -11
  237. package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
  238. package/public/manager/src/hooks/useCommandPalette.ts +3 -7
  239. package/public/manager/src/main.tsx +1 -0
  240. package/public/manager/src/manager-components.css +25 -23
  241. package/public/manager/src/manager-dashboard-reminders.css +2 -2
  242. package/public/manager/src/manager-layout.css +1 -1
  243. package/public/manager/src/manager-shortcut-runner.ts +9 -2
  244. package/public/manager/src/manager-shortcuts.ts +83 -21
  245. package/public/manager/src/panels/desktop-bridge.ts +4 -1
  246. package/public/manager/src/panels/panels.css +9 -0
  247. package/public/manager/src/preview.ts +19 -4
  248. package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
  249. package/public/manager/src/settings/pages/Browser.tsx +45 -47
  250. package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
  251. package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
  252. package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
  253. package/public/manager/src/settings/pages/Display.tsx +2 -1
  254. package/public/manager/src/settings/pages/Employees.tsx +3 -3
  255. package/public/manager/src/settings/pages/Mcp.tsx +220 -200
  256. package/public/manager/src/settings/pages/Memory.tsx +35 -41
  257. package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
  258. package/public/manager/src/settings/pages/Network.tsx +5 -4
  259. package/public/manager/src/settings/pages/Permissions.tsx +38 -16
  260. package/public/manager/src/settings/pages/Prompts.tsx +12 -9
  261. package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
  262. package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
  263. package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
  264. package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
  265. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
  266. package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
  267. package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
  268. package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
  269. package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
  270. package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
  271. package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
  272. package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
  273. package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
  274. package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
  275. package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
  276. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
  277. package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
  278. package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
  279. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
  280. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
  281. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
  282. package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
  283. package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
  284. package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
  285. package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
  286. package/public/manager/src/settings/pages/page-shell.tsx +66 -0
  287. package/public/manager/src/settings-agent.css +185 -36
  288. package/public/manager/src/settings-standalone.tsx +1 -0
  289. package/public/manager/src/settings-surface.css +96 -0
  290. package/public/manager/src/types.ts +1 -0
  291. package/scripts/ci/install-ripgrep.sh +35 -0
  292. package/scripts/collect-fresh-install-evidence.sh +2 -2
  293. package/scripts/install-risk-gate.mjs +2 -3
  294. package/scripts/install-wsl.sh +1 -1
  295. package/scripts/install.ps1 +1 -1
  296. package/scripts/install.sh +1 -1
  297. package/scripts/release-1.6.0.sh +1 -1
  298. package/scripts/release-gates.mjs +48 -13
  299. package/scripts/release-preview.sh +2 -2
  300. package/scripts/restack-pr.sh +88 -0
  301. package/scripts/verify-electron-update-metadata.mjs +1 -1
  302. package/scripts/windows-support-contract.json +1 -1
  303. package/public/dist/assets/Activity-BUrp73Re.js +0 -1
  304. package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
  305. package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
  306. package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
  307. package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
  308. package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
  309. package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
  310. package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
  311. package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
  312. package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
  313. package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
  314. package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
  315. package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
  316. package/public/dist/assets/Display-BHGFX3O0.js +0 -1
  317. package/public/dist/assets/Display-BW-_pKRf.js +0 -1
  318. package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
  319. package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
  320. package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
  321. package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
  322. package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
  323. package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
  324. package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
  325. package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
  326. package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
  327. package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
  328. package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
  329. package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
  330. package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
  331. package/public/dist/assets/Profile-DPqrYA44.js +0 -1
  332. package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
  333. package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
  334. package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
  335. package/public/dist/assets/app-ByMfeXp-.js +0 -55
  336. package/public/dist/assets/app-DAJWqs33.css +0 -1
  337. package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
  338. package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
  339. package/public/dist/assets/fields-mlGpofqQ.js +0 -1
  340. package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
  341. package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
  342. package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
  343. package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
  344. package/public/dist/assets/manager-BnQHAKk6.css +0 -1
  345. package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
  346. package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
  347. package/public/dist/assets/message-history-D2vniu04.js +0 -4
  348. package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
  349. package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
  350. package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
  351. package/public/dist/assets/settings-W4KG9ivu.js +0 -1
  352. package/public/dist/assets/settings-WVGhtneN.js +0 -1
  353. package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
  354. package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
  355. package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
  356. package/public/dist/assets/shared-CiNP20HB.js +0 -1
  357. package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
  358. package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
  359. package/public/dist/assets/ui-TUyJsMUf.js +0 -1
  360. package/public/manager/src/settings/pages/components/EngineSubsection.tsx +0 -25
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{d as r,l as i}from"./page-shell-DfinU3mb.js";import{a,r as o}from"./ChannelEnablementControl-BSuKQhTW.js";var s=e(t(),1),c=n();function l({client:e,label:t,endpoint:n,method:a=`GET`,interpret:o,auto:l=!1}){let[f,p]=(0,s.useState)({kind:`idle`}),m=(0,s.useRef)(null),h=(0,s.useRef)(!0),g=(0,s.useCallback)(async()=>{m.current?.abort();let t=new AbortController;m.current=t,p({kind:`checking`});try{let r=a===`POST`?await e.post(n,{},{signal:t.signal}):await e.get(n,{signal:t.signal});if(!h.current||t.signal.aborted)return;p(o(r))}catch(e){if(!h.current||t.signal.aborted)return;if(e instanceof r&&e.status===404){p({kind:`unknown`,reason:`Probe endpoint not implemented on this instance.`});return}let n=e instanceof Error?e.message:String(e);p({kind:`error`,reason:n})}},[e,n,o,a]);(0,s.useEffect)(()=>(h.current=!0,l&&g(),()=>{h.current=!1,m.current?.abort()}),[l,g]);let _=f.kind===`ok`?`ok`:f.kind===`degraded`?`warn`:f.kind===`error`?`error`:`neutral`;return(0,c.jsxs)(`div`,{className:`settings-health-badge settings-card-toolbar`,role:`status`,"aria-live":`polite`,children:[(0,c.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>void g(),disabled:f.kind===`checking`,children:f.kind===`checking`?`Checking…`:`Check ${t}`}),(0,c.jsx)(i,{tone:_,children:u(f)}),d(f)?(0,c.jsx)(`span`,{className:`settings-health-detail settings-field-hint`,children:d(f)}):null]})}function u(e){switch(e.kind){case`idle`:return`Not checked`;case`checking`:return`Checking`;case`ok`:return`Healthy`;case`degraded`:return`Degraded`;case`unknown`:return`Unknown`;case`error`:return`Error`}}function d(e){return e.kind===`ok`&&e.detail||e.kind===`degraded`?e.detail:e.kind===`unknown`||e.kind===`error`?e.reason:null}function f(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty probe response.`};let t=e;if(t.ok===!0){let e=typeof t.username==`string`?t.username:void 0;return e?{kind:`ok`,detail:`@${e}`}:{kind:`ok`}}return{kind:`error`,reason:typeof t.error==`string`?t.error:`Probe failed.`}}function p(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty health response.`};let t=e,n=t.discord&&typeof t.discord==`object`?t.discord:null;return n?n.ready===!0&&n.degraded!==!0?{kind:`ok`}:n.degraded===!0?{kind:`degraded`,detail:typeof n.degradedReason==`string`?n.degradedReason:`MESSAGE_CONTENT intent missing — slash commands only.`}:n.ready===!1?{kind:`error`,reason:typeof n.error==`string`?n.error:`Bot not connected.`}:{kind:`unknown`,reason:`Discord status indeterminate.`}:{kind:`unknown`,reason:`No discord block in /api/health.`}}function m({channel:e,client:t,dirty:n,open:r,onOpenChange:i,onSaved:l,disabled:u=!1}){let d=(0,s.useRef)(null),f=(0,s.useRef)(!1),p=`${e}.setup`,m=(0,s.useMemo)(()=>a(document.documentElement.lang),[]);(0,s.useEffect)(()=>(f.current=!0,()=>{f.current=!1,n.remove(p)}),[t,n,p]);let h=!r&&n.isDirty();return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`button`,{ref:d,type:`button`,className:`settings-action`,"data-onboard-channel":e,disabled:u||r||h,onClick:()=>{u||n.isDirty()||(n.set(p,{value:!0,original:!1,valid:!1}),i(!0))},children:m(`onboarding.open`)}),h&&(0,c.jsx)(`span`,{className:`settings-field-hint`,children:`Save or discard your changes before opening setup.`}),r&&(0,c.jsx)(o,{channel:e,client:t,t:m,initialDraft:{},returnFocus:d.current,onBeforeSave:()=>async()=>{f.current&&(await l(),f.current&&n.remove(p))},onClose:()=>{n.remove(p),i(!1)}},e)]})}export{f as i,l as n,p as r,m as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{a as r,i,l as a,n as o,r as s,s as c,t as l,u}from"./page-shell-DfinU3mb.js";import{a as d,n as ee,o as te,s as ne}from"./fields-CicOWY-X.js";import{t as re}from"./path-utils-B6vBr0DD.js";import{a as ie,n as f,t as p}from"./ChannelEnablementControl-BSuKQhTW.js";import{n as m,r as h,t as g}from"./ChannelSetupEntry-DHLoZEzJ.js";var _=e(t(),1),v=n(),y=[`messaging.enabledChannels`,`messaging.homeChannel`,`discord.enabled`,`discord.token`,`discord.guildId`,`discord.channelIds`,`discord.forwardAll`,`discord.allowBots`,`discord.mentionOnly`],b=[`discord.enabled`,`discord.token`,`discord.guildId`,`discord.channelIds`];function x(e){return e?/^\d{5,32}$/.test(e.trim()):!1}function S({port:e,client:t,dirty:n,registerSave:S,manager:w}){let T=(0,_.useMemo)(()=>ie(w?.ui.locale??document.documentElement.lang),[w?.ui.locale]),{state:E,refresh:D,setData:O}=u(t,`/api/settings`),[k,A]=(0,_.useState)(!1),[j,M]=(0,_.useState)([]),[N,P]=(0,_.useState)(`telegram`),[F,I]=(0,_.useState)(!1),[L,R]=(0,_.useState)(``),[z,B]=(0,_.useState)(``),[V,H]=(0,_.useState)([]),[U,W]=(0,_.useState)(!0),[ae,G]=(0,_.useState)(!1),[oe,K]=(0,_.useState)(!1);(0,_.useEffect)(()=>{if(E.kind!==`ready`)return;let e=E.data.messaging||{},t=Array.isArray(e.enabledChannels)?e.enabledChannels:[];M(t.filter(C)),P(C(e.homeChannel)?e.homeChannel:`telegram`);let n=E.data.discord||{};I(!!n.enabled),R(``),B(n.guildId??``),H(Array.isArray(n.channelIds)?[...n.channelIds]:[]),W(n.forwardAll!==!1),G(!!n.allowBots),K(!!n.mentionOnly)},[E]),(0,_.useEffect)(()=>()=>{for(let e of y)n.remove(e)},[n]);let q=(0,_.useCallback)((e,t)=>n.set(e,t),[n]),J=(0,_.useMemo)(()=>E.kind===`ready`&&E.data.discord||{},[E]),Y=E.kind===`ready`&&Array.isArray(E.data.discordEnvironmentVariables)?E.data.discordEnvironmentVariables:[],X=Y.length>0,Z=(0,_.useRef)({environmentManaged:X,environmentVariables:Y,t:T});(0,_.useLayoutEffect)(()=>{Z.current={environmentManaged:X,environmentVariables:Y,t:T}},[X,Y,T]);let Q=(0,_.useCallback)(async()=>{if(k)throw Error(`Finish channel setup before saving settings.`);let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=Z.current;if(r.environmentManaged&&b.some(t=>t in e))throw Error(r.t(`settings.discord.managedByEnvironment`,{variables:r.environmentVariables.join(`, `)}));let i=re(e),a=await t.put(`/api/settings`,i),o=a&&typeof a==`object`&&`data`in a?a.data:a;n.clear(),O(o);let s=o.messaging||{};M(Array.isArray(s.enabledChannels)?s.enabledChannels.filter(C):[]),P(C(s.homeChannel)?s.homeChannel:`telegram`);let c=o.discord||{};I(!!c.enabled),R(``),B(c.guildId??``),H(Array.isArray(c.channelIds)?[...c.channelIds]:[]),W(c.forwardAll!==!1),G(!!c.allowBots),K(!!c.mentionOnly),await D()},[t,n,D,O,k]);if((0,_.useEffect)(()=>{if(S)return S(Q),()=>S(null)},[S,Q]),E.kind===`loading`)return(0,v.jsx)(o,{});if(E.kind===`offline`)return(0,v.jsx)(s,{port:e});if(E.kind===`error`)return(0,v.jsx)(l,{message:E.message});let se=J.token?J.token.slice(-4):``,ce=J.token?`••••••••${se}`:`(empty)`,le=z&&!x(z)?`Guild ID must be a numeric snowflake.`:null,$=V.filter(e=>!x(e)),ue=$.length>0?`Snowflake IDs only — invalid: ${$.join(`, `)}`:null;return(0,v.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),Q()},children:[(0,v.jsxs)(`fieldset`,{disabled:k,className:`settings-slack-fields`,children:[(0,v.jsxs)(c,{title:`Status`,hint:`Live transport state plus a readiness probe for this channel.`,children:[(0,v.jsx)(r,{items:[{label:`Discord`,value:F?(0,v.jsx)(a,{tone:`ok`,children:`Enabled`}):(0,v.jsx)(a,{tone:`neutral`,children:`Disabled`})},...X?[{label:`Managed by`,value:Y.join(`, `),mono:!0}]:[]]}),(0,v.jsx)(f,{client:t,channel:`discord`}),(0,v.jsx)(m,{client:t,label:`Discord`,endpoint:`/api/health`,method:`GET`,interpret:h})]}),(0,v.jsxs)(c,{title:`Credentials`,hint:X?T(`settings.discord.managedByEnvironment`,{variables:Y.join(`, `)}):`Bot token, guild, and channel IDs.`,children:[(0,v.jsx)(d,{id:`dc-enabled`,label:`Discord enabled`,value:F,disabled:X,onChange:e=>{I(e),q(`discord.enabled`,{value:e,original:!!J.enabled,valid:!0})}}),(0,v.jsx)(te,{id:`dc-token`,label:`Bot token`,value:L,placeholder:ce,disabled:X,onChange:e=>{if(R(e),e.length===0){n.remove(`discord.token`);return}q(`discord.token`,{value:e,original:J.token??``,valid:!0})}}),(0,v.jsx)(ne,{id:`dc-guildId`,label:`Guild ID`,value:z,placeholder:`123456789012345678`,error:le,disabled:X,onChange:e=>{B(e);let t=e.length===0||x(e);q(`discord.guildId`,{value:e,original:J.guildId??``,valid:t})}}),(0,v.jsx)(ee,{id:`dc-channelIds`,label:`Channel IDs`,value:V,placeholder:`987654321098765432`,error:ue,disabled:X,onChange:e=>{H(e);let t=e.every(x);q(`discord.channelIds`,{value:e,original:J.channelIds??[],valid:t})}})]}),(0,v.jsxs)(c,{title:`Routing`,hint:`Choose which channels receive inbound chat and how replies are delivered. Outbound send can still work on any configured channel.`,children:[(0,v.jsx)(p,{pageChannel:`discord`,snapshot:E.kind===`ready`?E.data:{},enabledChannels:j,homeChannel:N,setEnabledChannels:M,setHomeChannel:P,dirty:n,idPrefix:`di-channel`}),(0,v.jsx)(d,{id:`dc-forwardAll`,label:`Forward all`,value:U,onChange:e=>{W(e),q(`discord.forwardAll`,{value:e,original:J.forwardAll!==!1,valid:!0})}}),(0,v.jsx)(d,{id:`dc-allowBots`,label:`Allow other bots`,value:ae,onChange:e=>{G(e),q(`discord.allowBots`,{value:e,original:!!J.allowBots,valid:!0})}}),(0,v.jsx)(d,{id:`dc-mentionOnly`,label:`Mention only`,value:oe,onChange:e=>{K(e),q(`discord.mentionOnly`,{value:e,original:!!J.mentionOnly,valid:!0})}})]})]}),(0,v.jsx)(c,{title:`Actions`,hint:`Guided setup validates credentials with the issuer before saving.`,children:(0,v.jsx)(i,{children:(0,v.jsx)(g,{channel:`discord`,client:t,dirty:n,disabled:X,open:k,onOpenChange:A,onSaved:async()=>O(await t.get(`/api/settings`))})})})]})}function C(e){return e===`telegram`||e===`discord`||e===`slack`}export{S as default,x as isValidSnowflake};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{a as r,d as i,i as a,l as o,n as s,o as c,r as l,s as u,t as ee,u as te}from"./page-shell-DfinU3mb.js";import{a as d,n as ne,o as re,s as ie}from"./fields-CicOWY-X.js";import{t as ae}from"./path-utils-B6vBr0DD.js";import{a as oe,i as se,n as ce,t as le}from"./ChannelEnablementControl-BSuKQhTW.js";function ue(e){return e.trim().length>0}function f(e){return e.trim().startsWith(`xoxb-`)}function p(e){return e.trim().startsWith(`xapp-`)}var m=e(t(),1),h=n(),g=[`slack.attachPort`,`channel`,`slack.enabled`,`slack.botToken`,`slack.appToken`,`slack.teamId`,`slack.channelIds`,`slack.forwardAll`,`slack.allowBots`,`slack.mentionOnly`,`slack.replyInThread`,`slack.ack.enabled`];function _(e){return e?/^[CGD][A-Z0-9]{6,20}$/.test(e.trim().toUpperCase()):!1}var v=[`slack.enabled`,`slack.botToken`,`slack.appToken`,`slack.teamId`,`slack.channelIds`,`slack.attachPort`],y=`slack.setup`,de=[`slack.enabled`,`slack.botToken`,`slack.appToken`,`slack.teamId`];function fe(e){return e&&typeof e==`object`&&`data`in e?e.data:e}function pe(e){if(!e||typeof e!=`object`||!e.slack)return!1;let t=e.slack;return!t?.enabled&&!t?.botToken&&!t?.appToken&&!t?.teamId&&!t?.channelIds?.length&&!t?.attachPort}function b({port:e,client:t,dirty:n,registerSave:b,manager:he}){let x=(0,m.useMemo)(()=>oe(he?.ui.locale??document.documentElement.lang),[he?.ui.locale]),[ge,_e]=(0,m.useState)(``),[S,ve]=(0,m.useState)(!1),C=(0,m.useRef)(!1),w=(0,m.useRef)(0),T=(0,m.useRef)(null),[E,D]=(0,m.useState)(!1),[O,k]=(0,m.useState)(null),[ye,A]=(0,m.useState)(0),j=(0,m.useRef)(!1),M=(0,m.useRef)(!1),N=(0,m.useRef)({}),[be,P]=(0,m.useState)(!1),[xe,F]=(0,m.useState)(!1);(0,m.useLayoutEffect)(()=>(M.current=!0,N.current={},()=>{M.current=!1,N.current={},++w.current}),[e,t]);let{state:I,refresh:L,setData:R}=te(t,`/api/settings`),[Se,z]=(0,m.useState)([]),[Ce,we]=(0,m.useState)(`telegram`),[Te,Ee]=(0,m.useState)(!1),[B,V]=(0,m.useState)(``),[H,U]=(0,m.useState)(``),[De,Oe]=(0,m.useState)(``),[ke,Ae]=(0,m.useState)([]),[je,Me]=(0,m.useState)(!0),[Ne,Pe]=(0,m.useState)(!1),[Fe,Ie]=(0,m.useState)(!0),[Le,Re]=(0,m.useState)(!0),[ze,Be]=(0,m.useState)(!1),W=(0,m.useCallback)(e=>{let t=Object.fromEntries([...n.pending].filter(([e])=>e.startsWith(`slack.`)&&e!==y).map(([e,t])=>[e,t.value])),r=ae(t).slack;e={...e,...r,ack:{...e.ack,...r?.ack}},_e(e.attachPort??``),Ee(!!e.enabled),V(String(n.pending.get(`slack.botToken`)?.value??``)),U(String(n.pending.get(`slack.appToken`)?.value??``)),Oe(e.teamId??``),Ae(Array.isArray(e.channelIds)?[...e.channelIds]:[]),Me(e.forwardAll!==!1),Pe(!!e.allowBots),Ie(e.mentionOnly!==!1),Re(e.replyInThread!==!1),Be(!!e.ack?.enabled)},[n]);(0,m.useEffect)(()=>{if(I.kind!==`ready`)return;let e=I.data.messaging||{},t=Array.isArray(e.enabledChannels)?e.enabledChannels:[];z(t.filter(me)),we(me(e.homeChannel)?e.homeChannel:`telegram`),W(I.data.slack||{})},[I,W]),(0,m.useEffect)(()=>()=>{for(let e of g)n.remove(e)},[n]);let G=(0,m.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,m.useMemo)(()=>I.kind===`ready`&&I.data.slack||{},[I]),q=I.kind===`ready`&&Array.isArray(I.data.slackEnvironmentVariables)?I.data.slackEnvironmentVariables:[],J=q.length>0,Y=(0,m.useRef)({environmentManaged:J,environmentVariables:q,t:x});(0,m.useLayoutEffect)(()=>{Y.current={environmentManaged:J,environmentVariables:q,t:x}},[J,q,x]);let X=(0,m.useCallback)(async()=>{let e=Y.current;if(j.current||C.current)throw Error(e.t(`settings.slack.resetFailed`));let r=n.saveBundle();if(Object.keys(r).length===0)return;if(e.environmentManaged&&v.some(e=>e in r))throw Error(e.t(`settings.slack.resetManagedByEnvironment`,{variables:e.environmentVariables.join(`, `)}));let i=Object.fromEntries(Object.entries(r).filter(([e])=>g.includes(e)||e.startsWith(`messaging.`))),a=new Map([...n.pending].filter(([e])=>e in i)),o=N.current,s=ae(i),c=await t.put(`/api/settings`,s),l=c&&typeof c==`object`&&`data`in c?c.data:c;M.current&&o===N.current&&(Z(a),R(l),W(l.slack||{}),await L())},[t,n,L,R,W]);(0,m.useEffect)(()=>{if(b)return b(X),()=>b(null)},[b,X]);function Z(e){for(let[t,r]of e)n.pending.get(t)===r&&n.remove(t)}function Ve(){Y.current.environmentManaged||j.current||C.current||(T.current=document.activeElement instanceof HTMLElement?document.activeElement:null,++w.current,C.current=!0,n.set(y,{value:!0,original:!1,valid:!1}),ve(!0))}function He(){++w.current,C.current=!1,ve(!1),n.remove(y)}(0,m.useEffect)(()=>()=>{++w.current,C.current=!1,n.remove(y)},[n]);function Ue(){let e=w.current,r=new Map([...n.pending].filter(([e])=>de.includes(e)||e===y));return async()=>{if(!M.current||!C.current||e!==w.current)return;let n=fe(await t.get(`/api/settings`));M.current&&C.current&&e===w.current&&(Z(r),R(n),A(e=>e+1))}}async function We(){if(j.current)return;if(J){k(x(`settings.slack.resetManagedByEnvironment`,{variables:q.join(`, `)}));return}if(!B.trim()&&!H.trim()&&!K.botToken&&!K.appToken){k(x(`settings.slack.resetEmpty`));return}if(!window.confirm(x(`settings.slack.resetConfirm`)))return;let e=new Map([...n.pending].filter(([e])=>v.includes(e))),r=N.current;j.current=!0,D(!0),k(null);let a=null;try{try{await t.post(`/api/settings/slack/reset`,{})}catch(e){if(e instanceof i&&e.status===409)try{let t=JSON.parse(e.detail);t.error===`slack_connection_managed_by_environment`&&(a=Array.isArray(t.environmentVariables)?t.environmentVariables.filter(e=>typeof e==`string`):[`SLACK_*`])}catch{}}let o=fe(await t.get(`/api/settings`));if(!M.current||r!==N.current)return;let s=a??o.slackEnvironmentVariables??[];if(s.length){for(let e of v)n.remove(e);R({...o,slackEnvironmentVariables:s}),k(x(`settings.slack.resetManagedByEnvironment`,{variables:s.join(`, `)}));return}if(!pe(o)){k(x(`settings.slack.resetFailed`));return}Z(e),V(``),U(``),P(!1),F(!1),R(o)}catch{M.current&&r===N.current&&k(x(`settings.slack.resetFailed`))}finally{j.current=!1,M.current&&r===N.current&&(D(!1),A(e=>e+1))}}if(I.kind===`loading`)return(0,h.jsx)(s,{});if(I.kind===`offline`)return(0,h.jsx)(l,{port:e});if(I.kind===`error`)return(0,h.jsx)(ee,{message:I.message});let Ge=e=>e?`••••••••${e.slice(-4)}`:`(empty)`,Q=ke.filter(e=>!_(e)),Ke=Q.length>0?`Slack conversation IDs only (C…/G…/D…) — invalid: ${Q.join(`, `)}`:null,qe=be&&B.trim()&&!f(B)?x(`settings.slack.guide.botTokenError`):null,Je=xe&&H.trim()&&!p(H)?x(`settings.slack.guide.appTokenError`):null,$=!!K.enabled&&!!K.botToken&&!K.appToken,Ye=J?`Connection settings are read-only because they are managed by environment variables: ${q.join(`, `)}.`:$?`Currently OUTBOUND-ONLY: the app-level token (xapp-) is missing, so no inbound Slack events can arrive.`:`Slack needs TWO tokens: a bot token (xoxb-) for the Web API and an app-level token (xapp-) for Socket Mode.`;return(0,h.jsxs)(`form`,{className:`settings-page-form`,onBlurCapture:e=>{let t=e.target.id;t===`sl-botToken`&&P(!0),t===`sl-appToken`&&F(!0)},onSubmit:e=>{e.preventDefault(),X().catch(()=>k(x(`settings.slack.resetFailed`)))},children:[(0,h.jsxs)(`fieldset`,{disabled:E||S,className:`settings-slack-fields`,children:[(0,h.jsxs)(u,{title:`Status`,hint:`Live transport state for this channel.`,children:[(0,h.jsx)(r,{items:[{label:`Slack`,value:Te?(0,h.jsx)(o,{tone:`ok`,children:`Enabled`}):(0,h.jsx)(o,{tone:`neutral`,children:`Disabled`})},...$?[{label:`Mode`,value:(0,h.jsx)(o,{tone:`warn`,children:`Outbound only`})}]:[],...J?[{label:`Managed by`,value:q.join(`, `),mono:!0}]:[]]}),(0,h.jsx)(ce,{client:t,channel:`slack`},ye)]}),(0,h.jsxs)(u,{title:`Credentials`,hint:Ye,children:[(0,h.jsx)(d,{id:`sl-enabled`,label:`Slack enabled`,value:Te,disabled:J,onChange:e=>{Ee(e),G(`slack.enabled`,{value:e,original:!!K.enabled,valid:!0}),e&&!J&&!ue(B||K.botToken||``)&&Ve()}}),(0,h.jsx)(re,{id:`sl-botToken`,label:`Bot token`,value:B,placeholder:Ge(K.botToken),error:qe,disabled:J,onChange:e=>{if(V(e),e.trim().length===0){n.remove(`slack.botToken`);return}G(`slack.botToken`,{value:e.trim(),original:K.botToken??``,valid:f(e)})}}),(0,h.jsx)(re,{id:`sl-appToken`,label:`App-level token`,value:H,placeholder:Ge(K.appToken),error:Je,disabled:J,onChange:e=>{if(U(e),e.trim().length===0){n.remove(`slack.appToken`);return}G(`slack.appToken`,{value:e.trim(),original:K.appToken??``,valid:p(e)})}}),(0,h.jsx)(ie,{id:`sl-teamId`,label:`Team ID`,value:De,placeholder:`T01234567 (optional)`,disabled:J,onChange:e=>{Oe(e),G(`slack.teamId`,{value:e,original:K.teamId??``,valid:!0})}}),(0,h.jsx)(ne,{id:`sl-channelIds`,label:`Channel IDs`,value:ke,placeholder:`C01234567`,error:Ke,disabled:J,onChange:e=>{Ae(e),G(`slack.channelIds`,{value:e,original:K.channelIds??[],valid:e.every(_)})}}),(0,h.jsx)(ie,{id:`sl-attachPort`,label:x(`settings.slack.attachPort`),value:ge,disabled:J||E||S,onChange:e=>{_e(e),G(`slack.attachPort`,{value:e.trim(),original:K.attachPort??``,valid:!0})}})]}),(0,h.jsxs)(u,{title:`Routing`,hint:`Choose which channels receive inbound chat and how replies are delivered. Outbound send can still work on any configured channel.`,children:[(0,h.jsx)(le,{pageChannel:`slack`,snapshot:I.kind===`ready`?I.data:{},enabledChannels:Se,homeChannel:Ce,setEnabledChannels:z,setHomeChannel:we,dirty:n,idPrefix:`sl-channel`}),(0,h.jsx)(d,{id:`sl-mentionOnly`,label:`Mention only`,value:Fe,onChange:e=>{Ie(e),G(`slack.mentionOnly`,{value:e,original:K.mentionOnly!==!1,valid:!0})}}),(0,h.jsx)(d,{id:`sl-replyInThread`,label:`Reply in thread`,value:Le,onChange:e=>{Re(e),G(`slack.replyInThread`,{value:e,original:K.replyInThread!==!1,valid:!0})}}),(0,h.jsx)(d,{id:`sl-forwardAll`,label:`Forward all`,value:je,onChange:e=>{Me(e),G(`slack.forwardAll`,{value:e,original:K.forwardAll!==!1,valid:!0})}}),(0,h.jsx)(d,{id:`sl-allowBots`,label:`Allow bots`,value:Ne,onChange:e=>{Pe(e),G(`slack.allowBots`,{value:e,original:!!K.allowBots,valid:!0})}}),(0,h.jsx)(d,{id:`sl-ackEnabled`,label:`Emoji reactions (👀 → ✅)`,value:ze,onChange:e=>{Be(e),G(`slack.ack.enabled`,{value:e,original:!!K.ack?.enabled,valid:!0})}})]})]}),(0,h.jsxs)(u,{title:`Actions`,hint:`Guided setup validates credentials with the issuer before saving.`,children:[(0,h.jsxs)(a,{children:[(0,h.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,disabled:J||E||S,onClick:()=>void We(),children:x(`settings.slack.resetConnection`)}),(0,h.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:J||E||S,"data-onboard-channel":`slack`,onClick:Ve,children:x(`onboarding.open`)})]}),O&&(0,h.jsx)(c,{tone:`error`,role:`alert`,children:O})]}),S&&(0,h.jsx)(se,{client:t,t:x,initialDraft:{botToken:B,appToken:H},returnFocus:T.current,onBeforeSave:Ue,onClose:He},e)]})}function me(e){return e===`telegram`||e===`discord`||e===`slack`}export{b as default,_ as isValidSlackConversationId};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{a as r,i,l as a,n as o,r as s,s as c,t as l,u}from"./page-shell-DfinU3mb.js";import{a as d,n as f,o as ee}from"./fields-CicOWY-X.js";import{t as p}from"./path-utils-B6vBr0DD.js";import{a as m,n as h,t as te}from"./ChannelEnablementControl-BSuKQhTW.js";import{i as ne,n as re,t as ie}from"./ChannelSetupEntry-DHLoZEzJ.js";var g=e(t(),1),_=n(),v=[`messaging.enabledChannels`,`messaging.homeChannel`,`telegram.enabled`,`telegram.token`,`telegram.allowedChatIds`,`telegram.forwardAll`,`telegram.mentionOnly`],y=[`telegram.enabled`,`telegram.token`,`telegram.allowedChatIds`];function b(e){return e?/^-?\d+$/.test(e.trim()):!1}function x(e){let t=[],n=[];for(let r of e)b(r)?t.push(r.trim()):n.push(r);return{valid:t,invalid:n}}function S(e){return e?e.filter(e=>Number.isFinite(e)).map(e=>String(e)):[]}function C(e){let t=[];for(let n of e){if(!b(n))continue;let e=Number(n);Number.isFinite(e)&&t.push(e)}return t}function w({port:e,client:t,dirty:n,registerSave:w,manager:E}){let D=(0,g.useMemo)(()=>m(E?.ui.locale??document.documentElement.lang),[E?.ui.locale]),{state:O,refresh:k,setData:A}=u(t,`/api/settings`),[j,M]=(0,g.useState)(!1),[N,P]=(0,g.useState)([]),[F,I]=(0,g.useState)(`telegram`),[L,R]=(0,g.useState)(!1),[z,B]=(0,g.useState)(``),[V,H]=(0,g.useState)([]),[U,W]=(0,g.useState)(!0),[G,K]=(0,g.useState)(!0);(0,g.useEffect)(()=>{if(O.kind!==`ready`)return;let e=O.data.messaging||{},t=Array.isArray(e.enabledChannels)?e.enabledChannels:[];P(t.filter(T)),I(T(e.homeChannel)?e.homeChannel:`telegram`);let n=O.data.telegram||{};R(!!n.enabled),B(``),H(S(n.allowedChatIds)),W(n.forwardAll!==!1),K(n.mentionOnly!==!1)},[O]),(0,g.useEffect)(()=>()=>{for(let e of v)n.remove(e)},[n]);let q=(0,g.useCallback)((e,t)=>n.set(e,t),[n]),J=(0,g.useMemo)(()=>O.kind===`ready`&&O.data.telegram||{},[O]),Y=O.kind===`ready`&&Array.isArray(O.data.telegramEnvironmentVariables)?O.data.telegramEnvironmentVariables:[],X=Y.length>0,Z=(0,g.useRef)({environmentManaged:X,environmentVariables:Y,t:D});(0,g.useLayoutEffect)(()=>{Z.current={environmentManaged:X,environmentVariables:Y,t:D}},[X,Y,D]);let Q=(0,g.useCallback)(async()=>{if(j)throw Error(`Finish channel setup before saving settings.`);let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=Z.current;if(r.environmentManaged&&y.some(t=>t in e))throw Error(r.t(`settings.telegram.managedByEnvironment`,{variables:r.environmentVariables.join(`, `)}));let i=p(e),a=await t.put(`/api/settings`,i),o=a&&typeof a==`object`&&`data`in a?a.data:a;n.clear(),A(o);let s=o.messaging||{};P(Array.isArray(s.enabledChannels)?s.enabledChannels.filter(T):[]),I(T(s.homeChannel)?s.homeChannel:`telegram`);let c=o.telegram||{};R(!!c.enabled),B(``),H(S(c.allowedChatIds)),W(c.forwardAll!==!1),K(c.mentionOnly!==!1),await k()},[t,n,k,A,j]);if((0,g.useEffect)(()=>{if(w)return w(Q),()=>w(null)},[w,Q]),O.kind===`loading`)return(0,_.jsx)(o,{});if(O.kind===`offline`)return(0,_.jsx)(s,{port:e});if(O.kind===`error`)return(0,_.jsx)(l,{message:O.message});let ae=J.token?J.token.slice(-4):``,oe=J.token?`••••••••${ae}`:`(empty)`,{invalid:$}=x(V),se=$.length>0?`Numeric chat IDs only — invalid: ${$.join(`, `)}`:null;return(0,_.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),Q()},children:[(0,_.jsxs)(`fieldset`,{disabled:j,className:`settings-slack-fields`,children:[(0,_.jsxs)(c,{title:`Status`,hint:`Live transport state plus a token/connectivity probe for this channel.`,children:[(0,_.jsx)(r,{items:[{label:`Telegram`,value:L?(0,_.jsx)(a,{tone:`ok`,children:`Enabled`}):(0,_.jsx)(a,{tone:`neutral`,children:`Disabled`})},...X?[{label:`Managed by`,value:Y.join(`, `),mono:!0}]:[]]}),(0,_.jsx)(h,{client:t,channel:`telegram`}),(0,_.jsx)(re,{client:t,label:`Telegram`,endpoint:`/api/telegram/probe`,method:`POST`,interpret:ne})]}),(0,_.jsxs)(c,{title:`Credentials`,hint:X?D(`settings.telegram.managedByEnvironment`,{variables:Y.join(`, `)}):`Bot token and the allow-list for inbound chats.`,children:[(0,_.jsx)(d,{id:`tg-enabled`,label:`Telegram enabled`,value:L,disabled:X,onChange:e=>{R(e),q(`telegram.enabled`,{value:e,original:!!J.enabled,valid:!0})}}),(0,_.jsx)(ee,{id:`tg-token`,label:`Bot token`,value:z,placeholder:oe,disabled:X,onChange:e=>{if(B(e),e.length===0){n.remove(`telegram.token`);return}q(`telegram.token`,{value:e,original:J.token??``,valid:!0})}}),(0,_.jsx)(f,{id:`tg-allowedChatIds`,label:`Allowed chat IDs`,value:V,placeholder:`123456789`,error:se,disabled:X,onChange:e=>{H(e);let t=e.every(b);q(`telegram.allowedChatIds`,{value:C(e),original:J.allowedChatIds??[],valid:t})}})]}),(0,_.jsxs)(c,{title:`Routing`,hint:`Choose which channels receive inbound chat and how replies are delivered. Outbound send can still work on any configured channel.`,children:[(0,_.jsx)(te,{pageChannel:`telegram`,snapshot:O.kind===`ready`?O.data:{},enabledChannels:N,homeChannel:F,setEnabledChannels:P,setHomeChannel:I,dirty:n,idPrefix:`tg-channel`}),(0,_.jsx)(d,{id:`tg-forwardAll`,label:`Forward all responses`,value:U,onChange:e=>{W(e),q(`telegram.forwardAll`,{value:e,original:J.forwardAll!==!1,valid:!0})}}),(0,_.jsx)(d,{id:`tg-mentionOnly`,label:`Mention only`,value:G,onChange:e=>{K(e),q(`telegram.mentionOnly`,{value:e,original:J.mentionOnly!==!1,valid:!0})}})]})]}),(0,_.jsx)(c,{title:`Actions`,hint:`Guided setup validates credentials with the issuer before saving.`,children:(0,_.jsx)(i,{children:(0,_.jsx)(ie,{channel:`telegram`,client:t,dirty:n,disabled:X,open:j,onOpenChange:M,onSaved:async()=>A(await t.get(`/api/settings`))})})})]})}function T(e){return e===`telegram`||e===`discord`||e===`slack`}export{S as chatIdsToChips,C as chipsToChatIds,w as default,b as isValidChatId,x as partitionChatIds};
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-DSSkXCir.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./preload-helper-CfbQpVni.js";import{a as n,i as r,n as i,r as a,t as o}from"./esm-Q6VOkDbn.js";import{a as s,c,i as l,n as u,o as d,r as f,s as p,t as m}from"./tool-input-DI7uu8Ah.js";import{n as h,t as g}from"./jsx-runtime-CkEUZM6i.js";import{t as _}from"./react-dom-URBLzV3w.js";import{i as v,t as y}from"./manager-shortcuts-Cqmr0mEq.js";import{t as b}from"./copy-text-WsUHYigB.js";var x=e(h(),1),S=_(),C={session_busy:`This session is busy. Wait for it to finish or stop the current turn.`,request_not_current:`This approval is no longer current. Refreshing its status.`,invalid_option:`This approval option is no longer available. Refreshing its status.`,revision_conflict:`Session settings changed elsewhere. Review the updated values and try again.`,invalid_sequence:`Conversation history needs to be refreshed.`,snapshot_limit:`This conversation exceeds the snapshot limit. Stop and recovery controls remain available.`,transcript_limit:`The conversation has reached its storage limit.`,event_too_large:`A conversation update exceeds the supported size.`,provider_unavailable:`This runtime is unavailable. Check its installation and authentication.`,unsupported_model:`This model is not available for the selected runtime.`,unsupported_effort:`This effort is not supported by the selected runtime.`,unsupported_policy:`This permission mode is not supported by the selected runtime.`,unsupported_capability:`This runtime does not support this action.`,session_not_steerable:`This turn cannot take a follow-up right now. Your text is kept.`,steer_queue_full:`This turn already has its follow-up. Send this after the turn finishes.`,steer_in_flight:`This follow-up is still being delivered.`,steer_key_spent:`This follow-up was not delivered. Your text is kept; send it again when ready.`,steer_outcome_unknown:`Follow-up delivery not confirmed. It was not resent.`,steer_command_unsupported:`A slash command cannot be sent as a follow-up. Send it after this turn finishes.`,session_not_found:`This session is no longer available. Its local draft is retained.`,rollback_unavailable:`Rollback is unavailable after this conversation was compacted, or while its history cannot be read.`,rollback_boundary_unavailable:`This turn can't be a rollback point: it or a later turn never reached Claude, or the conversation was compacted.`,rollback_noop:`This is already the latest turn, so there is nothing to roll back.`,rollback_target_not_found:`This message is no longer in the conversation. Refreshing the session.`,cleanup_pending:`The previous runtime is still closing. Try again in a moment.`,unauthorized:`Authentication is required to access this instance.`},w=class extends Error{code;status;session;constructor(e,t,n){super(C[e]??`The request could not be completed. Refresh the session and try again.`),this.code=e,this.status=t,this.session=n,this.name=`CodeClientError`}};function T(e){return typeof window<`u`&&window.location.port===String(e)?window.location.origin:`http://127.0.0.1:${e}`}function E(e){let t=T(e);async function n(e,n,r,i){let a=await fetch(`${t}/api/code${n}`,{method:e,...i===void 0?{}:{signal:i},...r===void 0?{}:{headers:{"Content-Type":`application/json`},body:JSON.stringify(r)}}),o=await a.json();if(!a.ok||o.ok!==!0)throw new w(typeof o.error==`string`?o.error:`code_request_failed`,a.status,o.session);return o}let r=e=>`/sessions/${encodeURIComponent(e)}`,i=async(e,t,r)=>(await n(e,t,r)).session;return{listSessions(e={},t){let r=new URLSearchParams;for(let[t,n]of Object.entries(e))n!==void 0&&r.set(t,String(n));return n(`GET`,`/sessions?${r}`,void 0,t)},listModelOptions:e=>n(`GET`,`/models`,void 0,e),snapshot:(e,t)=>n(`GET`,r(e),void 0,t),events:(e,t,i)=>n(`GET`,`${r(e)}/events?afterSequence=${t}&limit=500`,void 0,i),history:(e,t,i)=>n(`GET`,`${r(e)}/items?beforeSequence=${t}&limit=200`,void 0,i),createSession:e=>i(`POST`,`/sessions`,e),patchSession:(e,t)=>i(`PATCH`,r(e),t),sendPrompt:(e,t)=>n(`POST`,`${r(e)}/prompt`,t),steerSession:(e,t)=>n(`POST`,`${r(e)}/steer`,t),cancelPrompt:(e,t)=>i(`POST`,`${r(e)}/cancel`,t),attachSession:e=>i(`POST`,`${r(e)}/attach`,{}),rollbackSession:(e,t)=>i(`POST`,`${r(e)}/rollback`,t),visitSession:e=>i(`POST`,`${r(e)}/visit`,{}),async answerPermission(e,t){await n(`POST`,`/permissions/${encodeURIComponent(e)}`,t)},getGitInfo:(e,t)=>n(`GET`,`/git-info?cwd=${encodeURIComponent(e)}`,void 0,t),pickWorkspace:()=>n(`POST`,`/workspace/pick`)}}var D=512,O=2097152,k=2e3,A=16777216;function j(e){return{sessionId:e,session:null,items:[],permissions:[],cursor:0,hydrated:!1,hydrating:!1,synced:!1,needsSnapshot:!1,buffered:[],hasOlder:!1,beforeSequence:null,error:null}}function M(e){return!!e&&[`starting`,`streaming`,`stopping`].includes(e.status)}var N=e=>e.sort((e,t)=>(e.firstSequence??0)-(t.firstSequence??0)),P=e=>e.reduce((e,t)=>e+JSON.stringify(t).length,0);function ee(e){let t=e.items,n=P(t);if(t.length<=k&&n<=A)return e;for(t=[...t];t.length>k||n>A;){let r=t.findIndex(t=>!e.session?.turnId||t.turnId!==e.session.turnId);if(r<0)return{...e,items:[],synced:!1,needsSnapshot:!0,error:`Conversation exceeds the display capacity.`};n-=JSON.stringify(t[r]).length,t.splice(r,1)}return{...e,items:t,hasOlder:!0,beforeSequence:t[0]?.firstSequence??null}}function te(e,t){let{items:n,session:r,permissions:i}=e;if(t.event===`code_session`){if(!t.session||t.session.sessionId!==e.sessionId||(t.session.historyGeneration??0)>(e.session?.historyGeneration??0))return{...e,needsSnapshot:!0,synced:!1};r=t.session.contextUsage===void 0&&r?.contextUsage!==void 0?{...t.session,contextUsage:r.contextUsage}:t.session,i=i.filter(e=>e.epoch===r.epoch&&e.turnId===r.turnId)}else{let a=t.item?.itemId??t.update?.itemId,o=n.find(e=>e.itemId===a),s;if(t.event===`code_item`&&t.item)s={...t.item,firstSequence:o?.firstSequence??t.item.firstSequence??t.sequence};else if(t.event===`code_item_update`&&t.update&&o&&o.turnId===t.update.turnId){let n=t.update;if(n.appendToolOutput!==void 0&&!o.tool)return{...e,needsSnapshot:!0,synced:!1};s={...o,updatedAt:n.updatedAt,...n.appendText===void 0?{}:{text:(o.text??``)+n.appendText},...n.appendToolOutput===void 0?{}:{tool:{...o.tool,output:(o.tool.output??``)+n.appendToolOutput}},...n.status===void 0?{}:{status:n.status},...n.phase===void 0?{}:{phase:n.phase}}}else return{...e,needsSnapshot:!0,synced:!1};n=N([...n.filter(e=>e.itemId!==s.itemId),s]),s.permission&&(i=i.filter(e=>e.permissionId!==s.permission.permissionId),s.status===`pending`&&s.permission.epoch===r?.epoch&&s.permission.turnId===r?.turnId&&(i=[...i,s.permission]))}return ee({...e,items:n,session:r,permissions:i,cursor:t.sequence})}function ne(e){let t=e;if(!t.hydrated||t.hydrating||t.needsSnapshot)return t;let n=t.buffered.filter(e=>e.sequence>t.cursor);for(;n[0]?.sequence===t.cursor+1;){let e=n[0];if(t=te(t,e),t.needsSnapshot)break;n.shift()}return{...t,buffered:n,synced:t.synced&&!n.length&&!t.needsSnapshot}}function re(e,t){if(t.sessionId!==e.sessionId||t.sequence<=e.cursor||e.buffered.some(e=>e.sequence===t.sequence))return e;let n=[...e.buffered,t].sort((e,t)=>e.sequence-t.sequence);return n.length>D||JSON.stringify(n).length>O?{...e,buffered:[],synced:!1,needsSnapshot:!0,error:`Live updates exceeded the buffer. Refreshing history.`}:ne({...e,buffered:n})}function F(e,t){switch(t.type){case`stale`:return{...e,synced:!1};case`error`:return{...e,hydrating:!1,synced:!1,error:t.error};case`snapshot-start`:return{...e,hydrating:!0,synced:!1,error:null};case`event`:return re(e,t.event);case`snapshot`:{let n=t.snapshot;if(n.session.sessionId!==e.sessionId||n.sequence<e.cursor)return{...e,hydrating:!1,synced:!1,needsSnapshot:!0};let r=N([...n.items]);return ne(ee({...e,session:n.session,items:r,permissions:n.pendingPermissions,cursor:n.sequence,hydrated:!0,hydrating:!1,synced:!0,needsSnapshot:!1,hasOlder:n.truncated,beforeSequence:r[0]?.firstSequence??null,error:null}))}case`page`:{let n=e;for(let e of t.page.events)n=re(n,e);let r=n.cursor>=t.page.throughSequence&&!n.buffered.length&&!n.needsSnapshot;return{...n,synced:r,error:r?null:n.error}}case`history`:{let n=new Set(e.items.map(e=>e.itemId)),r=N([...e.items,...t.page.items.filter(e=>!n.has(e.itemId))]);return r.length>k||P(r)>A?{...e,error:`Older history exceeds the display capacity. Reload to return to recent items.`}:{...e,items:r,hasOlder:t.page.hasMore,beforeSequence:t.page.beforeSequence}}}}var ie=`cli-jaw:code-drafts:v1`,ae=`cli-jaw:code-draft-warnings:v1`,I=1,oe=4,se=32,ce=262144,le=1048576,ue=2097152,de=`Draft recovery is unavailable in this tab. Your current text remains in memory.`,fe=`Draft recovery is incomplete: some recent text or request state was not saved for reload. Check your draft before sending.`,L=`Draft recovery is incomplete: some text was not saved for reload because this tab reached its recovery limit.`,R=e=>!!e&&typeof e==`object`&&!Array.isArray(e),z=(e,t)=>typeof e==`string`&&e.length<=t,B=e=>typeof e==`number`&&Number.isSafeInteger(e)&&e>=0;function pe(e){if(!R(e)||!z(e.input,ce)||!B(e.edit)||!B(e.selectionEdit)||typeof e.creating!=`boolean`)return null;let t=e.selection;if(!R(t)||![`codex-app`,`claude`,`cursor`,`grok`].includes(String(t.provider))||!z(t.cwd,4096)||!z(t.model,1024)||!(t.effort===null||z(t.effort,80))||![`ask`,`auto`,`read-only`,`plan`,`accept-edits`,`dont-ask`,`auto-review`].includes(String(t.permissionMode))||t.thinking!==void 0&&typeof t.thinking!=`boolean`)return null;let n=e.retry,r=e.stop;return n!==null&&(!R(n)||!z(n.text,ce)||!z(n.key,240)||!n.key||!B(n.edit)||n.edit>e.edit)||r!==null&&(!R(r)||!z(r.turnId,240)||!r.turnId||!B(r.epoch))?null:{input:e.input,edit:e.edit,selectionEdit:e.selectionEdit,creating:e.creating,selection:{provider:t.provider,cwd:t.cwd,model:t.model,effort:t.effort,permissionMode:t.permissionMode,...typeof t.thinking==`boolean`?{thinking:t.thinking}:{}},retry:n===null?null:{text:n.text,key:n.key,edit:n.edit,...n.resend===!0?{resend:!0}:{},...n.resend===!0&&n.resendReason===`rolled-back`?{resendReason:`rolled-back`}:{}},stop:r===null?null:{turnId:r.turnId,epoch:r.epoch}}}function me(e){if(e===null)return{version:I,endpoints:[]};if(e.length>ue)return null;let t;try{t=JSON.parse(e)}catch{return null}if(!R(t)||t.version!==I||!Array.isArray(t.endpoints)||t.endpoints.length>oe)return null;let n=[];for(let e of t.endpoints){if(!R(e)||!z(e.endpoint,2048)||!(e.selectedId===null||z(e.selectedId,240))||!Array.isArray(e.sessions)||e.sessions.length>se)return null;let t=pe(e.fresh);if(!t||t.retry||t.stop)return null;let r=[];for(let t of e.sessions){if(!R(t)||!z(t.id,240)||!t.id)return null;let e=pe(t.draft);if(!e||e.creating||r.some(e=>e.id===t.id))return null;r.push({id:t.id,draft:e})}if(e.selectedId!==null&&!r.some(t=>t.id===e.selectedId)||n.some(t=>t.endpoint===e.endpoint)||JSON.stringify(e).length>le)return null;n.push({endpoint:e.endpoint,selectedId:e.selectedId,fresh:t,sessions:r})}return{version:I,endpoints:n}}function he(e){let t=e.getItem(ae);if(!t||t.length>16384)return[];try{let e=JSON.parse(t);return Array.isArray(e)&&e.length<=oe&&e.every(e=>z(e,2048))?e:[]}catch{return[]}}function V(e,t,n){try{let r=he(e).filter(e=>e!==t);n&&r.push(t),r.length?e.setItem(ae,JSON.stringify(r.slice(-4))):e.removeItem(ae)}catch{}}function ge(){if(typeof window>`u`)return{storage:null,warning:null};try{return{storage:window.sessionStorage,warning:null}}catch{return{storage:null,warning:de}}}function _e(e,t){try{let n=me(e.getItem(ie));if(!n)return{data:null,warning:`Saved Code drafts could not be read. No saved requests were sent.`};let r=n.endpoints.find(e=>e.endpoint===t)??null,i=he(e);return{data:r,warning:i.includes(t)||!r&&i.length>0?fe:null}}catch{return{data:null,warning:de}}}function ve(e){let{provider:t,cwd:n,model:r,effort:i,permissionMode:a,thinking:o}=e.selection;return pe({input:e.input,edit:e.edit,selection:{provider:t,cwd:n,model:r,effort:i,permissionMode:a,...o===void 0?{}:{thinking:o}},selectionEdit:e.selectionEdit,creating:e.createUnknown||e.operation.kind===`creating`,retry:e.retry?{text:e.retry.text,key:e.retry.key,edit:e.retry.edit,...e.retry.resend?{resend:!0}:{},...e.retry.resend&&e.retry.resendReason?{resendReason:e.retry.resendReason}:{}}:null,stop:e.stopTarget?{turnId:e.stopTarget.turnId,epoch:e.stopTarget.epoch}:null})}function ye(e,t,n){try{let r=ve(n.fresh);if(!r)return V(e,t,!0),L;let i={endpoint:t,selectedId:null,fresh:r,sessions:[]},a=!1,o=[...n.sessions].sort(([e],[t])=>Number(t===n.selectedId)-Number(e===n.selectedId));for(let[r,s]of o){if(r!==n.selectedId&&!s.input&&!s.retry&&!s.stopTarget)continue;let o=ve(s);if(!o)return V(e,t,!0),L;if(i.sessions.length>=se){a=!0;continue}let c={...i,selectedId:r===n.selectedId?r:i.selectedId,sessions:[...i.sessions,{id:r,draft:o}]};if(JSON.stringify(c).length>le){a=!0;continue}i.sessions=c.sessions,i.selectedId=c.selectedId}if(n.selectedId!==null&&i.selectedId===null||JSON.stringify(i).length>le)return V(e,t,!0),L;let s=e.getItem(ie),c=[...(me(s)??{version:I,endpoints:[]}).endpoints.filter(e=>e.endpoint!==t),i],l=JSON.stringify({version:I,endpoints:c});for(;c.length>oe||l.length>ue;){let t=c.shift();t&&V(e,t.endpoint,!0),l=JSON.stringify({version:I,endpoints:c})}return l!==s&&e.setItem(ie,l),V(e,t,a||n.recoveryWarning!==null),a?L:null}catch{return V(e,t,!0),de}}var H={"codex-app":`Codex`,claude:`Claude`,cursor:`Cursor`,grok:`Grok`},be={ask:`Ask first`,auto:`Auto (YOLO)`,"read-only":`Read only`,plan:`Plan`,"accept-edits":`Accept edits`,"dont-ask":`Don't ask`,"auto-review":`Auto review`},xe={ask:`Review native permission requests before allowing actions.`,auto:`The native runtime may execute actions without asking for approval.`,"read-only":`The native runtime restricts actions to read-only access.`,plan:`Claude plans without applying edits.`,"accept-edits":`File edits proceed; other actions still ask.`,"dont-ask":`Actions not already allowed for this session are denied without asking.`,"auto-review":`A classifier approves or denies each action; unsure calls still ask.`},Se={idle:`Ready`,starting:`Starting`,streaming:`Running`,stopping:`Stopping`,suspended:`Suspended`,failed:`Runtime failed`};function Ce(e){return e.status===`starting`||e.status===`streaming`||e.status===`stopping`}function U(e){return e===`rolled-back`?{heading:`Turn rolled back`,detail:`This message's turn was removed by a rollback. Files it changed were not reverted. Retry sends it as a new message.`,error:`This message's turn was removed by a rollback. The message was not resent; Retry will submit it as a new message.`}:{heading:`Send did not start`,detail:`The original attempt ended on the server without running. Retry sends this as a new message.`,error:`The original attempt ended on the server without running. The message was not resent; Retry will submit it as a new message.`}}function W(e){return e.archivedAt===null&&e.capabilities.resume&&e.resume.available&&(e.status===`suspended`||e.status===`failed`&&e.error?.recoverable===!0)}function we(e,t,n){return!!e&&e.rollback?.available===!0&&e.archivedAt===null&&t&&n&&(e.status===`idle`||e.status===`failed`)}function Te(e,t){let n=new Set;if(t==null)return n;let r=new Set(e.filter(e=>e.kind===`turn_completed`||e.kind===`turn_failed`||e.kind===`turn_cancelled`).map(e=>e.turnId)),i=e.filter(e=>e.kind===`user_message`&&e.turnId!==null&&e.itemId===`${e.turnId}:user`&&e.firstSequence!==void 0),a=Math.max(...i.map(e=>e.firstSequence));for(let e of i)e.firstSequence>=t&&e.firstSequence<a&&r.has(e.turnId)&&n.add(e.itemId);return n}function Ee(e){return e.kind===`turn_cancelled`||e.status===`cancelled`?`Stopped`:e.kind===`turn_failed`||e.status===`error`?`Failed`:e.kind===`turn_completed`?`Completed`:{pending:`Pending`,running:`Running`,done:`Done`,error:`Failed`,cancelled:`Stopped`}[e.status]}var De=new Map,Oe=new WeakMap;function G(e){return{input:``,edit:0,selection:{...e},selectionEdit:0,operation:{kind:`idle`,error:null},retry:null,createUnknown:!1,requiredSequence:0,stopTarget:null,permissionOperations:{},awaitingTurn:null,steer:null}}function ke(e){let t=G(e.selection);return t.input=e.input,t.edit=e.edit,t.selectionEdit=e.selectionEdit,t.createUnknown=e.creating,t.retry=e.retry,e.creating&&(t.operation={kind:`creating`,error:`Creation was interrupted by reload. The original session may exist; no request has been retried.`}),e.retry&&(t.operation={kind:`unknown-send`,error:e.retry.resend?U(e.retry.resendReason).error:`The original message has not been reconciled after reload. It will not be sent automatically.`}),e.stop&&(t.stopTarget={...e.stop,outcome:`unknown`},t.operation={kind:`stopping`,error:`Checking the captured Stop after reload. No cancellation has been resent.`}),t}function Ae(e,t){let n=ge(),r=n.storage?Oe.get(n.storage):De;r||(r=new Map,Oe.set(n.storage,r));let i=r.get(e);if(!i){let a=n.storage?_e(n.storage,e):{data:null,warning:n.warning};i={endpoint:e,storage:n.storage,storageWarning:n.warning,recoveryWarning:a.warning,selectedId:a.data?.selectedId??null,navigation:0,fresh:a.data?ke(a.data.fresh):G({provider:`codex-app`,cwd:t,model:``,effort:null,permissionMode:`ask`}),sessions:new Map(a.data?.sessions.map(e=>[e.id,ke(e.draft)])??[]),listeners:new Set},r.set(e,i)}return i}function je(e){e.storage&&(e.storageWarning=ye(e.storage,e.endpoint,e))}function Me(e){return{provider:e.provider,cwd:e.cwd,model:e.model,effort:e.effort,permissionMode:e.permissionMode,...e.thinking===null?{}:{thinking:e.thinking}}}function Ne(e,t,n=!1){let r=e.providers.find(e=>e.id===t.provider);if(!r)return t;let i=r.capabilities,{thinking:a,...o}=t;return{...o,...r.id===`claude`&&a!==void 0?{thinking:a}:{},model:!n&&r.models.includes(t.model)?t.model:r.defaultModel,effort:!n&&t.effort!==null&&i.efforts.includes(t.effort)?t.effort:null,permissionMode:i.permissions?!n&&i.permissionModes.includes(t.permissionMode)?t.permissionMode:i.permissions&&i.permissionModes.includes(`ask`)?`ask`:i.permissionModes.includes(`auto`)?`auto`:`read-only`:`auto`}}function Pe(e,t){e.steer?.key===t&&(e.edit===e.steer.edit&&(e.input=``,e.edit++),e.steer=null)}function Fe(e,t){e.retry?.key===t&&(e.edit===e.retry.edit&&(e.input=``,e.edit++),e.retry=null,(e.operation.kind===`sending`||e.operation.kind===`unknown-send`)&&(e.operation={kind:`idle`,error:null}))}var Ie=`pending:user`;function Le(e,t,n=Date.now()){let r=e.retry;if(!r||r.resend||t.some(e=>e.kind===`user_message`&&e.clientTurnKey===r.key))return null;let i=e.operation.kind===`unknown-send`;return{itemId:Ie,turnId:null,kind:`user_message`,status:`pending`,text:r.text,clientTurnKey:r.key,firstSequence:2**53-1,createdAt:n,updatedAt:n,...i?{phase:`unknown`}:{}}}function Re(e,t,n=Date.now()){let r=Le(e,t,n);return r?[...t,r]:t}var ze=6,K=1e3,Be=100,Ve=32,He=150,q=e=>e instanceof w?e.message:`Connection lost. Refresh to check the current state.`,J=e=>e instanceof w&&e.status>=400&&e.status<500,Ue=`Follow-up delivery not confirmed. It was not resent; it appears in the conversation if Claude received it.`,We=`Follow-up delivery not confirmed. Claude may have received it, but it will not appear in the conversation. It was not resent.`,Ge=`The conversation changed since you chose this point. Review it and try again.`,Ke=`The conversation was rolled back elsewhere; this message was not sent.`,qe=(e,t)=>!t||e.epoch>t.epoch||e.epoch===t.epoch&&(e.sequence>t.sequence||e.sequence===t.sequence&&e.revision>=t.revision),Je=e=>e===`failed`||e===`cancelled`;function Ye(e,t){let n=e?.items.find(e=>e.kind===`user_message`&&e.clientTurnKey===t);return n?e.items.some(e=>e.turnId===n.turnId&&(e.kind===`turn_failed`||e.kind===`turn_cancelled`)):!1}var Xe=class{client;book;details=new Map;summaries=new Map;attention=new Map;rows=[];catalog=null;catalogError=null;transport=`disconnected`;filter={scope:`all`,archived:!1};workingDir;gitInfo=null;gitError=null;gitGeneration=0;pickerGeneration=0;workspacePicking=!1;indexGeneration=0;catalogGeneration=0;lifetime=0;active=!1;abort=new AbortController;syncing=new Map;detailReads=new Map;historyLoading=new Set;indexLoading=!1;moreSessions=!1;cursor=null;fetched=0;indexError=null;timer;listeners=new Set;model;draftSyncQueued=!1;constructor(e){this.client=E(e.port),this.workingDir=e.workingDir,this.book=Ae(T(e.port),e.workingDir),this.model=this.makeModel()}getModel=()=>this.model;subscribe=e=>(this.listeners.add(e),()=>this.listeners.delete(e));changed=()=>{this.model=this.makeModel();for(let e of this.listeners)e();let e=this.book.selectedId,t=e?this.details.get(e):void 0;this.active&&e&&!t?.error&&(!t||this.draft(e).requiredSequence>t.cursor)&&!this.draftSyncQueued&&(this.draftSyncQueued=!0,queueMicrotask(()=>{this.draftSyncQueued=!1,this.active&&this.book.selectedId===e&&!this.syncing.has(e)&&this.sync(e)}))};notify(){je(this.book),this.changed();for(let e of this.book.listeners)e!==this.changed&&e()}mount=()=>(this.active=!0,this.lifetime++,this.abort=new AbortController,this.book.listeners.add(this.changed),this.refresh(),()=>{je(this.book),this.active=!1,this.lifetime++,this.abort.abort(),this.syncing.clear();for(let e of this.detailReads.values())e.abort();this.detailReads.clear(),this.timer!==void 0&&clearTimeout(this.timer),this.timer=void 0,this.book.listeners.delete(this.changed),this.details.clear(),this.summaries.clear(),this.attention.clear(),this.rows=[],this.cursor=null,this.fetched=0,this.gitGeneration++,this.pickerGeneration++});setWorkingDir(e){if(e===this.workingDir)return;this.workingDir=e;let t=this.book.fresh;!t.selectionEdit&&!t.input&&t.operation.kind===`idle`&&!t.createUnknown&&(t.selection={...t.selection,cwd:e}),this.filter.scope===`cwd`&&this.readIndex(),this.readGit(),this.notify()}draft(e=this.book.selectedId){if(e===null)return this.book.fresh;let t=this.book.sessions.get(e);if(!t){let n=this.info(e);t=G(n?Me(n):this.book.fresh.selection),this.book.sessions.set(e,t)}return t}info(e){if(!e)return null;let t=this.details.get(e)?.session,n=this.summaries.get(e);return n&&qe(n,t)?n:t??n??null}observe(e){let t=this.attention.get(e.sessionId);(!t||qe(e,{...e,epoch:t.epoch,sequence:t.sequence,revision:t.revision}))&&this.attention.set(e.sessionId,{epoch:e.epoch,sequence:e.sequence,revision:e.revision,...e.pendingPermissionCount===void 0?{}:{pendingPermissionCount:e.pendingPermissionCount},...e.contextUsage===void 0?{}:{contextUsage:e.contextUsage}})}resolve(e,t){let n=this.attention.get(e),{contextUsage:r,pendingPermissionCount:i,...a}=t;return{...a,...n?.pendingPermissionCount===void 0?{}:{pendingPermissionCount:n.pendingPermissionCount},...n?.contextUsage===void 0?{}:{contextUsage:n.contextUsage}}}accept(e){if(!this.active)return;let t=this.info(e.sessionId);if(!qe(e,t))return;e.sessionId===this.book.selectedId&&t&&(e.lastTurnCompletedAt??0)>(t.lastTurnCompletedAt??0)&&this.markVisited(e.sessionId);let{contextUsage:n,pendingPermissionCount:r,...i}=e;if(this.summaries.set(i.sessionId,i),this.summaries.size>1006){let e=[...this.summaries.keys()].find(e=>e!==this.book.selectedId&&!this.details.has(e)&&!this.rows.includes(e));e&&(this.summaries.delete(e),this.attention.delete(e))}let a=this.book.sessions.get(i.sessionId);a?.awaitingTurn&&M(i)&&(a.awaitingTurn=null),a?.stopTarget&&(i.turnId!==a.stopTarget.turnId||i.epoch!==a.stopTarget.epoch||!M(i))&&(a.stopTarget=null,a.operation.kind===`stopping`&&(a.operation=a.retry?{kind:`unknown-send`,error:`The original message still needs reconciliation.`}:{kind:`idle`,error:null}))}state(e){let t=this.details.get(e);return t||(t=j(e),this.details.set(e,t),this.trimDetails()),t}trimDetails(){for(let e of this.details.keys()){if(this.details.size<=ze)break;e!==this.book.selectedId&&(this.details.delete(e),this.detailReads.get(e)?.abort(),this.detailReads.delete(e),this.syncing.delete(e))}}update(e,t){let n=this.details.get(e)?.session??this.summaries.get(e);this.details.set(e,t),t.session&&this.accept(t.session);let r=this.book.sessions.get(e);if(r&&t.session&&t.hydrated&&!t.needsSnapshot){let e=t.session.historyGeneration??0;n&&e>(n.historyGeneration??0)&&this.rolledBack(r,t);let i=r.steer;e>0&&i?.state===`unknown`&&!t.items.some(e=>e.turnId===i.turnId)&&(r.steer=null)}if(r?.retry&&t.items.some(e=>e.kind===`user_message`&&e.clientTurnKey===r.retry.key)&&(Ye(t,r.retry.key)?this.requireNewKey(r):Fe(r,r.retry.key)),r?.steer&&t.items.some(e=>e.kind===`user_message`&&e.clientTurnKey===r.steer.key)&&Pe(r,r.steer.key),r?.awaitingTurn){let e=t.items.find(e=>e.kind===`user_message`&&e.clientTurnKey===r.awaitingTurn)?.turnId;e&&t.items.some(t=>t.turnId===e&&(t.kind===`turn_completed`||t.kind===`turn_failed`||t.kind===`turn_cancelled`))&&(r.awaitingTurn=null)}if(r&&t.synced){let e=new Set(t.permissions.map(e=>e.permissionId));for(let t of Object.keys(r.permissionOperations))!e.has(t)&&!r.permissionOperations[t].pending&&delete r.permissionOperations[t]}this.notify()}requireNewKey(e,t){if(!e.retry)return;let{resendReason:n,...r}=e.retry;e.retry={...r,key:crypto.randomUUID(),resend:!0,...t?{resendReason:t}:{}},e.operation={kind:`unknown-send`,error:U(t).error}}rolledBack(e,t){let n=e=>t.items.some(t=>t.kind===`user_message`&&t.clientTurnKey===e);e.awaitingTurn&&!n(e.awaitingTurn)&&(e.awaitingTurn=null),e.retry&&!e.retry.resend&&!n(e.retry.key)&&(e.operation.kind===`idle`||e.operation.kind===`unknown-send`)&&(e.operation={kind:`unknown-send`,error:Ke})}removedByRollback(e,t){let n=this.details.get(e);return t.status===`cancelled`&&!!n?.hydrated&&(n.session?.historyGeneration??0)>0&&t.sequence<=n.cursor&&(!n.hasOlder||(n.beforeSequence??1/0)<=t.sequence)&&!n.items.some(e=>e.turnId===t.turnId)}makeModel(){let e=this.book.selectedId,t=this.info(e),n=this.draft(e),r=e?this.details.get(e):void 0,i=(e,t)=>{let n=this.resolve(e.sessionId,e);return t?.synced?{...n,pendingPermissionCount:t.permissions.length}:n},a=t&&i(t,r),o=n.operation,s=this.book.storageWarning??this.book.recoveryWarning,c=[`creating`,`sending`,`stopping`,`resuming`,`patching`,`rolling-back`].includes(o.kind)&&!o.error,l=e===null?!!this.catalog:!!r?.synced&&(!a||a.sequence<=r.cursor)&&n.requiredSequence<=(r?.cursor??0),u=!!a&&l&&a.provider===`claude`&&a.status===`streaming`&&!!a.turnId&&a.archivedAt===null,d=u&&!!a&&(r?.items??[]).some(e=>e.kind===`user_message`&&e.itemId.startsWith(`${a.turnId}:steer:`)),f=n.steer?.state===`unknown`?n.steer.unrecorded?We:Ue:null;return{catalog:this.catalog,sessions:this.rows.map(e=>{let t=this.info(e),n=this.details.get(e);return t&&i(t,n)}).filter(e=>!!e),selectedId:e,session:a,items:Re(n,r?.items??[]),hasUnsentDraft:!!this.book.fresh.input.trim()||this.book.fresh.createUnknown||!!this.book.fresh.retry,permissions:r?.permissions??[],input:n.input,selection:a?Me(a):n.selection,gitInfo:this.gitInfo,loading:this.indexLoading||!!r?.hydrating||!!e&&!r?.hydrated&&!r?.error,pending:c,busy:M(a),working:!!n.awaitingTurn||M(a),workingIds:new Set(this.rows.filter(e=>{let t=this.info(e);return!!this.book.sessions.get(e)?.awaitingTurn||!!t&&M(t)})),followUp:u,followUpSent:d,steering:n.steer?.state===`sending`,synced:l,transport:this.transport,workspacePicking:this.workspacePicking,error:[o.error??f??r?.error??this.indexError??this.catalogError??this.gitError??a?.error?.message,s].filter(Boolean).join(` `)||null,operation:{...o,error:o.error&&s?`${o.error} ${s}`:o.error},retryText:n.retry?.text??null,canRetrySameSend:!!e&&o.kind===`unknown-send`&&!!n.retry&&l&&a?.archivedAt===null,resendRequired:!!n.retry?.resend,resendReason:n.retry?.resend?n.retry.resendReason??null:null,permissionOperations:{...n.permissionOperations},hasMoreSessions:this.moreSessions,hasOlderHistory:r?.hasOlder??!1,filter:this.filter,creationUnknown:e===null&&n.createUnknown,startAnotherSession:this.startAnotherSession,newSession:this.newSession,selectSession:this.selectSession,setInput:this.setInput,setSelection:this.setSelection,pickWorkspace:this.pickWorkspace,send:this.send,retrySameSend:this.retrySameSend,stop:this.stop,resume:this.resume,rollbackSession:this.rollbackSession,rename:this.rename,archive:this.archive,answer:this.answer,refresh:this.refresh,loadMoreSessions:this.loadMoreSessions,loadOlderHistory:this.loadOlderHistory,setFilter:this.setFilter,clearError:this.clearError}}async readCatalog(){let e=++this.catalogGeneration,t=this.lifetime;try{let n=await this.client.listModelOptions(this.abort.signal);if(!this.active||t!==this.lifetime||e!==this.catalogGeneration)return;this.catalog=n,this.catalogError=null;let r=this.book.fresh;!r.selection.model&&!r.selectionEdit&&r.operation.kind===`idle`&&(r.selection=Ne(n,{...r.selection,provider:n.defaultProvider})),this.notify()}catch(n){this.active&&t===this.lifetime&&e===this.catalogGeneration&&(this.catalogError=q(n),this.notify())}}async readIndex(e=!1){let t=++this.indexGeneration,n=this.lifetime,r=e?this.cursor:null,i=e?Be:Math.min(K,Math.max(Be,this.fetched));this.indexLoading=!0,this.notify();try{let a=await this.client.listSessions({...this.filter,limit:i,...r===null?{}:{cursor:r},...this.filter.scope===`cwd`?{cwd:this.workingDir}:{}},this.abort.signal);if(!this.active||n!==this.lifetime||t!==this.indexGeneration)return;for(let e of a.sessions){this.observe(e),this.accept(e);let t=this.details.get(e.sessionId);t?.hydrated&&!t.hydrating&&e.sequence>t.cursor&&(this.details.set(e.sessionId,F(t,{type:`stale`})),this.sync(e.sessionId))}this.rows=[...new Set([...e?this.rows:[],...a.sessions.map(e=>e.sessionId)])].slice(0,K),this.cursor=a.nextCursor,this.fetched=(e?this.fetched:0)+a.sessions.length,this.moreSessions=a.hasMore&&this.rows.length<K,this.indexError=null;let o=new Set([...this.rows,...this.details.keys(),...this.book.selectedId?[this.book.selectedId]:[]]);for(let e of this.summaries.keys())o.has(e)||(this.summaries.delete(e),this.attention.delete(e))}catch(e){this.active&&n===this.lifetime&&t===this.indexGeneration&&(this.indexError=q(e))}finally{this.active&&n===this.lifetime&&t===this.indexGeneration&&(this.indexLoading=!1,this.notify())}}scheduleIndex(){this.active&&this.timer===void 0&&(this.timer=setTimeout(()=>{this.timer=void 0,this.readIndex()},He))}sync(e,t=!1){let n=this.syncing.get(e);if(n)return n;let r=this.lifetime,i=new AbortController;this.detailReads.set(e,i),this.state(e);let a=()=>this.active&&r===this.lifetime&&this.detailReads.get(e)===i&&this.details.has(e),o=(async()=>{let n=0,r=null;try{for(let o=0;o<Ve&&a();o++){let o=this.state(e);if(t||!o.hydrated||o.needsSnapshot){if(++n>2)throw Error(`snapshot did not cover live updates`);t=!1,this.update(e,F(o,{type:`snapshot-start`}));let s=this.book.sessions.get(e)?.stopTarget,c=s?.outcome===`unknown`?s:null,l=await this.client.snapshot(e,i.signal);if(!a())return;r=c,this.observe(l.session),this.update(e,F(this.state(e),{type:`snapshot`,snapshot:l}))}if(o=this.state(e),o.needsSnapshot)continue;let s=o.cursor,c=await this.client.events(e,s,i.signal);if(!a())return;let l=F(this.state(e),{type:`page`,page:c});if(this.update(e,l),!l.needsSnapshot){if(l.synced&&l.cursor>=(this.book.sessions.get(e)?.requiredSequence??0)){this.reconcileStop(e,r);return}if(l.cursor<=s){t=!0;continue}}}a()&&this.update(e,F(this.state(e),{type:`error`,error:`History is still catching up. Refresh to continue.`}))}catch(t){if(!a())return;if(t instanceof w&&t.code===`invalid_sequence`&&n<2){let t=await this.client.snapshot(e,i.signal).catch(()=>null);if(!a())return;if(t){this.update(e,F(this.state(e),{type:`snapshot`,snapshot:t}));return}}this.update(e,F(this.state(e),{type:`error`,error:q(t)})),t instanceof w&&t.code===`session_not_found`&&this.scheduleIndex()}})().finally(()=>{this.syncing.get(e)===o&&this.syncing.delete(e),this.detailReads.get(e)===i&&this.detailReads.delete(e),this.trimDetails()});return this.syncing.set(e,o),o}onEvent=e=>{if(!this.active)return;e.session?.sessionId===e.sessionId&&this.accept(e.session),(e.event===`code_session`||e.item?.kind===`permission_request`||e.update?.status)&&this.scheduleIndex();let t=this.book.sessions.get(e.sessionId);e.item?.kind===`user_message`&&e.item.clientTurnKey&&t?.steer?.key===e.item.clientTurnKey&&(t.requiredSequence=Math.max(t.requiredSequence,e.sequence),Pe(t,e.item.clientTurnKey)),e.item?.kind===`user_message`&&e.item.clientTurnKey&&t?.retry?.key===e.item.clientTurnKey&&(t.requiredSequence=Math.max(t.requiredSequence,e.sequence),Ye(this.details.get(e.sessionId),e.item.clientTurnKey)?this.requireNewKey(t):Fe(t,e.item.clientTurnKey));let n=this.details.get(e.sessionId);if(!n){this.notify();return}let r=F(n,{type:`event`,event:e});this.update(e.sessionId,r),!r.synced&&!r.hydrating&&this.sync(e.sessionId)};onTransport=e=>{this.transport=e;for(let[e,t]of this.details)this.details.set(e,F(t,{type:`stale`}));if(this.notify(),e===`connected`&&this.active){this.readIndex();for(let e of this.details.keys())this.sync(e,!0)}};refresh=async()=>{let e=this.book.selectedId;await Promise.all([this.readCatalog(),this.readIndex(),e?this.sync(e,!0):Promise.resolve(),this.readGit()])};loadMoreSessions=async()=>{this.moreSessions&&!this.indexLoading&&await this.readIndex(!0)};setFilter=e=>{this.filter={...e},this.cursor=null,this.fetched=0,this.rows=[],this.moreSessions=!1,this.notify(),this.readIndex()};startAnotherSession=()=>{let e=this.book.fresh;if(this.book.selectedId!==null||!e.createUnknown)return;let t=G(e.selection);t.input=e.input,t.edit=e.edit,t.selectionEdit=e.selectionEdit,t.operation.error=`The original session may still exist. Your text is preserved; Send will create another session.`,this.book.fresh=t,this.book.navigation++,this.pickerGeneration++,this.notify()};newSession=()=>{this.book.selectedId=null,this.book.navigation++,this.gitInfo=null,this.notify(),this.readGit()};selectSession=async e=>{this.book.selectedId=e,this.book.navigation++,this.draft(e),this.state(e),this.gitInfo=null,this.notify(),await this.sync(e,!0),this.book.selectedId===e&&this.markVisited(e),this.book.selectedId===e&&await this.readGit()};async markVisited(e){try{this.accept(await this.client.visitSession(e)),this.notify()}catch{}}setInput=e=>{let t=this.draft();t.input=e,t.edit++,this.notify()};clearError=()=>{let e=this.draft();e.operation.kind===`idle`&&(e.operation={kind:`idle`,error:null}),e.steer?.state===`unknown`&&(e.steer=null),this.indexError=null,this.book.recoveryWarning=null,this.notify()};async readGit(){let e=++this.gitGeneration,t=this.lifetime,n=this.book.selectedId,r=this.info(n)?.cwd??(n===null?this.book.fresh.selection.cwd:``);if(this.gitInfo=null,this.gitError=null,r&&this.active)try{let i=await this.client.getGitInfo(r,this.abort.signal);this.active&&t===this.lifetime&&e===this.gitGeneration&&n===this.book.selectedId&&(this.gitInfo=i,this.notify())}catch(r){this.active&&t===this.lifetime&&e===this.gitGeneration&&n===this.book.selectedId&&(this.gitError=q(r),this.notify())}}pickWorkspace=async()=>{let e=this.book.fresh;if(this.book.selectedId!==null||e.operation.kind!==`idle`||e.createUnknown||this.workspacePicking)return;let t=this.book.navigation,n=e.selectionEdit,r=++this.pickerGeneration;this.workspacePicking=!0,this.notify();try{let i=await this.client.pickWorkspace();if(!this.active||r!==this.pickerGeneration||t!==this.book.navigation||n!==e.selectionEdit||e!==this.book.fresh||e.operation.kind!==`idle`)return;!i.cancelled&&i.path&&(e.selection={...e.selection,cwd:i.path},e.selectionEdit++,this.notify(),await this.readGit())}catch(i){this.active&&r===this.pickerGeneration&&t===this.book.navigation&&n===e.selectionEdit&&e===this.book.fresh&&e.operation.kind===`idle`&&(e.operation.error=q(i),this.notify())}finally{this.workspacePicking=!1,this.notify()}};setSelection=async e=>{let t=this.book.selectedId,n=this.info(t);if(n&&e.provider&&e.provider!==n.provider){this.newSession(),await this.setSelection({...e,cwd:n.cwd});return}let r=this.draft();if(r.operation.kind!==`idle`||r.createUnknown)return;if(n&&t){if(e.cwd!==void 0&&e.cwd!==n.cwd||e.provider&&e.provider!==n.provider){r.operation.error=`Runtime and workspace are fixed for this session. Create a new session to change them.`,this.notify();return}if(n.status!==`idle`||!this.model.synced||n.archivedAt!==null){r.operation.error=`Wait for this session to be idle and synchronized before changing settings.`,this.notify();return}await this.patch(t,{model:e.model??n.model,effort:e.effort===void 0?n.effort:e.effort,permissionMode:e.permissionMode??n.permissionMode,...n.provider===`claude`?{thinking:e.thinking??n.thinking??!0}:{}});return}if(t)return;let i=e.provider!==void 0&&e.provider!==r.selection.provider,a={...r.selection,...e};this.catalog&&i&&(a=Ne(this.catalog,a,!0));let o=this.catalog?.providers.find(e=>e.id===a.provider);a.effort!==null&&o&&!o.capabilities.efforts.includes(a.effort)&&(a.effort=null),r.selection=a,r.selectionEdit++,this.notify(),e.cwd!==void 0&&await this.readGit()};async patch(e,t,n=!1){let r=this.draft(e),i=this.info(e);if(!i||r.operation.kind!==`idle`||M(i)){let e=Error(i?`Wait for the current session action to finish before changing it.`:`Refresh this session before changing it.`);if(r.operation.error=e.message,this.notify(),n)throw e;return}let a=null;r.operation={kind:`patching`,error:null},this.notify();try{this.accept(await this.client.patchSession(e,{...t,expectedRevision:i.revision})),r.operation={kind:`idle`,error:null}}catch(t){t instanceof w&&t.session?.sessionId===e&&(this.observe(t.session),this.accept(t.session)),a=t instanceof w?t:Error(q(t)),r.operation={kind:`idle`,error:a.message}}if(this.notify(),this.scheduleIndex(),this.active&&await this.sync(e,!0),n&&a)throw a}rename=async(e,t)=>{await this.patch(e,{title:t},!0)};archive=async(e,t)=>{await this.patch(e,{archived:t},!0)};send=async()=>{let e=this.book.selectedId,t=this.draft(e);if(t.operation.kind!==`idle`||t.createUnknown||!t.input.trim()||t.steer?.state===`sending`)return;let n=this.info(e);if(e&&n&&this.model.followUp){this.model.followUpSent||await this.steer(e,t,n);return}if(t.steer?.state===`unknown`&&(t.steer=null),e&&n&&W(n)&&this.model.synced){t.operation={kind:`resuming`,error:null},this.notify();try{this.accept(await this.client.attachSession(e)),t.operation={kind:`idle`,error:null}}catch(e){t.operation={kind:`idle`,error:q(e)},this.notify(),this.scheduleIndex();return}this.notify(),this.scheduleIndex(),this.active&&await this.sync(e,!0),n=this.info(e)}if(e&&(!n||n.status!==`idle`||n.archivedAt!==null||!this.model.synced)){t.operation.error=`Wait for the session to be idle and synchronized before sending.`,this.notify();return}let r={text:t.input,edit:t.edit,key:crypto.randomUUID()},i=this.book.navigation;if(!e){let n={...t.selection},r=this.catalog?.providers.find(e=>e.id===n.provider);if(!r?.available||!n.cwd.trim()||!r.models.includes(n.model)||!r.capabilities.permissionModes.includes(n.permissionMode)||n.effort!==null&&!r.capabilities.efforts.includes(n.effort)){t.operation.error=`Choose an available runtime, workspace, model and supported settings before sending.`,this.notify();return}t.operation={kind:`creating`,error:null},this.notify();try{let r=await this.client.createSession(n);e=r.sessionId,this.book.sessions.set(e,t),this.book.fresh===t&&(this.book.fresh=G(n)),this.book.navigation===i&&this.book.selectedId===null&&(this.book.selectedId=e,this.book.navigation++),this.accept(r),this.active&&this.state(e),this.scheduleIndex()}catch(e){t.createUnknown=!J(e),t.operation={kind:t.createUnknown?`creating`:`idle`,error:t.createUnknown?`Session creation could not be confirmed. The original session may exist. Refresh the list, or choose Start another session to keep this text in a new draft.`:q(e)},this.notify(),this.scheduleIndex();return}}t=this.draft(e),t.retry=r,await this.submit(e,t)};async submit(e,t){let n=t.retry;if(n){t.operation={kind:`sending`,error:null},t.awaitingTurn=n.key,this.notify();try{let r=await this.client.sendPrompt(e,{text:n.text,clientTurnKey:n.key});if(r.clientTurnKey!==n.key)throw Error(`Mismatched prompt receipt`);t.requiredSequence=Math.max(t.requiredSequence,r.sequence);let i=this.details.get(e);i&&this.details.set(e,F(i,{type:`stale`})),Je(r.status)?(this.requireNewKey(t,this.removedByRollback(e,r)?`rolled-back`:void 0),t.awaitingTurn=null):Fe(t,n.key)}catch(e){t.retry?.key===n.key&&(t.operation={kind:J(e)?`idle`:`unknown-send`,error:J(e)?q(e):`Message acceptance is unknown. Refresh, or explicitly retry the original message with the same key.`},J(e)&&(t.retry=null,t.awaitingTurn=null))}this.notify(),this.scheduleIndex(),this.active&&await this.sync(e,!0)}}async steer(e,t,n){if(!n.turnId||t.stopTarget&&t.stopTarget.outcome!==`retryable`)return;let r={key:crypto.randomUUID(),text:t.input,edit:t.edit,turnId:n.turnId,epoch:n.epoch,state:`sending`};t.steer=r,t.operation.error&&(t.operation={...t.operation,error:null}),this.notify();try{let n=await this.client.steerSession(e,{text:r.text,clientTurnKey:r.key,turnId:r.turnId,epoch:r.epoch});if(n.clientTurnKey!==r.key)throw Error(`Mismatched follow-up receipt`);t.requiredSequence=Math.max(t.requiredSequence,n.sequence);let i=this.details.get(e);i&&this.details.set(e,F(i,{type:`stale`})),Pe(t,r.key)}catch(e){t.steer===r&&(J(e)?(t.steer=null,t.operation.kind===`idle`&&(t.operation={kind:`idle`,error:q(e)})):(r.state=`unknown`,r.unrecorded=e instanceof w&&e.code===`steer_outcome_unknown`))}this.notify(),this.scheduleIndex(),this.active&&await this.sync(e,!0)}retrySameSend=async()=>{let e=this.book.selectedId,t=this.draft(e);e&&this.model.canRetrySameSend&&t.operation.kind===`unknown-send`&&await this.submit(e,t)};reconcileStop(e,t){let n=this.book.sessions.get(e),r=this.details.get(e),i=this.info(e);!t||t.outcome!==`unknown`||n?.stopTarget!==t||!r?.synced||!i||i.sequence>r.cursor||i.turnId!==t.turnId||i.epoch!==t.epoch||(i.status===`starting`||i.status===`streaming`?(t.outcome=`retryable`,n.operation={kind:n.retry?`unknown-send`:`idle`,error:`Stop could not be confirmed. The same turn is still running. Press Stop to retry for this turn.`}):i.status===`stopping`&&(t.outcome=`accepted`,n.operation={kind:`stopping`,error:null}),this.notify())}stop=async()=>{let e=this.book.selectedId,t=this.info(e);if(!e||!t?.turnId||!M(t)||!t.capabilities.interrupt||t.status===`stopping`)return;let n=this.draft(e),r=n.stopTarget;if(r&&(r.outcome!==`retryable`||!this.model.synced||r.turnId!==t.turnId||r.epoch!==t.epoch))return;let i=r??{turnId:t.turnId,epoch:t.epoch,outcome:`pending`};i.outcome=`pending`,n.stopTarget=i,n.operation={kind:`stopping`,error:null},this.notify();try{let t=await this.client.cancelPrompt(e,{turnId:i.turnId,epoch:i.epoch});n.stopTarget===i&&(i.outcome=`accepted`),this.accept(t)}catch(e){n.stopTarget===i&&(i.outcome=`unknown`,n.operation={kind:`stopping`,error:q(e)},J(e)&&(n.stopTarget=null,n.operation.kind=`idle`))}this.notify(),this.scheduleIndex(),this.active&&(i.outcome===`unknown`&&await this.syncing.get(e),this.active&&await this.sync(e,!0))};resume=async()=>{let e=this.book.selectedId,t=this.info(e),n=this.draft(e);if(e&&t&&this.model.synced&&n.operation.kind===`idle`&&t.archivedAt===null&&[`suspended`,`failed`].includes(t.status)&&t.capabilities.resume&&t.resume.available&&(t.status!==`failed`||t.error?.recoverable)){n.operation={kind:`resuming`,error:null},this.notify();try{this.accept(await this.client.attachSession(e)),n.operation={kind:`idle`,error:null}}catch(e){n.operation={kind:`idle`,error:q(e)}}this.notify(),this.scheduleIndex(),this.active&&await this.sync(e,!0)}};rollbackSession=async e=>{let t=this.book.selectedId,n=this.info(t),r=this.draft(t);if(t&&n&&we(n,this.model.synced,r.operation.kind===`idle`&&r.steer?.state!==`sending`)){r.operation={kind:`rolling-back`,error:null},this.notify();try{this.accept(await this.client.rollbackSession(t,{expectedRevision:n.revision,expectedEpoch:n.epoch,upToItemId:e})),r.operation={kind:`idle`,error:null}}catch(e){e instanceof w&&e.session?.sessionId===t&&(this.observe(e.session),this.accept(e.session)),r.operation={kind:`idle`,error:e instanceof w&&e.code===`revision_conflict`?Ge:q(e)}}this.notify(),this.scheduleIndex(),this.active&&await this.sync(t,!0)}};answer=async(e,t)=>{let n=e.sessionId,r=this.details.get(n),i=this.info(n),a=this.draft(n);if(a.permissionOperations[e.permissionId]?.pending)return;let o=r?.permissions.find(t=>t.permissionId===e.permissionId);if(!r?.synced||!i||i.sequence>r.cursor||!o||o.turnId!==e.turnId||o.epoch!==e.epoch||i.turnId!==e.turnId||i.epoch!==e.epoch||!o.options.some(e=>e.optionId===t)){a.permissionOperations[e.permissionId]={pending:!1,error:`This approval is no longer current. Refresh its status.`},this.notify(),this.active&&await this.sync(n,!0);return}a.permissionOperations[e.permissionId]={pending:!0,error:null},this.notify();try{await this.client.answerPermission(e.permissionId,{sessionId:n,turnId:e.turnId,epoch:e.epoch,optionId:t}),a.permissionOperations[e.permissionId]={pending:!0,error:null}}catch(t){a.permissionOperations[e.permissionId]={pending:!0,error:q(t)}}this.notify(),this.scheduleIndex(),this.active&&await this.sync(n,!0);let s=this.details.get(n),c=!s?.synced||s.permissions.some(t=>t.permissionId===e.permissionId),l=a.permissionOperations[e.permissionId];c&&l?a.permissionOperations[e.permissionId]={pending:!1,error:l.error}:delete a.permissionOperations[e.permissionId],this.notify()};loadOlderHistory=async()=>{let e=this.book.selectedId;if(!e||this.historyLoading.has(e))return;let t=this.details.get(e);if(!t?.hydrated||!t.hasOlder||t.beforeSequence===null)return;let n=this.lifetime;this.historyLoading.add(e);try{let r=await this.client.history(e,t.beforeSequence,this.abort.signal);this.active&&n===this.lifetime&&this.details.get(e)?.beforeSequence===t.beforeSequence&&this.update(e,F(this.state(e),{type:`history`,page:r}))}catch(t){this.active&&n===this.lifetime&&(this.draft(e).operation.error=q(t),this.notify())}finally{this.historyLoading.delete(e)}}};function Ze({port:e,onEvent:t,onTransport:n}){let r=(0,x.useRef)({onEvent:t,onTransport:n});r.current={onEvent:t,onTransport:n},(0,x.useEffect)(()=>{if(!e)return;let t=!0,n=new EventSource(`${T(e)}/api/events`);return n.onopen=()=>{t&&r.current.onTransport?.(`connected`)},n.onmessage=e=>{if(!t)return;let n;try{n=JSON.parse(e.data)}catch{return}n?.topic!==`code`||typeof n.sessionId!=`string`||!Number.isSafeInteger(n.sequence)||n.sequence<1||!Number.isSafeInteger(n.epoch)||(n.event===`code_item`||n.event===`code_item_update`||n.event===`code_session`)&&r.current.onEvent(n)},n.onerror=()=>{t&&r.current.onTransport?.(n.readyState===EventSource.CLOSED?`disconnected`:`reconnecting`)},()=>{t=!1,n.close()}},[e])}function Qe({port:e,workingDir:t}){let n=T(e),r=(0,x.useMemo)(()=>new Xe({port:e,workingDir:t}),[n,e]);return(0,x.useEffect)(()=>r.mount(),[r]),(0,x.useEffect)(()=>r.setWorkingDir(t),[r,t]),Ze({port:e,onEvent:r.onEvent,onTransport:r.onTransport}),(0,x.useSyncExternalStore)(r.subscribe,r.getModel,r.getModel)}function $e(e){return e.archivedAt===null?`active`:`archived`}function et(e,t){return t.createdAt-e.createdAt||e.sessionId.localeCompare(t.sessionId)}function tt(e){let t=e.filter(e=>$e(e)===`active`).sort(et),n=e.filter(e=>$e(e)===`archived`).sort((e,t)=>(t.archivedAt??t.createdAt)-(e.archivedAt??e.createdAt)||e.sessionId.localeCompare(t.sessionId)),r=[];return t.length&&r.push({section:`active`,sessions:t}),n.length&&r.push({section:`archived`,sessions:n}),r}function nt(e){return e===void 0?{kind:`unknown`}:e>0?{kind:`approvals`,count:e}:{kind:`none`}}function rt(e){return e.kind===`unknown`?`Approval status unknown`:e.kind===`none`?`No pending approvals`:`${e.count} pending approval${e.count===1?``:`s`}`}function it(e){if(e.archivedAt!==null)return!1;let t=e.lastTurnCompletedAt,n=e.lastVisitedAt;return t===null||n===null?!1:t>n}function at(e){let t=new Map;for(let n of[...e].sort(et)){let e=t.get(n.cwd)??[];e.push(n),t.set(n.cwd,e)}return[...t].map(([e,t])=>({cwd:e,sessions:t}))}var ot=[`priority`,`today`,`yesterday`,`earlier`],st={priority:`Priority`,today:`Today`,yesterday:`Yesterday`,earlier:`Earlier`};function ct(e){let t=new Date(e);return t.setHours(0,0,0,0),t.getTime()}function lt(e,t=Date.now(),n=null){let r=ct(t),i=ct(r-1),a=new Map;for(let t of e){let e=t.sessionId!==n&&it(t)?`priority`:t.lastUsedAt>=r?`today`:t.lastUsedAt>=i?`yesterday`:`earlier`,o=a.get(e)??[];o.push(t),a.set(e,o)}let o=(e,t)=>e===`priority`?t.lastTurnCompletedAt??t.lastUsedAt:t.lastUsedAt;return ot.filter(e=>a.has(e)).map(e=>({bucket:e,sessions:a.get(e).sort((t,n)=>o(e,n)-o(e,t)||t.sessionId.localeCompare(n.sessionId))}))}function ut(e){return e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e}var Y=g(),dt=y.newCodeSession,ft=`jaw.code.sidebarView`;function pt(){try{return localStorage.getItem(ft)===`activity`?`activity`:`projects`}catch{return`projects`}}function mt(){return(0,Y.jsx)(`svg`,{viewBox:`0 0 16 16`,width:`15`,height:`15`,"aria-hidden":`true`,focusable:`false`,children:(0,Y.jsx)(`path`,{d:`M8 2.5a3.5 3.5 0 0 0-3.5 3.5v2.3L3.3 10.6h9.4L11.5 8.3V6A3.5 3.5 0 0 0 8 2.5Z M6.6 12.4a1.5 1.5 0 0 0 2.8 0`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.4`,strokeLinejoin:`round`,strokeLinecap:`round`})})}function ht(){return(0,Y.jsxs)(`svg`,{viewBox:`0 0 16 16`,width:`15`,height:`15`,"aria-hidden":`true`,focusable:`false`,children:[(0,Y.jsx)(`circle`,{cx:`7`,cy:`7`,r:`4.25`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.4`}),(0,Y.jsx)(`path`,{d:`M10.2 10.2 13.5 13.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.4`,strokeLinecap:`round`})]})}function gt(){return(0,Y.jsx)(`svg`,{viewBox:`0 0 16 16`,width:`14`,height:`14`,"aria-hidden":`true`,focusable:`false`,children:(0,Y.jsx)(`path`,{d:`M8 3.5v9M3.5 8h9`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.7`,strokeLinecap:`round`})})}function _t({session:e,controller:t,view:n}){let[r,i]=(0,x.useState)(!1),[a,o]=(0,x.useState)(e.title??``),[s,c]=(0,x.useState)(!1),[l,u]=(0,x.useState)(null),d=(0,x.useRef)(!1),f=(0,x.useRef)(null),p=(0,x.useId)(),m=t.selectedId===e.sessionId,h=Ce(e),g=nt(m&&t.synced?t.permissions.length:e.pendingPermissionCount),_=!m&&it(e),v=t.workingIds?.has(e.sessionId)??!1,y=v&&e.status===`idle`;async function b(e,t){if(!d.current){d.current=!0,c(!0),u(null);try{await e(),t?.()}catch(e){u(e instanceof Error?e.message:String(e))}finally{d.current=!1,c(!1)}}}function S(){i(!1),f.current?.focus()}return(0,Y.jsxs)(`li`,{className:`code-session-row`,children:[(0,Y.jsxs)(`button`,{ref:f,type:`button`,className:`code-session-item${m?` active`:``}`,"aria-current":m?`true`:void 0,onClick:()=>void b(()=>t.selectSession(e.sessionId)),children:[(0,Y.jsxs)(`span`,{className:`code-session-cwd`,children:[_&&(0,Y.jsx)(`span`,{className:`code-session-unread-dot`,role:`img`,"aria-label":`Unread`}),e.title||`Untitled session`]}),(0,Y.jsx)(`span`,{className:`code-session-meta`,title:e.cwd,children:n===`activity`?`${ut(e.cwd)} · ${H[e.provider]}`:H[e.provider]}),(0,Y.jsxs)(`span`,{className:`code-session-status code-session-status-${y?`starting`:e.status}`,"data-quiet":e.status===`idle`&&!v?`true`:void 0,children:[v&&(0,Y.jsx)(`span`,{className:`code-session-spinner`,"aria-hidden":`true`}),y?Se.starting:Se[e.status]]}),(0,Y.jsx)(`span`,{className:`code-session-attention code-session-attention-${g.kind}`,"data-quiet":g.kind===`none`?`true`:void 0,children:rt(g)})]}),r?(0,Y.jsxs)(`form`,{className:`code-session-rename`,onSubmit:n=>{n.preventDefault(),a.trim()&&b(()=>t.rename(e.sessionId,a.trim()),S)},children:[(0,Y.jsx)(`input`,{autoFocus:!0,"aria-label":`Session title`,"aria-describedby":l?p:void 0,value:a,disabled:s,onChange:e=>o(e.target.value),onKeyDown:t=>{t.key===`Escape`&&!s&&(t.preventDefault(),o(e.title??``),S())}}),(0,Y.jsx)(`button`,{type:`submit`,disabled:s||!a.trim(),children:`Save`}),(0,Y.jsx)(`button`,{type:`button`,disabled:s,onClick:S,children:`Cancel`})]}):(0,Y.jsxs)(`details`,{className:`code-session-actions`,children:[(0,Y.jsx)(`summary`,{"aria-label":`Actions for ${e.title||`Untitled session`}`,children:`Actions`}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`button`,{type:`button`,disabled:s||h,onClick:()=>{o(e.title??``),i(!0)},children:`Rename`}),(0,Y.jsx)(`button`,{type:`button`,disabled:s||h,title:h?`Stop before archiving`:void 0,onClick:()=>void b(()=>t.archive(e.sessionId,e.archivedAt===null)),children:e.archivedAt===null?`Archive`:`Restore`}),W(e)&&(0,Y.jsx)(`button`,{type:`button`,disabled:s||!m||!t.synced||t.pending,title:m?`Resume without resending a prompt`:`Select this session to resume it`,onClick:()=>void b(t.resume),children:`Resume`}),h&&(0,Y.jsx)(`small`,{children:`Stop before changing session metadata.`})]})]},`${t.selectedId}:${e.sessionId}`),s&&(0,Y.jsx)(`span`,{className:`code-session-view-hint`,role:`status`,children:`Updating session…`}),l&&(0,Y.jsx)(`div`,{id:p,className:`code-session-list-error`,role:`alert`,children:l})]})}function vt({controller:e,newSessionShortcut:t=dt}){let[n,r]=(0,x.useState)(``),[i,a]=(0,x.useState)(!1),o=(0,x.useRef)(null);function s(){if(i){a(!1),r(``);return}a(!0),queueMicrotask(()=>o.current?.focus())}let c=(0,x.useId)(),[l,u]=(0,x.useState)(pt);function d(e){u(e);try{localStorage.setItem(ft,e)}catch{}}let[f,p]=(0,x.useState)(null),[m,h]=(0,x.useState)(!1),g=(0,x.useRef)(!1),_=e.sessions.filter(e=>`${e.title??``} ${e.cwd} ${H[e.provider]}`.toLowerCase().includes(n.toLowerCase())),y=e.sessions.some(t=>t.sessionId!==e.selectedId&&it(t)),b=_.filter(e=>e.archivedAt===null),S=_.filter(e=>e.archivedAt!==null),C=l===`activity`?lt(b,Date.now(),e.selectedId).map(e=>({key:e.bucket,title:st[e.bucket],cwd:null,sessions:e.sessions})):at(b).map(e=>({key:e.cwd,title:e.cwd,cwd:e.cwd,sessions:e.sessions}));S.length&&C.push({key:`archived`,title:`Archived`,cwd:null,sessions:tt(S).flatMap(e=>e.sessions)});let w=e.newSession;(0,x.useEffect)(()=>{function e(e){e.detail===`newCodeSession`&&w()}return document.addEventListener(`jaw:shortcut-action`,e),()=>document.removeEventListener(`jaw:shortcut-action`,e)},[w]);async function T(t){if(e.newSession(),e.hasUnsentDraft){p(`Send or clear the current draft before choosing another workspace.`);return}if(e.selectedId===null&&e.pending){p(`Wait for the current change to finish before choosing another workspace.`);return}p(null);try{await e.setSelection({cwd:t})}catch(e){p(e instanceof Error?e.message:String(e))}}async function E(){if(!g.current){g.current=!0,h(!0),p(null);try{await e.loadMoreSessions()}catch(e){p(e instanceof Error?e.message:String(e))}finally{g.current=!1,h(!1)}}}return(0,Y.jsxs)(`nav`,{className:`code-session-list`,"aria-label":`Code sessions`,children:[(0,Y.jsxs)(`button`,{type:`button`,className:`code-session-new-primary${e.selectedId===null?` active`:``}`,"aria-current":e.selectedId===null?`true`:void 0,"aria-label":`New Code session`,"aria-describedby":e.hasUnsentDraft?c:void 0,title:`Start a new session (${v(t)})`,onClick:e.newSession,children:[(0,Y.jsx)(gt,{}),(0,Y.jsx)(`span`,{className:`code-session-new-label`,children:`New session`}),e.hasUnsentDraft&&(0,Y.jsx)(`span`,{id:c,className:`code-session-draft-badge`,children:`Draft`}),(0,Y.jsx)(`kbd`,{className:`code-session-new-hint`,"aria-hidden":`true`,children:v(t)})]}),(0,Y.jsxs)(`div`,{className:`code-session-list-header`,children:[(0,Y.jsx)(`span`,{className:`code-session-list-title`,children:l===`activity`?`Recent activity`:`Projects`}),(0,Y.jsxs)(`span`,{className:`code-session-header-actions`,children:[(0,Y.jsx)(`button`,{type:`button`,className:`code-session-header-btn code-session-search-btn${i?` active`:``}`,"aria-pressed":i,"aria-label":`Search sessions`,title:`Search sessions`,onClick:s,children:(0,Y.jsx)(ht,{})}),(0,Y.jsxs)(`button`,{type:`button`,className:`code-session-header-btn code-session-bell${l===`activity`?` active`:``}`,"aria-pressed":l===`activity`,"aria-label":y?`Recent activity (unread sessions)`:`Recent activity`,title:l===`activity`?`Back to projects`:`Recent activity`,onClick:()=>d(l===`activity`?`projects`:`activity`),children:[(0,Y.jsx)(mt,{}),y&&(0,Y.jsx)(`span`,{className:`code-session-unread-dot`,"aria-hidden":`true`})]})]})]}),i&&(0,Y.jsxs)(`div`,{className:`code-session-search-row`,children:[(0,Y.jsx)(`input`,{ref:o,className:`code-session-search`,type:`search`,"aria-label":`Search loaded sessions`,placeholder:`Search sessions…`,value:n,onChange:e=>r(e.target.value),onKeyDown:e=>{e.key===`Escape`&&(e.preventDefault(),s())}}),(0,Y.jsx)(`button`,{type:`button`,className:`code-session-archived-btn${e.filter.archived?` active`:``}`,"aria-pressed":e.filter.archived,title:`Include archived sessions`,onClick:()=>e.setFilter({...e.filter,archived:!e.filter.archived}),children:`Archived`})]}),e.loading&&(0,Y.jsx)(`div`,{className:`code-session-list-loading`,role:`status`,children:`Loading sessions…`}),C.map(t=>(0,Y.jsxs)(`section`,{className:`code-session-group`,children:[t.title&&(0,Y.jsxs)(`h3`,{className:`code-session-group-title${t.key===`priority`?` code-session-group-priority`:``}`,title:t.title,children:[(0,Y.jsx)(`span`,{children:t.cwd===null?t.title:ut(t.cwd)}),t.cwd!==null&&(0,Y.jsx)(`button`,{type:`button`,className:`code-session-group-new`,"aria-label":`New session in ${t.cwd}`,title:`New session in ${t.cwd}`,onClick:()=>void T(t.cwd),children:`+`})]}),(0,Y.jsx)(`ul`,{className:`code-session-list-items`,children:t.sessions.map(t=>(0,Y.jsx)(_t,{session:t,controller:e,view:l},t.sessionId))})]},t.key)),!e.loading&&!_.length&&(0,Y.jsx)(`p`,{className:`code-session-list-empty`,children:n?`No loaded sessions match. Clear search or load more.`:`No sessions here. Start a new session above.`}),e.hasMoreSessions&&(0,Y.jsx)(`button`,{type:`button`,className:`code-inline-action`,disabled:m,onClick:()=>void E(),children:m?`Loading…`:`Load more sessions`}),(0,Y.jsx)(`button`,{type:`button`,className:`code-inline-action`,onClick:()=>{p(null),e.refresh().catch(e=>p(e instanceof Error?e.message:String(e)))},children:`Refresh sessions`}),f&&(0,Y.jsx)(`div`,{className:`code-session-list-error`,role:`alert`,children:f})]})}var yt={"codex-app":{viewBox:`0 0 24 24`,rule:`evenodd`,d:`M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z`},claude:{viewBox:`0 0 24 24`,rule:`evenodd`,d:`M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z`},cursor:{viewBox:`675 357 250 286`,d:`M920.015 424.958L805.919 359.086C802.256 356.97 797.735 356.97 794.071 359.086L679.981 424.958C676.901 426.736 675 430.025 675 433.587V566.419C675 569.981 676.901 573.269 679.981 575.048L794.077 640.92C797.74 643.036 802.261 643.036 805.925 640.92L920.02 575.048C923.1 573.269 925.001 569.981 925.001 566.419V433.587C925.001 430.025 923.1 426.736 920.02 424.958H920.015ZM912.848 438.911L802.706 629.682C801.961 630.968 799.995 630.443 799.995 628.954V504.039C799.995 501.543 798.662 499.234 796.498 497.981L688.321 435.526C687.036 434.781 687.561 432.816 689.05 432.816H909.334C912.462 432.816 914.417 436.206 912.853 438.917H912.848V438.911Z`},grok:{viewBox:`0 0 24 24`,rule:`evenodd`,d:`M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815`}};function bt({provider:e}){let t=yt[e];return(0,Y.jsx)(`svg`,{className:`code-provider-glyph`,viewBox:t.viewBox,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,fill:`currentColor`,...t.rule?{fillRule:`evenodd`,clipRule:`evenodd`}:{},children:(0,Y.jsx)(`path`,{d:t.d})})}function xt(){return(0,Y.jsx)(`svg`,{viewBox:`0 0 20 20`,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,children:(0,Y.jsx)(`path`,{d:`M10 16V4.6M5.2 9.4 10 4.4l4.8 5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.7`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function St(){return(0,Y.jsx)(`svg`,{viewBox:`0 0 20 20`,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,children:(0,Y.jsx)(`rect`,{x:`6`,y:`6`,width:`8`,height:`8`,rx:`1.6`,fill:`currentColor`})})}function Ct({muted:e}){return(0,Y.jsxs)(`svg`,{viewBox:`0 0 20 20`,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,children:[(0,Y.jsx)(`path`,{d:`M10 3.6a2 2 0 0 1 2 2v4.2a2 2 0 0 1-4 0V5.6a2 2 0 0 1 2-2ZM5.4 9.6a4.6 4.6 0 0 0 9.2 0M10 14.4V16.4`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,strokeLinejoin:`round`}),e&&(0,Y.jsx)(`path`,{d:`M4.6 4.6 15.4 15.4`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`})]})}function wt(){return(0,Y.jsx)(`svg`,{className:`code-footer-check`,viewBox:`0 0 20 20`,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,children:(0,Y.jsx)(`path`,{d:`m4.8 10.4 3.3 3.3 7.1-7.4`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Tt(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function Et(e){return e.includes(`mp4`)?`.mp4`:e.includes(`ogg`)?`.ogg`:`.webm`}function X(e){let t=e?.name;return t===`NotAllowedError`?`Microphone access was denied.`:t===`NotFoundError`?`No microphone was found.`:t===`NotReadableError`||t===`AbortError`?`The microphone is in use by another application.`:e instanceof Error?e.message:`Dictation failed.`}function Dt(e,t){let[n,r]=(0,x.useState)(`unsupported`),[i,a]=(0,x.useState)(null),o=(0,x.useRef)(null),s=(0,x.useRef)(null),c=(0,x.useRef)([]),l=(0,x.useRef)(!0);(0,x.useEffect)(()=>{let e=typeof MediaRecorder<`u`&&typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia;return r(e?`idle`:`unsupported`),()=>{l.current=!1,o.current?.state===`recording`&&o.current.stop(),s.current?.getTracks().forEach(e=>e.stop())}},[]);let u=(0,x.useCallback)(async(t,n)=>{r(`transcribing`);try{let r=await fetch(`/api/voice`,{method:`POST`,headers:{"Content-Type":n||`audio/webm`,"X-Voice-Ext":Et(n),"X-Stt-Only":`true`},body:t}),i=await r.json().catch(()=>null);if(!r.ok)throw Error(i?.error||`Transcription failed (${r.status}).`);let o=i?.text?.trim();if(!l.current)return;o?e(o):a(`Nothing was transcribed.`)}catch(e){l.current&&a(X(e))}finally{l.current&&r(`idle`)}},[e]),d=(0,x.useCallback)(()=>{if(!(n===`unsupported`||n===`transcribing`||t)){if(n===`recording`){o.current?.stop();return}a(null),(async()=>{let e;try{e=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(e){a(X(e));return}if(!l.current){e.getTracks().forEach(e=>e.stop());return}s.current=e;let t=Tt(),n;try{n=new MediaRecorder(e,t?{mimeType:t}:{})}catch(t){e.getTracks().forEach(e=>e.stop()),a(X(t));return}o.current=n,c.current=[],n.ondataavailable=e=>{e.data.size>0&&c.current.push(e.data)},n.onerror=()=>{a(`Recording failed.`)},n.onstop=()=>{e.getTracks().forEach(e=>e.stop()),s.current=null,o.current=null;let n=new Blob(c.current,{type:t||`audio/webm`});if(c.current=[],l.current){if(n.size===0){r(`idle`),a(`Nothing was recorded.`);return}u(n,t)}},n.start(),r(`recording`)})()}},[t,n,u]);return{status:n,reason:n===`unsupported`?`Dictation needs microphone access, which this browser context does not provide.`:n===`recording`?`Stop dictation`:n===`transcribing`?`Transcribing…`:`Dictation`,error:i,toggle:d}}function Ot(e){let t=(0,x.useRef)(!1),n=(0,x.useRef)(!1),r=(0,x.useRef)(!1),[i,a]=(0,x.useState)(null),o=Dt((0,x.useCallback)(t=>{let n=e.inputText;e.onInputChange(n?`${n.replace(/\s+$/,``)} ${t}`:t)},[e.inputText,e.onInputChange]),e.readOnly);async function s(){if(e.canSend&&e.inputText.trim()&&!n.current){n.current=!0,a(null);try{await e.onSubmit()}catch(e){a(e instanceof Error?e.message:String(e))}finally{n.current=!1}}}async function c(){if(e.canStop&&!r.current){r.current=!0,a(null);try{await e.onStop()}catch(e){a(e instanceof Error?e.message:String(e))}finally{r.current=!1}}}function l(e){e.nativeEvent.isComposing||t.current||e.nativeEvent.keyCode===229||e.key===`Enter`&&!e.shiftKey&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.preventDefault(),s())}return(0,Y.jsxs)(`div`,{className:`code-composer`,children:[(0,Y.jsxs)(`div`,{className:`code-composer-input-shell`,children:[(0,Y.jsx)(`textarea`,{className:`code-composer-input`,"aria-label":`Code prompt`,value:e.inputText,autoFocus:e.autoFocus,onChange:t=>e.onInputChange(t.target.value),onKeyDown:l,onCompositionStart:()=>{t.current=!0},onCompositionEnd:()=>{t.current=!1},placeholder:e.followUpSent?`This turn already has its follow-up. Draft the next message…`:e.followUp?`Send a follow-up while this turn runs…`:e.busy?`Draft a follow-up while this turn runs…`:`Describe a task or ask a question…`,rows:2,readOnly:e.readOnly}),(0,Y.jsx)(`span`,{className:`code-composer-hint`,children:`Enter to send · Shift+Enter for a new line`})]}),(0,Y.jsxs)(`div`,{className:`code-composer-actions`,children:[(0,Y.jsx)(`button`,{type:`button`,className:`code-composer-icon-button${o.status===`recording`?` is-recording`:``}`,"aria-label":o.status===`recording`?`Stop dictation`:`Dictation`,"aria-pressed":o.status===`recording`,disabled:o.status===`unsupported`||o.status===`transcribing`||e.readOnly,title:o.reason,onClick:o.toggle,children:(0,Y.jsx)(Ct,{muted:o.status===`unsupported`})}),e.busy&&(0,Y.jsx)(`button`,{type:`button`,className:`code-composer-send code-composer-stop`,"aria-label":`Stop current turn`,title:e.stopping?`Stopping`:`Stop current turn`,disabled:!e.canStop||e.stopping,onClick:()=>void c(),children:(0,Y.jsx)(St,{})}),(!e.busy||e.followUp)&&(0,Y.jsx)(`button`,{type:`button`,className:`code-composer-send`,"aria-label":e.busy?`Send follow-up`:`Send prompt`,title:e.steering?`Sending follow-up`:e.pending?`Sending`:e.busy?`Send follow-up`:`Send prompt`,disabled:!e.canSend||!e.inputText.trim(),onClick:()=>void s(),children:(0,Y.jsx)(xt,{})})]}),(e.stopping||e.steering||e.pending||o.status===`recording`||o.status===`transcribing`)&&(0,Y.jsx)(`span`,{className:`code-composer-status`,role:`status`,children:e.stopping?`Stopping…`:e.steering?`Sending follow-up…`:e.pending?e.pendingLabel??`Sending…`:o.status===`recording`?`Recording…`:`Transcribing…`}),(i||o.error)&&(0,Y.jsx)(`div`,{className:`code-action-error`,role:`alert`,children:i??o.error})]})}function kt(e){if(!e||!Number.isFinite(e.totalTokens)||e.totalTokens<0)return{state:`hidden`};let t=e.modelContextWindow;if(t===null||!Number.isFinite(t)||t<=0)return{state:`counted`,usedTokens:e.totalTokens};let n=Math.round(e.totalTokens/t*100);return{state:`measured`,usedTokens:e.totalTokens,maxTokens:t,percent:Math.min(100,n),over:n>100}}function At(e,t){let n=e/t;return n<10?n.toFixed(1):String(Math.round(n))}function Z(e){if(!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e);if(t<1e3)return String(t);let n=At(t,1e3);return Number(n)<1e3?`${n}k`:`${At(t,1e6)}M`}function jt(e){return e===null||!Number.isFinite(e)||e<0?`—`:e.toLocaleString(`en-US`)}function Q(e){return e===null?`—`:Z(e)}function Mt(e){return e>=90?`critical`:e>=75?`high`:`normal`}function Nt(e){return e.state===`hidden`?``:e.state===`counted`?`Context: ${Z(e.usedTokens)} tokens used, window unknown`:e.over?`Context: over the window, ${Z(e.usedTokens)} of ${Z(e.maxTokens)} tokens`:`Context: ${e.percent}% used, ${Z(e.usedTokens)} of ${Z(e.maxTokens)} tokens`}function Pt({usage:e}){let t=kt(e),[n,r]=(0,x.useState)(!1),[i,a]=(0,x.useState)(!1),o=n||i,s=(0,x.useId)();if(t.state===`hidden`)return null;let c=Nt(t),l=t.state===`measured`?t.over?`critical`:Mt(t.percent):`normal`,u=2*Math.PI*7,d=t.state===`measured`?t.percent/100*u:0;return(0,Y.jsxs)(`div`,{className:`code-context-usage`,onPointerEnter:()=>r(!0),onPointerLeave:()=>r(!1),children:[(0,Y.jsxs)(`button`,{type:`button`,className:`code-context-trigger is-${l}`,"aria-label":c,"aria-describedby":o?s:void 0,onFocus:()=>a(!0),onBlur:()=>a(!1),children:[t.state===`measured`?(0,Y.jsxs)(`svg`,{className:`code-context-ring`,viewBox:`0 0 18 18`,"aria-hidden":`true`,children:[(0,Y.jsx)(`circle`,{className:`code-context-ring-track`,cx:`9`,cy:`9`,r:`7`}),(0,Y.jsx)(`circle`,{className:`code-context-ring-fill`,cx:`9`,cy:`9`,r:`7`,strokeDasharray:`${d} ${u}`})]}):null,(0,Y.jsx)(`span`,{className:`code-context-value`,children:t.state===`measured`?t.over?`over`:`${t.percent}%`:Z(t.usedTokens)})]}),o&&(0,Y.jsxs)(`div`,{id:s,className:`code-context-detail`,role:`note`,children:[(0,Y.jsx)(`p`,{className:`code-context-detail-total`,children:t.state===`measured`?`${Z(t.usedTokens)} of ${Z(t.maxTokens)} tokens`:`${Z(t.usedTokens)} tokens used`}),t.state===`measured`&&t.over&&(0,Y.jsx)(`p`,{className:`code-context-detail-note`,children:`Past the window the runtime last reported.`}),t.state===`counted`&&(0,Y.jsx)(`p`,{className:`code-context-detail-note`,children:`This runtime did not report a context window.`}),(0,Y.jsxs)(`dl`,{className:`code-context-breakdown`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{children:`Used`}),(0,Y.jsx)(`dd`,{children:jt(e?.totalTokens??null)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{children:`Input`}),(0,Y.jsx)(`dd`,{children:Q(e?.inputTokens??null)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{children:`Cached`}),(0,Y.jsx)(`dd`,{children:Q(e?.cachedInputTokens??null)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{children:`Output`}),(0,Y.jsx)(`dd`,{children:Q(e?.outputTokens??null)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`dt`,{children:`Reasoning`}),(0,Y.jsx)(`dd`,{children:Q(e?.reasoningOutputTokens??null)})]})]}),e?.processedTokens!=null&&(0,Y.jsxs)(`p`,{className:`code-context-detail-note`,children:[`Processed across the conversation: `,Z(e.processedTokens)]})]})]})}function $({label:e,value:t,options:n,disabled:r,onChange:i,displayValue:a,triggerContent:o,filterable:s,filterPlaceholder:c,className:l,title:u}){let d=(0,x.useId)(),f=(0,x.useRef)(null),p=(0,x.useRef)(null),m=(0,x.useRef)(null),[h,g]=(0,x.useState)(null),[_,v]=(0,x.useState)(``),y=n.find(e=>e.value===t),b=(0,x.useMemo)(()=>{let e=_.trim().toLowerCase();return!s||!e?n:n.filter(t=>t.value.toLowerCase().includes(e)||t.label.toLowerCase().includes(e))},[s,n,_]);function C(e=!0){g(null),v(``),e&&f.current?.focus()}function w(){let e=f.current?.getBoundingClientRect();if(!e||r)return;let t=Math.max(192,Math.min(s?340:260,window.innerWidth-28)),n=Math.max(0,e.top-16),i=Math.max(0,window.innerHeight-e.bottom-16),a={left:Math.max(14,Math.min(e.left,window.innerWidth-t-14)),width:t};g(n>=i?{...a,bottom:window.innerHeight-e.top+8,maxHeight:Math.min(288,n)}:{...a,bottom:`auto`,top:e.bottom+8,maxHeight:Math.min(288,i)})}(0,x.useEffect)(()=>{if(!h)return;if(s)m.current?.focus();else{let e=p.current?.querySelectorAll(`button:not(:disabled)`);([...e??[]].find(e=>e.getAttribute(`aria-selected`)===`true`)??e?.[0])?.focus()}let e=e=>{!p.current?.contains(e.target)&&!f.current?.contains(e.target)&&C(!1)},t=()=>C(!1);return document.addEventListener(`pointerdown`,e),window.addEventListener(`resize`,t),()=>{document.removeEventListener(`pointerdown`,e),window.removeEventListener(`resize`,t)}},[h,s]),(0,x.useEffect)(()=>{r&&(g(null),v(``))},[r]);function T(e){if(e.key===`Escape`){e.preventDefault(),C();return}if(e.key===`Tab`){C(!1);return}let t=[...p.current?.querySelectorAll(`button:not(:disabled)`)??[]];if(t.length===0)return;let n=t.findIndex(e=>e===document.activeElement),r;if(e.key===`ArrowDown`)r=(n+1)%t.length;else if(e.key===`ArrowUp`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),t[r]?.focus()}let E=`${e}: ${y?.label??a??(t||`not selected`)}`;return(0,Y.jsxs)(`div`,{className:`code-footer-menu${l?` ${l}`:``}`,children:[(0,Y.jsx)(`button`,{ref:f,type:`button`,className:`code-footer-menu-trigger${o?` is-icon`:``}`,"aria-label":E,"aria-haspopup":`listbox`,"aria-expanded":!!h,"aria-controls":h?d:void 0,disabled:r,title:u??y?.detail??E,onClick:()=>h?C():w(),onKeyDown:e=>{(e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),w())},children:o??(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:`code-footer-label`,children:e}),(0,Y.jsx)(`strong`,{children:y?.label??a??(t||`Not selected`)})]})}),h&&(0,S.createPortal)((0,Y.jsxs)(`div`,{ref:p,id:d,role:`listbox`,"aria-label":e,className:`code-footer-dropup code-footer-floating`,style:h,onKeyDown:T,children:[s&&(0,Y.jsx)(`input`,{ref:m,type:`text`,className:`code-footer-filter`,value:_,"aria-label":`Filter ${e.toLowerCase()}`,placeholder:c??`Filter…`,onChange:e=>v(e.target.value)}),(0,Y.jsxs)(`div`,{className:`code-footer-dropup-list`,children:[b.map(e=>(0,Y.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":e.value===t,disabled:e.disabled,className:`code-footer-dropup-option`,title:e.detail??e.label,onClick:()=>{i(e.value),C()},children:[e.icon&&(0,Y.jsx)(`span`,{className:`code-footer-option-icon`,children:e.icon}),(0,Y.jsxs)(`span`,{className:`code-footer-option-text`,children:[(0,Y.jsx)(`strong`,{children:e.label}),e.detail&&(0,Y.jsx)(`small`,{children:e.detail})]}),e.value===t&&(0,Y.jsx)(wt,{})]},e.value)),b.length===0&&(0,Y.jsxs)(`p`,{className:`code-footer-dropup-empty`,role:`note`,children:[`No match for “`,_.trim(),`”.`]})]})]}),document.body)]})}function Ft({controller:e,onNotice:t}){let n=e.selection,r=e.catalog?.providers.find(e=>e.id===n.provider),i=e.session?.capabilities??r?.capabilities,a=(n.provider===`claude`?r?.capabilities:i)?.permissionModes??[],o=e.selectedId!==null,s=e.pending||e.busy||e.creationUnknown||e.operation.kind!==`idle`||o&&(!e.synced||e.session?.status!==`idle`||e.session?.archivedAt!==null),[c,l]=(0,x.useState)(!1),[u,d]=(0,x.useState)(null),f=(0,x.useRef)(!1),p=(0,x.useRef)(t);p.current=t,(0,x.useEffect)(()=>{if(n.permissionMode!==`auto`){p.current?.({id:`code:permission-mode`,clear:!0});return}p.current?.({id:`code:permission-mode`,variant:`warning`,message:`Auto (YOLO): actions may run without approval.`,durationMs:1/0})},[n.permissionMode]);async function m(t){if(!(s||f.current)){f.current=!0,l(!0),d(null);try{await e.setSelection(t)}catch(e){d(e instanceof Error?e.message:String(e))}finally{f.current=!1,l(!1)}}}let h=s||c,g=r?.effortsByModel?.[n.model]??i?.efforts??[],_=e.session?.capabilities.efforts,v=_?g.filter(e=>_.includes(e)):g,y=r?.models??[];return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`div`,{className:`code-composer-footer`,children:[(0,Y.jsx)($,{label:`Runtime`,value:n.provider,className:`code-footer-runtime`,disabled:o?!e.catalog:h||!e.catalog,triggerContent:(0,Y.jsx)(bt,{provider:n.provider}),title:H[n.provider],options:Object.keys(H).map(t=>{let r=e.catalog?.providers.find(e=>e.id===t);return{value:t,label:o&&t!==n.provider?`New ${H[t]} session`:H[t],disabled:!r?.available||o&&t===n.provider,icon:(0,Y.jsx)(bt,{provider:t}),detail:r?.reason??(r?.available?void 0:`Availability unknown`)}}),onChange:t=>{o?e.setSelection({provider:t}).catch(e=>d(e instanceof Error?e.message:String(e))):m({provider:t})}}),(0,Y.jsx)($,{label:`Permission`,value:n.permissionMode,displayValue:be[n.permissionMode],disabled:h||!i?.permissions,options:a.map(e=>({value:e,label:be[e],detail:xe[e]})),onChange:e=>void m({permissionMode:e})}),(0,Y.jsx)(`span`,{className:`code-composer-footer-spacer`,"aria-hidden":`true`}),(0,Y.jsx)(Pt,{usage:e.session?.contextUsage}),(0,Y.jsx)($,{label:`Model`,value:n.model,className:`code-footer-model`,disabled:h||y.length===0,filterable:!0,filterPlaceholder:`Filter models…`,displayValue:n.model||`Select model`,options:y.map(e=>({value:e,label:e})),onChange:e=>void m({model:e})}),v.length>0&&(0,Y.jsx)($,{label:`Effort`,value:n.effort??``,className:`code-footer-effort`,displayValue:n.effort??`Default`,options:[{value:``,label:`Native default`},...v.map(e=>({value:e,label:e}))],disabled:h,onChange:e=>void m({effort:e||null})}),n.provider===`claude`&&(0,Y.jsx)($,{label:`Thinking`,value:n.thinking===!1?`off`:`on`,className:`code-footer-thinking`,options:[{value:`on`,label:`Thinking on`,detail:`Adaptive thinking with summaries`},{value:`off`,label:`Thinking off`,detail:`Answer without extended thinking`}],disabled:h,onChange:e=>void m({thinking:e===`on`})}),o&&(0,Y.jsx)(`button`,{type:`button`,className:`code-inline-action`,onClick:e.newSession,children:`New session`})]}),y.length===0&&r?.available&&(0,Y.jsxs)(`div`,{className:`code-selection-notice`,children:[`This runtime published no models.`,(0,Y.jsx)(`button`,{type:`button`,className:`code-inline-action`,onClick:()=>{e.refresh().catch(e=>d(e instanceof Error?e.message:String(e)))},children:`Refresh catalog`})]}),!r?.available&&(0,Y.jsxs)(`div`,{className:`code-selection-notice`,children:[r?.reason??`Runtime availability has not been confirmed.`,(0,Y.jsx)(`button`,{type:`button`,className:`code-inline-action`,onClick:()=>{e.refresh().catch(e=>d(e instanceof Error?e.message:String(e)))},children:`Refresh availability`})]}),(c||e.operation.kind===`patching`)&&(0,Y.jsx)(`span`,{role:`status`,children:`Saving settings…`}),u&&(0,Y.jsx)(`div`,{className:`code-action-error`,role:`alert`,children:u})]})}function It(e,t=5){let n=new Set,r=[],i=[...e].sort((e,t)=>t.lastUsedAt-e.lastUsedAt||t.createdAt-e.createdAt||e.sessionId.localeCompare(t.sessionId));for(let e of i){let i=e.cwd;if(i.trim()&&!n.has(i)&&(n.add(i),r.push(i),r.length>=t))break}return r}var Lt=[`Explain this codebase`,`Find and fix a bug`,`Write tests for the module I name`,`Review uncommitted changes`];function Rt(){document.querySelector(`textarea[aria-label="Code prompt"]`)?.focus()}function zt({controller:e}){let t=e.selection.cwd,n=e.selectedId!==null||e.pending||e.creationUnknown||e.operation.kind!==`idle`,r=e.workspacePicking,i=It(e.sessions.filter(e=>e.cwd!==t));function a(){n||r||e.pickWorkspace()}function o(t){n||(e.setSelection({cwd:t}),Rt())}return(0,Y.jsxs)(`section`,{className:`code-draft-empty`,"aria-label":`New session draft`,children:[(0,Y.jsx)(`h2`,{className:`code-draft-empty-title`,children:`New session`}),n?(0,Y.jsx)(`span`,{className:`code-workspace-chip`,title:t,children:t||`Workspace not set`}):(0,Y.jsx)(`button`,{type:`button`,className:`code-workspace-picker code-draft-empty-picker`,"aria-label":`Choose workspace for the new session`,disabled:r,title:t||`Choose a folder`,onClick:a,children:(0,Y.jsx)(`span`,{className:`code-workspace-picker-label`,children:r?`Choosing folder…`:t||`Choose workspace`})}),(0,Y.jsxs)(`p`,{className:`code-draft-empty-selection`,children:[H[e.selection.provider],` · `,e.selection.model||`No model selected`]}),i.length>0&&(0,Y.jsxs)(`div`,{className:`code-draft-recents`,children:[(0,Y.jsx)(`span`,{className:`code-draft-recents-label`,children:`Recent workspaces`}),i.map(e=>(0,Y.jsx)(`button`,{type:`button`,className:`code-draft-recent`,title:e,disabled:n,onClick:()=>o(e),children:e},e))]}),!e.input.trim()&&(0,Y.jsx)(`div`,{className:`code-draft-prompts`,children:Lt.map(t=>(0,Y.jsx)(`button`,{type:`button`,className:`code-draft-prompt`,disabled:n,onClick:()=>{e.setInput(t),Rt()},children:t},t))})]})}function Bt({permission:e,operation:t,eligible:n,onAnswer:r}){let i=(0,x.useRef)(!1),[a,o]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null);async function l(a){if(!(!n||i.current||t?.pending)){i.current=!0,o(!0),c(null);try{await r(e,a)}catch(e){c(e instanceof Error?e.message:String(e))}finally{i.current=!1,o(!1)}}}return(0,Y.jsxs)(`section`,{className:`code-permission-card`,"aria-label":e.title,children:[(0,Y.jsxs)(`div`,{className:`code-permission-title`,children:[(0,Y.jsx)(`strong`,{children:e.title}),(0,Y.jsx)(`p`,{children:e.detail}),!n&&(0,Y.jsx)(`small`,{children:`Updating permission availability…`}),(a||t?.pending)&&(0,Y.jsx)(`small`,{role:`status`,children:`Checking decision…`}),(t?.error||s)&&(0,Y.jsx)(`div`,{className:`code-action-error`,role:`alert`,children:t?.error||s})]}),(0,Y.jsxs)(`div`,{className:`code-permission-actions`,children:[e.options.map(e=>(0,Y.jsx)(`button`,{type:`button`,className:`code-permission-btn`,disabled:!n||a||t?.pending,onClick:()=>void l(e.optionId),children:e.label},e.optionId)),e.options.length===0&&(0,Y.jsx)(`span`,{children:`No native actions available. Refresh this session.`})]})]})}function Vt({permissions:e,operations:t,session:n,synced:r,onAnswer:i}){return e.length?(0,Y.jsxs)(`aside`,{className:`code-permissions`,"aria-label":`Pending permissions`,tabIndex:-1,id:`code-pending-permissions`,children:[(0,Y.jsxs)(`div`,{className:`code-permissions-heading`,role:`status`,children:[e.length,` pending · `,n?H[n.provider]:`Session updating`]}),e.map(e=>(0,Y.jsx)(Bt,{permission:e,operation:t[e.permissionId],eligible:r&&n!==null&&n.archivedAt===null&&n.sessionId===e.sessionId&&n.turnId===e.turnId&&n.epoch===e.epoch&&(n.status===`starting`||n.status===`streaming`),onAnswer:i},`${e.sessionId}:${e.permissionId}`))]}):null}var Ht=92,Ut=6;function Wt(e){let[{virtualItems:t,totalSize:s},c]=(0,x.useState)({virtualItems:[],totalSize:0}),l=(0,x.useRef)(null);l.current||=new o({count:e.count,getScrollElement:()=>e.scrollElementRef.current,estimateSize:e.estimateSize||(()=>Ht),overscan:Ut,getItemKey:e.getItemKey,indexAttribute:`data-code-transcript-idx`,useAnimationFrameWithResizeObserver:!0,observeElementRect:n,observeElementOffset:r,scrollToFn:i,measureElement:a,onChange:e=>{c({virtualItems:e.getVirtualItems(),totalSize:e.getTotalSize()})}});let u=l.current;return(0,x.useEffect)(()=>u._didMount(),[u]),(0,x.useEffect)(()=>{u.measure()},[u,e.resetKey]),(0,x.useEffect)(()=>()=>{l.current=null},[]),(0,x.useLayoutEffect)(()=>{u.setOptions({...u.options,count:e.count,getItemKey:e.getItemKey,estimateSize:e.estimateSize||(()=>Ht)}),u._willUpdate(),c({virtualItems:u.getVirtualItems(),totalSize:u.getTotalSize()})},[e.count,e.estimateSize,e.getItemKey,u]),{restoreAnchor:(e,t)=>{let n=u.getOffsetForIndex(e,`start`);n&&u.scrollToOffset(n[0]+t,{behavior:`auto`})},measureElement:e=>{e&&u.measureElement(e)},virtualItems:t,totalSize:s}}var Gt=64,Kt=64;function qt({items:e,sessionKey:t,transcriptRef:n,virtual:r}){let i=(0,x.useRef)(new Map),a=(0,x.useRef)(!0),[o,s]=(0,x.useState)(!1),c=(0,x.useRef)({sessionKey:``,firstId:``}),l=(0,x.useRef)({items:e,virtual:r,sessionKey:t});l.current={items:e,virtual:r,sessionKey:t};let u=(0,x.useCallback)(()=>{a.current=!0,s(!1);let e=n.current;e&&(e.scrollTop=e.scrollHeight)},[n]);return(0,x.useLayoutEffect)(()=>{let e=n.current;if(!e)return;let t=()=>{let t=l.current,n=t.virtual.virtualItems.find(t=>t.end>e.scrollTop),r={itemId:n?t.items[n.index]?.itemId??null:null,offset:n?e.scrollTop-n.start:0,following:a.current};if(i.current.delete(t.sessionKey),i.current.set(t.sessionKey,r),i.current.size>Gt){let e=i.current.keys().next().value;e!==void 0&&i.current.delete(e)}},r=()=>{l.current.items.length&&(a.current=e.scrollHeight-e.scrollTop-e.clientHeight<=Kt,s(!a.current),t())};return e.addEventListener(`scroll`,r,{passive:!0}),()=>e.removeEventListener(`scroll`,r)},[n]),(0,x.useLayoutEffect)(()=>{let o=n.current;if(!o)return;let l=e[0]?.itemId??``,u=c.current.sessionKey!==t,d=!u&&c.current.firstId!==l;c.current={sessionKey:t,firstId:l};let f=i.current.get(t);if(u&&(a.current=f?.following??!0,s(!a.current)),a.current){o.scrollTop=o.scrollHeight;return}if((u||d)&&f?.itemId){let t=e.findIndex(e=>e.itemId===f.itemId);t>=0&&r.restoreAnchor(t,f.offset)}},[e,t,n,r.totalSize]),{showJump:o,jumpToLatest:u}}var Jt=2e3,Yt=80,Xt=400;function Zt(e){return e<=Jt?Yt:Math.min(Xt,Math.round(Yt*e/Jt))}function Qt(e,t=!1,n=``){let[r,i]=(0,x.useState)({text:e,identity:n}),a=(0,x.useRef)(0),o=t||r.identity!==n||!e.startsWith(r.text);return(0,x.useEffect)(()=>{if(r.text===e&&r.identity===n)return;let t=()=>{a.current=Date.now(),i({text:e,identity:n})},s=Zt(e.length)-(Date.now()-a.current);if(o||s<=0){t();return}let c=window.setTimeout(t,s);return()=>window.clearTimeout(c)},[e,n,o,r]),o?e:r.text}var $t=[[/^(read|read_file|get_file|open_file|view|cat)$/i,`Read`,`Reading`],[/^(write|write_file|create_file|edit|edit_file|apply_patch|str_replace\w*|update_file)$/i,`Edit`,`Editing`],[/^(bash|shell|exec|exec_command|run|run_command|terminal)$/i,`Bash`,`Running`],[/^(search|grep|rg|ripgrep|glob|find|codebase_search)$/i,`Search`,`Searching`],[/^(fetch|browser\w*|web_\w*|open_url|http)$/i,`Open`,`Opening`],[/^(list|ls|list_dir|list_files)$/i,`List`,`Listing`]];function en(e){return e===`running`||e===`pending`}function tn(e,t){let n=e.trim();if(t&&n.startsWith(t)){let e=n.slice(t.length).replace(/^[\\/]+/,``);if(e)return e}if(n.length<=64)return n;let r=n.split(/[\\/]/).filter(Boolean);return r.length>2?`…/${r.slice(-2).join(`/`)}`:`…${n.slice(-60)}`}function nn(e){let t=(e.split(/\r?\n/).find(e=>e.trim())??``).replace(/\s+/g,` `).trim();return t.length>96?`${t.slice(0,95)}…`:t}function rn(e,t){if(!e)return``;let n=e.trim();if(!n)return``;let r=d(n);if(r){for(let e of f){let n=s(r,[e]);if(n!==null)return e===`path`||e===`file`||e===`file_path`?tn(n,t):nn(n)}return``}return n.includes(`/`)&&!n.includes(` `)?tn(n,t):nn(n)}function an(e){let t=p(e).description;return t===null?``:l(t)}function on(e){if(e===void 0)return null;let t=p(e),n=null;if(t.object&&t.field===`command`){let e=new Set([...u.command,...m]),r=Object.fromEntries(Object.entries(t.object).filter(([t])=>!e.has(t)));Object.keys(r).length&&(n=JSON.stringify(r,null,2))}let r=t.field===`command`&&t.value!==null;return{content:r?t.value:t.object?c(e):t.value??e,command:r,parameters:n,description:t.description}}function sn(e,t){let n=en(e.status);if(e.kind===`file_change`){let r=rn(e.tool?.input,t)||e.tool?.detail||``;return r?`${n?`Editing`:`Edit`} ${r}`:`File change`}let r=e.tool?.name?.trim()||`Tool`,i=$t.find(([e])=>e.test(r)),a=i?n?i[2]:i[1]:void 0,o=rn(e.tool?.input,t);return a?o?`${a} ${o}`:a:o?`${r} ${o}`:r}function cn(e){return e.kind===`turn_cancelled`||e.status===`cancelled`?`Stopped`:e.kind===`turn_failed`||e.status===`error`?`Failed`:e.status===`running`?`Running`:e.status===`pending`?`Pending`:null}var ln=(0,x.lazy)(()=>t(()=>import(`./MarkdownRenderer-Cc3DeHvm.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0]))),un=new Set([`turn_started`,`turn_completed`]),dn=44,fn=480,pn=64;function mn(e){return e.length>1400||e.split(`
3
+ `).length>14}function hn(e,t,n){let r=e.get(`${t}:${n.itemId}`);return r===void 0?n.status===`error`&&n.kind!==`reasoning`:r}function gn({item:e,identity:t,onOpenLocalFile:n}){let r=Qt(e.text??``,e.status!==`running`&&e.status!==`pending`,t);return r.trim()?(0,Y.jsx)(x.Suspense,{fallback:(0,Y.jsx)(`span`,{className:`code-plain-text`,children:r}),children:(0,Y.jsx)(ln,{markdown:r,tableMode:`linear`,onLocalFileOpen:n})}):(0,Y.jsx)(`span`,{className:`code-plain-text`,children:r})}function _n({item:e,provider:t,sessionKey:n,workingDir:r=``,onOpenLocalFile:i,expanded:a,onExpandedChange:o,onRollback:s}){let c=e.kind===`tool_call`||e.kind===`file_change`,l=e.kind===`reasoning`,u=e.kind===`assistant_message`,d=e.kind===`user_message`,f=Ee(e),p=cn(e),m=e.itemId===Ie,h=a??(e.status===`error`&&e.kind!==`reasoning`),g=e.status===`running`||e.status===`pending`,_=g?null:p,v=c?an(e.tool?.input):``,y=c?on(e.tool?.input):null,S=[];c&&(y&&S.push({key:`input`,label:`Input`,content:y.content,className:`code-tool-args`,copyable:!0}),y?.parameters&&S.push({key:`params`,label:`Parameters`,content:y.parameters,className:`code-tool-json`,copyable:!1}),y?.description&&S.push({key:`description`,label:`Description`,content:y.description,className:`code-tool-text`,copyable:!1}),e.tool?.output!==void 0&&S.push({key:`output`,label:`Output`,content:e.tool.output,className:`code-tool-output`,copyable:!1}));let C=S.some(e=>mn(e.content))||e.tool?.detail!==void 0&&mn(e.tool.detail)||e.text!==void 0&&mn(e.text),[w,T]=(0,x.useState)(!1),E=(0,x.useRef)(null),[D,O]=(0,x.useState)(null);(0,x.useEffect)(()=>{O(null)},[C]),(0,x.useEffect)(()=>{if(!h||w)return;let e=E.current?.querySelectorAll(`pre, .code-tool-body > .code-tool-text`);if(!e||e.length===0){O(null);return}let t=[...e],n=t.some(e=>e.scrollHeight>e.clientHeight+2);O(n||t.every(e=>e.scrollHeight===0)&&C)},[h,w,C]);let k=D??C;(0,x.useEffect)(()=>{k||T(!1)},[k]);let[A,j]=(0,x.useState)(!1),M=(0,x.useRef)(null);(0,x.useEffect)(()=>()=>{M.current!==null&&window.clearTimeout(M.current)},[]);let N=(0,x.useCallback)(()=>{j(!0),M.current!==null&&window.clearTimeout(M.current),M.current=window.setTimeout(()=>{M.current=null,j(!1)},1200)},[]),P=d?`You`:u?H[t]:l?`Reasoning`:e.kind===`turn_started`?`Turn started`:e.kind===`session_runtime`?`Runtime`:e.kind===`permission_request`?`Permission record`:e.kind===`notice`?`Notice`:f;return(0,Y.jsxs)(`article`,{className:`code-message code-message-${c?`tool`:u?`assistant`:d?`user`:`system`} is-${e.status}${m?` is-unsent`:``}`,"data-code-item-id":e.itemId,"aria-label":`${P} · ${f}`,children:[c?(0,Y.jsxs)(`details`,{className:`code-tool-card code-tool-${e.status}`,open:h,onToggle:t=>o?.(e.itemId,t.currentTarget.open),children:[(0,Y.jsxs)(`summary`,{className:`code-tool-summary`,children:[(0,Y.jsx)(`span`,{className:`code-tool-chevron`,"aria-hidden":`true`,children:`›`}),(0,Y.jsxs)(`span`,{className:`code-tool-summary-text`,children:[(0,Y.jsx)(`span`,{className:`code-tool-name${g?` code-tool-name-running`:``}`,children:sn(e,r)}),v!==``&&(0,Y.jsx)(`span`,{className:`code-tool-desc`,children:v})]}),_&&(0,Y.jsx)(`span`,{className:`code-tool-status`,children:_})]}),h&&(0,Y.jsxs)(`div`,{ref:E,className:`code-tool-body`,"data-expanded":w,children:[e.tool?.detail!==void 0&&(0,Y.jsx)(`p`,{className:`code-tool-text`,children:e.tool.detail}),S.map(e=>(0,Y.jsxs)(`section`,{className:`code-tool-section`,children:[(0,Y.jsxs)(`div`,{className:`code-tool-section-head`,children:[(0,Y.jsx)(`span`,{className:`code-tool-section-label`,children:e.label}),e.copyable&&(0,Y.jsx)(`button`,{type:`button`,className:`code-tool-copy${A?` copied`:``}`,"aria-label":`Copy ${e.label.toLowerCase()}`,onClick:()=>void b(e.content).then(e=>{e.ok&&N()}),children:A?`Copied`:`Copy`})]}),(0,Y.jsx)(`pre`,{className:e.className,children:e.content})]},e.key)),e.text!==void 0&&(0,Y.jsx)(`pre`,{className:`code-tool-text`,children:e.text}),g&&e.tool?.output===void 0&&e.tool?.detail===void 0&&(0,Y.jsx)(`p`,{className:`code-tool-waiting`,children:`Waiting for output…`}),k&&(0,Y.jsx)(`button`,{type:`button`,className:`code-tool-toggle`,"aria-expanded":w,onClick:()=>T(e=>!e),children:w?`Show less`:`Show all`})]})]}):l?(0,Y.jsxs)(`details`,{className:`code-thinking`,open:h,onToggle:t=>o?.(e.itemId,t.currentTarget.open),children:[(0,Y.jsx)(`summary`,{className:`code-thinking-summary${e.status===`running`?` code-tool-name-running`:``}`,children:e.status===`running`?`Thinking…`:`Reasoning`}),h&&(0,Y.jsx)(`div`,{className:`code-thinking-text`,children:e.text})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`span`,{className:`code-message-role`,children:[P,u&&e.phase===`commentary`?` · Commentary`:``,p&&` · ${m?`Sending`:p}`,d&&!m&&e.phase===`unknown`&&` · Delivery not confirmed`]}),(0,Y.jsx)(`div`,{className:`code-message-text`,children:u?(0,Y.jsx)(gn,{item:e,identity:`${n}:${e.itemId}`,onOpenLocalFile:i}):(0,Y.jsx)(`span`,{className:`code-plain-text`,children:e.text??e.permission?.title??``})}),e.permission?.detail&&(0,Y.jsx)(`p`,{className:`code-plain-text`,children:e.permission.detail}),s&&d&&!m&&(0,Y.jsx)(`button`,{type:`button`,className:`code-message-rollback`,onClick:()=>{window.confirm(`Later turns are removed from this conversation. Workspace files are not changed. No prompt is sent.`)&&s(e.itemId)},children:`Roll back conversation to here`})]}),(u||l)&&(e.status===`cancelled`||e.status===`error`)&&(0,Y.jsxs)(`span`,{className:`code-partial-label`,children:[`Partial output · `,f]}),e.truncation&&(0,Y.jsxs)(`p`,{className:`code-truncation`,role:`note`,children:[`Output truncated: `,e.truncation.storedChars.toLocaleString(),` of `,e.truncation.sourceChars.toLocaleString(),` characters retained.`]})]})}function vn({items:e,provider:t,sessionKey:n,workingDir:r,loading:i,hasOlderHistory:a,loadOlderHistory:o,permissionCount:s,onOpenLocalFile:c,working:l=!1,rollbackRows:u,onRollback:d}){let f=(0,x.useRef)(null),p=(0,x.useMemo)(()=>e.filter(e=>!un.has(e.kind)),[e]),m=(0,x.useRef)(p);m.current=p;let[h,g]=(0,x.useState)(()=>new Map),_=(0,x.useRef)(h);_.current=h;let[v,y]=(0,x.useState)(!1),[b,S]=(0,x.useState)(null),C=(0,x.useRef)(!1),w=p[0]?.itemId,T=(0,x.useCallback)(e=>{let t=m.current[e];return t?`${n}:${t.itemId}${hn(_.current,n,t)?`:open`:``}`:`${n}:${e}`},[n,w,h]),E=(0,x.useCallback)(e=>{let t=m.current[e];return t?.kind!==`tool_call`&&t?.kind!==`file_change`&&t?.kind!==`reasoning`?64+Math.min(420,(t?.text?.length??0)/6):t&&hn(h,n,t)?fn:dn},[h,n]),D=Wt({count:p.length,resetKey:n,scrollElementRef:f,getItemKey:T,estimateSize:E}),{showJump:O,jumpToLatest:k}=qt({items:p,sessionKey:n,transcriptRef:f,virtual:D}),A=(0,x.useCallback)((e,t)=>{let r=`${n}:${e}`;g(e=>{if(e.get(r)===t)return e;let n=new Map(e);if(n.delete(r),n.set(r,t),n.size>pn){let e=n.keys().next().value;e!==void 0&&n.delete(e)}return n})},[n]);async function j(){if(!C.current){C.current=!0,y(!0),S(null);try{await o()}catch(e){S({sessionKey:n,message:e instanceof Error?e.message:String(e)})}finally{C.current=!1,y(!1)}}}function M(e){if(e.target!==e.currentTarget||e.altKey||e.ctrlKey||e.metaKey)return;let t=f.current;if(!t)return;let n=Math.max(160,t.clientHeight*.78);[`j`,`d`,`PageDown`].includes(e.key)?(e.preventDefault(),t.scrollBy({top:n,behavior:`auto`})):[`k`,`u`,`PageUp`].includes(e.key)?(e.preventDefault(),t.scrollBy({top:-n,behavior:`auto`})):e.key===`End`?(e.preventDefault(),k()):e.key===`Home`&&(e.preventDefault(),t.scrollTo({top:0,behavior:`auto`}))}return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`div`,{className:`code-transcript-controls`,children:[a&&(0,Y.jsx)(`button`,{type:`button`,disabled:v||i,onClick:()=>void j(),children:v?`Loading history…`:`Load older history`}),O&&(0,Y.jsx)(`button`,{type:`button`,onClick:k,children:`Jump to latest`}),s>0&&(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>document.getElementById(`code-pending-permissions`)?.focus(),children:[`Jump to permissions (`,s,`)`]}),b?.sessionKey===n&&(0,Y.jsx)(`span`,{className:`code-action-error`,role:`alert`,children:b.message})]}),(0,Y.jsxs)(`div`,{ref:f,className:`code-transcript`,role:`log`,"aria-label":`Code transcript`,"aria-live":`off`,tabIndex:0,onKeyDown:M,children:[p.length?(0,Y.jsx)(`div`,{className:`code-transcript-virtual-spacer`,style:{height:D.totalSize},children:D.virtualItems.map(e=>{let i=p[e.index];return i?(0,Y.jsx)(`div`,{ref:D.measureElement,className:`code-transcript-virtual-row`,"data-code-transcript-idx":e.index,style:{transform:`translateY(${e.start}px)`},children:(0,Y.jsx)(_n,{item:i,provider:t,sessionKey:n,workingDir:r,onOpenLocalFile:c,expanded:hn(h,n,i),onExpandedChange:A,onRollback:u?.has(i.itemId)?d:void 0})},e.key):null})}):(0,Y.jsxs)(`div`,{className:`code-transcript-empty`,children:[(0,Y.jsx)(`p`,{children:i?`Loading conversation…`:`Type a prompt below to start this conversation.`}),(0,Y.jsxs)(`p`,{className:`code-transcript-cwd`,children:[`Workspace: `,r||`not set`]})]}),l&&p[p.length-1]?.status!==`running`&&(0,Y.jsxs)(`div`,{className:`code-transcript-working`,role:`status`,"aria-live":`polite`,children:[(0,Y.jsx)(`span`,{className:`code-session-spinner`,"aria-hidden":`true`}),`Working…`]})]})]})}function yn(e){return Number.isFinite(e.durationMs)&&e.durationMs>0}function bn(e,t){let n=e.find(e=>e.id===t.id),r=e.filter(e=>e.id!==t.id);return r.push({...t,revision:(n?.revision??0)+1}),r.slice(Math.max(0,r.length-3))}function xn(e,t){let n=e.filter(e=>e.id!==t);return n.length===e.length?e:n}function Sn(e,t){return`clear`in t?xn(e,t.id):bn(e,{id:t.id,message:t.message,variant:t.variant,durationMs:t.durationMs??4e3})}function Cn({toast:e,onDismiss:t}){let[n,r]=(0,x.useState)(!1),i=(0,x.useRef)(null);return(0,x.useEffect)(()=>{if(n||!yn(e))return;let r=setTimeout(()=>t(e.id),e.durationMs);return()=>clearTimeout(r)},[e.id,e.revision,e.durationMs,t,n]),(0,Y.jsxs)(`div`,{ref:i,className:`code-toast code-toast-${e.variant}`,onPointerEnter:()=>r(!0),onPointerLeave:()=>r(!1),onFocusCapture:()=>r(!0),onBlurCapture:e=>{i.current?.contains(e.relatedTarget)||r(!1)},children:[(0,Y.jsx)(`span`,{className:`code-toast-message`,children:e.message}),(0,Y.jsx)(`button`,{type:`button`,className:`code-toast-dismiss`,"aria-label":`Dismiss notice`,onClick:()=>t(e.id),children:`×`})]})}function wn({toasts:e,onDismiss:t}){return(0,Y.jsx)(`div`,{className:`code-toast-host`,children:(0,Y.jsx)(`div`,{className:`code-toast-region`,role:`status`,children:e.map(e=>(0,Y.jsx)(Cn,{toast:e,onDismiss:t},e.id))})})}function Tn({controller:e}){let t=e.session?.cwd??e.selection.cwd,n=e.selectedId!==null||e.pending||e.creationUnknown||e.operation.kind!==`idle`,r=e.workspacePicking;function i(){n||r||e.pickWorkspace()}return(0,Y.jsxs)(`header`,{className:`code-workspace-header`,children:[(0,Y.jsxs)(`div`,{className:`code-session-header`,children:[(0,Y.jsx)(`span`,{className:`code-session-title`,children:e.session?.title||(e.selectedId?`Untitled session`:`New session draft`)}),(0,Y.jsx)(`span`,{children:H[e.session?.provider??e.selection.provider]}),(0,Y.jsxs)(`span`,{role:`status`,children:[e.session?Se[e.session.status]:e.creationUnknown?`Creation unconfirmed`:e.operation.kind===`creating`?`Creating session`:`Draft`,e.session?.archivedAt!==null&&e.session?` · Archived`:``]})]}),(0,Y.jsxs)(`div`,{className:`code-workspace-primary`,children:[n?(0,Y.jsx)(`span`,{className:`code-workspace-chip`,title:t,children:t||`Workspace not set`}):(0,Y.jsx)(`button`,{type:`button`,className:`code-workspace-picker`,"aria-label":`Choose Code workspace`,disabled:r,title:t||`Choose a folder`,onClick:i,children:(0,Y.jsx)(`span`,{className:`code-workspace-picker-label`,children:r?`Choosing folder…`:t||`Choose workspace`})}),e.gitInfo?.isRepo&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`span`,{className:`code-workspace-pill`,children:[e.gitInfo.branch??`detached`,e.gitInfo.head?` · ${e.gitInfo.head}`:``]}),e.gitInfo.status&&(0,Y.jsx)(`span`,{className:`code-workspace-pill${e.gitInfo.status.dirty?` is-dirty`:``}`,children:e.gitInfo.status.dirty?`${e.gitInfo.status.changed} changed · ${e.gitInfo.status.untracked} untracked`:`clean`})]})]})]})}function En({controller:e,endpointKey:t,onOpenLocalFile:n}){let r=`${t}:${e.selectedId??`new`}`,[i,a]=(0,x.useState)(null),[o,s]=(0,x.useState)(null),c=(0,x.useRef)(new Set),[l,u]=(0,x.useState)([]),d=(0,x.useCallback)(e=>{u(t=>Sn(t,e))},[]),f=(0,x.useCallback)(e=>u(t=>xn(t,e)),[]),p=e.session?.archivedAt!=null,m=e.session?.status===`stopping`||e.operation.kind===`stopping`,h=e.busy||e.working||m||e.session?.status===`starting`||e.session?.status===`streaming`,g=e.catalog?.providers.find(t=>t.id===e.selection.provider),_=e.operation.kind===`unknown-send`,v=!e.steering&&(e.followUp?!e.followUpSent&&!m&&!e.pending&&!p&&e.operation.kind===`idle`:!h&&!e.pending&&!e.creationUnknown&&!p&&e.operation.kind===`idle`&&!!g?.available&&!!e.selection.cwd.trim()&&!!e.selection.model.trim()&&(e.selectedId===null||e.synced&&(e.session?.status===`idle`||!!e.session&&W(e.session)))),y=!!e.session?.turnId&&e.session.capabilities.interrupt&&h&&!m,b=!!e.session&&W(e.session)&&e.synced&&!e.pending&&!_,S=e.operation.error||e.error||(i?.key===r?i.message:null),C=we(e.session,e.synced,e.operation.kind===`idle`&&!e.steering)?Te(e.items,e.session?.rollback?.sinceSequence):void 0,w=[...e.items].reverse().find(e=>e.kind===`turn_cancelled`||e.kind===`turn_failed`||e.kind===`turn_completed`),T=w&&w.kind!==`turn_completed`?e.items.find(e=>e.kind===`user_message`&&e.turnId===w.turnId)?.text:void 0;function E(e){a(null),e().catch(e=>a({key:r,message:e instanceof Error?e.message:String(e)}))}async function D(){if(e.canRetrySameSend&&!c.current.has(r)){c.current.add(r),s(r),a(null);try{await e.retrySameSend()}catch(e){a({key:r,message:e instanceof Error?e.message:String(e)})}finally{c.current.delete(r),s(e=>e===r?null:e)}}}return(0,Y.jsxs)(`div`,{className:`code-canvas-main`,children:[(0,Y.jsx)(Tn,{controller:e},r),(e.transport!==`connected`||e.selectedId!==null&&!e.synced)&&(0,Y.jsxs)(`section`,{className:`code-transport-status is-${e.transport}`,role:`status`,children:[e.transport===`reconnecting`?`Live updates reconnecting. History may be out of date.`:e.transport===`disconnected`?`Live updates disconnected. History may be out of date.`:`Updating conversation…`,(0,Y.jsx)(`button`,{type:`button`,onClick:()=>E(e.refresh),children:`Refresh`})]}),S&&(0,Y.jsxs)(`section`,{className:`code-recovery-strip`,role:`alert`,children:[(0,Y.jsx)(`p`,{children:S}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>E(e.refresh),children:`Refresh session`}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>{e.clearError(),a(null)},children:`Dismiss`})]}),e.creationUnknown&&(0,Y.jsxs)(`section`,{className:`code-recovery-strip`,"aria-label":`Unconfirmed session creation`,children:[(0,Y.jsx)(`strong`,{children:`Session creation not confirmed`}),(0,Y.jsx)(`p`,{children:`The original session may still exist.`}),(0,Y.jsx)(`p`,{children:`Your draft and choices are kept. Press Send when you are ready to create another session.`}),(0,Y.jsx)(`button`,{type:`button`,onClick:e.startAnotherSession,children:`Start another session`})]}),_&&(0,Y.jsxs)(`section`,{className:`code-recovery-strip`,"aria-label":e.resendRequired?e.resendReason===`rolled-back`?`Send rolled back`:`Send not started`:`Unconfirmed send`,children:[(0,Y.jsx)(`strong`,{children:e.resendRequired?U(e.resendReason??void 0).heading:`Send outcome not confirmed`}),(0,Y.jsx)(`p`,{children:e.resendRequired?U(e.resendReason??void 0).detail:`Retry uses the original request. It may submit it if the server has not already accepted it.`}),(0,Y.jsx)(`pre`,{className:`code-retry-preview`,"aria-label":`Original prompt`,children:e.retryText}),(0,Y.jsx)(`button`,{type:`button`,disabled:!e.canRetrySameSend||o===r,onClick:()=>void D(),children:o===r?e.resendRequired?`Sending as a new message…`:`Retrying original send…`:e.resendRequired?`Send as a new message`:`Retry same send`})]}),p?(0,Y.jsxs)(`section`,{className:`code-recovery-strip`,children:[(0,Y.jsx)(`span`,{children:`Archived · Read-only history`}),(0,Y.jsx)(`button`,{type:`button`,disabled:!e.synced||e.pending,onClick:()=>{let t=e.selectedId;t&&E(()=>e.archive(t,!1))},children:`Restore session`})]}):e.session&&(e.session.status===`failed`||e.session.status===`suspended`)&&(0,Y.jsxs)(`section`,{className:`code-recovery-strip`,role:`status`,children:[(0,Y.jsx)(`p`,{children:e.session.error?.message??`Native session suspended.`}),b?(0,Y.jsx)(`button`,{type:`button`,onClick:()=>E(e.resume),children:`Resume session`}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{children:e.session.resume.reason??`Resume is not currently available.`}),(0,Y.jsx)(`button`,{type:`button`,onClick:e.newSession,children:`New session`})]})]}),(0,Y.jsx)(wn,{toasts:l,onDismiss:f}),e.selectedId===null&&e.items.length===0?(0,Y.jsx)(zt,{controller:e}):(0,Y.jsx)(vn,{items:e.items,provider:e.session?.provider??e.selection.provider,sessionKey:r,workingDir:e.session?.cwd??e.selection.cwd,loading:e.loading,hasOlderHistory:e.hasOlderHistory,loadOlderHistory:e.loadOlderHistory,permissionCount:e.permissions.length,onOpenLocalFile:n,working:e.working,rollbackRows:C,onRollback:t=>E(()=>e.rollbackSession(t))}),(0,Y.jsx)(Vt,{permissions:e.permissions,operations:e.permissionOperations,session:e.session,synced:e.synced,onAnswer:e.answer}),(0,Y.jsxs)(`div`,{className:`code-composer-dock`,children:[T!==void 0&&!h&&!p&&(0,Y.jsxs)(`div`,{className:`code-input-recovery`,children:[(0,Y.jsx)(`button`,{type:`button`,disabled:!!e.input||_,title:e.input?`Keep or clear your current draft before restoring the submitted prompt`:void 0,onClick:()=>e.setInput(T),children:`Restore submitted prompt`}),(0,Y.jsx)(`span`,{children:`Restores text for editing without sending.`})]}),(0,Y.jsxs)(`div`,{className:`code-composer-surface`,"aria-label":`Code composer controls`,children:[(0,Y.jsx)(Ot,{inputText:e.input,canSend:v,busy:h,canStop:y,stopping:m,pending:e.pending,followUp:e.followUp,followUpSent:e.followUpSent,steering:e.steering,readOnly:p,autoFocus:e.selectedId===null,onInputChange:e.setInput,onSubmit:e.send,onStop:e.stop,...e.operation.kind===`rolling-back`?{pendingLabel:`Rolling back conversation…`}:{}},`composer:${r}`),(0,Y.jsx)(Ft,{controller:e,onNotice:d},`footer:${r}`)]})]})]})}function Dn({port:e,workingDir:t,onWorkingDirChange:n,onOpenLocalFile:r,newSessionShortcut:i}){let a=Qe({port:e,workingDir:t}),[o,s]=(0,x.useState)(null),c=(0,x.useRef)({port:e,id:a.selectedId,cwd:a.selection.cwd});(0,x.useEffect)(()=>{s(document.getElementById(`code-session-sidebar-host`))},[]),(0,x.useEffect)(()=>{let t=c.current,r={port:e,id:a.selectedId,cwd:a.selection.cwd};c.current=r,t.port===e&&t.id===null&&r.id===null&&t.cwd!==r.cwd&&n?.(r.cwd||null)},[e,a.selectedId,a.selection.cwd,n]);let l=(0,Y.jsx)(vt,{controller:a,newSessionShortcut:i},e),u=(0,Y.jsx)(En,{controller:a,endpointKey:String(e),onOpenLocalFile:r},e);return o?(0,Y.jsxs)(Y.Fragment,{children:[(0,S.createPortal)((0,Y.jsx)(`div`,{className:`code-manager-session-navigator-content`,children:l}),o),(0,Y.jsx)(`div`,{className:`code-canvas code-canvas-workbench`,children:u})]}):(0,Y.jsxs)(`div`,{className:`code-canvas`,children:[(0,Y.jsx)(`div`,{className:`code-canvas-sidebar`,children:l}),u]})}export{Dn as CodeCanvas};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{n as r,s as i,t as a,u as o}from"./page-shell-DfinU3mb.js";import{a as s,s as c}from"./fields-CicOWY-X.js";var l=e(t(),1),u=n();function d(){return{async get(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return await t.json()},async patch(e,t){let n=await fetch(e,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PATCH ${e} → ${n.status}`);return await n.json()}}}var f=[`meta.label`,`meta.group`,`meta.favorite`,`meta.hidden`,`meta.notes`];function p(e,t){let n=e?.registry?.instances?.[String(t)];return{label:n?.label??null,favorite:n?.favorite===!0,group:n?.group??null,hidden:n?.hidden===!0,notes:n?.notes??null}}function m(e){return{label:e.label||``,group:e.group||``,favorite:e.favorite,hidden:e.hidden,notes:e.notes||``}}function h(){return(0,u.jsx)(`p`,{className:`settings-empty`,role:`status`,children:`Select an instance to edit its dashboard metadata.`})}function g(e){return e.port?(0,u.jsx)(_,{...e}):(0,u.jsx)(h,{})}function _({port:e,client:t,dirty:n,registerSave:h,managerClient:g}){let{state:_,refresh:v,setData:y}=o(t,`__dashboard_meta_unused__`,[e]),[b,x]=(0,l.useState)(null),[S,C]=(0,l.useState)(null),[w,T]=(0,l.useState)({label:``,group:``,favorite:!1,hidden:!1,notes:``}),E=g||d();(0,l.useEffect)(()=>{let t=!1;return C(null),E.get(`/api/dashboard/registry`).then(n=>{t||(x(n),T(m(p(n,e))))}).catch(e=>{t||C(e instanceof Error?e.message:String(e))}),()=>{t=!0}},[e]),(0,l.useEffect)(()=>()=>{for(let e of f)n.remove(e)},[n]);let D=p(b,e),O=(0,l.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,l.useCallback)(async()=>{let t=w.label.trim()||null,r=w.group.trim()||null,i=w.notes.trim()||null,a={instances:{[String(e)]:{label:t,group:r,favorite:w.favorite,hidden:w.hidden,notes:i}}},o=await E.patch(`/api/dashboard/registry`,a);x(o),T(m(p(o,e)));for(let e of f)n.remove(e)},[w,E,n,e]);return(0,l.useEffect)(()=>{if(h)return h(k),()=>h(null)},[h,k]),S?(0,u.jsx)(a,{message:S}):b?(0,u.jsx)(`form`,{className:`settings-page-form settings-form`,onSubmit:e=>{e.preventDefault(),k()},children:(0,u.jsxs)(i,{title:`Dashboard meta`,hint:`Manager-side metadata for this instance. Stored in the dashboard registry.`,children:[(0,u.jsx)(c,{id:`dashmeta-label`,label:`Label`,value:w.label,placeholder:`(unset — falls back to home folder name)`,onChange:e=>{T({...w,label:e}),O(`meta.label`,{value:e,original:D.label||``,valid:!0})}}),(0,u.jsx)(c,{id:`dashmeta-group`,label:`Group`,value:w.group,placeholder:`e.g. work, personal`,onChange:e=>{T({...w,group:e}),O(`meta.group`,{value:e,original:D.group||``,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-favorite`,label:`Pin favorite`,value:w.favorite,onChange:e=>{T({...w,favorite:e}),O(`meta.favorite`,{value:e,original:D.favorite,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-hidden`,label:`Hide by default`,description:`Hide from the default instance list.`,value:w.hidden,onChange:e=>{T({...w,hidden:e}),O(`meta.hidden`,{value:e,original:D.hidden,valid:!0})}}),(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`dashmeta-notes`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Notes`}),(0,u.jsx)(`textarea`,{id:`dashmeta-notes`,rows:4,value:w.notes,placeholder:`Free-form notes only the dashboard remembers.`,onChange:e=>{let t=e.target.value;T({...w,notes:t}),O(`meta.notes`,{value:t,original:D.notes||``,valid:!0})}})]})]})}):(0,u.jsx)(r,{label:`Loading dashboard registry…`})}var v={readInstance:p,toDraft:m,META_KEYS:f};export{v as __test__,g as default};
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{T as r}from"./api-B9RiiOMM.js";import{t as i}from"./desktop-bridge-DbRfkg8l.js";import{i as a}from"./PanelLayoutProvider-DRZ4QkBC.js";var o=e(t(),1),s=`/api/dashboard/design`,c=class extends Error{constructor(e){super(`design store unavailable (${e})`),this.name=`DesignApiUnavailableError`}};async function l(e,t){let n=await fetch(`${s}${e}`,t);if(n.status===404||n.status===501)throw new c(n.status);let r=await n.json().catch(()=>null);if(!n.ok||r===null)throw Error(r?.error??`design api failed: ${n.status}`);return r}async function u(e){return(await l(`/pages${e?`?project=${encodeURIComponent(e)}`:``}`)).pages??[]}async function d(e){let t=await l(`/pages`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.page)throw Error(`create failed`);return t.page}async function f(e){let t=await l(`/pages/${encodeURIComponent(e)}/local-paths`);if(!t.paths)throw Error(`paths unavailable`);return t.paths}async function p(e,t){return l(`/pages/${encodeURIComponent(e)}/export`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t?{target:t}:{})})}async function m(e,t=`manual`){let n=await l(`/pages/${encodeURIComponent(e)}/snapshots`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({label:t})});if(!n.snapshot)throw Error(`snapshot failed`);return n.snapshot}async function h(){return(await l(`/version`)).version??0}function g(e,t){let n=typeof t==`number`?`?rev=${t}`:``;return`${s}/pages/${encodeURIComponent(e)}/preview${n}`}var _=n();function v(e){return(0,_.jsxs)(`select`,{className:`design-page-selector`,"aria-label":`Design pages (${e.pages.length})`,title:`${e.pages.length} pages`,disabled:e.disabled||e.pages.length===0,value:e.selectedPageId??``,onChange:t=>e.onSelect(t.target.value||null),children:[e.pages.length===0&&(0,_.jsx)(`option`,{value:``,children:`No pages`}),e.pages.map(e=>(0,_.jsx)(`option`,{value:e.id,children:e.title},e.id))]})}function y(e){if(!e.previewUrl)return(0,_.jsx)(`div`,{className:`design-viewport design-viewport-empty`,children:(0,_.jsx)(`span`,{children:e.emptyMessage})});let t=e.zoom>0?e.zoom:1;return(0,_.jsx)(`div`,{className:`design-viewport`,children:(0,_.jsx)(`iframe`,{className:`design-viewport-frame`,title:`Design preview`,src:e.previewUrl,sandbox:``,style:t===1?void 0:{transform:`scale(${t})`,transformOrigin:`0 0`,width:`${100/t}%`,height:`${100/t}%`}})})}var b=[.5,.75,1,1.25,1.5];function x(e){let{dispatch:t}=a(),n=e.tab.id,s=e.tab.design??{},l=s.zoom&&s.zoom>0?s.zoom:1,[x,S]=(0,o.useState)({kind:`loading`}),[C,w]=(0,o.useState)(null),[T,E]=(0,o.useState)(!1),[D,O]=(0,o.useState)(``);(0,o.useEffect)(()=>{(s.projectKey===void 0||s.projectKey===null)&&t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{projectKey:e.primaryProjectDir}})},[]);let k=s.projectKey??e.primaryProjectDir??null,A=(0,o.useCallback)(async()=>{S({kind:`loading`});try{let e=await u(k);S({kind:`ready`,pages:e})}catch(e){e instanceof c?S({kind:`unavailable`}):S({kind:`error`,message:e.message})}},[k]);(0,o.useEffect)(()=>{A()},[A]),(0,o.useEffect)(()=>{let e=!1,t=-1,n=window.setInterval(()=>{h().then(n=>{e||(t!==-1&&n!==t&&A(),t=n)}).catch(()=>{})},3e3);return()=>{e=!0,window.clearInterval(n)}},[A]);let j=(0,o.useCallback)(()=>{let e=D.trim();e&&(w(`Creating page...`),d({title:e,projectKey:k}).then(e=>(E(!1),O(``),w(`Created ${e.title}`),t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{pageId:e.id}}),A())).catch(e=>w(e.message)))},[t,D,k,A,n]),M=x.kind===`ready`?x.pages:[],N=M.find(e=>e.id===s.pageId)??M[0]??null;(0,o.useEffect)(()=>{let e=N?.id??null;x.kind===`ready`&&e!==(s.pageId??null)&&t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{pageId:e}})},[s.pageId,t,N?.id,x.kind,n]),(0,o.useEffect)(()=>{N&&t({type:`SET_RIGHT_SIDEBAR_TAB_META`,tabId:n,patch:{specificName:N.title,sourceLabel:N.id}})},[t,N,n]);let P=(0,o.useCallback)(e=>{t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{pageId:e}})},[t,n]),F=(0,o.useCallback)(()=>{if(N){if(e.selectedInstancePort==null){w(`Select an instance before running a design generation.`);return}w(`Queueing design run...`),m(N.id,`before`).then(()=>f(N.id)).then(t=>r(e.selectedInstancePort,[`Design run request`,``,`Page: ${N.title} (${N.id})`,`Page directory (your ONLY write target for this run): ${t.pageDir}`,`Artifact: ${t.artifactPath}`,`Brief: ${t.promptPath} — read it first; it holds the page requirements.`,``,"Update artifact.html in place (direct file write or `jaw design files ... write --stdin`).",`Write allowlist inside the page directory: artifact.html, prompt.md, page.json, assets/*.`,`Preview is CSP-locked (script-src 'none'): produce STATIC self-contained HTML/CSS — no <script>, no external CDN references; inline styles/SVG only.`,`A before-snapshot was already taken; restore points live under the page snapshots/ directory.`,`Do not write anywhere else; the user reviews the result live in the Manager Design tab.`,`If the design skill is active, follow its "Design run request" agent contract.`].join(`
2
+ `))).then(t=>{w(t.ok?`Design run queued on instance ${e.selectedInstancePort}.`:`Run enqueue failed (${t.status}).`)}).catch(e=>w(e.message))}},[e.selectedInstancePort,N]),I=(0,o.useCallback)(()=>{N&&e.onOpenInBrowser&&e.onOpenInBrowser(`${window.location.origin}${g(N.id,N.revision)}`)},[e,N]),L=(0,o.useCallback)(()=>{N&&f(N.id).then(e=>i()?.folder?.revealPath?.(e.pageDir)).catch(e=>w(e.message))},[N]),R=(0,o.useCallback)(()=>{N&&(w(`Exporting...`),p(N.id).then(e=>{w(`Exported to ${e.exportedTo}`),t({type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:`diff`})}).catch(e=>w(e.message)))},[t,N]),z=(0,o.useCallback)(()=>{let e=b[(b.indexOf(l)+1)%b.length]??1;t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{zoom:e}})},[t,n,l]),B=N?g(N.id,N.revision):null,V=x.kind===`loading`?`Loading design pages...`:x.kind===`unavailable`?`Design store unavailable — update and restart the manager server (Phase 2 backend).`:x.kind===`error`?`Design store error: ${x.message}`:"No design pages yet. Create one with `jaw design create` or an agent run.";return(0,_.jsxs)(`div`,{className:`design-panel`,children:[(0,_.jsxs)(`div`,{className:`design-toolbar`,children:[(0,_.jsxs)(`div`,{className:`design-toolbar-group`,children:[(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Reveal page directory`,"aria-label":`Reveal page directory`,disabled:!N,onClick:L,children:`Reveal`}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Export to project`,"aria-label":`Export to project`,disabled:!N,onClick:R,children:`Export`}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Reload from disk`,"aria-label":`Reload from disk`,onClick:()=>void A(),children:`Reload`})]}),(0,_.jsx)(v,{pages:M,selectedPageId:N?.id??null,disabled:x.kind!==`ready`,onSelect:P}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`New design page`,"aria-label":`New design page`,disabled:x.kind!==`ready`,onClick:()=>E(e=>!e),children:`+`}),(0,_.jsxs)(`div`,{className:`design-toolbar-group`,children:[(0,_.jsxs)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Cycle zoom`,"aria-label":`Zoom ${Math.round(l*100)}%`,onClick:z,children:[Math.round(l*100),`%`]}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Run: queue a design generation on the selected instance`,"aria-label":`Run design generation`,disabled:!N,onClick:F,children:`Run`}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,title:`Open preview in a Browser tab`,"aria-label":`Open in Browser`,disabled:!N||!e.onOpenInBrowser,onClick:I,children:`Browser`})]})]}),T&&(0,_.jsxs)(`div`,{className:`design-create-row`,children:[(0,_.jsx)(`input`,{className:`design-create-input`,type:`text`,value:D,placeholder:`New page title...`,"aria-label":`New page title`,onChange:e=>O(e.target.value),onKeyDown:e=>{e.key===`Enter`&&j(),e.key===`Escape`&&E(!1)}}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,disabled:!D.trim(),onClick:j,children:`Create`}),(0,_.jsx)(`button`,{type:`button`,className:`design-toolbar-btn`,onClick:()=>E(!1),children:`Cancel`})]}),C&&(0,_.jsxs)(`div`,{className:`design-status`,role:`status`,children:[(0,_.jsx)(`span`,{className:`design-status-text`,children:C}),(0,_.jsx)(`button`,{type:`button`,className:`design-status-dismiss`,"aria-label":`Dismiss`,onClick:()=>w(null),children:`×`})]}),(0,_.jsx)(y,{previewUrl:B,zoom:l,emptyMessage:V})]})}export{x as DesignPanel};
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-NZYk81nU.js";import{s as t}from"./shared-CiNP20HB.js";var n=e(),r={ko:{title:`개발 도구`,description:`Diff 패널이 선택된 인스턴스의 repo root와 기본 비교 방식을 고르는 기준입니다.`,rootPolicy:[`Repo root 우선순위`,`Diff panel`,`선택된 인스턴스에서 어떤 경로를 먼저 git repo로 볼지 정합니다.`],diffMode:[`기본 diff 모드`,`Diff panel`,`처음 열 때 사용할 비교 범위입니다.`],baseRef:[`기본 base ref`,`Base ref 모드`,`origin/master, main, HEAD 같은 기준 ref입니다.`],untracked:[`Untracked 포함`,`Diff summary`,`아직 git에 추가되지 않은 파일도 목록에 표시합니다.`]},en:{title:`Developer tools`,description:`Defaults used by the Diff panel when it resolves a repo root from the selected instance.`,rootPolicy:[`Repo root priority`,`Diff panel`,`Choose which selected-instance path is tried first as a git repository.`],diffMode:[`Default diff mode`,`Diff panel`,`Comparison scope used when the panel opens.`],baseRef:[`Default base ref`,`Base ref mode`,`Reference used for base comparisons, such as origin/master, main, or HEAD.`],untracked:[`Include untracked`,`Diff summary`,`Show files that are not yet tracked by git.`]},zh:{title:`开发工具`,description:`Diff 面板从已选实例解析 repo root 与默认比较方式时使用的设置。`,rootPolicy:[`Repo root 优先级`,`Diff panel`,`决定优先把已选实例中的哪个路径当作 git repo。`],diffMode:[`默认 diff 模式`,`Diff panel`,`面板打开时使用的比较范围。`],baseRef:[`默认 base ref`,`Base ref 模式`,`例如 origin/master、main 或 HEAD。`],untracked:[`包含 untracked`,`Diff summary`,`显示尚未被 git 跟踪的文件。`]},ja:{title:`開発ツール`,description:`Diff パネルが選択中インスタンスから repo root と比較方式を決めるときの既定値です。`,rootPolicy:[`Repo root の優先順位`,`Diff panel`,`選択中インスタンスのどのパスを先に git repo として扱うかを決めます。`],diffMode:[`既定の diff モード`,`Diff panel`,`パネルを開いたときの比較範囲です。`],baseRef:[`既定の base ref`,`Base ref モード`,`origin/master、main、HEAD などの基準 ref です。`],untracked:[`Untracked を含める`,`Diff summary`,`git で未追跡のファイルも一覧に表示します。`]}},i=[{value:`project-first`,label:`Project dirs first`},{value:`working-dir-first`,label:`Working dir first`},{value:`manual`,label:`Pinned root first`}],a=[{value:`unstaged`,label:`Unstaged`},{value:`staged`,label:`Staged`},{value:`head`,label:`HEAD`},{value:`base`,label:`Base ref`}];function o(e,t,r){return(0,n.jsxs)(`div`,{className:`dashboard-settings-row`,children:[(0,n.jsxs)(`div`,{className:`dashboard-settings-row-main`,children:[(0,n.jsxs)(`label`,{className:`dashboard-settings-row-heading`,htmlFor:e,children:[(0,n.jsx)(`span`,{children:t[0]}),(0,n.jsx)(`span`,{className:`dashboard-settings-row-scope`,children:t[1]})]}),(0,n.jsx)(`p`,{className:`dashboard-settings-row-description`,children:t[2]})]}),(0,n.jsx)(`div`,{className:`dashboard-settings-row-control`,children:r})]})}function s(e){let t=r[e.locale]||r.ko;return(0,n.jsxs)(`section`,{className:`dashboard-settings-section`,children:[(0,n.jsxs)(`header`,{children:[(0,n.jsx)(`h3`,{children:t.title}),(0,n.jsx)(`p`,{children:t.description})]}),(0,n.jsxs)(`div`,{className:`dashboard-settings-field-list`,children:[o(`dashboard-diff-root-policy`,t.rootPolicy,(0,n.jsx)(`select`,{id:`dashboard-diff-root-policy`,className:`dashboard-settings-select`,value:e.ui.diffRootPolicy,onChange:t=>e.onUiPatch({diffRootPolicy:t.currentTarget.value}),children:i.map(e=>(0,n.jsx)(`option`,{value:e.value,children:e.label},e.value))})),o(`dashboard-diff-default-mode`,t.diffMode,(0,n.jsx)(`select`,{id:`dashboard-diff-default-mode`,className:`dashboard-settings-select`,value:e.ui.diffDefaultMode,onChange:t=>e.onUiPatch({diffDefaultMode:t.currentTarget.value}),children:a.map(e=>(0,n.jsx)(`option`,{value:e.value,children:e.label},e.value))})),o(`dashboard-diff-base-ref`,t.baseRef,(0,n.jsx)(`input`,{id:`dashboard-diff-base-ref`,className:`dashboard-settings-shortcut-input`,type:`text`,value:e.ui.diffBaseRef,onChange:t=>e.onUiPatch({diffBaseRef:t.currentTarget.value})})),o(`dashboard-diff-include-untracked`,t.untracked,(0,n.jsx)(`input`,{id:`dashboard-diff-include-untracked`,className:`dashboard-settings-toggle`,type:`checkbox`,checked:e.ui.diffIncludeUntracked,onChange:t=>e.onUiPatch({diffIncludeUntracked:t.currentTarget.checked})}))]})]})}function c({manager:e}){return e?(0,n.jsx)(s,{locale:t(e.ui.locale),ui:e.ui,onUiPatch:e.onUiPatch}):null}export{c as default};
1
+ import{t as e}from"./jsx-runtime-CkEUZM6i.js";import{s as t}from"./shared-D1begqvi.js";var n=e(),r={ko:{title:`개발 도구`,description:`Diff 패널이 선택된 인스턴스의 repo root와 기본 비교 방식을 고르는 기준입니다.`,rootPolicy:[`Repo root 우선순위`,`Diff panel`,`선택된 인스턴스에서 어떤 경로를 먼저 git repo로 볼지 정합니다.`],diffMode:[`기본 diff 모드`,`Diff panel`,`처음 열 때 사용할 비교 범위입니다.`],baseRef:[`기본 base ref`,`Base ref 모드`,`origin/master, main, HEAD 같은 기준 ref입니다.`],untracked:[`Untracked 포함`,`Diff summary`,`아직 git에 추가되지 않은 파일도 목록에 표시합니다.`]},en:{title:`Developer tools`,description:`Defaults used by the Diff panel when it resolves a repo root from the selected instance.`,rootPolicy:[`Repo root priority`,`Diff panel`,`Choose which selected-instance path is tried first as a git repository.`],diffMode:[`Default diff mode`,`Diff panel`,`Comparison scope used when the panel opens.`],baseRef:[`Default base ref`,`Base ref mode`,`Reference used for base comparisons, such as origin/master, main, or HEAD.`],untracked:[`Include untracked`,`Diff summary`,`Show files that are not yet tracked by git.`]},zh:{title:`开发工具`,description:`Diff 面板从已选实例解析 repo root 与默认比较方式时使用的设置。`,rootPolicy:[`Repo root 优先级`,`Diff panel`,`决定优先把已选实例中的哪个路径当作 git repo。`],diffMode:[`默认 diff 模式`,`Diff panel`,`面板打开时使用的比较范围。`],baseRef:[`默认 base ref`,`Base ref 模式`,`例如 origin/master、main 或 HEAD。`],untracked:[`包含 untracked`,`Diff summary`,`显示尚未被 git 跟踪的文件。`]},ja:{title:`開発ツール`,description:`Diff パネルが選択中インスタンスから repo root と比較方式を決めるときの既定値です。`,rootPolicy:[`Repo root の優先順位`,`Diff panel`,`選択中インスタンスのどのパスを先に git repo として扱うかを決めます。`],diffMode:[`既定の diff モード`,`Diff panel`,`パネルを開いたときの比較範囲です。`],baseRef:[`既定の base ref`,`Base ref モード`,`origin/master、main、HEAD などの基準 ref です。`],untracked:[`Untracked を含める`,`Diff summary`,`git で未追跡のファイルも一覧に表示します。`]}},i=[{value:`project-first`,label:`Project dirs first`},{value:`working-dir-first`,label:`Working dir first`},{value:`manual`,label:`Pinned root first`}],a=[{value:`unstaged`,label:`Unstaged`},{value:`staged`,label:`Staged`},{value:`head`,label:`HEAD`},{value:`base`,label:`Base ref`}];function o(e,t,r){return(0,n.jsxs)(`div`,{className:`dashboard-settings-row`,children:[(0,n.jsxs)(`div`,{className:`dashboard-settings-row-main`,children:[(0,n.jsxs)(`label`,{className:`dashboard-settings-row-heading`,htmlFor:e,children:[(0,n.jsx)(`span`,{children:t[0]}),(0,n.jsx)(`span`,{className:`dashboard-settings-row-scope`,children:t[1]})]}),(0,n.jsx)(`p`,{className:`dashboard-settings-row-description`,children:t[2]})]}),(0,n.jsx)(`div`,{className:`dashboard-settings-row-control`,children:r})]})}function s(e){let t=r[e.locale]||r.ko;return(0,n.jsxs)(`section`,{className:`dashboard-settings-section`,children:[(0,n.jsxs)(`header`,{children:[(0,n.jsx)(`h3`,{children:t.title}),(0,n.jsx)(`p`,{children:t.description})]}),(0,n.jsxs)(`div`,{className:`dashboard-settings-field-list`,children:[o(`dashboard-diff-root-policy`,t.rootPolicy,(0,n.jsx)(`select`,{id:`dashboard-diff-root-policy`,className:`dashboard-settings-select`,value:e.ui.diffRootPolicy,onChange:t=>e.onUiPatch({diffRootPolicy:t.currentTarget.value}),children:i.map(e=>(0,n.jsx)(`option`,{value:e.value,children:e.label},e.value))})),o(`dashboard-diff-default-mode`,t.diffMode,(0,n.jsx)(`select`,{id:`dashboard-diff-default-mode`,className:`dashboard-settings-select`,value:e.ui.diffDefaultMode,onChange:t=>e.onUiPatch({diffDefaultMode:t.currentTarget.value}),children:a.map(e=>(0,n.jsx)(`option`,{value:e.value,children:e.label},e.value))})),o(`dashboard-diff-base-ref`,t.baseRef,(0,n.jsx)(`input`,{id:`dashboard-diff-base-ref`,className:`dashboard-settings-shortcut-input`,type:`text`,value:e.ui.diffBaseRef,onChange:t=>e.onUiPatch({diffBaseRef:t.currentTarget.value})})),o(`dashboard-diff-include-untracked`,t.untracked,(0,n.jsx)(`input`,{id:`dashboard-diff-include-untracked`,className:`dashboard-settings-toggle`,type:`checkbox`,checked:e.ui.diffIncludeUntracked,onChange:t=>e.onUiPatch({diffIncludeUntracked:t.currentTarget.checked})}))]})]})}function c({manager:e}){return e?(0,n.jsx)(s,{locale:t(e.ui.locale),ui:e.ui,onUiPatch:e.onUiPatch}):null}export{c as default};
@@ -1,3 +1,3 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{t as r}from"./desktop-bridge-DbRfkg8l.js";var i=e(t(),1);async function a(e,t){let n=await e();return n.ok?n:t()}function o(e,t){return e?{getRepoRoot:n=>a(()=>e.getRepoRoot(n),()=>t.getRepoRoot(n)),getRepoCandidates:n=>a(()=>e.getRepoCandidates(n),()=>t.getRepoCandidates(n)),getScmSnapshot:(n,r)=>a(()=>e.getScmSnapshot(n,r),()=>t.getScmSnapshot(n,r)),runScmOperation:(n,r)=>a(()=>e.runScmOperation(n,r),()=>t.runScmOperation(n,r)),getDiffSummary:(n,r)=>a(()=>e.getDiffSummary(n,r),()=>t.getDiffSummary(n,r)),getFileDiff:(n,r,i)=>a(()=>e.getFileDiff(n,r,i),()=>t.getFileDiff(n,r,i))}:t}async function s(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>null);return!n.ok||!r?{ok:!1,error:r?.error??`request failed: ${n.status}`}:r}function c(e,t){return{selectedInstancePort:e?.port??null,settings:{diffRootPolicy:t.diffRootPolicy,diffPinnedRootByPort:t.diffPinnedRootByPort,diffRecentRepoRoots:t.diffRecentRepoRoots}}}function l(e,t){return{getRepoRoot:async()=>({ok:!1,error:`Repository root resolution is server-derived in web mode`}),getRepoCandidates:async n=>s(`/api/dashboard/git/repo-candidates`,c(e,t)),getScmSnapshot:async(n,r)=>s(`/api/dashboard/git/scm-snapshot`,{...c(e,t),repoRoot:n,options:r}),runScmOperation:async(n,r)=>s(`/api/dashboard/git/scm-operation`,{...c(e,t),repoRoot:n,operation:r}),getDiffSummary:async(n,r)=>s(`/api/dashboard/git/diff-summary`,{...c(e,t),repoRoot:n,options:r}),getFileDiff:async(n,r,i)=>s(`/api/dashboard/git/file-diff`,{...c(e,t),repoRoot:n,filePath:r,options:i})}}function u(e,t,n){let r=n.path.trim();r&&!t.has(r)&&(t.add(r),e.push({...n,path:r}))}function d(e,t,n){let r=[],i=new Set,a=e?.port==null?null:String(e.port),o=a?n.diffPinnedRootByPort[a]:null,s=e?.projectDirs?.filter(Boolean)??[],c=e?.workingDir??null;n.diffRootPolicy===`manual`&&o&&u(r,i,{path:o,label:`Pinned root`,source:`pinned`});let l=s.map((e,t)=>({path:e,label:t===0?`Project root`:`Project root ${t+1}`,source:`project`})),d=c?[{path:c,label:`Working dir`,source:`working-dir`}]:[],f=n.diffRootPolicy===`working-dir-first`?[...d,...l]:[...l,...d];for(let e of f)u(r,i,e);return n.diffRootPolicy!==`manual`&&o&&u(r,i,{path:o,label:`Pinned root`,source:`pinned`}),n.diffRecentRepoRoots.forEach((e,t)=>{u(r,i,{path:e,label:t===0?`Recent repo`:`Recent repo ${t+1}`,source:`recent`})}),t&&u(r,i,{path:t,label:`Home fallback`,source:`home`}),r}var f=n(),p=[`unstaged`,`staged`,`head`,`base`],m=8;function h(e){return e.startsWith(`@@`)?`diff-line-hunk`:e.startsWith(`diff `)||e.startsWith(`index `)||e.startsWith(`--- `)||e.startsWith(`+++ `)?`diff-line-meta`:e.startsWith(`+`)?`diff-line-add`:e.startsWith(`-`)?`diff-line-del`:``}function g(e){return e?e.split(`
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{t as r}from"./desktop-bridge-DbRfkg8l.js";var i=e(t(),1);async function a(e,t){let n=await e();return n.ok?n:t()}function o(e,t){return e?{getRepoRoot:n=>a(()=>e.getRepoRoot(n),()=>t.getRepoRoot(n)),getRepoCandidates:n=>a(()=>e.getRepoCandidates(n),()=>t.getRepoCandidates(n)),getScmSnapshot:(n,r)=>a(()=>e.getScmSnapshot(n,r),()=>t.getScmSnapshot(n,r)),runScmOperation:(n,r)=>a(()=>e.runScmOperation(n,r),()=>t.runScmOperation(n,r)),getDiffSummary:(n,r)=>a(()=>e.getDiffSummary(n,r),()=>t.getDiffSummary(n,r)),getFileDiff:(n,r,i)=>a(()=>e.getFileDiff(n,r,i),()=>t.getFileDiff(n,r,i))}:t}async function s(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>null);return!n.ok||!r?{ok:!1,error:r?.error??`request failed: ${n.status}`}:r}function c(e,t){return{selectedInstancePort:e?.port??null,settings:{diffRootPolicy:t.diffRootPolicy,diffPinnedRootByPort:t.diffPinnedRootByPort,diffRecentRepoRoots:t.diffRecentRepoRoots}}}function l(e,t){return{getRepoRoot:async()=>({ok:!1,error:`Repository root resolution is server-derived in web mode`}),getRepoCandidates:async n=>s(`/api/dashboard/git/repo-candidates`,c(e,t)),getScmSnapshot:async(n,r)=>s(`/api/dashboard/git/scm-snapshot`,{...c(e,t),repoRoot:n,options:r}),runScmOperation:async(n,r)=>s(`/api/dashboard/git/scm-operation`,{...c(e,t),repoRoot:n,operation:r}),getDiffSummary:async(n,r)=>s(`/api/dashboard/git/diff-summary`,{...c(e,t),repoRoot:n,options:r}),getFileDiff:async(n,r,i)=>s(`/api/dashboard/git/file-diff`,{...c(e,t),repoRoot:n,filePath:r,options:i})}}function u(e,t,n){let r=n.path.trim();r&&!t.has(r)&&(t.add(r),e.push({...n,path:r}))}function d(e,t,n){let r=[],i=new Set,a=e?.port==null?null:String(e.port),o=a?n.diffPinnedRootByPort[a]:null,s=e?.projectDirs?.filter(Boolean)??[],c=e?.workingDir??null;n.diffRootPolicy===`manual`&&o&&u(r,i,{path:o,label:`Pinned root`,source:`pinned`});let l=s.map((e,t)=>({path:e,label:t===0?`Project root`:`Project root ${t+1}`,source:`project`})),d=c?[{path:c,label:`Working dir`,source:`working-dir`}]:[],f=n.diffRootPolicy===`working-dir-first`?[...d,...l]:[...l,...d];for(let e of f)u(r,i,e);return n.diffRootPolicy!==`manual`&&o&&u(r,i,{path:o,label:`Pinned root`,source:`pinned`}),n.diffRecentRepoRoots.forEach((e,t)=>{u(r,i,{path:e,label:t===0?`Recent repo`:`Recent repo ${t+1}`,source:`recent`})}),t&&u(r,i,{path:t,label:`Home fallback`,source:`home`}),r}var f=n(),p=[`unstaged`,`staged`,`head`,`base`],m=8;function h(e){return e.startsWith(`@@`)?`diff-line-hunk`:e.startsWith(`diff `)||e.startsWith(`index `)||e.startsWith(`--- `)||e.startsWith(`+++ `)?`diff-line-meta`:e.startsWith(`+`)?`diff-line-add`:e.startsWith(`-`)?`diff-line-del`:``}function g(e){return e?e.split(`
2
2
  `).map((e,t)=>{let n=h(e);return(0,f.jsxs)(`span`,{className:`diff-line${n?` ${n}`:``}`,children:[e,`
3
3
  `]},t)}):null}function ee(){return r()?.diff??null}function _(e){let t={mode:e.diffDefaultMode,includeUntracked:e.diffIncludeUntracked};return e.diffDefaultMode===`base`&&(t.ref=e.diffBaseRef.trim()||`HEAD`),t}function v(e){let t=e.branch??e.head??`detached`;return`${e.label}: ${e.root} (${t}${e.dirty?`, dirty`:``})`}function y(e,t){return[t,...e.filter(e=>e!==t)].slice(0,m)}function b(e){return{path:e,label:`Picked repo`,source:`recent`}}function x(e){return{path:e,label:`Folder root`,source:`recent`}}function S(e){return e.replace(/\/+$/,``)}function C(e,t){let n=S(e),r=S(t);return n===r||n.startsWith(`${r}/`)}function w(e,t){return!e||!t?null:t.startsWith(`/`)?t:`${S(e)}/${t.replace(/^\/+/,``)}`}function T(e,t){if(!e||!t||!t.startsWith(`/`))return null;let n=S(e),r=S(t);return r===n||!r.startsWith(`${n}/`)?null:r.slice(n.length+1)}function E(e,t){if(t){let n=e.find(e=>C(t,e.root))?.root??null;if(n)return n}return e[0]?.root??null}function D(e,t){if(!e)return t.length>0?[{id:`changes`,label:`Changes`,files:t}]:[];let n=new Map(t.map(e=>[e.path,e]));return e.groups.map(e=>({id:e.id,label:`${e.label} (${e.files.length})`,...e.id===`staged`?{action:`unstage`}:e.id===`changes`||e.id===`untracked`?{action:`stage`}:{},files:e.files.map(e=>{let t=n.get(e.repoRelativePath);return{path:e.repoRelativePath,status:e.kind,insertions:t?.insertions??0,deletions:t?.deletions??0,conflict:e.conflict,staged:e.staged,unstaged:e.unstaged}})})).filter(e=>e.files.length>0)}function O(e){let t=e.repoRootPath??null,n=e.repoRootMode??`instance`,a=e.folderRootPath??null,s=e.onRepoRootChange,c=ee(),u=(0,i.useMemo)(()=>o(c,l(e.selectedInstance,e.settings)),[c,e.selectedInstance,e.settings]),[m,h]=(0,i.useState)([]),[S,C]=(0,i.useState)(null),[O,k]=(0,i.useState)([]),[A,j]=(0,i.useState)(null),[M,N]=(0,i.useState)(null),[P,F]=(0,i.useState)(``),[I,L]=(0,i.useState)(null),[R,z]=(0,i.useState)(null),[B,V]=(0,i.useState)(!1),H=`${e.selectedInstance?.port??`none`}:${e.selectedInstance?.workingDir??``}:${e.selectedInstance?.projectDirs?.join(`\0`)??``}`,U=(0,i.useMemo)(()=>_(e.settings),[e.settings.diffDefaultMode,e.settings.diffBaseRef,e.settings.diffIncludeUntracked]),W=m.find(e=>e.root===S)??null,G=(0,i.useCallback)(async()=>{if(!u)return;let i=r()?.getHomePath?.()||`/tmp`,o=d(e.selectedInstance,i,{diffRootPolicy:e.settings.diffRootPolicy,diffPinnedRootByPort:e.settings.diffPinnedRootByPort,diffRecentRepoRoots:e.settings.diffRecentRepoRoots});a&&o.unshift(x(a));let c=await u.getRepoCandidates(o);if(!c.ok){L(c.error??`Failed to resolve git repositories`);return}let l=c.candidates??[];h(l),C(e=>{let r=t&&l.some(e=>e.root===t)?t:null,i=e&&l.some(t=>t.root===e)?e:null,o=n===`manual`?r??i??l[0]?.root??null:r??E(l,a);return n!==`manual`&&o!==t&&s?.(o,`instance`),o}),l.length===0?(n!==`manual`&&s?.(null,`instance`),L(`No git repository found from the selected instance roots.`)):L(null)},[u,H,a,s,e.selectedInstance,e.settings.diffRootPolicy,e.settings.diffPinnedRootByPort,e.settings.diffRecentRepoRoots,t,n]);(0,i.useEffect)(()=>{if(t!==S){if(t&&m.some(e=>e.root===t)){C(t);return}t===null&&C(null)}},[t,m,S]);let K=(0,i.useCallback)(async()=>{if(!u||!S)return;let[t,n]=await Promise.all([u.getDiffSummary(S,U),u.getScmSnapshot(S,{includeUntracked:e.settings.diffIncludeUntracked})]);t.ok&&t.files?(k(t.files),N(e=>e&&t.files?.some(t=>t.path===e)?e:t.files?.[0]?.path??null),j(n.ok?n.snapshot??null:null),L(null)):(k([]),j(null),N(null),L(t.error??`Failed to get diff summary`))},[u,U,e.settings.diffIncludeUntracked,S]);(0,i.useEffect)(()=>{G()},[G]),(0,i.useEffect)(()=>{K()},[K]),(0,i.useEffect)(()=>{let t=T(S,e.selectedFilePath??null);t&&t!==M&&O.some(e=>e.path===t)&&N(t)},[O,S,e.selectedFilePath,M]),(0,i.useEffect)(()=>{if(!u||!S||!M){F(``);return}(async()=>{let e=await u.getFileDiff(S,M,U);e.ok&&e.diff!==void 0?F(e.diff||`No textual diff for this file.`):F(`Error: ${e.error??`unknown`}`)})()},[u,U,S,M]);function q(t,n,r=`manual`){C(t),N(null),s?.(t,r);let i=e.selectedInstance?.port,a={};i!=null&&(a.diffPinnedRootByPort={...e.settings.diffPinnedRootByPort,[String(i)]:t}),n&&(a.diffRecentRepoRoots=n),Object.keys(a).length>0&&e.onSettingsPatch?.(a)}function J(){let t=E(m,a);C(t),N(null),e.onFollowInstanceRepoRoot?.(t);let n=e.selectedInstance?.port;if(n==null)return;let r={...e.settings.diffPinnedRootByPort};delete r[String(n)],e.onSettingsPatch?.({diffPinnedRootByPort:r})}function Y(t){N(t);let n=w(S,t);n&&e.onPreviewFile?.(n)}function X(t){e.onSettingsPatch?.({diffDefaultMode:t})}let Z=(0,i.useMemo)(()=>D(A,O),[O,A]);async function Q(t){if(!u||!S)return;z(t.kind===`stage`?`Staging...`:`Unstaging...`);let n=await u.runScmOperation(S,t);if(!n.ok){z(n.error??`Git operation failed`);return}n.result?.snapshot&&j(n.result.snapshot),z(t.kind===`stage`?`Staged`:`Unstaged`),await K(),e.onGitRefresh?.()}function $(e){return e===`stage`?`Stage`:`Unstage`}async function te(){let t=r()?.folder;if(!t?.pickFolder){L(`Choose Repository is available in the Electron app.`);return}if(!u){L(`Diff bridge is unavailable.`);return}V(!0);try{let n=await t.pickFolder();if(!n.ok||!n.path){n.error&&n.error!==`cancelled`&&L(n.error);return}let r=await u.getRepoCandidates([b(n.path)]);if(!r.ok){L(r.error??`Failed to validate selected repository`);return}let i=r.candidates?.[0]??null;if(!i){L(`Selected folder is not a git repository.`);return}let a=y(e.settings.diffRecentRepoRoots,i.root);h(e=>e.some(e=>e.root===i.root)?e.map(e=>e.root===i.root?i:e):[i,...e]),L(null),q(i.root,a,`manual`)}finally{V(!1)}}return(0,f.jsxs)(`div`,{className:`diff-panel`,children:[(0,f.jsxs)(`div`,{className:`diff-toolbar`,children:[(0,f.jsxs)(`select`,{className:`diff-root-select`,value:S??``,"aria-label":`Git repository root`,onChange:e=>q(e.currentTarget.value,void 0,`manual`),children:[m.map(e=>(0,f.jsx)(`option`,{value:e.root,children:v(e)},e.root)),m.length===0&&(0,f.jsx)(`option`,{value:``,children:`No repo`})]}),(0,f.jsx)(`span`,{className:`diff-head-chip`,children:W?.branch??W?.head??`no repo`}),(0,f.jsx)(`button`,{type:`button`,className:`diff-pick-repo`,onClick:()=>void te(),disabled:B,children:B?`Choosing...`:`Choose Repository`}),(0,f.jsx)(`button`,{type:`button`,className:`diff-follow-instance`,onClick:J,disabled:n!==`manual`,children:`Follow Instance`}),(0,f.jsx)(`button`,{type:`button`,className:`diff-refresh`,onClick:()=>void G(),children:`Refresh`})]}),(0,f.jsxs)(`div`,{className:`diff-toolbar diff-options`,children:[(0,f.jsx)(`div`,{className:`diff-mode-group`,"aria-label":`Diff mode`,children:p.map(t=>(0,f.jsx)(`button`,{type:`button`,className:`diff-mode-button${e.settings.diffDefaultMode===t?` is-active`:``}`,"aria-pressed":e.settings.diffDefaultMode===t,onClick:()=>X(t),children:t===`head`?`HEAD`:t===`base`?`Base`:t},t))}),(0,f.jsx)(`input`,{className:`diff-ref-input`,type:`text`,value:e.settings.diffBaseRef,"aria-label":`Base ref`,disabled:e.settings.diffDefaultMode!==`base`,onChange:t=>e.onSettingsPatch?.({diffBaseRef:t.currentTarget.value})}),(0,f.jsxs)(`label`,{className:`diff-untracked-toggle`,children:[(0,f.jsx)(`input`,{type:`checkbox`,checked:e.settings.diffIncludeUntracked,onChange:t=>e.onSettingsPatch?.({diffIncludeUntracked:t.currentTarget.checked})}),(0,f.jsx)(`span`,{children:`untracked`})]})]}),I&&(0,f.jsx)(`div`,{className:`diff-error`,children:I}),R&&(0,f.jsx)(`div`,{className:`diff-action-status`,role:`status`,"aria-live":`polite`,children:R}),(0,f.jsxs)(`div`,{className:`diff-body`,children:[(0,f.jsxs)(`div`,{className:`diff-file-list`,children:[Z.map(e=>(0,f.jsxs)(`div`,{className:`diff-file-group`,children:[(0,f.jsxs)(`div`,{className:`diff-file-group-heading`,children:[(0,f.jsx)(`span`,{children:e.label}),e.action&&(0,f.jsxs)(`button`,{type:`button`,className:`diff-scm-action`,onClick:()=>void Q({kind:e.action,paths:e.files.map(e=>e.path)}),children:[$(e.action),` All`]})]}),e.files.map(t=>(0,f.jsxs)(`div`,{className:`diff-file-item ${t.path===M?`is-selected`:``} diff-status-${t.status}${t.conflict?` is-conflict`:``}`,children:[(0,f.jsxs)(`button`,{type:`button`,className:`diff-file-select`,onClick:()=>Y(t.path),children:[(0,f.jsx)(`span`,{className:`diff-file-name`,children:t.path}),(0,f.jsxs)(`span`,{className:`diff-file-stats`,children:[t.insertions>0&&(0,f.jsxs)(`span`,{className:`diff-ins`,children:[`+`,t.insertions]}),t.deletions>0&&(0,f.jsxs)(`span`,{className:`diff-del`,children:[`-`,t.deletions]}),t.status===`untracked`&&(0,f.jsx)(`span`,{className:`diff-ins`,children:`new`})]})]}),e.action&&(0,f.jsx)(`button`,{type:`button`,className:`diff-scm-inline-action`,onClick:()=>{Q({kind:e.action,paths:[t.path]})},"aria-label":`${$(e.action)} ${t.path}`,children:e.action===`stage`?`+`:`-`})]},`${e.id}:${t.path}`))]},e.id)),Z.length===0&&!I&&(0,f.jsx)(`div`,{className:`diff-empty`,children:`No changes`})]}),(0,f.jsx)(`div`,{className:`diff-content`,children:(0,f.jsx)(`pre`,{className:`diff-pre`,children:g(P)})})]})]})}export{O as DiffPanel};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{r as t,t as n}from"./presentation-DWHWElFr.js";import{n as r,t as i}from"./jsx-runtime-CkEUZM6i.js";import{n as a,o,r as s,s as c,t as l,u}from"./page-shell-DfinU3mb.js";import{t as d}from"./error-normalize-clOi-AAA.js";import{i as f,r as p}from"./fields-CicOWY-X.js";import{t as m}from"./path-utils-B6vBr0DD.js";var h=e(r(),1),g=i(),_=[{value:`jaw-default`,label:`Jaw default`},{value:`jaw-dark`,label:`Jaw dark`},{value:`jaw-light`,label:`Jaw light`},{value:`jaw-contrast`,label:`High contrast`}],v=[{value:`default`,label:`default`},{value:`vim`,label:`vim`},{value:`emacs`,label:`emacs`}],y=[{value:`summary`,label:`summary`},{value:`unified`,label:`unified`},{value:`side-by-side`,label:`side-by-side`}],b=[`presentation.mode`,`tui.themeSeed`,`tui.keymapPreset`,`tui.pasteCollapseLines`,`tui.pasteCollapseChars`,`tui.diffStyle`];function x({port:e,client:r,dirty:i,registerSave:x}){let{state:S,refresh:C,setData:w}=u(r,`/api/settings`,[e]),[T,E]=(0,h.useState)({}),D=(0,h.useSyncExternalStore)(i.subscribe,()=>i.pending.get(`presentation.mode`)?.value,()=>void 0),O=n(D)?D:t(S.kind===`ready`?S.data:void 0),[k,A]=(0,h.useState)(null),[j,M]=(0,h.useState)(!1),N=(0,h.useRef)(null),P=(0,h.useRef)(null);(0,h.useLayoutEffect)(()=>(N.current={client:r,port:e},P.current=null,M(!1),()=>{N.current=null,P.current=null}),[r,e,i]),(0,h.useEffect)(()=>{S.kind===`ready`&&E({...S.data.tui||{}})},[S]),(0,h.useEffect)(()=>(E({}),A(null),()=>{for(let e of b)i.remove(e)}),[r,e,i]);let F=(0,h.useCallback)((e,t)=>i.set(e,t),[i]),I=(0,h.useCallback)(()=>{let t=N.current;if(!t||t.client!==r||t.port!==e)return Promise.resolve();if(P.current?.instance===t)return P.current.promise;A(null);let n=i.saveBundle();if(Object.keys(n).length===0)return Promise.resolve();let a=m(n),o=new Map([...i.pending].filter(([e])=>Object.hasOwn(n,e)));M(!0);let s={instance:t,promise:Promise.resolve()};return s.promise=Promise.resolve().then(async()=>{if(N.current!==t)return;let e=await r.put(`/api/settings`,a);if(N.current!==t)return;let n=e&&typeof e==`object`&&`data`in e?e.data:e;for(let[e,t]of o)i.pending.get(e)===t&&i.remove(e);E({...n.tui||{}}),w(n),await C()}).finally(()=>{P.current===s&&(P.current=null),N.current===t&&M(!1)}),P.current=s,s.promise},[r,e,i,C,w]);if((0,h.useEffect)(()=>{if(x)return x(I),()=>x(null)},[x,I]),S.kind===`loading`)return(0,g.jsx)(a,{});if(S.kind===`offline`)return(0,g.jsx)(s,{port:e});if(S.kind===`error`)return(0,g.jsx)(l,{message:S.message});let L=S.data.tui||{};return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault();let t=N.current;I().catch(e=>{t&&N.current===t&&A(d(e))})},children:[(0,g.jsxs)(c,{title:`Conversation display`,hint:`Changes conversation display only. Runtime and permissions stay unchanged.`,children:[k?(0,g.jsx)(o,{tone:`error`,role:`alert`,children:k}):null,(0,g.jsx)(f,{disabled:j,id:`display-presentation-mode`,label:`Presentation`,value:O,options:[{value:`activity`,label:`Activity (default)`},{value:`legacy`,label:`Legacy transcript`}],onChange:e=>{P.current||(e===`activity`||e===`legacy`)&&F(`presentation.mode`,{value:e,original:t(S.data),valid:!0})}})]}),(0,g.jsxs)(c,{title:`Display`,hint:`TUI options applied to /i/${e}.`,children:[(0,g.jsx)(f,{disabled:j,id:`display-themeSeed`,label:`Theme seed`,value:T.themeSeed??L.themeSeed??`jaw-default`,options:_,onChange:e=>{P.current||(E({...T,themeSeed:e}),F(`tui.themeSeed`,{value:e,original:L.themeSeed??`jaw-default`,valid:!0}))}}),(0,g.jsx)(f,{disabled:j,id:`display-keymapPreset`,label:`Keymap preset`,value:T.keymapPreset??L.keymapPreset??`default`,options:v,onChange:e=>{P.current||(E({...T,keymapPreset:e}),F(`tui.keymapPreset`,{value:e,original:L.keymapPreset??`default`,valid:!0}))}}),(0,g.jsx)(p,{disabled:j,id:`display-pasteCollapseLines`,label:`Paste collapse — lines`,value:T.pasteCollapseLines??L.pasteCollapseLines??2,min:0,step:1,onChange:e=>{P.current||(E({...T,pasteCollapseLines:e}),F(`tui.pasteCollapseLines`,{value:e,original:L.pasteCollapseLines??2,valid:Number.isFinite(e)&&e>=0}))}}),(0,g.jsx)(p,{disabled:j,id:`display-pasteCollapseChars`,label:`Paste collapse — chars`,value:T.pasteCollapseChars??L.pasteCollapseChars??160,min:0,step:10,onChange:e=>{P.current||(E({...T,pasteCollapseChars:e}),F(`tui.pasteCollapseChars`,{value:e,original:L.pasteCollapseChars??160,valid:Number.isFinite(e)&&e>=0}))}}),(0,g.jsx)(f,{disabled:j,id:`display-diffStyle`,label:`Diff style`,value:T.diffStyle??L.diffStyle??`summary`,options:y,onChange:e=>{P.current||(E({...T,diffStyle:e}),F(`tui.diffStyle`,{value:e,original:L.diffStyle??`summary`,valid:!0}))}})]})]})}export{x as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-CkEUZM6i.js";import{i as t,n}from"./manager-shortcuts-Cqmr0mEq.js";import{s as r}from"./page-shell-DfinU3mb.js";import{a as i,c as a,i as o,n as s,r as c,s as l,t as u}from"./shared-D1begqvi.js";var d=e();function f({manager:e}){if(!e)return null;let f=e,p=l(f.ui.locale),m=u[p];function h(e,t){f.onUiPatch({dashboardShortcutKeymap:{...f.ui.dashboardShortcutKeymap,[e]:t}})}return(0,d.jsxs)(r,{title:m.displayTitle,hint:m.displayDescription,children:[(0,d.jsx)(c,{id:`dashboard-show-activity-title`,label:m.fields.activity.label,scope:m.fields.activity.scope,value:f.ui.showLatestActivityTitles,description:m.fields.activity.description,onChange:e=>f.onUiPatch({showLatestActivityTitles:e})}),(0,d.jsx)(c,{id:`dashboard-show-label-editor`,label:m.fields.rename.label,scope:m.fields.rename.scope,value:f.ui.showInlineLabelEditor,description:m.fields.rename.description,onChange:e=>f.onUiPatch({showInlineLabelEditor:e})}),(0,d.jsx)(c,{id:`dashboard-show-runtime-line`,label:m.fields.runtime.label,scope:m.fields.runtime.scope,value:f.ui.showSidebarRuntimeLine,description:m.fields.runtime.description,onChange:e=>f.onUiPatch({showSidebarRuntimeLine:e})}),(0,d.jsx)(c,{id:`dashboard-show-row-actions`,label:m.fields.actions.label,scope:m.fields.actions.scope,value:f.ui.showSelectedRowActions,description:m.fields.actions.description,onChange:e=>f.onUiPatch({showSelectedRowActions:e})}),(0,d.jsx)(s,{id:`dashboard-locale`,label:m.fields.language.label,scope:m.fields.language.scope,value:p,options:i,description:m.fields.language.description,onChange:e=>f.onUiPatch({locale:e})}),(0,d.jsx)(c,{id:`dashboard-shortcuts-enabled`,label:m.fields.shortcuts.label,scope:m.fields.shortcuts.scope,value:f.ui.dashboardShortcutsEnabled,description:m.fields.shortcuts.description,onChange:e=>f.onUiPatch({dashboardShortcutsEnabled:e})}),n.map(e=>{let n=m.fields[a(e)];return(0,d.jsx)(o,{action:e,label:n.label,scope:n.scope,value:f.ui.dashboardShortcutKeymap[e],description:`${n.description} Current: ${t(f.ui.dashboardShortcutKeymap[e])}`,onChange:h},e)})]})}export{f as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{c as r}from"./api-B9RiiOMM.js";import{t as i}from"./desktop-bridge-DbRfkg8l.js";import{t as a}from"./copy-text-WsUHYigB.js";import{n as o,t as s}from"./MarkdownRenderer-DzN66XVb.js";var c=e(t(),1),l=n(),u={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,py:`python`,rs:`rust`,go:`go`,java:`java`,cpp:`cpp`,c:`cpp`,css:`css`,html:`html`,htm:`html`,xml:`xml`,json:`json`,yaml:`yaml`,yml:`yaml`,sh:`bash`,bash:`bash`,sql:`sql`};function d(e){let t=e.split(`.`).pop()?.toLowerCase();return t?u[t]??null:null}function f(e){return/\.(md|mdx)$/i.test(e)}function p(e){return/\.html?$/i.test(e)}function m(){return i()?.folder??null}function h(e){return!e.startsWith(`/`)&&!/^[a-zA-Z]:[\\/]/.test(e)}function g(e){return e.split(/[\\/]/).pop()||e}function _(e){return[`<!doctype html>`,`<html>`,`<head>`,`<meta http-equiv="Content-Security-Policy" content="${[`default-src 'none'`,`img-src data: blob:`,`style-src 'unsafe-inline' data:`,`font-src data:`,`script-src 'none'`,`connect-src 'none'`,`object-src 'none'`,`base-uri 'none'`,`form-action 'none'`,`frame-src 'none'`].join(`; `)}">`,`<meta charset="utf-8">`,`<style>html,body{margin:0;min-height:100%;}body{font-family:system-ui,sans-serif;}</style>`,`</head>`,`<body>`,e,`</body>`,`</html>`].join(``)}function v(e){return(0,l.jsx)(`iframe`,{className:`doc-html-preview`,title:e.title,sandbox:``,referrerPolicy:`no-referrer`,srcDoc:_(e.content)})}function y(e){if(e.raw)return(0,l.jsx)(`pre`,{className:`doc-pre`,children:(0,l.jsx)(`code`,{children:e.content})});if(f(e.filePath))return(0,l.jsx)(`article`,{className:`notes-preview doc-markdown`,children:(0,l.jsx)(s,{markdown:e.content,onLocalFileOpen:e.onOpenLocalFile})});if(p(e.filePath))return(0,l.jsx)(v,{content:e.content,title:`Rendered preview of ${g(e.filePath)}`});let t=d(e.filePath);return t?(0,l.jsx)(o,{code:e.content,language:t}):(0,l.jsx)(`pre`,{className:`doc-pre`,children:(0,l.jsx)(`code`,{children:e.content})})}function b(e){let t=m(),n=(0,c.useRef)(null),i=(0,c.useRef)(null),o=(0,c.useRef)(void 0),s=(0,c.useRef)({filePath:``,scrollTop:0}),u=(0,c.useRef)(null),d=(0,c.useRef)(null),[f,p]=(0,c.useState)(``),[_,v]=(0,c.useState)(null),[b,x]=(0,c.useState)(!1),[S,C]=(0,c.useState)(!1),[w,T]=(0,c.useState)(!1),[E,D]=(0,c.useState)(null),O=(0,c.useCallback)(e=>{d.current!==null&&window.clearTimeout(d.current),D(e),d.current=window.setTimeout(()=>{d.current=null,D(t=>t===e?null:t)},1200)},[]),k=(0,c.useCallback)(()=>{let t=e.filePath;t&&a(t).then(e=>{e.ok?O(`path`):console.error(`[doc-panel:path-copy]`,e.error)})},[O,e.filePath]),A=(0,c.useCallback)(()=>{a(f).then(e=>{e.ok?O(`content`):console.error(`[doc-panel:content-copy]`,e.error)})},[f,O]),j=(0,c.useCallback)(e=>{u.current!==null&&cancelAnimationFrame(u.current);let t=s.current.filePath===e?s.current.scrollTop:0;u.current=requestAnimationFrame(()=>{u.current=null;let r=n.current;r&&s.current.filePath===e&&(r.scrollTop=t)})},[]);return(0,c.useEffect)(()=>{if(!e.filePath){p(``),v(null),C(!1),D(null),T(!1);return}let n=e.filePath,i=!1;return D(null),T(!1),(async()=>{if(t){let e=await t.readFile(n);if(!e.ok&&e.error?.includes(`path not allowed`)){if(await t.getDefaultRoot(),i)return;e=await t.readFile(n)}if(i)return;e.ok&&e.content!==void 0?(x(e.binary===!0),C(e.truncated===!0&&e.binary!==!0),p(e.binary||e.truncated?``:e.content),v(null)):v(e.error??`Failed to read file`);return}if(!h(n)){i||v(`Document preview for arbitrary local files requires Electron desktop app`);return}try{let e=await r(n);if(i)return;x(!1),C(!1),p(e.content),v(null)}catch(e){i||v(e.message)}})(),()=>{i=!0}},[t,e.filePath]),(0,c.useLayoutEffect)(()=>{let t=n.current,r=e.filePath;if(t&&r){if(o.current!==r){o.current=r,t.scrollTop=0,s.current={filePath:r,scrollTop:0};return}j(r)}},[f,e.filePath,j]),(0,c.useEffect)(()=>{let t=i.current,n=e.filePath;if(!t||!n)return;let r=new ResizeObserver(()=>{s.current.filePath===n&&j(n)});return r.observe(t),()=>{r.disconnect()}},[f,e.filePath,j]),(0,c.useEffect)(()=>()=>{u.current!==null&&(cancelAnimationFrame(u.current),u.current=null),d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),e.filePath?_?(0,l.jsx)(`div`,{className:`doc-panel doc-error`,children:_}):b?(0,l.jsx)(`div`,{className:`doc-panel doc-binary`,children:`Binary file — cannot preview`}):S?(0,l.jsx)(`div`,{className:`doc-panel doc-binary`,children:`File too large to preview (512KB cap) — open it in an editor instead.`}):(0,l.jsxs)(`div`,{className:`doc-panel`,children:[(0,l.jsxs)(`div`,{className:`doc-toolbar`,children:[(0,l.jsx)(`span`,{className:`doc-file-name`,title:e.filePath,children:g(e.filePath)}),(0,l.jsxs)(`div`,{className:`doc-toolbar-actions`,"aria-label":`Document actions`,children:[(0,l.jsx)(`button`,{type:`button`,className:`doc-toolbar-button ${w?`is-active`:``}`,"aria-pressed":w,title:`Show raw source`,onClick:()=>T(e=>!e),children:`Raw`}),(0,l.jsx)(`button`,{type:`button`,className:`doc-toolbar-button`,title:`Copy full path`,onClick:k,children:E===`path`?`Copied`:`Path`}),(0,l.jsx)(`button`,{type:`button`,className:`doc-toolbar-button`,title:`Copy file content`,onClick:A,children:E===`content`?`Copied`:`Copy`})]})]}),(0,l.jsx)(`div`,{className:`doc-content`,ref:n,onScroll:t=>{e.filePath&&(s.current={filePath:e.filePath,scrollTop:t.currentTarget.scrollTop})},children:(0,l.jsx)(`div`,{className:`doc-content-body`,ref:i,children:(0,l.jsx)(y,{filePath:e.filePath,content:f,raw:w,onOpenLocalFile:e.onOpenLocalFile})})})]}):(0,l.jsx)(`div`,{className:`doc-panel doc-empty`,children:`Open Folders and select a file to preview it here.`})}export{b as DocPanel};
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{s as r,t as i}from"./shared-CiNP20HB.js";var a=e(t(),1),o=n(),s=`/api/dashboard/memory`,c=[`provider`,`apikey`,`test`,`indexing`,`active`],l={provider:`Provider`,apikey:`API Key`,test:`Test connection`,indexing:`Indexing`,active:`Active`},u=[{value:``,label:`(select)`},{value:`openai`,label:`OpenAI`},{value:`gemini`,label:`Gemini`},{value:`voyage`,label:`Voyage AI`},{value:`vertex`,label:`Vertex AI`},{value:`local`,label:`Local (Ollama)`}],d=[{value:`hybrid`,label:`Hybrid (FTS5 + Embedding)`},{value:`embedding`,label:`Embedding only`},{value:`fts5`,label:`FTS5 only (no vectors)`}],f={openai:{model:`text-embedding-3-small`,dimensions:1536},gemini:{model:`gemini-embedding-001`,dimensions:768},voyage:{model:`voyage-3-lite`,dimensions:512},vertex:{model:`text-embedding-005`,dimensions:768},local:{model:`nomic-embed-text`,dimensions:768}};async function p(e,t){let n=await fetch(`${s}${e}`,{credentials:`same-origin`,headers:{"Content-Type":`application/json`},...t});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()}function m(e,t,n){return e?.provider?e.provider!==`local`&&!e.apiKey&&!e.apiKeyPresent?`apikey`:t?.state===`ACTIVE_HYBRID`||t?.state===`ACTIVE_EMBEDDING`?`active`:t?.state===`INDEXING`?`indexing`:n?!t?.active&&(t?.indexedChunks??0)<(t?.totalChunks??1)?`indexing`:`active`:`test`:`provider`}function h({current:e}){let t=c.indexOf(e);return(0,o.jsx)(`div`,{className:`embed-stepper`,role:`list`,children:c.map((e,n)=>{let r=n<t,i=n===t;return(0,o.jsxs)(`div`,{className:r?`embed-step is-done`:i?`embed-step is-active`:`embed-step`,role:`listitem`,"aria-current":i?`step`:void 0,children:[(0,o.jsx)(`span`,{className:`embed-step-badge`,children:r?`✓`:n+1}),(0,o.jsx)(`span`,{className:`embed-step-label`,children:l[e]})]},e)})})}function g(){let[e,t]=(0,a.useState)(null),[n,r]=(0,a.useState)(null),[i,c]=(0,a.useState)(null),[l,g]=(0,a.useState)(!0),[_,v]=(0,a.useState)(``),[y,b]=(0,a.useState)(``),[x,S]=(0,a.useState)(1536),[C,w]=(0,a.useState)(``),[T,E]=(0,a.useState)(`hybrid`),[D,O]=(0,a.useState)(``),[k,A]=(0,a.useState)(null),[j,M]=(0,a.useState)(``),[N,P]=(0,a.useState)(!1),[F,I]=(0,a.useState)(!1),[L,R]=(0,a.useState)({done:0,total:0}),[z,B]=(0,a.useState)(null),V=(0,a.useRef)(null),H=(0,a.useCallback)(async()=>{try{let[e,n,i]=await Promise.all([p(`/embed-config`),p(`/embed-state`),p(`/embed-estimate`)]);t(e.config),r(n.status);let{ok:a,...o}=i;c(o)}catch{B(`Failed to load embedding state`)}finally{g(!1)}},[]);(0,a.useEffect)(()=>{H()},[H]),(0,a.useEffect)(()=>{e&&(v(e.provider||``),b(e.model||f[e.provider||``]?.model||``),S(e.dimensions??f[e.provider||``]?.dimensions??1536),w(e.apiKey||``),E(e.searchMode||`hybrid`),O(e.baseUrl||``))},[e]);let U=m(e,n,k),W=(0,a.useCallback)(async e=>{P(!0),B(null);try{await p(`/embed-config`,{method:`POST`,body:JSON.stringify(e)}),await H()}catch(e){B(e instanceof Error?e.message:String(e))}finally{P(!1)}},[H]),G=(0,a.useCallback)(()=>{if(!_)return;A(null),M(``);let e={provider:_,model:y,dimensions:x,searchMode:T};D&&(e.baseUrl=D),W(e)},[_,y,x,T,D,W]),K=(0,a.useCallback)(()=>{W({apiKey:C})},[C,W]),q=(0,a.useCallback)(async()=>{A(null),M(`Testing...`),B(null);try{let e={provider:_,model:y,dimensions:x,test:!0};C.trim()&&(e.apiKey=C.trim());let t=await p(`/embed-config`,{method:`POST`,body:JSON.stringify(e)});t.testResult===`ok`?(A(!0),M(`Connection successful`)):(A(!1),M(t.testError||`Connection failed`))}catch(e){A(!1),M(e instanceof Error?e.message:String(e))}},[_,y,x,C]),J=(0,a.useCallback)(async()=>{I(!0),R({done:0,total:0}),B(null);let e=new AbortController;V.current=e;try{let t=await fetch(`${s}/reindex-stream`,{signal:e.signal,credentials:`same-origin`});if(!t.ok||!t.body)throw Error(`HTTP ${t.status}`);let n=t.body.getReader(),r=new TextDecoder,i=``;for(;;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{s as r,t as i}from"./shared-D1begqvi.js";var a=e(t(),1),o=n(),s=`/api/dashboard/memory`,c=[`provider`,`apikey`,`test`,`indexing`,`active`],l={provider:`Provider`,apikey:`API Key`,test:`Test connection`,indexing:`Indexing`,active:`Active`},u=[{value:``,label:`(select)`},{value:`openai`,label:`OpenAI`},{value:`gemini`,label:`Gemini`},{value:`voyage`,label:`Voyage AI`},{value:`vertex`,label:`Vertex AI`},{value:`local`,label:`Local (Ollama)`}],d=[{value:`hybrid`,label:`Hybrid (FTS5 + Embedding)`},{value:`embedding`,label:`Embedding only`},{value:`fts5`,label:`FTS5 only (no vectors)`}],f={openai:{model:`text-embedding-3-small`,dimensions:1536},gemini:{model:`gemini-embedding-001`,dimensions:768},voyage:{model:`voyage-3-lite`,dimensions:512},vertex:{model:`text-embedding-005`,dimensions:768},local:{model:`nomic-embed-text`,dimensions:768}};async function p(e,t){let n=await fetch(`${s}${e}`,{credentials:`same-origin`,headers:{"Content-Type":`application/json`},...t});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()}function m(e,t,n){return e?.provider?e.provider!==`local`&&!e.apiKey&&!e.apiKeyPresent?`apikey`:t?.state===`ACTIVE_HYBRID`||t?.state===`ACTIVE_EMBEDDING`?`active`:t?.state===`INDEXING`?`indexing`:n?!t?.active&&(t?.indexedChunks??0)<(t?.totalChunks??1)?`indexing`:`active`:`test`:`provider`}function h({current:e}){let t=c.indexOf(e);return(0,o.jsx)(`div`,{className:`embed-stepper`,role:`list`,children:c.map((e,n)=>{let r=n<t,i=n===t;return(0,o.jsxs)(`div`,{className:r?`embed-step is-done`:i?`embed-step is-active`:`embed-step`,role:`listitem`,"aria-current":i?`step`:void 0,children:[(0,o.jsx)(`span`,{className:`embed-step-badge`,children:r?`✓`:n+1}),(0,o.jsx)(`span`,{className:`embed-step-label`,children:l[e]})]},e)})})}function g(){let[e,t]=(0,a.useState)(null),[n,r]=(0,a.useState)(null),[i,c]=(0,a.useState)(null),[l,g]=(0,a.useState)(!0),[_,v]=(0,a.useState)(``),[y,b]=(0,a.useState)(``),[x,S]=(0,a.useState)(1536),[C,w]=(0,a.useState)(``),[T,E]=(0,a.useState)(`hybrid`),[D,O]=(0,a.useState)(``),[k,A]=(0,a.useState)(null),[j,M]=(0,a.useState)(``),[N,P]=(0,a.useState)(!1),[F,I]=(0,a.useState)(!1),[L,R]=(0,a.useState)({done:0,total:0}),[z,B]=(0,a.useState)(null),V=(0,a.useRef)(null),H=(0,a.useCallback)(async()=>{try{let[e,n,i]=await Promise.all([p(`/embed-config`),p(`/embed-state`),p(`/embed-estimate`)]);t(e.config),r(n.status);let{ok:a,...o}=i;c(o)}catch{B(`Failed to load embedding state`)}finally{g(!1)}},[]);(0,a.useEffect)(()=>{H()},[H]),(0,a.useEffect)(()=>{e&&(v(e.provider||``),b(e.model||f[e.provider||``]?.model||``),S(e.dimensions??f[e.provider||``]?.dimensions??1536),w(e.apiKey||``),E(e.searchMode||`hybrid`),O(e.baseUrl||``))},[e]);let U=m(e,n,k),W=(0,a.useCallback)(async e=>{P(!0),B(null);try{await p(`/embed-config`,{method:`POST`,body:JSON.stringify(e)}),await H()}catch(e){B(e instanceof Error?e.message:String(e))}finally{P(!1)}},[H]),G=(0,a.useCallback)(()=>{if(!_)return;A(null),M(``);let e={provider:_,model:y,dimensions:x,searchMode:T};D&&(e.baseUrl=D),W(e)},[_,y,x,T,D,W]),K=(0,a.useCallback)(()=>{W({apiKey:C})},[C,W]),q=(0,a.useCallback)(async()=>{A(null),M(`Testing...`),B(null);try{let e={provider:_,model:y,dimensions:x,test:!0};C.trim()&&(e.apiKey=C.trim());let t=await p(`/embed-config`,{method:`POST`,body:JSON.stringify(e)});t.testResult===`ok`?(A(!0),M(`Connection successful`)):(A(!1),M(t.testError||`Connection failed`))}catch(e){A(!1),M(e instanceof Error?e.message:String(e))}},[_,y,x,C]),J=(0,a.useCallback)(async()=>{I(!0),R({done:0,total:0}),B(null);let e=new AbortController;V.current=e;try{let t=await fetch(`${s}/reindex-stream`,{signal:e.signal,credentials:`same-origin`});if(!t.ok||!t.body)throw Error(`HTTP ${t.status}`);let n=t.body.getReader(),r=new TextDecoder,i=``;for(;;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
2
2
  `);i=a.pop()||``;for(let e of a)if(e.startsWith(`data: `))try{let t=JSON.parse(e.slice(6));if(t.complete){I(!1),await H();return}if(t.error){B(String(t.error)),I(!1);return}typeof t.done==`number`&&R({done:t.done,total:t.total||0})}catch{}}I(!1),await H()}catch(e){e.name!==`AbortError`&&B(e instanceof Error?e.message:String(e)),I(!1)}},[H]);if((0,a.useEffect)(()=>()=>V.current?.abort(),[]),l)return(0,o.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Loading...`});let Y=n?.state===`NEEDS_REINDEX`,X=n?.state===`ACTIVE_HYBRID`||n?.state===`ACTIVE_EMBEDDING`;return(0,o.jsxs)(`div`,{className:`dashboard-embed-section`,children:[(0,o.jsx)(h,{current:U}),(0,o.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,o.jsx)(`legend`,{children:`Provider`}),(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-provider`,children:`Provider`}),(0,o.jsx)(`select`,{id:`embed-provider`,value:_,onChange:e=>{let t=e.target.value;v(t),A(null);let n=f[t];n&&(b(n.model),S(n.dimensions))},children:u.map(e=>(0,o.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-search-mode`,children:`Search mode`}),(0,o.jsx)(`select`,{id:`embed-search-mode`,value:T,onChange:e=>E(e.target.value),children:d.map(e=>(0,o.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-model`,children:`Model`}),(0,o.jsx)(`input`,{id:`embed-model`,type:`text`,value:y,onChange:e=>b(e.target.value),placeholder:f[_]?.model||`model name`})]}),(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-dimensions`,children:`Dimensions`}),(0,o.jsx)(`input`,{id:`embed-dimensions`,type:`number`,min:64,max:4096,value:x,onChange:e=>S(Number(e.target.value)||1536)})]}),(_===`local`||_===`vertex`)&&(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-base-url`,children:_===`vertex`?`Project ID / Region`:`Base URL`}),(0,o.jsx)(`input`,{id:`embed-base-url`,type:`text`,value:D,onChange:e=>O(e.target.value),placeholder:_===`local`?`http://localhost:11434`:`project-id/us-central1`})]}),(0,o.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!_||N,onClick:G,children:N?`Saving...`:`Save provider`})]}),(0,o.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,o.jsx)(`legend`,{children:`API Key`}),_===`local`?(0,o.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Local provider uses Ollama — no API key needed.`}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,o.jsx)(`label`,{htmlFor:`embed-api-key`,children:`API Key`}),(0,o.jsx)(`input`,{id:`embed-api-key`,type:`password`,value:C,onChange:e=>w(e.target.value),placeholder:`sk-...`,disabled:!_})]}),(0,o.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!C||N,onClick:K,children:`Save key`})]})]}),(0,o.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,o.jsx)(`legend`,{children:`Connection test`}),(0,o.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!_||!C&&!e?.apiKeyPresent&&_!==`local`,onClick:()=>void q(),children:`Test connection`}),j&&(0,o.jsxs)(`p`,{className:k?`dashboard-embed-ok`:`dashboard-embed-err`,role:`status`,children:[k?`✓ `:`✗ `,j]})]}),(0,o.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,o.jsxs)(`legend`,{children:[`Indexing`,i&&(0,o.jsxs)(`small`,{children:[` — `,i.totalChunks,` chunks · ~`,i.batches,` batches · ~`,Math.ceil(i.estimatedSeconds),`s · $`,i.estimatedCost.toFixed(4)]})]}),F?(0,o.jsxs)(`div`,{className:`embed-progress`,children:[(0,o.jsx)(`div`,{className:`embed-progress-bar`,children:(0,o.jsx)(`div`,{className:`embed-progress-fill`,style:{width:L.total>0?`${Math.round(L.done/L.total*100)}%`:`0%`}})}),(0,o.jsxs)(`span`,{className:`dashboard-settings-row-description`,children:[L.done,`/`,L.total,` batches`]})]}):(0,o.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!k&&!X&&!Y,onClick:()=>void J(),children:Y?`Re-index (provider changed)`:X?`Re-index`:`Start indexing`})]}),(0,o.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,o.jsx)(`legend`,{children:`Status`}),n?(0,o.jsxs)(`dl`,{className:`embed-status-grid`,children:[(0,o.jsx)(`dt`,{children:`State`}),(0,o.jsx)(`dd`,{children:(0,o.jsx)(`code`,{children:n.state})}),(0,o.jsx)(`dt`,{children:`Mode`}),(0,o.jsx)(`dd`,{children:n.mode}),(0,o.jsx)(`dt`,{children:`Provider`}),(0,o.jsxs)(`dd`,{children:[n.provider||`-`,` / `,n.model||`-`]}),(0,o.jsx)(`dt`,{children:`Indexed`}),(0,o.jsxs)(`dd`,{children:[n.indexedChunks,` chunks`]}),(0,o.jsx)(`dt`,{children:`DB size`}),(0,o.jsx)(`dd`,{children:n.dbSizeBytes>0?`${(n.dbSizeBytes/1024/1024).toFixed(1)} MB`:`-`}),(0,o.jsx)(`dt`,{children:`Last sync`}),(0,o.jsx)(`dd`,{children:n.lastSyncAt||`never`}),(0,o.jsx)(`dt`,{children:`Fallback`}),(0,o.jsx)(`dd`,{children:n.fallback?`Yes (${n.reason})`:`No`})]}):(0,o.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`No state available`})]}),z&&(0,o.jsx)(`p`,{className:`dashboard-embed-err`,role:`alert`,children:z})]})}function _({manager:e}){if(!e)return null;let t=i[r(e.ui.locale)];return(0,o.jsxs)(`section`,{className:`dashboard-settings-section`,children:[(0,o.jsxs)(`header`,{children:[(0,o.jsx)(`h3`,{children:t.embeddingTitle}),(0,o.jsx)(`p`,{children:t.embeddingDescription})]}),(0,o.jsx)(g,{})]})}export{_ as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{o as r,s as i}from"./page-shell-DfinU3mb.js";var a=e(t(),1),o=n(),s=[`employees`],c=[`claude`,`codex`,`codex-app`,`copilot`,`cursor`,`kiro-code`,`gemini`,`grok`,`opencode`],l=0;function u(){return l+=1,`emp_${Date.now().toString(36)}_${l}`}function d(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`)try{return e.randomUUID()}catch{}return u()}function f(e=d()){return{id:e,name:``,cli:`claude`,role:``,prompt:``,active:!0}}function p(e){if(!Array.isArray(e))return[];let t=[],n=0;for(let r of e){if(typeof r==`string`){n+=1,t.push({...f(`emp_legacy_${n}`),name:r});continue}if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.name==`string`?e.name:``;if(!i&&!e.id)continue;n+=1;let a=typeof e.id==`string`&&e.id.trim()?e.id.trim():`emp_unknown_${n}`,o=typeof e.cli==`string`&&e.cli.trim()?e.cli.trim():`claude`,s=typeof e.role==`string`?e.role:``,c=typeof e.prompt==`string`?e.prompt:``,l=e.active!==!1;t.push({id:a,name:i,cli:o,role:s,prompt:c,active:l})}return t}function m(e){return e.name.trim()?e.cli.trim()?null:`CLI is required`:`Name is required`}function h(e){return e.some(e=>m(e)!==null)}function g(e){let t=new Map;for(let n of e){let e=n.name.trim().toLowerCase();e&&t.set(e,(t.get(e)??0)+1)}let n=new Set;for(let[e,r]of t)r>1&&n.add(e);return n}function _(e){return e.map(e=>{let t={id:e.id,name:e.name.trim(),cli:e.cli.trim()||`claude`,role:e.role.trim(),active:e.active};return e.prompt.trim()&&(t.prompt=e.prompt),t})}function v({registerSave:e}){return(0,a.useEffect)(()=>{if(e)return e(null),()=>e(null)},[e]),(0,o.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:(0,o.jsx)(i,{title:`Employees`,hint:`Runtime employees are now managed from the Agent page.`,children:(0,o.jsx)(r,{children:`Open Runtime / Agent to edit dispatchable employees, static employee model overrides, and database-backed employees in one place.`})})})}export{c as DEFAULT_CLI_OPTIONS,s as EMPLOYEE_KEYS,v as default,g as duplicateNameSet,m as employeeRowError,h as employeesHaveErrors,f as makeDefaultEmployee,d as newEmployeeId,p as normalizeEmployees,_ as toPersistShape};