@nextclaw/ui 0.12.35-beta.3 → 0.12.35-beta.5

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 (116) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/dist/assets/api-BTZui7nj.js +15 -0
  3. package/dist/assets/{book-open--T9dJHnp.js → book-open-qc0UVn6m.js} +1 -1
  4. package/dist/assets/channels-list-page-DBtU_M1Y.js +8 -0
  5. package/dist/assets/{chat-page-DOKLoiqI.js → chat-page-BcoJYo91.js} +2 -2
  6. package/dist/assets/config-split-page-DW8tP9Bc.js +1 -0
  7. package/dist/assets/createLucideIcon-CA0sgoMJ.js +1 -0
  8. package/dist/assets/desktop-update-config-DARSwQG8.js +1 -0
  9. package/dist/assets/dist-D5zsy7pX.js +1 -0
  10. package/dist/assets/dist-DNxIa3pe.js +41 -0
  11. package/dist/assets/doc-browser-B9skxzVo.js +1 -0
  12. package/dist/assets/doc-browser-CwyITRXx.js +1 -0
  13. package/dist/assets/doc-browser-context-Do2qSrB8.js +1 -0
  14. package/dist/assets/{external-link-CZ9bQY0L.js → external-link-C9fbyi6k.js} +1 -1
  15. package/dist/assets/index-BYRP_BMj.css +1 -0
  16. package/dist/assets/index-DckPGTdM.js +103 -0
  17. package/dist/assets/mcp-marketplace-page-BiExW5wq.js +40 -0
  18. package/dist/assets/mcp-marketplace-page-Cj6MDSkE.js +1 -0
  19. package/dist/assets/model-config-DbdY7fF1.js +1 -0
  20. package/dist/assets/notice-card-CyiVcu_Z.js +5 -0
  21. package/dist/assets/play-D-s0C4MN.js +1 -0
  22. package/dist/assets/plus-DOwjM_kF.js +1 -0
  23. package/dist/assets/provider-scoped-model-input-Bk8jlpRm.js +1 -0
  24. package/dist/assets/providers-list-CJjNStDV.js +1 -0
  25. package/dist/assets/react-BaRotFd6.js +1 -0
  26. package/dist/assets/remote-gl8QckNc.js +1 -0
  27. package/dist/assets/runtime-config-page-BMFc1yzf.js +1 -0
  28. package/dist/assets/{save-B6wbBLkU.js → save-CG4Hb1u8.js} +1 -1
  29. package/dist/assets/{search-config-BFmG4_F7.js → search-config-DUOR26if.js} +1 -1
  30. package/dist/assets/{search-Czito3Dk.js → search-lWpOIHEn.js} +1 -1
  31. package/dist/assets/secrets-config-ZbLzjIRx.js +3 -0
  32. package/dist/assets/setting-row-CNfTKDjc.js +1 -0
  33. package/dist/assets/tabs-custom-BbZoysAl.js +1 -0
  34. package/dist/assets/tag-chip-Dl8JbhC7.js +1 -0
  35. package/dist/assets/x-D6GwT_8k.js +1 -0
  36. package/dist/index.html +15 -17
  37. package/package.json +8 -9
  38. package/src/app/components/app-presenter-provider.tsx +21 -0
  39. package/src/app/components/layout/sidebar.layout.test.tsx +2 -2
  40. package/src/app/components/layout/sidebar.tsx +3 -3
  41. package/src/app/index.tsx +5 -3
  42. package/src/app/presenters/app.presenter.ts +24 -0
  43. package/src/features/account/components/account-panel.tsx +11 -11
  44. package/src/features/account/index.ts +1 -4
  45. package/src/features/account/managers/account.manager.ts +52 -27
  46. package/src/features/account/stores/account.store.ts +0 -15
  47. package/src/features/apps/components/apps-panel.tsx +43 -0
  48. package/src/features/apps/index.ts +1 -0
  49. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +8 -8
  50. package/src/features/chat/components/layout/chat-sidebar.tsx +3 -2
  51. package/src/features/chat/managers/chat-session-list.manager.test.ts +58 -0
  52. package/src/features/chat/stores/chat-session-list.store.ts +58 -7
  53. package/src/features/panel-apps/components/panel-app-toolbar.tsx +4 -4
  54. package/src/features/panel-apps/components/panel-apps-list.tsx +6 -2
  55. package/src/features/panel-apps/index.ts +3 -1
  56. package/src/features/panel-apps/managers/panel-app-bridge.manager.test.ts +111 -0
  57. package/src/features/panel-apps/managers/panel-app-bridge.manager.ts +247 -0
  58. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.test.ts +23 -0
  59. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +42 -16
  60. package/src/features/remote/components/remote-access-page.test.tsx +2 -2
  61. package/src/features/remote/components/remote-access-page.tsx +9 -9
  62. package/src/features/remote/managers/remote-access.manager.ts +24 -41
  63. package/src/features/service-apps/components/service-action-authorization-dialog.tsx +78 -0
  64. package/src/features/service-apps/components/service-apps-panel.tsx +290 -0
  65. package/src/features/service-apps/hooks/use-service-apps.ts +66 -0
  66. package/src/features/service-apps/index.ts +3 -0
  67. package/src/features/service-apps/managers/service-action-authorization.manager.ts +10 -0
  68. package/src/features/service-apps/stores/service-action-authorization.store.ts +53 -0
  69. package/src/shared/components/doc-browser/doc-browser-context.test.tsx +150 -1
  70. package/src/shared/components/doc-browser/doc-browser-context.tsx +34 -443
  71. package/src/shared/components/doc-browser/doc-browser-renderer.types.ts +7 -0
  72. package/src/shared/components/doc-browser/doc-browser.tsx +16 -1
  73. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +272 -0
  74. package/src/shared/components/doc-browser/stores/doc-browser.store.ts +140 -0
  75. package/src/shared/components/doc-browser/types/doc-browser.types.ts +47 -0
  76. package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +47 -0
  77. package/src/shared/components/doc-browser/utils/doc-browser-url.utils.ts +95 -0
  78. package/src/shared/lib/api/managers/client.manager.ts +2 -1
  79. package/src/shared/lib/i18n/runtime/doc-browser-labels.utils.ts +31 -0
  80. package/src/shared/lib/transport/local-transport.service.ts +18 -2
  81. package/src/shared/lib/transport/remote-transport.service.ts +19 -3
  82. package/src/shared/lib/transport/request-raw-api-response.utils.ts +1 -1
  83. package/dist/assets/api-D3uoaOR8.js +0 -15
  84. package/dist/assets/channels-list-page-DHmz9iHg.js +0 -8
  85. package/dist/assets/config-split-page-Dutq3R5o.js +0 -1
  86. package/dist/assets/createLucideIcon-Cwr2o6Zq.js +0 -1
  87. package/dist/assets/desktop-update-config-ClbDsIOs.js +0 -1
  88. package/dist/assets/dist-e5WATjIW.js +0 -1
  89. package/dist/assets/doc-browser-ChY6hMn8.js +0 -1
  90. package/dist/assets/doc-browser-cR1vWRs1.js +0 -1
  91. package/dist/assets/doc-browser-context-CLczyX2Z.js +0 -1
  92. package/dist/assets/es2015-BJw-hrex.js +0 -41
  93. package/dist/assets/i18n-tWKGEGxB.js +0 -1
  94. package/dist/assets/index-DPz9DRZN.js +0 -103
  95. package/dist/assets/index-HvJDzfSU.css +0 -1
  96. package/dist/assets/key-round-B8tTb3ZJ.js +0 -1
  97. package/dist/assets/mcp-marketplace-page-BYPxLdUR.js +0 -40
  98. package/dist/assets/mcp-marketplace-page-DXCvk7wJ.js +0 -1
  99. package/dist/assets/model-config-DcnC_fSr.js +0 -1
  100. package/dist/assets/notice-card-DUDbOvqx.js +0 -5
  101. package/dist/assets/play-CV_kwi9X.js +0 -1
  102. package/dist/assets/plus-BqfNq7Tu.js +0 -1
  103. package/dist/assets/provider-scoped-model-input-eO4XY0iY.js +0 -1
  104. package/dist/assets/providers-list-BgvjRVmp.js +0 -1
  105. package/dist/assets/remote-BCuZ1JJe.js +0 -1
  106. package/dist/assets/rotate-cw-BKEhWuWp.js +0 -1
  107. package/dist/assets/runtime-config-page-B2XPXHrk.js +0 -1
  108. package/dist/assets/secrets-config-4uY5sk-V.js +0 -3
  109. package/dist/assets/select-CmmDgG8o.js +0 -1
  110. package/dist/assets/setting-row-BUO6FeN1.js +0 -1
  111. package/dist/assets/tabs-custom-D3IZL9WX.js +0 -1
  112. package/dist/assets/tag-chip-Dm_pOtE3.js +0 -1
  113. package/dist/assets/x-DBP3WiC9.js +0 -1
  114. package/src/app/components/app-manager-provider.tsx +0 -20
  115. package/src/app/managers/app.manager.ts +0 -12
  116. /package/dist/assets/{config-hints-DGfwbumO.js → config-hints-CTqBnCDp.js} +0 -0
@@ -0,0 +1 @@
1
+ import{h as e,i as t,m as n,v as r}from"./react-BaRotFd6.js";import{At as i,Dt as a,Et as o,Lt as s,Mt as c,Nt as l,Ot as u,Tt as d,_t as f,bt as p,ft as m,ht as h,kt as g,wt as _,yt as v}from"./api-BTZui7nj.js";import{t as y}from"./notice-card-CyiVcu_Z.js";import{t as b}from"./play-D-s0C4MN.js";import{t as x}from"./plus-DOwjM_kF.js";import{t as S}from"./save-CG4Hb1u8.js";import{Ct as C,G as ee,J as w,K as T,Kt as E,St as D,X as O,Y as k,Zt as A,et as j,nn as M,q as N,qt as te,yt as ne}from"./index-DckPGTdM.js";import{t as P}from"./setting-row-CNfTKDjc.js";var F=r(e(),1),I=n(),L={healthy:`runtimeControlHealthy`,"starting-service":`runtimeControlStartingService`,"restarting-service":`runtimeControlRestartingService`,"stopping-service":`runtimeControlStoppingService`,"restarting-app":`runtimeControlRestartingApp`,recovering:`runtimeControlRecovering`,failed:`runtimeControlFailed`},R={running:`runtimeControlServiceRunning`,stopped:`runtimeControlServiceStopped`,starting:`runtimeControlServiceStarting`,stopping:`runtimeControlServiceStopping`,restarting:`runtimeControlServiceRestarting`},z={"desktop-embedded":`runtimeControlEnvironmentDesktop`,"managed-local-service":`runtimeControlEnvironmentManagedService`,"self-hosted-web":`runtimeControlEnvironmentSelfHosted`,"shared-web":`runtimeControlEnvironmentSharedWeb`};function B(e){return t(L[e]??`runtimeControlUnavailable`)}function V(e){return t(R[e]??`runtimeControlServiceUnknown`)}function H(e){return t(z[e.environment])}function U(e,t){return t===`start-service`?e?.canStartService:t===`stop-service`?e?.canStopService:e?.canRestartService}function W(e){return e?[{action:`start-service`,capability:e.canStartService,label:t(`runtimeControlStartService`),icon:`play`},{action:`restart-service`,capability:e.canRestartService,label:t(`runtimeControlRestartService`),icon:`rotate`},{action:`stop-service`,capability:e.canStopService,label:t(`runtimeControlStopService`),icon:`square`,variant:`destructive`},{action:`restart-app`,capability:e.canRestartApp,label:t(`runtimeControlRestartApp`),icon:`rotate`,variant:`secondary`}].filter(e=>e.capability.available||!!e.capability.reasonIfUnavailable):[]}function G(e){let{busy:t,icon:n}=e;return t?(0,I.jsx)(M,{className:`mr-2 h-4 w-4 animate-spin`}):n===`play`?(0,I.jsx)(b,{className:`mr-2 h-4 w-4`}):n===`square`?(0,I.jsx)(te,{className:`mr-2 h-4 w-4`}):(0,I.jsx)(A,{className:`mr-2 h-4 w-4`})}function K(){let{busy:e,busyAction:n,controlView:r,errorMessage:i,pendingRestart:c,visibleLifecycle:f,visibleMessage:m,visibleServiceState:g}=h(),y=W(r??void 0),b=async e=>{let n=U(r,e);if(!n?.available){s.error(p(n?.reasonIfUnavailable)??t(`runtimeControlLoadFailed`));return}if(!(e===`stop-service`&&n.requiresConfirmation&&!window.confirm(t(`runtimeControlStopServiceConfirm`))))try{let t=await v.runRuntimeControlAction(e);s.success(p(t.message)??t.message)}catch(e){let n=e instanceof Error?e.message:t(`runtimeControlActionFailed`);s.error(`${t(`runtimeControlActionFailed`)}: ${n}`)}},x=async()=>{if(!r?.canRestartApp.available){s.error(p(r?.canRestartApp.reasonIfUnavailable)??t(`runtimeRestartAppUnavailable`));return}if(window.confirm(t(`runtimeControlRestartAppConfirm`)))try{let e=await v.runRuntimeControlAction(`restart-app`);s.success(p(e.message)??e.message)}catch(e){let n=e instanceof Error?e.message:t(`runtimeControlActionFailed`);s.error(`${t(`runtimeControlActionFailed`)}: ${n}`)}};return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`runtimeControlTitle`)}),(0,I.jsx)(o,{children:t(`runtimeControlDescription`)})]}),(0,I.jsxs)(d,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{className:`space-y-3 rounded-xl border border-gray-200 bg-gray-50 p-4`,children:[(0,I.jsxs)(`div`,{className:`flex flex-col gap-1 md:flex-row md:items-center md:justify-between`,children:[(0,I.jsx)(`div`,{className:`text-sm font-medium text-gray-900`,children:V(g)}),(0,I.jsx)(`div`,{className:`text-xs text-gray-500`,children:r?H(r):t(`runtimeControlLoading`)})]}),(0,I.jsx)(`p`,{className:`text-sm text-gray-600`,children:m}),(0,I.jsx)(`div`,{className:`text-xs text-gray-500`,children:B(f)}),r?.managementHint?(0,I.jsx)(`p`,{className:`text-xs text-gray-500`,children:p(r.managementHint)}):null,i&&!e?(0,I.jsx)(`p`,{className:`text-sm text-amber-700`,children:i}):null]}),c?(0,I.jsxs)(`div`,{className:`space-y-3 rounded-xl border border-amber-200 bg-amber-50 p-4`,children:[(0,I.jsx)(`div`,{className:`text-sm font-medium text-amber-900`,children:t(`runtimeControlPendingRestartTitle`)}),(0,I.jsx)(`p`,{className:`text-sm text-amber-800`,children:t(`runtimeControlPendingRestartDescription`)}),c.changedPaths.length>0?(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`div`,{className:`text-xs font-medium uppercase tracking-[0.08em] text-amber-700`,children:t(`runtimeControlPendingRestartPaths`)}),(0,I.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:c.changedPaths.map(e=>(0,I.jsx)(`span`,{className:`rounded-full border border-amber-200 bg-white px-2.5 py-1 text-xs text-amber-800`,children:e},e))})]}):null]}):null,(0,I.jsx)(`div`,{className:`flex flex-col gap-3 md:flex-row md:flex-wrap`,children:y.map(t=>(0,I.jsxs)(l,{type:`button`,variant:t.variant??`default`,onClick:()=>{if(t.action===`restart-app`){x();return}b(t.action)},disabled:!t.capability.available||e,children:[(0,I.jsx)(G,{icon:t.icon,busy:n===t.action}),t.label]},t.action))}),y.filter(e=>!e.capability.available&&e.capability.reasonIfUnavailable).map(e=>(0,I.jsx)(`p`,{className:`text-xs text-gray-500`,children:p(e.capability.reasonIfUnavailable)},`${e.action}-reason`))]})]})}function q(e){let{description:t,title:n}=e;return(0,I.jsx)(y,{tone:`neutral`,title:n,description:t})}function J(e){let{children:n}=e;return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`runtimePresenceTitle`)}),(0,I.jsx)(o,{children:t(`runtimePresenceDescription`)})]}),(0,I.jsx)(d,{children:n})]})}function Y(){let e=f().runtimeControlView?.environment,n=C(e=>e.supported),r=C(e=>e.initialized),i=C(e=>e.busyAction),a=C(e=>e.snapshot);return(0,F.useEffect)(()=>{if(e===`desktop-embedded`){D.start();return}D.markUnsupported()},[e]),e===`desktop-embedded`?(0,I.jsx)(J,{children:(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsx)(y,{tone:`neutral`,title:t(`runtimePresenceBehaviorLabel`),description:a?.closeToBackground?t(`runtimePresenceBehaviorBackground`):t(`runtimePresenceBehaviorQuit`),className:`rounded-xl`}),!r||n&&!a?(0,I.jsx)(`p`,{className:`text-sm text-gray-500`,children:t(`runtimePresenceLoading`)}):null,a?(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsx)(P,{title:t(`runtimePresenceCloseToBackground`),description:t(`runtimePresenceCloseToBackgroundHelp`),control:(0,I.jsx)(m,{id:`runtime-presence-close-background`,"aria-label":t(`runtimePresenceCloseToBackground`),checked:a.closeToBackground,disabled:i===`saving-preferences`,onCheckedChange:e=>{D.updatePreferences({closeToBackground:e})}})}),(0,I.jsx)(P,{title:t(`runtimePresenceLaunchAtLogin`),description:a.supportsLaunchAtLogin?t(`runtimePresenceLaunchAtLoginHelp`):a.launchAtLoginReason??t(`runtimePresenceLaunchAtLoginUnavailable`),control:(0,I.jsx)(m,{id:`runtime-presence-launch-login`,"aria-label":t(`runtimePresenceLaunchAtLogin`),checked:a.launchAtLogin,disabled:!a.supportsLaunchAtLogin||i===`saving-preferences`,onCheckedChange:e=>{D.updatePreferences({launchAtLogin:e})}})})]}):null]})}):e===`managed-local-service`?(0,I.jsx)(J,{children:(0,I.jsx)(q,{title:t(`runtimePresenceManagedLocalTitle`),description:t(`runtimePresenceManagedLocalDescription`)})}):e===`self-hosted-web`?(0,I.jsx)(J,{children:(0,I.jsx)(q,{title:t(`runtimePresenceSelfHostedTitle`),description:t(`runtimePresenceSelfHostedDescription`)})}):e===`shared-web`?(0,I.jsx)(J,{children:(0,I.jsx)(q,{title:t(`runtimePresenceSharedTitle`),description:t(`runtimePresenceSharedDescription`)})}):(0,I.jsx)(J,{children:(0,I.jsx)(`p`,{className:`text-sm text-gray-500`,children:t(`runtimePresenceLoading`)})})}function X(){return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(g,{title:t(`runtimePageTitle`),description:t(`runtimePageDescription`)}),(0,I.jsx)(K,{}),(0,I.jsx)(Y,{}),(0,I.jsx)(ee,{})]})}var Z={wireDialect:`acp`,processScope:`per-session`,command:``,args:[`acp`],env:{},cwd:``,startupTimeoutMs:8e3,probeTimeoutMs:3e3,requestTimeoutMs:12e4};function re(){return{id:``,default:!1,workspace:``,model:``,runtime:``,contextTokens:void 0,maxToolIterations:void 0}}function ie(){return{agentId:``,match:{channel:``,accountId:``}}}function ae(){return{id:``,enabled:!0,label:``,type:`narp-stdio`,config:Z,configText:JSON.stringify(Z,null,2)}}function oe(e){return{id:e.id??``,default:!!e.default,displayName:e.displayName??``,description:e.description??``,avatar:e.avatar??``,workspace:e.workspace??``,model:e.model??``,runtime:e.runtime??e.engine??``,contextTokens:e.contextTokens,maxToolIterations:e.maxToolIterations}}function se(e){return{agentId:e.agentId??``,match:{channel:e.match?.channel??``,accountId:e.match?.accountId??``,peer:e.match?.peer?{kind:e.match.peer.kind,id:e.match.peer.id}:void 0}}}function Q(e){let t=e.trim();if(!t)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function ce(e){return{companionEnabled:e.companion?.enabled===!0,agents:(e.agents.list??[]).map(oe),bindings:(e.bindings??[]).map(se),runtimeEntries:Object.entries(e.agents.runtimes?.entries??{}).map(([e,t])=>({id:e,enabled:t.enabled!==!1,label:t.label??``,type:t.type,config:t.config??{},configText:JSON.stringify(t.config??{},null,2)})),dmScope:e.session?.dmScope??`per-channel-peer`,defaultContextTokens:e.agents.defaults.contextTokens??2e5,defaultEngine:e.agents.defaults.engine??`native`}}function le(e){let t={id:e.id.trim()};e.default&&(t.default=!0),e.displayName?.trim()&&(t.displayName=e.displayName.trim()),e.description?.trim()&&(t.description=e.description.trim()),e.avatar?.trim()&&(t.avatar=e.avatar.trim()),e.workspace?.trim()&&(t.workspace=e.workspace.trim()),e.model?.trim()&&(t.model=e.model.trim());let n=e.runtime?.trim()??e.engine?.trim();return n&&(t.engine=n),typeof e.contextTokens==`number`&&(t.contextTokens=Math.max(1e3,e.contextTokens)),typeof e.maxToolIterations==`number`&&(t.maxToolIterations=e.maxToolIterations),t}function $(e){let n=e.agents.map((e,n)=>{if(!e.id.trim())throw Error(t(`agentIdRequiredError`).replace(`{index}`,String(n)));return le(e)}),r=n.map(e=>e.id).filter((e,t,n)=>n.indexOf(e)!==t);if(r.length>0)throw Error(`${t(`duplicateAgentId`)}: ${r[0]}`);let i=e.bindings.map((n,r)=>{let i=n.agentId.trim(),a=n.match.channel.trim(),o=n.match.accountId?.trim()??``,s=n.match.peer?.kind,c=n.match.peer?.id?.trim()??``;if(!i)throw Error(t(`bindingAgentIdRequired`).replace(`{index}`,String(r)));if(!e.knownAgentIds.has(i))throw Error(`${t(`bindingAgentIdNotFound`).replace(`{index}`,String(r))}: ${i}`);if(!a)throw Error(t(`bindingChannelRequired`).replace(`{index}`,String(r)));let l={agentId:i,match:{channel:a}};if(o&&(l.match.accountId=o),s){if(!c)throw Error(t(`bindingPeerIdRequired`).replace(`{index}`,String(r)));l.match.peer={kind:s,id:c}}return l}),a=e.runtimeEntries.reduce((e,n,r)=>{let i=n.id.trim(),a=n.type.trim();if(!i)throw Error(t(`runtimeEntryIdRequired`).replace(`{index}`,String(r)));if(!a)throw Error(t(`runtimeEntryTypeRequired`).replace(`{id}`,i));if(e[i])throw Error(`${t(`runtimeEntryDuplicate`)}: ${i}`);let o=n.configText.trim()?JSON.parse(n.configText):{};if(o&&(typeof o!=`object`||Array.isArray(o)))throw Error(t(`runtimeEntryConfigObjectRequired`).replace(`{id}`,i));return e[i]={enabled:n.enabled!==!1,...n.label?.trim()?{label:n.label.trim()}:{},type:a,config:o??{}},e},{});return{companion:{enabled:e.companionEnabled},agents:{defaults:{contextTokens:Math.max(1e3,e.defaultContextTokens),engine:e.defaultEngine.trim()||`native`},list:n,runtimes:{entries:a}},bindings:i,session:{dmScope:e.dmScope}}}function ue(e){return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`agentList`)}),(0,I.jsx)(o,{children:t(`agentListHelp`)})]}),(0,I.jsxs)(d,{className:`space-y-3`,children:[e.agents.map((n,r)=>(0,I.jsxs)(`div`,{className:`rounded-xl border border-gray-200 p-3 space-y-3`,children:[(0,I.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,I.jsx)(c,{value:n.id,onChange:t=>e.onUpdateAgent(r,{id:t.target.value}),placeholder:t(`agentIdPlaceholder`)}),(0,I.jsx)(c,{value:n.workspace??``,onChange:t=>e.onUpdateAgent(r,{workspace:t.target.value}),placeholder:t(`workspaceOverridePlaceholder`)}),(0,I.jsx)(c,{value:n.model??``,onChange:t=>e.onUpdateAgent(r,{model:t.target.value}),placeholder:t(`modelOverridePlaceholder`)}),(0,I.jsx)(c,{value:n.runtime??n.engine??``,onChange:t=>e.onUpdateAgent(r,{runtime:t.target.value}),placeholder:t(`engineOverridePlaceholder`)}),(0,I.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-2`,children:[(0,I.jsx)(c,{type:`number`,min:1e3,step:1e3,value:n.contextTokens??``,onChange:t=>e.onUpdateAgent(r,{contextTokens:Q(t.target.value)}),placeholder:t(`contextTokensPlaceholder`)}),(0,I.jsx)(c,{type:`number`,min:1,value:n.maxToolIterations??``,onChange:t=>e.onUpdateAgent(r,{maxToolIterations:Q(t.target.value)}),placeholder:t(`maxToolsPlaceholder`)})]})]}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-gray-600`,children:[(0,I.jsx)(m,{checked:!!n.default,onCheckedChange:t=>e.onSetDefaultAgent(r,t)}),(0,I.jsx)(`span`,{children:t(`defaultAgent`)})]}),(0,I.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>e.onRemoveAgent(r),children:[(0,I.jsx)(E,{className:`h-4 w-4 mr-1`}),t(`remove`)]})]})]},`${r}-${n.id}`)),(0,I.jsxs)(l,{type:`button`,variant:`outline`,onClick:e.onAddAgent,children:[(0,I.jsx)(x,{className:`h-4 w-4 mr-2`}),t(`addAgent`)]})]})]})}function de(e){return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`bindings`)}),(0,I.jsx)(o,{children:t(`bindingsHelp`)})]}),(0,I.jsxs)(d,{className:`space-y-3`,children:[e.bindings.map((n,r)=>{let i=n.match.peer?.kind??``;return(0,I.jsxs)(`div`,{className:`rounded-xl border border-gray-200 p-3 space-y-3`,children:[(0,I.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3`,children:[(0,I.jsx)(c,{value:n.agentId,onChange:t=>e.onUpdateBinding(r,{...n,agentId:t.target.value}),placeholder:t(`targetAgentIdPlaceholder`)}),(0,I.jsx)(c,{value:n.match.channel,onChange:t=>e.onUpdateBinding(r,{...n,match:{...n.match,channel:t.target.value}}),placeholder:t(`channelPlaceholder`)}),(0,I.jsx)(c,{value:n.match.accountId??``,onChange:t=>e.onUpdateBinding(r,{...n,match:{...n.match,accountId:t.target.value}}),placeholder:t(`accountIdOptionalPlaceholder`)}),(0,I.jsxs)(T,{value:i||`__none__`,onValueChange:t=>{let i=t===`__none__`?``:t;e.onUpdateBinding(r,i?{...n,match:{...n.match,peer:{kind:i,id:n.match.peer?.id??``}}}:{...n,match:{...n.match,peer:void 0}})},children:[(0,I.jsx)(k,{children:(0,I.jsx)(O,{})}),(0,I.jsxs)(N,{children:[(0,I.jsx)(w,{value:`__none__`,children:t(`peerKindOptional`)}),(0,I.jsx)(w,{value:`direct`,children:t(`peerKindDirect`)}),(0,I.jsx)(w,{value:`group`,children:t(`peerKindGroup`)}),(0,I.jsx)(w,{value:`channel`,children:t(`peerKindChannel`)})]})]}),(0,I.jsx)(c,{value:n.match.peer?.id??``,onChange:t=>e.onUpdateBinding(r,{...n,match:{...n.match,peer:i?{kind:i,id:t.target.value}:void 0}}),placeholder:t(`peerIdPlaceholder`)})]}),(0,I.jsx)(`div`,{className:`flex justify-end`,children:(0,I.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>e.onRemoveBinding(r),children:[(0,I.jsx)(E,{className:`h-4 w-4 mr-1`}),t(`remove`)]})})]},`${r}-${n.agentId}`)}),(0,I.jsxs)(l,{type:`button`,variant:`outline`,onClick:e.onAddBinding,children:[(0,I.jsx)(x,{className:`h-4 w-4 mr-2`}),t(`addBinding`)]})]})]})}function fe(e){return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`runtimeEntries`)}),(0,I.jsx)(o,{children:t(`runtimeEntriesHelp`)})]}),(0,I.jsxs)(d,{className:`space-y-3`,children:[e.entries.map((n,r)=>(0,I.jsxs)(`div`,{className:`rounded-xl border border-gray-200 p-3 space-y-3`,children:[(0,I.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,I.jsx)(c,{value:n.id,onChange:t=>e.onUpdateEntry(r,{id:t.target.value}),placeholder:t(`runtimeEntryIdPlaceholder`)}),(0,I.jsx)(c,{value:n.label??``,onChange:t=>e.onUpdateEntry(r,{label:t.target.value}),placeholder:t(`runtimeEntryLabelPlaceholder`)}),(0,I.jsx)(c,{value:n.type,onChange:t=>e.onUpdateEntry(r,{type:t.target.value}),placeholder:t(`runtimeEntryTypePlaceholder`)}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between rounded-lg border border-gray-200 px-3 py-2`,children:[(0,I.jsx)(`span`,{className:`text-sm text-gray-700`,children:t(`enabled`)}),(0,I.jsx)(m,{checked:n.enabled!==!1,onCheckedChange:t=>e.onUpdateEntry(r,{enabled:t})})]})]}),(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:t(`runtimeEntryConfigJson`)}),(0,I.jsx)(`textarea`,{className:`min-h-32 w-full rounded-md border border-gray-200 px-3 py-2 text-sm font-mono`,value:n.configText,onChange:t=>e.onUpdateEntry(r,{configText:t.target.value}),spellCheck:!1})]}),(0,I.jsx)(`div`,{className:`flex justify-end`,children:(0,I.jsxs)(l,{type:`button`,variant:`outline`,onClick:()=>e.onRemoveEntry(r),children:[(0,I.jsx)(E,{className:`mr-2 h-4 w-4`}),t(`delete`)]})})]},`${r}-${n.id||`runtime-entry`}`)),(0,I.jsxs)(l,{type:`button`,variant:`outline`,onClick:e.onAddEntry,children:[(0,I.jsx)(x,{className:`mr-2 h-4 w-4`}),t(`addRuntimeEntry`)]})]})]})}var pe=[{value:`main`,labelKey:`dmScopeMain`},{value:`per-peer`,labelKey:`dmScopePerPeer`},{value:`per-channel-peer`,labelKey:`dmScopePerChannelPeer`},{value:`per-account-channel-peer`,labelKey:`dmScopePerAccountChannelPeer`}];function me(e){return(0,I.jsxs)(_,{children:[(0,I.jsxs)(a,{children:[(0,I.jsx)(u,{children:t(`dmScope`)}),(0,I.jsx)(o,{children:t(`dmScopeHelp`)})]}),(0,I.jsxs)(d,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{className:`flex items-start justify-between gap-4 rounded-md border border-gray-200 px-4 py-3`,children:[(0,I.jsxs)(`div`,{className:`space-y-1`,children:[(0,I.jsx)(`div`,{className:`text-sm font-medium text-gray-800`,children:t(`runtimeCompanionEnabled`)}),(0,I.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`runtimeCompanionEnabledHelp`)})]}),(0,I.jsx)(m,{checked:e.companionEnabled,onCheckedChange:e.onCompanionEnabledChange})]}),(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:t(`defaultContextTokens`)}),(0,I.jsx)(c,{type:`number`,min:1e3,step:1e3,value:e.defaultContextTokens,onChange:t=>e.onDefaultContextTokensChange(Math.max(1e3,Number.parseInt(t.target.value,10)||1e3))}),(0,I.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`defaultContextTokensHelp`)})]}),(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:t(`defaultEngine`)}),(0,I.jsx)(c,{value:e.defaultEngine,onChange:t=>e.onDefaultEngineChange(t.target.value),placeholder:t(`defaultEnginePlaceholder`)}),(0,I.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`defaultEngineHelp`)})]}),(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:t(`dmScope`)}),(0,I.jsxs)(T,{value:e.dmScope,onValueChange:t=>e.onDmScopeChange(t),children:[(0,I.jsx)(k,{children:(0,I.jsx)(O,{})}),(0,I.jsx)(N,{children:pe.map(e=>(0,I.jsx)(w,{value:e.value,children:t(e.labelKey)},e.value))})]})]})]})]})}function he(e){let n=(0,F.useMemo)(()=>ce(e.config),[e.config]),[r,a]=(0,F.useState)(n.agents),[o,c]=(0,F.useState)(n.bindings),[u,d]=(0,F.useState)(n.runtimeEntries),[f,p]=(0,F.useState)(n.dmScope),[m,h]=(0,F.useState)(n.companionEnabled),[g,_]=(0,F.useState)(n.defaultContextTokens),[v,y]=(0,F.useState)(n.defaultEngine),b=(0,F.useMemo)(()=>{let e=new Set([`main`]);return r.forEach(t=>{let n=t.id.trim();n&&e.add(n)}),e},[r]);return(0,I.jsxs)(i,{className:`space-y-6`,children:[(0,I.jsx)(X,{}),(0,I.jsx)(me,{companionEnabled:m,dmScope:f,defaultContextTokens:g,defaultEngine:v,onCompanionEnabledChange:h,onDmScopeChange:p,onDefaultContextTokensChange:_,onDefaultEngineChange:y}),(0,I.jsx)(fe,{entries:u,onUpdateEntry:(e,t)=>d(n=>n.map((n,r)=>r===e?{...n,...t}:n)),onRemoveEntry:e=>d(t=>t.filter((t,n)=>n!==e)),onAddEntry:()=>d(e=>[...e,ae()])}),(0,I.jsx)(ue,{agents:r,onUpdateAgent:(e,t)=>{a(n=>n.map((n,r)=>r===e?{...n,...t}:n))},onRemoveAgent:e=>a(t=>t.filter((t,n)=>n!==e)),onAddAgent:()=>a(e=>[...e,re()]),onSetDefaultAgent:(e,t)=>a(n=>t?n.map((t,n)=>({...t,default:n===e})):n.map((t,n)=>n===e?{...t,default:!1}:t))}),(0,I.jsx)(de,{bindings:o,onUpdateBinding:(e,t)=>{c(n=>n.map((n,r)=>r===e?t:n))},onRemoveBinding:e=>c(t=>t.filter((t,n)=>n!==e)),onAddBinding:()=>c(e=>[...e,ie()])}),(0,I.jsx)(`div`,{className:`flex justify-end`,children:(0,I.jsxs)(l,{type:`button`,onClick:()=>{try{let t=$({companionEnabled:m,agents:r,bindings:o,runtimeEntries:u,dmScope:f,defaultContextTokens:g,defaultEngine:v,knownAgentIds:b});e.updateRuntime.mutate({data:t})}catch(e){s.error(e instanceof Error?e.message:String(e))}},disabled:e.updateRuntime.isPending,children:[(0,I.jsx)(S,{className:`h-4 w-4 mr-2`}),e.updateRuntime.isPending?t(`saving`):t(`saveRuntimeSettings`)]})})]})}function ge(){let{data:e,isLoading:n}=j(),r=ne();return n||!e?(0,I.jsx)(`div`,{className:`p-8 text-gray-400`,children:t(`runtimeLoading`)}):(0,I.jsx)(he,{config:e,updateRuntime:r})}export{ge as RuntimeConfig};
@@ -1 +1 @@
1
- import{t as e}from"./createLucideIcon-Cwr2o6Zq.js";var t=e(`Save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]);export{t};
1
+ import{t as e}from"./createLucideIcon-CA0sgoMJ.js";var t=e(`Save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]);export{t};
@@ -1 +1 @@
1
- import{_ as e,m as t,p as n,r}from"./i18n-tWKGEGxB.js";import{At as i,Mt as a,Nt as o,jt as s,kt as c}from"./api-D3uoaOR8.js";import{t as l}from"./search-Czito3Dk.js";import{a as u,i as d,n as f,r as p,t as m}from"./select-CmmDgG8o.js";import{t as h}from"./external-link-CZ9bQY0L.js";import{t as g}from"./key-round-B8tTb3ZJ.js";import{Ct as _,Dt as v,it as y,rt as b}from"./index-DPz9DRZN.js";import{a as x,c as S,i as C,n as w,o as T,s as E,t as D}from"./config-split-page-Dutq3R5o.js";var O=e(t(),1),k=n(),A=[{value:`noLimit`,label:`searchFreshnessNoLimit`},{value:`oneDay`,label:`searchFreshnessOneDay`},{value:`oneWeek`,label:`searchFreshnessOneWeek`},{value:`oneMonth`,label:`searchFreshnessOneMonth`},{value:`oneYear`,label:`searchFreshnessOneYear`}],j=[{value:`basic`,label:`searchDepthBasic`},{value:`advanced`,label:`searchDepthAdvanced`}],M=[{value:`true`,label:`enabled`},{value:`false`,label:`disabled`}],N={bocha:`searchProviderBochaDescription`,tavily:`searchProviderTavilyDescription`,brave:`searchProviderBraveDescription`};function P(e){return{activeProvider:e.provider,enabledProviders:e.enabledProviders,maxResults:String(e.defaults.maxResults),providers:{bocha:{apiKey:``,baseUrl:e.providers.bocha.baseUrl,summary:!!e.providers.bocha.summary,freshness:e.providers.bocha.freshness??`noLimit`},tavily:{apiKey:``,baseUrl:e.providers.tavily.baseUrl,searchDepth:e.providers.tavily.searchDepth??`basic`,includeAnswer:!!e.providers.tavily.includeAnswer},brave:{apiKey:``,baseUrl:e.providers.brave.baseUrl}}}}function F(e){return{provider:e.activeProvider,enabledProviders:e.enabledProviders,defaults:{maxResults:Number(e.maxResults)||10},providers:{bocha:{apiKey:e.providers.bocha.apiKey||void 0,baseUrl:e.providers.bocha.baseUrl,summary:e.providers.bocha.summary,freshness:e.providers.bocha.freshness},tavily:{apiKey:e.providers.tavily.apiKey||void 0,baseUrl:e.providers.tavily.baseUrl,searchDepth:e.providers.tavily.searchDepth,includeAnswer:e.providers.tavily.includeAnswer},brave:{apiKey:e.providers.brave.apiKey||void 0,baseUrl:e.providers.brave.baseUrl}}}}function I(e){let{label:t,value:n,onChange:r,placeholder:i,type:o=`text`,inputMode:c}=e;return(0,k.jsxs)(`div`,{className:`space-y-2`,children:[(0,k.jsx)(s,{children:t}),(0,k.jsx)(a,{type:o,value:n,onChange:e=>r(e.target.value),placeholder:i,inputMode:c,className:`rounded-xl`})]})}function L(e){let{label:t,value:n,options:i,onChange:a}=e;return(0,k.jsxs)(`div`,{className:`space-y-2`,children:[(0,k.jsx)(s,{children:t}),(0,k.jsxs)(m,{value:n,onValueChange:a,children:[(0,k.jsx)(d,{className:`rounded-xl`,children:(0,k.jsx)(u,{})}),(0,k.jsx)(f,{children:i.map(e=>(0,k.jsx)(p,{value:e.value,children:r(e.label)},e.value))})]})]})}function R({docsUrl:e}){return e?(0,k.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,children:(0,k.jsxs)(o,{type:`button`,variant:`outline`,className:`rounded-xl`,children:[(0,k.jsx)(h,{className:`mr-2 h-4 w-4`}),r(`searchProviderOpenDocs`)]})}):null}function z(e){let{draft:t,provider:n,search:i,selectedDocsUrl:a,updateProviderDraft:o}=e;if(n===`bocha`){let{bocha:e}=t.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:r(`apiKey`),value:e.apiKey,onChange:e=>o(`bocha`,{apiKey:e}),placeholder:i.providers.bocha.apiKeyMasked||r(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:r(`searchProviderBaseUrl`),value:e.baseUrl,onChange:e=>o(`bocha`,{baseUrl:e})}),(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:r(`searchProviderSummary`),value:e.summary?`true`:`false`,options:M,onChange:e=>o(`bocha`,{summary:e===`true`})}),(0,k.jsx)(L,{label:r(`searchProviderFreshness`),value:e.freshness,options:A,onChange:e=>o(`bocha`,{freshness:e})})]}),(0,k.jsx)(R,{docsUrl:a??`https://open.bocha.cn`})]})}if(n===`tavily`){let{tavily:e}=t.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:r(`apiKey`),value:e.apiKey,onChange:e=>o(`tavily`,{apiKey:e}),placeholder:i.providers.tavily.apiKeyMasked||r(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:r(`searchProviderBaseUrl`),value:e.baseUrl,onChange:e=>o(`tavily`,{baseUrl:e})}),(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:r(`searchProviderSearchDepth`),value:e.searchDepth,options:j,onChange:e=>o(`tavily`,{searchDepth:e})}),(0,k.jsx)(L,{label:r(`searchProviderIncludeAnswer`),value:e.includeAnswer?`true`:`false`,options:M,onChange:e=>o(`tavily`,{includeAnswer:e===`true`})})]}),(0,k.jsx)(R,{docsUrl:a})]})}let{brave:s}=t.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:r(`apiKey`),value:s.apiKey,onChange:e=>o(`brave`,{apiKey:e}),placeholder:i.providers.brave.apiKeyMasked||r(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:r(`searchProviderBaseUrl`),value:s.baseUrl,onChange:e=>o(`brave`,{baseUrl:e})})]})}function B(e){let{draft:t,providers:n,search:i,selectedProvider:a,onSelect:o}=e;return(0,k.jsxs)(x,{children:[(0,k.jsx)(S,{className:`px-4 py-4`,children:(0,k.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-gray-500`,children:r(`searchChannels`)})}),(0,k.jsx)(T,{className:`space-y-2 p-3`,children:n.map(e=>{let n=i.providers[e.name],s=t.enabledProviders.includes(e.name);return(0,k.jsx)(D,{onClick:()=>o(e.name),active:a===e.name,className:`p-3`,children:(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`p`,{className:`truncate text-sm font-semibold text-gray-900`,children:e.displayName}),(0,k.jsx)(`p`,{className:`line-clamp-2 text-[11px] text-gray-500`,children:r(N[e.name])})]}),(0,k.jsxs)(`div`,{className:`flex flex-col items-end gap-1`,children:[(0,k.jsx)(`span`,{className:`rounded-full bg-gray-100 px-2 py-0.5 text-[11px] font-medium text-gray-600`,children:n.apiKeySet?r(`searchStatusConfigured`):r(`searchStatusNeedsSetup`)}),s?(0,k.jsx)(`span`,{className:`rounded-full bg-emerald-50 px-2 py-0.5 text-[11px] font-medium text-emerald-700`,children:r(`searchProviderActivated`)}):null]})]})},e.name)})})]})}function V(e){let{initialDraft:t,providers:n,search:i,onSubmit:a,isPending:s}=e,{isMobile:c}=v(),[u,d]=(0,O.useState)(c?null:i.provider),[f,p]=(0,O.useState)(t),m=u&&n.some(e=>e.name===u)?u:c?null:i.provider,h=n.find(e=>e.name===m)??null,_=m?i.providers[m]:null,y=m?f.enabledProviders.includes(m):!1,b=_?.docsUrl??h?.docsUrl;return(0,k.jsxs)(C,{className:`xl:min-h-0`,mobileView:c?m?`detail`:`list`:void 0,onMobileBack:()=>d(null),mobileListLabel:r(`searchPageTitle`),children:[(0,k.jsx)(B,{draft:f,providers:n,search:i,selectedProvider:m??i.provider,onSelect:d}),h?(0,k.jsx)(x,{children:(0,k.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),a(f)},className:`flex min-h-0 flex-1 flex-col`,children:[(0,k.jsx)(S,{className:`px-6 py-5`,children:(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,k.jsx)(`div`,{className:`flex h-10 w-10 items-center justify-center rounded-xl bg-primary text-white`,children:(0,k.jsx)(l,{className:`h-5 w-5`})}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`h3`,{className:`text-lg font-semibold text-gray-900`,children:h.displayName}),(0,k.jsx)(`p`,{className:`text-sm text-gray-500`,children:h.description})]})]}),(0,k.jsx)(o,{type:`button`,variant:y?`secondary`:`outline`,className:`rounded-xl`,onClick:()=>{let e=y?f.enabledProviders.filter(e=>e!==m):m?[...f.enabledProviders,m]:f.enabledProviders,t={...f,enabledProviders:e};p(t),a(t)},children:r(y?`searchProviderDeactivate`:`searchProviderActivate`)})]})}),(0,k.jsxs)(T,{className:`space-y-6 px-6 py-5`,children:[(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:r(`searchActiveProvider`),value:f.activeProvider,options:n.map(e=>({value:e.name,label:e.displayName})),onChange:e=>p({...f,activeProvider:e})}),(0,k.jsx)(I,{label:r(`searchDefaultMaxResults`),value:f.maxResults,onChange:e=>p({...f,maxResults:e}),inputMode:`numeric`})]}),(0,k.jsx)(z,{draft:f,provider:m,search:i,selectedDocsUrl:b,updateProviderDraft:(e,t)=>{p(n=>({...n,providers:{...n.providers,[e]:{...n.providers[e],...t}}}))}})]}),(0,k.jsx)(E,{className:`flex justify-end px-6 py-4`,children:(0,k.jsxs)(o,{type:`submit`,disabled:s,children:[(0,k.jsx)(g,{className:`mr-2 h-4 w-4`}),r(s?`saving`:`saveChanges`)]})})]})}):(0,k.jsx)(w,{children:(0,k.jsx)(`p`,{className:`text-sm text-gray-500`,children:r(`searchNoProviderSelected`)})})]})}function H(){let{data:e}=b(),{data:t}=y(),n=_(),a=t?.search??[],o=e?.search;return!o||a.length===0?(0,k.jsx)(`div`,{className:`p-8`,children:r(`loading`)}):(0,k.jsxs)(i,{className:`pb-0 xl:flex xl:h-full xl:min-h-0 xl:flex-col`,children:[(0,k.jsx)(c,{title:r(`searchPageTitle`),description:r(`searchPageDescription`)}),(0,k.jsx)(V,{initialDraft:P(o),providers:a,search:o,onSubmit:e=>n.mutate({data:F(e)}),isPending:n.isPending},JSON.stringify(o))]})}export{H as SearchConfig};
1
+ import{h as e,i as t,m as n,v as r}from"./react-BaRotFd6.js";import{At as i,Mt as a,Nt as o,jt as s,kt as c}from"./api-BTZui7nj.js";import{t as l}from"./search-lWpOIHEn.js";import{t as u}from"./external-link-C9fbyi6k.js";import{J as d,K as f,X as p,Y as m,bt as h,et as g,q as _,rn as v,tt as y,wt as b}from"./index-DckPGTdM.js";import{a as x,c as S,i as C,n as w,o as T,s as E,t as D}from"./config-split-page-DW8tP9Bc.js";var O=r(e(),1),k=n(),A=[{value:`noLimit`,label:`searchFreshnessNoLimit`},{value:`oneDay`,label:`searchFreshnessOneDay`},{value:`oneWeek`,label:`searchFreshnessOneWeek`},{value:`oneMonth`,label:`searchFreshnessOneMonth`},{value:`oneYear`,label:`searchFreshnessOneYear`}],j=[{value:`basic`,label:`searchDepthBasic`},{value:`advanced`,label:`searchDepthAdvanced`}],M=[{value:`true`,label:`enabled`},{value:`false`,label:`disabled`}],N={bocha:`searchProviderBochaDescription`,tavily:`searchProviderTavilyDescription`,brave:`searchProviderBraveDescription`};function P(e){return{activeProvider:e.provider,enabledProviders:e.enabledProviders,maxResults:String(e.defaults.maxResults),providers:{bocha:{apiKey:``,baseUrl:e.providers.bocha.baseUrl,summary:!!e.providers.bocha.summary,freshness:e.providers.bocha.freshness??`noLimit`},tavily:{apiKey:``,baseUrl:e.providers.tavily.baseUrl,searchDepth:e.providers.tavily.searchDepth??`basic`,includeAnswer:!!e.providers.tavily.includeAnswer},brave:{apiKey:``,baseUrl:e.providers.brave.baseUrl}}}}function F(e){return{provider:e.activeProvider,enabledProviders:e.enabledProviders,defaults:{maxResults:Number(e.maxResults)||10},providers:{bocha:{apiKey:e.providers.bocha.apiKey||void 0,baseUrl:e.providers.bocha.baseUrl,summary:e.providers.bocha.summary,freshness:e.providers.bocha.freshness},tavily:{apiKey:e.providers.tavily.apiKey||void 0,baseUrl:e.providers.tavily.baseUrl,searchDepth:e.providers.tavily.searchDepth,includeAnswer:e.providers.tavily.includeAnswer},brave:{apiKey:e.providers.brave.apiKey||void 0,baseUrl:e.providers.brave.baseUrl}}}}function I(e){let{label:t,value:n,onChange:r,placeholder:i,type:o=`text`,inputMode:c}=e;return(0,k.jsxs)(`div`,{className:`space-y-2`,children:[(0,k.jsx)(s,{children:t}),(0,k.jsx)(a,{type:o,value:n,onChange:e=>r(e.target.value),placeholder:i,inputMode:c,className:`rounded-xl`})]})}function L(e){let{label:n,value:r,options:i,onChange:a}=e;return(0,k.jsxs)(`div`,{className:`space-y-2`,children:[(0,k.jsx)(s,{children:n}),(0,k.jsxs)(f,{value:r,onValueChange:a,children:[(0,k.jsx)(m,{className:`rounded-xl`,children:(0,k.jsx)(p,{})}),(0,k.jsx)(_,{children:i.map(e=>(0,k.jsx)(d,{value:e.value,children:t(e.label)},e.value))})]})]})}function R({docsUrl:e}){return e?(0,k.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,children:(0,k.jsxs)(o,{type:`button`,variant:`outline`,className:`rounded-xl`,children:[(0,k.jsx)(u,{className:`mr-2 h-4 w-4`}),t(`searchProviderOpenDocs`)]})}):null}function z(e){let{draft:n,provider:r,search:i,selectedDocsUrl:a,updateProviderDraft:o}=e;if(r===`bocha`){let{bocha:e}=n.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:t(`apiKey`),value:e.apiKey,onChange:e=>o(`bocha`,{apiKey:e}),placeholder:i.providers.bocha.apiKeyMasked||t(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:t(`searchProviderBaseUrl`),value:e.baseUrl,onChange:e=>o(`bocha`,{baseUrl:e})}),(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:t(`searchProviderSummary`),value:e.summary?`true`:`false`,options:M,onChange:e=>o(`bocha`,{summary:e===`true`})}),(0,k.jsx)(L,{label:t(`searchProviderFreshness`),value:e.freshness,options:A,onChange:e=>o(`bocha`,{freshness:e})})]}),(0,k.jsx)(R,{docsUrl:a??`https://open.bocha.cn`})]})}if(r===`tavily`){let{tavily:e}=n.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:t(`apiKey`),value:e.apiKey,onChange:e=>o(`tavily`,{apiKey:e}),placeholder:i.providers.tavily.apiKeyMasked||t(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:t(`searchProviderBaseUrl`),value:e.baseUrl,onChange:e=>o(`tavily`,{baseUrl:e})}),(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:t(`searchProviderSearchDepth`),value:e.searchDepth,options:j,onChange:e=>o(`tavily`,{searchDepth:e})}),(0,k.jsx)(L,{label:t(`searchProviderIncludeAnswer`),value:e.includeAnswer?`true`:`false`,options:M,onChange:e=>o(`tavily`,{includeAnswer:e===`true`})})]}),(0,k.jsx)(R,{docsUrl:a})]})}let{brave:s}=n.providers;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(I,{label:t(`apiKey`),value:s.apiKey,onChange:e=>o(`brave`,{apiKey:e}),placeholder:i.providers.brave.apiKeyMasked||t(`enterApiKey`),type:`password`}),(0,k.jsx)(I,{label:t(`searchProviderBaseUrl`),value:s.baseUrl,onChange:e=>o(`brave`,{baseUrl:e})})]})}function B(e){let{draft:n,providers:r,search:i,selectedProvider:a,onSelect:o}=e;return(0,k.jsxs)(x,{children:[(0,k.jsx)(S,{className:`px-4 py-4`,children:(0,k.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-gray-500`,children:t(`searchChannels`)})}),(0,k.jsx)(T,{className:`space-y-2 p-3`,children:r.map(e=>{let r=i.providers[e.name],s=n.enabledProviders.includes(e.name);return(0,k.jsx)(D,{onClick:()=>o(e.name),active:a===e.name,className:`p-3`,children:(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`p`,{className:`truncate text-sm font-semibold text-gray-900`,children:e.displayName}),(0,k.jsx)(`p`,{className:`line-clamp-2 text-[11px] text-gray-500`,children:t(N[e.name])})]}),(0,k.jsxs)(`div`,{className:`flex flex-col items-end gap-1`,children:[(0,k.jsx)(`span`,{className:`rounded-full bg-gray-100 px-2 py-0.5 text-[11px] font-medium text-gray-600`,children:r.apiKeySet?t(`searchStatusConfigured`):t(`searchStatusNeedsSetup`)}),s?(0,k.jsx)(`span`,{className:`rounded-full bg-emerald-50 px-2 py-0.5 text-[11px] font-medium text-emerald-700`,children:t(`searchProviderActivated`)}):null]})]})},e.name)})})]})}function V(e){let{initialDraft:n,providers:r,search:i,onSubmit:a,isPending:s}=e,{isMobile:c}=b(),[u,d]=(0,O.useState)(c?null:i.provider),[f,p]=(0,O.useState)(n),m=u&&r.some(e=>e.name===u)?u:c?null:i.provider,h=r.find(e=>e.name===m)??null,g=m?i.providers[m]:null,_=m?f.enabledProviders.includes(m):!1,y=g?.docsUrl??h?.docsUrl;return(0,k.jsxs)(C,{className:`xl:min-h-0`,mobileView:c?m?`detail`:`list`:void 0,onMobileBack:()=>d(null),mobileListLabel:t(`searchPageTitle`),children:[(0,k.jsx)(B,{draft:f,providers:r,search:i,selectedProvider:m??i.provider,onSelect:d}),h?(0,k.jsx)(x,{children:(0,k.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),a(f)},className:`flex min-h-0 flex-1 flex-col`,children:[(0,k.jsx)(S,{className:`px-6 py-5`,children:(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,k.jsx)(`div`,{className:`flex h-10 w-10 items-center justify-center rounded-xl bg-primary text-white`,children:(0,k.jsx)(l,{className:`h-5 w-5`})}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`h3`,{className:`text-lg font-semibold text-gray-900`,children:h.displayName}),(0,k.jsx)(`p`,{className:`text-sm text-gray-500`,children:h.description})]})]}),(0,k.jsx)(o,{type:`button`,variant:_?`secondary`:`outline`,className:`rounded-xl`,onClick:()=>{let e=_?f.enabledProviders.filter(e=>e!==m):m?[...f.enabledProviders,m]:f.enabledProviders,t={...f,enabledProviders:e};p(t),a(t)},children:t(_?`searchProviderDeactivate`:`searchProviderActivate`)})]})}),(0,k.jsxs)(T,{className:`space-y-6 px-6 py-5`,children:[(0,k.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,k.jsx)(L,{label:t(`searchActiveProvider`),value:f.activeProvider,options:r.map(e=>({value:e.name,label:e.displayName})),onChange:e=>p({...f,activeProvider:e})}),(0,k.jsx)(I,{label:t(`searchDefaultMaxResults`),value:f.maxResults,onChange:e=>p({...f,maxResults:e}),inputMode:`numeric`})]}),(0,k.jsx)(z,{draft:f,provider:m,search:i,selectedDocsUrl:y,updateProviderDraft:(e,t)=>{p(n=>({...n,providers:{...n.providers,[e]:{...n.providers[e],...t}}}))}})]}),(0,k.jsx)(E,{className:`flex justify-end px-6 py-4`,children:(0,k.jsxs)(o,{type:`submit`,disabled:s,children:[(0,k.jsx)(v,{className:`mr-2 h-4 w-4`}),t(s?`saving`:`saveChanges`)]})})]})}):(0,k.jsx)(w,{children:(0,k.jsx)(`p`,{className:`text-sm text-gray-500`,children:t(`searchNoProviderSelected`)})})]})}function H(){let{data:e}=g(),{data:n}=y(),r=h(),a=n?.search??[],o=e?.search;return!o||a.length===0?(0,k.jsx)(`div`,{className:`p-8`,children:t(`loading`)}):(0,k.jsxs)(i,{className:`pb-0 xl:flex xl:h-full xl:min-h-0 xl:flex-col`,children:[(0,k.jsx)(c,{title:t(`searchPageTitle`),description:t(`searchPageDescription`)}),(0,k.jsx)(V,{initialDraft:P(o),providers:a,search:o,onSubmit:e=>r.mutate({data:F(e)}),isPending:r.isPending},JSON.stringify(o))]})}export{H as SearchConfig};
@@ -1 +1 @@
1
- import{t as e}from"./createLucideIcon-Cwr2o6Zq.js";var t=e(`ArrowLeft`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),n=e(`Search`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]);export{t as n,n as t};
1
+ import{t as e}from"./createLucideIcon-CA0sgoMJ.js";var t=e(`ArrowLeft`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),n=e(`Search`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]);export{t as n,n as t};
@@ -0,0 +1,3 @@
1
+ import{h as e,i as t,m as n,v as r}from"./react-BaRotFd6.js";import{At as i,Dt as a,Et as o,Lt as s,Mt as c,Nt as l,Ot as u,Tt as d,ft as f,jt as p,kt as m,wt as h}from"./api-BTZui7nj.js";import{t as g}from"./plus-DOwjM_kF.js";import{t as _}from"./save-CG4Hb1u8.js";import{J as v,K as y,Kt as b,X as x,Y as S,et as C,q as w,xt as T}from"./index-DckPGTdM.js";var E=r(e(),1),D=n(),O=[`env`,`file`,`exec`];function k(e=``){return{alias:e,source:`env`,prefix:``,path:``,command:``,argsText:``,cwd:``,timeoutMs:5e3}}function A(){return{path:``,source:`env`,provider:``,id:``}}function j(e,t){return t.source===`env`?{...k(e),source:`env`,prefix:t.prefix??``}:t.source===`file`?{...k(e),source:`file`,path:t.path}:{...k(e),source:`exec`,command:t.command,argsText:(t.args??[]).join(`
2
+ `),cwd:t.cwd??``,timeoutMs:t.timeoutMs??5e3}}function M(e){return e.source===`env`?{source:`env`,...e.prefix.trim()?{prefix:e.prefix.trim()}:{}}:e.source===`file`?{source:`file`,path:e.path.trim(),format:`json`}:{source:`exec`,command:e.command.trim(),args:e.argsText.split(`
3
+ `).map(e=>e.trim()).filter(Boolean),...e.cwd.trim()?{cwd:e.cwd.trim()}:{},timeoutMs:Math.max(1,Math.trunc(e.timeoutMs||5e3))}}function N(e){return e?{enabled:!!e.enabled,defaultEnv:e.defaults.env??``,defaultFile:e.defaults.file??``,defaultExec:e.defaults.exec??``,providers:Object.entries(e.providers).map(([e,t])=>j(e,t)),refs:Object.entries(e.refs).map(([e,t])=>({path:e,source:t.source,provider:t.provider??``,id:t.id}))}:{enabled:!0,defaultEnv:``,defaultFile:``,defaultExec:``,providers:[],refs:[]}}function P(e){return{enabled:e.enabled,defaults:{env:e.defaultEnv||null,file:e.defaultFile||null,exec:e.defaultExec||null},providers:Object.fromEntries(e.providers.map(e=>[e.alias.trim(),M(e)]).filter(([e])=>e)),refs:Object.fromEntries(e.refs.map(e=>[e.path.trim(),{source:e.source,...e.provider.trim()?{provider:e.provider.trim()}:{},id:e.id.trim()}]).filter(([e,t])=>e&&t.id))}}function F(e){let{defaultEnv:n,defaultFile:r,defaultExec:i,providerAliases:s,onChange:c}=e;return(0,D.jsxs)(h,{children:[(0,D.jsxs)(a,{children:[(0,D.jsx)(u,{children:t(`secrets`)}),(0,D.jsx)(o,{children:t(`secretsEnabledHelp`)})]}),(0,D.jsx)(d,{className:`space-y-4`,children:[{label:t(`defaultEnvProvider`),value:n,key:`defaultEnv`},{label:t(`defaultFileProvider`),value:r,key:`defaultFile`},{label:t(`defaultExecProvider`),value:i,key:`defaultExec`}].map(e=>(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(p,{children:e.label}),(0,D.jsxs)(y,{value:e.value||`__none__`,onValueChange:t=>c(e.key,t===`__none__`?``:t),children:[(0,D.jsx)(S,{children:(0,D.jsx)(x,{placeholder:t(`noneOption`)})}),(0,D.jsxs)(w,{children:[(0,D.jsx)(v,{value:`__none__`,children:t(`noneOption`)}),s.map(e=>(0,D.jsx)(v,{value:e,children:e},e))]})]})]},e.key))})]})}function I(e){let{providers:n,onUpdate:r,onRemove:i,onAdd:s}=e;return(0,D.jsxs)(h,{children:[(0,D.jsxs)(a,{children:[(0,D.jsx)(u,{children:t(`secretProvidersTitle`)}),(0,D.jsx)(o,{children:t(`secretProvidersDescription`)})]}),(0,D.jsxs)(d,{className:`space-y-3`,children:[n.map((e,n)=>(0,D.jsxs)(`div`,{className:`space-y-3 rounded-xl border border-gray-200 p-3`,children:[(0,D.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-3`,children:[(0,D.jsx)(c,{value:e.alias,onChange:e=>r(n,{alias:e.target.value}),placeholder:t(`providerAlias`)}),(0,D.jsxs)(y,{value:e.source,onValueChange:e=>r(n,{source:e}),children:[(0,D.jsx)(S,{children:(0,D.jsx)(x,{})}),(0,D.jsx)(w,{children:O.map(e=>(0,D.jsx)(v,{value:e,children:e},e))})]}),(0,D.jsxs)(l,{type:`button`,variant:`outline`,onClick:()=>i(n),children:[(0,D.jsx)(b,{className:`mr-2 h-4 w-4`}),t(`removeProvider`)]})]}),e.source===`env`?(0,D.jsx)(c,{value:e.prefix,onChange:e=>r(n,{prefix:e.target.value}),placeholder:t(`envPrefix`)}):null,e.source===`file`?(0,D.jsx)(c,{value:e.path,onChange:e=>r(n,{path:e.target.value}),placeholder:t(`secretFilePath`)}):null,e.source===`exec`?(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(c,{value:e.command,onChange:e=>r(n,{command:e.target.value}),placeholder:t(`secretExecCommand`)}),(0,D.jsx)(`textarea`,{className:`min-h-[84px] w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono`,value:e.argsText,onChange:e=>r(n,{argsText:e.target.value}),placeholder:t(`secretExecArgs`)}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 gap-2 md:grid-cols-2`,children:[(0,D.jsx)(c,{value:e.cwd,onChange:e=>r(n,{cwd:e.target.value}),placeholder:t(`secretExecCwd`)}),(0,D.jsx)(c,{type:`number`,min:1,value:e.timeoutMs,onChange:e=>r(n,{timeoutMs:Number.parseInt(e.target.value,10)||5e3}),placeholder:t(`secretExecTimeoutMs`)})]})]}):null]},`provider-${n}`)),(0,D.jsxs)(l,{type:`button`,variant:`outline`,onClick:s,children:[(0,D.jsx)(g,{className:`mr-2 h-4 w-4`}),t(`addSecretProvider`)]})]})]})}function L(e){let{refs:n,providerAliases:r,onUpdate:i,onRemove:s,onAdd:f}=e;return(0,D.jsxs)(h,{children:[(0,D.jsxs)(a,{children:[(0,D.jsx)(u,{children:t(`secretRefsTitle`)}),(0,D.jsx)(o,{children:t(`secretRefsDescription`)})]}),(0,D.jsxs)(d,{className:`space-y-3`,children:[n.map((e,n)=>(0,D.jsx)(`div`,{className:`space-y-3 rounded-xl border border-gray-200 p-3`,children:(0,D.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:[(0,D.jsx)(c,{value:e.path,onChange:e=>i(n,{path:e.target.value}),placeholder:t(`secretConfigPath`)}),(0,D.jsx)(c,{value:e.id,onChange:e=>i(n,{id:e.target.value}),placeholder:t(`secretId`)}),(0,D.jsxs)(y,{value:e.source,onValueChange:e=>i(n,{source:e}),children:[(0,D.jsx)(S,{children:(0,D.jsx)(x,{})}),(0,D.jsx)(w,{children:O.map(e=>(0,D.jsx)(v,{value:e,children:e},e))})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-[1fr_auto] gap-2`,children:[(0,D.jsxs)(y,{value:e.provider||`__none__`,onValueChange:e=>i(n,{provider:e===`__none__`?``:e}),children:[(0,D.jsx)(S,{children:(0,D.jsx)(x,{placeholder:t(`secretProviderAlias`)})}),(0,D.jsxs)(w,{children:[(0,D.jsx)(v,{value:`__none__`,children:t(`noneOption`)}),r.map(e=>(0,D.jsx)(v,{value:e,children:e},e))]})]}),(0,D.jsx)(l,{type:`button`,variant:`outline`,onClick:()=>s(n),children:(0,D.jsx)(b,{className:`h-4 w-4`})})]})]})},`ref-${n}`)),(0,D.jsxs)(l,{type:`button`,variant:`outline`,onClick:f,children:[(0,D.jsx)(g,{className:`mr-2 h-4 w-4`}),t(`addSecretRef`)]})]})]})}function R(e){let{initialState:n,isPending:r,onSubmit:c}=e,[p,g]=(0,E.useState)(n),v=(0,E.useMemo)(()=>{let e=p.providers.map(e=>e.alias.trim()).filter(Boolean);return Array.from(new Set(e))},[p.providers]);return(0,D.jsxs)(i,{className:`space-y-6`,children:[(0,D.jsx)(m,{title:t(`secretsPageTitle`),description:t(`secretsPageDescription`)}),(0,D.jsxs)(h,{children:[(0,D.jsxs)(a,{children:[(0,D.jsx)(u,{children:t(`secrets`)}),(0,D.jsx)(o,{children:t(`secretsEnabledHelp`)})]}),(0,D.jsxs)(d,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between rounded-xl border border-gray-200 p-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`text-sm font-medium text-gray-800`,children:t(`enabled`)}),(0,D.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`secretsEnabledHelp`)})]}),(0,D.jsx)(f,{checked:p.enabled,onCheckedChange:e=>g(t=>({...t,enabled:e}))})]}),(0,D.jsx)(F,{defaultEnv:p.defaultEnv,defaultFile:p.defaultFile,defaultExec:p.defaultExec,providerAliases:v,onChange:(e,t)=>g(n=>({...n,[e]:t}))})]})]}),(0,D.jsx)(I,{providers:p.providers,onUpdate:(e,t)=>{g(n=>({...n,providers:n.providers.map((n,r)=>r===e?{...n,...t}:n)}))},onRemove:e=>g(t=>({...t,providers:t.providers.filter((t,n)=>n!==e)})),onAdd:()=>g(e=>({...e,providers:[...e.providers,k()]}))}),(0,D.jsx)(L,{refs:p.refs,providerAliases:v,onUpdate:(e,t)=>{g(n=>({...n,refs:n.refs.map((n,r)=>r===e?{...n,...t}:n)}))},onRemove:e=>g(t=>({...t,refs:t.refs.filter((t,n)=>n!==e)})),onAdd:()=>g(e=>({...e,refs:[...e.refs,A()]}))}),(0,D.jsx)(`div`,{className:`flex justify-end`,children:(0,D.jsxs)(l,{type:`button`,onClick:()=>{try{let e={};for(let[n,r]of p.providers.entries()){let i=r.alias.trim();if(!i)throw Error(`${t(`providerAlias`)} #${n+1} ${t(`isRequired`)}`);if(e[i])throw Error(`${t(`providerAlias`)}: ${i} (${t(`duplicate`)})`);if(r.source===`file`&&!r.path.trim())throw Error(`${t(`secretFilePath`)} #${n+1} ${t(`isRequired`)}`);if(r.source===`exec`&&!r.command.trim())throw Error(`${t(`secretExecCommand`)} #${n+1} ${t(`isRequired`)}`);e[i]=M(r)}let n={};for(let[r,i]of p.refs.entries()){let a=i.path.trim(),o=i.id.trim();if(!a)throw Error(`${t(`secretConfigPath`)} #${r+1} ${t(`isRequired`)}`);if(!o)throw Error(`${t(`secretId`)} #${r+1} ${t(`isRequired`)}`);let s=i.provider.trim();if(s&&!e[s])throw Error(`${t(`secretProviderAlias`)}: ${s} ${t(`notFound`)}`);n[a]={source:i.source,...s?{provider:s}:{},id:o}}c({enabled:p.enabled,defaultEnv:p.defaultEnv.trim(),defaultFile:p.defaultFile.trim(),defaultExec:p.defaultExec.trim(),providers:Object.entries(e).map(([e,t])=>j(e,t)),refs:Object.entries(n).map(([e,t])=>({path:e,source:t.source,provider:t.provider??``,id:t.id}))})}catch(e){s.error(e instanceof Error?e.message:String(e))}},disabled:r,children:[(0,D.jsx)(_,{className:`mr-2 h-4 w-4`}),t(r?`saving`:`save`)]})})]})}function z(){let{data:e,isLoading:n}=C(),r=T();return n?(0,D.jsx)(`div`,{className:`p-8 text-gray-400`,children:t(`loading`)}):(0,D.jsx)(R,{initialState:N(e?.secrets),isPending:r.isPending,onSubmit:e=>r.mutate({data:P(e)})},JSON.stringify(e?.secrets??null))}export{z as SecretsConfig};
@@ -0,0 +1 @@
1
+ import{d as e,h as t,m as n,v as r}from"./react-BaRotFd6.js";import{Pt as i}from"./api-BTZui7nj.js";var a=r(t(),1),o=n(),s=i(`flex items-start justify-between gap-4 rounded-xl border p-4`,{variants:{tone:{default:`border-gray-200 bg-white`,muted:`border-gray-200 bg-gray-50`}},defaultVariants:{tone:`default`}}),c=a.forwardRef(({className:t,tone:n,title:r,description:i,control:a,children:c,...l},u)=>(0,o.jsxs)(`div`,{ref:u,className:e(s({tone:n}),t),...l,children:[(0,o.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2`,children:[(0,o.jsx)(`div`,{className:`text-sm font-medium text-gray-900`,children:r}),i?(0,o.jsx)(`p`,{className:`text-sm leading-6 text-gray-500`,children:i}):null,c]}),a?(0,o.jsx)(`div`,{className:`shrink-0`,children:a}):null]}));c.displayName=`SettingRow`;export{c as t};
@@ -0,0 +1 @@
1
+ import{d as e,h as t,m as n,r}from"./react-BaRotFd6.js";t();var i=n();function a({tabs:t,activeTab:n,onChange:a,className:o}){return(0,i.jsx)(`div`,{className:e(`flex items-center gap-6 border-b border-gray-200/60 mb-6`,o),children:t.map(t=>{let o=n===t.id;return(0,i.jsxs)(`button`,{onClick:()=>a(t.id),className:e(`relative pb-3 text-[14px] font-medium transition-all duration-fast flex items-center gap-1.5`,o?`text-gray-900`:`text-gray-600 hover:text-gray-900`),children:[t.label,t.count!==void 0&&(0,i.jsx)(`span`,{className:e(`text-[11px] font-medium`,`text-gray-500`),children:r(t.count)}),o&&(0,i.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-[2px] bg-primary rounded-full`})]},t.id)})})}export{a as t};
@@ -0,0 +1 @@
1
+ import{d as e,h as t,m as n,v as r}from"./react-BaRotFd6.js";import{Pt as i}from"./api-BTZui7nj.js";var a=r(t(),1),o=n(),s=i(`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-medium`,{variants:{tone:{subtle:`border-gray-200 bg-gray-50 text-gray-600`,neutral:`border-gray-200 bg-white text-gray-600`,success:`border-emerald-200 bg-emerald-50 text-emerald-700`,warning:`border-amber-200 bg-amber-50 text-amber-800`,danger:`border-rose-200 bg-rose-50 text-rose-600`,info:`border-primary/20 bg-primary/10 text-primary`}},defaultVariants:{tone:`subtle`}}),c=a.forwardRef(({className:t,tone:n,...r},i)=>(0,o.jsx)(`span`,{ref:i,className:e(s({tone:n}),t),...r}));c.displayName=`TagChip`;export{c as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./createLucideIcon-CA0sgoMJ.js";var t=e(`X`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
package/dist/index.html CHANGED
@@ -78,23 +78,21 @@
78
78
  })();
79
79
  </script>
80
80
  <title>NextClaw</title>
81
- <script type="module" crossorigin src="/assets/index-DPz9DRZN.js"></script>
82
- <link rel="modulepreload" crossorigin href="/assets/i18n-tWKGEGxB.js">
83
- <link rel="modulepreload" crossorigin href="/assets/api-D3uoaOR8.js">
84
- <link rel="modulepreload" crossorigin href="/assets/es2015-BJw-hrex.js">
85
- <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Cwr2o6Zq.js">
86
- <link rel="modulepreload" crossorigin href="/assets/select-CmmDgG8o.js">
87
- <link rel="modulepreload" crossorigin href="/assets/dist-e5WATjIW.js">
88
- <link rel="modulepreload" crossorigin href="/assets/x-DBP3WiC9.js">
89
- <link rel="modulepreload" crossorigin href="/assets/notice-card-DUDbOvqx.js">
90
- <link rel="modulepreload" crossorigin href="/assets/search-Czito3Dk.js">
91
- <link rel="modulepreload" crossorigin href="/assets/book-open--T9dJHnp.js">
92
- <link rel="modulepreload" crossorigin href="/assets/external-link-CZ9bQY0L.js">
93
- <link rel="modulepreload" crossorigin href="/assets/plus-BqfNq7Tu.js">
94
- <link rel="modulepreload" crossorigin href="/assets/doc-browser-context-CLczyX2Z.js">
95
- <link rel="modulepreload" crossorigin href="/assets/doc-browser-ChY6hMn8.js">
96
- <link rel="modulepreload" crossorigin href="/assets/key-round-B8tTb3ZJ.js">
97
- <link rel="stylesheet" crossorigin href="/assets/index-HvJDzfSU.css">
81
+ <script type="module" crossorigin src="/assets/index-DckPGTdM.js"></script>
82
+ <link rel="modulepreload" crossorigin href="/assets/react-BaRotFd6.js">
83
+ <link rel="modulepreload" crossorigin href="/assets/api-BTZui7nj.js">
84
+ <link rel="modulepreload" crossorigin href="/assets/dist-DNxIa3pe.js">
85
+ <link rel="modulepreload" crossorigin href="/assets/dist-D5zsy7pX.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-CA0sgoMJ.js">
87
+ <link rel="modulepreload" crossorigin href="/assets/x-D6GwT_8k.js">
88
+ <link rel="modulepreload" crossorigin href="/assets/notice-card-CyiVcu_Z.js">
89
+ <link rel="modulepreload" crossorigin href="/assets/search-lWpOIHEn.js">
90
+ <link rel="modulepreload" crossorigin href="/assets/book-open-qc0UVn6m.js">
91
+ <link rel="modulepreload" crossorigin href="/assets/external-link-C9fbyi6k.js">
92
+ <link rel="modulepreload" crossorigin href="/assets/plus-DOwjM_kF.js">
93
+ <link rel="modulepreload" crossorigin href="/assets/doc-browser-context-Do2qSrB8.js">
94
+ <link rel="modulepreload" crossorigin href="/assets/doc-browser-CwyITRXx.js">
95
+ <link rel="stylesheet" crossorigin href="/assets/index-BYRP_BMj.css">
98
96
  </head>
99
97
 
100
98
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ui",
3
- "version": "0.12.35-beta.3",
3
+ "version": "0.12.35-beta.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,14 +28,13 @@
28
28
  "tailwind-merge": "^2.5.4",
29
29
  "zod": "^3.23.8",
30
30
  "zustand": "^5.0.2",
31
- "@nextclaw/agent-chat": "0.1.23-beta.3",
32
- "@nextclaw/agent-chat-ui": "0.3.25-beta.3",
33
- "@nextclaw/client-sdk": "0.1.14-beta.3",
34
- "@nextclaw/ncp": "0.5.18-beta.3",
35
- "@nextclaw/ncp-http-agent-client": "0.3.30-beta.3",
36
- "@nextclaw/ncp-react": "0.4.38-beta.3",
37
- "@nextclaw/shared": "0.1.12-beta.3",
38
- "@nextclaw/server": "0.12.26-beta.3"
31
+ "@nextclaw/agent-chat-ui": "0.3.25-beta.5",
32
+ "@nextclaw/ncp": "0.5.18-beta.5",
33
+ "@nextclaw/client-sdk": "0.1.14-beta.5",
34
+ "@nextclaw/ncp-http-agent-client": "0.3.30-beta.5",
35
+ "@nextclaw/agent-chat": "0.1.23-beta.5",
36
+ "@nextclaw/shared": "0.1.12-beta.5",
37
+ "@nextclaw/ncp-react": "0.4.38-beta.5"
39
38
  },
40
39
  "devDependencies": {
41
40
  "@testing-library/react": "^16.3.0",
@@ -0,0 +1,21 @@
1
+ import { createContext, useContext, useMemo, type ReactNode } from 'react';
2
+ import { getAppPresenter, type AppPresenter } from '@/app/presenters/app.presenter';
3
+
4
+ const AppPresenterContext = createContext<AppPresenter | null>(null);
5
+
6
+ type AppPresenterProviderProps = {
7
+ children: ReactNode;
8
+ };
9
+
10
+ export function AppPresenterProvider({ children }: AppPresenterProviderProps) {
11
+ const presenter = useMemo(() => getAppPresenter(), []);
12
+ return <AppPresenterContext.Provider value={presenter}>{children}</AppPresenterContext.Provider>;
13
+ }
14
+
15
+ export function useAppPresenter() {
16
+ const presenter = useContext(AppPresenterContext);
17
+ if (!presenter) {
18
+ throw new Error('useAppPresenter must be used inside AppPresenterProvider');
19
+ }
20
+ return presenter;
21
+ }
@@ -23,8 +23,8 @@ vi.mock('@/shared/components/doc-browser', () => ({
23
23
  })
24
24
  }));
25
25
 
26
- vi.mock('@/app/components/app-manager-provider', () => ({
27
- useAppManager: () => ({
26
+ vi.mock('@/app/components/app-presenter-provider', () => ({
27
+ useAppPresenter: () => ({
28
28
  accountManager: {
29
29
  openAccountPanel: mocks.openAccountPanel
30
30
  }
@@ -8,7 +8,7 @@ import { BrandHeader } from '@/shared/components/common/brand-header';
8
8
  import { SidebarActionItem, SidebarNavLinkItem, SidebarSelectItem } from '@/app/components/layout/sidebar-items';
9
9
  import { useTheme } from '@/app/components/theme-provider';
10
10
  import { SelectItem } from '@/shared/components/ui/select';
11
- import { useAppManager } from '@/app/components/app-manager-provider';
11
+ import { useAppPresenter } from '@/app/components/app-presenter-provider';
12
12
  import { useRemoteStatus } from '@/features/remote';
13
13
  import { getSettingsNavItems } from '@/app/configs/app-navigation.config';
14
14
  import { useLanguagePreference } from '@/features/settings';
@@ -20,7 +20,7 @@ type SidebarProps = {
20
20
  };
21
21
 
22
22
  export function Sidebar({ mode }: SidebarProps) {
23
- const manager = useAppManager();
23
+ const presenter = useAppPresenter();
24
24
  const docBrowser = useDocBrowser();
25
25
  const remoteStatus = useRemoteStatus();
26
26
  const {
@@ -118,7 +118,7 @@ export function Sidebar({ mode }: SidebarProps) {
118
118
  <div className={cn('shrink-0 border-t border-[#dde0ea] bg-secondary', isSettingsMode ? 'mt-2 pt-3' : 'mt-3 pt-3')}>
119
119
  {isSettingsMode ? (
120
120
  <SidebarActionItem
121
- onClick={() => manager.accountManager.openAccountPanel()}
121
+ onClick={() => presenter.accountManager.openAccountPanel()}
122
122
  icon={KeyRound}
123
123
  label={t('remoteAccountEntryManage')}
124
124
  density="compact"
package/src/app/index.tsx CHANGED
@@ -4,12 +4,13 @@ import { QueryClientProvider } from "@tanstack/react-query";
4
4
  import { Navigate, Route, Routes } from "react-router-dom";
5
5
  import { Toaster } from "sonner";
6
6
  import { appQueryClient } from "@/app-query-client";
7
- import { AppManagerProvider } from "@/app/components/app-manager-provider";
7
+ import { AppPresenterProvider } from "@/app/components/app-presenter-provider";
8
8
  import { AppLayout } from "@/app/components/layout/app-layout";
9
9
  import { LanguageSettingsPage } from "@/features/settings";
10
10
  import { SettingsEntryPage } from "@/app/components/layout/settings-entry-page";
11
11
  import { LoginPage } from "@/components/auth/login-page";
12
12
  import { AccountPanel } from "@/features/account";
13
+ import { ServiceActionAuthorizationDialog } from "@/features/service-apps";
13
14
  import { runtimeUpdateManager, useSystemStatusSources } from "@/features/system-status";
14
15
  import {
15
16
  isTransientAuthStatusBootstrapError,
@@ -211,12 +212,13 @@ function ProtectedApp() {
211
212
  }, []);
212
213
 
213
214
  return (
214
- <AppManagerProvider>
215
+ <AppPresenterProvider>
215
216
  <AppLayout>
216
217
  <ProtectedRoutes />
217
218
  </AppLayout>
218
219
  <AccountPanel />
219
- </AppManagerProvider>
220
+ <ServiceActionAuthorizationDialog />
221
+ </AppPresenterProvider>
220
222
  );
221
223
  }
222
224
 
@@ -0,0 +1,24 @@
1
+ import { AccountManager } from '@/features/account';
2
+ import { PanelAppBridgeManager } from '@/features/panel-apps';
3
+ import { RemoteAccessManager } from '@/features/remote';
4
+ import { ServiceActionAuthorizationManager } from '@/features/service-apps';
5
+
6
+ export class AppPresenter {
7
+ accountManager = new AccountManager();
8
+ serviceActionAuthorizationManager = new ServiceActionAuthorizationManager();
9
+ panelAppBridgeManager = new PanelAppBridgeManager(this.serviceActionAuthorizationManager);
10
+ remoteAccessManager = new RemoteAccessManager({
11
+ accountManager: this.accountManager,
12
+ });
13
+ }
14
+
15
+ let appPresenter: AppPresenter | null = null;
16
+
17
+ export function getAppPresenter() {
18
+ appPresenter ??= new AppPresenter();
19
+ return appPresenter;
20
+ }
21
+
22
+ export function getPresenter() {
23
+ return getAppPresenter();
24
+ }
@@ -11,7 +11,7 @@ import { Label } from "@/shared/components/ui/label";
11
11
  import { NoticeCard } from "@/shared/components/ui/notice-card";
12
12
  import { useRemoteStatus } from "@/features/remote";
13
13
  import { formatDateTime, t } from "@/shared/lib/i18n";
14
- import { useAppManager } from "@/app/components/app-manager-provider";
14
+ import { useAppPresenter } from "@/app/components/app-presenter-provider";
15
15
  import { useAccountStore } from "@/features/account/stores/account.store";
16
16
  import { KeyRound, LogOut, SquareArrowOutUpRight } from "lucide-react";
17
17
  import { useEffect, useState } from "react";
@@ -175,7 +175,7 @@ function SignedOutAccountSection(props: {
175
175
  }
176
176
 
177
177
  export function AccountPanel() {
178
- const manager = useAppManager();
178
+ const presenter = useAppPresenter();
179
179
  const remoteStatus = useRemoteStatus();
180
180
  const panelOpen = useAccountStore((state) => state.panelOpen);
181
181
  const authSessionId = useAccountStore((state) => state.authSessionId);
@@ -189,8 +189,8 @@ export function AccountPanel() {
189
189
  const [savingUsername, setSavingUsername] = useState(false);
190
190
 
191
191
  useEffect(() => {
192
- manager.accountManager.syncRemoteStatus(status);
193
- }, [manager, status]);
192
+ presenter.accountManager.syncRemoteStatus(status);
193
+ }, [presenter, status]);
194
194
 
195
195
  const canSubmitUsername =
196
196
  !savingUsername &&
@@ -202,8 +202,8 @@ export function AccountPanel() {
202
202
  open={panelOpen}
203
203
  onOpenChange={(open) =>
204
204
  open
205
- ? manager.accountManager.openAccountPanel()
206
- : manager.accountManager.closeAccountPanel()
205
+ ? presenter.accountManager.openAccountPanel()
206
+ : presenter.accountManager.closeAccountPanel()
207
207
  }
208
208
  >
209
209
  <DialogContent className="max-w-xl">
@@ -227,13 +227,13 @@ export function AccountPanel() {
227
227
  onSubmitUsername={async () => {
228
228
  setSavingUsername(true);
229
229
  try {
230
- await manager.accountManager.updateUsername(usernameDraft);
230
+ await presenter.accountManager.updateUsername(usernameDraft);
231
231
  } finally {
232
232
  setSavingUsername(false);
233
233
  }
234
234
  }}
235
- onOpenDeviceList={() => manager.accountManager.openNextClawWeb('/account')}
236
- onLogout={() => manager.accountManager.logout()}
235
+ onOpenDeviceList={() => presenter.accountManager.openNextClawWeb('/account')}
236
+ onLogout={() => presenter.accountManager.logout()}
237
237
  />
238
238
  ) : (
239
239
  <SignedOutAccountSection
@@ -242,10 +242,10 @@ export function AccountPanel() {
242
242
  authStatusMessage={authStatusMessage}
243
243
  authVerificationUri={authVerificationUri}
244
244
  onStartBrowserSignIn={() =>
245
- manager.accountManager.startBrowserSignIn()
245
+ presenter.accountManager.startBrowserSignIn()
246
246
  }
247
247
  onResumeBrowserSignIn={() =>
248
- manager.accountManager.resumeBrowserSignIn()
248
+ presenter.accountManager.resumeBrowserSignIn()
249
249
  }
250
250
  />
251
251
  )}
@@ -1,7 +1,4 @@
1
1
  export { AccountPanel } from './components/account-panel';
2
2
  export { LoginPage } from './components/login-page';
3
3
  export { AccountManager } from './managers/account.manager';
4
- export {
5
- useAccountStore,
6
- type AccountPendingAction,
7
- } from './stores/account.store';
4
+ export { useAccountStore } from './stores/account.store';
@@ -8,19 +8,16 @@ import {
8
8
  } from '@/features/remote';
9
9
  import { formatDateTime, t } from '@/shared/lib/i18n';
10
10
  import { toast } from 'sonner';
11
- import type { AccountPendingAction } from '@/features/account/stores/account.store';
12
11
  import { useAccountStore } from '@/features/account/stores/account.store';
13
12
 
14
- type SignedInContinuation = (action: AccountPendingAction, status: RemoteAccessView) => Promise<void>;
13
+ type BrowserSignInCompletion = {
14
+ resolve: (status: RemoteAccessView) => void;
15
+ reject: (error: Error) => void;
16
+ };
15
17
 
16
18
  export class AccountManager {
17
19
  private authPollTimerId: number | null = null;
18
-
19
- private afterSignedIn: SignedInContinuation | null = null;
20
-
21
- bindSignedInContinuation = (handler: SignedInContinuation) => {
22
- this.afterSignedIn = handler;
23
- };
20
+ private browserSignInCompletion: BrowserSignInCompletion | null = null;
24
21
 
25
22
  openAccountPanel = () => {
26
23
  useAccountStore.getState().openPanel();
@@ -35,34 +32,35 @@ export class AccountManager {
35
32
  return;
36
33
  }
37
34
  this.clearPollTimer();
35
+ this.resolveBrowserSignIn(status);
38
36
  useAccountStore.getState().clearBrowserAuth();
39
37
  };
40
38
 
41
- ensureSignedIn = async (params?: { pendingAction?: AccountPendingAction; apiBase?: string }) => {
42
- const status = await ensureRemoteStatus();
39
+ ensureSignedIn = async (params?: { apiBase?: string; status?: RemoteAccessView }) => {
40
+ const status = params?.status ?? (await ensureRemoteStatus());
43
41
  if (status.account.loggedIn) {
44
- return true;
45
- }
46
- if (params?.pendingAction) {
47
- useAccountStore.getState().setPendingAction(params.pendingAction);
42
+ return status;
48
43
  }
49
44
  this.openAccountPanel();
50
- await this.startBrowserSignIn({ apiBase: params?.apiBase, status });
51
- return false;
45
+ return await this.startBrowserSignInAndWait({
46
+ apiBase: params?.apiBase,
47
+ status
48
+ });
49
+ };
50
+
51
+ startBrowserSignInAndWait = async (params?: { apiBase?: string; status?: RemoteAccessView }) => {
52
+ const completion = this.createBrowserSignInCompletion();
53
+ await this.startBrowserSignIn(params);
54
+ return await completion;
52
55
  };
53
56
 
54
57
  startBrowserSignIn = async (params?: {
55
58
  apiBase?: string;
56
59
  status?: RemoteAccessView;
57
- pendingAction?: AccountPendingAction;
58
60
  }) => {
59
61
  try {
60
62
  const apiBase = params?.apiBase;
61
- const pendingAction = params?.pendingAction;
62
63
  const status = params?.status ?? (await ensureRemoteStatus());
63
- if (pendingAction) {
64
- useAccountStore.getState().setPendingAction(pendingAction);
65
- }
66
64
  const result = await startRemoteBrowserAuth({
67
65
  apiBase: resolveRemotePlatformApiBase(status, apiBase)
68
66
  });
@@ -80,6 +78,7 @@ export class AccountManager {
80
78
  this.scheduleBrowserAuthPoll();
81
79
  } catch (error) {
82
80
  const message = error instanceof Error ? error.message : t('remoteBrowserAuthStartFailed');
81
+ this.rejectBrowserSignIn(error);
83
82
  toast.error(`${t('remoteBrowserAuthStartFailed')}: ${message}`);
84
83
  }
85
84
  };
@@ -95,7 +94,7 @@ export class AccountManager {
95
94
  logout = async () => {
96
95
  try {
97
96
  await logoutRemote();
98
- useAccountStore.getState().clearPendingAction();
97
+ this.rejectBrowserSignIn(new Error('Signed out before browser sign-in completed.'));
99
98
  useAccountStore.getState().clearBrowserAuth();
100
99
  await refreshRemoteStatus();
101
100
  toast.success(t('remoteLogoutSuccess'));
@@ -162,6 +161,7 @@ export class AccountManager {
162
161
  }
163
162
  if (result.status === 'expired') {
164
163
  this.clearPollTimer();
164
+ this.rejectBrowserSignIn(new Error(result.message || t('remoteBrowserAuthExpired')));
165
165
  useAccountStore.getState().clearBrowserAuth();
166
166
  toast.error(result.message || t('remoteBrowserAuthExpired'));
167
167
  return;
@@ -169,16 +169,13 @@ export class AccountManager {
169
169
 
170
170
  useAccountStore.getState().setAuthStatusMessage(t('remoteBrowserAuthCompleted'));
171
171
  const nextStatus = await refreshRemoteStatus();
172
- const { pendingAction } = useAccountStore.getState();
173
172
  this.clearPollTimer();
173
+ this.resolveBrowserSignIn(nextStatus);
174
174
  useAccountStore.getState().clearBrowserAuth();
175
175
  toast.success(t('remoteLoginSuccess'));
176
- if (pendingAction && this.afterSignedIn) {
177
- await this.afterSignedIn(pendingAction, nextStatus);
178
- }
179
- useAccountStore.getState().clearPendingAction();
180
176
  } catch (error) {
181
177
  this.clearPollTimer();
178
+ this.rejectBrowserSignIn(error);
182
179
  useAccountStore.getState().clearBrowserAuth();
183
180
  const message = error instanceof Error ? error.message : t('remoteBrowserAuthPollFailed');
184
181
  toast.error(`${t('remoteBrowserAuthPollFailed')}: ${message}`);
@@ -192,6 +189,34 @@ export class AccountManager {
192
189
  }
193
190
  };
194
191
 
192
+ private createBrowserSignInCompletion = () => {
193
+ this.rejectBrowserSignIn(new Error('Browser sign-in was replaced by a newer request.'));
194
+ return new Promise<RemoteAccessView>((resolve, reject) => {
195
+ this.browserSignInCompletion = {
196
+ resolve,
197
+ reject
198
+ };
199
+ });
200
+ };
201
+
202
+ private resolveBrowserSignIn = (status: RemoteAccessView) => {
203
+ const completion = this.browserSignInCompletion;
204
+ if (!completion) {
205
+ return;
206
+ }
207
+ this.browserSignInCompletion = null;
208
+ completion.resolve(status);
209
+ };
210
+
211
+ private rejectBrowserSignIn = (error: unknown) => {
212
+ const completion = this.browserSignInCompletion;
213
+ if (!completion) {
214
+ return;
215
+ }
216
+ this.browserSignInCompletion = null;
217
+ completion.reject(error instanceof Error ? error : new Error(String(error)));
218
+ };
219
+
195
220
  getBrowserAuthSummary = () => {
196
221
  const store = useAccountStore.getState();
197
222
  return {
@@ -1,14 +1,5 @@
1
1
  import { create } from 'zustand';
2
2
 
3
- export type AccountPendingAction =
4
- | {
5
- type: 'enable-remote';
6
- }
7
- | {
8
- type: 'repair-remote';
9
- }
10
- | null;
11
-
12
3
  type AccountStoreState = {
13
4
  panelOpen: boolean;
14
5
  authSessionId: string | null;
@@ -16,11 +7,8 @@ type AccountStoreState = {
16
7
  authExpiresAt: string | null;
17
8
  authStatusMessage: string;
18
9
  authPollIntervalMs: number;
19
- pendingAction: AccountPendingAction;
20
10
  openPanel: () => void;
21
11
  closePanel: () => void;
22
- setPendingAction: (next: AccountPendingAction) => void;
23
- clearPendingAction: () => void;
24
12
  beginBrowserAuth: (payload: {
25
13
  sessionId: string;
26
14
  verificationUri: string;
@@ -40,11 +28,8 @@ export const useAccountStore = create<AccountStoreState>((set) => ({
40
28
  authExpiresAt: null,
41
29
  authStatusMessage: '',
42
30
  authPollIntervalMs: 1500,
43
- pendingAction: null,
44
31
  openPanel: () => set({ panelOpen: true }),
45
32
  closePanel: () => set({ panelOpen: false }),
46
- setPendingAction: (next) => set({ pendingAction: next }),
47
- clearPendingAction: () => set({ pendingAction: null }),
48
33
  beginBrowserAuth: ({ sessionId, verificationUri, expiresAt, intervalMs, statusMessage }) =>
49
34
  set({
50
35
  panelOpen: true,