cli-jaw 2.17.41 → 2.17.42

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 (167) hide show
  1. package/README.md +3 -3
  2. package/dist/bin/commands/browser.js +52 -5
  3. package/dist/bin/commands/browser.js.map +1 -1
  4. package/dist/src/agent/args.js +69 -19
  5. package/dist/src/agent/args.js.map +1 -1
  6. package/dist/src/agent/codex-app-events.js +31 -1
  7. package/dist/src/agent/codex-app-events.js.map +1 -1
  8. package/dist/src/agent/cursor-model-inventory.js +140 -0
  9. package/dist/src/agent/cursor-model-inventory.js.map +1 -0
  10. package/dist/src/agent/grok-models.js +80 -0
  11. package/dist/src/agent/grok-models.js.map +1 -0
  12. package/dist/src/browser/actions.js +383 -20
  13. package/dist/src/browser/actions.js.map +1 -1
  14. package/dist/src/browser/grounding-candidate.js +272 -0
  15. package/dist/src/browser/grounding-candidate.js.map +1 -0
  16. package/dist/src/browser/grounding-eval.js +247 -0
  17. package/dist/src/browser/grounding-eval.js.map +1 -0
  18. package/dist/src/browser/image-size.js +63 -0
  19. package/dist/src/browser/image-size.js.map +1 -0
  20. package/dist/src/browser/index.js +1 -0
  21. package/dist/src/browser/index.js.map +1 -1
  22. package/dist/src/browser/occlusion.js +148 -0
  23. package/dist/src/browser/occlusion.js.map +1 -0
  24. package/dist/src/browser/verify-candidate.js +162 -0
  25. package/dist/src/browser/verify-candidate.js.map +1 -0
  26. package/dist/src/browser/vision-input.js +74 -0
  27. package/dist/src/browser/vision-input.js.map +1 -0
  28. package/dist/src/browser/vision-provider.js +75 -0
  29. package/dist/src/browser/vision-provider.js.map +1 -0
  30. package/dist/src/browser/vision.js +360 -47
  31. package/dist/src/browser/vision.js.map +1 -1
  32. package/dist/src/browser/web-ai/candidate-reconcile.js +14 -5
  33. package/dist/src/browser/web-ai/candidate-reconcile.js.map +1 -1
  34. package/dist/src/cli/claude-model-discovery.js +175 -0
  35. package/dist/src/cli/claude-model-discovery.js.map +1 -0
  36. package/dist/src/cli/claude-models.js +46 -0
  37. package/dist/src/cli/claude-models.js.map +1 -1
  38. package/dist/src/cli/registry-live.js +104 -1
  39. package/dist/src/cli/registry-live.js.map +1 -1
  40. package/dist/src/cli/registry.js +28 -5
  41. package/dist/src/cli/registry.js.map +1 -1
  42. package/dist/src/code-mode/host.js +6 -0
  43. package/dist/src/code-mode/host.js.map +1 -1
  44. package/dist/src/code-mode/manager.js +37 -8
  45. package/dist/src/code-mode/manager.js.map +1 -1
  46. package/dist/src/code-mode/providers/catalog.js +53 -1
  47. package/dist/src/code-mode/providers/catalog.js.map +1 -1
  48. package/dist/src/code-mode/providers/codex-app.js +6 -0
  49. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  50. package/dist/src/code-mode/providers/live-models.js +85 -0
  51. package/dist/src/code-mode/providers/live-models.js.map +1 -0
  52. package/dist/src/code-mode/providers/provider-live-models.js +120 -0
  53. package/dist/src/code-mode/providers/provider-live-models.js.map +1 -0
  54. package/dist/src/code-mode/session.js +37 -0
  55. package/dist/src/code-mode/session.js.map +1 -1
  56. package/dist/src/prompt/templates/a1-system.md +24 -14
  57. package/dist/src/prompt/templates/control-system.md +6 -11
  58. package/dist/src/prompt/templates/employee.md +5 -5
  59. package/dist/src/routes/browser.js +17 -5
  60. package/dist/src/routes/browser.js.map +1 -1
  61. package/package.json +1 -1
  62. package/public/css/activity.css +20 -1
  63. package/public/css/layout.css +7 -3
  64. package/public/dist/.vite/manifest.json +104 -105
  65. package/public/dist/assets/Agent-CQ4EBgY8.js +1 -0
  66. package/public/dist/assets/CodeCanvas-DWsx6sv5.js +2 -0
  67. package/public/dist/assets/DashboardMeta-Dh-tasbY.js +1 -0
  68. package/public/dist/assets/Display-NrqY_IaN.js +1 -0
  69. package/public/dist/assets/{Permissions-BzbnqenZ.js → Permissions-Bh947tUG.js} +1 -1
  70. package/public/dist/assets/Permissions-DzNJCt8K.js +1 -0
  71. package/public/dist/assets/app-BCBnxiGr.css +1 -0
  72. package/public/dist/assets/{app-x5Kray4W.js → app-Q0prKOFx.js} +4 -4
  73. package/public/dist/assets/{bgtask-badge-W9djRQVu.js → bgtask-badge-DAcWaUfS.js} +1 -1
  74. package/public/dist/assets/bgtask-badge-DHA2OQm8.js +1 -0
  75. package/public/dist/assets/{employees--_dmDw_a.js → employees-CWS3Juca.js} +1 -1
  76. package/public/dist/assets/{iframe-renderer-D4BmLtAq.js → iframe-renderer-DCDKBMb7.js} +2 -2
  77. package/public/dist/assets/iframe-renderer-RpvBly2x.js +1 -0
  78. package/public/dist/assets/manager-Nk7-RYPs.css +1 -0
  79. package/public/dist/assets/manager-XkR-DRaQ.js +5 -0
  80. package/public/dist/assets/manager-shortcuts-jsiX-zV6.js +1 -0
  81. package/public/dist/assets/memory-4YH8sz0L.js +1 -0
  82. package/public/dist/assets/{memory-DENQWzM8.js → memory-DhNdKZLO.js} +1 -1
  83. package/public/dist/assets/{message-history-BsrLcGJj.js → message-history-DbRTl1P0.js} +1 -1
  84. package/public/dist/assets/message-history-lVcLpAw8.js +1 -0
  85. package/public/dist/assets/{render-CF6Q1oIh.js → render-DP8SJtdZ.js} +1 -1
  86. package/public/dist/assets/settings--EGy3_B9.js +1 -0
  87. package/public/dist/assets/settings-85n9NjvX.js +1 -0
  88. package/public/dist/assets/{settings-B-C_jdZR.js → settings-C9_D-pn0.js} +32 -32
  89. package/public/dist/assets/settings-core-8wBl1mg-.js +1 -0
  90. package/public/dist/assets/{settings-core-BzAJLsKN.js → settings-core-BcVD2FgV.js} +1 -1
  91. package/public/dist/assets/{settings-embedding-dEMyByVi.js → settings-embedding-BSpq785l.js} +1 -1
  92. package/public/dist/assets/{settings-embedding-BSA42oKM.css → settings-embedding-LIMq5ebM.css} +1 -1
  93. package/public/dist/assets/{sidebar-fFEOpvJl.js → sidebar-BVhLb5Ft.js} +3 -3
  94. package/public/dist/assets/skills-6GFkHTlQ.js +1 -0
  95. package/public/dist/assets/{skills-Da_b06ci.js → skills-X7qxmHka.js} +1 -1
  96. package/public/dist/assets/{slash-commands-BbPUHHF4.js → slash-commands-BnDH4IU_.js} +1 -1
  97. package/public/dist/assets/slash-commands-qu8fPAZ3.js +1 -0
  98. package/public/dist/assets/{trace-drawer-B-QmzUfP.js → trace-drawer-DasaS1z4.js} +1 -1
  99. package/public/dist/assets/{ui-CkRUrIfp.js → ui-BtiBTXng.js} +1 -1
  100. package/public/dist/assets/ui-BucJ1zMA.js +1 -0
  101. package/public/dist/index.html +2 -2
  102. package/public/dist/manager/index.html +3 -3
  103. package/public/dist/settings/index.html +2 -2
  104. package/public/js/features/settings.ts +16 -0
  105. package/public/manager/src/App.tsx +10 -12
  106. package/public/manager/src/AppChrome.tsx +2 -3
  107. package/public/manager/src/InstancePreview.tsx +47 -0
  108. package/public/manager/src/SidebarRailRouter.tsx +34 -30
  109. package/public/manager/src/code/CodeComposer.tsx +31 -6
  110. package/public/manager/src/code/CodeSessionList.tsx +25 -7
  111. package/public/manager/src/code/CodeToastHost.tsx +49 -0
  112. package/public/manager/src/code/CodeTranscript.tsx +136 -26
  113. package/public/manager/src/code/CodeWorkbench.tsx +16 -2
  114. package/public/manager/src/code/ComposerFooter.tsx +130 -46
  115. package/public/manager/src/code/ContextUsageMeter.tsx +72 -0
  116. package/public/manager/src/code/ProviderGlyph.tsx +58 -0
  117. package/public/manager/src/code/code-composer.css +159 -175
  118. package/public/manager/src/code/code-controller-runtime.ts +3 -1
  119. package/public/manager/src/code/code-session-state.ts +7 -1
  120. package/public/manager/src/code/code-toasts.ts +73 -0
  121. package/public/manager/src/code/code-workbench.css +42 -1
  122. package/public/manager/src/code/code.css +130 -15
  123. package/public/manager/src/code/context-usage.ts +74 -0
  124. package/public/manager/src/code/pending-user-item.ts +46 -0
  125. package/public/manager/src/code/session-order.ts +70 -0
  126. package/public/manager/src/code/tool-summary.ts +101 -0
  127. package/public/manager/src/code/use-dictation.ts +130 -0
  128. package/public/manager/src/components/CommandCenter.tsx +4 -8
  129. package/public/manager/src/components/InstanceDetailPanel.tsx +0 -18
  130. package/public/manager/src/components/Workbench.tsx +6 -10
  131. package/public/manager/src/components/WorkbenchHeader.tsx +0 -11
  132. package/public/manager/src/dashboard-settings/dashboard-settings-ui.ts +3 -1
  133. package/public/manager/src/hooks/useDashboardView.ts +38 -38
  134. package/public/manager/src/manager-components.css +0 -8
  135. package/public/manager/src/manager-shortcut-runner.ts +0 -1
  136. package/public/manager/src/manager-shortcuts.ts +0 -2
  137. package/public/manager/src/settings/pages/Agent.tsx +5 -2
  138. package/public/manager/src/settings/pages/DashboardMeta.tsx +20 -1
  139. package/public/manager/src/settings/pages/Permissions.tsx +23 -4
  140. package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +6 -2
  141. package/public/manager/src/settings/pages/components/agent/agent-save.ts +24 -1
  142. package/public/manager/src/settings/settings-icons.ts +3 -1
  143. package/public/manager/src/settings/settings-registry.ts +3 -3
  144. package/public/manager/src/settings-controls.css +0 -1
  145. package/public/manager/src/settings-standalone.tsx +8 -8
  146. package/public/manager/src/types.ts +0 -1
  147. package/scripts/check-private-boundary.mjs +101 -0
  148. package/scripts/grounding-eval.mjs +223 -0
  149. package/public/dist/assets/Agent-B8ZEWJ6B.js +0 -1
  150. package/public/dist/assets/CodeCanvas-Bj3lTSu6.js +0 -2
  151. package/public/dist/assets/DashboardMeta-CmZavI4H.js +0 -1
  152. package/public/dist/assets/Display-DFkjKcMk.js +0 -1
  153. package/public/dist/assets/Permissions-CJftCO6p.js +0 -1
  154. package/public/dist/assets/app-DVbrIl8f.css +0 -1
  155. package/public/dist/assets/bgtask-badge-CuAc8bAl.js +0 -1
  156. package/public/dist/assets/iframe-renderer-By2WO5bd.js +0 -1
  157. package/public/dist/assets/manager-CxLXWCGi.css +0 -1
  158. package/public/dist/assets/manager-DA3dF3eN.js +0 -5
  159. package/public/dist/assets/manager-shortcuts-CzGkE0ZG.js +0 -1
  160. package/public/dist/assets/memory-thjr2apY.js +0 -1
  161. package/public/dist/assets/message-history-CfU7_P5t.js +0 -1
  162. package/public/dist/assets/settings-DXA5L4DR.js +0 -1
  163. package/public/dist/assets/settings-Dy_IaNVH.js +0 -1
  164. package/public/dist/assets/settings-core-D7sAQqhC.js +0 -1
  165. package/public/dist/assets/skills-BcIievZp.js +0 -1
  166. package/public/dist/assets/slash-commands-B-5Shayl.js +0 -1
  167. package/public/dist/assets/ui-CJLdMfRx.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}from"./render-CF6Q1oIh.js";import{t as a}from"./icons-CVkqyECl.js";import{t as o}from"./copy-text-DjgetgoZ.js";import{r as s}from"./locale-B9w_kUtW.js";import"./settings-core-BzAJLsKN.js";import"./constants-D8XAqfHk.js";import{r as c,t as l}from"./settings-types-B09BmpYe.js";import{n as u,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 v,m as ee,n as y,o as te,p as b,r as ne,s as x,t as re,u as ie}from"./channel-onboarding-flow-D73Cze0v.js";function ae(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)||!ae(n.telegram)||!ae(n.discord))return null;let o=ae(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`
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`
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 ue(e,t){e.innerHTML=`
6
+ </div>`}function de(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
- ${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 S=null,C=null,w=!1,T=!1,E=`cli-jaw`,D=0;function ge(){document.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-onboard-channel]`);t&&(e.preventDefault(),_e(t.getAttribute(`data-onboard-channel`)))}),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&C&&(e.preventDefault(),e.stopImmediatePropagation(),ve())},!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 _e(e){if(e!==`telegram`&&e!==`discord`&&e!==`slack`)return;let t={};for(let n of x(e))t[n.key]=ye(n.settingsId);C=te(e,t),e===`slack`&&(E=`cli-jaw`),w=!1,T=!1,D+=1,xe(),O(),S?.classList.add(`open`)}function ve(){S?.classList.remove(`open`),C=null}function ye(e){return document.getElementById(e)?.value.trim()||``}function be(e,t){let n=document.getElementById(e);n&&(n.value=t)}function xe(){S||(S=document.createElement(`div`),S.className=`modal-overlay onboarding-overlay`,S.addEventListener(`click`,e=>{e.target===S&&ve()}),document.body.appendChild(S))}function Se(e){if(e.step===1){let t=e.slackSetupStage;return`
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`
14
14
  ${e.channel===`slack`?`
15
15
  <div class="onboarding-field">
16
16
  <label for="onboard-slack-app-name">${r(i(`onboarding.slackAppName`))}</label>
@@ -48,7 +48,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
48
48
  <button type="button" class="perm-btn" data-onboard-validate="1" ${w?`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 Ce(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"
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
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=`
53
53
  <div class="modal-box onboarding-box" role="dialog" aria-modal="true"
54
54
  aria-labelledby="onboarding-title" aria-describedby="onboarding-step-title">
@@ -63,7 +63,7 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
63
63
  ${Array.from({length:4},(t,n)=>`<span class="onboarding-dot${n+1===e.step?` is-active`:``}${n+1<e.step?` is-done`:``}"></span>`).join(``)}
64
64
  </div>
65
65
  <div class="onboarding-step-title" id="onboarding-step-title">${r(i(`onboarding.step.${e.step}`))}</div>
66
- ${Se(e)}
66
+ ${Ce(e)}
67
67
  <div class="onboarding-error" role="alert" style="display:${e.error?``:`none`}">
68
68
  ${e.error?r(i(`onboarding.error.${e.error}`)):``}
69
69
  ${e.missingScopes.length?`<span class="onboarding-scopes">${r(e.missingScopes.join(`, `))}</span>`:``}
@@ -71,8 +71,8 @@ import{t as e}from"./state-Dl-xxPoS.js";import{i as t,n}from"./api-CUtiCd2-.js";
71
71
  <div class="onboarding-capability-warning" role="status" style="display:${e.missingCapabilities.length?``:`none`}">
72
72
  ${e.missingCapabilities.length?r(i(`onboarding.warning.missingCapabilities`,{capabilities:e.missingCapabilities.join(`, `)})):``}
73
73
  </div>
74
- <div class="onboarding-actions onboarding-footer">${Ce(e)}</div>
75
- </div>`,S.querySelectorAll(`[data-onboard-close]`).forEach(e=>e.addEventListener(`click`,ve)),S.querySelector(`[data-onboard-issuer]`)?.addEventListener(`click`,()=>{C&&(window.open(re[C.channel],`_blank`,`noopener`),C.channel===`slack`&&(C=ie(C),k()))}),S.querySelector(`[data-onboard-generate-manifest]`)?.addEventListener(`click`,()=>{Ee()}),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(),Ee())}),S.querySelector(`[data-onboard-back]`)?.addEventListener(`click`,()=>{C&&(C=p(C),O())}),S.querySelector(`[data-onboard-next]`)?.addEventListener(`click`,()=>{C&&(De(),C=y(C),O())}),S.querySelector(`[data-onboard-validate]`)?.addEventListener(`click`,()=>{Oe()}),S.querySelector(`[data-onboard-save]`)?.addEventListener(`click`,()=>{ke()}),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(),we())})}),Te()}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 we(){if(C){if(C.step===3){Oe();return}if(C.step===4){C.saved||ke();return}De(),C=y(C),O()}}function Te(){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 Ee(){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 s=t.value.trim();if(E=s,!s||Array.from(s).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(s)}`);if(e!==D||C?.channel!==`slack`||E.trim()!==s)return;let r=t?.json||``;if(!r)throw Error(`empty manifest`);let c=await o(r);if(!c.ok)throw Error(c.error||`copy failed`);if(e!==D||C?.channel!==`slack`||E.trim()!==s)return;C=m(C);let l=t?.botDisplayName;a.textContent=l&&l!==s?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 De(){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 Oe(){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=ne(C,t||{ok:!1,error:`network`}),O()))}async function ke(){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))be(e.settingsId,(C.draft[e.key]||``).trim());let n=D;T=!0;try{await t(`/api/settings`,`PUT`,ee(C))}finally{T=!1}n===D&&C&&(C=v(C),O(),de(),he())}function Ae(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 je(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`),Me(0);return}t.innerHTML=a.map(([e,t])=>{let n=Ae(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(``),Me(je(e.servers))}catch{}}function Me(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function Ne(){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=`${a.error} sync failed`;return}let i=n.results||{};e.innerHTML=Object.entries(i).map(([e,t])=>`${t?a.check:a.skip} ${r(e)}`).join(` &nbsp; `)}catch(t){e.innerHTML=`${a.error} ${r(t.message)}`}}}async function Pe(){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=`${a.error} install failed`;return}e.innerHTML=Object.entries(n.results||{}).map(([e,t])=>`${t.status===`installed`?a.check:t.status===`skip`?a.skip:a.error} <b>${r(e)}</b>: ${r(t.status)}${t.bin?` ${a.arrowRight} `+r(t.bin):``}`).join(`<br>`),j()}catch(t){e.innerHTML=`${a.error} ${r(t.message)}`}}}var M=null,N=null,P=null,F=null,I=null,L=null,R=`local`,z=!1,Fe=[];function Ie(){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`,()=>Ke());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=Le(`Active Servers`,!0),c=Le(`Add New`,!1),l=Le(`Browse`,!1);Fe=[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=Re(),F.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{R=e.dataset.mcpSubtab,ze()})}),I=F.querySelector(`#mcpAddError`);let u=F.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void Ge());let d=F.querySelector(`[data-action="closeMcpModal"]`);d&&d.addEventListener(`click`,()=>U()),N.append(o,P,L,F);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`,()=>U()),f.append(p),e.append(t,N,f),M.append(e),document.body.append(M)}function Le(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 Re(){return`
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`
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`),Fe.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&Be(),e===`add`&&He(),e===`browse`&&qe()}function ze(){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 Be(){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=Ae(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 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">
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&&Ve(t)})})}async function Ve(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(),Be()}catch(e){V(e.message)}}function He(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(F??document).querySelector(`#${e}`);t&&(t.value=``)}Ue()}function V(e){I&&(I.style.display=`block`,I.textContent=e)}function Ue(){I&&(I.style.display=`none`)}function We(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 Ge(){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=We(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=We(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 Ke(){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(``),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=`
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 qe(){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(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)">
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,8 +150,8 @@ 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&&Je(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&&Je({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 Je(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 Ye(){Ie(),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,He(),document.getElementById(`mcpHelpOverlay`)?.remove())}var Xe=!1;function Ze(){Xe||(Xe=!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 Qe=new Set([`ai-e`,`codex-app`]),$e=new Set([`ai-e`,`claude-e`,`pi`,`gemini`]),et={},tt={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 nt(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 rt(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 it(e){return e.toLowerCase().replace(/^cursor\s+/i,``).trim()}var at=new Set([`auth/status only`,`google cloud code`,`runtime-checked`]),ot=new Set([`cursor`,`antigravity.google`,`antigravity`,`max`,`copilot`,`gemini`]);function st(e,t){let n=t.account;if(!n)return[];let r=[];n.email&&r.push(n.email);let i=new Set(r.map(it));for(let e of[n.plan,n.tier]){if(!e)continue;let t=it(e);if(t&&!at.has(t)&&!ot.has(t)&&!i.has(t)){i.add(t),r.push(e);break}}return r}function ct(e,t,n=[]){let i=tt[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
- `))}"${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 lt(e,t){let n=tt[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=ct(e,t,a);if(n){let e=n.commands.map(e=>`
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(`
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`
157
157
  <details class="cli-setup-details" style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
@@ -164,39 +164,39 @@ URL: https://mcp.example.com/sse</pre>
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
166
  <div style="color:var(--text);font-weight:600">${r(t.displayTier||d(e))}${o}</div>
167
- <div style="margin-top:2px">${r(rt(e,t))}</div>
167
+ <div style="margin-top:2px">${r(it(e,t))}</div>
168
168
  </div>
169
- `}var ut=new Set([0,600,1800]),W=0,dt=2e3,ft=4e3,G=null,pt=!1,K=0,q=null,J=null,mt=`cliStatusCollapsed`;function Y(){try{return window.parent!==window}catch{return!0}}function ht(){try{return localStorage.getItem(mt)===`true`}catch{return!1}}function gt(e){try{localStorage.setItem(mt,e?`true`:`false`)}catch{}}function _t(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function vt(){J!=null&&(window.clearTimeout(J),J=null)}function yt(e,t=``){vt();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 bt(e,t){yt(e,t),J=window.setTimeout(()=>{yt(`idle`)},ft)}var X=!ht();function xt(){return X}function St(){X=!0;let e=document.getElementById(`cliStatusList`),t=document.getElementById(`cliStatusHeader`);e&&(e.style.display=`block`),t&&t.classList.add(`expanded`),gt(!1),Z(!0)}function Ct(){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),gt(!X),X&&Z(!0)}))}function wt(){let e=Number(localStorage.getItem(`cliStatusInterval`)||W);return ut.has(e)?e:W}function Tt(e=wt()){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 Et(){G!=null&&(window.clearInterval(G),G=null);let e=wt();Tt(e),!(e<=0)&&(G=window.setInterval(()=>{!document.hidden&&X&&(Y()||document.hasFocus())&&Z(!0)},e*1e3))}function Dt(){!pt&&Y()&&(pt=!0,window.addEventListener(`message`,e=>{let t=e.data;t?.type===`jaw-preview-visibility`&&t.visible===!0&&X&&Z(!1)}))}function Ot(e){let t=Number(e),n=ut.has(t)?t:W;localStorage.setItem(`cliStatusInterval`,String(n)),Tt(n),Et()}function kt(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 At(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||kt(t,r,i),!!a}function jt(e,t,n,r){let i=()=>{At(t,n,r).catch(()=>{})};if(e)return At(t,n,r);window.setTimeout(i,dt)}async function Z(t=!1){if(X){if(t&&yt(`refreshing`,`Refreshing quota...`),q){if(t)await q.catch(()=>{});else return}q=(async()=>{let r=++K,i=document.getElementById(`cliStatusList`);try{let a=wt();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&&bt(`error`,`Refresh failed`);return}Q({cliStatus:s,quota:o??null});let c=await jt(t,r,s,o);t&&r===K&&bt(`success`,`${c?`Updated`:`Checked`} ${_t(new Date)}`)}catch{i&&(i.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`),t&&bt(`error`,`Refresh failed`)}})().finally(()=>{q=null}),await q}}function Q(e){let{cliStatus:t,quota:o}=e,s=document.getElementById(`cliStatusList`),f={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`)}},p=``;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($e.has(e))continue;let t=l(n),s=t===`checking`,m=t===`unknown`,h=t===`probe-failing`,g=t===`capability-failed`,_=s||m||h?void 0:o?.[e],v;v=s?`checking`:m||h?`warn`:!n.available||g?`missing`:!_||_.error?`ok`:_.authenticated===!1?`warn`:`ok`;let ee=``,y=_?.quotaCapable===!1&&_.authenticated!==!1&&n.available&&!et[e]&&!Qe.has(e);if(_?.account&&!y){let t=st(e,_);t.length&&(ee=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${r(t.join(` · `))}</div>`)}let te=``;if(!s&&!m&&!h&&(!n.available||v===`warn`)){let t=f[e];if(t){let e=!n.available,a=i(e?`cli.authRequired`:`cli.notAuthenticated`),o=e?`var(--error)`:`var(--warning)`;te=`
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=`
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 b=``,ne=et[e];if(!Qe.has(e)){if(ne&&n.available)b=`
175
+ `}}let y=``,b=tt[e];if(!$e.has(e)){if(b&&n.available)y=`
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(ne)}
177
+ ${r(b)}
178
178
  </div>
179
- `;else if(y)b=lt(e,_);else if(_?.windows?.length)b=_.windows.map(t=>{let n=c(t),i=n.percent??0,a=i>80?`var(--error)`:i>50?`var(--warning)`:`var(--info)`,o=nt(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 l=n.percent==null?`<span style="flex:1"></span><span style="min-width:52px;text-align:right" title="Exact percentage unavailable">${r(n.text)}</span>`:`<div style="flex:1;height:4px;background:var(--border);border-radius:2px;overflow:hidden"><div style="width:${i}%;height:100%;background:${a};border-radius:2px"></div></div><span style="width:24px;text-align:right">${n.text}</span>`;return`
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`
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
- ${l}
182
+ ${c}
183
183
  ${s?`<span style="width:30px;text-align:right;opacity:0.6">${s}</span>`:``}
184
184
  </div>
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">${a.warning} ${e}</div>`}}let x=_?.quotaCapable&&tt[e]?ct(e,_):``,re=_?.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>`:``;p+=`
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+=`
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 ${v}"></span>
189
- <span class="cli-provider-icon" aria-hidden="true">${u(e)||``}</span>
190
- <span class="cli-name" style="font-weight:600">${r(d(e))}${x}</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`)}">${a.key}</button>`:``}${re}
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}
191
191
  </div>
192
- ${ee}
193
- ${ie}
194
192
  ${te}
195
- ${b}
193
+ ${ie}
194
+ ${v}
195
+ ${y}
196
196
  </div>
197
- `}s&&(s.innerHTML=p);let m=Object.entries(t),h=m.some(([,e])=>{let t=l(e);return t===`probe-failing`||t===`unknown`});!m.some(([e,t])=>{if(l(t)!==`ready`)return!1;let n=o?.[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
- ${a.warning} ${i(`cli.noReadyCli`)}
199
- </div>`);let g=document.getElementById(`copilotKeychainBtn`);g&&g.addEventListener(`click`,async()=>{let e=g;e.disabled=!0,e.innerHTML=a.hourglass;try{let t=await n(`/api/copilot/refresh`,{method:`POST`});e.innerHTML=t?.ok?a.check:a.error,t?.ok&&await Z(!0)}catch{e.innerHTML=a.error}setTimeout(()=>{e.innerHTML=a.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}Mt(n,r,a)})})}function Mt(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(`
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
+ ${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
200
  `).filter(Boolean);o.innerHTML=`
201
201
  <h4>CLI Setup</h4>
202
202
  ${t?`<p style="color:var(--text-dim);font-size:12px;margin:4px 0 8px">${r(t)}</p>`:``}
@@ -205,4 +205,4 @@ URL: https://mcp.example.com/sse</pre>
205
205
  <div style="text-align:right;margin-top:12px">
206
206
  <button type="button" class="btn-save" id="cliHelpClose">OK</button>
207
207
  </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 Nt(){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 Pt(e){e&&e.target!==e.currentTarget||document.getElementById(`promptModal`)?.classList.remove(`open`)}async function Ft(){let e=document.getElementById(`modalPromptEditor`)?.value||``;await t(`/api/prompt`,`PUT`,{content:e}),document.getElementById(`promptModal`)?.classList.remove(`open`)}var It=[],$=!1;async function Lt(){let e=await n(`/api/prompt-templates`);e&&(It=e.templates,$=!1,Rt(e.tree),Ht(`tree`),document.getElementById(`templateModal`)?.classList.add(`open`))}function Rt(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=It.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=`${a.file} ${r(n.filename)}`,i.addEventListener(`mouseenter`,()=>{i.style.borderColor=`var(--accent2)`}),i.addEventListener(`mouseleave`,()=>{i.style.borderColor=`var(--border)`}),i.addEventListener(`click`,()=>{zt(n)}),t.appendChild(i)}}}}function zt(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=`${a.file} ${r(e.filename)}`);let i=e.content.match(/\{\{[A-Z_]+\}\}/g),o=document.getElementById(`templateVars`);o&&(o.textContent=i?`vars: ${[...new Set(i)].join(`, `)}`:`no variables`);let c=document.getElementById(`templateSaveBtn`);c&&(c.style.display=`none`);let l=document.getElementById(`templateDevToggle`);l&&(l.style.color=`var(--text-dim)`,l.style.borderColor=`var(--border)`,l.innerHTML=`${a.tool} ${s(`devMode`)}`);let u=document.getElementById(`templateModalTitle`);u&&(u.innerHTML=`${a.file} ${r(e.filename)}`),Ht(`editor`)}function Bt(){if(!$&&!confirm(s(`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=$?`${a.lockOpen} ${s(`devModeOn`)}`:`${a.tool} ${s(`devMode`)}`)}async function Vt(){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=`${a.check} ${s(`savedAndReloaded`)}`,setTimeout(()=>{i.innerHTML=`${a.file} ${r(n)}.md`},2e3));let o=It.find(e=>e.id===n);o&&(o.content=e.value)}function Ht(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=`${a.plan} ${s(`promptStructure`)}`)}function Ut(){Ht(`tree`)}function Wt(e){e&&e.target!==e.currentTarget||document.getElementById(`templateModal`)?.classList.remove(`open`)}function Gt(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 Kt(){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 qt(){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`&&Kt())};return e.addEventListener(`load`,n),window.addEventListener(`message`,i),n(),()=>{r.disconnect(),e.removeEventListener(`load`,n),window.removeEventListener(`message`,i)}}export{Ne as C,Ye as S,Et as _,Nt as a,Pe as b,Vt as c,St as d,Dt as f,Z as g,Y as h,Wt as i,Ut as l,xt as m,Gt as n,Lt as o,Ct as p,Pt as r,Ft as s,qt as t,Bt as u,Ot as v,ge as w,j as x,Ze as y};
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};
@@ -0,0 +1 @@
1
+ import{a as e}from"./settings-core-BcVD2FgV.js";export{e as refreshHeaderFromSettingsChange};
@@ -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-CF6Q1oIh.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-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(`
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};