appoiint 4.6.0 → 4.6.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/README.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  Agent-first meeting platform CLI. Schedule meetings, create rooms, join video calls.
4
4
 
5
+ ## Demo
6
+
7
+ Your Claude agent attends the standup — as a live peer, then the same room in the human UI:
8
+
9
+ [![apo meeting demo](https://prodmedia.tyga.host/public/tyga.cloud/landing/appoiint.com/demo/meeting-demo.gif)](https://prodmedia.tyga.host/public/tyga.cloud/landing/appoiint.com/demo/meeting-demo.mp4)
10
+
11
+ *Click for the full-resolution video. More demos (scheduling, CRM, helpdesk) coming soon.*
12
+
5
13
  ## Install
6
14
 
7
15
  ```bash
package/dist/api.js CHANGED
@@ -1 +1 @@
1
- const https=require("https"),http=require("http"),BASE="/saas/api/v1/sdk";function request(e,t,s,n,a){return new Promise((i,r)=>{const o=new URL(n,e),p="https:"===o.protocol,u=p?https:http,E={"Content-Type":"application/json"};t&&(E.Authorization=`Bearer ${t}`);const m=a?JSON.stringify(a):null;m&&(E["Content-Length"]=Buffer.byteLength(m));const c=u.request({hostname:o.hostname,port:o.port||(p?443:80),path:o.pathname+o.search,method:s,headers:E,timeout:3e4},e=>{let t="";e.on("data",e=>t+=e),e.on("end",()=>{try{const s=JSON.parse(t);e.statusCode>=400?r(new Error(s.error||s.message||`HTTP ${e.statusCode}`)):i(s.data||s)}catch{e.statusCode>=400?r(new Error(`HTTP ${e.statusCode}: ${t.slice(0,200)}`)):i(t)}})});c.on("error",r),c.on("timeout",()=>{c.destroy(),r(new Error("Request timeout (30s)"))}),m&&c.write(m),c.end()})}function api(e){const{baseUrl:t,apiKey:s}=e,n=(e,n,a)=>request(t,s,e,n,a);return{signup:e=>request(t,"","POST",`${BASE}/tai/agent/signup`,e),activate:e=>request(t,"","POST",`${BASE}/tai/agent/activate`,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,s)=>n("GET",`${BASE}/availability/slots/publicinverse?email=${e}&date=${t}&timezone=${s||"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:"")),costs:()=>n("GET",`${BASE}/costs`),costsByRoom:e=>n("GET",`${BASE}/costs/${e}`),costsPricing:()=>n("GET",`${BASE}/costs/pricing`),costsModels:()=>n("GET",`${BASE}/costs/models`),costsUsers:()=>n("GET",`${BASE}/costs/users`),costsTimeseries:e=>n("GET",`${BASE}/costs/timeseries${e?"?bucket="+e:""}`),agentCreate:e=>n("POST",`${BASE}/tai/agent/create`,e),agentList:()=>n("GET",`${BASE}/tai/agent/list`),agentRevoke:e=>n("DELETE",`${BASE}/tai/agent/${encodeURIComponent(e)}`),channelSend:e=>n("POST",`${BASE}/channels/send`,e),channelInbox:()=>n("GET",`${BASE}/channels/inbox`),channelHistory:(e,t)=>n("GET",`${BASE}/channels/history/${e}${t?"?limit="+t:""}`),channelAck:e=>n("POST",`${BASE}/channels/ack/${e}`),channelAgents:()=>n("GET",`${BASE}/channels/agents`)}}function rawApi(e){return(t,s,n)=>request(e.baseUrl,e.apiKey,t,s,n)}module.exports={api:api,request:request,rawApi:rawApi};
1
+ const https=require("https"),http=require("http"),BASE="/saas/api/v1/sdk";function request(e,t,s,n,a){return new Promise((i,r)=>{const o=new URL(n,e),p="https:"===o.protocol,u=p?https:http,E={"Content-Type":"application/json"};t&&(E.Authorization=`Bearer ${t}`);const c=a?JSON.stringify(a):null;c&&(E["Content-Length"]=Buffer.byteLength(c));const d=u.request({hostname:o.hostname,port:o.port||(p?443:80),path:o.pathname+o.search,method:s,headers:E,timeout:3e4},e=>{let t="";e.on("data",e=>t+=e),e.on("end",()=>{try{const s=JSON.parse(t);e.statusCode>=400?r(new Error(s.message||s.error||`HTTP ${e.statusCode}`)):i(s.data||s)}catch{e.statusCode>=400?r(new Error(`HTTP ${e.statusCode}: ${t.slice(0,200)}`)):i(t)}})});d.on("error",r),d.on("timeout",()=>{d.destroy(),r(new Error("Request timeout (30s)"))}),c&&d.write(c),d.end()})}function api(e){const{baseUrl:t,apiKey:s}=e,n=(e,n,a)=>request(t,s,e,n,a);return{signup:e=>request(t,"","POST",`${BASE}/tai/agent/signup`,e),activate:e=>request(t,"","POST",`${BASE}/tai/agent/activate`,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",e.userId?`${BASE}/scheduling/event-types/by-user/${e.userId}`:`${BASE}/scheduling/event-types/public`),slots:(e,t,s)=>n("GET",`${BASE}/availability/slots/publicinverse?email=${e}&date=${t}&timezone=${s||"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:"")),costs:()=>n("GET",`${BASE}/costs`),costsByRoom:e=>n("GET",`${BASE}/costs/${e}`),costsPricing:()=>n("GET",`${BASE}/costs/pricing`),costsModels:()=>n("GET",`${BASE}/costs/models`),costsUsers:()=>n("GET",`${BASE}/costs/users`),costsTimeseries:e=>n("GET",`${BASE}/costs/timeseries${e?"?bucket="+e:""}`),agentCreate:e=>n("POST",`${BASE}/tai/agent/create`,e),agentList:()=>n("GET",`${BASE}/tai/agent/list`),agentRevoke:e=>n("DELETE",`${BASE}/tai/agent/${encodeURIComponent(e)}`),channelSend:e=>n("POST",`${BASE}/channels/send`,e),channelInbox:()=>n("GET",`${BASE}/channels/inbox`),channelHistory:(e,t)=>n("GET",`${BASE}/channels/history/${e}${t?"?limit="+t:""}`),channelAck:e=>n("POST",`${BASE}/channels/ack/${e}`),channelAgents:()=>n("GET",`${BASE}/channels/agents`)}}function rawApi(e){return(t,s,n)=>request(e.baseUrl,e.apiKey,t,s,n)}module.exports={api:api,request:request,rawApi:rawApi};
@@ -1 +1 @@
1
- const{getFlag:getFlag}=require("../config"),fmt=require("../format");async function book(e,t,o){const a=getFlag(t,"event")||getFlag(t,"e"),n=getFlag(t,"date")||getFlag(t,"d"),l=getFlag(t,"email"),s=getFlag(t,"name")||getFlag(t,"n")||"Guest",g=getFlag(t,"timezone")||getFlag(t,"z")||"UTC";n&&l||(fmt.err("Usage: apo book --event EVENT_ID --date 2026-06-15T14:00:00Z --email jane@co.com"),process.exit(1));const i=await e.book({eventTypeId:a,scheduledAt:n,duration:30,customer:{name:s,email:l},timezone:g,location:{type:"video"}});if(o)return console.log(JSON.stringify(i,null,2));fmt.ok(`Booking created: ${i._id||i.id||i.bookingId}`)}async function events(e,t,o){const a=await e.events(),n=Array.isArray(a)?a:a.eventTypes||a.data||[];return o?console.log(JSON.stringify(n,null,2)):n.length?void n.forEach(e=>console.log(fmt.eventLine(e))):fmt.info("No event types found.")}async function slots(e,t,o){const a=getFlag(t,"email")||getFlag(t,"e"),n=getFlag(t,"date")||getFlag(t,"d"),l=getFlag(t,"timezone")||getFlag(t,"z")||"UTC";a&&n||(fmt.err("Usage: apo slots --email host@co.com --date 2026-06-15"),process.exit(1));const s=await e.slots(a,n,l),g=s.slots||s.data||[];return o?console.log(JSON.stringify(g,null,2)):g.length?void g.forEach(e=>console.log(` ${e.startTime||e.start} — ${e.endTime||e.end}`)):fmt.info("No available slots.")}module.exports={book:book,events:events,slots:slots};
1
+ const{getFlag:getFlag,loadConfig:loadConfig}=require("../config"),fmt=require("../format");async function book(e,t,o){const a=getFlag(t,"event")||getFlag(t,"e"),s=getFlag(t,"date")||getFlag(t,"d"),n=getFlag(t,"email"),l=getFlag(t,"name")||getFlag(t,"n")||"Guest",g=getFlag(t,"timezone")||getFlag(t,"z")||"UTC";s&&n||(fmt.err("Usage: apo book --event EVENT_ID --date 2026-06-15T14:00:00Z --email jane@co.com [--host host@co.com]"),process.exit(1));const i=getFlag(t,"host"),r=i?void 0:loadConfig([]).userId;i||r||(fmt.err("No host: pass --host host@co.com or run `apo init` (userId missing from config)"),process.exit(1));const c=await e.book({eventTypeId:a,hostEmail:i,hostId:r,scheduledAt:s,duration:30,customer:{name:l,email:n},timezone:g,location:{type:"video"}});if(o)return console.log(JSON.stringify(c,null,2));fmt.ok(`Booking created: ${c._id||c.id||c.bookingId}`)}async function events(e,t,o){const a=await e.events(),s=Array.isArray(a)?a:a.eventTypes||a.data&&(Array.isArray(a.data)?a.data:a.data.eventTypes)||[];return o?console.log(JSON.stringify(s,null,2)):s.length?void s.forEach(e=>console.log(fmt.eventLine(e))):fmt.info("No event types found.")}async function slots(e,t,o){const a=getFlag(t,"email")||getFlag(t,"e"),s=getFlag(t,"date")||getFlag(t,"d"),n=getFlag(t,"timezone")||getFlag(t,"z")||"UTC";a&&s||(fmt.err("Usage: apo slots --email host@co.com --date 2026-06-15"),process.exit(1));const l=await e.slots(a,s,n),g=l.slots||l.data||[];return o?console.log(JSON.stringify(g,null,2)):g.length?void g.forEach(e=>console.log(` ${e.startTime||e.start} — ${e.endTime||e.end}`)):fmt.info("No available slots.")}module.exports={book:book,events:events,slots:slots};
@@ -1 +1 @@
1
- const{getFlag:getFlag,positionalArgs:positionalArgs}=require("../config"),fmt=require("../format"),BASE="/saas/api/v1/sdk";async function run(t,e,s,o){const i=positionalArgs(e),n=i[0];if("tickets"===n||!n){const t=getFlag(e,"status"),i=t?`?status=${t}`:"",n=await o("GET",`${BASE}/helpdesky/tickets${i}`);if(s)return console.log(JSON.stringify(n,null,2));const c=n.tickets||n.data?.tickets||[];return c.length?(console.log(`\nTickets (${c.length})\n`),void c.forEach(t=>{const e="open"===t.status?"open":"resolved"===t.status?"resolved":t.status,s="high"===t.priority?"high":t.priority||"";console.log(` #${String(t.ticketNumber||t._id||"").padEnd(8)} ${e.padEnd(16)} ${s.padEnd(12)} ${(t.subject||t.title||"").slice(0,50)}`)})):fmt.info("No tickets.")}if("ticket"===n){const t=i[1];if(i[2]||i[1],"show"===t&&i[2]){const t=await o("GET",`${BASE}/helpdesky/tickets/${i[2]}`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.ticket||t.data||t;return console.log(`\n#${e.ticketNumber||e._id} — ${e.subject||e.title}`),console.log(` Status: ${e.status} Priority: ${e.priority||"—"} Category: ${e.category||"—"}`),console.log(` From: ${e.customerEmail||e.email||"—"} Created: ${e.createdAt||"—"}`),void(e.messages||[]).forEach(t=>{console.log(`\n ${t.sender||t.from||"—"} (${t.createdAt?new Date(t.createdAt).toLocaleString():""})`),console.log(` ${t.content||t.text||t.body||""}`)})}if("create"===t){const t=i.slice(2).join(" ")||getFlag(e,"subject"),n=getFlag(e,"priority")||"medium",c=getFlag(e,"category");t||(fmt.err('Usage: apo helpdesk ticket create "Subject" [--priority high] [--category X]'),process.exit(1));const l=await o("POST",`${BASE}/helpdesky/tickets`,{subject:t,priority:n,category:c});return s?console.log(JSON.stringify(l,null,2)):void fmt.ok(`Ticket created: ${l.data?.ticketNumber||l.data?._id||"done"}`)}if("reply"===t&&i[2]){const t=i.slice(3).join(" ")||getFlag(e,"message");t||(fmt.err('Usage: apo helpdesk ticket reply TICKET_ID "message"'),process.exit(1));const n=await o("POST",`${BASE}/helpdesky/tickets/${i[2]}/messages`,{content:t});return s?console.log(JSON.stringify(n,null,2)):void fmt.ok(`Reply added to ticket ${i[2]}`)}if("close"===t&&i[2]){const t=await o("POST",`${BASE}/helpdesky/tickets/${i[2]}/close`);return s?console.log(JSON.stringify(t,null,2)):void fmt.ok(`Ticket ${i[2]} closed`)}if("assign"===t&&i[2]){const t=getFlag(e,"agent")||i[3];t||(fmt.err("Usage: apo helpdesk ticket assign TICKET_ID --agent AGENT_ID"),process.exit(1));const n=await o("POST",`${BASE}/helpdesky/tickets/${i[2]}/assign`,{agentId:t});return s?console.log(JSON.stringify(n,null,2)):void fmt.ok(`Ticket ${i[2]} assigned to ${t}`)}}if("kb"===n||"articles"===n){const t=await o("GET",`${BASE}/knowledgebase`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.articles||t.data?.articles||[];return e.length?(console.log(`\nKnowledge Base (${e.length})\n`),void e.forEach(t=>{const e=t.published?"published":"draft";console.log(` ${(t._id||"").slice(0,8)} ${e.padEnd(18)} ${(t.title||"").slice(0,60)}`)})):fmt.info("No KB articles.")}if("stats"===n){const t=await o("GET",`${BASE}/helpdesky/tickets/statistics`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.data||t;return console.log("\nHelpdesk Stats\n"),void Object.entries(e).forEach(([t,e])=>{"object"!=typeof e&&console.log(` ${t.padEnd(20)} ${e}`)})}fmt.err("Usage: apo helpdesk [tickets|ticket show/create/reply/close/assign|kb|stats]"),process.exit(1)}module.exports={run:run};
1
+ const{getFlag:getFlag,positionalArgs:positionalArgs}=require("../config"),fmt=require("../format"),BASE="/saas/api/v1/sdk";async function run(t,e,s,o){const i=positionalArgs(e),n=i[0];if("tickets"===n||!n){const t=getFlag(e,"status"),i=t?`?status=${t}`:"",n=await o("GET",`${BASE}/helpdeskryClient/tickets${i}`);if(s)return console.log(JSON.stringify(n,null,2));const l=n.tickets||n.data?.tickets||[];return l.length?(console.log(`\nTickets (${l.length})\n`),void l.forEach(t=>{const e="open"===t.status?"open":"resolved"===t.status?"resolved":t.status,s="high"===t.priority?"high":t.priority||"";console.log(` #${String(t.ticketNumber||t._id||"").padEnd(8)} ${e.padEnd(16)} ${s.padEnd(12)} ${(t.subject||t.title||"").slice(0,50)}`)})):fmt.info("No tickets.")}if("ticket"===n){const t=i[1];if(i[2]||i[1],"show"===t&&i[2]){const t=await o("GET",`${BASE}/helpdeskryClient/tickets/${i[2]}`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.ticket||t.data||t;return console.log(`\n#${e.ticketNumber||e._id} — ${e.subject||e.title}`),console.log(` Status: ${e.status} Priority: ${e.priority||"—"} Category: ${e.category||"—"}`),console.log(` From: ${e.customerEmail||e.email||"—"} Created: ${e.createdAt||"—"}`),void(e.messages||[]).forEach(t=>{console.log(`\n ${t.sender||t.from||"—"} (${t.createdAt?new Date(t.createdAt).toLocaleString():""})`),console.log(` ${t.content||t.text||t.body||""}`)})}if("create"===t){const t=i.slice(2).join(" ")||getFlag(e,"subject"),n=getFlag(e,"priority")||"medium",l=getFlag(e,"category");t||(fmt.err('Usage: apo helpdesk ticket create "Subject" [--priority high] [--category X]'),process.exit(1));const r=await o("POST",`${BASE}/helpdeskryClient/tickets`,{subject:t,priority:n,category:l});return s?console.log(JSON.stringify(r,null,2)):void fmt.ok(`Ticket created: ${r.data?.ticketNumber||r.data?._id||"done"}`)}if("reply"===t&&i[2]){const t=i.slice(3).join(" ")||getFlag(e,"message");t||(fmt.err('Usage: apo helpdesk ticket reply TICKET_ID "message"'),process.exit(1));const n=await o("POST",`${BASE}/helpdeskryClient/tickets/${i[2]}/messages`,{content:t});return s?console.log(JSON.stringify(n,null,2)):void fmt.ok(`Reply added to ticket ${i[2]}`)}if("close"===t&&i[2]){const t=await o("POST",`${BASE}/helpdeskryClient/tickets/${i[2]}/close`);return s?console.log(JSON.stringify(t,null,2)):void fmt.ok(`Ticket ${i[2]} closed`)}if("assign"===t&&i[2]){const t=getFlag(e,"agent")||i[3];t||(fmt.err("Usage: apo helpdesk ticket assign TICKET_ID --agent AGENT_ID"),process.exit(1));const n=await o("POST",`${BASE}/helpdeskryClient/tickets/${i[2]}/assign`,{agentId:t});return s?console.log(JSON.stringify(n,null,2)):void fmt.ok(`Ticket ${i[2]} assigned to ${t}`)}}if("kb"===n||"articles"===n){const t=await o("GET",`${BASE}/knowledgebase`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.articles||t.data?.articles||[];return e.length?(console.log(`\nKnowledge Base (${e.length})\n`),void e.forEach(t=>{const e=t.published?"published":"draft";console.log(` ${(t._id||"").slice(0,8)} ${e.padEnd(18)} ${(t.title||"").slice(0,60)}`)})):fmt.info("No KB articles.")}if("stats"===n){const t=await o("GET",`${BASE}/helpdeskryClient/tickets/statistics`);if(s)return console.log(JSON.stringify(t,null,2));const e=t.data||t;return console.log("\nHelpdesk Stats\n"),void Object.entries(e).forEach(([t,e])=>{"object"!=typeof e&&console.log(` ${t.padEnd(20)} ${e}`)})}fmt.err("Usage: apo helpdesk [tickets|ticket show/create/reply/close/assign|kb|stats]"),process.exit(1)}module.exports={run:run};
package/dist/format.js CHANGED
@@ -1 +1 @@
1
- const ok=e=>console.log(`✓ ${e}`),err=e=>console.error(`✗ ${e}`),info=e=>console.log(`ℹ ${e}`),dim=e=>`${e}`,bold=e=>`${e}`,green=e=>`${e}`;function roomLine(e){return` ${bold(e.roomId||e._id||"?")} ${e.title||"Untitled"} ${dim(e.status||"")} ${dim(e.participants+" participants"||"")}`}function eventLine(e){return` ${bold(e._id||e.id||"?")} ${e.title} ${dim(e.duration+"min")} ${dim(e.active?"active":"inactive")}`}module.exports={ok:ok,err:err,info:info,dim:dim,bold:bold,green:green,roomLine:roomLine,eventLine:eventLine};
1
+ const ok=e=>console.log(`✓ ${e}`),err=e=>console.error(`✗ ${e}`),info=e=>console.log(`ℹ ${e}`),dim=e=>`${e}`,bold=e=>`${e}`,green=e=>`${e}`;function roomLine(e){return` ${bold(e.roomId||e._id||"?")} ${e.title||"Untitled"} ${dim(e.status||"")} ${dim(e.participants+" participants"||"")}`}function eventLine(e){const i=void 0!==e.active?e.active:e.isActive;return` ${bold(e._id||e.id||"?")} ${e.name||e.title||"?"} ${dim(e.duration+"min")} ${dim(i?"active":"inactive")}`}module.exports={ok:ok,err:err,info:info,dim:dim,bold:bold,green:green,roomLine:roomLine,eventLine:eventLine};
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. Creates persistent Socket.IO connection. You will hear transcripts and can send chat messages. Call appoiint_get_transcripts to read what was said, appoiint_send_chat to respond.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID to join"},agentName:{type:"string",description:"Your display name in the meeting (default: Claude Code)"},agentRole:{type:"string",description:"Your role badge (default: assistant)"}},required:["roomId"]},handler:async(e,t,i)=>{const{MeetingSession:n}=require("./meetingSession"),a=new n({baseUrl:i.config.baseUrl,roomId:t.roomId,agentName:t.agentName||"Claude Code",agentRole:t.agentRole||"assistant"}),r=await a.join();return i.meetingSessions.set(t.roomId,a),r},readOnly:!1},{name:"appoiint_get_transcripts",description:"Get speech transcripts from the meeting. Returns what participants have said since last read. Buffer is cleared after reading.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting. Call appoiint_join_meeting first."};const a=n.getTranscripts();return{roomId:t.roomId,count:a.length,transcripts:a}},readOnly:!0},{name:"appoiint_send_chat",description:"Send a chat message to all meeting participants. Your message appears in the AI chat panel with your role badge.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},message:{type:"string",description:"Message to send to meeting participants"}},required:["roomId","message"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);return n?n.sendChat(t.message):{error:"Not in this meeting. Call appoiint_join_meeting first."}},readOnly:!1},{name:"appoiint_meeting_status",description:"Check meeting connection status: connected, peer count, buffered transcript count.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);return n?n.status():{error:"Not in this meeting.",connected:!1}},readOnly:!0},{name:"appoiint_leave_meeting",description:"Leave a meeting room and disconnect.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting."};const a=n.leave();return i.meetingSessions.delete(t.roomId),a},readOnly:!1},{name:"appoiint_speak",description:"Speak in a meeting room with an agent voice: synthesizes text via TTS and broadcasts the audio to all participants in one call. Requires an active appoiint_join_meeting session. Text is trimmed to 500 chars server-side; audio over 500KB is dropped by the relay.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID (must have joined via appoiint_join_meeting)"},text:{type:"string",description:"Text to speak (max 500 chars)"},voice:{type:"string",description:"Voice: cfo, cto, cmo, cco, cso, clo, heart, michael, nova, echo (default: heart)"}},required:["roomId","text"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting. Call appoiint_join_meeting first."};const a=await e.synthesize({text:t.text,voice:t.voice||"heart",agentRole:t.voice});if(!a||!a.audio)return{error:"TTS synthesis failed",detail:a};const r=n.sendAudio({audio:a.audio,format:a.format});return{spoken:!0,roomId:t.roomId,voice:a.voice,provider:a.provider,bytes:r.bytes}},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_helpdesk_tickets",description:"List helpdesk tickets. Filter by status.",inputSchema:{type:"object",properties:{status:{type:"string",description:"Filter: open, resolved, closed"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET","/saas/api/v1/sdk/helpdesky/tickets"+(t.status?`?status=${t.status}`:""))},readOnly:!0},{name:"appoiint_helpdesk_ticket_show",description:"Get ticket detail with messages.",inputSchema:{type:"object",properties:{ticketId:{type:"string"}},required:["ticketId"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET",`/saas/api/v1/sdk/helpdesky/tickets/${t.ticketId}`)},readOnly:!0},{name:"appoiint_helpdesk_ticket_create",description:"Create a helpdesk ticket.",inputSchema:{type:"object",properties:{subject:{type:"string"},priority:{type:"string"},category:{type:"string"}},required:["subject"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST","/saas/api/v1/sdk/helpdesky/tickets",t)},readOnly:!1},{name:"appoiint_helpdesk_ticket_reply",description:"Reply to a helpdesk ticket.",inputSchema:{type:"object",properties:{ticketId:{type:"string"},message:{type:"string"}},required:["ticketId","message"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST",`/saas/api/v1/sdk/helpdesky/tickets/${t.ticketId}/messages`,{content:t.message})},readOnly:!1},{name:"appoiint_crm_leads",description:"List CRM leads. Filter by status.",inputSchema:{type:"object",properties:{status:{type:"string"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api"),a=t.status?`?status=${t.status}`:"";return n(i.config)("GET",`/saas/api/v1/sdk/crm/leads${a}`)},readOnly:!0},{name:"appoiint_crm_lead_show",description:"Get lead detail.",inputSchema:{type:"object",properties:{leadId:{type:"string"}},required:["leadId"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET",`/saas/api/v1/sdk/crm/leads/${t.leadId}`)},readOnly:!0},{name:"appoiint_crm_lead_create",description:"Create a CRM lead.",inputSchema:{type:"object",properties:{name:{type:"string"},email:{type:"string"},source:{type:"string"}},required:["name"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST","/saas/api/v1/sdk/crm/leads",t)},readOnly:!1},{name:"appoiint_crm_opportunities",description:"List CRM opportunities. Filter by stage.",inputSchema:{type:"object",properties:{stage:{type:"string"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api"),a=t.stage?`?stage=${t.stage}`:"";return n(i.config)("GET",`/saas/api/v1/sdk/crm/opportunities${a}`)},readOnly:!0},{name:"appoiint_crm_pipelines",description:"List CRM pipelines with stages.",inputSchema:{type:"object",properties:{}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET","/saas/api/v1/sdk/crm/pipelines")},readOnly:!0},{name:"appoiint_channel_send",description:"Send a 1:1 message to another agent. Use for ops requests, data queries, or notifications.",inputSchema:{type:"object",properties:{to:{type:"string",description:"Recipient agent ID"},message:{type:"string",description:"Message text"},action:{type:"string",description:"Intent/action (e.g. deploy, query, notify)"},payload:{type:"object",description:"Structured data payload"}},required:["to"]},handler:async(e,t)=>{const i={to:t.to,type:t.action?"request":"notify"};return t.message&&(i.payload={message:t.message}),t.action&&(i.action=t.action,i.requestId=`req_${Date.now()}`),t.payload&&(i.payload={...i.payload,...t.payload}),e.channelSend(i)},readOnly:!1},{name:"appoiint_channel_inbox",description:"Get unread messages from other agents.",inputSchema:{type:"object",properties:{}},handler:async e=>e.channelInbox(),readOnly:!0},{name:"appoiint_channel_history",description:"Get message history with a specific agent.",inputSchema:{type:"object",properties:{agentId:{type:"string",description:"Agent ID to get history with"},limit:{type:"number",description:"Max messages (default 50)"}},required:["agentId"]},handler:async(e,t)=>e.channelHistory(t.agentId,t.limit),readOnly:!0},{name:"appoiint_channel_agents",description:"List agents you have communicated with.",inputSchema:{type:"object",properties:{}},handler:async e=>e.channelAgents(),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};
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. Creates persistent Socket.IO connection. You will hear transcripts and can send chat messages. Call appoiint_get_transcripts to read what was said, appoiint_send_chat to respond.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID to join"},agentName:{type:"string",description:"Your display name in the meeting (default: Claude Code)"},agentRole:{type:"string",description:"Your role badge (default: assistant)"}},required:["roomId"]},handler:async(e,t,i)=>{const{MeetingSession:n}=require("./meetingSession"),a=new n({baseUrl:i.config.baseUrl,roomId:t.roomId,agentName:t.agentName||"Claude Code",agentRole:t.agentRole||"assistant"}),r=await a.join();return i.meetingSessions.set(t.roomId,a),r},readOnly:!1},{name:"appoiint_get_transcripts",description:"Get speech transcripts from the meeting. Returns what participants have said since last read. Buffer is cleared after reading.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting. Call appoiint_join_meeting first."};const a=n.getTranscripts();return{roomId:t.roomId,count:a.length,transcripts:a}},readOnly:!0},{name:"appoiint_send_chat",description:"Send a chat message to all meeting participants. Your message appears in the AI chat panel with your role badge.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"},message:{type:"string",description:"Message to send to meeting participants"}},required:["roomId","message"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);return n?n.sendChat(t.message):{error:"Not in this meeting. Call appoiint_join_meeting first."}},readOnly:!1},{name:"appoiint_meeting_status",description:"Check meeting connection status: connected, peer count, buffered transcript count.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);return n?n.status():{error:"Not in this meeting.",connected:!1}},readOnly:!0},{name:"appoiint_leave_meeting",description:"Leave a meeting room and disconnect.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID"}},required:["roomId"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting."};const a=n.leave();return i.meetingSessions.delete(t.roomId),a},readOnly:!1},{name:"appoiint_speak",description:"Speak in a meeting room with an agent voice: synthesizes text via TTS and broadcasts the audio to all participants in one call. Requires an active appoiint_join_meeting session. Text is trimmed to 500 chars server-side; audio over 500KB is dropped by the relay.",inputSchema:{type:"object",properties:{roomId:{type:"string",description:"Room ID (must have joined via appoiint_join_meeting)"},text:{type:"string",description:"Text to speak (max 500 chars)"},voice:{type:"string",description:"Voice: cfo, cto, cmo, cco, cso, clo, heart, michael, nova, echo (default: heart)"}},required:["roomId","text"]},handler:async(e,t,i)=>{const n=i.meetingSessions.get(t.roomId);if(!n)return{error:"Not in this meeting. Call appoiint_join_meeting first."};const a=await e.synthesize({text:t.text,voice:t.voice||"heart",agentRole:t.voice});if(!a||!a.audio)return{error:"TTS synthesis failed",detail:a};const r=n.sendAudio({audio:a.audio,format:a.format});return{spoken:!0,roomId:t.roomId,voice:a.voice,provider:a.provider,bytes:r.bytes}},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_helpdesk_tickets",description:"List helpdesk tickets. Filter by status.",inputSchema:{type:"object",properties:{status:{type:"string",description:"Filter: open, resolved, closed"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET","/saas/api/v1/sdk/helpdeskryClient/tickets"+(t.status?`?status=${t.status}`:""))},readOnly:!0},{name:"appoiint_helpdesk_ticket_show",description:"Get ticket detail with messages.",inputSchema:{type:"object",properties:{ticketId:{type:"string"}},required:["ticketId"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET",`/saas/api/v1/sdk/helpdeskryClient/tickets/${t.ticketId}`)},readOnly:!0},{name:"appoiint_helpdesk_ticket_create",description:"Create a helpdesk ticket.",inputSchema:{type:"object",properties:{subject:{type:"string"},priority:{type:"string"},category:{type:"string"}},required:["subject"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST","/saas/api/v1/sdk/helpdeskryClient/tickets",t)},readOnly:!1},{name:"appoiint_helpdesk_ticket_reply",description:"Reply to a helpdesk ticket.",inputSchema:{type:"object",properties:{ticketId:{type:"string"},message:{type:"string"}},required:["ticketId","message"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST",`/saas/api/v1/sdk/helpdeskryClient/tickets/${t.ticketId}/messages`,{content:t.message})},readOnly:!1},{name:"appoiint_crm_leads",description:"List CRM leads. Filter by status.",inputSchema:{type:"object",properties:{status:{type:"string"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api"),a=t.status?`?status=${t.status}`:"";return n(i.config)("GET",`/saas/api/v1/sdk/crm/leads${a}`)},readOnly:!0},{name:"appoiint_crm_lead_show",description:"Get lead detail.",inputSchema:{type:"object",properties:{leadId:{type:"string"}},required:["leadId"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET",`/saas/api/v1/sdk/crm/leads/${t.leadId}`)},readOnly:!0},{name:"appoiint_crm_lead_create",description:"Create a CRM lead.",inputSchema:{type:"object",properties:{name:{type:"string"},email:{type:"string"},source:{type:"string"}},required:["name"]},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("POST","/saas/api/v1/sdk/crm/leads",t)},readOnly:!1},{name:"appoiint_crm_opportunities",description:"List CRM opportunities. Filter by stage.",inputSchema:{type:"object",properties:{stage:{type:"string"}}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api"),a=t.stage?`?stage=${t.stage}`:"";return n(i.config)("GET",`/saas/api/v1/sdk/crm/opportunities${a}`)},readOnly:!0},{name:"appoiint_crm_pipelines",description:"List CRM pipelines with stages.",inputSchema:{type:"object",properties:{}},handler:async(e,t,i)=>{const{rawApi:n}=require("./api");return n(i.config)("GET","/saas/api/v1/sdk/crm/pipelines")},readOnly:!0},{name:"appoiint_channel_send",description:"Send a 1:1 message to another agent. Use for ops requests, data queries, or notifications.",inputSchema:{type:"object",properties:{to:{type:"string",description:"Recipient agent ID"},message:{type:"string",description:"Message text"},action:{type:"string",description:"Intent/action (e.g. deploy, query, notify)"},payload:{type:"object",description:"Structured data payload"}},required:["to"]},handler:async(e,t)=>{const i={to:t.to,type:t.action?"request":"notify"};return t.message&&(i.payload={message:t.message}),t.action&&(i.action=t.action,i.requestId=`req_${Date.now()}`),t.payload&&(i.payload={...i.payload,...t.payload}),e.channelSend(i)},readOnly:!1},{name:"appoiint_channel_inbox",description:"Get unread messages from other agents.",inputSchema:{type:"object",properties:{}},handler:async e=>e.channelInbox(),readOnly:!0},{name:"appoiint_channel_history",description:"Get message history with a specific agent.",inputSchema:{type:"object",properties:{agentId:{type:"string",description:"Agent ID to get history with"},limit:{type:"number",description:"Max messages (default 50)"}},required:["agentId"]},handler:async(e,t)=>e.channelHistory(t.agentId,t.limit),readOnly:!0},{name:"appoiint_channel_agents",description:"List agents you have communicated with.",inputSchema:{type:"object",properties:{}},handler:async e=>e.channelAgents(),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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appoiint",
3
- "version": "4.6.0",
3
+ "version": "4.6.1",
4
4
  "description": "Appoiint CLI — schedule meetings, create rooms, join video calls. Agent-first meeting platform.",
5
5
  "bin": {
6
6
  "apo": "bin/cli.js"