cli-jaw 2.17.72 → 2.17.73
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 +16 -0
- package/dist/src/agent/aside-catalog.js +339 -0
- package/dist/src/agent/aside-catalog.js.map +1 -0
- package/dist/src/agent/aside-cli.js +208 -0
- package/dist/src/agent/aside-cli.js.map +1 -0
- package/dist/src/agent/aside-replay.js +120 -0
- package/dist/src/agent/aside-replay.js.map +1 -0
- package/dist/src/agent/aside-runtime.js +175 -0
- package/dist/src/agent/aside-runtime.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +26 -18
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +3 -0
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/prompt-context.js +2 -2
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/session-persistence.js +2 -0
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/backend-aside.js +314 -0
- package/dist/src/agent/spawn/backend-aside.js.map +1 -0
- package/dist/src/agent/spawn/resume.js +3 -0
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn-env.js +5 -0
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +60 -6
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +2 -1
- package/dist/src/cli/cli-status-worker.js.map +1 -1
- package/dist/src/cli/employee-handler.js +2 -0
- package/dist/src/cli/employee-handler.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +20 -8
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +2 -0
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/readiness.js +7 -3
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +47 -0
- package/dist/src/cli/registry-live.js.map +1 -1
- package/dist/src/cli/registry.js +5 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/config.js +10 -3
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/employees.js +5 -3
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/settings-merge.js +35 -0
- package/dist/src/core/settings-merge.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/orchestrator/gateway.js +2 -0
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/routes/employees.js +8 -0
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +4 -0
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/orchestrate.js +22 -3
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +23 -0
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/shared/aside-contract.js +2 -0
- package/dist/src/shared/aside-contract.js.map +1 -0
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +186 -175
- package/public/dist/assets/{Activity-DPLlOJ46.js → Activity-DsBgOkCP.js} +1 -1
- package/public/dist/assets/{AdvancedExport-BgOgGvc5.js → AdvancedExport-COGQ7vbK.js} +1 -1
- package/public/dist/assets/Agent-6qGQN7lY.js +1 -0
- package/public/dist/assets/AsideSelectionFields-DvU5xWAP.js +1 -0
- package/public/dist/assets/{Browser-m6VynQXV.js → Browser-r09vOsR1.js} +1 -1
- package/public/dist/assets/ChannelEnablementControl-ooOkdd-Q.js +85 -0
- package/public/dist/assets/{ChannelSetupEntry-DHLoZEzJ.js → ChannelSetupEntry-B0b4TdhH.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-B-G8vsYy.js → ChannelsDiscord-9EMLt5b3.js} +1 -1
- package/public/dist/assets/{ChannelsSlack-oPuh922z.js → ChannelsSlack-B8ETzWFt.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-PmTv43KQ.js → ChannelsTelegram-CflLUsQw.js} +1 -1
- package/public/dist/assets/{DashboardMeta-BqEiJrvr.js → DashboardMeta-wjEuh9-E.js} +1 -1
- package/public/dist/assets/{Developer-CbySB7_Z.js → Developer-B3cDkldo.js} +1 -1
- package/public/dist/assets/{Display-DU4_76cS.js → Display-BXQxpv6-.js} +1 -1
- package/public/dist/assets/{Display-C0Zdamcb.js → Display-Cl4DD334.js} +1 -1
- package/public/dist/assets/{Embedding-CCFMOB_2.js → Embedding-D-T92-En.js} +1 -1
- package/public/dist/assets/{Employees-BanvF58d.js → Employees-Cf4IeF0N.js} +1 -1
- package/public/dist/assets/{Heartbeat-uyi_MpUd.js → Heartbeat-Bj8V_bUM.js} +1 -1
- package/public/dist/assets/{Mcp-rjPoL_Zo.js → Mcp-jAcut_fw.js} +1 -1
- package/public/dist/assets/Memory-BOXkBFKg.js +1 -0
- package/public/dist/assets/ModelProvider-DIDQ37z-.js +1 -0
- package/public/dist/assets/{Network-CuqFrOvR.js → Network-I5eOe2hf.js} +1 -1
- package/public/dist/assets/{Permissions-BltXiZnz.js → Permissions-B7PthH01.js} +1 -1
- package/public/dist/assets/{Permissions-DcCbFMIq.js → Permissions-BCYUfJg1.js} +1 -1
- package/public/dist/assets/Profile-CYPMVhQM.js +1 -0
- package/public/dist/assets/{Prompts-C9vY8ivQ.js → Prompts-BRAgZLNQ.js} +1 -1
- package/public/dist/assets/{SpeechKeys-BJ8V7U5E.js → SpeechKeys-UlXNSFoe.js} +1 -1
- package/public/dist/assets/{TelegramHub-DtyjLGFR.js → TelegramHub-BhUFhIcv.js} +1 -1
- package/public/dist/assets/agent-meta-v4jNRAbX.js +1 -0
- package/public/dist/assets/app-SVIyP1TT.js +59 -0
- package/public/dist/assets/bgtask-badge-HIrvpcr_.js +1 -0
- package/public/dist/assets/{bgtask-badge-oPvZyylH.js → bgtask-badge-tYRnplEV.js} +1 -1
- package/public/dist/assets/constants-_iw-lnKY.js +1 -0
- package/public/dist/assets/{employees-BchFBkDz.js → employees-DNTPcxtZ.js} +2 -2
- package/public/dist/assets/{error-normalize-clOi-AAA.js → error-normalize-jnjrKZDu.js} +1 -1
- package/public/dist/assets/{iframe-renderer-CcGzEi0v.js → iframe-renderer--lHbKTDh.js} +2 -2
- package/public/dist/assets/iframe-renderer-DigNC5FU.js +1 -0
- package/public/dist/assets/{manager-nquYZ7_x.js → manager-qGH-xUZ7.js} +1 -1
- package/public/dist/assets/{memory-DTpD4see.js → memory-BAdRkBdk.js} +1 -1
- package/public/dist/assets/memory-DA8x5314.js +1 -0
- package/public/dist/assets/message-history-CGOgZH4l.js +1 -0
- package/public/dist/assets/{message-history-DSvflaZ9.js → message-history-PAYeKmia.js} +1 -1
- package/public/dist/assets/page-shell-Cz2ylri8.js +1 -0
- package/public/dist/assets/{render-D8dVQ_bm.js → render-F6xF6w6c.js} +1 -1
- package/public/dist/assets/settings-DMbNzuTm.js +1 -0
- package/public/dist/assets/{settings-DMiQe469.js → settings-DZ2-ca8T.js} +1 -1
- package/public/dist/assets/{settings-Bp0sgQ2a.js → settings-W0WFhBf2.js} +1 -1
- package/public/dist/assets/settings-core-2vZXNf6n.js +2 -0
- package/public/dist/assets/settings-core-BofMyzL9.js +1 -0
- package/public/dist/assets/{settings-embedding-BRW0WZvh.js → settings-embedding-Bjwpe8xu.js} +2 -2
- package/public/dist/assets/{shared-D1begqvi.js → shared-CftvKNY9.js} +1 -1
- package/public/dist/assets/{sidebar-CrpBbYFg.js → sidebar-Clkqd78q.js} +3 -3
- package/public/dist/assets/{skills-Bx8U-gJa.js → skills-0aA-RuN9.js} +1 -1
- package/public/dist/assets/skills-SqmQXndw.js +1 -0
- package/public/dist/assets/{slash-commands-DkrGUOnC.js → slash-commands-4zHHXEeU.js} +1 -1
- package/public/dist/assets/slash-commands-D5LqONzL.js +1 -0
- package/public/dist/assets/{trace-drawer-Dbe5pTbf.js → trace-drawer-B4O0Tl1M.js} +1 -1
- package/public/dist/assets/{ui-rnVAM91F.js → ui-CVtGpivr.js} +1 -1
- package/public/dist/assets/ui-_cqgseFX.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/js/constants.ts +5 -0
- package/public/js/features/employees.ts +3 -3
- package/public/js/features/heartbeat.ts +14 -1
- package/public/js/features/settings-core.ts +39 -13
- package/public/js/features/settings-types.ts +1 -1
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/settings/SettingsShell.tsx +1 -1
- package/public/manager/src/settings/pages/Agent.tsx +137 -52
- package/public/manager/src/settings/pages/Heartbeat.tsx +6 -0
- package/public/manager/src/settings/pages/Memory.tsx +8 -6
- package/public/manager/src/settings/pages/ModelProvider.tsx +31 -6
- package/public/manager/src/settings/pages/Profile.tsx +2 -2
- package/public/manager/src/settings/pages/components/AsideSelectionFields.tsx +33 -0
- package/public/manager/src/settings/pages/components/AvatarCard.tsx +22 -34
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +29 -1
- package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +7 -6
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +4 -4
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +5 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -0
- package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +3 -2
- package/public/manager/src/settings/pages/components/aside-models.ts +104 -0
- package/public/manager/src/settings/settings-client.ts +3 -1
- package/public/manager/src/settings/types.ts +1 -0
- package/public/dist/assets/Agent-O_U8ny90.js +0 -1
- package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +0 -85
- package/public/dist/assets/Memory-C9I33pIi.js +0 -1
- package/public/dist/assets/ModelProvider-fiUktMaO.js +0 -1
- package/public/dist/assets/Profile-DUL7-RE_.js +0 -1
- package/public/dist/assets/agent-meta-94LMwZZK.js +0 -1
- package/public/dist/assets/app-Iu76iEiU.js +0 -59
- package/public/dist/assets/bgtask-badge-DHo2mkMI.js +0 -1
- package/public/dist/assets/constants-DmZ9Rjym.js +0 -1
- package/public/dist/assets/iframe-renderer-DSLsfZq8.js +0 -1
- package/public/dist/assets/memory-BgUF3M9l.js +0 -1
- package/public/dist/assets/message-history-DkB768L3.js +0 -1
- package/public/dist/assets/page-shell-DfinU3mb.js +0 -1
- package/public/dist/assets/settings-DxjoyiIM.js +0 -1
- package/public/dist/assets/settings-core-CXWmPKUE.js +0 -1
- package/public/dist/assets/settings-core-D4zGy72z.js +0 -2
- package/public/dist/assets/skills-BY-hQnqM.js +0 -1
- package/public/dist/assets/slash-commands-C53T9J3g.js +0 -1
- package/public/dist/assets/ui-C0o427q6.js +0 -1
|
@@ -25,6 +25,7 @@ export function createSettingsClient(port: number, options: {
|
|
|
25
25
|
base?: string; getHeaders?: () => Promise<Record<string, string>>;
|
|
26
26
|
} = {}): SettingsClient {
|
|
27
27
|
const base = options.base ?? buildBaseUrl(port);
|
|
28
|
+
const url = (path: string): string => `${base}${path}`;
|
|
28
29
|
const headers: HeadersInit = { 'content-type': 'application/json' };
|
|
29
30
|
|
|
30
31
|
async function request<T>(
|
|
@@ -44,7 +45,7 @@ export function createSettingsClient(port: number, options: {
|
|
|
44
45
|
signal: init?.signal || controller.signal,
|
|
45
46
|
};
|
|
46
47
|
if (body !== undefined) fetchInit.body = JSON.stringify(body);
|
|
47
|
-
const response = await fetch(
|
|
48
|
+
const response = await fetch(url(path), fetchInit);
|
|
48
49
|
if (!response.ok) {
|
|
49
50
|
const detail = await response.text().catch(() => '');
|
|
50
51
|
throw new SettingsRequestError(method, path, response.status, detail);
|
|
@@ -66,6 +67,7 @@ export function createSettingsClient(port: number, options: {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
return {
|
|
70
|
+
url,
|
|
69
71
|
get: (path, init) => request('GET', path, undefined, init),
|
|
70
72
|
put: (path, body, init) => request('PUT', path, body, init),
|
|
71
73
|
post: (path, body, init) => request('POST', path, body, init),
|
|
@@ -66,6 +66,7 @@ export type SettingsPageProps = {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
export type SettingsClient = {
|
|
69
|
+
url(path: string): string;
|
|
69
70
|
get<T>(path: string, init?: RequestInit): Promise<T>;
|
|
70
71
|
put<T>(path: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
71
72
|
post<T>(path: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{r as t,t as n}from"./cli-engine-NdU0lzs_.js";import{n as r}from"./settings-types-CYKy0xz4.js";import{n as i,t as a}from"./jsx-runtime-CkEUZM6i.js";import{c as o,d as s,i as c,l,n as u,o as d,r as f,s as p,t as m,u as h}from"./page-shell-DfinU3mb.js";import{t as g}from"./error-normalize-clOi-AAA.js";import{i as _,s as v}from"./fields-CicOWY-X.js";import{c as y,n as ee,o as b,r as x,s as S}from"./Permissions-BltXiZnz.js";import{a as C,c as w,d as T,i as te,l as E,n as ne,o as re,r as ie,s as ae,t as oe,u as D}from"./agent-meta-94LMwZZK.js";import{t as O}from"./path-utils-B6vBr0DD.js";var k=e(i(),1),A=1e3,se=8e3,ce=9e4;function le(e,t){if(!e||!t)return!1;let n=e[t]?.probeState;return n?n===`checking`||n===`failing`:!1}function ue(e){let t=A*2**Math.min(Number.isFinite(e)&&e>0?Math.floor(e):0,8);return Math.min(Math.max(t,A),se)}function de(e){let{snapshot:t,cli:n,attempts:r,now:i,deadline:a}=e;if(!le(t,n))return{kind:`stop`};if(i>=a||r>=24)return{kind:`exhausted`};let o=t?.[n]?.nextRetryAt,s=typeof o==`number`&&o>i?o:i+ue(r);return{kind:`wait`,delayMs:Math.max(Math.min(s,a)-i,0)}}var j=a();function fe({cli:e,cliOptions:r,provider:i=``,providerOptions:a=[],model:o,modelOptions:s,effort:c,effortOptions:l,workingDir:u,workingDirError:d,cliMeta:f,onCliChange:m,onProviderChange:h,onModelChange:g,onEffortChange:y,onWorkingDirChange:ee}){let b=w(r),x=n(e),S=b.filter(e=>ne.includes(e)).length;return(0,j.jsxs)(p,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:[(0,j.jsx)(_,{id:`agent-cli`,label:`Active CLI`,value:e,missingValueLabel:n(e)?t(e):void 0,error:x?`This runtime is retired. Select an available runtime to continue.`:null,options:b.map(e=>({value:e,label:C(e,f).label||e})),collapsedAfter:S,onChange:m}),a.length>0?(0,j.jsx)(_,{id:`agent-${e}-provider`,label:`Provider`,value:i,options:a.map(e=>({value:e,label:e})),onChange:e=>h?.(e)}):null,(0,j.jsx)(_,{id:`agent-model`,label:`Active model`,value:o,disabled:x,options:s.length>0?s:[{value:``,label:`(default)`}],onChange:g}),(0,j.jsx)(_,{id:`agent-effort`,label:`Effort`,value:c,options:[{value:``,label:`(default)`},...l.map(e=>({value:e,label:e}))],disabled:x||l.length===0,onChange:y}),(0,j.jsx)(v,{id:`agent-workingDir`,label:`Working directory`,value:u,error:d,placeholder:`/path/to/project`,onChange:ee})]})}var pe=[{value:`auto`,label:`Auto (YOLO)`},{value:`safe`,label:`Safe`},{value:`custom`,label:`Custom allowlist`}];function me({value:e,configuredValue:t,onChange:n}){let r=b(e),i=S(e),a=r.mode===`custom`?r.tokens:[],o=r.mode===`custom`?`Editor draft: ${a.length} explicit token${a.length===1?``:`s`}`:null;return(0,j.jsxs)(p,{title:`Permissions`,hint:`Selecting a value changes the draft. Save applies it. Auto (YOLO) requests automatic approval or permission bypass. Behavior varies by runtime.`,children:[(0,j.jsx)(_,{id:`agent-permissions-mode`,label:`Change policy to`,value:i,options:pe,missingValueLabel:i===`invalid`?`Unrecognized saved policy`:void 0,onChange:e=>{n(e===`auto`?`auto`:e===`safe`?`safe`:a.length>0&&x(a)?a:y(null))}}),i===`invalid`?(0,j.jsx)(d,{tone:`error`,role:`alert`,children:`The saved permissions value is not a recognized policy. Choose a policy to replace it.`}):null,o?(0,j.jsx)(d,{children:o}):null,(0,j.jsx)(d,{children:(0,j.jsxs)(`span`,{id:`agent-configured-policy`,children:[`Configured policy: `,ee(t)]})})]})}function he({activeCli:e,flushCli:r,flushModel:i,cliOptions:a,modelOptions:o,cliMeta:s,loading:c,error:l,onFlushCliChange:u,onFlushModelChange:d}){let f=r||e,m=f?C(f,s).label||f:`active`;return(0,j.jsx)(p,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,j.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,j.jsxs)(`summary`,{children:[(0,j.jsx)(`span`,{children:`Flush runtime`}),(0,j.jsxs)(`code`,{children:[m,i&&i!=="default"?` / ${i}`:``]})]}),c?(0,j.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,l?(0,j.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:l}):null,(0,j.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,j.jsx)(_,{id:`agent-flush-cli`,label:`Flush CLI`,value:r,missingValueLabel:n(r)?t(r):void 0,error:n(f)?`The saved flush runtime is retired. Choose an available runtime.`:null,options:[{value:``,label:`(active CLI)`},...T(a).map(e=>({value:e,label:C(e,s).label||e}))],onChange:u}),(0,j.jsx)(_,{id:`agent-flush-model`,label:`Flush model`,value:i,disabled:n(f),options:[{value:``,label:`(default)`},...o],onChange:d})]})]})})}function M(e){return e.source===`static`||e.id.startsWith(`static:`)}function N(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function ge(e,t){let n=T(e)[0]||`claude`,r=t?.[n]?.models?.[0]||`default`;return{id:N(),name:`New Agent`,cli:n,model:r,role:``,status:`idle`,source:`db`}}function _e(e){return Array.isArray(e)?e.map(P).filter(Boolean):e.data.map(P).filter(Boolean)}function P(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 F(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function I(e){return e.some(e=>F(e)!==null)}function ve(e,t){return JSON.stringify(e.map(z))===JSON.stringify(t.map(z))}function L(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=R(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!M(t)&&o.push(t);return{added:i,updated:a,removed:o}}function ye(e,t){let n=L(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function be(e,t,n){let r=L(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`,xe(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function R(e,t){if(M(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 xe(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function z(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 Se({employee:e,index:r,cliOptions:i,cliMeta:a,onChange:o,onRemove:s}){let u=M(e),d=C(e.cli,a),f=ae(d.models,e.model),p=F(e),m=n(e.cli),h=T(Array.from(new Set([...i,e.cli,`claude`])).filter(Boolean)),g=e.name||`Employee ${r+1}`;return(0,j.jsxs)(`div`,{className:`settings-runtime-employee-row`,role:`group`,"aria-label":g,children:[(0,j.jsxs)(`p`,{className:`settings-runtime-employee-head`,children:[(0,j.jsx)(`span`,{className:`settings-runtime-employee-name`,children:g}),u?(0,j.jsx)(l,{tone:`neutral`,children:`static`}):null]}),(0,j.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,j.jsx)(v,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:u,error:p===`Name is required`?p:null,onChange:e=>o({name:e})}),(0,j.jsx)(_,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,missingValueLabel:n(e.cli)?t(e.cli):void 0,error:m?`This saved runtime cannot execute. Choose an available runtime.`:null,disabled:u,options:h.map(e=>({value:e,label:C(e,a).label||e})),onChange:e=>{o({cli:e,model:C(e,a).models[0]||`default`})}}),(0,j.jsx)(_,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,disabled:m,options:f.length>0?f:[{value:`default`,label:`default`}],onChange:e=>o({model:e})}),(0,j.jsx)(v,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:u,onChange:e=>o({role:e})})]}),(0,j.jsx)(c,{status:(0,j.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),children:(0,j.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,disabled:u,onClick:s,"aria-label":`Remove employee ${g}`,children:`Remove`})})]})}function Ce({roster:e,original:t,cliOptions:n,cliMeta:r,loading:i,error:a,onRosterChange:s}){let u=ye(t,e),f=I(e);function m(t,n){s(e.map((e,r)=>r===t?{...e,...n}:e))}function h(t){s(e.filter((e,n)=>n!==t))}return(0,j.jsxs)(p,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,j.jsxs)(o,{children:[(0,j.jsxs)(`span`,{className:`settings-runtime-employee-summary`,children:[(0,j.jsxs)(`span`,{children:[`+`,u.added]}),(0,j.jsxs)(`span`,{children:[`~`,u.updated]}),(0,j.jsxs)(`span`,{children:[`-`,u.removed]})]}),f?(0,j.jsx)(l,{tone:`error`,children:`Fix invalid rows before saving.`}):null]}),i?(0,j.jsx)(d,{children:`Loading employees...`}):null,a?(0,j.jsx)(d,{tone:`error`,role:`alert`,children:a}):null,e.length===0?(0,j.jsx)(d,{children:`No runtime employees configured.`}):e.map((e,t)=>(0,j.jsx)(Se,{employee:e,index:t,cliOptions:n,cliMeta:r??null,onChange:e=>m(t,e),onRemove:()=>h(t)},e.id)),(0,j.jsx)(c,{children:(0,j.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>s([...e,ge(n,r)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(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??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function we(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(I(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,O(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{if(s){let e=i;try{let n=_e(await t.get(`/api/employees`)),r=new Set(i.map(e=>e.id)),a=new Set(s.map(e=>e.id));e=n.filter(e=>r.has(e.id)||a.has(e.id))}catch{}await be(t,e,s)}}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function Te({status:e,exhausted:t=!1}){if(t)return(0,j.jsx)(`div`,{className:`settings-inline-notice`,role:`alert`,children:`상태 확인이 끝나지 않았습니다. 새로고침하거나 잠시 후 다시 확인하세요.`});if(!e)return null;let n=r(e);return n.kind===`checking`?(0,j.jsx)(`div`,{className:`settings-inline-notice`,role:`status`,"aria-live":`polite`,children:`상태 확인 중`}):n.kind===`unknown`?(0,j.jsx)(`div`,{className:`settings-inline-notice`,role:`alert`,children:n.message}):n.kind===`failing`?(0,j.jsxs)(`div`,{className:`settings-inline-notice`,role:`alert`,children:[`상태 확인 실패 (재시도 중)`,e.probeError?`: ${e.probeError}`:``]}):null}function Ee(e){if(!(e instanceof s)||e.status!==409)return null;try{return JSON.parse(e.detail).settings??null}catch{return null}}function H({port:e,client:t,dirty:n,registerSave:r}){let{state:i,refresh:a,setData:o}=h(t,`/api/settings`),[s,c]=(0,k.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[l,d]=(0,k.useState)({}),[p,_]=(0,k.useState)({}),[v,y]=(0,k.useState)(!0),[ee,x]=(0,k.useState)(null),[w,ne]=(0,k.useState)([]),[O,A]=(0,k.useState)([]),[se,le]=(0,k.useState)(!0),[ue,pe]=(0,k.useState)(null),[M,N]=(0,k.useState)(null),[ge,P]=(0,k.useState)({}),[F,L]=(0,k.useState)(!1),[ye,be]=(0,k.useState)(null),[R,xe]=(0,k.useState)(!1),[z,Se]=(0,k.useState)(null),B=(0,k.useCallback)(async()=>{try{let e=await t.get(`/api/cli-registry`),n=e&&typeof e==`object`&&`data`in e?e.data:e;N(re(n))}catch{N(null)}},[t]),V=(0,k.useRef)(0),H=(0,k.useRef)({}),[De,Oe]=(0,k.useState)(!1),U=(0,k.useCallback)(async e=>{try{let n=await t.get(`/api/cli-status`);if(e!==void 0&&e!==V.current)return;H.current=n,P(n)}catch{if(e!==void 0&&e!==V.current)return;H.current={},P({})}},[t]),W=(0,k.useCallback)(async()=>{y(!0),x(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};d(n),_(n)}catch(e){x(e instanceof Error?e.message:String(e))}finally{y(!1)}},[t]),G=(0,k.useCallback)(async()=>{le(!0),pe(null);try{let e=_e(await t.get(`/api/employees`));ne(e),A(e)}catch(e){pe(e instanceof Error?e.message:String(e))}finally{le(!1)}},[t]);(0,k.useEffect)(()=>{B(),U(),W(),G()},[B,U,G,W]),(0,k.useEffect)(()=>{if(!s.cli)return;let e=V.current+1;V.current=e,Oe(!1);let t=Date.now()+ce,n=0,r,i=()=>{if(e!==V.current)return;let a=de({snapshot:H.current,cli:s.cli,attempts:n,now:Date.now(),deadline:t});if(a.kind!==`stop`){if(a.kind===`exhausted`){Oe(!0);return}r=setTimeout(()=>{e===V.current&&(n+=1,U(e).then(()=>{e===V.current&&i()}))},a.delayMs)}};return i(),()=>{V.current=e+1,r!==void 0&&clearTimeout(r)}},[s.cli,U]),(0,k.useEffect)(()=>{if(i.kind!==`ready`)return;let e=Object.keys(i.data.perCli||{}),t=i.data.cli||e[0]||``,n=b(i.data.permissions),r=S(i.data.permissions),a=C(t,M);c({cli:t,provider:i.data.perCli?.[t]?.provider||a.defaultProvider||``,model:D(t,i.data.perCli,i.data.activeOverrides),effort:E(t,i.data.perCli,i.data.activeOverrides),workingDir:i.data.workingDir||``,permissions:r===`invalid`?i.data.permissions:n.mode===`custom`?n.tokens:n.mode===`safe`?`safe`:`auto`})},[M,i]),(0,k.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 K=(0,k.useCallback)((e,t)=>n.set(e,t),[n]),ke=(0,k.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await we({client:t,bundle:e,employeeDraft:O,employeeOriginal:w});n.clear(),r&&o(r),await a(),await B(),await W(),await G()},[t,n,O,w,B,G,W,a,o]);(0,k.useEffect)(()=>{if(r)return r(ke),()=>r(null)},[r,ke]);let q=i.kind===`ready`?i.data:{},J=q.perCli||{},Y=q.activeOverrides||{},Ae=(0,k.useMemo)(()=>{let e=T(Object.keys(J));return e.length?e:T(Object.keys(M||oe))},[J,M]),X=C(s.cli,M),Z=s.provider||X.defaultProvider||X.providers?.[0]||``,je=s.cli===`pi`,Q=!je&&(X.providers?.length??0)>0,Me=ae(Q&&X.modelsByProvider?.[Z]||X.models,s.model),Ne=Q?te(X,s.model,X.effortsByProvider?.[Z]||X.efforts,Z):te(X,s.model),Pe=s.workingDir.trim()?null:`Required`,Fe=(0,k.useCallback)(async e=>{L(!0),be(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,o(r)}catch(e){let t=Ee(e);if(t){o(t);return}be(g(e))}finally{L(!1)}},[t,o]),Ie=(0,k.useCallback)(async e=>{xe(!0),Se(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,o(r)}catch(e){let t=Ee(e);if(t){o(t);return}Se(g(e))}finally{xe(!1)}},[t,o]);if(i.kind===`loading`)return(0,j.jsx)(u,{});if(i.kind===`offline`)return(0,j.jsx)(f,{port:e});if(i.kind===`error`)return(0,j.jsx)(m,{message:i.message});function Le(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){c(e)}return(0,j.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),ke()},children:[q.runtimeDefaultMigration?.state===`pending`?(0,j.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,j.jsx)(`strong`,{children:`기본 런타임 변경 안내`}),(0,j.jsx)(`p`,{children:`기존 선택은 유지됩니다. Codex App으로 전환하거나 현재 런타임을 계속 사용할 수 있습니다.`}),(0,j.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,j.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:F,onClick:()=>void Fe(`accept`),children:`Codex App 사용`}),(0,j.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:F,onClick:()=>void Fe(`keep`),children:`현재 런타임 유지`})]}),ye?(0,j.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:ye}):null]}):null,q.multiSessionDefaultMigration?.state===`pending`?(0,j.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,j.jsx)(`strong`,{children:`다중 세션 안내`}),(0,j.jsx)(`p`,{children:`대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 20으로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 설정은 그대로 유지됩니다.`}),(0,j.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,j.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:R,onClick:()=>void Ie(`accept`),children:`다중 세션 켜기`}),(0,j.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:R,onClick:()=>void Ie(`keep`),children:`지금 설정 유지`})]}),z?(0,j.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:z}):null]}):null,(0,j.jsxs)(`label`,{className:`settings-field settings-field-select`,htmlFor:`midrun-policy-select`,children:[(0,j.jsx)(`span`,{className:`settings-field-label`,children:`실행 중 메시지 처리 (mid-run policy)`}),(0,j.jsxs)(`select`,{id:`midrun-policy-select`,value:String(q.multiSession?.midRunPolicy||`steer`),onChange:e=>{let t=e.target.value;K(`multiSession.midRunPolicy`,{value:t,original:String(q.multiSession?.midRunPolicy||`steer`),valid:!0})},children:[(0,j.jsx)(`option`,{value:`steer`,children:`steer (기본) — 실행 중 지시 변경`}),(0,j.jsx)(`option`,{value:`followup`,children:`followup — 끝나면 순서대로 실행`}),(0,j.jsx)(`option`,{value:`collect`,children:`collect — 모아서 한 번에 실행`}),(0,j.jsx)(`option`,{value:`interrupt`,children:`interrupt — 현재 실행을 중단하고 즉시 실행`})]}),(0,j.jsx)(`span`,{className:`settings-field-hint`,children:`다중 세션이 켜져 있을 때 적용됩니다. codex-app은 같은 턴에 입력을 전달합니다. Cursor·Grok의 native 모드는 현재 요청의 취소와 정리가 끝난 뒤 같은 세션에 다시 요청합니다(cancel-reprompt). 그 외 런타임은 중단 후 새 실행으로 이어갑니다(kill-steer). 보존되는 맥락은 런타임에 따라 다릅니다. 끝난 뒤 실행하려면 followup을 선택하세요.`})]}),(0,j.jsx)(Te,{status:ge[s.cli],exhausted:De}),(0,j.jsx)(fe,{cli:s.cli,cliOptions:Ae,provider:Z,providerOptions:je?[]:X.providers||[],model:s.model,modelOptions:Me,effort:s.effort,effortOptions:Ne,workingDir:s.workingDir,workingDirError:Pe,cliMeta:M,onCliChange:e=>{let t=C(e,M),n={...s,cli:e,provider:J[e]?.provider||t.defaultProvider||``,model:D(e,J,Y),effort:E(e,J,Y)};Le(),$(n),K(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=X.modelsByProvider?.[e]||[],n=X.effortsByProvider?.[e]||[],r=t.includes(s.model)?s.model:t[0]||``,i=ie(X,r,s.effort,n,e);$({...s,provider:e,model:r,effort:i}),K(`perCli.${s.cli}.provider`,{value:e,original:J[s.cli]?.provider||X.defaultProvider||``,valid:!0}),K(`activeOverrides.${s.cli}.model`,{value:r,original:D(s.cli,J,Y),valid:r.trim().length>0}),K(`activeOverrides.${s.cli}.effort`,{value:i,original:E(s.cli,J,Y),valid:!0})},onModelChange:e=>{let t=ie(X,e,s.effort,Q?X.effortsByProvider?.[Z]||X.efforts:void 0,Q?Z:void 0);$({...s,model:e,effort:t}),K(`activeOverrides.${s.cli}.model`,{value:e,original:D(s.cli,J,Y),valid:e.trim().length>0}),t!==s.effort&&K(`activeOverrides.${s.cli}.effort`,{value:t,original:E(s.cli,J,Y),valid:!0})},onEffortChange:e=>{$({...s,effort:e}),K(`activeOverrides.${s.cli}.effort`,{value:e,original:E(s.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...s,workingDir:e}),K(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,j.jsx)(me,{value:s.permissions,configuredValue:q.permissions,onChange:e=>{$({...s,permissions:e}),K(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e===`safe`||e.length>0})}}),(0,j.jsx)(he,{activeCli:s.cli,flushCli:p.cli||``,flushModel:p.model||``,cliOptions:Ae,cliMeta:M,modelOptions:ae(C(p.cli||s.cli,M).models,p.model||``),loading:v,error:ee,onFlushCliChange:e=>{let t=e&&C(e,M).models[0]||``;_({cli:e,model:t}),K(`flushCli`,{value:e,original:l.cli||``,valid:!0}),K(`flushModel`,{value:t,original:l.model||``,valid:!0})},onFlushModelChange:e=>{_({...p,model:e}),K(`flushModel`,{value:e,original:l.model||``,valid:!0})}}),(0,j.jsx)(Ce,{roster:O,original:w,cliOptions:Ae,cliMeta:M,loading:se,error:ue,onRosterChange:e=>{if(A(e),ve(e,w)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:w,valid:!I(e)})}})]})}export{Te as CliProbeNotice,Ee as conflictSettingsFromError,H as default,V as splitAgentSaveBundle};
|