@shawnstack/quickforge 1.7.11 → 1.7.12
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/dist/assets/{AgentProfilesPage-Cvb1KTz5.js → AgentProfilesPage-CApCpsDd.js} +1 -1
- package/dist/assets/ChatPanelHost-COTO7swS.js +48 -0
- package/dist/assets/CloudAccountSettingsPage-Be5r3dtv.js +1 -0
- package/dist/assets/{PluginsPage-mLvwvTmL.js → PluginsPage-BIbIDfWY.js} +1 -1
- package/dist/assets/ScheduledTasksPage-BOqmBNCx.js +2 -0
- package/dist/assets/{SettingsWorkspacePage-0OINfEqK.js → SettingsWorkspacePage-BCRtycRN.js} +390 -390
- package/dist/assets/ShareLinksSettingsPage-BrxQacJn.js +1 -0
- package/dist/assets/{SharedConversationPage-C7CDEoX9.js → SharedConversationPage-DJa0M0El.js} +1 -1
- package/dist/assets/TerminalDock-Cqz_9mTC.js +2 -0
- package/dist/assets/WorkspaceInspector-C-GOK81D.js +36 -0
- package/dist/assets/{abnfDiagram-VRR7QNED-CMhVoYUh.js → abnfDiagram-VRR7QNED-DGklo3PO.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-C52qL6Hg.js → architectureDiagram-ZJ3FMSHR-CioWLVTp.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CM3XbLol.js → blockDiagram-677ZJIJ3-BJWBq5e9.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-D7Bh1ui1.js → c4Diagram-LMCZKHZV-BacRvqFK.js} +1 -1
- package/dist/assets/channel-CeXY-wZo.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-xgrtbT8e.js → chunk-32BRIVSS-B53BNE2C.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-CDbaHw80.js → chunk-52WLFC77-CYq4hT4f.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-ZMLUvfLy.js → chunk-C7G6YPKG-KFaGpP_Z.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BcQhaqt7.js → chunk-EX3LRPZG-DqVd_ihG.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-DrnrdrSu.js → chunk-FWX5IMBZ-BxRjZkOP.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-tdc-Z9eW.js → chunk-HOUHSVGY-C9QO8omv.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-Cd7igVGt.js → chunk-ICXQ74PX-ClbGPgLV.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-CLTjV5ov.js → chunk-MOJQB5TN-Ba4wlF1J.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-TgvkXkFX.js → chunk-OGEWGWER-DczhQmcx.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-C5GMVYup.js → chunk-PUDLZKDR-CPWpcKUF.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-fo5-HsqY.js → chunk-Q4XR5HBZ-CiF6T--X.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-CEDazV6w.js → chunk-V7JOEXUC-Dxv0zwmw.js} +1 -1
- package/dist/assets/{chunk-VAUOI2AC-CWYjg8zE.js → chunk-VAUOI2AC-D3J5bw1P.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-C_-eEj-9.js → chunk-VR4S4FIN-BXQSwwII.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-NF-MsJJR.js → chunk-WYO6CB5R-C0azl-fk.js} +2 -2
- package/dist/assets/{chunk-ZGVPDNZ5-CRrAYi4g.js → chunk-ZGVPDNZ5-D_8F4Akx.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-B8M6sf49.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-BY7fzBDH.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-D4sZ7LYI.js → cynefinDiagram-TSTJHNR4-BFlsWz0B.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-BlsnSh-Q.js → dagre-VKFMJZFB-DXhpjlEs.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-DW1yQiRO.js → diagram-FQU43EPY-DRVVOD9k.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-BTUAsFjb.js → diagram-G47NLZAW-BV9Gw1tL.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-BcaomqSd.js → diagram-NH7WQ7WH-CrUkXfRY.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-DDLX7Xwr.js → diagram-OA4YK3LP-CuILjn7v.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-CIave0An.js → diagram-WEI45ONY-nlNN3tWB.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-Cr1Y6lPu.js → ebnfDiagram-CCIWWBDH-BuDgZt9n.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-D3EgiVVH.js → erDiagram-Q63AITRT-MEwxjmtP.js} +1 -1
- package/dist/assets/flowDiagram-23GEKE2U-BiUP-Scq.js +1 -0
- package/dist/assets/{ganttDiagram-NO4QXBWP-B0oyDIqK.js → ganttDiagram-NO4QXBWP-DNw5qghE.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-uQtr6IqK.js → gitGraphDiagram-IHSO6WYX-CaTcakAt.js} +1 -1
- package/dist/assets/index-BWf6y3Kh.css +3 -0
- package/dist/assets/index-D3GWkXJR.js +66 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-B_GzlLIM.js → infoDiagram-FWYZ7A6U-DwfyP7dU.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-CKQIsSdU.js → ishikawaDiagram-FXEZZL3T-CmrzbOCV.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-DrrvzZL1.js → journeyDiagram-5HDEW3XC-CYqe3sgr.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-CJQRTdXz.js → kanban-definition-HUTT4EX6-BMDO_mv0.js} +1 -1
- package/dist/assets/{line-B4DxX7tC.js → line-SbxJR8ZT.js} +1 -1
- package/dist/assets/lit-vendor-CinchGmI.js +2 -0
- package/dist/assets/local-tools-DY0yEU3T.js +350 -0
- package/dist/assets/{mcp-servers-dialog-B2lALtTE.js → mcp-servers-dialog-7Xwu2RVW.js} +2 -2
- package/dist/assets/{mermaid.core-DWpShXCs.js → mermaid.core-CwXTzYjs.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-CEVwZD78.js → mindmap-definition-LN4V7U3C-CLyJ78mO.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-CBLkBdnQ.js → pegDiagram-2B236MQR-4qFznrSw.js} +1 -1
- package/dist/assets/{pi-web-ui-DV5jKjSg.js → pi-web-ui-BNuvqKDT.js} +289 -289
- package/dist/assets/{pieDiagram-ENE6RG2P-8tCnwtWS.js → pieDiagram-ENE6RG2P-141sGxVe.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-CWd28cHF.js → quadrantDiagram-ABIIQ3AL-SUI44pAX.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-CI4ouOBs.js → railroadDiagram-RFXS5EU6-1oiZuYBB.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-DtFz7sw4.js → requirementDiagram-TGXJPOKE-CfVishLi.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB--VeOwwk9.js → sankeyDiagram-HTMAVEWB-DVu7J_Z9.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-B8AHk5Oe.js → sequenceDiagram-DBY2YBRQ-D-Ip2yiS.js} +1 -1
- package/dist/assets/{skills-dialog-DYp35JM3.js → skills-dialog-C_JvWbAa.js} +3 -3
- package/dist/assets/{stateDiagram-2N3HPSRC-etXnJ8X8.js → stateDiagram-2N3HPSRC-Cg0hWwrp.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-DhmzNQd9.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-pabIKAmn.js → swimlanes-5IMT3BWC-Co5D-cGU.js} +1 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-BEvomQNa.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-C55MKm3L.js → timeline-definition-FHXFAJF6-CBk4c_Ua.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-CgNf1Q9W.js → vennDiagram-L72KCM5P-BII7wdRx.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-Drt5ytec.js → wardleyDiagram-EHGQE667-CkyJJIXP.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-hhoEo_Ar.js → xychartDiagram-FW5EYKEG-B1A66Ks0.js} +1 -1
- package/dist/index.html +6 -6
- package/package.json +1 -1
- package/server/agent-manager.mjs +130 -2
- package/server/approval-store.mjs +1 -0
- package/server/ask-store.mjs +78 -0
- package/server/routes/agent.mjs +9 -0
- package/server/session-state-import.mjs +20 -3
- package/server/tools/definitions.mjs +18 -0
- package/server/tools/index.mjs +14 -2
- package/dist/assets/ChatPanelHost-C7zV-xE_.js +0 -48
- package/dist/assets/CloudAccountSettingsPage-mAs_nbvw.js +0 -1
- package/dist/assets/ScheduledTasksPage-CuUW_9lq.js +0 -2
- package/dist/assets/ShareLinksSettingsPage-DqeyJYoD.js +0 -1
- package/dist/assets/TerminalDock-CZXcuMpq.js +0 -2
- package/dist/assets/WorkspaceInspector-CNSBOEvP.js +0 -36
- package/dist/assets/channel-Duu1CuH9.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Cc63fLWP.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-CoXU0qT6.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-BS7KXcqn.js +0 -1
- package/dist/assets/index-BgMvQW1b.js +0 -66
- package/dist/assets/index-CB1g2D0f.css +0 -3
- package/dist/assets/lit-vendor-DvaQX_UQ.js +0 -2
- package/dist/assets/local-tools-Dopjg9xq.js +0 -270
- package/dist/assets/stateDiagram-v2-6OUMAXLB-Dms3pICj.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-B14aWjv6.js +0 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{E as t,Jt as n,X as r,b as i,bt as a,ht as o,j as s,mt as c,s as l,w as u}from"./icons-DM_qJ7VJ.js";import{n as d}from"./react-vendor-BpWW_Nvp.js";import{D as f,Dt as p,E as m,In as h,Ln as g,Mn as _,Tt as v,_ as y,b,g as x,v as S,w as C,x as w,y as T}from"./index-D3GWkXJR.js";var E=e(n(),1),D=d(),O=[{value:`1h`,hours:1},{value:`24h`,hours:24},{value:`7d`,hours:168},{value:`never`}];function k(e){return e.url||`${window.location.origin}/share/${encodeURIComponent(e.id)}`}function A(e){if(!e)return`-`;let t=new Date(e);return Number.isNaN(t.getTime())?`-`:t.toLocaleString(h())}function j(e){return g(e===`disabled`?`shareStatusDisabled`:e===`expired`?`shareStatusExpired`:`shareStatusActive`)}function M(e){return e===`disabled`?`quickforge-settings-badge-muted`:e===`expired`?`quickforge-settings-badge-warning`:`quickforge-settings-badge-success`}function N(e){let t=O.find(t=>t.value===e);return t&&`hours`in t?y(t.hours):void 0}function P({share:e,onClose:t,onSaved:n}){let[r,i]=(0,E.useState)(e.permission),[a,o]=(0,E.useState)(``),[s,c]=(0,E.useState)(!1),[d,f]=(0,E.useState)(e.allowCloudUsage===!0),[p,h]=(0,E.useState)(`keep`),[v,y]=(0,E.useState)(!1),[x,S]=(0,E.useState)(``),C=r===`operate`,w=s?!1:!!(e.hasPassword||a.trim()),T=async()=>{if(C&&!w){S(g(`operateRequiresPassword`));return}y(!0),S(``);try{let i=s?``:a?a.trim():void 0,o=p===`keep`?void 0:N(p);n((await m(e.id,{permission:r,password:i,expiresAt:o,allowCloudUsage:r===`operate`&&d})).share),t()}catch(e){S(e instanceof Error?e.message:g(`requestFailed`)),y(!1)}};return(0,D.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/45 p-4`,onMouseDown:e=>{e.target===e.currentTarget&&t()},children:(0,D.jsxs)(`div`,{className:`flex max-h-[85vh] w-full max-w-md flex-col overflow-hidden rounded-2xl border border-border bg-background shadow-quickforge`,onMouseDown:e=>e.stopPropagation(),children:[(0,D.jsxs)(`div`,{className:`shrink-0 border-b border-border px-5 py-4`,children:[(0,D.jsx)(`h2`,{className:`text-base font-semibold`,children:g(`editShareTitle`)}),(0,D.jsx)(`p`,{className:`mt-1 truncate text-sm text-muted-foreground`,children:e.titleSnapshot||g(`untitledConversation`)})]}),(0,D.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`mb-2 text-sm font-medium`,children:g(`sharePermissionTitle`)}),(0,D.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,D.jsxs)(`button`,{type:`button`,className:`rounded-xl border p-3 text-left text-sm ${r===`read`?`border-primary bg-primary/10`:`border-border`}`,onClick:()=>i(`read`),children:[(0,D.jsx)(`div`,{className:`font-medium`,children:g(`sharePermissionRead`)}),(0,D.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:g(`sharePermissionReadHint`)})]}),(0,D.jsxs)(`button`,{type:`button`,className:`rounded-xl border p-3 text-left text-sm ${r===`operate`?`border-red-400 bg-red-50 text-red-950`:`border-border`}`,onClick:()=>i(`operate`),children:[(0,D.jsx)(`div`,{className:`font-medium text-red-700`,children:g(`sharePermissionOperate`)}),(0,D.jsx)(`div`,{className:`mt-1 text-xs text-red-700`,children:g(`sharePermissionOperateHint`)})]})]})]}),r===`operate`?(0,D.jsxs)(`label`,{className:`flex items-start gap-2 rounded-xl border border-border bg-muted/20 p-3 text-xs font-medium`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked)}),(0,D.jsx)(`span`,{children:`允许该分享使用宿主机的 QuickForge Cloud 模型和额度。默认关闭。`})]}):null,(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(`label`,{className:`block text-sm font-medium`,children:g(`sharePasswordTitle`)}),(0,D.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:items-center`,children:[(0,D.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),disabled:s,className:`h-10 w-full min-w-0 rounded-md border border-input bg-background px-3 text-sm`,placeholder:e.hasPassword?g(`sharePasswordPlaceholderKeep`):g(`sharePasswordPlaceholderNone`),type:`text`,autoComplete:`new-password`}),(0,D.jsxs)(_,{variant:`outline`,className:`h-10 sm:shrink-0`,onClick:()=>{c(!1),o(b())},children:[(0,D.jsx)(u,{className:`mr-2 size-4`}),g(`generatePassword`)]})]}),s?(0,D.jsx)(`span`,{className:`block text-xs text-destructive`,children:g(`sharePasswordRemovalSelected`)}):(0,D.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:e.hasPassword?g(`sharePasswordEditHint`):g(`sharePasswordSetHint`)}),e.hasPassword&&!s?(0,D.jsxs)(_,{variant:`ghost`,size:`sm`,className:`h-8 text-destructive`,onClick:()=>{o(``),c(!0)},children:[(0,D.jsx)(l,{className:`mr-2 size-3.5`}),g(`removePassword`)]}):null]}),(0,D.jsxs)(`label`,{className:`block text-sm font-medium`,children:[g(`shareExpiresAt`),(0,D.jsxs)(`select`,{value:p,onChange:e=>h(e.target.value),className:`mt-2 h-10 w-full rounded-md border border-input bg-background px-3 text-sm`,children:[(0,D.jsx)(`option`,{value:`keep`,children:g(`keepCurrentExpiration`)}),(0,D.jsx)(`option`,{value:`1h`,children:g(`oneHour`)}),(0,D.jsx)(`option`,{value:`24h`,children:g(`twentyFourHours`)}),(0,D.jsx)(`option`,{value:`7d`,children:g(`sevenDays`)}),(0,D.jsx)(`option`,{value:`never`,children:g(`shareNeverExpires`)})]})]}),x?(0,D.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:x}):null]}),(0,D.jsx)(`div`,{className:`shrink-0 border-t border-border px-5 py-4`,children:(0,D.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,D.jsx)(_,{variant:`outline`,onClick:t,disabled:v,children:g(`cancel`)}),(0,D.jsx)(_,{variant:r===`operate`?`destructive`:`default`,onClick:()=>void T(),disabled:v,children:g(`saveChanges`)})]})})]})})}function F({share:e,status:n,onClose:r,onAction:i}){let o=n===`active`;return(0,D.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-end justify-center bg-black/45 sm:items-center`,onMouseDown:e=>{e.target===e.currentTarget&&r()},children:(0,D.jsxs)(`div`,{className:`w-full max-w-md rounded-t-2xl border border-border bg-background p-4 pb-[max(1rem,env(safe-area-inset-bottom))] shadow-quickforge sm:rounded-2xl sm:pb-4`,role:`dialog`,"aria-modal":`true`,"aria-label":g(`manageShare`),children:[(0,D.jsx)(`div`,{className:`truncate px-1 text-sm font-medium text-foreground`,children:e.titleSnapshot||g(`untitledConversation`)}),(0,D.jsx)(`div`,{className:`mt-1 truncate px-1 font-mono text-xs text-muted-foreground`,title:k(e),children:k(e)}),(0,D.jsxs)(`div`,{className:`mt-3 space-y-1`,children:[(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start`,onClick:()=>i(`copy`),children:[(0,D.jsx)(a,{className:`mr-2 size-4`}),g(`copyShareLink`)]}),(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start`,disabled:!o,onClick:()=>i(`open`),children:[(0,D.jsx)(c,{className:`mr-2 size-4`}),g(`openShareLink`)]}),n===`active`?(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start`,onClick:()=>i(`edit`),children:[(0,D.jsx)(s,{className:`mr-2 size-4`}),g(`editShare`)]}):null,n===`active`?(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start`,onClick:()=>i(`disable`),children:[(0,D.jsx)(t,{className:`mr-2 size-4`}),g(`disableShare`)]}):(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start`,onClick:()=>i(`restore`),children:[(0,D.jsx)(u,{className:`mr-2 size-4`}),g(`restoreShare`)]}),(0,D.jsxs)(_,{variant:`ghost`,className:`w-full justify-start hover:text-destructive`,onClick:()=>i(`delete`),children:[(0,D.jsx)(l,{className:`mr-2 size-4`}),g(`deleteShare`)]})]}),(0,D.jsx)(_,{variant:`outline`,className:`mt-3 w-full`,onClick:r,children:g(`cancel`)})]})})}function I(){let[e,n]=(0,E.useState)([]),[d,m]=(0,E.useState)(!0),[h,y]=(0,E.useState)(``),[b,O]=(0,E.useState)(``),[I,L]=(0,E.useState)({}),[R,z]=(0,E.useState)(null),[B,V]=(0,E.useState)(null),[H,U]=(0,E.useState)(``),[W,G]=(0,E.useState)(``),ee=async(e=!0)=>{e&&m(!0),G(``);try{n((await w()).shares)}catch(e){G(e instanceof Error?e.message:g(`shareLinksLoadFailed`))}finally{e&&m(!1)}};(0,E.useEffect)(()=>{let e=!1;return w().then(t=>{e||n(t.shares)}).catch(t=>{e||G(t instanceof Error?t.message:g(`shareLinksLoadFailed`))}).finally(()=>{e||m(!1)}),()=>{e=!0}},[]);let K=(0,E.useMemo)(()=>{let t=b.trim().toLowerCase();return t?e.filter(e=>`${e.titleSnapshot||``} ${e.id} ${e.projectId||``}`.toLowerCase().includes(t)):e},[b,e]),q=e=>{n(t=>t.map(t=>t.id===e.id?{...t,...e}:t))},J=async(e,t,n)=>{if(!h){y(e),U(``),G(``);try{q((await t()).share),U(n)}catch(e){G(e instanceof Error?e.message:g(`requestFailed`))}finally{y(``)}}},Y=async e=>{try{await p(k(e)),U(g(`shareLinkCopied`)),G(``)}catch{G(g(`copyFailed`))}},X=async e=>{await v({description:g(`disableShareConfirm`,{title:e.titleSnapshot||e.id}),confirmLabel:g(`disableShare`),cancelLabel:g(`cancel`),variant:`destructive`})&&await J(e.id,()=>T(e.id),g(`shareDisabled`))},Z=async e=>{let t=I[e.id]||`24h`;await J(e.id,()=>C(e.id,N(t)),g(`shareRestored`))},te=async e=>{let t=I[e.id]||`24h`;await J(e.id,()=>f(e.id,N(t)),g(`shareExpirationUpdated`))},Q=async e=>{if(!(!await v({description:g(`deleteShareConfirm`,{title:e.titleSnapshot||e.id}),confirmLabel:g(`confirmDelete`),cancelLabel:g(`cancel`),variant:`destructive`})||h)){y(e.id),U(``),G(``);try{await S(e.id),n(t=>t.filter(t=>t.id!==e.id)),U(g(`shareDeleted`))}catch(e){G(e instanceof Error?e.message:g(`requestFailed`))}finally{y(``)}}},ne=(e,t)=>{V(null),t===`copy`&&Y(e),t===`open`&&window.open(k(e),`_blank`,`noopener,noreferrer`),t===`edit`&&z(e),t===`disable`&&X(e),t===`restore`&&Z(e),t===`delete`&&Q(e)},re=R?x(R):null,$=B?x(B):null;return(0,D.jsxs)(`div`,{className:`quickforge-settings-stack`,children:[(0,D.jsxs)(`div`,{className:`quickforge-settings-heading`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`h2`,{className:`quickforge-settings-title`,children:[(0,D.jsx)(r,{className:`size-5`}),g(`shareLinks`)]}),(0,D.jsx)(`p`,{className:`quickforge-settings-row-description`,children:g(`shareLinksDescription`)})]}),(0,D.jsxs)(_,{variant:`outline`,size:`sm`,onClick:()=>void ee(),disabled:d||!!h,children:[(0,D.jsx)(u,{className:`mr-2 size-4 ${d?`animate-spin`:``}`}),g(`refresh`)]})]}),(0,D.jsxs)(`div`,{className:`quickforge-settings-section`,children:[(0,D.jsxs)(`div`,{className:`quickforge-settings-toolbar`,children:[(0,D.jsxs)(`div`,{className:`quickforge-settings-inline-field max-w-md`,children:[(0,D.jsx)(i,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`,"aria-hidden":`true`}),(0,D.jsx)(`input`,{value:b,onChange:e=>O(e.target.value),className:`quickforge-settings-input`,placeholder:g(`searchShareLinks`),"aria-label":g(`searchShareLinks`)})]}),(0,D.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:g(`shareLinksCount`,{count:K.length})})]}),H?(0,D.jsx)(`div`,{className:`quickforge-settings-note quickforge-share-links-message`,children:H}):null,W?(0,D.jsx)(`div`,{className:`quickforge-settings-error quickforge-share-links-message`,children:W}):null,d?(0,D.jsx)(`div`,{className:`p-6 text-center text-sm text-muted-foreground`,children:g(`loading`)}):K.length===0?(0,D.jsx)(`div`,{className:`p-8 text-center text-sm text-muted-foreground`,children:g(b?`noMatchingShareLinks`:`noShareLinks`)}):K.map(e=>{let n=x(e),r=h===e.id,i=n===`active`;return(0,D.jsxs)(`div`,{className:`quickforge-settings-list-item quickforge-share-link-item`,children:[(0,D.jsxs)(`div`,{className:`quickforge-settings-list-item-main`,children:[(0,D.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,D.jsx)(`div`,{className:`truncate text-sm font-medium text-foreground`,children:e.titleSnapshot||g(`untitledConversation`)}),(0,D.jsx)(`span`,{className:`quickforge-settings-badge ${M(n)}`,children:j(n)}),(0,D.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-info`,children:e.permission===`operate`?g(`sharePermissionOperate`):g(`sharePermissionRead`)}),e.hasPassword?(0,D.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:g(`sharePasswordProtected`)}):null]}),(0,D.jsx)(`div`,{className:`quickforge-share-link-url`,title:k(e),children:k(e)}),(0,D.jsxs)(`div`,{className:`quickforge-settings-meta text-xs text-muted-foreground`,children:[(0,D.jsxs)(`span`,{children:[g(`shareCreatedAt`),`: `,A(e.createdAt)]}),(0,D.jsx)(`span`,{children:`·`}),(0,D.jsxs)(`span`,{children:[g(`shareExpiresAt`),`: `,e.expiresAt?A(e.expiresAt):g(`shareNeverExpires`)]}),(0,D.jsx)(`span`,{children:`·`}),(0,D.jsx)(`span`,{children:g(`shareAccessCount`,{count:e.accessCount||0})}),e.lastAccessedAt?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{children:`·`}),(0,D.jsxs)(`span`,{children:[g(`shareLastAccessedAt`),`: `,A(e.lastAccessedAt)]})]}):null]})]}),(0,D.jsxs)(`div`,{className:`quickforge-settings-list-item-actions quickforge-share-link-actions`,children:[(0,D.jsxs)(`div`,{className:`hidden flex-wrap items-center justify-end gap-2 md:flex`,children:[n===`active`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`select`,{className:`quickforge-settings-select quickforge-share-expiration-select`,value:I[e.id]||`24h`,onChange:t=>L(n=>({...n,[e.id]:t.target.value})),"aria-label":g(`shareUpdateExpiration`),disabled:r,children:[(0,D.jsx)(`option`,{value:`1h`,children:g(`oneHour`)}),(0,D.jsx)(`option`,{value:`24h`,children:g(`twentyFourHours`)}),(0,D.jsx)(`option`,{value:`7d`,children:g(`sevenDays`)}),(0,D.jsx)(`option`,{value:`never`,children:g(`shareNeverExpires`)})]}),(0,D.jsx)(_,{variant:`outline`,size:`sm`,onClick:()=>void te(e),disabled:r,children:g(`updateShareExpiration`)})]}):null,(0,D.jsx)(_,{variant:`ghost`,size:`icon`,onClick:()=>void Y(e),"aria-label":g(`copyShareLink`),title:g(`copyShareLink`),children:(0,D.jsx)(a,{className:`size-4`})}),(0,D.jsx)(_,{variant:`ghost`,size:`icon`,onClick:()=>window.open(k(e),`_blank`,`noopener,noreferrer`),disabled:!i,"aria-label":g(`openShareLink`),title:g(`openShareLink`),children:(0,D.jsx)(c,{className:`size-4`})}),n===`active`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(_,{variant:`outline`,size:`sm`,onClick:()=>z(e),disabled:r,children:[(0,D.jsx)(s,{className:`mr-2 size-4`}),g(`editShare`)]}),(0,D.jsxs)(_,{variant:`outline`,size:`sm`,onClick:()=>void X(e),disabled:r,children:[(0,D.jsx)(t,{className:`mr-2 size-4`}),g(`disableShare`)]})]}):(0,D.jsxs)(_,{variant:`outline`,size:`sm`,onClick:()=>void Z(e),disabled:r,children:[(0,D.jsx)(u,{className:`mr-2 size-4`}),g(`restoreShare`)]}),(0,D.jsx)(_,{variant:`ghost`,size:`icon`,className:`hover:text-destructive`,onClick:()=>void Q(e),disabled:r,"aria-label":g(`deleteShare`),title:g(`deleteShare`),children:(0,D.jsx)(l,{className:`size-4`})})]}),(0,D.jsxs)(_,{variant:`outline`,size:`sm`,className:`md:hidden`,onClick:()=>V(e),disabled:r,children:[(0,D.jsx)(o,{className:`mr-2 size-4`}),g(`manageShare`)]})]})]},e.id)})]}),R&&re===`active`?(0,D.jsx)(P,{share:R,onClose:()=>z(null),onSaved:e=>{q(e),U(g(`shareUpdated`)),G(``)}},R.id):null,B&&$?(0,D.jsx)(F,{share:B,status:$,onClose:()=>V(null),onAction:e=>ne(B,e)}):null]})}export{I as ShareLinksSettingsPage};
|
package/dist/assets/{SharedConversationPage-C7CDEoX9.js → SharedConversationPage-DJa0M0El.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Jt as t,bt as n,o as r}from"./icons-DM_qJ7VJ.js";import{n as i}from"./react-vendor-BpWW_Nvp.js";import{S as a,b as o,d as s,f as c,p as l,u}from"./pi-web-ui-DV5jKjSg.js";import{U as d}from"./pi-ai-Cr2ee4a0.js";import{t as f}from"./logger-8REuLPGK.js";import{r as p}from"./model-display-label-CURwH0xM.js";import{An as m,C as h,Dt as g,Ot as _,Pn as v,S as y,Sn as b,T as x,an as S,kn as C,kt as w,ln as T,on as E,sn as D,st as O,wt as k,yn as A}from"./index-BgMvQW1b.js";import{t as j}from"./model-identity-CgA6_Pbm.js";import{ChatPanelHost as M}from"./ChatPanelHost-C7zV-xE_.js";var N=e(t(),1),P=`quickforgeClientMessageId`;function F(e){let t=e?.metadata;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function I(e){let t=F(e)?.[P];return typeof t==`string`&&t?t:void 0}function L(){return`qfcm_${typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function R(e){let t=I(e);if(t)return{message:e,clientMessageId:t};let n=L();return{message:{...e,metadata:{...F(e),[P]:n}},clientMessageId:n}}function z(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>e&&typeof e==`object`&&e.type===`text`).map(e=>e.text).filter(e=>typeof e==`string`).join(``):``}function B(e,t){if(!e||!t||e.role!==t.role)return!1;let n=I(e),r=I(t);return n&&r?n===r:z(e.content)===z(t.content)}async function V(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok){let e=r?.code===`GENERATION_ALREADY_RUNNING`?v(`generationAlreadyRunning`):r?.error||`Request failed: ${n.status}`;throw Error(e)}return r}var H=class e{state;streamFn=d;getApiKey;sessionId;shareId;permission;harness=`quickforge`;listeners=new Set;eventSource=null;disposed=!1;reconnectTimer=null;reconnectDelay=1e3;baseUrl=``;syncingThinkingLevel=!1;planMode=!1;onPlanModeConsumed;constructor(e,t){this.shareId=e,this.sessionId=t.sessionId||t.id||e,this.permission=t.permission??`read`;let n={systemPrompt:t.systemPrompt??``,model:t.model??{provider:`shared`,id:`shared`},thinkingLevel:t.thinkingLevel??`off`,messages:t.messages?.slice()??[],tools:t.tools??[],isStreaming:!!t.isStreaming,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:t.errorMessage,contextCompaction:t.contextCompaction??null,contextUsage:t.contextUsage??null};this.state=new Proxy(n,{set:(e,t,n)=>{let r=e[t];return e[t]=n,t===`thinkingLevel`&&!this.syncingThinkingLevel&&n!==r&&this.updateThinkingLevel(n).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),!0}}),this.connectEvents()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setNextPromptCapabilities(){}setPlanMode(e,t){this.planMode=e,this.onPlanModeConsumed=e?t:void 0}async prompt(e){if(this.disposed||this.permission!==`operate`)return;let{message:t,clientMessageId:n}=R(this.normalizeInput(e)),r=this.planMode?{type:`plan`}:void 0;if(this.planMode){this.planMode=!1;let e=this.onPlanModeConsumed;this.onPlanModeConsumed=void 0,e?.()}this.state.messages=[...this.state.messages,t],this.emit({type:`message_start`,message:t}),this.state.isStreaming||(this.state.isStreaming=!0,this.state.errorMessage=void 0,this.emit({type:`agent_start`}));try{await V(`/api/shared/${encodeURIComponent(this.shareId)}/message`,{method:`POST`,body:JSON.stringify({message:t,clientMessageId:n,command:r})})}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.state.isStreaming=!1,this.emit({type:`error`,error:t}),this.emit({type:`agent_end`,messages:this.state.messages}),e}}async updateModel(e){if(this.disposed||this.permission!==`operate`)return;let t=this.state.model;this.state.model=e;try{let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/model`,{method:`POST`,body:JSON.stringify({modelRef:p(e),model:e})});t.model&&(this.state.model=t.model)}catch(e){this.state.model=t;let n=e instanceof Error?e.message:String(e);throw this.state.errorMessage=n,this.emit({type:`error`,error:n}),e}}async updateThinkingLevel(e){if(!(this.disposed||this.permission!==`operate`)){!this.syncingThinkingLevel&&this.state.thinkingLevel!==e&&(this.state.thinkingLevel=e);try{let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/thinking-level`,{method:`POST`,body:JSON.stringify({thinkingLevel:e})});t.thinkingLevel&&(this.state.thinkingLevel=t.thinkingLevel)}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.emit({type:`error`,error:t}),e}}}abort(){this.permission===`operate`&&fetch(`/api/shared/${encodeURIComponent(this.shareId)}/abort`,{method:`POST`}).catch(e=>{f.error(`Failed to abort shared conversation:`,e)})}steer(){}followUp(){}reset(){this.state.messages=[],this.state.errorMessage=void 0,this.state.isStreaming=!1,this.state.streamingMessage=void 0,this.state.pendingToolCalls=new Set}async rollback(e){if(this.permission!==`operate`)return;let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/rollback`,{method:`POST`,body:JSON.stringify({messageIndex:e})});return this.applyState(t.session),this.emit({type:`messages_replaced`,messages:this.state.messages}),t}dispose(){this.disposed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.eventSource?.close(),this.eventSource=null,this.listeners.clear()}static async loadState(e){return V(`/api/shared/${encodeURIComponent(e)}/session`)}static async create(t){return new e(t,await e.loadState(t))}normalizeInput(e){return typeof e==`string`?{role:`user`,content:e,timestamp:Date.now()}:Array.isArray(e)?[...e].reverse().find(e=>e.role===`user`||e.role===`user-with-attachments`)??e[e.length-1]:e}connectEvents(){this.disposed||(this.eventSource?.close(),this.baseUrl=``,this.openEventSource())}openEventSource(){if(this.disposed)return;let e=`${this.baseUrl}/api/shared/${encodeURIComponent(this.shareId)}/events`;this.eventSource=new EventSource(e,{withCredentials:!0}),this.eventSource.onopen=()=>{this.reconnectDelay=1e3};let t=[`state`,`agent_start`,`agent_end`,`message_start`,`message_end`,`turn_start`,`turn_end`,`message_update`,`tool_execution_start`,`tool_execution_update`,`tool_execution_end`,`tool_approval_required`,`auto_compact_approval_required`,`auto_compact_failed`,`error`,`title_updated`,`messages_replaced`,`auto_compact_completed`],n=e=>t=>{try{let n=JSON.parse(t.data);this.handleEvent(e?{type:e,...n}:n)}catch{}};this.eventSource.onmessage=n();for(let e of t)this.eventSource.addEventListener(e,n(e));this.eventSource.onerror=()=>{this.eventSource?.close(),this.eventSource=null,this.scheduleReconnect()}}scheduleReconnect(){this.disposed||this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.reconnectDelay=Math.min(this.reconnectDelay*2,3e4),this.openEventSource()},this.reconnectDelay))}handleEvent(e){if(e.type){switch(e.type){case`state`:this.applyState(e);break;case`agent_start`:this.state.isStreaming=!0,this.state.errorMessage=void 0;break;case`agent_end`:this.state.isStreaming=!1,this.state.streamingMessage=void 0;break;case`message_start`:if(e.message){let t=this.state.messages.findIndex(t=>B(t,e.message));if(t>=0){let n=this.state.messages.slice();n[t]=e.message,this.state.messages=n}else this.state.messages=[...this.state.messages,e.message];this.state.contextUsage=null}break;case`message_update`:e.message&&(this.state.streamingMessage=e.message);break;case`message_end`:e.message&&(this.state.messages=E(this.state.messages,e.message)),this.state.contextUsage=`contextUsage`in e?e.contextUsage:null,this.state.streamingMessage=void 0;break;case`messages_replaced`:e.messages&&(this.state.messages=e.messages,this.state.streamingMessage=void 0),`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`auto_compact_completed`:`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`tool_execution_start`:{let t=e;t.toolCallId&&(this.state.messages=D(this.state.messages,S(t),!0),this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_update`:{let t=e;this.state.messages=D(this.state.messages,t,!0),t.toolCallId&&(this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_end`:{let t=e;if(this.state.messages=D(this.state.messages,t,!1),t.toolCallId){let e=new Set(this.state.pendingToolCalls);e.delete(t.toolCallId),this.state.pendingToolCalls=e}break}case`error`:this.state.errorMessage=typeof e.error==`string`?e.error:`Unknown error`,this.state.isStreaming=!1;break}this.emit(e)}}applyState(e){this.sessionId=e.sessionId||e.id||this.sessionId,e.messages&&(this.state.messages=e.messages,this.state.contextUsage=e.contextUsage===void 0?null:e.contextUsage),e.systemPrompt!==void 0&&(this.state.systemPrompt=e.systemPrompt),e.model&&(this.state.model=e.model),e.thinkingLevel&&(this.syncingThinkingLevel=!0,this.state.thinkingLevel=e.thinkingLevel,this.syncingThinkingLevel=!1),e.tools&&(this.state.tools=e.tools),e.isStreaming!==void 0&&(this.state.isStreaming=!!e.isStreaming),e.errorMessage!==void 0&&(this.state.errorMessage=e.errorMessage),e.contextCompaction!==void 0&&(this.state.contextCompaction=e.contextCompaction),e.contextUsage!==void 0&&(this.state.contextUsage=e.contextUsage)}emit(e){for(let t of this.listeners)try{t(e)}catch{}}},U=i();function W(e){return{id:`shared-${e.provider}`,name:e.provider,type:e.api,baseUrl:e.baseUrl??``,models:[e]}}async function G(e,t){try{let t=await h(e);if(t.providers?.length)return t.providers}catch{}return t?[W(t)]:[]}function K(e,t){let n=t.model??{provider:`shared`,id:`shared`};return new H(e,{...t,model:n,thinkingLevel:t.thinkingLevel??T(n)})}function q(e,t){let n={settings:new u,providerKeys:new c,sessions:new s,customProviders:new l},r=new b(``,{blockedStores:[`sessions`,`provider-keys`],fakeProviderKeys:t?[t.provider]:void 0,storeOverrides:t?{"custom-providers":{keys:async()=>(await G(e,t)).map(e=>e.name),get:async n=>(await G(e,t)).find(e=>e.name===n)??null,has:async n=>(await G(e,t)).some(e=>e.name===n)}}:void 0});n.settings.setBackend(r),n.providerKeys.setBackend(r),n.sessions.setBackend(r),n.customProviders.setBackend(r),a(new o(n.settings,n.providerKeys,n.sessions,n.customProviders,r))}function J({shareId:e}){let[t,i]=(0,N.useState)(``),[a,o]=(0,N.useState)(null),[s,c]=(0,N.useState)(`read`),[l,u]=(0,N.useState)(`QuickForge 分享对话`),[d,p]=(0,N.useState)(),[h,b]=(0,N.useState)(!1),[S,T]=(0,N.useState)(),E=(0,N.useRef)(!1),D=s===`operate`,P=!!a,F=!!a?.state.tools?.length;(0,N.useEffect)(()=>{q(e,a?.state.model)},[a?.state.model,e]),(0,N.useEffect)(()=>()=>a?.dispose(),[a]);let I=(0,N.useCallback)(async(n=t.trim())=>{p(void 0),b(!0);try{let t=await x(e,n);c(t.permission),u(t.title||t.share.titleSnapshot||`QuickForge 分享对话`);let r=await H.loadState(e);q(e,r.model),o(K(e,r))}catch(e){p(e instanceof Error?e.message:`Failed to unlock shared conversation`)}finally{b(!1)}},[t,e]);(0,N.useEffect)(()=>{if(P||h||E.current)return;E.current=!0;let t=window.setTimeout(()=>{(async()=>{try{(await y(e)).share.hasPassword||await I(``)}catch(e){p(e instanceof Error?e.message:`Failed to load shared conversation`)}})()},0);return()=>window.clearTimeout(t)},[h,e,I,P]);let L=(0,N.useCallback)(async e=>{await g(e)},[]),R=(0,N.useCallback)(async()=>{if(!(!a||a.permission!==`operate`))try{let t=j(A((await G(e,a.state.model)).flatMap(e=>e.models??[])),a.state.model);if(!t.length)return;O(a.state.model,t,t=>{!t.reasoning&&a.state.thinkingLevel!==`off`&&a.updateThinkingLevel(`off`).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),q(e,t),a.updateModel(t).catch(e=>{p(e instanceof Error?e.message:`Failed to update model`)})},void 0,{thinkingLevel:a.state.thinkingLevel,onThinkingLevelSelect:e=>{a.updateThinkingLevel(e).catch(e=>{f.error(`Failed to update shared thinking level:`,e),p(e instanceof Error?e.message:`Failed to update thinking level`)})}})}catch(e){p(e instanceof Error?e.message:`Failed to load models`)}},[a,e]),z=(0,N.useCallback)(e=>{T(t=>t?.id===e?void 0:t)},[]),B=(0,N.useCallback)(async e=>{if(!a||a.permission!==`operate`)return;if(p(void 0),a.state.isStreaming){k(v(`generationStillRunning`));return}let t=w(a.state.messages,e),n=t>=0?a.state.messages[t]:void 0;if(!n){k(v(`noConversationTurnToRollback`));return}try{await a.rollback(e),T({id:Date.now(),sessionId:a.sessionId,text:_(n),attachments:n.role===`user-with-attachments`?n.attachments:void 0})}catch(e){p(e instanceof Error?e.message:`Failed to roll back`)}},[a]);return P?(0,U.jsxs)(`div`,{className:`flex h-screen min-h-0 flex-col bg-background text-foreground`,children:[(0,U.jsx)(`header`,{className:m(`shrink-0 border-b px-4 py-3`,D?`border-red-300 bg-red-50 text-red-950`:`border-border bg-background`),children:(0,U.jsxs)(`div`,{className:`mx-auto flex max-w-4xl items-start gap-3`,children:[(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`truncate text-sm font-semibold`,children:l}),(0,U.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs`,children:[(0,U.jsxs)(`span`,{className:m(`inline-flex items-center gap-1 rounded-full px-2 py-0.5 font-medium`,D?`bg-red-100 text-red-700`:`bg-muted text-muted-foreground`),children:[D?(0,U.jsx)(r,{className:`size-3.5`}):null,D?`高危可操作`:`只读分享`]}),(0,U.jsx)(`span`,{className:m(D?`text-red-800`:`text-muted-foreground`),children:D?`正在操作分享者的原始对话`:`只能查看,不能发送或修改`})]}),D?null:(0,U.jsx)(`div`,{className:`mt-1 text-xs leading-5 text-muted-foreground`,children:`界面与正常对话保持一致`})]}),(0,U.jsxs)(C,{variant:`ghost`,size:`sm`,className:m(`shrink-0`,D?`text-red-700 hover:bg-red-100 hover:text-red-800`:void 0),onClick:()=>void g(window.location.href),"aria-label":D?`复制高危分享链接`:`复制分享链接`,title:D?`复制高危分享链接`:`复制分享链接`,children:[(0,U.jsx)(n,{className:`size-4`}),(0,U.jsx)(`span`,{className:`hidden sm:inline`,children:D?`复制高危链接`:`复制链接`})]})]})}),d?(0,U.jsx)(`div`,{className:`mx-auto w-full max-w-4xl px-4 py-2 text-sm text-destructive`,children:d}):null,(0,U.jsx)(M,{agent:a,revision:0,agentAccessMode:F?`full-access`:`default`,workspaceToolsEnabled:F,onModelSelect:R,onAccessModeChange:()=>void 0,onRollbackFromMessage:B,onRetryFromMessage:()=>void 0,onCopyAnswer:L,onForkFromMessage:()=>void 0,onApproveToolCall:()=>void 0,onRejectToolCall:()=>void 0,disableFork:!0,rollbackConfirmTitle:v(`sharedRollbackConfirmTitle`),rollbackConfirmDescription:v(`sharedRollbackConfirm`),readOnly:!D,approvalReadOnly:!0,approvalReadOnlyMessage:v(`sharedApprovalReadOnly`),restoredDraft:S,onRestoredDraftConsumed:z,bypassClientApiKeyCheck:!0,showTurnNavigation:!1})]}):(0,U.jsx)(`div`,{className:`flex min-h-screen items-center justify-center bg-background p-6 text-foreground`,children:(0,U.jsxs)(`div`,{className:`w-full max-w-md rounded-2xl border border-border bg-background p-6 shadow-quickforge`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2 text-base font-semibold`,children:[(0,U.jsx)(r,{className:`size-5 text-amber-500`}),`QuickForge 局域网对话分享`]}),(0,U.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:`如果分享者设置了密码,请输入密码。未设置密码的链接会自动打开。`}),(0,U.jsx)(`input`,{type:`password`,value:t,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&I()},className:`mt-5 h-10 w-full rounded-md border border-input bg-background px-3 text-sm outline-none focus:border-primary`,placeholder:`密码`,autoFocus:!0}),d?(0,U.jsx)(`div`,{className:`mt-3 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:d}):null,(0,U.jsx)(C,{className:`mt-5 w-full`,onClick:()=>void I(),disabled:h||!t.trim(),children:h?v(`loading`):`用密码打开分享对话`})]})})}export{J as SharedConversationPage};
|
|
1
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{Jt as t,bt as n,o as r}from"./icons-DM_qJ7VJ.js";import{n as i}from"./react-vendor-BpWW_Nvp.js";import{S as a,b as o,d as s,f as c,p as l,u}from"./pi-web-ui-BNuvqKDT.js";import{U as d}from"./pi-ai-Cr2ee4a0.js";import{t as f}from"./logger-8REuLPGK.js";import{r as p}from"./model-display-label-CURwH0xM.js";import{C as m,Dt as h,Ln as g,Mn as _,Nn as v,Ot as y,S as b,Sn as x,T as S,Tn as C,cn as w,fn as T,kt as E,ln as D,st as O,un as k,wt as A}from"./index-D3GWkXJR.js";import{t as j}from"./model-identity-CgA6_Pbm.js";import{ChatPanelHost as M}from"./ChatPanelHost-COTO7swS.js";var N=e(t(),1),P=`quickforgeClientMessageId`;function F(e){let t=e?.metadata;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function I(e){let t=F(e)?.[P];return typeof t==`string`&&t?t:void 0}function L(){return`qfcm_${typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function R(e){let t=I(e);if(t)return{message:e,clientMessageId:t};let n=L();return{message:{...e,metadata:{...F(e),[P]:n}},clientMessageId:n}}function z(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>e&&typeof e==`object`&&e.type===`text`).map(e=>e.text).filter(e=>typeof e==`string`).join(``):``}function B(e,t){if(!e||!t||e.role!==t.role)return!1;let n=I(e),r=I(t);return n&&r?n===r:z(e.content)===z(t.content)}async function V(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok){let e=r?.code===`GENERATION_ALREADY_RUNNING`?g(`generationAlreadyRunning`):r?.error||`Request failed: ${n.status}`;throw Error(e)}return r}var H=class e{state;streamFn=d;getApiKey;sessionId;shareId;permission;harness=`quickforge`;listeners=new Set;eventSource=null;disposed=!1;reconnectTimer=null;reconnectDelay=1e3;baseUrl=``;syncingThinkingLevel=!1;planMode=!1;onPlanModeConsumed;constructor(e,t){this.shareId=e,this.sessionId=t.sessionId||t.id||e,this.permission=t.permission??`read`;let n={systemPrompt:t.systemPrompt??``,model:t.model??{provider:`shared`,id:`shared`},thinkingLevel:t.thinkingLevel??`off`,messages:t.messages?.slice()??[],tools:t.tools??[],isStreaming:!!t.isStreaming,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:t.errorMessage,contextCompaction:t.contextCompaction??null,contextUsage:t.contextUsage??null};this.state=new Proxy(n,{set:(e,t,n)=>{let r=e[t];return e[t]=n,t===`thinkingLevel`&&!this.syncingThinkingLevel&&n!==r&&this.updateThinkingLevel(n).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),!0}}),this.connectEvents()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setNextPromptCapabilities(){}setPlanMode(e,t){this.planMode=e,this.onPlanModeConsumed=e?t:void 0}async prompt(e){if(this.disposed||this.permission!==`operate`)return;let{message:t,clientMessageId:n}=R(this.normalizeInput(e)),r=this.planMode?{type:`plan`}:void 0;if(this.planMode){this.planMode=!1;let e=this.onPlanModeConsumed;this.onPlanModeConsumed=void 0,e?.()}this.state.messages=[...this.state.messages,t],this.emit({type:`message_start`,message:t}),this.state.isStreaming||(this.state.isStreaming=!0,this.state.errorMessage=void 0,this.emit({type:`agent_start`}));try{await V(`/api/shared/${encodeURIComponent(this.shareId)}/message`,{method:`POST`,body:JSON.stringify({message:t,clientMessageId:n,command:r})})}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.state.isStreaming=!1,this.emit({type:`error`,error:t}),this.emit({type:`agent_end`,messages:this.state.messages}),e}}async updateModel(e){if(this.disposed||this.permission!==`operate`)return;let t=this.state.model;this.state.model=e;try{let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/model`,{method:`POST`,body:JSON.stringify({modelRef:p(e),model:e})});t.model&&(this.state.model=t.model)}catch(e){this.state.model=t;let n=e instanceof Error?e.message:String(e);throw this.state.errorMessage=n,this.emit({type:`error`,error:n}),e}}async updateThinkingLevel(e){if(!(this.disposed||this.permission!==`operate`)){!this.syncingThinkingLevel&&this.state.thinkingLevel!==e&&(this.state.thinkingLevel=e);try{let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/thinking-level`,{method:`POST`,body:JSON.stringify({thinkingLevel:e})});t.thinkingLevel&&(this.state.thinkingLevel=t.thinkingLevel)}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.emit({type:`error`,error:t}),e}}}abort(){this.permission===`operate`&&fetch(`/api/shared/${encodeURIComponent(this.shareId)}/abort`,{method:`POST`}).catch(e=>{f.error(`Failed to abort shared conversation:`,e)})}steer(){}followUp(){}reset(){this.state.messages=[],this.state.errorMessage=void 0,this.state.isStreaming=!1,this.state.streamingMessage=void 0,this.state.pendingToolCalls=new Set}async rollback(e){if(this.permission!==`operate`)return;let t=await V(`/api/shared/${encodeURIComponent(this.shareId)}/rollback`,{method:`POST`,body:JSON.stringify({messageIndex:e})});return this.applyState(t.session),this.emit({type:`messages_replaced`,messages:this.state.messages}),t}dispose(){this.disposed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.eventSource?.close(),this.eventSource=null,this.listeners.clear()}static async loadState(e){return V(`/api/shared/${encodeURIComponent(e)}/session`)}static async create(t){return new e(t,await e.loadState(t))}normalizeInput(e){return typeof e==`string`?{role:`user`,content:e,timestamp:Date.now()}:Array.isArray(e)?[...e].reverse().find(e=>e.role===`user`||e.role===`user-with-attachments`)??e[e.length-1]:e}connectEvents(){this.disposed||(this.eventSource?.close(),this.baseUrl=``,this.openEventSource())}openEventSource(){if(this.disposed)return;let e=`${this.baseUrl}/api/shared/${encodeURIComponent(this.shareId)}/events`;this.eventSource=new EventSource(e,{withCredentials:!0}),this.eventSource.onopen=()=>{this.reconnectDelay=1e3};let t=[`state`,`agent_start`,`agent_end`,`message_start`,`message_end`,`turn_start`,`turn_end`,`message_update`,`tool_execution_start`,`tool_execution_update`,`tool_execution_end`,`tool_approval_required`,`auto_compact_approval_required`,`auto_compact_failed`,`error`,`title_updated`,`messages_replaced`,`auto_compact_completed`],n=e=>t=>{try{let n=JSON.parse(t.data);this.handleEvent(e?{type:e,...n}:n)}catch{}};this.eventSource.onmessage=n();for(let e of t)this.eventSource.addEventListener(e,n(e));this.eventSource.onerror=()=>{this.eventSource?.close(),this.eventSource=null,this.scheduleReconnect()}}scheduleReconnect(){this.disposed||this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.reconnectDelay=Math.min(this.reconnectDelay*2,3e4),this.openEventSource()},this.reconnectDelay))}handleEvent(e){if(e.type){switch(e.type){case`state`:this.applyState(e);break;case`agent_start`:this.state.isStreaming=!0,this.state.errorMessage=void 0;break;case`agent_end`:this.state.isStreaming=!1,this.state.streamingMessage=void 0;break;case`message_start`:if(e.message){let t=this.state.messages.findIndex(t=>B(t,e.message));if(t>=0){let n=this.state.messages.slice();n[t]=e.message,this.state.messages=n}else this.state.messages=[...this.state.messages,e.message];this.state.contextUsage=null}break;case`message_update`:e.message&&(this.state.streamingMessage=e.message);break;case`message_end`:e.message&&(this.state.messages=D(this.state.messages,e.message)),this.state.contextUsage=`contextUsage`in e?e.contextUsage:null,this.state.streamingMessage=void 0;break;case`messages_replaced`:e.messages&&(this.state.messages=e.messages,this.state.streamingMessage=void 0),`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`auto_compact_completed`:`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`tool_execution_start`:{let t=e;t.toolCallId&&(this.state.messages=k(this.state.messages,w(t),!0),this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_update`:{let t=e;this.state.messages=k(this.state.messages,t,!0),t.toolCallId&&(this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_end`:{let t=e;if(this.state.messages=k(this.state.messages,t,!1),t.toolCallId){let e=new Set(this.state.pendingToolCalls);e.delete(t.toolCallId),this.state.pendingToolCalls=e}break}case`error`:this.state.errorMessage=typeof e.error==`string`?e.error:`Unknown error`,this.state.isStreaming=!1;break}this.emit(e)}}applyState(e){this.sessionId=e.sessionId||e.id||this.sessionId,e.messages&&(this.state.messages=e.messages,this.state.contextUsage=e.contextUsage===void 0?null:e.contextUsage),e.systemPrompt!==void 0&&(this.state.systemPrompt=e.systemPrompt),e.model&&(this.state.model=e.model),e.thinkingLevel&&(this.syncingThinkingLevel=!0,this.state.thinkingLevel=e.thinkingLevel,this.syncingThinkingLevel=!1),e.tools&&(this.state.tools=e.tools),e.isStreaming!==void 0&&(this.state.isStreaming=!!e.isStreaming),e.errorMessage!==void 0&&(this.state.errorMessage=e.errorMessage),e.contextCompaction!==void 0&&(this.state.contextCompaction=e.contextCompaction),e.contextUsage!==void 0&&(this.state.contextUsage=e.contextUsage)}emit(e){for(let t of this.listeners)try{t(e)}catch{}}},U=i();function W(e){return{id:`shared-${e.provider}`,name:e.provider,type:e.api,baseUrl:e.baseUrl??``,models:[e]}}async function G(e,t){try{let t=await m(e);if(t.providers?.length)return t.providers}catch{}return t?[W(t)]:[]}function K(e,t){let n=t.model??{provider:`shared`,id:`shared`};return new H(e,{...t,model:n,thinkingLevel:t.thinkingLevel??T(n)})}function q(e,t){let n={settings:new u,providerKeys:new c,sessions:new s,customProviders:new l},r=new C(``,{blockedStores:[`sessions`,`provider-keys`],fakeProviderKeys:t?[t.provider]:void 0,storeOverrides:t?{"custom-providers":{keys:async()=>(await G(e,t)).map(e=>e.name),get:async n=>(await G(e,t)).find(e=>e.name===n)??null,has:async n=>(await G(e,t)).some(e=>e.name===n)}}:void 0});n.settings.setBackend(r),n.providerKeys.setBackend(r),n.sessions.setBackend(r),n.customProviders.setBackend(r),a(new o(n.settings,n.providerKeys,n.sessions,n.customProviders,r))}function J({shareId:e}){let[t,i]=(0,N.useState)(``),[a,o]=(0,N.useState)(null),[s,c]=(0,N.useState)(`read`),[l,u]=(0,N.useState)(`QuickForge 分享对话`),[d,p]=(0,N.useState)(),[m,C]=(0,N.useState)(!1),[w,T]=(0,N.useState)(),D=(0,N.useRef)(!1),k=s===`operate`,P=!!a,F=!!a?.state.tools?.length;(0,N.useEffect)(()=>{q(e,a?.state.model)},[a?.state.model,e]),(0,N.useEffect)(()=>()=>a?.dispose(),[a]);let I=(0,N.useCallback)(async(n=t.trim())=>{p(void 0),C(!0);try{let t=await S(e,n);c(t.permission),u(t.title||t.share.titleSnapshot||`QuickForge 分享对话`);let r=await H.loadState(e);q(e,r.model),o(K(e,r))}catch(e){p(e instanceof Error?e.message:`Failed to unlock shared conversation`)}finally{C(!1)}},[t,e]);(0,N.useEffect)(()=>{if(P||m||D.current)return;D.current=!0;let t=window.setTimeout(()=>{(async()=>{try{(await b(e)).share.hasPassword||await I(``)}catch(e){p(e instanceof Error?e.message:`Failed to load shared conversation`)}})()},0);return()=>window.clearTimeout(t)},[m,e,I,P]);let L=(0,N.useCallback)(async e=>{await h(e)},[]),R=(0,N.useCallback)(async()=>{if(!(!a||a.permission!==`operate`))try{let t=j(x((await G(e,a.state.model)).flatMap(e=>e.models??[])),a.state.model);if(!t.length)return;O(a.state.model,t,t=>{!t.reasoning&&a.state.thinkingLevel!==`off`&&a.updateThinkingLevel(`off`).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),q(e,t),a.updateModel(t).catch(e=>{p(e instanceof Error?e.message:`Failed to update model`)})},void 0,{thinkingLevel:a.state.thinkingLevel,onThinkingLevelSelect:e=>{a.updateThinkingLevel(e).catch(e=>{f.error(`Failed to update shared thinking level:`,e),p(e instanceof Error?e.message:`Failed to update thinking level`)})}})}catch(e){p(e instanceof Error?e.message:`Failed to load models`)}},[a,e]),z=(0,N.useCallback)(e=>{T(t=>t?.id===e?void 0:t)},[]),B=(0,N.useCallback)(async e=>{if(!a||a.permission!==`operate`)return;if(p(void 0),a.state.isStreaming){A(g(`generationStillRunning`));return}let t=E(a.state.messages,e),n=t>=0?a.state.messages[t]:void 0;if(!n){A(g(`noConversationTurnToRollback`));return}try{await a.rollback(e),T({id:Date.now(),sessionId:a.sessionId,text:y(n),attachments:n.role===`user-with-attachments`?n.attachments:void 0})}catch(e){p(e instanceof Error?e.message:`Failed to roll back`)}},[a]);return P?(0,U.jsxs)(`div`,{className:`flex h-screen min-h-0 flex-col bg-background text-foreground`,children:[(0,U.jsx)(`header`,{className:v(`shrink-0 border-b px-4 py-3`,k?`border-red-300 bg-red-50 text-red-950`:`border-border bg-background`),children:(0,U.jsxs)(`div`,{className:`mx-auto flex max-w-4xl items-start gap-3`,children:[(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`truncate text-sm font-semibold`,children:l}),(0,U.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs`,children:[(0,U.jsxs)(`span`,{className:v(`inline-flex items-center gap-1 rounded-full px-2 py-0.5 font-medium`,k?`bg-red-100 text-red-700`:`bg-muted text-muted-foreground`),children:[k?(0,U.jsx)(r,{className:`size-3.5`}):null,k?`高危可操作`:`只读分享`]}),(0,U.jsx)(`span`,{className:v(k?`text-red-800`:`text-muted-foreground`),children:k?`正在操作分享者的原始对话`:`只能查看,不能发送或修改`})]}),k?null:(0,U.jsx)(`div`,{className:`mt-1 text-xs leading-5 text-muted-foreground`,children:`界面与正常对话保持一致`})]}),(0,U.jsxs)(_,{variant:`ghost`,size:`sm`,className:v(`shrink-0`,k?`text-red-700 hover:bg-red-100 hover:text-red-800`:void 0),onClick:()=>void h(window.location.href),"aria-label":k?`复制高危分享链接`:`复制分享链接`,title:k?`复制高危分享链接`:`复制分享链接`,children:[(0,U.jsx)(n,{className:`size-4`}),(0,U.jsx)(`span`,{className:`hidden sm:inline`,children:k?`复制高危链接`:`复制链接`})]})]})}),d?(0,U.jsx)(`div`,{className:`mx-auto w-full max-w-4xl px-4 py-2 text-sm text-destructive`,children:d}):null,(0,U.jsx)(M,{agent:a,revision:0,agentAccessMode:F?`full-access`:`default`,workspaceToolsEnabled:F,onModelSelect:R,onAccessModeChange:()=>void 0,onRollbackFromMessage:B,onRetryFromMessage:()=>void 0,onCopyAnswer:L,onForkFromMessage:()=>void 0,onApproveToolCall:()=>void 0,onRejectToolCall:()=>void 0,disableFork:!0,rollbackConfirmTitle:g(`sharedRollbackConfirmTitle`),rollbackConfirmDescription:g(`sharedRollbackConfirm`),readOnly:!k,approvalReadOnly:!0,approvalReadOnlyMessage:g(`sharedApprovalReadOnly`),restoredDraft:w,onRestoredDraftConsumed:z,bypassClientApiKeyCheck:!0,showTurnNavigation:!1})]}):(0,U.jsx)(`div`,{className:`flex min-h-screen items-center justify-center bg-background p-6 text-foreground`,children:(0,U.jsxs)(`div`,{className:`w-full max-w-md rounded-2xl border border-border bg-background p-6 shadow-quickforge`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2 text-base font-semibold`,children:[(0,U.jsx)(r,{className:`size-5 text-amber-500`}),`QuickForge 局域网对话分享`]}),(0,U.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:`如果分享者设置了密码,请输入密码。未设置密码的链接会自动打开。`}),(0,U.jsx)(`input`,{type:`password`,value:t,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&I()},className:`mt-5 h-10 w-full rounded-md border border-input bg-background px-3 text-sm outline-none focus:border-primary`,placeholder:`密码`,autoFocus:!0}),d?(0,U.jsx)(`div`,{className:`mt-3 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:d}):null,(0,U.jsx)(_,{className:`mt-5 w-full`,onClick:()=>void I(),disabled:m||!t.trim(),children:m?g(`loading`):`用密码打开分享对话`})]})})}export{J as SharedConversationPage};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{D as t,J as n,Jt as r,Pt as i,W as a,n as o,u as s,z as c}from"./icons-DM_qJ7VJ.js";import{n as l}from"./react-vendor-BpWW_Nvp.js";import{Dn as u,Ln as d,Mn as f,Nn as p,_t as m,ft as h,yt as g}from"./index-D3GWkXJR.js";import{n as _,t as v}from"./xterm-Bm_IbozX.js";var y=e(r(),1);async function b(e,t){let n=await fetch(e,{cache:`no-store`,...t}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||`Request failed: ${n.status}`);return r}function x(){return b(`/api/terminal/capabilities`,{cache:`default`})}function S(e){return b(`/api/terminal/sessions${e?`?projectId=${encodeURIComponent(e)}`:``}`)}function C(e){return b(`/api/terminal/sessions`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)})}function w(e){return b(`/api/terminal/sessions/${encodeURIComponent(e)}`,{method:`DELETE`})}function ee(e,t){return b(`/api/terminal/sessions/${encodeURIComponent(e)}/input`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({data:t})})}function T(){let[e,t]=(0,y.useState)(()=>h());return(0,y.useEffect)(()=>{if(typeof document>`u`)return;let e=document.documentElement,n=()=>t(h());n();let r=new MutationObserver(n);return r.observe(e,{attributes:!0,attributeFilter:[`class`]}),()=>r.disconnect()},[]),e}var E=1e4,D=[1e3,2e3,4e3],O=D.length;function k(e){return D[e]}function A(e){return e.code===`SESSION_NOT_FOUND`||e.retryable===!1||e.message===`Terminal session not found`}var j=l(),te={light:{background:`#ffffff`,foreground:`#1f2937`,cursor:`#1f2937`,selectionBackground:`#dbeafe`},dark:{background:`#171717`,foreground:`#e5e7eb`,cursor:`#e5e7eb`,selectionBackground:`#3f3f46`}};function ne({session:e,active:t,height:n,retryKey:r,onReady:i,onExited:a,onConnectionError:o,onConnectionState:s}){let c=te[T()],l=(0,y.useRef)(null),f=(0,y.useRef)(null),p=(0,y.useRef)(null),h=(0,y.useRef)(null),b=(0,y.useRef)(null),x=(0,y.useRef)(()=>{}),S=(0,y.useRef)(!1);return(0,y.useEffect)(()=>{let e=l.current;if(!e)return;let t=g(),n=new _({cursorBlink:!0,convertEol:!1,fontFamily:getComputedStyle(document.documentElement).getPropertyValue(`--font-mono`).trim()||`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,fontSize:t.fontSize,lineHeight:t.lineHeight,scrollback:5e3}),r=new v;n.loadAddon(r),n.open(e),f.current=n,p.current=r;let i=()=>{if(e.isConnected)try{r.fit();let e=h.current;e?.readyState===WebSocket.OPEN&&e.send(JSON.stringify({type:`resize`,cols:n.cols,rows:n.rows}))}catch{}};x.current=i;let a=new ResizeObserver(()=>i());a.observe(e);let o=()=>{let e=g();n.options.fontSize=e.fontSize,n.options.lineHeight=e.lineHeight,window.setTimeout(i,0)};return window.addEventListener(m,o),window.setTimeout(i,50),()=>{window.removeEventListener(m,o),a.disconnect(),x.current=()=>{},n.dispose(),f.current=null,p.current=null}},[e.id]),(0,y.useEffect)(()=>{let e=f.current;e&&(e.options.theme=c)},[c]),(0,y.useEffect)(()=>{let t=!1,n=!1,r=!1,c=0,l,p=0,m=n=>{t||s(e.id,n)},g=()=>{if(t||n||r)return;let s=++p,_=!1,v=!1,y=new WebSocket(`${u()}/api/terminal/sessions/${encodeURIComponent(e.id)}/ws`);h.current=y,m(c===0?{status:`connecting`}:{status:`reconnecting`,reconnectAttempt:c});let C=window.setTimeout(()=>{if(!(t||n||r||v||s!==p)){w(d(`terminalConnectionTimedOut`));try{y.close()}catch{}}},E),w=i=>{if(t||n||r||_||s!==p)return;_=!0,window.clearTimeout(C),b.current?.dispose(),b.current=null;let a=k(c);if(c<O&&a!==void 0){c+=1,m({status:`reconnecting`,reconnectAttempt:c}),l=window.setTimeout(g,a);return}m({status:`disconnected`}),o(e.id,i)};y.addEventListener(`open`,()=>{if(t||n||_||s!==p){try{y.close()}catch{}return}b.current?.dispose(),b.current=f.current?.onData(e=>{y.readyState===WebSocket.OPEN&&y.send(JSON.stringify({type:`input`,data:e}))})??null,window.setTimeout(x.current,0)}),y.addEventListener(`message`,t=>{try{let s=JSON.parse(String(t.data));if(s.type===`ready`)v=!0,c=0,window.clearTimeout(C),o(e.id,void 0),m({status:`connected`}),S.current||(S.current=!0,f.current?.writeln(`\x1b[2mConnected to ${e.cwd}\x1b[0m`)),i(e.id);else if(s.type===`output`)f.current?.write(s.data);else if(s.type===`exit`)n=!0,window.clearTimeout(C),l!==void 0&&window.clearTimeout(l),f.current?.writeln(``),f.current?.writeln(`\x1b[33m[process exited with code ${s.exitCode??`unknown`}]\x1b[0m`),m({status:`exited`}),a(e.id);else if(s.type===`error`)if(A(s)){r=!0,_=!0,window.clearTimeout(C),l!==void 0&&window.clearTimeout(l),b.current?.dispose(),b.current=null,m({status:`unavailable`}),o(e.id,d(`terminalSessionUnavailable`));try{y.close()}catch{}}else w(s.message||d(`terminalConnectionFailed`))}catch{}}),y.addEventListener(`error`,()=>{w(d(v?`terminalConnectionClosedUnexpectedly`:`terminalConnectionFailed`))}),y.addEventListener(`close`,()=>{window.clearTimeout(C),b.current?.dispose(),b.current=null,!(t||n||r||_||s!==p)&&w(d(v?`terminalConnectionClosedUnexpectedly`:`terminalConnectionFailed`))})};return o(e.id,void 0),g(),()=>{t=!0,p+=1,l!==void 0&&window.clearTimeout(l),b.current?.dispose(),b.current=null;let e=h.current;h.current=null;try{e?.close()}catch{}}},[o,s,a,i,r,e.cwd,e.id]),(0,y.useEffect)(()=>{t&&window.setTimeout(()=>{try{p.current?.fit(),f.current?.focus()}catch{}},0)},[t,n]),(0,j.jsx)(`div`,{className:t?`h-full min-h-0 w-full pl-2 md:pl-3`:`hidden`,"aria-hidden":!t,children:(0,j.jsx)(`div`,{ref:l,className:`h-full min-h-0 w-full`})})}var re=180,ie=.7,ae=320;function M(e,t){let n=t?t.name:`Terminal`,r=new Set(e.map(e=>e.name));if(n!==`Terminal`&&!r.has(n))return n;let i=1;for(;r.has(`${n} ${i}`);)i+=1;return`${n} ${i}`}function N(e,t){let n=e?.terminalShellProfiles||[],r=t||e?.defaultTerminalShellProfileId||``;return n.find(e=>e.id===r)||n[0]}function P({project:e,onCollapse:r,pendingCommand:l,onPendingCommandHandled:u,variant:m=`dock`,singleSession:h=!1,panelInstanceId:g,panelSessionId:_,onPanelSessionReady:v}){let[b,T]=(0,y.useState)(null),[E,D]=(0,y.useState)([]),[O,k]=(0,y.useState)(),[A,te]=(0,y.useState)(ae),[P,oe]=(0,y.useState)(!0),[F,se]=(0,y.useState)(!1),[ce,I]=(0,y.useState)(),[le,ue]=(0,y.useState)({}),[L,de]=(0,y.useState)({}),[fe,pe]=(0,y.useState)({}),[R,z]=(0,y.useState)(!1),[B,me]=(0,y.useState)(!1),V=(0,y.useRef)(!1),H=(0,y.useRef)(!1),U=(0,y.useRef)(new Set),he=(0,y.useRef)(l),ge=(0,y.useRef)(new Set),_e=(0,y.useRef)(new Set),W=(0,y.useRef)(new Map),G=(0,y.useRef)(!0),ve=(0,y.useRef)(v),[ye,be]=(0,y.useState)(()=>new Set),xe=(0,y.useRef)(null),Se=(0,y.useRef)(null),K=e?.id,q=m===`panel`&&!!g,J=(0,y.useMemo)(()=>E.find(e=>e.id===O)??E[0],[O,E]);(0,y.useEffect)(()=>{he.current=l},[l]),(0,y.useEffect)(()=>{ve.current=v},[v]),(0,y.useEffect)(()=>()=>{G.current=!1},[]);let Ce=(0,y.useCallback)(async()=>{let e=await S(K);return D(e.sessions),k(t=>t&&e.sessions.some(e=>e.id===t)?t:e.sessions[0]?.id),e.sessions},[K]),we=(0,y.useCallback)(async(e,t)=>{if(V.current)return;let n=N(b,t);V.current=!0,se(!0),I(void 0);try{let t=await C({projectId:K,name:M(e,n),cols:120,rows:30,shellProfileId:n?.id,shellProfileName:n?.name});D(e=>[...e,t]),k(t.id),q&&ve.current?.(t.id)}catch(e){I(e instanceof Error?e.message:d(`terminalCreateFailed`))}finally{V.current=!1,se(!1)}},[b,q,K]);(0,y.useEffect)(()=>{let e=!1;return(async()=>{oe(!0),I(void 0);try{let[t,n]=await Promise.all([x(),S(K)]);if(e)return;if(T(t),t.enabled&&q&&_&&n.sessions.some(e=>e.id===_)){H.current=!0,D(n.sessions),k(_);return}if(t.enabled&&q&&!H.current){H.current=!0;let r=N(t);try{let t=await C({projectId:K,name:M(n.sessions,r),cols:120,rows:30,shellProfileId:r?.id,shellProfileName:r?.name});if(e){w(t.id).catch(()=>{});return}D([...n.sessions,t]),k(t.id),ve.current?.(t.id);return}catch(t){e||I(t instanceof Error?t.message:d(`terminalCreateFailed`))}}if(D(n.sessions),k(n.sessions[0]?.id),t.enabled&&n.sessions.length===0&&!he.current){let n=N(t);C({projectId:K,name:M([],n),cols:120,rows:30,shellProfileId:n?.id,shellProfileName:n?.name}).then(t=>{if(e){w(t.id).catch(()=>{});return}D([t]),k(t.id)}).catch(t=>{e||I(t instanceof Error?t.message:d(`terminalCreateFailed`))})}}catch(t){e||I(t instanceof Error?t.message:d(`terminalUnavailable`))}finally{e||oe(!1)}})(),()=>{e=!0}},[q,_,K]),(0,y.useEffect)(()=>{if(!R)return;let e=e=>{Se.current?.contains(e.target)||z(!1)},t=e=>{e.key===`Escape`&&z(!1)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[R]),(0,y.useEffect)(()=>{if(!B)return;let e=e=>{e.key===`Escape`&&me(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[B]),(0,y.useEffect)(()=>{if(!l||U.current.has(l.id)||W.current.has(l.id)||ge.current.has(l.id)||P||F||!b)return;if(!b.enabled){U.current.add(l.id),window.setTimeout(()=>{I(b.reason||d(`terminalUnavailable`)),u?.(l.id)},0);return}let e=J&&!J.exited?J:E.find(e=>!e.exited);if(e){W.current.set(l.id,e.id),window.setTimeout(()=>{G.current&&k(e.id)},0);return}ge.current.add(l.id),window.setTimeout(()=>{G.current&&I(void 0)},0);let t=N(b);C({projectId:K,name:M(E,t),cols:120,rows:30,shellProfileId:t?.id,shellProfileName:t?.name}).then(e=>{if(!G.current){w(e.id).catch(()=>{});return}W.current.set(l.id,e.id),D(t=>t.some(t=>t.id===e.id)?t:[...t,e]),k(e.id)}).catch(e=>{G.current&&(I(e instanceof Error?e.message:d(`terminalCommandExecuteFailed`)),U.current.add(l.id),u?.(l.id))}).finally(()=>{ge.current.delete(l.id)})},[J,b,F,P,u,l,K,E]),(0,y.useEffect)(()=>{if(!l||U.current.has(l.id)||_e.current.has(l.id))return;let e=W.current.get(l.id),t=e?E.find(t=>t.id===e):J&&!J.exited?J:E.find(e=>!e.exited);!t||t.exited||!ye.has(t.id)||(_e.current.add(l.id),window.setTimeout(()=>{G.current&&(k(t.id),I(void 0))},0),(async()=>{try{if(l.execute){let e=l.command.split(`
|
|
2
|
+
`),n=e.flatMap((t,n)=>n<e.length-1?[t,`\r`]:[t]);n.push(`\r`),await ee(t.id,n.join(``))}else await ee(t.id,l.command)}catch(e){G.current&&I(e instanceof Error?e.message:d(`terminalCommandExecuteFailed`))}finally{U.current.add(l.id),_e.current.delete(l.id),W.current.delete(l.id),G.current&&u?.(l.id)}})())},[J,u,l,ye,E]);let Y=async e=>{I(void 0),ue(t=>{if(!t[e])return t;let n={...t};return delete n[e],n}),de(t=>{if(!t[e])return t;let n={...t};return delete n[e],n}),pe(t=>{if(t[e]===void 0)return t;let n={...t};return delete n[e],n});let t=E.filter(t=>t.id!==e);D(t),O===e&&k(t[0]?.id);try{await w(e)}catch(e){I(e instanceof Error?e.message:d(`terminalCloseFailed`)),Ce().catch(()=>{})}},Te=(0,y.useCallback)(e=>{D(t=>t.map(t=>t.id===e?{...t,exited:!0}:t)),be(t=>{if(!t.has(e))return t;let n=new Set(t);return n.delete(e),n})},[]),Ee=(0,y.useCallback)(e=>{be(t=>{if(t.has(e))return t;let n=new Set(t);return n.add(e),n})},[]),De=(0,y.useCallback)((e,t)=>{ue(n=>{if(!t){if(!n[e])return n;let t={...n};return delete t[e],t}return n[e]===t?n:{...n,[e]:t}})},[]),Oe=(0,y.useCallback)((e,t)=>{de(n=>{let r=n[e];return r?.status===t.status&&r.reconnectAttempt===t.reconnectAttempt?n:{...n,[e]:t}})},[]),ke=(0,y.useCallback)(e=>{ue(t=>{if(!t[e])return t;let n={...t};return delete n[e],n}),pe(t=>({...t,[e]:(t[e]||0)+1}))},[]),Ae=async e=>{let t=E.filter(t=>t.id!==e);await Y(e),await we(t)},je=(e,t)=>e.exited||t===`exited`||t===`unavailable`?`bg-muted-foreground/40`:t===`connected`?`bg-emerald-500/80`:t===`connecting`||t===`reconnecting`?`bg-amber-500/80`:`bg-destructive/70`,Me=e=>{xe.current={startY:e.clientY,startHeight:A},e.currentTarget.setPointerCapture(e.pointerId)},Ne=e=>{let t=xe.current;if(!t)return;let n=Math.max(re,Math.floor(window.innerHeight*ie));te(Math.min(n,Math.max(re,t.startHeight+t.startY-e.clientY)))},Pe=e=>{xe.current=null;try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}},X=b?.terminalShellProfiles||[],Fe=b?.defaultTerminalShellProfileId||``,Ie=X.find(e=>e.id===Fe)||X[0],Le=!!(b&&E.length>=b.maxSessions),Re=F||Le,ze=J?le[J.id]:void 0,Z=J?L[J.id]:void 0,Be=Z?.status===`unavailable`,Ve=Z?.status===`connecting`?d(`terminalConnecting`):Z?.status===`reconnecting`?d(`terminalReconnecting`,{attempt:Z.reconnectAttempt||1,max:3}):void 0,He=q&&J?[J]:E,Q=ce??ze,Ue=Q?void 0:Ve,We=!!(Q||Ue),$=m===`panel`,Ge=$&&h,Ke=$?void 0:B?We?`calc(100% - 4.25rem)`:`calc(100% - 2.25rem)`:We?A-72:A-45;return(0,j.jsxs)(`div`,{className:p($?`flex min-h-0 flex-1 flex-col bg-background`:`shrink-0 border-t border-border bg-background`,B&&`quickforge-terminal-fullscreen z-40 flex flex-col border-t-0`),style:B||$?void 0:{height:A},children:[!B&&!$?(0,j.jsx)(`div`,{className:`h-1 cursor-row-resize bg-transparent hover:bg-border`,onPointerDown:Me,onPointerMove:Ne,onPointerUp:Pe,onPointerCancel:Pe}):null,(0,j.jsxs)(`div`,{className:`flex h-9 items-center gap-1 border-b border-border px-2`,children:[(0,j.jsx)(s,{className:`size-4 shrink-0 text-muted-foreground/60`}),(0,j.jsx)(`div`,{className:`flex min-w-0 flex-1 items-center gap-1 overflow-x-auto`,children:He.map(e=>{let t=p(`flex max-w-44 shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground/72`,J?.id===e.id&&`bg-muted/28 text-foreground/90`);return Ge?(0,j.jsxs)(`div`,{className:t,title:`${e.name} — ${e.cwd}`,children:[(0,j.jsx)(`span`,{className:p(`size-1.5 rounded-full`,je(e,L[e.id]?.status))}),(0,j.jsx)(`span`,{className:`truncate`,children:e.name})]},e.id):(0,j.jsxs)(`button`,{type:`button`,className:p(t,`hover:bg-muted/20 hover:text-foreground/85`),onClick:()=>k(e.id),title:`${e.name} — ${e.cwd}`,children:[(0,j.jsx)(`span`,{className:p(`size-1.5 rounded-full`,je(e,L[e.id]?.status))}),(0,j.jsx)(`span`,{className:`truncate`,children:e.name}),(0,j.jsx)(`span`,{role:`button`,tabIndex:0,className:`ml-1 rounded-sm p-0.5 opacity-60 hover:bg-background hover:opacity-100`,onClick:t=>{t.stopPropagation(),Y(e.id)},onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),t.stopPropagation(),Y(e.id))},"aria-label":d(`terminalCloseSession`,{name:e.name}),children:(0,j.jsx)(o,{className:`size-3`})})]},e.id)})}),Ge?null:(0,j.jsxs)(`div`,{className:`relative shrink-0`,ref:Se,children:[(0,j.jsxs)(`div`,{className:`flex items-center overflow-hidden rounded-md border border-border bg-background`,children:[(0,j.jsx)(`button`,{type:`button`,className:`inline-flex h-7 w-7 items-center justify-center text-foreground/85 transition-colors hover:bg-muted/20 disabled:pointer-events-none disabled:opacity-50`,onClick:()=>void we(E),disabled:Re,title:Ie?d(`terminalNewWithProfile`,{name:Ie.name}):d(`terminalNew`),"aria-label":d(`terminalNew`),children:F?(0,j.jsx)(n,{className:`size-3.5 animate-spin`}):(0,j.jsx)(t,{className:`size-3.5`})}),X.length>0?(0,j.jsx)(`button`,{type:`button`,className:`inline-flex h-7 w-7 items-center justify-center border-l border-border text-muted-foreground/72 transition-colors hover:bg-muted/20 hover:text-foreground/85 disabled:pointer-events-none disabled:opacity-50`,onClick:()=>z(e=>!e),disabled:Re,title:d(`terminalSelectShell`),"aria-label":d(`terminalSelectShell`),"aria-expanded":R,children:(0,j.jsx)(i,{className:`size-3.5`})}):null]}),R?(0,j.jsxs)(`div`,{className:p(`absolute right-0 z-30 w-64 overflow-hidden rounded-lg border border-border bg-background p-1.5 shadow-[0_16px_38px_-22px_rgb(15_23_42_/_0.65)]`,$?`top-9`:`bottom-9`),children:[(0,j.jsx)(`div`,{className:`px-2 pb-1.5 pt-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60`,children:d(`terminalNewWith`)}),X.map(e=>(0,j.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground/80 hover:bg-muted/20 hover:text-foreground/90`,onClick:()=>{z(!1),we(E,e.id)},children:[(0,j.jsx)(`span`,{className:`inline-flex size-5 shrink-0 items-center justify-center rounded bg-muted/20 text-[10px] text-muted-foreground/70`,children:e.name.slice(0,1).toUpperCase()}),(0,j.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,j.jsx)(`span`,{className:`block truncate font-medium`,children:e.name}),(0,j.jsx)(`span`,{className:`block truncate font-mono text-[11px] text-muted-foreground/55`,children:e.command})]})]},e.id))]}):null]}),Ge?null:(0,j.jsx)(f,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:()=>me(e=>!e),title:d(B?`terminalExitFullscreen`:`terminalFullscreen`),"aria-label":d(B?`terminalExitFullscreen`:`terminalFullscreen`),children:B?(0,j.jsx)(c,{className:`size-3.5`}):(0,j.jsx)(a,{className:`size-3.5`})}),(0,j.jsx)(f,{variant:`ghost`,size:`icon`,className:p(`size-7`,$&&`hidden`),onClick:r,title:d(`terminalCollapse`),"aria-label":d(`terminalCollapse`),children:(0,j.jsx)(i,{className:`size-3.5`})})]}),Q?(0,j.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-b border-border px-3 py-1.5 text-xs text-destructive`,children:[(0,j.jsx)(`span`,{children:Q}),Be&&J?(0,j.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1`,children:[(0,j.jsx)(`button`,{type:`button`,className:`rounded px-1.5 py-0.5 font-medium text-foreground/80 hover:bg-muted/40`,onClick:()=>void Ae(J.id),disabled:F,children:d(`terminalStartNew`)}),(0,j.jsx)(`button`,{type:`button`,className:`rounded px-1.5 py-0.5 font-medium text-muted-foreground hover:bg-muted/40`,onClick:()=>void Y(J.id),children:d(`close`)})]}):ze&&J&&!J.exited?(0,j.jsx)(`button`,{type:`button`,className:`shrink-0 rounded px-1.5 py-0.5 font-medium text-destructive hover:bg-destructive/10`,onClick:()=>ke(J.id),children:d(`retry`)}):null]}):Ue?(0,j.jsx)(`div`,{className:`border-b border-border px-3 py-1.5 text-xs text-muted-foreground/70`,children:Ue}):null,(0,j.jsx)(`div`,{className:p(`min-h-0 bg-background`,$&&`flex-1`),style:Ke===void 0?void 0:{height:Ke},children:P?(0,j.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-xs text-muted-foreground/60`,children:[(0,j.jsx)(n,{className:`size-4 animate-spin`}),` `,d(`terminalStarting`)]}):b&&!b.enabled?(0,j.jsx)(`div`,{className:`flex h-full items-center justify-center px-4 text-center text-xs text-muted-foreground/60`,children:b.reason||d(`terminalUnavailable`)}):E.length===0?(0,j.jsx)(`div`,{className:`flex h-full items-center justify-center text-xs text-muted-foreground/60`,children:d(`terminalNoSessions`)}):E.map(e=>(0,j.jsx)(ne,{session:e,active:e.id===J?.id,height:B?window.innerHeight-36:$?0:A,retryKey:fe[e.id]||0,onReady:Ee,onExited:Te,onConnectionError:De,onConnectionState:Oe},e.id))})]})}export{P as TerminalDock,T as t};
|