appoiint 1.0.6 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.js +1 -1
- package/dist/commands/admin.js +1 -0
- package/dist/commands/audit.js +1 -0
- package/dist/commands/stats.js +1 -0
- package/dist/commands/tickets.js +1 -0
- package/dist/config.js +1 -1
- package/dist/main.js +1 -1
- package/dist/mcp-tools.js +1 -1
- package/package.json +1 -1
- package/.bgz/config.json +0 -3
package/dist/api.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const https=require("https"),http=require("http"),BASE="/saas/api/v1/sdk";function request(
|
|
1
|
+
const https=require("https"),http=require("http"),BASE="/saas/api/v1/sdk";function request(e,t,a,n,s){return new Promise((i,r)=>{const p=new URL(n,e),o="https:"===p.protocol,u=o?https:http,m={"Content-Type":"application/json"};t&&(m.Authorization=`Bearer ${t}`);const d=s?JSON.stringify(s):null;d&&(m["Content-Length"]=Buffer.byteLength(d));const T=u.request({hostname:p.hostname,port:p.port||(o?443:80),path:p.pathname+p.search,method:a,headers:m,timeout:3e4},e=>{let t="";e.on("data",e=>t+=e),e.on("end",()=>{try{const a=JSON.parse(t);e.statusCode>=400?r(new Error(a.error||a.message||`HTTP ${e.statusCode}`)):i(a.data||a)}catch{e.statusCode>=400?r(new Error(`HTTP ${e.statusCode}: ${t.slice(0,200)}`)):i(t)}})});T.on("error",r),T.on("timeout",()=>{T.destroy(),r(new Error("Request timeout (30s)"))}),d&&T.write(d),T.end()})}function api(e){const{baseUrl:t,apiKey:a}=e,n=(e,n,s)=>request(t,a,e,n,s);return{signup:e=>request(t,"","POST",`${BASE}/tai/agent/signup`,e),createRoom:e=>n("POST",`${BASE}/tai/agent/rooms`,e),listRooms:()=>n("GET",`${BASE}/tai/agent/rooms`),roomStatus:e=>n("GET",`${BASE}/tai/agent/rooms/${e}`),endRoom:e=>n("DELETE",`${BASE}/tai/agent/rooms/${e}`),invite:(e,t)=>n("POST",`${BASE}/tai/agent/rooms/${e}/invite`,t),transcript:(e,t)=>n("GET",`${BASE}/tai/agent/rooms/${e}/transcript?format=${t||"json"}`),joinMeeting:e=>n("POST",`${BASE}/tai/agent/meeting/join`,e),leaveMeeting:e=>n("POST",`${BASE}/tai/agent/meeting/leave`,e),events:()=>n("GET",`${BASE}/scheduling/event-types/public`),slots:(e,t,a)=>n("GET",`${BASE}/availability/slots/publicinverse?email=${e}&date=${t}&timezone=${a||"UTC"}`),book:e=>n("POST",`${BASE}/scheduling/bookings`,e),synthesize:e=>n("POST",`${BASE}/tts/synthesize`,e),voices:()=>n("GET",`${BASE}/tts/voices`),status:()=>request(t,"","GET",`${BASE.replace("/sdk","/public")}/tai/status`),sttStatus:()=>n("GET",`${BASE}/stt/status`),adminUsers:()=>n("GET","/superadmin/api/users"),adminUserCreate:e=>n("POST","/superadmin/api/users",e),adminUserReset:(e,t)=>n("POST","/superadmin/api/users/reset-password",{email:e,...t}),adminUserDelete:e=>n("DELETE",`/superadmin/api/users/${encodeURIComponent(e)}`),adminTenants:()=>n("GET","/superadmin/api/tenants"),adminTenantView:e=>n("GET",`/superadmin/api/tenants/${e}`),adminTenantCreate:e=>n("POST","/superadmin/api/tenants",e),adminTenantPlan:(e,t)=>n("POST",`/superadmin/api/tenants/${e}/plan`,{plan:t}),adminTenantVerify:e=>n("POST",`/superadmin/api/tenants/${e}/verify`),adminTenantSuspend:e=>n("POST",`/superadmin/api/tenants/${e}/suspend`),adminTenantActivate:e=>n("POST",`/superadmin/api/tenants/${e}/activate`),adminTenantDelete:e=>n("DELETE",`/superadmin/api/tenants/${e}`),adminBilling:()=>n("GET","/superadmin/api/revenue"),adminDiscount:e=>n("POST","/superadmin/api/discount",e),platformStats:()=>n("GET","/superadmin/api/stats"),funnel:()=>n("GET","/superadmin/api/funnel"),signups:e=>n("GET","/superadmin/api/signups"+(e?"?days="+e:"")),revenue:()=>n("GET","/superadmin/api/revenue"),tickets:e=>n("GET","/superadmin/api/tickets"+(e?"?status="+e:"")),ticketShow:e=>n("GET",`/superadmin/api/tickets/${e}`),ticketReply:(e,t)=>n("POST",`/superadmin/api/tickets/${e}/reply`,{message:t}),ticketClose:e=>n("POST",`/superadmin/api/tickets/${e}/close`),audit:e=>n("GET","/superadmin/api/audit"+(e?"?"+e:"")),auditExport:e=>n("GET",`/superadmin/api/audit/export?format=${e||"json"}`),notifications:e=>n("GET","/superadmin/api/notifications"+(e?"?since="+e:""))}}module.exports={api:api,request:request};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag,positionalArgs:positionalArgs}=require("../config"),fmt=require("../format");async function run(e,n,t){const a=positionalArgs(n),s=a[0];if("tenants"===s){const n=await e.adminTenants();if(t)return console.log(JSON.stringify(n,null,2));const a=n.tenants||n.data||n;return Array.isArray(a)&&a.length?(console.log(`\n[1mTenants (${a.length})[0m\n`),void a.forEach(e=>{const n=e.plan||"free",t=e.suspended?"[31msuspended[0m":"[32mactive[0m";console.log(` ${(e.slug||e.name||"?").padEnd(20)} ${n.padEnd(12)} ${t} ${e.email||""}`)})):fmt.info("No tenants.")}if("tenant-view"===s){const n=a[1];n||(fmt.err("Usage: apo admin tenant-view SLUG"),process.exit(1));const s=await e.adminTenantView(n);if(t)return console.log(JSON.stringify(s,null,2));const o=s.tenant||s.data||s;return console.log(`\n[1m${o.name||o.slug}[0m`),console.log(` Slug: ${o.slug}`),console.log(` Plan: ${o.plan||"free"}`),console.log(` Email: ${o.email||"—"}`),console.log(" Status: "+(o.suspended?"suspended":"active")),console.log(` Created: ${o.createdAt||"—"}`),void(o.stats&&(console.log(` Rooms: ${o.stats.rooms||0}`),console.log(` Bookings: ${o.stats.bookings||0}`),console.log(` Users: ${o.stats.users||0}`)))}if("tenant-create"===s){const s=a[1],o=getFlag(n,"plan")||"starter",r=getFlag(n,"email");s||(fmt.err("Usage: apo admin tenant-create SLUG [--plan X] [--email X]"),process.exit(1));const i=await e.adminTenantCreate({slug:s,plan:o,email:r});return t?console.log(JSON.stringify(i,null,2)):(fmt.ok(`Tenant created: ${s} (${o})`),void(i.apiKey&&console.log(` API Key: ${i.apiKey}`)))}if("tenant-plan"===s){const t=a[1],s=getFlag(n,"plan");return t&&s||(fmt.err("Usage: apo admin tenant-plan SLUG --plan X"),process.exit(1)),await e.adminTenantPlan(t,s),void fmt.ok(`Plan changed: ${t} → ${s}`)}if("tenant-verify"===s){const n=a[1];return n||(fmt.err("Usage: apo admin tenant-verify SLUG"),process.exit(1)),await e.adminTenantVerify(n),void fmt.ok(`Payment verified for: ${n}`)}if("tenant-suspend"===s){const n=a[1];return n||(fmt.err("Usage: apo admin tenant-suspend SLUG"),process.exit(1)),await e.adminTenantSuspend(n),void fmt.ok(`Tenant suspended: ${n}`)}if("tenant-activate"===s){const n=a[1];return n||(fmt.err("Usage: apo admin tenant-activate SLUG"),process.exit(1)),await e.adminTenantActivate(n),void fmt.ok(`Tenant activated: ${n}`)}if("tenant-delete"===s){const n=a[1];return n||(fmt.err("Usage: apo admin tenant-delete SLUG"),process.exit(1)),await e.adminTenantDelete(n),void fmt.ok(`Tenant deleted: ${n}`)}if("users"===s){const n=await e.adminUsers();if(t)return console.log(JSON.stringify(n,null,2));const a=n.users||n.data||n;return Array.isArray(a)&&a.length?(console.log(`\n[1mUsers (${a.length})[0m\n`),void a.forEach(e=>{const n=e.role||"user",t=e.locked?"[31mlocked[0m":"[32mactive[0m";console.log(` ${(e.email||"?").padEnd(30)} ${n.padEnd(10)} ${t}`)})):fmt.info("No users.")}if("user-create"===s){const a=getFlag(n,"email"),s=getFlag(n,"password")||getFlag(n,"p"),o=getFlag(n,"tenant"),r=getFlag(n,"role")||"user";a&&s||(fmt.err("Usage: apo admin user-create --email X --password X [--tenant SLUG] [--role X]"),process.exit(1));const i=await e.adminUserCreate({email:a,password:s,tenant:o,role:r});return t?console.log(JSON.stringify(i,null,2)):void fmt.ok(`User created: ${a}`)}if("user-reset"===s){const t=a[1],s=getFlag(n,"password")||getFlag(n,"p");return t&&s||(fmt.err("Usage: apo admin user-reset EMAIL --password NEWPASS"),process.exit(1)),await e.adminUserReset(t,{password:s}),void fmt.ok(`Password reset for: ${t}`)}if("user-delete"===s){const n=a[1];return n||(fmt.err("Usage: apo admin user-delete EMAIL"),process.exit(1)),await e.adminUserDelete(n),void fmt.ok(`User deleted: ${n}`)}if("billing"===s){const n=await e.adminBilling();if(t)return console.log(JSON.stringify(n,null,2));const a=n.data||n;return console.log("\n[1mBilling[0m\n"),console.log(` MRR: $${a.mrr||0}`),console.log(` ARR: $${a.arr||0}`),console.log(` Revenue: $${a.totalRevenue||0}`),console.log(` Fees: $${a.fees||0}`),void console.log(` Payouts: $${a.payouts||0}`)}if("discount"===s){const s=a[1],o=getFlag(n,"plan"),r=getFlag(n,"months")||"1";s||(fmt.err("Usage: apo admin discount SLUG [--plan X] [--months N]"),process.exit(1));const i=await e.adminDiscount({slug:s,plan:o,months:parseInt(r)});return t?console.log(JSON.stringify(i,null,2)):void fmt.ok(`Discount created: ${i.code||"done"}`)}fmt.err("Usage: apo admin [tenants|tenant-view|tenant-create|tenant-plan|tenant-verify|tenant-suspend|tenant-activate|tenant-delete|users|user-create|user-reset|user-delete|billing|discount]"),process.exit(1)}module.exports={run:run};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag}=require("../config"),fmt=require("../format");async function run(t,o,n){if("export"===o[0]){const e=getFlag(o,"format")||"json",r=await t.auditExport(!0!==e?e:"json");return n||"json"===e?console.log("string"==typeof r?r:JSON.stringify(r,null,2)):void console.log(r)}const e=new URLSearchParams,r=getFlag(o,"limit"),i=getFlag(o,"action");r&&!0!==r&&e.set("limit",r),i&&!0!==i&&e.set("action",i);const a=await t.audit(e.toString());if(n)return console.log(JSON.stringify(a,null,2));const s=a.entries||a.audit||a;if(!Array.isArray(s)||!s.length)return fmt.info("No audit entries.");console.log("\n[1mAudit Trail[0m\n"),s.forEach(t=>{const o=t.createdAt?new Date(t.createdAt).toLocaleString():"";console.log(` [2m${o}[0m ${t.action||""} ${t.target||t.resource||""} [2m${t.actor||""}[0m`)})}module.exports={run:run};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag}=require("../config"),fmt=require("../format");async function run(n,o){const e=await n.platformStats();if(o)return console.log(JSON.stringify(e,null,2));const s=e.data||e;console.log("\n[1mPlatform Stats[0m\n"),console.log(` Tenants: ${s.tenants||0}`),console.log(` Users: ${s.users||0}`),console.log(` Rooms: ${s.rooms||0}`),console.log(` Bookings: ${s.bookings||0}`),console.log(` Events: ${s.eventTypes||0}`),console.log(` Meetings: ${s.meetings||0}`)}async function funnel(n,o){const e=await n.funnel();if(o)return console.log(JSON.stringify(e,null,2));const s=e.data||e,t=s.stages||s;console.log("\n[1mSignup Funnel[0m\n"),Array.isArray(t)?t.forEach(n=>{const o="█".repeat(Math.round((n.percent||0)/5));console.log(` ${(n.name||"?").padEnd(18)} ${String(n.count||0).padStart(5)} ${o} ${n.percent||0}%`)}):Object.entries(t).forEach(([n,o])=>{console.log(` ${n.padEnd(18)} ${o}`)})}async function signups(n,o,e){const s=getFlag(o,"days")||"7",t=await n.signups(s);if(e)return console.log(JSON.stringify(t,null,2));const l=t.signups||t.data||t;if(!Array.isArray(l)||!l.length)return fmt.info("No recent signups.");console.log(`\n[1mRecent Signups (${s}d)[0m\n`),l.forEach(n=>{const o=n.paid?"[32mpaid[0m":"[31munpaid[0m",e=n.createdAt?new Date(n.createdAt).toLocaleDateString():"";console.log(` ${(n.email||n.slug||"?").padEnd(30)} ${o} ${e}`)})}async function revenueCmd(n,o){const e=await n.revenue();if(o)return console.log(JSON.stringify(e,null,2));const s=e.data||e;console.log("\n[1mRevenue[0m\n"),console.log(` MRR: $${s.mrr||0}`),console.log(` ARR: $${s.arr||0}`),console.log(` Total: $${s.totalRevenue||s.total||0}`),console.log(` Fees: $${s.fees||0}`),console.log(` Payouts: $${s.payouts||0}`)}module.exports={run:run,funnel:funnel,signups:signups,revenue:revenueCmd};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag,positionalArgs:positionalArgs}=require("../config"),fmt=require("../format");async function list(t,e,o){const s=getFlag(e,"status"),n=await t.tickets(s);if(o)return console.log(JSON.stringify(n,null,2));const i=n.tickets||n.data||n;if(!Array.isArray(i)||!i.length)return fmt.info("No tickets.");console.log(`\n[1mTickets (${i.length})[0m\n`),i.forEach(t=>{const e="open"===t.status?"[33mopen[0m":"closed"===t.status?"[32mclosed[0m":t.status;console.log(` #${String(t.number||t.id||"?").padEnd(6)} ${e.padEnd(16)} ${(t.subject||t.title||"").slice(0,60)}`)})}async function show(t,e,o){const s=positionalArgs(e)[0];s||(fmt.err("Usage: apo ticket show NUMBER"),process.exit(1));const n=await t.ticketShow(s);if(o)return console.log(JSON.stringify(n,null,2));const i=n.ticket||n.data||n;console.log(`\n[1m#${i.number||i.id} — ${i.subject||i.title}[0m`),console.log(` Status: ${i.status} From: ${i.email||i.from||"—"} Created: ${i.createdAt||"—"}`),(i.messages||i.replies||[]).forEach(t=>{console.log(`\n [2m${t.from||t.author||"—"} (${t.createdAt?new Date(t.createdAt).toLocaleString():""})[0m`),console.log(` ${t.text||t.body||t.message||""}`)})}async function reply(t,e,o){const s=positionalArgs(e),n=s[0],i=s.slice(1).join(" ");n&&i||(fmt.err("Usage: apo ticket reply NUMBER MESSAGE"),process.exit(1));const c=await t.ticketReply(n,i);if(o)return console.log(JSON.stringify(c,null,2));fmt.ok(`Reply sent to ticket #${n}`)}async function close(t,e,o){const s=positionalArgs(e)[0];s||(fmt.err("Usage: apo ticket close NUMBER"),process.exit(1)),await t.ticketClose(s),fmt.ok(`Ticket #${s} closed`)}module.exports={list:list,show:show,reply:reply,close:close};
|
package/dist/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const fs=require("fs"),path=require("path"),os=require("os"),LOCAL_DIR=".appoiint",GLOBAL_DIR=path.join(os.homedir(),".appoiint"),CONFIG_FILE="config.json";function hasFlag(n,e){return n.includes(`--${e}`)||n.includes(`-${e[0]}`)}function getFlag(n,e){const i=n.indexOf(`--${e}`);if(-1!==i&&n[i+1])return n[i+1];const
|
|
1
|
+
const fs=require("fs"),path=require("path"),os=require("os"),LOCAL_DIR=".appoiint",GLOBAL_DIR=path.join(os.homedir(),".appoiint"),CONFIG_FILE="config.json";function hasFlag(n,e){return n.includes(`--${e}`)||n.includes(`-${e[0]}`)}function getFlag(n,e){const i=n.indexOf(`--${e}`);if(-1!==i&&n[i+1])return n[i+1];const s=n.indexOf(`-${e[0]}`);return-1!==s&&n[s+1]?n[s+1]:null}function readConfigFile(n){try{const e=path.join(n,CONFIG_FILE);if(fs.existsSync(e))return JSON.parse(fs.readFileSync(e,"utf8"))}catch{}return{}}function loadConfig(n){const e=getFlag(n,"key")||getFlag(n,"k"),i=process.env.APO_API_KEY||process.env.APPOIINT_API_KEY,s=readConfigFile(LOCAL_DIR),o=readConfigFile(GLOBAL_DIR),t={...o,...s};return{apiKey:e||i||t.apiKey||null,userId:t.userId||null,baseUrl:t.baseUrl||process.env.APPOIINT_BASE_URL||"https://appoiint.com",source:e?"flag":i?"env":s.apiKey?"local":o.apiKey?"global":"none"}}function saveConfig(n,e=!0){const i=e?LOCAL_DIR:GLOBAL_DIR;fs.existsSync(i)||fs.mkdirSync(i,{recursive:!0});const s=path.join(i,CONFIG_FILE),o={...readConfigFile(i),...n};return fs.writeFileSync(s,JSON.stringify(o,null,2)),s}function clearConfig(n=!0){const e=n?LOCAL_DIR:GLOBAL_DIR,i=path.join(e,CONFIG_FILE);fs.existsSync(i)&&fs.unlinkSync(i)}function positionalArgs(n){const e=[];for(let i=0;i<n.length;i++)n[i].startsWith("--")||n[i].startsWith("-")?i++:e.push(n[i]);return e}module.exports={loadConfig:loadConfig,saveConfig:saveConfig,clearConfig:clearConfig,hasFlag:hasFlag,getFlag:getFlag,positionalArgs:positionalArgs};
|
package/dist/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const{loadConfig:loadConfig,hasFlag:hasFlag,getFlag:getFlag}=require("./config"),{api:api}=require("./api"),fmt=require("./format"),args=process.argv.slice(2),command=args[0],subArgs=args.slice(1),jsonMode=hasFlag(args,"json"),NO_AUTH=["signup","login","logout","config","help","--help","-h","status","version","--version","-v","mcp-serve","man","renderer","init"],config=loadConfig(args);NO_AUTH.includes(command)||config.apiKey||(fmt.err("No API key. Run: apo signup --email you@co.com --password Pass123!"),fmt.err("Or: apo login --key YOUR_KEY --user YOUR_USERID"),fmt.err("Or set APO_API_KEY environment variable."),process.exit(1));const client=config.apiKey?api(config):null,HELP='\n[1mAppoiint CLI[0m — Agent-first meeting platform\n\n[1mAuth:[0m\n apo signup --email E --password P Sign up, get API key (auto-saved)\n apo login --key KEY [--user USERID] Save API key to config\n apo logout Clear config\n apo config Show active config\n\n[1mRooms:[0m\n apo room "Title" Create meeting room\n apo rooms List active rooms\n apo room-status ROOM_ID Room status + participants\n apo room-end ROOM_ID End meeting\n apo invite ROOM_ID --email E --name N Invite human or agent\n apo transcript ROOM_ID [--format F] Get transcript (json|text|srt)\n\n[1mMeetings:[0m\n apo join ROOM_ID Join room as agent participant\n apo leave ROOM_ID Leave room\n\n[1mScheduling:[0m\n apo book --date D --email E Create booking\n apo events List event types\n apo slots --email E --date D Check availability\n\n[1mTTS:[0m\n apo tts "text" --voice cfo Synthesize speech\n apo voices List available voices\n\n[1mDiagnostics:[0m\n apo diagnose ROOM_ID Full room diagnostic (peers, events, relay)\n\n[1mManual:[0m\n apo man renderer Chat bubble renderer capabilities + formats\n apo renderer Same as above (shorthand)\n\n[1mOptions:[0m\n --json Output JSON (for agents)\n --key KEY Override API key\n --help Show this help\n\n[2mhttps://appoiint.com/docs/quickstart.html[0m\n';async function run(){switch(command){case"signup":return require("./commands/auth").signup(subArgs,config.baseUrl);case"login":return require("./commands/auth").login(subArgs);case"logout":return require("./commands/auth").logout(subArgs);case"config":return require("./commands/auth").showConfig(config);case"room":return require("./commands/rooms").create(client,subArgs,jsonMode,config);case"rooms":return require("./commands/rooms").list(client,subArgs,jsonMode);case"room-status":return require("./commands/rooms").status(client,subArgs,jsonMode);case"room-end":return require("./commands/rooms").end(client,subArgs,jsonMode);case"invite":return require("./commands/rooms").invite(client,subArgs,jsonMode);case"transcript":return require("./commands/rooms").transcript(client,subArgs,jsonMode);case"join":return subArgs[0]||(fmt.err("Usage: apo join ROOM_ID"),process.exit(1)),client.joinMeeting({roomId:subArgs[0],agentName:"CLI Agent",agentRole:getFlag(subArgs,"role")||"tai-super"}).then(e=>jsonMode?console.log(JSON.stringify(e,null,2)):fmt.ok(`Joined room ${subArgs[0]}`));case"leave":return subArgs[0]||(fmt.err("Usage: apo leave ROOM_ID"),process.exit(1)),client.leaveMeeting({roomId:subArgs[0],agentId:"cli-agent"}).then(e=>jsonMode?console.log(JSON.stringify(e,null,2)):fmt.ok(`Left room ${subArgs[0]}`));case"book":return require("./commands/bookings").book(client,subArgs,jsonMode);case"events":return require("./commands/bookings").events(client,subArgs,jsonMode);case"slots":return require("./commands/bookings").slots(client,subArgs,jsonMode);case"tts":return require("./commands/tts").synthesize(client,subArgs,jsonMode);case"voices":return require("./commands/tts").voices(client,subArgs,jsonMode);case"status":{const e=await api({baseUrl:config.baseUrl,apiKey:""}).status();return jsonMode?console.log(JSON.stringify(e,null,2)):void fmt.ok(`Appoiint ${e.version||"?"} — ${e.available?"online":"offline"}`)}case"version":case"--version":case"-v":return void console.log(require("../package.json").version);case"diagnose":return require("./commands/diagnose").run(client,subArgs,jsonMode,config);case"init":return require("./commands/init").run(subArgs);case"man":case"renderer":const
|
|
1
|
+
const{loadConfig:loadConfig,hasFlag:hasFlag,getFlag:getFlag}=require("./config"),{api:api}=require("./api"),fmt=require("./format"),args=process.argv.slice(2),command=args[0],subArgs=args.slice(1),jsonMode=hasFlag(args,"json"),NO_AUTH=["signup","login","logout","config","help","--help","-h","status","version","--version","-v","mcp-serve","man","renderer","init"],config=loadConfig(args);NO_AUTH.includes(command)||config.apiKey||(fmt.err("No API key. Run: apo signup --email you@co.com --password Pass123!"),fmt.err("Or: apo login --key YOUR_KEY --user YOUR_USERID"),fmt.err("Or set APO_API_KEY environment variable."),process.exit(1));const client=config.apiKey?api(config):null,HELP='\n[1mAppoiint CLI[0m — Agent-first meeting platform\n\n[1mAuth:[0m\n apo signup --email E --password P Sign up, get API key (auto-saved)\n apo login --key KEY [--user USERID] Save API key to config\n apo logout Clear config\n apo config Show active config\n\n[1mRooms:[0m\n apo room "Title" Create meeting room\n apo rooms List active rooms\n apo room-status ROOM_ID Room status + participants\n apo room-end ROOM_ID End meeting\n apo invite ROOM_ID --email E --name N Invite human or agent\n apo transcript ROOM_ID [--format F] Get transcript (json|text|srt)\n\n[1mMeetings:[0m\n apo join ROOM_ID Join room as agent participant\n apo leave ROOM_ID Leave room\n\n[1mScheduling:[0m\n apo book --date D --email E Create booking\n apo events List event types\n apo slots --email E --date D Check availability\n\n[1mTTS:[0m\n apo tts "text" --voice cfo Synthesize speech\n apo voices List available voices\n\n[1mAdmin:[0m\n apo admin tenants List all tenants\n apo admin tenant-view SLUG Full tenant detail\n apo admin tenant-create SLUG Create tenant\n apo admin tenant-suspend SLUG Suspend tenant\n apo admin tenant-activate SLUG Reactivate tenant\n apo admin tenant-delete SLUG Delete tenant\n apo admin users List all users\n apo admin user-reset EMAIL -p PASS Reset user password\n apo admin billing MRR, ARR, revenue\n\n[1mAnalytics:[0m\n apo stats Platform overview\n apo revenue Revenue breakdown\n apo funnel Signup funnel\n apo signups [--days 7] Recent signups\n\n[1mSupport:[0m\n apo tickets [--status open] List support tickets\n apo ticket show NUMBER Ticket detail\n apo ticket reply NUMBER MESSAGE Reply to ticket\n apo ticket close NUMBER Close ticket\n\n[1mAudit:[0m\n apo audit [--action X] [--limit N] Activity trail\n apo audit export [--format csv] Export audit log\n\n[1mDiagnostics:[0m\n apo diagnose ROOM_ID Full room diagnostic (peers, events, relay)\n\n[1mManual:[0m\n apo man renderer Chat bubble renderer capabilities + formats\n apo renderer Same as above (shorthand)\n\n[1mOptions:[0m\n --json Output JSON (for agents)\n --key KEY Override API key\n --help Show this help\n\n[2mhttps://appoiint.com/docs/quickstart.html[0m\n';async function run(){switch(command){case"signup":return require("./commands/auth").signup(subArgs,config.baseUrl);case"login":return require("./commands/auth").login(subArgs);case"logout":return require("./commands/auth").logout(subArgs);case"config":return require("./commands/auth").showConfig(config);case"room":return require("./commands/rooms").create(client,subArgs,jsonMode,config);case"rooms":return require("./commands/rooms").list(client,subArgs,jsonMode);case"room-status":return require("./commands/rooms").status(client,subArgs,jsonMode);case"room-end":return require("./commands/rooms").end(client,subArgs,jsonMode);case"invite":return require("./commands/rooms").invite(client,subArgs,jsonMode);case"transcript":return require("./commands/rooms").transcript(client,subArgs,jsonMode);case"join":return subArgs[0]||(fmt.err("Usage: apo join ROOM_ID"),process.exit(1)),client.joinMeeting({roomId:subArgs[0],agentName:"CLI Agent",agentRole:getFlag(subArgs,"role")||"tai-super"}).then(e=>jsonMode?console.log(JSON.stringify(e,null,2)):fmt.ok(`Joined room ${subArgs[0]}`));case"leave":return subArgs[0]||(fmt.err("Usage: apo leave ROOM_ID"),process.exit(1)),client.leaveMeeting({roomId:subArgs[0],agentId:"cli-agent"}).then(e=>jsonMode?console.log(JSON.stringify(e,null,2)):fmt.ok(`Left room ${subArgs[0]}`));case"book":return require("./commands/bookings").book(client,subArgs,jsonMode);case"events":return require("./commands/bookings").events(client,subArgs,jsonMode);case"slots":return require("./commands/bookings").slots(client,subArgs,jsonMode);case"tts":return require("./commands/tts").synthesize(client,subArgs,jsonMode);case"voices":return require("./commands/tts").voices(client,subArgs,jsonMode);case"status":{const e=await api({baseUrl:config.baseUrl,apiKey:""}).status();return jsonMode?console.log(JSON.stringify(e,null,2)):void fmt.ok(`Appoiint ${e.version||"?"} — ${e.available?"online":"offline"}`)}case"version":case"--version":case"-v":return void console.log(require("../package.json").version);case"admin":return require("./commands/admin").run(client,subArgs,jsonMode);case"stats":return require("./commands/stats").run(client,jsonMode);case"funnel":return require("./commands/stats").funnel(client,jsonMode);case"signups":return require("./commands/stats").signups(client,subArgs,jsonMode);case"revenue":return require("./commands/stats").revenue(client,jsonMode);case"tickets":return require("./commands/tickets").list(client,subArgs,jsonMode);case"ticket":const e=subArgs[0];if("show"===e)return require("./commands/tickets").show(client,subArgs.slice(1),jsonMode);if("reply"===e)return require("./commands/tickets").reply(client,subArgs.slice(1),jsonMode);if("close"===e)return require("./commands/tickets").close(client,subArgs.slice(1),jsonMode);fmt.err("Usage: apo ticket [show|reply|close] NUMBER"),process.exit(1);case"audit":return require("./commands/audit").run(client,subArgs,jsonMode);case"diagnose":return require("./commands/diagnose").run(client,subArgs,jsonMode,config);case"init":return require("./commands/init").run(subArgs);case"man":case"renderer":const n="man"===command?subArgs[0]:command;return"renderer"===n?require("./commands/renderer").run(subArgs.slice("man"===command?1:0),jsonMode):void fmt.err("Unknown manual page: "+(n||"(none)")+". Available: renderer");case"mcp-serve":return require("./mcp").serve();case"help":case"--help":case"-h":case void 0:return void console.log(HELP);default:fmt.err(`Unknown command: ${command}`),console.log(HELP),process.exit(1)}}run().catch(e=>{fmt.err(e.message),process.exit(1)});
|
package/dist/mcp-tools.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const TOOLS=[{name:"appoiint_status",description:"Get Appoiint platform status and version.",inputSchema:{type:"object",properties:{}},handler:async e=>e.status(),readOnly:!0},{name:"appoiint_create_room",description:"Create a video meeting room. Returns roomId and join URL.",inputSchema:{type:"object",properties:{title:{type:"string",description:'Meeting title (e.g. "Team Standup")'}},required:["title"]},handler:async(e,t)=>{const i=require("./config").loadConfig([]);return e.createRoom({title:t.title,hostId:i.userId})},readOnly:!1},{name:"appoiint_list_rooms",description:"List active meeting rooms.",inputSchema:{type:"object",properties:{}},handler:async e=>e.listRooms(),readOnly:!0},{name:"appoiint_room_status",description:"Get room status and participants.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.roomStatus(t.roomId),readOnly:!0},{name:"appoiint_end_room",description:"End a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.endRoom(t.roomId),readOnly:!1},{name:"appoiint_invite",description:"Invite a human or agent to a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},email:{type:"string",description:"Invitee email"},name:{type:"string",description:"Invitee name"},type:{type:"string",description:"human or agent (default: human)"}},required:["roomId","email"]},handler:async(e,t)=>e.invite(t.roomId,{email:t.email,name:t.name||"Guest",type:t.type||"human"}),readOnly:!1},{name:"appoiint_transcript",description:"Get meeting transcript.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},format:{type:"string",description:"json, text, or srt (default: json)"}},required:["roomId"]},handler:async(e,t)=>e.transcript(t.roomId,t.format||"json"),readOnly:!0},{name:"appoiint_join_meeting",description:"Join a meeting room as an AI agent participant.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},agentName:{type:"string",description:"Agent display name"},agentRole:{type:"string",description:"Agent role (e.g. tai-super, cfo, cto, cmo)"}},required:["roomId"]},handler:async(e,t)=>e.joinMeeting({roomId:t.roomId,agentName:t.agentName||"Agent",agentRole:t.agentRole||"tai-super"}),readOnly:!1},{name:"appoiint_leave_meeting",description:"Leave a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.leaveMeeting({roomId:t.roomId,agentId:"mcp-agent"}),readOnly:!1},{name:"appoiint_list_events",description:"List bookable event types.",inputSchema:{type:"object",properties:{}},handler:async e=>e.events(),readOnly:!0},{name:"appoiint_check_availability",description:"Check available time slots for a host on a given date.",inputSchema:{type:"object",properties:{email:{type:"string",description:"Host email address"},date:{type:"string",description:"Date (YYYY-MM-DD)"},timezone:{type:"string",description:"Timezone (default: UTC)"}},required:["email","date"]},handler:async(e,t)=>e.slots(t.email,t.date,t.timezone||"UTC"),readOnly:!0},{name:"appoiint_create_booking",description:"Create a booking on behalf of a customer.",inputSchema:{type:"object",properties:{eventTypeId:{type:"string",description:"Event type ID"},scheduledAt:{type:"string",description:"ISO 8601 date-time (e.g. 2026-06-15T14:00:00Z)"},duration:{type:"number",description:"Duration in minutes (default: 30)"},customerName:{type:"string",description:"Customer name"},customerEmail:{type:"string",description:"Customer email"}},required:["scheduledAt","customerEmail"]},handler:async(e,t)=>e.book({eventTypeId:t.eventTypeId,scheduledAt:t.scheduledAt,duration:t.duration||30,customer:{name:t.customerName||"Guest",email:t.customerEmail},location:{type:"video"}}),readOnly:!1},{name:"appoiint_tts",description:"Synthesize text-to-speech with CxO agent voice.",inputSchema:{type:"object",properties:{text:{type:"string",description:"Text to synthesize"},voice:{type:"string",description:"Voice: cfo, cto, cmo, cco, cso, clo, heart, michael, nova, echo (default: heart)"}},required:["text"]},handler:async(e,t)=>e.synthesize({text:t.text,voice:t.voice||"heart",agentRole:t.voice}),readOnly:!0},{name:"appoiint_voices",description:"List available TTS voices and CxO agent voice mappings.",inputSchema:{type:"object",properties:{}},handler:async e=>e.voices(),readOnly:!0}];module.exports={TOOLS:TOOLS};
|
|
1
|
+
const TOOLS=[{name:"appoiint_status",description:"Get Appoiint platform status and version.",inputSchema:{type:"object",properties:{}},handler:async e=>e.status(),readOnly:!0},{name:"appoiint_create_room",description:"Create a video meeting room. Returns roomId and join URL.",inputSchema:{type:"object",properties:{title:{type:"string",description:'Meeting title (e.g. "Team Standup")'}},required:["title"]},handler:async(e,t)=>{const i=require("./config").loadConfig([]);return e.createRoom({title:t.title,hostId:i.userId})},readOnly:!1},{name:"appoiint_list_rooms",description:"List active meeting rooms.",inputSchema:{type:"object",properties:{}},handler:async e=>e.listRooms(),readOnly:!0},{name:"appoiint_room_status",description:"Get room status and participants.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.roomStatus(t.roomId),readOnly:!0},{name:"appoiint_end_room",description:"End a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.endRoom(t.roomId),readOnly:!1},{name:"appoiint_invite",description:"Invite a human or agent to a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},email:{type:"string",description:"Invitee email"},name:{type:"string",description:"Invitee name"},type:{type:"string",description:"human or agent (default: human)"}},required:["roomId","email"]},handler:async(e,t)=>e.invite(t.roomId,{email:t.email,name:t.name||"Guest",type:t.type||"human"}),readOnly:!1},{name:"appoiint_transcript",description:"Get meeting transcript.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},format:{type:"string",description:"json, text, or srt (default: json)"}},required:["roomId"]},handler:async(e,t)=>e.transcript(t.roomId,t.format||"json"),readOnly:!0},{name:"appoiint_join_meeting",description:"Join a meeting room as an AI agent participant.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},agentName:{type:"string",description:"Agent display name"},agentRole:{type:"string",description:"Agent role (e.g. tai-super, cfo, cto, cmo)"}},required:["roomId"]},handler:async(e,t)=>e.joinMeeting({roomId:t.roomId,agentName:t.agentName||"Agent",agentRole:t.agentRole||"tai-super"}),readOnly:!1},{name:"appoiint_leave_meeting",description:"Leave a meeting room.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t)=>e.leaveMeeting({roomId:t.roomId,agentId:"mcp-agent"}),readOnly:!1},{name:"appoiint_list_events",description:"List bookable event types.",inputSchema:{type:"object",properties:{}},handler:async e=>e.events(),readOnly:!0},{name:"appoiint_check_availability",description:"Check available time slots for a host on a given date.",inputSchema:{type:"object",properties:{email:{type:"string",description:"Host email address"},date:{type:"string",description:"Date (YYYY-MM-DD)"},timezone:{type:"string",description:"Timezone (default: UTC)"}},required:["email","date"]},handler:async(e,t)=>e.slots(t.email,t.date,t.timezone||"UTC"),readOnly:!0},{name:"appoiint_create_booking",description:"Create a booking on behalf of a customer.",inputSchema:{type:"object",properties:{eventTypeId:{type:"string",description:"Event type ID"},scheduledAt:{type:"string",description:"ISO 8601 date-time (e.g. 2026-06-15T14:00:00Z)"},duration:{type:"number",description:"Duration in minutes (default: 30)"},customerName:{type:"string",description:"Customer name"},customerEmail:{type:"string",description:"Customer email"}},required:["scheduledAt","customerEmail"]},handler:async(e,t)=>e.book({eventTypeId:t.eventTypeId,scheduledAt:t.scheduledAt,duration:t.duration||30,customer:{name:t.customerName||"Guest",email:t.customerEmail},location:{type:"video"}}),readOnly:!1},{name:"appoiint_tts",description:"Synthesize text-to-speech with CxO agent voice.",inputSchema:{type:"object",properties:{text:{type:"string",description:"Text to synthesize"},voice:{type:"string",description:"Voice: cfo, cto, cmo, cco, cso, clo, heart, michael, nova, echo (default: heart)"}},required:["text"]},handler:async(e,t)=>e.synthesize({text:t.text,voice:t.voice||"heart",agentRole:t.voice}),readOnly:!0},{name:"appoiint_voices",description:"List available TTS voices and CxO agent voice mappings.",inputSchema:{type:"object",properties:{}},handler:async e=>e.voices(),readOnly:!0},{name:"appoiint_admin_tenants",description:"List all tenants with plan, status, usage. Superadmin only.",inputSchema:{type:"object",properties:{}},handler:async e=>e.adminTenants(),readOnly:!0},{name:"appoiint_admin_tenant_view",description:"Full tenant detail: plan, stats, usage, created date.",inputSchema:{type:"object",properties:{slug:{type:"string",description:"Tenant slug"}},required:["slug"]},handler:async(e,t)=>e.adminTenantView(t.slug),readOnly:!0},{name:"appoiint_platform_stats",description:"Platform overview: tenants, users, rooms, bookings, meetings.",inputSchema:{type:"object",properties:{}},handler:async e=>e.platformStats(),readOnly:!0},{name:"appoiint_funnel",description:"Signup funnel with conversion rates.",inputSchema:{type:"object",properties:{}},handler:async e=>e.funnel(),readOnly:!0},{name:"appoiint_revenue",description:"Revenue breakdown: MRR, ARR, fees, payouts.",inputSchema:{type:"object",properties:{}},handler:async e=>e.revenue(),readOnly:!0},{name:"appoiint_audit",description:"Activity audit trail.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Max entries"},action:{type:"string",description:"Filter by action type"}}},handler:async(e,t)=>{const i=new URLSearchParams;return t.limit&&i.set("limit",t.limit),t.action&&i.set("action",t.action),e.audit(i.toString())},readOnly:!0}];module.exports={TOOLS:TOOLS};
|
package/package.json
CHANGED
package/.bgz/config.json
DELETED