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 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
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ try {
3
+ require('../dist/main');
4
+ } catch (e) {
5
+ if (e.code === 'MODULE_NOT_FOUND' && e.message.includes('dist/main')) {
6
+ require('../src/main');
7
+ } else {
8
+ throw e;
9
+ }
10
+ }
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(`✓ ${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};
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='\nAppoiint CLI — Agent-first meeting platform\n\nAuth:\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\nRooms:\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\nMeetings:\n apo join ROOM_ID Join room as agent participant\n apo leave ROOM_ID Leave room\n\nScheduling:\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\nTTS:\n apo tts "text" --voice cfo Synthesize speech\n apo voices List available voices\n\nOptions:\n --json Output JSON (for agents)\n --key KEY Override API key\n --help Show this help\n\nhttps://appoiint.com/docs/quickstart.html\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
+ }