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 +1 @@
1
- import{t as e}from"./jsx-runtime-CkEUZM6i.js";import{s as t}from"./page-shell-DfinU3mb.js";import{o as n,s as r,t as i}from"./shared-D1begqvi.js";var a=e();function o({manager:e}){if(!e)return null;let o=r(e.ui.locale),s=i[o];return(0,a.jsx)(t,{title:s.activityTitle,hint:s.activityDescription,children:(0,a.jsx)(n,{support:e.titleSupport,locale:o})})}export{o as default};
1
+ import{t as e}from"./jsx-runtime-CkEUZM6i.js";import{s as t}from"./page-shell-Cz2ylri8.js";import{o as n,s as r,t as i}from"./shared-CftvKNY9.js";var a=e();function o({manager:e}){if(!e)return null;let o=r(e.ui.locale),s=i[o];return(0,a.jsx)(t,{title:s.activityTitle,hint:s.activityDescription,children:(0,a.jsx)(n,{support:e.titleSupport,locale:o})})}export{o as default};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{i as r,n as i,r as a,s as o,t as s,u as c}from"./page-shell-DfinU3mb.js";import{t as l}from"./error-normalize-clOi-AAA.js";import{a as u}from"./fields-CicOWY-X.js";var d=e(t(),1),f=n();function p(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function m(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:h(t)}}function h(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,nativeTransportMigration:i,maxConcurrentDefaultMigration:a,claudeDefaultModelMigration:o,slackEnvironmentVariables:s,telegramEnvironmentVariables:c,discordEnvironmentVariables:l,...u}=e;return u}function g({port:e,client:t,triggerDownload:n}){let{state:g}=c(t,`/api/settings`),[_,v]=(0,d.useState)(!1),[y,b]=(0,d.useState)(``),[x,S]=(0,d.useState)(null),[C,w]=(0,d.useState)(!1),[T,E]=(0,d.useState)(null),D=n||p;(0,d.useEffect)(()=>{b(``),S(null),E(null)},[e]);let O=(0,d.useCallback)(()=>{if(g.kind!==`ready`)return;let t=`cli-jaw-settings-${e}.json`;D(t,JSON.stringify(h(g.data),null,2))},[g,e,D]),k=(0,d.useCallback)(async()=>{let e=m(y);if(!e.ok){S(e.error),E(null);return}S(null),E(null),w(!0);try{await t.put(`/api/settings`,e.value),E(`Imported. Reload the page to refresh other tabs.`)}catch(e){S(l(e))}finally{w(!1)}},[t,y]);return g.kind===`loading`?(0,f.jsx)(i,{}):g.kind===`offline`?(0,f.jsx)(a,{port:e}):g.kind===`error`?(0,f.jsx)(s,{message:g.message}):(0,f.jsxs)(`div`,{className:`settings-page-form`,children:[(0,f.jsx)(o,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,f.jsx)(r,{children:(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:O,children:`Download settings JSON`})})}),(0,f.jsxs)(o,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,f.jsx)(u,{id:`advanced-toggle`,label:`Show import controls`,value:_,onChange:v}),_?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,f.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:y,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>b(e.target.value),"aria-invalid":!!x}),x?(0,f.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:x}):null]}),(0,f.jsx)(r,{status:T?(0,f.jsx)(`span`,{role:`status`,children:T}):void 0,children:(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void k(),disabled:C||y.trim()===``,children:C?`Importing…`:`Apply import`})})]}):null]})]})}export{g as default,h as stripServerOwnedSettingsFields,m as validateImportPayload};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{i as r,n as i,r as a,s as o,t as s,u as c}from"./page-shell-Cz2ylri8.js";import{t as l}from"./error-normalize-jnjrKZDu.js";import{a as u}from"./fields-CicOWY-X.js";var d=e(t(),1),f=n();function p(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function m(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:h(t)}}function h(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,nativeTransportMigration:i,maxConcurrentDefaultMigration:a,claudeDefaultModelMigration:o,slackEnvironmentVariables:s,telegramEnvironmentVariables:c,discordEnvironmentVariables:l,...u}=e;return u}function g({port:e,client:t,triggerDownload:n}){let{state:g}=c(t,`/api/settings`),[_,v]=(0,d.useState)(!1),[y,b]=(0,d.useState)(``),[x,S]=(0,d.useState)(null),[C,w]=(0,d.useState)(!1),[T,E]=(0,d.useState)(null),D=n||p;(0,d.useEffect)(()=>{b(``),S(null),E(null)},[e]);let O=(0,d.useCallback)(()=>{if(g.kind!==`ready`)return;let t=`cli-jaw-settings-${e}.json`;D(t,JSON.stringify(h(g.data),null,2))},[g,e,D]),k=(0,d.useCallback)(async()=>{let e=m(y);if(!e.ok){S(e.error),E(null);return}S(null),E(null),w(!0);try{await t.put(`/api/settings`,e.value),E(`Imported. Reload the page to refresh other tabs.`)}catch(e){S(l(e))}finally{w(!1)}},[t,y]);return g.kind===`loading`?(0,f.jsx)(i,{}):g.kind===`offline`?(0,f.jsx)(a,{port:e}):g.kind===`error`?(0,f.jsx)(s,{message:g.message}):(0,f.jsxs)(`div`,{className:`settings-page-form`,children:[(0,f.jsx)(o,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,f.jsx)(r,{children:(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:O,children:`Download settings JSON`})})}),(0,f.jsxs)(o,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,f.jsx)(u,{id:`advanced-toggle`,label:`Show import controls`,value:_,onChange:v}),_?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,f.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:y,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>b(e.target.value),"aria-invalid":!!x}),x?(0,f.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:x}):null]}),(0,f.jsx)(r,{status:T?(0,f.jsx)(`span`,{role:`status`,children:T}):void 0,children:(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void k(),disabled:C||y.trim()===``,children:C?`Importing…`:`Apply import`})})]}):null]})]})}export{g as default,h as stripServerOwnedSettingsFields,m as validateImportPayload};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{r as t,t as n}from"./cli-engine-NdU0lzs_.js";import{n as r}from"./settings-types-CYKy0xz4.js";import{n as i,t as a}from"./jsx-runtime-CkEUZM6i.js";import{c as o,d as s,i as c,l,n as u,o as d,r as f,s as p,t as m,u as h}from"./page-shell-Cz2ylri8.js";import{t as g}from"./error-normalize-jnjrKZDu.js";import{i as _,s as v}from"./fields-CicOWY-X.js";import{c as y,n as b,o as ee,r as x,s as S}from"./Permissions-B7PthH01.js";import{i as te,n as ne,r as re,t as ie}from"./AsideSelectionFields-DvU5xWAP.js";import{a as ae,c as oe,d as C,f as se,i as ce,l as w,n as T,o as E,r as D,s as le,t as ue,u as O}from"./agent-meta-v4jNRAbX.js";import{t as de}from"./path-utils-B6vBr0DD.js";var k=e(i(),1),A=1e3,fe=8e3,pe=9e4;function j(e,t){if(!e||!t)return!1;let n=e[t]?.probeState;return n?n===`checking`||n===`failing`:!1}function M(e){let t=A*2**Math.min(Number.isFinite(e)&&e>0?Math.floor(e):0,8);return Math.min(Math.max(t,A),fe)}function me(e){let{snapshot:t,cli:n,attempts:r,now:i,deadline:a}=e;if(!j(t,n))return{kind:`stop`};if(i>=a||r>=24)return{kind:`exhausted`};let o=t?.[n]?.nextRetryAt,s=typeof o==`number`&&o>i?o:i+M(r);return{kind:`wait`,delayMs:Math.max(Math.min(s,a)-i,0)}}var N=a();function he({asideFields:e,cli:r,cliOptions:i,provider:a=``,providerOptions:o=[],model:s,modelOptions:c,effort:l,effortOptions:u,workingDir:d,workingDirError:f,cliMeta:m,onCliChange:h,onProviderChange:g,onModelChange:y,onEffortChange:b,onWorkingDirChange:ee}){let x=w(i),S=n(r),te=x.filter(e=>T.includes(e)).length;return(0,N.jsxs)(p,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:[(0,N.jsx)(_,{id:`agent-cli`,label:`Active CLI`,value:r,missingValueLabel:n(r)?t(r):void 0,error:S?`This runtime is retired. Select an available runtime to continue.`:null,options:x.map(e=>({value:e,label:E(e,m).label||e})),collapsedAfter:te,onChange:h}),e||(0,N.jsxs)(N.Fragment,{children:[o.length>0?(0,N.jsx)(_,{id:`agent-${r}-provider`,label:`Provider`,value:a,options:o.map(e=>({value:e,label:e})),onChange:e=>g?.(e)}):null,(0,N.jsx)(_,{id:`agent-model`,label:`Active model`,value:s,disabled:S,options:c.length>0?c:[{value:``,label:`(default)`}],onChange:y}),(0,N.jsx)(_,{id:`agent-effort`,label:`Effort`,value:l,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:S||u.length===0,onChange:b})]}),(0,N.jsx)(v,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:ee})]})}var ge=[{value:`auto`,label:`Auto (YOLO)`},{value:`safe`,label:`Safe`},{value:`custom`,label:`Custom allowlist`}];function _e({value:e,configuredValue:t,onChange:n}){let r=ee(e),i=S(e),a=r.mode===`custom`?r.tokens:[],o=r.mode===`custom`?`Editor draft: ${a.length} explicit token${a.length===1?``:`s`}`:null;return(0,N.jsxs)(p,{title:`Permissions`,hint:`Selecting a value changes the draft. Save applies it. Auto (YOLO) requests automatic approval or permission bypass. Behavior varies by runtime.`,children:[(0,N.jsx)(_,{id:`agent-permissions-mode`,label:`Change policy to`,value:i,options:ge,missingValueLabel:i===`invalid`?`Unrecognized saved policy`:void 0,onChange:e=>{n(e===`auto`?`auto`:e===`safe`?`safe`:a.length>0&&x(a)?a:y(null))}}),i===`invalid`?(0,N.jsx)(d,{tone:`error`,role:`alert`,children:`The saved permissions value is not a recognized policy. Choose a policy to replace it.`}):null,o?(0,N.jsx)(d,{children:o}):null,(0,N.jsx)(d,{children:(0,N.jsxs)(`span`,{id:`agent-configured-policy`,children:[`Configured policy: `,b(t)]})})]})}function ve({activeCli:e,flushCli:r,flushModel:i,cliOptions:a,modelOptions:o,cliMeta:s,loading:c,error:l,onFlushCliChange:u,onFlushModelChange:d}){let f=r||e,m=f===`aside`,h=f?E(f,s).label||f:`active`;return(0,N.jsx)(p,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,N.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,N.jsxs)(`summary`,{children:[(0,N.jsx)(`span`,{children:`Flush runtime`}),(0,N.jsxs)(`code`,{children:[h,i&&i!=="default"?` / ${i}`:``]})]}),c?(0,N.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,l?(0,N.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:l}):null,(0,N.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,N.jsx)(_,{id:`agent-flush-cli`,label:`Flush CLI`,value:r,missingValueLabel:!r&&e===`aside`?`(active CLI unavailable)`:r===`aside`?`Aside (main-only)`:n(r)?t(r):void 0,error:m?`Aside cannot run memory flush. Choose a separate runtime.`:n(f)?`The saved flush runtime is retired. Choose an available runtime.`:null,options:[...e===`aside`?[]:[{value:``,label:`(active CLI)`}],...D(a).map(e=>({value:e,label:E(e,s).label||e}))],onChange:u}),(0,N.jsx)(_,{id:`agent-flush-model`,label:`Flush model`,value:i,disabled:m||n(f),options:[{value:``,label:`(default)`},...o],onChange:d})]})]})})}function P(e){return e.source===`static`||e.id.startsWith(`static:`)}function ye(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function be(e,t){let n=D(e)[0]||`claude`,r=t?.[n]?.models?.[0]||`default`;return{id:ye(),name:`New Agent`,cli:n,model:r,role:``,status:`idle`,source:`db`}}function xe(e){return Array.isArray(e)?e.map(F).filter(Boolean):e.data.map(F).filter(Boolean)}function F(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function Se(e){return e.name.trim()?e.cli===`aside`?`Aside supports the main agent only`:e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function Ce(e){return e.some(e=>Se(e)!==null)}function we(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function I(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=De(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!P(t)&&o.push(t);return{added:i,updated:a,removed:o}}function Te(e,t){let n=I(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function Ee(e,t,n){let r=I(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,Oe(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function De(e,t){if(P(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function Oe(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:r,cliOptions:i,cliMeta:a,onChange:o,onRemove:s}){let u=P(e),d=E(e.cli,a),f=oe(d.models,e.model),p=Se(e),m=n(e.cli)||e.cli===`aside`,h=D(Array.from(new Set([...i,e.cli,`claude`])).filter(Boolean)),g=e.name||`Employee ${r+1}`;return(0,N.jsxs)(`div`,{className:`settings-runtime-employee-row`,role:`group`,"aria-label":g,children:[(0,N.jsxs)(`p`,{className:`settings-runtime-employee-head`,children:[(0,N.jsx)(`span`,{className:`settings-runtime-employee-name`,children:g}),u?(0,N.jsx)(l,{tone:`neutral`,children:`static`}):null]}),(0,N.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,N.jsx)(v,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:u,error:p===`Name is required`?p:null,onChange:e=>o({name:e})}),(0,N.jsx)(_,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,missingValueLabel:e.cli===`aside`?`Aside (main-only)`:n(e.cli)?t(e.cli):void 0,error:m?`This saved runtime cannot execute. Choose an available runtime.`:null,disabled:u,options:h.map(e=>({value:e,label:E(e,a).label||e})),onChange:e=>{o({cli:e,model:E(e,a).models[0]||`default`})}}),(0,N.jsx)(_,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,disabled:m,options:f.length>0?f:[{value:`default`,label:`default`}],onChange:e=>o({model:e})}),(0,N.jsx)(v,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:u,onChange:e=>o({role:e})})]}),(0,N.jsx)(c,{status:(0,N.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),children:(0,N.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,disabled:u,onClick:s,"aria-label":`Remove employee ${g}`,children:`Remove`})})]})}function ke({roster:e,original:t,cliOptions:n,cliMeta:r,loading:i,error:a,onRosterChange:s}){let u=Te(t,e),f=Ce(e);function m(t,n){s(e.map((e,r)=>r===t?{...e,...n}:e))}function h(t){s(e.filter((e,n)=>n!==t))}return(0,N.jsxs)(p,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,N.jsxs)(o,{children:[(0,N.jsxs)(`span`,{className:`settings-runtime-employee-summary`,children:[(0,N.jsxs)(`span`,{children:[`+`,u.added]}),(0,N.jsxs)(`span`,{children:[`~`,u.updated]}),(0,N.jsxs)(`span`,{children:[`-`,u.removed]})]}),f?(0,N.jsx)(l,{tone:`error`,children:`Fix invalid rows before saving.`}):null]}),i?(0,N.jsx)(d,{children:`Loading employees...`}):null,a?(0,N.jsx)(d,{tone:`error`,role:`alert`,children:a}):null,e.length===0?(0,N.jsx)(d,{children:`No runtime employees configured.`}):e.map((e,t)=>(0,N.jsx)(R,{employee:e,index:t,cliOptions:n,cliMeta:r??null,onChange:e=>m(t,e),onRemove:()=>h(t)},e.id)),(0,N.jsx)(c,{children:(0,N.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>s([...e,be(n,r)]),children:`+ Add employee`})})]})}var z=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function Ae(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):z.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function je(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(Ce(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=Ae(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,de(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{if(s){let e=i;try{let n=xe(await t.get(`/api/employees`)),r=new Set(i.map(e=>e.id)),a=new Set(s.map(e=>e.id));e=n.filter(e=>r.has(e.id)||a.has(e.id))}catch{}await Ee(t,e,s)}}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function Me({status:e,exhausted:t=!1}){if(t)return(0,N.jsx)(`div`,{className:`settings-inline-notice`,role:`alert`,children:`상태 확인이 끝나지 않았습니다. 새로고침하거나 잠시 후 다시 확인하세요.`});if(!e)return null;let n=r(e);return n.kind===`checking`?(0,N.jsx)(`div`,{className:`settings-inline-notice`,role:`status`,"aria-live":`polite`,children:`상태 확인 중`}):n.kind===`unknown`?(0,N.jsx)(`div`,{className:`settings-inline-notice`,role:`alert`,children:n.message}):n.kind===`failing`?(0,N.jsxs)(`div`,{className:`settings-inline-notice`,role:`alert`,children:[`상태 확인 실패 (재시도 중)`,e.probeError?`: ${e.probeError}`:``]}):null}function Ne(e){if(!(e instanceof s)||e.status!==409)return null;try{return JSON.parse(e.detail).settings??null}catch{return null}}var Pe=e=>[`cli`,`workingDir`,`permissions`,`runtimeEmployees`,`flushCli`,`flushModel`,`multiSession.midRunPolicy`].includes(e)||e.startsWith(`activeOverrides.`)||e.startsWith(`perCli.`);function Fe({port:e,instanceUrl:t,client:n,dirty:r,registerSave:i}){let a=(0,k.useMemo)(()=>({client:n,port:e,instanceUrl:t,dirty:r}),[n,e,t,r]),o=(0,k.useRef)(null),s=(0,k.useRef)(null),c=(0,k.useRef)(0),[l,d]=(0,k.useState)(!1),[p,_]=(0,k.useState)(null),v=(0,k.useMemo)(()=>({...n,get:async(e,t)=>({instance:a,value:await n.get(e,t)})}),[n,a]),{state:y,refresh:b,setData:x}=h(v,`/api/settings`),w=y.kind===`ready`?y.data.instance===a?{kind:`ready`,data:y.data.value}:{kind:`loading`}:y,T=(0,k.useCallback)(e=>x({instance:a,value:e}),[a,x]),[D,de]=(0,k.useState)({cli:``,account:``,host:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[A,fe]=(0,k.useState)({}),[j,M]=(0,k.useState)({}),[ge,P]=(0,k.useState)(!0),[ye,be]=(0,k.useState)(null),[F,Se]=(0,k.useState)([]),[I,Te]=(0,k.useState)([]),[Ee,De]=(0,k.useState)(!0),[Oe,L]=(0,k.useState)(null),[R,z]=(0,k.useState)(null),[Ae,Fe]=(0,k.useState)({}),[Ie,Le]=(0,k.useState)(!1),[Re,ze]=(0,k.useState)(null),[Be,Ve]=(0,k.useState)(!1),[He,Ue]=(0,k.useState)(null),B=(0,k.useCallback)(async()=>{let e=++c.current;try{let t=await n.get(`/api/cli-registry`);if(o.current!==a||e!==c.current)return;let r=t&&typeof t==`object`&&`data`in t?t.data:t;z(le(r))}catch{o.current===a&&e===c.current&&z(null)}},[n,a]),We=te(n,t,e,D.account),Ge=w.kind===`ready`?w.data.perCli?.aside:void 0,Ke=D.cli===`aside`?D.model:String(r.pending.get(`activeOverrides.aside.model`)?.value||Ge?.model||``),qe=D.cli===`aside`?D.effort:String(r.pending.get(`activeOverrides.aside.effort`)?.value||Ge?.effort||``),V=D.host===`local`?ne(We.inventory,Ke,qe):`Aside requires the local host.`;(0,k.useEffect)(()=>{for(let[e,t]of r.pending)if(e.startsWith(`perCli.aside.`)||e.startsWith(`activeOverrides.aside.`)||e===`cli`&&D.cli===`aside`){let n=!V;t.valid!==n&&r.set(e,{...t,valid:n})}},[V,r,D.cli]),(0,k.useLayoutEffect)(()=>(o.current=a,s.current=null,++c.current,d(!1),_(null),z(null),()=>{o.current=null,s.current=null,++c.current}),[a]);let H=(0,k.useRef)(0),Je=(0,k.useRef)({}),[Ye,Xe]=(0,k.useState)(!1),U=(0,k.useCallback)(async e=>{try{let t=await n.get(`/api/cli-status`);if(o.current!==a||e!==void 0&&e!==H.current)return;Je.current=t,Fe(t)}catch{if(o.current!==a||e!==void 0&&e!==H.current)return;Je.current={},Fe({})}},[n,a]),W=(0,k.useCallback)(async()=>{P(!0),be(null);try{let e=await n.get(`/api/memory-files`);if(o.current!==a)return;let t={cli:e.cli||``,model:e.model||``};fe(t),M(t)}catch(e){if(o.current!==a)return;be(e instanceof Error?e.message:String(e))}finally{o.current===a&&P(!1)}},[n,a]),G=(0,k.useCallback)(async()=>{De(!0),L(null);try{let e=await n.get(`/api/employees`);if(o.current!==a)return;let t=xe(e);Se(t),Te(t)}catch(e){if(o.current!==a)return;L(e instanceof Error?e.message:String(e))}finally{o.current===a&&De(!1)}},[n,a]);(0,k.useEffect)(()=>{B(),U(),W(),G()},[B,U,G,W]),(0,k.useEffect)(()=>{if(!D.cli)return;let e=H.current+1;H.current=e,Xe(!1);let t=Date.now()+pe,n=0,r,i=()=>{if(e!==H.current)return;let a=me({snapshot:Je.current,cli:D.cli,attempts:n,now:Date.now(),deadline:t});if(a.kind!==`stop`){if(a.kind===`exhausted`){Xe(!0);return}r=setTimeout(()=>{e===H.current&&(n+=1,U(e).then(()=>{e===H.current&&i()}))},a.delayMs)}};return i(),()=>{H.current=e+1,r!==void 0&&clearTimeout(r)}},[D.cli,U]),(0,k.useEffect)(()=>{if(w.kind!==`ready`)return;let e=Object.keys(w.data.perCli||{}),t=w.data.cli||e[0]||``,n=ee(w.data.permissions),r=S(w.data.permissions),i=E(t,R);de({cli:t,account:w.data.perCli?.aside?.account||``,host:w.data.perCli?.aside?.host||``,provider:w.data.perCli?.[t]?.provider||i.defaultProvider||``,model:C(t,w.data.perCli,w.data.activeOverrides),effort:O(t,w.data.perCli,w.data.activeOverrides),workingDir:w.data.workingDir||``,permissions:r===`invalid`?w.data.permissions:n.mode===`custom`?n.tokens:n.mode===`safe`?`safe`:`auto`})},[w.kind===`ready`?w.data:null]),(0,k.useEffect)(()=>()=>{for(let e of Array.from(r.pending.keys()))Pe(e)&&r.remove(e)},[r,a]);let K=(0,k.useCallback)((e,t)=>{o.current===a&&!s.current&&Pe(e)&&r.set(e,t)},[r,a]),Ze=(0,k.useCallback)(()=>{if(o.current!==a)return Promise.resolve();if(s.current)return s.current;if([...r.pending.keys()].some(e=>e.startsWith(`perCli.aside.`)||e.startsWith(`activeOverrides.aside.`))&&V)return Promise.reject(Error(V));let e=Object.fromEntries(Object.entries(r.saveBundle()).filter(([e])=>Pe(e)));if(!Object.keys(e).length)return Promise.resolve();if((D.cli===`aside`||Object.keys(e).some(e=>e.startsWith(`perCli.aside.`)||e.startsWith(`activeOverrides.aside.`)))&&V)return Promise.reject(Error(V));if((Object.hasOwn(e,`flushCli`)||Object.hasOwn(e,`flushModel`))&&(j.cli||D.cli)===`aside`)return Promise.reject(Error(`Aside cannot run memory flush.`));Object.hasOwn(e,`perCli.aside.account`)&&(e[`activeOverrides.aside.model`]??=``,e[`activeOverrides.aside.effort`]??=``);let t=new Map([...r.pending].filter(([t])=>Object.hasOwn(e,t)));d(!0),_(null);let i=Promise.resolve().then(async()=>{if(o.current!==a)return;let i=await je({client:n,bundle:e,employeeDraft:I,employeeOriginal:F});if(o.current===a){for(let[e,n]of t)r.pending.get(e)===n&&r.remove(e);i&&T(i),await b(),await B(),await W(),await G()}}).catch(e=>{if(o.current===a)throw e}).finally(()=>{s.current===i&&(s.current=null),o.current===a&&d(!1)});return s.current=i,i},[n,r,D.cli,j.cli,V,a,I,F,B,G,W,b,T]);(0,k.useEffect)(()=>{if(i)return i(Ze),()=>i(null)},[i,Ze]);let q=w.kind===`ready`?w.data:{},J=q.perCli||{},Y=q.activeOverrides||{},Qe=(0,k.useMemo)(()=>{let e=se(Object.keys(J));return e.length?e:se(Object.keys(R||ue))},[J,R]),X=E(D.cli,R),Z=D.provider||X.defaultProvider||X.providers?.[0]||``,$e=D.cli===`pi`,Q=!$e&&(X.providers?.length??0)>0,et=oe(Q&&X.modelsByProvider?.[Z]||X.models,D.model),tt=Q?ae(X,D.model,X.effortsByProvider?.[Z]||X.efforts,Z):ae(X,D.model),nt=D.workingDir.trim()?null:`Required`,rt=(0,k.useCallback)(async e=>{Le(!0),ze(null);try{let t=await n.post(`/api/settings/runtime-default-migration`,{action:e}),r;r=`settings`in t&&t.settings?t.settings:`data`in t&&t.data?t.data:t,T(r)}catch(e){let t=Ne(e);if(t){T(t);return}ze(g(e))}finally{Le(!1)}},[n,T]),it=(0,k.useCallback)(async e=>{Ve(!0),Ue(null);try{let t=await n.post(`/api/settings/multi-session-default-migration`,{action:e}),r;r=`settings`in t&&t.settings?t.settings:`data`in t&&t.data?t.data:t,T(r)}catch(e){let t=Ne(e);if(t){T(t);return}Ue(g(e))}finally{Ve(!1)}},[n,T]);if(w.kind===`loading`)return(0,N.jsx)(u,{});if(w.kind===`offline`)return(0,N.jsx)(f,{port:e});if(w.kind===`error`)return(0,N.jsx)(m,{message:w.message});function at(){for(let e of Array.from(r.pending.keys()))e.startsWith(`activeOverrides.`)&&!e.startsWith(`activeOverrides.aside.`)&&r.remove(e)}function $(e){o.current===a&&!s.current&&de(e)}return(0,N.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),Ze().catch(e=>{o.current===a&&_(g(e))})},children:[p?(0,N.jsx)(m,{message:p}):null,(0,N.jsxs)(`fieldset`,{disabled:l,style:{border:0,padding:0,margin:0,minWidth:0},children:[q.runtimeDefaultMigration?.state===`pending`?(0,N.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,N.jsx)(`strong`,{children:`기본 런타임 변경 안내`}),(0,N.jsx)(`p`,{children:`기존 선택은 유지됩니다. Codex App으로 전환하거나 현재 런타임을 계속 사용할 수 있습니다.`}),(0,N.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,N.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:Ie,onClick:()=>void rt(`accept`),children:`Codex App 사용`}),(0,N.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:Ie,onClick:()=>void rt(`keep`),children:`현재 런타임 유지`})]}),Re?(0,N.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:Re}):null]}):null,q.multiSessionDefaultMigration?.state===`pending`?(0,N.jsxs)(`div`,{className:`settings-inline-notice`,role:`status`,children:[(0,N.jsx)(`strong`,{children:`다중 세션 안내`}),(0,N.jsx)(`p`,{children:`대화 세션을 여러 개 열 수 있습니다. 켜면 동시 실행도 20으로 올라가서, 두 번째 세션이 첫 번째가 끝나기를 기다리지 않습니다. 지금 설정은 그대로 유지됩니다.`}),(0,N.jsxs)(`div`,{className:`settings-inline-actions`,children:[(0,N.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:Be,onClick:()=>void it(`accept`),children:`다중 세션 켜기`}),(0,N.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,disabled:Be,onClick:()=>void it(`keep`),children:`지금 설정 유지`})]}),He?(0,N.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:He}):null]}):null,(0,N.jsxs)(`label`,{className:`settings-field settings-field-select`,htmlFor:`midrun-policy-select`,children:[(0,N.jsx)(`span`,{className:`settings-field-label`,children:`실행 중 메시지 처리 (mid-run policy)`}),(0,N.jsxs)(`select`,{id:`midrun-policy-select`,value:String(q.multiSession?.midRunPolicy||`steer`),onChange:e=>{let t=e.target.value;K(`multiSession.midRunPolicy`,{value:t,original:String(q.multiSession?.midRunPolicy||`steer`),valid:!0})},children:[(0,N.jsx)(`option`,{value:`steer`,children:`steer (기본) — 실행 중 지시 변경`}),(0,N.jsx)(`option`,{value:`followup`,children:`followup — 끝나면 순서대로 실행`}),(0,N.jsx)(`option`,{value:`collect`,children:`collect — 모아서 한 번에 실행`}),(0,N.jsx)(`option`,{value:`interrupt`,children:`interrupt — 현재 실행을 중단하고 즉시 실행`})]}),(0,N.jsx)(`span`,{className:`settings-field-hint`,children:`다중 세션이 켜져 있을 때 적용됩니다. codex-app은 같은 턴에 입력을 전달합니다. Cursor·Grok의 native 모드는 현재 요청의 취소와 정리가 끝난 뒤 같은 세션에 다시 요청합니다(cancel-reprompt). 그 외 런타임은 중단 후 새 실행으로 이어갑니다(kill-steer). 보존되는 맥락은 런타임에 따라 다릅니다. 끝난 뒤 실행하려면 followup을 선택하세요.`})]}),(0,N.jsx)(Me,{status:Ae[D.cli],exhausted:Ye}),(0,N.jsx)(he,{asideFields:D.cli===`aside`?(0,N.jsx)(ie,{id:`agent-aside`,account:D.account,host:D.host,model:D.model,effort:D.effort,inventory:We.inventory,disabled:l,refresh:We.refresh,onAccountChange:e=>{o.current!==a||s.current||($({...D,account:e,host:`local`,model:J.aside?.model||``,effort:J.aside?.effort||``}),K(`perCli.aside.account`,{value:e,original:J.aside?.account||``,valid:re(e)}),K(`perCli.aside.host`,{value:`local`,original:J.aside?.host||``,valid:!0}),K(`activeOverrides.aside.model`,{value:``,original:Y.aside?.model||``,valid:!0}),K(`activeOverrides.aside.effort`,{value:``,original:Y.aside?.effort||``,valid:!0}))},onModelChange:e=>{o.current!==a||s.current||($({...D,model:e}),K(`activeOverrides.aside.model`,{value:e,original:r.pending.has(`perCli.aside.account`)?``:Y.aside?.model||``,valid:!0}))},onEffortChange:e=>{if(o.current!==a||s.current)return;let t=e||`default`;$({...D,effort:t}),K(`activeOverrides.aside.effort`,{value:t,original:r.pending.has(`perCli.aside.account`)?``:Y.aside?.effort||``,valid:!0})}}):null,cli:D.cli,cliOptions:Qe,provider:Z,providerOptions:$e?[]:X.providers||[],model:D.model,modelOptions:et,effort:D.effort,effortOptions:tt,workingDir:D.workingDir,workingDirError:nt,cliMeta:R,onCliChange:e=>{let t=E(e,R),n={...D,cli:e,account:D.account,host:D.host,provider:J[e]?.provider||t.defaultProvider||``,model:e===`aside`&&(r.pending.has(`activeOverrides.aside.model`)||r.pending.has(`perCli.aside.account`))?String(r.pending.get(`activeOverrides.aside.model`)?.value||J.aside?.model||``):C(e,J,Y),effort:e===`aside`&&(r.pending.has(`activeOverrides.aside.effort`)||r.pending.has(`perCli.aside.account`))?String(r.pending.get(`activeOverrides.aside.effort`)?.value||J.aside?.effort||``):O(e,J,Y)};at(),$(n),K(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=X.modelsByProvider?.[e]||[],n=X.effortsByProvider?.[e]||[],r=t.includes(D.model)?D.model:t[0]||``,i=ce(X,r,D.effort,n,e);$({...D,provider:e,model:r,effort:i}),K(`perCli.${D.cli}.provider`,{value:e,original:J[D.cli]?.provider||X.defaultProvider||``,valid:!0}),K(`activeOverrides.${D.cli}.model`,{value:r,original:C(D.cli,J,Y),valid:r.trim().length>0}),K(`activeOverrides.${D.cli}.effort`,{value:i,original:O(D.cli,J,Y),valid:!0})},onModelChange:e=>{let t=ce(X,e,D.effort,Q?X.effortsByProvider?.[Z]||X.efforts:void 0,Q?Z:void 0);$({...D,model:e,effort:t}),K(`activeOverrides.${D.cli}.model`,{value:e,original:C(D.cli,J,Y),valid:e.trim().length>0}),t!==D.effort&&K(`activeOverrides.${D.cli}.effort`,{value:t,original:O(D.cli,J,Y),valid:!0})},onEffortChange:e=>{$({...D,effort:e}),K(`activeOverrides.${D.cli}.effort`,{value:e,original:O(D.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...D,workingDir:e}),K(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,N.jsx)(_e,{value:D.permissions,configuredValue:q.permissions,onChange:e=>{$({...D,permissions:e}),K(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e===`safe`||e.length>0})}}),(0,N.jsx)(ve,{activeCli:D.cli,flushCli:j.cli||``,flushModel:j.model||``,cliOptions:Qe,cliMeta:R,modelOptions:oe(E(j.cli||D.cli,R).models,j.model||``),loading:ge,error:ye,onFlushCliChange:e=>{let t=e&&E(e,R).models[0]||``;M({cli:e,model:t}),K(`flushCli`,{value:e,original:A.cli||``,valid:e!==`aside`&&(e!==``||D.cli!==`aside`)}),K(`flushModel`,{value:t,original:A.model||``,valid:!0})},onFlushModelChange:e=>{M({...j,model:e}),K(`flushModel`,{value:e,original:A.model||``,valid:!0})}}),(0,N.jsx)(ke,{roster:I,original:F,cliOptions:Qe.filter(e=>e!==`aside`),cliMeta:R,loading:Ee,error:Oe,onRosterChange:e=>{if(Te(e),we(e,F)){r.remove(`runtimeEmployees`);return}r.set(`runtimeEmployees`,{value:e,original:F,valid:!Ce(e)})}})]})]})}export{Me as CliProbeNotice,Ne as conflictSettingsFromError,Fe as default,Ae as splitAgentSaveBundle};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{i as r,s as i}from"./fields-CicOWY-X.js";var a=e(t(),1),o=e=>/^u(?:0|[1-9][0-9]{0,8})$/.test(e),s=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],c=e=>!!e&&typeof e==`object`&&!Array.isArray(e),l=e=>typeof e==`string`&&/^[^/\s]+\/.+/.test(e);function u(e,t){if(!c(e)||e.ok!==!0||!c(e.data))throw Error(`Aside catalog response is unavailable.`);let n=e.data,r=n.context;if(!c(r)||r.account!==t||r.host!==`local`||n.source!==`local-files`||![`available`,`partial`,`unavailable`].includes(String(n.status))||!Array.isArray(n.entries)||!Array.isArray(n.cachedIds)||!Array.isArray(n.diagnostics)||n.defaultModel!==null&&!l(n.defaultModel))throw Error(`Invalid Aside catalog response.`);let i=new Set;for(let e of n.entries){if(!c(e)||!l(e.id)||typeof e.provider!=`string`||typeof e.modelId!=`string`||e.id!==`${e.provider}/${e.modelId}`||typeof e.name!=`string`||![`registered`,`unknown`].includes(String(e.capability))||!Array.isArray(e.efforts)||!e.efforts.every(e=>typeof e==`string`&&s.includes(e))||!c(e.thinkingLevelMap)||i.has(e.id))throw Error(`Invalid Aside model catalog.`);i.add(e.id)}let a=n.configuredDefault;if(a!==null&&(!c(a)||typeof a.provider!=`string`||typeof a.modelId!=`string`||a.thinkingLevel!==void 0&&!s.includes(String(a.thinkingLevel)))||n.defaultModel!==null&&(!c(a)||n.defaultModel!==`${a.provider}/${a.modelId}`))throw Error(`Invalid Aside default model.`);for(let e of n.diagnostics)if(!c(e)||![`context`,`models`,`settings`].includes(String(e.source))||typeof e.code!=`string`||typeof e.message!=`string`)throw Error(`Invalid Aside diagnostics.`);return n}function d(e,t,n,r,i=!0){let[s,c]=(0,a.useState)(0),l=(0,a.useMemo)(()=>({client:e,instanceUrl:t,port:n,account:r,enabled:i,revision:s}),[e,t,n,r,i,s]),d=(0,a.useRef)(0),[f,p]=(0,a.useState)(null);return(0,a.useLayoutEffect)(()=>{let t=++d.current,n=!0;return i&&o(r)&&e.get(`/api/aside/models?account=${encodeURIComponent(r)}&host=local`).then(e=>{n&&t===d.current&&p({context:l,value:{kind:`ready`,catalog:u(e,r)}})}).catch(()=>{n&&t===d.current&&p({context:l,value:{kind:`error`,message:`Could not read the local Aside catalog. Refresh to try again.`}})}),()=>{n=!1,++d.current}},[l,e,r,i]),{inventory:o(r)?f?.context===l?f.value:{kind:`loading`}:{kind:`error`,message:`Enter an explicit Aside account (uN).`},refresh:(0,a.useCallback)(()=>c(e=>e+1),[])}}function f(e){if(e.kind!==`ready`)return[];let t=e.catalog;if(t.status===`unavailable`||t.diagnostics.some(e=>e.source===`models`||e.source===`context`))return[];let n=new Set(t.entries.map(e=>e.id));t.defaultModel&&n.add(t.defaultModel);let r=t.entries.find(e=>e.id===t.defaultModel),i=t.configuredDefault?.thinkingLevel;return[...t.defaultModel&&(!i||r?.capability!==`registered`||r.efforts.includes(i))?[{value:`default`,label:`Default (${t.defaultModel})`}]:[],...Array.from(n,e=>({value:e,label:e}))]}function p(e,t){if(e.kind!==`ready`||!f(e).some(e=>e.value===(t||`default`)))return[];let n=e.catalog,r=!t||t==="default"?n.defaultModel:t,i=n.entries.find(e=>e.id===r&&e.capability===`registered`);return i?i.efforts:r===n.defaultModel&&n.configuredDefault?.thinkingLevel?[n.configuredDefault.thinkingLevel]:[]}function m(e,t,n){if(e.kind===`loading`)return`Loading Aside models…`;if(e.kind===`error`)return e.message;if(!f(e).some(e=>e.value===(t||`default`)))return`This model is unavailable for the selected Aside account.`;let r=!t||t==="default"?e.catalog.defaultModel:t,i=n&&n!=="default"?n:r===e.catalog.defaultModel?e.catalog.configuredDefault?.thinkingLevel:void 0;return i&&!p(e,t).includes(i)?`This effort is unavailable for the selected Aside model.`:null}var h=n();function g({id:e,account:t,host:n,model:a,effort:s,inventory:c,disabled:l=!1,onAccountChange:u,onModelChange:d,onEffortChange:g,refresh:_}){let v=f(c),y=p(c,a),b=m(c,a,s);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`p`,{className:`settings-percli-note`,children:`Experimental · local main agent only. Scheduled heartbeat runs are unsupported with Aside as the main runtime and will be rejected. Account selection does not confirm sign-in or model access.`}),(0,h.jsx)(i,{id:`${e}-account`,label:`Aside account`,value:t,placeholder:`uN`,disabled:l,error:o(t)?null:`Enter an explicit account (uN).`,onChange:u}),(0,h.jsx)(i,{id:`${e}-host`,label:`Host`,value:n||`local`,disabled:!0,error:n&&n!==`local`?`Only the local host is supported. Edit the account to use local.`:null,onChange:()=>{}}),(0,h.jsx)(r,{id:`${e}-model`,label:`Model`,value:a||`default`,options:v,missingValueLabel:`${a||`default`} (unavailable)`,disabled:l||c.kind!==`ready`||v.length===0,error:b,onChange:d}),(0,h.jsx)(r,{id:`${e}-effort`,label:`Effort`,value:s==="default"?``:s,options:[{value:``,label:`(default)`},...y.map(e=>({value:e,label:e}))],missingValueLabel:`${s} (unavailable)`,disabled:l||c.kind!==`ready`||y.length===0&&!s,error:b?.includes(`effort`)?b:null,onChange:g}),c.kind===`ready`&&c.catalog.status!==`available`?(0,h.jsxs)(`p`,{className:`settings-percli-note`,role:`status`,children:[`Catalog `,c.catalog.status,c.catalog.diagnostics.map(e=>` · ${e.code}`).join(``)]}):null,(0,h.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:l||!o(t),onClick:_,children:`Refresh Aside models`})]})}export{d as i,m as n,o as r,g as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{a as r,d as i,i as a,l as o,n as s,o as c,s as l,t as u}from"./page-shell-DfinU3mb.js";var d=e(t(),1),f=n(),p=3e3;function m(e){if(!e||typeof e!=`object`)return{running:!1,tabs:0};let t=e,n={running:t.running===!0,tabs:typeof t.tabs==`number`&&Number.isFinite(t.tabs)?t.tabs:0};return typeof t.cdpUrl==`string`&&(n.cdpUrl=t.cdpUrl),n}function h(e){if(!e||typeof e!=`object`)return null;let t=e,n=t.tab&&typeof t.tab==`object`?t.tab:null,r={ok:t.ok===!0};if(typeof t.reason==`string`&&(r.reason=t.reason),n){let e={};typeof n.url==`string`&&(e.url=n.url),typeof n.title==`string`&&(e.title=n.title),typeof n.targetId==`string`&&(e.targetId=n.targetId),r.tab=e}else r.tab=null;return r}function g(e){return e?e.running?`running`:`stopped`:`unknown`}function _({port:e,client:t}){let[n,g]=(0,d.useState)({kind:`loading`}),[_,v]=(0,d.useState)({kind:`idle`}),y=(0,d.useRef)(0),b=(0,d.useRef)(0),x=(0,d.useCallback)(async e=>{try{let[n,r]=await Promise.all([t.get(`/api/browser/status`),t.get(`/api/browser/active-tab`).catch(()=>null)]);if(e!==y.current)return;let i=m(n),a=i.running?h(r):null;g({kind:`ready`,status:i,activeTab:a})}catch(t){if(e!==y.current)return;let n=t instanceof i||t instanceof Error?t.message:String(t);g({kind:`error`,message:n})}},[t]);(0,d.useEffect)(()=>{let e=y.current+1;y.current=e,g({kind:`loading`}),x(e);let t=setInterval(()=>{x(e)},p);return()=>{y.current=e+1,clearInterval(t)}},[x]);let S=(0,d.useCallback)(async(e,t)=>{let n=b.current+1;b.current=n,v({kind:`pending`,label:e});try{if(await t(),n!==b.current)return;v({kind:`success`,message:`${e} succeeded`}),x(y.current)}catch(e){if(n!==b.current)return;v({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[x]),C=(0,d.useCallback)(()=>{S(`Start visible browser`,()=>t.post(`/api/browser/start`,{mode:`manual`,headless:!1}))},[t,S]),w=(0,d.useCallback)(()=>{S(`Start agent browser`,()=>t.post(`/api/browser/start`,{mode:`agent`,headless:!0}))},[t,S]),T=(0,d.useCallback)(()=>{S(`Stop`,()=>t.post(`/api/browser/stop`,{}))},[t,S]),E=(0,d.useCallback)(()=>{typeof window<`u`&&!window.confirm(`Reset the browser profile? Stops the browser and clears the persisted profile directory. Re-launch will start fresh.`)||S(`Reset profile`,()=>t.post(`/api/browser/stop`,{}))},[t,S]);if(n.kind===`loading`)return(0,f.jsx)(s,{label:`Polling browser status…`});if(n.kind===`error`)return(0,f.jsx)(u,{message:n.message});let{status:D,activeTab:O}=n,k=_.kind===`pending`,A=_.kind===`pending`?(0,f.jsxs)(`span`,{role:`status`,children:[_.label,`…`]}):_.kind===`success`?(0,f.jsx)(`span`,{role:`status`,children:_.message}):null;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,f.jsxs)(l,{title:`Status`,hint:`Polled every ${p/1e3}s while this page is open.`,children:[(0,f.jsx)(r,{items:[{label:`Running`,value:D.running?(0,f.jsx)(o,{tone:`ok`,children:`Running`}):(0,f.jsx)(o,{tone:`neutral`,children:`Stopped`})},{label:`Tabs`,value:D.tabs},{label:`CDP URL`,value:D.cdpUrl||`—`,mono:!0},{label:`Instance port`,value:e,mono:!0}]}),(0,f.jsxs)(a,{status:A,children:[(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:D.running||k,onClick:C,children:`Start visible browser`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:D.running||k,onClick:w,children:`Start agent browser`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:!D.running||k,onClick:T,children:`Stop`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,disabled:k,onClick:E,children:`Reset profile`})]}),_.kind===`error`&&(0,f.jsx)(c,{tone:`error`,role:`alert`,children:_.message})]}),(0,f.jsx)(l,{title:`Active tab`,hint:`Tab the agent currently targets. Empty when the browser is stopped.`,children:D.running?O&&O.ok&&O.tab?(0,f.jsx)(r,{items:[{label:`URL`,value:O.tab.url||`—`,mono:!0},{label:`Title`,value:O.tab.title||`—`},{label:`Target ID`,value:O.tab.targetId||`—`,mono:!0}]}):(0,f.jsxs)(c,{children:[`No verified active tab`,O?.reason?` (${O.reason})`:``,`.`]}):(0,f.jsx)(c,{children:`Browser is not running.`})})]})}export{_ as default,g as describeStatus,h as normalizeActiveTab,m as normalizeBrowserStatus};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-CkEUZM6i.js";import{a as r,d as i,i as a,l as o,n as s,o as c,s as l,t as u}from"./page-shell-Cz2ylri8.js";var d=e(t(),1),f=n(),p=3e3;function m(e){if(!e||typeof e!=`object`)return{running:!1,tabs:0};let t=e,n={running:t.running===!0,tabs:typeof t.tabs==`number`&&Number.isFinite(t.tabs)?t.tabs:0};return typeof t.cdpUrl==`string`&&(n.cdpUrl=t.cdpUrl),n}function h(e){if(!e||typeof e!=`object`)return null;let t=e,n=t.tab&&typeof t.tab==`object`?t.tab:null,r={ok:t.ok===!0};if(typeof t.reason==`string`&&(r.reason=t.reason),n){let e={};typeof n.url==`string`&&(e.url=n.url),typeof n.title==`string`&&(e.title=n.title),typeof n.targetId==`string`&&(e.targetId=n.targetId),r.tab=e}else r.tab=null;return r}function g(e){return e?e.running?`running`:`stopped`:`unknown`}function _({port:e,client:t}){let[n,g]=(0,d.useState)({kind:`loading`}),[_,v]=(0,d.useState)({kind:`idle`}),y=(0,d.useRef)(0),b=(0,d.useRef)(0),x=(0,d.useCallback)(async e=>{try{let[n,r]=await Promise.all([t.get(`/api/browser/status`),t.get(`/api/browser/active-tab`).catch(()=>null)]);if(e!==y.current)return;let i=m(n),a=i.running?h(r):null;g({kind:`ready`,status:i,activeTab:a})}catch(t){if(e!==y.current)return;let n=t instanceof i||t instanceof Error?t.message:String(t);g({kind:`error`,message:n})}},[t]);(0,d.useEffect)(()=>{let e=y.current+1;y.current=e,g({kind:`loading`}),x(e);let t=setInterval(()=>{x(e)},p);return()=>{y.current=e+1,clearInterval(t)}},[x]);let S=(0,d.useCallback)(async(e,t)=>{let n=b.current+1;b.current=n,v({kind:`pending`,label:e});try{if(await t(),n!==b.current)return;v({kind:`success`,message:`${e} succeeded`}),x(y.current)}catch(e){if(n!==b.current)return;v({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[x]),C=(0,d.useCallback)(()=>{S(`Start visible browser`,()=>t.post(`/api/browser/start`,{mode:`manual`,headless:!1}))},[t,S]),w=(0,d.useCallback)(()=>{S(`Start agent browser`,()=>t.post(`/api/browser/start`,{mode:`agent`,headless:!0}))},[t,S]),T=(0,d.useCallback)(()=>{S(`Stop`,()=>t.post(`/api/browser/stop`,{}))},[t,S]),E=(0,d.useCallback)(()=>{typeof window<`u`&&!window.confirm(`Reset the browser profile? Stops the browser and clears the persisted profile directory. Re-launch will start fresh.`)||S(`Reset profile`,()=>t.post(`/api/browser/stop`,{}))},[t,S]);if(n.kind===`loading`)return(0,f.jsx)(s,{label:`Polling browser status…`});if(n.kind===`error`)return(0,f.jsx)(u,{message:n.message});let{status:D,activeTab:O}=n,k=_.kind===`pending`,A=_.kind===`pending`?(0,f.jsxs)(`span`,{role:`status`,children:[_.label,`…`]}):_.kind===`success`?(0,f.jsx)(`span`,{role:`status`,children:_.message}):null;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,f.jsxs)(l,{title:`Status`,hint:`Polled every ${p/1e3}s while this page is open.`,children:[(0,f.jsx)(r,{items:[{label:`Running`,value:D.running?(0,f.jsx)(o,{tone:`ok`,children:`Running`}):(0,f.jsx)(o,{tone:`neutral`,children:`Stopped`})},{label:`Tabs`,value:D.tabs},{label:`CDP URL`,value:D.cdpUrl||`—`,mono:!0},{label:`Instance port`,value:e,mono:!0}]}),(0,f.jsxs)(a,{status:A,children:[(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:D.running||k,onClick:C,children:`Start visible browser`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:D.running||k,onClick:w,children:`Start agent browser`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:!D.running||k,onClick:T,children:`Stop`}),(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-danger`,disabled:k,onClick:E,children:`Reset profile`})]}),_.kind===`error`&&(0,f.jsx)(c,{tone:`error`,role:`alert`,children:_.message})]}),(0,f.jsx)(l,{title:`Active tab`,hint:`Tab the agent currently targets. Empty when the browser is stopped.`,children:D.running?O&&O.ok&&O.tab?(0,f.jsx)(r,{items:[{label:`URL`,value:O.tab.url||`—`,mono:!0},{label:`Title`,value:O.tab.title||`—`},{label:`Target ID`,value:O.tab.targetId||`—`,mono:!0}]}):(0,f.jsxs)(c,{children:[`No verified active tab`,O?.reason?` (${O.reason})`:``,`.`]}):(0,f.jsx)(c,{children:`Browser is not running.`})})]})}export{_ as default,g as describeStatus,h as normalizeActiveTab,m as normalizeBrowserStatus};