limixbot 0.3.21 → 0.3.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/assets/{ActivityPanel-Mm1AdBsr.js → ActivityPanel-ChjWicVw.js} +1 -1
  2. package/dist/assets/{App-BgFOjdcx.js → App-D-SXyZXT.js} +106 -106
  3. package/dist/assets/{AppEventEditor-Cgwtkp8X.js → AppEventEditor-NdlNZYiU.js} +1 -1
  4. package/dist/assets/{BotSettingsDialog-9DJvaJyA.js → BotSettingsDialog-DKIuZdV6.js} +1 -1
  5. package/dist/assets/{BrowserPanel-Bf3wrH1-.js → BrowserPanel-DjEwiL31.js} +1 -1
  6. package/dist/assets/{BrowserProfilesManager-CV3LMXnH.js → BrowserProfilesManager-1DLRt4N9.js} +1 -1
  7. package/dist/assets/{CloudAddDialog-B6_ctBlp.js → CloudAddDialog-C0DMYGOm.js} +1 -1
  8. package/dist/assets/{ComputerFilesPane-DUKJxzPV.js → ComputerFilesPane-Dk8NcRrf.js} +1 -1
  9. package/dist/assets/{ComputerPanel-DQLD56ji.js → ComputerPanel-DoVcLtW7.js} +2 -2
  10. package/dist/assets/{DataPanel-CqPvkhZs.js → DataPanel-C0Fx7K2G.js} +1 -1
  11. package/dist/assets/{FilesView-BTIH8GhL.js → FilesView-D5s67U7H.js} +1 -1
  12. package/dist/assets/{GrokMoveDialog-ipjhCMdt.js → GrokMoveDialog-itIjM39_.js} +1 -1
  13. package/dist/assets/{InspectorPanel-CYJ3PKQE.js → InspectorPanel-NMTlN3H-.js} +1 -1
  14. package/dist/assets/{KeyboardShortcutsModal-DbroQplB.js → KeyboardShortcutsModal-O3skmvQm.js} +1 -1
  15. package/dist/assets/{LiveDesktop-CjcPYyQC.js → LiveDesktop-CO9mKNtY.js} +1 -1
  16. package/dist/assets/{LocalVmWorkspace-DLOgAgD1.js → LocalVmWorkspace-BLrh4g6E.js} +1 -1
  17. package/dist/assets/{MacLocalControl-BKOo9Q9t.js → MacLocalControl-DyhXTfbp.js} +1 -1
  18. package/dist/assets/{MarkdownFilePreview-Ck90v9JO.js → MarkdownFilePreview-CyJn1rQP.js} +1 -1
  19. package/dist/assets/{NewBotDialog-CPh_4jgn.js → NewBotDialog-coMM5O6x.js} +1 -1
  20. package/dist/assets/{PhoneAppDialog-C8LY6ZYR.js → PhoneAppDialog-D_CgApJp.js} +1 -1
  21. package/dist/assets/{PluginsPanel-CPNu9R4X.js → PluginsPanel-C2bbrSB3.js} +1 -1
  22. package/dist/assets/{ProIntroduction-mmdyWV6u.js → ProIntroduction-8BVPIU2J.js} +1 -1
  23. package/dist/assets/{RemoteAgentSettingsPanel-D_-DQsXX.js → RemoteAgentSettingsPanel-JMsDeyDs.js} +1 -1
  24. package/dist/assets/{RoomPanel-Bl074tib.js → RoomPanel-BcFX5BFK.js} +1 -1
  25. package/dist/assets/{RoutinesPage-BBqOFUgN.js → RoutinesPage-BZhG-dR9.js} +1 -1
  26. package/dist/assets/{SettingsModal-CZC8Y2Ps.js → SettingsModal-CWtO0RWS.js} +1 -1
  27. package/dist/assets/{ShareTeamDialog-lWV9SoFf.js → ShareTeamDialog-Cf4VzjYH.js} +1 -1
  28. package/dist/assets/{SignedInSites-BtB_gJc5.js → SignedInSites-31u9pN2b.js} +1 -1
  29. package/dist/assets/{TeamLibraryPanel-CicCxQWY.js → TeamLibraryPanel-Bzvx_MlH.js} +1 -1
  30. package/dist/assets/{TeamMapPage-DC2UVHtD.js → TeamMapPage-BrrWMFul.js} +1 -1
  31. package/dist/assets/{TriggersPage-DV-VkZxS.js → TriggersPage-GuMhNUuU.js} +1 -1
  32. package/dist/assets/{VisibilitySection-DxS0LSuh.js → VisibilitySection-C6eVm1Hd.js} +1 -1
  33. package/dist/assets/{WebhookTrigger-CbjFXdP6.js → WebhookTrigger-BGm39FBT.js} +1 -1
  34. package/dist/assets/{WorksOnGrid-DwzG9r3j.js → WorksOnGrid-9NWPGzbE.js} +1 -1
  35. package/dist/assets/{core-zyskLUd7.js → core-GxNVTB-X.js} +1 -1
  36. package/dist/assets/{import-name-DT6x8SH1.js → import-name-B8g_Hj2F.js} +1 -1
  37. package/dist/assets/{index-BK27ZkYf.js → index-B8LCAG4-.js} +1 -1
  38. package/dist/assets/{index--etc8Lh7.js → index-LBC94myy.js} +2 -2
  39. package/dist/assets/{mcp-servers-DyW90x_D.js → mcp-servers-C_F4MXjY.js} +1 -1
  40. package/dist/assets/{new-bot-vTUVmgdn.js → new-bot-CFOYR98I.js} +1 -1
  41. package/dist/assets/{org-library-DZclNfAa.js → org-library-TYYMsAm5.js} +1 -1
  42. package/dist/assets/{package-format-Bf1YgVUD.js → package-format-CrrPupM8.js} +1 -1
  43. package/dist/assets/{remote-desktop-panel-AqU9h8PU.js → remote-desktop-panel-BmwpQiDu.js} +1 -1
  44. package/dist/index.html +1 -1
  45. package/dist-server/index.js +12 -10
  46. package/dist-server/openmausbot.js +13 -12
  47. package/dist-server/package.json +1 -1
  48. package/dist-server/pair-cli.js +13 -12
  49. package/dist-server/server/drivers/antigravity.js +27 -1
  50. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- import{n as y,_ as O,a_ as P,a$ as U,b0 as C,m as N,b1 as E,b2 as L,b3 as j,b4 as _,b5 as R,b6 as I,b7 as F}from"./App-BgFOjdcx.js";import{t as h}from"./styles-BHtUK2qB.js";import{b as x}from"./PlacesRail-CUntVv3u.js";const V={profile:{},memory:{},skills:[],routines:[]},J=r=>({name:r.name,prompt:r.prompt,schedule:r.schedule,enabled:r.enabled,runOn:r.runOn,durationMinutes:r.durationMinutes,timeoutMinutes:r.timeoutMinutes,overlap:r.overlap,attachments:r.attachments});class D{constructor(e,o,t=y){this.changed=o,this.network=t,this.template=structuredClone(e),this.routines=e.routines.map(s=>this.routine({...s,botId:this.id}))}changed;network;id=`draft-${O()}`;template;consent={};routines;preset;role;avatarFile;avatarObjectUrl;get bot(){const{computer:e,cwd:o,toolScope:t,...s}=this.template.profile;return{id:this.id,threadId:this.id,name:"",title:"",description:"",soul:"",color:"green",notifications:!0,unread:!1,messages:[],modelSelection:{instanceId:"",model:""},...s,computer:e??void 0,cwd:o??void 0,toolScope:t??void 0}}patch(e){const{acknowledgeLocalAuto:o,acknowledgePeerScope:t,applyToAllThreads:s,keepThreadModels:a,autoApprove:i,...l}=e;o!==void 0&&(this.consent.acknowledgeLocalAuto=o),t!==void 0&&(this.consent.acknowledgePeerScope=t),i!==void 0&&l.approvalMode===void 0&&(l.approvalMode=i?"auto":"ask"),this.template.profile={...this.template.profile,...l},this.changed()}setModel(e){this.patch({modelSelection:e})}choosePreset(e){this.preset=e,this.changed()}chooseRole(e){this.role=e,this.changed()}setMemory(e,o){o===null?delete this.template.memory[e]:this.template.memory[e]=o,this.changed()}setRoutineEnabled(e,o){this.routines=this.routines.map(t=>t.id===e?{...t,enabled:o}:t),this.changed()}removeRoutine(e){this.routines=this.routines.filter(o=>o.id!==e),this.changed()}export(){return structuredClone({...this.template,routines:this.routines.map(J)})}uploadAvatar=async e=>{if(!["image/png","image/jpeg","image/gif","image/webp"].includes(e.type))throw new Error(h("newBot.avatar.invalidType"));if(e.size>10*1024*1024)throw new Error(h("newBot.avatar.tooLarge"));return this.avatarObjectUrl&&URL.revokeObjectURL(this.avatarObjectUrl),this.avatarFile=e,this.avatarObjectUrl=URL.createObjectURL(e),this.avatarObjectUrl};dispose(){this.avatarObjectUrl&&URL.revokeObjectURL(this.avatarObjectUrl)}routine(e,o){const{groupId:t,resultsThreadId:s,checks:a,access:i,deliver:l,modelSelection:c,schedule:n,...m}=e,p=n.type==="interval"?{...n,weekdays:n.weekdays??void 0,window:n.window??void 0,endsAt:n.endsAt??void 0}:n.type==="limit_reset"?{...n,repeat:n.repeat??"once",at:n.at??null}:n;return{id:o?.id??`draft-${O()}`,createdAt:o?.createdAt??Date.now(),updatedAt:Date.now(),nextRunAt:null,runOn:"maus",...o,...m,enabled:e.enabled??o?.enabled??!0,target:"bot",botId:this.id,timeoutMinutes:e.timeoutMinutes??void 0,durationMinutes:e.durationMinutes??o?.durationMinutes??30,schedule:p}}request=async(e,o)=>{const t=o?.method??"GET",s=typeof o?.body=="string"?JSON.parse(o.body):{},a=`/api/bots/${this.id}`;let i;if(e===a&&t==="PATCH")this.patch(s),i={bot:this.bot};else if(e===`${a}/soul`&&t==="GET")i={soul:this.bot.soul,revision:"draft",bytes:new TextEncoder().encode(this.bot.soul).length,limit:24e3,file:"",drift:!1};else if(e===`${a}/skills`&&t==="GET")i={skills:this.template.skills,staged:[]};else if(e===`${a}/skills`&&t==="POST"){const l=await this.network("/api/bot-defaults/skills/preview",{method:"POST",body:JSON.stringify(s)}),c=new Set(this.template.skills.map(n=>n.name));if(l.skills.some(n=>c.has(n.name)))throw new Error(h("newBot.skillExists"));this.template.skills.push(...l.skills),this.changed(),i={installed:l.skills}}else if(e.startsWith(`${a}/skills/`)){const l=decodeURIComponent(e.slice(`${a}/skills/`.length)),c=this.template.skills.find(n=>n.name===l);if(!c)throw new Error("No such draft skill");if(t==="GET")i={text:c.text};else if(t==="PATCH"&&typeof s.enabled=="boolean")c.enabled=s.enabled,this.changed(),i={ok:!0};else if(t==="DELETE")this.template.skills=this.template.skills.filter(n=>n!==c),this.changed(),i={ok:!0};else throw new Error("Unsupported draft skill operation")}else if(e===`${a}/avatar/generate`&&t==="POST"){const{name:l,title:c,description:n}=this.bot,{dataUrl:m}=await this.network("/api/bot-defaults/avatar",{method:"POST",body:JSON.stringify({profile:{name:l,title:c,description:n},prompt:s.prompt})}),p=await(await fetch(m)).blob(),w=await this.uploadAvatar(new File([p],"avatar.png",{type:p.type}));i={avatarUrl:w,bot:{...this.bot,avatarUrl:w,avatarCrop:"circle"}}}else if(e==="/api/routines"&&t==="POST"||e.startsWith("/api/routines/draft-")&&t==="PATCH"){if(s.target&&s.target!=="bot")throw new Error("A new bot's routine must target that bot");if(s.botId!==this.id)throw new Error("Routine belongs to another bot");const l=this.routines.find(n=>e===`/api/routines/${n.id}`);if(t==="PATCH"&&!l)throw new Error("No such draft routine");const c=this.routine(s,l);this.routines=[...this.routines.filter(n=>n.id!==c.id),c],this.changed(),i={routine:c}}else throw new Error("This operation requires a created bot");return i}}async function G(r){const e=r.export();if(e.profile.avatarUrl?.startsWith("blob:")){if(!r.avatarFile)throw new Error(h("newBot.avatar.chooseAgain"));const o=await N(r.avatarFile),t=o&&x(o.path);if(!t)throw new Error(h("newBot.avatar.storeFailed"));e.profile.avatarUrl=t}return e}async function H(r,e=y,o=P,t=C(),s,a){const i=await G(r),{chiefOfStaff:l,managedSections:c,toolScope:n,modelSelection:m,...p}=i.profile;if(!p.name?.trim())throw new Error(h("newBot.nameRequired"));const w=r.preset,B=m?.instanceId&&m.model?{modelSelection:m,requireAvailableModel:!0}:{},k=await e("/api/bots",{method:"POST",body:JSON.stringify({name:p.name,title:p.title,description:p.description,...B,section:p.section,useDefaults:!1,...s!==void 0?{visibility:s}:{},...a?{reportsTo:a}:{},...Object.hasOwn(i.profile,"toolScope")?{settings:{toolScope:n}}:{},...w?{preset:w.id}:{}})});let u=k.bot;const g=[],v=[];try{const f=await o(u.id,{...p,...r.consent},new AbortController().signal,e,t,u);if(u={...u,...f},p.approvalMode==="full"||p.approvalMode==="custom"){if(f.approvalMode!==p.approvalMode)throw new Error(h("newBot.approvalNotGranted"));if((await U(u.id,u.threadId,{approvalMode:p.approvalMode,acknowledgeLocalAuto:r.consent.acknowledgeLocalAuto===!0},t,e)).approvalMode!==p.approvalMode)throw new Error(h("newBot.threadApprovalNotGranted"))}for(const[d,b]of Object.entries(i.memory))w?.notes.includes(d)||await e(`/api/bots/${u.id}/memory/file`,{method:"PUT",body:JSON.stringify({path:d,text:b})});for(const d of i.skills)w?.skills.includes(d.name)||await e(`/api/bots/${u.id}/skill-template`,{method:"POST",body:JSON.stringify(d)});for(const d of i.routines){const b=await e("/api/routines",{method:"POST",body:JSON.stringify({...d,botId:u.id,enabled:!1})});g.push({id:b.routine.id,enabled:d.enabled!==!1})}}catch(f){const d=[];for(const S of g)try{await e(`/api/routines/${S.id}`,{method:"DELETE"})}catch{d.push(`routine ${S.id}`)}try{await e(`/api/bots/${u.id}`,{method:"DELETE"})}catch{d.push(`bot ${u.name} (${u.id})`)}const b=f instanceof Error?f.message:String(f);throw new Error(d.length?`${b}. Cleanup failed for ${d.join(", ")}; remove them before retrying.`:b)}if(l)try{const f=await e(`/api/bots/${u.id}`,{method:"PATCH",body:JSON.stringify({chiefOfStaff:l,managedSections:c,acknowledgePeerScope:!0})});u={...u,...f.bot}}catch(f){v.push(h("newBot.warning.chiefOfStaff",{error:f instanceof Error?f.message:String(f)}))}for(const f of g.filter(d=>d.enabled))try{await e(`/api/routines/${f.id}`,{method:"PATCH",body:JSON.stringify({enabled:!0})})}catch(d){v.push(h("newBot.warning.routine",{error:d instanceof Error?d.message:String(d)}))}return{bot:u,warnings:v,...k.paused?{paused:!0}:{}}}function T(r,e){const o=structuredClone(r.defaults),t=o.profile.modelSelection;return(!t||t.instanceId===""&&t.model==="")&&(o.profile.modelSelection=r.modelSelection),e&&(o.profile.name=o.profile.name?.trim()||r.suggestedName),o}function A(r,e){const o=new Set(e.map(t=>t.name.trim().toLowerCase()));if(!o.has(r.trim().toLowerCase()))return r;for(let t=2;;t++)if(!o.has(`${r} ${t}`.toLowerCase()))return`${r} ${t}`}function M(r,e,o,t){if(r)return r;const s=o.filter(a=>!a.hidden&&(a.section?.trim()||"")===(e?.trim()||""));return F(s,t)?.email??t.me?.email??null}function $(r,e,o,{preserveSelection:t=!1,showThreads:s,source:a,role:i,paused:l}){j(a,i),r({type:"botAdded",bot:e,preserveSelection:t}),!t&&_()&&R(r,e,s),o.length&&r({type:"error",message:o.join(`
1
+ import{n as y,_ as O,a_ as P,a$ as U,b0 as C,m as N,b1 as E,b2 as L,b3 as j,b4 as _,b5 as R,b6 as I,b7 as F}from"./App-D-SXyZXT.js";import{t as h}from"./styles-BHtUK2qB.js";import{b as x}from"./PlacesRail-CUntVv3u.js";const V={profile:{},memory:{},skills:[],routines:[]},J=r=>({name:r.name,prompt:r.prompt,schedule:r.schedule,enabled:r.enabled,runOn:r.runOn,durationMinutes:r.durationMinutes,timeoutMinutes:r.timeoutMinutes,overlap:r.overlap,attachments:r.attachments});class D{constructor(e,o,t=y){this.changed=o,this.network=t,this.template=structuredClone(e),this.routines=e.routines.map(s=>this.routine({...s,botId:this.id}))}changed;network;id=`draft-${O()}`;template;consent={};routines;preset;role;avatarFile;avatarObjectUrl;get bot(){const{computer:e,cwd:o,toolScope:t,...s}=this.template.profile;return{id:this.id,threadId:this.id,name:"",title:"",description:"",soul:"",color:"green",notifications:!0,unread:!1,messages:[],modelSelection:{instanceId:"",model:""},...s,computer:e??void 0,cwd:o??void 0,toolScope:t??void 0}}patch(e){const{acknowledgeLocalAuto:o,acknowledgePeerScope:t,applyToAllThreads:s,keepThreadModels:a,autoApprove:i,...l}=e;o!==void 0&&(this.consent.acknowledgeLocalAuto=o),t!==void 0&&(this.consent.acknowledgePeerScope=t),i!==void 0&&l.approvalMode===void 0&&(l.approvalMode=i?"auto":"ask"),this.template.profile={...this.template.profile,...l},this.changed()}setModel(e){this.patch({modelSelection:e})}choosePreset(e){this.preset=e,this.changed()}chooseRole(e){this.role=e,this.changed()}setMemory(e,o){o===null?delete this.template.memory[e]:this.template.memory[e]=o,this.changed()}setRoutineEnabled(e,o){this.routines=this.routines.map(t=>t.id===e?{...t,enabled:o}:t),this.changed()}removeRoutine(e){this.routines=this.routines.filter(o=>o.id!==e),this.changed()}export(){return structuredClone({...this.template,routines:this.routines.map(J)})}uploadAvatar=async e=>{if(!["image/png","image/jpeg","image/gif","image/webp"].includes(e.type))throw new Error(h("newBot.avatar.invalidType"));if(e.size>10*1024*1024)throw new Error(h("newBot.avatar.tooLarge"));return this.avatarObjectUrl&&URL.revokeObjectURL(this.avatarObjectUrl),this.avatarFile=e,this.avatarObjectUrl=URL.createObjectURL(e),this.avatarObjectUrl};dispose(){this.avatarObjectUrl&&URL.revokeObjectURL(this.avatarObjectUrl)}routine(e,o){const{groupId:t,resultsThreadId:s,checks:a,access:i,deliver:l,modelSelection:c,schedule:n,...m}=e,p=n.type==="interval"?{...n,weekdays:n.weekdays??void 0,window:n.window??void 0,endsAt:n.endsAt??void 0}:n.type==="limit_reset"?{...n,repeat:n.repeat??"once",at:n.at??null}:n;return{id:o?.id??`draft-${O()}`,createdAt:o?.createdAt??Date.now(),updatedAt:Date.now(),nextRunAt:null,runOn:"maus",...o,...m,enabled:e.enabled??o?.enabled??!0,target:"bot",botId:this.id,timeoutMinutes:e.timeoutMinutes??void 0,durationMinutes:e.durationMinutes??o?.durationMinutes??30,schedule:p}}request=async(e,o)=>{const t=o?.method??"GET",s=typeof o?.body=="string"?JSON.parse(o.body):{},a=`/api/bots/${this.id}`;let i;if(e===a&&t==="PATCH")this.patch(s),i={bot:this.bot};else if(e===`${a}/soul`&&t==="GET")i={soul:this.bot.soul,revision:"draft",bytes:new TextEncoder().encode(this.bot.soul).length,limit:24e3,file:"",drift:!1};else if(e===`${a}/skills`&&t==="GET")i={skills:this.template.skills,staged:[]};else if(e===`${a}/skills`&&t==="POST"){const l=await this.network("/api/bot-defaults/skills/preview",{method:"POST",body:JSON.stringify(s)}),c=new Set(this.template.skills.map(n=>n.name));if(l.skills.some(n=>c.has(n.name)))throw new Error(h("newBot.skillExists"));this.template.skills.push(...l.skills),this.changed(),i={installed:l.skills}}else if(e.startsWith(`${a}/skills/`)){const l=decodeURIComponent(e.slice(`${a}/skills/`.length)),c=this.template.skills.find(n=>n.name===l);if(!c)throw new Error("No such draft skill");if(t==="GET")i={text:c.text};else if(t==="PATCH"&&typeof s.enabled=="boolean")c.enabled=s.enabled,this.changed(),i={ok:!0};else if(t==="DELETE")this.template.skills=this.template.skills.filter(n=>n!==c),this.changed(),i={ok:!0};else throw new Error("Unsupported draft skill operation")}else if(e===`${a}/avatar/generate`&&t==="POST"){const{name:l,title:c,description:n}=this.bot,{dataUrl:m}=await this.network("/api/bot-defaults/avatar",{method:"POST",body:JSON.stringify({profile:{name:l,title:c,description:n},prompt:s.prompt})}),p=await(await fetch(m)).blob(),w=await this.uploadAvatar(new File([p],"avatar.png",{type:p.type}));i={avatarUrl:w,bot:{...this.bot,avatarUrl:w,avatarCrop:"circle"}}}else if(e==="/api/routines"&&t==="POST"||e.startsWith("/api/routines/draft-")&&t==="PATCH"){if(s.target&&s.target!=="bot")throw new Error("A new bot's routine must target that bot");if(s.botId!==this.id)throw new Error("Routine belongs to another bot");const l=this.routines.find(n=>e===`/api/routines/${n.id}`);if(t==="PATCH"&&!l)throw new Error("No such draft routine");const c=this.routine(s,l);this.routines=[...this.routines.filter(n=>n.id!==c.id),c],this.changed(),i={routine:c}}else throw new Error("This operation requires a created bot");return i}}async function G(r){const e=r.export();if(e.profile.avatarUrl?.startsWith("blob:")){if(!r.avatarFile)throw new Error(h("newBot.avatar.chooseAgain"));const o=await N(r.avatarFile),t=o&&x(o.path);if(!t)throw new Error(h("newBot.avatar.storeFailed"));e.profile.avatarUrl=t}return e}async function H(r,e=y,o=P,t=C(),s,a){const i=await G(r),{chiefOfStaff:l,managedSections:c,toolScope:n,modelSelection:m,...p}=i.profile;if(!p.name?.trim())throw new Error(h("newBot.nameRequired"));const w=r.preset,B=m?.instanceId&&m.model?{modelSelection:m,requireAvailableModel:!0}:{},k=await e("/api/bots",{method:"POST",body:JSON.stringify({name:p.name,title:p.title,description:p.description,...B,section:p.section,useDefaults:!1,...s!==void 0?{visibility:s}:{},...a?{reportsTo:a}:{},...Object.hasOwn(i.profile,"toolScope")?{settings:{toolScope:n}}:{},...w?{preset:w.id}:{}})});let u=k.bot;const g=[],v=[];try{const f=await o(u.id,{...p,...r.consent},new AbortController().signal,e,t,u);if(u={...u,...f},p.approvalMode==="full"||p.approvalMode==="custom"){if(f.approvalMode!==p.approvalMode)throw new Error(h("newBot.approvalNotGranted"));if((await U(u.id,u.threadId,{approvalMode:p.approvalMode,acknowledgeLocalAuto:r.consent.acknowledgeLocalAuto===!0},t,e)).approvalMode!==p.approvalMode)throw new Error(h("newBot.threadApprovalNotGranted"))}for(const[d,b]of Object.entries(i.memory))w?.notes.includes(d)||await e(`/api/bots/${u.id}/memory/file`,{method:"PUT",body:JSON.stringify({path:d,text:b})});for(const d of i.skills)w?.skills.includes(d.name)||await e(`/api/bots/${u.id}/skill-template`,{method:"POST",body:JSON.stringify(d)});for(const d of i.routines){const b=await e("/api/routines",{method:"POST",body:JSON.stringify({...d,botId:u.id,enabled:!1})});g.push({id:b.routine.id,enabled:d.enabled!==!1})}}catch(f){const d=[];for(const S of g)try{await e(`/api/routines/${S.id}`,{method:"DELETE"})}catch{d.push(`routine ${S.id}`)}try{await e(`/api/bots/${u.id}`,{method:"DELETE"})}catch{d.push(`bot ${u.name} (${u.id})`)}const b=f instanceof Error?f.message:String(f);throw new Error(d.length?`${b}. Cleanup failed for ${d.join(", ")}; remove them before retrying.`:b)}if(l)try{const f=await e(`/api/bots/${u.id}`,{method:"PATCH",body:JSON.stringify({chiefOfStaff:l,managedSections:c,acknowledgePeerScope:!0})});u={...u,...f.bot}}catch(f){v.push(h("newBot.warning.chiefOfStaff",{error:f instanceof Error?f.message:String(f)}))}for(const f of g.filter(d=>d.enabled))try{await e(`/api/routines/${f.id}`,{method:"PATCH",body:JSON.stringify({enabled:!0})})}catch(d){v.push(h("newBot.warning.routine",{error:d instanceof Error?d.message:String(d)}))}return{bot:u,warnings:v,...k.paused?{paused:!0}:{}}}function T(r,e){const o=structuredClone(r.defaults),t=o.profile.modelSelection;return(!t||t.instanceId===""&&t.model==="")&&(o.profile.modelSelection=r.modelSelection),e&&(o.profile.name=o.profile.name?.trim()||r.suggestedName),o}function A(r,e){const o=new Set(e.map(t=>t.name.trim().toLowerCase()));if(!o.has(r.trim().toLowerCase()))return r;for(let t=2;;t++)if(!o.has(`${r} ${t}`.toLowerCase()))return`${r} ${t}`}function M(r,e,o,t){if(r)return r;const s=o.filter(a=>!a.hidden&&(a.section?.trim()||"")===(e?.trim()||""));return F(s,t)?.email??t.me?.email??null}function $(r,e,o,{preserveSelection:t=!1,showThreads:s,source:a,role:i,paused:l}){j(a,i),r({type:"botAdded",bot:e,preserveSelection:t}),!t&&_()&&R(r,e,s),o.length&&r({type:"error",message:o.join(`
2
2
  `)}),l&&I(e.id)}async function z(r,e,o,t){if(typeof window<"u"&&window.ogb?.remoteClient?.active){const{bot:c,paused:n}=await t("/api/bots",{method:"POST",body:JSON.stringify(r===void 0?{}:{section:r})});return{bot:c,warnings:[],startsOnAsk:!1,...n?{paused:n}:{}}}const s=T(await t("/api/bot-defaults"),!0);s.profile.name=A(s.profile.name,e),r!==void 0&&(s.profile.section=r);const a=new D(s,()=>{},t),i=a.bot.approvalMode==="auto"&&a.bot.computer==="local";i&&a.patch({approvalMode:"ask"});const l=o?M(null,a.bot.section,e,o)??void 0:void 0;try{return{...await H(a,t,void 0,void 0,void 0,l),startsOnAsk:i}}finally{a.dispose()}}async function W(r,e,o,t,s=y){if(E()?.admin===!1)return;let a;try{a=await z(r.section,e,E(),s)}catch(i){if(L(i))return;const l=h("newBot.failed",{error:i instanceof Error?i.message:String(i)});r.onError?r.onError(l):o({type:"error",message:l});return}$(o,a.bot,a.warnings,{preserveSelection:r.preserveSelection,showThreads:t,source:"blank",paused:a.paused}),a.startsOnAsk&&o({type:"notice",notice:{kind:"note",botName:null,text:h("newBot.startsOnAsk",{name:a.bot.name})}}),r.onCreated?.(a.bot)}const X=Object.freeze(Object.defineProperty({__proto__:null,announceNewBot:$,freeName:A,makeNewBot:W,reportsToFor:M,startingTemplate:T},Symbol.toStringTag,{value:"Module"}));export{D as B,V as E,$ as a,H as c,X as n,G as p,M as r,T as s};
@@ -1 +1 @@
1
- import{t as n}from"./styles-BHtUK2qB.js";import{p as L,P as S,a as P}from"./package-format-Bf1YgVUD.js";import{o as l,k as b,l as d,_ as h,n as w,s as p,p as R,m as M,e as x,q as O,t as C,v as j,w as B}from"./PlacesRail-CUntVv3u.js";import{b8 as T,b9 as _,ba as q,bb as G}from"./App-BgFOjdcx.js";const se=50*1024*1024,$="Bot profiles, instructions, sections, rooms, playbooks, routines, each bot's memory (MEMORY.md, topic notes and daily logs) and conversation text (all tasks and branches).",u=p().min(1).max(200),v=p().trim().min(1).max(200),I=w().finite().nonnegative(),F=h(_),A=l({role:d("bot"),text:p().max(2e6),textCode:h(["chat.notice.exportedGoal.working","chat.notice.exportedGoal.completed","chat.notice.exportedGoal.needs-input","chat.notice.exportedGoal.blocked","chat.notice.exportedGoal.limit-reached","chat.notice.exportedGoal.paused","chat.notice.exportedGoal.stopped","chat.notice.exportedGoal.failed"]),textParams:l({before:p().max(2e6),content:p().max(2e6)})}),U=l({id:u,role:h(["bot","user"]),text:A.shape.text,textCode:A.shape.textCode.optional(),textParams:A.shape.textParams.optional(),at:I,parentId:u.nullable(),replyToId:u.optional(),from:l({botId:u,name:v,color:p().max(40)}).optional(),peerPost:l({unattended:x().optional()}).optional(),serverCard:d(!0).optional()}),K=l({key:u,title:p().max(2e3),createdAt:I,titleFromFirstMessage:d(!0).optional(),outside:d(!0).optional(),openedBy:l({botId:u,name:v,at:I,kind:h(["pair","work"]).optional()}).optional(),closedBy:l({botId:u,name:v,at:I}).optional(),pinned:d(!0).optional(),turnTimeoutMinutes:w().int().min(1).max(1440).optional(),activeLeafId:u.nullable(),messages:b(U).max(1e5)}),N={key:u,name:v,section:p().max(200).optional(),activeTask:u,tasks:b(K).min(1).max(1e4)},V=l({key:u,name:v,summary:p().max(24e3),triggers:b(p().max(2e3)).max(100),instructions:p().max(2e5)}),Y=M("type",[l({type:d("once"),at:I}),l({type:d("daily"),time:p().regex(/^([01]\d|2[0-3]):[0-5]\d$/),weekdays:b(w().int().min(0).max(6)).min(1).max(7)}),l({type:d("interval"),everyMinutes:w().int().min(5).max(1440),anchorAt:w().int().min(0).max(864e13)})]),E=p().max(2e6),z=l({file:E,topics:b(l({name:p().regex(/^[\w][\w .-]{0,199}\.md$/),text:E})).max(1e3),logs:b(l({name:p().regex(/^\d{4}-\d{2}-\d{2}\.md$/),text:E})).max(1e4)}),D=j(p().regex(G),l({tools:B([d("*"),b(p().regex(q)).min(1).max(500)])}));function H(r){if(!r||typeof r!="object"||Array.isArray(r))return r;const o=r,e=o.defaultResponder&&typeof o.defaultResponder=="object"?o.defaultResponder.kind:void 0;if(typeof e!="string"||["member","everyone","mentions","auto"].includes(e))return r;const m=Array.isArray(o.memberIds)&&typeof o.memberIds[0]=="string"?o.memberIds[0]:void 0;return{...o,defaultResponder:m?{kind:"member",botId:m}:{kind:"mentions"}}}const W=l({format:d("openmaus.backup"),version:d(1),name:v,exportedAt:I,warnings:b(p().max(2e3)).max(4e3).default([]),bots:b(l({...N,title:p().max(2e3),description:p().max(2e5),soul:p().refine(r=>new TextEncoder().encode(r).byteLength<=24e3,{error:"standing instructions must be at most 24000 bytes"}).optional(),color:F,mascotExpression:p().max(80).optional(),mascotBody:p().max(40).optional(),mascotFaceColor:C.optional(),chiefOfStaff:x(),hidden:x(),playbooks:b(V).max(200),connectorTools:D.optional(),toolScope:O(r=>r!==void 0&&T(r).ok,"Invalid tool selection").transform(r=>{const o=T(r);return o.ok?o.scope:r}).optional(),helperModel:x().optional(),memory:z.optional()})).min(1).max(200),groups:b(R(H,l({...N,memberIds:b(u).max(200),dm:x(),bulletin:p().max(2e5),defaultResponder:M("kind",[l({kind:d("member"),botId:u}),l({kind:d("everyone")}),l({kind:d("mentions")}),l({kind:d("auto"),fallbackBotId:u.optional()})])}))).max(2e3),routines:b(l({name:v,prompt:p().trim().min(1).max(2e5),target:h(["bot","room-goal"]),botId:u,groupId:u.optional(),runOn:h(["maus","cloud"]),schedule:Y,durationMinutes:w().finite().positive(),timeoutMinutes:w().int().min(5).max(240).optional(),checks:b(h(["calendar","mail","runs"])).max(3).optional(),access:d("read-and-draft").optional(),deliver:d("brief").optional()})).max(2e3)});function X(r){const o=W.safeParse(r);if(!o.success){const a=o.error.issues[0];throw new Error(`Invalid backup: ${a.path.join(".")||"file"}: ${a.message}`)}const e=o.data,m=(a,f)=>{const i=new Set(a);if(i.size!==a.length)throw new Error(`Invalid backup: duplicate ${f}`);return i},s=m(e.bots.map(a=>a.key),"bot key"),t=m(e.groups.map(a=>a.key),"room key"),c=new Set;for(const a of e.bots){if(!a.chiefOfStaff)continue;const f=a.section?.trim()??"";if(c.has(f)||a.hidden)throw new Error("Invalid backup: a section must have at most one visible Chief of Staff");c.add(f)}for(const a of e.groups){if(a.memberIds.some(i=>!s.has(i)))throw new Error("Invalid backup: unknown room member");m(a.memberIds,"room member");const f=a.defaultResponder.kind==="member"?a.defaultResponder.botId:a.defaultResponder.kind==="auto"?a.defaultResponder.fallbackBotId:void 0;if(f!==void 0&&!a.memberIds.includes(f))throw new Error("Invalid backup: room responder is not a member");if(a.dm&&(a.memberIds.length!==2||a.tasks.length!==1))throw new Error("Invalid backup: invalid direct-message room")}for(const a of e.routines){if(!s.has(a.botId))throw new Error("Invalid backup: unknown routine bot");if(a.target==="room-goal"){if(a.runOn!=="maus")throw new Error("Invalid backup: room goals must run on this computer");const f=e.groups.find(i=>i.key===a.groupId);if(a.groupId!==void 0&&(!t.has(a.groupId)||!f||f.dm||!f.memberIds.includes(a.botId)))throw new Error("Invalid backup: unknown routine room or coordinator")}}for(const a of[...e.bots,...e.groups]){if(!m(a.tasks.map(i=>i.key),"task key").has(a.activeTask))throw new Error("Invalid backup: unknown active task");for(const i of a.tasks){const k=m(i.messages.map(y=>y.id),"message key"),g=new Set;for(const y of i.messages){if(y.parentId!==null&&!g.has(y.parentId))throw new Error("Invalid backup: invalid conversation branch");if(y.replyToId&&!k.has(y.replyToId))throw new Error("Invalid backup: unknown reply");g.add(y.id)}if(i.activeLeafId!==null&&!k.has(i.activeLeafId))throw new Error("Invalid backup: unknown conversation head")}}return e}function J(r){if(typeof r=="string"&&(r=Q(r)),!r||typeof r!="object"||Array.isArray(r))throw new Error(n("teamImport.noTeam"));const o=r;if(o.format==="openmaus.backup"){const s=X(r);return{manifest:s,kind:"backup",name:s.name,description:$,members:s.bots.map(t=>({name:t.name,title:t.title})),rooms:s.groups.length,playbooks:s.bots.reduce((t,c)=>t+c.playbooks.length,0),routines:s.routines.length,apps:[],conversations:[...s.bots,...s.groups].reduce((t,c)=>t+c.tasks.length,0),archivedBots:s.bots.filter(t=>t.hidden).length,warnings:s.warnings}}if(o.format==="openmaus.package")return re(o,r);if(o.format!=="openmaus.team")throw new Error(n("teamImport.unknownFormat"));if(o.version!==1&&o.version!==2)throw new Error(n("teamImport.teamVersion",{version:String(o.version)}));if(!o.team||typeof o.team!="object"||Array.isArray(o.team))throw new Error(n("teamImport.teamMissing"));const e=o.team;if(typeof e.name!="string"||!e.name.trim())throw new Error(n("teamImport.teamNoName"));if(!Array.isArray(e.members)||e.members.length===0)throw new Error(n("teamImport.teamNoMembers"));if(e.members.length>200)throw new Error(n("teamImport.teamTooMany"));const m=e.members.map((s,t)=>{if(!s||typeof s!="object"||Array.isArray(s))throw new Error(n("teamImport.memberInvalid",{number:t+1}));const c=s;if(typeof c.name!="string"||!c.name.trim())throw new Error(n("teamImport.memberNoName",{number:t+1}));return{name:c.name.trim(),title:typeof c.title=="string"?c.title.trim():""}});return{manifest:r,kind:"team",name:e.name.trim(),description:typeof e.description=="string"?e.description.trim():"",members:m,rooms:o.version===1&&e.room&&typeof e.room=="object"?1:0,playbooks:0,routines:0,apps:[]}}function Q(r){const o=r.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);if(!o)throw new Error(n("teamImport.markdownNoFrontmatter"));let e;try{e=L(o[1])}catch{throw new Error(n("teamImport.markdownBadYaml"))}if(!e||typeof e!="object"||Array.isArray(e))throw new Error(n("teamImport.markdownNoBlueprint"));const{botmrr:m,...s}=e;if(m!==1)throw new Error(n("teamImport.markdownVersion"));return{format:"openmaus.package",version:1,package:s}}function Z(r,o){const e=r.package;if(!e.agents.length)return ee(r,o);const m=new Set(e.agents.flatMap(t=>t.skills??[])),s=e.team?.leader?e.agents.find(t=>t.key===e.team?.leader)?.name:void 0;return{manifest:o,kind:"package",version:2,name:e.name,teamName:e.team?.name??e.name,description:e.summary,members:e.agents.map(t=>({name:t.name,title:t.title??""})),...s?{chiefOfStaff:s}:{},...e.team?.brief?.trim()?{brief:e.team.brief}:{},pictures:e.agents.map(t=>t.appearance.avatar?`data:${t.appearance.avatar.mime};base64,${t.appearance.avatar.data}`:null),rooms:e.rooms?.length??0,playbooks:e.playbooks?.length??0,routines:e.routines?.length??0,apps:e.requirements.apps.map(t=>({label:t.label,optional:t.optional===!0})),skills:(e.skills?.entries??[]).filter(t=>m.has(t.name)).map(t=>t.name),offeredSkills:(e.skills?.entries??[]).filter(t=>!m.has(t.name)).map(t=>t.name),connections:(e.connections??[]).map(t=>({label:t.label,url:t.mcp.url,values:t.mcp.valueNames.length})),notes:e.agents.reduce((t,c)=>t+Object.keys(c.seed?.memory??{}).length,0),presets:(e.presets??[]).map(t=>t.name)}}function ee(r,o){const e=r.package;if(!e.presets?.length)throw new Error(n("teamImport.libraryEmpty"));return{manifest:o,kind:"package",version:2,library:!0,name:e.name,description:e.summary,members:[],rooms:0,playbooks:e.playbooks?.length??0,routines:0,apps:[],skills:[],offeredSkills:(e.skills?.entries??[]).filter(m=>!e.presets.some(s=>s.skills?.includes(m.name))).map(m=>m.name),presets:e.presets.map(m=>m.name)}}function re(r,o){if(typeof r.version=="number"&&r.version>S)throw new Error(n("teamImport.newer"));if(r.version===S)return Z(P(o),o);if(r.version!==1)throw new Error(n("teamImport.playbookVersion",{version:String(r.version)}));if(!r.package||typeof r.package!="object"||Array.isArray(r.package))throw new Error(n("teamImport.playbookMissing"));const e=r.package;if(typeof e.name!="string"||!e.name.trim())throw new Error(n("teamImport.playbookNoName"));if(!Array.isArray(e.agents)||e.agents.length===0)throw new Error(n("teamImport.playbookNoBots"));if(e.agents.length>200)throw new Error(n("teamImport.playbookTooMany"));const m=e.agents.map((i,k)=>{if(!i||typeof i!="object"||Array.isArray(i))throw new Error(n("teamImport.botInvalid",{number:k+1}));const g=i;if(typeof g.name!="string"||!g.name.trim())throw new Error(n("teamImport.botNoName",{number:k+1}));return{name:g.name.trim(),title:typeof g.title=="string"?g.title.trim():""}}),s=typeof e.chiefOfStaff=="string"?e.chiefOfStaff:void 0,t=s?e.agents.find(i=>i.key===s)?.name:void 0,c=e.requirements&&typeof e.requirements=="object"&&!Array.isArray(e.requirements)?e.requirements:{},a=Array.isArray(c.apps)?c.apps.flatMap(i=>{if(!i||typeof i!="object"||Array.isArray(i))return[];const k=i;return typeof k.label=="string"?[{label:k.label.trim(),optional:k.optional===!0}]:[]}):[],f=e.skills&&typeof e.skills=="object"&&!Array.isArray(e.skills)?e.skills.entries:void 0;return{manifest:o,kind:"package",version:1,name:e.name.trim(),description:typeof e.summary=="string"?e.summary.trim():"",members:m,...typeof t=="string"?{chiefOfStaff:t}:{},rooms:Array.isArray(e.rooms)?e.rooms.length:0,playbooks:Array.isArray(e.playbooks)?e.playbooks.length:0,routines:Array.isArray(e.routines)?e.routines.length:0,apps:a,skills:Array.isArray(f)?f.flatMap(i=>{if(!i||typeof i!="object"||Array.isArray(i))return[];const{name:k}=i;return typeof k=="string"&&k.trim()?[k.trim()]:[]}):[]}}function ie(r){return r.installed&&r.installed.status!=="removed"?"added":r.release?r.blob==="unsupported"?"updateApp":r.blob!=="ready"?"notReady":"add":"noRelease"}function me(r){return r.publisher.self?n("orgLibrary.fromSelf"):n("orgLibrary.from",{name:r.publisher.name})}function pe(r){return r.mode==="required"?n("orgLibrary.recommended",{name:r.publisher.name}):null}function le(r){const o=[];return r.installed?.status==="withdrawn"&&o.push(n("orgLibrary.withdrawn",{name:r.publisher.name})),r.installed?.status==="installed"&&r.release&&r.release.version!==r.installed.release&&o.push(n("orgLibrary.newerRelease",{version:r.release.version})),o}function ce(r){const o=[];return r.bots&&o.push(n("orgLibrary.bots",{count:r.bots})),r.skills&&o.push(n("orgLibrary.skills",{count:r.skills})),r.presets&&o.push(n("orgLibrary.presets",{count:r.presets})),r.rooms&&o.push(n("orgLibrary.rooms",{count:r.rooms})),r.routines&&o.push(n("orgLibrary.routines",{count:r.routines})),r.connections&&o.push(n("orgLibrary.connections",{count:r.connections})),o.join(" · ")}function de(r,o=[]){if(r?.source!=="org")return null;const e=r.publisher?.name??"",m=o.find(s=>s.installId===r.installId);return{line:e?n("orgLibrary.provenance",{name:r.name,release:r.release,publisher:e}):n("orgLibrary.provenanceFile",{name:r.name,release:r.release}),withdrawn:m?.status==="withdrawn"?n("orgLibrary.withdrawn",{name:m.publisher||e}):null}}function ue(r){if(r.package.agents.length)return J(r);const o=r.package;return{manifest:r,kind:"package",version:2,name:o.name,teamName:o.name,description:o.summary,members:[],rooms:0,playbooks:o.playbooks?.length??0,routines:0,apps:o.requirements.apps.map(e=>({label:e.label,optional:e.optional===!0})),skills:[],offeredSkills:(o.skills?.entries??[]).map(e=>e.name),connections:[],notes:0,presets:(o.presets??[]).map(e=>e.name)}}export{se as M,pe as a,le as b,me as c,ce as d,ue as e,ie as o,de as p,J as t};
1
+ import{t as n}from"./styles-BHtUK2qB.js";import{p as L,P as S,a as P}from"./package-format-CrrPupM8.js";import{o as l,k as b,l as d,_ as h,n as w,s as p,p as R,m as M,e as x,q as O,t as C,v as j,w as B}from"./PlacesRail-CUntVv3u.js";import{b8 as T,b9 as _,ba as q,bb as G}from"./App-D-SXyZXT.js";const se=50*1024*1024,$="Bot profiles, instructions, sections, rooms, playbooks, routines, each bot's memory (MEMORY.md, topic notes and daily logs) and conversation text (all tasks and branches).",u=p().min(1).max(200),v=p().trim().min(1).max(200),I=w().finite().nonnegative(),F=h(_),A=l({role:d("bot"),text:p().max(2e6),textCode:h(["chat.notice.exportedGoal.working","chat.notice.exportedGoal.completed","chat.notice.exportedGoal.needs-input","chat.notice.exportedGoal.blocked","chat.notice.exportedGoal.limit-reached","chat.notice.exportedGoal.paused","chat.notice.exportedGoal.stopped","chat.notice.exportedGoal.failed"]),textParams:l({before:p().max(2e6),content:p().max(2e6)})}),U=l({id:u,role:h(["bot","user"]),text:A.shape.text,textCode:A.shape.textCode.optional(),textParams:A.shape.textParams.optional(),at:I,parentId:u.nullable(),replyToId:u.optional(),from:l({botId:u,name:v,color:p().max(40)}).optional(),peerPost:l({unattended:x().optional()}).optional(),serverCard:d(!0).optional()}),K=l({key:u,title:p().max(2e3),createdAt:I,titleFromFirstMessage:d(!0).optional(),outside:d(!0).optional(),openedBy:l({botId:u,name:v,at:I,kind:h(["pair","work"]).optional()}).optional(),closedBy:l({botId:u,name:v,at:I}).optional(),pinned:d(!0).optional(),turnTimeoutMinutes:w().int().min(1).max(1440).optional(),activeLeafId:u.nullable(),messages:b(U).max(1e5)}),N={key:u,name:v,section:p().max(200).optional(),activeTask:u,tasks:b(K).min(1).max(1e4)},V=l({key:u,name:v,summary:p().max(24e3),triggers:b(p().max(2e3)).max(100),instructions:p().max(2e5)}),Y=M("type",[l({type:d("once"),at:I}),l({type:d("daily"),time:p().regex(/^([01]\d|2[0-3]):[0-5]\d$/),weekdays:b(w().int().min(0).max(6)).min(1).max(7)}),l({type:d("interval"),everyMinutes:w().int().min(5).max(1440),anchorAt:w().int().min(0).max(864e13)})]),E=p().max(2e6),z=l({file:E,topics:b(l({name:p().regex(/^[\w][\w .-]{0,199}\.md$/),text:E})).max(1e3),logs:b(l({name:p().regex(/^\d{4}-\d{2}-\d{2}\.md$/),text:E})).max(1e4)}),D=j(p().regex(G),l({tools:B([d("*"),b(p().regex(q)).min(1).max(500)])}));function H(r){if(!r||typeof r!="object"||Array.isArray(r))return r;const o=r,e=o.defaultResponder&&typeof o.defaultResponder=="object"?o.defaultResponder.kind:void 0;if(typeof e!="string"||["member","everyone","mentions","auto"].includes(e))return r;const m=Array.isArray(o.memberIds)&&typeof o.memberIds[0]=="string"?o.memberIds[0]:void 0;return{...o,defaultResponder:m?{kind:"member",botId:m}:{kind:"mentions"}}}const W=l({format:d("openmaus.backup"),version:d(1),name:v,exportedAt:I,warnings:b(p().max(2e3)).max(4e3).default([]),bots:b(l({...N,title:p().max(2e3),description:p().max(2e5),soul:p().refine(r=>new TextEncoder().encode(r).byteLength<=24e3,{error:"standing instructions must be at most 24000 bytes"}).optional(),color:F,mascotExpression:p().max(80).optional(),mascotBody:p().max(40).optional(),mascotFaceColor:C.optional(),chiefOfStaff:x(),hidden:x(),playbooks:b(V).max(200),connectorTools:D.optional(),toolScope:O(r=>r!==void 0&&T(r).ok,"Invalid tool selection").transform(r=>{const o=T(r);return o.ok?o.scope:r}).optional(),helperModel:x().optional(),memory:z.optional()})).min(1).max(200),groups:b(R(H,l({...N,memberIds:b(u).max(200),dm:x(),bulletin:p().max(2e5),defaultResponder:M("kind",[l({kind:d("member"),botId:u}),l({kind:d("everyone")}),l({kind:d("mentions")}),l({kind:d("auto"),fallbackBotId:u.optional()})])}))).max(2e3),routines:b(l({name:v,prompt:p().trim().min(1).max(2e5),target:h(["bot","room-goal"]),botId:u,groupId:u.optional(),runOn:h(["maus","cloud"]),schedule:Y,durationMinutes:w().finite().positive(),timeoutMinutes:w().int().min(5).max(240).optional(),checks:b(h(["calendar","mail","runs"])).max(3).optional(),access:d("read-and-draft").optional(),deliver:d("brief").optional()})).max(2e3)});function X(r){const o=W.safeParse(r);if(!o.success){const a=o.error.issues[0];throw new Error(`Invalid backup: ${a.path.join(".")||"file"}: ${a.message}`)}const e=o.data,m=(a,f)=>{const i=new Set(a);if(i.size!==a.length)throw new Error(`Invalid backup: duplicate ${f}`);return i},s=m(e.bots.map(a=>a.key),"bot key"),t=m(e.groups.map(a=>a.key),"room key"),c=new Set;for(const a of e.bots){if(!a.chiefOfStaff)continue;const f=a.section?.trim()??"";if(c.has(f)||a.hidden)throw new Error("Invalid backup: a section must have at most one visible Chief of Staff");c.add(f)}for(const a of e.groups){if(a.memberIds.some(i=>!s.has(i)))throw new Error("Invalid backup: unknown room member");m(a.memberIds,"room member");const f=a.defaultResponder.kind==="member"?a.defaultResponder.botId:a.defaultResponder.kind==="auto"?a.defaultResponder.fallbackBotId:void 0;if(f!==void 0&&!a.memberIds.includes(f))throw new Error("Invalid backup: room responder is not a member");if(a.dm&&(a.memberIds.length!==2||a.tasks.length!==1))throw new Error("Invalid backup: invalid direct-message room")}for(const a of e.routines){if(!s.has(a.botId))throw new Error("Invalid backup: unknown routine bot");if(a.target==="room-goal"){if(a.runOn!=="maus")throw new Error("Invalid backup: room goals must run on this computer");const f=e.groups.find(i=>i.key===a.groupId);if(a.groupId!==void 0&&(!t.has(a.groupId)||!f||f.dm||!f.memberIds.includes(a.botId)))throw new Error("Invalid backup: unknown routine room or coordinator")}}for(const a of[...e.bots,...e.groups]){if(!m(a.tasks.map(i=>i.key),"task key").has(a.activeTask))throw new Error("Invalid backup: unknown active task");for(const i of a.tasks){const k=m(i.messages.map(y=>y.id),"message key"),g=new Set;for(const y of i.messages){if(y.parentId!==null&&!g.has(y.parentId))throw new Error("Invalid backup: invalid conversation branch");if(y.replyToId&&!k.has(y.replyToId))throw new Error("Invalid backup: unknown reply");g.add(y.id)}if(i.activeLeafId!==null&&!k.has(i.activeLeafId))throw new Error("Invalid backup: unknown conversation head")}}return e}function J(r){if(typeof r=="string"&&(r=Q(r)),!r||typeof r!="object"||Array.isArray(r))throw new Error(n("teamImport.noTeam"));const o=r;if(o.format==="openmaus.backup"){const s=X(r);return{manifest:s,kind:"backup",name:s.name,description:$,members:s.bots.map(t=>({name:t.name,title:t.title})),rooms:s.groups.length,playbooks:s.bots.reduce((t,c)=>t+c.playbooks.length,0),routines:s.routines.length,apps:[],conversations:[...s.bots,...s.groups].reduce((t,c)=>t+c.tasks.length,0),archivedBots:s.bots.filter(t=>t.hidden).length,warnings:s.warnings}}if(o.format==="openmaus.package")return re(o,r);if(o.format!=="openmaus.team")throw new Error(n("teamImport.unknownFormat"));if(o.version!==1&&o.version!==2)throw new Error(n("teamImport.teamVersion",{version:String(o.version)}));if(!o.team||typeof o.team!="object"||Array.isArray(o.team))throw new Error(n("teamImport.teamMissing"));const e=o.team;if(typeof e.name!="string"||!e.name.trim())throw new Error(n("teamImport.teamNoName"));if(!Array.isArray(e.members)||e.members.length===0)throw new Error(n("teamImport.teamNoMembers"));if(e.members.length>200)throw new Error(n("teamImport.teamTooMany"));const m=e.members.map((s,t)=>{if(!s||typeof s!="object"||Array.isArray(s))throw new Error(n("teamImport.memberInvalid",{number:t+1}));const c=s;if(typeof c.name!="string"||!c.name.trim())throw new Error(n("teamImport.memberNoName",{number:t+1}));return{name:c.name.trim(),title:typeof c.title=="string"?c.title.trim():""}});return{manifest:r,kind:"team",name:e.name.trim(),description:typeof e.description=="string"?e.description.trim():"",members:m,rooms:o.version===1&&e.room&&typeof e.room=="object"?1:0,playbooks:0,routines:0,apps:[]}}function Q(r){const o=r.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);if(!o)throw new Error(n("teamImport.markdownNoFrontmatter"));let e;try{e=L(o[1])}catch{throw new Error(n("teamImport.markdownBadYaml"))}if(!e||typeof e!="object"||Array.isArray(e))throw new Error(n("teamImport.markdownNoBlueprint"));const{botmrr:m,...s}=e;if(m!==1)throw new Error(n("teamImport.markdownVersion"));return{format:"openmaus.package",version:1,package:s}}function Z(r,o){const e=r.package;if(!e.agents.length)return ee(r,o);const m=new Set(e.agents.flatMap(t=>t.skills??[])),s=e.team?.leader?e.agents.find(t=>t.key===e.team?.leader)?.name:void 0;return{manifest:o,kind:"package",version:2,name:e.name,teamName:e.team?.name??e.name,description:e.summary,members:e.agents.map(t=>({name:t.name,title:t.title??""})),...s?{chiefOfStaff:s}:{},...e.team?.brief?.trim()?{brief:e.team.brief}:{},pictures:e.agents.map(t=>t.appearance.avatar?`data:${t.appearance.avatar.mime};base64,${t.appearance.avatar.data}`:null),rooms:e.rooms?.length??0,playbooks:e.playbooks?.length??0,routines:e.routines?.length??0,apps:e.requirements.apps.map(t=>({label:t.label,optional:t.optional===!0})),skills:(e.skills?.entries??[]).filter(t=>m.has(t.name)).map(t=>t.name),offeredSkills:(e.skills?.entries??[]).filter(t=>!m.has(t.name)).map(t=>t.name),connections:(e.connections??[]).map(t=>({label:t.label,url:t.mcp.url,values:t.mcp.valueNames.length})),notes:e.agents.reduce((t,c)=>t+Object.keys(c.seed?.memory??{}).length,0),presets:(e.presets??[]).map(t=>t.name)}}function ee(r,o){const e=r.package;if(!e.presets?.length)throw new Error(n("teamImport.libraryEmpty"));return{manifest:o,kind:"package",version:2,library:!0,name:e.name,description:e.summary,members:[],rooms:0,playbooks:e.playbooks?.length??0,routines:0,apps:[],skills:[],offeredSkills:(e.skills?.entries??[]).filter(m=>!e.presets.some(s=>s.skills?.includes(m.name))).map(m=>m.name),presets:e.presets.map(m=>m.name)}}function re(r,o){if(typeof r.version=="number"&&r.version>S)throw new Error(n("teamImport.newer"));if(r.version===S)return Z(P(o),o);if(r.version!==1)throw new Error(n("teamImport.playbookVersion",{version:String(r.version)}));if(!r.package||typeof r.package!="object"||Array.isArray(r.package))throw new Error(n("teamImport.playbookMissing"));const e=r.package;if(typeof e.name!="string"||!e.name.trim())throw new Error(n("teamImport.playbookNoName"));if(!Array.isArray(e.agents)||e.agents.length===0)throw new Error(n("teamImport.playbookNoBots"));if(e.agents.length>200)throw new Error(n("teamImport.playbookTooMany"));const m=e.agents.map((i,k)=>{if(!i||typeof i!="object"||Array.isArray(i))throw new Error(n("teamImport.botInvalid",{number:k+1}));const g=i;if(typeof g.name!="string"||!g.name.trim())throw new Error(n("teamImport.botNoName",{number:k+1}));return{name:g.name.trim(),title:typeof g.title=="string"?g.title.trim():""}}),s=typeof e.chiefOfStaff=="string"?e.chiefOfStaff:void 0,t=s?e.agents.find(i=>i.key===s)?.name:void 0,c=e.requirements&&typeof e.requirements=="object"&&!Array.isArray(e.requirements)?e.requirements:{},a=Array.isArray(c.apps)?c.apps.flatMap(i=>{if(!i||typeof i!="object"||Array.isArray(i))return[];const k=i;return typeof k.label=="string"?[{label:k.label.trim(),optional:k.optional===!0}]:[]}):[],f=e.skills&&typeof e.skills=="object"&&!Array.isArray(e.skills)?e.skills.entries:void 0;return{manifest:o,kind:"package",version:1,name:e.name.trim(),description:typeof e.summary=="string"?e.summary.trim():"",members:m,...typeof t=="string"?{chiefOfStaff:t}:{},rooms:Array.isArray(e.rooms)?e.rooms.length:0,playbooks:Array.isArray(e.playbooks)?e.playbooks.length:0,routines:Array.isArray(e.routines)?e.routines.length:0,apps:a,skills:Array.isArray(f)?f.flatMap(i=>{if(!i||typeof i!="object"||Array.isArray(i))return[];const{name:k}=i;return typeof k=="string"&&k.trim()?[k.trim()]:[]}):[]}}function ie(r){return r.installed&&r.installed.status!=="removed"?"added":r.release?r.blob==="unsupported"?"updateApp":r.blob!=="ready"?"notReady":"add":"noRelease"}function me(r){return r.publisher.self?n("orgLibrary.fromSelf"):n("orgLibrary.from",{name:r.publisher.name})}function pe(r){return r.mode==="required"?n("orgLibrary.recommended",{name:r.publisher.name}):null}function le(r){const o=[];return r.installed?.status==="withdrawn"&&o.push(n("orgLibrary.withdrawn",{name:r.publisher.name})),r.installed?.status==="installed"&&r.release&&r.release.version!==r.installed.release&&o.push(n("orgLibrary.newerRelease",{version:r.release.version})),o}function ce(r){const o=[];return r.bots&&o.push(n("orgLibrary.bots",{count:r.bots})),r.skills&&o.push(n("orgLibrary.skills",{count:r.skills})),r.presets&&o.push(n("orgLibrary.presets",{count:r.presets})),r.rooms&&o.push(n("orgLibrary.rooms",{count:r.rooms})),r.routines&&o.push(n("orgLibrary.routines",{count:r.routines})),r.connections&&o.push(n("orgLibrary.connections",{count:r.connections})),o.join(" · ")}function de(r,o=[]){if(r?.source!=="org")return null;const e=r.publisher?.name??"",m=o.find(s=>s.installId===r.installId);return{line:e?n("orgLibrary.provenance",{name:r.name,release:r.release,publisher:e}):n("orgLibrary.provenanceFile",{name:r.name,release:r.release}),withdrawn:m?.status==="withdrawn"?n("orgLibrary.withdrawn",{name:m.publisher||e}):null}}function ue(r){if(r.package.agents.length)return J(r);const o=r.package;return{manifest:r,kind:"package",version:2,name:o.name,teamName:o.name,description:o.summary,members:[],rooms:0,playbooks:o.playbooks?.length??0,routines:0,apps:o.requirements.apps.map(e=>({label:e.label,optional:e.optional===!0})),skills:[],offeredSkills:(o.skills?.entries??[]).map(e=>e.name),connections:[],notes:0,presets:(o.presets??[]).map(e=>e.name)}}export{se as M,pe as a,le as b,me as c,ce as d,ue as e,ie as o,de as p,J as t};
@@ -1,4 +1,4 @@
1
- import{b9 as as,bi as cn,gJ as fn,B as un,bf as hn,bh as Ut,gX as ls}from"./App-BgFOjdcx.js";import{o as $,k as T,l as q,_ as X,n as V,e as oe,s as F,m as cs,p as dn,w as pn,ai as mn,aj as gn,v as yn}from"./PlacesRail-CUntVv3u.js";const Ot=Symbol.for("yaml.alias"),pt=Symbol.for("yaml.document"),se=Symbol.for("yaml.map"),fs=Symbol.for("yaml.pair"),Q=Symbol.for("yaml.scalar"),be=Symbol.for("yaml.seq"),G=Symbol.for("yaml.node.type"),we=s=>!!s&&typeof s=="object"&&s[G]===Ot,Qe=s=>!!s&&typeof s=="object"&&s[G]===pt,Ce=s=>!!s&&typeof s=="object"&&s[G]===se,M=s=>!!s&&typeof s=="object"&&s[G]===fs,_=s=>!!s&&typeof s=="object"&&s[G]===Q,Me=s=>!!s&&typeof s=="object"&&s[G]===be;function v(s){if(s&&typeof s=="object")switch(s[G]){case se:case be:return!0}return!1}function C(s){if(s&&typeof s=="object")switch(s[G]){case Ot:case se:case Q:case be:return!0}return!1}const us=s=>(_(s)||v(s))&&!!s.anchor,ne=Symbol("break visit"),bn=Symbol("skip children"),Ie=Symbol("remove node");function ke(s,e){const t=wn(e);Qe(s)?ue(null,s.contents,t,Object.freeze([s]))===Ie&&(s.contents=null):ue(null,s,t,Object.freeze([]))}ke.BREAK=ne;ke.SKIP=bn;ke.REMOVE=Ie;function ue(s,e,t,n){const i=kn(s,e,t,n);if(C(i)||M(i))return Sn(s,n,i),ue(s,i,t,n);if(typeof i!="symbol"){if(v(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=ue(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===ne)return ne;o===Ie&&(e.items.splice(r,1),r-=1)}}}else if(M(e)){n=Object.freeze(n.concat(e));const r=ue("key",e.key,t,n);if(r===ne)return ne;r===Ie&&(e.key=null);const o=ue("value",e.value,t,n);if(o===ne)return ne;o===Ie&&(e.value=null)}}return i}function wn(s){return typeof s=="object"&&(s.Collection||s.Node||s.Value)?Object.assign({Alias:s.Node,Map:s.Node,Scalar:s.Node,Seq:s.Node},s.Value&&{Map:s.Value,Scalar:s.Value,Seq:s.Value},s.Collection&&{Map:s.Collection,Seq:s.Collection},s):s}function kn(s,e,t,n){if(typeof t=="function")return t(s,e,n);if(Ce(e))return t.Map?.(s,e,n);if(Me(e))return t.Seq?.(s,e,n);if(M(e))return t.Pair?.(s,e,n);if(_(e))return t.Scalar?.(s,e,n);if(we(e))return t.Alias?.(s,e,n)}function Sn(s,e,t){const n=e[e.length-1];if(v(n))n.items[s]=t;else if(M(n))s==="key"?n.key=t:n.value=t;else if(Qe(n))n.contents=t;else{const i=we(n)?"alias":"scalar";throw new Error(`Cannot replace node with ${i} parent`)}}const An={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},Nn=s=>s.replace(/[!,[\]{}]/g,e=>An[e]);class D{constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},D.defaultYaml,e),this.tags=Object.assign({},D.defaultTags,t)}clone(){const e=new D(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){const e=new D(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:D.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},D.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:D.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},D.defaultTags),this.atNextDocument=!1);const n=e.trim().split(/[ \t]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;const[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;const[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{const o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e==="!")return"!";if(e[0]!=="!")return t(`Not a valid tag: ${e}`),null;if(e[1]==="<"){const o=e.slice(2,-1);return o==="!"||o==="!!"?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&t("Verbatim tags must end with a >"),o)}const[,n,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);const r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}catch(o){return t(String(o)),null}return n==="!"?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(const[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+Nn(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){const t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags);let i;if(e&&n.length>0&&C(e.contents)){const r={};ke(e.contents,(o,a)=>{C(a)&&a.tag&&(r[a.tag]=!0)}),i=Object.keys(r)}else i=[];for(const[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(a=>a.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(`
1
+ import{b9 as as,bi as cn,gJ as fn,B as un,bf as hn,bh as Ut,gX as ls}from"./App-D-SXyZXT.js";import{o as $,k as T,l as q,_ as X,n as V,e as oe,s as F,m as cs,p as dn,w as pn,ai as mn,aj as gn,v as yn}from"./PlacesRail-CUntVv3u.js";const Ot=Symbol.for("yaml.alias"),pt=Symbol.for("yaml.document"),se=Symbol.for("yaml.map"),fs=Symbol.for("yaml.pair"),Q=Symbol.for("yaml.scalar"),be=Symbol.for("yaml.seq"),G=Symbol.for("yaml.node.type"),we=s=>!!s&&typeof s=="object"&&s[G]===Ot,Qe=s=>!!s&&typeof s=="object"&&s[G]===pt,Ce=s=>!!s&&typeof s=="object"&&s[G]===se,M=s=>!!s&&typeof s=="object"&&s[G]===fs,_=s=>!!s&&typeof s=="object"&&s[G]===Q,Me=s=>!!s&&typeof s=="object"&&s[G]===be;function v(s){if(s&&typeof s=="object")switch(s[G]){case se:case be:return!0}return!1}function C(s){if(s&&typeof s=="object")switch(s[G]){case Ot:case se:case Q:case be:return!0}return!1}const us=s=>(_(s)||v(s))&&!!s.anchor,ne=Symbol("break visit"),bn=Symbol("skip children"),Ie=Symbol("remove node");function ke(s,e){const t=wn(e);Qe(s)?ue(null,s.contents,t,Object.freeze([s]))===Ie&&(s.contents=null):ue(null,s,t,Object.freeze([]))}ke.BREAK=ne;ke.SKIP=bn;ke.REMOVE=Ie;function ue(s,e,t,n){const i=kn(s,e,t,n);if(C(i)||M(i))return Sn(s,n,i),ue(s,i,t,n);if(typeof i!="symbol"){if(v(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=ue(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===ne)return ne;o===Ie&&(e.items.splice(r,1),r-=1)}}}else if(M(e)){n=Object.freeze(n.concat(e));const r=ue("key",e.key,t,n);if(r===ne)return ne;r===Ie&&(e.key=null);const o=ue("value",e.value,t,n);if(o===ne)return ne;o===Ie&&(e.value=null)}}return i}function wn(s){return typeof s=="object"&&(s.Collection||s.Node||s.Value)?Object.assign({Alias:s.Node,Map:s.Node,Scalar:s.Node,Seq:s.Node},s.Value&&{Map:s.Value,Scalar:s.Value,Seq:s.Value},s.Collection&&{Map:s.Collection,Seq:s.Collection},s):s}function kn(s,e,t,n){if(typeof t=="function")return t(s,e,n);if(Ce(e))return t.Map?.(s,e,n);if(Me(e))return t.Seq?.(s,e,n);if(M(e))return t.Pair?.(s,e,n);if(_(e))return t.Scalar?.(s,e,n);if(we(e))return t.Alias?.(s,e,n)}function Sn(s,e,t){const n=e[e.length-1];if(v(n))n.items[s]=t;else if(M(n))s==="key"?n.key=t:n.value=t;else if(Qe(n))n.contents=t;else{const i=we(n)?"alias":"scalar";throw new Error(`Cannot replace node with ${i} parent`)}}const An={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},Nn=s=>s.replace(/[!,[\]{}]/g,e=>An[e]);class D{constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},D.defaultYaml,e),this.tags=Object.assign({},D.defaultTags,t)}clone(){const e=new D(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){const e=new D(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:D.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},D.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:D.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},D.defaultTags),this.atNextDocument=!1);const n=e.trim().split(/[ \t]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;const[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;const[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{const o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e==="!")return"!";if(e[0]!=="!")return t(`Not a valid tag: ${e}`),null;if(e[1]==="<"){const o=e.slice(2,-1);return o==="!"||o==="!!"?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&t("Verbatim tags must end with a >"),o)}const[,n,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);const r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}catch(o){return t(String(o)),null}return n==="!"?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(const[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+Nn(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){const t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags);let i;if(e&&n.length>0&&C(e.contents)){const r={};ke(e.contents,(o,a)=>{C(a)&&a.tag&&(r[a.tag]=!0)}),i=Object.keys(r)}else i=[];for(const[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(a=>a.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(`
2
2
  `)}}D.defaultYaml={explicit:!1,version:"1.2"};D.defaultTags={"!!":"tag:yaml.org,2002:"};function hs(s){if(/[\x00-\x19\s,[\]{}]/.test(s)){const t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(s)}`;throw new Error(t)}return!0}function ds(s){const e=new Set;return ke(s,{Value(t,n){n.anchor&&e.add(n.anchor)}}),e}function ps(s,e){for(let t=1;;++t){const n=`${s}${t}`;if(!e.has(n))return n}}function On(s,e){const t=[],n=new Map;let i=null;return{onAnchor:r=>{t.push(r),i??(i=ds(s));const o=ps(e,i);return i.add(o),o},setAnchors:()=>{for(const r of t){const o=n.get(r);if(typeof o=="object"&&o.anchor&&(_(o.node)||v(o.node)))o.node.anchor=o.anchor;else{const a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=r,a}}},sourceObjects:n}}function he(s,e,t,n){if(n&&typeof n=="object")if(Array.isArray(n))for(let i=0,r=n.length;i<r;++i){const o=n[i],a=he(s,n,String(i),o);a===void 0?delete n[i]:a!==o&&(n[i]=a)}else if(n instanceof Map)for(const i of Array.from(n.keys())){const r=n.get(i),o=he(s,n,i,r);o===void 0?n.delete(i):o!==r&&n.set(i,o)}else if(n instanceof Set)for(const i of Array.from(n)){const r=he(s,n,i,i);r===void 0?n.delete(i):r!==i&&(n.delete(i),n.add(r))}else for(const[i,r]of Object.entries(n)){const o=he(s,n,i,r);o===void 0?delete n[i]:o!==r&&(n[i]=o)}return s.call(e,t,n)}function J(s,e,t){if(Array.isArray(s))return s.map((n,i)=>J(n,String(i),t));if(s&&typeof s.toJSON=="function"){if(!t||!us(s))return s.toJSON(e,t);const n={aliasCount:0,count:1,res:void 0};t.anchors.set(s,n),t.onCreate=r=>{n.res=r,delete t.onCreate};const i=s.toJSON(e,t);return t.onCreate&&t.onCreate(i),i}return typeof s=="bigint"&&!t?.keep?Number(s):s}class Et{constructor(e){Object.defineProperty(this,G,{value:e})}clone(){const e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:i,reviver:r}={}){if(!Qe(e))throw new TypeError("A document argument is required");const o={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},a=J(this,"",o);if(typeof i=="function")for(const{count:c,res:l}of o.anchors.values())i(l,c);return typeof r=="function"?he(r,{"":a},"",a):a}}class $t extends Et{constructor(e){super(Ot),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,t){if(t?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],ke(e,{Node:(r,o)=>{(we(o)||us(o))&&n.push(o)}}),t&&(t.aliasResolveCache=n));let i;for(const r of n){if(r===this)break;r.anchor===this.source&&(i=r)}return i}toJSON(e,t){if(!t)return{source:this.source};const{anchors:n,doc:i,maxAliasCount:r}=t,o=this.resolve(i,t);if(!o){const c=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(c)}let a=n.get(o);if(a||(J(o,null,t),a=n.get(o)),a?.res===void 0){const c="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(c)}if(r>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Fe(i,o,n)),a.count*a.aliasCount>r)){const c="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(c)}return a.res}toString(e,t,n){const i=`*${this.source}`;if(e){if(hs(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){const r=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(r)}if(e.implicitKey)return`${i} `}return i}}function Fe(s,e,t){if(we(e)){const n=e.resolve(s),i=t&&n&&t.get(n);return i?i.count*i.aliasCount:0}else if(v(e)){let n=0;for(const i of e.items){const r=Fe(s,i,t);r>n&&(n=r)}return n}else if(M(e)){const n=Fe(s,e.key,t),i=Fe(s,e.value,t);return Math.max(n,i)}return 1}const ms=s=>!s||typeof s!="function"&&typeof s!="object";class O extends Et{constructor(e){super(Q),this.value=e}toJSON(e,t){return t?.keep?this.value:J(this.value,e,t)}toString(){return String(this.value)}}O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";const En="tag:yaml.org,2002:";function $n(s,e,t){if(e){const n=t.filter(r=>r.tag===e),i=n.find(r=>!r.format)??n[0];if(!i)throw new Error(`Tag ${e} not found`);return i}return t.find(n=>n.identify?.(s)&&!n.format)}function _e(s,e,t){if(Qe(s)&&(s=s.contents),C(s))return s;if(M(s)){const f=t.schema[se].createNode?.(t.schema,null,t);return f.items.push(s),f}(s instanceof String||s instanceof Number||s instanceof Boolean||typeof BigInt<"u"&&s instanceof BigInt)&&(s=s.valueOf());const{aliasDuplicateObjects:n,onAnchor:i,onTagObj:r,schema:o,sourceObjects:a}=t;let c;if(n&&s&&typeof s=="object"){if(c=a.get(s),c)return c.anchor??(c.anchor=i(s)),new $t(c.anchor);c={anchor:null,node:null},a.set(s,c)}e?.startsWith("!!")&&(e=En+e.slice(2));let l=$n(s,e,o.tags);if(!l){if(s&&typeof s.toJSON=="function"&&(s=s.toJSON()),!s||typeof s!="object"){const f=new O(s);return c&&(c.node=f),f}l=s instanceof Map?o[se]:Symbol.iterator in Object(s)?o[be]:o[se]}r&&(r(l),delete t.onTagObj);const d=l?.createNode?l.createNode(t.schema,s,t):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(t.schema,s,t):new O(s);return e?d.tag=e:l.default||(d.tag=l.tag),c&&(c.node=d),d}function Ye(s,e,t){let n=t;for(let i=e.length-1;i>=0;--i){const r=e[i];if(typeof r=="number"&&Number.isInteger(r)&&r>=0){const o=[];o[r]=n,n=o}else n=new Map([[r,n]])}return _e(n,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:s,sourceObjects:new Map})}const $e=s=>s==null||typeof s=="object"&&!!s[Symbol.iterator]().next().done;class gs extends Et{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){const t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(n=>C(n)||M(n)?n.clone(e):n),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if($e(e))this.add(t);else{const[n,...i]=e,r=this.get(n,!0);if(v(r))r.addIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ye(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}deleteIn(e){const[t,...n]=e;if(n.length===0)return this.delete(t);const i=this.get(t,!0);if(v(i))return i.deleteIn(n);throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){const[n,...i]=e,r=this.get(n,!0);return i.length===0?!t&&_(r)?r.value:r:v(r)?r.getIn(i,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!M(t))return!1;const n=t.value;return n==null||e&&_(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){const[t,...n]=e;if(n.length===0)return this.has(t);const i=this.get(t,!0);return v(i)?i.hasIn(n):!1}setIn(e,t){const[n,...i]=e;if(i.length===0)this.set(n,t);else{const r=this.get(n,!0);if(v(r))r.setIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ye(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}}const Tn=s=>s.replace(/^(?!$)(?: $)?/gm,"#");function z(s,e){return/^\n+$/.test(s)?s.substring(1):e?s.replace(/^(?! *$)/gm,e):s}const ie=(s,e,t)=>s.endsWith(`
3
3
  `)?z(t,e):t.includes(`
4
4
  `)?`
@@ -1 +1 @@
1
- import{r as i,j as e,t as n,a as B,X as _,p as K,i as y}from"./styles-BHtUK2qB.js";import{b as Q,r as Z,i as ee}from"./remote-desktop-DDRRx8uY.js";import{u as te,L as C,P as se}from"./PlacesRail-CUntVv3u.js";import{u as ne,B as re}from"./BrowserPanel-Bf3wrH1-.js";import{u as ae,o as ie,t as oe,G as le,p as ce,q as U,v as de,w as ue,n as b,A as pe,x as me,y as xe}from"./App-BgFOjdcx.js";import{R as fe}from"./RoutinesPage-BBqOFUgN.js";import{M as F}from"./monitor-7oLB-7rZ.js";import{C as he}from"./calendar-days-DE6WL-x2.js";import"./BrowserProfilesManager-CV3LMXnH.js";import"./index--etc8Lh7.js";import"./SignedInSites-BtB_gJc5.js";import"./minimize-o-OFVasg.js";import"./file-up-Cg2kYQkd.js";import"./MenuMotion-CobYpP7L.js";import"./ProIntroduction-mmdyWV6u.js";function ge(t){if(typeof t!="string"||!t)throw new Error(n("remoteDesktop.noLink"));return t.startsWith("/vps-viewer/")?new URL(t,window.location.origin).toString():t}function be(t){if(t.schedule.type==="cron"||t.schedule.type==="limit_reset")return me(t.schedule);if(t.schedule.type==="once")return new Date(t.schedule.at).toLocaleString(y(),{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});if(t.schedule.type==="interval"){const d=t.schedule.everyMinutes%60===0?n("routines.interval.hours",{hours:t.schedule.everyMinutes/60}):n("routines.interval.minutes",{minutes:t.schedule.everyMinutes});return n("remoteDesktop.startingAt",{cadence:d,date:new Date(t.schedule.anchorAt).toLocaleString(y(),{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})}const r=t.schedule.weekdays,l=r.length===7?n("routines.repeat.daily"):r.join(",")==="1,2,3,4,5"?n("routines.repeat.weekdays"):r.map(xe).join(", "),[w,k]=t.schedule.time.split(":").map(Number);return`${l} · ${new Date(2e3,0,1,w,k).toLocaleTimeString(y(),{hour:"numeric",minute:"2-digit"})}`}function ye(t){if(t==null)return n("routines.pausedSchedule");const r=new Date(t),l=new Date;return`${r.toDateString()===l.toDateString()?n("routines.today"):r.toLocaleDateString(y(),{month:"short",day:"numeric"})}, ${r.toLocaleTimeString(y(),{hour:"numeric",minute:"2-digit"})}`}function Oe({bot:t}){const{state:r,dispatch:l}=ae(),{dragProps:w}=te(),k=ie(t.id),[d,I]=i.useState(!1),[v,j]=i.useState(null),[p,R]=i.useState(null),[M,D]=i.useState(!0),[H,m]=i.useState(!1),[P,E]=i.useState(!1),A=ne(),L=i.useRef(t.busy);i.useEffect(()=>{L.current=t.busy},[t.busy]);const[G,z]=i.useState(!1),[x,O]=i.useState(()=>oe(t.id)?"browser":"desktop"),[J,W]=i.useState(),u=r.computerControl[t.id]?.help??null,q=u?r.bots.find(s=>s.id===u.botId)?.name??t.name:t.name,c=r.signInFocus?.botId===t.id?r.signInFocus:void 0;i.useEffect(()=>{!c||c.consumed||(O(c.place==="browser"?"browser":"desktop"),c.place==="browser"&&W({url:c.url,site:c.site,nonce:c.requestId}),l({type:"signInFocusConsumed",requestId:c.requestId}))},[l,c]);const N=r.routines.filter(s=>s.botId===t.id).sort((s,a)=>Number(a.enabled)-Number(s.enabled)||(s.nextRunAt??1/0)-(a.nextRunAt??1/0)),f=r.routineRuns.find(s=>s.botId===t.id&&["queued","running","waiting"].includes(s.status)),X=!!(r.config?.box.configured&&Q(r.instances,t.modelSelection.instanceId)?.snapshot.state==="available");i.useEffect(()=>{R(null),D(!0),m(!1)},[t.id]),i.useEffect(()=>{const s=window.ogb?.desktopViewer;if(!s)return;let a=!0;s.currentState().then(o=>{a&&E(o.open&&o.contextId===t.id)}).catch(()=>{});const h=s.onState(o=>{(o.contextId===t.id||!o.open)&&E(o.open&&o.contextId===t.id)});return()=>{a=!1,h()}},[t.id]),i.useEffect(()=>{if(x!=="desktop"||!A||P||d)return;const s=new AbortController;let a=!1,h=-1/0,o=null,S=null;const $=async()=>{if(!(a||s.signal.aborted)&&!(Date.now()-h<(o??(L.current?4e3:3e4)))){a=!0,o=null;try{const g=Z(await b(`/api/bots/${t.id}/computer/screenshot`,{method:"POST",body:"{}",signal:AbortSignal.any([s.signal,AbortSignal.timeout(9e4)])}));!s.signal.aborted&&g?(R(g),m(!1),S=null):s.signal.aborted||m(!0)}catch(g){if(!s.signal.aborted)if(g instanceof pe&&ee(g)){o=1e3,S??=Date.now();const T=Date.now()-S>=1e4;m(T),D(!T)}else S=null,m(!0)}finally{!s.signal.aborted&&o===null&&D(!1),a=!1,h=Date.now()}}};$();const Y=window.setInterval($,1e3);return()=>{s.abort(),window.clearInterval(Y)}},[t.id,A,P,d,x]);const V=async()=>{I(!0),j(null);let s=!1;try{if(!window.ogb?.desktopViewer)throw new Error(n("remoteDesktop.viewerUnavailable"));await b(`/api/bots/${t.id}/computer/control`,{method:"POST",body:JSON.stringify({action:"take"})}),s=!0;const a=await b(`/api/bots/${t.id}/computer/join`,{method:"POST",body:"{}"});if(!await window.ogb.desktopViewer.open(ge(a.joinUrl),n("computer.viewerTitle",{name:t.name}),t.id))throw new Error(n("computer.err.openDesktop",{app:K()}))}catch(a){s&&await b(`/api/bots/${t.id}/computer/control`,{method:"POST",body:JSON.stringify({action:"release"})}).catch(()=>{}),await b(`/api/bots/${t.id}/computer/viewer-close`,{method:"POST",body:"{}"}).catch(()=>{}),j(a instanceof Error?a.message:String(a))}finally{I(!1)}};return e.jsxs("aside",{className:"relative z-20 flex h-full w-[400px] shrink-0 flex-col border-l border-hairline bg-panel",ref:k,"data-computer-panel":!0,children:[e.jsxs("div",{...w,className:"flex items-center justify-between border-b border-hairline px-5 py-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[14px] font-medium text-ink",children:n("remoteDesktop.title",{name:t.name})}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:n(t.cloudBackend==="vps"?"botAccess.cloud.selfHostedVps":"remoteDesktop.cloudDesktop")})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"flex rounded-full bg-inset p-0.5","aria-label":n("computer.tabsAria"),children:["desktop","browser"].map(s=>e.jsxs("button",{type:"button",onClick:()=>O(s),"aria-pressed":x===s,className:B("flex items-center gap-1 rounded-full px-2.5 py-1 text-[12px]",x===s?"bg-card text-ink shadow-sm":"text-ink-secondary hover:text-ink"),children:[s==="desktop"?e.jsx(F,{size:12}):e.jsx(le,{size:12}),n(s==="desktop"?"remoteDesktop.desktop":"place.browser")]},s))}),e.jsx("button",{type:"button","data-computer-panel-close":!0,onClick:()=>{ce(k.current,t.id),l({type:"toggleComputer",open:!1})},className:"rounded-md p-1 text-ink-secondary hover:bg-control hover:text-ink","aria-label":n("remoteDesktop.close"),children:e.jsx(_,{size:18})})]})]}),x==="browser"?e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 pb-4 pt-1",children:[u?.place==="browser"&&e.jsx("div",{className:"-mt-2 mb-3",children:e.jsx(U,{help:u,askerName:q,onError:j})}),e.jsx(re,{bot:t,signIn:J}),v&&e.jsx("div",{role:"alert",className:"mt-2 rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-[12px] text-danger",children:v}),e.jsx("p",{className:"mt-2 text-[11px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.browserHint")})]}):e.jsxs("div",{className:"flex flex-1 flex-col items-center gap-4 overflow-y-auto px-6 py-5 text-center",children:[u&&u.place!=="browser"&&e.jsx("div",{className:"-mt-3 w-full",children:e.jsx(U,{help:u,askerName:q,onError:j})}),e.jsxs("button",{type:"button",onClick:()=>{V()},disabled:d||!p,className:"group relative flex aspect-video w-full items-center justify-center overflow-hidden rounded-xl border border-hairline bg-black disabled:cursor-default","aria-label":p?n("computer.openLiveDesktopAria",{name:t.name}):n("remoteDesktop.previewUnavailableLabel"),children:[p?e.jsx("img",{src:p,alt:n("remoteDesktop.previewAlt",{name:t.name}),className:"h-full w-full object-contain"}):M?e.jsx(C,{size:22,className:"animate-spin text-ink-secondary"}):e.jsxs("div",{className:"flex flex-col items-center gap-2 text-ink-secondary",children:[e.jsx(de,{size:24}),e.jsx("span",{className:"text-[11px]",children:n(H?"remoteDesktop.previewUnavailable":"remoteDesktop.previewWaiting")})]}),p&&e.jsx("span",{className:"absolute inset-x-0 bottom-0 bg-black/65 py-2 text-[11px] font-medium text-white opacity-0 transition-opacity group-hover:opacity-100",children:n("computer.openLiveDesktop")})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[14px] font-medium text-ink",children:n("remoteDesktop.openLive")}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.relayHint")})]}),e.jsxs("button",{type:"button",onClick:()=>{V()},disabled:d,className:"flex w-full items-center justify-center gap-2 rounded-lg bg-accent px-4 py-2.5 text-[13px] font-medium text-white hover:brightness-110 disabled:opacity-50",children:[d?e.jsx(C,{size:15,className:"animate-spin"}):e.jsx(F,{size:15}),n(d?"settings.updates.opening":"computer.takeControl")]}),v&&e.jsx("div",{role:"alert",className:"w-full rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-left text-[12px] text-danger",children:v}),e.jsx("p",{className:"text-[11px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.accessHint")}),e.jsxs("div",{className:"w-full rounded-xl bg-card p-4 text-left",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[15px] font-medium text-ink",children:[e.jsx(ue,{size:16,className:"text-accent"}),n("computer.routines.title")]}),N.length>0&&e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 text-[10px] font-medium text-ink-secondary",children:N.length})]}),f&&e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"mt-3 flex w-full items-center gap-2 rounded-lg border border-accent/25 bg-accent/10 px-3 py-2 text-left text-[12px] text-accent hover:bg-accent/15",children:[e.jsx(C,{size:13,className:f.status==="queued"?"":"animate-spin"}),e.jsxs("span",{className:"min-w-0 flex-1 truncate",children:[f.routineName," · ",n(f.status==="waiting"?"computer.routines.needsYou":f.status==="queued"?"computer.runStatus.queued":"computer.runStatus.running")]})]}),N.length>0&&e.jsx("div",{className:"mt-3 space-y-1.5",children:N.slice(0,3).map(s=>e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"flex w-full items-center gap-2 rounded-lg bg-inset px-3 py-2 text-left hover:bg-control/60",children:[e.jsx("span",{className:B("size-1.5 shrink-0 rounded-full",s.enabled?"bg-success":"bg-ink-secondary/40")}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[13px] font-medium text-ink",children:s.name}),e.jsxs("span",{className:"block truncate text-[11px] text-ink-secondary",children:[be(s),s.runOn==="cloud"?` · ${n("remoteDesktop.runsOnVm")}`:""]})]}),e.jsx("span",{className:"shrink-0 text-[10px] text-ink-secondary",children:ye(s.nextRunAt)})]},s.id))}),e.jsxs("div",{className:"mt-3 flex gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>z(!0),className:"flex flex-1 items-center justify-center gap-1.5 rounded-lg bg-accent py-2 text-[13px] font-medium text-white hover:brightness-110",children:[e.jsx(se,{size:14}),n("computer.routines.create")]}),e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"flex items-center justify-center gap-1.5 rounded-lg bg-control px-3 py-2 text-[13px] text-ink hover:bg-raised-hover",title:n("computer.routines.openTitle"),children:[e.jsx(he,{size:14}),n("computer.routines.schedules")]})]})]})]}),G&&e.jsx(fe,{bots:[t],lockedBotId:t.id,defaultRunOn:X?"cloud":"maus",onClose:()=>z(!1)})]})}export{Oe as RemoteDesktopPanel};
1
+ import{r as i,j as e,t as n,a as B,X as _,p as K,i as y}from"./styles-BHtUK2qB.js";import{b as Q,r as Z,i as ee}from"./remote-desktop-DDRRx8uY.js";import{u as te,L as C,P as se}from"./PlacesRail-CUntVv3u.js";import{u as ne,B as re}from"./BrowserPanel-DjEwiL31.js";import{u as ae,o as ie,t as oe,G as le,p as ce,q as U,v as de,w as ue,n as b,A as pe,x as me,y as xe}from"./App-D-SXyZXT.js";import{R as fe}from"./RoutinesPage-BZhG-dR9.js";import{M as F}from"./monitor-7oLB-7rZ.js";import{C as he}from"./calendar-days-DE6WL-x2.js";import"./BrowserProfilesManager-1DLRt4N9.js";import"./index-LBC94myy.js";import"./SignedInSites-31u9pN2b.js";import"./minimize-o-OFVasg.js";import"./file-up-Cg2kYQkd.js";import"./MenuMotion-CobYpP7L.js";import"./ProIntroduction-8BVPIU2J.js";function ge(t){if(typeof t!="string"||!t)throw new Error(n("remoteDesktop.noLink"));return t.startsWith("/vps-viewer/")?new URL(t,window.location.origin).toString():t}function be(t){if(t.schedule.type==="cron"||t.schedule.type==="limit_reset")return me(t.schedule);if(t.schedule.type==="once")return new Date(t.schedule.at).toLocaleString(y(),{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});if(t.schedule.type==="interval"){const d=t.schedule.everyMinutes%60===0?n("routines.interval.hours",{hours:t.schedule.everyMinutes/60}):n("routines.interval.minutes",{minutes:t.schedule.everyMinutes});return n("remoteDesktop.startingAt",{cadence:d,date:new Date(t.schedule.anchorAt).toLocaleString(y(),{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})}const r=t.schedule.weekdays,l=r.length===7?n("routines.repeat.daily"):r.join(",")==="1,2,3,4,5"?n("routines.repeat.weekdays"):r.map(xe).join(", "),[w,k]=t.schedule.time.split(":").map(Number);return`${l} · ${new Date(2e3,0,1,w,k).toLocaleTimeString(y(),{hour:"numeric",minute:"2-digit"})}`}function ye(t){if(t==null)return n("routines.pausedSchedule");const r=new Date(t),l=new Date;return`${r.toDateString()===l.toDateString()?n("routines.today"):r.toLocaleDateString(y(),{month:"short",day:"numeric"})}, ${r.toLocaleTimeString(y(),{hour:"numeric",minute:"2-digit"})}`}function Oe({bot:t}){const{state:r,dispatch:l}=ae(),{dragProps:w}=te(),k=ie(t.id),[d,I]=i.useState(!1),[v,j]=i.useState(null),[p,R]=i.useState(null),[M,D]=i.useState(!0),[H,m]=i.useState(!1),[P,E]=i.useState(!1),A=ne(),L=i.useRef(t.busy);i.useEffect(()=>{L.current=t.busy},[t.busy]);const[G,z]=i.useState(!1),[x,O]=i.useState(()=>oe(t.id)?"browser":"desktop"),[J,W]=i.useState(),u=r.computerControl[t.id]?.help??null,q=u?r.bots.find(s=>s.id===u.botId)?.name??t.name:t.name,c=r.signInFocus?.botId===t.id?r.signInFocus:void 0;i.useEffect(()=>{!c||c.consumed||(O(c.place==="browser"?"browser":"desktop"),c.place==="browser"&&W({url:c.url,site:c.site,nonce:c.requestId}),l({type:"signInFocusConsumed",requestId:c.requestId}))},[l,c]);const N=r.routines.filter(s=>s.botId===t.id).sort((s,a)=>Number(a.enabled)-Number(s.enabled)||(s.nextRunAt??1/0)-(a.nextRunAt??1/0)),f=r.routineRuns.find(s=>s.botId===t.id&&["queued","running","waiting"].includes(s.status)),X=!!(r.config?.box.configured&&Q(r.instances,t.modelSelection.instanceId)?.snapshot.state==="available");i.useEffect(()=>{R(null),D(!0),m(!1)},[t.id]),i.useEffect(()=>{const s=window.ogb?.desktopViewer;if(!s)return;let a=!0;s.currentState().then(o=>{a&&E(o.open&&o.contextId===t.id)}).catch(()=>{});const h=s.onState(o=>{(o.contextId===t.id||!o.open)&&E(o.open&&o.contextId===t.id)});return()=>{a=!1,h()}},[t.id]),i.useEffect(()=>{if(x!=="desktop"||!A||P||d)return;const s=new AbortController;let a=!1,h=-1/0,o=null,S=null;const $=async()=>{if(!(a||s.signal.aborted)&&!(Date.now()-h<(o??(L.current?4e3:3e4)))){a=!0,o=null;try{const g=Z(await b(`/api/bots/${t.id}/computer/screenshot`,{method:"POST",body:"{}",signal:AbortSignal.any([s.signal,AbortSignal.timeout(9e4)])}));!s.signal.aborted&&g?(R(g),m(!1),S=null):s.signal.aborted||m(!0)}catch(g){if(!s.signal.aborted)if(g instanceof pe&&ee(g)){o=1e3,S??=Date.now();const T=Date.now()-S>=1e4;m(T),D(!T)}else S=null,m(!0)}finally{!s.signal.aborted&&o===null&&D(!1),a=!1,h=Date.now()}}};$();const Y=window.setInterval($,1e3);return()=>{s.abort(),window.clearInterval(Y)}},[t.id,A,P,d,x]);const V=async()=>{I(!0),j(null);let s=!1;try{if(!window.ogb?.desktopViewer)throw new Error(n("remoteDesktop.viewerUnavailable"));await b(`/api/bots/${t.id}/computer/control`,{method:"POST",body:JSON.stringify({action:"take"})}),s=!0;const a=await b(`/api/bots/${t.id}/computer/join`,{method:"POST",body:"{}"});if(!await window.ogb.desktopViewer.open(ge(a.joinUrl),n("computer.viewerTitle",{name:t.name}),t.id))throw new Error(n("computer.err.openDesktop",{app:K()}))}catch(a){s&&await b(`/api/bots/${t.id}/computer/control`,{method:"POST",body:JSON.stringify({action:"release"})}).catch(()=>{}),await b(`/api/bots/${t.id}/computer/viewer-close`,{method:"POST",body:"{}"}).catch(()=>{}),j(a instanceof Error?a.message:String(a))}finally{I(!1)}};return e.jsxs("aside",{className:"relative z-20 flex h-full w-[400px] shrink-0 flex-col border-l border-hairline bg-panel",ref:k,"data-computer-panel":!0,children:[e.jsxs("div",{...w,className:"flex items-center justify-between border-b border-hairline px-5 py-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[14px] font-medium text-ink",children:n("remoteDesktop.title",{name:t.name})}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:n(t.cloudBackend==="vps"?"botAccess.cloud.selfHostedVps":"remoteDesktop.cloudDesktop")})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"flex rounded-full bg-inset p-0.5","aria-label":n("computer.tabsAria"),children:["desktop","browser"].map(s=>e.jsxs("button",{type:"button",onClick:()=>O(s),"aria-pressed":x===s,className:B("flex items-center gap-1 rounded-full px-2.5 py-1 text-[12px]",x===s?"bg-card text-ink shadow-sm":"text-ink-secondary hover:text-ink"),children:[s==="desktop"?e.jsx(F,{size:12}):e.jsx(le,{size:12}),n(s==="desktop"?"remoteDesktop.desktop":"place.browser")]},s))}),e.jsx("button",{type:"button","data-computer-panel-close":!0,onClick:()=>{ce(k.current,t.id),l({type:"toggleComputer",open:!1})},className:"rounded-md p-1 text-ink-secondary hover:bg-control hover:text-ink","aria-label":n("remoteDesktop.close"),children:e.jsx(_,{size:18})})]})]}),x==="browser"?e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 pb-4 pt-1",children:[u?.place==="browser"&&e.jsx("div",{className:"-mt-2 mb-3",children:e.jsx(U,{help:u,askerName:q,onError:j})}),e.jsx(re,{bot:t,signIn:J}),v&&e.jsx("div",{role:"alert",className:"mt-2 rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-[12px] text-danger",children:v}),e.jsx("p",{className:"mt-2 text-[11px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.browserHint")})]}):e.jsxs("div",{className:"flex flex-1 flex-col items-center gap-4 overflow-y-auto px-6 py-5 text-center",children:[u&&u.place!=="browser"&&e.jsx("div",{className:"-mt-3 w-full",children:e.jsx(U,{help:u,askerName:q,onError:j})}),e.jsxs("button",{type:"button",onClick:()=>{V()},disabled:d||!p,className:"group relative flex aspect-video w-full items-center justify-center overflow-hidden rounded-xl border border-hairline bg-black disabled:cursor-default","aria-label":p?n("computer.openLiveDesktopAria",{name:t.name}):n("remoteDesktop.previewUnavailableLabel"),children:[p?e.jsx("img",{src:p,alt:n("remoteDesktop.previewAlt",{name:t.name}),className:"h-full w-full object-contain"}):M?e.jsx(C,{size:22,className:"animate-spin text-ink-secondary"}):e.jsxs("div",{className:"flex flex-col items-center gap-2 text-ink-secondary",children:[e.jsx(de,{size:24}),e.jsx("span",{className:"text-[11px]",children:n(H?"remoteDesktop.previewUnavailable":"remoteDesktop.previewWaiting")})]}),p&&e.jsx("span",{className:"absolute inset-x-0 bottom-0 bg-black/65 py-2 text-[11px] font-medium text-white opacity-0 transition-opacity group-hover:opacity-100",children:n("computer.openLiveDesktop")})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[14px] font-medium text-ink",children:n("remoteDesktop.openLive")}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.relayHint")})]}),e.jsxs("button",{type:"button",onClick:()=>{V()},disabled:d,className:"flex w-full items-center justify-center gap-2 rounded-lg bg-accent px-4 py-2.5 text-[13px] font-medium text-white hover:brightness-110 disabled:opacity-50",children:[d?e.jsx(C,{size:15,className:"animate-spin"}):e.jsx(F,{size:15}),n(d?"settings.updates.opening":"computer.takeControl")]}),v&&e.jsx("div",{role:"alert",className:"w-full rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-left text-[12px] text-danger",children:v}),e.jsx("p",{className:"text-[11px] leading-relaxed text-ink-secondary",children:n("remoteDesktop.accessHint")}),e.jsxs("div",{className:"w-full rounded-xl bg-card p-4 text-left",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[15px] font-medium text-ink",children:[e.jsx(ue,{size:16,className:"text-accent"}),n("computer.routines.title")]}),N.length>0&&e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 text-[10px] font-medium text-ink-secondary",children:N.length})]}),f&&e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"mt-3 flex w-full items-center gap-2 rounded-lg border border-accent/25 bg-accent/10 px-3 py-2 text-left text-[12px] text-accent hover:bg-accent/15",children:[e.jsx(C,{size:13,className:f.status==="queued"?"":"animate-spin"}),e.jsxs("span",{className:"min-w-0 flex-1 truncate",children:[f.routineName," · ",n(f.status==="waiting"?"computer.routines.needsYou":f.status==="queued"?"computer.runStatus.queued":"computer.runStatus.running")]})]}),N.length>0&&e.jsx("div",{className:"mt-3 space-y-1.5",children:N.slice(0,3).map(s=>e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"flex w-full items-center gap-2 rounded-lg bg-inset px-3 py-2 text-left hover:bg-control/60",children:[e.jsx("span",{className:B("size-1.5 shrink-0 rounded-full",s.enabled?"bg-success":"bg-ink-secondary/40")}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[13px] font-medium text-ink",children:s.name}),e.jsxs("span",{className:"block truncate text-[11px] text-ink-secondary",children:[be(s),s.runOn==="cloud"?` · ${n("remoteDesktop.runsOnVm")}`:""]})]}),e.jsx("span",{className:"shrink-0 text-[10px] text-ink-secondary",children:ye(s.nextRunAt)})]},s.id))}),e.jsxs("div",{className:"mt-3 flex gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>z(!0),className:"flex flex-1 items-center justify-center gap-1.5 rounded-lg bg-accent py-2 text-[13px] font-medium text-white hover:brightness-110",children:[e.jsx(se,{size:14}),n("computer.routines.create")]}),e.jsxs("button",{type:"button",onClick:()=>l({type:"showRoutines"}),className:"flex items-center justify-center gap-1.5 rounded-lg bg-control px-3 py-2 text-[13px] text-ink hover:bg-raised-hover",title:n("computer.routines.openTitle"),children:[e.jsx(he,{size:14}),n("computer.routines.schedules")]})]})]})]}),G&&e.jsx(fe,{bots:[t],lockedBotId:t.id,defaultRunOn:X?"cloud":"maus",onClose:()=>z(!1)})]})}export{Oe as RemoteDesktopPanel};
package/dist/index.html CHANGED
@@ -11,7 +11,7 @@
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
12
12
  <link rel="manifest" href="/manifest.webmanifest" />
13
13
  <title>Limix Bot</title>
14
- <script type="module" crossorigin src="/assets/index--etc8Lh7.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-LBC94myy.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/styles-BHtUK2qB.js">
16
16
  <link rel="stylesheet" crossorigin href="/assets/styles-B9SGxFnK.css">
17
17
  </head>
@@ -23270,16 +23270,18 @@ finish(decision2.behavior,"user",decision2.message,decision2.always===!0):"unava
23270
23270
  ()=>listeners3.delete(listener2))},dispose:async()=>{disposing=!0,await deviceSignIn?.dispose();let disposingSessions=Array.from(sessions2);for(let{stop:stop2}of active3.values())stop2();for(let[threadId,session]of disposingSessions)closeSession(threadId,"dispose"),settle3(threadId,session,!0,"cancelled");for(let[threadId,children4]of retiring)for(let child2 of children4)retireChild(threadId,child2);listeners3.clear()}}}}}init_config3();import{existsSync as existsSync55,mkdirSync as mkdirSync64,readFileSync as readFileSync99,writeFileSync as writeFileSync25}from"node:fs";import{homedir as homedir22}from"node:os";import{delimiter as delimiter10,join as join134}from"node:path";var claimFile=()=>join134(DATA_DIR,"limix-agy-cli.json");function findAgyCli(env=process.env){if(env.LIMIX_AGY_CLI==="0")return null;let win=process.platform==="win32",name6=win?"agy.exe":"agy",candidates=[],localAppData=env.LOCALAPPDATA??process.
23271
23271
  env.LOCALAPPDATA;win&&localAppData&&candidates.push(join134(localAppData,"agy","bin",name6)),win||candidates.push(join134(homedir22(),".local","bin",name6));for(let dir of(env.PATH??env.Path??process.env.PATH??"").split(delimiter10))dir&&candidates.push(join134(dir,name6));return candidates.find(candidate=>existsSync55(candidate))??null}function claimedBy(){try{let value3=JSON.parse(readFileSync99(claimFile(),"utf8"));return typeof value3.instanceId=="string"?value3.instanceId:null}catch{return null}}
23272
23272
  function agyCliFor(instanceId,env=process.env){let cli=findAgyCli(env);if(!cli)return null;let owner2=claimedBy();if(owner2&&owner2!==instanceId)return null;if(!owner2)try{mkdirSync64(DATA_DIR,{recursive:!0}),writeFileSync25(claimFile(),JSON.stringify({instanceId,cli,at:new Date().toISOString()}))}catch{return null}return cli}function releaseAgyCli(instanceId){if(claimedBy()===instanceId)try{writeFileSync25(claimFile(),JSON.stringify({instanceId:null}))}catch{}}var STATIC_ANTIGRAVITY_MODELS=bundledEngineCatalog("antigravity");function normalizeAntigravityTurn(turn,offeredModels2){if(turn.variant!==void 0)return turn;let match5=turn.model?.match(/^(.+)-(low|medium|high)$/u);return match5&&offeredModels2.includes(match5[1])&&!offeredModels2.includes(match5[0])?{...turn,model:match5[1],variant:match5[2]}:turn}function antigravityPermissionMode(fullAuto,approvalMode){return fullAuto||approvalMode==="full"?"yolo":approvalMode==="edits"?"auto_edit":"default"}
23273
- var managedAsset=resolveAntigravityReleaseAsset(),support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"Install official Antigravity",downloadBytes:managedAsset.
23274
- archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile(
23275
- {instanceId,runtime:runtime2,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime2.executablePath,args:process.platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog("antigravity");let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});if(!await antigravityProfileAuthenticated(
23276
- profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime:runtime2,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},pickAuthMethod:methods2=>methods2.some(method2=>method2.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile(
23277
- {instanceId,runtime:runtime2,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});return{state:"available",version:runtime2.version,authenticated:await antigravityProfileAuthenticated(profile),
23278
- account:await antigravityAccount(profile.tokenPath)}}catch(error66){return{state:"unavailable",reason:error66 instanceof Error?error66.message:String(error66)}}},configureSession:async({request:request9,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||!configOptions2.some(option2=>option2?.id==="mode"))return;let wanted=antigravityPermissionMode(config3.fullAuto,turn.approvalMode),result2=await request9("session/set_config_option",{sessionId,configId:"\
23279
- mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option2=>option2?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did not apply ${wanted} permission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(
23280
- ()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime2=await resolveAntigravityRuntime(input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime:runtime2,baseEnv:environment});return{runtime:runtime2,profile}};return{...base2,get models(){return base2.models},get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot4=await base2.
23281
- snapshot();return snapshot4.state==="available"&&(installFailure=void 0),snapshot4.state==="unavailable"&&installFailure?{...snapshot4,reason:installFailure}:snapshot4},...antigravityManagedInstallAvailable()?{installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error66){throw installFailure=error66 instanceof Error?error66.message:String(error66),error66}}}:{},startAuthentication:async()=>{let{runtime:runtime2,profile}=await runtimeAndProfile();
23282
- return auth.start(runtime2,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.cancel(),await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}};function decodeRoutedCodexConfig(raw,label4="Company"){let value3=raw;if(typeof value3.url!="string"||!Array.isArray(value3.models)||!value3.models.length||value3.models.some(model4=>typeof model4!="string"||!/^[\w][\w./+-]*$/.test(model4)))throw new Error(`Invalid ${label4} Codex configuration.`);let url2=new URL(value3.url),loopback2=url2.hostname==="localhost"||url2.hostname==="[::1]"||/^127(?:\.\d{1,3}){3}$/.test(url2.hostname);if(url2.username||url2.password||url2.search||url2.hash||url2.protocol!==
23273
+ var managedAsset=resolveAntigravityReleaseAsset(),LIMIX_MODE_ALIASES={yolo:["yolo","bypassPermissions","bypass_permissions","full","auto","autoEdit","auto_edit","acceptEdits"],auto_edit:["auto_edit","autoEdit","acceptEdits","accept_edits"],default:["default","ask","normal"]};function limixModeFor(wanted,option2){let offered=[],collect2=list10=>{if(Array.isArray(list10))for(let item of list10){item&&typeof item=="object"&&Array.isArray(item.options)&&collect2(item.options);let value3=item&&typeof item==
23274
+ "object"?item.value??item.id:item;typeof value3=="string"&&offered.push(value3)}};return collect2(option2?.options),offered.length===0?wanted:(LIMIX_MODE_ALIASES[wanted]??[wanted]).find(value3=>offered.includes(value3))??null}var support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine\
23275
+ setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"Install official Antigravity",downloadBytes:managedAsset.archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{
23276
+ let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime2.executablePath,args:process.platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog(
23277
+ "antigravity");let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});if(!await antigravityProfileAuthenticated(profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime:runtime2,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},pickAuthMethod:methods2=>methods2.some(method2=>method2.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,
23278
+ isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime2=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime2=await resolveAntigravityRuntime(config3.cli,
23279
+ env),profile=await prepareAntigravityProfile({instanceId,runtime:runtime2,baseEnv:env});return{state:"available",version:runtime2.version,authenticated:await antigravityProfileAuthenticated(profile),account:await antigravityAccount(profile.tokenPath)}}catch(error66){return{state:"unavailable",reason:error66 instanceof Error?error66.message:String(error66)}}},configureSession:async({request:request9,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||
23280
+ !configOptions2.some(option2=>option2?.id==="mode"))return;let wanted=limixModeFor(antigravityPermissionMode(config3.fullAuto,turn.approvalMode),configOptions2.find(option2=>option2?.id==="mode"));if(!wanted)return;let result2=await request9("session/set_config_option",{sessionId,configId:"mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option2=>option2?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did not apply ${wanted} perm\
23281
+ ission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime2=await resolveAntigravityRuntime(
23282
+ input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime:runtime2,baseEnv:environment});return{runtime:runtime2,profile}};return{...base2,get models(){return base2.models},get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot4=await base2.snapshot();return snapshot4.state==="available"&&(installFailure=void 0),snapshot4.state==="unavailable"&&installFailure?{...snapshot4,reason:installFailure}:snapshot4},...antigravityManagedInstallAvailable()?
23283
+ {installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error66){throw installFailure=error66 instanceof Error?error66.message:String(error66),error66}}}:{},startAuthentication:async()=>{let{runtime:runtime2,profile}=await runtimeAndProfile();return auth.start(runtime2,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.
23284
+ cancel(),await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}};function decodeRoutedCodexConfig(raw,label4="Company"){let value3=raw;if(typeof value3.url!="string"||!Array.isArray(value3.models)||!value3.models.length||value3.models.some(model4=>typeof model4!="string"||!/^[\w][\w./+-]*$/.test(model4)))throw new Error(`Invalid ${label4} Codex configuration.`);let url2=new URL(value3.url),loopback2=url2.hostname==="localhost"||url2.hostname==="[::1]"||/^127(?:\.\d{1,3}){3}$/.test(url2.hostname);if(url2.username||url2.password||url2.search||url2.hash||url2.protocol!==
23283
23285
  "https:"&&!(url2.protocol==="http:"&&loopback2))throw new Error(`Invalid ${label4} Codex endpoint.`);return{url:url2.href.replace(/\/$/,""),models:value3.models}}function managedCodexArgs(config3){return providerCodexArgs(config3.url,"openmaus_company","Company","OPENMAUSBOT_COMPANY_API_KEY")}function endpointCodexArgs(config3){return[...providerCodexArgs(config3.url,"openmaus_endpoint","Direct API","OPENMAUSBOT_CODEX_API_KEY"),"-c","model_providers.openmaus_endpoint.supports_websockets=false","\
23284
23286
  -c","features.tool_search=false"]}function providerCodexArgs(url2,provider,name6,key7){return["-c",`model_provider=${JSON.stringify(provider)}`,"-c",`model_providers.${provider}.name=${JSON.stringify(name6)}`,"-c",`model_providers.${provider}.base_url=${JSON.stringify(url2)}`,"-c",`model_providers.${provider}.env_key=${JSON.stringify(key7)}`,"-c",`model_providers.${provider}.wire_api="responses"`,"-c",`model_providers.${provider}.requires_openai_auth=false`,"-c",'cli_auth_credentials_store="ephe\
23285
23287
  meral"',"-c","shell_environment_policy.ignore_default_excludes=false"]}init_chat_notices();function codexActionFailure(message8,mayHaveRun,text30){return mayHaveRun?noticeFailure("chat.notice.codexActionMayHaveRun",{message:message8}):{message:message8,...text30?{text:text30}:{}}}function codexToolSurfaceArgs(){return["-c","features.browser_use=false","-c","features.browser_use_external=false","-c","features.computer_use=false","-c",'plugins={ "browser@openai-bundled" = { enabled = false }, "computer-use@openai-bundled" = { enabled = false }, "unified-computer-use@openai-bundled" = { enabled = false } }']}var plainRecord=value3=>value3&&typeof value3=="object"&&!Array.isArray(value3)?value3:null,GUEST_CONFINED_CODEX_ARGS=["-c","features.shell_tool=false","-c","features.unified_exec=false","-c","features.view_image=false","-c",'web_search="disabled"'];function codexShellDisabled(config3){let features=plainRecord(plainRecord(config3)?.features);return features?.shell_tool===!1&&features?.unified_exec===!1&&features?.view_image===!1}function codexDisabledNativeSkillArgs(botId){let names5=disabledNativeSkillNames(
@@ -4054,18 +4054,19 @@ null}var FREE_SPACE_MARGIN,DOWNLOAD_TIMEOUT_MS4,STAGING_PREFIX2,wait,INSTALL_REC
4054
4054
  class extends Error{status=409;constructor(message5){super(message5),this.name="AntigravitySetupError"}},installs2=new Map}});import{existsSync as existsSync28,mkdirSync as mkdirSync24,readFileSync as readFileSync29,writeFileSync as writeFileSync13}from"node:fs";import{homedir as homedir15}from"node:os";import{delimiter as delimiter10,join as join56}from"node:path";function findAgyCli(env=process.env){if(env.LIMIX_AGY_CLI==="0")return null;let win=process.platform==="win32",name=win?"agy.exe":"agy",candidates=[],localAppData=env.LOCALAPPDATA??process.env.LOCALAPPDATA;win&&localAppData&&candidates.push(join56(localAppData,
4055
4055
  "agy","bin",name)),win||candidates.push(join56(homedir15(),".local","bin",name));for(let dir of(env.PATH??env.Path??process.env.PATH??"").split(delimiter10))dir&&candidates.push(join56(dir,name));return candidates.find(candidate=>existsSync28(candidate))??null}function claimedBy(){try{let value=JSON.parse(readFileSync29(claimFile(),"utf8"));return typeof value.instanceId=="string"?value.instanceId:null}catch{return null}}function agyCliFor(instanceId,env=process.env){let cli=findAgyCli(env);if(!cli)
4056
4056
  return null;let owner=claimedBy();if(owner&&owner!==instanceId)return null;if(!owner)try{mkdirSync24(DATA_DIR,{recursive:!0}),writeFileSync13(claimFile(),JSON.stringify({instanceId,cli,at:new Date().toISOString()}))}catch{return null}return cli}function releaseAgyCli(instanceId){if(claimedBy()===instanceId)try{writeFileSync13(claimFile(),JSON.stringify({instanceId:null}))}catch{}}var claimFile,init_limix_agy_cli=__esm({"server/limix-agy-cli.ts"(){"use strict";init_config3();claimFile=()=>join56(
4057
- DATA_DIR,"limix-agy-cli.json")}});function normalizeAntigravityTurn(turn,offeredModels2){if(turn.variant!==void 0)return turn;let match=turn.model?.match(/^(.+)-(low|medium|high)$/u);return match&&offeredModels2.includes(match[1])&&!offeredModels2.includes(match[0])?{...turn,model:match[1],variant:match[2]}:turn}function antigravityPermissionMode(fullAuto,approvalMode){return fullAuto||approvalMode==="full"?"yolo":approvalMode==="edits"?"auto_edit":"default"}var STATIC_ANTIGRAVITY_MODELS,managedAsset,support,AcpAntigravityDriver,
4058
- AntigravityDriver,init_antigravity=__esm({"server/drivers/antigravity.ts"(){"use strict";init_antigravity_account();init_core3();init_antigravity_acp();init_antigravity_runtime();init_antigravity_release();init_antigravity_temp();init_env_path();init_limix_agy_cli();init_bundled();init_manifest();STATIC_ANTIGRAVITY_MODELS=bundledEngineCatalog("antigravity");managedAsset=resolveAntigravityReleaseAsset(),support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){
4059
- return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"Install official Antigravity",downloadBytes:managedAsset.archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,
4060
- sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime.executablePath,args:process.
4061
- platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog("antigravity");let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});if(!await antigravityProfileAuthenticated(profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},
4062
- pickAuthMethod:methods=>methods.some(method=>method.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,
4063
- env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return{state:"available",version:runtime.version,authenticated:await antigravityProfileAuthenticated(profile),account:await antigravityAccount(profile.tokenPath)}}catch(error62){return{state:"unavailable",reason:error62 instanceof Error?error62.message:String(error62)}}},configureSession:async({
4064
- request:request2,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||!configOptions2.some(option=>option?.id==="mode"))return;let wanted=antigravityPermissionMode(config3.fullAuto,turn.approvalMode),result2=await request2("session/set_config_option",{sessionId,configId:"mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option=>option?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did \
4065
- not apply ${wanted} permission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime=await resolveAntigravityRuntime(
4066
- input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime,baseEnv:environment});return{runtime,profile}};return{...base2,get models(){return base2.models},get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot=await base2.snapshot();return snapshot.state==="available"&&(installFailure=void 0),snapshot.state==="unavailable"&&installFailure?{...snapshot,reason:installFailure}:snapshot},...antigravityManagedInstallAvailable()?
4067
- {installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error62){throw installFailure=error62 instanceof Error?error62.message:String(error62),error62}}}:{},startAuthentication:async()=>{let{runtime,profile}=await runtimeAndProfile();return auth.start(runtime,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.cancel(),
4068
- await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}}}});function cliVersionProbe(cli,run6=execCli){let read2=cliVersionReader(cli),pending;return env=>{if(pending)return pending;let deadline=Date.now()+CLI_VERSION_TIMEOUT_MS,attempt=()=>new Promise(resolve35=>{run6(cli,["--version"],{timeout:Math.max(1,deadline-Date.now()),env},(error62,stdout2)=>resolve35({error:error62,stdout:stdout2}))});return pending=(async()=>{let result2=await attempt();return!result2.error&&!result2.stdout.trim()&&Date.now()<deadline&&(result2=await attempt()),read2(result2.error,
4057
+ DATA_DIR,"limix-agy-cli.json")}});function normalizeAntigravityTurn(turn,offeredModels2){if(turn.variant!==void 0)return turn;let match=turn.model?.match(/^(.+)-(low|medium|high)$/u);return match&&offeredModels2.includes(match[1])&&!offeredModels2.includes(match[0])?{...turn,model:match[1],variant:match[2]}:turn}function antigravityPermissionMode(fullAuto,approvalMode){return fullAuto||approvalMode==="full"?"yolo":approvalMode==="edits"?"auto_edit":"default"}function limixModeFor(wanted,option){let offered=[],collect=list5=>{if(Array.
4058
+ isArray(list5))for(let item of list5){item&&typeof item=="object"&&Array.isArray(item.options)&&collect(item.options);let value=item&&typeof item=="object"?item.value??item.id:item;typeof value=="string"&&offered.push(value)}};return collect(option?.options),offered.length===0?wanted:(LIMIX_MODE_ALIASES[wanted]??[wanted]).find(value=>offered.includes(value))??null}var STATIC_ANTIGRAVITY_MODELS,managedAsset,LIMIX_MODE_ALIASES,support,AcpAntigravityDriver,AntigravityDriver,init_antigravity=__esm({
4059
+ "server/drivers/antigravity.ts"(){"use strict";init_antigravity_account();init_core3();init_antigravity_acp();init_antigravity_runtime();init_antigravity_release();init_antigravity_temp();init_env_path();init_limix_agy_cli();init_bundled();init_manifest();STATIC_ANTIGRAVITY_MODELS=bundledEngineCatalog("antigravity");managedAsset=resolveAntigravityReleaseAsset(),LIMIX_MODE_ALIASES={yolo:["yolo","bypassPermissions","bypass_permissions","full","auto","autoEdit","auto_edit","acceptEdits"],auto_edit:[
4060
+ "auto_edit","autoEdit","acceptEdits","accept_edits"],default:["default","ask","normal"]};support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"In\
4061
+ stall official Antigravity",downloadBytes:managedAsset.archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime=await resolveAntigravityRuntime(
4062
+ config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime.executablePath,args:process.platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog("antigravity");let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,
4063
+ baseEnv:env});if(!await antigravityProfileAuthenticated(profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},pickAuthMethod:methods=>methods.some(method=>method.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime=await resolveAntigravityRuntime(config3.
4064
+ cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return{state:"available",version:runtime.version,authenticated:await antigravityProfileAuthenticated(
4065
+ profile),account:await antigravityAccount(profile.tokenPath)}}catch(error62){return{state:"unavailable",reason:error62 instanceof Error?error62.message:String(error62)}}},configureSession:async({request:request2,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||!configOptions2.some(option=>option?.id==="mode"))return;let wanted=limixModeFor(antigravityPermissionMode(config3.fullAuto,turn.approvalMode),configOptions2.find(option=>option?.id==="mode"));
4066
+ if(!wanted)return;let result2=await request2("session/set_config_option",{sessionId,configId:"mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option=>option?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did not apply ${wanted} permission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(
4067
+ input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime=await resolveAntigravityRuntime(input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime,baseEnv:environment});return{runtime,profile}};return{...base2,get models(){return base2.models},
4068
+ get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot=await base2.snapshot();return snapshot.state==="available"&&(installFailure=void 0),snapshot.state==="unavailable"&&installFailure?{...snapshot,reason:installFailure}:snapshot},...antigravityManagedInstallAvailable()?{installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error62){throw installFailure=error62 instanceof Error?error62.message:
4069
+ String(error62),error62}}}:{},startAuthentication:async()=>{let{runtime,profile}=await runtimeAndProfile();return auth.start(runtime,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.cancel(),await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}}}});function cliVersionProbe(cli,run6=execCli){let read2=cliVersionReader(cli),pending;return env=>{if(pending)return pending;let deadline=Date.now()+CLI_VERSION_TIMEOUT_MS,attempt=()=>new Promise(resolve35=>{run6(cli,["--version"],{timeout:Math.max(1,deadline-Date.now()),env},(error62,stdout2)=>resolve35({error:error62,stdout:stdout2}))});return pending=(async()=>{let result2=await attempt();return!result2.error&&!result2.stdout.trim()&&Date.now()<deadline&&(result2=await attempt()),read2(result2.error,
4069
4070
  result2.stdout)})().finally(()=>{pending=void 0}),pending}}var init_cli_version_probe=__esm({"server/cli-version-probe.ts"(){"use strict";init_procs()}});function claudeAuthStatus(cli,env,run6=execCli){return new Promise(resolve35=>{run6(cli,["auth","status","--json"],{timeout:8e3,maxBuffer:65536,env},(error62,stdout2)=>{if(error62?.killed)return resolve35({});try{let status2=JSON.parse(stdout2),loggedIn=status2&&typeof status2=="object"&&"loggedIn"in status2?status2.loggedIn:void 0;if(loggedIn!==!0)return resolve35(loggedIn===!1?{authenticated:!1}:{});let identity=status2,boundedText2=(value,max)=>typeof value=="string"&&value.trim().length>0&&value.
4070
4071
  length<=max&&!/[\p{Cc}\p{Cf}]/u.test(value)?value.trim():void 0,candidateEmail=boundedText2(identity.email,254),email3=candidateEmail&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(candidateEmail)?candidateEmail:void 0,organization=boundedText2(identity.orgName,160),account2={...email3?{email:email3}:{},...organization?{organization}:{},...identity.authMethod==="api_key"?{method:"api-key"}:{}};resolve35({authenticated:!0,...Object.keys(account2).length?{account:account2}:{}})}catch{resolve35({})}})})}var init_claude_auth_status=__esm(
4071
4072
  {"server/drivers/claude-auth-status.ts"(){"use strict";init_procs()}});import{readFileSync as readFileSync30}from"node:fs";import{join as join57}from"node:path";function projectMcpServers(cwd){let parsed;try{parsed=JSON.parse(readFileSync30(join57(cwd,".mcp.json"),"utf8"))}catch{return{}}let servers=parsed?.mcpServers;if(!servers||typeof servers!="object"||Array.isArray(servers))return{};let out={};for(let[name,server]of Object.entries(servers))server&&typeof server=="object"&&!Array.isArray(server)&&(out[name]=server);return out}var init_claude_project_mcp=__esm({
@@ -1 +1 @@
1
- {"type":"module","version":"0.3.21"}
1
+ {"type":"module","version":"0.3.22"}
@@ -4053,18 +4053,19 @@ null}var FREE_SPACE_MARGIN,DOWNLOAD_TIMEOUT_MS4,STAGING_PREFIX2,wait,INSTALL_REC
4053
4053
  class extends Error{status=409;constructor(message5){super(message5),this.name="AntigravitySetupError"}},installs2=new Map}});import{existsSync as existsSync28,mkdirSync as mkdirSync24,readFileSync as readFileSync29,writeFileSync as writeFileSync13}from"node:fs";import{homedir as homedir15}from"node:os";import{delimiter as delimiter10,join as join56}from"node:path";function findAgyCli(env=process.env){if(env.LIMIX_AGY_CLI==="0")return null;let win=process.platform==="win32",name=win?"agy.exe":"agy",candidates=[],localAppData=env.LOCALAPPDATA??process.env.LOCALAPPDATA;win&&localAppData&&candidates.push(join56(localAppData,
4054
4054
  "agy","bin",name)),win||candidates.push(join56(homedir15(),".local","bin",name));for(let dir of(env.PATH??env.Path??process.env.PATH??"").split(delimiter10))dir&&candidates.push(join56(dir,name));return candidates.find(candidate=>existsSync28(candidate))??null}function claimedBy(){try{let value=JSON.parse(readFileSync29(claimFile(),"utf8"));return typeof value.instanceId=="string"?value.instanceId:null}catch{return null}}function agyCliFor(instanceId,env=process.env){let cli=findAgyCli(env);if(!cli)
4055
4055
  return null;let owner=claimedBy();if(owner&&owner!==instanceId)return null;if(!owner)try{mkdirSync24(DATA_DIR,{recursive:!0}),writeFileSync13(claimFile(),JSON.stringify({instanceId,cli,at:new Date().toISOString()}))}catch{return null}return cli}function releaseAgyCli(instanceId){if(claimedBy()===instanceId)try{writeFileSync13(claimFile(),JSON.stringify({instanceId:null}))}catch{}}var claimFile,init_limix_agy_cli=__esm({"server/limix-agy-cli.ts"(){"use strict";init_config3();claimFile=()=>join56(
4056
- DATA_DIR,"limix-agy-cli.json")}});function normalizeAntigravityTurn(turn,offeredModels2){if(turn.variant!==void 0)return turn;let match=turn.model?.match(/^(.+)-(low|medium|high)$/u);return match&&offeredModels2.includes(match[1])&&!offeredModels2.includes(match[0])?{...turn,model:match[1],variant:match[2]}:turn}function antigravityPermissionMode(fullAuto,approvalMode){return fullAuto||approvalMode==="full"?"yolo":approvalMode==="edits"?"auto_edit":"default"}var STATIC_ANTIGRAVITY_MODELS,managedAsset,support,AcpAntigravityDriver,
4057
- AntigravityDriver,init_antigravity=__esm({"server/drivers/antigravity.ts"(){"use strict";init_antigravity_account();init_core3();init_antigravity_acp();init_antigravity_runtime();init_antigravity_release();init_antigravity_temp();init_env_path();init_limix_agy_cli();init_bundled();init_manifest();STATIC_ANTIGRAVITY_MODELS=bundledEngineCatalog("antigravity");managedAsset=resolveAntigravityReleaseAsset(),support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){
4058
- return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"Install official Antigravity",downloadBytes:managedAsset.archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,
4059
- sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime.executablePath,args:process.
4060
- platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog("antigravity");let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});if(!await antigravityProfileAuthenticated(profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},
4061
- pickAuthMethod:methods=>methods.some(method=>method.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,
4062
- env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return{state:"available",version:runtime.version,authenticated:await antigravityProfileAuthenticated(profile),account:await antigravityAccount(profile.tokenPath)}}catch(error62){return{state:"unavailable",reason:error62 instanceof Error?error62.message:String(error62)}}},configureSession:async({
4063
- request:request2,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||!configOptions2.some(option=>option?.id==="mode"))return;let wanted=antigravityPermissionMode(config3.fullAuto,turn.approvalMode),result2=await request2("session/set_config_option",{sessionId,configId:"mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option=>option?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did \
4064
- not apply ${wanted} permission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime=await resolveAntigravityRuntime(
4065
- input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime,baseEnv:environment});return{runtime,profile}};return{...base2,get models(){return base2.models},get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot=await base2.snapshot();return snapshot.state==="available"&&(installFailure=void 0),snapshot.state==="unavailable"&&installFailure?{...snapshot,reason:installFailure}:snapshot},...antigravityManagedInstallAvailable()?
4066
- {installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error62){throw installFailure=error62 instanceof Error?error62.message:String(error62),error62}}}:{},startAuthentication:async()=>{let{runtime,profile}=await runtimeAndProfile();return auth.start(runtime,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.cancel(),
4067
- await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}}}});function cliVersionProbe(cli,run6=execCli){let read2=cliVersionReader(cli),pending;return env=>{if(pending)return pending;let deadline=Date.now()+CLI_VERSION_TIMEOUT_MS,attempt=()=>new Promise(resolve35=>{run6(cli,["--version"],{timeout:Math.max(1,deadline-Date.now()),env},(error62,stdout2)=>resolve35({error:error62,stdout:stdout2}))});return pending=(async()=>{let result2=await attempt();return!result2.error&&!result2.stdout.trim()&&Date.now()<deadline&&(result2=await attempt()),read2(result2.error,
4056
+ DATA_DIR,"limix-agy-cli.json")}});function normalizeAntigravityTurn(turn,offeredModels2){if(turn.variant!==void 0)return turn;let match=turn.model?.match(/^(.+)-(low|medium|high)$/u);return match&&offeredModels2.includes(match[1])&&!offeredModels2.includes(match[0])?{...turn,model:match[1],variant:match[2]}:turn}function antigravityPermissionMode(fullAuto,approvalMode){return fullAuto||approvalMode==="full"?"yolo":approvalMode==="edits"?"auto_edit":"default"}function limixModeFor(wanted,option){let offered=[],collect=list5=>{if(Array.
4057
+ isArray(list5))for(let item of list5){item&&typeof item=="object"&&Array.isArray(item.options)&&collect(item.options);let value=item&&typeof item=="object"?item.value??item.id:item;typeof value=="string"&&offered.push(value)}};return collect(option?.options),offered.length===0?wanted:(LIMIX_MODE_ALIASES[wanted]??[wanted]).find(value=>offered.includes(value))??null}var STATIC_ANTIGRAVITY_MODELS,managedAsset,LIMIX_MODE_ALIASES,support,AcpAntigravityDriver,AntigravityDriver,init_antigravity=__esm({
4058
+ "server/drivers/antigravity.ts"(){"use strict";init_antigravity_account();init_core3();init_antigravity_acp();init_antigravity_runtime();init_antigravity_release();init_antigravity_temp();init_env_path();init_limix_agy_cli();init_bundled();init_manifest();STATIC_ANTIGRAVITY_MODELS=bundledEngineCatalog("antigravity");managedAsset=resolveAntigravityReleaseAsset(),LIMIX_MODE_ALIASES={yolo:["yolo","bypassPermissions","bypass_permissions","full","auto","autoEdit","auto_edit","acceptEdits"],auto_edit:[
4059
+ "auto_edit","autoEdit","acceptEdits","accept_edits"],default:["default","ask","normal"]};support={driverKind:"antigravityAgent",displayName:"Google Gemini (Antigravity)",get models(){return currentEngineCatalog("antigravity")},defaultCli:"agy",nativeSource:"antigravity.acp",loginNote:"Antigravity needs a Google account \u2014 choose Sign in with Google in engine setup",install:{docsUrl:"https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",...managedAsset?{managed:{label:"In\
4060
+ stall official Antigravity",downloadBytes:managedAsset.archiveBytes}}:{}},images:!0,spawnArgs:()=>[],selectModel:{configId:"model"},modelVariants:!0,normalizeSessionSelection:normalizeAntigravityTurn,sessionModelEnv:"AGY_ACP_DEFAULT_MODEL",sessionScopedApproval:!0,resumeMethod:"resume",clientFileSystem:!0,sanitizeToolPayload:!0,resolveCommand:async(env,config3,instanceId)=>{let agyCli=agyCliFor(instanceId,env);if(agyCli)return{command:agyCli,args:["acp"]};let runtime=await resolveAntigravityRuntime(
4061
+ config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return profile.tempDirectory&&scheduleAntigravityTempSweep(instanceId),{command:runtime.executablePath,args:process.platform==="linux"?["--uid="]:[],env:profile.environment}},resolveModels:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return currentEngineCatalog("antigravity");let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,
4062
+ baseEnv:env});if(!await antigravityProfileAuthenticated(profile))throw new Error(support.loginNote);return probeAntigravityModels({runtime,profile,fallbackDefault:currentEngineCatalog("antigravity").default})},pickAuthMethod:methods=>methods.some(method=>method.id==="oauth-personal")?"oauth-personal":null,authFailure:"fail",requireAuthenticationBeforeSpawn:!0,isAuthenticated:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return!0;try{let runtime=await resolveAntigravityRuntime(config3.
4063
+ cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return antigravityProfileAuthenticated(profile)}catch{return!1}},snapshot:async(env,config3,instanceId)=>{if(agyCliFor(instanceId,env))return{state:"available",version:"Antigravity CLI",authenticated:!0};try{let runtime=await resolveAntigravityRuntime(config3.cli,env),profile=await prepareAntigravityProfile({instanceId,runtime,baseEnv:env});return{state:"available",version:runtime.version,authenticated:await antigravityProfileAuthenticated(
4064
+ profile),account:await antigravityAccount(profile.tokenPath)}}catch(error62){return{state:"unavailable",reason:error62 instanceof Error?error62.message:String(error62)}}},configureSession:async({request:request2,sessionId,config:config3,turn,configOptions:configOptions2})=>{if(!Array.isArray(configOptions2)||!configOptions2.some(option=>option?.id==="mode"))return;let wanted=limixModeFor(antigravityPermissionMode(config3.fullAuto,turn.approvalMode),configOptions2.find(option=>option?.id==="mode"));
4065
+ if(!wanted)return;let result2=await request2("session/set_config_option",{sessionId,configId:"mode",value:wanted});if((Array.isArray(result2?.configOptions)?result2.configOptions.find(option=>option?.id==="mode")?.currentValue:void 0)!==wanted)throw new Error(`Antigravity did not apply ${wanted} permission mode.`)}},AcpAntigravityDriver=createAcpDriver(support),AntigravityDriver={...AcpAntigravityDriver,async create(input2){let base2=await AcpAntigravityDriver.create(input2);scheduleAntigravityTempSweep(
4066
+ input2.instanceId),scheduleAntigravityTempSweep(VERIFICATION_TEMP_KEY);let auth=new AntigravityAuthController(()=>{base2.refreshModels?.()}),installFailure,runtimeAndProfile=async()=>{let environment={...process.env,...input2.environment,PATH:augmentedPath()},runtime=await resolveAntigravityRuntime(input2.config.cli,environment),profile=await prepareAntigravityProfile({instanceId:input2.instanceId,runtime,baseEnv:environment});return{runtime,profile}};return{...base2,get models(){return base2.models},
4067
+ get modelsUnconfirmed(){return base2.modelsUnconfirmed},snapshot:async()=>{let snapshot=await base2.snapshot();return snapshot.state==="available"&&(installFailure=void 0),snapshot.state==="unavailable"&&installFailure?{...snapshot,reason:installFailure}:snapshot},...antigravityManagedInstallAvailable()?{installRuntime:async()=>{installFailure=void 0;try{await installAntigravityRuntime({validate:validateAntigravityRuntime})}catch(error62){throw installFailure=error62 instanceof Error?error62.message:
4068
+ String(error62),error62}}}:{},startAuthentication:async()=>{let{runtime,profile}=await runtimeAndProfile();return auth.start(runtime,profile)},completeAuthentication:async(flowId,callbackUrl)=>auth.complete(flowId,callbackUrl),cancelAuthentication:async()=>auth.cancel(),signOut:async()=>{auth.cancel(),await removeAntigravitySignIn(input2.instanceId),releaseAgyCli(input2.instanceId)},dispose:async()=>{auth.cancel(),await base2.dispose()}}}}}});function cliVersionProbe(cli,run6=execCli){let read2=cliVersionReader(cli),pending;return env=>{if(pending)return pending;let deadline=Date.now()+CLI_VERSION_TIMEOUT_MS,attempt=()=>new Promise(resolve35=>{run6(cli,["--version"],{timeout:Math.max(1,deadline-Date.now()),env},(error62,stdout2)=>resolve35({error:error62,stdout:stdout2}))});return pending=(async()=>{let result2=await attempt();return!result2.error&&!result2.stdout.trim()&&Date.now()<deadline&&(result2=await attempt()),read2(result2.error,
4068
4069
  result2.stdout)})().finally(()=>{pending=void 0}),pending}}var init_cli_version_probe=__esm({"server/cli-version-probe.ts"(){"use strict";init_procs()}});function claudeAuthStatus(cli,env,run6=execCli){return new Promise(resolve35=>{run6(cli,["auth","status","--json"],{timeout:8e3,maxBuffer:65536,env},(error62,stdout2)=>{if(error62?.killed)return resolve35({});try{let status2=JSON.parse(stdout2),loggedIn=status2&&typeof status2=="object"&&"loggedIn"in status2?status2.loggedIn:void 0;if(loggedIn!==!0)return resolve35(loggedIn===!1?{authenticated:!1}:{});let identity=status2,boundedText2=(value,max)=>typeof value=="string"&&value.trim().length>0&&value.
4069
4070
  length<=max&&!/[\p{Cc}\p{Cf}]/u.test(value)?value.trim():void 0,candidateEmail=boundedText2(identity.email,254),email3=candidateEmail&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(candidateEmail)?candidateEmail:void 0,organization=boundedText2(identity.orgName,160),account2={...email3?{email:email3}:{},...organization?{organization}:{},...identity.authMethod==="api_key"?{method:"api-key"}:{}};resolve35({authenticated:!0,...Object.keys(account2).length?{account:account2}:{}})}catch{resolve35({})}})})}var init_claude_auth_status=__esm(
4070
4071
  {"server/drivers/claude-auth-status.ts"(){"use strict";init_procs()}});import{readFileSync as readFileSync30}from"node:fs";import{join as join57}from"node:path";function projectMcpServers(cwd){let parsed;try{parsed=JSON.parse(readFileSync30(join57(cwd,".mcp.json"),"utf8"))}catch{return{}}let servers=parsed?.mcpServers;if(!servers||typeof servers!="object"||Array.isArray(servers))return{};let out={};for(let[name,server]of Object.entries(servers))server&&typeof server=="object"&&!Array.isArray(server)&&(out[name]=server);return out}var init_claude_project_mcp=__esm({
@@ -27,6 +27,30 @@ export function antigravityPermissionMode(fullAuto, approvalMode) {
27
27
  return approvalMode === "edits" ? "auto_edit" : "default";
28
28
  }
29
29
  const managedAsset = resolveAntigravityReleaseAsset();
30
+ const LIMIX_MODE_ALIASES = {
31
+ yolo: ["yolo", "bypassPermissions", "bypass_permissions", "full", "auto", "autoEdit", "auto_edit", "acceptEdits"],
32
+ auto_edit: ["auto_edit", "autoEdit", "acceptEdits", "accept_edits"],
33
+ default: ["default", "ask", "normal"],
34
+ };
35
+ /** The mode value this session offers for `wanted`; null when it offers none (the session keeps its own). */
36
+ function limixModeFor(wanted, option) {
37
+ const offered = [];
38
+ const collect = (list) => {
39
+ if (!Array.isArray(list))
40
+ return;
41
+ for (const item of list) {
42
+ if (item && typeof item === "object" && Array.isArray(item.options))
43
+ collect(item.options);
44
+ const value = item && typeof item === "object" ? item.value ?? item.id : item;
45
+ if (typeof value === "string")
46
+ offered.push(value);
47
+ }
48
+ };
49
+ collect(option?.options);
50
+ if (offered.length === 0)
51
+ return wanted;
52
+ return (LIMIX_MODE_ALIASES[wanted] ?? [wanted]).find((value) => offered.includes(value)) ?? null;
53
+ }
30
54
  const support = {
31
55
  driverKind: "antigravityAgent",
32
56
  // Named for what people look for: Google moved personal Gemini subscriptions (free, AI Pro, AI Ultra) from Gemini CLI to Antigravity on 2026-06-18.
@@ -118,7 +142,9 @@ const support = {
118
142
  if (!Array.isArray(configOptions) || !configOptions.some(option => option?.id === "mode")) {
119
143
  return;
120
144
  }
121
- const wanted = antigravityPermissionMode(config.fullAuto, turn.approvalMode);
145
+ const wanted = limixModeFor(antigravityPermissionMode(config.fullAuto, turn.approvalMode), configOptions.find((option) => option?.id === "mode"));
146
+ if (!wanted)
147
+ return;
122
148
  const result = await request("session/set_config_option", {
123
149
  sessionId,
124
150
  configId: "mode",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "limixbot",
3
- "version": "0.3.21",
3
+ "version": "0.3.22",
4
4
  "description": "Run the Limix Bot server anywhere and pair your devices to it (Leox ৹ Limix AI)",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",