UNPKG

@calljmp/cli

Version:
82 lines (72 loc) 28.8 kB
#!/usr/bin/env node import{Command as rt}from"commander";import it from"figlet";import at from"gradient-string";import{Command as ze}from"commander";import M from"fs";import{Option as W}from"commander";import T from"path";var s={project:new W("-p, --project <path>","Path to the project directory").default(".").env("CALLJMP_PROJECT_DIR"),baseUrl:new W("-u, --base-url <url>","URL for the Calljmp server").default("https://api.calljmp.com").env("CALLJMP_BASE_URL")},u=class{constructor(e){this._opts=e;this.restore()}_accessToken=null;_projectId=null;_buildMap=new Map;restore(){this._accessToken=process.env.CALLJMP_ACCESS_TOKEN||null,this._projectId=process.env.CALLJMP_PROJECT_ID?parseInt(process.env.CALLJMP_PROJECT_ID,10):null;try{let e=M.readFileSync(T.resolve(this.dataDirectory,"__config"),"utf-8"),n=JSON.parse(e);this._accessToken=n.accessToken||this._accessToken,this._projectId=n.projectId||this._projectId,this._buildMap=new Map(n.buildMap||[])}catch{}}save(){let e={accessToken:this._accessToken,projectId:this._projectId,buildMap:Array.from(this._buildMap.entries())};M.mkdirSync(this.dataDirectory,{recursive:!0}),M.writeFileSync(T.resolve(this.dataDirectory,"__config"),JSON.stringify(e,null,2),"utf-8")}get dataDirectory(){return T.resolve(this.projectDirectory,".calljmp")}get typesDirectory(){return T.resolve(this.dataDirectory,"types")}get projectDirectory(){return T.resolve(process.cwd(),this._opts.project)}get baseUrl(){return this._opts.baseUrl}get accessToken(){return this._accessToken}set accessToken(e){this._accessToken=e,this.save()}get projectId(){return this._projectId}set projectId(e){this._projectId=e,this.save()}get buildMap(){return this._buildMap}addBuild(e,n){this._buildMap.set(e,{id:n}),this.save()}removeBuild(e){this._buildMap.delete(e),this.save()}buildFor(e){return this._buildMap.get(e)||null}};import*as Q from"jose";import G from"node-fetch";import H from"ora";import S from"chalk";var j=class{constructor(e=1){this.level=e}_log(e){console.log(e)}logWithLevel(e,n){this.level>=e&&this._log(n)}error(e,n){this.level>=3&&console.error(...[e,n].filter(Boolean))}warn(e){this.level>=2&&console.warn(e)}info(e){this.level>=1&&this._log(e)}debug(e){this.level>=4&&console.debug(e)}verbose(e){this.level>=5&&this._log(e)}},A=new j;var p=class{constructor(e){this._config=e}get accessToken(){if(this._config.accessToken){let e=Q.decodeJwt(this._config.accessToken),n=Math.floor(Date.now()/1e3);if(e.exp&&e.exp>n)return this._config.accessToken;this.reset()}return null}get authorized(){return this.accessToken!==null}reset(){this._config.accessToken=null}async _requestAccess(){let e=await G(`${this._config.baseUrl}/cli/access`,{method:"POST",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to request access: ${e.status} ${e.statusText}`);let{requestId:n,authorizationUrl:r}=await e.json();return{requestId:n,authorizationUrl:r}}async _pollAccess(e){for(;;){let n=await G(`${this._config.baseUrl}/cli/access/${e}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(n.ok){let{accessToken:r}=await n.json();return r}if(n.status===404){await new Promise(r=>setTimeout(r,3e3));continue}throw new Error(`Failed to poll access: ${n.status} ${n.statusText}`)}}async authorize(){let e=null;{let n=H(S.blue("Preparing authorization...")).start();try{let{requestId:r,authorizationUrl:i}=await this._requestAccess();e=r,n.stop(),A.info(`To authorize CLI, please visit the following URL in your browser: ${S.underline.yellow(i)} `)}catch(r){throw n.fail(S.red("Failed to prepare authorization.")),r}}{let n=H(S.blue("Waiting for authorization...")).start();try{let r=await this._pollAccess(e);this._config.accessToken=r,n.succeed(S.green("Authorization successful!"))}catch(r){throw n.fail(S.red("Authorization failed.")),r}}}};import B from"node-fetch";function k(t){return{id:t.id,name:t.name,description:t.description,ownerId:t.ownerId,organizationId:t.organizationId,appleIosTeamId:t.appleIosTeamId,appleIosBundleId:t.appleIosBundleId,appleIosConnected:!!t.appleIosConnected,googleAndroidPlayIntegrityResponsePubkey:t.googleAndroidPlayIntegrityResponsePubkey,googleAndroidPlayIntegrityResponsePrivkey:t.googleAndroidPlayIntegrityResponsePrivkey,googleAndroidPlayIntegrityResponseKeys:t.googleAndroidPlayIntegrityResponseKeys,googleAndroidPlayIntegrityHasResponseKeys:!!t.googleAndroidPlayIntegrityHasResponseKeys,googleAndroidPackageName:t.googleAndroidPackageName,googleAndroidConnected:!!t.googleAndroidConnected,webProjectId:t.webProjectId,webSettings:t.webSettings?xe(t.webSettings):null,webConnected:!!t.webConnected,devApiToken:t.devApiToken,devApiTokenExpiresAt:t.devApiTokenExpiresAt&&new Date(t.devApiTokenExpiresAt),serviceUuid:t.serviceUuid,emailsVersion:t.emailsVersion,settings:t.settings?t.settings:null,createdAt:new Date(t.createdAt),updatedAt:new Date(t.updatedAt),deletedAt:t.deletedAt?new Date(t.deletedAt):null,datasetPartitionIndex:t.datasetPartitionIndex}}function xe(t){return{origins:t.origins}}var l=class t extends Error{code;constructor(e,n){super(e),Object.setPrototypeOf(this,t.prototype),this.name="ServiceError",this.code=n}static fromCode(e){switch(e){case 1001:return new t("Not found",e);case 1002:return new t("Unauthorized",e);case 1003:return new t("Bad request",e);case 1004:return new t("Forbidden",e);case 1005:return new t("Too many requests",e);case 2e3:return new t("User already exists",e);case 2001:return new t("User not found",e);case 2100:return new t("Project already exists",e);case 3e3:return new t("Usage limit exceeded",e);case 3001:return new t("Resource is busy",e);case 1e3:default:return new t("Internal error",e)}}static fromJson(e){return new t(e.message,e.code)}get statusCode(){switch(this.code){case 1001:return 404;case 1002:return 401;case 1003:return 400;case 1004:return 403;case 1005:return 429;case 2e3:return 409;case 2001:return 404;case 2100:return 409;case 3e3:return 402;case 3001:return 503;case 1e3:default:return 500}}toJson(){return{message:this.message,code:this.code}}};function Z(t){return{id:t.id,keyName:t.keyName,value:t.value,isSensitive:t.isSensitive,metadata:t.metadata,createdAt:new Date(t.createdAt),updatedAt:new Date(t.updatedAt)}}function Y(t){return{id:t.id,projectId:t.projectId,deploymentId:t.deploymentId,type:t.type,version:t.version,name:t.name,description:t.description,createdAt:new Date(t.createdAt),updatedAt:new Date(t.updatedAt),lastInvocationAt:t.lastInvocationAt?new Date(t.lastInvocationAt):null,invocationKey:t.invocationKey,webhookEndpoint:t.webhookEndpoint,eventKey:t.eventKey,lookupKey:t.lookupKey}}import E from"chalk";import X from"enquirer";import ee from"ora";var m=class{constructor(e){this._config=e}_projects=new Map;get hasSelected(){return!!this._config.projectId}resetSelection(){this._config.projectId=null}async selected(){if(!this._config.projectId)throw new Error("No project selected");let e=this._projects.get(this._config.projectId);if(e)return e;let n=ee(E.blue("Project is being provisioned, waiting..."));for(;;)try{return e=await this._retrieve({id:this._config.projectId}),n.stop(),this._projects.set(e.id,e),e}catch(r){if(r instanceof l&&r.code===3001)n.start(),await new Promise(i=>setTimeout(i,3e3));else throw n.stop(),r}}async select({offset:e}={}){let{projects:n,nextOffset:r}=await this._list({offset:e});if(n.length===0)return this.create();let i=[...n.map(c=>({name:`${c.name}`,value:c.name})),...r?[{name:"More projects...",value:-1}]:[],{name:"Create new project",value:-2}],a=await X.prompt({type:"autocomplete",name:"value",message:"Select a project",choices:i});if(a.value===-1)return this.select({offset:r});if(a.value===-2)return this.create();let o=n.find(c=>c.name===a.value);if(!o)throw new Error("Project not found");return this._config.projectId=o.id,o}async create(){let{name:e,description:n}=await X.prompt([{type:"input",name:"name",message:"Project name",required:!0,validate:i=>i?/^[a-z-]+$/.test(i)?!0:"Only lowercase letters and hyphens are allowed":"Project name is required"},{type:"input",name:"description",message:"Project description (optional)"}]),r=ee(E.blue("Creating project...")).start();try{let i=await this._create({name:e,description:n||void 0});return r.stop(),this._config.projectId=i.id,i}catch(i){if(i instanceof l&&i.code===2100)return r.fail(E.red("Project with this name exists or recently deleted!")),this.create();throw r.fail(E.red("Failed to create project!")),i}}async _retrieve({id:e}){let n=await B(`${this._config.baseUrl}/project/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!n.ok){let{error:i}=await n.json();throw l.fromJson(i)}let r=await n.json();return k(r)}async _list({offset:e,limit:n}={}){let r=new URLSearchParams;e&&r.append("offset",e.toString()),n&&r.append("limit",n.toString());let i=await B(`${this._config.baseUrl}/project?${r}`,{method:"GET",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!i.ok){let{error:o}=await i.json();throw l.fromJson(o)}let a=await i.json();return{projects:a.projects.map(k),nextOffset:a.nextOffset}}async _create({name:e,description:n}){let r=await B(`${this._config.baseUrl}/project`,{method:"POST",headers:{Authorization:`Bearer ${this._config.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({name:e,description:n})});if(!r.ok){let{error:a}=await r.json();throw l.fromJson(a)}let i=await r.json();return k(i)}};import d from"chalk";import b from"ora";import y from"fs/promises";var te=`node_modules dist *.log .DS_Store .calljmp `;var ne=`import { workflow } from '@calljmp/agent'; export const config = { name: '{{agentName}}', description: '{{agentDescription}}', } export async function run(input?: unknown) { const result = await workflow.phase( { name: 'First phase', description: 'This is the first phase of the agent workflow.', }, () => Promise.resolve({ output: 'Hello from the first phase!' }) ); return result; } `;var re=`{ "name": "{{packageName}}", "version": "0.0.1", "private": true, "type": "module", "main": "index.ts", "devDependencies": { "typescript": "^5.3.3", "@types/node": "^20.11.0", "@calljmp/agent": "^0.0.13" } }`;var ie=`{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "lib": ["ES2022"], "moduleResolution": "bundler", "esModuleInterop": true, "strict": true, "skipLibCheck": true, "resolveJsonModule": true, "isolatedModules": true, "forceConsistentCasingInFileNames": true }, "include": ["**/*.ts"], "exclude": ["node_modules"] } `;import de from"mustache";function ae(t){return String(t).replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()}function F(t){let e=String(t);if(!e)return e;let n=e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ");return n=n.toLowerCase().trim(),n.charAt(0).toUpperCase()+n.slice(1)}import g from"path";import O from"node-fetch";import Ue from"esbuild";import h from"chalk";import oe from"ora";import J from"node-fetch";import K from"enquirer";var v=class{constructor(e){this._config=e}async delete(e,n){if(!n){let i=await this.list(e);if(i.length===0){console.log(h.yellow("No variables or secrets found in vault."));return}n=(await K.prompt({type:"select",name:"name",message:"Select variable or secret to delete from the vault:",choices:i.map(o=>({name:o.keyName,message:o.keyName}))})).name}let r=oe(h.blue("Deleting variable or secret from vault...")).start();try{let i=await J(`${this._config.baseUrl}/project/${e.id}/vault/${encodeURIComponent(n)}`,{method:"DELETE",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!i.ok){let{error:a}=await i.json();throw l.fromJson(a)}r.succeed(h.green("Variable or secret deleted from vault."))}catch(i){throw r.fail(h.red(`Failed to delete variable or secret from vault: ${i.message}`)),i}}async list(e){let n=await J(`${this._config.baseUrl}/project/${e.id}/vault`,{method:"GET",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!n.ok){let{error:i}=await n.json();throw l.fromJson(i)}let{keyValues:r}=await n.json();return r.map(Z)}async add(e,n){let r=n.name,i=n.value;if(r||(r=(await K.prompt({type:"input",name:"name",message:`Enter name for ${n.isSensitive?"secret":"variable"}:`,required:!0})).name),i||(i=(await K.prompt({type:n.isSensitive?"password":"input",name:"value",message:`Enter value for ${n.isSensitive?"secret":"variable"} ${h.green(r)}:`,required:!0})).value),typeof i=="string")if(!isNaN(Number(i))&&i.trim()!=="")i=Number(i);else try{i=JSON.parse(i)}catch{}let a=oe(h.blue(`Adding ${n.isSensitive?"secret":"variable"} to vault...`)).start();try{let o=await J(`${this._config.baseUrl}/project/${e.id}/vault`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._config.accessToken}`},body:JSON.stringify({keyName:r,value:i,isSensitive:n.isSensitive,description:n.description})});if(!o.ok){let{error:c}=await o.json();throw l.fromJson(c)}a.succeed(h.green(`${n.isSensitive?"Secret":"Variable"} added to vault.`))}catch(o){throw a.fail(h.red(`Failed to add ${n.isSensitive?"secret":"variable"} to vault: ${o.message}`)),o}}};import ke from"node-fetch";var C=class{constructor(e){this._config=e}async bindings(e){let n=await ke(`${this._config.baseUrl}/project/${e.id}/prompts/bindings`,{method:"GET",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!n.ok){let{error:i}=await n.json();throw l.fromJson(i)}let{bindings:r}=await n.json();return r}};import{builtinModules as Ee}from"node:module";import{defineEnv as Ce}from"unenv";import{getCloudflarePreset as Oe}from"@cloudflare/unenv-preset";var Re=new RegExp(`^(node:)?(${Ee.join("|")})$`),{env:w}=Ce({presets:[Oe({compatibilityDate:"2025-09-24",compatibilityFlags:["nodejs_compat"]})],npmShims:!0});function se(){return{name:"workers-compat",setup(t){t.initialOptions.banner={js:[w.inject?.default||[]].flat().join(` `)},w.alias&&(t.initialOptions.alias={...t.initialOptions.alias,...w.alias}),w.external&&(t.initialOptions.external=[...t.initialOptions.external??[],...w.external]),t.onResolve({filter:/^cloudflare:/},e=>({path:e.path,external:!0})),t.onResolve({filter:/^@?calljmp(:|\/).*/},e=>({path:e.path,external:!0})),t.onResolve({filter:Re},e=>{let n=e.path.replace(/^node:/,""),r=`node:${n}`;if(e.kind==="require-call")return{path:r,namespace:"node-builtin"};if(w.external?.includes(n)||w.external?.includes(r))return{path:r,external:!0}}),t.onLoad({filter:/.*/,namespace:"node-builtin"},e=>({contents:`import libDefault from '${e.path}'; module.exports = libDefault;`,loader:"js"}))}}}var f=class{constructor(e){this._config=e}async initializeProject(e){let n=b(d.blue("Generating project...")).start();try{let r=this._config.projectDirectory;await y.mkdir(r,{recursive:!0});let i=[{name:".gitignore",content:te},{name:"index.ts",content:de.render(ne,{agentName:F(e.name),agentDescription:e.description||`${F(e.name)} agent powered by Calljmp.`})},{name:"package.json",content:de.render(re,{packageName:ae(e.name)})},{name:"tsconfig.json",content:ie}],a=[];for(let o of i){let c=g.join(r,o.name);if(await y.stat(c).catch(()=>null)){a.push(o.name);continue}await y.writeFile(c,o.content)}a.length>0?n.warn(d.yellow(`Project generated with some existing files skipped: ${a.join(", ")}`)):n.succeed(d.green("Project generated successfully.")),console.log(d.blue(` Next steps:`)),console.log(d.blue("1. Install dependencies:")),console.log(d.cyan(` cd ${g.relative(process.cwd(),r)}`)),console.log(d.cyan(" npm install")),console.log(d.blue("2. Implement your agent logic in index.ts")),console.log(d.blue(`3. Deploy your agent using the CLI `))}catch(r){n.fail(d.red("Failed to generate project.")),A.error(d.red(`Error: ${r.message}`))}}async generateTypes(e){let n=b(d.blue("Generating types...")).start();try{let a=(await new v(this._config).list(e)).map(x=>` ${x.keyName}: ${x.isSensitive?x.metadata?.type||"unknown":JSON.stringify(x.value)};`).join(` `),I=(await new C(this._config).bindings(e)).map(x=>` ${x.binding}: Prompt;`).join(` `);await y.mkdir(this._config.typesDirectory,{recursive:!0});let we=` // Do not edit this file directly. It is generated by the Calljmp CLI. /* eslint-disable */ export * from '@calljmp/agent'; import { Prompt } from '@calljmp/agent'; declare module '@calljmp/agent' { interface KeyValues { ${a} } interface Prompts { ${I} } } `,L=g.join(this._config.typesDirectory,"agent.d.ts");await y.writeFile(L,we.trim()),await y.chmod(L,420);let q=g.join(this._config.projectDirectory,"tsconfig.json"),Ie=await y.readFile(q,"utf-8"),N=JSON.parse(Ie),V=`${g.relative(this._config.projectDirectory,this._config.typesDirectory)}/**/*.d.ts`;N.include.includes(V)||(N.include.push(V),await y.writeFile(q,JSON.stringify(N,null,2))),n.succeed(d.green("Types generated successfully."))}catch(r){n.fail(d.red("Failed to generate types.")),A.error(d.red(`Error: ${r.message}`))}}async _resolveEntryPoint(e){let n=[];e?n.push(e,`${e}.ts`,`${e}.js`,g.join(this._config.projectDirectory,"src",e),g.join(this._config.projectDirectory,"src",`${e}.ts`),g.join(this._config.projectDirectory,"src",`${e}.js`)):n.push(g.join(this._config.projectDirectory,"index.ts"),g.join(this._config.projectDirectory,"index.js"),g.join(this._config.projectDirectory,"src","index.ts"),g.join(this._config.projectDirectory,"src","index.js"),g.join(this._config.projectDirectory,"main.ts"),g.join(this._config.projectDirectory,"main.js"),g.join(this._config.projectDirectory,"src","main.ts"),g.join(this._config.projectDirectory,"src","main.js"));for(let r of n){let i=g.join(this._config.projectDirectory,r);try{if((await y.stat(i)).isFile())return i}catch{}}throw new Error("Could not resolve entry point. Please specify a valid entry point or create an index.ts file in the project root.")}async build(e){let n=b(d.blue("Building agent...")).start();try{let r=await this._resolveEntryPoint(e?.entryPoint),i=await Ue.build({write:!1,bundle:!0,format:"esm",platform:"neutral",target:"es2022",minify:!0,sourcemap:"external",sourcesContent:!1,keepNames:!0,outfile:"agent.js",entryPoints:[r],absWorkingDir:g.resolve(this._config.projectDirectory),mainFields:["module","main"],plugins:[se()],tsconfig:g.join(this._config.projectDirectory,"tsconfig.json")});if(i.errors.length>0)throw new Error(`Build failed: ${i.errors.map(c=>c.text).join(` `)}`);let a=i.outputFiles.find(c=>c.path.endsWith("agent.js"))?.text,o=i.outputFiles.find(c=>c.path.endsWith("agent.js.map"))?.text;if(!a)throw new Error("Build failed: No output code generated.");if(!o)throw new Error("Build failed: No source map generated.");return n.succeed(d.green("Agent built.")),{code:a,sourceMap:o,entryPoint:r}}catch(r){throw n.fail(d.red("Agent build failed.")),new Error(`Build failed: ${r.message}`)}}async deploy(e,n){let r=await this.build(n),i=this._config.buildFor(r.entryPoint),a=b(d.blue("Deploying agent...")).start();try{let o=await this._deploy({projectId:e.id,force:n?.force,previousDeploymentId:i?.id,...r});this._config.addBuild(r.entryPoint,o);let c=await this._retrieve({id:o,projectId:e.id});return a.succeed(d.green("Agent deployed:")),A.info([`name: ${c.name}`,`description: ${c.description}`,`id: ${c.deploymentId}`,`version: ${c.version}`,`url: ${d.underline(`https://dash.calljmp.com/projects/${e.id}/agents`)}`].map(I=>` - ${I}`).join(` `)),{id:c.deploymentId}}catch(o){throw a.fail(d.red(`Failed to deploy agent: ${o.message}`)),o}}async run(e,n,r){let i=b(d.blue("Running agent...")).start();try{let a=await this._run({projectId:e.id,id:n,input:r});return i.succeed(d.green("Agent run initiated:")),A.info(` - id: ${a.id}`),A.info(` - url: ${d.underline(`https://dash.calljmp.com/projects/${e.id}/observability`)}`),a}catch(a){throw i.fail(d.red(`Failed to run agent: ${a.message}`)),a}}async resume(e,n,r,i){let a=b(d.blue("Resuming agent run...")).start();try{await this._resume({projectId:e.id,runId:n,resumption:r,input:i}),a.succeed(d.green("Agent run resumed."))}catch(o){throw a.fail(d.red(`Failed to resume agent run: ${o.message}`)),o}}async _resume({projectId:e,runId:n,input:r,resumption:i}){let a=await O(`${this._config.baseUrl}/project/${e}/agent/run/${n}/resume`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._config.accessToken}`},body:JSON.stringify({input:r,resumption:i})});if(!a.ok){let{error:o}=await a.json();throw l.fromJson(o)}}async _run({projectId:e,id:n,input:r}){let i=await O(`${this._config.baseUrl}/project/${e}/agent/${n}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._config.accessToken}`},body:JSON.stringify({input:r})});if(!i.ok){let{error:o}=await i.json();throw l.fromJson(o)}return await i.json()}async _deploy({projectId:e,code:n,sourceMap:r,force:i,previousDeploymentId:a}){let o=await O(`${this._config.baseUrl}/project/${e}/agent`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._config.accessToken}`},body:JSON.stringify({code:n,force:i,sourceMap:r,previousDeploymentId:a})});if(!o.ok){let{error:I}=await o.json();throw l.fromJson(I)}let{id:c}=await o.json();return c}async _retrieve({id:e,projectId:n}){let r=await O(`${this._config.baseUrl}/project/${n}/agent/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this._config.accessToken}`}});if(!r.ok){let{error:a}=await r.json();throw l.fromJson(a)}let i=await r.json();return Y(i)}};var _e=new ze().name("init").description("Initialize your agentic AI workspace with Calljmp.").addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new f(e).initializeProject(i)}),ce=_e;import{Command as le}from"commander";var $e=new le().name("reset").description("Reset the current project selection.").addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t);new m(e).resetSelection()}),Ne=new le().name("project").description("Manage your projects with Calljmp.").showHelpAfterError().addCommand($e).addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize(),await new m(e).select()}),ue=Ne;import{Command as pe}from"commander";var Me=new pe().name("reset").description("Reset your account authentication.").addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t);new p(e).reset()}),je=new pe().name("account").description("Manage your account with Calljmp.").addCommand(Me).showHelpAfterError().addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t);await new p(e).authorize()}),ge=je;import{Command as R,Option as me}from"commander";var D={name:new me("-n, --name <name>","Name of the agent (e.g. index, main)").default("index","/index.ts file"),input:new me("-i, --input [JSON]","Input to the agent")},Be=new R().name("deploy").description("Deploy a new agent to your project.").option("-f, --force","Force redeployment of the agent even if the code has not changed").addOption(s.project).addOption(s.baseUrl).addOption(D.name).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new f(e).deploy(i,{entryPoint:t.name,force:t.force})}),Fe=new R().name("run").description("Run an agent.").option("-f, --force-deploy","Force redeployment of the agent before running").addOption(s.project).addOption(s.baseUrl).addOption(D.name).addOption(D.input).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected(),a=new f(e),{id:o}=await a.deploy(i,{entryPoint:t.name,force:t.forceDeploy});await a.run(i,o,t.input?JSON.parse(t.input):void 0)}),Je=new R().name("resume").description("Resume an agent.").option("-r, --resumption <resumption>","Resumption token to continue the agent run").option("-t, --target <target>","Target run ID to resume the agent run").addOption(s.project).addOption(s.baseUrl).addOption(D.name).addOption(D.input).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new f(e).resume(i,t.target,t.resumption,t.input?JSON.parse(t.input):void 0)}),Ke=new R().name("agent").description("Manage your agents.").showHelpAfterError().showSuggestionAfterError().addCommand(Be).addCommand(Fe).addCommand(Je),fe=Ke;function ye(){return"0.2.16"}import Le from"gradient-string";var U=Le(["#ff6b6b","#ee5a6f"]);function z(t){console.error(),t instanceof l?qe(t):t instanceof Error?Ve(t):typeof t=="string"?We(t):Ge(t),console.error()}function qe(t){let e=He(t.code);console.error(U(e)),console.error(` ${t.message}`)}function Ve(t){console.error(U("\u2716 Error")),console.error(` ${t.message}`)}function We(t){console.error(U("\u2716 Error")),console.error(` ${t}`)}function Ge(t){console.error(U("\u2716 Unexpected Error")),console.error(` ${JSON.stringify(t,null,2)}`)}function He(t){switch(t){case 1002:return"Authentication Error";case 1004:return"Permission Denied";case 1001:return"Resource Not Found";case 1003:return"Invalid Request";case 1005:return"Rate Limit Exceeded";case 3e3:return"Usage Limit Exceeded";case 3001:return"Resource Busy";case 2e3:return"User Already Exists";case 2001:return"User Not Found";case 2100:return"Project Already Exists";case 1e3:default:return"Internal Error"}}function _(t){if(t instanceof l)switch(t.code){case 1002:case 1004:return 2;case 1001:return 3;case 1003:return 4;case 3e3:case 1005:return 5;default:return 1}return 1}import{Command as $,Option as Qe}from"commander";import P from"chalk";var Ae={name:new Qe("-n, --name <name>","Name of the variable or secret to add to the vault.")},Ze=new $().name("list").aliases(["ls"]).description("List all variables and secrets in your project vault.").addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected(),o=await new v(e).list(i);if(o.length===0)console.log(P.yellow("No variables or secrets found in vault."));else{console.log(P.green("Variables and secrets in vault:"));for(let c of o)console.log(` ${P.cyan(c.keyName)}: ${c.isSensitive?P.red("*** (sensitive)"):P.green(JSON.stringify(c.value))}`)}}),Ye=new $().name("delete").aliases(["rm","del"]).description("Delete a variable or secret from your project vault.").addOption(s.project).addOption(s.baseUrl).addOption(Ae.name).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new v(e).delete(i,t.name),await new f(e).generateTypes(i)}),Xe=new $().name("add").aliases(["create","new"]).description("Add a new variable or secret to your project vault.").addOption(s.project).addOption(s.baseUrl).addOption(Ae.name).option("-v, --value [value]","Value of the variable or secret to add to the vault.").option("-s, --sensitive","Mark the variable or secret as sensitive (encrypted).",!1).option("-d, --description [description]","Description of the variable or secret.").action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new v(e).add(i,{name:t.name,value:t.value,isSensitive:t.sensitive,description:t.description}),await new f(e).generateTypes(i)}),et=new $().name("vault").description("Manage runtime variables and secrets in your project.").showHelpAfterError().showSuggestionAfterError().addCommand(Xe).addCommand(Ye).addCommand(Ze),he=et;import{Command as tt}from"commander";var nt=new tt().name("typegen").description("Generate TypeScript types for your agentic AI workspace.").addOption(s.project).addOption(s.baseUrl).action(async t=>{let e=new u(t),n=new p(e);n.authorized||await n.authorize();let r=new m(e);r.hasSelected||await r.select();let i=await r.selected();await new f(e).generateTypes(i)}),ve=nt;async function ot(){try{let t=at(["#28e2ad","#0b77e6"]),e=it.textSync("calljmp",{font:"Speed",horizontalLayout:"default",verticalLayout:"default",width:80,whitespaceBreak:!1});console.log(t(e)),console.log();let n=new rt().name("calljmp").description("CLI for Calljmp").version(ye(),"-v, --version","Display version information").helpOption("-h, --help","Display help for command").addCommand(ce).addCommand(ve).addCommand(ue).addCommand(ge).addCommand(fe).addCommand(he);process.argv.length<=2?n.outputHelp():await n.parseAsync(process.argv)}catch(t){z(t),process.exit(_(t))}}process.on("unhandledRejection",t=>{z(t),process.exit(_(t))});process.on("uncaughtException",t=>{z(t),process.exit(_(t))});ot();