@nextclaw/ui 0.26.4 → 0.26.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.
- package/CHANGELOG.md +10 -0
- package/dist/.vite/manifest.json +361 -361
- package/dist/assets/{account-panel-DVi_jhkG.js → account-panel-BAH7FW6z.js} +1 -1
- package/dist/assets/{api-BZvNpFOS.js → api-DjiZvIa0.js} +1 -1
- package/dist/assets/app-presenter-provider-CCRFsFYr.js +232 -0
- package/dist/assets/{appearance-settings-page-AZNBzLmT.js → appearance-settings-page-CdP86QJ7.js} +1 -1
- package/dist/assets/{book-open-CmRdT3N1.js → book-open-Bcnn2_uV.js} +1 -1
- package/dist/assets/{card-CdRBL1E0.js → card-Cqs73hGI.js} +1 -1
- package/dist/assets/{channels-list-page-eZN74FN3.js → channels-list-page-5qGagKuE.js} +1 -1
- package/dist/assets/{circle-dashed-HOgt3gIJ.js → circle-dashed-EY1ScSMe.js} +1 -1
- package/dist/assets/{client-DKKbdJ6Q.js → client-CH7w6yRV.js} +1 -1
- package/dist/assets/{config-split-page-BA3V6b3Q.js → config-split-page-CuEGQL8Z.js} +1 -1
- package/dist/assets/{confirm-dialog-8vqYZ0wy.js → confirm-dialog-CxfecBzO.js} +1 -1
- package/dist/assets/{context-menu-DHVVdHzN.js → context-menu-BsCj2fRs.js} +1 -1
- package/dist/assets/{createLucideIcon-DE0sB9Nu.js → createLucideIcon-Cfo2ySi5.js} +1 -1
- package/dist/assets/{desktop-capabilities-page-B9-B9k1A.js → desktop-capabilities-page-BDYITStl.js} +1 -1
- package/dist/assets/{desktop-update-config-Cfr3IRUe.js → desktop-update-config-e-zhkJuS.js} +1 -1
- package/dist/assets/{dialog-BUfWO8hr.js → dialog-QjQoKbIV.js} +1 -1
- package/dist/assets/doc-browser-CLEdkH9z.js +1 -0
- package/dist/assets/{doc-browser-context-ClLgMbxd.js → doc-browser-context-DwgG6wrz.js} +1 -1
- package/dist/assets/{download-CKqS1Ksj.js → download-BoaKzDJk.js} +1 -1
- package/dist/assets/{es2015-BiB05Sav.js → es2015-Bp6cuSGh.js} +1 -1
- package/dist/assets/{extensions-vPD4dGqt.js → extensions-CgShSIkd.js} +1 -1
- package/dist/assets/{eye-bKzylu3p.js → eye-kisejBFH.js} +1 -1
- package/dist/assets/{form-actions-CCoxz33Q.js → form-actions-D9JWSFQu.js} +1 -1
- package/dist/assets/{i18n-OGmF0Ws_.js → i18n-Bm3Ov7Fy.js} +2 -2
- package/dist/assets/{keyboard-shortcuts-settings-page-D8rosOVh.js → keyboard-shortcuts-settings-page-DZ8A1iLg.js} +1 -1
- package/dist/assets/loader-circle-Bd1fTm-x.js +1 -0
- package/dist/assets/{login-page-BT3GV3Sb.js → login-page-C-DvcG3L.js} +1 -1
- package/dist/assets/login-page-D99JjH9F.js +1 -0
- package/dist/assets/{main-bEWCGDHr.js → main-Bt5r6b21.js} +2 -2
- package/dist/assets/main-DXd_aKJV.css +1 -0
- package/dist/assets/main-i18n-catalog.config-D0Ll36J_.js +1 -0
- package/dist/assets/mcp-marketplace-page-DUoGfSmY.js +1 -0
- package/dist/assets/{model-config-page-D21a-BO0.js → model-config-page-9NNf-mzK.js} +1 -1
- package/dist/assets/{navigation-link-DC-Pku0Y.js → navigation-link-CjxNC8aT.js} +1 -1
- package/dist/assets/panel-app-i18n-catalog.config-Ddf2Kv8A.js +1 -0
- package/dist/assets/{panelStandalone-CX8X2hjh.js → panelStandalone-BaUzY8Wy.js} +2 -2
- package/dist/assets/{privacy-settings-page-e0LFHZJm.js → privacy-settings-page-CVMBFuak.js} +1 -1
- package/dist/assets/projects-BEsU3box.js +1 -0
- package/dist/assets/{provider-models-DFQgF4hS.js → provider-models-Dm-pmWAA.js} +1 -1
- package/dist/assets/{provider-scoped-model-input-DaONL0j_.js → provider-scoped-model-input-CzrXg4cX.js} +1 -1
- package/dist/assets/{providers-config-page-CEOhQlMe.js → providers-config-page-839uUADZ.js} +1 -1
- package/dist/assets/{puzzle-D_TiFXOv.js → puzzle-BGvD2DPZ.js} +1 -1
- package/dist/assets/{pwa-C9ac_1dg.js → pwa-DNNK_8E9.js} +1 -1
- package/dist/assets/{refresh-cw-BG8VfcdA.js → refresh-cw-BlXDrVP0.js} +1 -1
- package/dist/assets/remote-B5qIuUbT.js +1 -0
- package/dist/assets/{rotate-cw-DPEegUU2.js → rotate-cw-ei6rPD6z.js} +1 -1
- package/dist/assets/{runtime-config-page-DDT1dVLt.js → runtime-config-page-Bf-4JYxQ.js} +1 -1
- package/dist/assets/{save-CPlctBjT.js → save-DdF-bXgC.js} +1 -1
- package/dist/assets/{search-config-page-CDwmd6eX.js → search-config-page-C0qA3j-T.js} +1 -1
- package/dist/assets/{secrets-config-page-1OvgmwPv.js → secrets-config-page-DxfZWpnk.js} +1 -1
- package/dist/assets/security-config-CItfIQZ4.js +1 -0
- package/dist/assets/{select-Y9IEbx9x.js → select-CWyjnar7.js} +1 -1
- package/dist/assets/{service-apps-panel-DPrLeF3N.js → service-apps-panel-D3SOkRVv.js} +1 -1
- package/dist/assets/{settings-2-CrGx9_De.js → settings-2-CrNhfInU.js} +1 -1
- package/dist/assets/{status-dot-Cb8ewlUr.js → status-dot-C3SRFEta.js} +1 -1
- package/dist/assets/{tag-chip-D-6aPuuh.js → tag-chip-BIuavK2K.js} +1 -1
- package/dist/assets/{theme-provider-BjF1Eowc.js → theme-provider-CWUz4yO9.js} +1 -1
- package/dist/assets/{trash-2-DER2EJKK.js → trash-2-hAbJh9VZ.js} +1 -1
- package/dist/assets/{use-config-BM5jC65L.js → use-config-evzage09.js} +1 -1
- package/dist/assets/{use-desktop-capabilities-ezKJwKqg.js → use-desktop-capabilities-BYDjFlpt.js} +1 -1
- package/dist/assets/{use-viewport-layout-vmbQUNT6.js → use-viewport-layout-D_9XWGDV.js} +1 -1
- package/dist/assets/x-ChPbNv39.js +1 -0
- package/dist/index.html +34 -34
- package/dist/panel-standalone.html +10 -10
- package/package.json +3 -3
- package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -2
- package/src/app/configs/app-navigation.config.ts +7 -2
- package/src/features/chat/features/message/components/chat-message-list.container.tsx +0 -2
- package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +4 -6
- package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +2 -10
- package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
- package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +1 -0
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +3 -3
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +1 -0
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +1 -1
- package/src/features/inbox/pages/inbox-page.test.ts +12 -3
- package/src/features/inbox/pages/inbox-page.tsx +31 -24
- package/src/features/projects/pages/project-home-page.tsx +4 -2
- package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +9 -0
- package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -2
- package/src/platforms/mobile/components/mobile-topbar.tsx +2 -2
- package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +3 -3
- package/src/shared/components/workbench/workbench-surface.tsx +1 -1
- package/src/shared/lib/i18n/locales/en-US/chat.json +1 -2
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +1 -2
- package/dist/assets/app-presenter-provider-BcYL-VNe.js +0 -124
- package/dist/assets/doc-browser-w8q1j0jL.js +0 -1
- package/dist/assets/loader-circle-Clq1Gtb1.js +0 -1
- package/dist/assets/login-page-DKId3By8.js +0 -1
- package/dist/assets/main-i18n-catalog.config-Bpu5GcwF.js +0 -1
- package/dist/assets/main-kqMRTwOs.css +0 -1
- package/dist/assets/mcp-marketplace-page-CZIP6j3L.js +0 -1
- package/dist/assets/panel-app-i18n-catalog.config-D44qmtfk.js +0 -1
- package/dist/assets/projects-Rki7Fmth.js +0 -1
- package/dist/assets/remote-DkSx5x4R.js +0 -1
- package/dist/assets/security-config-Pv4CM-kw.js +0 -1
- package/dist/assets/x-DSz9cGhy.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./chunk-DF37yw5_.js";import{Jn as t,Lt as n,Sn as r,Xn as i,Yn as a,Yt as o,cr as s,gn as c,pn as ee,sr as l,yr as te}from"./api-BZvNpFOS.js";import{t as u}from"./createLucideIcon-DE0sB9Nu.js";import{d,f,l as p,p as ne,s as m}from"./i18n-OGmF0Ws_.js";import{a as re,i as ie,n as ae,o as oe,r as se,t as ce}from"./dialog-BUfWO8hr.js";import{n as h}from"./navigation-history-CzErJuPG.js";var g=u(`Boxes`,[[`path`,{d:`M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z`,key:`lc1i9w`}],[`path`,{d:`m7 16.5-4.74-2.85`,key:`1o9zyk`}],[`path`,{d:`m7 16.5 5-3`,key:`va8pkn`}],[`path`,{d:`M7 16.5v5.17`,key:`jnp8gn`}],[`path`,{d:`M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z`,key:`8zsnat`}],[`path`,{d:`m17 16.5-5-3`,key:`8arw3v`}],[`path`,{d:`m17 16.5 4.74-2.85`,key:`8rfmw`}],[`path`,{d:`M17 16.5v5.17`,key:`k6z78m`}],[`path`,{d:`M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z`,key:`1xygjf`}],[`path`,{d:`M12 8 7.26 5.15`,key:`1vbdud`}],[`path`,{d:`m12 8 4.74-2.85`,key:`3rx089`}],[`path`,{d:`M12 13.5V8`,key:`1io7kd`}]]),_=u(`RotateCcw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),v=u(`ShieldAlert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),le=class{constructor(e){this.authorizationManager=e,this.handleIframeMessage=({event:e,iframe:t})=>{this.isBridgeRequest(e.data)&&(!t?.contentWindow||e.source!==t.contentWindow||this.handleBridgeRequest({event:e,iframe:t},e.data))},this.handleBridgeRequest=async(e,t)=>{try{let n=this.getBridgeContext(t),r=await this.dispatchRequest(n,t);this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!0,data:r})}catch(n){this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!1,error:this.toBridgeError(n)})}},this.dispatchRequest=async(e,t)=>{switch(t.method){case`list`:return await n.serviceApps.listServiceActions({bridgeSessionToken:e.token});case`requestGrant`:return await this.confirmAndGrant(e,this.requireActionId(t));case`revokeGrant`:return await n.serviceApps.revokeServiceAction(this.requireActionId(t),{bridgeSessionToken:e.token});case`invoke`:return await this.invokeWithAuthorization(e,t);case`agent.send`:return await this.sendAgentMessageWithAuthorization(e,t);case`agent.generateObject`:return await this.generateAgentObjectWithAuthorization(e,t);case`verification.list`:return await n.serviceApps.listVerificationRecords({acceptanceId:t.payload?.acceptanceId,appId:t.payload?.appId,limit:t.payload?.limit,bridgeSessionToken:e.token});case`acceptance.status`:return await n.serviceApps.getPortableRuntimeAcceptanceStatus({appId:t.payload?.appId,locale:t.payload?.locale,bridgeSessionToken:e.token});case`acceptance.export`:return await n.serviceApps.exportPortableRuntimeAcceptance({appId:t.payload?.appId,locale:t.payload?.locale,bridgeSessionToken:e.token});default:throw Error(`Unsupported panel bridge method: ${String(t.method)}`)}},this.invokeWithAuthorization=async(e,t)=>{let r=this.requireActionId(t);try{return await n.serviceApps.invokeServiceAction(r,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}catch(i){if(!(i instanceof c)||i.code!==`AUTHORIZATION_REQUIRED`)throw i;return await this.confirmAndGrant(e,r,this.readOptionalRecord(t.payload?.input)),await n.serviceApps.invokeServiceAction(r,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}},this.sendAgentMessageWithAuthorization=async(e,t)=>{try{return await n.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}catch(r){if(!(r instanceof c)||r.code!==`AUTHORIZATION_REQUIRED`)throw r;return await this.confirmAndGrantAgentCapability(e,`agent:send`),await n.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}},this.generateAgentObjectWithAuthorization=async(e,t)=>{try{return await n.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}catch(r){if(!(r instanceof c)||r.code!==`AUTHORIZATION_REQUIRED`)throw r;return await this.confirmAndGrantAgentCapability(e,`agent:generateObject`),await n.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}},this.confirmAndGrantAgentCapability=async(e,t)=>{if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:[{actionId:t,actionTitle:t===`agent:send`?`Send agent message`:`Generate object`,actionDescription:t===`agent:send`?`Send a message to a NextClaw Agent session.`:`Send context to a NextClaw Agent session and receive a structured object.`,risk:`write`}]}))throw new c({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});return await n.panelApps.grantAgentCapability(t,{bridgeSessionToken:e.token})},this.confirmAndGrant=async(e,t,r)=>{let i=await this.listGrantCandidateActions(e,t);if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:i.map(e=>({actionId:e.id,actionTitle:e.title,actionDescription:e.description,risk:e.risk})),inputPreview:this.createInputPreview(r)}))throw new c({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});let a=await n.serviceApps.grantServiceActions(i.map(e=>e.id),{bridgeSessionToken:e.token}),o=a.grants.find(e=>e.actionId===t)??a.grants[0];if(!o)throw Error(`No permission grant returned for ${t}.`);return o},this.listGrantCandidateActions=async(e,t)=>{let r=await n.serviceApps.listServiceActions({bridgeSessionToken:e.token}),i=r.actions.find(e=>e.id===t);if(i&&i.grantState!==`not-granted`)return[i];let a=r.actions.filter(e=>e.grantState===`not-granted`),o=[...a.filter(e=>e.id===t),...a.filter(e=>e.id!==t)];return o.length>0?o:[{appId:i?.appId??t.split(`.`)[0]??t,description:i?.description,id:t,name:i?.name??t,risk:i?.risk??`dangerous`,title:i?.title}]},this.createInputPreview=e=>{if(!(!e||Object.keys(e).length===0))try{let t=JSON.stringify(e,null,2);return t.length>500?`${t.slice(0,500)}...`:t}catch{return`[unserializable input]`}},this.getBridgeContext=e=>({appId:e.appId,token:e.runtimeToken}),this.requireActionId=e=>{let t=e.payload?.actionId?.trim();if(!t)throw Error(`Panel bridge actionId is required.`);return t},this.readOptionalRecord=e=>{if(e!==void 0)return this.requireRecord(e,`input`)},this.readAgentSendRequest=e=>({payload:this.requireRecord(e.payload?.request,`agent.send request`)}),this.readGenerateObjectRequest=e=>({input:this.requireRecord(e.payload?.input,`generateObject input`)}),this.requireRecord=(e,t)=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`${t} is required.`);return e},this.postResponse=(e,t)=>{e.iframe?.contentWindow?.postMessage(t,`*`)},this.toBridgeError=e=>e instanceof c?{code:e.code,message:e.message,details:e.details}:{message:e instanceof Error?e.message:String(e)},this.isBridgeRequest=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`nextclaw:panel-app-service-actions:request`&&typeof t.requestId==`string`&&typeof t.runtimeToken==`string`&&typeof t.appId==`string`&&(t.method===`invoke`||t.method===`agent.send`||t.method===`agent.generateObject`||t.method===`acceptance.export`||t.method===`acceptance.status`||t.method===`list`||t.method===`requestGrant`||t.method===`revokeGrant`||t.method===`verification.list`)}}};function y(){return`service-action-auth-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var b=ee((e,t)=>({pending:null,requestAuthorization:async n=>await new Promise(r=>{t().pending?.resolve(!1),e({pending:{id:y(),...n,resolve:r}})}),resolveAuthorization:n=>{let{pending:r}=t();r&&(r.resolve(n),e({pending:null}))}})),ue=class{constructor(){this.requestAuthorization=async e=>await b.getState().requestAuthorization(e)}},x=class{constructor(){this.serviceActionAuthorizationManager=new ue,this.panelAppBridgeManager=new le(this.serviceActionAuthorizationManager)}},S=e(te(),1),C=s(),w=globalThis,T=w.__NEXTCLAW_PANEL_APP_HOST_CONTEXT__??(0,S.createContext)(null);w.__NEXTCLAW_PANEL_APP_HOST_CONTEXT__=T;function de({children:e,presenter:t}){let n=(0,S.useMemo)(()=>t??new x,[t]);return(0,C.jsx)(T.Provider,{value:n,children:e})}function E(){let e=(0,S.useContext)(T);if(!e)throw Error(`usePanelAppHostPresenter must be used inside PanelAppHostProvider`);return e}var D=[`panel-apps`],O=[`panel-app`];function k(e,t){return e.id===t||e.appId===t}function A(e,t,n){return e&&{...e,entries:e.entries.map(e=>k(e,t)?n(e):e)}}function j(e,t){return A(e,t.id,()=>t)}function fe(e,t){let n=e?.entries.reduce((e,t)=>Math.max(e,t.mainSidebarOrder??-1),-1)??-1;return A(e,t.id,e=>({...e,...typeof t.preferences.favorite==`boolean`?{favorite:t.preferences.favorite}:{},...typeof t.preferences.mainSidebar==`boolean`?t.preferences.mainSidebar?{mainSidebar:!0,mainSidebarOrder:e.mainSidebar?e.mainSidebarOrder:n+1}:{mainSidebar:!1,mainSidebarOrder:void 0}:{}}))}function pe(e={}){return i({queryKey:D,queryFn:()=>n.panelApps.listPanelApps(),enabled:e.enabled??!0,staleTime:0})}function M(e,t={}){return i({queryKey:[...O,e],queryFn:()=>n.panelApps.getPanelApp(e),enabled:!!e&&(t.enabled??!0),staleTime:5e3})}function me(){let e=l();return a({mutationFn:({id:e,preferences:t})=>n.panelApps.updatePanelAppPreferences(e,t),onMutate:async t=>{await e.cancelQueries({queryKey:D});let n=e.getQueryData(D)?.entries.find(e=>k(e,t.id));return e.setQueryData(D,e=>fe(e,t)),{previousEntry:n}},onSuccess:t=>{e.setQueryData(D,e=>j(e,t)),e.setQueryData([...O,t.appId],t)},onError:(n,r,i)=>{let a=i?.previousEntry;a&&e.setQueryData(D,e=>A(e,r.id,()=>a));let o=n instanceof Error?n.message:String(n);t.error(`${m(`panelAppsPreferenceUpdateFailed`)}: ${o}`)}})}function N(){let e=l();return a({mutationFn:e=>n.panelApps.recordPanelAppOpened(e),onSuccess:t=>{e.setQueryData(D,e=>j(e,t)),e.setQueryData([...O,t.appId],t)}})}function P(){let e=l();return a({mutationFn:e=>n.panelApps.grantClient(e),onSuccess:()=>{e.invalidateQueries({queryKey:D}),e.invalidateQueries({queryKey:O})}})}function F(){let e=l();return a({mutationFn:e=>n.panelApps.deletePanelApp(e),onSuccess:()=>{e.invalidateQueries({queryKey:D}),e.invalidateQueries({queryKey:O})}})}function I(){let e=E(),{isPending:t,mutateAsync:n}=P(),r=(0,S.useRef)(new Map);return{ensurePanelAppClientGrant:(0,S.useCallback)(async t=>{if(!t.clientDeclared||t.clientGranted)return!0;let i=r.current.get(t.appId);if(i)return await i;let a=(async()=>await e.serviceActionAuthorizationManager.requestAuthorization({panelAppId:t.appId,actions:[{actionId:`nextclaw.client`,actionTitle:m(`panelAppsClientGrantTitle`),actionDescription:m(`panelAppsClientGrantDescription`),risk:`dangerous`}]})?(await n(t.appId),!0):!1)();r.current.set(t.appId,a);try{return await a}finally{r.current.delete(t.appId)}},[n,e]),isPending:t}}function L(e){let t=l(),r=(0,S.useId)(),{ensurePanelAppClientGrant:a}=I(),o=!!(e?.clientDeclared&&!e.clientGranted),s=i({queryKey:[`panel-app-client-grant`,e?.appId??`none`,e?.clientGranted??!1],queryFn:async()=>await a(e),enabled:o,gcTime:0,retry:!1,staleTime:1/0}),c=e?o?s.isError?`error`:s.isPending?`checking`:s.data?`allowed`:`denied`:`allowed`:`idle`;return i({queryKey:[`panel-app-open`,r,e?.appId??`none`],queryFn:async()=>{let r=await n.panelApps.recordPanelAppOpened(e.id);return t.setQueryData(D,e=>j(e,r)),t.setQueryData([...O,r.appId],r),r},enabled:!!(e&&c===`allowed`),retry:!1,staleTime:1/0}),{retryClientGrant:s.refetch,state:c}}var R=`allow-scripts allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-downloads allow-pointer-lock allow-presentation`;function z(e){e?.focus({preventScroll:!0}),e?.contentWindow?.focus()}function B(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`document`?!0:t.kind===`element`&&Array.isArray(t.path)&&t.path.length>0&&t.path.length<=30&&t.path.every(e=>typeof e?.index==`number`&&Number.isInteger(e.index)&&e.index>=0&&e.index<=1e3&&typeof e.tagName==`string`&&e.tagName.length>0&&e.tagName.length<=32)}function he(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.currentUrl==`string`&&B(t.target)}function ge(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.type===r.scrollMessageType&&t.version===r.version&&B(t.target)&&typeof t.x==`number`&&Number.isFinite(t.x)&&t.x>=0&&typeof t.y==`number`&&Number.isFinite(t.y)&&t.y>=0}function V({currentUrl:e,iframeRef:t,isEnabled:n,restorationKey:i}){let a=i&&e?JSON.stringify([i,e]):null;return(0,S.useEffect)(()=>{if(!e||!n||!a)return;let r=a,i=n=>{n.source!==t.current?.contentWindow||!ge(n.data)||h.save(r,{x:n.data.x,y:n.data.y,payload:{currentUrl:e,target:n.data.target}})};return window.addEventListener(`message`,i),()=>window.removeEventListener(`message`,i)},[e,t,n,a]),(0,S.useCallback)(()=>{if(!e||!n||!a)return;let i=h.read(a);!i||!he(i.payload)||i.payload.currentUrl!==e||t.current?.contentWindow?.postMessage({type:r.restoreScrollMessageType,version:r.version,target:i.payload.target,x:i.x,y:i.y},`*`)},[e,t,n,a])}function H({appId:e,restorationScope:t,unavailableAction:n}){let r=E(),i=M(e),a=(0,S.useRef)(null),o=(0,S.useMemo)(()=>i.data,[i.data]),s=L(o),c=V({currentUrl:o?.contentPath??null,iframeRef:a,isEnabled:!!o,restorationKey:o?`panel-app:${t}:${o.appId}`:null});return(0,S.useEffect)(()=>{let e=e=>{r.panelAppBridgeManager.handleIframeMessage({event:e,iframe:a.current})};return window.addEventListener(`message`,e),()=>window.removeEventListener(`message`,e)},[r]),i.isLoading?(0,C.jsx)(U,{message:m(`panelAppsLoading`)}):i.isError?(0,C.jsx)(U,{message:i.error instanceof Error?i.error.message:m(`panelAppsLoadFailed`),actionLabel:m(`panelAppsTryAgain`),onAction:()=>void i.refetch()}):o?s.state===`checking`||s.state===`idle`?(0,C.jsx)(U,{message:m(`panelAppsCheckingPermission`)}):s.state===`denied`||s.state===`error`?(0,C.jsx)(U,{message:s.state===`denied`?m(`panelAppsPermissionDenied`):m(`panelAppsPermissionFailed`),actionLabel:m(`panelAppsTryAgain`),onAction:()=>void s.retryClientGrant()}):(0,C.jsx)(`div`,{className:`h-full min-h-0 bg-background`,children:(0,C.jsx)(`iframe`,{ref:a,src:o.contentPath,title:o.title,sandbox:R,className:`block h-full w-full border-0 bg-background`,onLoad:c,onPointerOver:e=>z(e.currentTarget)},o.appId)}):(0,C.jsx)(U,{message:m(`panelAppsMainUnavailable`),actionLabel:n?.label,onAction:n?.onAction})}function U({actionLabel:e,message:t,onAction:n}){return(0,C.jsx)(`div`,{className:`flex h-full min-h-0 items-center justify-center bg-background px-6 text-center`,children:(0,C.jsxs)(`div`,{className:`max-w-sm`,children:[(0,C.jsx)(`div`,{className:`mx-auto flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground`,children:n?(0,C.jsx)(_,{className:`h-5 w-5`}):(0,C.jsx)(g,{className:`h-5 w-5`})}),(0,C.jsx)(`p`,{className:`mt-3 text-sm leading-6 text-muted-foreground`,children:t}),e&&n?(0,C.jsx)(`button`,{type:`button`,className:`mt-4 rounded-md border border-border px-3 py-1.5 text-xs font-medium text-foreground transition-colors hover:bg-[var(--interaction-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border`,onClick:n,children:e}):null]})})}var W=(0,S.createContext)(null);function G({children:e}){let[t,n]=(0,S.useState)(()=>d());(0,S.useEffect)(()=>ne(e=>{n(e)}),[]);let r=(0,S.useCallback)(e=>{f(e),n(p())},[]),i=(0,S.useCallback)(()=>{r(t===`en`?`zh`:`en`)},[t,r]),a=(0,S.useMemo)(()=>({language:t,setLanguage:r,toggleLanguage:i}),[t,r,i]);return(0,C.jsx)(W.Provider,{value:a,children:e})}function _e(){let e=(0,S.useContext)(W);if(!e)throw Error(`useI18n must be used within I18nProvider`);return{...e,t:m}}function ve({appId:e}){let t=M(e),n=(0,S.useMemo)(()=>t.data,[t.data]);return(0,S.useEffect)(()=>{let e=document.title;return document.title=`${n?.title??m(`panelAppsTitle`)} · NextClaw`,()=>{document.title=e}},[n?.title]),(0,C.jsx)(`main`,{className:`h-dvh min-h-0 w-full overflow-hidden bg-background`,children:(0,C.jsx)(H,{appId:e,restorationScope:`standalone`})})}function ye(){let e=b(e=>e.pending),t=b(e=>e.resolveAuthorization);return(0,C.jsx)(ce,{open:!!e,onOpenChange:e=>{e||t(!1)},children:(0,C.jsxs)(ae,{className:`[&>:last-child]:hidden`,children:[(0,C.jsxs)(re,{children:[(0,C.jsxs)(oe,{className:`flex items-center gap-2`,children:[(0,C.jsx)(v,{className:`h-4 w-4 text-amber-600`}),m(`serviceActionAuthorizationTitle`)]}),(0,C.jsx)(se,{children:m(`serviceActionAuthorizationDescription`)})]}),e?(0,C.jsxs)(`div`,{className:`space-y-3 rounded-md border border-border bg-muted/60 p-3 text-sm`,children:[(0,C.jsx)(K,{label:m(`serviceActionAuthorizationSource`),value:e.panelAppId}),(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:m(`serviceActionAuthorizationActions`)}),(0,C.jsx)(`div`,{className:`max-h-64 space-y-2 overflow-auto`,children:e.actions.map(e=>(0,C.jsx)(be,{action:e},e.actionId))})]}),e.inputPreview?(0,C.jsx)(K,{label:m(`serviceActionAuthorizationInput`),value:e.inputPreview}):null]}):null,(0,C.jsxs)(ie,{className:`gap-2 sm:gap-0`,children:[(0,C.jsx)(o,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:m(`serviceActionAuthorizationReject`)}),(0,C.jsx)(o,{type:`button`,onClick:()=>t(!0),children:m(`serviceActionAuthorizationAllow`)})]})]})})}function be({action:e}){return(0,C.jsxs)(`div`,{className:`space-y-1 rounded border border-border bg-card px-3 py-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,C.jsx)(`div`,{className:`min-w-0 break-words text-xs font-medium text-foreground`,children:e.actionTitle??e.actionId}),(0,C.jsx)(`div`,{className:`shrink-0 rounded bg-amber-50 px-1.5 py-0.5 text-[11px] font-medium text-amber-700`,children:e.risk??`dangerous`})]}),(0,C.jsx)(`div`,{className:`break-words text-[11px] text-muted-foreground`,children:e.actionId}),e.actionDescription?(0,C.jsx)(`div`,{className:`break-words text-xs text-muted-foreground`,children:e.actionDescription}):null]})}function K({label:e,value:t}){return(0,C.jsxs)(`div`,{className:`grid grid-cols-[5rem_minmax(0,1fr)] gap-3`,children:[(0,C.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:e}),(0,C.jsx)(`div`,{className:`min-w-0 break-words text-xs text-foreground`,children:t})]})}var q=`nextclaw.ui.theme`,J=`work`,Y=[{value:`work`,labelKey:`themeWork`,appearance:`light`},{value:`night`,labelKey:`themeNight`,appearance:`dark`},{value:`charcoal`,labelKey:`themeCharcoal`,appearance:`dark`},{value:`island`,labelKey:`themeIsland`,appearance:`light`},{value:`natural`,labelKey:`themeNatural`,appearance:`light`},{value:`minimal`,labelKey:`themeMinimal`,appearance:`light`},{value:`warm`,labelKey:`themeWarm`,appearance:`light`},{value:`cool`,labelKey:`themeCool`,appearance:`light`},{value:`dawn`,labelKey:`themeDawn`,appearance:`light`},{value:`graphite`,labelKey:`themeGraphite`,appearance:`light`},{value:`probe`,labelKey:`themeProbe`,appearance:`light`}],xe=Y.map(({value:e})=>e),Se=Y.map(({value:e,labelKey:t})=>({value:e,labelKey:t}));function X(e){return typeof e==`string`?xe.includes(e)?e:e===`leaf`?`warm`:null:null}function Z(e){return Y.find(t=>t.value===e)?.appearance??`light`}var Q=new class{constructor(){this.activeTheme=J,this.initialized=!1,this.listeners=new Set,this.resolveInitialTheme=()=>{if(typeof window>`u`)return J;try{let e=X(window.localStorage.getItem(q));if(e)return e}catch{}return J},this.initializeTheme=()=>(this.initialized||=(this.activeTheme=this.resolveInitialTheme(),this.applyThemeAttribute(this.activeTheme),!0),this.activeTheme),this.getTheme=()=>this.initialized?this.activeTheme:this.initializeTheme(),this.setTheme=e=>{this.initializeTheme(),e!==this.activeTheme&&(this.activeTheme=e,this.applyThemeAttribute(this.activeTheme),this.saveTheme(this.activeTheme),this.listeners.forEach(e=>e(this.activeTheme)))},this.subscribeThemeChange=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.applyThemeAttribute=e=>{if(typeof document>`u`)return;let t=Z(e);document.documentElement.setAttribute(`data-theme`,e),document.documentElement.setAttribute(`data-theme-appearance`,t),document.documentElement.style.colorScheme=t},this.saveTheme=e=>{if(!(typeof window>`u`))try{window.localStorage.setItem(q,e)}catch{}}}};function Ce(){return Q.initializeTheme()}function we(){return Q.getTheme()}function Te(e){Q.setTheme(e)}function Ee(e){return Q.subscribeThemeChange(e)}var $=(0,S.createContext)(null);function De({children:e}){let[t,n]=(0,S.useState)(()=>Ce());(0,S.useEffect)(()=>Ee(e=>{n(e)}),[]);let r=(0,S.useCallback)(e=>{Te(e),n(we())},[]),i=(0,S.useMemo)(()=>({theme:t,setTheme:r}),[t,r]);return(0,C.jsx)($.Provider,{value:i,children:e})}function Oe(){let e=(0,S.useContext)($);if(!e)throw Error(`useTheme must be used within ThemeProvider`);return e}export{v as C,x as S,g as T,P as _,Z as a,me as b,ve as c,H as d,V as f,F as g,I as h,Se as i,G as l,z as m,Oe as n,X as o,R as p,J as r,ye as s,De as t,_e as u,pe as v,_ as w,de as x,N as y};
|
|
1
|
+
import{i as e}from"./chunk-DF37yw5_.js";import{Jn as t,Lt as n,Sn as r,Xn as i,Yn as a,Yt as o,cr as s,gn as c,pn as ee,sr as l,yr as te}from"./api-DjiZvIa0.js";import{t as u}from"./createLucideIcon-Cfo2ySi5.js";import{d,f,l as p,p as ne,s as m}from"./i18n-Bm3Ov7Fy.js";import{a as re,i as ie,n as ae,o as oe,r as se,t as ce}from"./dialog-QjQoKbIV.js";import{n as h}from"./navigation-history-CzErJuPG.js";var g=u(`Boxes`,[[`path`,{d:`M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z`,key:`lc1i9w`}],[`path`,{d:`m7 16.5-4.74-2.85`,key:`1o9zyk`}],[`path`,{d:`m7 16.5 5-3`,key:`va8pkn`}],[`path`,{d:`M7 16.5v5.17`,key:`jnp8gn`}],[`path`,{d:`M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z`,key:`8zsnat`}],[`path`,{d:`m17 16.5-5-3`,key:`8arw3v`}],[`path`,{d:`m17 16.5 4.74-2.85`,key:`8rfmw`}],[`path`,{d:`M17 16.5v5.17`,key:`k6z78m`}],[`path`,{d:`M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z`,key:`1xygjf`}],[`path`,{d:`M12 8 7.26 5.15`,key:`1vbdud`}],[`path`,{d:`m12 8 4.74-2.85`,key:`3rx089`}],[`path`,{d:`M12 13.5V8`,key:`1io7kd`}]]),_=u(`RotateCcw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),v=u(`ShieldAlert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),le=class{constructor(e){this.authorizationManager=e,this.handleIframeMessage=({event:e,iframe:t})=>{this.isBridgeRequest(e.data)&&(!t?.contentWindow||e.source!==t.contentWindow||this.handleBridgeRequest({event:e,iframe:t},e.data))},this.handleBridgeRequest=async(e,t)=>{try{let n=this.getBridgeContext(t),r=await this.dispatchRequest(n,t);this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!0,data:r})}catch(n){this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!1,error:this.toBridgeError(n)})}},this.dispatchRequest=async(e,t)=>{switch(t.method){case`list`:return await n.serviceApps.listServiceActions({bridgeSessionToken:e.token});case`requestGrant`:return await this.confirmAndGrant(e,this.requireActionId(t));case`revokeGrant`:return await n.serviceApps.revokeServiceAction(this.requireActionId(t),{bridgeSessionToken:e.token});case`invoke`:return await this.invokeWithAuthorization(e,t);case`agent.send`:return await this.sendAgentMessageWithAuthorization(e,t);case`agent.generateObject`:return await this.generateAgentObjectWithAuthorization(e,t);case`verification.list`:return await n.serviceApps.listVerificationRecords({acceptanceId:t.payload?.acceptanceId,appId:t.payload?.appId,limit:t.payload?.limit,bridgeSessionToken:e.token});case`acceptance.status`:return await n.serviceApps.getPortableRuntimeAcceptanceStatus({appId:t.payload?.appId,locale:t.payload?.locale,bridgeSessionToken:e.token});case`acceptance.export`:return await n.serviceApps.exportPortableRuntimeAcceptance({appId:t.payload?.appId,locale:t.payload?.locale,bridgeSessionToken:e.token});default:throw Error(`Unsupported panel bridge method: ${String(t.method)}`)}},this.invokeWithAuthorization=async(e,t)=>{let r=this.requireActionId(t);try{return await n.serviceApps.invokeServiceAction(r,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}catch(i){if(!(i instanceof c)||i.code!==`AUTHORIZATION_REQUIRED`)throw i;return await this.confirmAndGrant(e,r,this.readOptionalRecord(t.payload?.input)),await n.serviceApps.invokeServiceAction(r,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}},this.sendAgentMessageWithAuthorization=async(e,t)=>{try{return await n.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}catch(r){if(!(r instanceof c)||r.code!==`AUTHORIZATION_REQUIRED`)throw r;return await this.confirmAndGrantAgentCapability(e,`agent:send`),await n.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}},this.generateAgentObjectWithAuthorization=async(e,t)=>{try{return await n.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}catch(r){if(!(r instanceof c)||r.code!==`AUTHORIZATION_REQUIRED`)throw r;return await this.confirmAndGrantAgentCapability(e,`agent:generateObject`),await n.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}},this.confirmAndGrantAgentCapability=async(e,t)=>{if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:[{actionId:t,actionTitle:t===`agent:send`?`Send agent message`:`Generate object`,actionDescription:t===`agent:send`?`Send a message to a NextClaw Agent session.`:`Send context to a NextClaw Agent session and receive a structured object.`,risk:`write`}]}))throw new c({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});return await n.panelApps.grantAgentCapability(t,{bridgeSessionToken:e.token})},this.confirmAndGrant=async(e,t,r)=>{let i=await this.listGrantCandidateActions(e,t);if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:i.map(e=>({actionId:e.id,actionTitle:e.title,actionDescription:e.description,risk:e.risk})),inputPreview:this.createInputPreview(r)}))throw new c({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});let a=await n.serviceApps.grantServiceActions(i.map(e=>e.id),{bridgeSessionToken:e.token}),o=a.grants.find(e=>e.actionId===t)??a.grants[0];if(!o)throw Error(`No permission grant returned for ${t}.`);return o},this.listGrantCandidateActions=async(e,t)=>{let r=await n.serviceApps.listServiceActions({bridgeSessionToken:e.token}),i=r.actions.find(e=>e.id===t);if(i&&i.grantState!==`not-granted`)return[i];let a=r.actions.filter(e=>e.grantState===`not-granted`),o=[...a.filter(e=>e.id===t),...a.filter(e=>e.id!==t)];return o.length>0?o:[{appId:i?.appId??t.split(`.`)[0]??t,description:i?.description,id:t,name:i?.name??t,risk:i?.risk??`dangerous`,title:i?.title}]},this.createInputPreview=e=>{if(!(!e||Object.keys(e).length===0))try{let t=JSON.stringify(e,null,2);return t.length>500?`${t.slice(0,500)}...`:t}catch{return`[unserializable input]`}},this.getBridgeContext=e=>({appId:e.appId,token:e.runtimeToken}),this.requireActionId=e=>{let t=e.payload?.actionId?.trim();if(!t)throw Error(`Panel bridge actionId is required.`);return t},this.readOptionalRecord=e=>{if(e!==void 0)return this.requireRecord(e,`input`)},this.readAgentSendRequest=e=>({payload:this.requireRecord(e.payload?.request,`agent.send request`)}),this.readGenerateObjectRequest=e=>({input:this.requireRecord(e.payload?.input,`generateObject input`)}),this.requireRecord=(e,t)=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`${t} is required.`);return e},this.postResponse=(e,t)=>{e.iframe?.contentWindow?.postMessage(t,`*`)},this.toBridgeError=e=>e instanceof c?{code:e.code,message:e.message,details:e.details}:{message:e instanceof Error?e.message:String(e)},this.isBridgeRequest=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`nextclaw:panel-app-service-actions:request`&&typeof t.requestId==`string`&&typeof t.runtimeToken==`string`&&typeof t.appId==`string`&&(t.method===`invoke`||t.method===`agent.send`||t.method===`agent.generateObject`||t.method===`acceptance.export`||t.method===`acceptance.status`||t.method===`list`||t.method===`requestGrant`||t.method===`revokeGrant`||t.method===`verification.list`)}}};function y(){return`service-action-auth-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var b=ee((e,t)=>({pending:null,requestAuthorization:async n=>await new Promise(r=>{t().pending?.resolve(!1),e({pending:{id:y(),...n,resolve:r}})}),resolveAuthorization:n=>{let{pending:r}=t();r&&(r.resolve(n),e({pending:null}))}})),ue=class{constructor(){this.requestAuthorization=async e=>await b.getState().requestAuthorization(e)}},x=class{constructor(){this.serviceActionAuthorizationManager=new ue,this.panelAppBridgeManager=new le(this.serviceActionAuthorizationManager)}},S=e(te(),1),C=s(),w=globalThis,T=w.__NEXTCLAW_PANEL_APP_HOST_CONTEXT__??(0,S.createContext)(null);w.__NEXTCLAW_PANEL_APP_HOST_CONTEXT__=T;function de({children:e,presenter:t}){let n=(0,S.useMemo)(()=>t??new x,[t]);return(0,C.jsx)(T.Provider,{value:n,children:e})}function E(){let e=(0,S.useContext)(T);if(!e)throw Error(`usePanelAppHostPresenter must be used inside PanelAppHostProvider`);return e}var D=[`panel-apps`],O=[`panel-app`];function k(e,t){return e.id===t||e.appId===t}function A(e,t,n){return e&&{...e,entries:e.entries.map(e=>k(e,t)?n(e):e)}}function j(e,t){return A(e,t.id,()=>t)}function fe(e,t){let n=e?.entries.reduce((e,t)=>Math.max(e,t.mainSidebarOrder??-1),-1)??-1;return A(e,t.id,e=>({...e,...typeof t.preferences.favorite==`boolean`?{favorite:t.preferences.favorite}:{},...typeof t.preferences.mainSidebar==`boolean`?t.preferences.mainSidebar?{mainSidebar:!0,mainSidebarOrder:e.mainSidebar?e.mainSidebarOrder:n+1}:{mainSidebar:!1,mainSidebarOrder:void 0}:{}}))}function pe(e={}){return i({queryKey:D,queryFn:()=>n.panelApps.listPanelApps(),enabled:e.enabled??!0,staleTime:0})}function M(e,t={}){return i({queryKey:[...O,e],queryFn:()=>n.panelApps.getPanelApp(e),enabled:!!e&&(t.enabled??!0),staleTime:5e3})}function me(){let e=l();return a({mutationFn:({id:e,preferences:t})=>n.panelApps.updatePanelAppPreferences(e,t),onMutate:async t=>{await e.cancelQueries({queryKey:D});let n=e.getQueryData(D)?.entries.find(e=>k(e,t.id));return e.setQueryData(D,e=>fe(e,t)),{previousEntry:n}},onSuccess:t=>{e.setQueryData(D,e=>j(e,t)),e.setQueryData([...O,t.appId],t)},onError:(n,r,i)=>{let a=i?.previousEntry;a&&e.setQueryData(D,e=>A(e,r.id,()=>a));let o=n instanceof Error?n.message:String(n);t.error(`${m(`panelAppsPreferenceUpdateFailed`)}: ${o}`)}})}function N(){let e=l();return a({mutationFn:e=>n.panelApps.recordPanelAppOpened(e),onSuccess:t=>{e.setQueryData(D,e=>j(e,t)),e.setQueryData([...O,t.appId],t)}})}function P(){let e=l();return a({mutationFn:e=>n.panelApps.grantClient(e),onSuccess:()=>{e.invalidateQueries({queryKey:D}),e.invalidateQueries({queryKey:O})}})}function F(){let e=l();return a({mutationFn:e=>n.panelApps.deletePanelApp(e),onSuccess:()=>{e.invalidateQueries({queryKey:D}),e.invalidateQueries({queryKey:O})}})}function I(){let e=E(),{isPending:t,mutateAsync:n}=P(),r=(0,S.useRef)(new Map);return{ensurePanelAppClientGrant:(0,S.useCallback)(async t=>{if(!t.clientDeclared||t.clientGranted)return!0;let i=r.current.get(t.appId);if(i)return await i;let a=(async()=>await e.serviceActionAuthorizationManager.requestAuthorization({panelAppId:t.appId,actions:[{actionId:`nextclaw.client`,actionTitle:m(`panelAppsClientGrantTitle`),actionDescription:m(`panelAppsClientGrantDescription`),risk:`dangerous`}]})?(await n(t.appId),!0):!1)();r.current.set(t.appId,a);try{return await a}finally{r.current.delete(t.appId)}},[n,e]),isPending:t}}function L(e){let t=l(),r=(0,S.useId)(),{ensurePanelAppClientGrant:a}=I(),o=!!(e?.clientDeclared&&!e.clientGranted),s=i({queryKey:[`panel-app-client-grant`,e?.appId??`none`,e?.clientGranted??!1],queryFn:async()=>await a(e),enabled:o,gcTime:0,retry:!1,staleTime:1/0}),c=e?o?s.isError?`error`:s.isPending?`checking`:s.data?`allowed`:`denied`:`allowed`:`idle`;return i({queryKey:[`panel-app-open`,r,e?.appId??`none`],queryFn:async()=>{let r=await n.panelApps.recordPanelAppOpened(e.id);return t.setQueryData(D,e=>j(e,r)),t.setQueryData([...O,r.appId],r),r},enabled:!!(e&&c===`allowed`),retry:!1,staleTime:1/0}),{retryClientGrant:s.refetch,state:c}}var R=`allow-scripts allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-downloads allow-pointer-lock allow-presentation`;function z(e){e?.focus({preventScroll:!0}),e?.contentWindow?.focus()}function B(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`document`?!0:t.kind===`element`&&Array.isArray(t.path)&&t.path.length>0&&t.path.length<=30&&t.path.every(e=>typeof e?.index==`number`&&Number.isInteger(e.index)&&e.index>=0&&e.index<=1e3&&typeof e.tagName==`string`&&e.tagName.length>0&&e.tagName.length<=32)}function he(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.currentUrl==`string`&&B(t.target)}function ge(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.type===r.scrollMessageType&&t.version===r.version&&B(t.target)&&typeof t.x==`number`&&Number.isFinite(t.x)&&t.x>=0&&typeof t.y==`number`&&Number.isFinite(t.y)&&t.y>=0}function V({currentUrl:e,iframeRef:t,isEnabled:n,restorationKey:i}){let a=i&&e?JSON.stringify([i,e]):null;return(0,S.useEffect)(()=>{if(!e||!n||!a)return;let r=a,i=n=>{n.source!==t.current?.contentWindow||!ge(n.data)||h.save(r,{x:n.data.x,y:n.data.y,payload:{currentUrl:e,target:n.data.target}})};return window.addEventListener(`message`,i),()=>window.removeEventListener(`message`,i)},[e,t,n,a]),(0,S.useCallback)(()=>{if(!e||!n||!a)return;let i=h.read(a);!i||!he(i.payload)||i.payload.currentUrl!==e||t.current?.contentWindow?.postMessage({type:r.restoreScrollMessageType,version:r.version,target:i.payload.target,x:i.x,y:i.y},`*`)},[e,t,n,a])}function H({appId:e,restorationScope:t,unavailableAction:n}){let r=E(),i=M(e),a=(0,S.useRef)(null),o=(0,S.useMemo)(()=>i.data,[i.data]),s=L(o),c=V({currentUrl:o?.contentPath??null,iframeRef:a,isEnabled:!!o,restorationKey:o?`panel-app:${t}:${o.appId}`:null});return(0,S.useEffect)(()=>{let e=e=>{r.panelAppBridgeManager.handleIframeMessage({event:e,iframe:a.current})};return window.addEventListener(`message`,e),()=>window.removeEventListener(`message`,e)},[r]),i.isLoading?(0,C.jsx)(U,{message:m(`panelAppsLoading`)}):i.isError?(0,C.jsx)(U,{message:i.error instanceof Error?i.error.message:m(`panelAppsLoadFailed`),actionLabel:m(`panelAppsTryAgain`),onAction:()=>void i.refetch()}):o?s.state===`checking`||s.state===`idle`?(0,C.jsx)(U,{message:m(`panelAppsCheckingPermission`)}):s.state===`denied`||s.state===`error`?(0,C.jsx)(U,{message:s.state===`denied`?m(`panelAppsPermissionDenied`):m(`panelAppsPermissionFailed`),actionLabel:m(`panelAppsTryAgain`),onAction:()=>void s.retryClientGrant()}):(0,C.jsx)(`div`,{className:`h-full min-h-0 bg-background`,children:(0,C.jsx)(`iframe`,{ref:a,src:o.contentPath,title:o.title,sandbox:R,className:`block h-full w-full border-0 bg-background`,onLoad:c,onPointerOver:e=>z(e.currentTarget)},o.appId)}):(0,C.jsx)(U,{message:m(`panelAppsMainUnavailable`),actionLabel:n?.label,onAction:n?.onAction})}function U({actionLabel:e,message:t,onAction:n}){return(0,C.jsx)(`div`,{className:`flex h-full min-h-0 items-center justify-center bg-background px-6 text-center`,children:(0,C.jsxs)(`div`,{className:`max-w-sm`,children:[(0,C.jsx)(`div`,{className:`mx-auto flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground`,children:n?(0,C.jsx)(_,{className:`h-5 w-5`}):(0,C.jsx)(g,{className:`h-5 w-5`})}),(0,C.jsx)(`p`,{className:`mt-3 text-sm leading-6 text-muted-foreground`,children:t}),e&&n?(0,C.jsx)(`button`,{type:`button`,className:`mt-4 rounded-md border border-border px-3 py-1.5 text-xs font-medium text-foreground transition-colors hover:bg-[var(--interaction-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border`,onClick:n,children:e}):null]})})}var W=(0,S.createContext)(null);function G({children:e}){let[t,n]=(0,S.useState)(()=>d());(0,S.useEffect)(()=>ne(e=>{n(e)}),[]);let r=(0,S.useCallback)(e=>{f(e),n(p())},[]),i=(0,S.useCallback)(()=>{r(t===`en`?`zh`:`en`)},[t,r]),a=(0,S.useMemo)(()=>({language:t,setLanguage:r,toggleLanguage:i}),[t,r,i]);return(0,C.jsx)(W.Provider,{value:a,children:e})}function _e(){let e=(0,S.useContext)(W);if(!e)throw Error(`useI18n must be used within I18nProvider`);return{...e,t:m}}function ve({appId:e}){let t=M(e),n=(0,S.useMemo)(()=>t.data,[t.data]);return(0,S.useEffect)(()=>{let e=document.title;return document.title=`${n?.title??m(`panelAppsTitle`)} · NextClaw`,()=>{document.title=e}},[n?.title]),(0,C.jsx)(`main`,{className:`h-dvh min-h-0 w-full overflow-hidden bg-background`,children:(0,C.jsx)(H,{appId:e,restorationScope:`standalone`})})}function ye(){let e=b(e=>e.pending),t=b(e=>e.resolveAuthorization);return(0,C.jsx)(ce,{open:!!e,onOpenChange:e=>{e||t(!1)},children:(0,C.jsxs)(ae,{className:`[&>:last-child]:hidden`,children:[(0,C.jsxs)(re,{children:[(0,C.jsxs)(oe,{className:`flex items-center gap-2`,children:[(0,C.jsx)(v,{className:`h-4 w-4 text-amber-600`}),m(`serviceActionAuthorizationTitle`)]}),(0,C.jsx)(se,{children:m(`serviceActionAuthorizationDescription`)})]}),e?(0,C.jsxs)(`div`,{className:`space-y-3 rounded-md border border-border bg-muted/60 p-3 text-sm`,children:[(0,C.jsx)(K,{label:m(`serviceActionAuthorizationSource`),value:e.panelAppId}),(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:m(`serviceActionAuthorizationActions`)}),(0,C.jsx)(`div`,{className:`max-h-64 space-y-2 overflow-auto`,children:e.actions.map(e=>(0,C.jsx)(be,{action:e},e.actionId))})]}),e.inputPreview?(0,C.jsx)(K,{label:m(`serviceActionAuthorizationInput`),value:e.inputPreview}):null]}):null,(0,C.jsxs)(ie,{className:`gap-2 sm:gap-0`,children:[(0,C.jsx)(o,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:m(`serviceActionAuthorizationReject`)}),(0,C.jsx)(o,{type:`button`,onClick:()=>t(!0),children:m(`serviceActionAuthorizationAllow`)})]})]})})}function be({action:e}){return(0,C.jsxs)(`div`,{className:`space-y-1 rounded border border-border bg-card px-3 py-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,C.jsx)(`div`,{className:`min-w-0 break-words text-xs font-medium text-foreground`,children:e.actionTitle??e.actionId}),(0,C.jsx)(`div`,{className:`shrink-0 rounded bg-amber-50 px-1.5 py-0.5 text-[11px] font-medium text-amber-700`,children:e.risk??`dangerous`})]}),(0,C.jsx)(`div`,{className:`break-words text-[11px] text-muted-foreground`,children:e.actionId}),e.actionDescription?(0,C.jsx)(`div`,{className:`break-words text-xs text-muted-foreground`,children:e.actionDescription}):null]})}function K({label:e,value:t}){return(0,C.jsxs)(`div`,{className:`grid grid-cols-[5rem_minmax(0,1fr)] gap-3`,children:[(0,C.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:e}),(0,C.jsx)(`div`,{className:`min-w-0 break-words text-xs text-foreground`,children:t})]})}var q=`nextclaw.ui.theme`,J=`work`,Y=[{value:`work`,labelKey:`themeWork`,appearance:`light`},{value:`night`,labelKey:`themeNight`,appearance:`dark`},{value:`charcoal`,labelKey:`themeCharcoal`,appearance:`dark`},{value:`island`,labelKey:`themeIsland`,appearance:`light`},{value:`natural`,labelKey:`themeNatural`,appearance:`light`},{value:`minimal`,labelKey:`themeMinimal`,appearance:`light`},{value:`warm`,labelKey:`themeWarm`,appearance:`light`},{value:`cool`,labelKey:`themeCool`,appearance:`light`},{value:`dawn`,labelKey:`themeDawn`,appearance:`light`},{value:`graphite`,labelKey:`themeGraphite`,appearance:`light`},{value:`probe`,labelKey:`themeProbe`,appearance:`light`}],xe=Y.map(({value:e})=>e),Se=Y.map(({value:e,labelKey:t})=>({value:e,labelKey:t}));function X(e){return typeof e==`string`?xe.includes(e)?e:e===`leaf`?`warm`:null:null}function Z(e){return Y.find(t=>t.value===e)?.appearance??`light`}var Q=new class{constructor(){this.activeTheme=J,this.initialized=!1,this.listeners=new Set,this.resolveInitialTheme=()=>{if(typeof window>`u`)return J;try{let e=X(window.localStorage.getItem(q));if(e)return e}catch{}return J},this.initializeTheme=()=>(this.initialized||=(this.activeTheme=this.resolveInitialTheme(),this.applyThemeAttribute(this.activeTheme),!0),this.activeTheme),this.getTheme=()=>this.initialized?this.activeTheme:this.initializeTheme(),this.setTheme=e=>{this.initializeTheme(),e!==this.activeTheme&&(this.activeTheme=e,this.applyThemeAttribute(this.activeTheme),this.saveTheme(this.activeTheme),this.listeners.forEach(e=>e(this.activeTheme)))},this.subscribeThemeChange=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.applyThemeAttribute=e=>{if(typeof document>`u`)return;let t=Z(e);document.documentElement.setAttribute(`data-theme`,e),document.documentElement.setAttribute(`data-theme-appearance`,t),document.documentElement.style.colorScheme=t},this.saveTheme=e=>{if(!(typeof window>`u`))try{window.localStorage.setItem(q,e)}catch{}}}};function Ce(){return Q.initializeTheme()}function we(){return Q.getTheme()}function Te(e){Q.setTheme(e)}function Ee(e){return Q.subscribeThemeChange(e)}var $=(0,S.createContext)(null);function De({children:e}){let[t,n]=(0,S.useState)(()=>Ce());(0,S.useEffect)(()=>Ee(e=>{n(e)}),[]);let r=(0,S.useCallback)(e=>{Te(e),n(we())},[]),i=(0,S.useMemo)(()=>({theme:t,setTheme:r}),[t,r]);return(0,C.jsx)($.Provider,{value:i,children:e})}function Oe(){let e=(0,S.useContext)($);if(!e)throw Error(`useTheme must be used within ThemeProvider`);return e}export{v as C,x as S,g as T,P as _,Z as a,me as b,ve as c,H as d,V as f,F as g,I as h,Se as i,G as l,z as m,Oe as n,X as o,R as p,J as r,ye as s,De as t,_e as u,pe as v,_ as w,de as x,N as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
1
|
+
import{t as e}from"./createLucideIcon-Cfo2ySi5.js";var t=e(`Plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),n=e(`Trash2`,[[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`,key:`4alrt4`}],[`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`,key:`v07s0e`}],[`line`,{x1:`10`,x2:`10`,y1:`11`,y2:`17`,key:`1uufr5`}],[`line`,{x1:`14`,x2:`14`,y1:`11`,y2:`17`,key:`xtxkd`}]]);export{t as n,n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{At as e,Ct as t,Dt as n,Et as r,Jn as i,Ot as a,St as o,Tt as s,Xn as c,Yn as l,_t as u,at as d,dt as f,gt as p,ht as m,kt as h,lt as g,mt as _,ot as v,rt as y,sr as b,st as x,ut as S,vt as C,wt as w,yt as T}from"./api-
|
|
1
|
+
import{At as e,Ct as t,Dt as n,Et as r,Jn as i,Ot as a,St as o,Tt as s,Xn as c,Yn as l,_t as u,at as d,dt as f,gt as p,ht as m,kt as h,lt as g,mt as _,ot as v,rt as y,sr as b,st as x,ut as S,vt as C,wt as w,yt as T}from"./api-DjiZvIa0.js";import{s as E}from"./i18n-Bm3Ov7Fy.js";function D(){return c({queryKey:[`config`],queryFn:g,staleTime:3e4,refetchOnWindowFocus:!0})}function O(){return c({queryKey:[`config-meta`],queryFn:S,staleTime:1/0})}function k(){return c({queryKey:[`product-analytics-status`],queryFn:_,staleTime:15e3,refetchOnWindowFocus:!0})}function A(){return c({queryKey:[`providers`],queryFn:u,staleTime:3e4,refetchOnWindowFocus:!0})}function j(){return c({queryKey:[`provider-templates`],queryFn:p,staleTime:1/0})}function M(e={}){return c({queryKey:[`provider-model-catalog`],queryFn:m,staleTime:3e4,refetchInterval:t=>e.pollWhileRefreshing&&t.state.data?.refreshing?1e3:!1,refetchOnMount:e.refreshOnMount?`always`:!0,refetchOnWindowFocus:!0})}function N(){return c({queryKey:[`config-schema`],queryFn:f,staleTime:1/0})}function P(){let e=b();return l({mutationFn:s,onSuccess:()=>{e.invalidateQueries({queryKey:[`config`]}),i.success(E(`configSaved`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function F(){let e=b();return l({mutationFn:({data:e})=>r(e),onSuccess:t=>{e.setQueryData([`config`],e=>e&&{...e,productAnalytics:t}),e.invalidateQueries({queryKey:[`product-analytics-status`]}),i.success(E(`configSavedApplied`))},onError:e=>{i.error(`${E(`configSaveFailed`)}: ${e.message}`)}})}function I(){let e=b();return l({mutationFn:({data:e})=>h(e),onSuccess:()=>{e.invalidateQueries({queryKey:[`config`]}),e.invalidateQueries({queryKey:[`config-meta`]}),i.success(E(`configSavedApplied`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function L(){let e=b();return l({mutationFn:({provider:e,data:t})=>n(e,t),onSuccess:(t,n)=>{e.setQueryData([`providers`],e=>e&&{providers:{...e.providers,[n.provider]:t}}),e.invalidateQueries({queryKey:[`providers`]}),e.invalidateQueries({queryKey:[`config`]}),n.silentSuccess||i.success(E(`configSaved`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function R(){let e=b();return l({mutationFn:({data:e})=>y(e??{}),onSuccess:()=>{e.invalidateQueries({queryKey:[`providers`]}),e.invalidateQueries({queryKey:[`config`]}),i.success(E(`configSaved`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function z(){let e=b();return l({mutationFn:({provider:e})=>d(e),onSuccess:()=>{e.invalidateQueries({queryKey:[`providers`]}),e.invalidateQueries({queryKey:[`config`]}),i.success(E(`configSaved`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function B(){return l({mutationFn:({provider:e,data:n})=>t(e,n)})}function V(){return l({mutationFn:({provider:e,data:t})=>v(e,t)})}function H(){return l({mutationFn:({provider:e,data:t})=>o(e,t)})}function U(){return l({mutationFn:({provider:e,data:t})=>T(e,t)})}function W(){return l({mutationFn:({provider:e})=>C(e)})}function G(){let e=b();return l({mutationFn:({channel:e,data:t})=>w(e,t),onSuccess:()=>{e.invalidateQueries({queryKey:[`config`]}),e.invalidateQueries({queryKey:[`config-meta`]}),i.success(E(`configSavedApplying`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function K(){let e=b();return l({mutationFn:({data:e})=>a(e),onSuccess:()=>{e.invalidateQueries({queryKey:[`config`]}),i.success(E(`configSavedApplied`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function q(){let t=b();return l({mutationFn:({data:t})=>e(t),onSuccess:()=>{t.invalidateQueries({queryKey:[`config`]}),i.success(E(`configSavedApplied`))},onError:e=>{i.error(E(`configSaveFailed`)+`: `+e.message)}})}function J(){return l({mutationFn:({actionId:e,data:t})=>x(e,t),onError:e=>{i.error(E(`error`)+`: `+e.message)}})}export{q as S,P as _,z as a,K as b,W as c,M as d,j as f,G as g,B as h,R as i,U as l,H as m,O as n,V as o,A as p,N as r,J as s,D as t,k as u,F as v,I as x,L as y};
|
package/dist/assets/{use-desktop-capabilities-ezKJwKqg.js → use-desktop-capabilities-BYDjFlpt.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Lt as e,Xn as t,Yn as n,sr as r}from"./api-
|
|
1
|
+
import{Lt as e,Xn as t,Yn as n,sr as r}from"./api-DjiZvIa0.js";var i=new class{constructor(){this.getStatus=async()=>await e.capabilityAccess.getDesktopStatus(),this.listGrants=async()=>await e.capabilityAccess.listDesktopGrants(),this.grantAccess=async t=>await e.capabilityAccess.grantDesktopAccess(t),this.requestSystemPermission=async()=>await e.capabilityAccess.requestDesktopPermissions(),this.openSystemSettings=async()=>await e.capabilityAccess.openDesktopPermissionSettings(),this.revokeGrant=async t=>await e.capabilityAccess.revokeDesktopAccess(t)}},a=[`feature-controls`];function o(){return t({queryKey:a,queryFn:e.featureControls.get})}var s=[`desktop-capability`,`status`],c=[`desktop-capability`,`grants`];function l(){return t({queryKey:s,queryFn:i.getStatus})}function u(){return d(o().data)}function d(e){return e?.desktopAutomation.available===!0}function f(){return t({queryKey:c,queryFn:i.listGrants})}function p(){let e=r();return n({mutationFn:i.requestSystemPermission,onSuccess:async()=>{await e.invalidateQueries({queryKey:s})}})}function m(){return n({mutationFn:i.openSystemSettings})}function h(){let e=r();return n({mutationFn:async e=>await i.revokeGrant(e),onSuccess:async()=>{await e.invalidateQueries({queryKey:c})}})}export{p as a,m as i,f as n,h as o,l as r,i as s,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./chunk-DF37yw5_.js";import{pn as t,yr as n}from"./api-
|
|
1
|
+
import{i as e}from"./chunk-DF37yw5_.js";import{pn as t,yr as n}from"./api-DjiZvIa0.js";import{t as r}from"./createLucideIcon-Cfo2ySi5.js";import{n as i,t as a}from"./middleware-B--6mAUM.js";var o=r(`ArrowLeft`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),s=r(`KeyRound`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),c=r(`Search`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]),l=`nextclaw.app.viewport-layout`,u=1;function d(e){return typeof e!=`number`||!Number.isFinite(e)?`desktop`:e<=767?`mobile`:`desktop`}function f(){let e=typeof window>`u`?null:window.innerWidth??null;return{mode:d(e),width:e,isSidebarCollapsed:!1,isMainSidebarAppGroupCollapsed:!1}}function p(e,t){if(!e||typeof e!=`object`)return null;let n=e[t];return typeof n==`boolean`?n:null}var m=t()(i(()=>f(),{name:l,version:u,storage:a(()=>window.localStorage),partialize:e=>({isSidebarCollapsed:e.isSidebarCollapsed,isMainSidebarAppGroupCollapsed:e.isMainSidebarAppGroupCollapsed}),merge:(e,t)=>{let n=p(e,`isSidebarCollapsed`),r=p(e,`isMainSidebarAppGroupCollapsed`);return{...t,...n===null?{}:{isSidebarCollapsed:n},...r===null?{}:{isMainSidebarAppGroupCollapsed:r}}}})),h=new class{constructor(){this.consumerCount=0,this.started=!1,this.attach=()=>(this.consumerCount+=1,this.consumerCount===1&&this.start(),()=>{this.consumerCount=Math.max(0,this.consumerCount-1),this.consumerCount===0&&this.stop()}),this.start=()=>{this.started||typeof window>`u`||(this.started=!0,window.addEventListener(`resize`,this.handleViewportChange),window.addEventListener(`orientationchange`,this.handleViewportChange),this.syncFromWindow())},this.stop=()=>{!this.started||typeof window>`u`||(window.removeEventListener(`resize`,this.handleViewportChange),window.removeEventListener(`orientationchange`,this.handleViewportChange),this.started=!1)},this.getSnapshot=()=>m.getState(),this.setSidebarCollapsed=e=>{m.setState({isSidebarCollapsed:e})},this.setMainSidebarAppGroupCollapsed=e=>{m.setState({isMainSidebarAppGroupCollapsed:e})},this.collapseSidebarForDenseRightPanels=e=>{if(!e.isDocBrowserOpen||!e.isDocBrowserDocked||!e.isWorkspacePanelOpen)return;let t=this.getSnapshot();if(t.mode!==`desktop`||t.isSidebarCollapsed)return;let n=typeof t.width==`number`?t.width:typeof window>`u`?null:window.innerWidth;typeof n!=`number`||!Number.isFinite(n)||n>1800||this.setSidebarCollapsed(!0)},this.toggleSidebarCollapsed=()=>{m.setState(e=>({isSidebarCollapsed:!e.isSidebarCollapsed}))},this.toggleMainSidebarAppGroupCollapsed=()=>{m.setState(e=>({isMainSidebarAppGroupCollapsed:!e.isMainSidebarAppGroupCollapsed}))},this.resetForTests=()=>{this.consumerCount=0,this.stop(),m.setState(f())},this.handleViewportChange=()=>{this.syncFromWindow()},this.syncFromWindow=()=>{if(typeof window>`u`)return;let e=window.innerWidth??null;m.setState({width:e,mode:d(e)})}}},g=e(n(),1);function _(){return(0,g.useEffect)(()=>h.attach(),[]),{isMobile:m(e=>e.mode)===`mobile`}}export{s as a,c as i,h as n,o,m as r,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-Cfo2ySi5.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
|
@@ -258,47 +258,47 @@
|
|
|
258
258
|
})();
|
|
259
259
|
</script>
|
|
260
260
|
<title>NextClaw</title>
|
|
261
|
-
<script type="module" crossorigin src="/assets/main-
|
|
261
|
+
<script type="module" crossorigin src="/assets/main-Bt5r6b21.js"></script>
|
|
262
262
|
<link rel="modulepreload" crossorigin href="/assets/chunk-DF37yw5_.js">
|
|
263
263
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
|
|
264
|
-
<link rel="modulepreload" crossorigin href="/assets/i18n-
|
|
265
|
-
<link rel="modulepreload" crossorigin href="/assets/api-
|
|
266
|
-
<link rel="modulepreload" crossorigin href="/assets/client-
|
|
267
|
-
<link rel="modulepreload" crossorigin href="/assets/es2015-
|
|
268
|
-
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-
|
|
269
|
-
<link rel="modulepreload" crossorigin href="/assets/select-
|
|
270
|
-
<link rel="modulepreload" crossorigin href="/assets/context-menu-
|
|
271
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
272
|
-
<link rel="modulepreload" crossorigin href="/assets/dialog-
|
|
264
|
+
<link rel="modulepreload" crossorigin href="/assets/i18n-Bm3Ov7Fy.js">
|
|
265
|
+
<link rel="modulepreload" crossorigin href="/assets/api-DjiZvIa0.js">
|
|
266
|
+
<link rel="modulepreload" crossorigin href="/assets/client-CH7w6yRV.js">
|
|
267
|
+
<link rel="modulepreload" crossorigin href="/assets/es2015-Bp6cuSGh.js">
|
|
268
|
+
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Cfo2ySi5.js">
|
|
269
|
+
<link rel="modulepreload" crossorigin href="/assets/select-CWyjnar7.js">
|
|
270
|
+
<link rel="modulepreload" crossorigin href="/assets/context-menu-BsCj2fRs.js">
|
|
271
|
+
<link rel="modulepreload" crossorigin href="/assets/x-ChPbNv39.js">
|
|
272
|
+
<link rel="modulepreload" crossorigin href="/assets/dialog-QjQoKbIV.js">
|
|
273
273
|
<link rel="modulepreload" crossorigin href="/assets/katex-CsAM73R9.js">
|
|
274
|
-
<link rel="modulepreload" crossorigin href="/assets/puzzle-
|
|
274
|
+
<link rel="modulepreload" crossorigin href="/assets/puzzle-BGvD2DPZ.js">
|
|
275
275
|
<link rel="modulepreload" crossorigin href="/assets/middleware-B--6mAUM.js">
|
|
276
|
-
<link rel="modulepreload" crossorigin href="/assets/use-viewport-layout-
|
|
277
|
-
<link rel="modulepreload" crossorigin href="/assets/book-open-
|
|
276
|
+
<link rel="modulepreload" crossorigin href="/assets/use-viewport-layout-D_9XWGDV.js">
|
|
277
|
+
<link rel="modulepreload" crossorigin href="/assets/book-open-Bcnn2_uV.js">
|
|
278
278
|
<link rel="modulepreload" crossorigin href="/assets/navigation-history-CzErJuPG.js">
|
|
279
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-provider-
|
|
280
|
-
<link rel="modulepreload" crossorigin href="/assets/confirm-dialog-
|
|
281
|
-
<link rel="modulepreload" crossorigin href="/assets/download-
|
|
279
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-provider-CWUz4yO9.js">
|
|
280
|
+
<link rel="modulepreload" crossorigin href="/assets/confirm-dialog-CxfecBzO.js">
|
|
281
|
+
<link rel="modulepreload" crossorigin href="/assets/download-BoaKzDJk.js">
|
|
282
282
|
<link rel="modulepreload" crossorigin href="/assets/host-capabilities-DuIFVsvM.js">
|
|
283
|
-
<link rel="modulepreload" crossorigin href="/assets/navigation-link-
|
|
284
|
-
<link rel="modulepreload" crossorigin href="/assets/eye-
|
|
285
|
-
<link rel="modulepreload" crossorigin href="/assets/tag-chip-
|
|
286
|
-
<link rel="modulepreload" crossorigin href="/assets/loader-circle-
|
|
287
|
-
<link rel="modulepreload" crossorigin href="/assets/trash-2-
|
|
288
|
-
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-
|
|
289
|
-
<link rel="modulepreload" crossorigin href="/assets/use-desktop-capabilities-
|
|
290
|
-
<link rel="modulepreload" crossorigin href="/assets/status-dot-
|
|
291
|
-
<link rel="modulepreload" crossorigin href="/assets/doc-browser-context-
|
|
292
|
-
<link rel="modulepreload" crossorigin href="/assets/card-
|
|
293
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-models-
|
|
294
|
-
<link rel="modulepreload" crossorigin href="/assets/use-config-
|
|
295
|
-
<link rel="modulepreload" crossorigin href="/assets/app-presenter-provider-
|
|
296
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-scoped-model-input-
|
|
297
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-2-
|
|
298
|
-
<link rel="modulepreload" crossorigin href="/assets/pwa-
|
|
299
|
-
<link rel="modulepreload" crossorigin href="/assets/login-page-
|
|
283
|
+
<link rel="modulepreload" crossorigin href="/assets/navigation-link-CjxNC8aT.js">
|
|
284
|
+
<link rel="modulepreload" crossorigin href="/assets/eye-kisejBFH.js">
|
|
285
|
+
<link rel="modulepreload" crossorigin href="/assets/tag-chip-BIuavK2K.js">
|
|
286
|
+
<link rel="modulepreload" crossorigin href="/assets/loader-circle-Bd1fTm-x.js">
|
|
287
|
+
<link rel="modulepreload" crossorigin href="/assets/trash-2-hAbJh9VZ.js">
|
|
288
|
+
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-BlXDrVP0.js">
|
|
289
|
+
<link rel="modulepreload" crossorigin href="/assets/use-desktop-capabilities-BYDjFlpt.js">
|
|
290
|
+
<link rel="modulepreload" crossorigin href="/assets/status-dot-C3SRFEta.js">
|
|
291
|
+
<link rel="modulepreload" crossorigin href="/assets/doc-browser-context-DwgG6wrz.js">
|
|
292
|
+
<link rel="modulepreload" crossorigin href="/assets/card-Cqs73hGI.js">
|
|
293
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-models-Dm-pmWAA.js">
|
|
294
|
+
<link rel="modulepreload" crossorigin href="/assets/use-config-evzage09.js">
|
|
295
|
+
<link rel="modulepreload" crossorigin href="/assets/app-presenter-provider-CCRFsFYr.js">
|
|
296
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-scoped-model-input-CzrXg4cX.js">
|
|
297
|
+
<link rel="modulepreload" crossorigin href="/assets/settings-2-CrNhfInU.js">
|
|
298
|
+
<link rel="modulepreload" crossorigin href="/assets/pwa-DNNK_8E9.js">
|
|
299
|
+
<link rel="modulepreload" crossorigin href="/assets/login-page-C-DvcG3L.js">
|
|
300
300
|
<link rel="stylesheet" crossorigin href="/assets/app-presenter-provider-jNGlmBLe.css">
|
|
301
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
301
|
+
<link rel="stylesheet" crossorigin href="/assets/main-DXd_aKJV.css">
|
|
302
302
|
</head>
|
|
303
303
|
|
|
304
304
|
<body>
|
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta name="theme-color" content="#ffffff" />
|
|
7
7
|
<title>Panel App · NextClaw</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/panelStandalone-
|
|
8
|
+
<script type="module" crossorigin src="/assets/panelStandalone-BaUzY8Wy.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-DF37yw5_.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/i18n-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/api-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/client-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/es2015-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/context-menu-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/dialog-
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/i18n-Bm3Ov7Fy.js">
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/api-DjiZvIa0.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/client-CH7w6yRV.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/es2015-Bp6cuSGh.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Cfo2ySi5.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/context-menu-BsCj2fRs.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/x-ChPbNv39.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/dialog-QjQoKbIV.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/navigation-history-CzErJuPG.js">
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-provider-
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-provider-CWUz4yO9.js">
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/panelStandalone-BRg7B1EI.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/ui",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"@nextclaw/agent-chat": "0.3.14",
|
|
38
38
|
"@nextclaw/client-sdk": "0.12.9",
|
|
39
39
|
"@nextclaw/ncp": "0.11.2",
|
|
40
|
-
"@nextclaw/agent-chat-ui": "0.
|
|
41
|
-
"@nextclaw/ncp-react": "0.5.30",
|
|
40
|
+
"@nextclaw/agent-chat-ui": "0.12.0",
|
|
42
41
|
"@nextclaw/ncp-http-agent-client": "0.4.25",
|
|
42
|
+
"@nextclaw/ncp-react": "0.5.30",
|
|
43
43
|
"@nextclaw/ncp-toolkit": "0.6.27",
|
|
44
44
|
"@nextclaw/shared": "0.8.2"
|
|
45
45
|
},
|
|
@@ -29,8 +29,10 @@ describe("panel app main navigation", () => {
|
|
|
29
29
|
describe("project home navigation", () => {
|
|
30
30
|
const translate = (key: string) => key;
|
|
31
31
|
|
|
32
|
-
it("returns project details to the project picker", () => {
|
|
33
|
-
expect(resolveMobileRouteMeta("/projects/example/overview", translate).backTarget).toBe("/
|
|
32
|
+
it("returns project details to their chat source instead of the project picker", () => {
|
|
33
|
+
expect(resolveMobileRouteMeta("/projects/example/overview", translate).backTarget).toBe("/chat");
|
|
34
|
+
expect(resolveMobileRouteMeta("/projects/example/overview", translate, "/chat/session-a").backTarget).toBe("/chat/session-a");
|
|
35
|
+
expect(resolveMobileRouteMeta("/projects/example/overview", translate, "https://example.com").backTarget).toBe("/chat");
|
|
34
36
|
});
|
|
35
37
|
|
|
36
38
|
it("labels scheduled tasks and returns to chat", () => {
|
|
@@ -74,6 +74,10 @@ export function isChatSessionDetailRoute(pathname: string): boolean {
|
|
|
74
74
|
return normalized.startsWith("/chat/") && normalized !== "/chat";
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
export function isInboxDetailRoute(pathname: string): boolean {
|
|
78
|
+
return /^\/inbox\/[^/]+\/?$/i.test(pathname);
|
|
79
|
+
}
|
|
80
|
+
|
|
77
81
|
export function getMobileBottomNavItems(
|
|
78
82
|
translate: Translate,
|
|
79
83
|
): AppNavigationItem[] {
|
|
@@ -207,6 +211,7 @@ export function isSettingsRoute(pathname: string): boolean {
|
|
|
207
211
|
export function resolveMobileRouteMeta(
|
|
208
212
|
pathname: string,
|
|
209
213
|
translate: Translate,
|
|
214
|
+
returnTo?: string,
|
|
210
215
|
): {
|
|
211
216
|
title: string;
|
|
212
217
|
backTarget: string | null;
|
|
@@ -259,8 +264,8 @@ export function resolveMobileRouteMeta(
|
|
|
259
264
|
if (normalized === "/projects" || normalized.startsWith("/projects/")) {
|
|
260
265
|
return {
|
|
261
266
|
title: translate("projectsTitle"),
|
|
262
|
-
backTarget:
|
|
263
|
-
backLabel: translate(
|
|
267
|
+
backTarget: returnTo && /^\/chat(?:[/?]|$)/.test(returnTo) ? returnTo : "/chat",
|
|
268
|
+
backLabel: translate("chat"),
|
|
264
269
|
};
|
|
265
270
|
}
|
|
266
271
|
|
|
@@ -122,8 +122,6 @@ class ChatMessageViewModelAdapter {
|
|
|
122
122
|
message,
|
|
123
123
|
processedLabel,
|
|
124
124
|
language,
|
|
125
|
-
failedLabel: t("chatProcessSummaryError", language),
|
|
126
|
-
stoppedLabel: t("chatProcessSummaryStopped", language),
|
|
127
125
|
});
|
|
128
126
|
const processSummaryLabel = processSummary?.label ?? null;
|
|
129
127
|
const executionPresentation = buildChatMessageExecutionPresentation({
|
|
@@ -31,8 +31,6 @@ const baseAssistantMessage = {
|
|
|
31
31
|
|
|
32
32
|
const summaryLabels = {
|
|
33
33
|
processedLabel: "已处理",
|
|
34
|
-
failedLabel: "处理失败",
|
|
35
|
-
stoppedLabel: "已停止",
|
|
36
34
|
language: "zh" as const,
|
|
37
35
|
};
|
|
38
36
|
|
|
@@ -135,8 +133,8 @@ describe("buildChatMessageProcessSummary", () => {
|
|
|
135
133
|
});
|
|
136
134
|
|
|
137
135
|
it.each([
|
|
138
|
-
["failed", "
|
|
139
|
-
] as const)("
|
|
136
|
+
["failed", "已处理"], ["aborted", "已处理"], ["completed", "已处理"],
|
|
137
|
+
] as const)("keeps the process summary neutral for a %s outcome", (outcome, expected) => {
|
|
140
138
|
const message: NcpMessage = {
|
|
141
139
|
...baseAssistantMessage,
|
|
142
140
|
metadata: { ai_execution: createUnavailableNcpAiExecutionMetadata({
|
|
@@ -146,9 +144,9 @@ describe("buildChatMessageProcessSummary", () => {
|
|
|
146
144
|
expect(buildChatMessageProcessSummary({ ...summaryLabels, message })?.label).toBe(expected);
|
|
147
145
|
});
|
|
148
146
|
|
|
149
|
-
it("
|
|
147
|
+
it("keeps the process summary neutral for an error message", () => {
|
|
150
148
|
expect(buildChatMessageProcessSummary({
|
|
151
149
|
...summaryLabels, message: { ...baseAssistantMessage, status: "error" },
|
|
152
|
-
})?.label).toBe("
|
|
150
|
+
})?.label).toBe("已处理");
|
|
153
151
|
});
|
|
154
152
|
});
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { NcpMessage } from "@nextclaw/ncp";
|
|
2
2
|
import type { ChatMessageProcessSummarySource } from "@/features/chat/types/chat-message.types";
|
|
3
3
|
import { t, type I18nLanguage } from "@/shared/lib/i18n";
|
|
4
4
|
|
|
5
5
|
type BuildChatMessageProcessSummaryParams = {
|
|
6
6
|
message: NcpMessage;
|
|
7
7
|
processedLabel: string;
|
|
8
|
-
failedLabel: string;
|
|
9
|
-
stoppedLabel: string;
|
|
10
8
|
language: I18nLanguage;
|
|
11
9
|
};
|
|
12
10
|
|
|
@@ -78,8 +76,6 @@ function formatLifecycleDuration(message: NcpMessage, language: I18nLanguage): s
|
|
|
78
76
|
* and must not be mixed into this summary.
|
|
79
77
|
*/
|
|
80
78
|
export function buildChatMessageProcessSummary({
|
|
81
|
-
failedLabel,
|
|
82
|
-
stoppedLabel,
|
|
83
79
|
message,
|
|
84
80
|
processedLabel,
|
|
85
81
|
language,
|
|
@@ -88,11 +84,7 @@ export function buildChatMessageProcessSummary({
|
|
|
88
84
|
return undefined;
|
|
89
85
|
}
|
|
90
86
|
const duration = formatLifecycleDuration(message, language);
|
|
91
|
-
const outcome = readNcpAiExecutionMetadata(message.metadata)?.outcome;
|
|
92
|
-
const statusLabel = message.status === "error" || outcome === "failed"
|
|
93
|
-
? failedLabel
|
|
94
|
-
: outcome === "aborted" ? stoppedLabel : processedLabel;
|
|
95
87
|
return {
|
|
96
|
-
label: duration ? `${
|
|
88
|
+
label: duration ? `${processedLabel} ${duration}` : processedLabel,
|
|
97
89
|
};
|
|
98
90
|
}
|
|
@@ -189,6 +189,7 @@ export function buildChatMessageTexts(
|
|
|
189
189
|
copiedMessageLabel: t("chatMessageCopied"),
|
|
190
190
|
excerptCharacterCountTemplate: t("chatWorkspaceExcerptCharacterCount"),
|
|
191
191
|
mermaidDiagramLabel: t("chatMermaidDiagram"),
|
|
192
|
+
frontmatterLabel: t("chatMarkdownFrontmatter"),
|
|
192
193
|
mermaidExpandLabel: t("chatMermaidExpand"),
|
|
193
194
|
mermaidLoadingLabel: t("chatMermaidLoading"),
|
|
194
195
|
mermaidRenderErrorLabel: t("chatMermaidRenderError"),
|
|
@@ -175,6 +175,7 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
|
|
|
175
175
|
{group.projectId ? (
|
|
176
176
|
<Link
|
|
177
177
|
to={`/projects/${encodeURIComponent(group.projectId)}/overview`}
|
|
178
|
+
state={{ returnTo: `${location.pathname}${location.search}` }}
|
|
178
179
|
className="flex h-full min-w-0 flex-1 items-center gap-1.5 rounded-md px-1 text-left focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
|
|
179
180
|
aria-current={isSelected ? "page" : undefined}
|
|
180
181
|
title={group.projectRoot}
|
package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx
CHANGED
|
@@ -115,13 +115,13 @@ export function ChatSessionWorkspaceFileBreadcrumbs({
|
|
|
115
115
|
<div
|
|
116
116
|
data-testid="workspace-file-breadcrumbs"
|
|
117
117
|
title={breadcrumb.fullPath}
|
|
118
|
-
className="flex min-w-0 items-center border-b border-gray-200/80 bg-gray-50/55"
|
|
118
|
+
className="flex h-8 min-w-0 shrink-0 items-center border-b border-gray-200/80 bg-gray-50/55"
|
|
119
119
|
>
|
|
120
120
|
{leading ? <div className="flex h-full shrink-0 items-center pl-1 pr-0.5">{leading}</div> : null}
|
|
121
121
|
<div
|
|
122
122
|
ref={scrollRef}
|
|
123
123
|
data-testid="workspace-file-breadcrumb-scroll"
|
|
124
|
-
className="workspace-horizontal-scrollbar flex min-w-0 flex-1 items-center gap-
|
|
124
|
+
className="workspace-horizontal-scrollbar flex h-full min-w-0 flex-1 items-center gap-1 overflow-x-auto overflow-y-hidden px-1.5"
|
|
125
125
|
>
|
|
126
126
|
<div className="flex min-w-0 flex-1 items-center gap-1 pr-1">
|
|
127
127
|
{breadcrumb.segments.map((segment, index) => (
|
|
@@ -140,7 +140,7 @@ export function ChatSessionWorkspaceFileBreadcrumbs({
|
|
|
140
140
|
</div>
|
|
141
141
|
) : null}
|
|
142
142
|
</div>
|
|
143
|
-
{trailing ? <div className="flex shrink-0 items-center
|
|
143
|
+
{trailing ? <div className="flex h-full shrink-0 items-center pr-1 pl-0.5">{trailing}</div> : null}
|
|
144
144
|
</div>
|
|
145
145
|
);
|
|
146
146
|
}
|
package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx
CHANGED
|
@@ -268,6 +268,7 @@ function WorkspacePreviewBody({
|
|
|
268
268
|
texts={{
|
|
269
269
|
copyCodeLabel: t('chatCodeCopy'),
|
|
270
270
|
copiedCodeLabel: t('chatCodeCopied'),
|
|
271
|
+
frontmatterLabel: t('chatMarkdownFrontmatter'),
|
|
271
272
|
}}
|
|
272
273
|
onFileOpen={onFileOpen}
|
|
273
274
|
resolveFileContentUrl={(action) => buildServerPathContentUrl(action.path, fileBasePath)}
|
package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx
CHANGED
|
@@ -218,7 +218,7 @@ export function WorkspaceTabsBar({
|
|
|
218
218
|
|
|
219
219
|
return (
|
|
220
220
|
<CompactTabStrip
|
|
221
|
-
className="h-
|
|
221
|
+
className="h-8 min-w-0 flex-1 border-0 bg-transparent px-0"
|
|
222
222
|
testId="workspace-tabs-bar"
|
|
223
223
|
scrollTestId="workspace-tabs-scroll"
|
|
224
224
|
tabs={compactTabs}
|
|
@@ -7,6 +7,7 @@ import { InboxPage, resolveInboxFilter } from "@/features/inbox/pages/inbox-page
|
|
|
7
7
|
import { t } from "@/shared/lib/i18n";
|
|
8
8
|
|
|
9
9
|
const mocks = vi.hoisted(() => ({
|
|
10
|
+
isMobile: false,
|
|
10
11
|
prepareChatReference: vi.fn(),
|
|
11
12
|
requestSystemObjectReference: vi.fn(),
|
|
12
13
|
}));
|
|
@@ -28,7 +29,7 @@ vi.mock("@/app/components/app-presenter-provider", () => ({
|
|
|
28
29
|
}));
|
|
29
30
|
|
|
30
31
|
vi.mock("@/app/hooks/use-viewport-layout", () => ({
|
|
31
|
-
useViewportLayout: () => ({ isMobile:
|
|
32
|
+
useViewportLayout: () => ({ isMobile: mocks.isMobile }),
|
|
32
33
|
}));
|
|
33
34
|
|
|
34
35
|
vi.mock("@/features/inbox/hooks/use-inbox-deliveries", () => ({
|
|
@@ -101,6 +102,7 @@ describe("resolveInboxFilter", () => {
|
|
|
101
102
|
describe("InboxPage", () => {
|
|
102
103
|
beforeEach(() => {
|
|
103
104
|
vi.clearAllMocks();
|
|
105
|
+
mocks.isMobile = false;
|
|
104
106
|
mocks.prepareChatReference.mockResolvedValue({
|
|
105
107
|
reference: {
|
|
106
108
|
uri: "nextclaw://objects/inbox-delivery/delivery-1",
|
|
@@ -109,7 +111,8 @@ describe("InboxPage", () => {
|
|
|
109
111
|
});
|
|
110
112
|
});
|
|
111
113
|
|
|
112
|
-
it("opens a draft with the same
|
|
114
|
+
it.each([false, true])("opens a draft with the same system object intent (mobile=%s)", async (isMobile) => {
|
|
115
|
+
mocks.isMobile = isMobile;
|
|
113
116
|
render(
|
|
114
117
|
createElement(
|
|
115
118
|
MemoryRouter,
|
|
@@ -134,7 +137,13 @@ describe("InboxPage", () => {
|
|
|
134
137
|
),
|
|
135
138
|
);
|
|
136
139
|
|
|
137
|
-
|
|
140
|
+
const continueButton = screen.getByRole("button", { name: t("inboxContinueChat") });
|
|
141
|
+
if (isMobile) {
|
|
142
|
+
const moreButton = screen.getByRole("button", { name: t("more") });
|
|
143
|
+
expect(continueButton.compareDocumentPosition(moreButton) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
|
|
144
|
+
expect(screen.getByRole("button", { name: t("inboxTitle") })).toBeTruthy();
|
|
145
|
+
}
|
|
146
|
+
fireEvent.click(continueButton);
|
|
138
147
|
|
|
139
148
|
await waitFor(() => {
|
|
140
149
|
expect(screen.getByTestId("current-path").textContent).toBe(CHAT_DRAFT_SESSION_PATH);
|