appoiint 1.0.3 → 1.0.5

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.
@@ -1 +1 @@
1
- const fmt=require("../format"),ADMIN_ROLES=["admin","owner","manager","superadmin"];async function run(e,t,o,n){const r=t[0];if(r||(fmt.err("Usage: apo diagnose ROOM_ID"),process.exit(1)),n.apiKey&&n.apiKey.includes("."))try{const e=JSON.parse(Buffer.from(n.apiKey.split(".")[1],"base64").toString());ADMIN_ROLES.includes(e.role)||(fmt.err(`Access denied. diagnose requires admin role (your role: ${e.role})`),process.exit(1))}catch{}let s;try{s=require("socket.io-client")}catch{return fmt.err("socket.io-client not installed. Run: npm install -g socket.io-client"),fmt.info("Falling back to HTTP-only diagnostics..."),httpDiagnose(e,r,o,n)}const a=n.baseUrl,i={roomId:r,baseUrl:a,connected:!1,joined:!1,peers:[],agentPeers:[],humanPeers:[],transcriptsReceived:0,agentChatsReceived:0,testChatSent:!1,testChatEcho:!1,errors:[]};return console.log(`\n Diagnosing room ${r} on ${a}\n`),new Promise(e=>{const t=setTimeout(()=>c("Timeout (15s)"),15e3),n=s(a,{transports:["websocket"],reconnection:!1});function c(r){clearTimeout(t),r&&i.errors.push(r),n.disconnect(),console.log("\n ── Diagnosis ──\n"),[["Socket.IO connected",i.connected],["Joined room",i.joined],["Human peers present",i.humanPeers.length>0],["Transcripts received (agent can hear)",i.transcriptsReceived>0],["Test agentChat sent",i.testChatSent],["agentChat echo (broadcast works)",i.testChatEcho||i.agentChatsReceived>0]].forEach(([e,t])=>{console.log(` ${t?"✓":"✗"} ${e}`)}),i.errors.length&&(console.log("\n Errors:"),i.errors.forEach(e=>console.log(` ✗ ${e}`))),i.transcriptsReceived||(console.log("\n ⚠ No transcripts — is notetaker running? Human must speak for STT to produce text."),console.log(" ⚠ Chain: Human speaks → GroqSTT → onTranscript → signalingSocket.emit(transcript) → server relay → agent")),console.log(""),o&&console.log(JSON.stringify(i,null,2)),e()}n.on("connect",()=>{i.connected=!0,fmt.ok("Socket.IO connected"),n.emit("join",{channel:r,peer_name:"apo-diagnose",peer_uuid:`diag-${Date.now()}`,peer_type:"agent",peer_agent_id:"apo-diagnose",peer_agent_role:"diagnostic",peer_video:!1,peer_audio:!1,peer_video_status:!1,peer_audio_status:!1,peer_screen_status:!1,peer_hand_status:!1,peer_rec_status:!1,peer_privacy_status:!1,peer_info:{osName:"Node.js",osVersion:process.version,browserName:"apo-diagnose",browserVersion:"1.0"}})}),n.on("addPeer",e=>{i.joined=!0;const t=e.peers?Object.values(e.peers):[];i.peers=t.map(e=>({name:e.peer_name,type:e.peer_type||"human",role:e.peer_agent_role||null})),i.agentPeers=i.peers.filter(e=>"agent"===e.type),i.humanPeers=i.peers.filter(e=>"agent"!==e.type),fmt.ok(`Joined room — ${i.peers.length} peer(s)`),i.peers.forEach(e=>{const t="agent"===e.type?`[${e.role||"agent"}]`:"[human]";console.log(` ${t} ${e.name}`)}),setTimeout(()=>{n.emit("agentChat",{peer_name:"apo-diagnose",peer_agent_role:"diagnostic",msg:"[DIAGNOSTIC] Test message from apo diagnose"}),i.testChatSent=!0,fmt.ok("Test agentChat sent")},1e3),setTimeout(()=>c(),5e3)}),n.on("transcript",e=>{i.transcriptsReceived++,fmt.ok(`Transcript received: "${(e.text||"").slice(0,60)}..." from ${e.peer_name}`)}),n.on("agentChat",e=>{i.agentChatsReceived++,e.msg&&e.msg.includes("[DIAGNOSTIC]")&&(i.testChatEcho=!0),fmt.ok(`agentChat received: "${(e.msg||"").slice(0,60)}..." from ${e.peer_name}`)}),n.on("peerAction",e=>{"startNotetaker"===e.action&&fmt.ok("startNotetaker peerAction received (auto-notetaker triggered)")}),n.on("unauthorized",()=>{i.errors.push("unauthorized — room requires auth token"),fmt.err("Unauthorized — room requires peer_token")}),n.on("connect_error",e=>{i.errors.push(`connect_error: ${e.message}`),fmt.err(`Connection error: ${e.message}`),c("connect_error")}),n.on("disconnect",e=>{i.joined||(i.errors.push(`disconnected before join: ${e}`),fmt.err(`Disconnected: ${e}`))})})}async function httpDiagnose(e,t,o,n){console.log(" HTTP-only diagnostics (no Socket.IO client)\n");try{const n=await e.roomStatus(t);fmt.ok(`Room found: ${n.title||t}`),console.log(` Status: ${n.status}`),console.log(` Participants: ${(n.participants||[]).length}`),o&&console.log(JSON.stringify(n,null,2))}catch(e){fmt.err(`Room status failed: ${e.message}`)}try{const t=await e.status();fmt.ok(`Platform: v${t.version} — ${t.available?"online":"offline"}`)}catch(e){fmt.err(`Status failed: ${e.message}`)}}module.exports={run:run};
1
+ const fmt=require("../format");async function run(e,o,n,t){const s=o[0];s||(fmt.err("Usage: apo diagnose ROOM_ID"),process.exit(1));const r={roomId:s,baseUrl:t.baseUrl,platform:null,room:null,participants:[],agentPeers:[],humanPeers:[],checks:{},errors:[]};console.log(`\n Diagnosing room ${s} on ${t.baseUrl}\n`);try{const o=await e.status();r.platform=o,r.checks.platformOnline=!0,fmt.ok(`Platform: v${o.version} — online`)}catch(e){r.checks.platformOnline=!1,r.errors.push(`Platform: ${e.message}`),fmt.err(`Platform offline: ${e.message}`)}try{const o=await e.roomStatus(s);r.room=o,r.checks.roomFound=!0,fmt.ok(`Room: ${o.title||s}`),console.log(` Status: ${o.status||"unknown"}`);const n=o.participants||[];r.participants=n,r.agentPeers=n.filter(e=>"agent"===e.peer_type),r.humanPeers=n.filter(e=>"agent"!==e.peer_type||!e.peer_type),n.length?(console.log(` Participants: ${n.length}`),n.forEach(e=>{const o="agent"===e.peer_type?`[${e.peer_agent_role||"agent"}]`:"[human]";console.log(` ${o} ${e.peer_name||e.name||"?"}`)})):console.log(" Participants: 0 (room may be empty or SDK does not track live peers)")}catch(e){r.checks.roomFound=!1,r.errors.push(`Room: ${e.message}`),fmt.err(`Room not found: ${e.message}`)}try{const o=await e.events(),n=Array.isArray(o)?o:o?.eventTypes||[];r.checks.eventsEndpoint=!0,fmt.ok(`Events endpoint: ${n.length} event type(s)`)}catch(e){r.checks.eventsEndpoint=!1,r.errors.push(`Events: ${e.message}`),fmt.err(`Events endpoint: ${e.message}`)}try{const o=await e.voices();r.checks.ttsEndpoint=!0;const n=o.primary||"unknown";fmt.ok(`TTS: ${n} (${(o.agentVoices||[]).length} CxO voices)`)}catch(e){r.checks.ttsEndpoint=!1,r.errors.push(`TTS: ${e.message}`),fmt.err(`TTS endpoint: ${e.message}`)}try{const o=await e.listRooms(),n=Array.isArray(o)?o:o?.rooms||[];r.checks.roomsEndpoint=!0,fmt.ok(`Rooms endpoint: ${n.length} active room(s)`)}catch(e){r.checks.roomsEndpoint=!1,r.errors.push(`Rooms: ${e.message}`),fmt.err(`Rooms endpoint: ${e.message}`)}console.log("\n ── Diagnosis ──\n"),[["Platform online",r.checks.platformOnline],["Room found",r.checks.roomFound],["Agent peers in room",r.agentPeers.length>0],["Human peers in room",r.humanPeers.length>0],["Events endpoint (scheduling)",r.checks.eventsEndpoint],["TTS endpoint (assistant.bz)",r.checks.ttsEndpoint],["Rooms endpoint (getMeetingsByHost)",r.checks.roomsEndpoint]].forEach(([e,o])=>{console.log(` ${o?"✓":"✗"} ${e}`)}),r.errors.length&&(console.log("\n Errors:"),r.errors.forEach(e=>console.log(` ✗ ${e}`))),console.log("\n ── Agent Meeting Chain ──\n"),console.log(" Human speaks → GroqSTT → onTranscript → signalingSocket.emit(transcript)"),console.log(" → server socket.on(transcript) → io.to(agentSid).emit(transcript)"),console.log(" → agent MeetingClient receives → h-conductor processes"),console.log(" → agent socket.emit(agentChat) → server broadcasts → ai-chatBox panel"),console.log(""),console.log(" Human types in AI chat → tygaAIChat → server checks for agent peers"),console.log(" → if agent: relay via transcript event → agent responds via agentChat"),console.log(" → if no agent: SDK AI Chat (OpenAI fallback)"),console.log(""),n&&console.log(JSON.stringify(r,null,2))}module.exports={run:run};
@@ -0,0 +1 @@
1
+ const fmt=require("../format");function run(e,o){const n={renderer:"MessageRenderer + marked.js",panel:"ai-chatBox (auto-opens when agent joins)",roleColors:{CFO:"#10B981 (green)",CTO:"#F59E0B (orange)",CMO:"#3B82F6 (blue)",CCO:"#8B5CF6 (purple)",CSO:"#EF4444 (red)",CLO:"#6366F1 (indigo)"},markdown:{bold:"**text** → <strong>",italic:"*text* → <em>",headers:"## H2, ### H3 — section titles",tables:"| Col | Col | — financial data, comparisons",bulletLists:"- item — action items, recommendations",numberedLists:"1. step — processes, priorities",codeBlocks:"```code``` — syntax highlighted",inlineCode:"`metric` — KPI names, endpoints",links:"[text](url) — references to docs/dashboards"},richMedia:{images:"![alt](url) — inline images, chart screenshots",tables:"sortable data tables (TableMessageType)",charts:"Chart.js (ChartMessageType)",plots:"Plotly visualizations (PlotMessageType)"},styling:{background:"dark (rgba(0,0,0,0.3))",text:"light (#e0e0e0)",font:"0.9rem, line-height 1.5",wordWrap:"break-word",borderLeft:"3px solid <roleColor>"},agentChatEvent:{emit:"socket.emit('agentChat', { peer_name, peer_agent_role, msg })",msgFormat:"Plain text or markdown — rendered via marked.parse()",maxLength:"No hard limit, but keep under 2000 chars for readability"},examples:{cfo:"**Burn rate:** ~$100/mo\\n| Metric | Y1 | Y2 |\\n|---|---|---|\\n| ARR | $477K | $2.87M |",cmo:"Our GTM is **Agent-Led Growth** across 5 channels:\\n- npm discovery\\n- GitHub presence\\n- Cross-agent referral",cto:'Stack: `Node.js` + `Socket.IO` + `WebRTC`\\n```js\\napo room "Standup"\\n```'}};o?console.log(JSON.stringify(n,null,2)):(console.log("\nAppoiint Meeting Chat Renderer\n"),console.log(" Panel: ai-chatBox (auto-opens when agent joins)"),console.log(" Renderer: MessageRenderer + marked.js\n"),console.log("Role Colors:"),Object.entries(n.roleColors).forEach(([e,o])=>{console.log(` ${e.padEnd(6)} ${o}`)}),console.log("\nMarkdown (via marked.parse):"),Object.entries(n.markdown).forEach(([e,o])=>{console.log(` ${e.padEnd(16)} ${o}`)}),console.log("\nRich Media:"),Object.entries(n.richMedia).forEach(([e,o])=>{console.log(` ${e.padEnd(16)} ${o}`)}),console.log("\nStyling:"),Object.entries(n.styling).forEach(([e,o])=>{console.log(` ${e.padEnd(16)} ${o}`)}),console.log("\nagentChat Event:"),console.log(" socket.emit('agentChat', { peer_name, peer_agent_role, msg })"),console.log(" msg: plain text or markdown — rendered via marked.parse()"),console.log("\nExamples:"),console.log("\n CFO:"),console.log(" **Burn rate:** ~$100/mo"),console.log(" | Metric | Y1 | Y2 |"),console.log(" |---|---|---|"),console.log(" | ARR | $477K | $2.87M |"),console.log("\n CMO:"),console.log(" Our GTM is **Agent-Led Growth** across 5 channels:"),console.log(" - npm discovery"),console.log(" - GitHub presence"),console.log("\n CTO:"),console.log(" Stack: `Node.js` + `Socket.IO` + `WebRTC`"),console.log(""))}module.exports={run:run};
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"],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\nDiagnostics:\n apo diagnose ROOM_ID Full room diagnostic (peers, events, relay)\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"diagnose":return require("./commands/diagnose").run(client,subArgs,jsonMode,config);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)});
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"],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\nDiagnostics:\n apo diagnose ROOM_ID Full room diagnostic (peers, events, relay)\n\nManual:\n apo man renderer Chat bubble renderer capabilities + formats\n apo renderer Same as above (shorthand)\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"diagnose":return require("./commands/diagnose").run(client,subArgs,jsonMode,config);case"man":case"renderer":const e="man"===command?subArgs[0]:command;return"renderer"===e?require("./commands/renderer").run(subArgs.slice("man"===command?1:0),jsonMode):void fmt.err("Unknown manual page: "+(e||"(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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appoiint",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
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"