twenty-sdk 0.8.0 → 0.9.0

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 (42) hide show
  1. package/dist/cli/commands/dev-once.d.ts +7 -0
  2. package/dist/cli/commands/exec.d.ts +2 -2
  3. package/dist/cli/operations/dev-once.d.ts +13 -0
  4. package/dist/cli/operations/execute.d.ts +2 -2
  5. package/dist/cli/operations/index.d.ts +2 -0
  6. package/dist/cli/operations/server-start.d.ts +1 -0
  7. package/dist/cli/utilities/build/manifest/manifest-extract-config.d.ts +1 -1
  8. package/dist/cli/utilities/build/manifest/utils/add-missing-field-option-ids.d.ts +2 -0
  9. package/dist/cli/utilities/build/manifest/utils/from-role-config-to-role-manifest.d.ts +3 -0
  10. package/dist/cli/utilities/config/config-service.d.ts +3 -1
  11. package/dist/cli/utilities/config/get-config-path.d.ts +1 -1
  12. package/dist/cli/utilities/server/docker-container.d.ts +5 -3
  13. package/dist/cli.cjs +46 -44
  14. package/dist/cli.mjs +2035 -2089
  15. package/dist/{frontComponentHostCommunicationApi-op3Q7sYg.mjs → frontComponentHostCommunicationApi-Bz03t3FY.mjs} +66 -74
  16. package/dist/{frontComponentHostCommunicationApi-DvdpnfNz.js → frontComponentHostCommunicationApi-DyOxvANW.js} +3 -3
  17. package/dist/{get-function-input-schema-BZ7_XyUh-xI83N7kX.mjs → get-function-input-schema-BZ7_XyUh-CtECetlr.mjs} +1 -1
  18. package/dist/{get-function-input-schema-BZ7_XyUh-Bf_NiyDR.js → get-function-input-schema-BZ7_XyUh-D2ypJxjI.js} +1 -1
  19. package/dist/index.cjs +1 -1
  20. package/dist/index.mjs +9 -9
  21. package/dist/operations.cjs +1 -1
  22. package/dist/operations.mjs +14 -13
  23. package/dist/sdk/application/application-config.d.ts +1 -1
  24. package/dist/sdk/common/types/define-entity.type.d.ts +5 -2
  25. package/dist/sdk/index.d.ts +1 -1
  26. package/dist/sdk/logic-functions/define-post-install-logic-function.d.ts +2 -5
  27. package/dist/sdk/logic-functions/define-post-install-logic-function.js.map +1 -1
  28. package/dist/sdk/logic-functions/define-pre-install-logic-function.d.ts +2 -5
  29. package/dist/sdk/logic-functions/define-pre-install-logic-function.js.map +1 -1
  30. package/dist/sdk/logic-functions/install-payload-type.d.ts +5 -0
  31. package/dist/sdk/logic-functions/post-install-logic-function-config.d.ts +4 -0
  32. package/dist/sdk/logic-functions/pre-install-logic-function-config.d.ts +5 -0
  33. package/dist/sdk/roles/define-role.d.ts +2 -2
  34. package/dist/sdk/roles/define-role.js.map +1 -1
  35. package/dist/sdk/roles/role-config.d.ts +7 -0
  36. package/dist/ui/index.cjs +413 -398
  37. package/dist/ui/index.mjs +2164 -2134
  38. package/dist/uninstall-CXlUxs8p.js +189 -0
  39. package/dist/{uninstall-9yB-e13_.mjs → uninstall-CrGYRb-Z.mjs} +993 -663
  40. package/package.json +2 -2
  41. package/dist/sdk/logic-functions/install-logic-function-payload-type.d.ts +0 -4
  42. package/dist/uninstall-BCUbP_Bn.js +0 -178
@@ -0,0 +1,189 @@
1
+ "use strict";const yt=require("fs"),ze=require("child_process"),F=require("path"),vt=require("node:http"),j=require("node:child_process"),It=require("node:crypto"),At=require("axios"),wt=require("chalk"),u=require("./frontComponentHostCommunicationApi-DyOxvANW.js"),Ft=require("crypto"),A=require("node:fs/promises"),Tt=require("esbuild"),ve=require("./get-front-component-build-plugins-Ce_mghCA.js"),Ie=require("node:path"),Et=require("twenty-client-sdk/generate"),bt=require("node:fs"),Nt=require("os"),St=require("graphql-sse"),pe=require("graphql"),_t=require("typescript"),Ct=require("fs/promises"),Rt=require("module"),X=require("uuid");require("@sniptt/guards");require("react");const Je=require("tinyglobby"),J=e=>e&&e.__esModule?e:{default:e};function G(e){if(e&&e.__esModule)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const ge=G(yt),m=G(F),Ot=J(vt),Ue=J(It),C=J(At),ae=J(wt),Ge=J(Ft),Ae=G(Tt),$e=J(Ie),We=G(Nt),Y=G(_t),Pt=G(Ct),le=async e=>{try{return await A.access(e),!0}catch{return!1}},kt=e=>bt.existsSync(e),$=e=>A.mkdir(e,{recursive:!0}),Lt=async e=>{await A.mkdir(Ie.dirname(e),{recursive:!0});try{await A.access(e)}catch{await A.writeFile(e,"")}},Ke=async e=>{let t;try{t=await A.readdir(e)}catch(n){if(n instanceof Error&&"code"in n&&n.code==="ENOENT"){await A.mkdir(e,{recursive:!0});return}throw n}await Promise.all(t.map(n=>A.rm(Ie.join(e,n),{recursive:!0,force:!0})))},Xe=(e,t)=>A.cp(e,t,{recursive:!0}),re=e=>A.rm(e,{recursive:!0,force:!0}),xt=async e=>{const t=await A.readFile(e,"utf-8");return JSON.parse(t)},Dt=async(e,t)=>{await A.writeFile(e,JSON.stringify(t,null,2)+`
2
+ `)},Ut="twenty-client-sdk",Qe=async({result:e,appPath:t,fileFolder:n,lastChecksums:s,onFileBuilt:i})=>{const a=Object.keys(e.metafile?.outputs??{}).filter(r=>r.endsWith(".mjs"));for(const r of a){const o=m.default.resolve(r),l=m.default.relative(t,o),c=e.metafile?.outputs?.[r]?.entryPoint||"",d=m.default.relative(t,c),f=await A.readFile(o),p=Ge.default.createHash("md5").update(f).digest("hex");if(s.get(l)===p)continue;s.set(l,p);const b=e.metafile?.outputs?.[r]?.imports?.some(N=>N.external===!0&&N.path.startsWith(Ut))??!1;i&&await i({fileFolder:n,builtPath:l,sourcePath:d,checksum:p,usesSdkClient:b})}},je=async({appPath:e,sourcePaths:t,fileFolder:n,buildOptions:s,onFileBuilt:i})=>{if(t.length===0)return;const a={};for(const o of t){const l=o.replace(/\.tsx?$/,"");a[l]=m.default.join(e,o)}const r=await Ae.build({...s,entryPoints:a});await Qe({result:r,appPath:e,fileFolder:n,lastChecksums:new Map,onFileBuilt:i})},$t=async(e,t,n)=>{const s=new Set(n),i=t.filter(a=>!s.has(a));for(const a of i){const r=a.replace(/\.tsx?$/,".mjs"),o=m.default.join(e,r),l=`${o}.map`;await re(o),await re(l)}},Ze=["twenty-client-sdk/core","twenty-client-sdk/metadata"],jt=/^(.+)\((\d+),(\d+)\): error TS\d+: (.+)$/,et=e=>{const t=e.match(jt);if(!t)return null;const[,n,s,i,a]=t;return{text:a,file:n,line:Number(s),column:Number(i)-1}},Mt=e=>{const t=[];for(const n of e.split(`
3
+ `)){const s=et(n);s&&t.push(s)}return t},ue=e=>{const t=$e.default.join(e,"tsconfig.json"),n=$e.default.join(e,"node_modules",".bin","tsc");return new Promise(s=>{j.execFile(n,["--noEmit","--pretty","false","-p",t],{cwd:e},(i,a,r)=>{s(Mt(r||a))})})},Bt=e=>e.map(t=>({text:t.text,location:{file:t.file,line:t.line,column:t.column,lineText:"",length:0,namespace:"",suggestion:""}})),tt=(e,t)=>({name:"typecheck",setup:n=>{n.onStart(async()=>{if(t())return;const s=await ue(e);return{errors:Bt(s)}})}}),nt=["twenty-client-sdk/core","twenty-client-sdk/metadata","path","fs","crypto","stream","util","os","url","http","https","events","buffer","querystring","assert","zlib","net","tls","child_process","worker_threads"];class st{constructor(t){this.esBuildContext=null,this.isRestarting=!1,this.lastChecksums=new Map,this.buildCompletePromise=Promise.resolve(),this.resolveBuildComplete=null,this.appPath=t.appPath,this.sourcePaths=t.sourcePaths,this.watchMode=t.watch??!0,this.onFileBuilt=t.handleFileBuilt,this.onBuildError=t.handleBuildError,this.config=t.config}shouldRestart(t){const n=this.sourcePaths.sort().join(","),s=[...t].sort().join(",");return n!==s}async start(){this.sourcePaths.length>0&&await this.createContext()}async close(){await this.esBuildContext?.dispose(),this.esBuildContext=null}async restart(t){if(!this.isRestarting){this.isRestarting=!0;try{await this.close();const n=m.default.join(this.appPath,u.E);await $t(n,this.sourcePaths,t),this.sourcePaths=t,this.lastChecksums.clear(),this.sourcePaths.length>0&&await this.createContext()}finally{this.isRestarting=!1}}}async createContext(){const t=m.default.join(this.appPath,u.E),n={};for(const a of this.sourcePaths){const r=a.replace(/\.tsx?$/,"");n[r]=m.default.join(this.appPath,a)}const s=this,i=[...this.config.extraPlugins??[],{name:"build-notifications",setup:a=>{a.onEnd(async r=>{try{if(r.errors.length>0){r.errors[0].text.includes("Could not resolve")||await this.onBuildError?.(r.errors.map(o=>({error:o.text,location:o.location})));return}await Qe({result:r,appPath:this.appPath,fileFolder:this.config.fileFolder,lastChecksums:s.lastChecksums,onFileBuilt:s.onFileBuilt})}finally{s.resolveBuildComplete?.()}})}}];this.esBuildContext=await Ae.context({entryPoints:n,bundle:!0,splitting:!1,format:"esm",platform:this.config.platform,outdir:t,outExtension:{".js":".mjs"},external:this.config.externalModules,tsconfig:m.default.join(this.appPath,"tsconfig.json"),jsx:this.config.jsx,sourcemap:!0,metafile:!0,logLevel:"silent",minify:this.config.minify,banner:this.config.banner,plugins:i}),this.buildCompletePromise=new Promise(a=>{this.resolveBuildComplete=a}),await this.esBuildContext.rebuild(),await this.buildCompletePromise,this.watchMode&&await this.esBuildContext.watch()}}const Ht=e=>new st({...e,config:{externalModules:nt,fileFolder:u.B.BuiltLogicFunction,platform:"node",extraPlugins:[tt(e.appPath,e.shouldSkipTypecheck)],banner:u.T}}),qt=e=>new st({...e,config:{externalModules:Ze,fileFolder:u.B.BuiltFrontComponent,jsx:"automatic",extraPlugins:[tt(e.appPath,e.shouldSkipTypecheck),...ve.getFrontComponentBuildPlugins()]}}),Vt=()=>({bundle:!0,splitting:!1,format:"esm",outExtension:{".js":".mjs"},external:Ze,jsx:"automatic",sourcemap:!0,metafile:!0,logLevel:"silent",plugins:[...ve.getFrontComponentBuildPlugins()]}),it=async e=>{const t=F.join(e.appPath,u.E);await $(t),await Ke(t);const n=new Map,s=r=>{n.set(r.builtPath,{checksum:r.checksum,builtPath:r.builtPath,sourcePath:r.sourcePath,fileFolder:r.fileFolder,usesSdkClient:r.usesSdkClient})},{logicFunctions:i,frontComponents:a}=e.filePaths;return await je({appPath:e.appPath,sourcePaths:i,fileFolder:u.B.BuiltLogicFunction,buildOptions:{bundle:!0,splitting:!1,format:"esm",platform:"node",outdir:F.join(e.appPath,u.E),outExtension:{".js":".mjs"},external:nt,tsconfig:F.join(e.appPath,"tsconfig.json"),sourcemap:!0,metafile:!0,logLevel:"silent",banner:u.T},onFileBuilt:s}),await je({appPath:e.appPath,sourcePaths:a,fileFolder:u.B.BuiltFrontComponent,buildOptions:{...Vt(),outdir:F.join(e.appPath,u.E),tsconfig:F.join(e.appPath,"tsconfig.json"),jsx:"automatic",sourcemap:!0,metafile:!0,logLevel:"silent",plugins:[...ve.getFrontComponentBuildPlugins()]},onFileBuilt:s}),await Me({appPath:e.appPath,fileFolder:u.B.PublicAsset,filePaths:e.filePaths.publicAssets,collectFileBuilt:s}),await Me({appPath:e.appPath,fileFolder:u.B.Dependencies,filePaths:["package.json","yarn.lock"].filter(r=>kt(F.join(e.appPath,r))),collectFileBuilt:s}),{builtFileInfos:n}},Me=async({appPath:e,fileFolder:t,filePaths:n,collectFileBuilt:s})=>{for(const i of n){const a=F.join(e,i);if(!await le(a))continue;const r=F.join(u.E,i),o=F.join(e,r);await $(F.dirname(o)),await Xe(a,o);const l=await A.readFile(o),c=Ge.default.createHash("md5").update(l).digest("hex");s({fileFolder:t,builtPath:r,sourcePath:i,checksum:c})}};var oe=(e=>(e.DefineApplication="defineApplication",e.DefineField="defineField",e.DefineLogicFunction="defineLogicFunction",e.DefinePostInstallLogicFunction="definePostInstallLogicFunction",e.DefinePreInstallLogicFunction="definePreInstallLogicFunction",e.DefineObject="defineObject",e.DefineRole="defineRole",e.DefineSkill="defineSkill",e.DefineAgent="defineAgent",e.DefineFrontComponent="defineFrontComponent",e.DefineView="defineView",e.DefineNavigationMenuItem="defineNavigationMenuItem",e.DefinePageLayout="definePageLayout",e))(oe||{}),_=(e=>(e.Application="application",e.Fields="fields",e.LogicFunctions="logicFunctions",e.Objects="objects",e.Roles="roles",e.Skills="skills",e.Agents="agents",e.FrontComponents="frontComponents",e.PublicAssets="publicAssets",e.Views="views",e.NavigationMenuItems="navigationMenuItems",e.PageLayouts="pageLayouts",e))(_||{});const Yt={defineApplication:"application",defineField:"fields",defineLogicFunction:"logicFunctions",definePostInstallLogicFunction:"logicFunctions",definePreInstallLogicFunction:"logicFunctions",defineObject:"objects",defineRole:"roles",defineSkill:"skills",defineAgent:"agents",defineFrontComponent:"frontComponents",defineView:"views",defineNavigationMenuItem:"navigationMenuItems",definePageLayout:"pageLayouts"},zt=e=>{if(!Y.isCallExpression(e))return;const t=e.expression;if(Y.isIdentifier(t)&&Object.values(oe).includes(t.text))return t.text},Jt=e=>{const t=Y.createSourceFile("temp.ts",e,Y.ScriptTarget.Latest,!0),n=[];Y.forEachChild(t,s=>{n.push(s)});for(const s of n)if(Y.isExportAssignment(s)){if(s.isExportEquals||!s.expression)return;const i=zt(s.expression);if(i)return i}},Gt=[[/\bfavoriteRecordIds\.length\b/g,"arrayLength(favoriteRecordIds)"],[/\bselectedRecords\.length\b/g,"arrayLength(selectedRecords)"]],Wt=e=>Gt.reduce((t,[n,s])=>t.replace(n,s),e.replace(/!==/g,"!=").replace(/===/g,"==").replace(/&&/g,"and").replace(/\|\|/g,"or").replace(/!(?!=)/g,"not ").replace(/,(\s*\))/g,"$1")),Kt=/(conditionalAvailabilityExpression\s*:\s*)(?!['"`])((?:[^,}()]|\([^()]*\))+)/g,Xt=e=>e.replace(Kt,(t,n,s)=>n+JSON.stringify(Wt(s.trim()))),Qt={name:"conditional-availability-transform",setup:e=>{e.onLoad({filter:/\.tsx?$/},async t=>{const n=await Pt.readFile(t.path,"utf8");if(!n.includes("conditionalAvailabilityExpression"))return null;const s=Xt(n);return s===n?null:{contents:s,loader:t.path.endsWith(".tsx")?"tsx":"ts"}})}},Zt=["twenty-sdk/ui","twenty-client-sdk/core","twenty-client-sdk/metadata"],en={name:"manifest-mock",setup:e=>{const t=new RegExp(`^(${Zt.map(n=>n.replace("/","\\/")).join("|")})$`);e.onResolve({filter:t},({path:n})=>({path:n,namespace:"manifest-mock"})),e.onLoad({filter:/.*/,namespace:"manifest-mock"},()=>({contents:"module.exports = new Proxy({}, { get: () => () => {} });",loader:"js"}))}},O=async({filePath:e,appPath:t})=>{const n=await tn({filePath:e,appPath:t});return nn(n,e)},tn=async({filePath:e,appPath:t})=>{const n=m.default.join(t,"tsconfig.json"),s=await le(n),i=Rt.createRequire(m.default.join(t,"package.json"));let a,r;try{a=m.default.dirname(i.resolve("react/package.json")),r=m.default.dirname(i.resolve("react-dom/package.json"))}catch{}const l=(await Ae.build({entryPoints:[e],bundle:!0,write:!1,format:"cjs",platform:"node",target:"node18",jsx:"automatic",tsconfig:s?n:void 0,alias:{...a&&{react:a},...r&&{"react-dom":r}},plugins:[Qt,en],logLevel:"silent"})).outputFiles[0].text,c=await A.mkdtemp(m.default.join(We.default.tmpdir(),"twenty-manifest-")),d=m.default.join(c,"module.cjs");try{return await A.writeFile(d,l),i(d)}finally{await re(c)}},nn=(e,t)=>{if(u.o(e.default)&&u.uI(e.default))return e.default;throw new Error(`Config file ${t} must export a config object default export`)},sn="142046f0-4d80-48b5-ad56-26ad410e895c",k=({objectConfig:e,fieldName:t})=>{const n=`${e.universalIdentifier}-${t}`;return X.v5(n,sn)},an=e=>{const t={name:"id",label:"Id",description:"Id",icon:"Icon123",isNullable:!1,defaultValue:"uuid",type:u.R.UUID,universalIdentifier:k({objectConfig:e,fieldName:"id"})},n={name:"name",label:"Name",description:"Name",icon:"IconAbc",isNullable:!0,defaultValue:null,type:u.R.TEXT,universalIdentifier:k({objectConfig:e,fieldName:"name"})},s={name:"createdAt",label:"Creation date",description:"Creation date",icon:"IconCalendar",isNullable:!1,defaultValue:"now",type:u.R.DATE_TIME,universalIdentifier:k({objectConfig:e,fieldName:"createdAt"})},i={name:"updatedAt",label:"Last update",description:"Last time the record was changed",icon:"IconCalendarClock",isNullable:!1,defaultValue:"now",type:u.R.DATE_TIME,universalIdentifier:k({objectConfig:e,fieldName:"updatedAt"})},a={name:"deletedAt",label:"Deleted at",description:"Deletion date",icon:"IconCalendarClock",isNullable:!0,defaultValue:null,type:u.R.DATE_TIME,universalIdentifier:k({objectConfig:e,fieldName:"deletedAt"})},r={name:"createdBy",label:"Created by",description:"The creator of the record",icon:"IconCreativeCommonsSa",isNullable:!1,defaultValue:{name:"''",source:"'MANUAL'"},type:u.R.ACTOR,universalIdentifier:k({objectConfig:e,fieldName:"createdBy"})},o={name:"updatedBy",label:"Updated by",description:"The workspace member who last updated the record",icon:"IconUserCircle",isNullable:!1,defaultValue:{name:"''",source:"'MANUAL'"},type:u.R.ACTOR,universalIdentifier:k({objectConfig:e,fieldName:"updatedBy"})},l={name:"position",label:"Position",description:"Position",icon:"IconHierarchy2",isNullable:!1,defaultValue:0,type:u.R.POSITION,universalIdentifier:k({objectConfig:e,fieldName:"position"})},c={name:"searchVector",label:"Search vector",icon:"IconSearch",description:"Search vector",isNullable:!0,defaultValue:null,type:u.R.TS_VECTOR,universalIdentifier:k({objectConfig:e,fieldName:"searchVector"})};return[t,n,s,i,a,r,o,l,c]},K={targetFieldName:e=>`target${u.so(e.nameSingular)}`,targetLabel:e=>u.so(e.nameSingular),icon:"IconBuildingSkyscraper",isNullable:!0},rn=[{...K,fieldName:"timelineActivities",label:"Timeline Activities",targetIcon:"IconTimelineEvent",targetFieldType:u.R.MORPH_RELATION,standardObjectKey:"timelineActivity",morphId:u.w.timelineActivity.morphIds.targetMorphId.morphId},{...K,fieldName:"favorites",label:"Favorites",icon:"IconBuildingSkyscraper",targetIcon:"IconHeart",targetFieldType:u.R.RELATION,standardObjectKey:"favorite"},{...K,fieldName:"attachments",label:"Attachments",icon:"IconBuildingSkyscraper",targetIcon:"IconFileImport",targetFieldType:u.R.MORPH_RELATION,standardObjectKey:"attachment",morphId:u.w.attachment.morphIds.targetMorphId.morphId},{...K,fieldName:"noteTargets",label:"Note Targets",icon:"IconBuildingSkyscraper",targetIcon:"IconCheckbox",targetFieldType:u.R.MORPH_RELATION,standardObjectKey:"noteTarget",morphId:u.w.noteTarget.morphIds.targetMorphId.morphId},{...K,fieldName:"taskTargets",label:"Task Targets",icon:"IconBuildingSkyscraper",targetIcon:"IconCheckbox",targetFieldType:u.R.MORPH_RELATION,standardObjectKey:"taskTarget",morphId:u.w.taskTarget.morphIds.targetMorphId.morphId}],on=({config:e,forwardFieldUniversalIdentifier:t,objectConfig:n,universalIdentifier:s})=>{const i=u.w[e.standardObjectKey],a={name:e.targetFieldName(n),label:e.targetLabel(n),description:`${e.targetLabel(n)} ${n.labelSingular}`,icon:e.targetIcon,isNullable:!0,universalSettings:{relationType:u.z.MANY_TO_ONE,onDelete:u.Z.SET_NULL,joinColumnName:`target${u.so(n.nameSingular)}Id`},universalIdentifier:s,objectUniversalIdentifier:i.universalIdentifier,relationTargetFieldMetadataUniversalIdentifier:t,relationTargetObjectMetadataUniversalIdentifier:n.universalIdentifier};return e.targetFieldType===u.R.MORPH_RELATION?{...a,type:e.targetFieldType,morphId:e.morphId}:{...a,type:e.targetFieldType}},cn=e=>{const t=[],n=[];for(const s of rn){const i=u.w[s.standardObjectKey],a=k({objectConfig:e,fieldName:s.fieldName}),r=k({objectConfig:e,fieldName:`${s.fieldName}Inverse`}),o={name:s.fieldName,label:s.label,description:`${e.labelPlural} tied to the ${s.targetLabel(e)}`,icon:s.icon,isNullable:s.isNullable,type:u.R.RELATION,universalSettings:{relationType:u.z.ONE_TO_MANY},universalIdentifier:a,relationTargetFieldMetadataUniversalIdentifier:r,relationTargetObjectMetadataUniversalIdentifier:i.universalIdentifier},l=on({config:s,objectConfig:e,universalIdentifier:r,forwardFieldUniversalIdentifier:a});t.push(o),n.push(l)}return{objectFields:t,fields:n}},ln=e=>{const t=an(e),{objectFields:n,fields:s}=cn(e),i=(e.fields??[]).map(r=>r.name),a=[...e.fields];for(const r of t)i.includes(r.name)||a.push(r);for(const r of n)i.includes(r.name)||a.push(r);return{objectFields:a,fields:s}},un={type:"object",properties:{}},dn=async e=>{const{getFunctionInputSchema:t}=await Promise.resolve().then(()=>require("./get-function-input-schema-BZ7_XyUh-D2ypJxjI.js")),n=t(e)[0];return n?.type==="object"&&u.o(n.properties)?{type:"object",properties:n.properties}:un},pn="a80ff791-b940-4c47-a522-2bb478515415",Be=e=>e.type!==u.R.SELECT&&e.type!==u.R.MULTI_SELECT||e.options===void 0||e.options===null?e:{...e,options:e.options.map(t=>({...t,id:t.id??X.v5(`${t.label}-${e.universalIdentifier}`,pn)}))},fe="b403ec59-4d80-4f22-85e6-717a192dc9cb",fn=e=>({...e,objectPermissions:(e.objectPermissions??[]).map(t=>({...t,universalIdentifier:X.v5(`${e.universalIdentifier}:${t.objectUniversalIdentifier}`,fe)})),fieldPermissions:(e.fieldPermissions??[]).map(t=>({...t,universalIdentifier:X.v5(`${e.universalIdentifier}:${t.objectUniversalIdentifier}:${t.fieldUniversalIdentifier}`,fe)})),permissionFlags:(e.permissionFlags??[]).map(t=>({universalIdentifier:X.v5(`${e.universalIdentifier}:${t}`,fe),flag:t}))}),hn=async e=>await Je.glob(["**/*.ts","**/*.tsx"],{cwd:e,absolute:!0,ignore:["**/node_modules/**","**/*.d.ts","**/dist/**","**/.twenty/**"],onlyFiles:!0}),mn=async e=>await Je.glob([`${u._}/**/*`],{cwd:e,absolute:!0,onlyFiles:!0}),at=async e=>{const t=await hn(e),n=[];let s;const i=[],a=[],r=[],o=[],l=[],c=[],d=[],f=[],p=[],y=[],w=[],b=[],N=[],v=[],E=[],te=[],_e=[],Ce=[],Re=[],Oe=[],Pe=[],ke=[],Le=[],xe=[],De=[];for(const I of t){const U=await A.readFile(I,"utf-8"),R=F.relative(e,I),ne=Jt(U);if(!ne)continue;switch(Yt[ne]){case _.Application:{const h=await O({appPath:e,filePath:I});s={...h.config,yarnLockChecksum:null,packageJsonChecksum:null},n.push(...h.errors),v.push(R);break}case _.Objects:{const h=await O({appPath:e,filePath:I}),{objectFields:S,fields:q}=ln(h.config),M=h.config.labelIdentifierFieldMetadataUniversalIdentifier??S.find(W=>W.name==="name")?.universalIdentifier;if(!M){n.push(`No label identifier field found for object ${h.config.nameSingular}. Please add a field with name "name" to your object.`);break}const V={...h.config,fields:S.map(Be),labelIdentifierFieldMetadataUniversalIdentifier:M};i.push(V),a.push(...q),n.push(...h.errors),E.push(R);break}case _.Fields:{const h=await O({appPath:e,filePath:I}),S=Be(h.config);a.push(S),n.push(...h.errors),te.push(R);break}case _.Roles:{const h=await O({appPath:e,filePath:I}),S=fn(h.config);r.push(S),n.push(...h.errors),_e.push(R);break}case _.Skills:{const h=await O({appPath:e,filePath:I});o.push(h.config),n.push(...h.errors),Ce.push(R);break}case _.Agents:{const h=await O({appPath:e,filePath:I});l.push(h.config),n.push(...h.errors),Re.push(R);break}case _.LogicFunctions:{const h=await O({appPath:e,filePath:I});n.push(...h.errors);const{handler:S,...q}=h.config,M=F.relative(e,I),V=q.toolInputSchema??await dn(U),W={...q,toolInputSchema:V,handlerName:"default.config.handler",sourceHandlerPath:M,builtHandlerPath:M.replace(/\.tsx?$/,".mjs"),builtHandlerChecksum:"[default-checksum]"};if(c.push(W),Oe.push(R),ne===oe.DefinePostInstallLogicFunction){const se=h.config;b.push({universalIdentifier:h.config.universalIdentifier,shouldRunOnVersionUpgrade:se.shouldRunOnVersionUpgrade??!1,shouldRunSynchronously:se.shouldRunSynchronously??!1})}if(ne===oe.DefinePreInstallLogicFunction){const se=h.config;N.push({universalIdentifier:h.config.universalIdentifier,shouldRunOnVersionUpgrade:se.shouldRunOnVersionUpgrade??!1})}break}case _.FrontComponents:{const h=await O({appPath:e,filePath:I});n.push(...h.errors);const{component:S,command:q,...M}=h.config,V=F.relative(e,I),W={...M,componentName:S.name,sourceComponentPath:V,builtComponentPath:V.replace(/\.tsx?$/,".mjs"),builtComponentChecksum:"",isHeadless:M.isHeadless??!1,command:q};d.push(W),Pe.push(R);break}case _.Views:{const h=await O({appPath:e,filePath:I}),S={...h.config};p.push(S),n.push(...h.errors),Le.push(R);break}case _.NavigationMenuItems:{const h=await O({appPath:e,filePath:I});y.push(h.config),n.push(...h.errors),xe.push(R);break}case _.PageLayouts:{const h=await O({appPath:e,filePath:I}),S={...h.config};w.push(S),n.push(...h.errors),De.push(R);break}case _.PublicAssets:break;default:u.yt()}}const mt=await mn(e);for(const I of mt){const U=F.relative(e,I);f.push({filePath:U,fileName:F.basename(I),fileType:F.extname(I).replace(/^\./,""),checksum:null}),ke.push(U)}s||n.push("Cannot build application, please export default defineApplication() to define an application"),b.length>1&&n.push("Only one post install logic function is allowed per application"),N.length>1&&n.push("Only one pre install logic function is allowed per application"),s&&b.length>=1&&(s={...s,postInstallLogicFunction:b[0]}),s&&N.length>=1&&(s={...s,preInstallLogicFunction:N[0]});const x=(I,U)=>I.universalIdentifier.localeCompare(U.universalIdentifier),gt=(I,U)=>I.filePath.localeCompare(U.filePath);return{manifest:s?{application:s,objects:i.sort(x),fields:a.sort(x),roles:r.sort(x),skills:o.sort(x),agents:l.sort(x),logicFunctions:c.sort(x),frontComponents:d.sort(x),publicAssets:f.sort(gt),views:p.sort(x),navigationMenuItems:y.sort(x),pageLayouts:w.sort(x)}:null,filePaths:{application:v,objects:E,fields:te,roles:_e,skills:Ce,agents:Re,logicFunctions:Oe,frontComponents:Pe,publicAssets:ke,views:Le,navigationMenuItems:xe,pageLayouts:De},errors:n}},gn=[u.R.RELATION,u.R.MORPH_RELATION],he=[u.z.MANY_TO_ONE,u.z.ONE_TO_MANY],yn=e=>{const t=new Set,n=new Set;for(const s of e)t.has(s)?n.add(s):t.add(s);return Array.from(n)},rt=e=>{const t=[];if(!e)return[];for(const[n,s]of Object.entries(e))n==="universalIdentifier"&&typeof s=="string"&&t.push(s),!(n==="postInstallLogicFunction"||n==="preInstallLogicFunction")&&typeof s=="object"&&t.push(...rt(s));return t},vn=e=>{const t=[];for(const n of e){if(!gn.includes(n.type))continue;const s=n.universalSettings;if(!s?.relationType){t.push(`Relation field "${n.name}" is missing relationType. ${n.type} fields must declare a relationType (${he.join(" or ")}) in universalSettings.`);continue}if(!he.includes(s.relationType)){t.push(`Relation field "${n.name}" has invalid relationType "${s.relationType}". Expected ${he.join(" or ")}.`);continue}s.relationType===u.z.MANY_TO_ONE&&!s.joinColumnName&&t.push(`MANY_TO_ONE relation field "${n.name}" is missing joinColumnName. MANY_TO_ONE relations must declare a joinColumnName in universalSettings.`)}return t},In=e=>{const t=[],n=[],s=yn(rt(e));s.length>0&&t.push(`Duplicate universal identifiers: ${s.join(", ")}`),u.da(e.objects)||n.push("No object defined"),u.da(e.logicFunctions)||n.push("No logic function defined"),u.da(e.frontComponents)||n.push("No front component defined");const i=[...e.fields,...e.objects.flatMap(a=>a.fields)];return t.push(...vn(i)),{errors:t,warnings:n,isValid:t.length===0}},we=async e=>{const t=await at(e);if(t.errors.length>0||!t.manifest)return{success:!1,errors:t.errors.length>0?t.errors:["Failed to build manifest."]};const n=In(t.manifest);return n.isValid?{success:!0,manifest:t.manifest,filePaths:t.filePaths,warnings:n.warnings}:{success:!1,errors:n.errors}},Fe=({manifest:e,builtFileInfos:t})=>{let n=structuredClone(e);for(const[s,{fileFolder:i,checksum:a}]of t.entries()){const r=F.relative(u.E,s);if(i===u.B.BuiltLogicFunction){const o=n.logicFunctions,l=o.findIndex(c=>c.builtHandlerPath===r);if(l===-1)continue;n={...n,logicFunctions:o.map((c,d)=>d===l?{...c,builtHandlerChecksum:a}:c)}}if(i===u.B.PublicAsset){const o=n.publicAssets,l=o.findIndex(c=>c.filePath===r);if(l===-1)continue;n={...n,publicAssets:o.map((c,d)=>d===l?{...c,checksum:a}:c)};continue}if(i===u.B.BuiltFrontComponent){const o=n.frontComponents,l=o.findIndex(d=>d.builtComponentPath===r)??-1;if(l===-1)continue;const c=t.get(s);n={...n,frontComponents:o.map((d,f)=>f===l?{...d,builtComponentChecksum:a,usesSdkClient:c?.usesSdkClient??!1}:d)}}i===u.B.Dependencies&&(r==="package.json"&&(n.application.packageJsonChecksum=a),r==="yarn.lock"&&(n.application.yarnLockChecksum=a))}return n},Te=async(e,t)=>{const n=m.default.join(e,u.E);await $(n);const s=m.default.join(n,"manifest.json");return await Dt(s,t),s},L=async(e,t)=>{try{return await e()}catch(n){return{success:!1,error:{code:t,message:n instanceof Error?n.message:"Unexpected error"}}}},B={AUTH_FAILED:"AUTH_FAILED",NO_REMOTES:"NO_REMOTES",REMOTE_NOT_FOUND:"REMOTE_NOT_FOUND",OAUTH_NOT_SUPPORTED:"OAUTH_NOT_SUPPORTED"},g={MANIFEST_NOT_FOUND:"MANIFEST_NOT_FOUND",MANIFEST_BUILD_FAILED:"MANIFEST_BUILD_FAILED",BUILD_FAILED:"BUILD_FAILED",PUBLISH_FAILED:"PUBLISH_FAILED",INSTALL_FAILED:"INSTALL_FAILED",UNINSTALL_FAILED:"UNINSTALL_FAILED",SYNC_FAILED:"SYNC_FAILED",TYPECHECK_FAILED:"TYPECHECK_FAILED",DEPLOY_FAILED:"DEPLOY_FAILED"},z={DOCKER_NOT_RUNNING:"DOCKER_NOT_RUNNING",CONTAINER_START_FAILED:"CONTAINER_START_FAILED",HEALTH_TIMEOUT:"HEALTH_TIMEOUT"},Q={FETCH_FUNCTIONS_FAILED:"FETCH_FUNCTIONS_FAILED",FUNCTION_NOT_FOUND:"FUNCTION_NOT_FOUND",EXECUTION_FAILED:"EXECUTION_FAILED"},An=async e=>{const{appPath:t,onProgress:n}=e;n?.("Building manifest...");const s=await we(t);if(!s.success)return{success:!1,error:{code:g.MANIFEST_BUILD_FAILED,message:s.errors.join(`
4
+ `)}};const{manifest:i,filePaths:a}=s;for(const f of s.warnings)n?.(`⚠ ${f}`);n?.("Building application files...");const r=await it({appPath:t,filePaths:a});n?.("Running typecheck...");const o=await ue(t);if(o.length>0){const f=o.map(p=>`${p.file}(${p.line},${p.column+1}): ${p.text}`);return{success:!1,error:{code:g.TYPECHECK_FAILED,message:`Typecheck failed:
5
+ ${f.join(`
6
+ `)}`}}}const l=Fe({manifest:i,builtFileInfos:r.builtFileInfos});await Te(t,l);const c=m.default.join(t,".twenty","output"),d={outputDir:c,fileCount:r.builtFileInfos.size};if(e.tarball){n?.("Packing tarball...");const p=ze.execSync("npm pack --pack-destination .",{cwd:c,encoding:"utf-8"}).trim().split(`
7
+ `).pop();d.tarballPath=m.default.join(c,p)}return{success:!0,data:d}},ot=e=>L(()=>An(e),g.BUILD_FAILED),He=m.join(We.homedir(),".twenty"),Z=(e=!1)=>e||process.env.NODE_ENV==="test"?m.join(He,"config.test.json"):m.join(He,"config.json"),me=1,P="local",ce=class ce{constructor(t){this.configPath=t?.configPath??Z()}static setActiveRemote(t){this.activeRemote=t??P}static getActiveRemote(){return this.activeRemote}getActiveRemoteName(){return ce.getActiveRemote()}async readRawConfig(){await Lt(this.configPath);const t=await A.readFile(this.configPath,"utf8"),n=JSON.parse(t||"{}");return this.migrateConfigIfNeeded(n)}async migrateConfigIfNeeded(t){if(t.version===me)return t;const n="profiles"in t,s="apiUrl"in t&&!("remotes"in t);if(!n&&!s)return t;const i={version:me},a=d=>typeof d=="string"?d:void 0,r=d=>({apiUrl:a(d.apiUrl)??"",apiKey:a(d.apiKey),accessToken:a(d.accessToken)??a(d.applicationAccessToken),refreshToken:a(d.refreshToken)??a(d.applicationRefreshToken),oauthClientId:a(d.oauthClientId)}),o=t.profiles??{};i.remotes={};for(const[d,f]of Object.entries(o)){const p=d==="default"?P:d;i.remotes[p]=r(f)}const l=t.remotes??{};for(const[d,f]of Object.entries(l)){const p=d==="default"?P:d;i.remotes[p]=f}s&&!i.remotes[P]&&(i.remotes[P]=r(t));const c=t.defaultWorkspace;return c&&(i.defaultRemote=c==="default"?P:c),await $(m.dirname(this.configPath)),await A.writeFile(this.configPath,JSON.stringify(i,null,2)),i}async getConfig(){return this.getConfigForRemote(this.getActiveRemoteName())}async getConfigForRemote(t){const n=this.getDefaultConfig();try{const i=(await this.readRawConfig()).remotes?.[t];return i?{apiUrl:i.apiUrl??n.apiUrl,apiKey:i.apiKey,accessToken:i.accessToken,refreshToken:i.refreshToken,oauthClientId:i.oauthClientId}:n}catch{return n}}async setConfig(t){const n=await this.readRawConfig(),s=this.getActiveRemoteName();n.version=me,n.remotes||(n.remotes={});const i=n.remotes[s]||{apiUrl:""};n.remotes[s]={...i,...t},await $(m.dirname(this.configPath)),await A.writeFile(this.configPath,JSON.stringify(n,null,2))}async clearConfig(){const t=await this.readRawConfig(),n=this.getActiveRemoteName();t.remotes||(t.remotes={}),t.remotes[n]&&delete t.remotes[n],await $(m.dirname(this.configPath)),await A.writeFile(this.configPath,JSON.stringify(t,null,2))}getDefaultConfig(){return{apiUrl:"http://localhost:2020"}}async getRemotes(){try{const t=await this.readRawConfig(),n=new Set;return n.add(P),t.remotes&&Object.keys(t.remotes).forEach(s=>n.add(s)),Array.from(n).sort()}catch{return[P]}}async getDefaultRemote(){try{return(await this.readRawConfig()).defaultRemote??P}catch{return P}}async setDefaultRemote(t){const n=await this.readRawConfig();n.defaultRemote=t,await $(m.dirname(this.configPath)),await A.writeFile(this.configPath,JSON.stringify(n,null,2))}};ce.activeRemote=P;let T=ce;class wn{constructor(t){const{disableInterceptors:n=!1,serverUrl:s,token:i,skipAuth:a=!1}=t||{};this.configService=new T,this.tokenOverride=i,this.serverUrlOverride=s,this.client=C.default.create(),this.client.interceptors.request.use(async r=>{const o=await this.configService.getConfig();if(r.baseURL=this.serverUrlOverride??o.apiUrl,!r.headers.Authorization&&!a){const l=await this.resolveAuthToken();l&&(r.headers.Authorization=`Bearer ${l}`)}return r}),!n&&this.client.interceptors.response.use(r=>r,async r=>{throw r.response?.status===401?console.error(ae.default.red("Authentication failed. Run `yarn twenty remote add` to authenticate.")):r.response?.status===403?console.error(ae.default.red("Access denied. Check your API key and workspace permissions.")):r.code==="ECONNREFUSED"&&console.error(ae.default.red("Cannot connect to Twenty server. Is it running?")),r})}async validateAuth(){try{const n=await this.client.post("/metadata",{query:`
8
+ query CurrentWorkspace {
9
+ currentWorkspace {
10
+ id
11
+ }
12
+ }
13
+ `},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return{authValid:n.status===200&&!n.data.errors,serverUp:n.status===200}}catch(t){return C.default.isAxiosError(t)&&t.response?{authValid:!1,serverUp:!0}:{authValid:!1,serverUp:!1}}}async refreshToken(){const t=await this.configService.getConfig();if(!t.refreshToken||!t.oauthClientId)return null;try{const n=await C.default.post(`${t.apiUrl}/oauth/token`,{grant_type:"refresh_token",refresh_token:t.refreshToken,client_id:t.oauthClientId}),{access_token:s,refresh_token:i}=n.data;return await this.configService.setConfig({accessToken:s,...i?{refreshToken:i}:{}}),s}catch{return null}}async resolveAuthToken(){if(this.tokenOverride)return this.tokenOverride;const t=await this.configService.getConfig(),n=t.accessToken;if(n&&this.isTokenExpired(n)){const s=await this.refreshToken();if(s)return s}return n??t.apiKey}isTokenExpired(t){try{return JSON.parse(Buffer.from(t.split(".")[1],"base64").toString()).exp*1e3<Date.now()+30*1e3}catch{return!1}}}class Fn{constructor(t){this.client=t}async syncMarketplaceCatalog(){try{const n=await this.client.post("/metadata",{query:`
14
+ mutation SyncMarketplaceCatalog {
15
+ syncMarketplaceCatalog
16
+ }
17
+ `},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return n.data.errors?{success:!1,error:n.data.errors[0]}:{success:!0,data:n.data.data.syncMarketplaceCatalog}}catch(t){return{success:!1,error:t}}}async findApplicationRegistrationByUniversalIdentifier(t){try{const s=await this.client.post("/metadata",{query:`
18
+ query FindApplicationRegistrationByUniversalIdentifier($universalIdentifier: String!) {
19
+ findApplicationRegistrationByUniversalIdentifier(universalIdentifier: $universalIdentifier) {
20
+ id
21
+ universalIdentifier
22
+ name
23
+ oAuthClientId
24
+ }
25
+ }
26
+ `,variables:{universalIdentifier:t}},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return s.data.errors?{success:!1,error:s.data.errors[0]}:{success:!0,data:s.data.data.findApplicationRegistrationByUniversalIdentifier}}catch(n){return{success:!1,error:n}}}async createApplicationRegistration(t){try{const s=await this.client.post("/metadata",{query:`
27
+ mutation CreateApplicationRegistration($input: CreateApplicationRegistrationInput!) {
28
+ createApplicationRegistration(input: $input) {
29
+ applicationRegistration {
30
+ id
31
+ universalIdentifier
32
+ oAuthClientId
33
+ }
34
+ clientSecret
35
+ }
36
+ }
37
+ `,variables:{input:t}},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return s.data.errors?{success:!1,error:s.data.errors[0]}:{success:!0,data:s.data.data.createApplicationRegistration}}catch(n){return{success:!1,error:n}}}async createDevelopmentApplication(t){try{const s=await this.client.post("/metadata",{query:`
38
+ mutation CreateDevelopmentApplication($universalIdentifier: String!, $name: String!) {
39
+ createDevelopmentApplication(universalIdentifier: $universalIdentifier, name: $name) {
40
+ id
41
+ universalIdentifier
42
+ }
43
+ }
44
+ `,variables:t},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return s.data.errors?{success:!1,error:s.data.errors[0]}:{success:!0,data:s.data.data.createDevelopmentApplication}}catch(n){return{success:!1,error:n}}}async syncApplication(t){try{const n=`
45
+ mutation SyncApplication($manifest: JSON!) {
46
+ syncApplication(manifest: $manifest) {
47
+ applicationUniversalIdentifier
48
+ actions
49
+ }
50
+ }
51
+ `,s={manifest:t},i=await this.client.post("/metadata",{query:n,variables:s},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return i.data.errors?{success:!1,error:i.data.errors[0]}:{success:!0,data:i.data.data.syncApplication,message:`Successfully synced application: ${t.application.displayName}`}}catch(n){if(C.default.isAxiosError(n)&&n.response){const s=n.response.data?.errors;return Array.isArray(s)&&s.length>0?{success:!1,error:s[0]?.message||n.message}:{success:!1,error:n.response.data?.message||`HTTP ${n.response.status}: ${n.message}`}}return{success:!1,error:n instanceof Error?n.message:n}}}async uninstallApplication(t){try{const n=`
52
+ mutation UninstallApplication($universalIdentifier: String!) {
53
+ uninstallApplication(universalIdentifier: $universalIdentifier)
54
+ }
55
+ `,s={universalIdentifier:t},i=await this.client.post("/metadata",{query:n,variables:s},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return i.data.errors?{success:!1,error:i.data.errors[0]?.message||"Failed to delete application"}:{success:!0,data:i.data.data.uninstallApplication,message:"Successfully uninstalled application"}}catch(n){if(C.default.isAxiosError(n)&&n.response)return{success:!1,error:n.response.data?.errors?.[0]?.message||n.message};throw n}}}const Tn={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".xml":"application/xml",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip",".mp3":"audio/mpeg",".mp4":"video/mp4",".avi":"video/x-msvideo",".mov":"video/quicktime",".js":"application/javascript",".ts":"application/typescript",".jsx":"application/javascript",".tsx":"application/typescript",".html":"text/html",".css":"text/css"},En=e=>{const t=m.extname(e).toLowerCase();return Tn[t]||"application/octet-stream"};class bn{constructor(t){this.client=t}async uploadAppTarball({tarballBuffer:t,universalIdentifier:n}){try{const i=JSON.stringify({query:`
56
+ mutation UploadAppTarball($file: Upload!, $universalIdentifier: String) {
57
+ uploadAppTarball(file: $file, universalIdentifier: $universalIdentifier) {
58
+ id
59
+ universalIdentifier
60
+ name
61
+ }
62
+ }
63
+ `,variables:{file:null,universalIdentifier:n??null}}),a=JSON.stringify({0:["variables.file"]}),r=new FormData;r.append("operations",i),r.append("map",a),r.append("0",new Blob([new Uint8Array(t)],{type:"application/gzip"}),"app.tar.gz");const o=await this.client.post("/metadata",r);return o.data.errors?{success:!1,error:o.data.errors[0]?.message||"Failed to upload tarball"}:{success:!0,data:o.data.data.uploadAppTarball}}catch(s){return C.default.isAxiosError(s)&&s.response?{success:!1,error:s.response.data?.errors?.[0]?.message||s.message}:{success:!1,error:s}}}async installTarballApp({universalIdentifier:t}){try{const s=await this.client.post("/metadata",{query:`
64
+ mutation InstallMarketplaceApp($universalIdentifier: String!) {
65
+ installMarketplaceApp(universalIdentifier: $universalIdentifier)
66
+ }
67
+ `,variables:{universalIdentifier:t}},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return s.data.errors?{success:!1,error:s.data.errors[0]?.message||"Failed to install application"}:{success:!0,data:s.data.data.installMarketplaceApp}}catch(n){return C.default.isAxiosError(n)&&n.response?{success:!1,error:n.response.data?.errors?.[0]?.message||n.message}:{success:!1,error:n}}}async uploadFile({filePath:t,builtHandlerPath:n,fileFolder:s,applicationUniversalIdentifier:i}){try{const a=m.resolve(t);if(!ge.existsSync(a))return{success:!1,error:`File not found: ${a}`};const r=m.basename(a),o=ge.readFileSync(a),l=En(r),c=`
68
+ mutation UploadApplicationFile($file: Upload!, $applicationUniversalIdentifier: String!, $fileFolder: FileFolder!, $filePath: String!) {
69
+ uploadApplicationFile(file: $file, applicationUniversalIdentifier: $applicationUniversalIdentifier, fileFolder: $fileFolder, filePath: $filePath)
70
+ { path }
71
+ }
72
+ `,d=u.ta(s),f=JSON.stringify({query:c,variables:{file:null,applicationUniversalIdentifier:i,filePath:n,fileFolder:d}}),p=JSON.stringify({0:["variables.file"]}),y=new FormData;y.append("operations",f),y.append("map",p),y.append("0",new Blob([new Uint8Array(o)],{type:l}),r);const w=await this.client.post("/metadata",y);return w.data.errors?{success:!1,error:w.data.errors[0]?.message||"Failed to upload file"}:{success:!0,data:w.data.data.uploadApplicationFile,message:`Successfully uploaded ${r}`}}catch(a){return C.default.isAxiosError(a)&&a.response?{success:!1,error:a.response.data?.errors?.[0]?.message||a.message}:{success:!1,error:a}}}}class Nn{constructor(t){this.apiClient=t}async findLogicFunctions(){try{const n=await this.apiClient.client.post("/metadata",{query:`
73
+ query FindManyLogicFunctions {
74
+ findManyLogicFunctions {
75
+ id
76
+ name
77
+ universalIdentifier
78
+ applicationId
79
+ }
80
+ }
81
+ `},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return n.data.errors?{success:!1,error:n.data.errors[0]?.message||"Failed to fetch functions"}:{success:!0,data:n.data.data.findManyLogicFunctions}}catch(t){return{success:!1,error:t}}}async executeLogicFunction({functionId:t,payload:n}){try{const s=`
82
+ mutation ExecuteOneLogicFunction($input: ExecuteOneLogicFunctionInput!) {
83
+ executeOneLogicFunction(input: $input) {
84
+ data
85
+ logs
86
+ duration
87
+ status
88
+ error
89
+ }
90
+ }
91
+ `,i={input:{id:t,payload:n}},a=await this.apiClient.client.post("/metadata",{query:s,variables:i},{headers:{"Content-Type":"application/json",Accept:"*/*"}});return a.data.errors?{success:!1,error:a.data.errors[0]?.message||"Failed to execute logic function"}:{success:!0,data:a.data.data.executeOneLogicFunction}}catch(s){return{success:!1,error:s}}}async subscribeToLogs({applicationUniversalIdentifier:t,functionUniversalIdentifier:n,functionName:s}){const i=await this.apiClient.configService.getConfig(),a=this.apiClient.serverUrlOverride??i.apiUrl,r=St.createClient({url:a+"/metadata",headers:async()=>{const c=await this.apiClient.resolveAuthToken();return{Authorization:c?`Bearer ${c}`:"","Content-Type":"application/json",Accept:"text/event-stream"}}}),o=`
92
+ subscription SubscribeToLogs($input: LogicFunctionLogsInput!) {
93
+ logicFunctionLogs(input: $input) {
94
+ logs
95
+ }
96
+ }
97
+ `,l={input:{applicationUniversalIdentifier:t,universalIdentifier:n,name:s}};r.subscribe({query:o,variables:l},{next:({data:c})=>console.log(c?.logicFunctionLogs.logs),error:c=>console.error(c),complete:()=>console.log("Completed")})}}class Sn{constructor(t){this.client=t}async getSchema(t){return this.introspectEndpoint("/graphql",t)}async getMetadataSchema(t){return this.introspectEndpoint("/metadata",t)}async introspectEndpoint(t,n){try{const s=pe.getIntrospectionQuery(),i={"Content-Type":"application/json",Accept:"*/*"};n?.authToken&&(i.Authorization=`Bearer ${n.authToken}`);const a=await this.client.post(t,{query:s},{headers:i});if(a.data.errors)return{success:!1,error:`GraphQL introspection errors: ${JSON.stringify(a.data.errors)}`};const r=pe.buildClientSchema(a.data.data);return{success:!0,data:pe.printSchema(r),message:`Successfully loaded schema from ${t}`}}catch(s){if(C.default.isAxiosError(s)&&s.response)return{success:!1,error:s.response.data?.errors?.[0]?.message||`Failed to load schema from ${t}`};throw s}}}class D{constructor(t){this.apiClient=new wn(t),this.applicationApi=new Fn(this.apiClient.client),this.schemaApi=new Sn(this.apiClient.client),this.logicFunctionApi=new Nn(this.apiClient),this.fileApi=new bn(this.apiClient.client)}validateAuth(){return this.apiClient.validateAuth()}refreshToken(){return this.apiClient.refreshToken()}findApplicationRegistrationByUniversalIdentifier(...t){return this.applicationApi.findApplicationRegistrationByUniversalIdentifier(...t)}createApplicationRegistration(...t){return this.applicationApi.createApplicationRegistration(...t)}createDevelopmentApplication(...t){return this.applicationApi.createDevelopmentApplication(...t)}syncApplication(t){return this.applicationApi.syncApplication(t)}uninstallApplication(t){return this.applicationApi.uninstallApplication(t)}syncMarketplaceCatalog(){return this.applicationApi.syncMarketplaceCatalog()}getSchema(t){return this.schemaApi.getSchema(t)}getMetadataSchema(t){return this.schemaApi.getMetadataSchema(t)}findLogicFunctions(...t){return this.logicFunctionApi.findLogicFunctions(...t)}executeLogicFunction(...t){return this.logicFunctionApi.executeLogicFunction(...t)}subscribeToLogs(...t){return this.logicFunctionApi.subscribeToLogs(...t)}uploadAppTarball(...t){return this.fileApi.uploadAppTarball(...t)}installTarballApp(...t){return this.fileApi.installTarballApp(...t)}uploadFile(...t){return this.fileApi.uploadFile(...t)}}const _n=async e=>{const{tarballPath:t,onProgress:n}=e;e.remote&&T.setActiveRemote(e.remote),n?.(`Uploading ${t}...`);const s=ge.default.readFileSync(t),a=await new D({serverUrl:e.serverUrl,token:e.token}).uploadAppTarball({tarballBuffer:s});return a.success?{success:!0,data:{universalIdentifier:a.data.universalIdentifier}}:{success:!1,error:{code:g.DEPLOY_FAILED,message:`Upload failed: ${a.error}`}}},Cn=e=>L(()=>_n(e),g.DEPLOY_FAILED);class ct{constructor(t){this.apiService=new D({disableInterceptors:!0,serverUrl:t?.serverUrl,skipAuth:!0,token:t?.token})}async generateCoreClient({appPath:t,authToken:n}){const s=await this.apiService.getSchema({authToken:n});if(!s.success)throw new Error(`Failed to introspect core schema: ${JSON.stringify(s.error)}`);await Et.replaceCoreClient({packageRoot:F.join(t,"node_modules","twenty-client-sdk"),schema:s.data})}}const Rn=[2020,3e3],Ee=async e=>{const t=new AbortController,n=setTimeout(()=>t.abort(),2e3);try{return(await(await fetch(`http://localhost:${e}/healthz`,{signal:t.signal})).json()).status==="ok"}catch{return!1}finally{clearTimeout(n)}},lt=async e=>{const t=e?[e]:Rn;for(const n of t)if(await Ee(n))return`http://localhost:${n}`;return null},ut=e=>{if(!e||typeof e!="object")return null;const n=e.extensions;if(!n?.errors||!n?.summary)return null;const s=[],i=n.summary.totalErrors;s.push({message:`Sync failed with ${i} error${i!==1?"s":""}`,status:"error"});for(const[a,r]of Object.entries(n.errors)){const o=n.summary[a]??r.length;s.push({message:`${a}: ${o} error${o!==1?"s":""}`,status:"error"});let l=1;for(const c of r){const d=c.flatEntityMinimalInformation?.universalIdentifier;for(const f of c.errors){const p=[];f.value&&p.push(`value: ${f.value}`),d&&p.push(`universalIdentifier: ${d}`);const y=p.length>0?` (${p.join(", ")})`:"";s.push({message:` ${l}. ${f.code}: ${f.message}${y}`,status:"error"}),l++}}}return s},ie=e=>{try{const t=JSON.stringify(e,null,2);return t==="{}"||t===void 0?String(e):t}catch{return String(e)}},H=e=>{if(typeof e=="string")return e;if(C.default.isAxiosError(e)){const t=[],n=e.response?.status,s=e.response?.statusText;n&&t.push(`HTTP ${n}${s?` ${s}`:""}`);const i=e.response?.data,a=i?.errors;if(Array.isArray(a)&&a.length>0){const r=a.map(o=>typeof o.message=="string"?o.message:ie(o)).join("; ");t.push(r)}else i?.message?t.push(typeof i.message=="string"?i.message:ie(i.message)):i?t.push(ie(i)):e.message&&t.push(e.message);return e.code&&t.push(`(${e.code})`),t.join(" - ")||"Unknown Axios error"}return e instanceof Error?e.message||e.toString():ie(e)};class dt{constructor(t){this.apiService=new D,this.applicationUniversalIdentifier=t.applicationUniversalIdentifier,this.appPath=t.appPath}async uploadFile({builtPath:t,fileFolder:n}){const s=F.relative(u.E,t);return await this.apiService.uploadFile({filePath:m.default.join(this.appPath,t),builtHandlerPath:s,fileFolder:n,applicationUniversalIdentifier:this.applicationUniversalIdentifier})}}const de=async e=>{const t=m.default.join(e,u.E);await $(t);const n=m.default.join(t,"manifest.json");if(!await le(n)){const{manifest:s}=await at(e);return s}return await xt(n)},On=(e,t)=>t.logicFunctions.some(n=>n.universalIdentifier===e.universalIdentifier),qe=e=>"postInstall"in e?"post install":"preInstall"in e?"pre install":"functionUniversalIdentifier"in e?e.functionUniversalIdentifier:"functionName"in e?e.functionName:"unknown",Pn=async e=>{e.remote&&T.setActiveRemote(e.remote);const t=new D,n=await de(e.appPath);if(!n)return{success:!1,error:{code:g.MANIFEST_NOT_FOUND,message:"Manifest not found. Run `build` or `dev` first."}};const s=await t.findLogicFunctions();if(!s.success){const o=s.error instanceof Error?s.error.message:String(s.error??"Failed to fetch functions");return{success:!1,error:{code:Q.FETCH_FUNCTIONS_FAILED,message:o}}}const i=s.data.filter(o=>o.universalIdentifier&&On(o,n)),a=i.find(o=>"postInstall"in e&&e.postInstall?o.universalIdentifier===n.application.postInstallLogicFunction?.universalIdentifier:"preInstall"in e&&e.preInstall?o.universalIdentifier===n.application.preInstallLogicFunction?.universalIdentifier:"functionUniversalIdentifier"in e?o.universalIdentifier===e.functionUniversalIdentifier:"functionName"in e?o.name===e.functionName:!1);if(!a)return{success:!1,error:{code:Q.FUNCTION_NOT_FOUND,message:`Function "${qe(e)}" not found in application.`,details:{identifier:qe(e),availableFunctions:i.map(o=>({name:o.name,universalIdentifier:o.universalIdentifier}))}}};const r=await t.executeLogicFunction({functionId:a.id,payload:e.payload??{}});if(!r.success){const o=r.error instanceof Error?r.error.message:String(r.error??"Execution failed");return{success:!1,error:{code:Q.EXECUTION_FAILED,message:o}}}return{success:!0,data:{functionName:a.name,...r.data}}},kn=e=>L(()=>Pn(e),Q.EXECUTION_FAILED),Ln=async e=>{e.remote&&T.setActiveRemote(e.remote);const t=new D,n=await de(e.appPath);if(!n)return{success:!1,error:{code:g.MANIFEST_NOT_FOUND,message:"Manifest not found. Run `build` or `dev` first."}};const s=await t.installTarballApp({universalIdentifier:n.application.universalIdentifier});if(!s.success){const i=s.error instanceof Error?s.error.message:String(s.error??"Unknown error");return{success:!1,error:{code:g.INSTALL_FAILED,message:i}}}return{success:!0,data:void 0}},xn=e=>L(()=>Ln(e),g.INSTALL_FAILED),Dn=async e=>{const{appPath:t,onProgress:n}=e,s=await ot({appPath:t,onProgress:n});if(!s.success)return s;n?.("Publishing to npm...");const i=e.npmTag?` --tag ${e.npmTag}`:"";try{ze.execSync(`npm publish${i}`,{cwd:s.data.outputDir,stdio:"inherit"})}catch{return{success:!1,error:{code:g.PUBLISH_FAILED,message:"npm publish failed"}}}return{success:!0,data:{target:"npm"}}},Un=e=>L(()=>Dn(e),g.PUBLISH_FAILED),$n=async e=>{const{apiKey:t,apiUrl:n,remote:s}=e;s&&T.setActiveRemote(s);const i=new T;return await i.setConfig({apiUrl:n,apiKey:t,accessToken:void 0,refreshToken:void 0,oauthClientId:void 0}),(await new D().validateAuth()).authValid?{success:!0,data:void 0}:(await i.clearConfig(),{success:!1,error:{code:B.AUTH_FAILED,message:"Authentication failed. Please check your credentials."}})},jn=e=>L(()=>$n(e),B.AUTH_FAILED),Mn=`<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 96 96">
98
+ <rect width="96" height="96" rx="11.3" fill="#000"/>
99
+ <path fill="#fff" d="M19.25 35.75c0-5.25 4.26-9.5 9.5-9.5h18.29c.27 0 .51.16.63.4.11.25.06.54-.12.75l-4.01 4.35c-.7.76-1.68 1.2-2.71 1.2H28.8c-1.57 0-2.85 1.27-2.85 2.85v7.18c0 .93-.75 1.67-1.68 1.67h-3.34c-.93 0-1.67-.75-1.67-1.67v-7.23z"/>
100
+ <path fill="#fff" d="M76.15 60.25c0 5.25-4.26 9.5-9.5 9.5h-7.77c-5.25 0-9.5-4.25-9.5-9.5V46.65c0-.93.35-1.82.98-2.5l4.53-4.92c.19-.2.49-.27.75-.17.26.11.44.36.44.64v20.52c0 1.57 1.28 2.85 2.85 2.85h7.68c1.57 0 2.85-1.28 2.85-2.85V35.8c0-1.57-1.28-2.85-2.85-2.85h-8.93c-1.02 0-2 .43-2.7 1.18L28.35 63.06h16c.92 0 1.67.75 1.67 1.68v3.34c0 .93-.75 1.67-1.67 1.67H22.79c-1.95 0-3.55-1.59-3.55-3.54v-1.77c0-.89.33-1.75.94-2.4l29.86-32.43c1.98-2.15 4.75-3.36 7.67-3.36h8.93c5.25 0 9.5 4.25 9.5 9.5v24.5z"/>
101
+ </svg>`,pt=({title:e,message:t,isSuccess:n})=>`<!DOCTYPE html>
102
+ <html lang="en">
103
+ <head>
104
+ <meta charset="utf-8">
105
+ <meta name="viewport" content="width=device-width, initial-scale=1">
106
+ <title>${e} — Twenty</title>
107
+ <link rel="preconnect" href="https://fonts.googleapis.com">
108
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
109
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
110
+ <style>
111
+ * { margin: 0; padding: 0; box-sizing: border-box; }
112
+ body {
113
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
114
+ background: #fafafa;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ min-height: 100dvh;
119
+ color: #333;
120
+ }
121
+ .card {
122
+ background: #fff;
123
+ border-radius: 8px;
124
+ box-shadow: 2px 4px 16px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.04);
125
+ padding: 32px;
126
+ width: 400px;
127
+ max-width: calc(100vw - 32px);
128
+ display: flex;
129
+ flex-direction: column;
130
+ align-items: center;
131
+ gap: 16px;
132
+ }
133
+ .logo { margin-bottom: 4px; }
134
+ .icon {
135
+ width: 48px;
136
+ height: 48px;
137
+ border-radius: 50%;
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ }
142
+ .icon-success { background: #f0faf0; }
143
+ .icon-error { background: #fef0f0; }
144
+ .icon svg { width: 24px; height: 24px; }
145
+ h2 {
146
+ font-size: 1.23rem;
147
+ font-weight: 600;
148
+ color: #333;
149
+ }
150
+ p {
151
+ font-size: 0.92rem;
152
+ color: #666;
153
+ text-align: center;
154
+ line-height: 1.5;
155
+ }
156
+ </style>
157
+ </head>
158
+ <body>
159
+ <div class="card">
160
+ <div class="logo">${Mn}</div>
161
+ <div class="icon ${n?"icon-success":"icon-error"}">
162
+ ${n?'<svg viewBox="0 0 24 24" fill="none" stroke="#22c55e" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>':'<svg viewBox="0 0 24 24" fill="none" stroke="#ef4444" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>'}
163
+ </div>
164
+ <h2>${e}</h2>
165
+ <p>${t}</p>
166
+ </div>
167
+ </body>
168
+ </html>`,Bn=pt({title:"Authentication successful",message:"You can close this window and return to the terminal.",isSuccess:!0}),Hn=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"),qn=e=>pt({title:"Authentication failed",message:`${Hn(e)}<br>Please return to the terminal and try again.`,isSuccess:!1}),Vn=e=>{const t=e?.timeoutMs??12e4;return new Promise((n,s)=>{let i,a;const r=new Promise(l=>{i=l}),o=Ot.default.createServer((l,c)=>{const d=new URL(l.url??"/","http://127.0.0.1");if(d.pathname!=="/callback"){c.writeHead(404),c.end("Not found");return}const f=d.searchParams.get("code"),p=d.searchParams.get("error"),y={"Content-Type":"text/html",Connection:"close"};if(f)c.writeHead(200,y),c.end(Bn),i({success:!0,code:f});else{const w=p??d.searchParams.get("error_description")??"Unknown error";c.writeHead(200,y),c.end(qn(w)),i({success:!1,error:w})}});o.listen(0,"127.0.0.1",()=>{const l=o.address();if(!l||typeof l=="string"){s(new Error("Failed to start callback server"));return}const c=l.port;n({port:c,callbackUrl:`http://127.0.0.1:${c}/callback`,waitForCallback:()=>(a=setTimeout(()=>{i({success:!1,error:`Timed out waiting for authorization (${t/1e3}s)`})},t),r.finally(()=>{clearTimeout(a)})),close:()=>{clearTimeout(a),o.closeAllConnections(),o.close()}})}),o.on("error",s)})},Yn=e=>{try{new URL(e)}catch{return Promise.resolve(!1)}const[t,n]=process.platform==="darwin"?["open",[e]]:process.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];return new Promise(s=>{j.execFile(t,n,i=>{s(!i)})})},zn=()=>{const e=Ue.default.randomBytes(32).toString("base64url"),t=Ue.default.createHash("sha256").update(e).digest("base64url");return{codeVerifier:e,codeChallenge:t}},Jn=async e=>{const{apiUrl:t,remote:n,timeoutMs:s}=e;n&&T.setActiveRemote(n);const i=new T,a=`${t}/.well-known/oauth-authorization-server`;let r;try{r=(await C.default.get(a)).data}catch{return{success:!1,error:{code:B.OAUTH_NOT_SUPPORTED,message:`Could not reach the OAuth discovery endpoint at ${a}. Ensure the server is running. Use --api-key instead.`}}}if(!r.cli_client_id)return{success:!1,error:{code:B.OAUTH_NOT_SUPPORTED,message:"Server does not expose a CLI client ID. Ensure the server is up to date. Use --api-key instead."}};const o=r.cli_client_id,{codeVerifier:l,codeChallenge:c}=zn(),d=await Vn({timeoutMs:s});try{const f=new URL(r.authorization_endpoint);f.searchParams.set("clientId",o),f.searchParams.set("codeChallenge",c),f.searchParams.set("redirectUrl",d.callbackUrl),await Yn(f.toString())||console.log(`
169
+ Open this URL in your browser to authenticate:
170
+ ${f.toString()}
171
+ `);const y=await d.waitForCallback();if(!y.success)return{success:!1,error:{code:B.AUTH_FAILED,message:y.error}};const w=await C.default.post(r.token_endpoint,{grant_type:"authorization_code",code:y.code,code_verifier:l,redirect_uri:d.callbackUrl,client_id:o}),{access_token:b,refresh_token:N}=w.data;return await i.setConfig({apiUrl:t,accessToken:b,refreshToken:N,oauthClientId:o}),(await new D({serverUrl:t,token:b}).validateAuth()).authValid?{success:!0,data:void 0}:(await i.clearConfig(),{success:!1,error:{code:B.AUTH_FAILED,message:"OAuth tokens received but authentication validation failed."}})}finally{d.close()}},Gn=e=>L(()=>Jn(e),B.AUTH_FAILED),ee="twenty-app-dev",be="twenty-app-dev-test",Wn="twentycrm/twenty-app-dev:latest",Ne=2020,Se=2021,ft=(e=ee)=>{try{return j.execSync(`docker inspect -f '{{.State.Running}}' ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()==="true"}catch{return!1}},ye=(e=ee)=>{const t=e===be?Se:Ne;try{const s=j.execSync(`docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).match(/^NODE_PORT=(\d+)$/m);return s?parseInt(s[1],10):t}catch{return t}},ht=(e=ee)=>{try{return j.execSync(`docker inspect ${e}`,{stdio:["pipe","pipe","ignore"]}),!0}catch{return!1}},Kn=()=>{try{return j.execSync("docker info",{stdio:"ignore"}),!0}catch{return!1}},Xn=2e3,Qn=180*1e3,Ve="==> START ",Zn="==> DONE",Ye=async(e,t)=>{const n=Date.now(),s=c=>process.stdout.write(ae.default.gray(c)),i=j.spawn("docker",["logs","-f","--since","1s",t],{stdio:["ignore","pipe","pipe"]});i.on("error",()=>{});let a=!1;const r=c=>{const d=c.trim(),f=d.indexOf(Ve),p=d.indexOf(Zn);if(f!==-1){a&&s(`Done
172
+ `);const y=d.slice(f+Ve.length);s(`==> ${y}... `),a=!0}else p!==-1&&a&&(s(`Done
173
+ `),a=!1)};let o="";const l=c=>{o+=c.toString();const d=o.split(`
174
+ `);o=d.pop()??"",d.forEach(r)};i.stdout?.on("data",l),i.stderr?.on("data",l);try{for(;Date.now()-n<Qn;){if(await Ee(e))return a&&s(`Done
175
+ `),!0;await new Promise(c=>setTimeout(c,Xn))}return a&&s(`Failed
176
+ `),!1}finally{i.kill()}},es=async(e={})=>{const{onProgress:t,test:n}=e,s=n?be:ee,i=n?Se:Ne,a=n?"twenty-app-dev-test-data":"twenty-app-dev-data",r=n?"twenty-app-dev-test-storage":"twenty-app-dev-storage",o=await lt(e.port??i);if(o){const p=new T(n?{configPath:Z(!0)}:void 0);T.setActiveRemote("local"),await p.setConfig({apiUrl:o});const y=new URL(o).port;return t?.(`Twenty server detected on ${o}`),{success:!0,data:{port:parseInt(y,10),url:o}}}if(!Kn())return{success:!1,error:{code:z.DOCKER_NOT_RUNNING,message:"Docker is not running. Please start Docker and try again."}};if(ft(s)){const p=ye(s);if(t?.("Container is running, waiting for it to become healthy..."),!await Ye(p,s))return{success:!1,error:{code:z.HEALTH_TIMEOUT,message:`Twenty server did not become healthy in time.
177
+ Check: 'yarn twenty server logs'`}};const w=`http://localhost:${p}`,b=new T(n?{configPath:Z(!0)}:void 0);return T.setActiveRemote("local"),await b.setConfig({apiUrl:w}),t?.(`Server running on ${w}`),{success:!0,data:{port:p,url:w}}}let l=e.port??i;if(ht(s)){const p=ye(s);p!==l&&t?.(`Existing container uses port ${p}. Run 'yarn twenty server reset${n?" --test":""}' first to change ports.`),l=p,t?.("Starting existing container..."),j.execSync(`docker start ${s}`,{stdio:"ignore"})}else if(t?.("Starting Twenty container..."),j.spawnSync("docker",["run","-d","--name",s,"-p",`${l}:${l}`,"-e",`NODE_PORT=${l}`,"-e",`SERVER_URL=http://localhost:${l}`,"-v",`${a}:/data/postgres`,"-v",`${r}:/app/packages/twenty-server/.local-storage`,Wn],{stdio:"inherit"}).status!==0)return{success:!1,error:{code:z.CONTAINER_START_FAILED,message:"Failed to start Twenty container."}};if(t?.("Waiting for Twenty to be ready..."),!await Ye(l,s))return{success:!1,error:{code:z.HEALTH_TIMEOUT,message:`Twenty server did not become healthy in time.
178
+ Check: 'yarn twenty server logs'`}};const d=`http://localhost:${l}`,f=new T(n?{configPath:Z(!0)}:void 0);return T.setActiveRemote("local"),await f.setConfig({apiUrl:d}),t?.(`Server running on ${d}`),{success:!0,data:{port:l,url:d}}},ts=e=>L(()=>es(e),z.CONTAINER_START_FAILED),ns=async e=>{const{appPath:t,onProgress:n,verbose:s}=e;n?.("Checking server...");const i=new D({disableInterceptors:!0}),a=await i.validateAuth();if(!a.serverUp)return{success:!1,error:{code:g.SYNC_FAILED,message:`Cannot reach Twenty server.
179
+
180
+ Start a local server:
181
+ yarn twenty server start
182
+
183
+ Check server status:
184
+ yarn twenty server status`}};if(!a.authValid)return{success:!1,error:{code:g.SYNC_FAILED,message:"Authentication failed. Run `yarn twenty remote add --local` to authenticate."}};n?.("Building manifest...");const r=await we(t);if(!r.success)return{success:!1,error:{code:g.MANIFEST_BUILD_FAILED,message:r.errors.join(`
185
+ `)}};for(const v of r.warnings)n?.(`⚠ ${v}`);n?.("Building application files...");const o=await it({appPath:t,manifest:r.manifest,filePaths:r.filePaths});n?.("Running typecheck...");const l=await ue(t);if(l.length>0){const v=l.map(E=>`${E.file}(${E.line},${E.column+1}): ${E.text}`);return{success:!1,error:{code:g.TYPECHECK_FAILED,message:`Typecheck failed:
186
+ ${v.join(`
187
+ `)}`}}}const c=Fe({manifest:r.manifest,builtFileInfos:o.builtFileInfos});await Te(t,c),n?.("Registering application...");const d=new T,f=await i.findApplicationRegistrationByUniversalIdentifier(c.application.universalIdentifier);if(!f.success)return{success:!1,error:{code:g.SYNC_FAILED,message:`Failed to check app registration: ${H(f.error)}`}};if(!f.data){const v=await i.createApplicationRegistration({name:c.application.displayName,universalIdentifier:c.application.universalIdentifier});if(!v.success)return{success:!1,error:{code:g.SYNC_FAILED,message:`Failed to create app registration: ${H(v.error)}`}};await d.setConfig({oauthClientId:v.data.applicationRegistration.oAuthClientId})}const p=await i.createDevelopmentApplication({universalIdentifier:c.application.universalIdentifier,name:c.application.displayName});if(!p.success)return{success:!1,error:{code:g.SYNC_FAILED,message:`Failed to create development application: ${H(p.error)}`}};n?.(`Uploading ${o.builtFileInfos.size} file${o.builtFileInfos.size===1?"":"s"}...`);const y=new dt({appPath:t,applicationUniversalIdentifier:c.application.universalIdentifier}),w=[],b=Array.from(o.builtFileInfos.values()).map(async v=>{s&&n?.(`Uploading ${v.builtPath}`);const E=await y.uploadFile({builtPath:v.builtPath,fileFolder:v.fileFolder});E.success||w.push(`Failed to upload ${v.builtPath}: ${H(E.error)}`)});if(await Promise.all(b),w.length>0)return{success:!1,error:{code:g.SYNC_FAILED,message:w.join(`
188
+ `)}};n?.("Syncing manifest...");const N=await i.syncApplication(c);if(!N.success){const v=s?null:ut(N.error),E=v?v.map(te=>te.message).join(`
189
+ `):`Sync failed with error: ${H(N.error)}`;return{success:!1,error:{code:g.SYNC_FAILED,message:E}}}n?.("Generating API client...");try{const v=await d.getConfig();await new ct().generateCoreClient({appPath:t,authToken:v.accessToken})}catch(v){return{success:!1,error:{code:g.SYNC_FAILED,message:`Failed to generate API client: ${H(v)}`}}}return{success:!0,data:{outputDir:m.default.join(t,u.E),fileCount:o.builtFileInfos.size,applicationDisplayName:c.application.displayName,applicationUniversalIdentifier:c.application.universalIdentifier}}},ss=e=>L(()=>ns(e),g.SYNC_FAILED),is=async e=>{e.remote&&T.setActiveRemote(e.remote);const t=new D,n=await de(e.appPath);if(!n)return{success:!1,error:{code:g.MANIFEST_NOT_FOUND,message:"Manifest not found. Run `build` or `dev` first."}};const s=await t.uninstallApplication(n.application.universalIdentifier);if(!s.success){const i=s.error instanceof Error?s.error.message:String(s.error??"Unknown error");return{success:!1,error:{code:g.UNINSTALL_FAILED,message:i}}}return{success:!0,data:void 0}},as=e=>L(()=>is(e),g.UNINSTALL_FAILED);exports.APP_ERROR_CODES=g;exports.AUTH_ERROR_CODES=B;exports.ApiService=D;exports.CONTAINER_NAME=ee;exports.ClientService=ct;exports.ConfigService=T;exports.DEFAULT_PORT=Ne;exports.DEFAULT_TEST_PORT=Se;exports.FUNCTION_ERROR_CODES=Q;exports.FileUploader=dt;exports.SERVER_ERROR_CODES=z;exports.TEST_CONTAINER_NAME=be;exports.appBuild=ot;exports.appDeploy=Cn;exports.appDevOnce=ss;exports.appInstall=xn;exports.appPublish=Un;exports.appUninstall=as;exports.authLogin=jn;exports.authLoginOAuth=Gn;exports.buildAndValidateManifest=we;exports.checkServerHealth=Ee;exports.containerExists=ht;exports.copy=Xe;exports.createFrontComponentsWatcher=qt;exports.createLogicFunctionsWatcher=Ht;exports.detectLocalServer=lt;exports.emptyDir=Ke;exports.ensureDir=$;exports.formatSyncErrorEvents=ut;exports.functionExecute=kn;exports.getConfigPath=Z;exports.getContainerPort=ye;exports.isContainerRunning=ft;exports.manifestUpdateChecksums=Fe;exports.parseTscOutputLine=et;exports.pathExists=le;exports.readManifestFromFile=de;exports.remove=re;exports.runSafe=L;exports.runTypecheck=ue;exports.serializeError=H;exports.serverStart=ts;exports.writeManifestToOutput=Te;