cli-jaw 2.17.43 → 2.17.44

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 (223) hide show
  1. package/README.md +13 -2
  2. package/dist/bin/commands/slack.js +73 -7
  3. package/dist/bin/commands/slack.js.map +1 -1
  4. package/dist/server.js +46 -1
  5. package/dist/server.js.map +1 -1
  6. package/dist/src/agent/calendar-context.js +23 -0
  7. package/dist/src/agent/calendar-context.js.map +1 -0
  8. package/dist/src/agent/claude-runtime-run.js +10 -1
  9. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  10. package/dist/src/agent/cursor-acp-models.js +139 -0
  11. package/dist/src/agent/cursor-acp-models.js.map +1 -0
  12. package/dist/src/agent/events/cursor.js +28 -4
  13. package/dist/src/agent/events/cursor.js.map +1 -1
  14. package/dist/src/agent/lifecycle-handler.js +8 -2
  15. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  16. package/dist/src/agent/native-runtime-run.js +22 -1
  17. package/dist/src/agent/native-runtime-run.js.map +1 -1
  18. package/dist/src/agent/runtime/acp/config.js +76 -11
  19. package/dist/src/agent/runtime/acp/config.js.map +1 -1
  20. package/dist/src/agent/runtime/acp/cursor-session.js +6 -1
  21. package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -1
  22. package/dist/src/agent/runtime/liveness.js +24 -0
  23. package/dist/src/agent/runtime/liveness.js.map +1 -0
  24. package/dist/src/agent/runtime/start-failure.js +61 -0
  25. package/dist/src/agent/runtime/start-failure.js.map +1 -0
  26. package/dist/src/agent/spawn/queue.js +11 -6
  27. package/dist/src/agent/spawn/queue.js.map +1 -1
  28. package/dist/src/agent/spawn.js +59 -17
  29. package/dist/src/agent/spawn.js.map +1 -1
  30. package/dist/src/cli/api-auth.js +6 -0
  31. package/dist/src/cli/api-auth.js.map +1 -1
  32. package/dist/src/manager/design/watcher.js +10 -2
  33. package/dist/src/manager/design/watcher.js.map +1 -1
  34. package/dist/src/memory/heartbeat.js +6 -0
  35. package/dist/src/memory/heartbeat.js.map +1 -1
  36. package/dist/src/messaging/channel-validate.js +5 -3
  37. package/dist/src/messaging/channel-validate.js.map +1 -1
  38. package/dist/src/messaging/redact.js +30 -8
  39. package/dist/src/messaging/redact.js.map +1 -1
  40. package/dist/src/messaging/send.js +7 -0
  41. package/dist/src/messaging/send.js.map +1 -1
  42. package/dist/src/orchestrator/collect.js +5 -3
  43. package/dist/src/orchestrator/collect.js.map +1 -1
  44. package/dist/src/orchestrator/gateway.js +10 -3
  45. package/dist/src/orchestrator/gateway.js.map +1 -1
  46. package/dist/src/orchestrator/pipeline.js +21 -9
  47. package/dist/src/orchestrator/pipeline.js.map +1 -1
  48. package/dist/src/orchestrator/request-registry.js +2 -0
  49. package/dist/src/orchestrator/request-registry.js.map +1 -1
  50. package/dist/src/prompt/builder.js +74 -6
  51. package/dist/src/prompt/builder.js.map +1 -1
  52. package/dist/src/prompt/templates/a1-system.md +22 -5
  53. package/dist/src/routes/messaging.js +105 -27
  54. package/dist/src/routes/messaging.js.map +1 -1
  55. package/dist/src/routes/settings.js +20 -8
  56. package/dist/src/routes/settings.js.map +1 -1
  57. package/dist/src/routes/slack-tools.js +176 -0
  58. package/dist/src/routes/slack-tools.js.map +1 -0
  59. package/dist/src/slack/action-rate.js +43 -0
  60. package/dist/src/slack/action-rate.js.map +1 -0
  61. package/dist/src/slack/action-runtime.js +243 -0
  62. package/dist/src/slack/action-runtime.js.map +1 -0
  63. package/dist/src/slack/action-store.js +84 -0
  64. package/dist/src/slack/action-store.js.map +1 -0
  65. package/dist/src/slack/action-types.js +6 -0
  66. package/dist/src/slack/action-types.js.map +1 -0
  67. package/dist/src/slack/actions-canvas.js +108 -0
  68. package/dist/src/slack/actions-canvas.js.map +1 -0
  69. package/dist/src/slack/actions-channel.js +88 -0
  70. package/dist/src/slack/actions-channel.js.map +1 -0
  71. package/dist/src/slack/actions-interactions.js +204 -0
  72. package/dist/src/slack/actions-interactions.js.map +1 -0
  73. package/dist/src/slack/actions-lists.js +308 -0
  74. package/dist/src/slack/actions-lists.js.map +1 -0
  75. package/dist/src/slack/actions-message.js +117 -0
  76. package/dist/src/slack/actions-message.js.map +1 -0
  77. package/dist/src/slack/actions-resources.js +62 -0
  78. package/dist/src/slack/actions-resources.js.map +1 -0
  79. package/dist/src/slack/actions-rts.js +88 -0
  80. package/dist/src/slack/actions-rts.js.map +1 -0
  81. package/dist/src/slack/actions-schedule.js +214 -0
  82. package/dist/src/slack/actions-schedule.js.map +1 -0
  83. package/dist/src/slack/actions.js +17 -0
  84. package/dist/src/slack/actions.js.map +1 -0
  85. package/dist/src/slack/api.js +56 -9
  86. package/dist/src/slack/api.js.map +1 -1
  87. package/dist/src/slack/blocks.js +162 -0
  88. package/dist/src/slack/blocks.js.map +1 -0
  89. package/dist/src/slack/bot.js +562 -378
  90. package/dist/src/slack/bot.js.map +1 -1
  91. package/dist/src/slack/commands.js +24 -5
  92. package/dist/src/slack/commands.js.map +1 -1
  93. package/dist/src/slack/context.js +15 -4
  94. package/dist/src/slack/context.js.map +1 -1
  95. package/dist/src/slack/conversation.js +135 -33
  96. package/dist/src/slack/conversation.js.map +1 -1
  97. package/dist/src/slack/events.js +41 -17
  98. package/dist/src/slack/events.js.map +1 -1
  99. package/dist/src/slack/format.js +181 -0
  100. package/dist/src/slack/format.js.map +1 -1
  101. package/dist/src/slack/history.js +133 -8
  102. package/dist/src/slack/history.js.map +1 -1
  103. package/dist/src/slack/ingress.js +26 -9
  104. package/dist/src/slack/ingress.js.map +1 -1
  105. package/dist/src/slack/interaction-store.js +56 -0
  106. package/dist/src/slack/interaction-store.js.map +1 -0
  107. package/dist/src/slack/manifest.js +3 -0
  108. package/dist/src/slack/manifest.js.map +1 -1
  109. package/dist/src/slack/message-content.js +132 -0
  110. package/dist/src/slack/message-content.js.map +1 -0
  111. package/dist/src/slack/message.js +58 -0
  112. package/dist/src/slack/message.js.map +1 -0
  113. package/dist/src/slack/notice-transport.js +49 -19
  114. package/dist/src/slack/notice-transport.js.map +1 -1
  115. package/dist/src/slack/operator-auth.js +62 -0
  116. package/dist/src/slack/operator-auth.js.map +1 -0
  117. package/dist/src/slack/progress-activity.js +210 -0
  118. package/dist/src/slack/progress-activity.js.map +1 -0
  119. package/dist/src/slack/progress-detail.js +473 -0
  120. package/dist/src/slack/progress-detail.js.map +1 -0
  121. package/dist/src/slack/progress-files.js +70 -0
  122. package/dist/src/slack/progress-files.js.map +1 -0
  123. package/dist/src/slack/progress-lifecycle.js +223 -0
  124. package/dist/src/slack/progress-lifecycle.js.map +1 -0
  125. package/dist/src/slack/progress-restore.js +81 -0
  126. package/dist/src/slack/progress-restore.js.map +1 -0
  127. package/dist/src/slack/progress.js +325 -143
  128. package/dist/src/slack/progress.js.map +1 -1
  129. package/dist/src/slack/quote.js +227 -0
  130. package/dist/src/slack/quote.js.map +1 -0
  131. package/dist/src/slack/render-features.js +105 -0
  132. package/dist/src/slack/render-features.js.map +1 -0
  133. package/dist/src/slack/reply-delivery.js +110 -0
  134. package/dist/src/slack/reply-delivery.js.map +1 -0
  135. package/dist/src/slack/rts-output-store.js +143 -0
  136. package/dist/src/slack/rts-output-store.js.map +1 -0
  137. package/dist/src/slack/scope-status.js +17 -3
  138. package/dist/src/slack/scope-status.js.map +1 -1
  139. package/dist/src/slack/search-quote.js +70 -0
  140. package/dist/src/slack/search-quote.js.map +1 -0
  141. package/dist/src/slack/search.js +54 -0
  142. package/dist/src/slack/search.js.map +1 -0
  143. package/dist/src/slack/send-handler.js +11 -7
  144. package/dist/src/slack/send-handler.js.map +1 -1
  145. package/dist/src/slack/send-only-client.js +116 -79
  146. package/dist/src/slack/send-only-client.js.map +1 -1
  147. package/dist/src/slack/table-content.js +253 -0
  148. package/dist/src/slack/table-content.js.map +1 -0
  149. package/dist/src/slack/table-verification.js +64 -0
  150. package/dist/src/slack/table-verification.js.map +1 -0
  151. package/dist/src/slack/task-input.js +55 -0
  152. package/dist/src/slack/task-input.js.map +1 -0
  153. package/dist/src/slack/tool-access.js +127 -0
  154. package/dist/src/slack/tool-access.js.map +1 -0
  155. package/dist/src/slack/tool-capabilities.js +47 -0
  156. package/dist/src/slack/tool-capabilities.js.map +1 -0
  157. package/dist/src/slack/tool-context.js +91 -0
  158. package/dist/src/slack/tool-context.js.map +1 -0
  159. package/dist/src/slack/verified-workspace.js +17 -6
  160. package/dist/src/slack/verified-workspace.js.map +1 -1
  161. package/dist/src/trace/redact.js +2 -1
  162. package/dist/src/trace/redact.js.map +1 -1
  163. package/package.json +1 -1
  164. package/public/dist/.vite/manifest.json +102 -102
  165. package/public/dist/assets/{Agent-CQ4EBgY8.js → Agent-CNad_A6t.js} +1 -1
  166. package/public/dist/assets/{ChannelEnablementControl-JsYvNMlM.js → ChannelEnablementControl-DwUDKjX9.js} +4 -4
  167. package/public/dist/assets/{ChannelSetupEntry-BpyRWEUE.js → ChannelSetupEntry-DH0AuNNX.js} +1 -1
  168. package/public/dist/assets/{ChannelsDiscord-DNfvz1jn.js → ChannelsDiscord-7NmoTjR7.js} +1 -1
  169. package/public/dist/assets/{ChannelsSlack-DzpxIdgW.js → ChannelsSlack-Ba0ax6iT.js} +1 -1
  170. package/public/dist/assets/{ChannelsTelegram-CUhFc5s6.js → ChannelsTelegram-DKA9atf2.js} +1 -1
  171. package/public/dist/assets/{app-Q0prKOFx.js → app-9OQNfmqw.js} +4 -4
  172. package/public/dist/assets/{bgtask-badge-DAcWaUfS.js → bgtask-badge-BvxHqMGi.js} +1 -1
  173. package/public/dist/assets/bgtask-badge-DeSZJGNN.js +1 -0
  174. package/public/dist/assets/{employees-CWS3Juca.js → employees-CkUqN4oh.js} +1 -1
  175. package/public/dist/assets/{iframe-renderer-DCDKBMb7.js → iframe-renderer-C2gchtOj.js} +2 -2
  176. package/public/dist/assets/iframe-renderer-DfvACXIn.js +1 -0
  177. package/public/dist/assets/{manager-v6GYfoPB.js → manager-rb5X-4DJ.js} +1 -1
  178. package/public/dist/assets/{memory-DhNdKZLO.js → memory-BiWzpoBq.js} +1 -1
  179. package/public/dist/assets/memory-Ckp1Eq5a.js +1 -0
  180. package/public/dist/assets/message-history-Bv0l_t7O.js +1 -0
  181. package/public/dist/assets/{message-history-DbRTl1P0.js → message-history-CuFefS02.js} +1 -1
  182. package/public/dist/assets/{render-DP8SJtdZ.js → render-DUGqq9Mu.js} +1 -1
  183. package/public/dist/assets/{settings-85n9NjvX.js → settings-BqUHavbH.js} +1 -1
  184. package/public/dist/assets/settings-C81Kf9uX.js +1 -0
  185. package/public/dist/assets/{settings-C9_D-pn0.js → settings-DQ1fLygB.js} +31 -30
  186. package/public/dist/assets/{settings-core-BcVD2FgV.js → settings-core-CzdXfoOK.js} +1 -1
  187. package/public/dist/assets/settings-core-DO_5M7Lv.js +1 -0
  188. package/public/dist/assets/{settings-embedding-BSpq785l.js → settings-embedding-BAKFrVLV.js} +1 -1
  189. package/public/dist/assets/{settings-types-B09BmpYe.js → settings-types-D3cd6SWy.js} +1 -1
  190. package/public/dist/assets/{sidebar-BVhLb5Ft.js → sidebar-CvGbp9x5.js} +3 -3
  191. package/public/dist/assets/skills-DFpPmMUR.js +1 -0
  192. package/public/dist/assets/{skills-X7qxmHka.js → skills-abLMqY5_.js} +1 -1
  193. package/public/dist/assets/slash-commands-BU58xYih.js +1 -0
  194. package/public/dist/assets/{slash-commands-BnDH4IU_.js → slash-commands-D8o9pqOS.js} +1 -1
  195. package/public/dist/assets/{trace-drawer-DasaS1z4.js → trace-drawer-C6RvkUAd.js} +1 -1
  196. package/public/dist/assets/{ui-BtiBTXng.js → ui-Bxapl_Eu.js} +1 -1
  197. package/public/dist/assets/ui-CUB4iwz3.js +1 -0
  198. package/public/dist/index.html +1 -1
  199. package/public/dist/manager/index.html +1 -1
  200. package/public/dist/settings/index.html +1 -1
  201. package/public/js/features/settings-cli-status.ts +11 -1
  202. package/public/js/features/settings-types.ts +21 -0
  203. package/public/locales/en.json +34 -1
  204. package/public/locales/ja.json +34 -1
  205. package/public/locales/ko.json +34 -1
  206. package/public/locales/zh.json +34 -1
  207. package/scripts/check-native-load.cjs +17 -4
  208. package/scripts/release-gates.mjs +84 -3
  209. package/scripts/service-artifact.mjs +157 -0
  210. package/scripts/service-shell/zsh/.zlogin +23 -0
  211. package/scripts/service-shell/zsh/.zlogout +23 -0
  212. package/scripts/service-shell/zsh/.zprofile +23 -0
  213. package/scripts/service-shell/zsh/.zshenv +23 -0
  214. package/scripts/service-shell/zsh/.zshrc +23 -0
  215. package/public/dist/assets/bgtask-badge-DHA2OQm8.js +0 -1
  216. package/public/dist/assets/iframe-renderer-RpvBly2x.js +0 -1
  217. package/public/dist/assets/memory-4YH8sz0L.js +0 -1
  218. package/public/dist/assets/message-history-lVcLpAw8.js +0 -1
  219. package/public/dist/assets/settings--EGy3_B9.js +0 -1
  220. package/public/dist/assets/settings-core-8wBl1mg-.js +0 -1
  221. package/public/dist/assets/skills-6GFkHTlQ.js +0 -1
  222. package/public/dist/assets/slash-commands-qu8fPAZ3.js +0 -1
  223. package/public/dist/assets/ui-BucJ1zMA.js +0 -1
@@ -1,16 +1,16 @@
1
- import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";import{O as r,P as i,x as a}from"./render-DP8SJtdZ.js";import{t as o}from"./icons-CVkqyECl.js";import{t as s}from"./copy-text-DjgetgoZ.js";import{r as c}from"./locale-B9w_kUtW.js";import"./settings-core-BcVD2FgV.js";import"./constants-D8XAqfHk.js";import{r as l,t as u}from"./settings-types-B09BmpYe.js";import{n as ee,r as d}from"./provider-icons-Det0fC-4.js";import{a as f,c as p,d as m,f as h,h as g,i as _,l as te,m as ne,n as v,o as y,p as b,r as re,s as x,t as ie,u as ae}from"./channel-onboarding-flow-D73Cze0v.js";function oe(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.configured==`boolean`&&typeof t.activeInbound==`boolean`&&typeof t.sendCapable==`boolean`}function se(e){return e===`telegram`||e===`discord`||e===`slack`}function ce(e){if(!e||typeof e!=`object`)return null;let t=e.channels;if(!t||typeof t!=`object`)return null;let n=t,r=n.activeInboundChannels,i;if(r!==void 0)i=Array.isArray(r)&&r.every(se)?[...new Set(r)]:null;else{let e=n.activeInbound;i=se(e)?[e]:null}if(!i)return null;let a=n.activeInbound;if(!se(a)||!oe(n.telegram)||!oe(n.discord))return null;let o=oe(n.slack)?n.slack:{configured:!1,activeInbound:!1,sendCapable:!1,reason:`unavailable`};return{activeInbound:a,activeInboundChannels:i,telegram:n.telegram,discord:n.discord,slack:o}}function le(e){let t=[];return t.push(e.configured?i(`settings.channel.configured`):i(`settings.channel.notConfigured`)),e.sendCapable&&t.push(i(`settings.channel.sendCapable`)),e.activeInbound&&t.push(i(`settings.channel.activeInbound`)),t}function ue(e,t,n){let a=le(t).map(e=>`<span class="transport-status-chip">${r(e)}</span>`).join(``),o=t.reason===`not_attach_instance`?`<p class="transport-status-hint">${r(i(`settings.channel.notAttachInstanceHint`))}</p>`:n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${r(i(`settings.channel.sendOnlyHint`))}</p>`:``;return`
1
+ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";import{O as r,P as i,x as a}from"./render-DUGqq9Mu.js";import{t as o}from"./icons-CVkqyECl.js";import{t as s}from"./copy-text-DjgetgoZ.js";import{r as c}from"./locale-B9w_kUtW.js";import"./settings-core-CzdXfoOK.js";import"./constants-D8XAqfHk.js";import{i as l,r as u,t as d}from"./settings-types-D3cd6SWy.js";import{n as f,r as p}from"./provider-icons-Det0fC-4.js";import{a as ee,c as m,d as h,f as g,h as _,i as v,l as te,m as ne,n as y,o as b,p as x,r as re,s as S,t as ie,u as ae}from"./channel-onboarding-flow-D73Cze0v.js";function C(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.configured==`boolean`&&typeof t.activeInbound==`boolean`&&typeof t.sendCapable==`boolean`}function oe(e){return e===`telegram`||e===`discord`||e===`slack`}function se(e){if(!e||typeof e!=`object`)return null;let t=e.channels;if(!t||typeof t!=`object`)return null;let n=t,r=n.activeInboundChannels,i;if(r!==void 0)i=Array.isArray(r)&&r.every(oe)?[...new Set(r)]:null;else{let e=n.activeInbound;i=oe(e)?[e]:null}if(!i)return null;let a=n.activeInbound;if(!oe(a)||!C(n.telegram)||!C(n.discord))return null;let o=C(n.slack)?n.slack:{configured:!1,activeInbound:!1,sendCapable:!1,reason:`unavailable`};return{activeInbound:a,activeInboundChannels:i,telegram:n.telegram,discord:n.discord,slack:o}}function ce(e){let t=[];return t.push(e.configured?i(`settings.channel.configured`):i(`settings.channel.notConfigured`)),e.sendCapable&&t.push(i(`settings.channel.sendCapable`)),e.activeInbound&&t.push(i(`settings.channel.activeInbound`)),t}function le(e,t,n){let a=ce(t).map(e=>`<span class="transport-status-chip">${r(e)}</span>`).join(``),o=t.reason===`not_attach_instance`?`<p class="transport-status-hint">${r(i(`settings.channel.notAttachInstanceHint`))}</p>`:n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${r(i(`settings.channel.sendOnlyHint`))}</p>`:``;return`
2
2
  <div class="transport-status-block">
3
3
  <div class="transport-status-label">${r(e)}</div>
4
4
  <div class="transport-status-chips">${a}</div>
5
5
  ${o}
6
- </div>`}function de(e,t){e.innerHTML=`
6
+ </div>`}function ue(e,t){e.innerHTML=`
7
7
  <h4 class="section-title-row">
8
8
  <span><span data-icon="radio"></span> ${r(i(`settings.channel.statusTitle`))}</span>
9
9
  </h4>
10
- ${ue(`Telegram`,t.telegram,!0)}
11
- ${ue(`Discord`,t.discord,!0)}
12
- ${ue(`Slack`,t.slack,!0)}
13
- `}async function fe(){let e=document.getElementById(`channelTransportStatus`);if(e)try{let t=ce(await n(`/api/health`));if(!t){e.innerHTML=``,e.style.display=`none`;return}de(e,t),e.style.display=``}catch{e.innerHTML=``,e.style.display=`none`}}var pe=`jaw:notificationsAsked`;function me(){try{return localStorage.getItem(pe)===`1`}catch{return!0}}function he(){try{localStorage.setItem(pe,`1`)}catch{}}async function ge(){if(typeof Notification>`u`)return null;if(Notification.permission!=="default")return Notification.permission;if(me())return null;he();try{return await Notification.requestPermission()}catch{return null}}var S=null,C=null,w=!1,T=!1,E=`cli-jaw`,D=0;function _e(){document.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-onboard-channel]`);t&&(e.preventDefault(),ve(t.getAttribute(`data-onboard-channel`)))}),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&C&&(e.preventDefault(),e.stopImmediatePropagation(),ye())},!0),document.addEventListener(`keydown`,e=>{if(e.key!==`Tab`||!C||!S)return;let t=[...S.querySelectorAll(`button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])`)];if(!t.length)return;let n=t[0],r=t[t.length-1],i=document.activeElement;e.shiftKey&&(i===n||!S.contains(i))?(e.preventDefault(),r.focus()):!e.shiftKey&&i===r&&(e.preventDefault(),n.focus())},!0)}function ve(e){if(e!==`telegram`&&e!==`discord`&&e!==`slack`)return;let t={};for(let n of x(e))t[n.key]=be(n.settingsId);C=y(e,t),e===`slack`&&(E=`cli-jaw`),w=!1,T=!1,D+=1,Se(),O(),S?.classList.add(`open`)}function ye(){S?.classList.remove(`open`),C=null}function be(e){return document.getElementById(e)?.value.trim()||``}function xe(e,t){let n=document.getElementById(e);n&&(n.value=t)}function Se(){S||(S=document.createElement(`div`),S.className=`modal-overlay onboarding-overlay`,S.addEventListener(`click`,e=>{e.target===S&&ye()}),document.body.appendChild(S))}function Ce(e){if(e.step===1){let t=e.slackSetupStage;return`
10
+ ${le(`Telegram`,t.telegram,!0)}
11
+ ${le(`Discord`,t.discord,!0)}
12
+ ${le(`Slack`,t.slack,!0)}
13
+ `}async function de(){let e=document.getElementById(`channelTransportStatus`);if(e)try{let t=se(await n(`/api/health`));if(!t){e.innerHTML=``,e.style.display=`none`;return}ue(e,t),e.style.display=``}catch{e.innerHTML=``,e.style.display=`none`}}var fe=`jaw:notificationsAsked`;function pe(){try{return localStorage.getItem(fe)===`1`}catch{return!0}}function me(){try{localStorage.setItem(fe,`1`)}catch{}}async function he(){if(typeof Notification>`u`)return null;if(Notification.permission!=="default")return Notification.permission;if(pe())return null;me();try{return await Notification.requestPermission()}catch{return null}}var w=null,T=null,E=!1,ge=!1,D=`cli-jaw`,O=0;function _e(){document.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-onboard-channel]`);t&&(e.preventDefault(),ve(t.getAttribute(`data-onboard-channel`)))}),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&T&&(e.preventDefault(),e.stopImmediatePropagation(),ye())},!0),document.addEventListener(`keydown`,e=>{if(e.key!==`Tab`||!T||!w)return;let t=[...w.querySelectorAll(`button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])`)];if(!t.length)return;let n=t[0],r=t[t.length-1],i=document.activeElement;e.shiftKey&&(i===n||!w.contains(i))?(e.preventDefault(),r.focus()):!e.shiftKey&&i===r&&(e.preventDefault(),n.focus())},!0)}function ve(e){if(e!==`telegram`&&e!==`discord`&&e!==`slack`)return;let t={};for(let n of S(e))t[n.key]=be(n.settingsId);T=b(e,t),e===`slack`&&(D=`cli-jaw`),E=!1,ge=!1,O+=1,Se(),k(),w?.classList.add(`open`)}function ye(){w?.classList.remove(`open`),T=null}function be(e){return document.getElementById(e)?.value.trim()||``}function xe(e,t){let n=document.getElementById(e);n&&(n.value=t)}function Se(){w||(w=document.createElement(`div`),w.className=`modal-overlay onboarding-overlay`,w.addEventListener(`click`,e=>{e.target===w&&ye()}),document.body.appendChild(w))}function Ce(e){if(e.step===1){let t=e.slackSetupStage;return`
14
14
  ${e.channel===`slack`?`
15
15
  <div class="onboarding-field">
16
16
  <label for="onboard-slack-app-name">${r(i(`onboarding.slackAppName`))}</label>
@@ -18,7 +18,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
18
18
  type="text" autocomplete="off"
19
19
  spellcheck="false"
20
20
  aria-describedby="onboard-slack-app-name-hint onboard-slack-manifest-status"
21
- value="${r(E)}">
21
+ value="${r(D)}">
22
22
  <span class="onboarding-hint" id="onboard-slack-app-name-hint">${r(i(`onboarding.slackAppNameHint`))}</span>
23
23
  </div>
24
24
  <div class="onboarding-actions">
@@ -34,7 +34,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
34
34
  data-onboard-issuer="1" ${e.channel===`slack`&&t===`manifest`?`disabled`:``}>
35
35
  ${r(i(`onboarding.openIssuer`))}
36
36
  </button>
37
- </div>`}return e.step===2?x(e.channel).map(t=>{let n=i(`onboarding.token.${t.key}`)+(t.optional?` (${i(`onboarding.optional`)})`:``);return`
37
+ </div>`}return e.step===2?S(e.channel).map(t=>{let n=i(`onboarding.token.${t.key}`)+(t.optional?` (${i(`onboarding.optional`)})`:``);return`
38
38
  <div class="onboarding-field">
39
39
  <label for="onboard-${t.key}">${r(n)}</label>
40
40
  <input id="onboard-${t.key}" data-onboard-field="${t.key}" class="input-sm"
@@ -43,13 +43,13 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
43
43
  autocomplete="off" spellcheck="false"
44
44
  value="${r(e.draft[t.key]||``)}">
45
45
  <span class="onboarding-hint">${r(i(`onboarding.hint.${e.channel}.${t.key}`))}</span>
46
- </div>`}).join(``):e.step===3?`${w?`<p class="onboarding-guide">${r(i(`onboarding.validating`))}</p>`:e.validatedIdentity?`<p class="onboarding-identity">${r(i(`onboarding.valid`,{identity:e.validatedIdentity}))}</p>`:`<p class="onboarding-guide">${r(i(`onboarding.validateHint`))}</p>`}
46
+ </div>`}).join(``):e.step===3?`${E?`<p class="onboarding-guide">${r(i(`onboarding.validating`))}</p>`:e.validatedIdentity?`<p class="onboarding-identity">${r(i(`onboarding.valid`,{identity:e.validatedIdentity}))}</p>`:`<p class="onboarding-guide">${r(i(`onboarding.validateHint`))}</p>`}
47
47
  <div class="onboarding-actions">
48
- <button type="button" class="perm-btn" data-onboard-validate="1" ${w?`disabled`:``}>
48
+ <button type="button" class="perm-btn" data-onboard-validate="1" ${E?`disabled`:``}>
49
49
  ${r(i(`onboarding.validate`))}
50
50
  </button>
51
- </div>`:`<p class="onboarding-next">${r(i(e.saved?`onboarding.next.${e.channel}`:`onboarding.saveHint`))}</p>`}function we(e){return e.step===4&&e.saved?`<button type="button" class="perm-btn active" data-onboard-close="1">${r(i(`onboarding.close`))}</button>`:`${e.step>1?`<button type="button" class="perm-btn" data-onboard-back="1">${r(i(`onboarding.back`))}</button>`:``}${e.step===4?`<button type="button" class="perm-btn active" data-onboard-save="1">${r(i(`onboarding.save`))}</button>`:`<button type="button" class="perm-btn ${f(e)?`active`:``}" data-onboard-next="1"
52
- ${e.channel===`slack`&&e.step===1&&!f(e)?`disabled`:``}>${r(i(`onboarding.next`))}</button>`}`}function O(){if(!S||!C)return;let e=C;S.innerHTML=`
51
+ </div>`:`<p class="onboarding-next">${r(i(e.saved?`onboarding.next.${e.channel}`:`onboarding.saveHint`))}</p>`}function we(e){return e.step===4&&e.saved?`<button type="button" class="perm-btn active" data-onboard-close="1">${r(i(`onboarding.close`))}</button>`:`${e.step>1?`<button type="button" class="perm-btn" data-onboard-back="1">${r(i(`onboarding.back`))}</button>`:``}${e.step===4?`<button type="button" class="perm-btn active" data-onboard-save="1">${r(i(`onboarding.save`))}</button>`:`<button type="button" class="perm-btn ${ee(e)?`active`:``}" data-onboard-next="1"
52
+ ${e.channel===`slack`&&e.step===1&&!ee(e)?`disabled`:``}>${r(i(`onboarding.next`))}</button>`}`}function k(){if(!w||!T)return;let e=T;w.innerHTML=`
53
53
  <div class="modal-box onboarding-box" role="dialog" aria-modal="true"
54
54
  aria-labelledby="onboarding-title" aria-describedby="onboarding-step-title">
55
55
  <div class="onboarding-head">
@@ -72,7 +72,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
72
72
  ${e.missingCapabilities.length?r(i(`onboarding.warning.missingCapabilities`,{capabilities:e.missingCapabilities.join(`, `)})):``}
73
73
  </div>
74
74
  <div class="onboarding-actions onboarding-footer">${we(e)}</div>
75
- </div>`,S.querySelectorAll(`[data-onboard-close]`).forEach(e=>e.addEventListener(`click`,ye)),S.querySelector(`[data-onboard-issuer]`)?.addEventListener(`click`,()=>{C&&(window.open(ie[C.channel],`_blank`,`noopener`),C.channel===`slack`&&(C=ae(C),k()))}),S.querySelector(`[data-onboard-generate-manifest]`)?.addEventListener(`click`,()=>{De()}),S.querySelector(`[data-onboard-app-name]`)?.addEventListener(`input`,e=>{E=e.currentTarget.value,C?.channel===`slack`&&(C=h(C));let t=S?.querySelector(`[data-onboard-manifest-status]`);t?.classList.remove(`is-error`),t&&(t.textContent=``),k()}),S.querySelector(`[data-onboard-app-name]`)?.addEventListener(`keydown`,e=>{let t=e;t.key!==`Enter`||t.shiftKey||t.isComposing||(t.preventDefault(),De())}),S.querySelector(`[data-onboard-back]`)?.addEventListener(`click`,()=>{C&&(C=p(C),O())}),S.querySelector(`[data-onboard-next]`)?.addEventListener(`click`,()=>{C&&(Oe(),C=v(C),O())}),S.querySelector(`[data-onboard-validate]`)?.addEventListener(`click`,()=>{ke()}),S.querySelector(`[data-onboard-save]`)?.addEventListener(`click`,()=>{Ae()}),S.querySelectorAll(`[data-onboard-field]`).forEach(e=>{e.addEventListener(`input`,()=>{if(!C)return;let t=e.getAttribute(`data-onboard-field`)||``;C=b(C,t,e.value)}),e.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),Te())})}),Ee()}function k(){if(!S||C?.channel!==`slack`||C.step!==1)return;let e=C.slackSetupStage,t=S.querySelector(`[data-onboard-generate-manifest]`),n=S.querySelector(`[data-onboard-issuer]`),r=S.querySelector(`[data-onboard-next]`);t?.classList.toggle(`active`,e===`manifest`),n?.classList.toggle(`active`,e===`issuer`),n&&(n.disabled=e===`manifest`),r?.classList.toggle(`active`,e===`ready`),r&&(r.disabled=e!==`ready`)}function Te(){if(C){if(C.step===3){ke();return}if(C.step===4){C.saved||Ae();return}Oe(),C=v(C),O()}}function Ee(){let e=[...S?.querySelectorAll(`[data-onboard-app-name], [data-onboard-field]`)??[]];if(!e.length)return;let t=e.find(e=>!e.value.trim())??e[0];t?.focus();let n=t?.value.length??0;t?.setSelectionRange?.(n,n)}async function De(){if(!S||C?.channel!==`slack`)return;let e=D,t=S.querySelector(`[data-onboard-app-name]`),r=S.querySelector(`[data-onboard-generate-manifest]`),a=S.querySelector(`[data-onboard-manifest-status]`);if(!t||!r||!a)return;let o=t.value.trim();if(E=o,!o||Array.from(o).length>35){a.classList.add(`is-error`),a.textContent=i(`onboarding.slackAppNameError`),t.focus();return}a.classList.remove(`is-error`),a.textContent=``,r.disabled=!0,r.textContent=i(`onboarding.slackManifestGenerating`);try{let t=await n(`/api/slack/manifest?name=${encodeURIComponent(o)}`);if(e!==D||C?.channel!==`slack`||E.trim()!==o)return;let r=t?.json||``;if(!r)throw Error(`empty manifest`);let c=await s(r);if(!c.ok)throw Error(c.error||`copy failed`);if(e!==D||C?.channel!==`slack`||E.trim()!==o)return;C=m(C);let l=t?.botDisplayName;a.textContent=l&&l!==o?i(`onboarding.slackManifestCopiedWithBot`,{bot:l}):i(`onboarding.slackManifestReady`),k()}catch{a.classList.add(`is-error`),a.textContent=i(`onboarding.slackManifestError`)}finally{r.disabled=!1,r.textContent=i(`onboarding.slackGenerateManifest`),k()}}function Oe(){if(C)for(let e of S?.querySelectorAll(`[data-onboard-field]`)??[]){let t=e.getAttribute(`data-onboard-field`)||``;C=b(C,t,e.value)}}async function ke(){if(!C||w)return;let e=D;w=!0,O();let t=await n(`/api/channels/validate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(g(C))});e===D&&(w=!1,C&&(C=re(C,t||{ok:!1,error:`network`}),O()))}async function Ae(){if(!C||T)return;let e=_({...C,step:3});if(e){C={...C,step:3,error:e},O();return}for(let e of x(C.channel))xe(e.settingsId,(C.draft[e.key]||``).trim());let n=D;T=!0;try{await t(`/api/settings`,`PUT`,ne(C))}finally{T=!1}n===D&&C&&(C=te(C),O(),fe(),ge())}function je(e){if(e.url)return`remote`;if(!e.command)return null;let t=e.command;return t===`npx`||t.endsWith(`/npx`)?`npx`:t===`uvx`||t===`uv`||t.endsWith(`/uvx`)?`uvx`:t===`docker`||t.endsWith(`/docker`)?`docker`:null}function Me(e){return Object.values(e).filter(e=>e.command===`npx`||e.command===`uv`||e.command===`uvx`).length}var A=null;async function j(){try{let e=await n(`/api/mcp`);if(!e)return;A=e;let t=document.getElementById(`mcpServerList`);if(!t)return;let a=Object.entries(e.servers||{});if(!a.length){t.textContent=i(`mcp.noServers`),Ne(0);return}t.innerHTML=a.map(([e,t])=>{let n=je(t),i=t.url||[t.command,...(t.args||[]).slice(0,2)].filter(Boolean).map(e=>r(e)).join(` `),a=n?` <span style="opacity:.5;font-size:0.85em">[${r(n)}]</span>`:``;return`<div style="padding:2px 0">• <b>${r(e)}</b> <span style="opacity:.6">${i}</span>${a}</div>`}).join(``),Ne(Me(e.servers))}catch{}}function Ne(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function Pe(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=i(`mcp.syncing`);try{let n=await t(`/api/mcp/sync`,`POST`,{});if(!n){e.innerHTML=`${o.error} sync failed`;return}let i=n.results||{};e.innerHTML=Object.entries(i).map(([e,t])=>`${t?o.check:o.skip} ${r(e)}`).join(` &nbsp; `)}catch(t){e.innerHTML=`${o.error} ${r(t.message)}`}}}async function Fe(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=i(`mcp.installing`);try{let n=await t(`/api/mcp/install`,`POST`,{});if(!n){e.innerHTML=`${o.error} install failed`;return}e.innerHTML=Object.entries(n.results||{}).map(([e,t])=>`${t.status===`installed`?o.check:t.status===`skip`?o.skip:o.error} <b>${r(e)}</b>: ${r(t.status)}${t.bin?` ${o.arrowRight} `+r(t.bin):``}`).join(`<br>`),j()}catch(t){e.innerHTML=`${o.error} ${r(t.message)}`}}}var M=null,N=null,P=null,F=null,I=null,L=null,R=`local`,z=!1,Ie=[];function Le(){if(M)return;M=document.createElement(`div`),M.id=`mcpModal`,M.className=`modal-overlay mcp-modal-overlay`,M.setAttribute(`role`,`presentation`),M.setAttribute(`aria-hidden`,`true`),M.addEventListener(`click`,e=>{e.target===M&&U()});let e=document.createElement(`div`);e.className=`modal-box mcp-modal-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-label`,`MCP Server Management`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header`;let n=document.createElement(`span`);n.textContent=`MCP Server Management`;let r=document.createElement(`button`);r.type=`button`,r.className=`help-trigger`,r.textContent=`?`,r.setAttribute(`aria-label`,`MCP help`),r.addEventListener(`click`,()=>qe());let i=document.createElement(`button`);i.type=`button`,i.className=`btn-modal-close`,i.setAttribute(`aria-label`,`Close`),i.textContent=`x`,i.addEventListener(`click`,()=>U());let a=document.createElement(`div`);a.style.cssText=`display:flex;align-items:center;gap:6px`,a.append(n,r),t.append(a,i),N=document.createElement(`div`),N.style.cssText=`padding:16px;overflow-y:auto;flex:1`;let o=document.createElement(`div`);o.style.cssText=`display:flex;gap:4px;margin-bottom:12px`;let s=Re(`Active Servers`,!0),c=Re(`Add New`,!1),l=Re(`Browse`,!1);Ie=[s,c,l],s.addEventListener(`click`,()=>B(`active`)),c.addEventListener(`click`,()=>B(`add`)),l.addEventListener(`click`,()=>B(`browse`)),o.append(s,c,l),P=document.createElement(`div`),L=document.createElement(`div`),L.style.display=`none`,L.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,F=document.createElement(`div`),F.style.display=`none`,F.innerHTML=ze(),F.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{R=e.dataset.mcpSubtab,Be()})}),I=F.querySelector(`#mcpAddError`);let u=F.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void Ke());let ee=F.querySelector(`[data-action="closeMcpModal"]`);ee&&ee.addEventListener(`click`,()=>U()),N.append(o,P,L,F);let d=document.createElement(`div`);d.className=`modal-footer`;let f=document.createElement(`button`);f.type=`button`,f.className=`btn-save`,f.textContent=`Close`,f.addEventListener(`click`,()=>U()),d.append(f),e.append(t,N,d),M.append(e),document.body.append(M)}function Re(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`btn-clear btn-tab${t?` is-active`:``}`,n.textContent=e,n}function ze(){return`
75
+ </div>`,w.querySelectorAll(`[data-onboard-close]`).forEach(e=>e.addEventListener(`click`,ye)),w.querySelector(`[data-onboard-issuer]`)?.addEventListener(`click`,()=>{T&&(window.open(ie[T.channel],`_blank`,`noopener`),T.channel===`slack`&&(T=ae(T),A()))}),w.querySelector(`[data-onboard-generate-manifest]`)?.addEventListener(`click`,()=>{De()}),w.querySelector(`[data-onboard-app-name]`)?.addEventListener(`input`,e=>{D=e.currentTarget.value,T?.channel===`slack`&&(T=g(T));let t=w?.querySelector(`[data-onboard-manifest-status]`);t?.classList.remove(`is-error`),t&&(t.textContent=``),A()}),w.querySelector(`[data-onboard-app-name]`)?.addEventListener(`keydown`,e=>{let t=e;t.key!==`Enter`||t.shiftKey||t.isComposing||(t.preventDefault(),De())}),w.querySelector(`[data-onboard-back]`)?.addEventListener(`click`,()=>{T&&(T=m(T),k())}),w.querySelector(`[data-onboard-next]`)?.addEventListener(`click`,()=>{T&&(Oe(),T=y(T),k())}),w.querySelector(`[data-onboard-validate]`)?.addEventListener(`click`,()=>{ke()}),w.querySelector(`[data-onboard-save]`)?.addEventListener(`click`,()=>{Ae()}),w.querySelectorAll(`[data-onboard-field]`).forEach(e=>{e.addEventListener(`input`,()=>{if(!T)return;let t=e.getAttribute(`data-onboard-field`)||``;T=x(T,t,e.value)}),e.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),Te())})}),Ee()}function A(){if(!w||T?.channel!==`slack`||T.step!==1)return;let e=T.slackSetupStage,t=w.querySelector(`[data-onboard-generate-manifest]`),n=w.querySelector(`[data-onboard-issuer]`),r=w.querySelector(`[data-onboard-next]`);t?.classList.toggle(`active`,e===`manifest`),n?.classList.toggle(`active`,e===`issuer`),n&&(n.disabled=e===`manifest`),r?.classList.toggle(`active`,e===`ready`),r&&(r.disabled=e!==`ready`)}function Te(){if(T){if(T.step===3){ke();return}if(T.step===4){T.saved||Ae();return}Oe(),T=y(T),k()}}function Ee(){let e=[...w?.querySelectorAll(`[data-onboard-app-name], [data-onboard-field]`)??[]];if(!e.length)return;let t=e.find(e=>!e.value.trim())??e[0];t?.focus();let n=t?.value.length??0;t?.setSelectionRange?.(n,n)}async function De(){if(!w||T?.channel!==`slack`)return;let e=O,t=w.querySelector(`[data-onboard-app-name]`),r=w.querySelector(`[data-onboard-generate-manifest]`),a=w.querySelector(`[data-onboard-manifest-status]`);if(!t||!r||!a)return;let o=t.value.trim();if(D=o,!o||Array.from(o).length>35){a.classList.add(`is-error`),a.textContent=i(`onboarding.slackAppNameError`),t.focus();return}a.classList.remove(`is-error`),a.textContent=``,r.disabled=!0,r.textContent=i(`onboarding.slackManifestGenerating`);try{let t=await n(`/api/slack/manifest?name=${encodeURIComponent(o)}`);if(e!==O||T?.channel!==`slack`||D.trim()!==o)return;let r=t?.json||``;if(!r)throw Error(`empty manifest`);let c=await s(r);if(!c.ok)throw Error(c.error||`copy failed`);if(e!==O||T?.channel!==`slack`||D.trim()!==o)return;T=h(T);let l=t?.botDisplayName;a.textContent=l&&l!==o?i(`onboarding.slackManifestCopiedWithBot`,{bot:l}):i(`onboarding.slackManifestReady`),A()}catch{a.classList.add(`is-error`),a.textContent=i(`onboarding.slackManifestError`)}finally{r.disabled=!1,r.textContent=i(`onboarding.slackGenerateManifest`),A()}}function Oe(){if(T)for(let e of w?.querySelectorAll(`[data-onboard-field]`)??[]){let t=e.getAttribute(`data-onboard-field`)||``;T=x(T,t,e.value)}}async function ke(){if(!T||E)return;let e=O;E=!0,k();let t=await n(`/api/channels/validate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(_(T))});e===O&&(E=!1,T&&(T=re(T,t||{ok:!1,error:`network`}),k()))}async function Ae(){if(!T||ge)return;let e=v({...T,step:3});if(e){T={...T,step:3,error:e},k();return}for(let e of S(T.channel))xe(e.settingsId,(T.draft[e.key]||``).trim());let n=O;ge=!0;try{await t(`/api/settings`,`PUT`,ne(T))}finally{ge=!1}n===O&&T&&(T=te(T),k(),de(),he())}function je(e){if(e.url)return`remote`;if(!e.command)return null;let t=e.command;return t===`npx`||t.endsWith(`/npx`)?`npx`:t===`uvx`||t===`uv`||t.endsWith(`/uvx`)?`uvx`:t===`docker`||t.endsWith(`/docker`)?`docker`:null}function Me(e){return Object.values(e).filter(e=>e.command===`npx`||e.command===`uv`||e.command===`uvx`).length}var j=null;async function M(){try{let e=await n(`/api/mcp`);if(!e)return;j=e;let t=document.getElementById(`mcpServerList`);if(!t)return;let a=Object.entries(e.servers||{});if(!a.length){t.textContent=i(`mcp.noServers`),Ne(0);return}t.innerHTML=a.map(([e,t])=>{let n=je(t),i=t.url||[t.command,...(t.args||[]).slice(0,2)].filter(Boolean).map(e=>r(e)).join(` `),a=n?` <span style="opacity:.5;font-size:0.85em">[${r(n)}]</span>`:``;return`<div style="padding:2px 0">• <b>${r(e)}</b> <span style="opacity:.6">${i}</span>${a}</div>`}).join(``),Ne(Me(e.servers))}catch{}}function Ne(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function Pe(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=i(`mcp.syncing`);try{let n=await t(`/api/mcp/sync`,`POST`,{});if(!n){e.innerHTML=`${o.error} sync failed`;return}let i=n.results||{};e.innerHTML=Object.entries(i).map(([e,t])=>`${t?o.check:o.skip} ${r(e)}`).join(` &nbsp; `)}catch(t){e.innerHTML=`${o.error} ${r(t.message)}`}}}async function Fe(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=i(`mcp.installing`);try{let n=await t(`/api/mcp/install`,`POST`,{});if(!n){e.innerHTML=`${o.error} install failed`;return}e.innerHTML=Object.entries(n.results||{}).map(([e,t])=>`${t.status===`installed`?o.check:t.status===`skip`?o.skip:o.error} <b>${r(e)}</b>: ${r(t.status)}${t.bin?` ${o.arrowRight} `+r(t.bin):``}`).join(`<br>`),M()}catch(t){e.innerHTML=`${o.error} ${r(t.message)}`}}}var N=null,P=null,F=null,I=null,L=null,R=null,z=`local`,B=!1,Ie=[];function Le(){if(N)return;N=document.createElement(`div`),N.id=`mcpModal`,N.className=`modal-overlay mcp-modal-overlay`,N.setAttribute(`role`,`presentation`),N.setAttribute(`aria-hidden`,`true`),N.addEventListener(`click`,e=>{e.target===N&&W()});let e=document.createElement(`div`);e.className=`modal-box mcp-modal-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-label`,`MCP Server Management`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header`;let n=document.createElement(`span`);n.textContent=`MCP Server Management`;let r=document.createElement(`button`);r.type=`button`,r.className=`help-trigger`,r.textContent=`?`,r.setAttribute(`aria-label`,`MCP help`),r.addEventListener(`click`,()=>qe());let i=document.createElement(`button`);i.type=`button`,i.className=`btn-modal-close`,i.setAttribute(`aria-label`,`Close`),i.textContent=`x`,i.addEventListener(`click`,()=>W());let a=document.createElement(`div`);a.style.cssText=`display:flex;align-items:center;gap:6px`,a.append(n,r),t.append(a,i),P=document.createElement(`div`),P.style.cssText=`padding:16px;overflow-y:auto;flex:1`;let o=document.createElement(`div`);o.style.cssText=`display:flex;gap:4px;margin-bottom:12px`;let s=Re(`Active Servers`,!0),c=Re(`Add New`,!1),l=Re(`Browse`,!1);Ie=[s,c,l],s.addEventListener(`click`,()=>V(`active`)),c.addEventListener(`click`,()=>V(`add`)),l.addEventListener(`click`,()=>V(`browse`)),o.append(s,c,l),F=document.createElement(`div`),R=document.createElement(`div`),R.style.display=`none`,R.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,I=document.createElement(`div`),I.style.display=`none`,I.innerHTML=ze(),I.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{z=e.dataset.mcpSubtab,Be()})}),L=I.querySelector(`#mcpAddError`);let u=I.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void Ke());let d=I.querySelector(`[data-action="closeMcpModal"]`);d&&d.addEventListener(`click`,()=>W()),P.append(o,F,R,I);let f=document.createElement(`div`);f.className=`modal-footer`;let p=document.createElement(`button`);p.type=`button`,p.className=`btn-save`,p.textContent=`Close`,p.addEventListener(`click`,()=>W()),f.append(p),e.append(t,P,f),N.append(e),document.body.append(N)}function Re(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`btn-clear btn-tab${t?` is-active`:``}`,n.textContent=e,n}function ze(){return`
76
76
  <div style="display:flex;gap:4px;margin-bottom:8px">
77
77
  <button type="button" class="btn-clear btn-tab is-active" data-mcp-subtab="local">Local</button>
78
78
  <button type="button" class="btn-clear btn-tab" data-mcp-subtab="remote">Remote</button>
@@ -92,7 +92,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
92
92
  <div style="display:flex;gap:8px;margin-top:12px;justify-content:flex-end">
93
93
  <button type="button" class="btn-clear" data-action="closeMcpModal">Cancel</button>
94
94
  <button type="button" class="btn-clear btn-save" data-action="mcpAddAndSync">Add & Sync</button>
95
- </div>`}function B(e){P&&(P.style.display=e===`active`?``:`none`),F&&(F.style.display=e===`add`?``:`none`),L&&(L.style.display=e===`browse`?``:`none`),Ie.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&Ve(),e===`add`&&Ue(),e===`browse`&&Je()}function Be(){let e=F?.querySelector(`#mcpAddLocal`),t=F?.querySelector(`#mcpAddRemote`);e&&(e.style.display=R===`local`?``:`none`),t&&(t.style.display=R===`remote`?``:`none`),F?.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.classList.toggle(`is-active`,e.dataset.mcpSubtab===R)})}function Ve(){if(!P||!A)return;let e=Object.entries(A.servers||{});if(!e.length){P.innerHTML=`<p style="opacity:.5">No active MCP servers.</p>`;return}P.innerHTML=e.map(([e,t])=>{let n=je(t),i=n?`<span class="mcp-active-tag">[${r(n)}]</span>`:``,a=t.command?r(t.command)+(t.args?.length?` `+t.args.map(e=>r(e)).join(` `):``):``,o=t.url?r(t.url):``,s=t.env?Object.keys(t.env):[],c=t.headers?Object.keys(t.headers):[],l=``;return o&&(l+=`<div class="mcp-active-detail">URL: ${o}</div>`),a&&(l+=`<div class="mcp-active-detail">Command: ${a}</div>`),s.length&&(l+=`<div class="mcp-active-detail">Env: ${s.map(e=>r(e)).join(`, `)}</div>`),c.length&&(l+=`<div class="mcp-active-detail">Headers: ${c.map(e=>r(e)).join(`, `)}</div>`),`<div class="mcp-active-row">
95
+ </div>`}function V(e){F&&(F.style.display=e===`active`?``:`none`),I&&(I.style.display=e===`add`?``:`none`),R&&(R.style.display=e===`browse`?``:`none`),Ie.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&Ve(),e===`add`&&Ue(),e===`browse`&&Je()}function Be(){let e=I?.querySelector(`#mcpAddLocal`),t=I?.querySelector(`#mcpAddRemote`);e&&(e.style.display=z===`local`?``:`none`),t&&(t.style.display=z===`remote`?``:`none`),I?.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.classList.toggle(`is-active`,e.dataset.mcpSubtab===z)})}function Ve(){if(!F||!j)return;let e=Object.entries(j.servers||{});if(!e.length){F.innerHTML=`<p style="opacity:.5">No active MCP servers.</p>`;return}F.innerHTML=e.map(([e,t])=>{let n=je(t),i=n?`<span class="mcp-active-tag">[${r(n)}]</span>`:``,a=t.command?r(t.command)+(t.args?.length?` `+t.args.map(e=>r(e)).join(` `):``):``,o=t.url?r(t.url):``,s=t.env?Object.keys(t.env):[],c=t.headers?Object.keys(t.headers):[],l=``;return o&&(l+=`<div class="mcp-active-detail">URL: ${o}</div>`),a&&(l+=`<div class="mcp-active-detail">Command: ${a}</div>`),s.length&&(l+=`<div class="mcp-active-detail">Env: ${s.map(e=>r(e)).join(`, `)}</div>`),c.length&&(l+=`<div class="mcp-active-detail">Headers: ${c.map(e=>r(e)).join(`, `)}</div>`),`<div class="mcp-active-row">
96
96
  <div style="flex:1">
97
97
  <div style="display:flex;align-items:center;gap:6px">
98
98
  <span class="mcp-active-name">${r(e)}</span>
@@ -101,7 +101,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
101
101
  ${l}
102
102
  </div>
103
103
  <button type="button" class="btn-clear mcp-active-remove" data-mcp-remove="${r(e)}">Remove</button>
104
- </div>`}).join(``),P.querySelectorAll(`[data-mcp-remove]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.mcpRemove;t&&He(t)})})}async function He(e){if(!A)return;let n={...A.servers};delete n[e];try{await t(`/api/mcp`,`PUT`,{...A,servers:n}),await t(`/api/mcp/sync`,`POST`,{}),await j(),Ve()}catch(e){V(e.message)}}function Ue(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(F??document).querySelector(`#${e}`);t&&(t.value=``)}We()}function V(e){I&&(I.style.display=`block`,I.textContent=e)}function We(){I&&(I.style.display=`none`)}function Ge(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r).trim()]=e.slice(r+1))}return t}function H(e){return(F??document).querySelector(`#${e}`)?.value?.trim()??``}async function Ke(){if(!A)return;let e=R===`remote`,n,r;if(e){n=H(`mcpAddRemoteName`);let e=H(`mcpAddUrl`),t=H(`mcpAddHeaders`);if(!n){V(`Name is required.`);return}if(!e){V(`URL is required.`);return}r={url:e};let i=Ge(t);Object.keys(i).length>0&&(r.headers=i)}else{n=H(`mcpAddName`);let e=H(`mcpAddCommand`),t=H(`mcpAddArgs`),i=H(`mcpAddEnv`);if(!n){V(`Name is required.`);return}if(!e){V(`Command is required.`);return}r={command:e};let a=t.split(/,|\n/).map(e=>e.trim()).filter(Boolean);a.length>0&&(r.args=a);let o=Ge(i);Object.keys(o).length>0&&(r.env=o)}if(A.servers[n]){V(`Server "${n}" already exists.`);return}try{let e={...A,servers:{...A.servers,[n]:r}};await t(`/api/mcp`,`PUT`,e),await t(`/api/mcp/sync`,`POST`,{}),await j(),U()}catch(e){V(e.message)}}function qe(){let e=document.getElementById(`mcpHelpOverlay`);if(e){e.remove();return}let t=document.createElement(`div`);t.id=`mcpHelpOverlay`,t.className=`mcp-help-overlay`,t.addEventListener(`click`,e=>{e.target===t&&t.remove()});let n=document.createElement(`div`);n.className=`mcp-help-inner`,n.innerHTML=`
104
+ </div>`}).join(``),F.querySelectorAll(`[data-mcp-remove]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.mcpRemove;t&&He(t)})})}async function He(e){if(!j)return;let n={...j.servers};delete n[e];try{await t(`/api/mcp`,`PUT`,{...j,servers:n}),await t(`/api/mcp/sync`,`POST`,{}),await M(),Ve()}catch(e){H(e.message)}}function Ue(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(I??document).querySelector(`#${e}`);t&&(t.value=``)}We()}function H(e){L&&(L.style.display=`block`,L.textContent=e)}function We(){L&&(L.style.display=`none`)}function Ge(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r).trim()]=e.slice(r+1))}return t}function U(e){return(I??document).querySelector(`#${e}`)?.value?.trim()??``}async function Ke(){if(!j)return;let e=z===`remote`,n,r;if(e){n=U(`mcpAddRemoteName`);let e=U(`mcpAddUrl`),t=U(`mcpAddHeaders`);if(!n){H(`Name is required.`);return}if(!e){H(`URL is required.`);return}r={url:e};let i=Ge(t);Object.keys(i).length>0&&(r.headers=i)}else{n=U(`mcpAddName`);let e=U(`mcpAddCommand`),t=U(`mcpAddArgs`),i=U(`mcpAddEnv`);if(!n){H(`Name is required.`);return}if(!e){H(`Command is required.`);return}r={command:e};let a=t.split(/,|\n/).map(e=>e.trim()).filter(Boolean);a.length>0&&(r.args=a);let o=Ge(i);Object.keys(o).length>0&&(r.env=o)}if(j.servers[n]){H(`Server "${n}" already exists.`);return}try{let e={...j,servers:{...j.servers,[n]:r}};await t(`/api/mcp`,`PUT`,e),await t(`/api/mcp/sync`,`POST`,{}),await M(),W()}catch(e){H(e.message)}}function qe(){let e=document.getElementById(`mcpHelpOverlay`);if(e){e.remove();return}let t=document.createElement(`div`);t.id=`mcpHelpOverlay`,t.className=`mcp-help-overlay`,t.addEventListener(`click`,e=>{e.target===t&&t.remove()});let n=document.createElement(`div`);n.className=`mcp-help-inner`,n.innerHTML=`
105
105
  <h4>MCP Server</h4>
106
106
  <p>MCP (Model Context Protocol) adds capabilities to AI agents — like installing apps on a phone.</p>
107
107
 
@@ -129,7 +129,7 @@ URL: https://mcp.example.com/sse</pre>
129
129
  <div style="text-align:right;margin-top:12px">
130
130
  <button type="button" class="btn-save" id="mcpHelpClose">OK</button>
131
131
  </div>
132
- `,t.append(n),document.body.append(t),n.querySelector(`#mcpHelpClose`)?.addEventListener(`click`,()=>t.remove())}async function Je(){if(L){L.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,A||await j();try{let e=await n(`/api/mcp/registry`);if(!e?.entries?.length&&!e?.builtins?.length){L.innerHTML=`<p style="opacity:.5">No MCP servers in registry.</p>`;return}let t=A?Object.keys(A.servers):[],i=``;i+=e.entries.map(e=>{let n=t.includes(e.id),i=e.tags?.slice(0,3).map(e=>`<span style="background:var(--border);padding:1px 4px;border-radius:3px;font-size:10px">${r(e)}</span>`).join(` `)||``;return`<div style="padding:10px 0;border-bottom:1px solid var(--border)">
132
+ `,t.append(n),document.body.append(t),n.querySelector(`#mcpHelpClose`)?.addEventListener(`click`,()=>t.remove())}async function Je(){if(R){R.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,j||await M();try{let e=await n(`/api/mcp/registry`);if(!e?.entries?.length&&!e?.builtins?.length){R.innerHTML=`<p style="opacity:.5">No MCP servers in registry.</p>`;return}let t=j?Object.keys(j.servers):[],i=``;i+=e.entries.map(e=>{let n=t.includes(e.id),i=e.tags?.slice(0,3).map(e=>`<span style="background:var(--border);padding:1px 4px;border-radius:3px;font-size:10px">${r(e)}</span>`).join(` `)||``;return`<div style="padding:10px 0;border-bottom:1px solid var(--border)">
133
133
  <div style="display:flex;align-items:center;gap:8px">
134
134
  <b>${r(e.name)}</b>
135
135
  <span style="opacity:.5;font-size:0.85em">[${r(e.type)}]</span>
@@ -150,7 +150,7 @@ URL: https://mcp.example.com/sse</pre>
150
150
  ${t?`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-builtin-install="${r(e.id)}">+ Install standalone</button>`:``}
151
151
  </div>
152
152
  <p style="margin:2px 0;font-size:11px;opacity:.65">${r(e.description)}</p>
153
- </div>`}).join(``),i+=`</div>`),L.innerHTML=i,L.querySelectorAll(`[data-registry-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.registryInstall,r=e.entries.find(e=>e.id===n);r&&Ye(r,t)})}),L.querySelectorAll(`[data-builtin-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.builtinInstall,r=e.builtins?.find(e=>e.id===n);r?.standalone_config&&Ye({id:r.id,name:r.name,description:r.description,category:`harness`,type:`remote`,config:r.standalone_config,tags:[],url:r.source},t)})})}catch(e){L.innerHTML=`<p style="color:var(--color-error)">${r(e.message)}</p>`}}}async function Ye(e,n){if(A){n.disabled=!0,n.textContent=`Installing...`;try{let r=e.config,i={...A,servers:{...A.servers,[e.id]:r}};await t(`/api/mcp`,`PUT`,i),await t(`/api/mcp/sync`,`POST`,{}),await j(),n.textContent=`Installed`,n.style.color=`var(--success)`}catch(e){n.textContent=`Error`,n.disabled=!1,console.error(`[mcp-registry] install failed:`,e.message)}}}function Xe(){Le(),M?.classList.add(`open`),M?.setAttribute(`aria-hidden`,`false`),z=!0,B(`active`)}function U(){z&&(M?.classList.remove(`open`),M?.setAttribute(`aria-hidden`,`true`),z=!1,Ue(),document.getElementById(`mcpHelpOverlay`)?.remove())}var Ze=!1;function Qe(){Ze||(Ze=!0,document.addEventListener(`keydown`,e=>{if(document.getElementById(`mcpHelpOverlay`)&&e.key===`Escape`){e.preventDefault(),document.getElementById(`mcpHelpOverlay`)?.remove();return}z&&e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),U())},!0))}var $e=new Set([`ai-e`,`codex-app`]),et=new Set([`ai-e`,`claude-e`,`pi`,`gemini`]),tt={},nt={cursor:{title:`Native quota access`,description:`Log in with cursor-agent to read quota from its selected account. An explicitly configured dashboard session is also supported.`,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:`Read Gem/Cla quota from the running Antigravity IDE or the selected antigravity-usage account. Use its login command if the stored account needs reauthentication.`,commands:[`npx antigravity-usage login`,`npx antigravity-usage --json`]},grok:{title:`Grok login`,description:`Log in with Grok to read weekly usage. Legacy billing credentials remain supported.`,commands:[`grok 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. Rolling, weekly and monthly usage appear when available. Model access and quota availability are checked separately.`,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 rt(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 it(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 at(e){return e.toLowerCase().replace(/^cursor\s+/i,``).trim()}var ot=new Set([`auth/status only`,`google cloud code`,`runtime-checked`]),st=new Set([`cursor`,`antigravity.google`,`antigravity`,`max`,`copilot`,`gemini`]);function ct(e,t){let n=t.account;if(!n)return[];let r=[];n.email&&r.push(n.email);let i=new Set(r.map(at));for(let e of[n.plan,n.tier]){if(!e)continue;let t=at(e);if(t&&!ot.has(t)&&!st.has(t)&&!i.has(t)){i.add(t),r.push(e);break}}return r}function lt(e,t,n=[]){let i=nt[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(`
153
+ </div>`}).join(``),i+=`</div>`),R.innerHTML=i,R.querySelectorAll(`[data-registry-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.registryInstall,r=e.entries.find(e=>e.id===n);r&&Ye(r,t)})}),R.querySelectorAll(`[data-builtin-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.builtinInstall,r=e.builtins?.find(e=>e.id===n);r?.standalone_config&&Ye({id:r.id,name:r.name,description:r.description,category:`harness`,type:`remote`,config:r.standalone_config,tags:[],url:r.source},t)})})}catch(e){R.innerHTML=`<p style="color:var(--color-error)">${r(e.message)}</p>`}}}async function Ye(e,n){if(j){n.disabled=!0,n.textContent=`Installing...`;try{let r=e.config,i={...j,servers:{...j.servers,[e.id]:r}};await t(`/api/mcp`,`PUT`,i),await t(`/api/mcp/sync`,`POST`,{}),await M(),n.textContent=`Installed`,n.style.color=`var(--success)`}catch(e){n.textContent=`Error`,n.disabled=!1,console.error(`[mcp-registry] install failed:`,e.message)}}}function Xe(){Le(),N?.classList.add(`open`),N?.setAttribute(`aria-hidden`,`false`),B=!0,V(`active`)}function W(){B&&(N?.classList.remove(`open`),N?.setAttribute(`aria-hidden`,`true`),B=!1,Ue(),document.getElementById(`mcpHelpOverlay`)?.remove())}var Ze=!1;function Qe(){Ze||(Ze=!0,document.addEventListener(`keydown`,e=>{if(document.getElementById(`mcpHelpOverlay`)&&e.key===`Escape`){e.preventDefault(),document.getElementById(`mcpHelpOverlay`)?.remove();return}B&&e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),W())},!0))}var $e=new Set([`ai-e`,`codex-app`]),et=new Set([`ai-e`,`claude-e`,`pi`,`gemini`]),tt={},nt={cursor:{title:`Native quota access`,description:`Log in with cursor-agent to read quota from its selected account. An explicitly configured dashboard session is also supported.`,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:`Read Gem/Cla quota from the running Antigravity IDE or the selected antigravity-usage account. Use its login command if the stored account needs reauthentication.`,commands:[`npx antigravity-usage login`,`npx antigravity-usage --json`]},grok:{title:`Grok login`,description:`Log in with Grok to read weekly usage. Legacy billing credentials remain supported.`,commands:[`grok 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. Rolling, weekly and monthly usage appear when available. Model access and quota availability are checked separately.`,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 rt(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 it(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 at(e){return e.toLowerCase().replace(/^cursor\s+/i,``).trim()}var ot=new Set([`auth/status only`,`google cloud code`,`runtime-checked`]),st=new Set([`cursor`,`antigravity.google`,`antigravity`,`max`,`copilot`,`gemini`]);function ct(e,t){let n=t.account;if(!n)return[];let r=[];n.email&&r.push(n.email);let i=new Set(r.map(at));for(let e of[n.plan,n.tier]){if(!e)continue;let t=at(e);if(t&&!ot.has(t)&&!st.has(t)&&!i.has(t)){i.add(t),r.push(e);break}}return r}function lt(e,t,n=[]){let i=nt[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(`
154
154
  `))}"${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 ut(e,t){let n=nt[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=lt(e,t,a);if(n){let e=n.commands.map(e=>`
155
155
  <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>
156
156
  `).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`
@@ -163,40 +163,41 @@ URL: https://mcp.example.com/sse</pre>
163
163
  </details>
164
164
  `}return`
165
165
  <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">
166
- <div style="color:var(--text);font-weight:600">${r(t.displayTier||d(e))}${o}</div>
166
+ <div style="color:var(--text);font-weight:600">${r(t.displayTier||p(e))}${o}</div>
167
167
  <div style="margin-top:2px">${r(it(e,t))}</div>
168
168
  </div>
169
- `}var dt=new Set([0,600,1800]),W=0,ft=2e3,pt=4e3,G=null,mt=!1,K=0,q=null,J=null,ht=`cliStatusCollapsed`;function Y(){try{return window.parent!==window}catch{return!0}}function gt(){try{return localStorage.getItem(ht)===`true`}catch{return!1}}function _t(e){try{localStorage.setItem(ht,e?`true`:`false`)}catch{}}function vt(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function yt(){J!=null&&(window.clearTimeout(J),J=null)}function bt(e,t=``){yt();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 xt(e,t){bt(e,t),J=window.setTimeout(()=>{bt(`idle`)},pt)}var X=!gt();function St(){return X}function Ct(){X=!0;let e=document.getElementById(`cliStatusList`),t=document.getElementById(`cliStatusHeader`);e&&(e.style.display=`block`),t&&t.classList.add(`expanded`),_t(!1),Z(!0)}function wt(){let e=document.getElementById(`cliStatusHeader`),t=document.getElementById(`cliStatusList`);e&&t&&(X?(t.style.display=`block`,e.classList.add(`expanded`)):t.style.display=`none`,e.addEventListener(`click`,()=>{X=!X,t.style.display=X?`block`:`none`,e.classList.toggle(`expanded`,X),_t(!X),X&&Z(!0)}))}function Tt(){let e=Number(localStorage.getItem(`cliStatusInterval`)||W);return dt.has(e)?e:W}function Et(e=Tt()){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 Dt(){G!=null&&(window.clearInterval(G),G=null);let e=Tt();Et(e),!(e<=0)&&(G=window.setInterval(()=>{!document.hidden&&X&&(Y()||document.hasFocus())&&Z(!0)},e*1e3))}function Ot(){!mt&&Y()&&(mt=!0,window.addEventListener(`message`,e=>{let t=e.data;t?.type===`jaw-preview-visibility`&&t.visible===!0&&X&&Z(!1)}))}function kt(e){let t=Number(e),n=dt.has(t)?t:W;localStorage.setItem(`cliStatusInterval`,String(n)),Et(n),Dt()}function At(t,r,i){Y()&&(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(),Q({cliStatus:r,quota:i}))})()}async function jt(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()),Q({cliStatus:r,quota:o}),a||At(t,r,i),!!a}function Mt(e,t,n,r){let i=()=>{jt(t,n,r).catch(()=>{})};if(e)return jt(t,n,r);window.setTimeout(i,ft)}async function Z(t=!1){if(X){if(t&&bt(`refreshing`,`Refreshing quota...`),q){if(t)await q.catch(()=>{});else return}q=(async()=>{let r=++K,i=document.getElementById(`cliStatusList`);try{let a=Tt();if(!t&&e.cliStatusCache&&a>0&&Date.now()-e.cliStatusTs<a*1e3){Q({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&&xt(`error`,`Refresh failed`);return}Q({cliStatus:s,quota:o??null});let c=await Mt(t,r,s,o);t&&r===K&&xt(`success`,`${c?`Updated`:`Checked`} ${vt(new Date)}`)}catch{i&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`),t&&xt(`error`,`Refresh failed`)}})().finally(()=>{q=null}),await q}}function Q(e){let{cliStatus:t,quota:a}=e,s=document.getElementById(`cliStatusList`),c={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 (${i(`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:i(`cli.copilot.authHint`)}},f=``;if(!t||typeof t!=`object`){s&&(s.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(et.has(e))continue;let t=u(n),s=t===`checking`,p=t===`unknown`,m=t===`probe-failing`,h=t===`capability-failed`,g=s||p||m?void 0:a?.[e],_;_=s?`checking`:p||m?`warn`:!n.available||h?`missing`:!g||g.error?`ok`:g.authenticated===!1?`warn`:`ok`;let te=``,ne=g?.quotaCapable===!1&&g.authenticated!==!1&&n.available&&!tt[e]&&!$e.has(e);if(g?.account&&!ne){let t=ct(e,g);t.length&&(te=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${r(t.join(` · `))}</div>`)}let v=``;if(!s&&!p&&!m&&(!n.available||_===`warn`)){let t=c[e];if(t){let e=!n.available,a=i(e?`cli.authRequired`:`cli.notAuthenticated`),o=e?`var(--error)`:`var(--warning)`;v=`
169
+ `}var dt=new Set([0,600,1800]),G=0,ft=2e3,pt=4e3,K=null,mt=!1,q=0,J=null,Y=null,ht=`cliStatusCollapsed`;function X(){try{return window.parent!==window}catch{return!0}}function gt(){try{return localStorage.getItem(ht)===`true`}catch{return!1}}function _t(e){try{localStorage.setItem(ht,e?`true`:`false`)}catch{}}function vt(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function yt(){Y!=null&&(window.clearTimeout(Y),Y=null)}function bt(e,t=``){yt();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 xt(e,t){bt(e,t),Y=window.setTimeout(()=>{bt(`idle`)},pt)}var Z=!gt();function St(){return Z}function Ct(){Z=!0;let e=document.getElementById(`cliStatusList`),t=document.getElementById(`cliStatusHeader`);e&&(e.style.display=`block`),t&&t.classList.add(`expanded`),_t(!1),Q(!0)}function wt(){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),_t(!Z),Z&&Q(!0)}))}function Tt(){let e=Number(localStorage.getItem(`cliStatusInterval`)||G);return dt.has(e)?e:G}function Et(e=Tt()){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(G)}function Dt(){K!=null&&(window.clearInterval(K),K=null);let e=Tt();Et(e),!(e<=0)&&(K=window.setInterval(()=>{!document.hidden&&Z&&(X()||document.hasFocus())&&Q(!0)},e*1e3))}function Ot(){!mt&&X()&&(mt=!0,window.addEventListener(`message`,e=>{let t=e.data;t?.type===`jaw-preview-visibility`&&t.visible===!0&&Z&&Q(!1)}))}function kt(e){let t=Number(e),n=dt.has(t)?t:G;localStorage.setItem(`cliStatusInterval`,String(n)),Et(n),Dt()}function At(t,r,i){X()&&(async()=>{if(await new Promise(e=>window.setTimeout(e,600)),t!==q)return;let i=await n(`/api/quota`);t===q&&i&&(e.cliStatusCache={cliStatus:r,quota:i},e.cliStatusTs=Date.now(),Nt({cliStatus:r,quota:i}))})()}async function jt(t,r,i){let a=await n(`/api/quota`);if(t!==q)return!1;let o=a??i??null;return e.cliStatusCache={cliStatus:r,quota:o},a&&(e.cliStatusTs=Date.now()),Nt({cliStatus:r,quota:o}),a||At(t,r,i),!!a}function Mt(e,t,n,r){let i=()=>{jt(t,n,r).catch(()=>{})};if(e)return jt(t,n,r);window.setTimeout(i,ft)}async function Q(t=!1){if(Z){if(t&&bt(`refreshing`,`Refreshing quota...`),J){if(t)await J.catch(()=>{});else return}J=(async()=>{let r=++q,i=document.getElementById(`cliStatusList`);try{let a=Tt();if(!t&&e.cliStatusCache&&a>0&&Date.now()-e.cliStatusTs<a*1e3){Nt({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!==q)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&&xt(`error`,`Refresh failed`);return}Nt({cliStatus:s,quota:o??null});let c=await Mt(t,r,s,o);t&&r===q&&xt(`success`,`${c?`Updated`:`Checked`} ${vt(new Date)}`)}catch{i&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`),t&&xt(`error`,`Refresh failed`)}})().finally(()=>{J=null}),await J}}function Nt(e){let{cliStatus:t,quota:a}=e,s=document.getElementById(`cliStatusList`),c={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 (${i(`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:i(`cli.copilot.authHint`)}},ee=``;if(!t||typeof t!=`object`){s&&(s.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(et.has(e))continue;let t=d(n),s=t===`checking`,m=t===`unknown`,h=t===`probe-failing`,g=t===`capability-failed`,_=s||m||h?void 0:a?.[e],v;v=s?`checking`:m||h?`warn`:!n.available||g?`missing`:!_||_.error?`ok`:_.authenticated===!1?`warn`:`ok`;let te=``,ne=_?.quotaCapable===!1&&_.authenticated!==!1&&n.available&&!tt[e]&&!$e.has(e);if(_?.account&&!ne){let t=ct(e,_);t.length&&(te=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${r(t.join(` · `))}</div>`)}let y=``;if(!s&&!m&&!h&&(!n.available||v===`warn`)){let t=c[e];if(t){let e=!n.available,a=i(e?`cli.authRequired`:`cli.notAuthenticated`),o=e?`var(--error)`:`var(--warning)`;y=`
170
170
  <div style="font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--surface);border-radius:4px;border-left:2px solid ${o}">
171
171
  <div style="color:${o};margin-bottom:3px">${a}</div>
172
172
  ${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>`:``}
173
173
  <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>
174
174
  </div>
175
- `}}let y=``,b=tt[e];if(!$e.has(e)){if(b&&n.available)y=`
175
+ `}}let b=``,x=tt[e];if(!$e.has(e)){if(x&&n.available)b=`
176
176
  <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">
177
- ${r(b)}
177
+ ${r(x)}
178
178
  </div>
179
- `;else if(ne)y=ut(e,g);else if(g?.windows?.length)y=g.windows.map(t=>{let n=l(t),i=n.percent??0,a=i>80?`var(--error)`:i>50?`var(--warning)`:`var(--info)`,o=rt(e,t.label),s=``;if(t.resetsAt){let e=new Date(typeof t.resetsAt==`number`?t.resetsAt*1e3:t.resetsAt),n=new Date;s=e.toDateString()===n.toDateString()?`${e.getHours()}:${String(e.getMinutes()).padStart(2,`0`)}`:`${e.getMonth()+1}/${e.getDate()}`}let c=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`
179
+ `;else if(ne)b=ut(e,_);else if(_?.windows?.length)b=_.windows.map(t=>{let n=l(t),i=n.percent??0,a=i>80?`var(--error)`:i>50?`var(--warning)`:`var(--info)`,o=rt(e,t.label),s=``;if(t.resetsAt){let e=new Date(typeof t.resetsAt==`number`?t.resetsAt*1e3:t.resetsAt),n=new Date;s=e.toDateString()===n.toDateString()?`${e.getHours()}:${String(e.getMinutes()).padStart(2,`0`)}`:`${e.getMonth()+1}/${e.getDate()}`}let c=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`
180
180
  <div style="display:flex;align-items:center;gap:4px;margin-left:16px;font-size:10px;color:var(--text-dim)">
181
181
  <span style="min-width:18px;max-width:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">${r(o)}</span>
182
182
  ${c}
183
183
  ${s?`<span style="width:30px;text-align:right;opacity:0.6">${s}</span>`:``}
184
184
  </div>
185
- `}).join(``);else if(g?.error&&n.available){let e=g.reason===`rate_limited`?`Rate limited — retry in a moment`:`Usage data unavailable`;y=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px;opacity:0.7">${o.warning} ${e}</div>`}}let re=g?.quotaCapable&&nt[e]?lt(e,g):``,x=g?.billing?.usedUsd!=null&&g?.billing?.limitUsd?`<span style="margin-left:auto;font-size:10px;color:var(--text-dim);white-space:nowrap">$${g.billing.usedUsd.toFixed(1)}/$${g.billing.limitUsd}</span>`:``,ie=s?`<div role="status" aria-live="polite" style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px">상태 확인 중</div>`:p?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">Probe unavailable${n.probeError?` · ${r(n.probeError)}`:``}</div>`:m?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">상태 확인 실패 · 재시도 중${n.probeError?` · ${r(n.probeError)}`:``}</div>`:h?`<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>`:``;f+=`
185
+ `}).join(``);else if(_?.error&&n.available){let e=_.reason===`rate_limited`?`Rate limited — retry in a moment`:`Usage data unavailable`;b=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px;opacity:0.7">${o.warning} ${e}</div>`}}let re=_?.quotaCapable&&nt[e]?lt(e,_):``,S=_?.billing?.usedUsd!=null&&_?.billing?.limitUsd?`<span style="margin-left:auto;font-size:10px;color:var(--text-dim);white-space:nowrap">$${_.billing.usedUsd.toFixed(1)}/$${_.billing.limitUsd}</span>`:``,ie=s?`<div role="status" aria-live="polite" style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px">상태 확인 중</div>`:m?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">Probe unavailable${n.probeError?` · ${r(n.probeError)}`:``}</div>`:h?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">상태 확인 실패 · 재시도 중${n.probeError?` · ${r(n.probeError)}`:``}</div>`:g?`<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>`:``,ae=u(n),C=ae?`<div role="alert" style="font-size:10px;color:var(--warning);margin:2px 0 0 16px">${r(ae.message)}</div>`:``;ee+=`
186
186
  <div class="settings-group" style="margin-bottom:6px;padding:8px 10px">
187
187
  <div class="cli-status-row" style="display:flex;align-items:center">
188
- <span class="cli-dot ${_}"></span>
189
- <span class="cli-provider-icon" aria-hidden="true">${ee(e)||``}</span>
190
- <span class="cli-name" style="font-weight:600">${r(d(e))}${re}</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="${i(`copilot.keychainHint`)}">${o.key}</button>`:``}${x}
188
+ <span class="cli-dot ${v}"></span>
189
+ <span class="cli-provider-icon" aria-hidden="true">${f(e)||``}</span>
190
+ <span class="cli-name" style="font-weight:600">${r(p(e))}${re}</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="${i(`copilot.keychainHint`)}">${o.key}</button>`:``}${S}
191
191
  </div>
192
192
  ${te}
193
193
  ${ie}
194
- ${v}
194
+ ${C}
195
195
  ${y}
196
+ ${b}
196
197
  </div>
197
- `}s&&(s.innerHTML=f);let p=Object.entries(t),m=p.some(([,e])=>{let t=u(e);return t===`probe-failing`||t===`unknown`});!p.some(([e,t])=>{if(u(t)!==`ready`)return!1;let n=a?.[e];return!n||n.authenticated!==!1})&&!m&&p.length>0&&s&&s.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)">
198
+ `}s&&(s.innerHTML=ee);let m=Object.entries(t),h=m.some(([,e])=>{let t=d(e);return t===`probe-failing`||t===`unknown`});!m.some(([e,t])=>{if(d(t)!==`ready`)return!1;let n=a?.[e];return!n||n.authenticated!==!1})&&!h&&m.length>0&&s&&s.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)">
198
199
  ${o.warning} ${i(`cli.noReadyCli`)}
199
- </div>`);let h=document.getElementById(`copilotKeychainBtn`);h&&h.addEventListener(`click`,async()=>{let e=h;e.disabled=!0,e.innerHTML=o.hourglass;try{let t=await n(`/api/copilot/refresh`,{method:`POST`});e.innerHTML=t?.ok?o.check:o.error,t?.ok&&await Z(!0)}catch{e.innerHTML=o.error}setTimeout(()=>{e.innerHTML=o.key,e.disabled=!1},2e3)}),s&&s.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}Nt(n,r,a)})})}function Nt(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(`
200
+ </div>`);let g=document.getElementById(`copilotKeychainBtn`);g&&g.addEventListener(`click`,async()=>{let e=g;e.disabled=!0,e.innerHTML=o.hourglass;try{let t=await n(`/api/copilot/refresh`,{method:`POST`});e.innerHTML=t?.ok?o.check:o.error,t?.ok&&await Q(!0)}catch{e.innerHTML=o.error}setTimeout(()=>{e.innerHTML=o.key,e.disabled=!1},2e3)}),s&&s.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}Pt(n,r,a)})})}function Pt(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(`
200
201
  `).filter(Boolean);o.innerHTML=`
201
202
  <h4>CLI Setup</h4>
202
203
  ${t?`<p style="color:var(--text-dim);font-size:12px;margin:4px 0 8px">${r(t)}</p>`:``}
@@ -205,4 +206,4 @@ URL: https://mcp.example.com/sse</pre>
205
206
  <div style="text-align:right;margin-top:12px">
206
207
  <button type="button" class="btn-save" id="cliHelpClose">OK</button>
207
208
  </div>
208
- `,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 Pt(){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 Ft(e){e&&e.target!==e.currentTarget||document.getElementById(`promptModal`)?.classList.remove(`open`)}async function It(){let e=document.getElementById(`modalPromptEditor`)?.value||``;await t(`/api/prompt`,`PUT`,{content:e}),document.getElementById(`promptModal`)?.classList.remove(`open`)}var Lt=[],$=!1;async function Rt(){let e=await n(`/api/prompt-templates`);e&&(Lt=e.templates,$=!1,zt(e.tree),Ut(`tree`),document.getElementById(`templateModal`)?.classList.add(`open`))}function zt(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=Lt.find(t=>t.id===e);if(!n)continue;let i=document.createElement(`div`);i.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`,i.innerHTML=`${o.file} ${r(n.filename)}`,i.addEventListener(`mouseenter`,()=>{i.style.borderColor=`var(--accent2)`}),i.addEventListener(`mouseleave`,()=>{i.style.borderColor=`var(--border)`}),i.addEventListener(`click`,()=>{Bt(n)}),t.appendChild(i)}}}}function Bt(e){let t=document.getElementById(`templateEditor`);t.value=e.content,t.dataset.templateId=e.id,t.readOnly=!0,$=!1;let n=document.getElementById(`templateEditorLabel`);n&&(n.innerHTML=`${o.file} ${r(e.filename)}`);let i=e.content.match(/\{\{[A-Z_]+\}\}/g),a=document.getElementById(`templateVars`);a&&(a.textContent=i?`vars: ${[...new Set(i)].join(`, `)}`:`no variables`);let s=document.getElementById(`templateSaveBtn`);s&&(s.style.display=`none`);let l=document.getElementById(`templateDevToggle`);l&&(l.style.color=`var(--text-dim)`,l.style.borderColor=`var(--border)`,l.innerHTML=`${o.tool} ${c(`devMode`)}`);let u=document.getElementById(`templateModalTitle`);u&&(u.innerHTML=`${o.file} ${r(e.filename)}`),Ut(`editor`)}function Vt(){if(!$&&!confirm(c(`promptEditWarning`)))return;$=!$;let e=document.getElementById(`templateEditor`);e.readOnly=!$;let t=document.getElementById(`templateSaveBtn`);t&&(t.style.display=$?``:`none`);let n=document.getElementById(`templateDevToggle`);n&&(n.style.color=$?`var(--stop-btn)`:`var(--text-dim)`,n.style.borderColor=$?`var(--stop-btn)`:`var(--border)`,n.innerHTML=$?`${o.lockOpen} ${c(`devModeOn`)}`:`${o.tool} ${c(`devMode`)}`)}async function Ht(){let e=document.getElementById(`templateEditor`),n=e.dataset.templateId;if(!n)return;await t(`/api/prompt-templates/${n}`,`PUT`,{content:e.value});let i=document.getElementById(`templateEditorLabel`);i&&(i.innerHTML=`${o.check} ${c(`savedAndReloaded`)}`,setTimeout(()=>{i.innerHTML=`${o.file} ${r(n)}.md`},2e3));let a=Lt.find(e=>e.id===n);a&&(a.content=e.value)}function Ut(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=`${o.plan} ${c(`promptStructure`)}`)}function Wt(){Ut(`tree`)}function Gt(e){e&&e.target!==e.currentTarget||document.getElementById(`templateModal`)?.classList.remove(`open`)}function Kt(e=document.body.dataset.settingsOpen!==`true`){let t=document.getElementById(`settingsPage`),n=document.querySelector(`.chat-area`);if(!t||!n)return;if(!e){t.querySelector(`iframe`)?.contentWindow?.postMessage({type:`settings:request-back`},window.location.origin);return}let r=n.querySelector(`.chat-header`);r&&t.prepend(r),document.body.dataset.settingsOpen=`true`,n.hidden=!0,n.inert=!0,t.hidden=!1,document.getElementById(`btnSettings`)?.setAttribute(`aria-pressed`,`true`),t.querySelector(`iframe`)?.focus()}function qt(){let e=document.getElementById(`settingsPage`),t=document.querySelector(`.chat-area`);if(!e||!t)return;let n=e.querySelector(`.chat-header`);n&&t.prepend(n),delete document.body.dataset.settingsOpen,t.hidden=!1,t.inert=!1,e.hidden=!0,document.getElementById(`btnSettings`)?.setAttribute(`aria-pressed`,`false`),document.getElementById(`chatInput`)?.focus()}function Jt(){let e=document.querySelector(`#settingsPage iframe`);if(!e)return()=>{};let t=new URL(`dist/settings/index.html`,document.baseURI);e.src!==t.href&&(e.src=t.href);let n=()=>{try{e.contentWindow?.postMessage({type:`jaw-preview-theme-sync`,theme:document.documentElement.dataset.theme},window.location.origin)}catch(e){console.warn(`[settings-frame] theme sync skipped`,e)}},r=new MutationObserver(n);r.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]});let i=t=>{t.source===e.contentWindow&&t.origin===window.location.origin&&(t.data?.type===`jaw-settings-ready`&&n(),t.data?.type===`settings:back`&&qt())},o=e=>{e.source===window.parent&&a(e.origin)&&e.data?.type===`jaw-preview-settings-open`&&Kt(!0)};return e.addEventListener(`load`,n),window.addEventListener(`message`,i),window.addEventListener(`message`,o),n(),()=>{r.disconnect(),e.removeEventListener(`load`,n),window.removeEventListener(`message`,i),window.removeEventListener(`message`,o)}}export{Pe as C,Xe as S,Dt as _,Pt as a,Fe as b,Ht as c,Ct as d,Ot as f,Z as g,Y as h,Gt as i,Wt as l,St as m,Kt as n,Rt as o,wt as p,Ft as r,It as s,Jt as t,Vt as u,kt as v,_e as w,j as x,Qe as y};
209
+ `,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 Ft(){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 It(e){e&&e.target!==e.currentTarget||document.getElementById(`promptModal`)?.classList.remove(`open`)}async function Lt(){let e=document.getElementById(`modalPromptEditor`)?.value||``;await t(`/api/prompt`,`PUT`,{content:e}),document.getElementById(`promptModal`)?.classList.remove(`open`)}var Rt=[],$=!1;async function zt(){let e=await n(`/api/prompt-templates`);e&&(Rt=e.templates,$=!1,Bt(e.tree),Wt(`tree`),document.getElementById(`templateModal`)?.classList.add(`open`))}function Bt(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=Rt.find(t=>t.id===e);if(!n)continue;let i=document.createElement(`div`);i.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`,i.innerHTML=`${o.file} ${r(n.filename)}`,i.addEventListener(`mouseenter`,()=>{i.style.borderColor=`var(--accent2)`}),i.addEventListener(`mouseleave`,()=>{i.style.borderColor=`var(--border)`}),i.addEventListener(`click`,()=>{Vt(n)}),t.appendChild(i)}}}}function Vt(e){let t=document.getElementById(`templateEditor`);t.value=e.content,t.dataset.templateId=e.id,t.readOnly=!0,$=!1;let n=document.getElementById(`templateEditorLabel`);n&&(n.innerHTML=`${o.file} ${r(e.filename)}`);let i=e.content.match(/\{\{[A-Z_]+\}\}/g),a=document.getElementById(`templateVars`);a&&(a.textContent=i?`vars: ${[...new Set(i)].join(`, `)}`:`no variables`);let s=document.getElementById(`templateSaveBtn`);s&&(s.style.display=`none`);let l=document.getElementById(`templateDevToggle`);l&&(l.style.color=`var(--text-dim)`,l.style.borderColor=`var(--border)`,l.innerHTML=`${o.tool} ${c(`devMode`)}`);let u=document.getElementById(`templateModalTitle`);u&&(u.innerHTML=`${o.file} ${r(e.filename)}`),Wt(`editor`)}function Ht(){if(!$&&!confirm(c(`promptEditWarning`)))return;$=!$;let e=document.getElementById(`templateEditor`);e.readOnly=!$;let t=document.getElementById(`templateSaveBtn`);t&&(t.style.display=$?``:`none`);let n=document.getElementById(`templateDevToggle`);n&&(n.style.color=$?`var(--stop-btn)`:`var(--text-dim)`,n.style.borderColor=$?`var(--stop-btn)`:`var(--border)`,n.innerHTML=$?`${o.lockOpen} ${c(`devModeOn`)}`:`${o.tool} ${c(`devMode`)}`)}async function Ut(){let e=document.getElementById(`templateEditor`),n=e.dataset.templateId;if(!n)return;await t(`/api/prompt-templates/${n}`,`PUT`,{content:e.value});let i=document.getElementById(`templateEditorLabel`);i&&(i.innerHTML=`${o.check} ${c(`savedAndReloaded`)}`,setTimeout(()=>{i.innerHTML=`${o.file} ${r(n)}.md`},2e3));let a=Rt.find(e=>e.id===n);a&&(a.content=e.value)}function Wt(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=`${o.plan} ${c(`promptStructure`)}`)}function Gt(){Wt(`tree`)}function Kt(e){e&&e.target!==e.currentTarget||document.getElementById(`templateModal`)?.classList.remove(`open`)}function qt(e=document.body.dataset.settingsOpen!==`true`){let t=document.getElementById(`settingsPage`),n=document.querySelector(`.chat-area`);if(!t||!n)return;if(!e){t.querySelector(`iframe`)?.contentWindow?.postMessage({type:`settings:request-back`},window.location.origin);return}let r=n.querySelector(`.chat-header`);r&&t.prepend(r),document.body.dataset.settingsOpen=`true`,n.hidden=!0,n.inert=!0,t.hidden=!1,document.getElementById(`btnSettings`)?.setAttribute(`aria-pressed`,`true`),t.querySelector(`iframe`)?.focus()}function Jt(){let e=document.getElementById(`settingsPage`),t=document.querySelector(`.chat-area`);if(!e||!t)return;let n=e.querySelector(`.chat-header`);n&&t.prepend(n),delete document.body.dataset.settingsOpen,t.hidden=!1,t.inert=!1,e.hidden=!0,document.getElementById(`btnSettings`)?.setAttribute(`aria-pressed`,`false`),document.getElementById(`chatInput`)?.focus()}function Yt(){let e=document.querySelector(`#settingsPage iframe`);if(!e)return()=>{};let t=new URL(`dist/settings/index.html`,document.baseURI);e.src!==t.href&&(e.src=t.href);let n=()=>{try{e.contentWindow?.postMessage({type:`jaw-preview-theme-sync`,theme:document.documentElement.dataset.theme},window.location.origin)}catch(e){console.warn(`[settings-frame] theme sync skipped`,e)}},r=new MutationObserver(n);r.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]});let i=t=>{t.source===e.contentWindow&&t.origin===window.location.origin&&(t.data?.type===`jaw-settings-ready`&&n(),t.data?.type===`settings:back`&&Jt())},o=e=>{e.source===window.parent&&a(e.origin)&&e.data?.type===`jaw-preview-settings-open`&&qt(!0)};return e.addEventListener(`load`,n),window.addEventListener(`message`,i),window.addEventListener(`message`,o),n(),()=>{r.disconnect(),e.removeEventListener(`load`,n),window.removeEventListener(`message`,i),window.removeEventListener(`message`,o)}}export{Pe as C,Xe as S,Dt as _,Ft as a,Fe as b,Ut as c,Ct as d,Ot as f,Q as g,X as h,Kt as i,Gt as l,St as m,qt as n,zt as o,wt as p,It as r,Lt as s,Yt as t,Ht as u,kt as v,_e as w,M as x,Qe as y};
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,t as r}from"./api-CUtiCd2-.js";import{O as i,P as a,S as o}from"./render-DP8SJtdZ.js";import{n as s}from"./locale-B9w_kUtW.js";import{t as c}from"./cli-engine-Bw0QTAVX.js";import{a as l,i as u,n as d,o as f,t as p}from"./constants-D8XAqfHk.js";import{i as m}from"./settings-types-B09BmpYe.js";import{s as h}from"./pi-settings-tRVfevu-.js";import{n as g,r as _}from"./provider-icons-Det0fC-4.js";import{n as ee,t as v}from"./presentation-preference-D9u6LD07.js";function y(e,t){if(!c(t))return;let n=Array.from(e.options).find(e=>e.value===t);n||(n=e.ownerDocument.createElement(`option`),n.value=t,e.prepend(n)),n.disabled=!0,n.textContent=`JWC (retired — choose another runtime)`,e.value=t,e.title=`The saved runtime is retired and cannot execute.`}var te=/^\/(?:Users|home)\/[^/]+/,b=32;function ne(e){return e.replace(te,`~`)}function x(e){if(e.length<=b)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function re(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${x(ne(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
1
+ import{a as e,i as t,n,t as r}from"./api-CUtiCd2-.js";import{O as i,P as a,S as o}from"./render-DUGqq9Mu.js";import{n as s}from"./locale-B9w_kUtW.js";import{t as c}from"./cli-engine-Bw0QTAVX.js";import{a as l,i as u,n as d,o as f,t as p}from"./constants-D8XAqfHk.js";import{a as m}from"./settings-types-D3cd6SWy.js";import{s as h}from"./pi-settings-tRVfevu-.js";import{n as g,r as _}from"./provider-icons-Det0fC-4.js";import{n as ee,t as v}from"./presentation-preference-D9u6LD07.js";function y(e,t){if(!c(t))return;let n=Array.from(e.options).find(e=>e.value===t);n||(n=e.ownerDocument.createElement(`option`),n.value=t,e.prepend(n)),n.disabled=!0,n.textContent=`JWC (retired — choose another runtime)`,e.value=t,e.title=`The saved runtime is retired and cannot execute.`}var te=/^\/(?:Users|home)\/[^/]+/,b=32;function ne(e){return e.replace(te,`~`)}function x(e){if(e.length<=b)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function re(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${x(ne(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
2
2
  `)}}function S(){return document.getElementById(`headerGitStatus`)}function C(){let e=S();e&&(e.hidden=!0,e.textContent=``,e.removeAttribute(`title`),e.removeAttribute(`aria-label`))}function w(e){if(!e?.available)return null;let t=e.branch||e.head;if(!t)return null;let n=[`/`,`⑂ ${t}`];e.trackedChangedCount>0&&n.push(`*${e.trackedChangedCount}`),e.untrackedCount>0&&n.push(`?${e.untrackedCount}`);let r=[`Git: ${e.branch?`branch ${e.branch}`:`detached ${e.head}`}`];return e.trackedChangedCount>0&&r.push(`${e.trackedChangedCount} tracked changes`),e.untrackedCount>0&&r.push(`${e.untrackedCount} untracked files`),{text:n.join(` `),title:r.join(`, `)}}function ie(e){let t=S();if(!t)return;let n=w(e);if(!n){C();return}t.hidden=!1,t.textContent=n.text,t.title=n.title,t.setAttribute(`aria-label`,n.title)}async function T(){ie(await n(`/api/project/git-summary`))}function E(e){(Array.isArray(e.changedKeys)?e.changedKeys:[]).includes(`projectDirs`)&&T()}var D=new Set,O,k=!1,A=0;function j(e){return!e||typeof e!=`object`?null:`settings`in e&&e.settings?e.settings:`data`in e&&e.data?e.data:e}async function ae(t){if(t.runtimeDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`신규 설치의 기본 런타임이 Codex App으로 변경되었습니다. 지금 Codex App을 사용하시겠습니까?`)?`accept`:`keep`;try{let i=await e(),a=await fetch(`${r}/api/settings/runtime-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...i?{Authorization:`Bearer ${i}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(m(a.status))return j(o)??t;window.alert(`런타임 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`런타임 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}async function M(t){if(t.multiSessionDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`이제 대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 2로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 켤까요?`)?`accept`:`keep`;try{let i=await e(),a=await fetch(`${r}/api/settings/multi-session-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...i?{Authorization:`Bearer ${i}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(m(a.status))return j(o)??t;window.alert(`세션 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`세션 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}function N(e){let t=document.getElementById(`headerCli`);if(!t)return;let n=g(e),r=F(e);t.innerHTML=n?`${n} ${i(r)}`:i(r)}function P(e){let t=document.getElementById(`headerProject`);if(!t)return;oe(t),t.hidden=!1;let n=re(e);if(!n){t.classList.add(`is-empty`),t.textContent=`Project: not set`,t.title=`Click to choose the project root folder`;return}t.classList.remove(`is-empty`),t.textContent=`Project ${n.text}`,t.title=`${n.title}\n(click to change)`}function oe(e){if(e.dataset.pickerBound)return;e.dataset.pickerBound=`1`,e.setAttribute(`role`,`button`),e.setAttribute(`tabindex`,`0`);let n=async()=>{if(e.classList.contains(`is-picking`))return;e.classList.add(`is-picking`);let n=e.textContent;e.textContent=`Choosing folder…`;try{let n=await t(`/api/project/pick`,`POST`,{});if(n&&!n.cancelled&&`projectDirs`in n){e.classList.remove(`is-picking`),P(n.projectDirs);return}}catch{}e.classList.remove(`is-picking`),e.textContent=n};e.addEventListener(`click`,()=>{n()}),e.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),n())})}function se(e){typeof e.cli==`string`&&e.cli&&N(e.cli),`projectDirs`in e&&P(e.projectDirs),E(e)}function F(e){return l(e)?.label||_(e)||e}function I(e){let t=e.finally(()=>{D.delete(t)});return D.add(t),t}async function ce(){for(;D.size;)await Promise.all(D)}function L(e,t,{includeCustom:n=!1,includeDefault:r=!1,selected:o=``}={}){if(!e)return;let s=r?`<option value="default">default</option>`:``,c=n?`<option value="__custom__">${a(`model.customOption`)}</option>`:``;e.innerHTML=s+(t||[]).map(e=>`<option value="${i(e)}">${i(e)}</option>`).join(``)+c,o&&Array.from(e.options).some(e=>e.value===o)&&(e.value=o)}function R(e,t){if(!e||!t||Array.from(e.options).some(e=>e.value===t))return;let n=document.createElement(`option`);n.value=t,n.textContent=t;let r=e.querySelector(`option[value="__custom__"]`);r?e.insertBefore(n,r):e.appendChild(n)}function z(e=null){let t=u().filter(e=>!c(e)),n=document.getElementById(`selCli`);if(n){let r=e?.cli||n.value||t[0]||`claude`,o=e=>d.includes(e),s=!o(r)&&t.includes(r),u=n.dataset.expanded===`1`,f=t.filter(o),p=t.filter(e=>!o(e)),m=f.length===0||s||u,h=f.map(e=>{let t=l(e)?.label||e;return`<option value="${i(e)}">${i(t)}</option>`}).join(``);p.length>0&&(m?(h+=`<option disabled>──────</option>`,h+=p.map(e=>{let t=l(e)?.label||e;return`<option value="${i(e)}">${i(t)}</option>`}).join(``)):h+=`<option value="__show_more__">${a(`cli.showMore`)}</option>`),n.innerHTML=h,n.title=c(r)?`The saved runtime is retired and cannot execute.`:``,y(n,r),Array.from(n.options).some(e=>e.value===r)&&(n.value=r)}let r=document.getElementById(`flushCli`);if(r){let n=e?.memory?.cli||r.value||``;r.innerHTML=`<option value="">(active CLI)</option>`+t.map(e=>`<option value="${i(e)}">${i(F(e))}</option>`).join(``),y(r,n),Array.from(r.options).some(e=>e.value===n)&&(r.value=n)}}function B(e,t){return(t||``).trim()}function V(e,t,n,r){let i=(t||``).trim();if(r){let t=e?.effortsByModelByProvider?.[r]?.[i];if(t)return t}return e?.effortsByModel?.[i]||n||e?.efforts||[]}function H(e,t,n){let r=(t||``).trim();return(n?e?.defaultEffortByModelByProvider?.[n]?.[r]:void 0)??e?.defaultEffortByModel?.[r]??``}function U(){return document.getElementById(`selEffort`)?.value||``}function W(e,t=``,n){let r=document.getElementById(`selEffort`);if(!r)return;let a=l(e),o=e!==`pi`&&a?.providers?.length?G(e):``,s=o?a?.effortsByProvider?.[o]||[]:null,c=B(e,n??document.getElementById(`selModel`)?.value??``),u=V(a,c,s,o||void 0);if(u.length===0){let e=a?.effortNote||`— none`;r.innerHTML=`<option value="">${i(e)}</option>`,r.title=e,r.disabled=!0;return}let d=[``].concat(u);r.innerHTML=[...new Set(d)].map(e=>e?`<option value="${i(e)}">${i(e)}</option>`:`<option value="">— none</option>`).join(``),r.disabled=!1,r.title=a?.effortNote||``;let f=!t||u.includes(t)?t:H(a,c,o||void 0);Array.from(r.options).some(e=>e.value===f)&&(r.value=f)}function le(e,t,n){return e?(e.innerHTML=n.map(e=>`<option value="${i(e)}">${i(_(e)||e)}</option>`).join(``),Array.from(e.options).some(e=>e.value===t)?e.value=t:e.options.length>0&&(e.value=e.options[0]?.value||t),e.value||t):t}function G(e){let t=document.getElementById(`selCliProvider`),n=l(e);return t?.value||n?.defaultProvider||``}function K(e,t){let n=document.getElementById(`cliProviderWrap`),r=document.getElementById(`selCliProvider`),i=document.getElementById(`cliProviderLabel`),a=l(t);if(!(t!==`pi`&&(a?.providers?.length??0)>0))return n&&(n.style.display=`none`),a?.defaultProvider||``;i&&(i.textContent=`Provider`);let o=le(r,e?.perCli?.[t]?.provider||r?.value||a?.defaultProvider||``,a.providers);return n&&(n.style.display=``),o}async function q(){let e=A;await f();let t=ee(),r=await n(`/api/settings`);if(!r)return;v(r,t),r=await ae(r),r=await M(r),s(r.locale??``),z(r),h(r.pi),K(r,r.cli||``);let a=document.getElementById(`selCli`);a&&Array.from(a.options).some(e=>e.value===r.cli)&&(a.value=r.cli,a.dataset.prev=r.cli);let o=document.getElementById(`inpCwd`);o&&(o.textContent=r.workingDir);let c=document.getElementById(`headerCli`);if(c){let e=g(r.cli),t=F(r.cli);c.innerHTML=e?`${e} ${i(t)}`:i(t)}P(r.projectDirs),await T(),e===A&&!k&&X(r.permissions,!1),Z(!1);let l=r.activeOverrides?.[r.cli]||{},u=r.perCli?.[r.cli]||{},d=l.model||u.model,p=l.effort??u.effort??``,m=document.getElementById(`selModel`);if(d&&m){let e=B(r.cli,d);e&&!Array.from(m.options).some(t=>t.value===e)&&R(m,e),m.value=e}W(r.cli,p)}async function J(){let e=document.getElementById(`selCli`)?.value||`claude`,n={cli:e},r=l(e);return e!==`pi`&&r?.providers?.length&&(n.perCli={[e]:{provider:G(e)}}),I((async()=>{let r=await t(`/api/settings`,`PUT`,n);if(!r){await q();return}let i=r.cli||e,a=document.getElementById(`selCli`);a&&Array.from(a.options).some(e=>e.value===i)&&(a.value=i,a.dataset.prev=i),N(i),o([`instances`],`active-cli-changed`)})())}function ue(e){return e===`auto`?`Auto (YOLO)`:e===`safe`?`Safe`:e==null?`Not provided`:Array.isArray(e)&&e.every(e=>typeof e==`string`)?`Custom (${e.length} ${e.length===1?`entry`:`entries`})`:`Unrecognized`}function Y(){let e=O,t=ue(e),n=document.getElementById(`configuredPermText`);n&&(n.textContent=`Configured policy: ${t}`);let r=document.getElementById(`configuredPerm`);r?.classList.toggle(`active`,e===`auto`),r?.classList.toggle(`perm-auto`,e===`auto`);let i=document.getElementById(`selPerm`);i&&(i.options[0].textContent=`Configured policy: ${t}`,i.value=e===`auto`||e===`safe`?e:``,i.disabled=k,i.setAttribute(`aria-busy`,String(k)))}async function X(e,n=!0){if(!n){O=e,Y();return}if(e!==`auto`&&e!==`safe`||e===O||k)return;k=!0,A++,Y();let r=document.getElementById(`permSaveError`);return r&&(r.hidden=!0,r.textContent=``),I((async()=>{try{let n=await t(`/api/settings`,`PUT`,{permissions:e});if(!n)throw Error(`Permission settings save failed`);O=n.permissions}catch{r&&(r.textContent=`Could not save permissions. Please try again.`,r.hidden=!1)}finally{k=!1,A++,Y()}})())}function Z(e=!0){let t=document.getElementById(`selCli`);if(!t)return;if(t.value===`__show_more__`){let e=t.dataset.prev||u()[0]||`claude`;t.dataset.expanded=`1`,z(null),Array.from(t.options).some(t=>t.value===e)&&(t.value=e);try{t.showPicker()}catch{}return}t.dataset.prev=t.value;let r=t.value||`claude`;c(r)||(t.title=``);let o=K(null,r),s=l(r),d=o&&s?.modelsByProvider?.[o]?s.modelsByProvider[o]:p[r]||[],f=document.getElementById(`selModel`);if(c(r)){f&&(f.disabled=!0,f.title=`The saved runtime is retired and cannot execute.`),N(r),W(r);return}s?.modelNote&&f?(f.innerHTML=`<option value="">${i(s.modelNote)}</option>`,f.title=s.modelNote,f.disabled=!0):(L(f,d,{includeCustom:!0,includeDefault:!0}),f&&(f.disabled=!1,f.title=``)),N(r),W(r);let m=document.getElementById(`selModelCustom`);m&&m.remove();let h=document.createElement(`input`);if(h.type=`text`,h.id=`selModelCustom`,h.className=`custom-model-input`,h.placeholder=a(`model.placeholder`),h.style.display=`none`,h.onchange=function(){let e=this.value.trim();e&&f&&(R(f,e),f.value=e,this.style.display=`none`,W(r,U(),e),Q())},!f){e&&J();return}f.parentElement?.appendChild(h),f.onchange=function(){this.value===`__custom__`?(h.style.display=`block`,h.focus()):(h.style.display=`none`,W(r,U(),this.value),Q())},n(`/api/settings`).then(e=>{if(!e)return;let t=e.activeOverrides?.[r]||{},n=e.perCli?.[r]||{},i=t.model||n.model,a=t.effort??n.effort??``;if(i&&f){let t=l(r);if(r!==`pi`&&t?.providers?.length&&(e.perCli?.[r]?.provider||t.defaultProvider||``)!==G(r)){W(r,a);return}let n=B(r,i);R(f,n),f.value=n}W(r,a)}),e&&J()}async function Q(){let e=document.getElementById(`selCli`)?.value||`claude`,n=document.getElementById(`selModel`)?.value||`default`;n===`__custom__`&&(n=document.getElementById(`selModelCustom`)?.value?.trim()||`default`);let r=document.getElementById(`selEffort`),i={};i[e]={model:n},r&&!r.disabled&&(i[e].effort=r.value||``);let a={activeOverrides:i},s=l(e);e!==`pi`&&s?.providers?.length&&(a.perCli={[e]:{provider:G(e)}}),await t(`/api/settings`,`PUT`,a)&&o([`instances`],`active-cli-changed`)}function de(){let e=document.getElementById(`flushCli`)?.value||document.getElementById(`selCli`)?.value||`claude`,t=p[e]||[];L(document.getElementById(`flushModel`),t,{includeDefault:!0}),$(),pe()}async function fe(){let e=await n(`/api/memory-files`);if(!e)return;let t=document.getElementById(`flushCli`),r=document.getElementById(`flushModel`);t&&e.cli&&(t.value=e.cli);let i=e.cli||document.getElementById(`selCli`)?.value||`claude`;L(r,p[i]||[],{includeDefault:!0}),r&&e.model&&(R(r,e.model),r.value=e.model),$()}async function pe(){let e=document.getElementById(`flushCli`)?.value||``,n=document.getElementById(`flushModel`)?.value||``;await t(`/api/memory-files/settings`,`PUT`,{cli:e,model:n})}function $(){let e=document.getElementById(`flushAgentBadge`);if(!e)return;let t=document.getElementById(`flushCli`)?.value||``,n=document.getElementById(`flushModel`)?.value||``,r=t||document.getElementById(`selCli`)?.value||``,i=[];r&&i.push(t?F(r):`${F(r)}*`),n&&n!=="default"&&i.push(n),e.textContent=i.length?`(${i.join(` / `)})`:``}export{se as a,J as c,de as i,ce as l,q as n,Q as o,Z as r,X as s,fe as t};
@@ -0,0 +1 @@
1
+ import{a as e}from"./settings-core-CzdXfoOK.js";export{e as refreshHeaderFromSettingsChange};