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