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.
Files changed (169) hide show
  1. package/README.md +16 -0
  2. package/dist/src/agent/aside-catalog.js +339 -0
  3. package/dist/src/agent/aside-catalog.js.map +1 -0
  4. package/dist/src/agent/aside-cli.js +208 -0
  5. package/dist/src/agent/aside-cli.js.map +1 -0
  6. package/dist/src/agent/aside-replay.js +120 -0
  7. package/dist/src/agent/aside-replay.js.map +1 -0
  8. package/dist/src/agent/aside-runtime.js +175 -0
  9. package/dist/src/agent/aside-runtime.js.map +1 -0
  10. package/dist/src/agent/lifecycle-handler.js +26 -18
  11. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  12. package/dist/src/agent/memory-flush-controller.js +3 -0
  13. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  14. package/dist/src/agent/prompt-context.js +2 -2
  15. package/dist/src/agent/prompt-context.js.map +1 -1
  16. package/dist/src/agent/session-persistence.js +2 -0
  17. package/dist/src/agent/session-persistence.js.map +1 -1
  18. package/dist/src/agent/spawn/backend-aside.js +314 -0
  19. package/dist/src/agent/spawn/backend-aside.js.map +1 -0
  20. package/dist/src/agent/spawn/resume.js +3 -0
  21. package/dist/src/agent/spawn/resume.js.map +1 -1
  22. package/dist/src/agent/spawn-env.js +5 -0
  23. package/dist/src/agent/spawn-env.js.map +1 -1
  24. package/dist/src/agent/spawn.js +60 -6
  25. package/dist/src/agent/spawn.js.map +1 -1
  26. package/dist/src/cli/cli-status-worker.js +2 -1
  27. package/dist/src/cli/cli-status-worker.js.map +1 -1
  28. package/dist/src/cli/employee-handler.js +2 -0
  29. package/dist/src/cli/employee-handler.js.map +1 -1
  30. package/dist/src/cli/handlers-completions.js +20 -8
  31. package/dist/src/cli/handlers-completions.js.map +1 -1
  32. package/dist/src/cli/handlers-runtime.js +2 -0
  33. package/dist/src/cli/handlers-runtime.js.map +1 -1
  34. package/dist/src/cli/readiness.js +7 -3
  35. package/dist/src/cli/readiness.js.map +1 -1
  36. package/dist/src/cli/registry-live.js +47 -0
  37. package/dist/src/cli/registry-live.js.map +1 -1
  38. package/dist/src/cli/registry.js +5 -0
  39. package/dist/src/cli/registry.js.map +1 -1
  40. package/dist/src/core/config.js +10 -3
  41. package/dist/src/core/config.js.map +1 -1
  42. package/dist/src/core/employees.js +5 -3
  43. package/dist/src/core/employees.js.map +1 -1
  44. package/dist/src/core/settings-merge.js +35 -0
  45. package/dist/src/core/settings-merge.js.map +1 -1
  46. package/dist/src/core/settings-watch.js +10 -1
  47. package/dist/src/core/settings-watch.js.map +1 -1
  48. package/dist/src/orchestrator/gateway.js +2 -0
  49. package/dist/src/orchestrator/gateway.js.map +1 -1
  50. package/dist/src/routes/employees.js +8 -0
  51. package/dist/src/routes/employees.js.map +1 -1
  52. package/dist/src/routes/jaw-memory.js +4 -0
  53. package/dist/src/routes/jaw-memory.js.map +1 -1
  54. package/dist/src/routes/orchestrate.js +22 -3
  55. package/dist/src/routes/orchestrate.js.map +1 -1
  56. package/dist/src/routes/settings.js +23 -0
  57. package/dist/src/routes/settings.js.map +1 -1
  58. package/dist/src/shared/aside-contract.js +2 -0
  59. package/dist/src/shared/aside-contract.js.map +1 -0
  60. package/dist/src/types/cli-engine.js +1 -0
  61. package/dist/src/types/cli-engine.js.map +1 -1
  62. package/package.json +1 -1
  63. package/public/dist/.vite/manifest.json +186 -175
  64. package/public/dist/assets/{Activity-DPLlOJ46.js → Activity-DsBgOkCP.js} +1 -1
  65. package/public/dist/assets/{AdvancedExport-BgOgGvc5.js → AdvancedExport-COGQ7vbK.js} +1 -1
  66. package/public/dist/assets/Agent-6qGQN7lY.js +1 -0
  67. package/public/dist/assets/AsideSelectionFields-DvU5xWAP.js +1 -0
  68. package/public/dist/assets/{Browser-m6VynQXV.js → Browser-r09vOsR1.js} +1 -1
  69. package/public/dist/assets/ChannelEnablementControl-ooOkdd-Q.js +85 -0
  70. package/public/dist/assets/{ChannelSetupEntry-DHLoZEzJ.js → ChannelSetupEntry-B0b4TdhH.js} +1 -1
  71. package/public/dist/assets/{ChannelsDiscord-B-G8vsYy.js → ChannelsDiscord-9EMLt5b3.js} +1 -1
  72. package/public/dist/assets/{ChannelsSlack-oPuh922z.js → ChannelsSlack-B8ETzWFt.js} +1 -1
  73. package/public/dist/assets/{ChannelsTelegram-PmTv43KQ.js → ChannelsTelegram-CflLUsQw.js} +1 -1
  74. package/public/dist/assets/{DashboardMeta-BqEiJrvr.js → DashboardMeta-wjEuh9-E.js} +1 -1
  75. package/public/dist/assets/{Developer-CbySB7_Z.js → Developer-B3cDkldo.js} +1 -1
  76. package/public/dist/assets/{Display-DU4_76cS.js → Display-BXQxpv6-.js} +1 -1
  77. package/public/dist/assets/{Display-C0Zdamcb.js → Display-Cl4DD334.js} +1 -1
  78. package/public/dist/assets/{Embedding-CCFMOB_2.js → Embedding-D-T92-En.js} +1 -1
  79. package/public/dist/assets/{Employees-BanvF58d.js → Employees-Cf4IeF0N.js} +1 -1
  80. package/public/dist/assets/{Heartbeat-uyi_MpUd.js → Heartbeat-Bj8V_bUM.js} +1 -1
  81. package/public/dist/assets/{Mcp-rjPoL_Zo.js → Mcp-jAcut_fw.js} +1 -1
  82. package/public/dist/assets/Memory-BOXkBFKg.js +1 -0
  83. package/public/dist/assets/ModelProvider-DIDQ37z-.js +1 -0
  84. package/public/dist/assets/{Network-CuqFrOvR.js → Network-I5eOe2hf.js} +1 -1
  85. package/public/dist/assets/{Permissions-BltXiZnz.js → Permissions-B7PthH01.js} +1 -1
  86. package/public/dist/assets/{Permissions-DcCbFMIq.js → Permissions-BCYUfJg1.js} +1 -1
  87. package/public/dist/assets/Profile-CYPMVhQM.js +1 -0
  88. package/public/dist/assets/{Prompts-C9vY8ivQ.js → Prompts-BRAgZLNQ.js} +1 -1
  89. package/public/dist/assets/{SpeechKeys-BJ8V7U5E.js → SpeechKeys-UlXNSFoe.js} +1 -1
  90. package/public/dist/assets/{TelegramHub-DtyjLGFR.js → TelegramHub-BhUFhIcv.js} +1 -1
  91. package/public/dist/assets/agent-meta-v4jNRAbX.js +1 -0
  92. package/public/dist/assets/app-SVIyP1TT.js +59 -0
  93. package/public/dist/assets/bgtask-badge-HIrvpcr_.js +1 -0
  94. package/public/dist/assets/{bgtask-badge-oPvZyylH.js → bgtask-badge-tYRnplEV.js} +1 -1
  95. package/public/dist/assets/constants-_iw-lnKY.js +1 -0
  96. package/public/dist/assets/{employees-BchFBkDz.js → employees-DNTPcxtZ.js} +2 -2
  97. package/public/dist/assets/{error-normalize-clOi-AAA.js → error-normalize-jnjrKZDu.js} +1 -1
  98. package/public/dist/assets/{iframe-renderer-CcGzEi0v.js → iframe-renderer--lHbKTDh.js} +2 -2
  99. package/public/dist/assets/iframe-renderer-DigNC5FU.js +1 -0
  100. package/public/dist/assets/{manager-nquYZ7_x.js → manager-qGH-xUZ7.js} +1 -1
  101. package/public/dist/assets/{memory-DTpD4see.js → memory-BAdRkBdk.js} +1 -1
  102. package/public/dist/assets/memory-DA8x5314.js +1 -0
  103. package/public/dist/assets/message-history-CGOgZH4l.js +1 -0
  104. package/public/dist/assets/{message-history-DSvflaZ9.js → message-history-PAYeKmia.js} +1 -1
  105. package/public/dist/assets/page-shell-Cz2ylri8.js +1 -0
  106. package/public/dist/assets/{render-D8dVQ_bm.js → render-F6xF6w6c.js} +1 -1
  107. package/public/dist/assets/settings-DMbNzuTm.js +1 -0
  108. package/public/dist/assets/{settings-DMiQe469.js → settings-DZ2-ca8T.js} +1 -1
  109. package/public/dist/assets/{settings-Bp0sgQ2a.js → settings-W0WFhBf2.js} +1 -1
  110. package/public/dist/assets/settings-core-2vZXNf6n.js +2 -0
  111. package/public/dist/assets/settings-core-BofMyzL9.js +1 -0
  112. package/public/dist/assets/{settings-embedding-BRW0WZvh.js → settings-embedding-Bjwpe8xu.js} +2 -2
  113. package/public/dist/assets/{shared-D1begqvi.js → shared-CftvKNY9.js} +1 -1
  114. package/public/dist/assets/{sidebar-CrpBbYFg.js → sidebar-Clkqd78q.js} +3 -3
  115. package/public/dist/assets/{skills-Bx8U-gJa.js → skills-0aA-RuN9.js} +1 -1
  116. package/public/dist/assets/skills-SqmQXndw.js +1 -0
  117. package/public/dist/assets/{slash-commands-DkrGUOnC.js → slash-commands-4zHHXEeU.js} +1 -1
  118. package/public/dist/assets/slash-commands-D5LqONzL.js +1 -0
  119. package/public/dist/assets/{trace-drawer-Dbe5pTbf.js → trace-drawer-B4O0Tl1M.js} +1 -1
  120. package/public/dist/assets/{ui-rnVAM91F.js → ui-CVtGpivr.js} +1 -1
  121. package/public/dist/assets/ui-_cqgseFX.js +1 -0
  122. package/public/dist/index.html +1 -1
  123. package/public/dist/manager/index.html +1 -1
  124. package/public/dist/settings/index.html +1 -1
  125. package/public/js/constants.ts +5 -0
  126. package/public/js/features/employees.ts +3 -3
  127. package/public/js/features/heartbeat.ts +14 -1
  128. package/public/js/features/settings-core.ts +39 -13
  129. package/public/js/features/settings-types.ts +1 -1
  130. package/public/locales/en.json +2 -0
  131. package/public/locales/ja.json +2 -0
  132. package/public/locales/ko.json +2 -0
  133. package/public/locales/zh.json +2 -0
  134. package/public/manager/src/settings/SettingsShell.tsx +1 -1
  135. package/public/manager/src/settings/pages/Agent.tsx +137 -52
  136. package/public/manager/src/settings/pages/Heartbeat.tsx +6 -0
  137. package/public/manager/src/settings/pages/Memory.tsx +8 -6
  138. package/public/manager/src/settings/pages/ModelProvider.tsx +31 -6
  139. package/public/manager/src/settings/pages/Profile.tsx +2 -2
  140. package/public/manager/src/settings/pages/components/AsideSelectionFields.tsx +33 -0
  141. package/public/manager/src/settings/pages/components/AvatarCard.tsx +22 -34
  142. package/public/manager/src/settings/pages/components/PerCliRow.tsx +29 -1
  143. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +7 -6
  144. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +4 -4
  145. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +5 -0
  146. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -0
  147. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +3 -2
  148. package/public/manager/src/settings/pages/components/aside-models.ts +104 -0
  149. package/public/manager/src/settings/settings-client.ts +3 -1
  150. package/public/manager/src/settings/types.ts +1 -0
  151. package/public/dist/assets/Agent-O_U8ny90.js +0 -1
  152. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +0 -85
  153. package/public/dist/assets/Memory-C9I33pIi.js +0 -1
  154. package/public/dist/assets/ModelProvider-fiUktMaO.js +0 -1
  155. package/public/dist/assets/Profile-DUL7-RE_.js +0 -1
  156. package/public/dist/assets/agent-meta-94LMwZZK.js +0 -1
  157. package/public/dist/assets/app-Iu76iEiU.js +0 -59
  158. package/public/dist/assets/bgtask-badge-DHo2mkMI.js +0 -1
  159. package/public/dist/assets/constants-DmZ9Rjym.js +0 -1
  160. package/public/dist/assets/iframe-renderer-DSLsfZq8.js +0 -1
  161. package/public/dist/assets/memory-BgUF3M9l.js +0 -1
  162. package/public/dist/assets/message-history-DkB768L3.js +0 -1
  163. package/public/dist/assets/page-shell-DfinU3mb.js +0 -1
  164. package/public/dist/assets/settings-DxjoyiIM.js +0 -1
  165. package/public/dist/assets/settings-core-CXWmPKUE.js +0 -1
  166. package/public/dist/assets/settings-core-D4zGy72z.js +0 -2
  167. package/public/dist/assets/skills-BY-hQnqM.js +0 -1
  168. package/public/dist/assets/slash-commands-C53T9J3g.js +0 -1
  169. package/public/dist/assets/ui-C0o427q6.js +0 -1
@@ -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,t as i}from"./jsx-runtime-CkEUZM6i.js";import{i as a,l as o,n as s,o as c,r as l,s as u,t as d,u as f}from"./page-shell-DfinU3mb.js";import{a as p,i as m,r as h}from"./fields-CicOWY-X.js";import{a as g,d as _}from"./agent-meta-94LMwZZK.js";import{t as v}from"./path-utils-B6vBr0DD.js";var y=e(r(),1),b=[`memory.enabled`,`memory.flushEvery`,`memory.cli`,`memory.retentionDays`,`memory.autoReflectAfterFlush`,`memory.flushLanguage`],x=[{value:`en`,label:`English (en)`},{value:`ko`,label:`한국어 (ko)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}],S=50;function C(e){return b.includes(e)}function w(e){let t=T(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=E(e);t&&n.push(t)}return n}function T(e){if(!e||typeof e!=`object`)return e;let t=e;return Array.isArray(t)?t:`data`in t?t.data:e}function E(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.key==`string`?t.key:null;return n?{key:n,value:typeof t.value==`string`?t.value:``,source:typeof t.source==`string`?t.source:`manual`}:null}function D(e,t){return!Number.isFinite(e)||!Number.isInteger(e)||e<=0?`${t} must be a positive integer`:null}function O(e,t,n=50){let r=Math.max(0,Math.floor(t))*n,i=e.slice(r,r+n),a=Math.max(1,Math.ceil(e.length/n));return{slice:i,hasMore:r+n<e.length,pageCount:a}}function k(e,t=80){return e.length<=t?e:`${e.slice(0,t)}…`}var A=i();function j({row:e,onOpen:t}){return(0,A.jsxs)(`div`,{className:`settings-card-actions`,children:[(0,A.jsxs)(`div`,{className:`settings-card-actions-status`,children:[(0,A.jsx)(`strong`,{children:(0,A.jsx)(`code`,{children:e.key})}),` `,(0,A.jsx)(o,{tone:`neutral`,children:e.source}),` `,(0,A.jsxs)(`span`,{className:`settings-field-hint`,children:[e.value.length,` chars · `,k(e.value)]})]}),(0,A.jsx)(`div`,{className:`settings-card-actions-buttons`,children:(0,A.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>t(e),"aria-label":`Open memory entry ${e.key}`,children:`Open`})})]})}var M={busy:null,notice:null,error:null};function N({port:e,client:r,dirty:i,registerSave:o}){let S=f(r,`/api/settings`),T=f(r,`/api/memory`),[E,k]=(0,y.useState)(!0),[N,P]=(0,y.useState)(10),[F,I]=(0,y.useState)(``),[L,R]=(0,y.useState)(30),[z,B]=(0,y.useState)(!1),[V,H]=(0,y.useState)(`en`),[U,W]=(0,y.useState)(0),[G,K]=(0,y.useState)(null),[q,J]=(0,y.useState)(M);(0,y.useEffect)(()=>{if(S.state.kind!==`ready`)return;let e=S.state.data.memory||{};k(e.enabled!==!1),P(typeof e.flushEvery==`number`?e.flushEvery:10),I(typeof e.cli==`string`?e.cli:``),R(typeof e.retentionDays==`number`?e.retentionDays:30),B(!!e.autoReflectAfterFlush),H(typeof e.flushLanguage==`string`&&e.flushLanguage?e.flushLanguage:`en`)},[S.state]),(0,y.useEffect)(()=>()=>{for(let e of b)i.remove(e)},[i]),(0,y.useEffect)(()=>{if(!G)return;let e=e=>{e.key===`Escape`&&K(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[G]);let Y=(0,y.useCallback)((e,t)=>i.set(e,t),[i]),X=(0,y.useMemo)(()=>S.state.kind===`ready`&&S.state.data.memory||{},[S.state]),Z=(0,y.useCallback)(async()=>{let e=i.saveBundle(),t={};for(let[n,r]of Object.entries(e))C(n)&&(t[n]=r);if(Object.keys(t).length===0)return;let n=v(t),a=await r.put(`/api/settings`,n),o=a&&typeof a==`object`&&`data`in a?a.data:a;for(let e of b)i.remove(e);S.setData(o);let s=o.memory||{};k(s.enabled!==!1),P(typeof s.flushEvery==`number`?s.flushEvery:10),I(typeof s.cli==`string`?s.cli:``),R(typeof s.retentionDays==`number`?s.retentionDays:30),B(!!s.autoReflectAfterFlush),H(typeof s.flushLanguage==`string`&&s.flushLanguage?s.flushLanguage:`en`),await S.refresh()},[r,i,S]);(0,y.useEffect)(()=>{if(o)return o(Z),()=>o(null)},[o,Z]);let ee=(0,y.useCallback)(async()=>{J({busy:`flush`,notice:null,error:null});try{await r.post(`/api/jaw-memory/flush`,{}),J({busy:null,notice:`Memory flush queued. Browse refreshes when it completes.`,error:null}),await T.refresh()}catch(e){J({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[r,T]),te=(0,y.useCallback)(async()=>{J({busy:`reflect`,notice:null,error:null});try{await r.post(`/api/jaw-memory/reflect`,{}),J({busy:null,notice:`Reflect complete.`,error:null}),await T.refresh()}catch(e){J({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[r,T]),ne=(0,y.useCallback)(()=>{if(T.state.kind!==`ready`)return;let t=w(T.state.data),n=new Blob([JSON.stringify(t,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`jaw-memory-${e}-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},[T.state,e]);if(S.state.kind===`loading`)return(0,A.jsx)(s,{});if(S.state.kind===`offline`)return(0,A.jsx)(l,{port:e});if(S.state.kind===`error`)return(0,A.jsx)(d,{message:S.state.message});let re=D(N,`Flush every`),ie=D(L,`Retention days`),ae=S.state.data.perCli||{},Q=[{value:``,label:`(profile default)`},..._(Object.keys(ae)).map(e=>({value:e,label:g(e).label||e}))];F&&!n(F)&&!Q.some(e=>e.value===F)&&Q.push({value:F,label:`${g(F).label||F} (legacy)`});let $=T.state.kind===`ready`?w(T.state.data):[],{slice:oe,hasMore:se,pageCount:ce}=O($,Math.min(U,Math.max(0,Math.ceil($.length/50)-1)));return(0,A.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),Z()},children:[(0,A.jsxs)(u,{title:`Memory engine`,hint:`Background memory flush and reflection cadence.`,children:[(0,A.jsx)(p,{id:`memory-enabled`,label:`Memory enabled`,value:E,onChange:e=>{k(e),Y(`memory.enabled`,{value:e,original:X.enabled!==!1,valid:!0})}}),(0,A.jsx)(h,{id:`memory-flush-every`,label:`Flush every (sessions)`,value:N,min:1,error:re,onChange:e=>{P(e),Y(`memory.flushEvery`,{value:e,original:typeof X.flushEvery==`number`?X.flushEvery:10,valid:D(e,`Flush every`)===null})}}),(0,A.jsx)(m,{id:`memory-cli`,label:`Flush CLI`,value:F,missingValueLabel:n(F)?t(F):void 0,error:n(F)?`The saved runtime is retired. Choose an available runtime.`:null,options:Q,onChange:e=>{I(e),Y(`memory.cli`,{value:e,original:X.cli??``,valid:!0})}}),(0,A.jsx)(h,{id:`memory-retention`,label:`Retention days`,value:L,min:1,error:ie,onChange:e=>{R(e),Y(`memory.retentionDays`,{value:e,original:typeof X.retentionDays==`number`?X.retentionDays:30,valid:D(e,`Retention days`)===null})}}),(0,A.jsx)(p,{id:`memory-auto-reflect`,label:`Auto-reflect after flush`,value:z,onChange:e=>{B(e),Y(`memory.autoReflectAfterFlush`,{value:e,original:!!X.autoReflectAfterFlush,valid:!0})}}),(0,A.jsx)(m,{id:`memory-flush-language`,label:`Flush language`,value:V,options:[...x],onChange:e=>{H(e),Y(`memory.flushLanguage`,{value:e,original:X.flushLanguage??`en`,valid:!0})}})]}),(0,A.jsx)(u,{title:`Stored entries`,hint:`Read-only browse of the key/value memory table (50/page).`,children:T.state.kind===`loading`?(0,A.jsx)(c,{children:`Loading entries…`}):T.state.kind===`offline`?(0,A.jsx)(l,{port:e}):T.state.kind===`error`?(0,A.jsx)(d,{message:T.state.message}):$.length===0?(0,A.jsx)(c,{children:`No memory entries yet.`}):(0,A.jsxs)(A.Fragment,{children:[oe.map(e=>(0,A.jsx)(j,{row:e,onOpen:K},e.key)),(0,A.jsxs)(a,{status:(0,A.jsxs)(`span`,{children:[`Page `,U+1,` / `,ce]}),children:[(0,A.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:U===0,onClick:()=>W(e=>Math.max(0,e-1)),children:`Prev`}),(0,A.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:!se,onClick:()=>W(e=>e+1),children:`Next`})]})]})}),(0,A.jsxs)(u,{title:`Actions`,hint:`Flush runs async — the browse list refreshes when it finishes.`,children:[(0,A.jsxs)(a,{status:q.notice?(0,A.jsx)(`span`,{role:`status`,children:q.notice}):void 0,children:[(0,A.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:q.busy!==null,onClick:()=>void ee(),children:q.busy===`flush`?`Queuing…`:`Flush now`}),(0,A.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:q.busy!==null,onClick:()=>void te(),children:q.busy===`reflect`?`Reflecting…`:`Reflect soul`}),(0,A.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:T.state.kind!==`ready`,onClick:ne,children:`Export memory`})]}),q.error?(0,A.jsx)(c,{tone:`error`,role:`alert`,children:q.error}):null]}),G?(0,A.jsx)(`div`,{className:`settings-memory-modal settings-pi-modal`,role:`dialog`,"aria-modal":`true`,"aria-label":`Memory entry ${G.key}`,onClick:e=>{e.target===e.currentTarget&&K(null)},children:(0,A.jsxs)(`div`,{className:`settings-memory-modal-card`,children:[(0,A.jsxs)(`header`,{className:`settings-memory-modal-header`,children:[(0,A.jsx)(`h3`,{children:G.key}),(0,A.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>K(null),"aria-label":`Close memory entry`,children:`Close`})]}),(0,A.jsx)(`pre`,{className:`settings-memory-modal-body`,children:G.value})]})}):null]})}export{x as FLUSH_LANGUAGE_OPTIONS,S as MEMORY_PAGE_SIZE,b as MEMORY_SECTION_A_KEYS,N as default,C as isMemorySettingsKey,w as normalizeMemoryRows,O as paginate,k as previewValue,D as validatePositiveInt};
@@ -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,t as i}from"./jsx-runtime-CkEUZM6i.js";import{a,c as o,i as s,n as c,o as l,r as u,s as d,t as f,u as p}from"./page-shell-DfinU3mb.js";import{t as m}from"./error-normalize-clOi-AAA.js";import{a as h,i as g,n as _,s as v}from"./fields-CicOWY-X.js";import{a as y,d as b,i as x,o as S,r as C}from"./agent-meta-94LMwZZK.js";import{t as w}from"./path-utils-B6vBr0DD.js";var T=e(r(),1),E=i(),D=[`basic`,`openai`,`anthropic`,`vertex`],O=`[hidden], [inert], [aria-disabled="true"], fieldset[disabled]`;function k(e){return Array.from(e.querySelectorAll(`button, input, select, textarea, a[href], [tabindex]`)).filter(e=>{if(e.tabIndex<0||e.matches(`:disabled`)||e.closest(O))return!1;for(let t=e;t;t=t.parentElement){let e=t.ownerDocument.defaultView?.getComputedStyle(t);if(e?.display===`none`||e?.visibility===`hidden`||e?.visibility===`collapse`)return!1}return!0})}function A(e){return e===`anthropic`?`https://api.anthropic.com/v1/messages`:e===`vertex`?`https://LOCATION-aiplatform.googleapis.com/v1`:`http://127.0.0.1:18645/v1`}function j({client:e,pi:t,provider:n,model:r,onClose:i,onRegistered:a}){let o=(0,T.useRef)(null),c=(0,T.useMemo)(()=>t?.profiles?.find(e=>e.id===n)||t?.profiles?.[0],[t,n]),[u,d]=(0,T.useState)(c?.mode||`basic`),[f,p]=(0,T.useState)(c?.id||n||`progrok`),[m,h]=(0,T.useState)(c?.endpoint||A(u)),[_,y]=(0,T.useState)(r||c?.model||`grok-composer-2.5-fast`),[b,x]=(0,T.useState)(``),[S,C]=(0,T.useState)(!1),[w,j]=(0,T.useState)(null);(0,T.useEffect)(()=>{let e=o.current;if(!e||e.closest(O))return;let t=e.ownerDocument.activeElement,n=k(e);return(n.find(e=>e.id===`pi-profile-id`)??n[0])?.focus(),()=>{t instanceof HTMLElement&&t.isConnected&&!t.matches(`:disabled`)&&!t.closest(O)&&t.focus({preventScroll:!0})}},[]),(0,T.useEffect)(()=>{h(e=>e||A(u))},[u]);let M=e=>{let t=o.current;if(!(!t||t.closest(O)||e.defaultPrevented)){if(e.key===`Escape`)e.preventDefault(),e.stopPropagation(),i();else if(e.key===`Tab`){let n=k(t),r=n[0],i=n.at(-1),a=t.ownerDocument.activeElement;(!r||!n.some(e=>e===a)||(e.shiftKey?a===r:a===i))&&(e.preventDefault(),(e.shiftKey?i??t:r??t).focus())}}},N=async()=>{let t=o.current,n=t?.querySelector(`.settings-action-save`);t&&n&&t.ownerDocument.activeElement===n&&!t.closest(O)&&k(t).find(e=>e!==n)?.focus(),C(!0),j(null);try{let t=(await e.post(`/api/pi/profiles/register`,{id:f,label:f,mode:u,endpoint:m,model:_,apiKey:b})).data;a({provider:f,model:_,models:t.models||[],pi:t.settings?.pi}),i()}catch(e){j(e instanceof Error?e.message:String(e))}finally{C(!1)}};return(0,E.jsx)(`div`,{className:`settings-memory-modal settings-pi-modal`,ref:o,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`pi-profile-title`,tabIndex:-1,onKeyDown:M,children:(0,E.jsxs)(`div`,{className:`settings-memory-modal-card`,children:[(0,E.jsxs)(`header`,{className:`settings-memory-modal-header`,children:[(0,E.jsx)(`h3`,{id:`pi-profile-title`,children:`Pi Settings`}),(0,E.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:i,children:`Close`})]}),(0,E.jsxs)(`div`,{className:`settings-section-body`,children:[(0,E.jsx)(g,{id:`pi-profile-mode`,label:`Mode`,value:u,options:D.map(e=>({value:e,label:e})),onChange:e=>d(e)}),(0,E.jsx)(v,{id:`pi-profile-id`,label:`Provider`,value:f,onChange:p,placeholder:`progrok`}),(0,E.jsx)(v,{id:`pi-profile-endpoint`,label:`Endpoint`,value:m,onChange:h,placeholder:A(u)}),(0,E.jsx)(v,{id:`pi-profile-model`,label:`Model`,value:_,onChange:y,placeholder:`grok-composer-2.5-fast`}),(0,E.jsx)(v,{id:`pi-profile-key`,label:`API Key`,value:b,onChange:x,placeholder:c?.apiKeySet?`set (${c.apiKeyLast4||`****`})`:`empty for local proxy`}),(0,E.jsx)(l,{children:`Default: grok-composer-2.5-fast. Bare grok-composer-2.5 currently has no verified team access.`}),w?(0,E.jsx)(l,{tone:`error`,role:`alert`,children:w}):null,(0,E.jsx)(s,{children:(0,E.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:S,onClick:()=>void N(),children:S?`Registering...`:`Register`})})]})]})})}function M(e,t,n=``){let r=new Set;n&&r.add(n);for(let n of e?.discoveredModels?.[t]||[])r.add(n);let i=e?.profiles?.find(e=>e.id===t);return i?.model&&r.add(i.model),[...r]}function N(e,t=``){let n=new Set;t&&n.add(t);for(let t of e?.profiles||[])n.add(t.id);return[...n]}function P(e){return e===`cursor`||e===`grok`||e===`claude`}function F(e){return e===`native`||e===`print`}var I=`unrecognized`,L=[{value:`native`,label:`Native session (opt-in)`},{value:`print`,label:`Print compatibility`}];function R({cli:e,original:t,dirty:n,disabled:r=!1,setEntry:i}){let a=P(e)?`perCli.${e}.transport`:null,o=(0,T.useSyncExternalStore)(n.subscribe,()=>a===null?void 0:n.pending.get(a)),s=(0,T.useRef)(r);(0,T.useLayoutEffect)(()=>(s.current=r,()=>{s.current=!0}),[r]);let c=t===void 0?`print`:t,l=o?o.value:c,u=F(l);return a===null?null:(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{id:`percli-${e}-transport`,label:`Runtime transport`,value:u?l:I,options:u?L:[...L,{value:I,label:`Unrecognized transport`}],disabled:r,error:u?null:`Choose a supported runtime transport.`,onChange:e=>{!s.current&&F(e)&&i(a,{value:e,original:c,valid:!0})}}),u?null:(0,E.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:`Stored runtime transport is unrecognized.`}),(0,E.jsx)(`p`,{className:`settings-percli-note`,children:`Applies to the next run. Independent of Activity / Legacy presentation.`}),l===`native`?(0,E.jsx)(`p`,{className:`settings-percli-note`,children:e===`claude`?`Claude native supports Auto (YOLO) / Safe permissions.`:`Native requires Auto (YOLO) permissions; no native worker assignments.`}):null]})}function z(e,t,n=!0){return{value:e,original:t,valid:n}}function ee({cli:e,meta:t,original:n,value:r,setValue:i,setEntry:a,dirty:s,disabled:c=!1,client:l,pi:u,setPi:d,onPiRegistered:f}){let p=`percli-${e}-models`,m=e===`pi`,[_,y]=(0,T.useState)(!1),b=(0,T.useRef)(c);(0,T.useLayoutEffect)(()=>(b.current=c,()=>{b.current=!0}),[c]);let S=r.provider||t.defaultProvider||t.providers?.[0]||`claude`,w=m?M(u,S,r.model||``):[],D=!m&&(t.providers?.length??0)>0,O=m?w:D?t.modelsByProvider?.[S]??t.models:t.models,k=D?t.effortsByProvider?.[S]??t.efforts:void 0,A=x(t,r.model||``,k,D?S:void 0);return(0,E.jsxs)(`div`,{className:`settings-percli-row`,"data-cli":e,children:[(0,E.jsx)(o,{children:(0,E.jsx)(`strong`,{className:`settings-percli-title`,children:t.label})}),(0,E.jsxs)(`div`,{className:`settings-percli-grid${m?` settings-percli-grid--pi`:``}`,children:[m&&N(u,S).length?(0,E.jsx)(g,{id:`percli-${e}-provider`,label:`Provider`,disabled:c,value:S,options:N(u,S).map(e=>({value:e,label:e})),onChange:t=>{if(b.current)return;let o=M(u,t),s=o.includes(r.model||``)?r.model||``:o[0]||``;i({...r,provider:t,model:s}),a(`perCli.${e}.provider`,z(t,n.provider??`progrok`)),a(`perCli.${e}.model`,z(s,n.model??``))}}):D?(0,E.jsx)(g,{id:`percli-${e}-provider`,label:`Provider`,disabled:c,value:S,options:(t.providers??[]).map(e=>({value:e,label:e})),onChange:o=>{if(b.current)return;let s=t.modelsByProvider?.[o]??[],c=t.effortsByProvider?.[o]??[],l=s.includes(r.model||``)?r.model||``:s[0]||``,u=C(t,l,r.effort??``,c,o);i({...r,provider:o,model:l,effort:u}),a(`perCli.${e}.provider`,z(o,n.provider??t.defaultProvider??`claude`)),a(`perCli.${e}.model`,z(l,n.model??``)),a(`perCli.${e}.effort`,z(u,n.effort??``))}}):null,m&&O.length>0?(0,E.jsx)(g,{id:`percli-${e}-model`,label:`Model`,disabled:c,value:r.model??O[0]??``,options:O.map(e=>({value:e,label:e})),onChange:o=>{if(b.current)return;let s=C(t,o,r.effort??``,k,D?S:void 0);i({...r,model:o,effort:s}),a(`perCli.${e}.model`,z(o,n.model??``)),s!==(r.effort??``)&&a(`perCli.${e}.effort`,z(s,n.effort??``))}}):(0,E.jsx)(v,{id:`percli-${e}-model`,label:`Model`,disabled:c,value:r.model??``,onChange:t=>{b.current||(i({...r,model:t}),a(`perCli.${e}.model`,z(t,n.model??``)))},placeholder:O[0]??`model id`}),t.modelNote?(0,E.jsx)(`p`,{className:`settings-percli-note`,children:t.modelNote}):null,O.length>0?(0,E.jsx)(`datalist`,{id:p,children:O.map(e=>(0,E.jsx)(`option`,{value:e},e))}):null,A.length>0?(0,E.jsxs)(`div`,{className:`settings-percli-effort`,children:[(0,E.jsx)(g,{id:`percli-${e}-effort`,label:`Effort`,disabled:c,value:r.effort??``,options:[{value:``,label:`(default)`},...A.map(e=>({value:e,label:e}))],onChange:t=>{b.current||(i({...r,effort:t}),a(`perCli.${e}.effort`,z(t,n.effort??``)))}}),t.effortNote?(0,E.jsx)(`p`,{className:`settings-percli-note`,children:t.effortNote}):null]}):t.effortNote?(0,E.jsx)(`p`,{className:`settings-percli-note settings-percli-note--effort`,children:t.effortNote}):null,P(e)?(0,E.jsx)(R,{cli:e,original:n.transport,dirty:s,disabled:c,setEntry:a}):null,(0,E.jsx)(h,{id:`percli-${e}-fastmode`,label:`Fast mode`,disabled:c,value:!!r.fastMode,onChange:t=>{b.current||(i({...r,fastMode:t}),a(`perCli.${e}.fastMode`,z(t,!!n.fastMode)))}}),m&&l?(0,E.jsx)(`button`,{type:`button`,className:`settings-action settings-percli-settings`,disabled:c,onClick:()=>{b.current||y(!0)},children:`Settings`}):null]}),m&&l&&_?(0,E.jsx)(`div`,{inert:c,"aria-busy":c,children:(0,E.jsx)(j,{client:l,pi:u,provider:S,model:r.model||`grok-composer-2.5-fast`,onClose:()=>y(!1),onRegistered:t=>{if(f){f(t);return}if(b.current)return;let{provider:o,model:s,pi:c}=t;c&&d&&d(c),i({...r,provider:o,model:s}),a(`perCli.${e}.provider`,z(o,n.provider??`progrok`)),a(`perCli.${e}.model`,z(s,n.model??``))}})}):null]})}var B=e=>e===`fallbackOrder`||e.startsWith(`perCli.`);function V(e){let t=e&&typeof e==`object`&&`data`in e?e.data:e;if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Invalid settings response. Refresh before retrying.`);return t}function H(e){return b(e).sort((e,t)=>e===`pi`?-1:+(t===`pi`))}function te(e){let t=new Set;for(let n of Object.keys(e.activeOverrides||{}))t.add(n);for(let n of Object.keys(e.perCli||{}))t.add(n);let n={};for(let e of t)n[e]={model:``,effort:``};return{activeOverrides:n}}function U({port:e,client:r,dirty:i,registerSave:o}){let h=(0,T.useMemo)(()=>({client:r,port:e,dirty:i}),[r,e,i]),g=(0,T.useRef)(null),v=(0,T.useRef)(null),b=(0,T.useRef)(0),x=(0,T.useMemo)(()=>({...r,get:async(e,t)=>({instance:h,value:await r.get(e,t)})}),[r,h]),{state:C,refresh:D,setData:O}=p(x,`/api/settings`,[e]),k=(0,T.useMemo)(()=>C.kind===`ready`?C.data.instance===h?{kind:`ready`,data:C.data.value}:{kind:`loading`}:C,[C,h]),A=(0,T.useCallback)(e=>O({instance:h,value:e}),[h,O]),[j,M]=(0,T.useState)({}),[N,P]=(0,T.useState)(void 0),[F,I]=(0,T.useState)([]),[L,R]=(0,T.useState)(!1),[z,U]=(0,T.useState)(null),[ne,W]=(0,T.useState)(null),[G,K]=(0,T.useState)(!1),[re,q]=(0,T.useState)(null);(0,T.useLayoutEffect)(()=>(g.current=h,v.current=null,++b.current,K(!1),R(!1),W(null),U(null),q(null),()=>{g.current=null,v.current=null,++b.current}),[h]);let J=(0,T.useCallback)(()=>g.current===h&&!v.current,[h]),Y=(0,T.useCallback)(async()=>{if(g.current!==h)return;let e=++b.current;try{let t=await r.get(`/api/cli-registry`);if(g.current!==h||e!==b.current)return;let n=t&&typeof t==`object`&&`data`in t?t.data:t;q(S(n))}catch{g.current===h&&e===b.current&&q(null)}},[r,h]);(0,T.useEffect)(()=>{Y()},[Y]),(0,T.useEffect)(()=>{if(k.kind!==`ready`)return;let e={...k.data.perCli||{}},t=Object.fromEntries(Object.entries(i.saveBundle()).filter(([e])=>B(e))),n=w(t).perCli;if(n&&typeof n==`object`&&!Array.isArray(n))for(let[t,r]of Object.entries(n))r&&typeof r==`object`&&!Array.isArray(r)&&(e[t]={...e[t],...r});M(e),P(k.data.pi),I([...k.data.fallbackOrder||[]])},[k,i]);let ie=(0,T.useCallback)(e=>{if(g.current!==h)return;let t=k.kind===`ready`?k.data.perCli?.pi:void 0;e.pi&&P(e.pi),M(t=>({...t,pi:{...t.pi,provider:e.provider,model:e.model}})),i.set(`perCli.pi.provider`,{value:e.provider,original:t?.provider??`progrok`,valid:!0}),i.set(`perCli.pi.model`,{value:e.model,original:t?.model??``,valid:!0})},[i,h,k]);(0,T.useEffect)(()=>()=>{for(let e of Array.from(i.pending.keys()))B(e)&&i.remove(e)},[i,h]);let ae=(0,T.useCallback)((e,t)=>{J()&&B(e)&&i.set(e,t)},[i,J]),X=(0,T.useCallback)(()=>{if(g.current!==h)return Promise.resolve();let e=v.current;if(e)return e.kind===`save`?e.promise:Promise.reject(Error(`Wait for the active override reset before saving.`));let t=Object.fromEntries(Object.entries(i.saveBundle()).filter(([e])=>B(e)));if(Object.keys(t).length===0)return Promise.resolve();let n=w(t),a=new Map([...i.pending].filter(([e])=>Object.hasOwn(t,e)));K(!0),W(null);let o={instance:h,kind:`save`,promise:Promise.resolve()};return o.promise=Promise.resolve().then(async()=>{if(g.current!==h)return;let e=await r.put(`/api/settings`,n);if(g.current!==h)return;let t=V(e);for(let[e,t]of a)i.pending.get(e)===t&&i.remove(e);A(t),await D(),await Y()}).catch(e=>{if(g.current===h)throw e}).finally(()=>{v.current===o&&(v.current=null),g.current===h&&K(!1)}),v.current=o,o.promise},[r,i,h,Y,D,A]);(0,T.useEffect)(()=>{if(o)return o(X),()=>o(null)},[o,X]);let oe=(0,T.useCallback)(()=>{if(!J()||k.kind!==`ready`||!window.confirm(`Reset all active overrides?`))return;R(!0),U(null);let e=te(k.data),t={instance:h,kind:`reset`,promise:Promise.resolve()};return t.promise=Promise.resolve().then(async()=>{if(g.current!==h)return;let t=await r.put(`/api/settings`,e);if(g.current!==h)return;let n=V(t);A(n),await D()}).catch(e=>{g.current===h&&U(m(e))}).finally(()=>{v.current===t&&(v.current=null),g.current===h&&R(!1)}),v.current=t,t.promise},[J,r,h,D,A,k]);if(k.kind===`loading`)return(0,E.jsx)(c,{});if(k.kind===`offline`)return(0,E.jsx)(u,{port:e});if(k.kind===`error`)return(0,E.jsx)(f,{message:k.message});let Z=k.data,Q=Z.perCli||{},se=H(Object.keys(Q)),ce=Z.activeOverrides||{},$=Object.entries(ce);return(0,E.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),X().catch(e=>{g.current===h&&W(m(e))})},children:[ne?(0,E.jsx)(f,{message:ne}):null,(0,E.jsx)(d,{title:`Model defaults`,hint:`Per-CLI model and runtime defaults. Runtime transport applies to the next run; display and permissions stay separate.`,children:se.length===0?(0,E.jsx)(l,{children:`No CLIs registered for this instance.`}):se.map(e=>(0,E.jsx)(ee,{cli:e,meta:y(e,re),original:Q[e]||{},value:j[e]||Q[e]||{},dirty:i,disabled:G||L,setValue:t=>{J()&&M({...j,[e]:t})},setEntry:ae,client:r,pi:N,setPi:e=>{J()&&P(e)},onPiRegistered:ie},e))}),(0,E.jsx)(d,{title:`Fallback order`,hint:`Order of CLIs used when the active CLI fails. Press Enter to add a chip; Backspace to remove the last.`,children:(0,E.jsx)(_,{id:`model-fallbackOrder`,label:`Fallback order`,error:(()=>{let e=F.find(n);return e?`A saved ${t(e).replace(` (retired)`,``)} fallback is retired. Remove it before changing this order.`:null})(),disabled:G||L,value:F,onChange:e=>{J()&&(I(e),ae(`fallbackOrder`,{value:e,original:Z.fallbackOrder||[],valid:!e.some(n)}))},placeholder:`cli name`})}),(0,E.jsxs)(d,{title:`Active overrides`,hint:`Per-session overrides applied on top of per-CLI defaults.`,children:[$.length===0?(0,E.jsx)(l,{children:`No active overrides.`}):(0,E.jsx)(a,{items:$.flatMap(([e,t])=>[{label:`${e} model`,value:t?.model||`—`,mono:!0},{label:`${e} effort`,value:t?.effort||`—`,mono:!0}])}),(0,E.jsx)(s,{status:z?(0,E.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:z}):null,children:(0,E.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,onClick:()=>void oe(),disabled:G||L||$.length===0,children:L?`Resetting…`:`Reset overrides`})})]})]})}export{te as buildResetOverridesPatch,U as default,H as orderModelCliKeys};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t}from"./icons-CVkqyECl.js";import{n,t as r}from"./jsx-runtime-CkEUZM6i.js";import{n as i,r as a,s as o,t as s,u as c}from"./page-shell-DfinU3mb.js";import{a as l,i as u}from"./fields-CicOWY-X.js";import{t as d}from"./path-utils-B6vBr0DD.js";var f=e(n(),1),p=r(),m=`image/png,image/jpeg,image/webp,image/gif`;function h({kind:e,port:n}){let[r,i]=(0,f.useState)(null),[a,o]=(0,f.useState)(!1),[s,c]=(0,f.useState)(null),l=(0,f.useRef)(null);(0,f.useEffect)(()=>{let t=!1;return c(null),i(null),fetch(`/i/${n}/api/avatar`).then(e=>e.ok?e.json():Promise.reject(Error(`avatar HTTP ${e.status}`))).then(n=>{if(t)return;let r=(`data`in n&&n.data?n.data:n)[e]||null;i(r)}).catch(e=>{t||c(e instanceof Error?e.message:String(e))}),()=>{t=!0}},[e,n]);let u=()=>l.current?.click(),d=async t=>{o(!0),c(null);try{let r=await t.arrayBuffer(),a=t.type||`application/octet-stream`,o=await fetch(`/i/${n}/api/avatar/${e}/upload`,{method:`POST`,headers:{"content-type":a,"x-filename":encodeURIComponent(t.name)},body:r});if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`upload failed: ${o.status} ${e}`)}let s=await o.json(),c=`data`in s&&s.data?s.data:s;i(c)}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(!1),l.current&&(l.current.value=``)}},h=async()=>{o(!0),c(null);try{let t=await fetch(`/i/${n}/api/avatar/${e}/image`,{method:`DELETE`});if(!t.ok)throw Error(`clear failed: ${t.status}`);let r=await t.json(),a=`data`in r&&r.data?r.data:r;i(a)}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(!1)}},g=r&&r.kind===`image`?`/i/${n}${r.imageUrl}`:null,_=e===`agent`?`Agent avatar`:`User avatar`;return(0,p.jsxs)(`div`,{className:`settings-avatar-card`,children:[(0,p.jsx)(`div`,{className:`settings-avatar-preview`,"aria-label":`${_} preview`,children:g?(0,p.jsx)(`img`,{src:g,alt:`${_} current`}):e===`agent`?(0,p.jsx)(`img`,{className:`settings-avatar-mascot`,src:`/icons/mascot.png`,alt:``,"aria-hidden":`true`}):(0,p.jsx)(`span`,{className:`settings-avatar-placeholder`,"aria-hidden":`true`,dangerouslySetInnerHTML:{__html:t(`user`,28)}})}),(0,p.jsxs)(`div`,{className:`settings-avatar-controls`,children:[(0,p.jsx)(`span`,{className:`settings-field-label`,children:_}),(0,p.jsx)(`input`,{ref:l,type:`file`,accept:m,style:{display:`none`},onChange:e=>{let t=e.target.files?.[0];t&&d(t)}}),(0,p.jsxs)(`div`,{className:`settings-avatar-buttons`,children:[(0,p.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:u,disabled:a,children:a?`Working…`:`Upload image`}),g?(0,p.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,onClick:()=>void h(),disabled:a,children:`Clear`}):null]}),s?(0,p.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null]})]})}var g=[{value:`ko`,label:`한국어 (ko)`},{value:`en`,label:`English (en)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}];function _({port:e,client:t,dirty:n,registerSave:r}){let{state:m,refresh:_,setData:v}=c(t,`/api/settings`),[y,b]=(0,f.useState)({});(0,f.useEffect)(()=>{m.kind===`ready`&&b(m.data)},[m]),(0,f.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`locale`||e===`showReasoning`)&&n.remove(e)},[n]);let x=(0,f.useCallback)((e,t)=>n.set(e,t),[n]),S=(0,f.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=d(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),b(a),v(a),await _()},[t,n,_,v]);if((0,f.useEffect)(()=>{if(r)return r(S),()=>r(null)},[r,S]),m.kind===`loading`)return(0,p.jsx)(i,{});if(m.kind===`offline`)return(0,p.jsx)(a,{port:e});if(m.kind===`error`)return(0,p.jsx)(s,{message:m.message});let C=m.data;return(0,p.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,p.jsxs)(o,{title:`Profile`,hint:`Identity and display preferences for this instance.`,children:[(0,p.jsx)(u,{id:`profile-locale`,label:`Locale`,value:y.locale??C.locale??`ko`,options:g,onChange:e=>{b({...y,locale:e}),x(`locale`,{value:e,original:C.locale??`ko`,valid:!0})}}),(0,p.jsx)(l,{id:`profile-showReasoning`,label:`Show reasoning traces`,value:!!(y.showReasoning??C.showReasoning),onChange:e=>{b({...y,showReasoning:e}),x(`showReasoning`,{value:e,original:!!C.showReasoning,valid:!0})}})]}),(0,p.jsxs)(o,{title:`Avatars`,hint:`Uploads write to the instance's home folder.`,children:[(0,p.jsx)(h,{kind:`agent`,port:e}),(0,p.jsx)(h,{kind:`user`,port:e})]})]})}export{_ as default};
@@ -1 +0,0 @@
1
- import{r as e,t}from"./cli-engine-NdU0lzs_.js";var n=[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex-spark`,`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`gpt-6-sol`,`gpt-6-luna`],r=[`pi`,`claude`,`agy`,`codex`,`cursor`,`kiro-code`,`gemini`],i={agy:{label:`Antigravity`,models:[`Gemini 3.7 Flash (Medium)`,`Gemini 3.6 Flash (Medium)`],efforts:[],modelNote:`AGY model override is version-dependent. Observed AGY 1.1.13 supports --model; cli-jaw probes the installed binary and emits this field only when supported. Leave empty to use native AGY selection.`,effortNote:`AGY has no separate effort flag.`},pi:{label:`Pi`,defaultProvider:`progrok`,providers:[`progrok`],models:[`grok-composer-2.5-fast`,`grok-4.6`,`grok-4.5`,`grok-4.3`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],effortNote:`Pi runs through --mode rpc. grok-composer-2.5-fast is the verified default; bare grok-composer-2.5 currently has no team access.`},claude:{label:`Claude`,models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`,`claude-fable-5-1`,`claude-fable-5`,`claude-fable-5[1m]`,`claude-sonnet-5`,`claude-sonnet-5[1m]`,`claude-opus-5-5`,`claude-opus-5-5[1m]`,`claude-opus-5`,`claude-opus-5[1m]`,`claude-opus-4-8`,`claude-opus-4-8[1m]`,`claude-opus-4-7`,`claude-opus-4-7[1m]`,`claude-opus-4-6`,`claude-opus-4-6[1m]`,`claude-sonnet-4-6`,`claude-sonnet-4-6[1m]`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},codex:{label:`Codex`,models:n,efforts:[`low`,`medium`,`high`,`xhigh`]},"codex-app":{label:`Codex App`,models:n,efforts:[`low`,`medium`,`high`,`xhigh`]},cursor:{label:`Cursor`,models:`auto,composer-2.5,gpt-5.5,gpt-5.6-sol,gpt-5.6-terra,gpt-5.6-luna,gpt-5.4,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex-mini,gpt-5.1,claude-sonnet-5,claude-fable-5,claude-fable-5-thinking,claude-opus-5-5,claude-opus-5,claude-opus-4-8,claude-opus-4-8-thinking,claude-opus-4-7,claude-opus-4-7-thinking,claude-4.6-opus,claude-4.6-sonnet,claude-4.5-opus-high,claude-4.5-sonnet,claude-4-sonnet,gemini-3.1-pro,gemini-3-flash,gemini-3-pro,gemini-3.5-flash,grok-4.6,grok-4.7,grok-4.5,gpt-5-mini,glm-5.2,glm-5.3,gpt-5.5-extra,kimi-k2.7-code,kimi-k3,gemini-3.6-flash,gemini-3.7-flash`.split(`,`),efforts:[`none`,`none-fast`,`low`,`low-fast`,`medium`,`medium-fast`,`high`,`high-fast`,`xhigh`,`xhigh-fast`,`max`,`max-fast`],effortNote:`Cursor effort resolves to model IDs; no separate --effort flag`},"kiro-code":{label:`Kiro`,models:[`auto`,`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`claude-fable-5`,`claude-sonnet-5`,`claude-opus-5`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-opus-4.6`,`claude-sonnet-4.6`,`claude-opus-4.5`,`claude-sonnet-4.5`,`claude-sonnet-4`,`claude-haiku-4.5`,`deepseek-3.2`,`minimax-m2.5`,`minimax-m2.1`,`glm-5`,`qwen3-coder-next`],efforts:[`low`,`medium`,`high`,`xhigh`],effortNote:`Kiro CLI forwards --effort; cli-jaw maps xhigh to Kiro max on the wire`},gemini:{label:`Gemini`,models:[`gemini-3-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`],efforts:[]},grok:{label:`Grok`,models:[`grok-build`,`grok-composer-2.5-fast`],efforts:[],effortNote:`unsupported by grok-build/composer; do not pass --effort`},opencode:{label:`OpenCode`,models:[`opencode-go/kimi-k2.7-code`,`opencode-go/glm-5.2`,`opencode-go/glm-5.1`,`opencode-go/kimi-k2.6`,`opencode-go/mimo-v2.5-pro`,`opencode-go/mimo-v2.5`,`opencode-go/minimax-m2.7`,`opencode-go/qwen3.7-plus`,`opencode-go/qwen3.6-plus`,`opencode-go/deepseek-v4-pro`,`opencode-go/deepseek-v4-flash`],efforts:[`minimal`,`low`,`high`,`max`]},copilot:{label:`Copilot`,models:[`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`gpt-5.5`,`claude-fable-5`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-sonnet-4.6`,`gpt-5.4`],efforts:[`low`,`medium`,`high`]}};function a(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function o(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t={};for(let[n,r]of Object.entries(e))t[n]=a(r);return t}function s(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function c(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t={};for(let[n,r]of Object.entries(e)){let e=o(r);e&&(t[n]=e)}return t}function l(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t={};for(let[n,r]of Object.entries(e)){let e=s(r);e&&(t[n]=e)}return t}function u(e){if(!e||typeof e!=`object`||Array.isArray(e))return{};let n={};for(let[r,i]of Object.entries(e)){if(t(r)||!i||typeof i!=`object`||Array.isArray(i))continue;let e=i,u=o(e.modelsByProvider),d=o(e.effortsByProvider),f=o(e.effortsByModel),p=s(e.defaultEffortByModel),m=c(e.effortsByModelByProvider),h=l(e.defaultEffortByModelByProvider);n[r]={label:typeof e.label==`string`?e.label:r,models:a(e.models),efforts:a(e.efforts),...typeof e.defaultProvider==`string`?{defaultProvider:e.defaultProvider}:{},...e.providers?{providers:a(e.providers)}:{},...u?{modelsByProvider:u}:{},...d?{effortsByProvider:d}:{},...f?{effortsByModel:f}:{},...p?{defaultEffortByModel:p}:{},...m?{effortsByModelByProvider:m}:{},...h?{defaultEffortByModelByProvider:h}:{},...typeof e.modelSource==`string`?{modelSource:e.modelSource}:{},...typeof e.effortNote==`string`?{effortNote:e.effortNote}:{},...typeof e.modelNote==`string`?{modelNote:e.modelNote}:{}}}return n}function d(e,t,n,r){let i=(t||``).trim();if(r){let t=e.effortsByModelByProvider?.[r]?.[i];if(t)return t}return e.effortsByModel?.[i]||(n??e.efforts)}function f(e,t,n,r,i){let a=d(e,t,r,i);if(n&&a.includes(n))return n;let o=(t||``).trim(),s=(i?e.defaultEffortByModelByProvider?.[i]?.[o]:void 0)??e.defaultEffortByModel?.[o]??``;return a.includes(s)?s:``}function p(n,r){return t(n)?{label:e(n),models:[],efforts:[]}:r?.[n]||i[n]||{label:n,models:[],efforts:[]}}function m(e){return e.filter(e=>!t(e))}function h(e){let t=m(e),n=r.filter(e=>t.includes(e)),i=t.filter(e=>!r.includes(e));return[...n,...i]}function g(e,t={},n={}){return n[e]?.model||t[e]?.model||``}function _(e,t={},n={}){return n[e]?.effort||t[e]?.effort||``}function v(e,t=``){let n=new Set;t&&n.add(t);for(let t of e)n.add(t);return Array.from(n).map(e=>({value:e,label:e}))}export{p as a,h as c,m as d,d as i,_ as l,r as n,u as o,f as r,v as s,i as t,g as u};
@@ -1,59 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-DSSkXCir.css"])))=>i.map(i=>d[i]);
2
- import{n as e,r as t}from"./vendor-render-BsyPjvQm.js";import{t as n}from"./state-Dl-xxPoS.js";import{a as r,i,n as a,r as o,t as s}from"./api-CUtiCd2-.js";import{a as c,c as l,d as u,f as d,i as ee,l as te,r as f,s as p,t as m,u as ne}from"./sidebar-CrpBbYFg.js";import{t as h}from"./preload-helper-CfbQpVni.js";import{A as re,C as ie,D as ae,M as oe,N as se,O as g,P as _,b as ce,g as le,h as v,j as ue,l as de,m as fe,n as pe,p as me,u as he,w as ge,x as _e,y as ve}from"./render-D8dVQ_bm.js";import{r as ye,t as y}from"./icons-CVkqyECl.js";import{t as be}from"./copy-text-DjgetgoZ.js";import{_ as xe,d as Se,f as b,n as Ce,u as we}from"./iframe-renderer-CcGzEi0v.js";import{$ as Te,H as x,U as S,X as Ee,t as De}from"./message-history-DSvflaZ9.js";import{c as C,n as Oe}from"./idb-cache-BRpjf_a8.js";import{c as ke,o as Ae,p as je}from"./ui-rnVAM91F.js";import{t as Me}from"./locale-B9w_kUtW.js";import{a as Ne,c as Pe,i as Fe,l as Ie,n as Le,o as Re,r as ze,s as Be,t as Ve}from"./slash-commands-DkrGUOnC.js";import{i as He,l as Ue,n as We,o as Ge,r as Ke,s as qe,t as Je}from"./settings-core-D4zGy72z.js";import{o as Ye}from"./constants-DmZ9Rjym.js";import{t as Xe}from"./provider-icons-Bge6teOj.js";import{a as Ze,i as Qe,t as $e}from"./skills-Bx8U-gJa.js";import{C as et,S as tt,_ as nt,a as rt,b as it,c as at,d as ot,f as st,g as ct,h as lt,i as ut,l as dt,m as ft,n as pt,o as mt,p as ht,r as w,s as gt,t as _t,u as vt,v as yt,w as bt,y as xt}from"./settings-Bp0sgQ2a.js";import{a as St,c as Ct,d as wt,f as Tt,i as Et,l as Dt,m as Ot,n as kt,o as At,p as jt,r as Mt,s as Nt,t as Pt,u as Ft}from"./memory-DTpD4see.js";import{n as It}from"./bgtask-badge-oPvZyylH.js";var Lt=/(?:^|[^A-Za-z0-9_$])\$([A-Za-z0-9_:-]*)$/,Rt=/^[A-Za-z0-9][A-Za-z0-9_:-]*$/;function T(e){let t=String(e.name||``).trim();return Rt.test(t)?t:e.id}function zt(e,t=e.length){let n=String(e||``),r=n.slice(0,Math.max(0,Math.min(t,n.length))),i=Lt.exec(r);if(!i)return null;let a=i[1]??``;return{start:r.length-a.length-1,query:a.toLowerCase()}}function Bt(e,t){let n=String(t||``).toLowerCase(),r=e=>{if(!n)return 1;let t=[e.id,T(e)].map(e=>e.toLowerCase());return t.some(e=>e.startsWith(n))?3:t.some(e=>e.includes(n))?2:+!!`${e.name||``} ${e.description||``}`.toLowerCase().includes(n)};return e.map(e=>({skill:e,score:r(e),key:T(e)})).filter(e=>e.score>0).sort((e,t)=>t.score-e.score||e.key.localeCompare(t.key)).map(e=>e.skill)}var E=[],D=0,O=!1,Vt=null,Ht=null,Ut=0,Wt=()=>document.getElementById(`skillMentionDropdown`),k=()=>document.getElementById(`chatInput`);function Gt(){return n.allSkills.filter(e=>e&&e.enabled&&typeof e.id==`string`).map(e=>({id:e.id,name:e.mention||e.id,description:e.description}))}function Kt(){return n.allSkills.length?Promise.resolve():(Ht??=re(`/api/skills`).then(e=>e.json()).then(e=>{Array.isArray(e)&&!n.allSkills.length&&(n.allSkills=e)}).catch(()=>{}).finally(()=>{Ht=null}),Ht)}function qt(){let e=document.getElementById(`cmdDropdown`);e&&(e.classList.remove(`visible`),e.style.display=`none`)}function Jt(){let e=Wt(),t=k();e&&t&&(qt(),e.innerHTML=E.map((e,t)=>`<div class="cmd-item${t===D?` selected`:``}"
3
- role="option" id="skill-mention-item-${t}" aria-selected="${t===D}" data-index="${t}">
4
- <span class="cmd-name">$${g(T(e))}</span>
5
- <span class="cmd-desc">${g(e.description||``)}</span>
6
- </div>`).join(``),e.style.display=`block`,requestAnimationFrame(()=>e.classList.add(`visible`)),O=!0,t.setAttribute(`aria-controls`,`skillMentionDropdown`),t.setAttribute(`aria-expanded`,`true`),t.setAttribute(`aria-activedescendant`,`skill-mention-item-${D}`),e.querySelector(`.selected`)?.scrollIntoView({block:`nearest`}))}function A(){if(Ut++,!O)return;O=!1,E=[],D=0,Vt=null;let e=Wt();e&&(e.classList.remove(`visible`),e.style.display=`none`,e.innerHTML=``);let t=k();t&&(t.setAttribute(`aria-controls`,`cmdDropdown`),Ne()||(t.setAttribute(`aria-expanded`,`false`),t.setAttribute(`aria-activedescendant`,``)))}async function Yt(e){let t=++Ut;if(!e||Ne()||e.selectionStart!==e.selectionEnd){A();return}if(!zt(e.value,e.selectionStart??e.value.length)){A();return}if(await Kt(),t!==Ut)return;let n=zt(e.value,e.selectionStart??e.value.length);if(!n||Ne()){A();return}let r=Bt(Gt(),n.query);if(!r.length){A();return}Vt=n,E=r,D=0,Jt()}function Xt(){let e=E[D],t=k(),n=Vt;if(A(),!e||!t||!n)return;let r=t.selectionStart??t.value.length,i=`$${T(e)} `;t.value=t.value.slice(0,n.start)+i+t.value.slice(r);let a=n.start+i.length;t.focus(),t.selectionStart=t.selectionEnd=a,t.dispatchEvent(new Event(`input`,{bubbles:!0}))}function Zt(e){return!O||e.isComposing?!1:e.key===`ArrowDown`?(e.preventDefault(),D=Math.min(E.length-1,D+1),Jt(),!0):e.key===`ArrowUp`?(e.preventDefault(),D=Math.max(0,D-1),Jt(),!0):e.key===`Tab`||e.key===`Enter`&&!e.shiftKey?(e.preventDefault(),Xt(),!0):e.key===`Escape`&&(e.preventDefault(),A(),!0)}function Qt(e){let t=e.target.closest(`.cmd-item`);if(!t)return;let n=Number.parseInt(t.dataset.index||`-1`,10);Number.isNaN(n)||n<0||n>=E.length||(D=n,Xt())}function $t(e){if(!O)return;let t=Wt();t&&!t.contains(e.target)&&e.target!==k()&&A()}var en=new Set([`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`,`.svg`]),tn=new Set([`.mp4`,`.webm`,`.mov`,`.ogg`]);function nn(e){let t=String(e||``).split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`),r=n>0?t.slice(n).toLowerCase():``;return en.has(r)?`image`:tn.has(r)?`video`:`file`}var j=[],rn=8e3;function an(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?3e5:1e4}var on={image:`chat.file.sentImage`,video:`chat.file.sentVideo`,file:`chat.file.sent`};function sn(e){return _(on[nn(e)],{path:e})}function cn(e,t=``){let n=e.map(sn).join(`
7
- `);return t?`${n}${_(`chat.file.sentWithMsg`,{text:t})}`:n}function ln(e,t){let n=t.map(sn).join(`
8
- `);return n?`${e}\n\n${n}`:e}function un(e){let t=ie();return t?new Promise(n=>{let r=`preview-send-${Date.now()}-${Math.random().toString(36).slice(2)}`,i=!1,a=()=>{window.removeEventListener(`message`,s),window.clearTimeout(c)},o=e=>{i||(i=!0,a(),n(e))},s=e=>{if(e.source!==window.parent||!_e(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-send-result`&&t.requestId===r&&o({ok:!!t.ok,status:Number.isInteger(t.status)?t.status:t.ok?200:502,data:t.data||(t.error?{error:t.error}:{}),viaRelay:!0})},c=window.setTimeout(()=>o(null),rn);window.addEventListener(`message`,s);try{window.parent.postMessage(v({type:`jaw-preview-send-message`,requestId:r,prompt:e}),t)}catch{o(null)}}):Promise.resolve(null)}async function dn(e){let t=await un(e);if(t?.ok)return t;try{let t=await fetch(`${s}/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(v({prompt:e}))}),n=await t.json().catch(()=>({}));return{ok:t.ok,status:t.status,data:n}}catch(e){return{ok:!1,status:0,data:{error:e.message}}}}async function fn(e){let t,n,i=an(e);if(typeof AbortSignal?.timeout==`function`)t=AbortSignal.timeout(i);else{let e=new AbortController;t=e.signal,n=setTimeout(()=>e.abort(),i)}let a=Me(),o=await r(),c=await fetch(`${s}/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":a,...o?{Authorization:`Bearer ${o}`}:{}},body:JSON.stringify(v({text:e,locale:a})),signal:t});n&&clearTimeout(n);let l=await c.json().catch(()=>({}));return{ok:c.ok,status:c.status,result:l}}async function pn(e,t,n){let r=t.result;if(r?.code===`not_command`){if(n){await n();return}x(`user`,e),C({role:`user`,content:e,timestamp:Date.now()}),await i(`/api/message`,`POST`,v({prompt:e}));return}if(!t.ok&&!r?.text)throw Error(`HTTP ${t.status}`);if(r?.code===`clear_screen`){pe(),xe().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}(r?.text||r?.recovery)&&S(mn(r),``,r.type),r?.steerPrompt&&await i(`/api/message`,`POST`,v({prompt:r.steerPrompt}))}function mn(e){let t=e.recovery;if(!t?.originalText)return e.text?g(e.text):``;let n=(t.suggestedCommands||[]).slice(0,5),r=n.length?`<div class="cmd-recovery-suggestions">${n.map(e=>`<code>${g(e)}</code>`).join(` `)}</div>`:``,i=g(t.originalText);return`${e.text?`<div>${g(e.text)}</div>`:``}
9
- <div class="cmd-recovery" data-cmd-recovery>
10
- <div class="cmd-recovery-label">${g(_(`cmd.recovery.originalPrompt`))}</div>
11
- <pre class="cmd-recovery-text">${i}</pre>
12
- ${r}
13
- <div class="cmd-recovery-actions">
14
- <button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="reinsert" data-cmd-text="${i}">${g(_(`cmd.artifact.action.reinsert`))}</button>
15
- <button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="copy" data-cmd-text="${i}">${g(_(`cmd.artifact.action.copy`))}</button>
16
- </div>
17
- </div>`}document.addEventListener(`click`,async e=>{let t=e.target?.closest(`[data-cmd-recovery-action]`);if(!t)return;let n=t.dataset.cmdRecoveryAction||``,r=t.dataset.cmdText||``;if(r){if(n===`reinsert`){let e=document.getElementById(`chatInput`);if(!e)return;e.value=r,e.focus(),e.selectionStart=e.selectionEnd=e.value.length,e.dispatchEvent(new Event(`input`,{bubbles:!0}));return}n===`copy`&&await be(r)}});var hn=!1;async function gn(e=`enter`){let t=document.getElementById(`chatInput`),r=document.getElementById(`btnSend`);if(!t||!r)return;let a=t.value,s=a.trim(),c=e===`button`&&r.classList.contains(`stop-mode`);if(!de(c?``:s)){fe();return}let u=e===`button`;if(r.classList.contains(`stop-mode`)&&u){o(`/api/stop`,`POST`,v({}));return}if(hn||(A(),!s&&!n.attachedFiles.length))return;te();let d=0,ee=d,f=()=>{d++};t.addEventListener(`input`,f);let p=()=>{document.getElementById(`chatInput`)===t&&t.value===a&&d===ee&&(t.value=``,En())};hn=!0;let m=r,ne=m.disabled;m.disabled=!0;try{await Ue();let e=s.slice(1).trim().split(/\s+/)[0]||``,t=e.includes(`/`)||e.includes(`\\`),r=s.startsWith(`/`)&&!t;if(r&&!n.attachedFiles.length){if(p(),Ve(),Pe(s))return;try{await pn(s,await fn(s))}catch(e){S(_(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{l(`command`).catch(()=>{})}return}if(n.attachedFiles.length){let e=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${s}`;x(`user`,e),C({role:`user`,content:e,timestamp:Date.now()}),p();try{let e=await Promise.all(n.attachedFiles.map(e=>vn(e))),t=cn(e,s);if(M(),r){Ve();try{let n=ln(s,e);await pn(n,await fn(n),async()=>{await i(`/api/message`,`POST`,v({prompt:t}))})}catch(e){S(_(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{l(`command`).catch(()=>{})}return}await i(`/api/message`,`POST`,v({prompt:t}))}catch(e){S(_(`chat.file.uploadFail`,{msg:e.message})),M()}}else{p();let e=await dn(s),t=e.data;if(e.status===409&&t.error===`duplicate`)return;if(!e.ok){S(`${y.error} ${g(t.error||_(`chat.requestFail`,{status:e.status}))}`,``,`error`);return}if(t.queued){let{updateQueueBadge:e}=await h(async()=>{let{updateQueueBadge:e}=await import(`./ui-C0o427q6.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(t.pending||1)}else e.viaRelay?(C({role:`user`,content:s,timestamp:Date.now()}),t.continued&&S(_(`chat.continue`)),b(!0)):t.noPendingContinue?(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),b(!0)):t.continued?(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),S(_(`chat.continue`)),b(!0)):(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),b(!0))}}finally{t.removeEventListener(`input`,f),hn=!1,m.disabled=ne}}function _n(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),gn(`enter`))}async function vn(e){let t=await fetch(`${s}/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function yn(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);xn(),document.getElementById(`chatInput`)?.focus()}function bn(e){n.attachedFiles.splice(e,1),xn()}function M(){j.forEach(e=>URL.revokeObjectURL(e)),j=[],n.attachedFiles=[],xn();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function xn(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(j.forEach(e=>URL.revokeObjectURL(e)),j=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);j.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
18
- ${i}
19
- <span class="file-chip-name">${y.paperclip} ${g(e.name)} (${n}KB)</span>
20
- <button class="file-chip-remove" data-file-idx="${t}" title="Remove">${y.close}</button>
21
- </div>`}).join(``))}}async function Sn(){pe(),xe().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await h(async()=>{let{cleanupToolActivity:e}=await import(`./ui-C0o427q6.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),Oe().catch(()=>{}),te()}var Cn=0;function wn(e){if(Cn)return;let t=we();Cn=requestAnimationFrame(()=>{if(Cn=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`,t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,Se())}})}function Tn(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>wn(e))}function En(){let e=document.getElementById(`chatInput`),t=we();if(e&&(e.style.height=`auto`),t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,Se())}}function Dn(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&yn(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&yn(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t){if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}}n.length&&(e.preventDefault(),yn(n))})}async function On(e,t,r){if(!de()){fe();return}let a=document.getElementById(`chatInput`),o=a?.value.trim()||``,c=[...n.attachedFiles],l=[_(`chat.voice.label`)];c.length&&l.push(`📎 [${c.map(e=>e.name).join(`, `)}]`),o&&l.push(o),x(`user`,l.join(` `)),C({role:`user`,content:l.join(` `),timestamp:Date.now()}),a&&o&&(a.value=``,En()),c.length&&M();try{let n=await fetch(`${s}/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let a=await n.json().catch(()=>null);if(!a?.text)throw Error(`Empty STT result`);S(`${y.mic} STT (${g(a.engine||``)}, ${a.elapsed?.toFixed(1)}s): "${g(a.text.slice(0,100))}"`,``,`info`);let l=[];c.length&&(l=await Promise.all(c.map(e=>vn(e))));let u=[];for(let e of l)u.push(sn(e));u.push(`🎤 ${a.text}`),o&&u.push(o),await i(`/api/message`,`POST`,v({prompt:u.join(`
22
- `)}))}catch(e){S(_(`voice.sttFail`,{msg:e.message}),``,`error`)}}var kn={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},An={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function jn(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function Mn(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=jn(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=Nn(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function Nn(e){try{let[t,n,r,i,a]=Pn(e);return N(t,{min:0,max:59}),N(n,{min:0,max:23}),N(r,{min:1,max:31}),N(i,{min:1,max:12,aliases:An}),N(a,{min:0,max:7,aliases:kn,normalize:Rn}),null}catch(e){return e.message}}function Pn(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function N(e,t){for(let n of e.split(`,`))Fn(n.trim(),t)}function Fn(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,Ln(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||In(e,t)>In(r,t))throw Error(`invalid cron range "${n}"`);return}In(n,t)}}function In(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!zn(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function Ln(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function Rn(e){return e===7?0:e}function zn(e,t,n){return e>=t&&e<=n}async function Bn(){let e=await a(`/api/heartbeat`);n.heartbeatJobs=(e?.jobs||[]).map(I),n.heartbeatErrors=L(n.heartbeatJobs),P(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function Vn(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function P(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(I);n.heartbeatJobs=t,n.heartbeatErrors=L(t),e.innerHTML=t.length===0?`<p style="color:var(--text-dim);font-size:12px;text-align:center">${_(`hb.empty`)}</p>`:t.map((e,t)=>{let r=qn(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||er(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${g(r.cron)}" placeholder="${g(_(`hb.cronPlaceholder`))}"
23
- data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,l=i?`<span class="hb-chip">${g(_(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${g(_(`hb.minutesLabel`))}</span>`;return`
24
- <div class="hb-job-card">
25
- <div class="hb-job-header">
26
- <input type="text" value="${g(String(e.name||``))}" placeholder="${g(_(`hb.name`))}"
27
- data-hb-name="${t}">
28
- <button class="hb-toggle ${e.enabled?`on`:`off`}"
29
- data-hb-toggle="${t}" aria-label="${g(String(e.name||`job`)+` toggle`)}"></button>
30
- <button class="hb-del" data-hb-remove="${t}">${y.close}</button>
31
- </div>
32
- <div class="hb-job-schedule">
33
- <select data-hb-kind="${t}">
34
- <option value="every"${i?``:` selected`}>${g(_(`hb.kindEvery`))}</option>
35
- <option value="cron"${i?` selected`:``}>${g(_(`hb.kindCron`))}</option>
36
- </select>
37
- ${c}
38
- ${l}
39
- <input type="text" value="${g(r.timeZone||``)}" placeholder="${g(Zn())}"
40
- data-hb-timezone="${t}">
41
- </div>
42
- <p class="${s}">${g(o)}</p>
43
- <textarea class="hb-prompt" rows="2" placeholder="${g(_(`hb.prompt`))}"
44
- data-hb-prompt="${t}">${g(String(e.prompt||``))}</textarea>
45
- </div>
46
- `}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${y.heartPulse} Heartbeat (${r})`)}var Hn=0;function Un(){n.heartbeatJobs.push({id:`hb_${Date.now()}_${Hn++}`,name:``,enabled:!0,schedule:Yn({kind:`every`,minutes:5}),prompt:``}),P(),F()}function Wn(e){n.heartbeatJobs.splice(e,1),P(),F()}function Gn(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,P(),F())}async function F(){let e=n.heartbeatJobs.map(I);if(n.heartbeatJobs=e,n.heartbeatErrors=L(e),Object.keys(n.heartbeatErrors).length>0){P();return}let t=await i(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(I),n.heartbeatErrors=L(n.heartbeatJobs),P())}async function Kn(){try{let e=((await a(`/api/heartbeat`))?.jobs||[]).filter(e=>e.enabled!==!1&&!e.held).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${y.heartPulse} Heartbeat (${e})`)}catch{}}function I(e){return{id:String(e.id||`hb_${Date.now()}_${Hn++}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:qn(e.schedule),prompt:String(e.prompt||``)}}function qn(e){let t=Jn(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function Jn(e){return(typeof e==`string`?e.trim():``)||void 0}function Yn(e){let t=Xn();return t?{...e,timeZone:t}:e}function Xn(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function Zn(){let e=Xn();return e?`${_(`hb.timezoneAuto`)} ${e}`:_(`hb.timezoneAuto`)}function L(e){let t={};for(let n of e){let e=Qn(n);e&&(t[n.id]=e)}return t}function Qn(e){let t=Mn(e.schedule);return t.ok?null:$n(t.code,t.error)}function $n(e,t){switch(e){case`invalid_cron`:return _(`hb.invalidCron`);case`invalid_timezone`:return _(`hb.invalidTimeZone`);case`invalid_minutes`:return _(`hb.invalidMinutes`);default:return t||_(`hb.invalidSchedule`)}}function er(e){let t=e.timeZone||Xn()||`Asia/Seoul`;return e.kind===`cron`?_(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):_(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}function tr({onResizeStart:e,onResizeEnd:t,settleMs:n=160}){let r=!1,i;return()=>{r||(r=!0,e()),clearTimeout(i),i=setTimeout(()=>{r=!1,i=void 0,t()},n)}}function nr(){let e=tr({onResizeStart:()=>document.body.classList.add(`is-resizing`),onResizeEnd:()=>document.body.classList.remove(`is-resizing`)});window.addEventListener(`resize`,e,{passive:!0})}var R=`jaw.uiTheme`,z=null;function rr(e){return e===`dark`||e===`light`||e===`auto`}function ir(e){return e===`light`||e===`auto`&&typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}function ar(n){let r=n===`light`?e:t;z||(z=document.createElement(`style`),z.id=`hljsTheme`,document.head.appendChild(z)),z.textContent=r}function or(){!localStorage.getItem(R)&&localStorage.getItem(`theme`)&&(localStorage.setItem(R,localStorage.getItem(`theme`)),localStorage.removeItem(`theme`));let e=cr(),t=localStorage.getItem(R),n=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;B(e||t||n),document.getElementById(`toggleTheme`)?.addEventListener(`click`,sr),window.addEventListener(`message`,ur),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{let e=localStorage.getItem(R);(!e||e===`auto`)&&B(e||`auto`)}),window.addEventListener(`storage`,e=>{e.key===R&&e.newValue&&B(e.newValue)})}function sr(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;B(e),localStorage.setItem(R,e)}function B(e){let t=ir(e);document.documentElement.setAttribute(`data-theme`,t);let n=document.getElementById(`toggleTheme`);n&&n.classList.toggle(`is-light`,t===`light`),ar(t),Ce(),ae()}function cr(){let e=new URLSearchParams(window.location.search).get(`jawTheme`);return rr(e)?e:null}function lr(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function ur(e){if(window.parent===window||e.source!==window.parent||!lr(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-theme-sync`&&rr(t.theme)&&B(t.theme)}var dr=new Set([`j`,`k`,`i`,`n`,`p`]);function fr(e){if(e.altKey&&!e.ctrlKey&&!e.metaKey){let t=e.key.toLowerCase();return(t.length!==1||!dr.has(t))&&e.code?.startsWith(`Key`)&&(t=e.code.slice(3).toLowerCase()),dr.has(t)}return e.ctrlKey&&!e.metaKey&&!e.altKey?e.code===`Backquote`:!(!e.metaKey||e.ctrlKey||e.altKey||(e.shiftKey||e.code!==`Backquote`&&e.code!==`KeyB`&&e.code!==`KeyJ`)&&(!e.shiftKey||e.code!==`KeyB`&&e.code!==`KeyD`&&e.code!==`KeyE`))}function pr(){window.parent!==window&&document.addEventListener(`keydown`,e=>{if(fr(e)){e.preventDefault();try{window.parent.postMessage({type:`jaw-preview-shortcut`,key:e.key,code:e.code,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey},`*`)}catch{}}})}var mr=50,hr=30,gr=80,_r=500,V=null,vr=!1;function yr(){if(vr||!(`ontouchstart`in window))return;vr=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,br,{passive:!0}),e.addEventListener(`touchend`,xr,{passive:!0}))}function br(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<hr?r=`left`:t.clientX>n-hr&&(r=`right`),V={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function xr(e){if(!V)return;let t=e.changedTouches[0],n=t.clientX-V.startX,r=Math.abs(t.clientY-V.startY),i=Date.now()-V.startTime,a=V;V=null,!(r>gr||i>_r||Math.abs(n)<mr)&&(n>0&&a.isEdge===`left`&&f(),n<0&&a.isEdge===`right`&&ee())}var H=!1,U=null,W=[],Sr=null,Cr=null,wr=0,G=!1,K=`stopped`,Tr=15e3;function Er(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function Dr(e){let t=e;switch(t.name){case`NotAllowedError`:return _(`voice.micDenied`);case`NotFoundError`:return _(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return _(`voice.micBusy`);case`TimeoutError`:return Mr();default:return t instanceof TypeError||!navigator.mediaDevices?_(`voice.httpsRequired`):_(`voice.micDenied`)}}function Or(){let e=document;return e.permissionsPolicy||e.featurePolicy||null}function kr(){try{return Or()?.allowsFeature?.(`microphone`)===!1}catch{return!1}}async function Ar(){try{return navigator.permissions?.query?(await navigator.permissions.query({name:`microphone`})).state:null}catch{return null}}function jr(){let e=new URL(window.location.href),t=new URL(e.href);e.hostname===`127.0.0.1`?t.hostname=`localhost`:e.hostname===`localhost`&&(t.hostname=`127.0.0.1`);let n=t.origin===e.origin?``:t.origin;return{origin:e.origin,alternateOrigin:n}}function Mr(){let e=jr();return e.alternateOrigin?_(`voice.requestTimeoutLoopback`,e):_(`voice.requestTimeout`,e)}function Nr(e){let t=e;return t.name===`NotSupportedError`?_(`voice.unsupported`):t.name===`NotReadableError`||t.name===`AbortError`?_(`voice.micBusy`):t instanceof TypeError?_(`voice.httpsRequired`):_(`voice.interrupted`)}function q(e){if(window.parent!==window)try{window.parent.postMessage({type:`jaw-preview-stt-recording`,action:e},`*`)}catch{}}function Pr(){return new DOMException(`Timed out waiting for microphone permission prompt`,`TimeoutError`)}async function Fr(){let e=!1,t=null,n=navigator.mediaDevices.getUserMedia({audio:!0}).then(t=>e?(t.getTracks().forEach(e=>e.stop()),null):t,t=>{if(e)return null;throw t}),r=new Promise((n,r)=>{t=setTimeout(()=>{e=!0,r(Pr())},Tr)});try{let e=await Promise.race([n,r]);if(!e)throw Pr();return e}finally{t!==null&&clearTimeout(t)}}async function Ir(){if(n.isRecording||G)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){S(_(`voice.unsupported`),``,`error`);return}if(kr()){S(_(`voice.policyBlocked`),``,`error`);return}if(await Ar()===`denied`){S(_(`voice.permissionDeniedBrowser`,jr()),``,`error`);return}G=!0,H=!1,K=`stopped`,Y(!1),q(`request`);let e=null;try{e=await Fr(),Sr=e}catch(e){G=!1,Y(!1),q(`failed`),S(Dr(e),``,`error`);return}try{let t=Er(),r=new MediaRecorder(e,t?{mimeType:t}:{});U=r,W=[],r.ondataavailable=e=>{e.data.size>0&&W.push(e.data)},r.onerror=()=>{H=!0,K=`failed`,n.isRecording=!1,Vr(),Y(!1),r.state===`recording`?r.stop():(W=[],J(),U=null,q(`failed`)),S(_(`voice.interrupted`),``,`error`)},r.onstop=async()=>{let e=K,n=H||e!==`stopped`;if(K=`stopped`,n){W=[],J(),U=null,H=!1,q(e);return}let i=r.mimeType||t||`audio/webm`,a=i.includes(`mp4`)?`.m4a`:i.includes(`ogg`)?`.ogg`:`.webm`,o=new Blob(W,{type:i});if(W=[],J(),U=null,H=!1,q(`stopped`),o.size>20971520){S(_(`voice.tooLarge`),``,`error`);return}if(o.size<1e3){S(_(`voice.tooShort`),``,`error`);return}await On(o,a,i)},r.start(),n.isRecording=!0,G=!1,wr=Date.now(),Y(!0),Br(),q(`started`)}catch(e){G=!1,n.isRecording=!1,W=[],U=null,J(),Y(!1),q(`failed`),S(Nr(e),``,`error`)}}function Lr(){n.isRecording&&U&&(K=`stopped`,U.state===`recording`?U.stop():(J(),U=null,q(`stopped`)),n.isRecording=!1,Vr(),Y(!1))}function Rr(){n.isRecording&&U&&(H=!0,K=`cancelled`,U.state===`recording`?U.stop():(W=[],J(),U=null,q(`cancelled`)),n.isRecording=!1,Vr(),Y(!1))}function zr(){n.isRecording?Lr():Ir()}function J(){Sr?.getTracks().forEach(e=>e.stop()),Sr=null}function Br(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Cr=setInterval(()=>{let t=Math.floor((Date.now()-wr)/1e3),n=String(Math.floor(t/60)).padStart(2,`0`),r=String(t%60).padStart(2,`0`);e.textContent=`${n}:${r}`},500))}function Vr(){Cr&&=(clearInterval(Cr),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function Y(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`),r=G&&!e;t&&(t.classList.toggle(`recording`,e),t.classList.toggle(`arming`,r),t.innerHTML=e?y.stop:y.mic,t.title=_(r?`voice.requesting`:e?`voice.stop`:`voice.start`),t.toggleAttribute(`aria-busy`,r),t instanceof HTMLButtonElement&&(t.disabled=r)),n&&(n.style.display=e?`inline-block`:`none`)}window.parent;var Hr=null,Ur=``,X=null,Wr=!1;function Gr(){let e=document.getElementById(`chatSearchInput`),t=document.getElementById(`chatSearchClose`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);e&&t&&n&&r&&(Wr||(Wr=!0,window.addEventListener(`message`,e=>{e.data?.type===`jaw-preview-search`&&Kr()}),e.addEventListener(`input`,()=>{let t=e.value.trim();if(Hr&&clearTimeout(Hr),!t){ei(n,r);return}Hr=setTimeout(()=>void Jr(t,n,r),250)}),e.addEventListener(`keydown`,e=>{if(e.key===`Escape`){Z();return}e.key===`Enter`&&(e.preventDefault(),n.querySelector(`.chat-search-result`)?.click()),e.key===`ArrowDown`&&(e.preventDefault(),$r(n,1)),e.key===`ArrowUp`&&(e.preventDefault(),$r(n,-1))}),n.addEventListener(`wheel`,e=>{let t=n,r=t.scrollTop===0&&e.deltaY<0,i=t.scrollTop+t.clientHeight>=t.scrollHeight&&e.deltaY>0;!r&&!i&&e.stopPropagation(),(r||i)&&e.preventDefault()},{passive:!1}),t.addEventListener(`click`,Z)))}function Kr(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`);e&&t&&(e.classList.contains(`open`)?Z():(e.classList.add(`open`),t.focus(),qr()))}function Z(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);e&&(e.classList.remove(`open`),t&&(t.value=``),n&&r&&ei(n,r),Ur=``)}function qr(){X=new Map,a(`/api/messages${De()}`).then(e=>{e&&(X=new Map,e.forEach((e,t)=>X.set(e.id,t)))}).catch(()=>{})}async function Jr(e,t,n){Ur=e;let r=await a(le(`/api/messages/search?q=${encodeURIComponent(e)}&limit=20`));if(r&&Ur===e){if(n.textContent=r.length>0?`${r.length} found`:`no results`,r.length===0){t.classList.remove(`has-results`),t.innerHTML=``;return}t.innerHTML=r.map(t=>Yr(t,e)).join(``),t.classList.add(`has-results`),t.querySelectorAll(`.chat-search-result`).forEach(e=>{e.addEventListener(`click`,()=>{Qr(Number(e.dataset.msgId))})})}}function Yr(e,t){let n=e.role===`assistant`?`agent`:e.role,r=n===`agent`?e.cli||`agent`:`you`,i=e.match_field===`tool_log`,a=i?`<span class="chat-search-result-badge">tool</span>`:``,o=Zr(i?Xr(e.tool_log,t):e.content,t),s=ti(e.created_at);return`<div class="chat-search-result" data-msg-id="${e.id}" tabindex="-1">
47
- <div class="chat-search-result-meta">
48
- <span class="chat-search-result-role ${n}">${g(r)}</span>
49
- ${a}
50
- <span>${g(s)}</span>
51
- </div>
52
- <div class="chat-search-result-snippet">${o}</div>
53
- </div>`}function Xr(e,t){if(!e)return``;try{let n=JSON.parse(e),r=t.toLowerCase();for(let e of n){let t=`${e.label||``} ${e.detail||``}`;if(t.toLowerCase().includes(r))return t}}catch{}return e.slice(0,300)}function Zr(e,t){let n=e.toLowerCase().indexOf(t.toLowerCase());if(n===-1)return g(e.slice(0,120));let r=Math.max(0,n-40),i=Math.min(e.length,n+t.length+80),a=g(e.slice(r,n)),o=g(e.slice(n,n+t.length)),s=g(e.slice(n+t.length,i));return`${r>0?`&hellip;`:``}${a}<mark>${o}</mark>${s}${i<e.length?`&hellip;`:``}`}function Qr(e){if(!X)return;let t=X.get(e);t!=null&&(xe().scrollToIndex(t,`center`),requestAnimationFrame(()=>{setTimeout(()=>{let e=document.getElementById(`chatMessages`);if(!e)return;e.querySelectorAll(`.msg.search-highlight`).forEach(e=>e.classList.remove(`search-highlight`));let n=e.querySelectorAll(`.msg`);for(let e of n){let n=e.getAttribute(`data-turn-index`);if(n!=null&&Number(n)===t){e.classList.add(`search-highlight`);break}}},150)}))}function $r(e,t){let n=Array.from(e.querySelectorAll(`.chat-search-result`));if(n.length===0)return;let r=e.querySelector(`.chat-search-result.active`),i=r?n.indexOf(r)+t:0;i<0&&(i=n.length-1),i>=n.length&&(i=0),n.forEach(e=>e.classList.remove(`active`)),n[i].classList.add(`active`),n[i].scrollIntoView({block:`nearest`}),n[i].click()}function ei(e,t){e.classList.remove(`has-results`),e.innerHTML=``,t.textContent=``}function ti(e){try{let t=new Date(e),n=new Date;return t.toDateString()===n.toDateString()?t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):t.toLocaleDateString([],{month:`short`,day:`numeric`})+` `+t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}catch{return``}}var ni=!1;function ri(){if(ni)return;ni=!0;let e=document.createElement(`div`);e.id=`mediaLightbox`,e.className=`media-lightbox hidden`,e.innerHTML=`<div class="media-lightbox-backdrop"></div>
54
- <div class="media-lightbox-content">
55
- <img class="media-lightbox-img" alt="" />
56
- <div class="media-lightbox-controls">
57
- <button class="media-lightbox-open" aria-label="Open in browser">↗ Open</button>
58
- <button class="media-lightbox-close" aria-label="Close">✕</button>
59
- </div></div>`,document.body.appendChild(e);let t=``,n=()=>e.classList.add(`hidden`),r=()=>{t&&window.open(t,`_blank`)};e.querySelector(`.media-lightbox-backdrop`).addEventListener(`click`,n),e.querySelector(`.media-lightbox-close`).addEventListener(`click`,n),e.querySelector(`.media-lightbox-open`).addEventListener(`click`,r),e.querySelector(`.media-lightbox-img`).addEventListener(`dblclick`,r),document.addEventListener(`keydown`,t=>{t.key===`Escape`&&!e.classList.contains(`hidden`)&&n()}),document.addEventListener(`click`,n=>{let r=n.target;(r.classList.contains(`chat-inline-img`)||r.closest(`.file-preview-list`)&&r.tagName===`IMG`)&&(t=r.src,e.querySelector(`.media-lightbox-img`).src=t,e.classList.remove(`hidden`))})}var ii=`jaw:stale-bundle-reload-pending`;function ai(e){let t=typeof e==`string`?e:e instanceof Error||typeof e?.message==`string`?e.message:``;if(!/(failed to fetch dynamically imported module|error loading dynamically imported module|importing a module script failed|chunkloaderror)/i.test(t))return!1;console.warn(`[stale-bundle] detected dynamic import failure:`,t);try{if(sessionStorage.getItem(ii)===`1`)return!0;sessionStorage.setItem(ii,`1`)}catch{}let n=()=>window.location.reload();return`serviceWorker`in navigator?(navigator.serviceWorker.getRegistration().then(e=>e?.update()).catch(()=>{}).finally(n),!0):(n(),!0)}window.addEventListener(`unhandledrejection`,e=>{if(ai(e.reason)){e.preventDefault();return}console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{if(ai(e.error||e.message)){e.preventDefault();return}console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:oi,addEmployee:si,deleteEmployee:ci,updateEmployee:Q,onEmpCliChange:li,onEmpRoleChange:ui}=await h(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-BchFBkDz.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));function di(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function fi(e){let t=(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`,n=e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&e.code===`KeyM`;return t||n}document.getElementById(`btnSend`)?.addEventListener(`click`,()=>{gn(`button`)});var $=document.getElementById(`chatInput`);$?.addEventListener(`keydown`,e=>{Zt(e)||ze(e)||_n(e)});var pi=0;$?.addEventListener(`input`,e=>{e.isComposing||(pi&&cancelAnimationFrame(pi),pi=requestAnimationFrame(()=>{Be(e.target?.value||``),Yt(e.target),pi=0}))}),$?.addEventListener(`cmd-execute`,()=>{gn(`cmd-execute`)}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,Le),document.addEventListener(`click`,Fe),document.getElementById(`skillMentionDropdown`)?.addEventListener(`click`,Qt),document.addEventListener(`click`,$t),$?.addEventListener(`click`,()=>{Yt($)}),$?.addEventListener(`keyup`,e=>{[`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key)&&Yt($)}),u(),It(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,M),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&bn(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>zr()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>Rr()),window.addEventListener(`message`,e=>{if(window.parent===window||e.source!==window.parent||!di(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-stt-toggle`&&zr()}),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,Et),document.getElementById(`btnClearChat`)?.addEventListener(`click`,Sn),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,Bn),document.getElementById(`langSelect`)?.addEventListener(`change`,async e=>{let t=e.target.value;[`ko`,`en`,`zh`,`ja`].includes(t)&&(await se(t),p())}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`];r[n]&&je(r[n],t)}),document.querySelector(`.tab-bar`)?.addEventListener(`keydown`,e=>{let t=e;if(t.key!==`ArrowRight`&&t.key!==`ArrowLeft`)return;let n=t.target?.closest(`.tab-btn`);if(!n)return;let r=[...n.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)),i=r[(r.indexOf(n)+(t.key===`ArrowRight`?1:r.length-1))%r.length];i&&(t.preventDefault(),i.focus(),i.click())}),document.getElementById(`btnSettings`)?.addEventListener(`click`,()=>pt()),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,Ae),document.getElementById(`selCli`)?.addEventListener(`change`,()=>Ke()),document.getElementById(`selCliProvider`)?.addEventListener(`change`,()=>{Ke(),Ge()}),document.getElementById(`selModel`)?.addEventListener(`change`,()=>Ge()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>Ge()),document.getElementById(`selPerm`)?.addEventListener(`change`,e=>{qe(e.target.value)}),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>He()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>He()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,si),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){ci(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Q(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){li(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(_(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Q(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Q(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){ui(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Q(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&Ze(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);if(t){let e=t.dataset.filter||`all`;$e(e,t)}}),document.getElementById(`skillSearchInput`)?.addEventListener(`input`,e=>{Qe(e.target.value)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,rt),bt(),_t(),document.querySelector(`[data-action="openMcpModal"]`)?.addEventListener(`click`,tt),document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,et),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,it),xt(),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>{ft()?ct(!0):ot()}),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){yt(this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>w(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>w()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>w()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,gt),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&w()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,mt),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,at),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>ut()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>ut(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,dt),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,vt);var{openPiSettingsModal:mi,closePiSettingsModal:hi,registerPiProfile:gi,onPiModeChange:_i}=await h(async()=>{let{openPiSettingsModal:e,closePiSettingsModal:t,registerPiProfile:n,onPiModeChange:r}=await import(`./pi-settings-Ch6XdqIF.js`);return{openPiSettingsModal:e,closePiSettingsModal:t,registerPiProfile:n,onPiModeChange:r}},[]);document.getElementById(`btnPiSettings`)?.addEventListener(`click`,mi),document.getElementById(`piSettingsModal`)?.addEventListener(`click`,e=>{e.target===e.currentTarget&&hi()}),document.querySelector(`#piSettingsModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePiSettings"]`)?.addEventListener(`click`,hi),document.getElementById(`btnPiRegister`)?.addEventListener(`click`,()=>void gi()),document.getElementById(`piMode`)?.addEventListener(`change`,_i),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>Vn(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>Vn()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,Un),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){Gn(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){Wn(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,F();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},P(),F();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},P(),F();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},P(),F();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},P(),F();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,F();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>Pt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>Pt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>Ft(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>Ft(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>Ft(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>Dt(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>Dt(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,Ct),document.getElementById(`memRetention`)?.addEventListener(`change`,Ct),document.getElementById(`memFlushLang`)?.addEventListener(`change`,Ct),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,Tt),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,Nt),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,At),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,Nt),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,Mt),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&jt(),e.target?.id===`advSynthesizeSoulBtn`&&wt()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),kt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){Ot(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){Et();return}});async function vi(){ye(),Xe(),or(),pr(),ve(),ce(),await oe();let e=await me({cancelRecording:Rr});if(e===`redirect`)return;d(he);let t=document.getElementById(`langSelect`);if(t&&(t.value=ue()),Ie(),e===`hub`){ne(),c();return}Gr(),ri(),document.getElementById(`chatSearchTrigger`)?.addEventListener(`click`,Kr),ne(),c(),await Ye(),Dn(),Tn(),await Re(),await We(),Je(),nt(),ht(),st(),ft()&&ct(),m(),nr(),oi(),Kn(),St(),Ee(),await Te(),ke(),yr(),window.location.hash===`#settings`&&pt(!0);try{sessionStorage.removeItem(ii)}catch{}setTimeout(()=>{document.querySelector(`.mermaid-pending, [data-mermaid-code-raw], .diagram-widget-pending`)&&ge()},3e3),`serviceWorker`in navigator&&!lt()&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}vi().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{(e.ctrlKey||e.metaKey)&&e.key===`f`&&(e.preventDefault(),e.stopPropagation(),Kr())},!0),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(document.body.dataset.settingsOpen===`true`){e.preventDefault(),pt(!1);return}if(document.getElementById(`chatSearch`)?.classList.contains(`open`)){e.preventDefault(),Z();return}if(n.isRecording){e.preventDefault(),Rr();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}fi(e)&&(e.preventDefault(),zr())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,f),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,ee);
@@ -1 +0,0 @@
1
- import{r as e,t}from"./bgtask-badge-oPvZyylH.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
@@ -1 +0,0 @@
1
- import{n as e}from"./api-CUtiCd2-.js";import{t}from"./cli-engine-NdU0lzs_.js";var n={agy:{label:`Antigravity`,efforts:[],effortNote:`AGY has no separate effort flag`,models:[`Gemini 3.7 Flash (Medium)`,`Gemini 3.6 Flash (Medium)`]},claude:{label:`Claude`,efforts:[`low`,`medium`,`high`,`xhigh`,`max`],models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`,`claude-fable-5-1`,`claude-fable-5`,`claude-fable-5[1m]`,`claude-sonnet-5`,`claude-sonnet-5[1m]`,`claude-opus-5-5`,`claude-opus-5-5[1m]`,`claude-opus-5`,`claude-opus-5[1m]`,`claude-opus-4-8`,`claude-opus-4-8[1m]`,`claude-opus-4-7`,`claude-opus-4-7[1m]`,`claude-opus-4-6`,`claude-opus-4-6[1m]`,`claude-sonnet-4-6`,`claude-sonnet-4-6[1m]`,`claude-haiku-4-5`]},codex:{label:`Codex`,efforts:[`low`,`medium`,`high`,`xhigh`],models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex-spark`,`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`gpt-6-sol`,`gpt-6-luna`]},"codex-app":{label:`Codex App`,efforts:[`low`,`medium`,`high`,`xhigh`],models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex-spark`,`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`gpt-6-sol`,`gpt-6-luna`]},cursor:{label:`Cursor`,efforts:[`none`,`none-fast`,`low`,`low-fast`,`medium`,`medium-fast`,`high`,`high-fast`,`xhigh`,`xhigh-fast`,`max`,`max-fast`],effortNote:`Cursor effort resolves to model IDs; cli-jaw never passes --effort`,models:`auto,composer-2.5,gpt-5.5,gpt-5.6-sol,gpt-5.6-terra,gpt-5.6-luna,gpt-5.4,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex-mini,gpt-5.1,claude-sonnet-5,claude-fable-5,claude-fable-5-thinking,claude-opus-5-5,claude-opus-5,claude-opus-4-8,claude-opus-4-8-thinking,claude-opus-4-7,claude-opus-4-7-thinking,claude-4.6-opus,claude-4.6-sonnet,claude-4.5-opus-high,claude-4.5-sonnet,claude-4-sonnet,gemini-3.1-pro,gemini-3-flash,gemini-3-pro,gemini-3.5-flash,grok-4.6,grok-4.7,grok-4.5,gpt-5-mini,glm-5.2,glm-5.3,gpt-5.5-extra,kimi-k2.7-code,kimi-k3,gemini-3.6-flash,gemini-3.7-flash`.split(`,`)},"kiro-code":{label:`Kiro`,efforts:[`low`,`medium`,`high`,`xhigh`],effortNote:`Kiro CLI forwards --effort; cli-jaw maps xhigh to Kiro max on the wire`,models:[`auto`,`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`claude-fable-5`,`claude-sonnet-5`,`claude-opus-5`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-opus-4.6`,`claude-sonnet-4.6`,`claude-opus-4.5`,`claude-sonnet-4.5`,`claude-sonnet-4`,`claude-haiku-4.5`,`deepseek-3.2`,`minimax-m2.5`,`minimax-m2.1`,`glm-5`,`qwen3-coder-next`]},gemini:{label:`Gemini`,efforts:[],models:[`gemini-3.0-pro-preview`,`gemini-3.1-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`,`gemini-2.5-flash`]},grok:{label:`Grok`,efforts:[],effortNote:`unsupported by grok-build/composer; do not pass --effort`,models:[`grok-build`,`grok-composer-2.5-fast`]},opencode:{label:`OpenCode`,efforts:[`minimal`,`low`,`high`,`max`],models:[`opencode-go/kimi-k2.7-code`,`opencode-go/kimi-k3`,`opencode-go/kimi-k2.6`,`opencode-go/kimi-k2.5`,`opencode-go/glm-5.3`,`opencode-go/glm-5.2`,`opencode-go/glm-5.1`,`opencode-go/glm-5`,`opencode-go/grok-4.6`,`opencode-go/grok-4.5`,`opencode-go/minimax-m3`,`opencode-go/minimax-m2.7`,`opencode-go/minimax-m2.5`,`opencode-go/qwen3.7-max`,`opencode-go/qwen3.7-plus`,`opencode-go/qwen3.6-plus`,`opencode-go/qwen3.5-plus`,`opencode-go/mimo-v2.5-pro`,`opencode-go/mimo-v2.5`,`opencode-go/mimo-v2-pro`,`opencode-go/mimo-v2-omni`,`opencode-go/deepseek-v4-pro`,`opencode-go/deepseek-v4-flash`,`opencode-go/hy3`]},copilot:{label:`Copilot`,efforts:[`low`,`medium`,`high`],effortNote:`-> ~/.copilot/config.json`,models:[`gpt-5.6-sol`,`gpt-5.6-terra`,`gpt-5.6-luna`,`gpt-5.5`,`claude-fable-5`,`claude-opus-4.8`,`claude-sonnet-4.6`,`claude-haiku-4.5`,`gpt-5.4`,`gpt-5.3-codex`,`gpt-5.2-codex`,`gpt-5.1-codex`,`gpt-4.1`,`gpt-5-mini`,`gemini-3-pro-preview`]}};function r(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r?.models)?[...r.models]:[];return t}function i(e){let n={};for(let[r,i]of Object.entries(e||{})){if(t(r)||!i||typeof i!=`object`)continue;let e=i,a={label:e.label||r,efforts:Array.isArray(e.efforts)?[...e.efforts]:[],models:Array.isArray(e.models)?[...e.models]:[]};typeof e.effortNote==`string`&&e.effortNote.trim()&&(a.effortNote=e.effortNote),typeof e.modelNote==`string`&&e.modelNote.trim()&&(a.modelNote=e.modelNote),typeof e.defaultProvider==`string`&&(a.defaultProvider=e.defaultProvider),Array.isArray(e.providers)&&(a.providers=[...e.providers]),e.modelsByProvider&&typeof e.modelsByProvider==`object`&&(a.modelsByProvider=Object.fromEntries(Object.entries(e.modelsByProvider).filter(e=>Array.isArray(e[1])).map(([e,t])=>[e,[...t]]))),e.effortsByProvider&&typeof e.effortsByProvider==`object`&&(a.effortsByProvider=Object.fromEntries(Object.entries(e.effortsByProvider).filter(e=>Array.isArray(e[1])).map(([e,t])=>[e,[...t]]))),e.effortsByModel&&typeof e.effortsByModel==`object`&&(a.effortsByModel=Object.fromEntries(Object.entries(e.effortsByModel).filter(e=>Array.isArray(e[1])).map(([e,t])=>[e,t.filter(e=>typeof e==`string`)]))),e.defaultEffortByModel&&typeof e.defaultEffortByModel==`object`&&(a.defaultEffortByModel=Object.fromEntries(Object.entries(e.defaultEffortByModel).filter(e=>typeof e[1]==`string`))),typeof e.modelSource==`string`&&(a.modelSource=e.modelSource),e.effortsByModelByProvider&&typeof e.effortsByModelByProvider==`object`&&(a.effortsByModelByProvider=Object.fromEntries(Object.entries(e.effortsByModelByProvider).filter(e=>!!e[1]&&typeof e[1]==`object`&&!Array.isArray(e[1])).map(([e,t])=>[e,Object.fromEntries(Object.entries(t).filter(e=>Array.isArray(e[1])).map(([e,t])=>[e,t.filter(e=>typeof e==`string`)]))]))),e.defaultEffortByModelByProvider&&typeof e.defaultEffortByModelByProvider==`object`&&(a.defaultEffortByModelByProvider=Object.fromEntries(Object.entries(e.defaultEffortByModelByProvider).filter(e=>!!e[1]&&typeof e[1]==`object`&&!Array.isArray(e[1])).map(([e,t])=>[e,Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]==`string`))]))),n[r]=a}return n}var a=i(n),o=Object.keys(a),s=r(a);function c(e){let t=i(e);return Object.keys(t).length?(a=t,o=Object.keys(t),s=r(t),!0):!1}async function l(){try{let t=await e(`/api/cli-registry`);if(!t||!c(t))throw Error(`invalid registry`)}catch(e){console.warn(`[cli-registry] fallback:`,e.message),c(n)}return a}function u(){return o}function d(e){return a[e]||null}var f=[`pi`,`claude`,`agy`,`codex`,`cursor`,`kiro-code`,`gemini`],p=[{value:`frontend`,labelKey:`role.label.frontend`,label:`Frontend`,prompt:`Frontend employee — UI/UX, CSS, components`,skill:`jaw-dev-frontend`},{value:`backend`,labelKey:`role.label.backend`,label:`Backend`,prompt:`Backend employee — API, DB, server logic`,skill:`jaw-dev-backend`},{value:`data`,labelKey:`role.label.data`,label:`Data`,prompt:`Data employee — data pipeline, analysis, ML`,skill:`jaw-dev-data`},{value:`docs`,labelKey:`role.label.docs`,label:`Docs`,prompt:`Docs employee — documentation, README, API docs`,skill:`documentation`},{value:`security`,labelKey:`role.label.security`,label:`Security`,prompt:`Security reviewer — auth, secrets, injection, destructive-command, sandbox, and data exposure risks`,skill:`jaw-dev-security`},{value:`testing`,labelKey:`role.label.testing`,label:`Testing`,prompt:`Testing reviewer — unit, integration, regression, smoke, and edge-case coverage`,skill:`jaw-dev-testing`},{value:`custom`,labelKey:`role.label.custom`,label:`Custom...`,prompt:``,skill:null}];export{d as a,u as i,f as n,l as o,p as r,s as t};
@@ -1 +0,0 @@
1
- import{a as e}from"./iframe-renderer-CcGzEi0v.js";export{e as refreshFileWidget};
@@ -1 +0,0 @@
1
- import{a as e}from"./memory-DTpD4see.js";export{e as refreshMemorySidebar};
@@ -1 +0,0 @@
1
- import{o as e,s as t}from"./message-history-DSvflaZ9.js";export{e as historyReloadInFlight,t as loadMessages};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";var r=e(t(),1),i=8e3,a=class extends Error{method;path;status;detail;constructor(e,t,n,r){super(`${e} ${t} → ${n}: ${r}`),this.name=`SettingsRequestError`,this.method=e,this.path=t,this.status=n,this.detail=r}};function o(e){return`/i/${e}`}function s(e,t={}){let n=t.base??o(e),r={"content-type":`application/json`};async function s(e,o,s,c){let l=new AbortController,u=setTimeout(()=>l.abort(),i);try{let i=new Headers(r);for(let[e,n]of Object.entries(await t.getHeaders?.()??{}))i.set(e,n);new Headers(c?.headers).forEach((e,t)=>i.set(t,e));let u={...c,method:e,headers:i,signal:c?.signal||l.signal};s!==void 0&&(u.body=JSON.stringify(s));let d=await fetch(`${n}${o}`,u);if(!d.ok){let t=await d.text().catch(()=>``);throw new a(e,o,d.status,t)}let f=d.headers.get(`content-type`)||``;if(f.includes(`application/json`))return await d.json();let p=await d.text().catch(()=>``);throw new a(e,o,d.status,`expected JSON, received ${f||`unknown content-type`}: ${p.slice(0,120)}`)}finally{clearTimeout(u)}}return{get:(e,t)=>s(`GET`,e,void 0,t),put:(e,t,n)=>s(`PUT`,e,t,n),post:(e,t,n)=>s(`POST`,e,t,n),delete:(e,t)=>s(`DELETE`,e,void 0,t)}}var c=n();function l(e,t,n=[]){let[i,a]=(0,r.useState)({kind:`loading`}),[o,s]=(0,r.useState)(0);return(0,r.useEffect)(()=>{let n=!1;return a({kind:`loading`}),e.get(t).then(e=>{n||a({kind:`ready`,data:e})}).catch(e=>{n||a(u(e))}),()=>{n=!0}},[e,t,o,...n]),{state:i,refresh:(0,r.useCallback)(async()=>{s(e=>e+1)},[]),setData:(0,r.useCallback)(e=>{a({kind:`ready`,data:e})},[])}}function u(e){return e instanceof a?e.status===401||e.status===403?{kind:`error`,message:`Instance requires auth. Open its native UI to grant access.`}:e.status>=500||e.status===0?{kind:`offline`}:{kind:`error`,message:e.message}:{kind:`error`,message:e instanceof Error?e.message:String(e)}}function d({title:e,hint:t,children:n}){return(0,c.jsxs)(`section`,{className:`settings-section`,children:[(0,c.jsxs)(`header`,{className:`settings-section-header`,children:[(0,c.jsx)(`h2`,{children:e}),t?(0,c.jsx)(`p`,{className:`settings-section-hint`,children:t}):null]}),(0,c.jsx)(`div`,{className:`settings-section-body`,children:n})]})}function f({label:e=`Loading instance settings…`}){return(0,c.jsx)(`div`,{className:`settings-loading`,children:e})}function p({message:e}){return(0,c.jsx)(`div`,{className:`settings-error`,role:`alert`,children:e})}function m({port:e}){return(0,c.jsxs)(`div`,{className:`settings-error`,role:`alert`,children:[`Instance offline or proxy error. The dashboard could not reach`,(0,c.jsxs)(`code`,{children:[` /i/`,e,`/api/settings`]}),`.`]})}function h({tone:e,children:t}){return(0,c.jsxs)(`span`,{className:`settings-status settings-status-${e}`,children:[(0,c.jsx)(`span`,{className:`settings-status-dot`,"aria-hidden":`true`}),t]})}function g({items:e}){return(0,c.jsx)(`dl`,{className:`settings-kv`,children:e.map((e,t)=>(0,c.jsxs)(`div`,{className:e.className?`settings-kv-row ${e.className}`:`settings-kv-row`,children:[(0,c.jsx)(`dt`,{children:e.label}),(0,c.jsx)(`dd`,{className:e.mono?`settings-kv-mono`:void 0,children:e.value})]},t))})}function _({children:e,status:t}){return(0,c.jsxs)(`div`,{className:`settings-card-actions`,children:[t?(0,c.jsx)(`div`,{className:`settings-card-actions-status`,children:t}):null,(0,c.jsx)(`div`,{className:`settings-card-actions-buttons`,children:e})]})}function v({children:e}){return(0,c.jsx)(`div`,{className:`settings-card-toolbar`,children:e})}function y({children:e,tone:t=`muted`,role:n}){return(0,c.jsx)(`p`,{className:`settings-card-note settings-card-note-${t}`,role:n,children:e})}export{g as a,v as c,a as d,s as f,_ as i,h as l,f as n,y as o,m as r,d as s,p as t,l as u};
@@ -1 +0,0 @@
1
- import{c as e,n as t}from"./settings-core-D4zGy72z.js";import"./settings-Bp0sgQ2a.js";export{t as loadSettings,e as updateSettings};
@@ -1 +0,0 @@
1
- import{a as e}from"./settings-core-D4zGy72z.js";export{e as refreshHeaderFromSettingsChange};
@@ -1,2 +0,0 @@
1
- import{a as e,i as t,n,t as r}from"./api-CUtiCd2-.js";import{O as i,P as a,S as o}from"./render-D8dVQ_bm.js";import{n as s}from"./locale-B9w_kUtW.js";import{n as c,t as l}from"./cli-engine-NdU0lzs_.js";import{a as u,i as d,n as f,o as p,t as m}from"./constants-DmZ9Rjym.js";import{s as h}from"./settings-types-CYKy0xz4.js";import{s as g}from"./pi-settings-tRVfevu-.js";import{n as _,r as v}from"./provider-icons-Bge6teOj.js";import{n as y,t as ee}from"./presentation-preference-D9u6LD07.js";function b(e,t){if(!l(t))return;let n=Array.from(e.options).find(e=>e.value===t);n||(n=e.ownerDocument.createElement(`option`),n.value=t,e.prepend(n)),n.disabled=!0,n.textContent=c(t),e.value=t,e.title=`The saved runtime is retired and cannot execute.`}var te=/^\/(?:Users|home)\/[^/]+/,ne=32;function re(e){return e.replace(te,`~`)}function ie(e){if(e.length<=ne)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function ae(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${ie(re(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
2
- `)}}function x(){return document.getElementById(`headerGitStatus`)}function oe(){let e=x();e&&(e.hidden=!0,e.textContent=``,e.removeAttribute(`title`),e.removeAttribute(`aria-label`))}function S(e){if(!e?.available)return null;let t=e.branch||e.head;if(!t)return null;let n=[`/`,`⑂ ${t}`];e.trackedChangedCount>0&&n.push(`*${e.trackedChangedCount}`),e.untrackedCount>0&&n.push(`?${e.untrackedCount}`);let r=[`Git: ${e.branch?`branch ${e.branch}`:`detached ${e.head}`}`];return e.trackedChangedCount>0&&r.push(`${e.trackedChangedCount} tracked changes`),e.untrackedCount>0&&r.push(`${e.untrackedCount} untracked files`),{text:n.join(` `),title:r.join(`, `)}}function se(e){let t=x();if(!t)return;let n=S(e);if(!n){oe();return}t.hidden=!1,t.textContent=n.text,t.title=n.title,t.setAttribute(`aria-label`,n.title)}async function C(){se(await n(`/api/project/git-summary`))}function ce(e){(Array.isArray(e.changedKeys)?e.changedKeys:[]).includes(`projectDirs`)&&C()}var w=new Set,T,E=!1,D=0,O=0,k=0;function A(e){return!e||typeof e!=`object`?null:`settings`in e&&e.settings?e.settings:`data`in e&&e.data?e.data:e}async function j(t){if(t.runtimeDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`신규 설치의 기본 런타임이 Codex App으로 변경되었습니다. 지금 Codex App을 사용하시겠습니까?`)?`accept`:`keep`;try{let i=await e(),a=await fetch(`${r}/api/settings/runtime-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...i?{Authorization:`Bearer ${i}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(h(a.status))return A(o)??t;window.alert(`런타임 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`런타임 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}async function M(t){if(t.multiSessionDefaultMigration?.state!==`pending`)return t;let n=window.confirm(`이제 대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 20으로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 켤까요?`)?`accept`:`keep`;try{let i=await e(),a=await fetch(`${r}/api/settings/multi-session-default-migration`,{method:`POST`,headers:{"Content-Type":`application/json`,...i?{Authorization:`Bearer ${i}`}:{}},body:JSON.stringify({action:n})}),o=await a.json().catch(()=>null);if(h(a.status))return A(o)??t;window.alert(`세션 선택을 저장하지 못했습니다 (${a.status}). 다음 설정 진입 때 다시 안내합니다.`)}catch{window.alert(`세션 선택을 저장하지 못했습니다. 다음 설정 진입 때 다시 안내합니다.`)}return t}function N(e){let t=document.getElementById(`headerCli`);if(!t)return;let n=_(e),r=F(e);t.innerHTML=n?`${n} ${i(r)}`:i(r)}function P(e){let t=document.getElementById(`headerProject`);if(!t)return;le(t),t.hidden=!1;let n=ae(e);if(!n){t.classList.add(`is-empty`),t.textContent=`Project: not set`,t.title=`Click to choose the project root folder`;return}t.classList.remove(`is-empty`),t.textContent=`Project ${n.text}`,t.title=`${n.title}\n(click to change)`}function le(e){if(e.dataset.pickerBound)return;e.dataset.pickerBound=`1`,e.setAttribute(`role`,`button`),e.setAttribute(`tabindex`,`0`);let n=async()=>{if(e.classList.contains(`is-picking`))return;e.classList.add(`is-picking`);let n=e.textContent;e.textContent=`Choosing folder…`;try{let n=await t(`/api/project/pick`,`POST`,{});if(n&&!n.cancelled&&`projectDirs`in n){e.classList.remove(`is-picking`),P(n.projectDirs);return}}catch{}e.classList.remove(`is-picking`),e.textContent=n};e.addEventListener(`click`,()=>{n()}),e.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),n())})}function ue(e){typeof e.cli==`string`&&e.cli&&N(e.cli),`projectDirs`in e&&P(e.projectDirs),ce(e)}function F(e){return u(e)?.label||v(e)||e}function I(e){let t=e.finally(()=>{w.delete(t)});return w.add(t),t}async function L(){for(;w.size;)await Promise.all(w)}function R(e,t,{includeCustom:n=!1,includeDefault:r=!1,selected:o=``}={}){if(!e)return;let s=r?`<option value="default">default</option>`:``,c=n?`<option value="__custom__">${a(`model.customOption`)}</option>`:``;e.innerHTML=s+(t||[]).map(e=>`<option value="${i(e)}">${i(e)}</option>`).join(``)+c,o&&Array.from(e.options).some(e=>e.value===o)&&(e.value=o)}function z(e,t){if(!e||!t||Array.from(e.options).some(e=>e.value===t))return;let n=document.createElement(`option`);n.value=t,n.textContent=t;let r=e.querySelector(`option[value="__custom__"]`);r?e.insertBefore(n,r):e.appendChild(n)}function B(e=null){let t=d().filter(e=>!l(e)),n=document.getElementById(`selCli`);if(n){let r=e?.cli||n.value||t[0]||`claude`,o=e=>f.includes(e),s=!o(r)&&t.includes(r),c=n.dataset.expanded===`1`,d=t.filter(o),p=t.filter(e=>!o(e)),m=d.length===0||s||c,h=d.map(e=>{let t=u(e)?.label||e;return`<option value="${i(e)}">${i(t)}</option>`}).join(``);p.length>0&&(m?(h+=`<option disabled>──────</option>`,h+=p.map(e=>{let t=u(e)?.label||e;return`<option value="${i(e)}">${i(t)}</option>`}).join(``)):h+=`<option value="__show_more__">${a(`cli.showMore`)}</option>`),n.innerHTML=h,n.title=l(r)?`The saved runtime is retired and cannot execute.`:``,b(n,r),Array.from(n.options).some(e=>e.value===r)&&(n.value=r)}let r=document.getElementById(`flushCli`);if(r){let n=e?.memory?.cli||r.value||``;r.innerHTML=`<option value="">(active CLI)</option>`+t.map(e=>`<option value="${i(e)}">${i(F(e))}</option>`).join(``),b(r,n),Array.from(r.options).some(e=>e.value===n)&&(r.value=n)}}function V(e,t){return(t||``).trim()}function H(e,t,n,r){let i=(t||``).trim();if(r){let t=e?.effortsByModelByProvider?.[r]?.[i];if(t)return t}return e?.effortsByModel?.[i]||n||e?.efforts||[]}function de(e,t,n){let r=(t||``).trim();return(n?e?.defaultEffortByModelByProvider?.[n]?.[r]:void 0)??e?.defaultEffortByModel?.[r]??``}function U(){return document.getElementById(`selEffort`)?.value||``}function W(e,t=``,n){let r=document.getElementById(`selEffort`);if(!r)return;let a=u(e),o=e!==`pi`&&a?.providers?.length?G(e):``,s=o?a?.effortsByProvider?.[o]||[]:null,c=V(e,n??document.getElementById(`selModel`)?.value??``),l=H(a,c,s,o||void 0);if(l.length===0){let e=a?.effortNote||`— none`;r.innerHTML=`<option value="">${i(e)}</option>`,r.title=e,r.disabled=!0;return}let d=[``].concat(l);r.innerHTML=[...new Set(d)].map(e=>e?`<option value="${i(e)}">${i(e)}</option>`:`<option value="">— none</option>`).join(``),r.disabled=!1,r.title=a?.effortNote||``;let f=!t||l.includes(t)?t:de(a,c,o||void 0);Array.from(r.options).some(e=>e.value===f)&&(r.value=f)}function fe(e,t,n){return e?(e.innerHTML=n.map(e=>`<option value="${i(e)}">${i(v(e)||e)}</option>`).join(``),Array.from(e.options).some(e=>e.value===t)?e.value=t:e.options.length>0&&(e.value=e.options[0]?.value||t),e.value||t):t}function G(e){let t=document.getElementById(`selCliProvider`),n=u(e);return t?.value||n?.defaultProvider||``}function K(e,t){let n=document.getElementById(`cliProviderWrap`),r=document.getElementById(`selCliProvider`),i=document.getElementById(`cliProviderLabel`),a=u(t);if(!(t!==`pi`&&(a?.providers?.length??0)>0))return n&&(n.style.display=`none`),a?.defaultProvider||``;i&&(i.textContent=`Provider`);let o=fe(r,e?.perCli?.[t]?.provider||r?.value||a?.defaultProvider||``,a.providers);return n&&(n.style.display=``),o}async function q(){let e=D;await p();let t=y(),r=await n(`/api/settings`);if(!r)return;ee(r,t),r=await j(r),r=await M(r),s(r.locale??``),B(r),g(r.pi),K(r,r.cli||``);let a=document.getElementById(`selCli`);a&&Array.from(a.options).some(e=>e.value===r.cli)&&(a.value=r.cli,a.dataset.prev=r.cli);let o=document.getElementById(`inpCwd`);o&&(o.textContent=r.workingDir);let c=document.getElementById(`headerCli`);if(c){let e=_(r.cli),t=F(r.cli);c.innerHTML=e?`${e} ${i(t)}`:i(t)}P(r.projectDirs),await C(),e===D&&!E&&X(r.permissions,!1),Z(!1);let l=r.activeOverrides?.[r.cli]||{},u=r.perCli?.[r.cli]||{},d=l.model||u.model,f=l.effort??u.effort??``,m=document.getElementById(`selModel`);if(d&&m){let e=V(r.cli,d);e&&!Array.from(m.options).some(t=>t.value===e)&&z(m,e),m.value=e}W(r.cli,f)}async function J(){let e=document.getElementById(`selCli`)?.value||`claude`,n={cli:e},r=u(e);return e!==`pi`&&r?.providers?.length&&(n.perCli={[e]:{provider:G(e)}}),I((async()=>{let r=await t(`/api/settings`,`PUT`,n);if(!r){await q();return}let i=r.cli||e,a=document.getElementById(`selCli`);a&&Array.from(a.options).some(e=>e.value===i)&&(a.value=i,a.dataset.prev=i),N(i),o([`instances`],`active-cli-changed`)})())}function pe(e){return e===`auto`?`Auto (YOLO)`:e===`safe`?`Safe`:e==null?`Not provided`:Array.isArray(e)&&e.every(e=>typeof e==`string`)?`Custom (${e.length} ${e.length===1?`entry`:`entries`})`:`Unrecognized`}function Y(){let e=T,t=pe(e),n=document.getElementById(`configuredPermText`);n&&(n.textContent=`Configured policy: ${t}`);let r=document.getElementById(`configuredPerm`);r?.classList.toggle(`active`,e===`auto`),r?.classList.toggle(`perm-auto`,e===`auto`);let i=document.getElementById(`selPerm`);i&&(i.options[0].textContent=`Configured policy: ${t}`,i.value=e===`auto`||e===`safe`?e:``,i.disabled=E,i.setAttribute(`aria-busy`,String(E)))}async function X(e,n=!0){if(!n){T=e,Y();return}if(e!==`auto`&&e!==`safe`||e===T||E)return;E=!0,D++,Y();let r=document.getElementById(`permSaveError`);return r&&(r.hidden=!0,r.textContent=``),I((async()=>{try{let n=await t(`/api/settings`,`PUT`,{permissions:e});if(!n)throw Error(`Permission settings save failed`);T=n.permissions}catch{r&&(r.textContent=`Could not save permissions. Please try again.`,r.hidden=!1)}finally{E=!1,D++,Y()}})())}function Z(e=!0){let t=document.getElementById(`selCli`);if(!t)return;let r=++O;if(t.value===`__show_more__`){let e=t.dataset.prev||d()[0]||`claude`;t.dataset.expanded=`1`,B(null),Array.from(t.options).some(t=>t.value===e)&&(t.value=e);try{t.showPicker()}catch{}return}t.dataset.prev=t.value;let o=t.value||`claude`;l(o)||(t.title=``);let s=K(null,o),c=u(o),f=s&&c?.modelsByProvider?.[s]?c.modelsByProvider[s]:m[o]||[],p=document.getElementById(`selModel`);if(l(o)){p&&(p.disabled=!0,p.title=`The saved runtime is retired and cannot execute.`),N(o),W(o);return}c?.modelNote&&p?(p.innerHTML=`<option value="">${i(c.modelNote)}</option>`,p.title=c.modelNote,p.disabled=!0):(R(p,f,{includeCustom:!0,includeDefault:!0}),p&&(p.disabled=!1,p.title=``)),N(o),W(o);let h=document.getElementById(`selModelCustom`);h&&h.remove();let g=document.createElement(`input`);if(g.type=`text`,g.id=`selModelCustom`,g.className=`custom-model-input`,g.placeholder=a(`model.placeholder`),g.style.display=`none`,g.oninput=()=>{k++},g.onchange=function(){let e=this.value.trim();e&&p&&(z(p,e),p.value=e,this.style.display=`none`,W(o,U(),e),Q())},!p){e&&J();return}p.parentElement?.appendChild(g),p.onchange=function(){this.value===`__custom__`?(g.style.display=`block`,g.focus()):(g.style.display=`none`,W(o,U(),this.value),Q())};let _=k,v=document.getElementById(`selCliProvider`),y=document.getElementById(`selEffort`);n(`/api/settings`).then(e=>{if(!e||r!==O||_!==k||document.getElementById(`selCli`)!==t||t.value!==o||document.getElementById(`selCliProvider`)!==v||document.getElementById(`selModel`)!==p||document.getElementById(`selModelCustom`)!==g||document.getElementById(`selEffort`)!==y||(c?.providers?.length??0)>0&&G(o)!==s)return;let n=e.activeOverrides?.[o]||{},i=e.perCli?.[o]||{},a=n.model||i.model,l=n.effort??i.effort??``;if(!(o!==`pi`&&c?.providers?.length&&(i.provider||c.defaultProvider||``)!==s)){if(a&&p){let e=V(o,a);z(p,e),p.value=e}W(o,l)}}),e&&J()}async function Q(){k++;let e=document.getElementById(`selCli`)?.value||`claude`,n=document.getElementById(`selModel`)?.value||`default`;n===`__custom__`&&(n=document.getElementById(`selModelCustom`)?.value?.trim()||`default`);let r=document.getElementById(`selEffort`),i={};i[e]={model:n},r&&!r.disabled&&(i[e].effort=r.value||``);let a={activeOverrides:i},s=u(e);e!==`pi`&&s?.providers?.length&&(a.perCli={[e]:{provider:G(e)}}),await t(`/api/settings`,`PUT`,a)&&o([`instances`],`active-cli-changed`)}function me(){let e=document.getElementById(`flushCli`)?.value||document.getElementById(`selCli`)?.value||`claude`,t=m[e]||[];R(document.getElementById(`flushModel`),t,{includeDefault:!0}),$(),ge()}async function he(){let e=await n(`/api/memory-files`);if(!e)return;let t=document.getElementById(`flushCli`),r=document.getElementById(`flushModel`);t&&e.cli&&(t.value=e.cli);let i=e.cli||document.getElementById(`selCli`)?.value||`claude`;R(r,m[i]||[],{includeDefault:!0}),r&&e.model&&(z(r,e.model),r.value=e.model),$()}async function ge(){let e=document.getElementById(`flushCli`)?.value||``,n=document.getElementById(`flushModel`)?.value||``;await t(`/api/memory-files/settings`,`PUT`,{cli:e,model:n})}function $(){let e=document.getElementById(`flushAgentBadge`);if(!e)return;let t=document.getElementById(`flushCli`)?.value||``,n=document.getElementById(`flushModel`)?.value||``,r=t||document.getElementById(`selCli`)?.value||``,i=[];r&&i.push(t?F(r):`${F(r)}*`),n&&n!=="default"&&i.push(n),e.textContent=i.length?`(${i.join(` / `)})`:``}export{ue as a,J as c,me as i,L as l,q as n,Q as o,Z as r,X as s,he as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-Bx8U-gJa.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{o as e}from"./slash-commands-DkrGUOnC.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{p as e}from"./iframe-renderer-CcGzEi0v.js";import{I as t,s as n}from"./message-history-DSvflaZ9.js";import{r}from"./ui-rnVAM91F.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};