cli-jaw 2.2.18 → 2.2.20
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 +106 -3
- package/dist/bin/cli-jaw.js +1 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/dispatch.js +14 -4
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/service.js +322 -222
- package/dist/bin/commands/service.js.map +1 -1
- package/dist/bin/postinstall.js +20 -4
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/server.js +39 -2
- package/dist/server.js.map +1 -1
- package/dist/src/agent/spawn/process-kill.js +96 -2
- package/dist/src/agent/spawn/process-kill.js.map +1 -1
- package/dist/src/agent/spawn.js +35 -77
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/bgtask/runner.js +26 -21
- package/dist/src/bgtask/runner.js.map +1 -1
- package/dist/src/cli/acp-client.js +11 -5
- package/dist/src/cli/acp-client.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +59 -6
- package/dist/src/cli/cli-status-worker.js.map +1 -1
- package/dist/src/cli/employee-handler.js +3 -2
- package/dist/src/cli/employee-handler.js.map +1 -1
- package/dist/src/code-mode/acp-host.js +22 -10
- package/dist/src/code-mode/acp-host.js.map +1 -1
- package/dist/src/core/cli-detect.js +54 -8
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/config.js +24 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +16 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +22 -4
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/instance-lifecycle.js +120 -0
- package/dist/src/core/instance-lifecycle.js.map +1 -0
- package/dist/src/core/runtime-path.js +92 -12
- package/dist/src/core/runtime-path.js.map +1 -1
- package/dist/src/core/runtime-settings.js +4 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-watch.js +12 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/core/windows-shell.js +63 -0
- package/dist/src/core/windows-shell.js.map +1 -0
- package/dist/src/discord/bot.js +199 -147
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/gateway-supervisor.js +303 -0
- package/dist/src/discord/gateway-supervisor.js.map +1 -0
- package/dist/src/discord/rest-scheduler.js +448 -0
- package/dist/src/discord/rest-scheduler.js.map +1 -0
- package/dist/src/discord/send-only-client.js +59 -43
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/manager/lifecycle.js +7 -2
- package/dist/src/manager/lifecycle.js.map +1 -1
- package/dist/src/manager/notes/capabilities.js +9 -7
- package/dist/src/manager/notes/capabilities.js.map +1 -1
- package/dist/src/memory/bootstrap.js +5 -1
- package/dist/src/memory/bootstrap.js.map +1 -1
- package/dist/src/memory/host-toolchain.js +156 -0
- package/dist/src/memory/host-toolchain.js.map +1 -0
- package/dist/src/messaging/channel-capabilities.js +30 -0
- package/dist/src/messaging/channel-capabilities.js.map +1 -0
- package/dist/src/messaging/delivery-outcome.js +73 -0
- package/dist/src/messaging/delivery-outcome.js.map +1 -0
- package/dist/src/messaging/draft-stream.js +154 -0
- package/dist/src/messaging/draft-stream.js.map +1 -0
- package/dist/src/messaging/runtime.js +3 -9
- package/dist/src/messaging/runtime.js.map +1 -1
- package/dist/src/messaging/send.js +40 -8
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/messaging/types.js +22 -1
- package/dist/src/messaging/types.js.map +1 -1
- package/dist/src/notes/search.js +31 -6
- package/dist/src/notes/search.js.map +1 -1
- package/dist/src/prompt/builder.js +169 -13
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/conversation-context.js +23 -0
- package/dist/src/prompt/conversation-context.js.map +1 -0
- package/dist/src/prompt/templates/a1-system.md +28 -12
- package/dist/src/prompt/templates/control-system.md +19 -6
- package/dist/src/prompt/templates/employee.md +16 -3
- package/dist/src/routes/settings.js +8 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/system.js +5 -1
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/routes/wiki.js +17 -12
- package/dist/src/routes/wiki.js.map +1 -1
- package/dist/src/search/coordinator.js +13 -5
- package/dist/src/search/coordinator.js.map +1 -1
- package/dist/src/search/provider.js.map +1 -1
- package/dist/src/search/providers/wiki.js +17 -9
- package/dist/src/search/providers/wiki.js.map +1 -1
- package/dist/src/security/path-guards.js +124 -27
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/slack/api.js +38 -5
- package/dist/src/slack/api.js.map +1 -1
- package/dist/src/slack/bot.js +214 -35
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/context.js +192 -0
- package/dist/src/slack/context.js.map +1 -0
- package/dist/src/slack/conversation.js +275 -0
- package/dist/src/slack/conversation.js.map +1 -0
- package/dist/src/slack/enrichment-cache.js +334 -0
- package/dist/src/slack/enrichment-cache.js.map +1 -0
- package/dist/src/slack/history.js +47 -8
- package/dist/src/slack/history.js.map +1 -1
- package/dist/src/slack/identity.js +99 -190
- package/dist/src/slack/identity.js.map +1 -1
- package/dist/src/slack/ingress.js +78 -2
- package/dist/src/slack/ingress.js.map +1 -1
- package/dist/src/slack/manifest.js +14 -3
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/progress.js +39 -51
- package/dist/src/slack/progress.js.map +1 -1
- package/dist/src/slack/thread-tracker.js +78 -0
- package/dist/src/slack/thread-tracker.js.map +1 -1
- package/dist/src/telegram/bot.js +105 -56
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/update-offset.js +152 -0
- package/dist/src/telegram/update-offset.js.map +1 -0
- package/dist/src/wiki/config.js +42 -14
- package/dist/src/wiki/config.js.map +1 -1
- package/dist/src/wiki/prompt.js +2 -2
- package/dist/src/wiki/prompt.js.map +1 -1
- package/package.json +1 -1
- package/public/dist/assets/Agent-C5EvX-_v.js +1 -0
- package/public/dist/assets/{app-DqSJmDwP.js → app-is76CHGZ.js} +4 -4
- package/public/dist/assets/{bgtask-badge-D6XYRFI5.js → bgtask-badge-B0B1nXUs.js} +1 -1
- package/public/dist/assets/bgtask-badge-B2jUZ5mC.js +1 -0
- package/public/dist/assets/{employees-B_wKPfTO.js → employees-eiW0cC8z.js} +1 -1
- package/public/dist/assets/{iframe-renderer-D1-zDg8V.js → iframe-renderer-C7qQJX4c.js} +2 -2
- package/public/dist/assets/iframe-renderer-D7PB_yrC.js +1 -0
- package/public/dist/assets/{manager-Bjuh1jpq.js → manager-CP-Au860.js} +1 -1
- package/public/dist/assets/{memory-CNUpXWEC.js → memory--Q8Tb5SZ.js} +1 -1
- package/public/dist/assets/memory-rsKN0aa2.js +1 -0
- package/public/dist/assets/message-history-BttkY77h.js +1 -0
- package/public/dist/assets/{message-history-DB1rynP-.js → message-history-CfAHmCDW.js} +1 -1
- package/public/dist/assets/{render-DXwQzjsJ.js → render-BDso7Yb5.js} +1 -1
- package/public/dist/assets/{settings-CXndjCad.js → settings-CqnIqxkG.js} +1 -1
- package/public/dist/assets/{settings-core-t5yYVRrv.js → settings-core-BxuFkt4a.js} +4 -4
- package/public/dist/assets/settings-core-CdZ7oKhM.js +1 -0
- package/public/dist/assets/settings-pPMHNs0G.js +1 -0
- package/public/dist/assets/{sidebar-DgIj-LuT.js → sidebar-BNT58qR0.js} +3 -3
- package/public/dist/assets/{skills-QqxjqDHg.js → skills-CwRBcm3m.js} +1 -1
- package/public/dist/assets/skills-DiVoaVdS.js +1 -0
- package/public/dist/assets/slash-commands-Bx4saHwR.js +1 -0
- package/public/dist/assets/{slash-commands-B2V_jngP.js → slash-commands-cm0U58n7.js} +1 -1
- package/public/dist/assets/{trace-drawer-CBe9nRjS.js → trace-drawer-BuwO4m2P.js} +1 -1
- package/public/dist/assets/{ui-CDozpEQt.js → ui-C-LHMki1.js} +1 -1
- package/public/dist/assets/ui-XPQDPe-5.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/js/features/channel-onboarding.ts +8 -5
- package/public/locales/en.json +3 -2
- package/public/locales/ja.json +3 -2
- package/public/locales/ko.json +3 -2
- package/public/locales/zh.json +3 -2
- package/public/manager/src/settings/cli-status-polling.ts +84 -0
- package/public/manager/src/settings/pages/Agent.tsx +84 -5
- package/scripts/install-officecli.ps1 +38 -2
- package/scripts/install-officecli.sh +28 -0
- package/scripts/install.ps1 +1 -1
- package/public/dist/assets/Agent-nMPZsMfN.js +0 -1
- package/public/dist/assets/bgtask-badge-CjWz0F6U.js +0 -1
- package/public/dist/assets/iframe-renderer-qRVLHPnT.js +0 -1
- package/public/dist/assets/memory-CcWGiPy_.js +0 -1
- package/public/dist/assets/message-history-BamMPUnL.js +0 -1
- package/public/dist/assets/settings-RGpifFHy.js +0 -1
- package/public/dist/assets/settings-core-X_5UHfr3.js +0 -1
- package/public/dist/assets/skills-CbwIimit.js +0 -1
- package/public/dist/assets/slash-commands-tCNRlNTC.js +0 -1
- package/public/dist/assets/ui-o-VpvrSv.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./api-tVoG39dL.js";import{M as t,R as n}from"./render-
|
|
1
|
+
import{n as e}from"./api-tVoG39dL.js";import{M as t,R as n}from"./render-BDso7Yb5.js";import{t as r}from"./locale-DC-ZsWOf.js";var i={activeCli:o(`activeCli`,2,1,2,2,1,3),model:o(`model`,2,1,1,2,1,2),effort:o(`effort`,2,1,1),permissions:o(`permissions`,2,1,1),flushAgent:o(`flushAgent`,2,1,1,2,1,3),employees:o(`employees`,3,3,2,4,1,2),skills:o(`skills`,2,1,1,4,1,3),activeChannel:o(`activeChannel`,2,1,1),telegram:{...o(`telegram`,2,1,2,8),docLinks:[{url:`https://t.me/BotFather`,labelKey:`help.telegram.link.botfather`},{url:`https://core.telegram.org/bots/tutorial`,labelKey:`help.telegram.link.docs`}]},discord:{...o(`discord`,2,1,2,9),docLinks:[{url:`https://discord.com/developers/applications`,labelKey:`help.discord.link.portal`},{url:`https://discord.com/developers/docs/getting-started`,labelKey:`help.discord.link.docs`}]},slack:{...o(`slack`,2,1,2,9),docLinks:[{url:`https://api.slack.com/apps`,labelKey:`help.slack.link.portal`},{url:`https://docs.slack.dev/apis/events-api/using-socket-mode/`,labelKey:`help.slack.link.docs`}]},fallbackOrder:o(`fallbackOrder`,2,1,1,2,1,3),mcp:o(`mcp`,2,1,1,4,1,5),memory:o(`memory`,2,1,2,4,1,2),stt:o(`stt`,2,1,1),promptTemplates:o(`promptTemplates`,2,1,1),chatInput:o(`chatInput`,3,2,2),orchestration:o(`orchestration`,3,2,2,8,1,8),attachments:o(`attachments`,3,2,2),diagrams:o(`diagrams`,3,2,2),keyboardShortcuts:o(`keyboardShortcuts`,3,2,2,3,2,3),session:o(`session`,3,1,2,8,1,9),cliTools:o(`cliTools`,3,1,2,6,1,9),agentControl:o(`agentControl`,3,1,2,6,1,6),goals:o(`goals`,3,1,2,10,1,25)};function a(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(i,e)}function o(e,t,n,r,i=2,a=1,o=0){return{titleKey:`help.${e}.title`,introKey:`help.${e}.intro`,effectKey:`help.${e}.effect`,useWhenKeys:s(`help.${e}.use`,t),howToKeys:s(`help.${e}.howTo`,i),exampleKeys:s(`help.${e}.example`,a),avoidWhenKeys:s(`help.${e}.avoid`,n),relatedKeys:s(`help.${e}.related`,r),...o>0?{subcmdKeys:s(`help.${e}.subcmd`,o)}:{}}}function s(e,t){return Array.from({length:t},(t,n)=>`${e}.${n+1}`)}var c=!1,l=null,u=null,d=null,f=null,p=null,m=!1;function h(){c||(c=!0,document.addEventListener(`click`,v),document.addEventListener(`keydown`,y,!0))}function g(e,t=null,n=[e]){if(!i[e]){console.warn(`[help-dialog] unknown topic:`,e);return}b(),p=t,x(e,T(n,e)),l?.classList.add(`open`),l?.setAttribute(`aria-hidden`,`false`),m=!0,requestAnimationFrame(()=>f?.focus())}function _(){if(!m)return;l?.classList.remove(`open`),l?.setAttribute(`aria-hidden`,`true`),m=!1;let e=p;p=null,e?.focus()}function v(e){let t=e.target?.closest(`[data-help-topic]`);if(!t)return;let n=t.getAttribute(`data-help-topic`);if(!a(n)){console.warn(`[help-dialog] invalid topic:`,n);return}e.preventDefault(),g(n,t,w(t.getAttribute(`data-help-topics`),n))}function y(e){!m||e.key!==`Escape`||(e.preventDefault(),e.stopImmediatePropagation(),_())}function b(){if(l&&u&&d&&f)return;l=document.createElement(`div`),l.id=`helpDialog`,l.className=`modal-overlay help-dialog-overlay`,l.setAttribute(`role`,`presentation`),l.setAttribute(`aria-hidden`,`true`),l.addEventListener(`click`,e=>{e.target===l&&_()});let e=document.createElement(`div`);e.className=`modal-box help-dialog-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-labelledby`,`helpDialogTitle`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header help-dialog-header`,u=document.createElement(`span`),u.id=`helpDialogTitle`,f=document.createElement(`button`),f.type=`button`,f.className=`btn-modal-close help-dialog-close`,f.setAttribute(`aria-label`,n(`help.close`)),f.textContent=`x`,f.addEventListener(`click`,()=>_()),d=document.createElement(`div`),d.className=`help-dialog-body`;let r=document.createElement(`div`);r.className=`modal-footer help-dialog-footer`;let i=document.createElement(`button`);i.type=`button`,i.className=`btn-save help-dialog-done`,i.textContent=n(`help.close`),i.addEventListener(`click`,()=>_()),t.append(u,f),r.append(i),e.append(t,d,r),l.append(e),document.body.append(l)}function x(e,t=[e]){if(!u||!d||!f)return;let r=i[e];u.textContent=n(r.titleKey),f.setAttribute(`aria-label`,n(`help.close`)),d.replaceChildren();let a=document.createElement(`div`);if(a.className=`help-dialog-content`,S(a,r),t.length<=1){d.append(a);return}let o=document.createElement(`div`);o.className=`help-dialog-layout`,o.append(C(t,e),a),d.append(o)}function S(e,t){t.docLinks?.length&&E(e,t.docLinks),D(e,n(`help.section.what`),n(t.introKey)),D(e,n(`help.section.effect`),n(t.effectKey),`help-effect-text`),O(e,n(`help.section.useWhen`),t.useWhenKeys),A(e,n(`help.section.howTo`),t.howToKeys),O(e,n(`help.section.example`),t.exampleKeys,!1,`help-example-list`),t.avoidWhenKeys?.length&&O(e,n(`help.section.avoidWhen`),t.avoidWhenKeys),t.subcmdKeys?.length&&j(e,n(`help.section.commands`),t.subcmdKeys),t.relatedKeys?.length&&O(e,n(`help.section.related`),t.relatedKeys,!0)}function C(e,t){let r=document.createElement(`nav`);r.className=`help-dialog-nav`,r.setAttribute(`aria-label`,n(`help.section.related`));for(let a of e){let o=i[a],s=document.createElement(`button`);s.type=`button`,s.className=`help-dialog-nav-item`,s.textContent=n(o.titleKey),a===t&&(s.classList.add(`active`),s.setAttribute(`aria-current`,`page`)),s.addEventListener(`click`,()=>x(a,e)),r.append(s)}return r}function w(e,t){return T(e?.split(/[\s,]+/).filter(Boolean)??[],t)}function T(e,t){let n=[];for(let t of e)a(t)&&!n.includes(t)&&n.push(t);return n.includes(t)||n.unshift(t),n}function E(e,t){let r=document.createElement(`section`);r.className=`help-dialog-section help-doc-links`;let i=document.createElement(`nav`);i.className=`help-doc-links-nav`;for(let e of t){let t=document.createElement(`a`);t.href=e.url,t.target=`_blank`,t.rel=`noopener noreferrer`,t.className=`help-doc-link`,t.textContent=n(e.labelKey);let r=document.createElement(`span`);r.className=`help-doc-link-icon`,r.textContent=`↗`,t.append(r),i.append(t)}r.append(i),e.append(r)}function D(e,t,n,r){let i=k(t),a=document.createElement(`p`);r&&(a.className=r),a.textContent=n,i.append(a),e.append(i)}function O(e,t,r,i=!1,a){let o=k(t),s=document.createElement(`ul`);s.className=a??(i?`help-related-list`:`help-dialog-list`);for(let e of r){let t=document.createElement(`li`);t.textContent=n(e),s.append(t)}o.append(s),e.append(o)}function k(e){let t=document.createElement(`section`);t.className=`help-dialog-section`;let n=document.createElement(`h3`);return n.textContent=e,t.append(n),t}function A(e,t,r){let i=k(t),a=document.createElement(`ol`);a.className=`help-dialog-list help-howto-list`;for(let e of r){let t=document.createElement(`li`);t.textContent=n(e),a.append(t)}i.append(a),e.append(i)}function j(e,t,r){let i=k(t),a=document.createElement(`dl`);a.className=`help-subcmd-list`;for(let e of r){let t=n(e),r=t.indexOf(` — `),i=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r+3):``,s=document.createElement(`dt`);s.className=`help-subcmd-cmd`;let c=document.createElement(`code`);c.textContent=i,s.append(c);let l=document.createElement(`dd`);l.className=`help-subcmd-desc`,l.textContent=o,a.append(s,l)}i.append(a),e.append(i)}var M={mcp:`mcp`,memory:`memory`,model:`model`,effort:`effort`,cli:`activeCli`,skill:`skills`,employee:`employees`,orchestrate:`orchestration`,pabcd:`orchestration`,flush:`flushAgent`,fallback:`fallbackOrder`,prompt:`promptTemplates`,browser:`mcp`,status:`activeCli`,steer:`chatInput`,clear:`session`,compact:`session`,reset:`session`,purge:`session`,new:`session`,switch:`session`,sw:`session`,sessions:`session`,ss:`session`,version:`cliTools`,project:`cliTools`,proj:`cliTools`,ide:`cliTools`,file:`cliTools`,forward:`agentControl`,thought:`agentControl`,goal:`goals`,goalplan:`goals`,gd:`goals`,plan:`goals`,interview:`goals`,deliberate:`goals`,planaudit:`goals`,review:`goals`,search:`mcp`,team:`goals`,task:`goals`,help:`keyboardShortcuts`,h:`keyboardShortcuts`,commands:`keyboardShortcuts`,cmd:`keyboardShortcuts`,fork:`session`,quit:`session`,q:`session`,exit:`session`,telegram:`telegram`,discord:`discord`,slack:`slack`,stt:`stt`,attachments:`attachments`,diagrams:`diagrams`};function N(e){let t=e.replace(/^\//,``).trim().split(/\s+/);if(t.length<2||t[t.length-1].toLowerCase()!==`info`)return!1;let n=M[t[0].toLowerCase()];return n?(g(n),!0):!1}var P=[],F=[],I=-1,L=!1,R=null;function z(e){let t=String(e||``).slice(1).trim().split(/\s+/)[0]||``;return t.includes(`/`)||t.includes(`\\`)}var B=()=>document.getElementById(`cmdDropdown`),V=()=>document.getElementById(`chatInput`);function H(e){let t=String(e||``).toLowerCase();return P.filter(e=>`/${e.name}`.startsWith(t))}function U(e){let t=e.workflow?.workflowArgs||[];return t.length?t.map(e=>e.required?`<${e.name}>`:`[${e.name}]`).join(` `):e.args||``}function W(e){let n=e.workflow;return n?`<span class="cmd-meta">
|
|
2
2
|
<span class="cmd-chip">${t(n.phase)}</span>
|
|
3
3
|
<span class="cmd-chip cmd-risk-${t(n.risk)}">${t(n.risk)}</span>
|
|
4
4
|
<span class="cmd-chip">${t(n.output)}</span>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./api-tVoG39dL.js";import{M as t}from"./render-
|
|
1
|
+
import{n as e}from"./api-tVoG39dL.js";import{M as t}from"./render-BDso7Yb5.js";import{r as n}from"./provider-icons-VDfahiUp.js";var r=80,i=``,a=0,o=0,s=!1,c=0,l=null;function u(e){return e.eventType||e.event_type||`event`}function d(e,t=i){return e===c&&t===i}function f(e){return!e||!Number.isInteger(e)||e<1?0:Math.floor((e-1)/r)*r}function p(){let e=document.getElementById(`traceDrawerOverlay`);return e||(e=document.createElement(`div`),e.id=`traceDrawerOverlay`,e.className=`trace-drawer-overlay`,e.innerHTML=`<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
|
|
2
2
|
<header class="trace-drawer-header">
|
|
3
3
|
<div><p class="trace-drawer-kicker">Raw trace</p><h2 id="traceDrawerTitle">Trace</h2></div>
|
|
4
4
|
<button class="trace-drawer-close" type="button" aria-label="Close trace drawer">×</button>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./state-DxpgDKMO.js";import{t}from"./preload-helper-DFYRRz9w.js";import{N as n,T as r,j as i,k as a,t as o}from"./render-DXwQzjsJ.js";import{A as s,C as c,D as l,N as u,O as d,S as f,_ as ee,b as te,k as p,m,t as ne,v as h,w as g,x as re}from"./iframe-renderer-D1-zDg8V.js";import{C as _,D as v,E as y,S as b,_ as x,b as S,f as ie,g as C,h as w,l as T,m as E,p as D,u as ae,v as oe,w as se,x as O,y as k}from"./message-history-DB1rynP-.js";import{s as ce}from"./idb-cache-lOntwU3S.js";var A=2e3,j=80,le=400;function ue(e){if(e<=A)return j;let t=e/A*j;return Math.min(le,Math.round(t))}function M(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function N(e,t=``){let n=M(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=o(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function P(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function F(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=P(e);n.length<A||t-e.lastRenderTime>ue(n.length)?(e.element.innerHTML=o(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=o(P(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function I(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=P(e);return t||(e.element.innerHTML=o(n)),n}function L(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function R(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&L(t)&&L(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function z(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:R(e,t)}function B(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>z(e,t))??null}function V(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function H(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return B(n,t)||V(n,t)}function U(){e.currentProcessBlock&&l(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&l(e.currentAgentDiv),v(),s(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function de(){W=Date.now()}function fe(){W=0}function pe(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function me(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function he(t,n){k();let r=K();if(r||(r=x(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),b(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=S(r)),!e.currentProcessBlock&&t&&(_(r),e.currentProcessBlock=f(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||a(t.icon)||`running`;if(r===`done`||r===`error`){let a=H(e.currentProcessBlock.steps,t);if(a){t.icon=i(t.icon);let o=t.type===`thinking`?p(a.id,t.detail):g(a.id,t.detail);d(e.currentProcessBlock,a.id,{...a,...t,id:a.id,rawIcon:n,detail:o,detailPreview:o,label:t.label||a.label,status:r,startTime:a.startTime}),m();return}if(t.stepRef&&(r===`done`||r===`error`)){let a=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(a){t.icon=i(t.icon);let o=t.type===`thinking`?p(a.id,t.detail):g(a.id,t.detail);d(e.currentProcessBlock,a.id,{...a,...t,id:a.id,rawIcon:n,status:r,detail:o,detailPreview:o,startTime:a.startTime}),m();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=i(t.icon);let a=p(r.id,t.detail);d(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:a,detailPreview:a,label:t.label||r.label,startTime:r.startTime}),m();return}}let o=B(e.currentProcessBlock.steps,t,{includeDone:!0});if(o){t.rawIcon=n,t.icon=i(t.icon);let a=t.detail||``,s=c(o.id)||o.detail||o.detailPreview||``,l=a.length>=s.length?a:s,u=p(o.id,l),f=(o.status===`done`||o.status===`error`)&&r===`running`?o.status:r;d(e.currentProcessBlock,o.id,{...o,...t,id:o.id,rawIcon:n,status:f,detail:u,detailPreview:u,label:t.label||o.label,startTime:o.startTime}),m();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){d(e.currentProcessBlock,n.id,t),m();return}}t.rawIcon=n,t.icon=i(t.icon),h(e.currentProcessBlock,t)}m()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ge(e){let t=K()??me();Y(t);let n=t||x(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function _e(e,t){let n=c(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function ve(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>z(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(h(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=p(t.id,_e(t,a));d(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function ye(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function be(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function xe(t){if(!t?.running){Z=``,Y();return}let n=be(t);if(n===Z&&K())return;v(),k(),e.currentAgentDiv=ge(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=E(t.toolLog||[]);b(e.currentAgentDiv),e.currentProcessBlock=S(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||=(_(e.currentAgentDiv),f(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),ve(e.currentProcessBlock,C(i,t.startedAt))):e.currentProcessBlock=S(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=N(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=x(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=M(n),F(q,t)),m()}var $=0;function Se(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ce(t,i){let a=Date.now();if(!e.currentAgentDiv&&a-$<500)return;Z=``,v(),k(),e.currentAgentDiv&&b(e.currentAgentDiv);let s=se(e.currentProcessBlock??e.currentAgentDiv,!0),c=E(D(Array.isArray(i)?i:[],s)),d=w(c),f=!!e.currentProcessBlock||!!(e.currentAgentDiv&&O(e.currentAgentDiv));e.currentProcessBlock&&=(re(e.currentProcessBlock),null);let p=c.length>0;if(t||p){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=x(`agent`,``)),e.currentAgentDiv.removeAttribute(J);let i=e.currentAgentDiv?.querySelector(`.msg-content`),a=q?I(q,!0):``,s=t||a;if(q=null,i&&(i.innerHTML=o(s)),p&&e.currentAgentDiv&&!f&&!O(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,te(C(c),!0))}e.currentAgentDiv&&b(e.currentAgentDiv),i&&i.setAttribute(`data-raw`,n(s)),i&&ne(i);let m=ee(),h=!!(m.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(i&&!h&&r(i,{immediate:!0}),h){let t=e.currentAgentDiv;Se(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),d?(m.appendItem(ie({role:`assistant`,content:s,cli:null,tool_log:d},m.count)),l(t),m.scrollToBottom()):(t.dataset.turnIndex=String(m.count),t.dataset.messageId||(t.dataset.messageId=u()),m.appendLiveItem(t)),t.remove()}s&&ce({role:`assistant`,content:s,tool_log:d,timestamp:Date.now()}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),ae(`idle`),T()}function we(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`settings`&&t(()=>import(`./settings-RGpifFHy.js`).then(e=>e.loadSettings()),__vite__mapDeps([0])),e===`agents`&&t(()=>import(`./employees-B_wKPfTO.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-CbwIimit.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function Te(){let e=document.getElementById(`tabSettings`)?.classList.contains(`active`);t(()=>import(`./settings-RGpifFHy.js`).then(t=>e?t.savePerCli():t.updateSettings()),__vite__mapDeps([0]))}function Ee(){y({onStatus:oe})}export{Ce as a,Ee as c,he as d,we as f,fe as i,pe as l,ye as n,Te as o,U as r,xe as s,Q as t,de as u};
|
|
2
|
+
import{t as e}from"./state-DxpgDKMO.js";import{t}from"./preload-helper-DFYRRz9w.js";import{N as n,T as r,j as i,k as a,t as o}from"./render-BDso7Yb5.js";import{A as s,C as c,D as l,N as u,O as d,S as f,_ as ee,b as te,k as p,m,t as ne,v as h,w as g,x as re}from"./iframe-renderer-C7qQJX4c.js";import{C as _,D as v,E as y,S as b,_ as x,b as S,f as ie,g as C,h as w,l as T,m as E,p as D,u as ae,v as oe,w as se,x as O,y as k}from"./message-history-CfAHmCDW.js";import{s as ce}from"./idb-cache-lOntwU3S.js";var A=2e3,j=80,le=400;function ue(e){if(e<=A)return j;let t=e/A*j;return Math.min(le,Math.round(t))}function M(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function N(e,t=``){let n=M(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=o(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function P(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function F(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=P(e);n.length<A||t-e.lastRenderTime>ue(n.length)?(e.element.innerHTML=o(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=o(P(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function I(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=P(e);return t||(e.element.innerHTML=o(n)),n}function L(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function R(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&L(t)&&L(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function z(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:R(e,t)}function B(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>z(e,t))??null}function V(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function H(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return B(n,t)||V(n,t)}function U(){e.currentProcessBlock&&l(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&l(e.currentAgentDiv),v(),s(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function de(){W=Date.now()}function fe(){W=0}function pe(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function me(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function he(t,n){k();let r=K();if(r||(r=x(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),b(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=S(r)),!e.currentProcessBlock&&t&&(_(r),e.currentProcessBlock=f(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||a(t.icon)||`running`;if(r===`done`||r===`error`){let a=H(e.currentProcessBlock.steps,t);if(a){t.icon=i(t.icon);let o=t.type===`thinking`?p(a.id,t.detail):g(a.id,t.detail);d(e.currentProcessBlock,a.id,{...a,...t,id:a.id,rawIcon:n,detail:o,detailPreview:o,label:t.label||a.label,status:r,startTime:a.startTime}),m();return}if(t.stepRef&&(r===`done`||r===`error`)){let a=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(a){t.icon=i(t.icon);let o=t.type===`thinking`?p(a.id,t.detail):g(a.id,t.detail);d(e.currentProcessBlock,a.id,{...a,...t,id:a.id,rawIcon:n,status:r,detail:o,detailPreview:o,startTime:a.startTime}),m();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=i(t.icon);let a=p(r.id,t.detail);d(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:a,detailPreview:a,label:t.label||r.label,startTime:r.startTime}),m();return}}let o=B(e.currentProcessBlock.steps,t,{includeDone:!0});if(o){t.rawIcon=n,t.icon=i(t.icon);let a=t.detail||``,s=c(o.id)||o.detail||o.detailPreview||``,l=a.length>=s.length?a:s,u=p(o.id,l),f=(o.status===`done`||o.status===`error`)&&r===`running`?o.status:r;d(e.currentProcessBlock,o.id,{...o,...t,id:o.id,rawIcon:n,status:f,detail:u,detailPreview:u,label:t.label||o.label,startTime:o.startTime}),m();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){d(e.currentProcessBlock,n.id,t),m();return}}t.rawIcon=n,t.icon=i(t.icon),h(e.currentProcessBlock,t)}m()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ge(e){let t=K()??me();Y(t);let n=t||x(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function _e(e,t){let n=c(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function ve(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>z(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(h(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=p(t.id,_e(t,a));d(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function ye(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function be(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function xe(t){if(!t?.running){Z=``,Y();return}let n=be(t);if(n===Z&&K())return;v(),k(),e.currentAgentDiv=ge(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=E(t.toolLog||[]);b(e.currentAgentDiv),e.currentProcessBlock=S(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||=(_(e.currentAgentDiv),f(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),ve(e.currentProcessBlock,C(i,t.startedAt))):e.currentProcessBlock=S(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=N(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=x(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=M(n),F(q,t)),m()}var $=0;function Se(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ce(t,i){let a=Date.now();if(!e.currentAgentDiv&&a-$<500)return;Z=``,v(),k(),e.currentAgentDiv&&b(e.currentAgentDiv);let s=se(e.currentProcessBlock??e.currentAgentDiv,!0),c=E(D(Array.isArray(i)?i:[],s)),d=w(c),f=!!e.currentProcessBlock||!!(e.currentAgentDiv&&O(e.currentAgentDiv));e.currentProcessBlock&&=(re(e.currentProcessBlock),null);let p=c.length>0;if(t||p){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=x(`agent`,``)),e.currentAgentDiv.removeAttribute(J);let i=e.currentAgentDiv?.querySelector(`.msg-content`),a=q?I(q,!0):``,s=t||a;if(q=null,i&&(i.innerHTML=o(s)),p&&e.currentAgentDiv&&!f&&!O(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,te(C(c),!0))}e.currentAgentDiv&&b(e.currentAgentDiv),i&&i.setAttribute(`data-raw`,n(s)),i&&ne(i);let m=ee(),h=!!(m.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(i&&!h&&r(i,{immediate:!0}),h){let t=e.currentAgentDiv;Se(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),d?(m.appendItem(ie({role:`assistant`,content:s,cli:null,tool_log:d},m.count)),l(t),m.scrollToBottom()):(t.dataset.turnIndex=String(m.count),t.dataset.messageId||(t.dataset.messageId=u()),m.appendLiveItem(t)),t.remove()}s&&ce({role:`assistant`,content:s,tool_log:d,timestamp:Date.now()}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),ae(`idle`),T()}function we(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`settings`&&t(()=>import(`./settings-pPMHNs0G.js`).then(e=>e.loadSettings()),__vite__mapDeps([0])),e===`agents`&&t(()=>import(`./employees-eiW0cC8z.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-DiVoaVdS.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function Te(){let e=document.getElementById(`tabSettings`)?.classList.contains(`active`);t(()=>import(`./settings-pPMHNs0G.js`).then(t=>e?t.savePerCli():t.updateSettings()),__vite__mapDeps([0]))}function Ee(){y({onStatus:oe})}export{Ce as a,Ee as c,he as d,we as f,fe as i,pe as l,ye as n,Te as o,U as r,xe as s,Q as t,de as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as e}from"./iframe-renderer-C7qQJX4c.js";import{d as t,o as n}from"./message-history-CfAHmCDW.js";import{r}from"./ui-C-LHMki1.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
|
package/public/dist/index.html
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
|
|
32
32
|
rel="stylesheet">
|
|
33
33
|
<!-- Vite handles module bundling in dev (HMR) and production (build) -->
|
|
34
|
-
<script type="module" crossorigin src="/dist/assets/app-
|
|
34
|
+
<script type="module" crossorigin src="/dist/assets/app-is76CHGZ.js"></script>
|
|
35
35
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
36
36
|
<link rel="stylesheet" crossorigin href="/dist/assets/app-DuyLYRC6.css">
|
|
37
37
|
</head>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<link rel="icon" type="image/png" href="/dist/assets/icon-192-CwXPIYF5.png">
|
|
7
7
|
<title>Jaw Manager</title>
|
|
8
8
|
<script src="/manager/theme-boot.js"></script>
|
|
9
|
-
<script type="module" crossorigin src="/dist/assets/manager-
|
|
9
|
+
<script type="module" crossorigin src="/dist/assets/manager-CP-Au860.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
11
11
|
<link rel="stylesheet" crossorigin href="/dist/assets/manager-LkGs6qEJ.css">
|
|
12
12
|
</head>
|
|
@@ -128,8 +128,8 @@ function stepBody(state: FlowState): string {
|
|
|
128
128
|
<div class="onboarding-field">
|
|
129
129
|
<label for="onboard-slack-app-name">${escapeHtml(t('onboarding.slackAppName'))}</label>
|
|
130
130
|
<input id="onboard-slack-app-name" data-onboard-app-name="1" class="input-sm"
|
|
131
|
-
type="text"
|
|
132
|
-
|
|
131
|
+
type="text" autocomplete="off"
|
|
132
|
+
spellcheck="false"
|
|
133
133
|
aria-describedby="onboard-slack-app-name-hint onboard-slack-manifest-status"
|
|
134
134
|
value="${escapeHtml(slackAppName)}">
|
|
135
135
|
<span class="onboarding-hint" id="onboard-slack-app-name-hint">${escapeHtml(t('onboarding.slackAppNameHint'))}</span>
|
|
@@ -341,7 +341,7 @@ async function runSlackManifestGeneration(): Promise<void> {
|
|
|
341
341
|
|
|
342
342
|
const appName = input.value.trim();
|
|
343
343
|
slackAppName = appName;
|
|
344
|
-
if (!appName || Array.from(appName).length > 35
|
|
344
|
+
if (!appName || Array.from(appName).length > 35) {
|
|
345
345
|
status.classList.add('is-error');
|
|
346
346
|
status.textContent = t('onboarding.slackAppNameError');
|
|
347
347
|
input.focus();
|
|
@@ -354,7 +354,7 @@ async function runSlackManifestGeneration(): Promise<void> {
|
|
|
354
354
|
button.textContent = t('onboarding.slackManifestGenerating');
|
|
355
355
|
|
|
356
356
|
try {
|
|
357
|
-
const data = await api<{ json?: string }>(`/api/slack/manifest?name=${encodeURIComponent(appName)}`);
|
|
357
|
+
const data = await api<{ json?: string; botDisplayName?: string }>(`/api/slack/manifest?name=${encodeURIComponent(appName)}`);
|
|
358
358
|
if (generation !== flowGeneration || flow?.channel !== 'slack' || slackAppName.trim() !== appName) return;
|
|
359
359
|
const json = data?.json || '';
|
|
360
360
|
if (!json) throw new Error('empty manifest');
|
|
@@ -362,7 +362,10 @@ async function runSlackManifestGeneration(): Promise<void> {
|
|
|
362
362
|
if (!copied.ok) throw new Error(copied.error || 'copy failed');
|
|
363
363
|
if (generation !== flowGeneration || flow?.channel !== 'slack' || slackAppName.trim() !== appName) return;
|
|
364
364
|
flow = markSlackManifestGenerated(flow);
|
|
365
|
-
|
|
365
|
+
const botName = data?.botDisplayName;
|
|
366
|
+
status.textContent = botName && botName !== appName
|
|
367
|
+
? t('onboarding.slackManifestCopiedWithBot', { bot: botName })
|
|
368
|
+
: t('onboarding.slackManifestReady');
|
|
366
369
|
syncSlackStepActions();
|
|
367
370
|
} catch {
|
|
368
371
|
status.classList.add('is-error');
|
package/public/locales/en.json
CHANGED
|
@@ -897,12 +897,13 @@
|
|
|
897
897
|
"onboarding.guide.discord": "At discord.com/developers/applications choose New Application, then Bot, then Reset Token. Enable MESSAGE CONTENT INTENT under Privileged Gateway Intents. Get the server ID by enabling Developer Mode in Discord, then right-click the server and copy its ID.",
|
|
898
898
|
"onboarding.guide.slack": "At api.slack.com/apps, choose Create New App → From a manifest, paste the copied manifest into the JSON tab, select the workspace where you want to add the app, and create it.",
|
|
899
899
|
"onboarding.slackAppName": "App name",
|
|
900
|
-
"onboarding.slackAppNameHint": "
|
|
900
|
+
"onboarding.slackAppNameHint": "Enter an app name up to 35 characters. The bot handle is derived from it, and falls back to cli-jaw when the name has no usable ASCII characters.",
|
|
901
901
|
"onboarding.slackGenerateManifest": "Generate manifest",
|
|
902
902
|
"onboarding.slackManifestGenerating": "Generating...",
|
|
903
903
|
"onboarding.slackManifestReady": "Copied",
|
|
904
|
+
"onboarding.slackManifestCopiedWithBot": "Manifest copied. Bot handle: {bot}",
|
|
904
905
|
"onboarding.slackManifestError": "Could not generate or copy the manifest. Try again.",
|
|
905
|
-
"onboarding.slackAppNameError": "
|
|
906
|
+
"onboarding.slackAppNameError": "Enter an app name from 1 to 35 characters.",
|
|
906
907
|
"onboarding.warning.missingCapabilities": "Optional scopes {capabilities} are missing, so the features they cover are turned off. Add them and reinstall the app. Text messages still work.",
|
|
907
908
|
"onboarding.token.botToken": "Bot token",
|
|
908
909
|
"onboarding.token.appToken": "App-level token",
|
package/public/locales/ja.json
CHANGED
|
@@ -886,12 +886,13 @@
|
|
|
886
886
|
"onboarding.guide.discord": "At discord.com/developers/applications choose New Application, then Bot, then Reset Token. Enable MESSAGE CONTENT INTENT under Privileged Gateway Intents. Get the server ID by enabling Developer Mode in Discord, then right-click the server and copy its ID.",
|
|
887
887
|
"onboarding.guide.slack": "api.slack.com/apps で Create New App → From a manifest を選び、JSON タブにコピーしたマニフェストを貼り付け、アプリを追加するワークスペースを選択して作成してください。",
|
|
888
888
|
"onboarding.slackAppName": "アプリ名",
|
|
889
|
-
"onboarding.slackAppNameHint": "
|
|
889
|
+
"onboarding.slackAppNameHint": "アプリ名を35文字以内で入力してください。ボット名はここから生成し、使用可能な半角英数字がない場合は cli-jaw になります。",
|
|
890
890
|
"onboarding.slackGenerateManifest": "マニフェストを生成",
|
|
891
891
|
"onboarding.slackManifestGenerating": "生成中...",
|
|
892
892
|
"onboarding.slackManifestReady": "コピーしました",
|
|
893
|
+
"onboarding.slackManifestCopiedWithBot": "マニフェストをコピーしました。ボット名: {bot}",
|
|
893
894
|
"onboarding.slackManifestError": "マニフェストを生成またはコピーできませんでした。もう一度お試しください。",
|
|
894
|
-
"onboarding.slackAppNameError": "
|
|
895
|
+
"onboarding.slackAppNameError": "アプリ名を1〜35文字で入力してください。",
|
|
895
896
|
"onboarding.warning.missingCapabilities": "任意の権限 {capabilities} がないため、その機能のみ無効です。権限を追加してアプリを再インストールしてください。テキストは引き続き利用できます。",
|
|
896
897
|
"onboarding.token.botToken": "ボットトークン",
|
|
897
898
|
"onboarding.token.appToken": "アプリレベルトークン",
|
package/public/locales/ko.json
CHANGED
|
@@ -897,12 +897,13 @@
|
|
|
897
897
|
"onboarding.guide.discord": "discord.com/developers/applications 에서 New Application → Bot → Reset Token 으로 토큰을 만들고, Privileged Gateway Intents 의 MESSAGE CONTENT INTENT 를 켜세요. 서버 ID는 Discord 설정에서 개발자 모드를 켠 뒤 서버 우클릭 → ID 복사로 얻습니다.",
|
|
898
898
|
"onboarding.guide.slack": "api.slack.com/apps에서 Create New App → From a manifest의 JSON 탭에 복사된 매니페스트를 붙여넣고, 추가하려는 워크스페이스를 선택하여 앱을 생성해 주세요.",
|
|
899
899
|
"onboarding.slackAppName": "앱 이름",
|
|
900
|
-
"onboarding.slackAppNameHint": "
|
|
900
|
+
"onboarding.slackAppNameHint": "앱 이름을 35자 이내로 입력하세요. 봇 이름은 여기서 만들며, 쓸 수 있는 영문자가 없으면 cli-jaw가 됩니다.",
|
|
901
901
|
"onboarding.slackGenerateManifest": "매니페스트 생성",
|
|
902
902
|
"onboarding.slackManifestGenerating": "생성 중...",
|
|
903
903
|
"onboarding.slackManifestReady": "복사되었습니다",
|
|
904
|
+
"onboarding.slackManifestCopiedWithBot": "매니페스트를 복사했습니다. 봇 이름: {bot}",
|
|
904
905
|
"onboarding.slackManifestError": "매니페스트를 생성하거나 복사하지 못했어요. 다시 시도해주세요.",
|
|
905
|
-
"onboarding.slackAppNameError": "
|
|
906
|
+
"onboarding.slackAppNameError": "앱 이름을 1~35자로 입력하세요.",
|
|
906
907
|
"onboarding.warning.missingCapabilities": "선택 권한({capabilities})이 없어 해당 기능만 꺼져 있습니다. 권한을 추가하고 앱을 재설치하세요. 텍스트 메시지는 계속 사용할 수 있습니다.",
|
|
907
908
|
"onboarding.token.botToken": "봇 토큰",
|
|
908
909
|
"onboarding.token.appToken": "앱 레벨 토큰",
|
package/public/locales/zh.json
CHANGED
|
@@ -886,12 +886,13 @@
|
|
|
886
886
|
"onboarding.guide.discord": "At discord.com/developers/applications choose New Application, then Bot, then Reset Token. Enable MESSAGE CONTENT INTENT under Privileged Gateway Intents. Get the server ID by enabling Developer Mode in Discord, then right-click the server and copy its ID.",
|
|
887
887
|
"onboarding.guide.slack": "在 api.slack.com/apps 中选择 Create New App → From a manifest,将复制的清单粘贴到 JSON 标签页,选择要添加应用的工作区,然后创建应用。",
|
|
888
888
|
"onboarding.slackAppName": "应用名称",
|
|
889
|
-
"onboarding.slackAppNameHint": "
|
|
889
|
+
"onboarding.slackAppNameHint": "请输入最多35个字符的应用名称。机器人名称由此生成;若名称中没有可用的半角字符,则回退为 cli-jaw。",
|
|
890
890
|
"onboarding.slackGenerateManifest": "生成清单",
|
|
891
891
|
"onboarding.slackManifestGenerating": "正在生成...",
|
|
892
892
|
"onboarding.slackManifestReady": "已复制",
|
|
893
|
+
"onboarding.slackManifestCopiedWithBot": "已复制清单。机器人名称:{bot}",
|
|
893
894
|
"onboarding.slackManifestError": "无法生成或复制清单,请重试。",
|
|
894
|
-
"onboarding.slackAppNameError": "
|
|
895
|
+
"onboarding.slackAppNameError": "请输入1到35个字符的应用名称。",
|
|
895
896
|
"onboarding.warning.missingCapabilities": "缺少可选权限 {capabilities},相应功能已关闭。请添加权限并重新安装应用。文本消息仍可使用。",
|
|
896
897
|
"onboarding.token.botToken": "机器人令牌",
|
|
897
898
|
"onboarding.token.appToken": "应用级令牌",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// #312: the Settings panel used to read /api/cli-status once, so a probe that
|
|
2
|
+
// was still running when the page mounted left "상태 확인 중" on screen forever.
|
|
3
|
+
//
|
|
4
|
+
// The server cannot fix this on its own: CliStatusCache is demand-driven and
|
|
5
|
+
// has no timer (src/cli/cli-status.ts), so a snapshot only advances when
|
|
6
|
+
// somebody reads it again. The UI has to be that somebody — but bounded, since
|
|
7
|
+
// a read can fork a worker that runs real CLI probes.
|
|
8
|
+
|
|
9
|
+
export type CliStatusProbeState = 'checking' | 'fresh' | 'stale' | 'failing';
|
|
10
|
+
|
|
11
|
+
export type PollableCliStatus = {
|
|
12
|
+
probeState?: CliStatusProbeState;
|
|
13
|
+
/** Server-provided backoff deadline, present while probeState is `failing`. */
|
|
14
|
+
nextRetryAt?: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** Floor for the first delay: a GET can fork a worker running real CLI probes. */
|
|
18
|
+
export const CLI_STATUS_MIN_DELAY_MS = 1_000;
|
|
19
|
+
export const CLI_STATUS_MAX_DELAY_MS = 8_000;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The worker itself may legitimately run for 60s
|
|
23
|
+
* (WORKER_OUTER_TIMEOUT_MS in src/cli/cli-status-worker.ts). Give it that plus
|
|
24
|
+
* room for one observing read, or a healthy slow host gets reported as a
|
|
25
|
+
* timeout.
|
|
26
|
+
*/
|
|
27
|
+
export const CLI_STATUS_POLL_HORIZON_MS = 90_000;
|
|
28
|
+
export const CLI_STATUS_MAX_ATTEMPTS = 24;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* `failing` is deliberately NOT terminal. The cache restarts probing on the
|
|
32
|
+
* first read after its backoff expires, so a UI that stops on `failing` would
|
|
33
|
+
* simply swap one permanent notice for another and never observe the recovery.
|
|
34
|
+
*/
|
|
35
|
+
export function shouldPollCliStatus(
|
|
36
|
+
snapshot: Record<string, PollableCliStatus> | null | undefined,
|
|
37
|
+
cli: string | null | undefined,
|
|
38
|
+
): boolean {
|
|
39
|
+
if (!snapshot || !cli) return false;
|
|
40
|
+
const state = snapshot[cli]?.probeState;
|
|
41
|
+
if (!state) return false;
|
|
42
|
+
return state === 'checking' || state === 'failing';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Gentle backoff between the floor and the ceiling. */
|
|
46
|
+
export function nextCliStatusPollDelay(attempt: number): number {
|
|
47
|
+
const step = Number.isFinite(attempt) && attempt > 0 ? Math.floor(attempt) : 0;
|
|
48
|
+
const delay = CLI_STATUS_MIN_DELAY_MS * 2 ** Math.min(step, 8);
|
|
49
|
+
return Math.min(Math.max(delay, CLI_STATUS_MIN_DELAY_MS), CLI_STATUS_MAX_DELAY_MS);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type PollSchedule =
|
|
53
|
+
| { kind: 'stop' }
|
|
54
|
+
| { kind: 'exhausted' }
|
|
55
|
+
| { kind: 'wait'; delayMs: number };
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Decides the next move. Two independent bounds, neither of which resets on
|
|
59
|
+
* server responses: a wall-clock deadline and a cap on real requests. Waiting
|
|
60
|
+
* out a server backoff must NOT consume an attempt, or a host that is merely
|
|
61
|
+
* backing off would be declared timed-out without ever being asked again.
|
|
62
|
+
*/
|
|
63
|
+
export function planCliStatusPoll(input: {
|
|
64
|
+
snapshot: Record<string, PollableCliStatus> | null | undefined;
|
|
65
|
+
cli: string | null | undefined;
|
|
66
|
+
attempts: number;
|
|
67
|
+
now: number;
|
|
68
|
+
deadline: number;
|
|
69
|
+
}): PollSchedule {
|
|
70
|
+
const { snapshot, cli, attempts, now, deadline } = input;
|
|
71
|
+
if (!shouldPollCliStatus(snapshot, cli)) return { kind: 'stop' };
|
|
72
|
+
if (now >= deadline) return { kind: 'exhausted' };
|
|
73
|
+
if (attempts >= CLI_STATUS_MAX_ATTEMPTS) return { kind: 'exhausted' };
|
|
74
|
+
|
|
75
|
+
const backoff = snapshot?.[cli!]?.nextRetryAt;
|
|
76
|
+
const earliest = typeof backoff === 'number' && backoff > now
|
|
77
|
+
? backoff
|
|
78
|
+
: now + nextCliStatusPollDelay(attempts);
|
|
79
|
+
// A backoff reaching past the deadline means the answer will not arrive in
|
|
80
|
+
// time: wait until the deadline and report exhaustion there rather than
|
|
81
|
+
// firing a doomed request or arming an unbounded timer.
|
|
82
|
+
const target = Math.min(earliest, deadline);
|
|
83
|
+
return { kind: 'wait', delayMs: Math.max(target - now, 0) };
|
|
84
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
import type { SettingsPageProps, DirtyEntry } from '../types';
|
|
3
|
+
import {
|
|
4
|
+
CLI_STATUS_POLL_HORIZON_MS,
|
|
5
|
+
planCliStatusPoll,
|
|
6
|
+
} from '../cli-status-polling';
|
|
3
7
|
import {
|
|
4
8
|
PageError,
|
|
5
9
|
PageLoading,
|
|
@@ -59,6 +63,8 @@ type CliStatusInfo = {
|
|
|
59
63
|
capabilityReady: boolean | null;
|
|
60
64
|
probeState: 'checking' | 'fresh' | 'stale' | 'failing';
|
|
61
65
|
probeError?: string;
|
|
66
|
+
/** Server backoff deadline; used to time re-reads while `failing`. */
|
|
67
|
+
nextRetryAt?: number;
|
|
62
68
|
};
|
|
63
69
|
|
|
64
70
|
export function conflictSettingsFromError(error: unknown): AgentSnapshot | null {
|
|
@@ -123,9 +129,24 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
|
|
|
123
129
|
}
|
|
124
130
|
}, [client]);
|
|
125
131
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
// Generation ref, same convention as Browser.tsx: clearing a timer does not
|
|
133
|
+
// stop a request that is already in flight, and that response would
|
|
134
|
+
// otherwise setState after unmount or after the user switched CLI.
|
|
135
|
+
const cliStatusGenRef = useRef(0);
|
|
136
|
+
const cliStatusRef = useRef<Record<string, CliStatusInfo>>({});
|
|
137
|
+
const [cliStatusExhausted, setCliStatusExhausted] = useState(false);
|
|
138
|
+
|
|
139
|
+
const loadCliStatus = useCallback(async (gen?: number) => {
|
|
140
|
+
try {
|
|
141
|
+
const next = await client.get<Record<string, CliStatusInfo>>('/api/cli-status');
|
|
142
|
+
if (gen !== undefined && gen !== cliStatusGenRef.current) return;
|
|
143
|
+
cliStatusRef.current = next;
|
|
144
|
+
setCliStatus(next);
|
|
145
|
+
} catch {
|
|
146
|
+
if (gen !== undefined && gen !== cliStatusGenRef.current) return;
|
|
147
|
+
cliStatusRef.current = {};
|
|
148
|
+
setCliStatus({});
|
|
149
|
+
}
|
|
129
150
|
}, [client]);
|
|
130
151
|
|
|
131
152
|
const loadFlush = useCallback(async () => {
|
|
@@ -165,6 +186,57 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
|
|
|
165
186
|
void loadEmployees();
|
|
166
187
|
}, [loadCliMeta, loadCliStatus, loadEmployees, loadFlush]);
|
|
167
188
|
|
|
189
|
+
// #312: the server never pushes — CliStatusCache is demand-driven and has
|
|
190
|
+
// no timer — so a probe still running at mount would leave the notice up
|
|
191
|
+
// forever unless we ask again. Bounded by a wall-clock horizon AND a
|
|
192
|
+
// request cap, neither of which resets on server responses.
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
if (!draft.cli) return;
|
|
195
|
+
const gen = cliStatusGenRef.current + 1;
|
|
196
|
+
cliStatusGenRef.current = gen;
|
|
197
|
+
setCliStatusExhausted(false);
|
|
198
|
+
|
|
199
|
+
const deadline = Date.now() + CLI_STATUS_POLL_HORIZON_MS;
|
|
200
|
+
let attempts = 0;
|
|
201
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
202
|
+
|
|
203
|
+
const tick = () => {
|
|
204
|
+
if (gen !== cliStatusGenRef.current) return;
|
|
205
|
+
const plan = planCliStatusPoll({
|
|
206
|
+
snapshot: cliStatusRef.current,
|
|
207
|
+
cli: draft.cli,
|
|
208
|
+
attempts,
|
|
209
|
+
now: Date.now(),
|
|
210
|
+
deadline,
|
|
211
|
+
});
|
|
212
|
+
if (plan.kind === 'stop') return;
|
|
213
|
+
if (plan.kind === 'exhausted') {
|
|
214
|
+
setCliStatusExhausted(true);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
timer = setTimeout(() => {
|
|
218
|
+
if (gen !== cliStatusGenRef.current) return;
|
|
219
|
+
// Only a real request consumes the cap; waiting out a server
|
|
220
|
+
// backoff must not burn attempts.
|
|
221
|
+
attempts += 1;
|
|
222
|
+
void loadCliStatus(gen).then(() => {
|
|
223
|
+
if (gen === cliStatusGenRef.current) tick();
|
|
224
|
+
});
|
|
225
|
+
}, plan.delayMs);
|
|
226
|
+
};
|
|
227
|
+
tick();
|
|
228
|
+
|
|
229
|
+
return () => {
|
|
230
|
+
// Poison in-flight responses for this generation, then stop the timer.
|
|
231
|
+
cliStatusGenRef.current = gen + 1;
|
|
232
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
233
|
+
};
|
|
234
|
+
// NOTE: cliStatus is deliberately NOT a dependency. Re-running this
|
|
235
|
+
// effect on every response would reset the deadline and the attempt
|
|
236
|
+
// counter, making both bounds unbounded in practice. The latest
|
|
237
|
+
// snapshot is read through a ref instead.
|
|
238
|
+
}, [draft.cli, loadCliStatus]);
|
|
239
|
+
|
|
168
240
|
useEffect(() => {
|
|
169
241
|
if (state.kind !== 'ready') return;
|
|
170
242
|
const cliKeys = Object.keys(state.data.perCli || {});
|
|
@@ -331,9 +403,16 @@ export default function Agent({ port, client, dirty, registerSave }: SettingsPag
|
|
|
331
403
|
{sessionMigrationError ? <span className="settings-field-error" role="alert">{sessionMigrationError}</span> : null}
|
|
332
404
|
</div>
|
|
333
405
|
) : null}
|
|
334
|
-
{cliStatus[draft.cli]?.probeState === 'checking' ? (
|
|
406
|
+
{cliStatus[draft.cli]?.probeState === 'checking' && !cliStatusExhausted ? (
|
|
335
407
|
<div className="settings-inline-notice" role="status" aria-live="polite">상태 확인 중</div>
|
|
336
408
|
) : null}
|
|
409
|
+
{cliStatusExhausted ? (
|
|
410
|
+
// Without this, a poll that runs out while the snapshot still
|
|
411
|
+
// says `checking` would leave the exact notice #312 reported.
|
|
412
|
+
<div className="settings-inline-notice" role="alert">
|
|
413
|
+
상태 확인이 끝나지 않았습니다. 새로고침하거나 잠시 후 다시 확인하세요.
|
|
414
|
+
</div>
|
|
415
|
+
) : null}
|
|
337
416
|
{cliStatus[draft.cli]?.probeState === 'failing' ? (
|
|
338
417
|
// Without this the panel stays silent while every probe errors,
|
|
339
418
|
// which is the state #277 reported as an endless "stale".
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
param(
|
|
1
|
+
param(
|
|
2
2
|
[switch]$Force,
|
|
3
3
|
[switch]$Update,
|
|
4
4
|
[switch]$Upstream,
|
|
@@ -40,11 +40,46 @@ function Normalize-Version([string]$version) {
|
|
|
40
40
|
return $version.Trim().TrimStart('v')
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
function Get-LatestRelease([string]$repoName) {
|
|
44
|
+
return Invoke-RestMethod -Uri "https://api.github.com/repos/$repoName/releases/latest" -Headers @{ "User-Agent" = "cli-jaw-postinstall" }
|
|
45
|
+
}
|
|
46
|
+
|
|
43
47
|
function Get-LatestTag([string]$repoName) {
|
|
44
|
-
$release =
|
|
48
|
+
$release = Get-LatestRelease $repoName
|
|
45
49
|
return [string]$release.tag_name
|
|
46
50
|
}
|
|
47
51
|
|
|
52
|
+
function Assert-AssetPublished([string]$repoName, [string]$assetName) {
|
|
53
|
+
try {
|
|
54
|
+
$release = Get-LatestRelease $repoName
|
|
55
|
+
} catch {
|
|
56
|
+
# Match the shell installer's network fallback: if GitHub metadata itself is
|
|
57
|
+
# unavailable, let the download report the concrete transport failure.
|
|
58
|
+
Write-Warn "Could not inspect $repoName release assets; the download will verify availability"
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
$published = @($release.assets | ForEach-Object { [string]$_.name } | Where-Object { $_ })
|
|
63
|
+
if ($published -contains $assetName) { return }
|
|
64
|
+
|
|
65
|
+
$tag = if ($release.tag_name) { [string]$release.tag_name } else { "unknown" }
|
|
66
|
+
$publishedText = if ($published.Count -gt 0) { $published -join " " } else { "(none)" }
|
|
67
|
+
$lines = @(
|
|
68
|
+
"$repoName latest release ($tag) has no $assetName.",
|
|
69
|
+
" published: $publishedText"
|
|
70
|
+
)
|
|
71
|
+
if ($repoName -eq "lidge-jun/OfficeCLI") {
|
|
72
|
+
$lines += @(
|
|
73
|
+
"",
|
|
74
|
+
" The supported fork currently publishes only officecli-mac-arm64.",
|
|
75
|
+
" For general XLSX/accessibility work use upstream, which builds every platform:",
|
|
76
|
+
" powershell -ExecutionPolicy Bypass -File `"$PSCommandPath`" -Upstream",
|
|
77
|
+
" The fork is required only for CJK font handling and HWP (rhwp sidecars)."
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
Fail ($lines -join [Environment]::NewLine)
|
|
81
|
+
}
|
|
82
|
+
|
|
48
83
|
Write-Info "Platform: win32/$arch -> $asset"
|
|
49
84
|
|
|
50
85
|
if ((Test-Path $targetBin) -and -not $Force -and -not $Update) {
|
|
@@ -85,6 +120,7 @@ if ((Test-Path $targetBin) -and -not $Force -and $Update) {
|
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
122
|
|
|
123
|
+
Assert-AssetPublished $Repo $asset
|
|
88
124
|
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
|
|
89
125
|
$downloadUrl = "https://github.com/$Repo/releases/latest/download/$asset"
|
|
90
126
|
|
|
@@ -96,6 +96,33 @@ get_latest_version() {
|
|
|
96
96
|
curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null | sed -nE 's/.*"tag_name"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/p' | head -n 1
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
# Fail closed when the release has no build for this platform.
|
|
100
|
+
#
|
|
101
|
+
# The download URL is releases/latest/download/<asset>, so a release that omits
|
|
102
|
+
# our asset produced a bare 404 from curl with nothing naming the real problem.
|
|
103
|
+
# That is the state the fork is in right now: v1.0.98 ships only
|
|
104
|
+
# officecli-mac-arm64, so every other platform hit the 404 path (cli-jaw#280).
|
|
105
|
+
assert_asset_published() {
|
|
106
|
+
local assets
|
|
107
|
+
assets=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null \
|
|
108
|
+
| sed -nE 's/.*"name"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/p')
|
|
109
|
+
|
|
110
|
+
# No asset list means the API is unreachable or rate-limited. Do not block the
|
|
111
|
+
# install on that: let the download attempt produce the real error.
|
|
112
|
+
[ -z "$assets" ] && return 0
|
|
113
|
+
|
|
114
|
+
if ! printf '%s\n' "$assets" | grep -qx "$ASSET"; then
|
|
115
|
+
fail "$(printf '%s\n' \
|
|
116
|
+
"${REPO} latest release (${1:-unknown}) has no ${ASSET}." \
|
|
117
|
+
" published: $(printf '%s ' $assets)" \
|
|
118
|
+
"" \
|
|
119
|
+
" The supported fork currently publishes only officecli-mac-arm64." \
|
|
120
|
+
" For general XLSX/accessibility work use upstream, which builds every platform:" \
|
|
121
|
+
" bash $0 --upstream" \
|
|
122
|
+
" The fork is required only for CJK font handling and HWP (rhwp sidecars).")"
|
|
123
|
+
fi
|
|
124
|
+
}
|
|
125
|
+
|
|
99
126
|
# ── Check existing installation ──
|
|
100
127
|
if [ -f "$TARGET_BIN" ] && [ "$FORCE" = "false" ] && [ "$UPDATE" = "false" ]; then
|
|
101
128
|
if CURRENT=$("$TARGET_BIN" --version 2>/dev/null); then
|
|
@@ -131,6 +158,7 @@ fi
|
|
|
131
158
|
|
|
132
159
|
# ── Download ──
|
|
133
160
|
mkdir -p "$INSTALL_DIR"
|
|
161
|
+
assert_asset_published "$(get_latest_version)"
|
|
134
162
|
DOWNLOAD_URL="https://github.com/${REPO}/releases/latest/download/${ASSET}"
|
|
135
163
|
CHECKSUM_URL="https://github.com/${REPO}/releases/latest/download/SHA256SUMS"
|
|
136
164
|
ASSET_BASE="${ASSET%.exe}"
|
package/scripts/install.ps1
CHANGED
|
@@ -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"./settings-client-CjbBShxm.js";import{t as i}from"./error-normalize-BzeO0SXE.js";import{a,i as o,n as s,r as c,t as l}from"./page-shell-LF7vVVfG.js";import{i as u,s as d}from"./fields-zkeByFQW.js";import{a as f,n as p,o as m}from"./Permissions-CnKt44dN.js";import{a as ee,c as h,i as g,l as _,n as v,o as y,r as b,s as x,t as te}from"./agent-meta-Y3DE6sxh.js";import{t as S}from"./path-utils-LsJeDCKF.js";var C=e(t(),1),w=n();function ne({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:i,modelOptions:a,effort:s,effortOptions:c,workingDir:l,workingDirError:f,cliMeta:p,onCliChange:m,onProviderChange:ee,onModelChange:h,onEffortChange:_,onWorkingDirChange:v}){let y=x(t),b=y.filter(e=>te.includes(e)).length;return(0,w.jsx)(o,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,w.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,w.jsx)(u,{id:`agent-cli`,label:`Active CLI`,value:e,options:y.map(e=>({value:e,label:g(e,p).label||e})),collapsedAfter:b,onChange:m}),r.length>0?(0,w.jsx)(u,{id:`agent-${e}-provider`,label:`Provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>ee?.(e)}):null,(0,w.jsx)(u,{id:`agent-model`,label:`Active model`,value:i,options:a.length>0?a:[{value:``,label:`(default)`}],onChange:h}),(0,w.jsx)(u,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...c.map(e=>({value:e,label:e}))],disabled:c.length===0,onChange:_}),(0,w.jsx)(d,{id:`agent-workingDir`,label:`Working directory`,value:l,error:f,placeholder:`/path/to/project`,onChange:v})]})})}var T=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function re({value:e,onChange:t}){let n=f(e),r=n.mode===`custom`?`custom`:`auto`,i=n.mode===`custom`?n.tokens:[],a=n.mode===`custom`?`${i.length} explicit token${i.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,w.jsxs)(o,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,w.jsx)(u,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:T,onChange:e=>{t(e===`auto`?`auto`:i.length>0&&p(i)?i:m(null))}}),(0,w.jsx)(`p`,{className:`settings-agent-note`,children:a})]})}function ie({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:i,cliMeta:a,loading:s,error:c,onFlushCliChange:l,onFlushModelChange:d}){let f=t||e,p=f?g(f,a).label||f:`active`;return(0,w.jsx)(o,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,w.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:`Flush runtime`}),(0,w.jsxs)(`code`,{children:[p,n&&n!==`default`?` / ${n}`:``]})]}),s?(0,w.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,c?(0,w.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:c}):null,(0,w.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,w.jsx)(u,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:g(e,a).label||e}))],onChange:l}),(0,w.jsx)(u,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...i],onChange:d})]})]})})}function E(e){return e.source===`static`||e.id.startsWith(`static:`)}function D(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function ae(e,t){let n=e[0]||`claude`,r=t?.[n]?.models?.[0]||`default`;return{id:D(),name:`New Agent`,cli:n,model:r,role:``,status:`idle`,source:`db`}}function oe(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function se(e,t){return JSON.stringify(e.map(F))===JSON.stringify(t.map(F))}function j(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=ce(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!E(t)&&o.push(t);return{added:i,updated:a,removed:o}}function M(e,t){let n=j(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function N(e,t,n){let r=j(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,P(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function ce(e,t){if(E(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function P(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function F(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function I({employee:e,index:t,cliOptions:n,cliMeta:r,onChange:i,onRemove:a}){let o=E(e),s=y(g(e.cli,r).models,e.model),c=k(e),l=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,w.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,w.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,o?(0,w.jsx)(`span`,{children:`static`}):null]}),(0,w.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,w.jsx)(d,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:o,error:c===`Name is required`?c:null,onChange:e=>i({name:e})}),(0,w.jsx)(u,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:o,options:l.map(e=>({value:e,label:g(e,r).label||e})),onChange:e=>{i({cli:e,model:g(e,r).models[0]||`default`})}}),(0,w.jsx)(u,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:s.length>0?s:[{value:`default`,label:`default`}],onChange:e=>i({model:e})}),(0,w.jsx)(d,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:o,onChange:e=>i({role:e})})]}),(0,w.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,w.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:o,onClick:a,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function le({roster:e,original:t,cliOptions:n,cliMeta:r,loading:i,error:a,onRosterChange:s}){let c=M(t,e),l=A(e);function u(t,n){s(e.map((e,r)=>r===t?{...e,...n}:e))}function d(t){s(e.filter((e,n)=>n!==t))}return(0,w.jsxs)(o,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,w.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,w.jsxs)(`span`,{children:[`+`,c.added]}),(0,w.jsxs)(`span`,{children:[`~`,c.updated]}),(0,w.jsxs)(`span`,{children:[`-`,c.removed]}),l?(0,w.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),i?(0,w.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,w.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,w.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,w.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,w.jsx)(I,{employee:e,index:t,cliOptions:n,cliMeta:r??null,onChange:e=>u(t,e),onRemove:()=>d(t)},e.id))}),(0,w.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>s([...e,ae(n,r)]),children:`+ Add employee`})})]})}var L=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function R(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):L.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function ue(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=R(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,S(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await N(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function z(e){if(!(e instanceof r)||e.status!==409)return null;try{return JSON.parse(e.detail).settings??null}catch{return null}}function B({port:e,client:t,dirty:n,registerSave:r}){let{state:o,refresh:u,setData:d}=a(t,`/api/settings`),[p,m]=(0,C.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[x,te]=(0,C.useState)({}),[S,T]=(0,C.useState)({}),[E,D]=(0,C.useState)(!0),[ae,O]=(0,C.useState)(null),[k,j]=(0,C.useState)([]),[M,N]=(0,C.useState)([]),[ce,P]=(0,C.useState)(!0),[F,I]=(0,C.useState)(null),[L,R]=(0,C.useState)(null),[B,de]=(0,C.useState)({}),[fe,pe]=(0,C.useState)(!1),[me,he]=(0,C.useState)(null),[ge,_e]=(0,C.useState)(!1),[ve,ye]=(0,C.useState)(null),V=(0,C.useCallback)(async()=>{try{let e=await t.get(`/api/cli-registry`);R(ee(e&&typeof e==`object`&&`data`in e?e.data:e))}catch{R(null)}},[t]),be=(0,C.useCallback)(async()=>{try{de(await t.get(`/api/cli-status`))}catch{de({})}},[t]),H=(0,C.useCallback)(async()=>{D(!0),O(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};te(n),T(n)}catch(e){O(e instanceof Error?e.message:String(e))}finally{D(!1)}},[t]),U=(0,C.useCallback)(async()=>{P(!0),I(null);try{let e=oe(await t.get(`/api/employees`));j(e),N(e)}catch(e){I(e instanceof Error?e.message:String(e))}finally{P(!1)}},[t]);(0,C.useEffect)(()=>{V(),be(),H(),U()},[V,be,U,H]),(0,C.useEffect)(()=>{if(o.kind!==`ready`)return;let e=Object.keys(o.data.perCli||{}),t=o.data.cli||e[0]||``,n=f(o.data.permissions),r=g(t,L);m({cli:t,provider:o.data.perCli?.[t]?.provider||r.defaultProvider||``,model:_(t,o.data.perCli,o.data.activeOverrides),effort:h(t,o.data.perCli,o.data.activeOverrides),workingDir:o.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[L,o]),(0,C.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let W=(0,C.useCallback)((e,t)=>n.set(e,t),[n]),G=(0,C.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await ue({client:t,bundle:e,employeeDraft:M,employeeOriginal:k});n.clear(),r&&d(r),await u(),await V(),await H(),await U()},[t,n,M,k,V,U,H,u,d]);(0,C.useEffect)(()=>{if(r)return r(G),()=>r(null)},[r,G]);let K=o.kind===`ready`?o.data:{},q=K.perCli||{},J=K.activeOverrides||{},Y=(0,C.useMemo)(()=>Object.keys(q),[q]),X=g(p.cli,L),Z=p.provider||X.defaultProvider||X.providers?.[0]||``,xe=p.cli===`pi`,Q=!xe&&(X.providers?.length??0)>0,Se=y(Q&&X.modelsByProvider?.[Z]||X.models,p.model),Ce=Q?b(X,p.model,X.effortsByProvider?.[Z]||X.efforts,Z):b(X,p.model),we=p.workingDir.trim()?null:`Required`,Te=(0,C.useCallback)(async e=>{pe(!0),he(null);try{let n=await t.post(`/api/settings/runtime-default-migration`,{action:e}),r;r=`settings`in n&&n.settings?n.settings:`data`in n&&n.data?n.data:n,d(r)}catch(e){let t=z(e);if(t){d(t);return}he(i(e))}finally{pe(!1)}},[t,d]),Ee=(0,C.useCallback)(async e=>{_e(!0),ye(null);try{let n=await t.post(`/api/settings/multi-session-default-migration`,{action:e}),r;r=`settings`in n&&n.settings?n.settings:`data`in n&&n.data?n.data:n,d(r)}catch(e){let t=z(e);if(t){d(t);return}ye(i(e))}finally{_e(!1)}},[t,d]);if(o.kind===`loading`)return(0,w.jsx)(s,{});if(o.kind===`offline`)return(0,w.jsx)(c,{port:e});if(o.kind===`error`)return(0,w.jsx)(l,{message:o.message});function De(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){m(e)}return(0,w.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),G()},children:[K.runtimeDefaultMigration?.state===`pending`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,w.jsx)(`strong`,{children:`기본 런타임 변경 안내`}),(0,w.jsx)(`p`,{children:`기존 선택은 유지됩니다. Codex App으로 전환하거나 현재 런타임을 계속 사용할 수 있습니다.`}),(0,w.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:fe,onClick:()=>void Te(`accept`),children:`Codex App 사용`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:fe,onClick:()=>void Te(`keep`),children:`현재 런타임 유지`})]}),me?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:me}):null]}):null,K.multiSessionDefaultMigration?.state===`pending`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,w.jsx)(`strong`,{children:`다중 세션 안내`}),(0,w.jsx)(`p`,{children:`대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 2로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 설정은 그대로 유지됩니다.`}),(0,w.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:ge,onClick:()=>void Ee(`accept`),children:`다중 세션 켜기`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:ge,onClick:()=>void Ee(`keep`),children:`지금 설정 유지`})]}),ve?(0,w.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:ve}):null]}):null,B[p.cli]?.probeState===`checking`?(0,w.jsx)(`div`,{className:`settings-inline-notice`,role:`status`,"aria-live":`polite`,children:`상태 확인 중`}):null,B[p.cli]?.probeState===`failing`?(0,w.jsxs)(`div`,{className:`settings-inline-notice`,role:`alert`,children:[`상태 확인 실패 (재시도 중)`,B[p.cli]?.probeError?`: ${B[p.cli].probeError}`:``]}):null,(0,w.jsx)(ne,{cli:p.cli,cliOptions:Y.length>0?Y:[p.cli||`claude`],provider:Z,providerOptions:xe?[]:X.providers||[],model:p.model,modelOptions:Se,effort:p.effort,effortOptions:Ce,workingDir:p.workingDir,workingDirError:we,cliMeta:L,onCliChange:e=>{let t=g(e,L),n={...p,cli:e,provider:q[e]?.provider||t.defaultProvider||``,model:_(e,q,J),effort:h(e,q,J)};De(),$(n),W(`cli`,{value:e,original:K.cli||``,valid:!0})},onProviderChange:e=>{let t=X.modelsByProvider?.[e]||[],n=X.effortsByProvider?.[e]||[],r=t.includes(p.model)?p.model:t[0]||``,i=v(X,r,p.effort,n,e);$({...p,provider:e,model:r,effort:i}),W(`perCli.${p.cli}.provider`,{value:e,original:q[p.cli]?.provider||X.defaultProvider||``,valid:!0}),W(`activeOverrides.${p.cli}.model`,{value:r,original:_(p.cli,q,J),valid:r.trim().length>0}),W(`activeOverrides.${p.cli}.effort`,{value:i,original:h(p.cli,q,J),valid:!0})},onModelChange:e=>{let t=v(X,e,p.effort,Q?X.effortsByProvider?.[Z]||X.efforts:void 0,Q?Z:void 0);$({...p,model:e,effort:t}),W(`activeOverrides.${p.cli}.model`,{value:e,original:_(p.cli,q,J),valid:e.trim().length>0}),t!==p.effort&&W(`activeOverrides.${p.cli}.effort`,{value:t,original:h(p.cli,q,J),valid:!0})},onEffortChange:e=>{$({...p,effort:e}),W(`activeOverrides.${p.cli}.effort`,{value:e,original:h(p.cli,q,J),valid:!0})},onWorkingDirChange:e=>{$({...p,workingDir:e}),W(`workingDir`,{value:e,original:K.workingDir||``,valid:e.trim().length>0})}}),(0,w.jsx)(re,{value:p.permissions,onChange:e=>{$({...p,permissions:e}),W(`permissions`,{value:e,original:K.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,w.jsx)(ie,{activeCli:p.cli,flushCli:S.cli||``,flushModel:S.model||``,cliOptions:Y,cliMeta:L,modelOptions:y(g(S.cli||p.cli,L).models,S.model||``),loading:E,error:ae,onFlushCliChange:e=>{let t=e&&g(e,L).models[0]||``;T({cli:e,model:t}),W(`flushCli`,{value:e,original:x.cli||``,valid:!0}),W(`flushModel`,{value:t,original:x.model||``,valid:!0})},onFlushModelChange:e=>{T({...S,model:e}),W(`flushModel`,{value:e,original:x.model||``,valid:!0})}}),(0,w.jsx)(le,{roster:M,original:k,cliOptions:Y,cliMeta:L,loading:ce,error:F,onRosterChange:e=>{if(N(e),se(e,k)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:k,valid:!A(e)})}})]})}export{z as conflictSettingsFromError,B as default,R as splitAgentSaveBundle};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./bgtask-badge-D6XYRFI5.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./iframe-renderer-D1-zDg8V.js";export{e as refreshFileWidget};
|