cli-jaw 2.2.19 → 2.2.21

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 (440) hide show
  1. package/README.md +97 -3
  2. package/dist/bin/commands/dispatch.js +62 -16
  3. package/dist/bin/commands/dispatch.js.map +1 -1
  4. package/dist/server.js +14 -0
  5. package/dist/server.js.map +1 -1
  6. package/dist/src/agent/spawn/process-kill.js +96 -2
  7. package/dist/src/agent/spawn/process-kill.js.map +1 -1
  8. package/dist/src/agent/spawn.js +34 -65
  9. package/dist/src/agent/spawn.js.map +1 -1
  10. package/dist/src/bgtask/runner.js +26 -21
  11. package/dist/src/bgtask/runner.js.map +1 -1
  12. package/dist/src/cli/acp-client.js +11 -5
  13. package/dist/src/cli/acp-client.js.map +1 -1
  14. package/dist/src/cli/cli-status-worker.js +22 -3
  15. package/dist/src/cli/cli-status-worker.js.map +1 -1
  16. package/dist/src/cli/cli-status.js +7 -1
  17. package/dist/src/cli/cli-status.js.map +1 -1
  18. package/dist/src/cli/employee-handler.js +3 -2
  19. package/dist/src/cli/employee-handler.js.map +1 -1
  20. package/dist/src/cli/handlers.js +1 -0
  21. package/dist/src/cli/handlers.js.map +1 -1
  22. package/dist/src/code-mode/acp-host.js +22 -10
  23. package/dist/src/code-mode/acp-host.js.map +1 -1
  24. package/dist/src/core/config.js +23 -0
  25. package/dist/src/core/config.js.map +1 -1
  26. package/dist/src/core/db.js +16 -0
  27. package/dist/src/core/db.js.map +1 -1
  28. package/dist/src/core/dispatch-approval-ingress.js +59 -0
  29. package/dist/src/core/dispatch-approval-ingress.js.map +1 -0
  30. package/dist/src/core/dispatch-approval.js +135 -0
  31. package/dist/src/core/dispatch-approval.js.map +1 -0
  32. package/dist/src/core/employees.js +22 -4
  33. package/dist/src/core/employees.js.map +1 -1
  34. package/dist/src/core/runtime-settings.js +27 -0
  35. package/dist/src/core/runtime-settings.js.map +1 -1
  36. package/dist/src/core/serve-log.js +66 -0
  37. package/dist/src/core/serve-log.js.map +1 -0
  38. package/dist/src/core/settings-merge.js +10 -1
  39. package/dist/src/core/settings-merge.js.map +1 -1
  40. package/dist/src/core/windows-shell.js +63 -0
  41. package/dist/src/core/windows-shell.js.map +1 -0
  42. package/dist/src/discord/bot.js +214 -147
  43. package/dist/src/discord/bot.js.map +1 -1
  44. package/dist/src/discord/gateway-supervisor.js +303 -0
  45. package/dist/src/discord/gateway-supervisor.js.map +1 -0
  46. package/dist/src/discord/rest-scheduler.js +448 -0
  47. package/dist/src/discord/rest-scheduler.js.map +1 -0
  48. package/dist/src/discord/send-only-client.js +90 -43
  49. package/dist/src/discord/send-only-client.js.map +1 -1
  50. package/dist/src/manager/lifecycle.js +7 -2
  51. package/dist/src/manager/lifecycle.js.map +1 -1
  52. package/dist/src/manager/notes/capabilities.js +9 -7
  53. package/dist/src/manager/notes/capabilities.js.map +1 -1
  54. package/dist/src/memory/bootstrap.js +5 -1
  55. package/dist/src/memory/bootstrap.js.map +1 -1
  56. package/dist/src/memory/host-toolchain.js +156 -0
  57. package/dist/src/memory/host-toolchain.js.map +1 -0
  58. package/dist/src/messaging/channel-capabilities.js +30 -0
  59. package/dist/src/messaging/channel-capabilities.js.map +1 -0
  60. package/dist/src/messaging/delivery-outcome.js +73 -0
  61. package/dist/src/messaging/delivery-outcome.js.map +1 -0
  62. package/dist/src/messaging/draft-stream.js +154 -0
  63. package/dist/src/messaging/draft-stream.js.map +1 -0
  64. package/dist/src/messaging/runtime.js +3 -9
  65. package/dist/src/messaging/runtime.js.map +1 -1
  66. package/dist/src/messaging/send.js +40 -8
  67. package/dist/src/messaging/send.js.map +1 -1
  68. package/dist/src/messaging/types.js +22 -1
  69. package/dist/src/messaging/types.js.map +1 -1
  70. package/dist/src/notes/search.js +6 -4
  71. package/dist/src/notes/search.js.map +1 -1
  72. package/dist/src/prompt/builder.js +110 -6
  73. package/dist/src/prompt/builder.js.map +1 -1
  74. package/dist/src/prompt/conversation-context.js +23 -0
  75. package/dist/src/prompt/conversation-context.js.map +1 -0
  76. package/dist/src/prompt/templates/a1-system.md +28 -12
  77. package/dist/src/prompt/templates/control-system.md +19 -6
  78. package/dist/src/prompt/templates/employee.md +16 -3
  79. package/dist/src/routes/orchestrate.js +83 -0
  80. package/dist/src/routes/orchestrate.js.map +1 -1
  81. package/dist/src/security/path-guards.js +157 -27
  82. package/dist/src/security/path-guards.js.map +1 -1
  83. package/dist/src/slack/api.js +38 -5
  84. package/dist/src/slack/api.js.map +1 -1
  85. package/dist/src/slack/bot.js +244 -37
  86. package/dist/src/slack/bot.js.map +1 -1
  87. package/dist/src/slack/context.js +192 -0
  88. package/dist/src/slack/context.js.map +1 -0
  89. package/dist/src/slack/conversation.js +275 -0
  90. package/dist/src/slack/conversation.js.map +1 -0
  91. package/dist/src/slack/enrichment-cache.js +334 -0
  92. package/dist/src/slack/enrichment-cache.js.map +1 -0
  93. package/dist/src/slack/history.js +47 -8
  94. package/dist/src/slack/history.js.map +1 -1
  95. package/dist/src/slack/identity.js +99 -190
  96. package/dist/src/slack/identity.js.map +1 -1
  97. package/dist/src/slack/ingress.js +91 -3
  98. package/dist/src/slack/ingress.js.map +1 -1
  99. package/dist/src/slack/progress.js +39 -51
  100. package/dist/src/slack/progress.js.map +1 -1
  101. package/dist/src/slack/thread-tracker.js +88 -0
  102. package/dist/src/slack/thread-tracker.js.map +1 -1
  103. package/dist/src/telegram/bot.js +127 -56
  104. package/dist/src/telegram/bot.js.map +1 -1
  105. package/dist/src/telegram/update-offset.js +152 -0
  106. package/dist/src/telegram/update-offset.js.map +1 -0
  107. package/package.json +1 -1
  108. package/public/dist/assets/{AdvancedExport-c41zCkwB.js → AdvancedExport-IOkupLFE.js} +1 -1
  109. package/public/dist/assets/Agent-DtgCvkB_.js +1 -0
  110. package/public/dist/assets/{Browser-B52Bdaeu.js → Browser-J4TPo4bX.js} +1 -1
  111. package/public/dist/assets/{BrowserPanel-Bh3JpkZO.js → BrowserPanel-C0aa2gja.js} +1 -1
  112. package/public/dist/assets/{ChannelsDiscord-D9FLnZso.js → ChannelsDiscord-D4fD-9hP.js} +1 -1
  113. package/public/dist/assets/{ChannelsSlack-CVNKtoo4.js → ChannelsSlack-_KBwRonM.js} +1 -1
  114. package/public/dist/assets/{ChannelsTelegram-BOCOPrBc.js → ChannelsTelegram-tihzSWVE.js} +1 -1
  115. package/public/dist/assets/{CodeCanvas-CbfPP7Ad.js → CodeCanvas-CaeLVtZi.js} +2 -2
  116. package/public/dist/assets/{DashboardEmbeddingSection-DMgHZQnn.js → DashboardEmbeddingSection-DiqlLiLj.js} +1 -1
  117. package/public/dist/assets/{DashboardMeta-DennaaA_.js → DashboardMeta-Dsj8kEuW.js} +1 -1
  118. package/public/dist/assets/{DesignPanel-DcL369nB.js → DesignPanel-B8CAf6sH.js} +1 -1
  119. package/public/dist/assets/{DiffPanel-B_ljObDk.js → DiffPanel-BTZRq6eG.js} +1 -1
  120. package/public/dist/assets/{Display-hGuSn_W5.js → Display-nkXitDjD.js} +1 -1
  121. package/public/dist/assets/{DocPanel-K8A2pm_1.js → DocPanel-ogNttSee.js} +1 -1
  122. package/public/dist/assets/{Employees-B5YXk5ma.js → Employees-CU_1YnrA.js} +1 -1
  123. package/public/dist/assets/{FolderPanel-CV52EzwG.js → FolderPanel-D0w_zD66.js} +1 -1
  124. package/public/dist/assets/{HealthBadge-megTlF4n.js → HealthBadge-CUaJ1PQH.js} +1 -1
  125. package/public/dist/assets/{Heartbeat-DDmZARWw.js → Heartbeat-BeAP2bMO.js} +1 -1
  126. package/public/dist/assets/{InlineWarn-DDzeHxQw.js → InlineWarn-D-fmcQXD.js} +1 -1
  127. package/public/dist/assets/MarkdownRenderer-B6HbiZ6i.js +1 -0
  128. package/public/dist/assets/{MarkdownRenderer-CXrilOsG.js → MarkdownRenderer-Cd3kkg_s.js} +2 -2
  129. package/public/dist/assets/{Mcp-BHWnJ6SP.js → Mcp-2HD1qR7F.js} +1 -1
  130. package/public/dist/assets/{Memory-CUbviW7N.js → Memory-frrIhLly.js} +1 -1
  131. package/public/dist/assets/{MilkdownWysiwygEditor-BKOCDI4Z.js → MilkdownWysiwygEditor-BkEzO5cz.js} +1 -1
  132. package/public/dist/assets/{ModelProvider-ngg8xTuB.js → ModelProvider-DqUvwyZ6.js} +1 -1
  133. package/public/dist/assets/{Network-AWpSkALD.js → Network-DfzqHi9q.js} +1 -1
  134. package/public/dist/assets/{NotesGraphWorkspace-Dm1xUFl8.js → NotesGraphWorkspace-BRIiraP9.js} +1 -1
  135. package/public/dist/assets/{PanelLayoutProvider-XpTo-i_s.js → PanelLayoutProvider-B9fYsunp.js} +1 -1
  136. package/public/dist/assets/Permissions-ByUy_5DT.js +1 -0
  137. package/public/dist/assets/{Permissions-CnKt44dN.js → Permissions-RgyF1O6q.js} +1 -1
  138. package/public/dist/assets/{Profile-DnIE2ios.js → Profile-DXKtAzfg.js} +1 -1
  139. package/public/dist/assets/{Prompts-B9aKLall.js → Prompts-C7njPWCu.js} +1 -1
  140. package/public/dist/assets/{SpeechKeys-K4Be_o7z.js → SpeechKeys-B7SDWzo9.js} +1 -1
  141. package/public/dist/assets/{TelegramHub-CFwSkzHP.js → TelegramHub-C61X3f-H.js} +1 -1
  142. package/public/dist/assets/{TerminalPanel-CdlFZHAK.js → TerminalPanel-DlUFPyzc.js} +1 -1
  143. package/public/dist/assets/{TransportStatusChips-CjEySMis.js → TransportStatusChips-B0NR0ljO.js} +1 -1
  144. package/public/dist/assets/{app-is76CHGZ.js → app-DUbf-v7B.js} +4 -4
  145. package/public/dist/assets/architecture-7EHR7CIX-Byg-B8Sh.js +1 -0
  146. package/public/dist/assets/{architectureDiagram-3BPJPVTR-q8idz3H3.js → architectureDiagram-3BPJPVTR-DA7niVYs.js} +1 -1
  147. package/public/dist/assets/bgtask-badge-B8KhuBa7.js +1 -0
  148. package/public/dist/assets/{bgtask-badge-B0B1nXUs.js → bgtask-badge-jIH69Dp3.js} +1 -1
  149. package/public/dist/assets/{blockDiagram-GPEHLZMM-DGB0dsia.js → blockDiagram-GPEHLZMM-czRsW1WP.js} +1 -1
  150. package/public/dist/assets/{bounded-set-CFlZiEF4.js → bounded-set-DXkYOGnQ.js} +1 -1
  151. package/public/dist/assets/{c4Diagram-AAUBKEIU-ChP5YfVt.js → c4Diagram-AAUBKEIU-zoRyRo1y.js} +1 -1
  152. package/public/dist/assets/channel-Cr7Dmg2t.js +1 -0
  153. package/public/dist/assets/{chunk-2J33WTMH-D3OPoEHg.js → chunk-2J33WTMH-DMaZjiDe.js} +1 -1
  154. package/public/dist/assets/{chunk-3OPIFGDE-CULJ8ZHF.js → chunk-3OPIFGDE-fm0Uteda.js} +1 -1
  155. package/public/dist/assets/{chunk-4BX2VUAB-DGgktZYr.js → chunk-4BX2VUAB-DU36Vmpr.js} +1 -1
  156. package/public/dist/assets/{chunk-4EGX6M5U-BD3v8KR4.js → chunk-4EGX6M5U-CYPeQu4F.js} +1 -1
  157. package/public/dist/assets/chunk-55IACEB6-Dkm6BnqN.js +1 -0
  158. package/public/dist/assets/{chunk-5DO6E6H7-B-FbGqHn.js → chunk-5DO6E6H7-CIcLA1n6.js} +1 -1
  159. package/public/dist/assets/{chunk-5ZQYHXKU-DVpWOoGS.js → chunk-5ZQYHXKU-NjOvV6Nd.js} +1 -1
  160. package/public/dist/assets/{chunk-727SXJPM-CZjR7q6H.js → chunk-727SXJPM-CUOujQg0.js} +1 -1
  161. package/public/dist/assets/{chunk-AQP2D5EJ-BlGjnlsV.js → chunk-AQP2D5EJ-2nFXTQ0W.js} +1 -1
  162. package/public/dist/assets/{chunk-BR22UD5L-MK8KuB9X.js → chunk-BR22UD5L-BoyFFQuR.js} +1 -1
  163. package/public/dist/assets/{chunk-BSJP7CBP-ypXC4wBv.js → chunk-BSJP7CBP-B1MMwNrU.js} +1 -1
  164. package/public/dist/assets/{chunk-CSCIHK7Q-CmvetykJ.js → chunk-CSCIHK7Q-C0MOgWVt.js} +1 -1
  165. package/public/dist/assets/{chunk-FHYWG6QK-Do5csWDm.js → chunk-FHYWG6QK-CmUWtJPn.js} +1 -1
  166. package/public/dist/assets/{chunk-FMBD7UC4-BXpT25MP.js → chunk-FMBD7UC4-BEz4FhFn.js} +1 -1
  167. package/public/dist/assets/{chunk-KSCS5N6A-DtlfLqto.js → chunk-KSCS5N6A-B2XGqWQY.js} +1 -1
  168. package/public/dist/assets/{chunk-L5ZTLDWV-Czv9NkHn.js → chunk-L5ZTLDWV-CfZ2hrJ2.js} +1 -1
  169. package/public/dist/assets/{chunk-LZXEDZCA-vD7oFdiq.js → chunk-LZXEDZCA-BXuFCBsZ.js} +1 -1
  170. package/public/dist/assets/{chunk-MPE355IW-2ei0PVn0.js → chunk-MPE355IW-BdSiU-oV.js} +1 -1
  171. package/public/dist/assets/{chunk-MZUSXYTE-JO_qTk4K.js → chunk-MZUSXYTE-VYfI8Uwx.js} +1 -1
  172. package/public/dist/assets/{chunk-N66VUXT2-BXL-FniY.js → chunk-N66VUXT2-DJVNyglo.js} +1 -1
  173. package/public/dist/assets/{chunk-ND2GUHAM-B9SIO-4a.js → chunk-ND2GUHAM-1k8TCCsJ.js} +1 -1
  174. package/public/dist/assets/{chunk-NZK2D7GU-CqOo06-Z.js → chunk-NZK2D7GU-CkYWftT8.js} +1 -1
  175. package/public/dist/assets/{chunk-O5CBEL6O-BWbe_grt.js → chunk-O5CBEL6O-B5g0NbhD.js} +1 -1
  176. package/public/dist/assets/{chunk-PUPMXCY4-aFTMGBaR.js → chunk-PUPMXCY4-DJKmByz8.js} +1 -1
  177. package/public/dist/assets/chunk-QZHKN3VN-C6ktI6EQ.js +1 -0
  178. package/public/dist/assets/{chunk-UIBZB4QT-S8EH0jZR.js → chunk-UIBZB4QT-DgLbPJ3_.js} +1 -1
  179. package/public/dist/assets/{chunk-WCWK7LTN-EgrNk7Dj.js → chunk-WCWK7LTN-DWxi0w0a.js} +1 -1
  180. package/public/dist/assets/chunk-WU5MYG2G-Cwe6QZ3_.js +1 -0
  181. package/public/dist/assets/{chunk-XPW4576I-8oydVjY6.js → chunk-XPW4576I-CaTDAC52.js} +1 -1
  182. package/public/dist/assets/classDiagram-4FO5ZUOK-BzLBk9sv.js +1 -0
  183. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-9K8wUz3g.js +1 -0
  184. package/public/dist/assets/{copy-text-BDs2wKjA.js → copy-text-Dy0kfmb9.js} +1 -1
  185. package/public/dist/assets/{cose-bilkent-S5V4N54A-PNmvcq_6.js → cose-bilkent-S5V4N54A-B9Tcz6qW.js} +1 -1
  186. package/public/dist/assets/{dagre-BM42HDAG-BP_m3uo9.js → dagre-BM42HDAG-OH37BMnf.js} +1 -1
  187. package/public/dist/assets/{dagre-Ct2n78X9.js → dagre-BsKKQnyU.js} +1 -1
  188. package/public/dist/assets/{diagram-2AECGRRQ-DhgfR-ol.js → diagram-2AECGRRQ-B1t73Wn1.js} +1 -1
  189. package/public/dist/assets/{diagram-5GNKFQAL-BRLvmdeK.js → diagram-5GNKFQAL-DBGIcSxH.js} +1 -1
  190. package/public/dist/assets/{diagram-KO2AKTUF-Co3C18-Q.js → diagram-KO2AKTUF-uRuKS97A.js} +1 -1
  191. package/public/dist/assets/{diagram-LMA3HP47-3SwoWQij.js → diagram-LMA3HP47-XMEHnr3B.js} +1 -1
  192. package/public/dist/assets/{diagram-OG6HWLK6-bjEryAd3.js → diagram-OG6HWLK6-B_vRUJSJ.js} +1 -1
  193. package/public/dist/assets/{dist-BvQlb9-o.js → dist-BCCaGGDY.js} +1 -1
  194. package/public/dist/assets/{dist-CvzAXxlb.js → dist-BPE4W9iX.js} +1 -1
  195. package/public/dist/assets/{dist-CFU9RsAu.js → dist-BQMBTYXL.js} +1 -1
  196. package/public/dist/assets/{dist-BlMOeJym.js → dist-BaPGPaX4.js} +1 -1
  197. package/public/dist/assets/{dist-B6T-R4xY.js → dist-Bg80xGMJ.js} +1 -1
  198. package/public/dist/assets/{dist-CS1XLdz3.js → dist-BspKh_Zg.js} +1 -1
  199. package/public/dist/assets/{dist-qUky5WRy.js → dist-CBnlLSQZ.js} +1 -1
  200. package/public/dist/assets/{dist-BMC_dTfR.js → dist-CD7tjeNO.js} +1 -1
  201. package/public/dist/assets/{dist-w2YzIhc5.js → dist-CINTuhik.js} +1 -1
  202. package/public/dist/assets/{dist-cBBDKBli.js → dist-CTpw6PFT.js} +1 -1
  203. package/public/dist/assets/{dist-BqzMcuh8.js → dist-CczLsP0o.js} +1 -1
  204. package/public/dist/assets/{dist-ph7PUr0c.js → dist-CdfDDy4r.js} +1 -1
  205. package/public/dist/assets/{dist-D8SW_REQ.js → dist-CgIOBybm.js} +1 -1
  206. package/public/dist/assets/dist-Cl_pRobr.js +1 -0
  207. package/public/dist/assets/{dist-DTcoHNXr.js → dist-CruwQXwE.js} +1 -1
  208. package/public/dist/assets/{dist-BDPUxeoi.js → dist-CuL30i1H.js} +1 -1
  209. package/public/dist/assets/{dist-DMZVNaIe.js → dist-CvE8Qa9r.js} +1 -1
  210. package/public/dist/assets/{dist-B8V2LYzt.js → dist-Cy3mcP1e.js} +1 -1
  211. package/public/dist/assets/{dist-C7pD0dEn.js → dist-CzCFEnHw.js} +1 -1
  212. package/public/dist/assets/{dist-DStWZVZ0.js → dist-D2h9T4I9.js} +1 -1
  213. package/public/dist/assets/{dist-DmjSXJAP.js → dist-D3ShDeDU.js} +1 -1
  214. package/public/dist/assets/{dist-CC2vK_6S.js → dist-D8Zky4R1.js} +1 -1
  215. package/public/dist/assets/{dist-DN-hkAIC.js → dist-DKd_hdkE.js} +1 -1
  216. package/public/dist/assets/{dist-CjzfPsGt.js → dist-DLOg6n0b.js} +1 -1
  217. package/public/dist/assets/{dist-DdJuxxG7.js → dist-DS7cuuIk.js} +1 -1
  218. package/public/dist/assets/dist-DW0I56_o.js +1 -0
  219. package/public/dist/assets/{dist-BSf40pae.js → dist-JnCmAxGR.js} +1 -1
  220. package/public/dist/assets/{dist-DhgwoIqj.js → dist-TombgBki.js} +1 -1
  221. package/public/dist/assets/dist-hBRIxDzG.js +1 -0
  222. package/public/dist/assets/dist-z5Z70wW8.js +1 -0
  223. package/public/dist/assets/{dockerfile-C0jniLkw.js → dockerfile-DkX5AHzr.js} +1 -1
  224. package/public/dist/assets/{employees-eiW0cC8z.js → employees-BNy8a6XX.js} +1 -1
  225. package/public/dist/assets/{erDiagram-TEJ5UH35-DQBxHU1q.js → erDiagram-TEJ5UH35-CTHxg4ER.js} +1 -1
  226. package/public/dist/assets/{error-normalize-BzeO0SXE.js → error-normalize-CLRJh19F.js} +1 -1
  227. package/public/dist/assets/eventmodeling-FCH6USID-LckY84Wp.js +1 -0
  228. package/public/dist/assets/{factor-nzjoQ9cK.js → factor-Xro2mWdw.js} +1 -1
  229. package/public/dist/assets/{fields-zkeByFQW.js → fields-BwOMlwS0.js} +1 -1
  230. package/public/dist/assets/{flowDiagram-I6XJVG4X-BN90fCt5.js → flowDiagram-I6XJVG4X-DgCs6PPU.js} +1 -1
  231. package/public/dist/assets/{ganttDiagram-6RSMTGT7-B-JAlIhh.js → ganttDiagram-6RSMTGT7-DGjdFJRc.js} +1 -1
  232. package/public/dist/assets/gitGraph-WXDBUCRP-DXhEIZXY.js +1 -0
  233. package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CLL2G5U-.js → gitGraphDiagram-PVQCEYII-DvCWiClL.js} +1 -1
  234. package/public/dist/assets/{graphlib-B6dRm8vZ.js → graphlib-B06FTUqA.js} +1 -1
  235. package/public/dist/assets/{iframe-renderer-C7qQJX4c.js → iframe-renderer-C6Zwg9w4.js} +2 -2
  236. package/public/dist/assets/iframe-renderer-DBmV8gCQ.js +1 -0
  237. package/public/dist/assets/info-J43DQDTF-iXM3vzuR.js +1 -0
  238. package/public/dist/assets/{infoDiagram-5YYISTIA-CftYDPfc.js → infoDiagram-5YYISTIA-DxkbyTf_.js} +1 -1
  239. package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-BVa5AJbz.js → ishikawaDiagram-YF4QCWOH-fyJrRZTW.js} +1 -1
  240. package/public/dist/assets/javascript-DZFdG8BN.js +1 -0
  241. package/public/dist/assets/{journeyDiagram-JHISSGLW-BeUKm6ME.js → journeyDiagram-JHISSGLW-Dd6CvR-c.js} +1 -1
  242. package/public/dist/assets/{kanban-definition-UN3LZRKU-K5DYNY4p.js → kanban-definition-UN3LZRKU-C2ZH4LXA.js} +1 -1
  243. package/public/dist/assets/{manager-Bjuh1jpq.js → manager-DzCR6Pam.js} +4 -4
  244. package/public/dist/assets/{memory--Q8Tb5SZ.js → memory-C4O44HMr.js} +1 -1
  245. package/public/dist/assets/memory-Dt_Ji6aP.js +1 -0
  246. package/public/dist/assets/mermaid-loader-CylkLQP5.js +1 -0
  247. package/public/dist/assets/{mermaid-parser.core-Cz70RgAa.js → mermaid-parser.core-C-9KB617.js} +1 -1
  248. package/public/dist/assets/{mermaid.core-Dj5GOPe1.js → mermaid.core-8XY13b72.js} +2 -2
  249. package/public/dist/assets/mermaid.core-BEuf6y5_.js +1 -0
  250. package/public/dist/assets/{message-history-CfAHmCDW.js → message-history-DCxD21J1.js} +1 -1
  251. package/public/dist/assets/message-history-DyISauiv.js +1 -0
  252. package/public/dist/assets/{mindmap-definition-RKZ34NQL-PsH0E_3e.js → mindmap-definition-RKZ34NQL-DUQBUbUA.js} +1 -1
  253. package/public/dist/assets/{nsis-BI3I3OhH.js → nsis-iX94j4T9.js} +1 -1
  254. package/public/dist/assets/packet-YPE3B663-SclsNpNx.js +1 -0
  255. package/public/dist/assets/{page-shell-LF7vVVfG.js → page-shell-GpE8A-FA.js} +1 -1
  256. package/public/dist/assets/pie-LRSECV5Y-CF43gDO6.js +1 -0
  257. package/public/dist/assets/{pieDiagram-4H26LBE5-Dtwtlr0z.js → pieDiagram-4H26LBE5-ChOXpmZ5.js} +1 -1
  258. package/public/dist/assets/{pug-DHfNwv1w.js → pug-C8nPBT90.js} +1 -1
  259. package/public/dist/assets/{quadrantDiagram-W4KKPZXB-CAFUbaV6.js → quadrantDiagram-W4KKPZXB-lbpz07e4.js} +1 -1
  260. package/public/dist/assets/radar-GUYGQ44K-BsylzLX_.js +1 -0
  261. package/public/dist/assets/{render-BDso7Yb5.js → render-A--hkukv.js} +2 -2
  262. package/public/dist/assets/{requirementDiagram-4Y6WPE33-CvBM4AjK.js → requirementDiagram-4Y6WPE33-CrApoE_l.js} +1 -1
  263. package/public/dist/assets/{sankeyDiagram-5OEKKPKP-cordQgRs.js → sankeyDiagram-5OEKKPKP-Df1lU-mT.js} +1 -1
  264. package/public/dist/assets/{sequenceDiagram-3UESZ5HK-DDAqRdga.js → sequenceDiagram-3UESZ5HK-CelQN5jY.js} +1 -1
  265. package/public/dist/assets/settings-3ZdoKHIf.js +56 -0
  266. package/public/dist/assets/settings-C6Pku2GC.js +1 -0
  267. package/public/dist/assets/{settings-core-BxuFkt4a.js → settings-core-CQe1uP6x.js} +17 -17
  268. package/public/dist/assets/settings-core-DqwLJkgP.js +1 -0
  269. package/public/dist/assets/settings-types-DPhhM-cj.js +1 -0
  270. package/public/dist/assets/{sidebar-BNT58qR0.js → sidebar-DxFp_449.js} +3 -3
  271. package/public/dist/assets/{skills-CwRBcm3m.js → skills-BU4q8Q8n.js} +1 -1
  272. package/public/dist/assets/skills-x2gH-1Ry.js +1 -0
  273. package/public/dist/assets/{slash-commands-cm0U58n7.js → slash-commands-BiXOgZ5B.js} +1 -1
  274. package/public/dist/assets/slash-commands-s8eR7Kd1.js +1 -0
  275. package/public/dist/assets/{stateDiagram-AJRCARHV-DUaoSRgZ.js → stateDiagram-AJRCARHV-CeyXWXrg.js} +1 -1
  276. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-Bhb8zTjh.js +1 -0
  277. package/public/dist/assets/{timeline-definition-PNZ67QCA-D85QNy9b.js → timeline-definition-PNZ67QCA-DP0lPzQ_.js} +1 -1
  278. package/public/dist/assets/{trace-drawer-BuwO4m2P.js → trace-drawer-2BTQCor6.js} +1 -1
  279. package/public/dist/assets/treeView-BLDUP644-DHq0vQpf.js +1 -0
  280. package/public/dist/assets/treemap-LRROVOQU-vKngXIla.js +1 -0
  281. package/public/dist/assets/ui-CB0L33o0.js +1 -0
  282. package/public/dist/assets/{ui-C-LHMki1.js → ui-Csy42uNW.js} +1 -1
  283. package/public/dist/assets/{vennDiagram-CIIHVFJN-CQSILdx8.js → vennDiagram-CIIHVFJN-WB9mzv1f.js} +1 -1
  284. package/public/dist/assets/wardley-L42UT6IY-B1jQOSA5.js +1 -0
  285. package/public/dist/assets/{wardleyDiagram-YWT4CUSO-BZEVMlJ4.js → wardleyDiagram-YWT4CUSO-CapVnCz5.js} +1 -1
  286. package/public/dist/assets/{wiki-link-suggestions-Dp6kBQVu.js → wiki-link-suggestions-cvpqJp6c.js} +1 -1
  287. package/public/dist/assets/{xychartDiagram-2RQKCTM6-C8573Tgs.js → xychartDiagram-2RQKCTM6-DduDB3Cd.js} +1 -1
  288. package/public/dist/index.html +1 -1
  289. package/public/dist/manager/index.html +1 -1
  290. package/public/js/features/settings-cli-status.ts +11 -5
  291. package/public/js/features/settings-types.ts +35 -3
  292. package/public/manager/src/settings/cli-status-polling.ts +84 -0
  293. package/public/manager/src/settings/pages/Agent.tsx +111 -16
  294. package/scripts/install-officecli.ps1 +38 -2
  295. package/scripts/install.ps1 +1 -1
  296. package/public/dist/assets/Agent-nMPZsMfN.js +0 -1
  297. package/public/dist/assets/MarkdownRenderer-DZVh_xX2.js +0 -1
  298. package/public/dist/assets/Permissions-DNT0TxYL.js +0 -1
  299. package/public/dist/assets/architecture-7EHR7CIX-D-6Nx315.js +0 -1
  300. package/public/dist/assets/bgtask-badge-B2jUZ5mC.js +0 -1
  301. package/public/dist/assets/channel-ByNDsZsH.js +0 -1
  302. package/public/dist/assets/chunk-55IACEB6-CQFLXxVc.js +0 -1
  303. package/public/dist/assets/chunk-QZHKN3VN-Becu19mF.js +0 -1
  304. package/public/dist/assets/chunk-WU5MYG2G-CkoHFn0F.js +0 -1
  305. package/public/dist/assets/classDiagram-4FO5ZUOK-DVGoKviY.js +0 -1
  306. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BIZeptY-.js +0 -1
  307. package/public/dist/assets/dist-BmXnOAlo.js +0 -1
  308. package/public/dist/assets/dist-DLY5I6dK.js +0 -1
  309. package/public/dist/assets/dist-DPHcMCqI.js +0 -1
  310. package/public/dist/assets/dist-xHOEvyuU.js +0 -1
  311. package/public/dist/assets/eventmodeling-FCH6USID-BB1OVDLb.js +0 -1
  312. package/public/dist/assets/gitGraph-WXDBUCRP-DAWTa5Fn.js +0 -1
  313. package/public/dist/assets/iframe-renderer-D7PB_yrC.js +0 -1
  314. package/public/dist/assets/info-J43DQDTF-C530y5-j.js +0 -1
  315. package/public/dist/assets/javascript-DbM-pSY-.js +0 -1
  316. package/public/dist/assets/memory-rsKN0aa2.js +0 -1
  317. package/public/dist/assets/mermaid-loader-Bd9rYyxD.js +0 -1
  318. package/public/dist/assets/mermaid.core-TSG49mwm.js +0 -1
  319. package/public/dist/assets/message-history-BttkY77h.js +0 -1
  320. package/public/dist/assets/packet-YPE3B663-BHcxn4sy.js +0 -1
  321. package/public/dist/assets/pie-LRSECV5Y-DjigSia_.js +0 -1
  322. package/public/dist/assets/radar-GUYGQ44K-DPCrmsHJ.js +0 -1
  323. package/public/dist/assets/settings-CqnIqxkG.js +0 -56
  324. package/public/dist/assets/settings-core-CdZ7oKhM.js +0 -1
  325. package/public/dist/assets/settings-pPMHNs0G.js +0 -1
  326. package/public/dist/assets/skills-DiVoaVdS.js +0 -1
  327. package/public/dist/assets/slash-commands-Bx4saHwR.js +0 -1
  328. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-BAesfdhr.js +0 -1
  329. package/public/dist/assets/treeView-BLDUP644-DmufUMul.js +0 -1
  330. package/public/dist/assets/treemap-LRROVOQU-Cg48uw_D.js +0 -1
  331. package/public/dist/assets/ui-XPQDPe-5.js +0 -1
  332. package/public/dist/assets/wardley-L42UT6IY-QZOEXU7f.js +0 -1
  333. /package/public/dist/assets/{agent-meta-Y3DE6sxh.js → agent-meta-Bl-Q0EgC.js} +0 -0
  334. /package/public/dist/assets/{api-B25zNNFJ.js → api-FOqKQ9fm.js} +0 -0
  335. /package/public/dist/assets/{apl-2tE96F_Y.js → apl-CYLd9I-9.js} +0 -0
  336. /package/public/dist/assets/{asciiarmor-ynSKiC17.js → asciiarmor-7YwhfGDq.js} +0 -0
  337. /package/public/dist/assets/{asn1-CfqO1VY8.js → asn1-BlhHp3qx.js} +0 -0
  338. /package/public/dist/assets/{asterisk-DSiRJoqT.js → asterisk-Q0-IBwUt.js} +0 -0
  339. /package/public/dist/assets/{brainfuck-DTcanv-8.js → brainfuck-CM8jf4Gu.js} +0 -0
  340. /package/public/dist/assets/{chunk-AGHRB4JF-BXLzSehp.js → chunk-AGHRB4JF-Cdp9MZGh.js} +0 -0
  341. /package/public/dist/assets/{chunk-NNHCCRGN-D69GtSOc.js → chunk-NNHCCRGN-ChI2WAS0.js} +0 -0
  342. /package/public/dist/assets/{clike-qn72CMAj.js → clike-BcV5UqGE.js} +0 -0
  343. /package/public/dist/assets/{clojure-m8yDiYVc.js → clojure-XHu9GAjV.js} +0 -0
  344. /package/public/dist/assets/{cmake-4AHAWHiF.js → cmake-DhPsEu0W.js} +0 -0
  345. /package/public/dist/assets/{cobol-CxxJP5eX.js → cobol-BEekiT-v.js} +0 -0
  346. /package/public/dist/assets/{coffeescript-BAB3zi48.js → coffeescript-Bgk4ZVWF.js} +0 -0
  347. /package/public/dist/assets/{commonlisp-BPbWuAds.js → commonlisp-Dw4PRJwx.js} +0 -0
  348. /package/public/dist/assets/{crystal-CGuSsWYR.js → crystal-CJ-iCD_G.js} +0 -0
  349. /package/public/dist/assets/{css-DszbR74r.js → css-BDUaiSMY.js} +0 -0
  350. /package/public/dist/assets/{cypher-GUnmv522.js → cypher-CJ05ZgAu.js} +0 -0
  351. /package/public/dist/assets/{cytoscape.esm-D_XyYSBG.js → cytoscape.esm-PBXWcYR1.js} +0 -0
  352. /package/public/dist/assets/{d-Cfm0cznj.js → d-BfHF1VVF.js} +0 -0
  353. /package/public/dist/assets/{desktop-bridge-CvdhnJQo.js → desktop-bridge-DtydAvqu.js} +0 -0
  354. /package/public/dist/assets/{diff-C6rPA7NX.js → diff-BVcHwfdB.js} +0 -0
  355. /package/public/dist/assets/{dist-AgQwqBLq.js → dist-BbhtVnRz.js} +0 -0
  356. /package/public/dist/assets/{dtd-Dxh5tS6M.js → dtd-Bg0TgBY9.js} +0 -0
  357. /package/public/dist/assets/{dylan-BdIVFR1j.js → dylan-BQ0i5j3T.js} +0 -0
  358. /package/public/dist/assets/{ebnf-iU-8xYFu.js → ebnf-QSFUkOiT.js} +0 -0
  359. /package/public/dist/assets/{ecl-DjbzOHI6.js → ecl-oXh4vhiy.js} +0 -0
  360. /package/public/dist/assets/{eiffel-B2ID8LZ3.js → eiffel-S15DDWzw.js} +0 -0
  361. /package/public/dist/assets/{elm-B6vPcfMj.js → elm-B746ZFPi.js} +0 -0
  362. /package/public/dist/assets/{erlang-nDQwRdZV.js → erlang-GRIYhTbY.js} +0 -0
  363. /package/public/dist/assets/{fcl-Bf86o55I.js → fcl-DjQMeb0v.js} +0 -0
  364. /package/public/dist/assets/{folder-drag-payload-Bhln9Mk2.js → folder-drag-payload-CJ0dxhZa.js} +0 -0
  365. /package/public/dist/assets/{forth-CeQJji0n.js → forth-DNnBFTm6.js} +0 -0
  366. /package/public/dist/assets/{fortran-Dm_CqDsH.js → fortran-yg6K9z9n.js} +0 -0
  367. /package/public/dist/assets/{gas-e3EfgE3p.js → gas-fbsH19hy.js} +0 -0
  368. /package/public/dist/assets/{gherkin-Dn_7tSzg.js → gherkin-BCy9haeT.js} +0 -0
  369. /package/public/dist/assets/{groovy-LaKuGRkK.js → groovy-Cm4gdIYU.js} +0 -0
  370. /package/public/dist/assets/{haskell-D9nNX9Mr.js → haskell-Dq28dVw2.js} +0 -0
  371. /package/public/dist/assets/{haxe-Rp176QXJ.js → haxe-BrZpr4Ca.js} +0 -0
  372. /package/public/dist/assets/{http-BOeYLbuM.js → http-B3zr0y0o.js} +0 -0
  373. /package/public/dist/assets/{idl-DHv3vdme.js → idl-C9CL9hdG.js} +0 -0
  374. /package/public/dist/assets/{javascript-Dk2fbl1a.js → javascript-DD7UxIxH.js} +0 -0
  375. /package/public/dist/assets/{jsx-runtime-gFMgZ0TQ.js → jsx-runtime-CYoNlHAD.js} +0 -0
  376. /package/public/dist/assets/{julia-D7CKCk5I.js → julia-CjwfSXBk.js} +0 -0
  377. /package/public/dist/assets/{livescript-gRbr9rhj.js → livescript-vRjI6jFU.js} +0 -0
  378. /package/public/dist/assets/{lua-CgZ_7bxf.js → lua-CxVmDfKg.js} +0 -0
  379. /package/public/dist/assets/{mathematica-B6bTyoab.js → mathematica-DJZPFt8k.js} +0 -0
  380. /package/public/dist/assets/{mbox-C8oQj1cJ.js → mbox-CxBBnlIA.js} +0 -0
  381. /package/public/dist/assets/{mirc-v6L6kZuh.js → mirc-CBWc0vcU.js} +0 -0
  382. /package/public/dist/assets/{mllike-CWu4RdWO.js → mllike-DYddHpeS.js} +0 -0
  383. /package/public/dist/assets/{modelica-B3NBpX1d.js → modelica-B94rrYMn.js} +0 -0
  384. /package/public/dist/assets/{mscgen-C8u7qRYw.js → mscgen-D0PO0iPT.js} +0 -0
  385. /package/public/dist/assets/{mumps-DHjVG4PS.js → mumps-BdPrWvs5.js} +0 -0
  386. /package/public/dist/assets/{nginx-BMt87X3t.js → nginx-C7cLiM4x.js} +0 -0
  387. /package/public/dist/assets/{notes-graph-settings-BgNrT_58.js → notes-graph-settings-Cl4lMj-A.js} +0 -0
  388. /package/public/dist/assets/{ntriples-C8U-Jud2.js → ntriples-DLMpvgb1.js} +0 -0
  389. /package/public/dist/assets/{octave-Bq37AoFm.js → octave-DeJPElAr.js} +0 -0
  390. /package/public/dist/assets/{oz-D6HxSRn3.js → oz-4dtXWqwe.js} +0 -0
  391. /package/public/dist/assets/{pascal-BBqiAVg6.js → pascal-TdeXcL-o.js} +0 -0
  392. /package/public/dist/assets/{path-utils-LsJeDCKF.js → path-utils-CHwADH-r.js} +0 -0
  393. /package/public/dist/assets/{perl-sHANlXjx.js → perl-DfpfXWOH.js} +0 -0
  394. /package/public/dist/assets/{pig-Cufgew--.js → pig-xQ4essgV.js} +0 -0
  395. /package/public/dist/assets/{powershell--Q4mDip6.js → powershell-Dfw2t4-B.js} +0 -0
  396. /package/public/dist/assets/{properties-DoVpJ-kT.js → properties-CrJLOvU2.js} +0 -0
  397. /package/public/dist/assets/{protobuf-B5OiV2Zv.js → protobuf-BYv78GYU.js} +0 -0
  398. /package/public/dist/assets/{provider-icons-VDfahiUp.js → provider-icons-CXA2mnPO.js} +0 -0
  399. /package/public/dist/assets/{puppet-Ce_CFfqW.js → puppet-DnsvBfcg.js} +0 -0
  400. /package/public/dist/assets/{python-pK7Wt6QH.js → python-mfoZJSDM.js} +0 -0
  401. /package/public/dist/assets/{q-Dd3Ltku0.js → q-BrTIu4PU.js} +0 -0
  402. /package/public/dist/assets/{r-CsX__2f0.js → r-FO7GgXB8.js} +0 -0
  403. /package/public/dist/assets/{rough.esm--LLpAgPj.js → rough.esm-DeGVhNS9.js} +0 -0
  404. /package/public/dist/assets/{rpm-D78AjDAl.js → rpm-D8Wbdep5.js} +0 -0
  405. /package/public/dist/assets/{ruby-D_-KI498.js → ruby-Cg1fwXaw.js} +0 -0
  406. /package/public/dist/assets/{sas-D-GUPiy4.js → sas-Ch1GEx-n.js} +0 -0
  407. /package/public/dist/assets/{scheme-DF9WwQDv.js → scheme-DGFmPoR2.js} +0 -0
  408. /package/public/dist/assets/{settings-client-CjbBShxm.js → settings-client-D9KY2Ufl.js} +0 -0
  409. /package/public/dist/assets/{shell-BTUwbV-w.js → shell-BBoIO9l0.js} +0 -0
  410. /package/public/dist/assets/{sieve--Z-EbGZo.js → sieve-8oEe6gDx.js} +0 -0
  411. /package/public/dist/assets/{simple-mode-BUow4bpn.js → simple-mode-BNw0K2rL.js} +0 -0
  412. /package/public/dist/assets/{smalltalk-C2YIwVx3.js → smalltalk-ChbxX23N.js} +0 -0
  413. /package/public/dist/assets/{solr-CYVq4fbf.js → solr-BwGyzi2H.js} +0 -0
  414. /package/public/dist/assets/{sparql-Ccd4fsFv.js → sparql-D9wgprRx.js} +0 -0
  415. /package/public/dist/assets/{spreadsheet-DW0WgMrS.js → spreadsheet-BySehl32.js} +0 -0
  416. /package/public/dist/assets/{sql-C71Zp6qn.js → sql-B6Phvk1R.js} +0 -0
  417. /package/public/dist/assets/{stex-CKuX0g_6.js → stex-32iK7T_9.js} +0 -0
  418. /package/public/dist/assets/{stylus-CBH8s0NO.js → stylus-C689wDNM.js} +0 -0
  419. /package/public/dist/assets/{swift-CfZoxKRA.js → swift-DZwxTp-L.js} +0 -0
  420. /package/public/dist/assets/{tcl-D5MGbeQu.js → tcl-BSOjIY_8.js} +0 -0
  421. /package/public/dist/assets/{textile-DJ3U30FW.js → textile-xOWO1SH7.js} +0 -0
  422. /package/public/dist/assets/{tiddlywiki-_fe1dHUq.js → tiddlywiki-B8jhOxrf.js} +0 -0
  423. /package/public/dist/assets/{tiki-Dd1udTrQ.js → tiki-OG7n6UAo.js} +0 -0
  424. /package/public/dist/assets/{toml-xpw8pqjz.js → toml-DkxT-aUR.js} +0 -0
  425. /package/public/dist/assets/{troff-CgWiec8m.js → troff-vE5gOX7Y.js} +0 -0
  426. /package/public/dist/assets/{ttcn-CSwmFrer.js → ttcn-CPOduycD.js} +0 -0
  427. /package/public/dist/assets/{ttcn-cfg-B5HVIC6z.js → ttcn-cfg-DmA__-R_.js} +0 -0
  428. /package/public/dist/assets/{turtle-Cl_SuWQk.js → turtle-CEzrJHdY.js} +0 -0
  429. /package/public/dist/assets/{vb-BT131bSf.js → vb-Cii5IQTv.js} +0 -0
  430. /package/public/dist/assets/{vbscript-D6S8_XkU.js → vbscript-DcZWGZ_S.js} +0 -0
  431. /package/public/dist/assets/{velocity-9HkI645n.js → velocity-BEag7EnK.js} +0 -0
  432. /package/public/dist/assets/{vendor-utils-DJY0EWnQ.js → vendor-utils-BK07iQND.js} +0 -0
  433. /package/public/dist/assets/{verilog-BzMguKeI.js → verilog-DMw8DKoT.js} +0 -0
  434. /package/public/dist/assets/{vhdl-bHScWzT1.js → vhdl-M4wLPuJt.js} +0 -0
  435. /package/public/dist/assets/{w3c-keyname-a_sRwNLm.js → w3c-keyname-hgmz1BF7.js} +0 -0
  436. /package/public/dist/assets/{webidl-CbgaVHNS.js → webidl-CjehKbx5.js} +0 -0
  437. /package/public/dist/assets/{wiki-link-resolver-DyFzBTIQ.js → wiki-link-resolver-N9fDy5zP.js} +0 -0
  438. /package/public/dist/assets/{xquery-DWZPmAiC.js → xquery-CYbd_YmJ.js} +0 -0
  439. /package/public/dist/assets/{yacas-CEdW4z4K.js → yacas-ClBNsli2.js} +0 -0
  440. /package/public/dist/assets/{z80-CMH3qxNg.js → z80-nGsPT_fm.js} +0 -0
@@ -0,0 +1,84 @@
1
+ // #312: the Settings panel used to read /api/cli-status once, so a probe that
2
+ // was still running when the page mounted left "상태 확인 중" on screen forever.
3
+ //
4
+ // The server cannot fix this on its own: CliStatusCache is demand-driven and
5
+ // has no timer (src/cli/cli-status.ts), so a snapshot only advances when
6
+ // somebody reads it again. The UI has to be that somebody — but bounded, since
7
+ // a read can fork a worker that runs real CLI probes.
8
+
9
+ export type CliStatusProbeState = 'checking' | 'fresh' | 'stale' | 'failing' | 'unknown';
10
+
11
+ export type PollableCliStatus = {
12
+ probeState?: CliStatusProbeState;
13
+ /** Server-provided backoff deadline, present while probeState is `failing`. */
14
+ nextRetryAt?: number;
15
+ };
16
+
17
+ /** Floor for the first delay: a GET can fork a worker running real CLI probes. */
18
+ export const CLI_STATUS_MIN_DELAY_MS = 1_000;
19
+ export const CLI_STATUS_MAX_DELAY_MS = 8_000;
20
+
21
+ /**
22
+ * The worker itself may legitimately run for 60s
23
+ * (WORKER_OUTER_TIMEOUT_MS in src/cli/cli-status-worker.ts). Give it that plus
24
+ * room for one observing read, or a healthy slow host gets reported as a
25
+ * timeout.
26
+ */
27
+ export const CLI_STATUS_POLL_HORIZON_MS = 90_000;
28
+ export const CLI_STATUS_MAX_ATTEMPTS = 24;
29
+
30
+ /**
31
+ * `failing` is deliberately NOT terminal. The cache restarts probing on the
32
+ * first read after its backoff expires, so a UI that stops on `failing` would
33
+ * simply swap one permanent notice for another and never observe the recovery.
34
+ */
35
+ export function shouldPollCliStatus(
36
+ snapshot: Record<string, PollableCliStatus> | null | undefined,
37
+ cli: string | null | undefined,
38
+ ): boolean {
39
+ if (!snapshot || !cli) return false;
40
+ const state = snapshot[cli]?.probeState;
41
+ if (!state) return false;
42
+ return state === 'checking' || state === 'failing';
43
+ }
44
+
45
+ /** Gentle backoff between the floor and the ceiling. */
46
+ export function nextCliStatusPollDelay(attempt: number): number {
47
+ const step = Number.isFinite(attempt) && attempt > 0 ? Math.floor(attempt) : 0;
48
+ const delay = CLI_STATUS_MIN_DELAY_MS * 2 ** Math.min(step, 8);
49
+ return Math.min(Math.max(delay, CLI_STATUS_MIN_DELAY_MS), CLI_STATUS_MAX_DELAY_MS);
50
+ }
51
+
52
+ export type PollSchedule =
53
+ | { kind: 'stop' }
54
+ | { kind: 'exhausted' }
55
+ | { kind: 'wait'; delayMs: number };
56
+
57
+ /**
58
+ * Decides the next move. Two independent bounds, neither of which resets on
59
+ * server responses: a wall-clock deadline and a cap on real requests. Waiting
60
+ * out a server backoff must NOT consume an attempt, or a host that is merely
61
+ * backing off would be declared timed-out without ever being asked again.
62
+ */
63
+ export function planCliStatusPoll(input: {
64
+ snapshot: Record<string, PollableCliStatus> | null | undefined;
65
+ cli: string | null | undefined;
66
+ attempts: number;
67
+ now: number;
68
+ deadline: number;
69
+ }): PollSchedule {
70
+ const { snapshot, cli, attempts, now, deadline } = input;
71
+ if (!shouldPollCliStatus(snapshot, cli)) return { kind: 'stop' };
72
+ if (now >= deadline) return { kind: 'exhausted' };
73
+ if (attempts >= CLI_STATUS_MAX_ATTEMPTS) return { kind: 'exhausted' };
74
+
75
+ const backoff = snapshot?.[cli!]?.nextRetryAt;
76
+ const earliest = typeof backoff === 'number' && backoff > now
77
+ ? backoff
78
+ : now + nextCliStatusPollDelay(attempts);
79
+ // A backoff reaching past the deadline means the answer will not arrive in
80
+ // time: wait until the deadline and report exhaustion there rather than
81
+ // firing a doomed request or arming an unbounded timer.
82
+ const target = Math.min(earliest, deadline);
83
+ return { kind: 'wait', delayMs: Math.max(target - now, 0) };
84
+ }
@@ -1,5 +1,9 @@
1
- import { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import type { SettingsPageProps, DirtyEntry } from '../types';
3
+ import {
4
+ CLI_STATUS_POLL_HORIZON_MS,
5
+ planCliStatusPoll,
6
+ } from '../cli-status-polling';
3
7
  import {
4
8
  PageError,
5
9
  PageLoading,
@@ -37,6 +41,7 @@ import {
37
41
  } from './components/agent/agent-save';
38
42
  import { SettingsRequestError } from '../settings-client';
39
43
  import { describeError } from '../components/error-normalize';
44
+ import { describeCliProbeAvailability } from '../../../../js/features/settings-types';
40
45
 
41
46
  export { splitAgentSaveBundle };
42
47
 
@@ -57,10 +62,44 @@ type AgentSnapshot = AgentSettingsSnapshot & {
57
62
  type CliStatusInfo = {
58
63
  available: boolean | null;
59
64
  capabilityReady: boolean | null;
60
- probeState: 'checking' | 'fresh' | 'stale' | 'failing';
65
+ checkedCapability: string;
66
+ probeState: 'checking' | 'fresh' | 'stale' | 'failing' | 'unknown';
61
67
  probeError?: string;
68
+ /** Server backoff deadline; used to time re-reads while `failing`. */
69
+ nextRetryAt?: number;
62
70
  };
63
71
 
72
+ export function CliProbeNotice({ status, exhausted = false }: {
73
+ status: CliStatusInfo | undefined;
74
+ exhausted?: boolean;
75
+ }) {
76
+ if (exhausted) {
77
+ return (
78
+ <div className="settings-inline-notice" role="alert">
79
+ 상태 확인이 끝나지 않았습니다. 새로고침하거나 잠시 후 다시 확인하세요.
80
+ </div>
81
+ );
82
+ }
83
+ if (!status) return null;
84
+
85
+ const presentation = describeCliProbeAvailability(status);
86
+ if (presentation.kind === 'checking') {
87
+ return <div className="settings-inline-notice" role="status" aria-live="polite">상태 확인 중</div>;
88
+ }
89
+ if (presentation.kind === 'unknown') {
90
+ return <div className="settings-inline-notice" role="alert">{presentation.message}</div>;
91
+ }
92
+ if (presentation.kind === 'failing') {
93
+ return (
94
+ <div className="settings-inline-notice" role="alert">
95
+ 상태 확인 실패 (재시도 중)
96
+ {status.probeError ? `: ${status.probeError}` : ''}
97
+ </div>
98
+ );
99
+ }
100
+ return null;
101
+ }
102
+
64
103
  export function conflictSettingsFromError(error: unknown): AgentSnapshot | null {
65
104
  if (!(error instanceof SettingsRequestError) || error.status !== 409) return null;
66
105
  try {
@@ -123,9 +162,24 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
123
162
  }
124
163
  }, [client]);
125
164
 
126
- const loadCliStatus = useCallback(async () => {
127
- try { setCliStatus(await client.get<Record<string, CliStatusInfo>>('/api/cli-status')); }
128
- catch { setCliStatus({}); }
165
+ // Generation ref, same convention as Browser.tsx: clearing a timer does not
166
+ // stop a request that is already in flight, and that response would
167
+ // otherwise setState after unmount or after the user switched CLI.
168
+ const cliStatusGenRef = useRef(0);
169
+ const cliStatusRef = useRef<Record<string, CliStatusInfo>>({});
170
+ const [cliStatusExhausted, setCliStatusExhausted] = useState(false);
171
+
172
+ const loadCliStatus = useCallback(async (gen?: number) => {
173
+ try {
174
+ const next = await client.get<Record<string, CliStatusInfo>>('/api/cli-status');
175
+ if (gen !== undefined && gen !== cliStatusGenRef.current) return;
176
+ cliStatusRef.current = next;
177
+ setCliStatus(next);
178
+ } catch {
179
+ if (gen !== undefined && gen !== cliStatusGenRef.current) return;
180
+ cliStatusRef.current = {};
181
+ setCliStatus({});
182
+ }
129
183
  }, [client]);
130
184
 
131
185
  const loadFlush = useCallback(async () => {
@@ -165,6 +219,57 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
165
219
  void loadEmployees();
166
220
  }, [loadCliMeta, loadCliStatus, loadEmployees, loadFlush]);
167
221
 
222
+ // #312: the server never pushes — CliStatusCache is demand-driven and has
223
+ // no timer — so a probe still running at mount would leave the notice up
224
+ // forever unless we ask again. Bounded by a wall-clock horizon AND a
225
+ // request cap, neither of which resets on server responses.
226
+ useEffect(() => {
227
+ if (!draft.cli) return;
228
+ const gen = cliStatusGenRef.current + 1;
229
+ cliStatusGenRef.current = gen;
230
+ setCliStatusExhausted(false);
231
+
232
+ const deadline = Date.now() + CLI_STATUS_POLL_HORIZON_MS;
233
+ let attempts = 0;
234
+ let timer: ReturnType<typeof setTimeout> | undefined;
235
+
236
+ const tick = () => {
237
+ if (gen !== cliStatusGenRef.current) return;
238
+ const plan = planCliStatusPoll({
239
+ snapshot: cliStatusRef.current,
240
+ cli: draft.cli,
241
+ attempts,
242
+ now: Date.now(),
243
+ deadline,
244
+ });
245
+ if (plan.kind === 'stop') return;
246
+ if (plan.kind === 'exhausted') {
247
+ setCliStatusExhausted(true);
248
+ return;
249
+ }
250
+ timer = setTimeout(() => {
251
+ if (gen !== cliStatusGenRef.current) return;
252
+ // Only a real request consumes the cap; waiting out a server
253
+ // backoff must not burn attempts.
254
+ attempts += 1;
255
+ void loadCliStatus(gen).then(() => {
256
+ if (gen === cliStatusGenRef.current) tick();
257
+ });
258
+ }, plan.delayMs);
259
+ };
260
+ tick();
261
+
262
+ return () => {
263
+ // Poison in-flight responses for this generation, then stop the timer.
264
+ cliStatusGenRef.current = gen + 1;
265
+ if (timer !== undefined) clearTimeout(timer);
266
+ };
267
+ // NOTE: cliStatus is deliberately NOT a dependency. Re-running this
268
+ // effect on every response would reset the deadline and the attempt
269
+ // counter, making both bounds unbounded in practice. The latest
270
+ // snapshot is read through a ref instead.
271
+ }, [draft.cli, loadCliStatus]);
272
+
168
273
  useEffect(() => {
169
274
  if (state.kind !== 'ready') return;
170
275
  const cliKeys = Object.keys(state.data.perCli || {});
@@ -331,17 +436,7 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
331
436
  {sessionMigrationError ? <span className="settings-field-error" role="alert">{sessionMigrationError}</span> : null}
332
437
  </div>
333
438
  ) : null}
334
- {cliStatus[draft.cli]?.probeState === 'checking' ? (
335
- <div className="settings-inline-notice" role="status" aria-live="polite">상태 확인 중</div>
336
- ) : null}
337
- {cliStatus[draft.cli]?.probeState === 'failing' ? (
338
- // Without this the panel stays silent while every probe errors,
339
- // which is the state #277 reported as an endless "stale".
340
- <div className="settings-inline-notice" role="alert">
341
- 상태 확인 실패 (재시도 중)
342
- {cliStatus[draft.cli]?.probeError ? `: ${cliStatus[draft.cli]!.probeError}` : ''}
343
- </div>
344
- ) : null}
439
+ <CliProbeNotice status={cliStatus[draft.cli]} exhausted={cliStatusExhausted} />
345
440
  <RuntimeHeader
346
441
  cli={draft.cli}
347
442
  cliOptions={cliOptions.length > 0 ? cliOptions : [draft.cli || 'claude']}
@@ -1,4 +1,4 @@
1
- param(
1
+ param(
2
2
  [switch]$Force,
3
3
  [switch]$Update,
4
4
  [switch]$Upstream,
@@ -40,11 +40,46 @@ function Normalize-Version([string]$version) {
40
40
  return $version.Trim().TrimStart('v')
41
41
  }
42
42
 
43
+ function Get-LatestRelease([string]$repoName) {
44
+ return Invoke-RestMethod -Uri "https://api.github.com/repos/$repoName/releases/latest" -Headers @{ "User-Agent" = "cli-jaw-postinstall" }
45
+ }
46
+
43
47
  function Get-LatestTag([string]$repoName) {
44
- $release = Invoke-RestMethod -Uri "https://api.github.com/repos/$repoName/releases/latest" -Headers @{ "User-Agent" = "cli-jaw-postinstall" }
48
+ $release = Get-LatestRelease $repoName
45
49
  return [string]$release.tag_name
46
50
  }
47
51
 
52
+ function Assert-AssetPublished([string]$repoName, [string]$assetName) {
53
+ try {
54
+ $release = Get-LatestRelease $repoName
55
+ } catch {
56
+ # Match the shell installer's network fallback: if GitHub metadata itself is
57
+ # unavailable, let the download report the concrete transport failure.
58
+ Write-Warn "Could not inspect $repoName release assets; the download will verify availability"
59
+ return
60
+ }
61
+
62
+ $published = @($release.assets | ForEach-Object { [string]$_.name } | Where-Object { $_ })
63
+ if ($published -contains $assetName) { return }
64
+
65
+ $tag = if ($release.tag_name) { [string]$release.tag_name } else { "unknown" }
66
+ $publishedText = if ($published.Count -gt 0) { $published -join " " } else { "(none)" }
67
+ $lines = @(
68
+ "$repoName latest release ($tag) has no $assetName.",
69
+ " published: $publishedText"
70
+ )
71
+ if ($repoName -eq "lidge-jun/OfficeCLI") {
72
+ $lines += @(
73
+ "",
74
+ " The supported fork currently publishes only officecli-mac-arm64.",
75
+ " For general XLSX/accessibility work use upstream, which builds every platform:",
76
+ " powershell -ExecutionPolicy Bypass -File `"$PSCommandPath`" -Upstream",
77
+ " The fork is required only for CJK font handling and HWP (rhwp sidecars)."
78
+ )
79
+ }
80
+ Fail ($lines -join [Environment]::NewLine)
81
+ }
82
+
48
83
  Write-Info "Platform: win32/$arch -> $asset"
49
84
 
50
85
  if ((Test-Path $targetBin) -and -not $Force -and -not $Update) {
@@ -85,6 +120,7 @@ if ((Test-Path $targetBin) -and -not $Force -and $Update) {
85
120
  }
86
121
  }
87
122
 
123
+ Assert-AssetPublished $Repo $asset
88
124
  New-Item -ItemType Directory -Force -Path $installDir | Out-Null
89
125
  $downloadUrl = "https://github.com/$Repo/releases/latest/download/$asset"
90
126
 
@@ -1,4 +1,4 @@
1
- #Requires -Version 5.1
1
+ #Requires -Version 5.1
2
2
  <#
3
3
  .SYNOPSIS
4
4
  CLI-JAW one-click installer for native Windows (beta).
@@ -1 +0,0 @@
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 B({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),[B,de]=(0,C.useState)({}),[fe,pe]=(0,C.useState)(!1),[me,he]=(0,C.useState)(null),[ge,_e]=(0,C.useState)(!1),[ve,ye]=(0,C.useState)(null),V=(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]),be=(0,C.useCallback)(async()=>{try{de(await t.get(`/api/cli-status`))}catch{de({})}},[t]),H=(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]),U=(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)(()=>{V(),be(),H(),U()},[V,be,U,H]),(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 W=(0,C.useCallback)((e,t)=>n.set(e,t),[n]),G=(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 V(),await H(),await U()},[t,n,M,k,V,U,H,u,d]);(0,C.useEffect)(()=>{if(r)return r(G),()=>r(null)},[r,G]);let K=o.kind===`ready`?o.data:{},q=K.perCli||{},J=K.activeOverrides||{},Y=(0,C.useMemo)(()=>Object.keys(q),[q]),X=g(p.cli,L),Z=p.provider||X.defaultProvider||X.providers?.[0]||``,xe=p.cli===`pi`,Q=!xe&&(X.providers?.length??0)>0,Se=y(Q&&X.modelsByProvider?.[Z]||X.models,p.model),Ce=Q?b(X,p.model,X.effortsByProvider?.[Z]||X.efforts,Z):b(X,p.model),we=p.workingDir.trim()?null:`Required`,Te=(0,C.useCallback)(async e=>{pe(!0),he(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}he(i(e))}finally{pe(!1)}},[t,d]),Ee=(0,C.useCallback)(async e=>{_e(!0),ye(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}ye(i(e))}finally{_e(!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(),G()},children:[K.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:fe,onClick:()=>void Te(`accept`),children:`Codex App 사용`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:fe,onClick:()=>void Te(`keep`),children:`현재 런타임 유지`})]}),me?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:me}):null]}):null,K.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:ge,onClick:()=>void Ee(`accept`),children:`다중 세션 켜기`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:ge,onClick:()=>void Ee(`keep`),children:`지금 설정 유지`})]}),ve?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:ve}):null]}):null,B[p.cli]?.probeState===`checking`?(0,w.jsx)(`div`,{className:`settings-inline-notice`,role:`status`,"aria-live":`polite`,children:`상태 확인 중`}):null,B[p.cli]?.probeState===`failing`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`alert`,children:[`상태 확인 실패 (재시도 중)`,B[p.cli]?.probeError?`: ${B[p.cli].probeError}`:``]}):null,(0,w.jsx)(ne,{cli:p.cli,cliOptions:Y.length>0?Y:[p.cli||`claude`],provider:Z,providerOptions:xe?[]:X.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:q[e]?.provider||t.defaultProvider||``,model:_(e,q,J),effort:h(e,q,J)};De(),$(n),W(`cli`,{value:e,original:K.cli||``,valid:!0})},onProviderChange:e=>{let t=X.modelsByProvider?.[e]||[],n=X.effortsByProvider?.[e]||[],r=t.includes(p.model)?p.model:t[0]||``,i=v(X,r,p.effort,n,e);$({...p,provider:e,model:r,effort:i}),W(`perCli.${p.cli}.provider`,{value:e,original:q[p.cli]?.provider||X.defaultProvider||``,valid:!0}),W(`activeOverrides.${p.cli}.model`,{value:r,original:_(p.cli,q,J),valid:r.trim().length>0}),W(`activeOverrides.${p.cli}.effort`,{value:i,original:h(p.cli,q,J),valid:!0})},onModelChange:e=>{let t=v(X,e,p.effort,Q?X.effortsByProvider?.[Z]||X.efforts:void 0,Q?Z:void 0);$({...p,model:e,effort:t}),W(`activeOverrides.${p.cli}.model`,{value:e,original:_(p.cli,q,J),valid:e.trim().length>0}),t!==p.effort&&W(`activeOverrides.${p.cli}.effort`,{value:t,original:h(p.cli,q,J),valid:!0})},onEffortChange:e=>{$({...p,effort:e}),W(`activeOverrides.${p.cli}.effort`,{value:e,original:h(p.cli,q,J),valid:!0})},onWorkingDirChange:e=>{$({...p,workingDir:e}),W(`workingDir`,{value:e,original:K.workingDir||``,valid:e.trim().length>0})}}),(0,w.jsx)(re,{value:p.permissions,onChange:e=>{$({...p,permissions:e}),W(`permissions`,{value:e,original:K.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,w.jsx)(ie,{activeCli:p.cli,flushCli:S.cli||``,flushModel:S.model||``,cliOptions:Y,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}),W(`flushCli`,{value:e,original:x.cli||``,valid:!0}),W(`flushModel`,{value:t,original:x.model||``,valid:!0})},onFlushModelChange:e=>{T({...S,model:e}),W(`flushModel`,{value:e,original:x.model||``,valid:!0})}}),(0,w.jsx)(le,{roster:M,original:k,cliOptions:Y,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,B as default,R as splitAgentSaveBundle};
@@ -1 +0,0 @@
1
- import{t as e}from"./MarkdownRenderer-CXrilOsG.js";export{e as MarkdownRenderer};
@@ -1 +0,0 @@
1
- import{a as e,i as t,n,o as r,r as i,t as a}from"./Permissions-CnKt44dN.js";export{a as default,n as isAllowlistValid,i as isPermissionToken,t as isPermissionsAuto,e as parsePermissionsValue,r as seedAutoAllowlist};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-4EGX6M5U-BD3v8KR4.js";export{e as createArchitectureServices};
@@ -1 +0,0 @@
1
- import{r as e,t}from"./bgtask-badge-B0B1nXUs.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
@@ -1 +0,0 @@
1
- import{at as e,it as t}from"./chunk-CSCIHK7Q-CmvetykJ.js";var n=(n,r)=>e.lang.round(t.parse(n)[r]);export{n as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";import{Vt as t}from"./vendor-utils-DJY0EWnQ.js";var n=e((e,n)=>{let r;return n===`sandbox`&&(r=t(`#i`+e)),t(n===`sandbox`?r.nodes()[0].contentDocument.body:`body`).select(`[id="${e}"]`)},`getDiagramElement`);export{n as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";var t=class{constructor(e){this.init=e,this.records=this.init()}static{e(this,`ImperativeState`)}reset(){this.records=this.init()}};export{t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";import{x as t}from"./chunk-CSCIHK7Q-CmvetykJ.js";import{Vt as n}from"./vendor-utils-DJY0EWnQ.js";var r=e(e=>{let{securityLevel:r}=t(),i=n(`body`);return r===`sandbox`&&(i=n((n(`#i${e}`).node()?.contentDocument??document).body)),i.select(`#${e}`)},`selectSvgElement`);export{r as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";import"./chunk-CSCIHK7Q-CmvetykJ.js";import"./chunk-5ZQYHXKU-DVpWOoGS.js";import"./chunk-O5CBEL6O-BWbe_grt.js";import"./chunk-FMBD7UC4-BXpT25MP.js";import"./chunk-BSJP7CBP-ypXC4wBv.js";import"./chunk-L5ZTLDWV-Czv9NkHn.js";import"./chunk-ND2GUHAM-B9SIO-4a.js";import"./chunk-55IACEB6-CQFLXxVc.js";import"./chunk-2J33WTMH-D3OPoEHg.js";import"./chunk-NZK2D7GU-CqOo06-Z.js";import"./chunk-3OPIFGDE-CULJ8ZHF.js";import"./chunk-KSCS5N6A-DtlfLqto.js";import"./chunk-LZXEDZCA-vD7oFdiq.js";import{i as t,n,r,t as i}from"./chunk-727SXJPM-CZjR7q6H.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";import"./chunk-CSCIHK7Q-CmvetykJ.js";import"./chunk-5ZQYHXKU-DVpWOoGS.js";import"./chunk-O5CBEL6O-BWbe_grt.js";import"./chunk-FMBD7UC4-BXpT25MP.js";import"./chunk-BSJP7CBP-ypXC4wBv.js";import"./chunk-L5ZTLDWV-Czv9NkHn.js";import"./chunk-ND2GUHAM-B9SIO-4a.js";import"./chunk-55IACEB6-CQFLXxVc.js";import"./chunk-2J33WTMH-D3OPoEHg.js";import"./chunk-NZK2D7GU-CqOo06-Z.js";import"./chunk-3OPIFGDE-CULJ8ZHF.js";import"./chunk-KSCS5N6A-DtlfLqto.js";import"./chunk-LZXEDZCA-vD7oFdiq.js";import{i as t,n,r,t as i}from"./chunk-727SXJPM-CZjR7q6H.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{n as e}from"./dist-CC2vK_6S.js";export{e as javascript};
@@ -1 +0,0 @@
1
- import{n as e}from"./dist-DN-hkAIC.js";export{e as html};
@@ -1 +0,0 @@
1
- import{t as e}from"./dist-B6T-R4xY.js";export{e as css};
@@ -1 +0,0 @@
1
- import{a as e}from"./dist-CvzAXxlb.js";export{e as markdown};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-N66VUXT2-BXL-FniY.js";export{e as createEventModelingServices};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-UIBZB4QT-S8EH0jZR.js";export{e as createGitGraphServices};
@@ -1 +0,0 @@
1
- import{a as e}from"./iframe-renderer-C7qQJX4c.js";export{e as refreshFileWidget};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-5DO6E6H7-B-FbGqHn.js";export{e as createInfoServices};
@@ -1 +0,0 @@
1
- import{n as e}from"./javascript-Dk2fbl1a.js";export{e as jsonld};
@@ -1 +0,0 @@
1
- import{a as e}from"./memory--Q8Tb5SZ.js";export{e as refreshMemorySidebar};
@@ -1 +0,0 @@
1
- import{t as e}from"./mermaid.core-Dj5GOPe1.js";function t(){return e.setParseErrorHandler(()=>{}),e}export{t as loadMermaid};
@@ -1 +0,0 @@
1
- import{t as e}from"./mermaid.core-Dj5GOPe1.js";export{e as default};
@@ -1 +0,0 @@
1
- import{a as e,o as t}from"./message-history-CfAHmCDW.js";export{e as historyReloadInFlight,t as loadMessages};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-MPE355IW-2ei0PVn0.js";export{e as createPacketServices};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-MZUSXYTE-JO_qTk4K.js";export{e as createPieServices};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-FHYWG6QK-Do5csWDm.js";export{e as createRadarServices};
@@ -1,56 +0,0 @@
1
- import{t as e}from"./state-DxpgDKMO.js";import{i as t,n}from"./api-tVoG39dL.js";import{M as r,O as i,R as a}from"./render-BDso7Yb5.js";import{r as o}from"./locale-DC-ZsWOf.js";import{H as s,V as c}from"./settings-core-BxuFkt4a.js";import{n as l,r as u}from"./provider-icons-VDfahiUp.js";var d=new Set([`ai-e`,`codex-app`]),f=new Set([`ai-e`,`claude-e`,`jwc`,`pi`,`gemini`]),p={},m={cursor:{title:`Enable quota bars (dashboard session)`,description:`Cursor does not expose quota via its CLI. To display usage bars, log in with cursor-agent or manually export your session token from cursor.com DevTools (Application → Cookies → WorkosCursorSessionToken).`,commands:[`cursor-agent login`,`export CURSOR_SESSION_TOKEN="<WorkosCursorSessionToken from cursor.com DevTools>"`,`echo "$CURSOR_SESSION_TOKEN" > ~/.cli-jaw/quota/cursor-session-token && chmod 600 ~/.cli-jaw/quota/cursor-session-token`]},agy:{title:`Enable Gem / Cla quota bars`,description:`Antigravity wraps Google Gemini and Claude models. Log in with antigravity-usage to fetch your remaining Gem/Cla tier quotas.`,commands:[`npx antigravity-usage login`,`npx antigravity-usage --json`]},grok:{title:`Grok login`,description:`Authenticate with Grok (X/Twitter AI) to enable quota tracking and model access through the progrok proxy.`,commands:[`progrok login`]},opencode:{title:`OpenCode Go quota (API key)`,description:`cli-jaw reads your sk- API key from ~/.local/share/opencode/auth.json (opencode-go) or OPENCODE_GO_API_KEY, then calls GET /zen/go/v1/usage. The usage endpoint is not deployed yet — quota bars appear when upstream ships it. Your key still works for models/chat.`,commands:[`opencode providers login`,`export OPENCODE_GO_API_KEY=sk-...`,`curl -s -H "Authorization: Bearer $OPENCODE_GO_API_KEY" https://opencode.ai/zen/go/v1/usage`],note:`Not the opencode-quota plugin (cookie scrape). Built-in opencode stats = session tokens only.`,links:[{label:`OpenCode Go docs`,url:`https://opencode.ai/docs/go/`},{label:`Upstream usage API issue #16017`,url:`https://github.com/anomalyco/opencode/issues/16017`},{label:`Upstream usage API PR #16513`,url:`https://github.com/anomalyco/opencode/pull/16513`},{label:`slkiser/opencode-quota (cookie workaround)`,url:`https://github.com/slkiser/opencode-quota`},{label:`robinebers/openusage (local cost estimate)`,url:`https://github.com/robinebers/openusage`},{label:`Rodowen/oc-go-monitor (cookie + /usage)`,url:`https://github.com/Rodowen/oc-go-monitor`}]}};function h(e,t){return e===`gemini`?t===`Pro`||t===`P`?`P`:t===`Flash`||t===`F`?`F`:t:e===`copilot`&&(t===`Premium`||t===`Prem`||t.includes(`plus monthly subscriber quota`))?`30d`:t.replace(`-hour`,`h`).replace(`-day`,`d`).replace(` Sonnet`,``).replace(` Opus`,``)}function g(e,t){if(t.delegatedProvider)return`Delegates quota/status to ${t.delegatedProvider}`;let n=t.quotaSource?.match(/^not-exposed-by-(.*?)-cli$/);return n?`Quota not exposed by ${n[1].toUpperCase()} CLI`:t.quotaSource?t.quotaSource:e===`opencode`?`Auth/status only`:`Usage data not exposed by this CLI`}function _(e){return e.toLowerCase().replace(/^cursor\s+/i,``).trim()}var v=new Set([`auth/status only`,`google cloud code`,`runtime-checked`]),y=new Set([`cursor`,`antigravity.google`,`antigravity`,`max`,`copilot`,`gemini`]);function b(e,t){let n=t.account;if(!n)return[];let r=[];n.email&&r.push(n.email);let i=new Set(r.map(_));for(let e of[n.plan,n.tier]){if(!e)continue;let t=_(e);if(!(!t||v.has(t))&&!y.has(t)&&!i.has(t)){i.add(t),r.push(e);break}}return r}function x(e,t,n=[]){let i=m[e],a=[...n,...i?i.commands:[],...i?.note?[i.note]:[]].filter(Boolean);return a.length?`<button type="button" class="help-trigger" style="margin-left:4px" data-cli-help="${r(a.join(`
2
- `))}"${i?.description?` data-cli-help-desc="${r(i.description)}"`:``}${i?.links?.length?` data-cli-help-links="${r(JSON.stringify(i.links))}"`:``} aria-label="Setup help">?</button>`:``}function S(e,t){let n=m[e],i=t.sessionUsage,a=[];i?.primaryModelId&&a.push(`Model: ${i.primaryModelId}`),i?.contextTokensUsed&&i?.contextWindowTokens?a.push(`Session context: ${Math.round(i.contextTokensUsed).toLocaleString()} / ${Math.round(i.contextWindowTokens).toLocaleString()} tokens`):i?.turnCount&&a.push(`Session turns: ${Math.round(i.turnCount).toLocaleString()}`);let o=x(e,t,a);if(n){let e=n.commands.map(e=>`
3
- <div style="margin-top:3px"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px;word-break:break-all">${r(e)}</code></div>
4
- `).join(``),t=n.description?`<div style="margin-top:3px;color:var(--text-dim);font-size:10px">${r(n.description)}</div>`:``,i=n.links?.length?`<ul style="margin:6px 0 0;padding-left:16px;font-size:10px">${n.links.map(e=>`<li><a href="${r(e.url)}" target="_blank" rel="noopener noreferrer">${r(e.label)}</a></li>`).join(``)}</ul>`:``;return`
5
- <details class="cli-setup-details" style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
6
- <summary style="color:var(--text);font-weight:600;cursor:pointer;list-style:none">${r(n.title)}${o}</summary>
7
- ${t}
8
- ${i}
9
- ${e}
10
- ${n.note?`<div style="margin-top:4px;opacity:0.75">${r(n.note)}</div>`:``}
11
- </details>
12
- `}return`
13
- <div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
14
- <div style="color:var(--text);font-weight:600">${r(t.displayTier||u(e))}${o}</div>
15
- <div style="margin-top:2px">${r(g(e,t))}</div>
16
- </div>
17
- `}var C=new Set([0,600,1800]),w=0,T=2e3,E=4e3,D=null,O=!1,k=0,A=null,j=null,M=`cliStatusCollapsed`;function N(){try{return window.parent!==window}catch{return!0}}function ee(){try{return localStorage.getItem(M)===`true`}catch{return!1}}function P(e){try{localStorage.setItem(M,e?`true`:`false`)}catch{}}function F(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function I(){j!=null&&(window.clearTimeout(j),j=null)}function L(e,t=``){I();let n=document.getElementById(`cliStatusRefreshBtn`),r=document.getElementById(`cliStatusRefreshState`),i=n?.querySelector(`.cli-refresh-label`);n&&(n.classList.remove(`is-refreshing`,`is-success`,`is-error`),n.disabled=e===`refreshing`,e===`idle`?n.removeAttribute(`aria-busy`):n.setAttribute(`aria-busy`,e===`refreshing`?`true`:`false`),e===`refreshing`&&n.classList.add(`is-refreshing`),e===`success`&&n.classList.add(`is-success`),e===`error`&&n.classList.add(`is-error`)),i&&(i.textContent=e===`refreshing`?`Refreshing...`:`Refresh`),r&&(r.textContent=t,r.dataset.state=e)}function R(e,t){L(e,t),j=window.setTimeout(()=>{L(`idle`)},E)}var z=!ee();function te(){return z}function ne(){z=!0;let e=document.getElementById(`cliStatusList`),t=document.getElementById(`cliStatusHeader`);e&&(e.style.display=`block`),t&&t.classList.add(`expanded`),P(!1),J(!0)}function re(){let e=document.getElementById(`cliStatusHeader`),t=document.getElementById(`cliStatusList`);!e||!t||(z?(t.style.display=`block`,e.classList.add(`expanded`)):t.style.display=`none`,e.addEventListener(`click`,()=>{z=!z,t.style.display=z?`block`:`none`,e.classList.toggle(`expanded`,z),P(!z),z&&J(!0)}))}function B(){let e=Number(localStorage.getItem(`cliStatusInterval`)||w);return C.has(e)?e:w}function V(e=B()){let t=document.getElementById(`cliStatusInterval`);if(!t)return;let n=String(e);t.value=Array.from(t.options).some(e=>e.value===n)?n:String(w)}function H(){D!=null&&(window.clearInterval(D),D=null);let e=B();V(e),!(e<=0)&&(D=window.setInterval(()=>{document.hidden||!z||!N()&&!document.hasFocus()||J(!0)},e*1e3))}function U(){O||!N()||(O=!0,window.addEventListener(`message`,e=>{let t=e.data;t?.type!==`jaw-preview-visibility`||t.visible!==!0||z&&J(!1)}))}function W(e){let t=Number(e),n=C.has(t)?t:w;localStorage.setItem(`cliStatusInterval`,String(n)),V(n),H()}function G(t,r,i){N()&&(async()=>{if(await new Promise(e=>window.setTimeout(e,600)),t!==k)return;let i=await n(`/api/quota`);t!==k||!i||(e.cliStatusCache={cliStatus:r,quota:i},e.cliStatusTs=Date.now(),Y({cliStatus:r,quota:i}))})()}async function K(t,r,i){let a=await n(`/api/quota`);if(t!==k)return!1;let o=a??i??null;return e.cliStatusCache={cliStatus:r,quota:o},a&&(e.cliStatusTs=Date.now()),Y({cliStatus:r,quota:o}),a||G(t,r,i),!!a}function q(e,t,n,r){let i=()=>{K(t,n,r).catch(()=>{})};if(e)return K(t,n,r);window.setTimeout(i,T)}async function J(t=!1){if(z){if(t&&L(`refreshing`,`Refreshing quota...`),A)if(t)await A.catch(()=>{});else return;A=(async()=>{let r=++k,i=document.getElementById(`cliStatusList`);try{let a=B();if(!t&&e.cliStatusCache&&a>0&&Date.now()-e.cliStatusTs<a*1e3){Y({cliStatus:e.cliStatusCache?.cliStatus,quota:e.cliStatusCache?.quota});return}let o=e.cliStatusCache?.quota;i&&!o&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Loading...</div>`);let s=await n(`/api/cli-status`);if(r!==k)return;if(!s||typeof s!=`object`){i&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`),t&&R(`error`,`Refresh failed`);return}Y({cliStatus:s,quota:o??null});let c=await q(t,r,s,o);t&&r===k&&R(`success`,`${c?`Updated`:`Checked`} ${F(new Date)}`)}catch{i&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`),t&&R(`error`,`Refresh failed`)}})().finally(()=>{A=null}),await A}}function Y(e){let{cliStatus:t,quota:o}=e,g=document.getElementById(`cliStatusList`),_={agy:{install:`curl -fsSL https://antigravity.google/cli/install.sh | bash`,auth:`agy runtime auth, antigravity-usage login, or ~/.gemini oauth for quota`},"ai-e":{install:`Install AI-E helper`,auth:`delegates to selected AI-E provider`},claude:{install:`npm i -g @anthropic-ai/claude-code`,auth:`claude auth`},"claude-e":{install:`Install claude-e helper`,auth:`claude auth`},codex:{install:`npm i -g @openai/codex`,auth:`codex login`},"codex-app":{install:`npm i -g @openai/codex`,auth:`codex login`},cursor:{install:`curl https://cursor.com/install -fsS | bash`,auth:`cursor-agent login, CURSOR_API_KEY, or CURSOR_SESSION_TOKEN for quota`},"kiro-code":{install:`Install Kiro CLI from https://kiro.dev/docs/cli`,auth:`kiro-cli login`},gemini:{install:`npm i -g @google/gemini-cli`,auth:`gemini (${a(`cli.gemini.auth`)})`},grok:{install:`curl -fsSL https://x.ai/cli/install.sh | bash`,auth:`grok login --oauth`},opencode:{install:`npm i -g opencode-ai`,auth:`opencode auth`},copilot:{install:`npm i -g copilot`,auth:a(`cli.copilot.authHint`)}},v=``;if(!t||typeof t!=`object`){g&&(g.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`);return}for(let[e,n]of Object.entries(t)){if(f.has(e))continue;let t=c(n),g=t===`checking`,y=t===`probe-failing`,C=t===`capability-failed`,w=g||y?void 0:o?.[e],T;T=g?`checking`:y?`warn`:!n.available||C?`missing`:!w||w.error?`ok`:w.authenticated===!1?`warn`:`ok`;let E=``,D=w?.quotaCapable===!1&&w.authenticated!==!1&&n.available&&!p[e]&&!d.has(e);if(w?.account&&!D){let t=b(e,w);t.length&&(E=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${r(t.join(` · `))}</div>`)}let O=``;if(!g&&!y&&(!n.available||T===`warn`)){let t=_[e];if(t){let e=!n.available,i=a(e?`cli.authRequired`:`cli.notAuthenticated`),o=e?`var(--error)`:`var(--warning)`;O=`
18
- <div style="font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--surface);border-radius:4px;border-left:2px solid ${o}">
19
- <div style="color:${o};margin-bottom:3px">${i}</div>
20
- ${e?`<div style="color:var(--text-dim)"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${r(t.install)}</code></div>`:``}
21
- <div style="color:var(--text-dim)${e?`;margin-top:2px`:``}"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${r(t.auth)}</code></div>
22
- </div>
23
- `}}let k=``,A=p[e];if(!d.has(e)){if(A&&n.available)k=`
24
- <div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
25
- ${r(A)}
26
- </div>
27
- `;else if(D)k=S(e,w);else if(w?.windows?.length)k=w.windows.map(t=>{let n=s(t),i=n.percent??0,a=i>80?`var(--error)`:i>50?`var(--warning)`:`var(--info)`,o=h(e,t.label),c=``;if(t.resetsAt){let e=new Date(typeof t.resetsAt==`number`?t.resetsAt*1e3:t.resetsAt),n=new Date;c=e.toDateString()===n.toDateString()?`${e.getHours()}:${String(e.getMinutes()).padStart(2,`0`)}`:`${e.getMonth()+1}/${e.getDate()}`}let l=n.percent==null?`<span style="flex:1"></span><span style="min-width:52px;text-align:right" title="Exact percentage unavailable">${r(n.text)}</span>`:`<div style="flex:1;height:4px;background:var(--border);border-radius:2px;overflow:hidden"><div style="width:${i}%;height:100%;background:${a};border-radius:2px"></div></div><span style="width:24px;text-align:right">${n.text}</span>`;return`
28
- <div style="display:flex;align-items:center;gap:4px;margin-left:16px;font-size:10px;color:var(--text-dim)">
29
- <span style="min-width:18px;max-width:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">${r(o)}</span>
30
- ${l}
31
- ${c?`<span style="width:30px;text-align:right;opacity:0.6">${c}</span>`:``}
32
- </div>
33
- `}).join(``);else if(w?.error&&n.available){let e=w.reason===`rate_limited`?`Rate limited — retry in a moment`:`Usage data unavailable`;k=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px;opacity:0.7">${i.warning} ${e}</div>`}}let j=w?.quotaCapable&&m[e]?x(e,w):``,M=w?.billing?.usedUsd!=null&&w?.billing?.limitUsd?`<span style="margin-left:auto;font-size:10px;color:var(--text-dim);white-space:nowrap">$${w.billing.usedUsd.toFixed(1)}/$${w.billing.limitUsd}</span>`:``,N=g?`<div role="status" aria-live="polite" style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px">상태 확인 중</div>`:y?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">상태 확인 실패 · 재시도 중${n.probeError?` · ${r(n.probeError)}`:``}</div>`:C?`<div role="status" style="font-size:10px;color:var(--error);margin:2px 0 0 16px">설치됨, app-server 사용 불가${n.reason?` · ${r(n.reason)}`:``}</div>`:t===`stale`?`<div role="status" style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px">이전 상태 표시 중 · 새로 확인 중</div>`:``;v+=`
34
- <div class="settings-group" style="margin-bottom:6px;padding:8px 10px">
35
- <div class="cli-status-row" style="display:flex;align-items:center">
36
- <span class="cli-dot ${T}"></span>
37
- <span class="cli-provider-icon" aria-hidden="true">${l(e)||``}</span>
38
- <span class="cli-name" style="font-weight:600">${r(u(e))}${j}</span>${e===`copilot`?`<button id="copilotKeychainBtn" style="font-size:9px;margin-left:6px;padding:1px 5px;background:var(--border);color:var(--text-dim);border:1px solid var(--text-dim);border-radius:3px;cursor:pointer;vertical-align:middle;line-height:1" title="${a(`copilot.keychainHint`)}">${i.key}</button>`:``}${M}
39
- </div>
40
- ${E}
41
- ${N}
42
- ${O}
43
- ${k}
44
- </div>
45
- `}g&&(g.innerHTML=v);let y=Object.entries(t),C=y.some(([,e])=>c(e)===`probe-failing`);!y.some(([e,t])=>{if(c(t)!==`ready`)return!1;let n=o?.[e];return!n||n.authenticated!==!1})&&!C&&y.length>0&&g&&g.insertAdjacentHTML(`afterbegin`,`<div style="padding:8px 10px;margin-bottom:8px;background:var(--warning-dim);border:1px solid var(--warning);border-radius:6px;font-size:11px;color:var(--warning)">
46
- ${i.warning} ${a(`cli.noReadyCli`)}
47
- </div>`);let w=document.getElementById(`copilotKeychainBtn`);w&&w.addEventListener(`click`,async()=>{let e=w;e.disabled=!0,e.innerHTML=i.hourglass;try{let t=await n(`/api/copilot/refresh`,{method:`POST`});e.innerHTML=t?.ok?i.check:i.error,t?.ok&&await J(!0)}catch{e.innerHTML=i.error}setTimeout(()=>{e.innerHTML=i.key,e.disabled=!1},2e3)}),g&&g.querySelectorAll(`[data-cli-help]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation();let n=e.getAttribute(`data-cli-help`)||``,r=e.getAttribute(`data-cli-help-desc`)||void 0,i=e.getAttribute(`data-cli-help-links`),a;if(i)try{a=JSON.parse(i)}catch{a=void 0}ie(n,r,a)})})}function ie(e,t,n){let i=document.getElementById(`cliHelpOverlay`);i&&i.remove();let a=document.createElement(`div`);a.id=`cliHelpOverlay`,a.className=`mcp-help-overlay`,a.addEventListener(`click`,e=>{e.target===a&&a.remove()});let o=document.createElement(`div`);o.className=`mcp-help-inner`;let s=e.split(`
48
- `).filter(Boolean);o.innerHTML=`
49
- <h4>CLI Setup</h4>
50
- ${t?`<p style="color:var(--text-dim);font-size:12px;margin:4px 0 8px">${r(t)}</p>`:``}
51
- ${n?.length?`<ul style="margin:0 0 10px 18px;padding:0;font-size:12px">${n.map(e=>`<li style="margin:4px 0"><a href="${r(e.url)}" target="_blank" rel="noopener noreferrer">${r(e.label)}</a></li>`).join(``)}</ul>`:``}
52
- ${s.map(e=>`<p><code>${r(e)}</code></p>`).join(``)}
53
- <div style="text-align:right;margin-top:12px">
54
- <button type="button" class="btn-save" id="cliHelpClose">OK</button>
55
- </div>
56
- `,a.append(o),document.body.append(a),o.querySelector(`#cliHelpClose`)?.addEventListener(`click`,()=>a.remove()),document.addEventListener(`keydown`,function e(t){t.key===`Escape`&&(a.remove(),document.removeEventListener(`keydown`,e,!0))},!0)}function ae(){n(`/api/prompt`).then(e=>{if(!e)return;let t=document.getElementById(`modalPromptEditor`);t&&(t.value=e.content||``),document.getElementById(`promptModal`)?.classList.add(`open`)})}function oe(e){e&&e.target!==e.currentTarget||document.getElementById(`promptModal`)?.classList.remove(`open`)}async function se(){await t(`/api/prompt`,`PUT`,{content:document.getElementById(`modalPromptEditor`)?.value||``}),document.getElementById(`promptModal`)?.classList.remove(`open`)}var X=[],Z=!1;async function ce(){let e=await n(`/api/prompt-templates`);e&&(X=e.templates,Z=!1,le(e.tree),$(`tree`),document.getElementById(`templateModal`)?.classList.add(`open`))}function le(e){let t=document.getElementById(`templateTree`);if(t){t.innerHTML=``;for(let n of e){let e=document.createElement(`div`);e.style.cssText=`background:var(--bg);border:1px solid var(--accent);border-radius:6px;padding:8px 10px;margin:8px 0 4px;font-size:12px;color:var(--accent);font-weight:600`,e.textContent=`${n.emoji} ${n.label}`,t.appendChild(e);for(let e of n.children){let n=X.find(t=>t.id===e);if(!n)continue;let a=document.createElement(`div`);a.style.cssText=`background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:6px 10px;margin:2px 0 2px 24px;font-size:12px;cursor:pointer;transition:border-color .15s`,a.innerHTML=`${i.file} ${r(n.filename)}`,a.addEventListener(`mouseenter`,()=>{a.style.borderColor=`var(--accent2)`}),a.addEventListener(`mouseleave`,()=>{a.style.borderColor=`var(--border)`}),a.addEventListener(`click`,()=>{Q(n)}),t.appendChild(a)}}}}function Q(e){let t=document.getElementById(`templateEditor`);t.value=e.content,t.dataset.templateId=e.id,t.readOnly=!0,Z=!1;let n=document.getElementById(`templateEditorLabel`);n&&(n.innerHTML=`${i.file} ${r(e.filename)}`);let a=e.content.match(/\{\{[A-Z_]+\}\}/g),s=document.getElementById(`templateVars`);s&&(s.textContent=a?`vars: ${[...new Set(a)].join(`, `)}`:`no variables`);let c=document.getElementById(`templateSaveBtn`);c&&(c.style.display=`none`);let l=document.getElementById(`templateDevToggle`);l&&(l.style.color=`var(--text-dim)`,l.style.borderColor=`var(--border)`,l.innerHTML=`${i.tool} ${o(`devMode`)}`);let u=document.getElementById(`templateModalTitle`);u&&(u.innerHTML=`${i.file} ${r(e.filename)}`),$(`editor`)}function ue(){if(!Z&&!confirm(o(`promptEditWarning`)))return;Z=!Z;let e=document.getElementById(`templateEditor`);e.readOnly=!Z;let t=document.getElementById(`templateSaveBtn`);t&&(t.style.display=Z?``:`none`);let n=document.getElementById(`templateDevToggle`);n&&(n.style.color=Z?`var(--stop-btn)`:`var(--text-dim)`,n.style.borderColor=Z?`var(--stop-btn)`:`var(--border)`,n.innerHTML=Z?`${i.lockOpen} ${o(`devModeOn`)}`:`${i.tool} ${o(`devMode`)}`)}async function de(){let e=document.getElementById(`templateEditor`),n=e.dataset.templateId;if(!n)return;await t(`/api/prompt-templates/${n}`,`PUT`,{content:e.value});let a=document.getElementById(`templateEditorLabel`);a&&(a.innerHTML=`${i.check} ${o(`savedAndReloaded`)}`,setTimeout(()=>{a.innerHTML=`${i.file} ${r(n)}.md`},2e3));let s=X.find(e=>e.id===n);s&&(s.content=e.value)}function $(e){let t=document.getElementById(`templateTreeView`),n=document.getElementById(`templateEditorView`);t&&(t.style.display=e===`tree`?``:`none`),n&&(n.style.display=e===`editor`?`flex`:`none`);let r=document.getElementById(`templateModalTitle`);r&&e===`tree`&&(r.innerHTML=`${i.plan} ${o(`promptStructure`)}`)}function fe(){$(`tree`)}function pe(e){e&&e.target!==e.currentTarget||document.getElementById(`templateModal`)?.classList.remove(`open`)}export{se as a,ue as c,re as d,te as f,W as g,H as h,ce as i,ne as l,J as m,pe as n,de as o,N as p,ae as r,fe as s,oe as t,U as u};
@@ -1 +0,0 @@
1
- import{d as e,l as t}from"./settings-core-BxuFkt4a.js";export{t as refreshHeaderFromSettingsChange,e as savePerCli};
@@ -1 +0,0 @@
1
- import{a as e,d as t,p as n}from"./settings-core-BxuFkt4a.js";import"./settings-CqnIqxkG.js";export{e as loadSettings,t as savePerCli,n as updateSettings};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-CwRBcm3m.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-cm0U58n7.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-AGHRB4JF-BXLzSehp.js";import"./chunk-CSCIHK7Q-CmvetykJ.js";import"./chunk-5ZQYHXKU-DVpWOoGS.js";import"./chunk-O5CBEL6O-BWbe_grt.js";import"./chunk-BSJP7CBP-ypXC4wBv.js";import"./chunk-L5ZTLDWV-Czv9NkHn.js";import"./chunk-55IACEB6-CQFLXxVc.js";import"./chunk-2J33WTMH-D3OPoEHg.js";import"./chunk-NZK2D7GU-CqOo06-Z.js";import"./chunk-3OPIFGDE-CULJ8ZHF.js";import"./chunk-KSCS5N6A-DtlfLqto.js";import"./chunk-LZXEDZCA-vD7oFdiq.js";import{i as t,n,r,t as i}from"./chunk-AQP2D5EJ-BlGjnlsV.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-WCWK7LTN-EgrNk7Dj.js";export{e as createTreeViewServices};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-BR22UD5L-MK8KuB9X.js";export{e as createTreemapServices};
@@ -1 +0,0 @@
1
- import{p as e}from"./iframe-renderer-C7qQJX4c.js";import{d as t,o as n}from"./message-history-CfAHmCDW.js";import{r}from"./ui-C-LHMki1.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-D69GtSOc.js";import{n as e}from"./chunk-PUPMXCY4-aFTMGBaR.js";export{e as createWardleyServices};