cli-jaw 2.2.17 → 2.2.18
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 +4 -0
- package/dist/bin/cli-jaw.js +9 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/ask.js +245 -0
- package/dist/bin/commands/ask.js.map +1 -0
- package/dist/bin/commands/chat.js +41 -3
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/dispatch.js +210 -167
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/init.js +33 -4
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/slack.js +73 -3
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/bin/commands/tui/raw-pipe-mode.js +90 -0
- package/dist/bin/commands/tui/raw-pipe-mode.js.map +1 -0
- package/dist/bin/commands/tui/simple-mode.js +11 -2
- package/dist/bin/commands/tui/simple-mode.js.map +1 -1
- package/dist/bin/postinstall.js +54 -30
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/dist/src/agent/pi-runtime.js +10 -2
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +21 -0
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +19 -6
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/cli-status.js +65 -5
- package/dist/src/cli/cli-status.js.map +1 -1
- package/dist/src/cli/handlers.js +9 -1
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/tui/jawcode-render.js +18 -5
- package/dist/src/cli/tui/jawcode-render.js.map +1 -1
- package/dist/src/core/config.js +85 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/exec-name.js +55 -0
- package/dist/src/core/exec-name.js.map +1 -0
- package/dist/src/core/runtime-settings.js +9 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-watch.js +10 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/lib/tui/bun-shim.mjs +75 -0
- package/dist/src/memory/bootstrap.js +8 -1
- package/dist/src/memory/bootstrap.js.map +1 -1
- package/dist/src/messaging/channel-validate.js +11 -1
- package/dist/src/messaging/channel-validate.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +23 -2
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +6 -0
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/request-registry.js +116 -0
- package/dist/src/orchestrator/request-registry.js.map +1 -0
- package/dist/src/prompt/templates/a1-system.md +5 -5
- package/dist/src/routes/messaging.js +94 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/settings.js +61 -4
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/system.js +23 -3
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/slack/bot.js +36 -1
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +29 -1
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/events.js +4 -1
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/history.js +10 -3
- package/dist/src/slack/history.js.map +1 -1
- package/dist/src/slack/identity.js +553 -0
- package/dist/src/slack/identity.js.map +1 -0
- package/dist/src/slack/ingress.js +42 -0
- package/dist/src/slack/ingress.js.map +1 -1
- package/dist/src/slack/manifest.js +95 -71
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/roster.js +180 -0
- package/dist/src/slack/roster.js.map +1 -0
- package/package.json +4 -3
- package/public/css/sidebar.css +29 -51
- package/public/dist/assets/AdvancedExport-c41zCkwB.js +1 -0
- package/public/dist/assets/{Agent-CNNQ7KkJ.js → Agent-nMPZsMfN.js} +1 -1
- package/public/dist/assets/ChannelsSlack-CVNKtoo4.js +1 -0
- package/public/dist/assets/{app-Dsgp4xpU.js → app-DqSJmDwP.js} +4 -4
- package/public/dist/assets/{app-DjgGeXhJ.css → app-DuyLYRC6.css} +1 -1
- package/public/dist/assets/bgtask-badge-CjWz0F6U.js +1 -0
- package/public/dist/assets/{bgtask-badge-CpavV0Jc.js → bgtask-badge-D6XYRFI5.js} +1 -1
- package/public/dist/assets/{employees-BJyEgim7.js → employees-B_wKPfTO.js} +1 -1
- package/public/dist/assets/{iframe-renderer-B8k3AvTv.js → iframe-renderer-D1-zDg8V.js} +2 -2
- package/public/dist/assets/iframe-renderer-qRVLHPnT.js +1 -0
- package/public/dist/assets/{manager-kXYQyMhR.js → manager-Bjuh1jpq.js} +1 -1
- package/public/dist/assets/{memory-D2RbBVO-.js → memory-CNUpXWEC.js} +1 -1
- package/public/dist/assets/memory-CcWGiPy_.js +1 -0
- package/public/dist/assets/message-history-BamMPUnL.js +1 -0
- package/public/dist/assets/{message-history-Bw2E_b8L.js → message-history-DB1rynP-.js} +1 -1
- package/public/dist/assets/{render-BkGcpH7z.js → render-DXwQzjsJ.js} +1 -1
- package/public/dist/assets/{settings-B1FPORO2.js → settings-CXndjCad.js} +14 -14
- package/public/dist/assets/settings-RGpifFHy.js +1 -0
- package/public/dist/assets/settings-core-X_5UHfr3.js +1 -0
- package/public/dist/assets/settings-core-t5yYVRrv.js +162 -0
- package/public/dist/assets/{sidebar-DW78DANx.js → sidebar-DgIj-LuT.js} +3 -3
- package/public/dist/assets/skills-CbwIimit.js +1 -0
- package/public/dist/assets/{skills-lWi0ZFiV.js → skills-QqxjqDHg.js} +1 -1
- package/public/dist/assets/{slash-commands-DYOI6nKj.js → slash-commands-B2V_jngP.js} +1 -1
- package/public/dist/assets/slash-commands-tCNRlNTC.js +1 -0
- package/public/dist/assets/{trace-drawer-DBX9xzmt.js → trace-drawer-CBe9nRjS.js} +1 -1
- package/public/dist/assets/{ui-Bx7eqnXt.js → ui-CDozpEQt.js} +1 -1
- package/public/dist/assets/ui-o-VpvrSv.js +1 -0
- package/public/dist/index.html +15 -34
- package/public/dist/manager/index.html +1 -1
- package/public/index.html +13 -32
- package/public/js/features/channel-onboarding-flow.ts +25 -2
- package/public/js/features/channel-onboarding.ts +111 -8
- package/public/js/features/settings-cli-status.ts +18 -4
- package/public/js/features/settings-slack.ts +127 -29
- package/public/js/features/settings-types.ts +11 -2
- package/public/locales/en.json +17 -8
- package/public/locales/ja.json +17 -8
- package/public/locales/ko.json +17 -8
- package/public/locales/zh.json +17 -8
- package/public/manager/src/settings/pages/AdvancedExport.tsx +1 -0
- package/public/manager/src/settings/pages/Agent.tsx +10 -1
- package/public/manager/src/settings/pages/ChannelsSlack.tsx +13 -1
- package/scripts/atomic-build.sh +10 -3
- package/scripts/release-preview.sh +16 -1
- package/scripts/verify-dist-assets.sh +53 -0
- package/public/dist/assets/AdvancedExport-DYGcCAUq.js +0 -1
- package/public/dist/assets/ChannelsSlack-ybvupgdK.js +0 -1
- package/public/dist/assets/bgtask-badge-C6h5C-o4.js +0 -1
- package/public/dist/assets/iframe-renderer-BO_GgCTR.js +0 -1
- package/public/dist/assets/memory-amsvg4Ey.js +0 -1
- package/public/dist/assets/message-history-BGHZxvgV.js +0 -1
- package/public/dist/assets/settings-CMN-zN4Q.js +0 -1
- package/public/dist/assets/settings-core-B_OjGYVN.js +0 -1
- package/public/dist/assets/settings-core-CxRwqx86.js +0 -144
- package/public/dist/assets/skills-Dz-9Yrxr.js +0 -1
- package/public/dist/assets/slash-commands-xJFCdTTM.js +0 -1
- package/public/dist/assets/ui-JOcrYeG-.js +0 -1
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
# ./release-preview.sh --minor → minor bump (1.6.9 → 1.7.0-preview.*)
|
|
7
7
|
# ./release-preview.sh --major → major bump (1.6.9 → 2.0.0-preview.*)
|
|
8
8
|
# ./release-preview.sh 1.8.0 → explicit base version
|
|
9
|
+
# ./release-preview.sh --require-evidence → fail if fresh-machine evidence is missing
|
|
10
|
+
# (default: warn and continue, same as release.sh)
|
|
9
11
|
# npm publish is handled by .github/workflows/publish.yml through npm Trusted
|
|
10
12
|
# Publishing (OIDC). Desktop artifacts are built and attached by GitHub Actions
|
|
11
13
|
# after the GitHub prerelease is published.
|
|
@@ -15,12 +17,16 @@ cd "$(dirname "$0")/.."
|
|
|
15
17
|
|
|
16
18
|
# ─── Flag parsing ──────────────────────────────────────
|
|
17
19
|
BUMP_KIND="patch"
|
|
20
|
+
REQUIRE_EVIDENCE=false
|
|
18
21
|
POSITIONAL=()
|
|
19
22
|
for arg in "$@"; do
|
|
20
23
|
case "$arg" in
|
|
21
24
|
--with-desktop)
|
|
22
25
|
echo "ℹ️ --with-desktop is no longer needed; GitHub Actions builds desktop assets after release publication."
|
|
23
26
|
;;
|
|
27
|
+
--require-evidence)
|
|
28
|
+
REQUIRE_EVIDENCE=true
|
|
29
|
+
;;
|
|
24
30
|
--major|major)
|
|
25
31
|
BUMP_KIND="major"
|
|
26
32
|
;;
|
|
@@ -169,7 +175,16 @@ run_electron_release_checks
|
|
|
169
175
|
echo "🛡️ Running release gates (gate:all)..."
|
|
170
176
|
npm run gate:all
|
|
171
177
|
|
|
172
|
-
|
|
178
|
+
# Matches release.sh: the fresh-machine evidence gate is advisory by default and
|
|
179
|
+
# enforced with --require-evidence. A preview build is the channel you reach for
|
|
180
|
+
# precisely when installer changes still need real-machine coverage, so making
|
|
181
|
+
# preview stricter than stable had it backwards — it blocked the release that
|
|
182
|
+
# exists to be tested.
|
|
183
|
+
if [ "$REQUIRE_EVIDENCE" = true ]; then
|
|
184
|
+
node scripts/require-release-evidence.mjs
|
|
185
|
+
else
|
|
186
|
+
node scripts/require-release-evidence.mjs || echo "⚠️ Evidence gate skipped (pass --require-evidence to enforce)"
|
|
187
|
+
fi
|
|
173
188
|
|
|
174
189
|
echo "🧪 Verifying npm package contents..."
|
|
175
190
|
npm pack --dry-run >/dev/null
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Verify that every non-TS asset the COMPILED output still imports actually
|
|
3
|
+
# exists in dist/. Source-level scanning cannot do this job: it misses paths
|
|
4
|
+
# assembled at runtime, and it drifts from what tsc actually emitted. The
|
|
5
|
+
# build artifact is the only honest subject.
|
|
6
|
+
#
|
|
7
|
+
# Scope note (deliberate, not an oversight): this only inspects SINGLE-LINE
|
|
8
|
+
# literal dynamic imports of .mjs files. It does NOT see template-literal
|
|
9
|
+
# specifiers, multi-line import calls, or runtime-assembled paths — the
|
|
10
|
+
# Defuddle vendor bundle and the prompt templates are covered by explicit copy
|
|
11
|
+
# steps in atomic-build.sh instead. A partial checker that pretends to be
|
|
12
|
+
# complete is worse than one that states its limit.
|
|
13
|
+
#
|
|
14
|
+
# Regression guarded: #275, where bun-shim.mjs was copied only when a
|
|
15
|
+
# generated, gitignored bundle happened to exist locally.
|
|
16
|
+
set -uo pipefail
|
|
17
|
+
cd "$(dirname "$0")/.."
|
|
18
|
+
|
|
19
|
+
# The jawcode bundles are produced by a separate Bun build and are gitignored,
|
|
20
|
+
# so a plain `npm run build` legitimately omits them. bun-shim.mjs is NOT in
|
|
21
|
+
# this list — that omission is the bug this script exists to catch.
|
|
22
|
+
# Anchored on the path separator so a lookalike such as
|
|
23
|
+
# `not-jawcode-tui-bundle.mjs` is NOT silently exempted.
|
|
24
|
+
OPTIONAL='(^|/)(jawcode-tui-bundle|jawcode-interactive-bundle)\.mjs$'
|
|
25
|
+
|
|
26
|
+
if [ ! -d dist ]; then
|
|
27
|
+
echo "[verify-dist-assets] dist/ not found — run npm run build first" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
missing=0
|
|
32
|
+
while IFS= read -r js; do
|
|
33
|
+
while IFS= read -r spec; do
|
|
34
|
+
[ -z "$spec" ] && continue
|
|
35
|
+
[[ "$spec" =~ $OPTIONAL ]] && continue
|
|
36
|
+
target="$(dirname "$js")/$spec"
|
|
37
|
+
if [ ! -f "$target" ]; then
|
|
38
|
+
echo "missing: $spec (imported from ${js#dist/})" >&2
|
|
39
|
+
missing=$((missing + 1))
|
|
40
|
+
fi
|
|
41
|
+
done < <(grep -oE "import\((['\"])[^'\"]+\.mjs\1\)" "$js" \
|
|
42
|
+
| sed -E "s/^import\(['\"]//; s/['\"]\)$//")
|
|
43
|
+
done < <(find dist -name '*.js')
|
|
44
|
+
|
|
45
|
+
if [ "$missing" -ne 0 ]; then
|
|
46
|
+
echo "[verify-dist-assets] $missing missing asset(s)" >&2
|
|
47
|
+
# Saturate: shell exit status wraps at 256, so `exit $missing` could report
|
|
48
|
+
# success for exactly 256 failures. A gate must never turn red into green.
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
echo "[verify-dist-assets] ok"
|
|
53
|
+
exit 0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{t as r}from"./error-normalize-BzeO0SXE.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-LF7vVVfG.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:p(t)}}function p(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,...i}=e;return i}function m({port:e,client:t,triggerDownload:n}){let{state:m}=i(t,`/api/settings`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(``),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(!1),[C,w]=(0,l.useState)(null),T=n||d;(0,l.useEffect)(()=>{v(``),b(null),w(null)},[e]);let E=(0,l.useCallback)(()=>{m.kind===`ready`&&T(`cli-jaw-settings-${e}.json`,JSON.stringify(p(m.data),null,2))},[m,e,T]),D=(0,l.useCallback)(async()=>{let e=f(_);if(!e.ok){b(e.error),w(null);return}b(null),w(null),S(!0);try{await t.put(`/api/settings`,e.value),w(`Imported. Reload the page to refresh other tabs.`)}catch(e){b(r(e))}finally{S(!1)}},[t,_]);return m.kind===`loading`?(0,u.jsx)(o,{}):m.kind===`offline`?(0,u.jsx)(s,{port:e}):m.kind===`error`?(0,u.jsx)(c,{message:m.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:E,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)})]}),h?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:_,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>v(e.target.value),"aria-invalid":!!y}),y?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:y}):null,C?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:C}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void D(),disabled:x||_.trim()===``,children:x?`Importing…`:`Apply import`})]}):null]})]})}export{m as default,p as stripServerOwnedSettingsFields,f as validateImportPayload};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-LF7vVVfG.js";import{a as c,n as l,o as u,s as d}from"./fields-zkeByFQW.js";import{t as f}from"./path-utils-LsJeDCKF.js";import{n as p,t as m}from"./TransportStatusChips-CjEySMis.js";var h=e(t(),1),g=n(),_=[`channel`,`slack.enabled`,`slack.botToken`,`slack.appToken`,`slack.teamId`,`slack.channelIds`,`slack.forwardAll`,`slack.allowBots`,`slack.mentionOnly`,`slack.replyInThread`];function v(e){return e?/^[CGD][A-Z0-9]{6,20}$/.test(e.trim().toUpperCase()):!1}function y({port:e,client:t,dirty:n,registerSave:y}){let{state:b,refresh:x,setData:S}=r(t,`/api/settings`),[C,w]=(0,h.useState)(!1),[T,E]=(0,h.useState)(``),[D,O]=(0,h.useState)(``),[k,A]=(0,h.useState)(``),[j,M]=(0,h.useState)([]),[N,P]=(0,h.useState)(!0),[F,I]=(0,h.useState)(!1),[L,R]=(0,h.useState)(!0),[z,B]=(0,h.useState)(!0),V=(0,h.useCallback)(e=>{w(!!e.enabled),E(``),O(``),A(e.teamId??``),M(Array.isArray(e.channelIds)?[...e.channelIds]:[]),P(e.forwardAll!==!1),I(!!e.allowBots),R(e.mentionOnly!==!1),B(e.replyInThread!==!1)},[]);(0,h.useEffect)(()=>{b.kind===`ready`&&V(b.data.slack||{})},[b,V]),(0,h.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let H=(0,h.useCallback)((e,t)=>n.set(e,t),[n]),U=(0,h.useMemo)(()=>b.kind===`ready`&&b.data.slack||{},[b]),W=b.kind===`ready`?b.data.channel:void 0,G=(0,h.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),S(a),V(a.slack||{}),await x()},[t,n,x,S,V]);if((0,h.useEffect)(()=>{if(y)return y(G),()=>y(null)},[y,G]),b.kind===`loading`)return(0,g.jsx)(a,{});if(b.kind===`offline`)return(0,g.jsx)(o,{port:e});if(b.kind===`error`)return(0,g.jsx)(s,{message:b.message});let K=e=>e?`••••••••${e.slice(-4)}`:`(empty)`,q=j.filter(e=>!v(e)),J=q.length>0?`Slack conversation IDs only (C…/G…/D…) — invalid: ${q.join(`, `)}`:null,Y=T&&!T.startsWith(`xoxb-`)?`Bot tokens start with xoxb-.`:null,X=D&&!D.startsWith(`xapp-`)?`App-level tokens start with xapp-.`:null,Z=U.enabled&&U.botToken&&!U.appToken?`Currently OUTBOUND-ONLY: the app-level token (xapp-) is missing, so no inbound Slack events can arrive.`:`Slack needs TWO tokens: a bot token (xoxb-) for the Web API and an app-level token (xapp-) for Socket Mode.`;return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),G()},children:[(0,g.jsxs)(i,{title:`Channels`,hint:`Choose which channel receives inbound chat. Outbound send can still work on the other channels when configured.`,children:[(0,g.jsx)(p,{original:W,dirty:n,idPrefix:`sl-channel`}),(0,g.jsx)(m,{client:t,channel:`slack`})]}),(0,g.jsxs)(i,{title:`Slack`,hint:Z,children:[(0,g.jsx)(c,{id:`sl-enabled`,label:`Slack enabled`,value:C,onChange:e=>{w(e),H(`slack.enabled`,{value:e,original:!!U.enabled,valid:!0})}}),(0,g.jsx)(u,{id:`sl-botToken`,label:`Bot token`,value:T,placeholder:K(U.botToken),error:Y,onChange:e=>{if(E(e),e.length===0){n.remove(`slack.botToken`);return}H(`slack.botToken`,{value:e,original:U.botToken??``,valid:e.startsWith(`xoxb-`)})}}),(0,g.jsx)(u,{id:`sl-appToken`,label:`App-level token`,value:D,placeholder:K(U.appToken),error:X,onChange:e=>{if(O(e),e.length===0){n.remove(`slack.appToken`);return}H(`slack.appToken`,{value:e,original:U.appToken??``,valid:e.startsWith(`xapp-`)})}}),(0,g.jsx)(d,{id:`sl-teamId`,label:`Team ID`,value:k,placeholder:`T01234567 (optional)`,onChange:e=>{A(e),H(`slack.teamId`,{value:e,original:U.teamId??``,valid:!0})}}),(0,g.jsx)(l,{id:`sl-channelIds`,label:`Channel IDs`,value:j,placeholder:`C01234567`,error:J,onChange:e=>{M(e),H(`slack.channelIds`,{value:e,original:U.channelIds??[],valid:e.every(v)})}}),(0,g.jsx)(c,{id:`sl-mentionOnly`,label:`Mention only`,value:L,onChange:e=>{R(e),H(`slack.mentionOnly`,{value:e,original:U.mentionOnly!==!1,valid:!0})}}),(0,g.jsx)(c,{id:`sl-replyInThread`,label:`Reply in thread`,value:z,onChange:e=>{B(e),H(`slack.replyInThread`,{value:e,original:U.replyInThread!==!1,valid:!0})}}),(0,g.jsx)(c,{id:`sl-forwardAll`,label:`Forward all`,value:N,onChange:e=>{P(e),H(`slack.forwardAll`,{value:e,original:U.forwardAll!==!1,valid:!0})}}),(0,g.jsx)(c,{id:`sl-allowBots`,label:`Allow bots`,value:F,onChange:e=>{I(e),H(`slack.allowBots`,{value:e,original:!!U.allowBots,valid:!0})}})]})]})}export{y as default,v as isValidSlackConversationId};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./bgtask-badge-CpavV0Jc.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./iframe-renderer-B8k3AvTv.js";export{e as refreshFileWidget};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./memory-D2RbBVO-.js";export{e as refreshMemorySidebar};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,o as t}from"./message-history-Bw2E_b8L.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-CxRwqx86.js";import"./settings-B1FPORO2.js";export{e as loadSettings,t as savePerCli,n as updateSettings};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as e,l as t}from"./settings-core-CxRwqx86.js";export{t as refreshHeaderFromSettingsChange,e as savePerCli};
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import{a as e,i as t,n,r,t as i}from"./api-tVoG39dL.js";import{M as a,O as o,R as s,x as c}from"./render-BkGcpH7z.js";import{n as l}from"./locale-DC-ZsWOf.js";import{a as u,i as d,n as f,o as p,t as m}from"./constants-Df7-7Rky.js";import{a as ee,c as te,l as ne,u as re}from"./pi-settings-DEuKgvIj.js";import{n as ie,r as ae}from"./provider-icons-VDfahiUp.js";function oe(e){if(e.precision===`binary`)return{percent:null,text:e.status===`exhausted`?`Exhausted`:`Available`};let t=Math.max(0,Math.min(100,Math.round(e.percent)));return{percent:t,text:`${t}%`}}function se(e){return e.probeState===`checking`?`checking`:e.binaryInstalled===!0&&e.capabilityReady===!1?`capability-failed`:e.probeState===`stale`?`stale`:e.available===!0&&e.capabilityReady!==!1?`ready`:`unavailable`}function ce(e){return e>=200&&e<300||e===409}function le(e){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=e.engine||`auto`),r&&(r.placeholder=e.geminiKeySet?h(e.geminiKeyLast4):`AIza...`),i){let t=e.geminiModel||`gemini-2.5-flash-lite`;Array.from(i.options).some(e=>e.value===t)?i.value=t:(i.value=`__custom__`,a&&(a.value=t,a.style.display=``))}o&&(o.value=e.whisperModel||`mlx-community/whisper-large-v3-turbo`),s&&(s.value=e.openaiBaseUrl||``),c&&(c.placeholder=e.openaiKeySet?h(e.openaiKeyLast4):`sk-...`),l&&(l.value=e.openaiModel||``),u&&(u.value=e.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 e={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&&(e.stt.geminiApiKey=r.value),c?.value&&(e.stt.openaiApiKey=c.value),console.log(`[stt] saving:`,{engine:e.stt.engine,hasGeminiKey:!!e.stt.geminiApiKey,hasOpenaiKey:!!e.stt.openaiApiKey});try{if(await t(`/api/settings`,`PUT`,e),r?.value){let e=r.value.slice(-4);r.value=``,r.placeholder=h(e)}if(c?.value){let e=c.value.slice(-4);c.value=``,c.placeholder=h(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 h(e){return s(`stt.key.savedPlaceholder`,{last4:e||``})}function g(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 ue(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`||!g(n.telegram)||!g(n.discord))return null;let i=g(n.slack)?n.slack:{configured:!1,activeInbound:!1,sendCapable:!1,reason:`unavailable`};return{activeInbound:r,telegram:n.telegram,discord:n.discord,slack:i}}function de(e){let t=[];return t.push(e.configured?s(`settings.channel.configured`):s(`settings.channel.notConfigured`)),e.sendCapable&&t.push(s(`settings.channel.sendCapable`)),e.activeInbound&&t.push(s(`settings.channel.activeInbound`)),t}function _(e,t,n){let r=de(t).map(e=>`<span class="transport-status-chip">${a(e)}</span>`).join(``),i=t.reason===`not_attach_instance`?`<p class="transport-status-hint">${a(s(`settings.channel.notAttachInstanceHint`))}</p>`:n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${a(s(`settings.channel.sendOnlyHint`))}</p>`:``;return`
|
|
2
|
-
<div class="transport-status-block">
|
|
3
|
-
<div class="transport-status-label">${a(e)}</div>
|
|
4
|
-
<div class="transport-status-chips">${r}</div>
|
|
5
|
-
${i}
|
|
6
|
-
</div>`}function fe(e,t){e.innerHTML=`
|
|
7
|
-
<h4 class="section-title-row">
|
|
8
|
-
<span><span data-icon="radio"></span> ${a(s(`settings.channel.statusTitle`))}</span>
|
|
9
|
-
</h4>
|
|
10
|
-
${_(`Telegram`,t.telegram,!0)}
|
|
11
|
-
${_(`Discord`,t.discord,!0)}
|
|
12
|
-
${_(`Slack`,t.slack,!0)}
|
|
13
|
-
`}async function pe(){let e=document.getElementById(`channelTransportStatus`);if(e)try{let t=ue(await n(`/api/health`));if(!t){e.innerHTML=``,e.style.display=`none`;return}fe(e,t),e.style.display=``}catch{e.innerHTML=``,e.style.display=`none`}}var me={telegram:[{key:`botToken`,settingsId:`tgToken`,secret:!0,example:`8123456789:AAH...`}],discord:[{key:`botToken`,settingsId:`dcToken`,secret:!0,example:`MTIzNDU2Nzg5...`},{key:`guildId`,settingsId:`dcGuildId`,secret:!1,example:`123456789012345678`}],slack:[{key:`botToken`,settingsId:`slBotToken`,secret:!0,prefix:`xoxb-`,example:`xoxb-1234-5678-abcd...`},{key:`appToken`,settingsId:`slAppToken`,secret:!0,optional:!0,prefix:`xapp-`,example:`xapp-1-A01...`}]},he={telegram:`https://t.me/BotFather`,discord:`https://discord.com/developers/applications`,slack:`https://api.slack.com/apps`};function ge(e,t={}){return{channel:e,step:1,draft:{...t},validatedIdentity:null,validatedTeamId:``,error:null,missingScopes:[],missingCapabilities:[],saved:!1}}function v(e){return me[e]}function _e(e,t){for(let n of v(e)){let e=(t[n.key]||``).trim();if(!e){if(n.optional)continue;return n.key===`guildId`?`guild_required`:`token_required`}if(n.prefix&&!e.startsWith(n.prefix))return n.key===`appToken`?`app_prefix`:`bot_prefix`}return null}function ve(e){return e.step===1?null:e.step===2?_e(e.channel,e.draft):e.step===3?e.validatedIdentity?null:`validation_required`:null}function ye(e){return e.step<4&&ve(e)===null}function be(e){if(e.step>=4)return e;let t=ve(e);return t?{...e,error:t}:{...e,step:e.step+1,error:null}}function xe(e){return e.step<=1?e:{...e,step:e.step-1,error:null}}function Se(e,t,n){return(e.draft[t]??``)===n?e:{...e,draft:{...e.draft,[t]:n},validatedIdentity:null,validatedTeamId:``,error:null,missingScopes:[],missingCapabilities:[]}}function Ce(e,t){return t?.ok?{...e,validatedIdentity:t.identity||`ok`,validatedTeamId:t.teamId||``,error:null,missingScopes:[],missingCapabilities:Array.isArray(t.missingCapabilities)?t.missingCapabilities:[]}:{...e,validatedIdentity:null,validatedTeamId:``,error:t?.error||`network`,missingScopes:Array.isArray(t?.missing)?t.missing:[],missingCapabilities:[]}}function we(e){return{...e,saved:!0,step:4,error:null}}function Te(e){let t={channel:e.channel};for(let n of v(e.channel))t[n.key]=(e.draft[n.key]||``).trim();return t}function Ee(e){let t=t=>(e.draft[t]||``).trim();return e.channel===`telegram`?{telegram:{enabled:!0,token:t(`botToken`)}}:e.channel===`discord`?{discord:{enabled:!0,token:t(`botToken`),guildId:t(`guildId`)}}:{slack:{enabled:!0,botToken:t(`botToken`),appToken:t(`appToken`),...e.validatedTeamId?{teamId:e.validatedTeamId}:{}}}}var De=`jaw:notificationsAsked`;function Oe(){try{return localStorage.getItem(De)===`1`}catch{return!0}}function ke(){try{localStorage.setItem(De,`1`)}catch{}}async function Ae(){if(typeof Notification>`u`)return null;if(Notification.permission!==`default`)return Notification.permission;if(Oe())return null;ke();try{return await Notification.requestPermission()}catch{return null}}var y=null,b=null,x=!1,S=!1,C=0;function je(){document.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-onboard-channel]`);t&&(e.preventDefault(),Me(t.getAttribute(`data-onboard-channel`)))}),document.addEventListener(`keydown`,e=>{e.key!==`Escape`||!b||(e.preventDefault(),e.stopImmediatePropagation(),Ne())},!0),document.addEventListener(`keydown`,e=>{if(e.key!==`Tab`||!b||!y)return;let t=[...y.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||!y.contains(i))?(e.preventDefault(),r.focus()):!e.shiftKey&&i===r&&(e.preventDefault(),n.focus())},!0)}function Me(e){if(e!==`telegram`&&e!==`discord`&&e!==`slack`)return;let t={};for(let n of v(e))t[n.key]=Pe(n.settingsId);b=ge(e,t),x=!1,S=!1,C+=1,Ie(),w(),y?.classList.add(`open`)}function Ne(){y?.classList.remove(`open`),b=null}function Pe(e){return document.getElementById(e)?.value.trim()||``}function Fe(e,t){let n=document.getElementById(e);n&&(n.value=t)}function Ie(){y||(y=document.createElement(`div`),y.className=`modal-overlay onboarding-overlay`,y.addEventListener(`click`,e=>{e.target===y&&Ne()}),document.body.appendChild(y))}function Le(e){return e.step===1?`
|
|
14
|
-
<p class="onboarding-guide">${a(s(`onboarding.guide.${e.channel}`))}</p>
|
|
15
|
-
${e.channel===`slack`?`<p class="onboarding-guide">${a(s(`onboarding.slackExistingApp`))}</p>`:``}
|
|
16
|
-
<div class="onboarding-actions">
|
|
17
|
-
<button type="button" class="perm-btn" data-onboard-issuer="1">
|
|
18
|
-
${a(s(`onboarding.openIssuer`))}
|
|
19
|
-
</button>
|
|
20
|
-
</div>`:e.step===2?`${v(e.channel).map(t=>{let n=s(`onboarding.token.${t.key}`)+(t.optional?` (${s(`onboarding.optional`)})`:``);return`
|
|
21
|
-
<div class="onboarding-field">
|
|
22
|
-
<label for="onboard-${t.key}">${a(n)}</label>
|
|
23
|
-
<input id="onboard-${t.key}" data-onboard-field="${t.key}" class="input-sm"
|
|
24
|
-
type="${t.secret?`password`:`text`}"
|
|
25
|
-
placeholder="${a(t.example)}"
|
|
26
|
-
autocomplete="off" spellcheck="false"
|
|
27
|
-
value="${a(e.draft[t.key]||``)}">
|
|
28
|
-
<span class="onboarding-hint">${a(s(`onboarding.hint.${e.channel}.${t.key}`))}</span>
|
|
29
|
-
</div>`}).join(``)}${e.channel===`slack`?`<p class="onboarding-guide">${a(s(`onboarding.slackExistingApp`))}</p>`:``}`:e.step===3?`${x?`<p class="onboarding-guide">${a(s(`onboarding.validating`))}</p>`:e.validatedIdentity?`<p class="onboarding-identity">${a(s(`onboarding.valid`,{identity:e.validatedIdentity}))}</p>`:`<p class="onboarding-guide">${a(s(`onboarding.validateHint`))}</p>`}
|
|
30
|
-
<div class="onboarding-actions">
|
|
31
|
-
<button type="button" class="perm-btn" data-onboard-validate="1" ${x?`disabled`:``}>
|
|
32
|
-
${a(s(`onboarding.validate`))}
|
|
33
|
-
</button>
|
|
34
|
-
</div>`:`<p class="onboarding-next">${a(s(e.saved?`onboarding.next.${e.channel}`:`onboarding.saveHint`))}</p>`}function Re(e){return e.step===4&&e.saved?`<button type="button" class="perm-btn active" data-onboard-close="1">${a(s(`onboarding.close`))}</button>`:`${e.step>1?`<button type="button" class="perm-btn" data-onboard-back="1">${a(s(`onboarding.back`))}</button>`:``}${e.step===4?`<button type="button" class="perm-btn active" data-onboard-save="1">${a(s(`onboarding.save`))}</button>`:`<button type="button" class="perm-btn ${ye(e)?`active`:``}" data-onboard-next="1">${a(s(`onboarding.next`))}</button>`}`}function w(){if(!y||!b)return;let e=b;y.innerHTML=`
|
|
35
|
-
<div class="modal-box onboarding-box" role="dialog" aria-modal="true"
|
|
36
|
-
aria-labelledby="onboarding-title" aria-describedby="onboarding-step-title">
|
|
37
|
-
<div class="onboarding-head">
|
|
38
|
-
<span class="onboarding-title" id="onboarding-title">${a(s(`onboarding.title.${e.channel}`))}</span>
|
|
39
|
-
<span class="onboarding-progress" role="status" aria-live="polite"
|
|
40
|
-
aria-label="${a(s(`onboarding.progressLabel`,{step:e.step,total:4}))}">${e.step}/4</span>
|
|
41
|
-
<button type="button" class="help-trigger onboarding-close" data-onboard-close="1"
|
|
42
|
-
aria-label="${a(s(`onboarding.close`))}">✕</button>
|
|
43
|
-
</div>
|
|
44
|
-
<div class="onboarding-steps" aria-hidden="true">
|
|
45
|
-
${Array.from({length:4},(t,n)=>`<span class="onboarding-dot${n+1===e.step?` is-active`:``}${n+1<e.step?` is-done`:``}"></span>`).join(``)}
|
|
46
|
-
</div>
|
|
47
|
-
<div class="onboarding-step-title" id="onboarding-step-title">${a(s(`onboarding.step.${e.step}`))}</div>
|
|
48
|
-
${Le(e)}
|
|
49
|
-
<div class="onboarding-error" role="alert" style="display:${e.error?``:`none`}">
|
|
50
|
-
${e.error?a(s(`onboarding.error.${e.error}`)):``}
|
|
51
|
-
${e.missingScopes.length?`<span class="onboarding-scopes">${a(e.missingScopes.join(`, `))}</span>`:``}
|
|
52
|
-
</div>
|
|
53
|
-
<div class="onboarding-capability-warning" role="status" style="display:${e.missingCapabilities.length?``:`none`}">
|
|
54
|
-
${e.missingCapabilities.length?a(s(`onboarding.warning.missingCapabilities`,{capabilities:e.missingCapabilities.join(`, `)})):``}
|
|
55
|
-
</div>
|
|
56
|
-
<div class="onboarding-actions onboarding-footer">${Re(e)}</div>
|
|
57
|
-
</div>`,y.querySelectorAll(`[data-onboard-close]`).forEach(e=>e.addEventListener(`click`,Ne)),y.querySelector(`[data-onboard-issuer]`)?.addEventListener(`click`,()=>{b&&window.open(he[b.channel],`_blank`,`noopener`)}),y.querySelector(`[data-onboard-back]`)?.addEventListener(`click`,()=>{b&&(b=xe(b),w())}),y.querySelector(`[data-onboard-next]`)?.addEventListener(`click`,()=>{b&&(Ve(),b=be(b),w())}),y.querySelector(`[data-onboard-validate]`)?.addEventListener(`click`,()=>{He()}),y.querySelector(`[data-onboard-save]`)?.addEventListener(`click`,()=>{Ue()}),y.querySelectorAll(`[data-onboard-field]`).forEach(e=>{e.addEventListener(`input`,()=>{if(!b)return;let t=e.getAttribute(`data-onboard-field`)||``;b=Se(b,t,e.value)}),e.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),ze())})}),Be()}function ze(){if(b){if(b.step===3){He();return}if(b.step===4){b.saved||Ue();return}Ve(),b=be(b),w()}}function Be(){let e=[...y?.querySelectorAll(`[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)}function Ve(){if(b)for(let e of y?.querySelectorAll(`[data-onboard-field]`)??[]){let t=e.getAttribute(`data-onboard-field`)||``;b=Se(b,t,e.value)}}async function He(){if(!b||x)return;let e=C;x=!0,w();let t=await n(`/api/channels/validate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(Te(b))});e===C&&(x=!1,b&&(b=Ce(b,t||{ok:!1,error:`network`}),w()))}async function Ue(){if(!b||S)return;let e=ve({...b,step:3});if(e){b={...b,step:3,error:e},w();return}for(let e of v(b.channel))Fe(e.settingsId,(b.draft[e.key]||``).trim());let n=C;S=!0;try{await t(`/api/settings`,`PUT`,Ee(b))}finally{S=!1}n!==C||!b||(b=we(b),w(),pe(),Ae())}function We(e){return e.trim().length>0}function Ge(e,t){return e.trim().length>0&&t.trim().length>0}function Ke(e){return e.trim().length>0}function qe(e){return e.trim().startsWith(`xoxb-`)}function Je(e){return e.trim().startsWith(`xapp-`)}function T(e){return document.getElementById(e)?.value??``}function E(e){(e===`telegram`?We(T(`tgToken`)):e===`discord`?Ge(T(`dcToken`),T(`dcGuildId`)):Ke(T(`slBotToken`)))||Me(e)}async function Ye(){let e=document.getElementById(`tgToken`)?.value.trim()||``,n=document.getElementById(`tgChatIds`)?.value.trim()||``;await t(`/api/settings`,`PUT`,{telegram:{token:e,allowedChatIds:n?n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>!isNaN(e)):[]}})}async function Xe(e){document.getElementById(`tgOn`)?.classList.toggle(`active`,e),document.getElementById(`tgOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{telegram:{enabled:e}}),e&&E(`telegram`)}async function Ze(e){document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,e),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{telegram:{forwardAll:e}})}async function Qe(e){document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,e),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{telegram:{mentionOnly:e}})}function $e(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 et(){let e=document.getElementById(`dcToken`)?.value.trim()||``,n=document.getElementById(`dcGuildId`)?.value.trim()||``,r=document.getElementById(`dcChannelIds`)?.value.trim()||``;await t(`/api/settings`,`PUT`,{discord:{token:e,guildId:n,channelIds:r?r.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function tt(e){document.getElementById(`dcOn`)?.classList.toggle(`active`,e),document.getElementById(`dcOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{discord:{enabled:e}}),e&&E(`discord`)}async function nt(e){document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,e),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{discord:{forwardAll:e}})}async function rt(e){document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,e),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{discord:{allowBots:e}})}async function it(e){document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,e),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{discord:{mentionOnly:e}})}function at(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)}var ot=!1;function st(){ot||(ot=!0,document.getElementById(`slack-copy-manifest`)?.addEventListener(`click`,async e=>{let t=e.currentTarget;try{let e=(await n(`/api/slack/manifest`))?.yaml||``;if(!e)throw Error(`empty manifest`);await navigator.clipboard.writeText(e);let r=t.textContent||``;t.textContent=s(`settings.slack.guide.copyManifestDone`),setTimeout(()=>{t.textContent=r},2e3)}catch{t.textContent=s(`settings.slack.guide.copyManifestFail`),setTimeout(()=>{t.textContent=s(`settings.slack.guide.copyManifest`)},2500)}}),document.getElementById(`slack-open-apps`)?.addEventListener(`click`,()=>{window.open(`https://api.slack.com/apps?new_app=1`,`_blank`,`noopener`)}),ct(`slBotToken`,`slack-bot-token-error`,qe),ct(`slAppToken`,`slack-app-token-error`,Je))}function ct(e,t,n){let r=document.getElementById(e),i=document.getElementById(t);if(!r||!i)return;let a=()=>{let e=r.value.trim().length>0&&!n(r.value);i.style.display=e?``:`none`,r.classList.toggle(`input-error`,e)};r.addEventListener(`blur`,a),r.addEventListener(`input`,()=>{i.style.display!==`none`&&a()})}async function lt(){let e=document.getElementById(`slBotToken`)?.value.trim()||``,n=document.getElementById(`slAppToken`)?.value.trim()||``,r=document.getElementById(`slTeamId`)?.value.trim()||``,i=document.getElementById(`slChannelIds`)?.value.trim()||``,a=document.getElementById(`slAttachPort`)?.value.trim()||``;await t(`/api/settings`,`PUT`,{slack:{botToken:e,appToken:n,teamId:r,channelIds:i?i.split(`,`).map(e=>e.trim()).filter(Boolean):[],attachPort:a}})}async function ut(e){document.getElementById(`slOn`)?.classList.toggle(`active`,e),document.getElementById(`slOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{slack:{enabled:e}}),e&&E(`slack`)}async function dt(e){document.getElementById(`slForwardOn`)?.classList.toggle(`active`,e),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{slack:{forwardAll:e}})}async function ft(e){document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,e),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{slack:{allowBots:e}})}async function pt(e){document.getElementById(`slMentionOn`)?.classList.toggle(`active`,e),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{slack:{mentionOnly:e}})}async function mt(e){document.getElementById(`slThreadOn`)?.classList.toggle(`active`,e),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!e),await t(`/api/settings`,`PUT`,{slack:{replyInThread:e}})}function ht(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=document.getElementById(`slAttachPort`);o&&(o.value=t.attachPort||``);let s=t.forwardAll!==!1;document.getElementById(`slForwardOn`)?.classList.toggle(`active`,s),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!s);let c=!!t.allowBots;document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,c),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!c);let l=t.mentionOnly!==!1;document.getElementById(`slMentionOn`)?.classList.toggle(`active`,l),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!l);let u=t.replyInThread!==!1;document.getElementById(`slThreadOn`)?.classList.toggle(`active`,u),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!u)}async function gt(e){document.getElementById(`chTelegram`)?.classList.toggle(`active`,e===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,e===`discord`),document.getElementById(`chSlack`)?.classList.toggle(`active`,e===`slack`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,e===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,e===`discord`?``:`none`),document.getElementById(`channelSlackSettings`)?.style.setProperty(`display`,e===`slack`?``:`none`),await t(`/api/settings`,`PUT`,{channel:e}),await pe(),E(e)}function _t(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`),pe()}function vt(e){let t=document.getElementById(`fallbackOrderList`);if(!t)return;let n=Object.keys(e.perCli||{}),r=e.fallbackOrder||[],i=Math.min(n.length-1,3),o=``;for(let e=0;e<i;e++){let t=r[e]||``,i=n.map(e=>`<option value="${a(e)}" ${e===t?`selected`:``}>${a(u(e)?.label||ae(e))}</option>`).join(``);o+=`
|
|
58
|
-
<div class="settings-row sub-row">
|
|
59
|
-
<label style="min-width:60px">Fallback ${e+1}</label>
|
|
60
|
-
<select id="fallback${e}"
|
|
61
|
-
style="font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1">
|
|
62
|
-
<option value="">${s(`settings.none`)}</option>
|
|
63
|
-
${i}
|
|
64
|
-
</select>
|
|
65
|
-
</div>`}t.innerHTML=o}async function yt(){await t(`/api/settings`,`PUT`,{fallbackOrder:[...document.querySelectorAll(`#fallbackOrderList select`)].map(e=>e.value).filter(Boolean)})}function bt(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 xt(e){return Object.values(e).filter(e=>e.command===`npx`||e.command===`uv`||e.command===`uvx`).length}var D=null;async function O(){try{let e=await n(`/api/mcp`);if(!e)return;D=e;let t=document.getElementById(`mcpServerList`);if(!t)return;let r=Object.entries(e.servers||{});if(!r.length){t.textContent=s(`mcp.noServers`),St(0);return}t.innerHTML=r.map(([e,t])=>{let n=bt(t),r=t.url||[t.command,...(t.args||[]).slice(0,2)].filter(Boolean).map(e=>a(e)).join(` `),i=n?` <span style="opacity:.5;font-size:0.85em">[${a(n)}]</span>`:``;return`<div style="padding:2px 0">• <b>${a(e)}</b> <span style="opacity:.6">${r}</span>${i}</div>`}).join(``),St(xt(e.servers))}catch{}}function St(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function Ct(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=s(`mcp.syncing`);try{let n=await t(`/api/mcp/sync`,`POST`,{});if(!n){e.innerHTML=`${o.error} sync failed`;return}let r=n.results||{};e.innerHTML=Object.entries(r).map(([e,t])=>`${t?o.check:o.skip} ${a(e)}`).join(` `)}catch(t){e.innerHTML=`${o.error} ${a(t.message)}`}}}async function wt(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=s(`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>${a(e)}</b>: ${a(t.status)}${t.bin?` ${o.arrowRight} `+a(t.bin):``}`).join(`<br>`),O()}catch(t){e.innerHTML=`${o.error} ${a(t.message)}`}}}var k=null,A=null,j=null,M=null,N=null,P=null,F=`local`,I=!1,Tt=[];function Et(){if(k)return;k=document.createElement(`div`),k.id=`mcpModal`,k.className=`modal-overlay mcp-modal-overlay`,k.setAttribute(`role`,`presentation`),k.setAttribute(`aria-hidden`,`true`),k.addEventListener(`click`,e=>{e.target===k&&V()});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`,()=>Ft());let i=document.createElement(`button`);i.type=`button`,i.className=`btn-modal-close`,i.setAttribute(`aria-label`,`Close`),i.textContent=`x`,i.addEventListener(`click`,()=>V());let a=document.createElement(`div`);a.style.cssText=`display:flex;align-items:center;gap:6px`,a.append(n,r),t.append(a,i),A=document.createElement(`div`),A.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=L(`Active Servers`,!0),c=L(`Add New`,!1),l=L(`Browse`,!1);Tt=[s,c,l],s.addEventListener(`click`,()=>R(`active`)),c.addEventListener(`click`,()=>R(`add`)),l.addEventListener(`click`,()=>R(`browse`)),o.append(s,c,l),j=document.createElement(`div`),P=document.createElement(`div`),P.style.display=`none`,P.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,M=document.createElement(`div`),M.style.display=`none`,M.innerHTML=Dt(),M.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{F=e.dataset.mcpSubtab,Ot()})}),N=M.querySelector(`#mcpAddError`);let u=M.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void Pt());let d=M.querySelector(`[data-action="closeMcpModal"]`);d&&d.addEventListener(`click`,()=>V()),A.append(o,j,P,M);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`,()=>V()),f.append(p),e.append(t,A,f),k.append(e),document.body.append(k)}function L(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 Dt(){return`
|
|
66
|
-
<div style="display:flex;gap:4px;margin-bottom:8px">
|
|
67
|
-
<button type="button" class="btn-clear btn-tab is-active" data-mcp-subtab="local">Local</button>
|
|
68
|
-
<button type="button" class="btn-clear btn-tab" data-mcp-subtab="remote">Remote</button>
|
|
69
|
-
</div>
|
|
70
|
-
<div id="mcpAddLocal">
|
|
71
|
-
<div class="settings-row"><label>Name</label><input type="text" id="mcpAddName" placeholder="my-server"></div>
|
|
72
|
-
<div class="settings-row"><label>Command</label><input type="text" id="mcpAddCommand" placeholder="npx"></div>
|
|
73
|
-
<div class="settings-row"><label>Args (comma separated)</label><input type="text" id="mcpAddArgs" placeholder="-y, @upstash/context7-mcp"></div>
|
|
74
|
-
<div class="settings-row"><label>Env (KEY=value per line)</label><textarea id="mcpAddEnv" rows="2" placeholder="API_KEY=xxx"></textarea></div>
|
|
75
|
-
</div>
|
|
76
|
-
<div id="mcpAddRemote" style="display:none">
|
|
77
|
-
<div class="settings-row"><label>Name</label><input type="text" id="mcpAddRemoteName" placeholder="my-api"></div>
|
|
78
|
-
<div class="settings-row"><label>URL</label><input type="text" id="mcpAddUrl" placeholder="https://mcp.example.com/sse"></div>
|
|
79
|
-
<div class="settings-row"><label>Headers (KEY=value per line)</label><textarea id="mcpAddHeaders" rows="2"></textarea></div>
|
|
80
|
-
</div>
|
|
81
|
-
<div id="mcpAddError" class="text-error text-xs py-1" style="display:none"></div>
|
|
82
|
-
<div style="display:flex;gap:8px;margin-top:12px;justify-content:flex-end">
|
|
83
|
-
<button type="button" class="btn-clear" data-action="closeMcpModal">Cancel</button>
|
|
84
|
-
<button type="button" class="btn-clear btn-save" data-action="mcpAddAndSync">Add & Sync</button>
|
|
85
|
-
</div>`}function R(e){j&&(j.style.display=e===`active`?``:`none`),M&&(M.style.display=e===`add`?``:`none`),P&&(P.style.display=e===`browse`?``:`none`),Tt.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&kt(),e===`add`&&jt(),e===`browse`&&It()}function Ot(){let e=M?.querySelector(`#mcpAddLocal`),t=M?.querySelector(`#mcpAddRemote`);e&&(e.style.display=F===`local`?``:`none`),t&&(t.style.display=F===`remote`?``:`none`),M?.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.classList.toggle(`is-active`,e.dataset.mcpSubtab===F)})}function kt(){if(!j||!D)return;let e=Object.entries(D.servers||{});if(!e.length){j.innerHTML=`<p style="opacity:.5">No active MCP servers.</p>`;return}j.innerHTML=e.map(([e,t])=>{let n=bt(t),r=n?`<span class="mcp-active-tag">[${a(n)}]</span>`:``,i=t.command?a(t.command)+(t.args?.length?` `+t.args.map(e=>a(e)).join(` `):``):``,o=t.url?a(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>`),i&&(l+=`<div class="mcp-active-detail">Command: ${i}</div>`),s.length&&(l+=`<div class="mcp-active-detail">Env: ${s.map(e=>a(e)).join(`, `)}</div>`),c.length&&(l+=`<div class="mcp-active-detail">Headers: ${c.map(e=>a(e)).join(`, `)}</div>`),`<div class="mcp-active-row">
|
|
86
|
-
<div style="flex:1">
|
|
87
|
-
<div style="display:flex;align-items:center;gap:6px">
|
|
88
|
-
<span class="mcp-active-name">${a(e)}</span>
|
|
89
|
-
${r}
|
|
90
|
-
</div>
|
|
91
|
-
${l}
|
|
92
|
-
</div>
|
|
93
|
-
<button type="button" class="btn-clear mcp-active-remove" data-mcp-remove="${a(e)}">Remove</button>
|
|
94
|
-
</div>`}).join(``),j.querySelectorAll(`[data-mcp-remove]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.mcpRemove;t&&At(t)})})}async function At(e){if(!D)return;let n={...D.servers};delete n[e];try{await t(`/api/mcp`,`PUT`,{...D,servers:n}),await t(`/api/mcp/sync`,`POST`,{}),await O(),kt()}catch(e){z(e.message)}}function jt(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(M??document).querySelector(`#${e}`);t&&(t.value=``)}Mt()}function z(e){N&&(N.style.display=`block`,N.textContent=e)}function Mt(){N&&(N.style.display=`none`)}function Nt(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 B(e){return(M??document).querySelector(`#${e}`)?.value?.trim()??``}async function Pt(){if(!D)return;let e=F===`remote`,n,r;if(e){n=B(`mcpAddRemoteName`);let e=B(`mcpAddUrl`),t=B(`mcpAddHeaders`);if(!n){z(`Name is required.`);return}if(!e){z(`URL is required.`);return}r={url:e};let i=Nt(t);Object.keys(i).length>0&&(r.headers=i)}else{n=B(`mcpAddName`);let e=B(`mcpAddCommand`),t=B(`mcpAddArgs`),i=B(`mcpAddEnv`);if(!n){z(`Name is required.`);return}if(!e){z(`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=Nt(i);Object.keys(o).length>0&&(r.env=o)}if(D.servers[n]){z(`Server "${n}" already exists.`);return}try{await t(`/api/mcp`,`PUT`,{...D,servers:{...D.servers,[n]:r}}),await t(`/api/mcp/sync`,`POST`,{}),await O(),V()}catch(e){z(e.message)}}function Ft(){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=`
|
|
95
|
-
<h4>MCP Server</h4>
|
|
96
|
-
<p>MCP (Model Context Protocol) adds capabilities to AI agents — like installing apps on a phone.</p>
|
|
97
|
-
|
|
98
|
-
<h4>Local Server</h4>
|
|
99
|
-
<p>Runs on your machine. Provide a command and args.</p>
|
|
100
|
-
<pre>Name: context7
|
|
101
|
-
Command: npx
|
|
102
|
-
Args: -y, @upstash/context7-mcp</pre>
|
|
103
|
-
|
|
104
|
-
<h4>Remote Server</h4>
|
|
105
|
-
<p>Connects to an external URL (SSE or Streamable HTTP).</p>
|
|
106
|
-
<pre>Name: my-api
|
|
107
|
-
URL: https://mcp.example.com/sse</pre>
|
|
108
|
-
|
|
109
|
-
<h4>Server Types</h4>
|
|
110
|
-
<p><code>[npx]</code> Node.js package (npx -y ...)<br>
|
|
111
|
-
<code>[uvx]</code> Python package (uvx ...)<br>
|
|
112
|
-
<code>[docker]</code> Docker container<br>
|
|
113
|
-
<code>[remote]</code> External URL</p>
|
|
114
|
-
|
|
115
|
-
<h4>After Adding</h4>
|
|
116
|
-
<p>The server is automatically synced to all installed CLIs (Claude, Codex, Gemini, Cursor, Copilot, OpenCode).</p>
|
|
117
|
-
<p><code>Install bundle</code> converts npx/uvx servers to global binaries for faster startup.</p>
|
|
118
|
-
|
|
119
|
-
<div style="text-align:right;margin-top:12px">
|
|
120
|
-
<button type="button" class="btn-save" id="mcpHelpClose">OK</button>
|
|
121
|
-
</div>
|
|
122
|
-
`,t.append(n),document.body.append(t),n.querySelector(`#mcpHelpClose`)?.addEventListener(`click`,()=>t.remove())}async function It(){if(P){P.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,D||await O();try{let e=await n(`/api/mcp/registry`);if(!e?.entries?.length&&!e?.builtins?.length){P.innerHTML=`<p style="opacity:.5">No MCP servers in registry.</p>`;return}let t=D?Object.keys(D.servers):[],r=``;r+=e.entries.map(e=>{let n=t.includes(e.id),r=e.tags?.slice(0,3).map(e=>`<span style="background:var(--border);padding:1px 4px;border-radius:3px;font-size:10px">${a(e)}</span>`).join(` `)||``;return`<div style="padding:10px 0;border-bottom:1px solid var(--border)">
|
|
123
|
-
<div style="display:flex;align-items:center;gap:8px">
|
|
124
|
-
<b>${a(e.name)}</b>
|
|
125
|
-
<span style="opacity:.5;font-size:0.85em">[${a(e.type)}]</span>
|
|
126
|
-
<span style="opacity:.4;font-size:0.85em">${a(e.category)}</span>
|
|
127
|
-
${n?`<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="${a(e.id)}">+ Install</button>`}
|
|
128
|
-
</div>
|
|
129
|
-
<p style="margin:4px 0 4px 0;font-size:12px;opacity:.75">${a(e.description)}</p>
|
|
130
|
-
<div style="display:flex;gap:4px;align-items:center">
|
|
131
|
-
${r}
|
|
132
|
-
${e.url?`<a href="${a(e.url)}" target="_blank" rel="noopener noreferrer" style="font-size:10px;opacity:.5;margin-left:auto">source</a>`:``}
|
|
133
|
-
</div>
|
|
134
|
-
</div>`}).join(``),e.builtins?.length&&(r+=`<div style="margin-top:16px;padding-top:12px;border-top:2px solid var(--border)">
|
|
135
|
-
<h4 style="font-size:12px;opacity:.6;margin:0 0 8px">Harness Built-ins (omo / omx)</h4>
|
|
136
|
-
<p style="font-size:11px;opacity:.4;margin:0 0 8px">Not installable via registry — built into harness runtimes. Listed for reference.</p>`,r+=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)">
|
|
137
|
-
<div style="display:flex;align-items:center;gap:6px">
|
|
138
|
-
<b style="font-size:12px">${a(e.name)}</b>
|
|
139
|
-
<span style="opacity:.4;font-size:0.8em">${a(e.harness)}</span>
|
|
140
|
-
${t?`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-builtin-install="${a(e.id)}">+ Install standalone</button>`:``}
|
|
141
|
-
</div>
|
|
142
|
-
<p style="margin:2px 0;font-size:11px;opacity:.65">${a(e.description)}</p>
|
|
143
|
-
</div>`}).join(``),r+=`</div>`),P.innerHTML=r,P.querySelectorAll(`[data-registry-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.registryInstall,r=e.entries.find(e=>e.id===n);r&&Lt(r,t)})}),P.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&&Lt({id:r.id,name:r.name,description:r.description,category:`harness`,type:`remote`,config:r.standalone_config,tags:[],url:r.source},t)})})}catch(e){P.innerHTML=`<p style="color:var(--color-error)">${a(e.message)}</p>`}}}async function Lt(e,n){if(D){n.disabled=!0,n.textContent=`Installing...`;try{let r=e.config;await t(`/api/mcp`,`PUT`,{...D,servers:{...D.servers,[e.id]:r}}),await t(`/api/mcp/sync`,`POST`,{}),await O(),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 Rt(){Et(),k?.classList.add(`open`),k?.setAttribute(`aria-hidden`,`false`),I=!0,R(`active`)}function V(){I&&(k?.classList.remove(`open`),k?.setAttribute(`aria-hidden`,`true`),I=!1,jt(),document.getElementById(`mcpHelpOverlay`)?.remove())}var zt=!1;function Bt(){zt||(zt=!0,document.addEventListener(`keydown`,e=>{if(document.getElementById(`mcpHelpOverlay`)&&e.key===`Escape`){e.preventDefault(),document.getElementById(`mcpHelpOverlay`)?.remove();return}I&&e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),V())},!0))}var Vt=/^\/(?:Users|home)\/[^/]+/,Ht=32;function Ut(e){return e.replace(Vt,`~`)}function Wt(e){if(e.length<=Ht)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function Gt(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${Wt(Ut(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
|
|
144
|
-
`)}}function Kt(){return document.getElementById(`headerGitStatus`)}function qt(){let e=Kt();e&&(e.hidden=!0,e.textContent=``,e.removeAttribute(`title`),e.removeAttribute(`aria-label`))}function Jt(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 Yt(e){let t=Kt();if(!t)return;let n=Jt(e);if(!n){qt();return}t.hidden=!1,t.textContent=n.text,t.title=n.title,t.setAttribute(`aria-label`,n.title)}async function Xt(){Yt(await n(`/api/project/git-summary`))}function Zt(e){(Array.isArray(e.changedKeys)?e.changedKeys:[]).includes(`projectDirs`)&&Xt()}var H=null;function Qt(e){return!e||typeof e!=`object`?null:`settings`in e&&e.settings?e.settings:`data`in e&&e.data?e.data:e}async function $t(t){if(t.runtimeDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`신규 설치의 기본 런타임이 Codex App으로 변경되었습니다. 지금 Codex App을 사용하시겠습니까?`)?`accept`:`keep`;try{let r=await e(),a=await fetch(`${i}/api/settings/runtime-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(ce(a.status))return Qt(o)??t;window.alert(`런타임 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`런타임 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}async function en(t){if(t.multiSessionDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`이제 대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 2로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 켤까요?`)?`accept`:`keep`;try{let r=await e(),a=await fetch(`${i}/api/settings/multi-session-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(ce(a.status))return Qt(o)??t;window.alert(`세션 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`세션 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}function U(e){let t=document.getElementById(`headerCli`);if(!t)return;let n=ie(e),r=G(e);t.innerHTML=n?`${n} ${a(r)}`:a(r)}function W(e){let t=document.getElementById(`headerProject`);if(!t)return;tn(t),t.hidden=!1;let n=Gt(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 tn(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`),W(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 nn(e){typeof e.cli==`string`&&e.cli&&U(e.cli),`projectDirs`in e&&W(e.projectDirs),Zt(e)}function G(e){return u(e)?.label||ae(e)||e}function rn(e){let t=e.finally(()=>{H===t&&(H=null)});return H=t,t}async function an(){let e=H;e&&await e}function K(e){return e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function q(e){return document.getElementById(`model`+K(e))}function on(e){return document.getElementById(`customModel`+K(e))}function sn(e){return document.getElementById(`effort`+K(e))}function J(e,t,{includeCustom:n=!1,includeDefault:r=!1,selected:i=``}={}){if(!e)return;let o=r?`<option value="default">default</option>`:``,c=n?`<option value="__custom__">${s(`model.customOption`)}</option>`:``;e.innerHTML=o+(t||[]).map(e=>`<option value="${a(e)}">${a(e)}</option>`).join(``)+c,i&&Array.from(e.options).some(e=>e.value===i)&&(e.value=i)}function Y(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 cn(e=null){let t=d(),n=document.getElementById(`selCli`);if(n){let r=e?.cli||n.value||t[0]||`claude`,i=e=>f.includes(e),o=!i(r)&&t.includes(r),c=n.dataset.expanded===`1`,l=t.filter(i),d=t.filter(e=>!i(e)),p=l.length===0||o||c,m=l.map(e=>{let t=u(e)?.label||e;return`<option value="${a(e)}">${a(t)}</option>`}).join(``);d.length>0&&(p?(m+=`<option disabled>──────</option>`,m+=d.map(e=>{let t=u(e)?.label||e;return`<option value="${a(e)}">${a(t)}</option>`}).join(``)):m+=`<option value="__show_more__">${s(`cli.showMore`)}</option>`),n.innerHTML=m,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="${a(e)}">${a(G(e))}</option>`).join(``),Array.from(r.options).some(e=>e.value===n)&&(r.value=n)}}function X(e,t){return(t||``).trim()}function ln(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 un(e,t,n){let r=(t||``).trim();return(n?e?.defaultEffortByModelByProvider?.[n]?.[r]:void 0)??e?.defaultEffortByModel?.[r]??``}function dn(e=null){for(let t of d()){let n=u(t),r=t!==`pi`&&n?.providers?.length?Q(t):``,i=q(t);if(i)if(n?.modelNote)i.innerHTML=`<option value="">${a(n.modelNote)}</option>`,i.title=n.modelNote,i.disabled=!0;else{let a=X(t,e?.perCli?.[t]?.model||i.value||``),o=t===`pi`&&e?.perCli?.pi?.provider||``,s=t===`pi`&&o?ee(e?.pi,o):[];J(i,t===`pi`&&s.length?s:r?n?.modelsByProvider?.[r]||m[t]||[]:m[t]||[],{includeCustom:!0,selected:a}),a&&!Array.from(i.options).some(e=>e.value===a)&&(Y(i,a),i.value=a),i.disabled=!1}let o=sn(t);if(o){let i=r?n?.effortsByProvider?.[r]||[]:null,s=X(t,e?.perCli?.[t]?.model||q(t)?.value||``),c=ln(n,s,i,r||void 0),l=[``].concat(c),u=e?.perCli?.[t]?.effort??o.value??``,d=!u||c.includes(u)?u:un(n,s,r||void 0),f=[...new Set(l)],p=f.length===1&&!f[0]&&n?.effortNote?n.effortNote:`— none`;o.innerHTML=f.map(e=>e?`<option value="${a(e)}">${a(e)}</option>`:`<option value="">${a(p)}</option>`).join(``),n?.effortNote&&(o.title=n.effortNote),o.disabled=f.length===1&&!f[0],Array.from(o.options).some(e=>e.value===d)&&(o.value=d)}}}function fn(){return document.getElementById(`selEffort`)?.value||``}function Z(e,t=``,n){let r=document.getElementById(`selEffort`);if(!r)return;let i=u(e),o=e!==`pi`&&i?.providers?.length?Q(e):``,s=o?i?.effortsByProvider?.[o]||[]:null,c=X(e,n??document.getElementById(`selModel`)?.value??``),l=ln(i,c,s,o||void 0);if(l.length===0){let e=i?.effortNote||`— none`;r.innerHTML=`<option value="">${a(e)}</option>`,r.title=e,r.disabled=!0;return}let d=[``].concat(l);r.innerHTML=[...new Set(d)].map(e=>e?`<option value="${a(e)}">${a(e)}</option>`:`<option value="">— none</option>`).join(``),r.disabled=!1,r.title=i?.effortNote||``;let f=!t||l.includes(t)?t:un(i,c,o||void 0);Array.from(r.options).some(e=>e.value===f)&&(r.value=f)}function pn(e,t,n){return e?(e.innerHTML=n.map(e=>`<option value="${a(e)}">${a(ae(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=u(e);return t?.value||n?.value||r?.defaultProvider||``}function mn(e,t){let n=document.getElementById(`cliProviderWrap`),r=document.getElementById(`selCliProvider`),i=document.getElementById(`cliProviderLabel`),a=u(t);if(!(t!==`pi`&&(a?.providers?.length??0)>0))return n&&(n.style.display=`none`),a?.defaultProvider||``;i&&(i.textContent=`Provider`);let o=pn(r,e?.perCli?.[t]?.provider||r?.value||a?.defaultProvider||``,a.providers);return n&&(n.style.display=``),o}async function hn(){await p();let e=await n(`/api/settings`);if(!e)return;e=await $t(e),e=await en(e),l(e.locale??``),cn(e),te(e.pi),re(e.pi,e.perCli?.pi?.provider),e.perCli?.pi?.provider&&ne(e.perCli.pi.provider,e.pi),mn(e,e.cli||``),dn(e);let t=document.getElementById(`selCli`);t&&Array.from(t.options).some(t=>t.value===e.cli)&&(t.value=e.cli,t.dataset.prev=e.cli);let r=document.getElementById(`inpCwd`);r&&(r.textContent=e.workingDir);let i=document.getElementById(`headerCli`);if(i){let t=ie(e.cli),n=G(e.cli);i.innerHTML=t?`${t} ${a(n)}`:a(n)}if(W(e.projectDirs),await Xt(),_n(e.permissions,!1),e.perCli)for(let[t,n]of Object.entries(e.perCli)){let e=q(t),r=sn(t);if(e&&n.model){let r=X(t,n.model);Y(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)}}Cn(!1);let o=e.activeOverrides?.[e.cli]||{},s=e.perCli?.[e.cli]||{},c=o.model||s.model,u=o.effort??s.effort??``,d=document.getElementById(`selModel`);if(c&&d){let t=X(e.cli,c);t&&!Array.from(d.options).some(e=>e.value===t)&&Y(d,t),d.value=t}Z(e.cli,u),$e(e),at(e),ht(e),_t(e),vt(e),O(),le(e.stt||{})}async function gn(){let e=document.getElementById(`selCli`)?.value||`claude`,n={cli:e},r=u(e);return e!==`pi`&&r?.providers?.length&&(n.perCli={[e]:{provider:Q(e)}}),rn((async()=>{let r=await t(`/api/settings`,`PUT`,n);if(!r){await hn();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),U(i),c([`instances`],`active-cli-changed`)})())}function _n(e,t=!0){t&&r(`/api/settings`,`PUT`,{permissions:`auto`})}function vn(e){let t=q(e);return t?t.value===`__custom__`?on(e)?.value?.trim()||t.options[0]?.value||`default`:t.value:`default`}function yn(e,t){let n=on(e);n&&(t.value===`__custom__`?(n.style.display=`block`,n.focus()):(n.style.display=`none`,e===`claude`&&bn(t.value),$()))}function bn(e){let t=!!(e&&e.endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,t),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!t)}function xn(e,t){let n=t.value.trim();if(!n)return;let r=q(e);r&&(Y(r,n),r.value=n,t.style.display=`none`,e===`claude`&&bn(n),$())}function Sn(){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),dn(null),u(e)?.providers?.length&&Cn(!1),$()}async function $(){let e={};for(let t of d()){if(!q(t))continue;let n=sn(t),r={model:vn(t),effort:n?n.value:``},i=u(t);if(t!==`pi`&&i?.providers?.length&&(r.provider=Q(t)),t===`pi`){let e=document.getElementById(`providerPi`);e?.value&&(r.provider=e.value)}if(t===`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)}e[t]=r}await t(`/api/settings`,`PUT`,{perCli:e})}function Cn(e=!0){let t=document.getElementById(`selCli`);if(!t)return;if(t.value===`__show_more__`){let e=t.dataset.prev||d()[0]||`claude`;t.dataset.expanded=`1`,cn(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`,i=mn(null,r),o=u(r),c=i&&o?.modelsByProvider?.[i]?o.modelsByProvider[i]:m[r]||[],l=document.getElementById(`selModel`);o?.modelNote&&l?(l.innerHTML=`<option value="">${a(o.modelNote)}</option>`,l.title=o.modelNote,l.disabled=!0):(J(l,c,{includeCustom:!0,includeDefault:!0}),l&&(l.disabled=!1,l.title=``)),U(r),Z(r);let f=document.getElementById(`selModelCustom`);f&&f.remove();let p=document.createElement(`input`);if(p.type=`text`,p.id=`selModelCustom`,p.className=`custom-model-input`,p.placeholder=s(`model.placeholder`),p.style.display=`none`,p.onchange=function(){let e=this.value.trim();!e||!l||(Y(l,e),l.value=e,this.style.display=`none`,Z(r,fn(),e),wn())},!l){e&&gn();return}l.parentElement?.appendChild(p),l.onchange=function(){this.value===`__custom__`?(p.style.display=`block`,p.focus()):(p.style.display=`none`,Z(r,fn(),this.value),wn())},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&&l){let t=u(r);if(r!==`pi`&&t?.providers?.length&&(e.perCli?.[r]?.provider||t.defaultProvider||``)!==Q(r)){Z(r,a);return}let n=X(r,i);Y(l,n),l.value=n}Z(r,a)}),e&&gn()}async function wn(){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},o=u(e);e!==`pi`&&o?.providers?.length&&(a.perCli={[e]:{provider:Q(e)}}),await t(`/api/settings`,`PUT`,a)&&c([`instances`],`active-cli-changed`)}function Tn(){let e=m[document.getElementById(`flushCli`)?.value||document.getElementById(`selCli`)?.value||`claude`]||[];J(document.getElementById(`flushModel`),e,{includeDefault:!0}),On(),Dn()}async function En(){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),J(r,m[e.cli||document.getElementById(`selCli`)?.value||`claude`]||[],{includeDefault:!0}),r&&e.model&&(Y(r,e.model),r.value=e.model),On()}async function Dn(){await t(`/api/memory-files/settings`,`PUT`,{cli:document.getElementById(`flushCli`)?.value||``,model:document.getElementById(`flushModel`)?.value||``})}function On(){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?G(r):`${G(r)}*`),n&&n!==`default`&&i.push(n),e.textContent=i.length?`(${i.join(` / `)})`:``}export{et as A,le as B,st as C,dt as D,ft as E,Ye as F,oe as H,Ze as I,Xe as L,rt as M,nt as N,pt as O,it as P,Qe as R,gt as S,ut as T,se as V,O as _,hn as a,vt as b,Sn as c,$ as d,_n as f,wt as g,Bt as h,En as i,tt as j,mt as k,nn as l,an as m,vn as n,Cn as o,gn as p,yn as r,Tn as s,xn as t,wn as u,Rt as v,lt as w,yt as x,Ct as y,je as z};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./skills-lWi0ZFiV.js";export{e as loadSkills};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./slash-commands-DYOI6nKj.js";export{e as loadCommands};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{p as e}from"./iframe-renderer-B8k3AvTv.js";import{d as t,o as n}from"./message-history-Bw2E_b8L.js";import{r}from"./ui-Bx7eqnXt.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
|