appoiint 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +51 -0
- package/README.md +84 -0
- package/bin/cli.js +10 -0
- package/dist/api.js +1 -0
- package/dist/commands/auth.js +1 -0
- package/dist/commands/bookings.js +1 -0
- package/dist/commands/rooms.js +1 -0
- package/dist/commands/tts.js +1 -0
- package/dist/config.js +1 -0
- package/dist/format.js +1 -0
- package/dist/main.js +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Appoiint CLI — Proprietary Licence
|
|
2
|
+
Copyright (c) 2026 Tyga.Cloud Ltd. All rights reserved.
|
|
3
|
+
|
|
4
|
+
Permission is hereby granted to any person or automated agent obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to use
|
|
6
|
+
the Software solely for the purpose of interacting with the Appoiint platform
|
|
7
|
+
(https://appoiint.com), subject to the following conditions:
|
|
8
|
+
|
|
9
|
+
1. You may install, execute, and use the Software to access Appoiint services.
|
|
10
|
+
2. You may not modify, reverse-engineer, decompile, or create derivative works
|
|
11
|
+
of the Software.
|
|
12
|
+
3. You may not redistribute, sublicence, sell, or transfer the Software or any
|
|
13
|
+
portion thereof without prior written consent from Tyga.Cloud Ltd.
|
|
14
|
+
4. The Software communicates with Appoiint's servers. Use of those services is
|
|
15
|
+
governed by Appoiint's Terms of Service (https://appoiint.com/terms).
|
|
16
|
+
|
|
17
|
+
DISCLAIMER OF WARRANTIES
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. TYGA.CLOUD LTD MAKES
|
|
22
|
+
NO WARRANTY THAT THE SOFTWARE WILL BE UNINTERRUPTED, ERROR-FREE, OR SECURE.
|
|
23
|
+
|
|
24
|
+
LIMITATION OF LIABILITY
|
|
25
|
+
|
|
26
|
+
IN NO EVENT SHALL TYGA.CLOUD LTD BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
|
|
27
|
+
SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, INCLUDING BUT NOT LIMITED TO
|
|
28
|
+
LOSS OF PROFITS, DATA, USE, OR GOODWILL, ARISING OUT OF OR IN CONNECTION
|
|
29
|
+
WITH THE USE OR INABILITY TO USE THE SOFTWARE, REGARDLESS OF THE CAUSE OF
|
|
30
|
+
ACTION OR THE THEORY OF LIABILITY, EVEN IF TYGA.CLOUD LTD HAS BEEN ADVISED
|
|
31
|
+
OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
32
|
+
|
|
33
|
+
TYGA.CLOUD LTD'S AGGREGATE LIABILITY FOR ALL CLAIMS ARISING OUT OF OR
|
|
34
|
+
RELATING TO THIS LICENCE OR THE SOFTWARE SHALL NOT EXCEED THE TOTAL FEES
|
|
35
|
+
PAID BY YOU TO TYGA.CLOUD LTD DURING THE TWELVE (12) MONTHS IMMEDIATELY
|
|
36
|
+
PRECEDING THE EVENT GIVING RISE TO THE CLAIM.
|
|
37
|
+
|
|
38
|
+
INDEMNIFICATION
|
|
39
|
+
|
|
40
|
+
You agree to indemnify, defend, and hold harmless Tyga.Cloud Ltd, its
|
|
41
|
+
officers, directors, employees, and agents from and against any and all
|
|
42
|
+
claims, damages, losses, liabilities, costs, and expenses (including
|
|
43
|
+
reasonable legal fees) arising out of or relating to:
|
|
44
|
+
(a) your use of the Software;
|
|
45
|
+
(b) your violation of this Licence; or
|
|
46
|
+
(c) your violation of any applicable law or regulation.
|
|
47
|
+
|
|
48
|
+
This licence is governed by the laws of England and Wales.
|
|
49
|
+
|
|
50
|
+
Tyga.Cloud Ltd
|
|
51
|
+
https://tyga.cloud
|
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# appoiint
|
|
2
|
+
|
|
3
|
+
Agent-first meeting platform CLI. Schedule meetings, create rooms, join video calls.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g appoiint
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
apo signup --email you@example.com --password YourPass123!
|
|
15
|
+
apo room "Team Standup"
|
|
16
|
+
apo rooms
|
|
17
|
+
apo invite ROOM_ID --email joe@co.com --name Joe
|
|
18
|
+
apo transcript ROOM_ID
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Commands
|
|
22
|
+
|
|
23
|
+
### Auth
|
|
24
|
+
```bash
|
|
25
|
+
apo signup --email E --password P # Sign up, get API key (auto-saved)
|
|
26
|
+
apo login --key KEY --user USERID # Save existing key
|
|
27
|
+
apo config # Show active config
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Rooms
|
|
31
|
+
```bash
|
|
32
|
+
apo room "Title" # Create room
|
|
33
|
+
apo rooms # List active rooms
|
|
34
|
+
apo room-status ROOM_ID # Status + participants
|
|
35
|
+
apo room-end ROOM_ID # End meeting
|
|
36
|
+
apo invite ROOM_ID --email E --name N # Invite someone
|
|
37
|
+
apo transcript ROOM_ID --format text # Get transcript
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Scheduling
|
|
41
|
+
```bash
|
|
42
|
+
apo events # List event types
|
|
43
|
+
apo slots --email host@co.com --date 2026-06-15
|
|
44
|
+
apo book --date 2026-06-15T14:00:00Z --email jane@co.com
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### TTS (Text-to-Speech)
|
|
48
|
+
```bash
|
|
49
|
+
apo tts "Hello" --voice cfo # Synthesize with CxO voice
|
|
50
|
+
apo voices # List voices
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Options
|
|
54
|
+
```bash
|
|
55
|
+
apo <command> --json # JSON output (for agents)
|
|
56
|
+
apo --help # Full reference
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Agent Integration
|
|
60
|
+
|
|
61
|
+
Add to your CLAUDE.md, .cursorrules, .clinerules, or .windsurfrules:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
## Appoiint
|
|
65
|
+
Use the apo CLI for meeting and booking management.
|
|
66
|
+
Key is in .appoiint/config.json (auto-loaded).
|
|
67
|
+
Run apo --help for full reference.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Auth
|
|
71
|
+
|
|
72
|
+
Config priority: `--key` flag > `APO_API_KEY` env > `.appoiint/config.json` (local) > `~/.appoiint/config.json` (global)
|
|
73
|
+
|
|
74
|
+
Signup auto-saves your API key + userId — no manual config needed.
|
|
75
|
+
|
|
76
|
+
## Links
|
|
77
|
+
|
|
78
|
+
- Homepage: https://appoiint.com
|
|
79
|
+
- Docs: https://appoiint.com/docs/quickstart.html
|
|
80
|
+
- llms.txt: https://appoiint.com/llms.txt
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
Tyga.Cloud Ltd
|
package/bin/cli.js
ADDED
package/dist/api.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const https=require("https"),http=require("http"),BASE="/saas/api/v1/sdk";function request(t,e,s,o,n){return new Promise((a,i)=>{const r=new URL(o,t),u="https:"===r.protocol,p=u?https:http,E={"Content-Type":"application/json"};e&&(E.Authorization=`Bearer ${e}`);const $=n?JSON.stringify(n):null;$&&(E["Content-Length"]=Buffer.byteLength($));const S=p.request({hostname:r.hostname,port:r.port||(u?443:80),path:r.pathname+r.search,method:s,headers:E,timeout:3e4},t=>{let e="";t.on("data",t=>e+=t),t.on("end",()=>{try{const s=JSON.parse(e);t.statusCode>=400?i(new Error(s.error||s.message||`HTTP ${t.statusCode}`)):a(s.data||s)}catch{t.statusCode>=400?i(new Error(`HTTP ${t.statusCode}: ${e.slice(0,200)}`)):a(e)}})});S.on("error",i),S.on("timeout",()=>{S.destroy(),i(new Error("Request timeout (30s)"))}),$&&S.write($),S.end()})}function api(t){const{baseUrl:e,apiKey:s}=t,o=(t,o,n)=>request(e,s,t,o,n);return{signup:t=>request(e,"","POST",`${BASE}/tai/agent/signup`,t),createRoom:t=>o("POST",`${BASE}/tai/agent/rooms`,t),listRooms:()=>o("GET",`${BASE}/tai/agent/rooms`),roomStatus:t=>o("GET",`${BASE}/tai/agent/rooms/${t}`),endRoom:t=>o("DELETE",`${BASE}/tai/agent/rooms/${t}`),invite:(t,e)=>o("POST",`${BASE}/tai/agent/rooms/${t}/invite`,e),transcript:(t,e)=>o("GET",`${BASE}/tai/agent/rooms/${t}/transcript?format=${e||"json"}`),joinMeeting:t=>o("POST",`${BASE}/tai/agent/meeting/join`,t),leaveMeeting:t=>o("POST",`${BASE}/tai/agent/meeting/leave`,t),events:()=>o("GET",`${BASE}/scheduling/event-types/public`),slots:(t,e,s)=>o("GET",`${BASE}/availability/slots/publicinverse?email=${t}&date=${e}&timezone=${s||"UTC"}`),book:t=>o("POST",`${BASE}/scheduling/bookings`,t),synthesize:t=>o("POST",`${BASE}/tts/synthesize`,t),voices:()=>o("GET",`${BASE}/tts/voices`),status:()=>request(e,"","GET",`${BASE.replace("/sdk","/public")}/tai/status`)}}module.exports={api:api,request:request};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{saveConfig:saveConfig,clearConfig:clearConfig,getFlag:getFlag}=require("../config"),{api:api}=require("../api"),fmt=require("../format");async function signup(e,o){const g=getFlag(e,"email")||getFlag(e,"e"),a=getFlag(e,"password")||getFlag(e,"p"),s=getFlag(e,"agent")||getFlag(e,"a")||"CLI Agent",i=getFlag(e,"type")||getFlag(e,"t")||"cli";g&&a||(fmt.err("Usage: apo signup --email you@co.com --password YourPass123!"),process.exit(1));try{const e=api({baseUrl:o,apiKey:""}),l=await e.signup({email:g,password:a,agentName:s,agentType:i,firstName:s,lastName:"Agent"}),n=l.userId||l.user?.id||l.user?._id,t=l.apiKey||l.token,r=saveConfig({apiKey:t,userId:n,baseUrl:o,email:g},!0);fmt.ok(`Signed up: ${g}`),n&&console.log(` userId: ${n}`),t&&console.log(` apiKey: ${t.slice(0,20)}...`),console.log(` config: ${r}`),console.log(""),fmt.info('Run `apo room "My Meeting"` to create your first room.')}catch(e){fmt.err(`Signup failed: ${e.message}`),process.exit(1)}}function login(e){const o=getFlag(e,"key")||getFlag(e,"k"),g=getFlag(e,"user")||getFlag(e,"u"),a=e.includes("--local");o||(fmt.err("Usage: apo login --key YOUR_API_KEY [--user YOUR_USER_ID] [--local]"),process.exit(1));const s=saveConfig({apiKey:o,userId:g||null},a);fmt.ok(`API key saved to ${s}`)}function logout(e){clearConfig(!0),clearConfig(!1),fmt.ok("Logged out. Config cleared.")}function showConfig(e){console.log(` source: ${e.source}`),console.log(" apiKey: "+(e.apiKey?e.apiKey.slice(0,20)+"...":"(none)")),console.log(` userId: ${e.userId||"(none)"}`),console.log(` baseUrl: ${e.baseUrl}`)}module.exports={signup:signup,login:login,logout:logout,showConfig:showConfig};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag}=require("../config"),fmt=require("../format");async function create(t,o,e,n){const s=o[0]||"Meeting",r=n.userId;r||(fmt.err("No userId in config. Run `apo signup` first, or `apo login --key KEY --user USERID`."),process.exit(1));const i=await t.createRoom({title:s,hostId:r});if(e)return console.log(JSON.stringify(i,null,2));fmt.ok(`Room created: ${i.roomId}`),console.log(` URL: ${i.roomUrl}`),console.log(` Title: ${i.title}`)}async function list(t,o,e){const n=await t.listRooms(),s=Array.isArray(n)?n:n.rooms||[];return e?console.log(JSON.stringify(s,null,2)):s.length?void s.forEach(t=>console.log(fmt.roomLine(t))):fmt.info("No active rooms.")}async function status(t,o,e){const n=o[0];n||(fmt.err("Usage: apo room-status ROOM_ID"),process.exit(1));const s=await t.roomStatus(n);if(e)return console.log(JSON.stringify(s,null,2));console.log(` Room: ${s.roomId}`),console.log(` Title: ${s.title}`),console.log(` Status: ${s.status}`),console.log(` Participants: ${(s.participants||[]).length}`)}async function end(t,o,e){const n=o[0];n||(fmt.err("Usage: apo room-end ROOM_ID"),process.exit(1));const s=await t.endRoom(n);if(e)return console.log(JSON.stringify(s,null,2));fmt.ok(`Room ${n} ended.`)}async function invite(t,o,e){const n=o[0],s=getFlag(o,"email")||getFlag(o,"e"),r=getFlag(o,"name")||getFlag(o,"n")||"Guest",i=getFlag(o,"type")||getFlag(o,"t")||"human";n&&s||(fmt.err("Usage: apo invite ROOM_ID --email joe@co.com --name Joe"),process.exit(1));const a=await t.invite(n,{email:s,name:r,type:i});if(e)return console.log(JSON.stringify(a,null,2));fmt.ok(`Invited ${r} (${s}) to room ${n}`),a.joinUrl&&console.log(` Join URL: ${a.joinUrl}`)}async function transcript(t,o,e){const n=o[0],s=getFlag(o,"format")||getFlag(o,"f")||"json";n||(fmt.err("Usage: apo transcript ROOM_ID [--format json|text|srt]"),process.exit(1));const r=await t.transcript(n,s);if("text"===s||"srt"===s)return console.log(r);if(e)return console.log(JSON.stringify(r,null,2));const i=r.entries||[];if(!i.length)return fmt.info("No transcript available.");i.forEach(t=>console.log(` [${t.timestamp||""}] ${t.speakerName}: ${t.text}`))}module.exports={create:create,list:list,status:status,end:end,invite:invite,transcript:transcript};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const{getFlag:getFlag}=require("../config"),fmt=require("../format");async function synthesize(o,e,t){const l=e[0],i=getFlag(e,"voice")||getFlag(e,"v")||"heart",n=getFlag(e,"role")||getFlag(e,"r");l||(fmt.err('Usage: apo tts "Hello everyone" --voice cfo'),process.exit(1));const s=await o.synthesize({text:l,voice:n||i,agentRole:n});if(t)return console.log(JSON.stringify({provider:s.provider,format:s.format,audioLength:(s.audio||"").length},null,2));fmt.ok(`Synthesized (${s.provider}): ${l.slice(0,50)}${l.length>50?"...":""}`),console.log(` Provider: ${s.provider}`),console.log(` Format: ${s.format}`),console.log(` Audio: ${(s.audio||"").length} bytes (base64)`)}async function voices(o,e,t){const l=await o.voices();if(t)return console.log(JSON.stringify(l,null,2));console.log(" Primary: "+(l.primary||"kokoro")),console.log(" Fallback: "+(l.fallback||"openai")),console.log(""),console.log(" CxO Agent Voices:"),(l.agentVoices||[]).forEach(o=>console.log(` ${o.role.padEnd(12)} → ${o.id}`))}module.exports={synthesize:synthesize,voices:voices};
|
package/dist/config.js
ADDED
|
@@ -0,0 +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 o=n.indexOf(`-${e[0]}`);return-1!==o&&n[o+1]?n[o+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,o=readConfigFile(LOCAL_DIR),s=readConfigFile(GLOBAL_DIR),t={...s,...o};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":o.apiKey?"local":s.apiKey?"global":"none"}}function saveConfig(n,e=!0){const i=e?LOCAL_DIR:GLOBAL_DIR;fs.existsSync(i)||fs.mkdirSync(i,{recursive:!0});const o=path.join(i,CONFIG_FILE),s={...readConfigFile(i),...n};return fs.writeFileSync(o,JSON.stringify(s,null,2)),o}function clearConfig(n=!0){const e=n?LOCAL_DIR:GLOBAL_DIR,i=path.join(e,CONFIG_FILE);fs.existsSync(i)&&fs.unlinkSync(i)}module.exports={loadConfig:loadConfig,saveConfig:saveConfig,clearConfig:clearConfig,hasFlag:hasFlag,getFlag:getFlag};
|
package/dist/format.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const ok=e=>console.log(`[32m✓[0m ${e}`),err=e=>console.error(`[31m✗[0m ${e}`),info=e=>console.log(`[36mℹ[0m ${e}`),dim=e=>`[2m${e}[0m`,bold=e=>`[1m${e}[0m`,green=e=>`[32m${e}[0m`;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};
|
package/dist/main.js
ADDED
|
@@ -0,0 +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"],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[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"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/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "appoiint",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Appoiint CLI — schedule meetings, create rooms, join video calls. Agent-first meeting platform.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"apo": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "node scripts/build.js",
|
|
10
|
+
"prepublishOnly": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"appoiint",
|
|
14
|
+
"appointment",
|
|
15
|
+
"booking",
|
|
16
|
+
"scheduling",
|
|
17
|
+
"meeting",
|
|
18
|
+
"video",
|
|
19
|
+
"agent",
|
|
20
|
+
"agent-first",
|
|
21
|
+
"cli",
|
|
22
|
+
"claude-code",
|
|
23
|
+
"cursor",
|
|
24
|
+
"cline",
|
|
25
|
+
"windsurf",
|
|
26
|
+
"aider",
|
|
27
|
+
"codex",
|
|
28
|
+
"openclaw",
|
|
29
|
+
"tts",
|
|
30
|
+
"stt"
|
|
31
|
+
],
|
|
32
|
+
"author": "Joe Wee <joe@tyga.cloud>",
|
|
33
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
34
|
+
"homepage": "https://appoiint.com",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://appoiint.com"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"terser": "^5.44.1"
|
|
47
|
+
}
|
|
48
|
+
}
|