@augmentd-labs/canvas-web 2.26.21 → 2.26.23
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/{DocumentBodyEditor-CE2S2X6g.js → DocumentBodyEditor-8DNmOBS0.js} +1 -1
- package/dist/assets/{DocumentIcon-BS10SIP6.js → DocumentIcon-x299QNu_.js} +1 -1
- package/dist/assets/{EditorOverlay-BUToR_av.js → EditorOverlay-Cv1MaTok.js} +1 -1
- package/dist/assets/{FileForm-BxTixeDm.js → FileForm-DhQhVnoi.js} +1 -1
- package/dist/assets/{FiltersApplet-DNYAQP5F.js → FiltersApplet-BAe-Eq0e.js} +1 -1
- package/dist/assets/{HomeFab-CpTZdNyY.js → HomeFab-BXSAtndH.js} +2 -2
- package/dist/assets/{IdentityFields-C2MPM-Ab.js → IdentityFields-OPEWPlZs.js} +1 -1
- package/dist/assets/{LensApplet-CRa1j2WP.js → LensApplet-DuADvEm5.js} +1 -1
- package/dist/assets/LinkToCard-nR7Lal_o.js +1 -0
- package/dist/assets/{MarkdownEditor-7OqSDr7E.js → MarkdownEditor-CNY-VmKb.js} +2 -2
- package/dist/assets/{MessageComposerDialog-DzLhkHyh.js → MessageComposerDialog-gbD0Gu_b.js} +1 -1
- package/dist/assets/{NextShell-D9gvlKY2.js → NextShell-BIYs9fCL.js} +1 -1
- package/dist/assets/{NotesApplet-CFK86JYj.js → NotesApplet-BmLjXx7V.js} +1 -1
- package/dist/assets/ObjectPropertiesCard-ChvWbOpZ.js +8 -0
- package/dist/assets/{ObjectPropertiesCard-C3jt40tM.css → ObjectPropertiesCard-JArcZXXv.css} +1 -1
- package/dist/assets/{PathPickerField-cVs5sZuG.js → PathPickerField-DBe7jykL.js} +1 -1
- package/dist/assets/{PickDocumentsCard-BlicxMqC.js → PickDocumentsCard-Bo224P4q.js} +1 -1
- package/dist/assets/{SketchApplet-D8mkYmK9.js → SketchApplet-ADVOnSLI.js} +1 -1
- package/dist/assets/{SketchEditor-zMrm1npg.js → SketchEditor-CkgRysCG.js} +5 -5
- package/dist/assets/{TerminalApplet-BO2HRp0z.js → TerminalApplet-CkO4uaE3.js} +1 -1
- package/dist/assets/{TextDocumentEditor-7V4aFL8i.js → TextDocumentEditor-COvsHJXH.js} +1 -1
- package/dist/assets/{TodosApplet-swdaBT-2.js → TodosApplet-Bpf1OIH4.js} +1 -1
- package/dist/assets/{TodosWidget-BXF8fYer.js → TodosWidget-BIYqPXUp.js} +1 -1
- package/dist/assets/{UploadProgressList-B2xCVzFR.js → UploadProgressList-BXJr87lI.js} +1 -1
- package/dist/assets/{_agentId_-CHdTYJFu.js → _agentId_-Bquq_bl1.js} +0 -0
- package/dist/assets/{_contextId_-m9zn5qav.js → _contextId_-DndAgEMz.js} +1 -1
- package/dist/assets/{_workspaceName_-D0z9E9Uy.js → _workspaceName_-C_tzeHUf.js} +1 -1
- package/dist/assets/{about-pl0DXTEt.js → about-DpILEqyH.js} +1 -1
- package/dist/assets/{add-B30V-yHb.js → add-BHkmOOkO.js} +1 -1
- package/dist/assets/{agents-ClK3Y2x0.js → agents-DlLq0q2s.js} +1 -1
- package/dist/assets/{agents-Bc7_wscP.js → agents-lo0DGGKV.js} +1 -1
- package/dist/assets/{alert-dialog-DIA-tAP5.js → alert-dialog-izlVMXfa.js} +1 -1
- package/dist/assets/{api-tokens-O5iFESo0.js → api-tokens-DDH7LMJ7.js} +1 -1
- package/dist/assets/{appearance-DLo_2WH0.js → appearance-5Vx17gl4.js} +1 -1
- package/dist/assets/{applet-target-DnTa2VAT.js → applet-target-ChiiXVdC.js} +1 -1
- package/dist/assets/{apps-DzFFo5D0.js → apps-Ci03cFZm.js} +1 -1
- package/dist/assets/{auth-CUdpxbLV.js → auth-HZNJB4wv.js} +1 -1
- package/dist/assets/backend-sync-progress-H4Zch25P.js +7 -0
- package/dist/assets/{button-Bv4zA1qr.js → button-SgR3GVvV.js} +1 -1
- package/dist/assets/content-app-view-BFluU_u6.js +1 -0
- package/dist/assets/{context-D_K4g9SQ.js → context-mfIOB8dN.js} +1 -1
- package/dist/assets/{contexts-CgydYDn-2.js → contexts-CRWqFXzJ2.js} +1 -1
- package/dist/assets/{contexts-B6d6Axza.js → contexts-Ef3fHwv6.js} +1 -1
- package/dist/assets/{date-time-picker-BZaA3M9_.js → date-time-picker-B6mkWt-g.js} +1 -1
- package/dist/assets/{devices-D3-_UWM0.js → devices-C3gLuNDv.js} +1 -1
- package/dist/assets/{document-BG_mODBn.js → document-CX543Kcz.js} +1 -1
- package/dist/assets/document-list-rh4ittZx.js +2 -0
- package/dist/assets/embedding-B5JiUA9X.js +1 -0
- package/dist/assets/{embedding-m8SZH4oN.js → embedding-B7cWrpy0.js} +1 -1
- package/dist/assets/{form-panel-Dz96K7Lv.js → form-panel-C34lByEH.js} +1 -1
- package/dist/assets/{home-C5IxNq_5.js → home-Dus2Lg1o.js} +1 -1
- package/dist/assets/index-Tx_qtD_m.js +16 -0
- package/dist/assets/inferd-config-editor--MDmN_7w.js +1 -0
- package/dist/assets/{key-bindings-DomR6ZNC.js → key-bindings-C1Zk8f6z.js} +1 -1
- package/dist/assets/{label-CNoJOoe0.js → label-Dn4gCMcc.js} +1 -1
- package/dist/assets/{lazy-editor-Cbva8Pe2.js → lazy-editor-BSRnneOo.js} +2 -2
- package/dist/assets/{logs-CdbfY8_H.js → logs-Czn2sPeP.js} +1 -1
- package/dist/assets/{offline-BjMpUv3N.js → offline-CsRyFUg7.js} +1 -1
- package/dist/assets/{page-header-GtTr9Ff_.js → page-header-DkOHw0g-.js} +1 -1
- package/dist/assets/{public-share-DT9Tgn_Y.js → public-share-DXxVwHKT.js} +1 -1
- package/dist/assets/{query-debug-tVbB_8Z6.js → query-debug-YfWOzM6h.js} +1 -1
- package/dist/assets/{registry-BgnkvPjl.js → registry-J0TPxyW8.js} +2 -2
- package/dist/assets/{remotes-DR_iJClb.js → remotes-CdEU1Y5l.js} +1 -1
- package/dist/assets/{roles-DERIgujv.js → roles-BYHLwWCD.js} +1 -1
- package/dist/assets/roles-BpVWTMmp.js +2 -0
- package/dist/assets/{settings-B4LC1yCH.js → settings-B8BgCI2q.js} +1 -1
- package/dist/assets/settings-Ba8Od_Uj.js +14 -0
- package/dist/assets/{settings-BXOyceZ3.js → settings-D089lyYg.js} +1 -1
- package/dist/assets/{settings-DhoHM9AU.js → settings-DLbaI3my.js} +1 -1
- package/dist/assets/{share-target-CpjVaYVl.js → share-target-CMIiAOIz.js} +1 -1
- package/dist/assets/{shared-B824Ibpc.js → shared-B6YGbqUJ.js} +1 -1
- package/dist/assets/{shared-1dpCuibu.js → shared-D2uRUNdC.js} +1 -1
- package/dist/assets/sketch-lazy-pbG2cCpW.js +2 -0
- package/dist/assets/{subtree-transfer-dialog-B7s4r78T.js → subtree-transfer-dialog-ChBI5llU.js} +1 -1
- package/dist/assets/{text-documents-D_zDMyhB.js → text-documents-BvDFBVnC.js} +1 -1
- package/dist/assets/ui-Byg1cZDr.js +41 -0
- package/dist/assets/{use-applet-docs-Cry2SFsG.js → use-applet-docs-o5NAUFBk.js} +1 -1
- package/dist/assets/{use-applet-target-mkjQujx6.js → use-applet-target-cO-FiyPQ.js} +1 -1
- package/dist/assets/{use-canvas-pins-CZBfEB5E.js → use-canvas-pins-6vnfChWd.js} +2 -2
- package/dist/assets/{use-menu-BVkqNEIx.js → use-menu-BiJ8N7sS.js} +1 -1
- package/dist/assets/use-settings-back-CQauYjQ4.js +1 -0
- package/dist/assets/{use-sortable-data-DYIDDI8c.js → use-sortable-data-BW_0sXBs.js} +1 -1
- package/dist/assets/{use-workspace-identity-BVpGHkZq.js → use-workspace-identity-mgaofjsD.js} +1 -1
- package/dist/assets/{useAddTarget-CVRPElxz.js → useAddTarget-DUjaZdBQ.js} +1 -1
- package/dist/assets/{useAgentModels-ndLotMWH.js → useAgentModels-Cxb5NyCI.js} +1 -1
- package/dist/assets/{useDocumentThumbnail-C_rq2rXs.js → useDocumentThumbnail-DYLCC63L.js} +1 -1
- package/dist/assets/{useEditNoteFields-Bigs9ZG8.js → useEditNoteFields-zHEWwDfB.js} +1 -1
- package/dist/assets/{users-C9N-O1QA.js → users-CKz9kOoR.js} +1 -1
- package/dist/assets/{workspace-CJ1PWQ29.js → workspace-DvxC7pw1.js} +1 -1
- package/dist/assets/{workspace-area-menu-Ba_9bGKs.js → workspace-area-menu-Dg3hXKR3.js} +1 -1
- package/dist/assets/{workspace-content-gate-D8bzGD9i.js → workspace-content-gate-Be4tLYiB.js} +1 -1
- package/dist/assets/{workspace-import-form-D5JA8gzx.js → workspace-import-form-BRwc_oVg.js} +1 -1
- package/dist/assets/{workspaces-BBgdfAM_.js → workspaces-BOYcqiRy.js} +1 -1
- package/dist/assets/{workspaces-Dx5_N57M.js → workspaces-Da_hUIj3.js} +1 -1
- package/dist/index.html +36 -36
- package/dist/sw.js +1 -1
- package/package.json +2 -2
- package/dist/assets/LinkToCard-BZwwE-Dv.js +0 -1
- package/dist/assets/ObjectPropertiesCard-DDcRLpsW.js +0 -8
- package/dist/assets/backend-sync-progress-DWR42uQV.js +0 -7
- package/dist/assets/content-app-view-BUi8HG1r.js +0 -1
- package/dist/assets/document-list-BiogH4tf.js +0 -2
- package/dist/assets/embedding-Cjrxh6MN.js +0 -1
- package/dist/assets/index-DtZS4JJ4.js +0 -16
- package/dist/assets/inferd-config-editor-DagMmwW4.js +0 -1
- package/dist/assets/roles-DswT1Lv0.js +0 -2
- package/dist/assets/settings-CUzf6xEQ.js +0 -14
- package/dist/assets/sketch-lazy-Q58-vPF-.js +0 -2
- package/dist/assets/ui-BSqPn1LJ.js +0 -41
- package/dist/assets/use-settings-back-Dk-DJEUO.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{_ as r,g as ee}from"./chunk-62JRHF6Z-vspAGgtK.js";import{X as i}from"./ui-BSqPn1LJ.js";import{t as a}from"./button-Bv4zA1qr.js";import{t as o}from"./input-BOtCd4HP.js";import{n as te}from"./use-toast-BlLDqSUO.js";import{Pt as ne}from"./workspace-CJ1PWQ29.js";import{t as re}from"./use-mobile-Db-vWu9Y.js";import{p as ie}from"./context-D_K4g9SQ.js";import{t as s}from"./color-DFEH4BfK.js";import{i as ae}from"./use-menu-BVkqNEIx.js";import{B as oe,G as se,J as ce,K as le,L as ue,V as de,W as fe,X as pe,Y as me,Z as he,et as ge,ft as _e,ht as ve}from"./index-DtZS4JJ4.js";import{n as ye}from"./page-header-GtTr9Ff_.js";import{n as be,r as xe,t as Se}from"./useAgentModels-ndLotMWH.js";var c=e(n(),1),l=t(),Ce={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`,"lm-studio":``,vllm:``,custom:``},u={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`,"lm-studio":`http://localhost:1234/v1`,vllm:`http://localhost:8000/v1`,custom:``};function d(e){return u[e]||``}function f({label:e,hint:t,children:n}){return(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`label`,{className:`text-sm font-medium`,children:e}),t&&(0,l.jsx)(`p`,{className:`mb-1 mt-0.5 text-xs text-muted-foreground`,children:t}),(0,l.jsx)(`div`,{className:t?void 0:`mt-1`,children:n})]})}var p=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-y`,m=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`;function h(){let{agentId:e,tab:t}=r(),n=ee(),{showToast:u}=te(),{selectEntity:h,goBack:we}=ae(),Te=re(),g=ve(t);(0,c.useEffect)(()=>{t!==g&&e&&n(`/agents/${encodeURIComponent(e)}/settings/${g}`,{replace:!0})},[t,g,e,n]);let[_,v]=(0,c.useState)(null),[Ee,De]=(0,c.useState)(!0),[Oe,ke]=(0,c.useState)(null),[Ae,je]=(0,c.useState)(!1),[Me,Ne]=(0,c.useState)(!1),[Pe,Fe]=(0,c.useState)(``),[Ie,Le]=(0,c.useState)(``),[Re,ze]=(0,c.useState)(``),[Be,y]=(0,c.useState)(s()),[b,Ve]=(0,c.useState)(``),[x,He]=(0,c.useState)(``),[S,Ue]=(0,c.useState)(``),[C,We]=(0,c.useState)(``),[w,Ge]=(0,c.useState)(`anthropic`),[T,E]=(0,c.useState)(``),[D,O]=(0,c.useState)(``),[k,A]=(0,c.useState)(``),[Ke,qe]=(0,c.useState)(.7),[Je,j]=(0,c.useState)(4096),[Ye,Xe]=(0,c.useState)(1),Ze=Se(w,T,D,_?.id),Qe=Ze.models.find(e=>e.id===k),[$e,M]=(0,c.useState)([]),[N,P]=(0,c.useState)(``),[et,F]=(0,c.useState)(``),[I,L]=(0,c.useState)(``),[R,z]=(0,c.useState)(``),[tt,nt]=(0,c.useState)(!1),[rt,it]=(0,c.useState)(null),[B,V]=(0,c.useState)(null),[at,ot]=(0,c.useState)(null),[H,U]=(0,c.useState)(!1),[W,G]=(0,c.useState)(null),[K,st]=(0,c.useState)(`context`),[q,ct]=(0,c.useState)(``),[lt,ut]=(0,c.useState)(`/`),[J,dt]=(0,c.useState)(``),[ft,pt]=(0,c.useState)(!0),[Y,mt]=(0,c.useState)(!1),[ht,gt]=(0,c.useState)([]),[_t,vt]=(0,c.useState)([]),[X,yt]=(0,c.useState)(null),[bt,Z]=(0,c.useState)(`{}`),[xt,Q]=(0,c.useState)(null),[St,Ct]=(0,c.useState)(e);St!==e&&(Ct(e),De(!0),v(null)),(0,c.useEffect)(()=>{if(!e)return;let t=!1;return oe(e).then(async e=>{if(t)return;let n=e.config?.identity||{};v(e),h(e.id),Fe(e.name||``),Le(e.label||``),ze(e.description||``),y(e.color||s()),Ve(n.role||``),He(n.identity||``),Ue(n.instructions||``),We(e.config?.prompts?.system||``),Ge(e.llmProvider||`anthropic`),E(e.config?.apiKey||``),O(e.config?.baseUrl||d(e.llmProvider)),A(e.model||Ce[e.llmProvider]||``);let r=e.config?.connectors?.[e.llmProvider];r&&(qe(r.temperature??.7),j(r.maxTokens??4096),Xe(r.topP??1)),Z(JSON.stringify(e.config?.tools??{},null,2)),Q(null),ke(null);try{M(await le(e.id))}catch{M([])}}).catch(e=>{t||ke(e instanceof Error?e.message:`Failed to load agent`)}).finally(()=>{t||De(!1)}),()=>{t=!0}},[e,h]),(0,c.useEffect)(()=>{if(g!==`access`&&g!==`tools`||!_?.id)return;let e=_.id,t=!1;return Promise.all([de(_.id).catch(()=>null),ne().catch(()=>[]),ie().catch(()=>[]),fe(_.id).catch(()=>null)]).then(([n,r,ee,i])=>{t||(V(n),gt(r),vt(ee),yt(i?i.tools:[]),n&&(st(n.binding.type),ct(n.binding.workspace||``),ut(n.binding.path||`/`),dt(n.binding.context||``),pt(n.permissions.includes(`read`)),mt(n.permissions.includes(`write`))),ot(e))}),()=>{t=!0}},[g,_?.id]);let wt=()=>{let e=xe(b,x,S),t;try{let e=JSON.parse(bt);e&&typeof e==`object`&&!Array.isArray(e)&&(t=e)}catch{}return{...t===void 0?{}:{tools:t},name:Pe.trim(),label:Ie.trim(),description:Re.trim()||void 0,color:Be,llmProvider:w,model:k,apiKey:T.trim()||(w===_?.llmProvider?void 0:``),baseUrl:D||void 0,config:{type:w,model:k,identity:{role:b.trim()||void 0,identity:x.trim()||void 0,instructions:S.trim()||void 0},prompts:C.trim()||e?{system:C.trim()||e}:void 0,connectors:{[w]:{...w===`anthropic`?{}:{temperature:Ke},maxTokens:Je,topP:Ye}}}}},Tt=async e=>{if(e.preventDefault(),_){je(!0);try{let e=await ge(_.id,wt());v(e),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Saved`,description:`Agent updated`}),e.name&&e.name!==_.name&&n(`/agents/${encodeURIComponent(e.name)}/settings/${g}`,{replace:!0})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{je(!1)}}},Et=async()=>{if(_&&window.confirm(`Delete agent "${_.label||_.name}"? This cannot be undone.`)){Ne(!0);try{await ue(_.id),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Deleted`,description:`Agent removed`}),n(`/agents`)}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{Ne(!1)}}},$=()=>{P(``),F(``),L(``),z(``)},Dt=async()=>{if(!(!_||!R.trim()&&!I.trim())){nt(!0);try{let e=await se(_.id,R.trim()?{source:R.trim()}:{name:N,description:et,content:I});M(e),$(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Installed`,description:`Skill saved`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Skill install failed`,variant:`destructive`})}finally{nt(!1)}}},Ot=async e=>{if(_){it(e);try{let t=await ce(_.id,e);M(t),(N===e||R===e)&&$(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Removed`,description:`Skill "${e}" removed`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Skill remove failed`,variant:`destructive`})}finally{it(null)}}},kt=()=>K===`global`?{type:`global`}:K===`context`?J?{type:`context`,context:J}:null:q?K===`path`?{type:`path`,workspace:q,path:lt.trim()||`/`}:{type:`workspace`,workspace:q}:null,At=async()=>{if(!_||H)return;let e=kt(),t=[];if(ft&&t.push(`read`),Y&&t.push(`write`),!e||t.length===0){u({title:`Invalid binding`,description:`Pick a scope target and at least one permission`,variant:`destructive`});return}if(!(e.type===`global`&&!window.confirm(`Global scope lets this agent ${Y?`read and write`:`read`} ALL your workspaces. Continue?`))){U(!0);try{let n=await he(_.id,{binding:e,permissions:t});V(n.access),G(n.token),u({title:`Bound`,description:`Access bound — copy the token now, it is not shown again`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{U(!1)}}},jt=async()=>{if(!(!_||H)){U(!0);try{let e=await pe(_.id);V(e.access),G(e.token),u({title:`Rotated`,description:`New token minted — the previous one no longer works`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Rotate failed`,variant:`destructive`})}finally{U(!1)}}},Mt=async()=>{if(!(!_||H)&&window.confirm(`Revoke this agent's canvas access? Its token stops working immediately.`)){U(!0);try{await me(_.id),V(null),G(null),u({title:`Revoked`,description:`Agent access removed`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Revoke failed`,variant:`destructive`})}finally{U(!1)}}},Nt=e=>{if(e.type===`global`)return`Global — all workspaces`;if(e.type===`context`){let t=_t.find(t=>t.id===e.context);return`Context ${t?`${t.id} (${t.url})`:e.context} — follows the context live`}let t=e.workspaceName||e.workspace;return e.type===`path`?`Workspace ${t}, path ${e.path||`/`}`:`Workspace ${t} (whole tree)`};if(Ee)return(0,l.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!_||Oe)return(0,l.jsx)(`div`,{className:`p-6 text-sm text-destructive`,children:Oe||`Agent not found`});let Pt=_e.find(e=>e.id===g),Ft=encodeURIComponent(_.name||_.id),It=g===`identity`||g===`provider`||g===`models`||g===`tools`;return(0,l.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,l.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,l.jsx)(ye,{compact:!0,className:`mb-6 border-b pb-4`,title:`${Pt.label} - ${_.label||_.name}`,description:Pt.description,backTo:`/agents/${Ft}`,onBack:Te?we:void 0}),(0,l.jsxs)(`form`,{onSubmit:Tt,className:`space-y-6`,children:[g===`identity`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,l.jsx)(f,{label:`Name`,hint:`ID: ${_.id}`,children:(0,l.jsx)(o,{value:Pe,onChange:e=>Fe(e.target.value),placeholder:`lucy`})}),(0,l.jsx)(f,{label:`Label`,children:(0,l.jsx)(o,{value:Ie,onChange:e=>Le(e.target.value),placeholder:`Display name`})})]}),(0,l.jsx)(f,{label:`Description`,children:(0,l.jsx)(o,{value:Re,onChange:e=>ze(e.target.value),placeholder:`Short description`})}),(0,l.jsx)(f,{label:`Color`,children:(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(o,{type:`color`,value:Be,onChange:e=>y(e.target.value),className:`h-10 w-16 p-1`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>y(s()),children:`Randomize`})]})})]}),(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Persona`}),(0,l.jsx)(f,{label:`Role`,children:(0,l.jsx)(o,{value:b,onChange:e=>Ve(e.target.value),placeholder:`e.g. Software Engineer`})}),(0,l.jsx)(f,{label:`Identity`,children:(0,l.jsx)(`textarea`,{value:x,onChange:e=>He(e.target.value),placeholder:`Who this agent is…`,className:`${p} min-h-[80px]`})}),(0,l.jsx)(f,{label:`Instructions`,children:(0,l.jsx)(`textarea`,{value:S,onChange:e=>Ue(e.target.value),placeholder:`Behavioral instructions…`,className:`${p} min-h-[80px]`})}),(0,l.jsx)(f,{label:`System Prompt`,hint:`Compiled from Role + Identity + Instructions. Override manually.`,children:(0,l.jsx)(`textarea`,{value:C,onChange:e=>We(e.target.value),placeholder:`System prompt sent to the LLM…`,className:`${p} min-h-[140px] font-mono text-xs`})})]}),(0,l.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,l.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,l.jsxs)(a,{type:`button`,variant:`destructive`,disabled:Me,onClick:Et,children:[(0,l.jsx)(i,{className:`mr-2 h-4 w-4`}),Me?`Deleting...`:`Delete Agent`]})]})]}),g===`provider`&&(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(f,{label:`Provider`,children:(0,l.jsxs)(`select`,{value:w,onChange:e=>{let t=e.target.value;Ge(t),E(``),A(Ce[t]||``),O(d(t))},className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:[(0,l.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,l.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,l.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`}),(0,l.jsx)(`option`,{value:`lm-studio`,children:`LM Studio (Local)`}),(0,l.jsx)(`option`,{value:`vllm`,children:`vLLM (Local)`}),(0,l.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,l.jsx)(f,{label:`API Key`,hint:[`ollama`,`lm-studio`,`vllm`].includes(w)?`Any value works for local providers.`:void 0,children:(0,l.jsx)(o,{type:`password`,value:T,onChange:e=>E(e.target.value),placeholder:w===`ollama`?`ollama`:w===`lm-studio`?`lm-studio`:`sk-…`})}),(0,l.jsx)(f,{label:`Host / Base URL`,children:(0,l.jsx)(o,{value:D,onChange:e=>O(e.target.value),placeholder:d(w)||`https://api.example.com`})})]}),g===`models`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Main Model`}),(0,l.jsx)(f,{label:`Model`,children:(0,l.jsx)(be,{value:k,onChange:(e,t)=>{A(e),t?.maxTokens&&j(t.maxTokens)},...Ze})}),(0,l.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[w!==`anthropic`&&(0,l.jsx)(f,{label:`Temperature`,children:(0,l.jsx)(o,{type:`number`,min:0,max:2,step:.1,value:Ke,onChange:e=>qe(Number.isNaN(e.target.valueAsNumber)?.7:e.target.valueAsNumber)})}),(0,l.jsx)(f,{label:`Max Output Tokens`,children:(0,l.jsx)(o,{type:`number`,min:1,max:Qe?.maxTokens,value:Je,onChange:e=>j(parseInt(e.target.value)||4096)})}),(0,l.jsx)(f,{label:`Top P`,children:(0,l.jsx)(o,{type:`number`,min:0,max:1,step:.1,value:Ye,onChange:e=>Xe(Number.isNaN(e.target.valueAsNumber)?1:e.target.valueAsNumber)})})]})]}),[`Governance`,`Memory Management`,`Subagent / Tool Use`].map(e=>(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-4`,children:[(0,l.jsxs)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:[e,` Model`]}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Coming soon`})]},e))]}),g===`tools`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Runtime Tools`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Injected at start (pi defineTool): coding tools plus canvas tools scoped by the token binding (Access / ACL). Definitions live in the runtime — read-only here until the agent-runtime workspace lands.`})]}),X===null?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}):X.length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No tools resolved.`}):(0,l.jsx)(`div`,{className:`space-y-1.5`,children:X.map(e=>(0,l.jsxs)(`details`,{className:`rounded-md border px-3 py-2`,children:[(0,l.jsxs)(`summary`,{className:`cursor-pointer text-sm`,children:[(0,l.jsx)(`code`,{className:`font-mono text-xs font-medium`,children:e.name}),(0,l.jsx)(`span`,{className:`ml-2 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:e.source})]}),e.description&&(0,l.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap text-xs text-muted-foreground`,children:e.description}),e.parameters!=null&&(0,l.jsx)(`pre`,{className:`mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px]`,children:JSON.stringify(e.parameters,null,2)})]},e.name))}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:B?Nt(B.binding):`Unbound — no canvas tools are injected. Bind under Access / ACL.`})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Tools Config`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`config.tools JSON, merged server-side — e.g. {"canvas": {"enabled": false}} gates the canvas tools. Saved with Save Changes.`})]}),(0,l.jsx)(`textarea`,{value:bt,onChange:e=>{Z(e.target.value);try{JSON.parse(e.target.value),Q(null)}catch(e){Q(e instanceof Error?e.message:`Invalid JSON`)}},className:`${p} min-h-[120px] font-mono text-xs`}),xt&&(0,l.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Invalid JSON (not saved): `,xt]})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Skills`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed skills are saved immediately, independent of Save Changes.`})]}),$e.length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No skills installed.`}):$e.map(e=>(0,l.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,l.jsxs)(`div`,{className:`min-w-0`,children:[(0,l.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,l.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.package?e.source:e.description||`No description`})]}),(0,l.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{P(e.name),F(e.description||``),L(e.content||``),z(e.source||``)},children:`Edit`}),(0,l.jsx)(a,{type:`button`,variant:`destructive`,size:`sm`,disabled:rt===(e.source||e.name),onClick:()=>Ot(e.source||e.name),children:rt===(e.source||e.name)?`Removing…`:`Remove`})]})]},e.name)),(0,l.jsxs)(`div`,{className:`space-y-4 rounded-md border p-4`,children:[(0,l.jsx)(f,{label:`Package Source`,hint:`Use this for whole pi packages. Leave empty to save inline SKILL.md content.`,children:(0,l.jsx)(o,{value:R,onChange:e=>z(e.target.value),placeholder:`npm:@foo/pi-tools or git:github.com/badlogic/pi-doom`})}),(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,l.jsx)(f,{label:`Name`,children:(0,l.jsx)(o,{value:N,onChange:e=>P(e.target.value),placeholder:`skill-name, or read from frontmatter`,disabled:!!R.trim()})}),(0,l.jsx)(f,{label:`Description`,children:(0,l.jsx)(o,{value:et,onChange:e=>F(e.target.value),placeholder:`What this skill helps with`,disabled:!!R.trim()})})]}),(0,l.jsx)(f,{label:`SKILL.md Content`,children:(0,l.jsx)(`textarea`,{value:I,onChange:e=>L(e.target.value),placeholder:`# Skill instructions…`,disabled:!!R.trim(),className:`${p} min-h-[160px] font-mono text-xs`})}),(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(a,{type:`button`,disabled:tt||!R.trim()&&!I.trim(),onClick:Dt,children:tt?`Saving…`:`Install / Update Skill`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,onClick:$,children:`Clear`})]})]})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`MCP Servers`}),(_.config?.mcp?.servers||[]).length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No MCP servers configured.`}):(_.config?.mcp?.servers||[]).map((e,t)=>(0,l.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,l.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,l.jsxs)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:[e.command,` `,(e.args||[]).join(` `)]})]},t))]})]}),g===`access`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Canvas Access`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The agent talks to canvas through its own scoped token; the server clamps every request to the binding. Bind, rotate and revoke apply immediately.`})]}),at===_.id?B?(0,l.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3`,children:[(0,l.jsx)(`div`,{className:`text-sm font-medium`,children:Nt(B.binding)}),(0,l.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Permissions: `,B.permissions.join(`, `)||`none`,B.boundAt?` · bound ${new Date(B.boundAt).toLocaleString()}`:``,B.rotatedAt?` · token rotated ${new Date(B.rotatedAt).toLocaleString()}`:``]}),(0,l.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:H,onClick:jt,children:`Rotate Token`}),(0,l.jsx)(a,{type:`button`,variant:`destructive`,size:`sm`,disabled:H,onClick:Mt,children:`Revoke Access`})]})]}):(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Unbound — this agent has no canvas access.`}):(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}),W&&(0,l.jsxs)(`div`,{className:`space-y-2 rounded-md border border-warning/50 bg-warning/10 p-3`,children:[(0,l.jsx)(`div`,{className:`text-xs font-medium`,children:`Agent token — shown once, store it now`}),(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`code`,{className:`flex-1 truncate rounded bg-background px-2 py-1 font-mono text-xs`,children:W}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>navigator.clipboard?.writeText(W),children:`Copy`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>G(null),children:`Dismiss`})]}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`In-process agents receive it automatically (canvas.env); external runtimes (agentd) take it as CANVAS_TOKEN.`})]})]}),(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:B?`Rebind`:`Bind`}),(0,l.jsx)(f,{label:`Scope`,hint:`Context bindings follow the context live; global spans all workspaces.`,children:(0,l.jsxs)(`select`,{value:K,onChange:e=>st(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:`context`,children:`Context (follows live)`}),(0,l.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,l.jsx)(`option`,{value:`path`,children:`Workspace path`}),(0,l.jsx)(`option`,{value:`global`,children:`Global (all workspaces)`})]})}),K===`context`&&(0,l.jsx)(f,{label:`Context`,children:(0,l.jsxs)(`select`,{value:J,onChange:e=>dt(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:``,children:`Select a context…`}),_t.map(e=>(0,l.jsxs)(`option`,{value:e.id,children:[e.id,` — `,e.url]},e.id))]})}),(K===`workspace`||K===`path`)&&(0,l.jsx)(f,{label:`Workspace`,children:(0,l.jsxs)(`select`,{value:q,onChange:e=>ct(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:``,children:`Select a workspace…`}),ht.map(e=>(0,l.jsx)(`option`,{value:e.name||e.id,children:e.label||e.name},e.id))]})}),K===`path`&&(0,l.jsx)(f,{label:`Base path`,hint:`The agent is clamped to this subtree.`,children:(0,l.jsx)(o,{value:lt,onChange:e=>ut(e.target.value),placeholder:`/work/projects/foo`})}),(0,l.jsx)(f,{label:`Permissions`,children:(0,l.jsxs)(`div`,{className:`flex gap-4 text-sm`,children:[(0,l.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`input`,{type:`checkbox`,checked:ft,onChange:e=>pt(e.target.checked)}),` read`]}),(0,l.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`input`,{type:`checkbox`,checked:Y,onChange:e=>mt(e.target.checked)}),` write`]})]})}),(0,l.jsx)(a,{type:`button`,disabled:H,onClick:At,children:H?`Working…`:B?`Rebind & Mint Token`:`Bind & Mint Token`})]})]}),g===`memory`&&(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Memory Engine`}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Loop-based memory management. Settings coming soon.`})]}),g===`integrations`&&(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Integrations`}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`IMAP, chat, SQL and REST API accounts. Coming soon.`})]}),It&&(0,l.jsx)(a,{type:`submit`,disabled:Ae,children:Ae?`Saving…`:`Save Changes`})]})]})})}export{h as default};
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{_ as r,g as ee}from"./chunk-62JRHF6Z-vspAGgtK.js";import{X as i}from"./ui-Byg1cZDr.js";import{t as a}from"./button-SgR3GVvV.js";import{t as o}from"./input-BOtCd4HP.js";import{n as te}from"./use-toast-BlLDqSUO.js";import{Pt as ne}from"./workspace-DvxC7pw1.js";import{t as re}from"./use-mobile-Db-vWu9Y.js";import{p as ie}from"./context-mfIOB8dN.js";import{t as s}from"./color-DFEH4BfK.js";import{i as ae}from"./use-menu-BiJ8N7sS.js";import{B as oe,G as se,J as ce,K as le,L as ue,V as de,W as fe,X as pe,Y as me,Z as he,et as ge,ft as _e,ht as ve}from"./index-Tx_qtD_m.js";import{n as ye}from"./page-header-DkOHw0g-.js";import{n as be,r as xe,t as Se}from"./useAgentModels-Cxb5NyCI.js";var c=e(n(),1),l=t(),Ce={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`,"lm-studio":``,vllm:``,custom:``},u={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`,"lm-studio":`http://localhost:1234/v1`,vllm:`http://localhost:8000/v1`,custom:``};function d(e){return u[e]||``}function f({label:e,hint:t,children:n}){return(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`label`,{className:`text-sm font-medium`,children:e}),t&&(0,l.jsx)(`p`,{className:`mb-1 mt-0.5 text-xs text-muted-foreground`,children:t}),(0,l.jsx)(`div`,{className:t?void 0:`mt-1`,children:n})]})}var p=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-y`,m=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`;function h(){let{agentId:e,tab:t}=r(),n=ee(),{showToast:u}=te(),{selectEntity:h,goBack:we}=ae(),Te=re(),g=ve(t);(0,c.useEffect)(()=>{t!==g&&e&&n(`/agents/${encodeURIComponent(e)}/settings/${g}`,{replace:!0})},[t,g,e,n]);let[_,v]=(0,c.useState)(null),[Ee,De]=(0,c.useState)(!0),[Oe,ke]=(0,c.useState)(null),[Ae,je]=(0,c.useState)(!1),[Me,Ne]=(0,c.useState)(!1),[Pe,Fe]=(0,c.useState)(``),[Ie,Le]=(0,c.useState)(``),[Re,ze]=(0,c.useState)(``),[Be,y]=(0,c.useState)(s()),[b,Ve]=(0,c.useState)(``),[x,He]=(0,c.useState)(``),[S,Ue]=(0,c.useState)(``),[C,We]=(0,c.useState)(``),[w,Ge]=(0,c.useState)(`anthropic`),[T,E]=(0,c.useState)(``),[D,O]=(0,c.useState)(``),[k,A]=(0,c.useState)(``),[Ke,qe]=(0,c.useState)(.7),[Je,j]=(0,c.useState)(4096),[Ye,Xe]=(0,c.useState)(1),Ze=Se(w,T,D,_?.id),Qe=Ze.models.find(e=>e.id===k),[$e,M]=(0,c.useState)([]),[N,P]=(0,c.useState)(``),[et,F]=(0,c.useState)(``),[I,L]=(0,c.useState)(``),[R,z]=(0,c.useState)(``),[tt,nt]=(0,c.useState)(!1),[rt,it]=(0,c.useState)(null),[B,V]=(0,c.useState)(null),[at,ot]=(0,c.useState)(null),[H,U]=(0,c.useState)(!1),[W,G]=(0,c.useState)(null),[K,st]=(0,c.useState)(`context`),[q,ct]=(0,c.useState)(``),[lt,ut]=(0,c.useState)(`/`),[J,dt]=(0,c.useState)(``),[ft,pt]=(0,c.useState)(!0),[Y,mt]=(0,c.useState)(!1),[ht,gt]=(0,c.useState)([]),[_t,vt]=(0,c.useState)([]),[X,yt]=(0,c.useState)(null),[bt,Z]=(0,c.useState)(`{}`),[xt,Q]=(0,c.useState)(null),[St,Ct]=(0,c.useState)(e);St!==e&&(Ct(e),De(!0),v(null)),(0,c.useEffect)(()=>{if(!e)return;let t=!1;return oe(e).then(async e=>{if(t)return;let n=e.config?.identity||{};v(e),h(e.id),Fe(e.name||``),Le(e.label||``),ze(e.description||``),y(e.color||s()),Ve(n.role||``),He(n.identity||``),Ue(n.instructions||``),We(e.config?.prompts?.system||``),Ge(e.llmProvider||`anthropic`),E(e.config?.apiKey||``),O(e.config?.baseUrl||d(e.llmProvider)),A(e.model||Ce[e.llmProvider]||``);let r=e.config?.connectors?.[e.llmProvider];r&&(qe(r.temperature??.7),j(r.maxTokens??4096),Xe(r.topP??1)),Z(JSON.stringify(e.config?.tools??{},null,2)),Q(null),ke(null);try{M(await le(e.id))}catch{M([])}}).catch(e=>{t||ke(e instanceof Error?e.message:`Failed to load agent`)}).finally(()=>{t||De(!1)}),()=>{t=!0}},[e,h]),(0,c.useEffect)(()=>{if(g!==`access`&&g!==`tools`||!_?.id)return;let e=_.id,t=!1;return Promise.all([de(_.id).catch(()=>null),ne().catch(()=>[]),ie().catch(()=>[]),fe(_.id).catch(()=>null)]).then(([n,r,ee,i])=>{t||(V(n),gt(r),vt(ee),yt(i?i.tools:[]),n&&(st(n.binding.type),ct(n.binding.workspace||``),ut(n.binding.path||`/`),dt(n.binding.context||``),pt(n.permissions.includes(`read`)),mt(n.permissions.includes(`write`))),ot(e))}),()=>{t=!0}},[g,_?.id]);let wt=()=>{let e=xe(b,x,S),t;try{let e=JSON.parse(bt);e&&typeof e==`object`&&!Array.isArray(e)&&(t=e)}catch{}return{...t===void 0?{}:{tools:t},name:Pe.trim(),label:Ie.trim(),description:Re.trim()||void 0,color:Be,llmProvider:w,model:k,apiKey:T.trim()||(w===_?.llmProvider?void 0:``),baseUrl:D||void 0,config:{type:w,model:k,identity:{role:b.trim()||void 0,identity:x.trim()||void 0,instructions:S.trim()||void 0},prompts:C.trim()||e?{system:C.trim()||e}:void 0,connectors:{[w]:{...w===`anthropic`?{}:{temperature:Ke},maxTokens:Je,topP:Ye}}}}},Tt=async e=>{if(e.preventDefault(),_){je(!0);try{let e=await ge(_.id,wt());v(e),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Saved`,description:`Agent updated`}),e.name&&e.name!==_.name&&n(`/agents/${encodeURIComponent(e.name)}/settings/${g}`,{replace:!0})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{je(!1)}}},Et=async()=>{if(_&&window.confirm(`Delete agent "${_.label||_.name}"? This cannot be undone.`)){Ne(!0);try{await ue(_.id),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Deleted`,description:`Agent removed`}),n(`/agents`)}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{Ne(!1)}}},$=()=>{P(``),F(``),L(``),z(``)},Dt=async()=>{if(!(!_||!R.trim()&&!I.trim())){nt(!0);try{let e=await se(_.id,R.trim()?{source:R.trim()}:{name:N,description:et,content:I});M(e),$(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Installed`,description:`Skill saved`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Skill install failed`,variant:`destructive`})}finally{nt(!1)}}},Ot=async e=>{if(_){it(e);try{let t=await ce(_.id,e);M(t),(N===e||R===e)&&$(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),u({title:`Removed`,description:`Skill "${e}" removed`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Skill remove failed`,variant:`destructive`})}finally{it(null)}}},kt=()=>K===`global`?{type:`global`}:K===`context`?J?{type:`context`,context:J}:null:q?K===`path`?{type:`path`,workspace:q,path:lt.trim()||`/`}:{type:`workspace`,workspace:q}:null,At=async()=>{if(!_||H)return;let e=kt(),t=[];if(ft&&t.push(`read`),Y&&t.push(`write`),!e||t.length===0){u({title:`Invalid binding`,description:`Pick a scope target and at least one permission`,variant:`destructive`});return}if(!(e.type===`global`&&!window.confirm(`Global scope lets this agent ${Y?`read and write`:`read`} ALL your workspaces. Continue?`))){U(!0);try{let n=await he(_.id,{binding:e,permissions:t});V(n.access),G(n.token),u({title:`Bound`,description:`Access bound — copy the token now, it is not shown again`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{U(!1)}}},jt=async()=>{if(!(!_||H)){U(!0);try{let e=await pe(_.id);V(e.access),G(e.token),u({title:`Rotated`,description:`New token minted — the previous one no longer works`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Rotate failed`,variant:`destructive`})}finally{U(!1)}}},Mt=async()=>{if(!(!_||H)&&window.confirm(`Revoke this agent's canvas access? Its token stops working immediately.`)){U(!0);try{await me(_.id),V(null),G(null),u({title:`Revoked`,description:`Agent access removed`})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Revoke failed`,variant:`destructive`})}finally{U(!1)}}},Nt=e=>{if(e.type===`global`)return`Global — all workspaces`;if(e.type===`context`){let t=_t.find(t=>t.id===e.context);return`Context ${t?`${t.id} (${t.url})`:e.context} — follows the context live`}let t=e.workspaceName||e.workspace;return e.type===`path`?`Workspace ${t}, path ${e.path||`/`}`:`Workspace ${t} (whole tree)`};if(Ee)return(0,l.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!_||Oe)return(0,l.jsx)(`div`,{className:`p-6 text-sm text-destructive`,children:Oe||`Agent not found`});let Pt=_e.find(e=>e.id===g),Ft=encodeURIComponent(_.name||_.id),It=g===`identity`||g===`provider`||g===`models`||g===`tools`;return(0,l.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,l.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,l.jsx)(ye,{compact:!0,className:`mb-6 border-b pb-4`,title:`${Pt.label} - ${_.label||_.name}`,description:Pt.description,backTo:`/agents/${Ft}`,onBack:Te?we:void 0}),(0,l.jsxs)(`form`,{onSubmit:Tt,className:`space-y-6`,children:[g===`identity`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,l.jsx)(f,{label:`Name`,hint:`ID: ${_.id}`,children:(0,l.jsx)(o,{value:Pe,onChange:e=>Fe(e.target.value),placeholder:`lucy`})}),(0,l.jsx)(f,{label:`Label`,children:(0,l.jsx)(o,{value:Ie,onChange:e=>Le(e.target.value),placeholder:`Display name`})})]}),(0,l.jsx)(f,{label:`Description`,children:(0,l.jsx)(o,{value:Re,onChange:e=>ze(e.target.value),placeholder:`Short description`})}),(0,l.jsx)(f,{label:`Color`,children:(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(o,{type:`color`,value:Be,onChange:e=>y(e.target.value),className:`h-10 w-16 p-1`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>y(s()),children:`Randomize`})]})})]}),(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Persona`}),(0,l.jsx)(f,{label:`Role`,children:(0,l.jsx)(o,{value:b,onChange:e=>Ve(e.target.value),placeholder:`e.g. Software Engineer`})}),(0,l.jsx)(f,{label:`Identity`,children:(0,l.jsx)(`textarea`,{value:x,onChange:e=>He(e.target.value),placeholder:`Who this agent is…`,className:`${p} min-h-[80px]`})}),(0,l.jsx)(f,{label:`Instructions`,children:(0,l.jsx)(`textarea`,{value:S,onChange:e=>Ue(e.target.value),placeholder:`Behavioral instructions…`,className:`${p} min-h-[80px]`})}),(0,l.jsx)(f,{label:`System Prompt`,hint:`Compiled from Role + Identity + Instructions. Override manually.`,children:(0,l.jsx)(`textarea`,{value:C,onChange:e=>We(e.target.value),placeholder:`System prompt sent to the LLM…`,className:`${p} min-h-[140px] font-mono text-xs`})})]}),(0,l.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,l.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,l.jsxs)(a,{type:`button`,variant:`destructive`,disabled:Me,onClick:Et,children:[(0,l.jsx)(i,{className:`mr-2 h-4 w-4`}),Me?`Deleting...`:`Delete Agent`]})]})]}),g===`provider`&&(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(f,{label:`Provider`,children:(0,l.jsxs)(`select`,{value:w,onChange:e=>{let t=e.target.value;Ge(t),E(``),A(Ce[t]||``),O(d(t))},className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:[(0,l.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,l.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,l.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`}),(0,l.jsx)(`option`,{value:`lm-studio`,children:`LM Studio (Local)`}),(0,l.jsx)(`option`,{value:`vllm`,children:`vLLM (Local)`}),(0,l.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,l.jsx)(f,{label:`API Key`,hint:[`ollama`,`lm-studio`,`vllm`].includes(w)?`Any value works for local providers.`:void 0,children:(0,l.jsx)(o,{type:`password`,value:T,onChange:e=>E(e.target.value),placeholder:w===`ollama`?`ollama`:w===`lm-studio`?`lm-studio`:`sk-…`})}),(0,l.jsx)(f,{label:`Host / Base URL`,children:(0,l.jsx)(o,{value:D,onChange:e=>O(e.target.value),placeholder:d(w)||`https://api.example.com`})})]}),g===`models`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Main Model`}),(0,l.jsx)(f,{label:`Model`,children:(0,l.jsx)(be,{value:k,onChange:(e,t)=>{A(e),t?.maxTokens&&j(t.maxTokens)},...Ze})}),(0,l.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[w!==`anthropic`&&(0,l.jsx)(f,{label:`Temperature`,children:(0,l.jsx)(o,{type:`number`,min:0,max:2,step:.1,value:Ke,onChange:e=>qe(Number.isNaN(e.target.valueAsNumber)?.7:e.target.valueAsNumber)})}),(0,l.jsx)(f,{label:`Max Output Tokens`,children:(0,l.jsx)(o,{type:`number`,min:1,max:Qe?.maxTokens,value:Je,onChange:e=>j(parseInt(e.target.value)||4096)})}),(0,l.jsx)(f,{label:`Top P`,children:(0,l.jsx)(o,{type:`number`,min:0,max:1,step:.1,value:Ye,onChange:e=>Xe(Number.isNaN(e.target.valueAsNumber)?1:e.target.valueAsNumber)})})]})]}),[`Governance`,`Memory Management`,`Subagent / Tool Use`].map(e=>(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-4`,children:[(0,l.jsxs)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:[e,` Model`]}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Coming soon`})]},e))]}),g===`tools`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Runtime Tools`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Injected at start (pi defineTool): coding tools plus canvas tools scoped by the token binding (Access / ACL). Definitions live in the runtime — read-only here until the agent-runtime workspace lands.`})]}),X===null?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}):X.length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No tools resolved.`}):(0,l.jsx)(`div`,{className:`space-y-1.5`,children:X.map(e=>(0,l.jsxs)(`details`,{className:`rounded-md border px-3 py-2`,children:[(0,l.jsxs)(`summary`,{className:`cursor-pointer text-sm`,children:[(0,l.jsx)(`code`,{className:`font-mono text-xs font-medium`,children:e.name}),(0,l.jsx)(`span`,{className:`ml-2 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:e.source})]}),e.description&&(0,l.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap text-xs text-muted-foreground`,children:e.description}),e.parameters!=null&&(0,l.jsx)(`pre`,{className:`mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px]`,children:JSON.stringify(e.parameters,null,2)})]},e.name))}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:B?Nt(B.binding):`Unbound — no canvas tools are injected. Bind under Access / ACL.`})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Tools Config`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`config.tools JSON, merged server-side — e.g. {"canvas": {"enabled": false}} gates the canvas tools. Saved with Save Changes.`})]}),(0,l.jsx)(`textarea`,{value:bt,onChange:e=>{Z(e.target.value);try{JSON.parse(e.target.value),Q(null)}catch(e){Q(e instanceof Error?e.message:`Invalid JSON`)}},className:`${p} min-h-[120px] font-mono text-xs`}),xt&&(0,l.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Invalid JSON (not saved): `,xt]})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Skills`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed skills are saved immediately, independent of Save Changes.`})]}),$e.length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No skills installed.`}):$e.map(e=>(0,l.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,l.jsxs)(`div`,{className:`min-w-0`,children:[(0,l.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,l.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.package?e.source:e.description||`No description`})]}),(0,l.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{P(e.name),F(e.description||``),L(e.content||``),z(e.source||``)},children:`Edit`}),(0,l.jsx)(a,{type:`button`,variant:`destructive`,size:`sm`,disabled:rt===(e.source||e.name),onClick:()=>Ot(e.source||e.name),children:rt===(e.source||e.name)?`Removing…`:`Remove`})]})]},e.name)),(0,l.jsxs)(`div`,{className:`space-y-4 rounded-md border p-4`,children:[(0,l.jsx)(f,{label:`Package Source`,hint:`Use this for whole pi packages. Leave empty to save inline SKILL.md content.`,children:(0,l.jsx)(o,{value:R,onChange:e=>z(e.target.value),placeholder:`npm:@foo/pi-tools or git:github.com/badlogic/pi-doom`})}),(0,l.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,l.jsx)(f,{label:`Name`,children:(0,l.jsx)(o,{value:N,onChange:e=>P(e.target.value),placeholder:`skill-name, or read from frontmatter`,disabled:!!R.trim()})}),(0,l.jsx)(f,{label:`Description`,children:(0,l.jsx)(o,{value:et,onChange:e=>F(e.target.value),placeholder:`What this skill helps with`,disabled:!!R.trim()})})]}),(0,l.jsx)(f,{label:`SKILL.md Content`,children:(0,l.jsx)(`textarea`,{value:I,onChange:e=>L(e.target.value),placeholder:`# Skill instructions…`,disabled:!!R.trim(),className:`${p} min-h-[160px] font-mono text-xs`})}),(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(a,{type:`button`,disabled:tt||!R.trim()&&!I.trim(),onClick:Dt,children:tt?`Saving…`:`Install / Update Skill`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,onClick:$,children:`Clear`})]})]})]}),(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`MCP Servers`}),(_.config?.mcp?.servers||[]).length===0?(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No MCP servers configured.`}):(_.config?.mcp?.servers||[]).map((e,t)=>(0,l.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,l.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,l.jsxs)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:[e.command,` `,(e.args||[]).join(` `)]})]},t))]})]}),g===`access`&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Canvas Access`}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The agent talks to canvas through its own scoped token; the server clamps every request to the binding. Bind, rotate and revoke apply immediately.`})]}),at===_.id?B?(0,l.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3`,children:[(0,l.jsx)(`div`,{className:`text-sm font-medium`,children:Nt(B.binding)}),(0,l.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Permissions: `,B.permissions.join(`, `)||`none`,B.boundAt?` · bound ${new Date(B.boundAt).toLocaleString()}`:``,B.rotatedAt?` · token rotated ${new Date(B.rotatedAt).toLocaleString()}`:``]}),(0,l.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:H,onClick:jt,children:`Rotate Token`}),(0,l.jsx)(a,{type:`button`,variant:`destructive`,size:`sm`,disabled:H,onClick:Mt,children:`Revoke Access`})]})]}):(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Unbound — this agent has no canvas access.`}):(0,l.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}),W&&(0,l.jsxs)(`div`,{className:`space-y-2 rounded-md border border-warning/50 bg-warning/10 p-3`,children:[(0,l.jsx)(`div`,{className:`text-xs font-medium`,children:`Agent token — shown once, store it now`}),(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`code`,{className:`flex-1 truncate rounded bg-background px-2 py-1 font-mono text-xs`,children:W}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>navigator.clipboard?.writeText(W),children:`Copy`}),(0,l.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>G(null),children:`Dismiss`})]}),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`In-process agents receive it automatically (canvas.env); external runtimes (agentd) take it as CANVAS_TOKEN.`})]})]}),(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold`,children:B?`Rebind`:`Bind`}),(0,l.jsx)(f,{label:`Scope`,hint:`Context bindings follow the context live; global spans all workspaces.`,children:(0,l.jsxs)(`select`,{value:K,onChange:e=>st(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:`context`,children:`Context (follows live)`}),(0,l.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,l.jsx)(`option`,{value:`path`,children:`Workspace path`}),(0,l.jsx)(`option`,{value:`global`,children:`Global (all workspaces)`})]})}),K===`context`&&(0,l.jsx)(f,{label:`Context`,children:(0,l.jsxs)(`select`,{value:J,onChange:e=>dt(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:``,children:`Select a context…`}),_t.map(e=>(0,l.jsxs)(`option`,{value:e.id,children:[e.id,` — `,e.url]},e.id))]})}),(K===`workspace`||K===`path`)&&(0,l.jsx)(f,{label:`Workspace`,children:(0,l.jsxs)(`select`,{value:q,onChange:e=>ct(e.target.value),className:m,children:[(0,l.jsx)(`option`,{value:``,children:`Select a workspace…`}),ht.map(e=>(0,l.jsx)(`option`,{value:e.name||e.id,children:e.label||e.name},e.id))]})}),K===`path`&&(0,l.jsx)(f,{label:`Base path`,hint:`The agent is clamped to this subtree.`,children:(0,l.jsx)(o,{value:lt,onChange:e=>ut(e.target.value),placeholder:`/work/projects/foo`})}),(0,l.jsx)(f,{label:`Permissions`,children:(0,l.jsxs)(`div`,{className:`flex gap-4 text-sm`,children:[(0,l.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`input`,{type:`checkbox`,checked:ft,onChange:e=>pt(e.target.checked)}),` read`]}),(0,l.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(`input`,{type:`checkbox`,checked:Y,onChange:e=>mt(e.target.checked)}),` write`]})]})}),(0,l.jsx)(a,{type:`button`,disabled:H,onClick:At,children:H?`Working…`:B?`Rebind & Mint Token`:`Bind & Mint Token`})]})]}),g===`memory`&&(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Memory Engine`}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Loop-based memory management. Settings coming soon.`})]}),g===`integrations`&&(0,l.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,l.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Integrations`}),(0,l.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`IMAP, chat, SQL and REST API accounts. Coming soon.`})]}),It&&(0,l.jsx)(a,{type:`submit`,disabled:Ae,children:Ae?`Saving…`:`Save Changes`})]})]})})}export{h as default};
|