cli-jaw 2.2.11 → 2.2.13

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 (176) hide show
  1. package/dist/bin/commands/doctor.js +20 -0
  2. package/dist/bin/commands/doctor.js.map +1 -1
  3. package/dist/bin/commands/init.js +7 -0
  4. package/dist/bin/commands/init.js.map +1 -1
  5. package/dist/bin/commands/slack.js +47 -5
  6. package/dist/bin/commands/slack.js.map +1 -1
  7. package/dist/bin/commands/tui/slash-command-runner.js +11 -2
  8. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  9. package/dist/server.js +18 -2
  10. package/dist/server.js.map +1 -1
  11. package/dist/src/agent/error-classifier.js +11 -2
  12. package/dist/src/agent/error-classifier.js.map +1 -1
  13. package/dist/src/agent/events/claude.js +7 -1
  14. package/dist/src/agent/events/claude.js.map +1 -1
  15. package/dist/src/agent/events/fulltext-bound.js +32 -0
  16. package/dist/src/agent/events/fulltext-bound.js.map +1 -0
  17. package/dist/src/agent/events/grok.js +7 -1
  18. package/dist/src/agent/events/grok.js.map +1 -1
  19. package/dist/src/agent/events/helpers.js +17 -4
  20. package/dist/src/agent/events/helpers.js.map +1 -1
  21. package/dist/src/agent/lifecycle-handler.js +56 -5
  22. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  23. package/dist/src/agent/pi-runtime.js +30 -1
  24. package/dist/src/agent/pi-runtime.js.map +1 -1
  25. package/dist/src/agent/spawn/exit-drain.js +96 -0
  26. package/dist/src/agent/spawn/exit-drain.js.map +1 -0
  27. package/dist/src/agent/spawn/line-buffer.js +26 -0
  28. package/dist/src/agent/spawn/line-buffer.js.map +1 -0
  29. package/dist/src/agent/spawn/process-kill.js +31 -0
  30. package/dist/src/agent/spawn/process-kill.js.map +1 -1
  31. package/dist/src/agent/spawn.js +80 -23
  32. package/dist/src/agent/spawn.js.map +1 -1
  33. package/dist/src/agent/watchdog.js +21 -5
  34. package/dist/src/agent/watchdog.js.map +1 -1
  35. package/dist/src/cli/commands.js +68 -15
  36. package/dist/src/cli/commands.js.map +1 -1
  37. package/dist/src/cli/opencodex-models.js +67 -14
  38. package/dist/src/cli/opencodex-models.js.map +1 -1
  39. package/dist/src/cli/registry-live.js +55 -2
  40. package/dist/src/cli/registry-live.js.map +1 -1
  41. package/dist/src/cli/registry.js +8 -2
  42. package/dist/src/cli/registry.js.map +1 -1
  43. package/dist/src/core/config.js +26 -1
  44. package/dist/src/core/config.js.map +1 -1
  45. package/dist/src/messaging/channel-health.js +6 -0
  46. package/dist/src/messaging/channel-health.js.map +1 -1
  47. package/dist/src/messaging/channel-validate.js +85 -0
  48. package/dist/src/messaging/channel-validate.js.map +1 -0
  49. package/dist/src/routes/link-preview.js +14 -0
  50. package/dist/src/routes/link-preview.js.map +1 -1
  51. package/dist/src/routes/messaging.js +9 -0
  52. package/dist/src/routes/messaging.js.map +1 -1
  53. package/dist/src/routes/system.js +5 -0
  54. package/dist/src/routes/system.js.map +1 -1
  55. package/dist/src/slack/api.js +32 -3
  56. package/dist/src/slack/api.js.map +1 -1
  57. package/dist/src/slack/bot.js +37 -1
  58. package/dist/src/slack/bot.js.map +1 -1
  59. package/dist/src/slack/events.js +23 -0
  60. package/dist/src/slack/events.js.map +1 -1
  61. package/dist/src/slack/hot-notify.js +33 -0
  62. package/dist/src/slack/hot-notify.js.map +1 -0
  63. package/dist/src/slack/manifest.js +2 -1
  64. package/dist/src/slack/manifest.js.map +1 -1
  65. package/dist/src/slack/progress.js +98 -0
  66. package/dist/src/slack/progress.js.map +1 -0
  67. package/dist/src/slack/send-only-client.js +3 -2
  68. package/dist/src/slack/send-only-client.js.map +1 -1
  69. package/dist/src/slack/slack-file.js +4 -2
  70. package/dist/src/slack/slack-file.js.map +1 -1
  71. package/package.json +3 -1
  72. package/public/css/sidebar.css +200 -0
  73. package/public/dist/assets/Agent-BjbZVZ9p.js +1 -0
  74. package/public/dist/assets/CodeCanvas-CbfPP7Ad.js +3 -0
  75. package/public/dist/assets/{DocPanel-DtYwv3n3.js → DocPanel-Dz-J_l5M.js} +1 -1
  76. package/public/dist/assets/{Heartbeat-vDGhPfct.js → Heartbeat-DDmZARWw.js} +1 -1
  77. package/public/dist/assets/MarkdownRenderer-CXrilOsG.js +15 -0
  78. package/public/dist/assets/MarkdownRenderer-DZVh_xX2.js +1 -0
  79. package/public/dist/assets/{Memory-B_UZ-iCA.js → Memory-CUbviW7N.js} +1 -1
  80. package/public/dist/assets/{MilkdownWysiwygEditor-BNoLGbFC.js → MilkdownWysiwygEditor-Em7iC6y9.js} +8 -8
  81. package/public/dist/assets/ModelProvider-ngg8xTuB.js +1 -0
  82. package/public/dist/assets/{agent-meta-C8DqYXM6.js → agent-meta-Y3DE6sxh.js} +1 -1
  83. package/public/dist/assets/app-BzD_ZLvt.js +55 -0
  84. package/public/dist/assets/{app-Nu2VPaO5.css → app-DX4e6isX.css} +1 -1
  85. package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +1 -0
  86. package/public/dist/assets/{bgtask-badge-DXca8E7c.js → bgtask-badge-qMkKOZx0.js} +1 -1
  87. package/public/dist/assets/{react-dom-AWKMTIe7.js → bounded-set-CFlZiEF4.js} +1 -1
  88. package/public/dist/assets/{constants-CSZ011-j.js → constants-Df7-7Rky.js} +1 -1
  89. package/public/dist/assets/{employees-BL4qMxJj.js → employees-BnobWM_2.js} +1 -1
  90. package/public/dist/assets/{iframe-renderer-DUI0LYBy.js → iframe-renderer-C5vRbbl9.js} +2 -2
  91. package/public/dist/assets/iframe-renderer-Df4KIVyx.js +1 -0
  92. package/public/dist/assets/manager-DaN201mN.js +13 -0
  93. package/public/dist/assets/memory-D-bULTHl.js +1 -0
  94. package/public/dist/assets/{memory-B_Y0L0KD.js → memory-DF4kPwwC.js} +1 -1
  95. package/public/dist/assets/{message-history-Dl8dJzez.js → message-history-C4WOisGx.js} +1 -1
  96. package/public/dist/assets/message-history-ZBoza6ew.js +1 -0
  97. package/public/dist/assets/{render-BI1aqKoc.js → render-DYX6GRQ0.js} +1 -1
  98. package/public/dist/assets/{settings-B0Sj4sUH.js → settings-DbJpGoaX.js} +1 -1
  99. package/public/dist/assets/settings-SreihUje.js +1 -0
  100. package/public/dist/assets/settings-core-B1Y5Nb4Z.js +1 -0
  101. package/public/dist/assets/settings-core-DobZWIZ7.js +140 -0
  102. package/public/dist/assets/{sidebar-DOR9fTgN.js → sidebar-Cp22g0Gv.js} +3 -3
  103. package/public/dist/assets/skills-DwPIP08e.js +1 -0
  104. package/public/dist/assets/{skills-wt0fkV9Y.js → skills-IGquen_j.js} +1 -1
  105. package/public/dist/assets/slash-commands-BBVfwcnW.js +1 -0
  106. package/public/dist/assets/{slash-commands-BZbqTg3v.js → slash-commands-ZRDOL99E.js} +1 -1
  107. package/public/dist/assets/{trace-drawer-kMYzaVFW.js → trace-drawer-D8To8fYt.js} +1 -1
  108. package/public/dist/assets/ui-CAicpUZc.js +1 -0
  109. package/public/dist/assets/{ui-D4D5HUfo.js → ui-Hx_mNoDf.js} +1 -1
  110. package/public/dist/assets/{wiki-link-resolver-BfNXN9px.js → wiki-link-resolver-DyFzBTIQ.js} +1 -1
  111. package/public/dist/index.html +90 -47
  112. package/public/dist/manager/index.html +1 -1
  113. package/public/index.html +88 -45
  114. package/public/js/constants.ts +50 -0
  115. package/public/js/features/channel-onboarding-flow.ts +197 -0
  116. package/public/js/features/channel-onboarding.ts +322 -0
  117. package/public/js/features/channel-setup-guide.ts +26 -0
  118. package/public/js/features/channel-setup-rules.ts +32 -0
  119. package/public/js/features/notifications.ts +38 -0
  120. package/public/js/features/settings-channel.ts +4 -0
  121. package/public/js/features/settings-core.ts +73 -9
  122. package/public/js/features/settings-discord.ts +2 -0
  123. package/public/js/features/settings-slack.ts +60 -2
  124. package/public/js/features/settings-telegram.ts +2 -0
  125. package/public/js/features/settings-types.ts +1 -1
  126. package/public/js/features/settings.ts +1 -1
  127. package/public/js/features/transport-status-row.ts +7 -3
  128. package/public/js/main.ts +5 -1
  129. package/public/locales/en.json +65 -3
  130. package/public/locales/ja.json +76 -3
  131. package/public/locales/ko.json +65 -3
  132. package/public/locales/zh.json +76 -3
  133. package/public/manager/src/SidebarRailRouter.tsx +9 -3
  134. package/public/manager/src/browser-panel/use-embedded-target-sync.ts +19 -1
  135. package/public/manager/src/code/CodeCanvas.tsx +14 -2
  136. package/public/manager/src/code/CodeTranscript.tsx +33 -9
  137. package/public/manager/src/code/CodeWorkbench.tsx +1 -1
  138. package/public/manager/src/code/code-event-dedupe.ts +27 -3
  139. package/public/manager/src/code/use-code-transcript-scroll.ts +28 -3
  140. package/public/manager/src/code/use-throttled-markdown.ts +75 -0
  141. package/public/manager/src/code/useCodeTranscriptVirtualRows.ts +19 -0
  142. package/public/manager/src/electron-metrics.tsx +7 -0
  143. package/public/manager/src/jaw-ceo/useJawCeo.ts +6 -1
  144. package/public/manager/src/jaw-ceo/useJawCeoVirtualTimeline.ts +5 -0
  145. package/public/manager/src/lib/bounded-set.ts +15 -0
  146. package/public/manager/src/lib/fnv1a.ts +14 -0
  147. package/public/manager/src/notes/rendering/CodeBlock.tsx +13 -4
  148. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +14 -2
  149. package/public/manager/src/notes/rendering/highlight-cache.ts +111 -0
  150. package/public/manager/src/notes/useNotesExternalSync.ts +6 -1
  151. package/public/manager/src/settings/pages/Agent.tsx +25 -4
  152. package/public/manager/src/settings/pages/components/PerCliRow.tsx +13 -5
  153. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +98 -0
  154. package/scripts/bundle-sidecar.sh +8 -0
  155. package/scripts/check-electron-no-native.cjs +90 -4
  156. package/scripts/check-native-load.cjs +157 -0
  157. package/scripts/check-sidecar-smoke.mjs +151 -0
  158. package/scripts/ensure-native-modules.cjs +222 -18
  159. package/scripts/release-gates.mjs +29 -0
  160. package/public/dist/assets/Agent-BgkP4EnS.js +0 -1
  161. package/public/dist/assets/CodeCanvas-BZo3dohZ.js +0 -3
  162. package/public/dist/assets/MarkdownRenderer-CHacL2M_.js +0 -15
  163. package/public/dist/assets/MarkdownRenderer-DyrB9FbZ.js +0 -1
  164. package/public/dist/assets/ModelProvider-CgUvs6pE.js +0 -1
  165. package/public/dist/assets/app-BGIAy4he.js +0 -55
  166. package/public/dist/assets/bgtask-badge-GRSiNILQ.js +0 -1
  167. package/public/dist/assets/iframe-renderer-BUSk0Rw9.js +0 -1
  168. package/public/dist/assets/manager-B-gpf-3j.js +0 -13
  169. package/public/dist/assets/memory-CX6YahTc.js +0 -1
  170. package/public/dist/assets/message-history-Det7u76S.js +0 -1
  171. package/public/dist/assets/settings-C7NutP6X.js +0 -1
  172. package/public/dist/assets/settings-core-CyX-px6_.js +0 -100
  173. package/public/dist/assets/settings-core-DVpFmrhY.js +0 -1
  174. package/public/dist/assets/skills-BWhKreQ2.js +0 -1
  175. package/public/dist/assets/slash-commands-Di4NDA4w.js +0 -1
  176. package/public/dist/assets/ui-BghexWrB.js +0 -1
@@ -1 +0,0 @@
1
- import{a as e}from"./memory-B_Y0L0KD.js";export{e as refreshMemorySidebar};
@@ -1 +0,0 @@
1
- import{a as e,o as t}from"./message-history-Dl8dJzez.js";export{e as historyReloadInFlight,t as loadMessages};
@@ -1 +0,0 @@
1
- import{a as e,d as t,p as n}from"./settings-core-CyX-px6_.js";import"./settings-B0Sj4sUH.js";export{e as loadSettings,t as savePerCli,n as updateSettings};
@@ -1,100 +0,0 @@
1
- import{i as e,n as t,r as n}from"./api-tVoG39dL.js";import{T as r,j as i,m as a,x as o}from"./render-BI1aqKoc.js";import{n as s}from"./locale-DC-ZsWOf.js";import{a as c,i as l,n as u,o as d,t as f}from"./constants-CSZ011-j.js";import{a as p,c as m,l as ee,u as te}from"./pi-settings-Dh5lgb87.js";import{n as ne,r as h}from"./provider-icons-VDfahiUp.js";function re(t){let n=document.getElementById(`sttEngine`),r=document.getElementById(`sttGeminiKey`),i=document.getElementById(`sttGeminiModel`),a=document.getElementById(`sttGeminiModelCustom`),o=document.getElementById(`sttWhisperModel`),s=document.getElementById(`sttOpenaiBaseUrl`),c=document.getElementById(`sttOpenaiKey`),l=document.getElementById(`sttOpenaiModel`),u=document.getElementById(`sttVertexJson`);if(n&&(n.value=t.engine||`auto`),r&&(r.placeholder=t.geminiKeySet?g(t.geminiKeyLast4):`AIza...`),i){let e=t.geminiModel||`gemini-2.5-flash-lite`;Array.from(i.options).some(t=>t.value===e)?i.value=e:(i.value=`__custom__`,a&&(a.value=e,a.style.display=``))}o&&(o.value=t.whisperModel||`mlx-community/whisper-large-v3-turbo`),s&&(s.value=t.openaiBaseUrl||``),c&&(c.placeholder=t.openaiKeySet?g(t.openaiKeyLast4):`sk-...`),l&&(l.value=t.openaiModel||``),u&&(u.value=t.vertexConfig||``);function d(){let e=n?.value||`auto`,t=e===`auto`||e===`gemini`,r=e===`openai`,i=e===`vertex`,a=e===`auto`||e===`whisper`;document.querySelectorAll(`.stt-gemini`).forEach(e=>e.style.display=t?``:`none`),document.querySelectorAll(`.stt-openai`).forEach(e=>e.style.display=r?``:`none`),document.querySelectorAll(`.stt-vertex`).forEach(e=>e.style.display=i?``:`none`),document.querySelectorAll(`.stt-whisper`).forEach(e=>e.style.display=a?``:`none`)}d();async function f(){let t={stt:{engine:n?.value||`auto`,geminiModel:(i?.value===`__custom__`?a?.value:i?.value)||`gemini-2.5-flash-lite`,whisperModel:o?.value||``,openaiBaseUrl:s?.value||``,openaiModel:l?.value||``,vertexConfig:u?.value||``}};r?.value&&(t.stt.geminiApiKey=r.value),c?.value&&(t.stt.openaiApiKey=c.value),console.log(`[stt] saving:`,{engine:t.stt.engine,hasGeminiKey:!!t.stt.geminiApiKey,hasOpenaiKey:!!t.stt.openaiApiKey});try{if(await e(`/api/settings`,`PUT`,t),r?.value){let e=r.value.slice(-4);r.value=``,r.placeholder=g(e)}if(c?.value){let e=c.value.slice(-4);c.value=``,c.placeholder=g(e)}}catch(e){console.error(`[stt] save failed:`,e)}}n?.addEventListener(`change`,()=>{d(),f()}),i?.addEventListener(`change`,()=>{a&&(a.style.display=i.value===`__custom__`?``:`none`),i.value!==`__custom__`&&f()}),a?.addEventListener(`blur`,f),r?.addEventListener(`blur`,()=>{r.value&&f()}),c?.addEventListener(`blur`,()=>{c.value&&f()}),s?.addEventListener(`blur`,f),l?.addEventListener(`blur`,f),o?.addEventListener(`blur`,f),u?.addEventListener(`blur`,f)}function g(e){return i(`stt.key.savedPlaceholder`,{last4:e||``})}async function ie(){let t=document.getElementById(`tgToken`)?.value.trim()||``,n=document.getElementById(`tgChatIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{telegram:{token:t,allowedChatIds:n?n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>!isNaN(e)):[]}})}async function ae(t){document.getElementById(`tgOn`)?.classList.toggle(`active`,t),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{enabled:t}})}async function oe(t){document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{forwardAll:t}})}async function se(t){document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{mentionOnly:t}})}function ce(e){if(!e.telegram)return;let t=e.telegram;document.getElementById(`tgOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`tgToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`tgChatIds`);t.allowedChatIds?.length&&r&&(r.value=t.allowedChatIds.join(`, `));let i=t.forwardAll!==!1;document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,i),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!i);let a=t.mentionOnly!==!1;document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,a),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!a)}async function le(){let t=document.getElementById(`dcToken`)?.value.trim()||``,n=document.getElementById(`dcGuildId`)?.value.trim()||``,r=document.getElementById(`dcChannelIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{discord:{token:t,guildId:n,channelIds:r?r.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function ue(t){document.getElementById(`dcOn`)?.classList.toggle(`active`,t),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{enabled:t}})}async function de(t){document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{forwardAll:t}})}async function fe(t){document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,t),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{allowBots:t}})}async function pe(t){document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{mentionOnly:t}})}function me(e){if(!e.discord)return;let t=e.discord;document.getElementById(`dcOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`dcToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`dcGuildId`);t.guildId&&r&&(r.value=t.guildId);let i=document.getElementById(`dcChannelIds`);t.channelIds?.length&&i&&(i.value=t.channelIds.join(`, `));let a=t.forwardAll!==!1;document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,a),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!a);let o=!!t.allowBots;document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,o),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!o);let s=!!t.mentionOnly;document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,s),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!s)}async function he(){let t=document.getElementById(`slBotToken`)?.value.trim()||``,n=document.getElementById(`slAppToken`)?.value.trim()||``,r=document.getElementById(`slTeamId`)?.value.trim()||``,i=document.getElementById(`slChannelIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{slack:{botToken:t,appToken:n,teamId:r,channelIds:i?i.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function ge(t){document.getElementById(`slOn`)?.classList.toggle(`active`,t),document.getElementById(`slOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{enabled:t}})}async function _e(t){document.getElementById(`slForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{forwardAll:t}})}async function ve(t){document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,t),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{allowBots:t}})}async function ye(t){document.getElementById(`slMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{mentionOnly:t}})}async function be(t){document.getElementById(`slThreadOn`)?.classList.toggle(`active`,t),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{replyInThread:t}})}function xe(e){if(!e.slack)return;let t=e.slack;document.getElementById(`slOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`slOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`slBotToken`);t.botToken&&n&&(n.value=t.botToken);let r=document.getElementById(`slAppToken`);t.appToken&&r&&(r.value=t.appToken);let i=document.getElementById(`slTeamId`);t.teamId&&i&&(i.value=t.teamId);let a=document.getElementById(`slChannelIds`);t.channelIds?.length&&a&&(a.value=t.channelIds.join(`, `));let o=t.forwardAll!==!1;document.getElementById(`slForwardOn`)?.classList.toggle(`active`,o),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!o);let s=!!t.allowBots;document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,s),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!s);let c=t.mentionOnly!==!1;document.getElementById(`slMentionOn`)?.classList.toggle(`active`,c),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!c);let l=t.replyInThread!==!1;document.getElementById(`slThreadOn`)?.classList.toggle(`active`,l),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!l)}function _(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){if(!e||typeof e!=`object`)return null;let t=e.channels;if(!t||typeof t!=`object`)return null;let n=t,r=n.activeInbound;if(r!==`telegram`&&r!==`discord`&&r!==`slack`||!_(n.telegram)||!_(n.discord))return null;let i=_(n.slack)?n.slack:{configured:!1,activeInbound:!1,sendCapable:!1,reason:`unavailable`};return{activeInbound:r,telegram:n.telegram,discord:n.discord,slack:i}}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 v(e,t,n){let a=Ce(t).map(e=>`<span class="transport-status-chip">${r(e)}</span>`).join(``),o=n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${r(i(`settings.channel.sendOnlyHint`))}</p>`:``;return`
2
- <div class="transport-status-block">
3
- <div class="transport-status-label">${r(e)}</div>
4
- <div class="transport-status-chips">${a}</div>
5
- ${o}
6
- </div>`}function we(e,t){e.innerHTML=`
7
- <h4 class="section-title-row">
8
- <span><span data-icon="radio"></span> ${r(i(`settings.channel.statusTitle`))}</span>
9
- </h4>
10
- ${v(`Telegram`,t.telegram,!0)}
11
- ${v(`Discord`,t.discord,!0)}
12
- ${v(`Slack`,t.slack,!0)}
13
- `}async function Te(){let e=document.getElementById(`channelTransportStatus`);if(e)try{let n=Se(await t(`/api/health`));if(!n){e.innerHTML=``,e.style.display=`none`;return}we(e,n),e.style.display=``}catch{e.innerHTML=``,e.style.display=`none`}}async function Ee(t){document.getElementById(`chTelegram`)?.classList.toggle(`active`,t===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,t===`discord`),document.getElementById(`chSlack`)?.classList.toggle(`active`,t===`slack`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,t===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,t===`discord`?``:`none`),document.getElementById(`channelSlackSettings`)?.style.setProperty(`display`,t===`slack`?``:`none`),await e(`/api/settings`,`PUT`,{channel:t}),await Te()}function De(e){let t=e.channel||`telegram`;document.getElementById(`chTelegram`)?.classList.toggle(`active`,t===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,t===`discord`),document.getElementById(`chSlack`)?.classList.toggle(`active`,t===`slack`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,t===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,t===`discord`?``:`none`),document.getElementById(`channelSlackSettings`)?.style.setProperty(`display`,t===`slack`?``:`none`),Te()}function Oe(e){let t=document.getElementById(`fallbackOrderList`);if(!t)return;let n=Object.keys(e.perCli||{}),a=e.fallbackOrder||[],o=Math.min(n.length-1,3),s=``;for(let e=0;e<o;e++){let t=a[e]||``,o=n.map(e=>`<option value="${r(e)}" ${e===t?`selected`:``}>${r(c(e)?.label||h(e))}</option>`).join(``);s+=`
14
- <div class="settings-row sub-row">
15
- <label style="min-width:60px">Fallback ${e+1}</label>
16
- <select id="fallback${e}"
17
- style="font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1">
18
- <option value="">${i(`settings.none`)}</option>
19
- ${o}
20
- </select>
21
- </div>`}t.innerHTML=s}async function ke(){await e(`/api/settings`,`PUT`,{fallbackOrder:[...document.querySelectorAll(`#fallbackOrderList select`)].map(e=>e.value).filter(Boolean)})}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 y=null;async function b(){try{let e=await t(`/api/mcp`);if(!e)return;y=e;let n=document.getElementById(`mcpServerList`);if(!n)return;let a=Object.entries(e.servers||{});if(!a.length){n.textContent=i(`mcp.noServers`),x(0);return}n.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(``),x(je(e.servers))}catch{}}function x(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function Me(){let t=document.getElementById(`mcpSyncResult`);if(t){t.style.display=`block`,t.textContent=i(`mcp.syncing`);try{let n=await e(`/api/mcp/sync`,`POST`,{});if(!n){t.innerHTML=`${o.error} sync failed`;return}let i=n.results||{};t.innerHTML=Object.entries(i).map(([e,t])=>`${t?o.check:o.skip} ${r(e)}`).join(` &nbsp; `)}catch(e){t.innerHTML=`${o.error} ${r(e.message)}`}}}async function Ne(){let t=document.getElementById(`mcpSyncResult`);if(t){t.style.display=`block`,t.textContent=i(`mcp.installing`);try{let n=await e(`/api/mcp/install`,`POST`,{});if(!n){t.innerHTML=`${o.error} install failed`;return}t.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>`),b()}catch(e){t.innerHTML=`${o.error} ${r(e.message)}`}}}var S=null,C=null,w=null,T=null,E=null,D=null,O=`local`,k=!1,A=[];function Pe(){if(S)return;S=document.createElement(`div`),S.id=`mcpModal`,S.className=`modal-overlay mcp-modal-overlay`,S.setAttribute(`role`,`presentation`),S.setAttribute(`aria-hidden`,`true`),S.addEventListener(`click`,e=>{e.target===S&&F()});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`,()=>Ue());let i=document.createElement(`button`);i.type=`button`,i.className=`btn-modal-close`,i.setAttribute(`aria-label`,`Close`),i.textContent=`x`,i.addEventListener(`click`,()=>F());let a=document.createElement(`div`);a.style.cssText=`display:flex;align-items:center;gap:6px`,a.append(n,r),t.append(a,i),C=document.createElement(`div`),C.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=j(`Active Servers`,!0),c=j(`Add New`,!1),l=j(`Browse`,!1);A=[s,c,l],s.addEventListener(`click`,()=>M(`active`)),c.addEventListener(`click`,()=>M(`add`)),l.addEventListener(`click`,()=>M(`browse`)),o.append(s,c,l),w=document.createElement(`div`),D=document.createElement(`div`),D.style.display=`none`,D.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,T=document.createElement(`div`),T.style.display=`none`,T.innerHTML=Fe(),T.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{O=e.dataset.mcpSubtab,Ie()})}),E=T.querySelector(`#mcpAddError`);let u=T.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void He());let d=T.querySelector(`[data-action="closeMcpModal"]`);d&&d.addEventListener(`click`,()=>F()),C.append(o,w,D,T);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`,()=>F()),f.append(p),e.append(t,C,f),S.append(e),document.body.append(S)}function j(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 Fe(){return`
22
- <div style="display:flex;gap:4px;margin-bottom:8px">
23
- <button type="button" class="btn-clear btn-tab is-active" data-mcp-subtab="local">Local</button>
24
- <button type="button" class="btn-clear btn-tab" data-mcp-subtab="remote">Remote</button>
25
- </div>
26
- <div id="mcpAddLocal">
27
- <div class="settings-row"><label>Name</label><input type="text" id="mcpAddName" placeholder="my-server"></div>
28
- <div class="settings-row"><label>Command</label><input type="text" id="mcpAddCommand" placeholder="npx"></div>
29
- <div class="settings-row"><label>Args (comma separated)</label><input type="text" id="mcpAddArgs" placeholder="-y, @upstash/context7-mcp"></div>
30
- <div class="settings-row"><label>Env (KEY=value per line)</label><textarea id="mcpAddEnv" rows="2" placeholder="API_KEY=xxx"></textarea></div>
31
- </div>
32
- <div id="mcpAddRemote" style="display:none">
33
- <div class="settings-row"><label>Name</label><input type="text" id="mcpAddRemoteName" placeholder="my-api"></div>
34
- <div class="settings-row"><label>URL</label><input type="text" id="mcpAddUrl" placeholder="https://mcp.example.com/sse"></div>
35
- <div class="settings-row"><label>Headers (KEY=value per line)</label><textarea id="mcpAddHeaders" rows="2"></textarea></div>
36
- </div>
37
- <div id="mcpAddError" class="text-error text-xs py-1" style="display:none"></div>
38
- <div style="display:flex;gap:8px;margin-top:12px;justify-content:flex-end">
39
- <button type="button" class="btn-clear" data-action="closeMcpModal">Cancel</button>
40
- <button type="button" class="btn-clear btn-save" data-action="mcpAddAndSync">Add & Sync</button>
41
- </div>`}function M(e){w&&(w.style.display=e===`active`?``:`none`),T&&(T.style.display=e===`add`?``:`none`),D&&(D.style.display=e===`browse`?``:`none`),A.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&Le(),e===`add`&&ze(),e===`browse`&&We()}function Ie(){let e=T?.querySelector(`#mcpAddLocal`),t=T?.querySelector(`#mcpAddRemote`);e&&(e.style.display=O===`local`?``:`none`),t&&(t.style.display=O===`remote`?``:`none`),T?.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.classList.toggle(`is-active`,e.dataset.mcpSubtab===O)})}function Le(){if(!w||!y)return;let e=Object.entries(y.servers||{});if(!e.length){w.innerHTML=`<p style="opacity:.5">No active MCP servers.</p>`;return}w.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">
42
- <div style="flex:1">
43
- <div style="display:flex;align-items:center;gap:6px">
44
- <span class="mcp-active-name">${r(e)}</span>
45
- ${i}
46
- </div>
47
- ${l}
48
- </div>
49
- <button type="button" class="btn-clear mcp-active-remove" data-mcp-remove="${r(e)}">Remove</button>
50
- </div>`}).join(``),w.querySelectorAll(`[data-mcp-remove]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.mcpRemove;t&&Re(t)})})}async function Re(t){if(!y)return;let n={...y.servers};delete n[t];try{await e(`/api/mcp`,`PUT`,{...y,servers:n}),await e(`/api/mcp/sync`,`POST`,{}),await b(),Le()}catch(e){N(e.message)}}function ze(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(T??document).querySelector(`#${e}`);t&&(t.value=``)}Be()}function N(e){E&&(E.style.display=`block`,E.textContent=e)}function Be(){E&&(E.style.display=`none`)}function Ve(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 P(e){return(T??document).querySelector(`#${e}`)?.value?.trim()??``}async function He(){if(!y)return;let t=O===`remote`,n,r;if(t){n=P(`mcpAddRemoteName`);let e=P(`mcpAddUrl`),t=P(`mcpAddHeaders`);if(!n){N(`Name is required.`);return}if(!e){N(`URL is required.`);return}r={url:e};let i=Ve(t);Object.keys(i).length>0&&(r.headers=i)}else{n=P(`mcpAddName`);let e=P(`mcpAddCommand`),t=P(`mcpAddArgs`),i=P(`mcpAddEnv`);if(!n){N(`Name is required.`);return}if(!e){N(`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=Ve(i);Object.keys(o).length>0&&(r.env=o)}if(y.servers[n]){N(`Server "${n}" already exists.`);return}try{await e(`/api/mcp`,`PUT`,{...y,servers:{...y.servers,[n]:r}}),await e(`/api/mcp/sync`,`POST`,{}),await b(),F()}catch(e){N(e.message)}}function Ue(){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=`
51
- <h4>MCP Server</h4>
52
- <p>MCP (Model Context Protocol) adds capabilities to AI agents — like installing apps on a phone.</p>
53
-
54
- <h4>Local Server</h4>
55
- <p>Runs on your machine. Provide a command and args.</p>
56
- <pre>Name: context7
57
- Command: npx
58
- Args: -y, @upstash/context7-mcp</pre>
59
-
60
- <h4>Remote Server</h4>
61
- <p>Connects to an external URL (SSE or Streamable HTTP).</p>
62
- <pre>Name: my-api
63
- URL: https://mcp.example.com/sse</pre>
64
-
65
- <h4>Server Types</h4>
66
- <p><code>[npx]</code> Node.js package (npx -y ...)<br>
67
- <code>[uvx]</code> Python package (uvx ...)<br>
68
- <code>[docker]</code> Docker container<br>
69
- <code>[remote]</code> External URL</p>
70
-
71
- <h4>After Adding</h4>
72
- <p>The server is automatically synced to all installed CLIs (Claude, Codex, Gemini, Cursor, Copilot, OpenCode).</p>
73
- <p><code>Install bundle</code> converts npx/uvx servers to global binaries for faster startup.</p>
74
-
75
- <div style="text-align:right;margin-top:12px">
76
- <button type="button" class="btn-save" id="mcpHelpClose">OK</button>
77
- </div>
78
- `,t.append(n),document.body.append(t),n.querySelector(`#mcpHelpClose`)?.addEventListener(`click`,()=>t.remove())}async function We(){if(D){D.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,y||await b();try{let e=await t(`/api/mcp/registry`);if(!e?.entries?.length&&!e?.builtins?.length){D.innerHTML=`<p style="opacity:.5">No MCP servers in registry.</p>`;return}let n=y?Object.keys(y.servers):[],i=``;i+=e.entries.map(e=>{let t=n.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)">
79
- <div style="display:flex;align-items:center;gap:8px">
80
- <b>${r(e.name)}</b>
81
- <span style="opacity:.5;font-size:0.85em">[${r(e.type)}]</span>
82
- <span style="opacity:.4;font-size:0.85em">${r(e.category)}</span>
83
- ${t?`<span style="color:var(--success);font-size:11px">Installed</span>`:`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-registry-install="${r(e.id)}">+ Install</button>`}
84
- </div>
85
- <p style="margin:4px 0 4px 0;font-size:12px;opacity:.75">${r(e.description)}</p>
86
- <div style="display:flex;gap:4px;align-items:center">
87
- ${i}
88
- ${e.url?`<a href="${r(e.url)}" target="_blank" rel="noopener noreferrer" style="font-size:10px;opacity:.5;margin-left:auto">source</a>`:``}
89
- </div>
90
- </div>`}).join(``),e.builtins?.length&&(i+=`<div style="margin-top:16px;padding-top:12px;border-top:2px solid var(--border)">
91
- <h4 style="font-size:12px;opacity:.6;margin:0 0 8px">Harness Built-ins (omo / omx)</h4>
92
- <p style="font-size:11px;opacity:.4;margin:0 0 8px">Not installable via registry — built into harness runtimes. Listed for reference.</p>`,i+=e.builtins.map(e=>{let t=e.standalone_config&&Object.keys(e.standalone_config).length>0;return`<div style="padding:6px 0;border-bottom:1px solid var(--border)">
93
- <div style="display:flex;align-items:center;gap:6px">
94
- <b style="font-size:12px">${r(e.name)}</b>
95
- <span style="opacity:.4;font-size:0.8em">${r(e.harness)}</span>
96
- ${t?`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-builtin-install="${r(e.id)}">+ Install standalone</button>`:``}
97
- </div>
98
- <p style="margin:2px 0;font-size:11px;opacity:.65">${r(e.description)}</p>
99
- </div>`}).join(``),i+=`</div>`),D.innerHTML=i,D.querySelectorAll(`[data-registry-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.registryInstall,r=e.entries.find(e=>e.id===n);r&&Ge(r,t)})}),D.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&&Ge({id:r.id,name:r.name,description:r.description,category:`harness`,type:`remote`,config:r.standalone_config,tags:[],url:r.source},t)})})}catch(e){D.innerHTML=`<p style="color:var(--color-error)">${r(e.message)}</p>`}}}async function Ge(t,n){if(y){n.disabled=!0,n.textContent=`Installing...`;try{let r=t.config;await e(`/api/mcp`,`PUT`,{...y,servers:{...y.servers,[t.id]:r}}),await e(`/api/mcp/sync`,`POST`,{}),await b(),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 Ke(){Pe(),S?.classList.add(`open`),S?.setAttribute(`aria-hidden`,`false`),k=!0,M(`active`)}function F(){k&&(S?.classList.remove(`open`),S?.setAttribute(`aria-hidden`,`true`),k=!1,ze(),document.getElementById(`mcpHelpOverlay`)?.remove())}var qe=!1;function Je(){qe||(qe=!0,document.addEventListener(`keydown`,e=>{if(document.getElementById(`mcpHelpOverlay`)&&e.key===`Escape`){e.preventDefault(),document.getElementById(`mcpHelpOverlay`)?.remove();return}k&&e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),F())},!0))}var Ye=/^\/(?:Users|home)\/[^/]+/,Xe=32;function Ze(e){return e.replace(Ye,`~`)}function Qe(e){if(e.length<=Xe)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function $e(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${Qe(Ze(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
100
- `)}}function et(){return document.getElementById(`headerGitStatus`)}function tt(){let e=et();e&&(e.hidden=!0,e.textContent=``,e.removeAttribute(`title`),e.removeAttribute(`aria-label`))}function nt(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 rt(e){let t=et();if(!t)return;let n=nt(e);if(!n){tt();return}t.hidden=!1,t.textContent=n.text,t.title=n.title,t.setAttribute(`aria-label`,n.title)}async function it(){rt(await t(`/api/project/git-summary`))}function at(e){(Array.isArray(e.changedKeys)?e.changedKeys:[]).includes(`projectDirs`)&&it()}var I=null;function L(e){let t=document.getElementById(`headerCli`);if(!t)return;let n=ne(e),i=z(e);t.innerHTML=n?`${n} ${r(i)}`:r(i)}function R(e){let t=document.getElementById(`headerProject`);if(!t)return;ot(t),t.hidden=!1;let n=$e(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 ot(t){if(t.dataset.pickerBound)return;t.dataset.pickerBound=`1`,t.setAttribute(`role`,`button`),t.setAttribute(`tabindex`,`0`);let n=async()=>{if(t.classList.contains(`is-picking`))return;t.classList.add(`is-picking`);let n=t.textContent;t.textContent=`Choosing folder…`;try{let n=await e(`/api/project/pick`,`POST`,{});if(n&&!n.cancelled&&`projectDirs`in n){t.classList.remove(`is-picking`),R(n.projectDirs);return}}catch{}t.classList.remove(`is-picking`),t.textContent=n};t.addEventListener(`click`,()=>{n()}),t.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),n())})}function st(e){typeof e.cli==`string`&&e.cli&&L(e.cli),`projectDirs`in e&&R(e.projectDirs),at(e)}function z(e){return c(e)?.label||h(e)||e}function ct(e){let t=e.finally(()=>{I===t&&(I=null)});return I=t,t}async function lt(){let e=I;e&&await e}function B(e){return e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function V(e){return document.getElementById(`model`+B(e))}function ut(e){return document.getElementById(`customModel`+B(e))}function H(e){return document.getElementById(`effort`+B(e))}function U(e,t,{includeCustom:n=!1,includeDefault:a=!1,selected:o=``}={}){if(!e)return;let s=a?`<option value="default">default</option>`:``,c=n?`<option value="__custom__">${i(`model.customOption`)}</option>`:``;e.innerHTML=s+(t||[]).map(e=>`<option value="${r(e)}">${r(e)}</option>`).join(``)+c,o&&Array.from(e.options).some(e=>e.value===o)&&(e.value=o)}function W(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 dt(e=null){let t=l(),n=document.getElementById(`selCli`);if(n){let a=e?.cli||n.value||t[0]||`claude`,o=e=>u.includes(e),s=!o(a)&&t.includes(a),l=n.dataset.expanded===`1`,d=t.filter(o),f=t.filter(e=>!o(e)),p=d.length===0||s||l,m=d.map(e=>{let t=c(e)?.label||e;return`<option value="${r(e)}">${r(t)}</option>`}).join(``);f.length>0&&(p?(m+=`<option disabled>──────</option>`,m+=f.map(e=>{let t=c(e)?.label||e;return`<option value="${r(e)}">${r(t)}</option>`}).join(``)):m+=`<option value="__show_more__">${i(`cli.showMore`)}</option>`),n.innerHTML=m,Array.from(n.options).some(e=>e.value===a)&&(n.value=a)}let a=document.getElementById(`flushCli`);if(a){let n=e?.memory?.cli||a.value||``;a.innerHTML=`<option value="">(active CLI)</option>`+t.map(e=>`<option value="${r(e)}">${r(z(e))}</option>`).join(``),Array.from(a.options).some(e=>e.value===n)&&(a.value=n)}}function G(e,t){return(t||``).trim()}function ft(e=null){for(let t of l()){let n=c(t),i=t!==`pi`&&n?.providers?.length?q(t):``,a=V(t);if(a)if(n?.modelNote)a.innerHTML=`<option value="">${r(n.modelNote)}</option>`,a.title=n.modelNote,a.disabled=!0;else{let r=G(t,e?.perCli?.[t]?.model||a.value||``),o=t===`pi`&&e?.perCli?.pi?.provider||``,s=t===`pi`&&o?p(e?.pi,o):[];U(a,t===`pi`&&s.length?s:i?n?.modelsByProvider?.[i]||f[t]||[]:f[t]||[],{includeCustom:!0,selected:r}),r&&!Array.from(a.options).some(e=>e.value===r)&&(W(a,r),a.value=r),a.disabled=!1}let o=H(t);if(o){let a=i?n?.effortsByProvider?.[i]||[]:null,s=[``].concat(a||n?.efforts||[]),c=e?.perCli?.[t]?.effort??o.value??``,l=[...new Set(s)],u=l.length===1&&!l[0]&&n?.effortNote?n.effortNote:`— none`;o.innerHTML=l.map(e=>e?`<option value="${r(e)}">${r(e)}</option>`:`<option value="">${r(u)}</option>`).join(``),n?.effortNote&&(o.title=n.effortNote),o.disabled=l.length===1&&!l[0]&&!!n?.effortNote,Array.from(o.options).some(e=>e.value===c)&&(o.value=c)}}}function K(e,t=``){let n=document.getElementById(`selEffort`);if(!n)return;let i=c(e),a=e!==`pi`&&i?.providers?.length?q(e):``,o=(a?i?.effortsByProvider?.[a]||[]:null)||i?.efforts||[];if(i?.effortNote&&o.length===0){n.innerHTML=`<option value="">${r(i.effortNote)}</option>`,n.title=i.effortNote,n.disabled=!0;return}let s=[``].concat(o);n.innerHTML=[...new Set(s)].map(e=>e?`<option value="${r(e)}">${r(e)}</option>`:`<option value="">— none</option>`).join(``),n.disabled=!1,n.title=i?.effortNote||``,Array.from(n.options).some(e=>e.value===t)&&(n.value=t)}function pt(e,t,n){return e?(e.innerHTML=n.map(e=>`<option value="${r(e)}">${r(h(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 q(e){let t=document.getElementById(`selCliProvider`),n=document.getElementById(`provider${e.charAt(0).toUpperCase()+e.slice(1).replace(/-./g,e=>e[1].toUpperCase())}`),r=c(e);return t?.value||n?.value||r?.defaultProvider||``}function mt(e,t){let n=document.getElementById(`cliProviderWrap`),r=document.getElementById(`selCliProvider`),i=document.getElementById(`cliProviderLabel`),a=c(t);if(!(t!==`pi`&&(a?.providers?.length??0)>0))return n&&(n.style.display=`none`),a?.defaultProvider||``;i&&(i.textContent=`Provider`);let o=pt(r,e?.perCli?.[t]?.provider||r?.value||a?.defaultProvider||``,a.providers);return n&&(n.style.display=``),o}async function ht(){await d();let e=await t(`/api/settings`);if(!e)return;s(e.locale??``),dt(e),m(e.pi),te(e.pi,e.perCli?.pi?.provider),e.perCli?.pi?.provider&&ee(e.perCli.pi.provider,e.pi),mt(e,e.cli||``),ft(e);let n=document.getElementById(`selCli`);n&&Array.from(n.options).some(t=>t.value===e.cli)&&(n.value=e.cli,n.dataset.prev=e.cli);let i=document.getElementById(`inpCwd`);i&&(i.textContent=e.workingDir);let a=document.getElementById(`headerCli`);if(a){let t=ne(e.cli),n=z(e.cli);a.innerHTML=t?`${t} ${r(n)}`:r(n)}if(R(e.projectDirs),await it(),gt(e.permissions,!1),e.perCli)for(let[t,n]of Object.entries(e.perCli)){let e=V(t),r=H(t);if(e&&n.model){let r=G(t,n.model);W(e,r),e.value=r}if(r&&(r.value=n.effort||``),t===`codex`&&n.fastMode!==void 0&&(document.getElementById(`codexFastOn`)?.classList.toggle(`active`,n.fastMode),document.getElementById(`codexFastOff`)?.classList.toggle(`active`,!n.fastMode)),t===`codex`){let e=!!n.contextWindow;document.getElementById(`codexCtxOn`)?.classList.toggle(`active`,e),document.getElementById(`codexCtxOff`)?.classList.toggle(`active`,!e);let t=document.getElementById(`codexCtxValues`);t&&(t.style.display=e?``:`none`);let r=document.getElementById(`codexCtxWindow`),i=document.getElementById(`codexCtxCompact`);r&&n.contextWindowSize&&(r.value=String(n.contextWindowSize)),i&&n.contextCompactLimit&&(i.value=String(n.contextCompactLimit))}if(t===`claude`){let e=!!(n.model&&String(n.model).endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,e),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!e)}}Z(!1);let o=e.activeOverrides?.[e.cli]||{},c=e.perCli?.[e.cli]||{},l=o.model||c.model,u=o.effort??c.effort??``,f=document.getElementById(`selModel`);if(l&&f){let t=G(e.cli,l);t&&!Array.from(f.options).some(e=>e.value===t)&&W(f,t),f.value=t}K(e.cli,u),ce(e),me(e),xe(e),De(e),Oe(e),b(),re(e.stt||{})}async function J(){let t=document.getElementById(`selCli`)?.value||`claude`,n={cli:t},r=c(t);return t!==`pi`&&r?.providers?.length&&(n.perCli={[t]:{provider:q(t)}}),ct((async()=>{let r=await e(`/api/settings`,`PUT`,n);if(!r){await ht();return}let i=r.cli||t,o=document.getElementById(`selCli`);o&&Array.from(o.options).some(e=>e.value===i)&&(o.value=i,o.dataset.prev=i),L(i),a([`instances`],`active-cli-changed`)})())}function gt(e,t=!0){t&&n(`/api/settings`,`PUT`,{permissions:`auto`})}function Y(e){let t=V(e);return t?t.value===`__custom__`?ut(e)?.value?.trim()||t.options[0]?.value||`default`:t.value:`default`}function _t(e,t){let n=ut(e);n&&(t.value===`__custom__`?(n.style.display=`block`,n.focus()):(n.style.display=`none`,e===`claude`&&vt(t.value),X()))}function vt(e){let t=!!(e&&e.endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,t),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!t)}function yt(e,t){let n=t.value.trim();if(!n)return;let r=V(e);r&&(W(r,n),r.value=n,t.style.display=`none`,e===`claude`&&vt(n),X())}function bt(){let e=document.getElementById(`selCli`)?.value||``,t=q(e),n=document.getElementById(`selCliProvider`);n&&Array.from(n.options).some(e=>e.value===t)&&(n.value=t),ft(null),c(e)?.providers?.length&&Z(!1),X()}async function X(){let t={};for(let e of l()){if(!V(e))continue;let n=H(e),r={model:Y(e),effort:n?n.value:``},i=c(e);if(e!==`pi`&&i?.providers?.length&&(r.provider=q(e)),e===`pi`){let e=document.getElementById(`providerPi`);e?.value&&(r.provider=e.value)}if(e===`codex`){r.fastMode=document.getElementById(`codexFastOn`)?.classList.contains(`active`)??!1,r.contextWindow=document.getElementById(`codexCtxOn`)?.classList.contains(`active`)??!1;let e=document.getElementById(`codexCtxWindow`),t=document.getElementById(`codexCtxCompact`);r.contextWindowSize=parseInt(e?.value||`1000000`,10),r.contextCompactLimit=parseInt(t?.value||`900000`,10)}t[e]=r}await e(`/api/settings`,`PUT`,{perCli:t})}function Z(e=!0){let n=document.getElementById(`selCli`);if(!n)return;if(n.value===`__show_more__`){let e=n.dataset.prev||l()[0]||`claude`;n.dataset.expanded=`1`,dt(null),Array.from(n.options).some(t=>t.value===e)&&(n.value=e);try{n.showPicker()}catch{}return}n.dataset.prev=n.value;let a=n.value||`claude`,o=mt(null,a),s=c(a),u=o&&s?.modelsByProvider?.[o]?s.modelsByProvider[o]:f[a]||[],d=document.getElementById(`selModel`);s?.modelNote&&d?(d.innerHTML=`<option value="">${r(s.modelNote)}</option>`,d.title=s.modelNote,d.disabled=!0):(U(d,u,{includeCustom:!0,includeDefault:!0}),d&&(d.disabled=!1,d.title=``)),L(a),K(a);let p=document.getElementById(`selModelCustom`);p&&p.remove();let m=document.createElement(`input`);if(m.type=`text`,m.id=`selModelCustom`,m.className=`custom-model-input`,m.placeholder=i(`model.placeholder`),m.style.display=`none`,m.onchange=function(){let e=this.value.trim();!e||!d||(W(d,e),d.value=e,this.style.display=`none`,Q())},!d){e&&J();return}d.parentElement?.appendChild(m),d.onchange=function(){this.value===`__custom__`?(m.style.display=`block`,m.focus()):(m.style.display=`none`,Q())},t(`/api/settings`).then(e=>{if(!e)return;let t=e.activeOverrides?.[a]||{},n=e.perCli?.[a]||{},r=t.model||n.model,i=t.effort??n.effort??``;if(r&&d){let t=c(a);if(a!==`pi`&&t?.providers?.length&&(e.perCli?.[a]?.provider||t.defaultProvider||``)!==q(a)){K(a,i);return}let n=G(a,r);W(d,n),d.value=n}K(a,i)}),e&&J()}async function Q(){let t=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[t]={model:n},r&&!r.disabled&&(i[t].effort=r.value||``);let o={activeOverrides:i},s=c(t);t!==`pi`&&s?.providers?.length&&(o.perCli={[t]:{provider:q(t)}}),await e(`/api/settings`,`PUT`,o)&&a([`instances`],`active-cli-changed`)}function xt(){let e=f[document.getElementById(`flushCli`)?.value||document.getElementById(`selCli`)?.value||`claude`]||[];U(document.getElementById(`flushModel`),e,{includeDefault:!0}),$(),Ct()}async function St(){let e=await t(`/api/memory-files`);if(!e)return;let n=document.getElementById(`flushCli`),r=document.getElementById(`flushModel`);n&&e.cli&&(n.value=e.cli),U(r,f[e.cli||document.getElementById(`selCli`)?.value||`claude`]||[],{includeDefault:!0}),r&&e.model&&(W(r,e.model),r.value=e.model),$()}async function Ct(){await e(`/api/memory-files/settings`,`PUT`,{cli:document.getElementById(`flushCli`)?.value||``,model:document.getElementById(`flushModel`)?.value||``})}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?z(r):`${z(r)}*`),n&&n!==`default`&&i.push(n),e.textContent=i.length?`(${i.join(` / `)})`:``}export{ue as A,he as C,ye as D,_e as E,oe as F,ae as I,se as L,de as M,pe as N,be as O,ie as P,re as R,Ee as S,ve as T,b as _,ht as a,Oe as b,bt as c,X as d,gt as f,Ne as g,Je as h,St as i,fe as j,le as k,st as l,lt as m,Y as n,Z as o,J as p,_t as r,xt as s,yt as t,Q as u,Ke as v,ge as w,ke as x,Me as y};
@@ -1 +0,0 @@
1
- import{d as e,l as t}from"./settings-core-CyX-px6_.js";export{t as refreshHeaderFromSettingsChange,e as savePerCli};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-wt0fkV9Y.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-BZbqTg3v.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{p as e}from"./iframe-renderer-DUI0LYBy.js";import{d as t,o as n}from"./message-history-Dl8dJzez.js";import{r}from"./ui-D4D5HUfo.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};