cli-jaw 2.2.15 → 2.2.17

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 (425) hide show
  1. package/README.md +23 -2
  2. package/dist/bin/cli-jaw.js +39 -0
  3. package/dist/bin/cli-jaw.js.map +1 -1
  4. package/dist/bin/commands/_shared/dashboard-client.js +42 -0
  5. package/dist/bin/commands/_shared/dashboard-client.js.map +1 -0
  6. package/dist/bin/commands/_shared/search-format.js +40 -0
  7. package/dist/bin/commands/_shared/search-format.js.map +1 -0
  8. package/dist/bin/commands/chat-search.js +5 -3
  9. package/dist/bin/commands/chat-search.js.map +1 -1
  10. package/dist/bin/commands/dashboard-chat.js +14 -31
  11. package/dist/bin/commands/dashboard-chat.js.map +1 -1
  12. package/dist/bin/commands/dashboard-memory.js +12 -49
  13. package/dist/bin/commands/dashboard-memory.js.map +1 -1
  14. package/dist/bin/commands/doctor.js +56 -11
  15. package/dist/bin/commands/doctor.js.map +1 -1
  16. package/dist/bin/commands/init.js +31 -1
  17. package/dist/bin/commands/init.js.map +1 -1
  18. package/dist/bin/commands/memory.js +5 -1
  19. package/dist/bin/commands/memory.js.map +1 -1
  20. package/dist/bin/commands/provider.js +23 -0
  21. package/dist/bin/commands/provider.js.map +1 -1
  22. package/dist/bin/commands/slack.js +57 -3
  23. package/dist/bin/commands/slack.js.map +1 -1
  24. package/dist/bin/commands/tui/input-handler.js +1 -1
  25. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  26. package/dist/bin/commands/tui/slash-command-runner.js +4 -5
  27. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  28. package/dist/bin/postinstall.js +16 -18
  29. package/dist/bin/postinstall.js.map +1 -1
  30. package/dist/lib/media-kind.js +28 -0
  31. package/dist/lib/media-kind.js.map +1 -0
  32. package/dist/lib/upload.js +27 -10
  33. package/dist/lib/upload.js.map +1 -1
  34. package/dist/server.js +35 -51
  35. package/dist/server.js.map +1 -1
  36. package/dist/src/agent/args.js +34 -0
  37. package/dist/src/agent/args.js.map +1 -1
  38. package/dist/src/agent/codex-app-client.js +1016 -135
  39. package/dist/src/agent/codex-app-client.js.map +1 -1
  40. package/dist/src/agent/codex-app-events.js +72 -1
  41. package/dist/src/agent/codex-app-events.js.map +1 -1
  42. package/dist/src/agent/codex-host-pool.js +617 -0
  43. package/dist/src/agent/codex-host-pool.js.map +1 -0
  44. package/dist/src/agent/jwc-runtime.js +12 -4
  45. package/dist/src/agent/jwc-runtime.js.map +1 -1
  46. package/dist/src/agent/kiro-auth.js +10 -4
  47. package/dist/src/agent/kiro-auth.js.map +1 -1
  48. package/dist/src/agent/kiro-runtime.js +45 -8
  49. package/dist/src/agent/kiro-runtime.js.map +1 -1
  50. package/dist/src/agent/lifecycle-handler.js +75 -52
  51. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  52. package/dist/src/agent/memory-flush-controller.js +241 -33
  53. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  54. package/dist/src/agent/prompt-context.js +4 -0
  55. package/dist/src/agent/prompt-context.js.map +1 -1
  56. package/dist/src/agent/runtime-pool.js +64 -34
  57. package/dist/src/agent/runtime-pool.js.map +1 -1
  58. package/dist/src/agent/session-persistence.js +71 -15
  59. package/dist/src/agent/session-persistence.js.map +1 -1
  60. package/dist/src/agent/spawn/queue.js +319 -162
  61. package/dist/src/agent/spawn/queue.js.map +1 -1
  62. package/dist/src/agent/spawn.js +581 -268
  63. package/dist/src/agent/spawn.js.map +1 -1
  64. package/dist/src/bgtask/types.js +1 -1
  65. package/dist/src/bgtask/types.js.map +1 -1
  66. package/dist/src/browser/adaptive-fetch/safety.js +25 -0
  67. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  68. package/dist/src/browser/connection.js +2 -8
  69. package/dist/src/browser/connection.js.map +1 -1
  70. package/dist/src/cli/capability-probe-worker.js +172 -0
  71. package/dist/src/cli/capability-probe-worker.js.map +1 -0
  72. package/dist/src/cli/capability-probe.js +83 -0
  73. package/dist/src/cli/capability-probe.js.map +1 -0
  74. package/dist/src/cli/claude-models.js +2 -2
  75. package/dist/src/cli/claude-models.js.map +1 -1
  76. package/dist/src/cli/cli-status-worker.js +296 -0
  77. package/dist/src/cli/cli-status-worker.js.map +1 -0
  78. package/dist/src/cli/cli-status.js +81 -0
  79. package/dist/src/cli/cli-status.js.map +1 -0
  80. package/dist/src/cli/command-context.js +17 -5
  81. package/dist/src/cli/command-context.js.map +1 -1
  82. package/dist/src/cli/compact.js +56 -19
  83. package/dist/src/cli/compact.js.map +1 -1
  84. package/dist/src/cli/handlers-runtime.js +6 -4
  85. package/dist/src/cli/handlers-runtime.js.map +1 -1
  86. package/dist/src/cli/handlers.js +7 -2
  87. package/dist/src/cli/handlers.js.map +1 -1
  88. package/dist/src/cli/opencodex-models.js +5 -32
  89. package/dist/src/cli/opencodex-models.js.map +1 -1
  90. package/dist/src/cli/opencodex-runtime.js +82 -0
  91. package/dist/src/cli/opencodex-runtime.js.map +1 -0
  92. package/dist/src/cli/readiness.js +35 -18
  93. package/dist/src/cli/readiness.js.map +1 -1
  94. package/dist/src/cli/registry-live.js +8 -2
  95. package/dist/src/cli/registry-live.js.map +1 -1
  96. package/dist/src/cli/registry.js +1 -1
  97. package/dist/src/cli/registry.js.map +1 -1
  98. package/dist/src/core/browser-open-default.js +6 -4
  99. package/dist/src/core/browser-open-default.js.map +1 -1
  100. package/dist/src/core/browser-open.js +11 -15
  101. package/dist/src/core/browser-open.js.map +1 -1
  102. package/dist/src/core/bus.js +7 -1
  103. package/dist/src/core/bus.js.map +1 -1
  104. package/dist/src/core/chat-sessions.js +121 -12
  105. package/dist/src/core/chat-sessions.js.map +1 -1
  106. package/dist/src/core/cli-detect.js +148 -4
  107. package/dist/src/core/cli-detect.js.map +1 -1
  108. package/dist/src/core/codex-config.js +21 -0
  109. package/dist/src/core/codex-config.js.map +1 -1
  110. package/dist/src/core/compact.js +73 -21
  111. package/dist/src/core/compact.js.map +1 -1
  112. package/dist/src/core/config.js +449 -20
  113. package/dist/src/core/config.js.map +1 -1
  114. package/dist/src/core/db.js +225 -0
  115. package/dist/src/core/db.js.map +1 -1
  116. package/dist/src/core/event-bus.js +49 -4
  117. package/dist/src/core/event-bus.js.map +1 -1
  118. package/dist/src/core/event-scope.js +100 -0
  119. package/dist/src/core/event-scope.js.map +1 -0
  120. package/dist/src/core/install-integrity.js +176 -0
  121. package/dist/src/core/install-integrity.js.map +1 -0
  122. package/dist/src/core/main-session.js +64 -21
  123. package/dist/src/core/main-session.js.map +1 -1
  124. package/dist/src/core/message-summary.js +12 -2
  125. package/dist/src/core/message-summary.js.map +1 -1
  126. package/dist/src/core/platform-kind.js +139 -0
  127. package/dist/src/core/platform-kind.js.map +1 -0
  128. package/dist/src/core/rate-limit.js +156 -0
  129. package/dist/src/core/rate-limit.js.map +1 -0
  130. package/dist/src/core/runtime-settings.js +165 -17
  131. package/dist/src/core/runtime-settings.js.map +1 -1
  132. package/dist/src/core/session-context.js +7 -0
  133. package/dist/src/core/session-context.js.map +1 -0
  134. package/dist/src/core/session-ops.js +53 -9
  135. package/dist/src/core/session-ops.js.map +1 -1
  136. package/dist/src/core/settings-merge.js +105 -3
  137. package/dist/src/core/settings-merge.js.map +1 -1
  138. package/dist/src/core/settings-watch.js +29 -5
  139. package/dist/src/core/settings-watch.js.map +1 -1
  140. package/dist/src/core/widget-watcher.js +15 -2
  141. package/dist/src/core/widget-watcher.js.map +1 -1
  142. package/dist/src/discord/bot.js +5 -2
  143. package/dist/src/discord/bot.js.map +1 -1
  144. package/dist/src/discord/commands.js +4 -4
  145. package/dist/src/discord/commands.js.map +1 -1
  146. package/dist/src/goal/heartbeat.js +1 -1
  147. package/dist/src/goal/heartbeat.js.map +1 -1
  148. package/dist/src/goal/runtime.js +1 -1
  149. package/dist/src/goal/runtime.js.map +1 -1
  150. package/dist/src/goal-run/controller.js +2 -2
  151. package/dist/src/goal-run/controller.js.map +1 -1
  152. package/dist/src/manager/internal-fetch.js +15 -0
  153. package/dist/src/manager/internal-fetch.js.map +1 -0
  154. package/dist/src/manager/logs.js +2 -1
  155. package/dist/src/manager/logs.js.map +1 -1
  156. package/dist/src/manager/memory/chat-federation.js +104 -11
  157. package/dist/src/manager/memory/chat-federation.js.map +1 -1
  158. package/dist/src/manager/memory/federation.js +100 -0
  159. package/dist/src/manager/memory/federation.js.map +1 -1
  160. package/dist/src/manager/metadata.js +4 -1
  161. package/dist/src/manager/metadata.js.map +1 -1
  162. package/dist/src/manager/notes/assets.js +1 -1
  163. package/dist/src/manager/notes/assets.js.map +1 -1
  164. package/dist/src/manager/notes/frontmatter.js +5 -49
  165. package/dist/src/manager/notes/frontmatter.js.map +1 -1
  166. package/dist/src/manager/notes/link-resolver.js +2 -2
  167. package/dist/src/manager/notes/link-resolver.js.map +1 -1
  168. package/dist/src/manager/notes/remote-assets.js +1 -1
  169. package/dist/src/manager/notes/remote-assets.js.map +1 -1
  170. package/dist/src/manager/notes/routes.js +2 -2
  171. package/dist/src/manager/notes/routes.js.map +1 -1
  172. package/dist/src/manager/notes/store.js +2 -2
  173. package/dist/src/manager/notes/store.js.map +1 -1
  174. package/dist/src/manager/notes/trash.js +1 -1
  175. package/dist/src/manager/notes/trash.js.map +1 -1
  176. package/dist/src/manager/notes/vault-index.js +2 -2
  177. package/dist/src/manager/notes/vault-index.js.map +1 -1
  178. package/dist/src/manager/notes/wiki-links.js +1 -1
  179. package/dist/src/manager/notes/wiki-links.js.map +1 -1
  180. package/dist/src/manager/notes/wiki-routes.js +84 -0
  181. package/dist/src/manager/notes/wiki-routes.js.map +1 -0
  182. package/dist/src/manager/proxy.js +1 -0
  183. package/dist/src/manager/proxy.js.map +1 -1
  184. package/dist/src/manager/routes/dashboard-memory.js +24 -1
  185. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  186. package/dist/src/manager/routes/runtime-monitor.js +1 -1
  187. package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
  188. package/dist/src/manager/scan.js +5 -3
  189. package/dist/src/manager/scan.js.map +1 -1
  190. package/dist/src/manager/server.js +20 -6
  191. package/dist/src/manager/server.js.map +1 -1
  192. package/dist/src/manager/telegram-hub/hub-bot.js +4 -3
  193. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  194. package/dist/src/manager/worker-events.js +2 -1
  195. package/dist/src/manager/worker-events.js.map +1 -1
  196. package/dist/src/memory/heartbeat.js +6 -5
  197. package/dist/src/memory/heartbeat.js.map +1 -1
  198. package/dist/src/memory/indexing.js +162 -45
  199. package/dist/src/memory/indexing.js.map +1 -1
  200. package/dist/src/messaging/channel-validate.js +14 -1
  201. package/dist/src/messaging/channel-validate.js.map +1 -1
  202. package/dist/src/messaging/redact.js +2 -1
  203. package/dist/src/messaging/redact.js.map +1 -1
  204. package/dist/src/messaging/session-key.js +21 -2
  205. package/dist/src/messaging/session-key.js.map +1 -1
  206. package/dist/src/notes/constants.js.map +1 -0
  207. package/dist/src/notes/frontmatter.js +59 -0
  208. package/dist/src/notes/frontmatter.js.map +1 -0
  209. package/dist/src/notes/path-guards.js.map +1 -0
  210. package/dist/src/notes/search.js.map +1 -0
  211. package/dist/src/orchestrator/attestation.js +1 -1
  212. package/dist/src/orchestrator/attestation.js.map +1 -1
  213. package/dist/src/orchestrator/gateway.js +135 -31
  214. package/dist/src/orchestrator/gateway.js.map +1 -1
  215. package/dist/src/orchestrator/pipeline.js +53 -21
  216. package/dist/src/orchestrator/pipeline.js.map +1 -1
  217. package/dist/src/orchestrator/scope.js +36 -2
  218. package/dist/src/orchestrator/scope.js.map +1 -1
  219. package/dist/src/orchestrator/session-lanes.js +87 -0
  220. package/dist/src/orchestrator/session-lanes.js.map +1 -0
  221. package/dist/src/orchestrator/session-work.js +25 -0
  222. package/dist/src/orchestrator/session-work.js.map +1 -0
  223. package/dist/src/orchestrator/state-machine.js +1 -5
  224. package/dist/src/orchestrator/state-machine.js.map +1 -1
  225. package/dist/src/orchestrator/worker-registry.js +20 -10
  226. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  227. package/dist/src/prompt/builder.js +40 -2
  228. package/dist/src/prompt/builder.js.map +1 -1
  229. package/dist/src/prompt/templates/a1-system.md +8 -1
  230. package/dist/src/routes/agent-control.js +44 -8
  231. package/dist/src/routes/agent-control.js.map +1 -1
  232. package/dist/src/routes/chat-sessions.js +34 -6
  233. package/dist/src/routes/chat-sessions.js.map +1 -1
  234. package/dist/src/routes/command.js +63 -8
  235. package/dist/src/routes/command.js.map +1 -1
  236. package/dist/src/routes/events.js +11 -2
  237. package/dist/src/routes/events.js.map +1 -1
  238. package/dist/src/routes/link-preview.js +1 -27
  239. package/dist/src/routes/link-preview.js.map +1 -1
  240. package/dist/src/routes/messages.js +6 -5
  241. package/dist/src/routes/messages.js.map +1 -1
  242. package/dist/src/routes/messaging.js +45 -1
  243. package/dist/src/routes/messaging.js.map +1 -1
  244. package/dist/src/routes/orchestrate.js +53 -33
  245. package/dist/src/routes/orchestrate.js.map +1 -1
  246. package/dist/src/routes/search.js +84 -0
  247. package/dist/src/routes/search.js.map +1 -0
  248. package/dist/src/routes/session-request.js +29 -0
  249. package/dist/src/routes/session-request.js.map +1 -0
  250. package/dist/src/routes/settings.js +110 -3
  251. package/dist/src/routes/settings.js.map +1 -1
  252. package/dist/src/routes/static.js +30 -8
  253. package/dist/src/routes/static.js.map +1 -1
  254. package/dist/src/routes/system.js +1 -1
  255. package/dist/src/routes/system.js.map +1 -1
  256. package/dist/src/routes/wiki.js +122 -0
  257. package/dist/src/routes/wiki.js.map +1 -0
  258. package/dist/src/search/contract.js +2 -0
  259. package/dist/src/search/contract.js.map +1 -0
  260. package/dist/src/search/coordinator.js +153 -0
  261. package/dist/src/search/coordinator.js.map +1 -0
  262. package/dist/src/search/provider.js +40 -0
  263. package/dist/src/search/provider.js.map +1 -0
  264. package/dist/src/search/providers/chat.js +115 -0
  265. package/dist/src/search/providers/chat.js.map +1 -0
  266. package/dist/src/search/providers/memory.js +53 -0
  267. package/dist/src/search/providers/memory.js.map +1 -0
  268. package/dist/src/search/providers/wiki.js +80 -0
  269. package/dist/src/search/providers/wiki.js.map +1 -0
  270. package/dist/src/slack/api.js +10 -1
  271. package/dist/src/slack/api.js.map +1 -1
  272. package/dist/src/slack/attachment-recovery.js +42 -0
  273. package/dist/src/slack/attachment-recovery.js.map +1 -0
  274. package/dist/src/slack/bot.js +120 -41
  275. package/dist/src/slack/bot.js.map +1 -1
  276. package/dist/src/slack/commands.js +24 -8
  277. package/dist/src/slack/commands.js.map +1 -1
  278. package/dist/src/slack/events.js +12 -1
  279. package/dist/src/slack/events.js.map +1 -1
  280. package/dist/src/slack/history.js +108 -0
  281. package/dist/src/slack/history.js.map +1 -0
  282. package/dist/src/slack/inbound-file.js +242 -0
  283. package/dist/src/slack/inbound-file.js.map +1 -0
  284. package/dist/src/slack/inbound-url.js +39 -0
  285. package/dist/src/slack/inbound-url.js.map +1 -0
  286. package/dist/src/slack/ingress.js +140 -0
  287. package/dist/src/slack/ingress.js.map +1 -0
  288. package/dist/src/slack/manifest.js +3 -0
  289. package/dist/src/slack/manifest.js.map +1 -1
  290. package/dist/src/slack/socket.js +1 -1
  291. package/dist/src/slack/socket.js.map +1 -1
  292. package/dist/src/slack/thread-tracker.js +86 -0
  293. package/dist/src/slack/thread-tracker.js.map +1 -0
  294. package/dist/src/telegram/bot.js +21 -11
  295. package/dist/src/telegram/bot.js.map +1 -1
  296. package/dist/src/wiki/config.js +193 -0
  297. package/dist/src/wiki/config.js.map +1 -0
  298. package/dist/src/wiki/entities.js +61 -0
  299. package/dist/src/wiki/entities.js.map +1 -0
  300. package/dist/src/wiki/ontology.js +72 -0
  301. package/dist/src/wiki/ontology.js.map +1 -0
  302. package/dist/src/wiki/prompt.js +172 -0
  303. package/dist/src/wiki/prompt.js.map +1 -0
  304. package/dist/src/wiki/safe-traversal.js +198 -0
  305. package/dist/src/wiki/safe-traversal.js.map +1 -0
  306. package/dist/src/wiki/scaffold.js +77 -0
  307. package/dist/src/wiki/scaffold.js.map +1 -0
  308. package/package.json +6 -5
  309. package/public/css/session-hub.css +266 -0
  310. package/public/dist/assets/AdvancedExport-DYGcCAUq.js +1 -0
  311. package/public/dist/assets/Agent-CNNQ7KkJ.js +1 -0
  312. package/public/dist/assets/{DesignPanel-BGMPhZSx.js → DesignPanel-DcL369nB.js} +1 -1
  313. package/public/dist/assets/{DocPanel-Dz-J_l5M.js → DocPanel-K8A2pm_1.js} +1 -1
  314. package/public/dist/assets/{FolderPanel-DbPhzzvi.js → FolderPanel-CV52EzwG.js} +1 -1
  315. package/public/dist/assets/{MilkdownWysiwygEditor-Em7iC6y9.js → MilkdownWysiwygEditor-BKOCDI4Z.js} +1 -1
  316. package/public/dist/assets/api-B25zNNFJ.js +1 -0
  317. package/public/dist/assets/{app-DX4e6isX.css → app-DjgGeXhJ.css} +1 -1
  318. package/public/dist/assets/app-Dsgp4xpU.js +55 -0
  319. package/public/dist/assets/bgtask-badge-C6h5C-o4.js +1 -0
  320. package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-CpavV0Jc.js} +4 -4
  321. package/public/dist/assets/{employees-BnobWM_2.js → employees-BJyEgim7.js} +4 -4
  322. package/public/dist/assets/idb-cache-B5PX63p7.js +1 -0
  323. package/public/dist/assets/{idb-cache-BzzftUET.js → idb-cache-lOntwU3S.js} +1 -1
  324. package/public/dist/assets/{iframe-renderer-C5vRbbl9.js → iframe-renderer-B8k3AvTv.js} +12 -12
  325. package/public/dist/assets/iframe-renderer-BO_GgCTR.js +1 -0
  326. package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
  327. package/public/dist/assets/manager-kXYQyMhR.js +13 -0
  328. package/public/dist/assets/{memory-DF4kPwwC.js → memory-D2RbBVO-.js} +11 -11
  329. package/public/dist/assets/memory-amsvg4Ey.js +1 -0
  330. package/public/dist/assets/message-history-BGHZxvgV.js +1 -0
  331. package/public/dist/assets/message-history-Bw2E_b8L.js +1 -0
  332. package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
  333. package/public/dist/assets/render-BkGcpH7z.js +157 -0
  334. package/public/dist/assets/settings-B1FPORO2.js +56 -0
  335. package/public/dist/assets/settings-CMN-zN4Q.js +1 -0
  336. package/public/dist/assets/settings-core-B_OjGYVN.js +1 -0
  337. package/public/dist/assets/settings-core-CxRwqx86.js +144 -0
  338. package/public/dist/assets/sidebar-DW78DANx.js +49 -0
  339. package/public/dist/assets/skills-Dz-9Yrxr.js +1 -0
  340. package/public/dist/assets/{skills-IGquen_j.js → skills-lWi0ZFiV.js} +6 -6
  341. package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-DYOI6nKj.js} +1 -1
  342. package/public/dist/assets/slash-commands-xJFCdTTM.js +1 -0
  343. package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-DBX9xzmt.js} +1 -1
  344. package/public/dist/assets/{ui-Hx_mNoDf.js → ui-Bx7eqnXt.js} +1 -1
  345. package/public/dist/assets/ui-JOcrYeG-.js +1 -0
  346. package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
  347. package/public/dist/index.html +4 -4
  348. package/public/dist/manager/index.html +2 -2
  349. package/public/index.html +3 -2
  350. package/public/js/event-channel.ts +25 -0
  351. package/public/js/features/channel-onboarding-flow.ts +16 -1
  352. package/public/js/features/channel-onboarding.ts +20 -2
  353. package/public/js/features/chat-messages.ts +3 -1
  354. package/public/js/features/chat-search.ts +2 -1
  355. package/public/js/features/chat.ts +56 -18
  356. package/public/js/features/elicitation.ts +15 -0
  357. package/public/js/features/idb-cache.ts +34 -0
  358. package/public/js/features/message-history.ts +2 -1
  359. package/public/js/features/session-hub.ts +334 -0
  360. package/public/js/features/settings-cli-status-render.ts +1 -1
  361. package/public/js/features/settings-cli-status.ts +25 -11
  362. package/public/js/features/settings-core.ts +72 -3
  363. package/public/js/features/settings-types.ts +32 -0
  364. package/public/js/features/ui-status.ts +2 -1
  365. package/public/js/main.ts +20 -0
  366. package/public/js/render/compose-block.ts +7 -0
  367. package/public/js/ws.ts +22 -2
  368. package/public/locales/en.json +46 -4
  369. package/public/locales/ja.json +46 -4
  370. package/public/locales/ko.json +46 -4
  371. package/public/locales/zh.json +46 -4
  372. package/public/manager/src/App.tsx +1 -1
  373. package/public/manager/src/InstancePreview.tsx +5 -1
  374. package/public/manager/src/api.ts +2 -1
  375. package/public/manager/src/components/InstanceGroups.tsx +10 -0
  376. package/public/manager/src/components/InstanceListContent.tsx +24 -1
  377. package/public/manager/src/components/InstanceRow.tsx +33 -3
  378. package/public/manager/src/components/InstanceSessionList.tsx +132 -0
  379. package/public/manager/src/hooks/useActiveSessionDisclosure.ts +45 -0
  380. package/public/manager/src/lib/resilient-fetch.ts +93 -0
  381. package/public/manager/src/lib/session-store.ts +216 -0
  382. package/public/manager/src/manager-components.css +97 -0
  383. package/public/manager/src/settings/pages/AdvancedExport.tsx +12 -2
  384. package/public/manager/src/settings/pages/Agent.tsx +113 -1
  385. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
  386. package/scripts/bundle-sidecar.sh +50 -2
  387. package/scripts/burst-scenario.mjs +72 -0
  388. package/scripts/check-redaction-sinks.mjs +1 -0
  389. package/scripts/check-strict-baseline.mjs +1 -1
  390. package/scripts/ensure-native-modules.cjs +50 -3
  391. package/scripts/install-risk-gate.mjs +8 -0
  392. package/scripts/install-wsl.sh +27 -2
  393. package/scripts/install.ps1 +121 -0
  394. package/scripts/install.sh +28 -2
  395. package/scripts/postinstall-guard.cjs +44 -2
  396. package/scripts/release-gates.mjs +12 -0
  397. package/dist/src/manager/notes/constants.js.map +0 -1
  398. package/dist/src/manager/notes/path-guards.js.map +0 -1
  399. package/dist/src/manager/notes/search.js.map +0 -1
  400. package/public/dist/assets/AdvancedExport-DsDpqXoH.js +0 -1
  401. package/public/dist/assets/Agent-BjbZVZ9p.js +0 -1
  402. package/public/dist/assets/api-C9dOxby7.js +0 -1
  403. package/public/dist/assets/app-BzD_ZLvt.js +0 -55
  404. package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +0 -1
  405. package/public/dist/assets/idb-cache-ZH6lOebk.js +0 -1
  406. package/public/dist/assets/iframe-renderer-Df4KIVyx.js +0 -1
  407. package/public/dist/assets/manager-C4eNDNFt.css +0 -1
  408. package/public/dist/assets/manager-DaN201mN.js +0 -13
  409. package/public/dist/assets/memory-D-bULTHl.js +0 -1
  410. package/public/dist/assets/message-history-C4WOisGx.js +0 -1
  411. package/public/dist/assets/message-history-ZBoza6ew.js +0 -1
  412. package/public/dist/assets/pi-settings-CBUGDAuT.js +0 -1
  413. package/public/dist/assets/render-DYX6GRQ0.js +0 -122
  414. package/public/dist/assets/settings-DbJpGoaX.js +0 -55
  415. package/public/dist/assets/settings-SreihUje.js +0 -1
  416. package/public/dist/assets/settings-core-B1Y5Nb4Z.js +0 -1
  417. package/public/dist/assets/settings-core-DobZWIZ7.js +0 -140
  418. package/public/dist/assets/sidebar-Cp22g0Gv.js +0 -49
  419. package/public/dist/assets/skills-DwPIP08e.js +0 -1
  420. package/public/dist/assets/slash-commands-BBVfwcnW.js +0 -1
  421. package/public/dist/assets/ui-CAicpUZc.js +0 -1
  422. /package/dist/src/{manager/notes → notes}/constants.js +0 -0
  423. /package/dist/src/{manager/notes → notes}/path-guards.js +0 -0
  424. /package/dist/src/{manager/notes → notes}/search.js +0 -0
  425. /package/public/dist/assets/{pi-settings-Dh5lgb87.js → pi-settings-DEuKgvIj.js} +0 -0
@@ -0,0 +1,266 @@
1
+ body.session-hub-mode {
2
+ display: block;
3
+ min-height: 100vh;
4
+ height: auto;
5
+ }
6
+
7
+ body.session-hub-mode > :not(#sessionHub):not(script) {
8
+ display: none !important;
9
+ }
10
+
11
+ .session-hub {
12
+ min-height: 100vh;
13
+ background: var(--bg);
14
+ color: var(--text);
15
+ padding: var(--space-8) var(--space-4);
16
+ }
17
+
18
+ .session-hub-shell {
19
+ width: min(960px, 100%);
20
+ margin: 0 auto;
21
+ }
22
+
23
+ .session-hub-header {
24
+ display: flex;
25
+ align-items: end;
26
+ justify-content: space-between;
27
+ gap: var(--space-6);
28
+ padding-bottom: var(--space-5);
29
+ border-bottom: 1px solid var(--border);
30
+ }
31
+
32
+ .session-hub-header h1 {
33
+ font: 600 var(--text-lg)/1.2 var(--font-display);
34
+ }
35
+
36
+ .session-hub-header > p {
37
+ max-width: 44ch;
38
+ color: var(--text-dim);
39
+ font-size: var(--text-sm);
40
+ text-wrap: balance;
41
+ }
42
+
43
+ .session-hub-kicker {
44
+ margin-bottom: var(--space-1);
45
+ color: var(--accent);
46
+ font: 600 var(--text-xs)/1 var(--font-display);
47
+ letter-spacing: .08em;
48
+ }
49
+
50
+ .session-grid {
51
+ display: grid;
52
+ gap: var(--space-2);
53
+ margin-top: var(--space-4);
54
+ }
55
+
56
+ .session-card-skeleton {
57
+ display: grid;
58
+ gap: var(--space-2);
59
+ padding: var(--space-4);
60
+ border: 1px solid var(--border);
61
+ border-radius: var(--radius-md);
62
+ background: var(--surface);
63
+ }
64
+
65
+ .session-card-skeleton span {
66
+ display: block;
67
+ width: 30%;
68
+ height: 10px;
69
+ border-radius: var(--radius-sm);
70
+ background: var(--border);
71
+ }
72
+
73
+ .session-card-skeleton span:nth-child(2) {
74
+ width: 55%;
75
+ height: 16px;
76
+ }
77
+
78
+ .session-card-skeleton span:nth-child(3) {
79
+ width: 42%;
80
+ }
81
+
82
+ .session-card {
83
+ position: relative;
84
+ display: grid;
85
+ grid-template-columns: minmax(0, 1fr) auto;
86
+ align-items: center;
87
+ background: var(--surface);
88
+ border: 1px solid var(--border);
89
+ border-radius: var(--radius-md);
90
+ }
91
+
92
+ .session-card.is-active {
93
+ border-inline-start: 3px solid var(--accent);
94
+ }
95
+
96
+ .session-card-link {
97
+ min-width: 0;
98
+ padding: var(--space-3) var(--space-4);
99
+ color: inherit;
100
+ text-decoration: none;
101
+ }
102
+
103
+ .session-card-link:focus-visible,
104
+ .session-delete:focus-visible,
105
+ .session-hub-empty a:focus-visible,
106
+ .session-readonly-notice button:focus-visible {
107
+ outline: 2px solid var(--accent);
108
+ outline-offset: 2px;
109
+ }
110
+
111
+ .session-card-heading,
112
+ .session-card-meta,
113
+ .session-card-meta > div {
114
+ display: flex;
115
+ align-items: center;
116
+ }
117
+
118
+ .session-card-heading {
119
+ gap: var(--space-2);
120
+ margin-bottom: var(--space-1);
121
+ }
122
+
123
+ .session-seq {
124
+ color: var(--accent);
125
+ font: 600 var(--text-xs)/1 var(--font-mono);
126
+ }
127
+
128
+ .session-source {
129
+ padding: 2px var(--space-2);
130
+ border: 1px solid var(--border);
131
+ border-radius: var(--radius-full);
132
+ color: var(--text-dim);
133
+ font-size: var(--text-xs);
134
+ }
135
+
136
+ .session-card h2 {
137
+ overflow: hidden;
138
+ font: 500 var(--text-base)/1.3 var(--font-ui);
139
+ text-overflow: ellipsis;
140
+ white-space: nowrap;
141
+ }
142
+
143
+ .session-card-meta {
144
+ flex-wrap: wrap;
145
+ gap: var(--space-2) var(--space-5);
146
+ margin-top: var(--space-2);
147
+ color: var(--text-dim);
148
+ font-size: var(--text-xs);
149
+ }
150
+
151
+ .session-card-meta > div {
152
+ gap: var(--space-1);
153
+ }
154
+
155
+ .session-card-meta dt::after {
156
+ content: ':';
157
+ }
158
+
159
+ .session-card-meta dd {
160
+ color: var(--text);
161
+ }
162
+
163
+ .session-delete {
164
+ min-width: 44px;
165
+ min-height: 44px;
166
+ margin-inline-end: var(--space-3);
167
+ padding: var(--space-2) var(--space-3);
168
+ border: 1px solid color-mix(in oklch, var(--delete-color), transparent 55%);
169
+ border-radius: var(--radius-sm);
170
+ background: transparent;
171
+ color: var(--delete-color);
172
+ font: 500 var(--text-xs)/1 var(--font-ui);
173
+ cursor: pointer;
174
+ }
175
+
176
+ .session-delete:disabled {
177
+ opacity: .45;
178
+ cursor: not-allowed;
179
+ }
180
+
181
+ .session-hub-empty {
182
+ margin-top: var(--space-4);
183
+ padding: var(--space-4);
184
+ border: 1px solid var(--border);
185
+ border-radius: var(--radius-md);
186
+ background: var(--surface);
187
+ }
188
+
189
+ .session-hub-empty h2 {
190
+ font-size: var(--text-base);
191
+ }
192
+
193
+ .session-hub-empty p {
194
+ margin-top: var(--space-1);
195
+ color: var(--text-dim);
196
+ font-size: var(--text-sm);
197
+ }
198
+
199
+ .session-hub-empty a {
200
+ display: inline-block;
201
+ margin-top: var(--space-3);
202
+ color: var(--accent);
203
+ font-size: var(--text-sm);
204
+ }
205
+
206
+ .session-hub-error {
207
+ min-height: 1.4em;
208
+ margin-top: var(--space-3);
209
+ color: var(--error);
210
+ font-size: var(--text-sm);
211
+ }
212
+
213
+ .session-view-label {
214
+ margin-inline-start: var(--space-2);
215
+ color: var(--text-dim);
216
+ font-size: var(--text-xs);
217
+ }
218
+
219
+ .session-readonly-notice {
220
+ display: flex;
221
+ align-items: center;
222
+ justify-content: space-between;
223
+ gap: var(--space-3);
224
+ padding: var(--space-2) var(--space-3);
225
+ border-top: 1px solid var(--warning);
226
+ background: var(--warning-dim);
227
+ color: var(--text);
228
+ font-size: var(--text-sm);
229
+ }
230
+
231
+ .session-readonly-notice button {
232
+ flex: none;
233
+ min-height: 36px;
234
+ padding: var(--space-2) var(--space-3);
235
+ border: 1px solid var(--warning);
236
+ border-radius: var(--radius-sm);
237
+ background: var(--surface);
238
+ color: var(--text);
239
+ font: inherit;
240
+ cursor: pointer;
241
+ }
242
+
243
+ .elicitation-readonly-notice {
244
+ margin-top: var(--space-2);
245
+ color: var(--error);
246
+ font-size: var(--text-sm);
247
+ }
248
+
249
+ @media (max-width: 640px) {
250
+ .session-hub {
251
+ padding: var(--space-5) var(--space-3);
252
+ }
253
+
254
+ .session-hub-header {
255
+ display: block;
256
+ }
257
+
258
+ .session-hub-header > p {
259
+ margin-top: var(--space-2);
260
+ }
261
+
262
+ .session-readonly-notice {
263
+ align-items: stretch;
264
+ flex-direction: column;
265
+ }
266
+ }
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{t as r}from"./error-normalize-BzeO0SXE.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-LF7vVVfG.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:p(t)}}function p(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,...i}=e;return i}function m({port:e,client:t,triggerDownload:n}){let{state:m}=i(t,`/api/settings`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(``),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(!1),[C,w]=(0,l.useState)(null),T=n||d;(0,l.useEffect)(()=>{v(``),b(null),w(null)},[e]);let E=(0,l.useCallback)(()=>{m.kind===`ready`&&T(`cli-jaw-settings-${e}.json`,JSON.stringify(p(m.data),null,2))},[m,e,T]),D=(0,l.useCallback)(async()=>{let e=f(_);if(!e.ok){b(e.error),w(null);return}b(null),w(null),S(!0);try{await t.put(`/api/settings`,e.value),w(`Imported. Reload the page to refresh other tabs.`)}catch(e){b(r(e))}finally{S(!1)}},[t,_]);return m.kind===`loading`?(0,u.jsx)(o,{}):m.kind===`offline`?(0,u.jsx)(s,{port:e}):m.kind===`error`?(0,u.jsx)(c,{message:m.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:E,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)})]}),h?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:_,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>v(e.target.value),"aria-invalid":!!y}),y?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:y}):null,C?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:C}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void D(),disabled:x||_.trim()===``,children:x?`Importing…`:`Apply import`})]}):null]})]})}export{m as default,p as stripServerOwnedSettingsFields,f as validateImportPayload};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{t as r}from"./settings-client-CjbBShxm.js";import{t as i}from"./error-normalize-BzeO0SXE.js";import{a,i as o,n as s,r as c,t as l}from"./page-shell-LF7vVVfG.js";import{i as u,s as d}from"./fields-zkeByFQW.js";import{a as f,n as p,o as m}from"./Permissions-CnKt44dN.js";import{a as ee,c as h,i as g,l as _,n as v,o as y,r as b,s as x,t as te}from"./agent-meta-Y3DE6sxh.js";import{t as S}from"./path-utils-LsJeDCKF.js";var C=e(t(),1),w=n();function ne({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:i,modelOptions:a,effort:s,effortOptions:c,workingDir:l,workingDirError:f,cliMeta:p,onCliChange:m,onProviderChange:ee,onModelChange:h,onEffortChange:_,onWorkingDirChange:v}){let y=x(t),b=y.filter(e=>te.includes(e)).length;return(0,w.jsx)(o,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,w.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,w.jsx)(u,{id:`agent-cli`,label:`Active CLI`,value:e,options:y.map(e=>({value:e,label:g(e,p).label||e})),collapsedAfter:b,onChange:m}),r.length>0?(0,w.jsx)(u,{id:`agent-${e}-provider`,label:`Provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>ee?.(e)}):null,(0,w.jsx)(u,{id:`agent-model`,label:`Active model`,value:i,options:a.length>0?a:[{value:``,label:`(default)`}],onChange:h}),(0,w.jsx)(u,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...c.map(e=>({value:e,label:e}))],disabled:c.length===0,onChange:_}),(0,w.jsx)(d,{id:`agent-workingDir`,label:`Working directory`,value:l,error:f,placeholder:`/path/to/project`,onChange:v})]})})}var T=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function re({value:e,onChange:t}){let n=f(e),r=n.mode===`custom`?`custom`:`auto`,i=n.mode===`custom`?n.tokens:[],a=n.mode===`custom`?`${i.length} explicit token${i.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,w.jsxs)(o,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,w.jsx)(u,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:T,onChange:e=>{t(e===`auto`?`auto`:i.length>0&&p(i)?i:m(null))}}),(0,w.jsx)(`p`,{className:`settings-agent-note`,children:a})]})}function ie({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:i,cliMeta:a,loading:s,error:c,onFlushCliChange:l,onFlushModelChange:d}){let f=t||e,p=f?g(f,a).label||f:`active`;return(0,w.jsx)(o,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,w.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:`Flush runtime`}),(0,w.jsxs)(`code`,{children:[p,n&&n!==`default`?` / ${n}`:``]})]}),s?(0,w.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,c?(0,w.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:c}):null,(0,w.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,w.jsx)(u,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:g(e,a).label||e}))],onChange:l}),(0,w.jsx)(u,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...i],onChange:d})]})]})})}function E(e){return e.source===`static`||e.id.startsWith(`static:`)}function D(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function ae(e,t){let n=e[0]||`claude`,r=t?.[n]?.models?.[0]||`default`;return{id:D(),name:`New Agent`,cli:n,model:r,role:``,status:`idle`,source:`db`}}function oe(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function se(e,t){return JSON.stringify(e.map(F))===JSON.stringify(t.map(F))}function j(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=ce(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!E(t)&&o.push(t);return{added:i,updated:a,removed:o}}function M(e,t){let n=j(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function N(e,t,n){let r=j(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,P(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function ce(e,t){if(E(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function P(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function F(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function I({employee:e,index:t,cliOptions:n,cliMeta:r,onChange:i,onRemove:a}){let o=E(e),s=y(g(e.cli,r).models,e.model),c=k(e),l=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,w.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,w.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,o?(0,w.jsx)(`span`,{children:`static`}):null]}),(0,w.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,w.jsx)(d,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:o,error:c===`Name is required`?c:null,onChange:e=>i({name:e})}),(0,w.jsx)(u,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:o,options:l.map(e=>({value:e,label:g(e,r).label||e})),onChange:e=>{i({cli:e,model:g(e,r).models[0]||`default`})}}),(0,w.jsx)(u,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:s.length>0?s:[{value:`default`,label:`default`}],onChange:e=>i({model:e})}),(0,w.jsx)(d,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:o,onChange:e=>i({role:e})})]}),(0,w.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,w.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:o,onClick:a,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function le({roster:e,original:t,cliOptions:n,cliMeta:r,loading:i,error:a,onRosterChange:s}){let c=M(t,e),l=A(e);function u(t,n){s(e.map((e,r)=>r===t?{...e,...n}:e))}function d(t){s(e.filter((e,n)=>n!==t))}return(0,w.jsxs)(o,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,w.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,w.jsxs)(`span`,{children:[`+`,c.added]}),(0,w.jsxs)(`span`,{children:[`~`,c.updated]}),(0,w.jsxs)(`span`,{children:[`-`,c.removed]}),l?(0,w.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),i?(0,w.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,w.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,w.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,w.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,w.jsx)(I,{employee:e,index:t,cliOptions:n,cliMeta:r??null,onChange:e=>u(t,e),onRemove:()=>d(t)},e.id))}),(0,w.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>s([...e,ae(n,r)]),children:`+ Add employee`})})]})}var L=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function R(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):L.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function ue(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=R(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,S(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await N(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function z(e){if(!(e instanceof r)||e.status!==409)return null;try{return JSON.parse(e.detail).settings??null}catch{return null}}function de({port:e,client:t,dirty:n,registerSave:r}){let{state:o,refresh:u,setData:d}=a(t,`/api/settings`),[p,m]=(0,C.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[x,te]=(0,C.useState)({}),[S,T]=(0,C.useState)({}),[E,D]=(0,C.useState)(!0),[ae,O]=(0,C.useState)(null),[k,j]=(0,C.useState)([]),[M,N]=(0,C.useState)([]),[ce,P]=(0,C.useState)(!0),[F,I]=(0,C.useState)(null),[L,R]=(0,C.useState)(null),[de,fe]=(0,C.useState)({}),[pe,me]=(0,C.useState)(!1),[he,ge]=(0,C.useState)(null),[_e,ve]=(0,C.useState)(!1),[ye,be]=(0,C.useState)(null),B=(0,C.useCallback)(async()=>{try{let e=await t.get(`/api/cli-registry`);R(ee(e&&typeof e==`object`&&`data`in e?e.data:e))}catch{R(null)}},[t]),xe=(0,C.useCallback)(async()=>{try{fe(await t.get(`/api/cli-status`))}catch{fe({})}},[t]),V=(0,C.useCallback)(async()=>{D(!0),O(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};te(n),T(n)}catch(e){O(e instanceof Error?e.message:String(e))}finally{D(!1)}},[t]),H=(0,C.useCallback)(async()=>{P(!0),I(null);try{let e=oe(await t.get(`/api/employees`));j(e),N(e)}catch(e){I(e instanceof Error?e.message:String(e))}finally{P(!1)}},[t]);(0,C.useEffect)(()=>{B(),xe(),V(),H()},[B,xe,H,V]),(0,C.useEffect)(()=>{if(o.kind!==`ready`)return;let e=Object.keys(o.data.perCli||{}),t=o.data.cli||e[0]||``,n=f(o.data.permissions),r=g(t,L);m({cli:t,provider:o.data.perCli?.[t]?.provider||r.defaultProvider||``,model:_(t,o.data.perCli,o.data.activeOverrides),effort:h(t,o.data.perCli,o.data.activeOverrides),workingDir:o.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[L,o]),(0,C.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let U=(0,C.useCallback)((e,t)=>n.set(e,t),[n]),W=(0,C.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await ue({client:t,bundle:e,employeeDraft:M,employeeOriginal:k});n.clear(),r&&d(r),await u(),await B(),await V(),await H()},[t,n,M,k,B,H,V,u,d]);(0,C.useEffect)(()=>{if(r)return r(W),()=>r(null)},[r,W]);let G=o.kind===`ready`?o.data:{},K=G.perCli||{},q=G.activeOverrides||{},J=(0,C.useMemo)(()=>Object.keys(K),[K]),Y=g(p.cli,L),X=p.provider||Y.defaultProvider||Y.providers?.[0]||``,Z=p.cli===`pi`,Q=!Z&&(Y.providers?.length??0)>0,Se=y(Q&&Y.modelsByProvider?.[X]||Y.models,p.model),Ce=Q?b(Y,p.model,Y.effortsByProvider?.[X]||Y.efforts,X):b(Y,p.model),we=p.workingDir.trim()?null:`Required`,Te=(0,C.useCallback)(async e=>{me(!0),ge(null);try{let n=await t.post(`/api/settings/runtime-default-migration`,{action:e}),r;r=`settings`in n&&n.settings?n.settings:`data`in n&&n.data?n.data:n,d(r)}catch(e){let t=z(e);if(t){d(t);return}ge(i(e))}finally{me(!1)}},[t,d]),Ee=(0,C.useCallback)(async e=>{ve(!0),be(null);try{let n=await t.post(`/api/settings/multi-session-default-migration`,{action:e}),r;r=`settings`in n&&n.settings?n.settings:`data`in n&&n.data?n.data:n,d(r)}catch(e){let t=z(e);if(t){d(t);return}be(i(e))}finally{ve(!1)}},[t,d]);if(o.kind===`loading`)return(0,w.jsx)(s,{});if(o.kind===`offline`)return(0,w.jsx)(c,{port:e});if(o.kind===`error`)return(0,w.jsx)(l,{message:o.message});function De(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){m(e)}return(0,w.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),W()},children:[G.runtimeDefaultMigration?.state===`pending`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,w.jsx)(`strong`,{children:`기본 런타임 변경 안내`}),(0,w.jsx)(`p`,{children:`기존 선택은 유지됩니다. Codex App으로 전환하거나 현재 런타임을 계속 사용할 수 있습니다.`}),(0,w.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:pe,onClick:()=>void Te(`accept`),children:`Codex App 사용`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:pe,onClick:()=>void Te(`keep`),children:`현재 런타임 유지`})]}),he?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:he}):null]}):null,G.multiSessionDefaultMigration?.state===`pending`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,w.jsx)(`strong`,{children:`다중 세션 안내`}),(0,w.jsx)(`p`,{children:`대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 2로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 설정은 그대로 유지됩니다.`}),(0,w.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:_e,onClick:()=>void Ee(`accept`),children:`다중 세션 켜기`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:_e,onClick:()=>void Ee(`keep`),children:`지금 설정 유지`})]}),ye?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:ye}):null]}):null,de[p.cli]?.probeState===`checking`?(0,w.jsx)(`div`,{className:`settings-inline-notice`,role:`status`,"aria-live":`polite`,children:`상태 확인 중`}):null,(0,w.jsx)(ne,{cli:p.cli,cliOptions:J.length>0?J:[p.cli||`claude`],provider:X,providerOptions:Z?[]:Y.providers||[],model:p.model,modelOptions:Se,effort:p.effort,effortOptions:Ce,workingDir:p.workingDir,workingDirError:we,cliMeta:L,onCliChange:e=>{let t=g(e,L),n={...p,cli:e,provider:K[e]?.provider||t.defaultProvider||``,model:_(e,K,q),effort:h(e,K,q)};De(),$(n),U(`cli`,{value:e,original:G.cli||``,valid:!0})},onProviderChange:e=>{let t=Y.modelsByProvider?.[e]||[],n=Y.effortsByProvider?.[e]||[],r=t.includes(p.model)?p.model:t[0]||``,i=v(Y,r,p.effort,n,e);$({...p,provider:e,model:r,effort:i}),U(`perCli.${p.cli}.provider`,{value:e,original:K[p.cli]?.provider||Y.defaultProvider||``,valid:!0}),U(`activeOverrides.${p.cli}.model`,{value:r,original:_(p.cli,K,q),valid:r.trim().length>0}),U(`activeOverrides.${p.cli}.effort`,{value:i,original:h(p.cli,K,q),valid:!0})},onModelChange:e=>{let t=v(Y,e,p.effort,Q?Y.effortsByProvider?.[X]||Y.efforts:void 0,Q?X:void 0);$({...p,model:e,effort:t}),U(`activeOverrides.${p.cli}.model`,{value:e,original:_(p.cli,K,q),valid:e.trim().length>0}),t!==p.effort&&U(`activeOverrides.${p.cli}.effort`,{value:t,original:h(p.cli,K,q),valid:!0})},onEffortChange:e=>{$({...p,effort:e}),U(`activeOverrides.${p.cli}.effort`,{value:e,original:h(p.cli,K,q),valid:!0})},onWorkingDirChange:e=>{$({...p,workingDir:e}),U(`workingDir`,{value:e,original:G.workingDir||``,valid:e.trim().length>0})}}),(0,w.jsx)(re,{value:p.permissions,onChange:e=>{$({...p,permissions:e}),U(`permissions`,{value:e,original:G.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,w.jsx)(ie,{activeCli:p.cli,flushCli:S.cli||``,flushModel:S.model||``,cliOptions:J,cliMeta:L,modelOptions:y(g(S.cli||p.cli,L).models,S.model||``),loading:E,error:ae,onFlushCliChange:e=>{let t=e&&g(e,L).models[0]||``;T({cli:e,model:t}),U(`flushCli`,{value:e,original:x.cli||``,valid:!0}),U(`flushModel`,{value:t,original:x.model||``,valid:!0})},onFlushModelChange:e=>{T({...S,model:e}),U(`flushModel`,{value:e,original:x.model||``,valid:!0})}}),(0,w.jsx)(le,{roster:M,original:k,cliOptions:J,cliMeta:L,loading:ce,error:F,onRosterChange:e=>{if(N(e),se(e,k)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:k,valid:!A(e)})}})]})}export{z as conflictSettingsFromError,de as default,R as splitAgentSaveBundle};
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{T as r}from"./api-C9dOxby7.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{i as a}from"./PanelLayoutProvider-XpTo-i_s.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{S({kind:`ready`,pages:await u(k)})}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(`
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{T as r}from"./api-B25zNNFJ.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{i as a}from"./PanelLayoutProvider-XpTo-i_s.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{S({kind:`ready`,pages:await u(k)})}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
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)(()=>{t({type:`SET_DESIGN_TAB_STATE`,tabId:n,patch:{zoom:b[(b.indexOf(l)+1)%b.length]??1}})},[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{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{c as r}from"./api-C9dOxby7.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{t as a}from"./copy-text-BDs2wKjA.js";import{n as o,t as s}from"./MarkdownRenderer-CXrilOsG.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
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{c as r}from"./api-B25zNNFJ.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{t as a}from"./copy-text-BDs2wKjA.js";import{n as o,t as s}from"./MarkdownRenderer-CXrilOsG.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,3 +1,3 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{c as r}from"./api-C9dOxby7.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{t as a}from"./copy-text-BDs2wKjA.js";import{n as o,t as s}from"./folder-drag-payload-Bhln9Mk2.js";var c=e(t(),1);function l(e){return{name:e.name,path:e.path,kind:e.kind===`folder`?`directory`:`file`,size:e.size}}function u(e,t){for(let n of e){if(n.path===t)return n;let e=u(n.children??[],t);if(e)return e}return null}function d(e){return{kind:`electron-folder`,label:`Folder`,canPickRoot:!0,getInitialRoot:async()=>null,pickRoot:async()=>{let t=await e.pickFolder();if(!t.ok&&t.error===`cancelled`)return null;if(!t.ok)throw Error(t.error??`Failed to pick folder`);return t.path??null},registerGitWorktreeRoot:async(t,n,r)=>{let i=await e.registerGitWorktreeRoot?.(t,n,r);if(!i?.ok)throw Error(i?.error??`Failed to register worktree root`)},authorizeRoot:async t=>{let n=await e.authorizeRoot?.(t);if(!n?.ok)throw Error(n?.error??`Failed to authorize folder root`);return n.path??t},listDir:async t=>{let n=await e.listDir(t);if(!n.ok||!n.entries)throw Error(n.error??`Failed to list directory`);return n.entries},readFile:async t=>{let n=await e.readFile(t);if(!n.ok||n.content===void 0)throw Error(n.error??`Failed to read file`);return{content:n.content,...n.binary===void 0?{}:{binary:n.binary}}},movePath:async(t,n)=>{let r=await e.movePath(t,n);if(!r.ok)throw Error(r.error??`Failed to move path`);return r},createFile:async(t,n)=>{let r=await e.createFile(t,n);if(!r.ok)throw Error(r.error??`Failed to create file`);return r},createFolder:async(t,n)=>{let r=await e.createFolder(t,n);if(!r.ok)throw Error(r.error??`Failed to create folder`);return r},renamePath:async(t,n)=>{let r=await e.renamePath(t,n);if(!r.ok)throw Error(r.error??`Failed to rename path`);return r},revealPath:async t=>{let n=await e.revealPath(t);if(!n.ok)throw Error(n.error??`Failed to reveal path`)},watchDir:t=>e.watchDir(t),unwatchDir:t=>e.unwatchDir(t),onDirChange:t=>e.onDirChange(t)}}function f(e,t){return{kind:`notes-vault`,label:t?`Notes: ${t.split(`/`).pop()||t}`:`Notes vault`,canPickRoot:!1,getInitialRoot:async()=>``,listDir:async t=>{if(!t)return e.map(l);let n=u(e,t);return!n||n.kind!==`folder`?[]:(n.children??[]).map(l)},readFile:async e=>({content:(await r(e)).content,binary:!1})}}var p=n();function m(e){return(0,p.jsxs)(`div`,{className:`folder-action-row`,"aria-label":`Folder actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection,onClick:e.onCopyPath,children:`Copy`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection,onClick:e.onCopyRelativePath,children:`Relative`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection||!e.canReveal,onClick:e.onReveal,children:`Finder`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.canMutate,onClick:e.onCreateFile,children:`New File`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.canMutate,onClick:e.onCreateFolder,children:`New Folder`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection||!e.canMutate,onClick:e.onRename,children:`Rename`})]})}function h(e){return(0,p.jsxs)(`div`,{className:`folder-context-menu`,role:`menu`,style:{left:e.x,top:e.y},onPointerDown:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:[(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onCopyPath,children:`Copy Path`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onCopyRelativePath,children:`Copy Relative Path`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canReveal,onClick:e.onReveal,children:e.entry.kind===`directory`?`Open Folder`:`Reveal in Finder`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onCreateFile,children:`New File`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onCreateFolder,children:`New Folder`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onRename,children:`Rename`}),e.canRefresh&&(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onRefresh,children:`Refresh`})]})}function g(e){return(0,p.jsxs)(`div`,{className:`folder-move-confirm`,role:`dialog`,"aria-label":`Confirm folder move`,children:[(0,p.jsxs)(`div`,{className:`folder-move-confirm__title`,children:[`Move "`,e.source.name,`" into "`,e.target.name,`"?`]}),(0,p.jsxs)(`label`,{className:`folder-move-confirm__option`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.skipChecked,onChange:t=>e.onSkipCheckedChange(t.target.checked)}),`Don't ask again for internal moves this session`]}),(0,p.jsxs)(`div`,{className:`folder-move-confirm__actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:e.busy,onClick:e.onCancel,children:`Cancel`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn is-primary`,disabled:e.busy,onClick:e.onConfirm,children:e.busy?`Moving...`:`Move`})]})]})}function _(e){return(0,p.jsxs)(p.Fragment,{children:[e.pendingMove&&(0,p.jsx)(g,{source:e.pendingMove.source,target:e.pendingMove.target,busy:e.isMoving,skipChecked:e.skipMoveConfirmChecked,onSkipCheckedChange:e.onSkipMoveConfirmCheckedChange,onCancel:e.onCancelMove,onConfirm:e.onConfirmMove}),e.contextMenu&&(0,p.jsx)(h,{entry:e.contextMenu.entry,x:e.contextMenu.x,y:e.contextMenu.y,canReveal:e.canReveal,canRefresh:e.canRefresh,canMutate:e.canMutate,onCopyPath:e.onCopyContextPath,onCopyRelativePath:e.onCopyContextRelativePath,onReveal:e.onRevealContextPath,onRefresh:e.onRefreshContext,onCreateFile:e.onCreateContextFile,onCreateFolder:e.onCreateContextFolder,onRename:e.onRenameContextPath})]})}function v(e){return e===null?`Open Folder`:e.split(`/`).pop()||e}function y(e){return e.split(`/`).filter(Boolean).pop()||e}function b(e){return e.branch?e.branch:e.detached?e.head?`detached ${e.head}`:`detached`:e.head??`worktree`}function x(e){let[t,n]=(0,c.useState)(!1),r=e.gitSummary?.loading?`Git ...`:e.gitSummary?.available?`${e.gitSummary.branch??e.gitSummary.head??`detached`} / ${e.gitSummary.dirty?`dirty`:`clean`}`:e.gitSummary?.error?`Git unavailable`:null,i=e.worktreeSummary?.worktrees??[],a=e.rootPath!==null&&(e.worktreeSummary?.loading||e.worktreeSummary?.error||i.length>0),o=e.worktreeSummary?.loading?`Worktrees ...`:i.length>0?`Worktrees ${i.length}`:`Worktrees`;return(0,p.jsxs)(`div`,{className:`folder-toolbar`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-pick-btn`,onClick:e.onPickFolder,disabled:!e.canPickRoot,children:e.canPickRoot?v(e.rootPath):e.label}),r&&(0,p.jsx)(`span`,{className:e.gitSummary?.error?`folder-git-summary is-error`:`folder-git-summary`,title:e.gitSummary?.error??void 0,children:r}),a&&(0,p.jsxs)(`div`,{className:`folder-worktree`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-btn`,onClick:()=>n(e=>!e),disabled:e.worktreeSummary?.loading||i.length===0,title:e.worktreeSummary?.error??void 0,children:o}),t&&i.length>0&&(0,p.jsx)(`div`,{className:`folder-worktree-menu`,role:`menu`,"aria-label":`Git worktrees`,children:i.map(t=>(0,p.jsxs)(`div`,{className:`folder-worktree-row`,role:`group`,"aria-label":t.path,children:[(0,p.jsxs)(`button`,{type:`button`,className:`folder-worktree-open`,onClick:()=>{n(!1),e.onOpenWorktree?.(t.path)},children:[(0,p.jsxs)(`span`,{className:`folder-worktree-title`,children:[y(t.path),t.current&&(0,p.jsx)(`span`,{className:`folder-worktree-current`,children:`Current`})]}),(0,p.jsxs)(`span`,{className:`folder-worktree-meta`,children:[b(t),` · `,t.path]})]}),(0,p.jsxs)(`span`,{className:`folder-worktree-actions`,children:[(0,p.jsx)(`button`,{type:`button`,onClick:()=>e.onCopyWorktreePath?.(t.path),children:`Copy`}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>e.onRevealWorktreePath?.(t.path),children:`Finder`})]})]},t.path))})]}),e.rootPath!==null&&e.gitSummary?.available&&e.onOpenWorktreeOps&&(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-btn`,onClick:e.onOpenWorktreeOps,children:`Ops`}),e.rootPath!==null&&(0,p.jsx)(`button`,{type:`button`,className:`folder-refresh`,onClick:e.onRefresh,"aria-label":`Refresh folder`,children:`↻`})]})}async function S(e,t){return await(await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json()}async function C(e){let t=e.repoRoot??void 0;try{let n=i()?.git,r=n?await n.previewWorktreeOperation(e.folderPanelRoot,t,e.operation):null,a=r?.ok?r:await S(`/api/dashboard/git/worktree-operation-preview`,{folderPanelRoot:e.folderPanelRoot,...t?{repoRoot:t}:{},operation:e.operation});return{ok:a.ok,preview:a.preview??null,error:a.ok?null:a.error??`Failed to preview git operation`}}catch(e){return{ok:!1,preview:null,error:e instanceof Error?e.message:`Failed to preview git operation`}}}async function w(e){let t=e.repoRoot??void 0;try{let n=i()?.git,r=n?await n.runWorktreeOperation(e.folderPanelRoot,t,e.operation,e.confirmed):null,a=r?.ok?r:await S(`/api/dashboard/git/worktree-operation`,{folderPanelRoot:e.folderPanelRoot,...t?{repoRoot:t}:{},operation:e.operation,confirmed:e.confirmed});return{ok:a.ok,repoRoot:a.repoRoot??null,preview:a.preview??null,stdout:a.stdout??``,worktrees:a.worktrees??[],error:a.ok?null:a.error??`Git operation failed`}}catch(e){return{ok:!1,repoRoot:null,preview:null,stdout:``,worktrees:[],error:e instanceof Error?e.message:`Git operation failed`}}}function T(e){return e.length>0?e.join(` `):`Command unavailable`}function E(e){return e.status===`running`?`Running`:e.status===`succeeded`?`Done`:e.status===`blocked`?`Blocked`:e.status===`cancelled`?`Cancelled`:`Failed`}function ee(e){return e.history.length===0?null:(0,p.jsxs)(`div`,{className:`folder-worktree-history`,"aria-label":`Git worktree operation history`,children:[(0,p.jsx)(`div`,{className:`folder-worktree-history__title`,children:`Recent operations`}),e.history.map(t=>(0,p.jsxs)(`div`,{className:`folder-worktree-history__item is-${t.status}`,children:[(0,p.jsxs)(`div`,{className:`folder-worktree-history__main`,children:[(0,p.jsx)(`span`,{className:`folder-worktree-history__label`,children:t.operationLabel}),(0,p.jsx)(`span`,{className:`folder-worktree-history__status`,children:E(t)})]}),(0,p.jsx)(`div`,{className:`folder-worktree-history__command`,title:T(t.commandPreview),children:T(t.commandPreview)}),t.stdout&&(0,p.jsx)(`pre`,{className:`folder-worktree-history__output`,children:t.stdout}),t.stderr&&(0,p.jsx)(`pre`,{className:`folder-worktree-history__output is-error`,children:t.stderr}),t.error&&(0,p.jsx)(`div`,{className:`folder-worktree-history__error`,children:t.error}),(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-history__retry`,disabled:e.busy||t.status===`running`,onClick:()=>e.onRetry(t.operation),children:`Retry with confirmation`})]},t.id))]})}function D(e){return e.split(`/`).filter(Boolean).pop()||e}function te(e){return e?e.command.join(` `):`Preview unavailable`}function O(e){let[t,n]=(0,c.useState)(`worktree-add`),[r,i]=(0,c.useState)(``),[a,o]=(0,c.useState)(``),[s,l]=(0,c.useState)(!1),[u,d]=(0,c.useState)(e.worktrees.find(e=>!e.current)?.path??e.worktrees[0]?.path??``),[f,m]=(0,c.useState)(!1),[h,g]=(0,c.useState)(!1),[_,v]=(0,c.useState)(!1),[y,b]=(0,c.useState)(null),[x,S]=(0,c.useState)(null),w=(0,c.useCallback)(e=>{n(e.type),g(!1),e.type===`worktree-add`&&(i(e.path),o(e.branch),l(e.createBranch)),e.type===`worktree-remove`&&(d(e.path),m(e.force))},[]),T=(0,c.useMemo)(()=>t===`worktree-add`?{type:t,path:r,branch:a,createBranch:s}:t===`worktree-remove`?{type:t,path:u,force:f}:{type:t},[a,s,f,t,u,r]);(0,c.useEffect)(()=>{let t=!1;return g(!1),v(!0),b(null),S(null),(async()=>{let n=await C({folderPanelRoot:e.folderPanelRoot,repoRoot:e.repoRoot,operation:T});t||(v(!1),S(n.preview),b(n.error))})(),()=>{t=!0}},[T,e.folderPanelRoot,e.repoRoot]);let E=h&&x!==null&&!y&&!_&&!e.busy,O=t===`worktree-remove`;return(0,p.jsx)(`div`,{className:`folder-worktree-ops`,role:`dialog`,"aria-label":`Git worktree operations`,children:(0,p.jsxs)(`div`,{className:`folder-worktree-ops__panel`,children:[(0,p.jsxs)(`div`,{className:`folder-worktree-ops__header`,children:[(0,p.jsx)(`span`,{children:`Worktree Ops`}),(0,p.jsx)(`button`,{type:`button`,onClick:e.onClose,disabled:e.busy,children:`Close`})]}),(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Operation`,(0,p.jsxs)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:e.busy,children:[(0,p.jsx)(`option`,{value:`worktree-add`,children:`Add worktree`}),(0,p.jsx)(`option`,{value:`worktree-remove`,children:`Remove worktree`}),(0,p.jsx)(`option`,{value:`worktree-prune`,children:`Prune stale worktrees`})]})]})}),t===`worktree-add`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Path`,(0,p.jsx)(`input`,{value:r,onChange:e=>i(e.target.value),placeholder:`/Users/jun/...`,disabled:e.busy})]})}),(0,p.jsxs)(`div`,{className:`folder-worktree-ops__row`,children:[(0,p.jsxs)(`label`,{children:[`Branch / ref`,(0,p.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),placeholder:`feature/name`,disabled:e.busy})]}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l(e.target.checked),disabled:e.busy}),`Create branch`]})]})]}),O&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Worktree`,(0,p.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),disabled:e.busy,children:e.worktrees.map(e=>(0,p.jsxs)(`option`,{value:e.path,children:[D(e.path),` - `,e.path]},e.path))})]})}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__warning`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:f,onChange:e=>m(e.target.checked),disabled:e.busy}),`Force remove dirty worktree`]})]}),(0,p.jsx)(`div`,{className:`folder-worktree-ops__preview`,"aria-busy":_,children:_?`Previewing command...`:te(x)}),y&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__warning`,children:y}),O&&!f&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__hint`,children:`Dirty worktrees are blocked unless force remove is explicitly checked.`}),O&&f&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__hint`,children:`Preview changes to git worktree remove --force for this target.`}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked),disabled:x===null||!!y||e.busy}),`I understand this will run the previewed git command.`]}),(0,p.jsxs)(`div`,{className:`folder-worktree-ops__actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,onClick:e.onClose,disabled:e.busy,children:`Cancel`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn is-primary`,disabled:!E,onClick:()=>e.onRun(T,x),children:e.busy?`Running...`:`Run`})]}),(0,p.jsx)(ee,{history:e.history,busy:e.busy,onRetry:w})]})})}function ne(e){let t=e.lastIndexOf(`/`);return t>0?e.slice(0,t):`/`}function k(e,t){return t===e||t.startsWith(`${e}/`)}function re(e,t){if(!e)return t;let n=e.endsWith(`/`)?e:`${e}/`;return t.startsWith(n)?t.slice(n.length):t}function ie(e,t){let n=new Map(e);for(let e of t)n.delete(e);return n}function ae(e){let t=(0,c.useRef)(null);return(0,c.useEffect)(()=>{let e=t.current;e&&(e.focus(),e.select())},[e.initialName]),(0,p.jsx)(`form`,{className:`folder-inline-editor`,"aria-label":e.label,onSubmit:n=>{n.preventDefault();let r=t.current?.value.trim()??``;r&&e.onSubmit(r)},children:(0,p.jsx)(`input`,{ref:t,className:`folder-inline-editor__input`,defaultValue:e.initialName,disabled:e.busy,onBlur:()=>{e.busy||e.onCancel()},onKeyDown:t=>{t.key===`Escape`&&(t.preventDefault(),e.onCancel()),t.stopPropagation()}})})}function oe(e){return/mac|iphone|ipad|ipod/i.test(e)}function se(){return typeof navigator>`u`?``:navigator.userAgentData?.platform||navigator.platform||navigator.userAgent||``}function ce(e){if(typeof HTMLElement>`u`||!(e instanceof HTMLElement))return!1;if(e.isContentEditable)return!0;let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`?!0:!!e.closest(`[contenteditable="true"], .cm-editor, .ProseMirror, [data-milkdown-root], [role="textbox"]`)}function le(e,t=se()){return oe(t)?e.metaKey:e.ctrlKey}function ue(e,t){if(ce(e.target??null))return null;let n=e.key.toLowerCase(),r=e.code??``,i=oe(t.platform??se())?e.metaKey:e.ctrlKey,a=i&&e.altKey&&!e.shiftKey;return t.chordActive?n===`escape`?`cancel-chord`:i||e.altKey||e.shiftKey?null:n===`p`||r===`KeyP`?`copy-path`:n===`r`||r===`KeyR`?`reveal-path`:`cancel-chord`:i&&!e.altKey&&!e.shiftKey&&(n===`k`||r===`KeyK`)?`start-chord`:a&&(n===`c`||r===`KeyC`)?`copy-path`:a&&(n===`r`||r===`KeyR`)?`reveal-path`:i&&!e.altKey&&n===`c`?e.shiftKey?`copy-path`:`copy-relative-path`:null}function de(e){window.dispatchEvent(new CustomEvent(`jaw-folder-panel-drag`,{detail:{active:e}}))}function fe(e){let t=e.inlineMutation&&e.inlineMutation.kind!==`rename`&&e.inlineMutation.parentDirectory===e.parentPath?e.inlineMutation:null;return(0,p.jsxs)(p.Fragment,{children:[t&&(0,p.jsxs)(`div`,{className:`folder-entry folder-entry-inline`,children:[e.depth>0&&(0,p.jsx)(`span`,{className:`folder-indent`,"aria-hidden":`true`,children:Array.from({length:e.depth},(e,t)=>(0,p.jsx)(`span`,{className:`folder-indent-guide`},t))}),(0,p.jsx)(`span`,{className:`folder-entry-disclosure is-placeholder`,"aria-hidden":`true`,children:`·`}),(0,p.jsx)(ae,{initialName:t.initialName,busy:e.isMutating,label:t.kind===`file`?`New file name`:`New folder name`,onSubmit:e.submitInlineMutation,onCancel:e.cancelInlineMutation})]}),e.entries.map(t=>(0,p.jsxs)(`div`,{children:[(()=>{let n=e.decorationsByPath.get(t.path),r=e.inlineMutation?.kind===`rename`&&e.inlineMutation.targetPath===t.path?e.inlineMutation:null;return(0,p.jsxs)(`div`,{className:[`folder-entry`,`folder-entry-${t.kind}`,n?.className??``,e.selectedPaths.has(t.path)?`is-selected`:``,e.focusedPath===t.path?`is-focused`:``,e.dropTargetPath===t.path?`is-drop-target`:``,e.dragSelection?.primaryEntry.path===t.path?`is-dragging`:``].filter(Boolean).join(` `),role:`treeitem`,"aria-selected":e.selectedPaths.has(t.path),draggable:e.canUseNativeActions,onDragStart:n=>{if(!e.canUseNativeActions)return;let r=e.getDragSelectionFor(t);e.setDragSelection(r),de(!0),n.dataTransfer.effectAllowed=`copyMove`,n.dataTransfer.setData(s,o(r)),n.dataTransfer.setData(`text/plain`,r.entries.map(e=>e.path).join(`
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{c as r}from"./api-B25zNNFJ.js";import{t as i}from"./desktop-bridge-CvdhnJQo.js";import{t as a}from"./copy-text-BDs2wKjA.js";import{n as o,t as s}from"./folder-drag-payload-Bhln9Mk2.js";var c=e(t(),1);function l(e){return{name:e.name,path:e.path,kind:e.kind===`folder`?`directory`:`file`,size:e.size}}function u(e,t){for(let n of e){if(n.path===t)return n;let e=u(n.children??[],t);if(e)return e}return null}function d(e){return{kind:`electron-folder`,label:`Folder`,canPickRoot:!0,getInitialRoot:async()=>null,pickRoot:async()=>{let t=await e.pickFolder();if(!t.ok&&t.error===`cancelled`)return null;if(!t.ok)throw Error(t.error??`Failed to pick folder`);return t.path??null},registerGitWorktreeRoot:async(t,n,r)=>{let i=await e.registerGitWorktreeRoot?.(t,n,r);if(!i?.ok)throw Error(i?.error??`Failed to register worktree root`)},authorizeRoot:async t=>{let n=await e.authorizeRoot?.(t);if(!n?.ok)throw Error(n?.error??`Failed to authorize folder root`);return n.path??t},listDir:async t=>{let n=await e.listDir(t);if(!n.ok||!n.entries)throw Error(n.error??`Failed to list directory`);return n.entries},readFile:async t=>{let n=await e.readFile(t);if(!n.ok||n.content===void 0)throw Error(n.error??`Failed to read file`);return{content:n.content,...n.binary===void 0?{}:{binary:n.binary}}},movePath:async(t,n)=>{let r=await e.movePath(t,n);if(!r.ok)throw Error(r.error??`Failed to move path`);return r},createFile:async(t,n)=>{let r=await e.createFile(t,n);if(!r.ok)throw Error(r.error??`Failed to create file`);return r},createFolder:async(t,n)=>{let r=await e.createFolder(t,n);if(!r.ok)throw Error(r.error??`Failed to create folder`);return r},renamePath:async(t,n)=>{let r=await e.renamePath(t,n);if(!r.ok)throw Error(r.error??`Failed to rename path`);return r},revealPath:async t=>{let n=await e.revealPath(t);if(!n.ok)throw Error(n.error??`Failed to reveal path`)},watchDir:t=>e.watchDir(t),unwatchDir:t=>e.unwatchDir(t),onDirChange:t=>e.onDirChange(t)}}function f(e,t){return{kind:`notes-vault`,label:t?`Notes: ${t.split(`/`).pop()||t}`:`Notes vault`,canPickRoot:!1,getInitialRoot:async()=>``,listDir:async t=>{if(!t)return e.map(l);let n=u(e,t);return!n||n.kind!==`folder`?[]:(n.children??[]).map(l)},readFile:async e=>({content:(await r(e)).content,binary:!1})}}var p=n();function m(e){return(0,p.jsxs)(`div`,{className:`folder-action-row`,"aria-label":`Folder actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection,onClick:e.onCopyPath,children:`Copy`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection,onClick:e.onCopyRelativePath,children:`Relative`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection||!e.canReveal,onClick:e.onReveal,children:`Finder`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.canMutate,onClick:e.onCreateFile,children:`New File`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.canMutate,onClick:e.onCreateFolder,children:`New Folder`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:!e.hasSelection||!e.canMutate,onClick:e.onRename,children:`Rename`})]})}function h(e){return(0,p.jsxs)(`div`,{className:`folder-context-menu`,role:`menu`,style:{left:e.x,top:e.y},onPointerDown:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:[(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onCopyPath,children:`Copy Path`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onCopyRelativePath,children:`Copy Relative Path`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canReveal,onClick:e.onReveal,children:e.entry.kind===`directory`?`Open Folder`:`Reveal in Finder`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onCreateFile,children:`New File`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onCreateFolder,children:`New Folder`}),(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,disabled:!e.canMutate,onClick:e.onRename,children:`Rename`}),e.canRefresh&&(0,p.jsx)(`button`,{type:`button`,role:`menuitem`,onClick:e.onRefresh,children:`Refresh`})]})}function g(e){return(0,p.jsxs)(`div`,{className:`folder-move-confirm`,role:`dialog`,"aria-label":`Confirm folder move`,children:[(0,p.jsxs)(`div`,{className:`folder-move-confirm__title`,children:[`Move "`,e.source.name,`" into "`,e.target.name,`"?`]}),(0,p.jsxs)(`label`,{className:`folder-move-confirm__option`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.skipChecked,onChange:t=>e.onSkipCheckedChange(t.target.checked)}),`Don't ask again for internal moves this session`]}),(0,p.jsxs)(`div`,{className:`folder-move-confirm__actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,disabled:e.busy,onClick:e.onCancel,children:`Cancel`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn is-primary`,disabled:e.busy,onClick:e.onConfirm,children:e.busy?`Moving...`:`Move`})]})]})}function _(e){return(0,p.jsxs)(p.Fragment,{children:[e.pendingMove&&(0,p.jsx)(g,{source:e.pendingMove.source,target:e.pendingMove.target,busy:e.isMoving,skipChecked:e.skipMoveConfirmChecked,onSkipCheckedChange:e.onSkipMoveConfirmCheckedChange,onCancel:e.onCancelMove,onConfirm:e.onConfirmMove}),e.contextMenu&&(0,p.jsx)(h,{entry:e.contextMenu.entry,x:e.contextMenu.x,y:e.contextMenu.y,canReveal:e.canReveal,canRefresh:e.canRefresh,canMutate:e.canMutate,onCopyPath:e.onCopyContextPath,onCopyRelativePath:e.onCopyContextRelativePath,onReveal:e.onRevealContextPath,onRefresh:e.onRefreshContext,onCreateFile:e.onCreateContextFile,onCreateFolder:e.onCreateContextFolder,onRename:e.onRenameContextPath})]})}function v(e){return e===null?`Open Folder`:e.split(`/`).pop()||e}function y(e){return e.split(`/`).filter(Boolean).pop()||e}function b(e){return e.branch?e.branch:e.detached?e.head?`detached ${e.head}`:`detached`:e.head??`worktree`}function x(e){let[t,n]=(0,c.useState)(!1),r=e.gitSummary?.loading?`Git ...`:e.gitSummary?.available?`${e.gitSummary.branch??e.gitSummary.head??`detached`} / ${e.gitSummary.dirty?`dirty`:`clean`}`:e.gitSummary?.error?`Git unavailable`:null,i=e.worktreeSummary?.worktrees??[],a=e.rootPath!==null&&(e.worktreeSummary?.loading||e.worktreeSummary?.error||i.length>0),o=e.worktreeSummary?.loading?`Worktrees ...`:i.length>0?`Worktrees ${i.length}`:`Worktrees`;return(0,p.jsxs)(`div`,{className:`folder-toolbar`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-pick-btn`,onClick:e.onPickFolder,disabled:!e.canPickRoot,children:e.canPickRoot?v(e.rootPath):e.label}),r&&(0,p.jsx)(`span`,{className:e.gitSummary?.error?`folder-git-summary is-error`:`folder-git-summary`,title:e.gitSummary?.error??void 0,children:r}),a&&(0,p.jsxs)(`div`,{className:`folder-worktree`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-btn`,onClick:()=>n(e=>!e),disabled:e.worktreeSummary?.loading||i.length===0,title:e.worktreeSummary?.error??void 0,children:o}),t&&i.length>0&&(0,p.jsx)(`div`,{className:`folder-worktree-menu`,role:`menu`,"aria-label":`Git worktrees`,children:i.map(t=>(0,p.jsxs)(`div`,{className:`folder-worktree-row`,role:`group`,"aria-label":t.path,children:[(0,p.jsxs)(`button`,{type:`button`,className:`folder-worktree-open`,onClick:()=>{n(!1),e.onOpenWorktree?.(t.path)},children:[(0,p.jsxs)(`span`,{className:`folder-worktree-title`,children:[y(t.path),t.current&&(0,p.jsx)(`span`,{className:`folder-worktree-current`,children:`Current`})]}),(0,p.jsxs)(`span`,{className:`folder-worktree-meta`,children:[b(t),` · `,t.path]})]}),(0,p.jsxs)(`span`,{className:`folder-worktree-actions`,children:[(0,p.jsx)(`button`,{type:`button`,onClick:()=>e.onCopyWorktreePath?.(t.path),children:`Copy`}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>e.onRevealWorktreePath?.(t.path),children:`Finder`})]})]},t.path))})]}),e.rootPath!==null&&e.gitSummary?.available&&e.onOpenWorktreeOps&&(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-btn`,onClick:e.onOpenWorktreeOps,children:`Ops`}),e.rootPath!==null&&(0,p.jsx)(`button`,{type:`button`,className:`folder-refresh`,onClick:e.onRefresh,"aria-label":`Refresh folder`,children:`↻`})]})}async function S(e,t){return await(await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json()}async function C(e){let t=e.repoRoot??void 0;try{let n=i()?.git,r=n?await n.previewWorktreeOperation(e.folderPanelRoot,t,e.operation):null,a=r?.ok?r:await S(`/api/dashboard/git/worktree-operation-preview`,{folderPanelRoot:e.folderPanelRoot,...t?{repoRoot:t}:{},operation:e.operation});return{ok:a.ok,preview:a.preview??null,error:a.ok?null:a.error??`Failed to preview git operation`}}catch(e){return{ok:!1,preview:null,error:e instanceof Error?e.message:`Failed to preview git operation`}}}async function w(e){let t=e.repoRoot??void 0;try{let n=i()?.git,r=n?await n.runWorktreeOperation(e.folderPanelRoot,t,e.operation,e.confirmed):null,a=r?.ok?r:await S(`/api/dashboard/git/worktree-operation`,{folderPanelRoot:e.folderPanelRoot,...t?{repoRoot:t}:{},operation:e.operation,confirmed:e.confirmed});return{ok:a.ok,repoRoot:a.repoRoot??null,preview:a.preview??null,stdout:a.stdout??``,worktrees:a.worktrees??[],error:a.ok?null:a.error??`Git operation failed`}}catch(e){return{ok:!1,repoRoot:null,preview:null,stdout:``,worktrees:[],error:e instanceof Error?e.message:`Git operation failed`}}}function T(e){return e.length>0?e.join(` `):`Command unavailable`}function E(e){return e.status===`running`?`Running`:e.status===`succeeded`?`Done`:e.status===`blocked`?`Blocked`:e.status===`cancelled`?`Cancelled`:`Failed`}function ee(e){return e.history.length===0?null:(0,p.jsxs)(`div`,{className:`folder-worktree-history`,"aria-label":`Git worktree operation history`,children:[(0,p.jsx)(`div`,{className:`folder-worktree-history__title`,children:`Recent operations`}),e.history.map(t=>(0,p.jsxs)(`div`,{className:`folder-worktree-history__item is-${t.status}`,children:[(0,p.jsxs)(`div`,{className:`folder-worktree-history__main`,children:[(0,p.jsx)(`span`,{className:`folder-worktree-history__label`,children:t.operationLabel}),(0,p.jsx)(`span`,{className:`folder-worktree-history__status`,children:E(t)})]}),(0,p.jsx)(`div`,{className:`folder-worktree-history__command`,title:T(t.commandPreview),children:T(t.commandPreview)}),t.stdout&&(0,p.jsx)(`pre`,{className:`folder-worktree-history__output`,children:t.stdout}),t.stderr&&(0,p.jsx)(`pre`,{className:`folder-worktree-history__output is-error`,children:t.stderr}),t.error&&(0,p.jsx)(`div`,{className:`folder-worktree-history__error`,children:t.error}),(0,p.jsx)(`button`,{type:`button`,className:`folder-worktree-history__retry`,disabled:e.busy||t.status===`running`,onClick:()=>e.onRetry(t.operation),children:`Retry with confirmation`})]},t.id))]})}function D(e){return e.split(`/`).filter(Boolean).pop()||e}function te(e){return e?e.command.join(` `):`Preview unavailable`}function O(e){let[t,n]=(0,c.useState)(`worktree-add`),[r,i]=(0,c.useState)(``),[a,o]=(0,c.useState)(``),[s,l]=(0,c.useState)(!1),[u,d]=(0,c.useState)(e.worktrees.find(e=>!e.current)?.path??e.worktrees[0]?.path??``),[f,m]=(0,c.useState)(!1),[h,g]=(0,c.useState)(!1),[_,v]=(0,c.useState)(!1),[y,b]=(0,c.useState)(null),[x,S]=(0,c.useState)(null),w=(0,c.useCallback)(e=>{n(e.type),g(!1),e.type===`worktree-add`&&(i(e.path),o(e.branch),l(e.createBranch)),e.type===`worktree-remove`&&(d(e.path),m(e.force))},[]),T=(0,c.useMemo)(()=>t===`worktree-add`?{type:t,path:r,branch:a,createBranch:s}:t===`worktree-remove`?{type:t,path:u,force:f}:{type:t},[a,s,f,t,u,r]);(0,c.useEffect)(()=>{let t=!1;return g(!1),v(!0),b(null),S(null),(async()=>{let n=await C({folderPanelRoot:e.folderPanelRoot,repoRoot:e.repoRoot,operation:T});t||(v(!1),S(n.preview),b(n.error))})(),()=>{t=!0}},[T,e.folderPanelRoot,e.repoRoot]);let E=h&&x!==null&&!y&&!_&&!e.busy,O=t===`worktree-remove`;return(0,p.jsx)(`div`,{className:`folder-worktree-ops`,role:`dialog`,"aria-label":`Git worktree operations`,children:(0,p.jsxs)(`div`,{className:`folder-worktree-ops__panel`,children:[(0,p.jsxs)(`div`,{className:`folder-worktree-ops__header`,children:[(0,p.jsx)(`span`,{children:`Worktree Ops`}),(0,p.jsx)(`button`,{type:`button`,onClick:e.onClose,disabled:e.busy,children:`Close`})]}),(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Operation`,(0,p.jsxs)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:e.busy,children:[(0,p.jsx)(`option`,{value:`worktree-add`,children:`Add worktree`}),(0,p.jsx)(`option`,{value:`worktree-remove`,children:`Remove worktree`}),(0,p.jsx)(`option`,{value:`worktree-prune`,children:`Prune stale worktrees`})]})]})}),t===`worktree-add`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Path`,(0,p.jsx)(`input`,{value:r,onChange:e=>i(e.target.value),placeholder:`/Users/jun/...`,disabled:e.busy})]})}),(0,p.jsxs)(`div`,{className:`folder-worktree-ops__row`,children:[(0,p.jsxs)(`label`,{children:[`Branch / ref`,(0,p.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),placeholder:`feature/name`,disabled:e.busy})]}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l(e.target.checked),disabled:e.busy}),`Create branch`]})]})]}),O&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`folder-worktree-ops__row`,children:(0,p.jsxs)(`label`,{children:[`Worktree`,(0,p.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),disabled:e.busy,children:e.worktrees.map(e=>(0,p.jsxs)(`option`,{value:e.path,children:[D(e.path),` - `,e.path]},e.path))})]})}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__warning`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:f,onChange:e=>m(e.target.checked),disabled:e.busy}),`Force remove dirty worktree`]})]}),(0,p.jsx)(`div`,{className:`folder-worktree-ops__preview`,"aria-busy":_,children:_?`Previewing command...`:te(x)}),y&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__warning`,children:y}),O&&!f&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__hint`,children:`Dirty worktrees are blocked unless force remove is explicitly checked.`}),O&&f&&(0,p.jsx)(`div`,{className:`folder-worktree-ops__hint`,children:`Preview changes to git worktree remove --force for this target.`}),(0,p.jsxs)(`label`,{className:`folder-worktree-ops__check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked),disabled:x===null||!!y||e.busy}),`I understand this will run the previewed git command.`]}),(0,p.jsxs)(`div`,{className:`folder-worktree-ops__actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,onClick:e.onClose,disabled:e.busy,children:`Cancel`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn is-primary`,disabled:!E,onClick:()=>e.onRun(T,x),children:e.busy?`Running...`:`Run`})]}),(0,p.jsx)(ee,{history:e.history,busy:e.busy,onRetry:w})]})})}function ne(e){let t=e.lastIndexOf(`/`);return t>0?e.slice(0,t):`/`}function k(e,t){return t===e||t.startsWith(`${e}/`)}function re(e,t){if(!e)return t;let n=e.endsWith(`/`)?e:`${e}/`;return t.startsWith(n)?t.slice(n.length):t}function ie(e,t){let n=new Map(e);for(let e of t)n.delete(e);return n}function ae(e){let t=(0,c.useRef)(null);return(0,c.useEffect)(()=>{let e=t.current;e&&(e.focus(),e.select())},[e.initialName]),(0,p.jsx)(`form`,{className:`folder-inline-editor`,"aria-label":e.label,onSubmit:n=>{n.preventDefault();let r=t.current?.value.trim()??``;r&&e.onSubmit(r)},children:(0,p.jsx)(`input`,{ref:t,className:`folder-inline-editor__input`,defaultValue:e.initialName,disabled:e.busy,onBlur:()=>{e.busy||e.onCancel()},onKeyDown:t=>{t.key===`Escape`&&(t.preventDefault(),e.onCancel()),t.stopPropagation()}})})}function oe(e){return/mac|iphone|ipad|ipod/i.test(e)}function se(){return typeof navigator>`u`?``:navigator.userAgentData?.platform||navigator.platform||navigator.userAgent||``}function ce(e){if(typeof HTMLElement>`u`||!(e instanceof HTMLElement))return!1;if(e.isContentEditable)return!0;let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`?!0:!!e.closest(`[contenteditable="true"], .cm-editor, .ProseMirror, [data-milkdown-root], [role="textbox"]`)}function le(e,t=se()){return oe(t)?e.metaKey:e.ctrlKey}function ue(e,t){if(ce(e.target??null))return null;let n=e.key.toLowerCase(),r=e.code??``,i=oe(t.platform??se())?e.metaKey:e.ctrlKey,a=i&&e.altKey&&!e.shiftKey;return t.chordActive?n===`escape`?`cancel-chord`:i||e.altKey||e.shiftKey?null:n===`p`||r===`KeyP`?`copy-path`:n===`r`||r===`KeyR`?`reveal-path`:`cancel-chord`:i&&!e.altKey&&!e.shiftKey&&(n===`k`||r===`KeyK`)?`start-chord`:a&&(n===`c`||r===`KeyC`)?`copy-path`:a&&(n===`r`||r===`KeyR`)?`reveal-path`:i&&!e.altKey&&n===`c`?e.shiftKey?`copy-path`:`copy-relative-path`:null}function de(e){window.dispatchEvent(new CustomEvent(`jaw-folder-panel-drag`,{detail:{active:e}}))}function fe(e){let t=e.inlineMutation&&e.inlineMutation.kind!==`rename`&&e.inlineMutation.parentDirectory===e.parentPath?e.inlineMutation:null;return(0,p.jsxs)(p.Fragment,{children:[t&&(0,p.jsxs)(`div`,{className:`folder-entry folder-entry-inline`,children:[e.depth>0&&(0,p.jsx)(`span`,{className:`folder-indent`,"aria-hidden":`true`,children:Array.from({length:e.depth},(e,t)=>(0,p.jsx)(`span`,{className:`folder-indent-guide`},t))}),(0,p.jsx)(`span`,{className:`folder-entry-disclosure is-placeholder`,"aria-hidden":`true`,children:`·`}),(0,p.jsx)(ae,{initialName:t.initialName,busy:e.isMutating,label:t.kind===`file`?`New file name`:`New folder name`,onSubmit:e.submitInlineMutation,onCancel:e.cancelInlineMutation})]}),e.entries.map(t=>(0,p.jsxs)(`div`,{children:[(()=>{let n=e.decorationsByPath.get(t.path),r=e.inlineMutation?.kind===`rename`&&e.inlineMutation.targetPath===t.path?e.inlineMutation:null;return(0,p.jsxs)(`div`,{className:[`folder-entry`,`folder-entry-${t.kind}`,n?.className??``,e.selectedPaths.has(t.path)?`is-selected`:``,e.focusedPath===t.path?`is-focused`:``,e.dropTargetPath===t.path?`is-drop-target`:``,e.dragSelection?.primaryEntry.path===t.path?`is-dragging`:``].filter(Boolean).join(` `),role:`treeitem`,"aria-selected":e.selectedPaths.has(t.path),draggable:e.canUseNativeActions,onDragStart:n=>{if(!e.canUseNativeActions)return;let r=e.getDragSelectionFor(t);e.setDragSelection(r),de(!0),n.dataTransfer.effectAllowed=`copyMove`,n.dataTransfer.setData(s,o(r)),n.dataTransfer.setData(`text/plain`,r.entries.map(e=>e.path).join(`
2
2
  `))},onDragEnd:()=>{de(!1),e.setDragSelection(null),e.setDropTargetPath(null)},onDragOver:n=>{let r=e.dragSelection?.primaryEntry;!r||t.kind!==`directory`||r.path!==t.path&&(r.kind===`directory`&&k(r.path,t.path)||(n.preventDefault(),n.dataTransfer.dropEffect=`move`,e.setDropTargetPath(t.path)))},onDragLeave:()=>{e.dropTargetPath===t.path&&e.setDropTargetPath(null)},onDrop:n=>{!e.dragSelection||t.kind!==`directory`||(n.preventDefault(),de(!1),e.setDropTargetPath(null),e.requestMove(e.dragSelection.primaryEntry,t))},children:[e.depth>0&&(0,p.jsx)(`span`,{className:`folder-indent`,"aria-hidden":`true`,children:Array.from({length:e.depth},(e,t)=>(0,p.jsx)(`span`,{className:`folder-indent-guide`},t))}),(0,p.jsx)(`button`,{type:`button`,className:t.kind===`directory`?`folder-entry-disclosure`:`folder-entry-disclosure is-placeholder`,"aria-label":t.kind===`directory`?e.expanded.has(t.path)?`Collapse ${t.name}`:`Expand ${t.name}`:void 0,"aria-expanded":t.kind===`directory`?e.expanded.has(t.path):void 0,tabIndex:t.kind===`directory`?0:-1,disabled:t.kind!==`directory`,onClick:n=>{n.stopPropagation(),t.kind===`directory`&&e.toggleEntryExpansion(t)},children:t.kind===`directory`?e.expanded.has(t.path)?`▾`:`▸`:`·`}),r?(0,p.jsx)(ae,{initialName:r.initialName,busy:e.isMutating,label:`Rename`,onSubmit:e.submitInlineMutation,onCancel:e.cancelInlineMutation}):(0,p.jsxs)(`button`,{type:`button`,className:`folder-entry-btn`,"data-folder-path":t.path,onKeyDown:n=>e.handleEntryKeyDown(n,t),onContextMenu:n=>{n.preventDefault(),e.openContextMenu(t,n.clientX,n.clientY)},onClick:n=>e.selectEntry(t,{range:n.shiftKey,toggle:le(n),preview:!1}),onDoubleClick:()=>{t.kind===`directory`?e.toggleEntryExpansion(t):e.openFileEntry(t)},children:[(0,p.jsx)(`span`,{className:`folder-entry-name`,children:t.name}),n?.label&&(0,p.jsx)(`span`,{className:`folder-entry-git-badge`,title:n.title,"aria-label":n.title??n.label,children:n.label})]})]})})(),t.kind===`directory`&&e.expanded.has(t.path)&&e.childrenCache.has(t.path)&&(0,p.jsx)(fe,{...e,entries:e.childrenCache.get(t.path),parentPath:t.path,depth:e.depth+1})]},t.path))]})}function pe(e){return(0,p.jsxs)(`div`,{className:`folder-unavailable`,children:[(0,p.jsx)(`div`,{className:`folder-unavailable__title`,children:`Folder unavailable`}),(0,p.jsx)(`div`,{className:`folder-unavailable__path`,title:e.path,children:e.path}),(0,p.jsx)(`div`,{className:`folder-unavailable__error`,children:e.error}),(0,p.jsxs)(`div`,{className:`folder-unavailable__actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,onClick:e.onOpenFolder,children:`Open Folder`}),(0,p.jsx)(`button`,{type:`button`,className:`folder-action-btn`,onClick:e.onClear,children:`Clear`})]})]})}function me(e){return(0,p.jsxs)(`div`,{ref:e.treeRef,className:e.rootPath===null?`folder-tree folder-empty-root`:`folder-tree`,role:`tree`,"aria-multiselectable":`true`,children:[(0,p.jsx)(fe,{entries:e.entries,parentPath:e.rootPath,depth:0,expanded:e.expanded,childrenCache:e.childrenCache,selectedPaths:e.folderSelection.selectedPaths,focusedPath:e.folderSelection.selection.focusedPath,decorationsByPath:e.decorationsByPath,dropTargetPath:e.dropTargetPath,dragSelection:e.dragSelection,inlineMutation:e.inlineMutation,isMutating:e.isMutating,canUseNativeActions:e.canUseNativeActions,setDragSelection:e.setDragSelection,setDropTargetPath:e.setDropTargetPath,getDragSelectionFor:e.folderSelection.getDragSelectionFor,requestMove:e.requestMove,handleEntryKeyDown:e.handleEntryKeyDown,selectEntry:e.selectEntry,toggleEntryExpansion:e.toggleEntryExpansion,openFileEntry:e.openFileEntry,openContextMenu:e.openContextMenu,submitInlineMutation:e.submitInlineMutation,cancelInlineMutation:e.cancelInlineMutation}),e.rootPath===null&&!e.error&&(0,p.jsx)(`div`,{className:`folder-empty-root__content`,children:`Choose a folder to browse files.`}),e.unavailableRoot&&(0,p.jsx)(pe,{path:e.unavailableRoot.path,error:e.unavailableRoot.error,onOpenFolder:e.onPickFolder,onClear:e.onClearUnavailableRoot}),e.entries.length===0&&!e.inlineMutation&&!e.error&&!e.unavailableRoot&&e.rootPath!==null&&(0,p.jsx)(`div`,{className:`folder-empty`,children:e.sourceKind===`notes-vault`?`No notes in vault`:`Empty directory`})]})}var A={selectedPaths:[],focusedPath:null,anchorPath:null};function he(e,t,n){let r=[],i=e=>{for(let a of e)r.push(a),a.kind===`directory`&&n.has(a.path)&&i(t.get(a.path)??[])};return i(e),r}function ge(e,t){let n=new Set(t),r=e.selectedPaths.filter(e=>n.has(e)),i=e.focusedPath&&n.has(e.focusedPath)?e.focusedPath:r[0]??null;return{selectedPaths:r,focusedPath:i,anchorPath:e.anchorPath&&n.has(e.anchorPath)?e.anchorPath:i}}function _e(e,t,n,r={}){if(!n.includes(t))return e;if(r.range&&e.anchorPath&&n.includes(e.anchorPath))return{selectedPaths:M(n,e.anchorPath,t),focusedPath:t,anchorPath:e.anchorPath};if(r.toggle){let r=new Set(e.selectedPaths);return r.has(t)?r.delete(t):r.add(t),r.size===0&&r.add(t),{selectedPaths:n.filter(e=>r.has(e)),focusedPath:t,anchorPath:t}}return{selectedPaths:[t],focusedPath:t,anchorPath:t}}function j(e,t,n,r){if(t.length===0)return A;let i=e.focusedPath&&t.includes(e.focusedPath)?e.focusedPath:e.selectedPaths.find(e=>t.includes(e))??t[0],a=t.indexOf(i),o=t[Math.max(0,Math.min(t.length-1,a+(n===`down`?1:-1)))];if(r){let n=e.anchorPath&&t.includes(e.anchorPath)?e.anchorPath:i;return{selectedPaths:M(t,n,o),focusedPath:o,anchorPath:n}}return{selectedPaths:[o],focusedPath:o,anchorPath:o}}function ve(e,t){return e.filter(e=>t.has(e.path))}function M(e,t,n){let r=e.indexOf(t),i=e.indexOf(n);if(r<0||i<0)return[n];let a=Math.min(r,i),o=Math.max(r,i);return e.slice(a,o+1)}function ye(e){return Array.from(e.entries())}function be(e){return new Map(e)}function xe(e,t){return!e||t&&e.rootPath!==t?null:e}function Se(e){return{rootPath:e.rootPath,entries:e.entries,expandedPaths:Array.from(e.expanded),childrenCache:ye(e.childrenCache),selection:e.selection}}function N(e){return/not a git repository/i.test(e)}async function P(e,t){return await(await fetch(`/api/dashboard/git/status-map`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folderPanelRoot:e,...t.repoRoot?{repoRoot:t.repoRoot}:{},options:{includeIgnored:t.includeIgnored!==!1,includeUntracked:t.includeUntracked!==!1}})})).json()}async function F(e,t={}){let n=i()?.git,r=n?await n.getStatusMap(e,t.repoRoot,{includeIgnored:t.includeIgnored!==!1,includeUntracked:t.includeUntracked!==!1}):null,a=r?.ok?r:await P(e,t);if(a.ok&&a.status)return{ok:!0,status:a.status};let o=a.error??`Failed to load git status`;return{ok:!1,quiet:N(o),error:o}}var I={available:!1,loading:!1,error:null,repoRoot:null,branch:null,head:null,dirty:!1,decorationsByPath:new Map},L={modified:`M`,added:`A`,deleted:`D`,renamed:`R`,untracked:`?`,ignored:`·`,conflict:`U`,submodule:`S`};function Ce(e){return{className:`git-${e.kind}`,label:L[e.kind],title:[e.kind,e.staged?`staged`:``,e.unstaged?`unstaged`:``].filter(Boolean).join(` · `)}}function R(e){let t=e.kinds[0]??`modified`;return{className:`git-${t}`,label:`${L[t]}${e.changedCount>1?e.changedCount:``}`,title:`${e.changedCount} changed item${e.changedCount===1?``:`s`}`}}function z(e){let t=new Map;for(let n of e.files)t.set(n.path,Ce(n));for(let n of e.directories)t.set(n.path,R(n));return{available:!0,loading:!1,error:null,repoRoot:e.repoRoot,branch:e.branch,head:e.head,dirty:e.dirty,decorationsByPath:t}}function we(e){let{rootPath:t,repoRoot:n,enabled:r,refreshToken:i}=e,[a,o]=(0,c.useState)(I);return(0,c.useEffect)(()=>{if(!r||t===null){o(I);return}let e=!1,i=window.setTimeout(()=>{o(e=>({...e,loading:!0,error:null})),(async()=>{let r=await F(t,{...n?{repoRoot:n}:{},includeIgnored:!0,includeUntracked:!0});if(!e){if(r.ok){o(z(r.status));return}if(n&&/repo root mismatch/i.test(r.error)){let n=await F(t,{includeIgnored:!0,includeUntracked:!0});if(e)return;if(n.ok){o(z(n.status));return}o(n.quiet?I:{...I,error:n.error});return}o(r.quiet?I:{...I,error:r.error})}})()},250);return()=>{e=!0,window.clearTimeout(i)}},[r,i,n,t]),a}function B(e){return/not a git repository/i.test(e)}async function V(e,t){return await(await fetch(`/api/dashboard/git/worktrees`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folderPanelRoot:e,...t?{repoRoot:t}:{}})})).json()}async function H(e,t){let n=t??void 0;try{let t=i()?.git,r=t?await t.getWorktrees(e,n):null,a=r?.ok?r:await V(e,n);if(a.ok)return{ok:!0,repoRoot:a.repoRoot??n??null,worktrees:a.worktrees??[],error:null};let o=a.error??`Failed to load git worktrees`;return{ok:!1,repoRoot:null,worktrees:[],error:B(o)?null:o}}catch(e){let t=e instanceof Error?e.message:`Failed to load git worktrees`;return{ok:!1,repoRoot:null,worktrees:[],error:B(t)?null:t}}}var U={available:!1,loading:!1,error:null,repoRoot:null,worktrees:[]};function Te(e){let{folderPanelRoot:t,repoRoot:n,enabled:r,refreshToken:i}=e,[a,o]=(0,c.useState)(0),[s,l]=(0,c.useState)(U),u=(0,c.useCallback)(()=>o(e=>e+1),[]);return(0,c.useEffect)(()=>{if(!r||t===null){l(U);return}let e=!1;return l(e=>({...e,loading:!0,error:null})),(async()=>{let r=await H(t,n??void 0);e||l({available:r.ok&&r.worktrees.length>0,loading:!1,error:r.error,repoRoot:r.repoRoot,worktrees:r.worktrees})})(),()=>{e=!0}},[r,t,a,i,n]),(0,c.useMemo)(()=>({...s,refresh:u}),[u,s])}function Ee(e=1600){let[t,n]=(0,c.useState)(!1),r=(0,c.useRef)(null),i=(0,c.useCallback)(()=>{r.current!==null&&window.clearTimeout(r.current),r.current=null,n(!1)},[]),a=(0,c.useCallback)(()=>{r.current!==null&&window.clearTimeout(r.current),n(!0),r.current=window.setTimeout(()=>{r.current=null,n(!1)},e)},[e]);return(0,c.useEffect)(()=>()=>i(),[i]),{folderChordActive:t,startFolderChord:a,cancelFolderChord:i}}function De(e){let t=e.onPreviewFile,[n,r]=(0,c.useState)(()=>e.initialSelection??A),i=(0,c.useMemo)(()=>he(e.entries,e.childrenCache,e.expanded),[e.childrenCache,e.entries,e.expanded]),a=(0,c.useMemo)(()=>i.map(e=>e.path),[i]),o=(0,c.useMemo)(()=>new Set(n.selectedPaths),[n.selectedPaths]),s=(0,c.useMemo)(()=>ve(i,o),[o,i]),l=n.focusedPath??s[0]?.path??null,u=i.find(e=>e.path===l)??s[0]??null;return(0,c.useEffect)(()=>{r(e=>ge(e,a))},[a]),{selection:n,visibleEntries:i,visiblePaths:a,selectedPaths:o,selectedPath:l,selectedEntries:s,selectedEntry:u,selectEntry:(0,c.useCallback)((e,n={})=>{r(t=>_e(t,e.path,a,n)),e.kind===`file`&&n.preview!==!1&&t?.(e.path)},[t,a]),selectOnlyPath:(0,c.useCallback)(e=>{r(e&&a.includes(e)?{selectedPaths:[e],focusedPath:e,anchorPath:e}:A)},[a]),resetSelection:(0,c.useCallback)(()=>{r(A)},[]),moveKeyboardSelection:(0,c.useCallback)((e,t)=>{r(n=>j(n,a,e,t))},[a]),getDragSelectionFor:(0,c.useCallback)(e=>o.has(e.path)?{primaryEntry:e,entries:s}:{primaryEntry:e,entries:[e]},[s,o])}}var W=120,Oe=80;function ke(e){return e===`watch`?`Updated from file changes`:e===`move`?`Updated after move`:e===`mutation`?`Updated after file change`:e===`git-operation`?`Updated after git operation`:e===`worktree-switch`?`Updated worktree`:e===`root`?`Updated folder root`:`Updated folder`}function Ae(e){let{rootPath:t,expanded:n,source:r,loadDir:i,loadChildren:a,bumpGitRefresh:o,onGitRefresh:s,refreshWorktrees:l}=e,[u,d]=(0,c.useState)(null),[f,p]=(0,c.useState)(null),[m,h]=(0,c.useState)(!1),g=(0,c.useRef)(!1),_=(0,c.useRef)(null),v=(0,c.useRef)(null),y=(0,c.useRef)(async()=>void 0),b=(0,c.useRef)(!0);(0,c.useEffect)(()=>(b.current=!0,()=>{b.current=!1}),[]);let x=(0,c.useCallback)(()=>{v.current!==null&&(window.clearTimeout(v.current),v.current=null)},[]),S=(0,c.useCallback)(async(e,r={})=>{if(t!==null){if(g.current){let t=_.current;_.current=t?{reason:e,options:{extraPaths:Array.from(new Set([...t.options.extraPaths??[],...r.extraPaths??[]]))}}:{reason:e,options:r};return}g.current=!0,b.current&&(h(!0),d(e===`watch`?`Refreshing changed files...`:`Refreshing folder...`));try{let c=Array.from(new Set([...Array.from(n),...r.extraPaths??[]])).slice(0,Oe);await i(t);for(let e of c)await a(e,{force:!0});if(o(),s?.(),l(),!b.current)return;let u=Math.max(0,n.size-c.length);d(u>0?`${ke(e)}; ${u} collapsed/overflow branches skipped`:ke(e))}finally{g.current=!1,b.current&&h(!1);let e=_.current;_.current=null,e&&b.current&&y.current(e.reason,e.options)}}},[o,n,a,i,s,l,t]),C=(0,c.useCallback)(async(e=`manual`,t={})=>{await S(e,t)},[S]);(0,c.useEffect)(()=>{y.current=S},[S]);let w=(0,c.useCallback)(()=>{x(),v.current=window.setTimeout(()=>{v.current=null,y.current(`watch`)},W)},[x]);return(0,c.useEffect)(()=>{if(!r.watchDir||!r.onDirChange||t===null)return;let e=!1;(async()=>{let n=await r.watchDir?.(t);e||(n&&!n.ok?p(`Watch disabled: ${n.error??`failed to watch directory`}`):p(null))})();let n=r.onDirChange(()=>{w()});return()=>{e=!0,x(),n(),r.unwatchDir?.(t)}},[x,t,w,r]),{isRefreshing:m,refreshStatus:u,watchStatus:f,refreshVisibleTree:C}}function je(e){let{selectedFilePath:t,rootPath:n,selectedPath:r,visiblePaths:i,selectOnlyPath:a}=e,o=(0,c.useRef)(null);(0,c.useEffect)(()=>{let e=t??null,s=e!==o.current;s&&(o.current=e),!(!s&&r)&&(!e||!n||k(n,e)&&e!==r&&i.includes(e)&&a(e))},[n,a,t,r,i])}var Me=8,Ne=0;function G(){return Ne+=1,`folder-git-op-${Date.now()}-${Ne}`}function K(e){return/dirty|uncommitted|confirmation required|not registered|outside home|symlink/i.test(e)}function q(e,t){return{id:G(),operation:e,startedAt:new Date().toISOString(),finishedAt:null,operationLabel:t?.label??e.type,commandPreview:t?.command??[],status:`running`,stdout:``,stderr:``,error:null}}function J(e,t){return[t,...e].slice(0,Me)}function Y(e,t,n){return e.map(e=>e.id===t?n.ok?{...e,finishedAt:new Date().toISOString(),status:`succeeded`,stdout:n.stdout,error:null}:{...e,finishedAt:new Date().toISOString(),status:K(n.error)?`blocked`:`failed`,error:n.error}:e)}function Pe(e){let{rootPath:t,source:n,worktreeState:r,openFolderRoot:i,refreshVisibleTree:o,bumpGitRefresh:s,setActionStatus:l,setError:u}=e,[d,f]=(0,c.useState)(!1),[p,m]=(0,c.useState)(!1),[h,g]=(0,c.useState)([]);return{open:d,setOpen:f,busy:p,history:h,openWorktreeRoot:(0,c.useCallback)(async e=>{await i(e,{registerGitWorktree:!0,repoRoot:r.repoRoot})},[i,r.repoRoot]),copyWorktreePath:(0,c.useCallback)(async e=>{let t=await a(e);t.ok?(l(`Copied worktree path`),u(null)):u(t.error??`Failed to copy worktree path`)},[l,u]),revealWorktreePath:(0,c.useCallback)(async e=>{if(!(!t||!n.registerGitWorktreeRoot||!n.revealPath))try{await n.registerGitWorktreeRoot(t,r.repoRoot??void 0,e),await n.revealPath(e),l(`Opened worktree in Finder`),u(null)}catch(e){u(e.message)}},[t,l,u,n,r.repoRoot]),runWorktreeOperation:(0,c.useCallback)(async(e,n)=>{if(!t)return;let i=q(e,n),a=!1;g(e=>J(e,i)),m(!0);try{let n=await w({folderPanelRoot:t,repoRoot:r.repoRoot,operation:e,confirmed:!0});if(!n.ok){let e=n.error??`Git operation failed`;throw g(t=>Y(t,i.id,{ok:!1,error:e})),a=!0,Error(e)}g(e=>Y(e,i.id,{ok:!0,stdout:n.stdout})),a=!0,l(n.preview?.label??`Git worktree operation completed`),u(null),f(!1),r.refresh(),s(),await o(`git-operation`)}catch(e){let t=e.message;a||g(e=>Y(e,i.id,{ok:!1,error:t})),u(t)}finally{m(!1)}},[s,o,t,l,u,r])}}function Fe(e){let[t,n]=(0,c.useState)(null),[r,i]=(0,c.useState)(!1),a=(0,c.useCallback)(()=>e.rootPath?e.selectedEntry?e.selectedEntry.kind===`directory`?e.selectedEntry.path:ne(e.selectedEntry.path):e.rootPath:null,[e.rootPath,e.selectedEntry]),o=(0,c.useCallback)(t=>{let r=a();r&&(t===`file`&&!e.source.createFile||t===`directory`&&!e.source.createFolder||(e.setExpanded(e=>new Set(e).add(r)),n({kind:t,parentDirectory:r,initialName:t===`file`?`untitled.txt`:`untitled`}),e.closeContextMenu()))},[e,a]),s=(0,c.useCallback)(async(t,r,a)=>{let o=t===`file`?e.source.createFile:e.source.createFolder;if(!o)return;let s=t===`file`?`New file name`:`New folder name`;if(!a.trim()){e.setError(`${s} required`);return}i(!0);try{let i=(await o(r,a.trim())).entry;t===`directory`&&e.selectedEntry?.path===r&&e.setExpanded(e=>new Set(e).add(r)),e.setActionStatus(t===`file`?`Created file`:`Created folder`),e.setError(null),n(null),await e.refreshAfterMutation(r,i?.path??null)}catch(t){e.setError(t.message)}finally{i(!1)}},[e]),l=(0,c.useCallback)(()=>{!e.selectedEntry||!e.source.renamePath||(n({kind:`rename`,parentDirectory:ne(e.selectedEntry.path),targetPath:e.selectedEntry.path,initialName:e.selectedEntry.name}),e.closeContextMenu())},[e]),u=(0,c.useCallback)(async(t,r)=>{if(!t.targetPath||!e.source.renamePath)return;let a=r.trim();if(!a||a===t.initialName){n(null);return}i(!0);try{let r=await e.source.renamePath(t.targetPath,a),i=t.parentDirectory,o=r.entry?.path??null,s=o?e.renamedPreviewPath(e.selectedFilePath,t.targetPath,o):null;e.setActionStatus(`Renamed`),e.setError(null),n(null),await e.refreshAfterMutation(i,o,[t.targetPath]),s&&e.onPreviewFile?.(s)}catch(t){e.setError(t.message)}finally{i(!1)}},[e]);return{inlineMutation:t,isMutating:r,requestCreateEntry:o,requestRenameSelectedEntry:l,submitInlineMutation:(0,c.useCallback)(e=>{t&&(t.kind===`rename`?u(t,e):s(t.kind,t.parentDirectory,e))},[t,s,u]),cancelInlineMutation:()=>n(null)}}function Ie(e){let[t,n]=(0,c.useState)(null),r=(0,c.useCallback)(()=>n(null),[]),i=(0,c.useCallback)((t,r,i)=>{e.selectedPaths.has(t.path)||e.selectOnlyPath(t.path),n({entry:t,x:r,y:i})},[e]);return(0,c.useEffect)(()=>{if(!t)return;let e=e=>{e.key===`Escape`&&n(null)},i=()=>{document.activeElement instanceof HTMLIFrameElement&&n(null)};return window.addEventListener(`pointerdown`,r),window.addEventListener(`keydown`,e),window.addEventListener(`blur`,i),()=>{window.removeEventListener(`pointerdown`,r),window.removeEventListener(`keydown`,e),window.removeEventListener(`blur`,i)}},[r,t]),{contextMenu:t,closeContextMenu:r,openContextMenu:i}}function Le(){return i()?.folder??null}function Re(e,t,n){return!e||!k(t,e)?null:e===t?n:`${n}${e.slice(t.length)}`}function ze(e){let t=Le(),n=e.repoRootPath??null,r=e.gitRefreshVersion??0,i=e.onGitRefresh,o=e.onRepoRootChange,s=(0,c.useRef)(!1),l=(0,c.useMemo)(()=>t?d(t):f(e.notesTree??[],e.notesRoot??null),[t,e.notesRoot,e.notesTree]),u=(0,c.useMemo)(()=>xe(e.sessionState??null,e.externalRootPath??null),[e.externalRootPath,e.sessionState]),[h,g]=(0,c.useState)(()=>u?.rootPath??null),[v,y]=(0,c.useState)(()=>u?.entries??[]),[b,S]=(0,c.useState)(()=>new Set(u?.expandedPaths??[])),[C,w]=(0,c.useState)(()=>u?be(u.childrenCache):new Map),[T,E]=(0,c.useState)(null),[ee,D]=(0,c.useState)(null),[te,ae]=(0,c.useState)(null),[oe,se]=(0,c.useState)(null),[ce,le]=(0,c.useState)(null),[de,fe]=(0,c.useState)(!1),[pe,A]=(0,c.useState)(!1),[he,ge]=(0,c.useState)(!1),[_e,j]=(0,c.useState)(null),[ve,M]=(0,c.useState)(0),ye=(0,c.useRef)(null),N=(0,c.useRef)(null),{folderChordActive:P,startFolderChord:F,cancelFolderChord:I}=Ee(),L=e.onPreviewFile,Ce=e.selectedFilePath,R=De({entries:v,childrenCache:C,expanded:b,initialSelection:u?.selection,onPreviewFile:L}),z=R.selectedEntry,B=R.selectedEntries,V=Ie({selectedPaths:R.selectedPaths,selectOnlyPath:R.selectOnlyPath});je({selectedFilePath:e.selectedFilePath,rootPath:h,selectedPath:R.selectedPath,visiblePaths:R.visiblePaths,selectOnlyPath:R.selectOnlyPath}),(0,c.useEffect)(()=>{e.onSessionStateChange?.(Se({rootPath:h,entries:v,expanded:b,childrenCache:C,selection:R.selection}))},[C,v,b,R.selection,e.onSessionStateChange,h]);let H=(0,c.useCallback)(async e=>{try{return y(await l.listDir(e)),E(null),D(t=>t?.path===e?null:t),{ok:!0}}catch(e){let t=e.message;return E(t),{ok:!1,error:t}}},[l]),U=(0,c.useCallback)(async(t,n={})=>{try{let r=t;if(n.registerGitWorktree){if(!h)throw Error(`Current folder root required`);await l.registerGitWorktreeRoot?.(h,n.repoRoot??void 0,t)}else l.authorizeRoot&&(r=await l.authorizeRoot(t));h&&l.unwatchDir&&l.unwatchDir(h),e.onRootChange?.(r),g(r),S(new Set),w(new Map),y([]),R.resetSelection(),E(null),D(null);let i=await H(r);i.ok||D({path:r,error:i.error}),M(e=>e+1)}catch(e){E(e.message)}},[R,H,e,h,l]),W=(0,c.useCallback)(async(e,t={})=>{if(!(!t.force&&C.has(e)))try{let t=await l.listDir(e);w(n=>new Map(n).set(e,t))}catch(e){E(e.message)}},[C,l]),Oe=(0,c.useCallback)(()=>{M(e=>e+1)},[]),ke=(0,c.useCallback)(e=>{S(t=>{let n=new Set(t);return n.has(e)?n.delete(e):(n.add(e),W(e)),n})},[W]),Me=(0,c.useCallback)(async()=>{if(l.pickRoot)try{let e=await l.pickRoot();e&&await U(e)}catch(e){E(e.message)}},[U,l]),Ne=(0,c.useCallback)(()=>{e.onRootChange?.(null),g(null),y([]),R.resetSelection(),D(null),E(null)},[R,e]);(0,c.useEffect)(()=>{if(s.current||h!==null||e.externalRootPath)return;let t=!1;return(async()=>{let e=await l.getInitialRoot();t||(s.current=!0,g(e),e!==null&&await H(e))})(),()=>{t=!0}},[H,e.externalRootPath,h,l]),(0,c.useEffect)(()=>{let t=e.externalRootPath;if(t){if(t===h){if(v.length>0||N.current===t)return;N.current=t}else N.current=null;U(t)}},[v.length,U,e.externalRootPath,h]);let G=we({rootPath:h,enabled:l.kind===`electron-folder`,refreshToken:ve+r}),K=Te({folderPanelRoot:h,repoRoot:G.repoRoot??n,enabled:l.kind===`electron-folder`&&G.available,refreshToken:ve+r}),q=Ae({rootPath:h,expanded:b,source:l,loadDir:H,loadChildren:W,bumpGitRefresh:Oe,onGitRefresh:i,refreshWorktrees:K.refresh}),J=q.refreshVisibleTree,Y=Pe({rootPath:h,source:l,worktreeState:K,openFolderRoot:U,refreshVisibleTree:J,bumpGitRefresh:Oe,setActionStatus:j,setError:E});(0,c.useEffect)(()=>{G.repoRoot&&G.repoRoot!==n&&o?.(G.repoRoot)},[G.repoRoot,o,n]);let ze=l.kind===`electron-folder`,Be=!!(l.createFile&&l.createFolder&&l.renamePath),Ve=(0,c.useCallback)(async(e,t)=>{if(!h)return;let n=ne(e);w(e=>ie(e,[n,t])),await J(`move`,{extraPaths:[n,t]})},[J,h]),He=(0,c.useCallback)(async(e,t,n=[])=>{h&&(w(t=>ie(t,[e,...n])),await J(`mutation`,{extraPaths:[e]}),t&&R.selectOnlyPath(t))},[R,J,h]),Ue=(0,c.useCallback)(async e=>{if(l.movePath){fe(!0);try{let t=(await l.movePath(e.source.path,e.target.path)).moved?.to??e.source.path;R.selectOnlyPath(t),j(`Moved ${e.source.name}`),le(null),await Ve(e.source.path,e.target.path)}catch(e){E(e.message)}finally{fe(!1)}}},[R,Ve,l]),We=(0,c.useCallback)((e,t)=>{if(!l.movePath||e.path===t.path||e.kind===`directory`&&k(e.path,t.path))return;let n={source:e,target:t};if(pe){Ue(n);return}ge(!1),le(n)},[Ue,pe,l.movePath]),X=Fe({rootPath:h,selectedEntry:z,selectedFilePath:Ce,source:l,folderSelection:R,refreshAfterMutation:He,renamedPreviewPath:Re,onPreviewFile:L,closeContextMenu:V.closeContextMenu,setExpanded:S,setActionStatus:j,setError:E}),Z=(0,c.useCallback)((e,t)=>{R.selectEntry(e,t),V.closeContextMenu()},[V,R]),Ge=(0,c.useCallback)(e=>{e.kind===`file`&&Z(e)},[Z]),Q=(0,c.useCallback)(e=>{R.selectEntry(e,{preview:!1}),V.closeContextMenu(),e.kind===`directory`&&ke(e.path)},[V,R,ke]),Ke=(0,c.useCallback)(async(e,t)=>{let n=await a(t===`relative`?re(h,e.path):e.path);n.ok?(R.selectOnlyPath(e.path),j(t===`relative`?`Copied relative path`:`Copied path`),E(null)):E(n.error??`Failed to copy path`)},[R,h]),qe=(0,c.useCallback)(async e=>{if(l.revealPath)try{await l.revealPath(e.path),R.selectOnlyPath(e.path),j(e.kind===`directory`?`Opened folder in Finder`:`Revealed file in Finder`),E(null)}catch(e){E(e.message)}},[R,l]),$=(0,c.useCallback)(async e=>{if(B.length===0)return;let t=await a(B.map(t=>e===`relative`?re(h,t.path):t.path).join(`
3
3
  `));t.ok?(j(e===`relative`?`Copied relative paths`:`Copied paths`),E(null)):E(t.error??`Failed to copy paths`)},[h,B]),Je=(0,c.useCallback)(async()=>{z&&await qe(z)},[qe,z]),Ye=(0,c.useCallback)((e,t)=>{if(e.key===`ArrowUp`||e.key===`ArrowDown`){e.preventDefault(),e.stopPropagation(),R.moveKeyboardSelection(e.key===`ArrowDown`?`down`:`up`,e.shiftKey);return}if(e.key===`ArrowRight`){e.preventDefault(),t.kind===`directory`&&!b.has(t.path)&&Q(t);return}if(e.key===`ArrowLeft`){e.preventDefault(),t.kind===`directory`&&b.has(t.path)&&Q(t);return}let n=ue(e,{chordActive:P});if(n){e.preventDefault(),e.stopPropagation(),n===`start-chord`&&F(),n===`cancel-chord`&&I();let r=R.selectedPaths.has(t.path);n===`copy-path`&&(I(),r?$(`absolute`):Ke(t,`absolute`)),n===`copy-relative-path`&&(I(),r?$(`relative`):Ke(t,`relative`)),n===`reveal-path`&&(I(),r?Je():qe(t));return}if(e.key===`Enter`){e.preventDefault(),t.kind===`directory`?Q(t):Z(t);return}e.key===` `&&(e.preventDefault(),Z(t))},[I,Ke,$,b,P,R,qe,Je,Z,F,Q]);return(0,c.useEffect)(()=>{let e=R.selection.focusedPath;if(!e)return;let t=ye.current?.querySelectorAll(`.folder-entry-btn[data-folder-path]`);Array.from(t??[]).find(t=>t.dataset.folderPath===e)?.focus()},[R.selection.focusedPath]),(0,p.jsxs)(`div`,{className:`folder-panel`,children:[(0,p.jsx)(x,{canPickRoot:l.canPickRoot,label:l.label,rootPath:h,onPickFolder:()=>void Me(),onRefresh:()=>{h!==null&&J(`manual`)},gitSummary:l.kind===`electron-folder`?G:void 0,worktreeSummary:l.kind===`electron-folder`?K:void 0,onOpenWorktree:e=>void Y.openWorktreeRoot(e),onCopyWorktreePath:e=>void Y.copyWorktreePath(e),onRevealWorktreePath:e=>void Y.revealWorktreePath(e),onOpenWorktreeOps:()=>Y.setOpen(!0)}),h!==null&&(0,p.jsx)(m,{hasSelection:!!z,canReveal:!!l.revealPath,onCopyPath:()=>void $(`absolute`),onCopyRelativePath:()=>void $(`relative`),onReveal:()=>void Je(),canMutate:Be,onCreateFile:()=>X.requestCreateEntry(`file`),onCreateFolder:()=>X.requestCreateEntry(`directory`),onRename:()=>X.requestRenameSelectedEntry()}),T&&(0,p.jsx)(`div`,{className:`folder-error`,children:T}),q.watchStatus&&!T&&(0,p.jsx)(`div`,{className:`folder-status`,children:q.watchStatus}),q.refreshStatus&&!T&&!q.watchStatus&&(0,p.jsx)(`div`,{className:`folder-status`,children:q.refreshStatus}),_e&&!T&&!q.refreshStatus&&!q.watchStatus&&(0,p.jsx)(`div`,{className:`folder-status`,children:_e}),P&&(0,p.jsx)(`div`,{className:`folder-shortcut-hint`,children:`Folder shortcut: press P to copy path or R to reveal`}),Y.open&&h!==null&&(0,p.jsx)(O,{folderPanelRoot:h,repoRoot:K.repoRoot,worktrees:K.worktrees,busy:Y.busy,history:Y.history,onRun:(e,t)=>void Y.runWorktreeOperation(e,t),onClose:()=>Y.setOpen(!1)}),(0,p.jsx)(me,{treeRef:ye,rootPath:h,error:T,entries:v,expanded:b,childrenCache:C,folderSelection:R,decorationsByPath:G.decorationsByPath,dropTargetPath:oe,dragSelection:te,inlineMutation:X.inlineMutation,isMutating:X.isMutating,canUseNativeActions:ze,sourceKind:l.kind,unavailableRoot:ee,setDragSelection:ae,setDropTargetPath:se,requestMove:We,handleEntryKeyDown:Ye,selectEntry:Z,toggleEntryExpansion:Q,openFileEntry:Ge,openContextMenu:V.openContextMenu,submitInlineMutation:X.submitInlineMutation,cancelInlineMutation:X.cancelInlineMutation,onPickFolder:()=>void Me(),onClearUnavailableRoot:Ne}),(0,p.jsx)(_,{pendingMove:ce,contextMenu:V.contextMenu,isMoving:de,skipMoveConfirmChecked:he,canReveal:!!l.revealPath,canRefresh:!!h,canMutate:Be,onSkipMoveConfirmCheckedChange:ge,onCancelMove:()=>le(null),onConfirmMove:()=>{ce&&(he&&A(!0),Ue(ce))},onCopyContextPath:()=>{V.closeContextMenu(),$(`absolute`)},onCopyContextRelativePath:()=>{V.closeContextMenu(),$(`relative`)},onRevealContextPath:()=>{V.closeContextMenu(),Je()},onRefreshContext:()=>{V.closeContextMenu(),J(`manual`)},onCreateContextFile:()=>X.requestCreateEntry(`file`),onCreateContextFolder:()=>X.requestCreateEntry(`directory`),onRenameContextPath:()=>X.requestRenameSelectedEntry()})]})}export{ze as FolderPanel};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{A as t}from"./vendor-render-DCb9B75Q.js";import{n,t as r}from"./jsx-runtime-gFMgZ0TQ.js";import{t as i}from"./copy-text-BDs2wKjA.js";import{n as a,t as o}from"./w3c-keyname-a_sRwNLm.js";import{E as s,O as c,S as l,T as u,_ as d,a as f,d as p,g as m,h,i as g,k as _,l as v,m as y,o as b,p as x,t as S,u as ee,v as te,w as ne,y as re}from"./wiki-link-resolver-DyFzBTIQ.js";import{n as C,o as ie,r as ae,s as oe,t as se}from"./wiki-link-suggestions-DZQc78gj.js";import{M as ce}from"./vendor-utils-DJY0EWnQ.js";var le={}.hasOwnProperty;function ue(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&le.call(t,e)){let n=String(t[e]);i=le.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var de={}.hasOwnProperty;function fe(e,t){let n=-1,r;if(t.extensions)for(;++n<t.extensions.length;)fe(e,t.extensions[n]);for(r in t)if(de.call(t,r))switch(r){case`extensions`:break;case`unsafe`:pe(e[r],t[r]);break;case`join`:pe(e[r],t[r]);break;case`handlers`:me(e[r],t[r]);break;default:e.options[r]=t[r]}return e}function pe(e,t){t&&e.push(...t)}function me(e,t){t&&Object.assign(e,t)}var he=[ge];function ge(e,t,n,r){if(t.type===`code`&&te(t,r)&&(e.type===`list`||e.type===t.type&&te(e,r)))return!1;if(`spread`in n&&typeof n.spread==`boolean`)return e.type===`paragraph`&&(e.type===t.type||t.type===`definition`||t.type===`heading`&&m(t,r))?void 0:+!!n.spread}var _e=[`autolink`,`destinationLiteral`,`destinationRaw`,`reference`,`titleQuote`,`titleApostrophe`],ve=[{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`\r`,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:`
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{A as t}from"./vendor-render-DCb9B75Q.js";import{n,t as r}from"./jsx-runtime-gFMgZ0TQ.js";import{t as i}from"./copy-text-BDs2wKjA.js";import{n as a,t as o}from"./w3c-keyname-a_sRwNLm.js";import{E as s,O as c,S as l,T as u,_ as d,a as f,d as p,g as m,h,i as g,k as _,l as v,m as y,o as b,p as x,t as S,u as ee,v as te,w as ne,y as re}from"./wiki-link-resolver-DyFzBTIQ.js";import{n as C,o as ie,r as ae,s as oe,t as se}from"./wiki-link-suggestions-Dp6kBQVu.js";import{M as ce}from"./vendor-utils-DJY0EWnQ.js";var le={}.hasOwnProperty;function ue(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&le.call(t,e)){let n=String(t[e]);i=le.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var de={}.hasOwnProperty;function fe(e,t){let n=-1,r;if(t.extensions)for(;++n<t.extensions.length;)fe(e,t.extensions[n]);for(r in t)if(de.call(t,r))switch(r){case`extensions`:break;case`unsafe`:pe(e[r],t[r]);break;case`join`:pe(e[r],t[r]);break;case`handlers`:me(e[r],t[r]);break;default:e.options[r]=t[r]}return e}function pe(e,t){t&&e.push(...t)}function me(e,t){t&&Object.assign(e,t)}var he=[ge];function ge(e,t,n,r){if(t.type===`code`&&te(t,r)&&(e.type===`list`||e.type===t.type&&te(e,r)))return!1;if(`spread`in n&&typeof n.spread==`boolean`)return e.type===`paragraph`&&(e.type===t.type||t.type===`definition`||t.type===`heading`&&m(t,r))?void 0:+!!n.spread}var _e=[`autolink`,`destinationLiteral`,`destinationRaw`,`reference`,`titleQuote`,`titleApostrophe`],ve=[{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`\r`,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:`
2
2
  `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`!`,after:`\\[`,inConstruct:`phrasing`,notInConstruct:_e},{character:`"`,inConstruct:`titleQuote`},{atBreak:!0,character:`#`},{character:`#`,inConstruct:`headingAtx`,after:`(?:[\r
3
3
  ]|$)`},{character:`&`,after:`[#A-Za-z]`,inConstruct:`phrasing`},{character:`'`,inConstruct:`titleApostrophe`},{character:`(`,inConstruct:`destinationRaw`},{before:`\\]`,character:`(`,inConstruct:`phrasing`,notInConstruct:_e},{atBreak:!0,before:`\\d+`,character:`)`},{character:`)`,inConstruct:`destinationRaw`},{atBreak:!0,character:`*`,after:`(?:[ \r
4
4
  *])`},{character:`*`,inConstruct:`phrasing`,notInConstruct:_e},{atBreak:!0,character:`+`,after:`(?:[ \r
@@ -0,0 +1 @@
1
+ var e=class extends Error{status;code;constructor(e,t,n=null){super(e),this.name=`DashboardApiError`,this.status=t,this.code=n}};async function t(e=!1,t={}){let n=new URLSearchParams;e&&n.set(`showHidden`,`1`),t.fresh&&n.set(`fresh`,`1`);let r=n.toString(),i=r?`/api/dashboard/instances?${r}`:`/api/dashboard/instances`,a=await fetch(i);if(!a.ok)throw Error(`scan failed: ${a.status}`);return await a.json()}async function n(){let e=await fetch(`/api/dashboard/registry`);if(!e.ok)throw Error(`registry load failed: ${e.status}`);return await e.json()}async function r(e){let t=await fetch(`/api/dashboard/registry`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(`registry save failed: ${t.status}`);return await t.json()}async function i(e,t,n){let r=await fetch(`/api/dashboard/lifecycle/${e}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({port:t,...n?.trim()?{home:n.trim()}:{}})}),i=await r.json();if(!r.ok||!i.ok)throw Error(i.message||`${e} failed: ${r.status}`);return i}async function a(){let e=await fetch(`/api/dashboard/process-control`);if(!e.ok)throw Error(`process control fetch failed: ${e.status}`);return(await e.json()).state}async function o(){let e=await fetch(`/api/dashboard/process-control/adopt`,{method:`POST`});if(!e.ok)throw Error(`adopt managed failed: ${e.status}`);return(await e.json()).state}async function s(){let e=await fetch(`/api/dashboard/process-control/stop-managed`,{method:`POST`});if(!e.ok)throw Error(`stop managed failed: ${e.status}`);return(await e.json()).state}async function c(e,t={}){let n={};t.signal!==void 0&&(n.signal=t.signal);let r=await fetch(`/api/dashboard/instances/${e}`,n);if(!r.ok)throw Error(`status fetch failed: ${r.status}`);return(await r.json()).instance}async function l(e){let t=await fetch(`/api/dashboard/instances/${e}/project/pick`,{method:`POST`}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`project pick failed: ${t.status}`);return n.data??n}async function u(e,t,n){let r=await fetch(`/api/dashboard/instances/${e}/message`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n?{prompt:t,sessionId:n}:{prompt:t})}),i=await r.json().catch(()=>({}));return{ok:r.ok,status:r.status,data:i}}async function d(e=null){let t=e?`/api/manager/events?since=${encodeURIComponent(e)}`:`/api/manager/events`,n=await fetch(t);if(!n.ok)throw Error(`events fetch failed: ${n.status}`);return(await n.json()).events}async function f(t,n){let r=await t.text(),i=null;if(r.trim())try{i=JSON.parse(r)}catch{throw new e(`${n}: response was not JSON`,t.status,`invalid_json`)}if(!t.ok){let r=typeof i==`object`&&i&&`error`in i?String(i.error):n,a=typeof i==`object`&&i&&`code`in i&&typeof i.code==`string`?i.code:null;throw new e(r||n,t.status,a)}return i}async function p(){let e=await fetch(`/api/dashboard/notes/info`);return await f(e,`notes info fetch failed: ${e.status}`)}async function m(){let e=await fetch(`/api/dashboard/notes/version`);return(await f(e,`notes version fetch failed: ${e.status}`)).version}async function h(){let e=await fetch(`/api/dashboard/notes/tree`);return await f(e,`notes tree fetch failed: ${e.status}`)}async function g(){let e=await fetch(`/api/dashboard/notes/templates`);return await f(e,`note templates fetch failed: ${e.status}`)}async function _(e){let t=await fetch(`/api/dashboard/notes/template?name=${encodeURIComponent(e)}`);return await f(t,`note template fetch failed: ${t.status}`)}async function v(){let e=await fetch(`/api/dashboard/notes/snippets`);return await f(e,`note snippets fetch failed: ${e.status}`)}async function y(t){let n=await fetch(`/api/dashboard/notes/snippets/file?name=${encodeURIComponent(t)}`);if(!n.ok)throw new e(`snippet fetch failed: ${n.status}`,n.status);return await n.text()}async function b(t,n){let r=await fetch(`/api/dashboard/notes/snippets/toggle`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t,enabled:n})});if(!r.ok)throw new e(`snippet toggle failed: ${r.status}`,r.status)}async function x(t){let n=await fetch(`/api/dashboard/notes/theme`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({theme:t})});if(!n.ok)throw new e(`theme set failed: ${n.status}`,n.status)}async function S(){let e=await fetch(`/api/dashboard/notes/index`);return await f(e,`notes index fetch failed: ${e.status}`)}async function C(e,t={}){let n=new URLSearchParams({q:e});t.limit!==void 0&&n.set(`limit`,String(t.limit)),t.regex&&n.set(`regex`,`true`);let r={};t.signal&&(r.signal=t.signal);let i=await fetch(`/api/dashboard/notes/search?${n}`,r);return await f(i,`notes search failed: ${i.status}`)}async function w(e){let t=await fetch(`/api/dashboard/notes/file?path=${encodeURIComponent(e)}`);return await f(t,`note fetch failed: ${t.status}`)}async function T(e,t=``){let n=await fetch(`/api/dashboard/notes/file`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:e,content:t})});return await f(n,`note create failed: ${n.status}`)}async function E(e){let t=await fetch(`/api/dashboard/notes/file`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});return await f(t,`note save failed: ${t.status}`)}function D(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n){let i=e.subarray(r,r+n);t+=String.fromCharCode(...i)}return btoa(t)}async function O(e,t){let n=new Uint8Array(await t.arrayBuffer()),r=await fetch(`/api/dashboard/notes/asset`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({notePath:e,mime:t.type,dataBase64:D(n)})});return await f(r,`note asset upload failed: ${r.status}`)}async function k(e,t){let n=await fetch(`/api/dashboard/notes/asset/remote`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({notePath:e,url:t})});return await f(n,`remote note asset upload failed: ${n.status}`)}async function A(e){let t=await fetch(`/api/dashboard/notes/folder`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:e})});return await f(t,`note folder create failed: ${t.status}`)}async function j(e,t){let n=await fetch(`/api/dashboard/notes/rename`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({from:e,to:t})});return await f(n,`note rename failed: ${n.status}`)}async function M(e,t=`file`){let n=await fetch(`/api/dashboard/notes/trash`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:e,kind:t})});return await f(n,`note trash failed: ${n.status}`)}export{O as A,E as C,s as D,x as E,b as O,i as S,u as T,a as _,c as a,l as b,w as c,_ as d,g as f,m as g,h,A as i,k as j,M as k,y as l,p as m,o as n,t as o,S as p,T as r,d as s,e as t,v as u,n as v,C as w,j as x,r as y};