{"_id":"@atel-callcenter/sdk","_rev":"6-319004234b57286b67055015fa1d6462","name":"@atel-callcenter/sdk","dist-tags":{"latest":"2.0.8"},"versions":{"1.0.0":{"name":"@atel-callcenter/sdk","version":"1.0.0","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","_id":"@atel-callcenter/sdk@1.0.0","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"homepage":"https://github.com/julsu2905/livekit-prototype#readme","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"dist":{"shasum":"ad76fdf719a0759d11b28402e70ee9b23a9be82b","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-1.0.0.tgz","fileCount":48,"integrity":"sha512-Y93iG9S/2jBLANq08kKPSIdUpQfDoCs36y/KNqU0bxKei42dYhGZU+JV+PU2/O9hDYWfropTwN2wB7hfuaVM7Q==","signatures":[{"sig":"MEUCIHzVYZsjFyoF6AmxfN2feuGh8FWPsko7KvIM9fIJfQIrAiEAhToSwbN+UyxxHUN2obWVep5fUBZodCscJtZa4Ts1NB8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51844},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./agent":"./dist/agent/index.js","./shared":"./dist/shared/index.js","./customer":"./dist/customer/index.js","./react/agent":"./dist/adapters/react/agent/index.js","./react/customer":"./dist/adapters/react/customer/index.js"},"gitHead":"15e3ebe0ed59edc23fad980fab449339629ddd78","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch"},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"repository":{"url":"git+https://github.com/julsu2905/livekit-prototype.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.8.2","description":"ATEL Call Center SDK - Unified package with shared core, agent, customer, and React adapters","directories":{},"_nodeVersion":"20.19.0","dependencies":{"socket.io-client":"^4.8.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.7.3","@types/node":"^22.10.5","@types/react":"^19.0.6"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1767676292064_0.09863639796507817","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@atel-callcenter/sdk","version":"2.0.0","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","_id":"@atel-callcenter/sdk@2.0.0","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"homepage":"https://github.com/julsu2905/livekit-prototype#readme","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"dist":{"shasum":"6e6e6c30bbac1c22d507d6e294d0a6ba53a09b9b","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-2.0.0.tgz","fileCount":62,"integrity":"sha512-Wwis3dbRCzrNWqvou3jRnOIuyv9sZZX9EntyQLAFieLsR4B+SlyBiAPGWYHvu0D65LLHUhelRA+V/cJdAmerhQ==","signatures":[{"sig":"MEUCIA/6tfZ1/WW1dq2+R9spRwcX0ZC1/FJfOGE5uFoktaduAiEA5QSkDyLzohCPsQ3F8jSAROFjbAUeqQ3OxaFe231+Smg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105822},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./core":"./dist/core/index.js","./agent":"./dist/agent/index.js","./shared":"./dist/shared/index.js","./customer":"./dist/customer/index.js","./core/state":"./dist/core/state.js","./core/events":"./dist/core/events.js","./react/agent":"./dist/adapters/react/agent/index.js","./adapters/web":"./dist/adapters/web/index.js","./core/AgentCore":"./dist/core/AgentCore.js","./react/customer":"./dist/adapters/react/customer/index.js","./core/CustomerCore":"./dist/core/CustomerCore.js","./core/media-adapter":"./dist/core/media-adapter.js"},"gitHead":"75cd2060fe27ca46b6faf5f6ff880a4da3c18168","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch"},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"repository":{"url":"git+https://github.com/julsu2905/livekit-prototype.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.8.2","description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","directories":{},"_nodeVersion":"20.19.0","dependencies":{"socket.io-client":"^4.8.3","@livekit/components-react":"^2.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.7.3","@types/node":"^22.10.5","@types/react":"^19.0.6"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.0.0_1767689660439_0.35836465282919105","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@atel-callcenter/sdk","version":"2.0.1","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","_id":"@atel-callcenter/sdk@2.0.1","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"homepage":"https://github.com/julsu2905/livekit-prototype#readme","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"dist":{"shasum":"5c7291fd635e1d60b74cd4854b9ffb914ec4a947","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-2.0.1.tgz","fileCount":62,"integrity":"sha512-FbEYKIg7W/QYFCGPzkm3TWiuusJm8jRZDdWU0JhXdhW9cJ1iNgX6kI5C9K+metO70q+bU8qkE6I707xmgsbfVA==","signatures":[{"sig":"MEUCIQDn9IiEoHyS7vvIoe0zfY5l8cW4eKnIHehqaFZMEcEZLgIgYzJLIN5DtuMVcXAI4Sg4i6QzYKXuZ1dgE6nvJjtCBho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106958},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./core":"./dist/core/index.js","./agent":"./dist/agent/index.js","./shared":"./dist/shared/index.js","./customer":"./dist/customer/index.js","./core/state":"./dist/core/state.js","./core/events":"./dist/core/events.js","./react/agent":"./dist/adapters/react/agent/index.js","./adapters/web":"./dist/adapters/web/index.js","./core/AgentCore":"./dist/core/AgentCore.js","./react/customer":"./dist/adapters/react/customer/index.js","./core/CustomerCore":"./dist/core/CustomerCore.js","./core/media-adapter":"./dist/core/media-adapter.js"},"gitHead":"75cd2060fe27ca46b6faf5f6ff880a4da3c18168","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch"},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"repository":{"url":"git+https://github.com/julsu2905/livekit-prototype.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.8.2","description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","directories":{},"_nodeVersion":"20.19.0","dependencies":{"socket.io-client":"^4.8.3","@livekit/components-react":"^2.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.7.3","@types/node":"^22.10.5","@types/react":"^19.0.6"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.0.1_1767690804116_0.5407747902009374","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@atel-callcenter/sdk","version":"2.0.4","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","_id":"@atel-callcenter/sdk@2.0.4","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"homepage":"https://github.com/julsu2905/livekit-prototype#readme","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"dist":{"shasum":"8b1f1e4e3b3e953c72119ca4cfa3da6db103484b","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-2.0.4.tgz","fileCount":62,"integrity":"sha512-Ir317CLd+ia06MCY/uNu7uYVVZY9gvkU1DHgivhijPxbuUO+LGJxww8HSfR53oxd0gornWklcI/G2IZT98PWPw==","signatures":[{"sig":"MEUCIAvhQ3tjbGBFatckMwMxFoClmi9wMkr4yCVSHF0loVGbAiEAs2Ofgu4VZO3SdRV1LVLPJ7eooH+v4121v0rMtvkjrog=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108092},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./core":"./dist/core/index.js","./agent":"./dist/agent/index.js","./shared":"./dist/shared/index.js","./customer":"./dist/customer/index.js","./core/state":"./dist/core/state.js","./core/events":"./dist/core/events.js","./react/agent":"./dist/adapters/react/agent/index.js","./adapters/web":"./dist/adapters/web/index.js","./core/AgentCore":"./dist/core/AgentCore.js","./react/customer":"./dist/adapters/react/customer/index.js","./core/CustomerCore":"./dist/core/CustomerCore.js","./core/media-adapter":"./dist/core/media-adapter.js"},"gitHead":"75cd2060fe27ca46b6faf5f6ff880a4da3c18168","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch"},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"repository":{"url":"git+https://github.com/julsu2905/livekit-prototype.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.8.2","description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","directories":{},"_nodeVersion":"20.19.0","dependencies":{"socket.io-client":"^4.8.3","@livekit/components-react":"^2.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.7.3","@types/node":"^22.10.5","@types/react":"^19.0.6"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.0.4_1767691855693_0.9915430818156894","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@atel-callcenter/sdk","version":"2.0.5","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","_id":"@atel-callcenter/sdk@2.0.5","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"homepage":"https://github.com/julsu2905/livekit-prototype#readme","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"dist":{"shasum":"0ce8a03510e82cb7fa931ca791363f95ffe360f9","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-2.0.5.tgz","fileCount":62,"integrity":"sha512-D3RSuVeT/hFkwNiQUVMYOsYbkK6yxEBxmaL8ZLacP9ZdaLy8eCGuKUnLqjnEbELPq1Jbr4KubKWhX7Z2U+EccA==","signatures":[{"sig":"MEQCIGxBTvduyahc/HVkucR1I2npUBdbEmimNJIkFAiVw4cWAiAMMfHw4cBhduSRmtoBa0FGKIcypS9wEVCzKN16MnE4pA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108144},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./core":"./dist/core/index.js","./agent":"./dist/agent/index.js","./shared":"./dist/shared/index.js","./customer":"./dist/customer/index.js","./core/state":"./dist/core/state.js","./core/events":"./dist/core/events.js","./react/agent":"./dist/adapters/react/agent/index.js","./adapters/web":"./dist/adapters/web/index.js","./core/AgentCore":"./dist/core/AgentCore.js","./react/customer":"./dist/adapters/react/customer/index.js","./core/CustomerCore":"./dist/core/CustomerCore.js","./core/media-adapter":"./dist/core/media-adapter.js"},"gitHead":"75cd2060fe27ca46b6faf5f6ff880a4da3c18168","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch"},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"repository":{"url":"git+https://github.com/julsu2905/livekit-prototype.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.8.2","description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","directories":{},"_nodeVersion":"20.19.0","dependencies":{"socket.io-client":"^4.8.3","@livekit/components-react":"^2.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.7.3","@types/node":"^22.10.5","@types/react":"^19.0.6"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.0.5_1767693198116_0.9297557852997684","host":"s3://npm-registry-packages-npm-production"}},"2.0.8":{"name":"@atel-callcenter/sdk","version":"2.0.8","description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","watch":"tsc --watch","clean":"rm -rf dist"},"keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"author":"","license":"MIT","dependencies":{"socket.io-client":"^4.8.3","@livekit/components-react":"^2.7.3"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"devDependencies":{"@types/node":"^22.10.5","@types/react":"^19.0.6","react":"^19.0.0","typescript":"^5.7.3"},"repository":{"type":"git","url":"git+https://github.com/julsu2905/livekit-prototype.git","directory":"packages/sdk"},"publishConfig":{"access":"public"},"exports":{".":"./dist/index.js","./core":"./dist/core/index.js","./core/events":"./dist/core/events.js","./core/media-adapter":"./dist/core/media-adapter.js","./core/state":"./dist/core/state.js","./core/CustomerCore":"./dist/core/CustomerCore.js","./core/AgentCore":"./dist/core/AgentCore.js","./adapters/web":"./dist/adapters/web/index.js","./react/agent":"./dist/adapters/react/agent/index.js","./react/customer":"./dist/adapters/react/customer/index.js","./shared":"./dist/shared/index.js","./agent":"./dist/agent/index.js","./customer":"./dist/customer/index.js"},"_id":"@atel-callcenter/sdk@2.0.8","gitHead":"75cd2060fe27ca46b6faf5f6ff880a4da3c18168","bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"homepage":"https://github.com/julsu2905/livekit-prototype#readme","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-ouYHrRmsTeEGA6tqiggVpZFT11iPaDqZOrqcjXeRucSYWjoOS0hSAHcoG0T6t00uyvD67tw19kI5kTuW8WUJ4Q==","shasum":"e15c188888e7388b7aa415ee3be92a4a610d1de1","tarball":"https://registry.npmjs.org/@atel-callcenter/sdk/-/sdk-2.0.8.tgz","fileCount":64,"unpackedSize":114925,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAZRuSKMDGcEpD8gGf3LmJsbSQBog6ckrC1393DJUN3WAiEAjw2nfluZdfWX97/YD/88Lq1W0PJgqFtI9Gswx+Iu8kQ="}]},"_npmUser":{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"},"directories":{},"maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_2.0.8_1767695891591_0.14582603678519201"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-06T05:11:31.912Z","modified":"2026-01-06T10:38:11.973Z","1.0.0":"2026-01-06T05:11:32.202Z","2.0.0":"2026-01-06T08:54:20.577Z","2.0.1":"2026-01-06T09:13:24.321Z","2.0.4":"2026-01-06T09:30:55.847Z","2.0.5":"2026-01-06T09:53:18.258Z","2.0.8":"2026-01-06T10:38:11.772Z"},"bugs":{"url":"https://github.com/julsu2905/livekit-prototype/issues"},"license":"MIT","homepage":"https://github.com/julsu2905/livekit-prototype#readme","keywords":["livekit","call-center","sdk","agent","customer","react","websocket","socketio"],"repository":{"type":"git","url":"git+https://github.com/julsu2905/livekit-prototype.git","directory":"packages/sdk"},"description":"ATEL Call Center SDK V2 - Framework and media-provider agnostic core with adapters for React and LiveKit","maintainers":[{"name":"kurokami2905","email":"hao.lynhat2905@gmail.com"}],"readme":"# ATEL Call Center SDK v2\n\n**Framework and Media Provider Agnostic Call Center SDK**\n\nA modern TypeScript SDK for building queue-based video call applications with clean separation between business logic (Core) and platform implementations (Adapters).\n\n## 🏗️ Architecture\n\nThe SDK follows a strict **CORE/ADAPTER** pattern:\n\n```\nsdk-ts/\n ├─ core/                    # ✅ Framework & Media Agnostic\n │   ├─ events.ts            # Strongly-typed event system\n │   ├─ media-adapter.ts     # MediaAdapter interface\n │   ├─ state.ts             # Call state machine\n │   ├─ CustomerCore.ts      # Customer business logic\n │   └─ AgentCore.ts         # Agent business logic\n │\n ├─ adapters/\n │   ├─ web/                 # Web platform adapters\n │   │   └─ livekit/         # LiveKit media provider\n │   └─ react/               # React framework adapters\n │       ├─ customer/        # Customer React hooks\n │       └─ agent/           # Agent React hooks\n │\n └─ shared/                  # Shared utilities (sockets, etc)\n```\n\n### Core Principles\n\n1. **Core SDK is Framework-Agnostic**: NO React, NO browser APIs\n2. **Core SDK is Media-Agnostic**: NO LiveKit, NO Agora, NO Twilio\n3. **Dependency Injection**: Adapters are injected via factory pattern\n4. **Strongly-Typed Events**: All events use discriminated unions\n5. **State Machine**: Call lifecycle managed with validated transitions\n\n## 📦 Installation\n\n```bash\nnpm install @atel-callcenter/sdk\n# or\nyarn add @atel-callcenter/sdk\n```\n\n## 🚀 Quick Start\n\n### Customer (React + LiveKit)\n\n```tsx\nimport {\n  CustomerProvider,\n  useCustomer,\n} from '@atel-callcenter/sdk/react/customer';\n\nfunction App() {\n  return (\n    <CustomerProvider config={{ url: 'http://localhost:3000' }}>\n      <CustomerInterface />\n    </CustomerProvider>\n  );\n}\n\nfunction CustomerInterface() {\n  const customer = useCustomer();\n\n  const handleCall = async () => {\n    await customer.requestCall({\n      name: 'Jane Doe',\n      queueId: 'sales',\n    });\n  };\n\n  return (\n    <div>\n      <p>Status: {customer.currentCallState}</p>\n      {customer.currentCallState === 'idle' && (\n        <button onClick={handleCall}>Request Call</button>\n      )}\n      {customer.currentCallState === 'in-call' && (\n        <button onClick={() => customer.endCall()}>End Call</button>\n      )}\n    </div>\n  );\n}\n```\n\n### Agent (React + LiveKit)\n\n```tsx\nimport { AgentProvider, useAgent } from '@atel-callcenter/sdk/react/agent';\n\nfunction App() {\n  return (\n    <AgentProvider config={{ url: 'http://localhost:3000' }}>\n      <AgentDashboard />\n    </AgentProvider>\n  );\n}\n\nfunction AgentDashboard() {\n  const agent = useAgent();\n\n  useEffect(() => {\n    agent.register({\n      agentId: 'agent-123',\n      agentName: 'John Smith',\n      queueIds: ['sales', 'support'],\n    });\n  }, []);\n\n  const handleAccept = () => {\n    agent.acceptCall();\n  };\n\n  const handleReject = () => {\n    agent.rejectCall('Not available');\n  };\n\n  return (\n    <div>\n      <p>Status: {agent.status}</p>\n      {agent.incomingCall && (\n        <div>\n          <p>Call from: {agent.incomingCall.customerName}</p>\n          <button onClick={handleAccept}>Accept</button>\n          <button onClick={handleReject}>Reject</button>\n        </div>\n      )}\n      {agent.currentCallState === 'in-call' && (\n        <button onClick={() => agent.endCall()}>End Call</button>\n      )}\n    </div>\n  );\n}\n```\n\n````\n\n## 📖 Advanced Usage\n\n### Using Core SDK Directly (Framework-Agnostic)\n\nFor non-React applications or custom integrations:\n\n```typescript\nimport { CustomerClient } from '@atel-callcenter/sdk/core/CustomerCore';\nimport { createLiveKitAdapter } from '@atel-callcenter/sdk/adapters/web';\n\n// Create customer client with LiveKit adapter\nconst customer = new CustomerClient({\n  url: 'http://localhost:3000',\n  mediaAdapterFactory: createLiveKitAdapter,\n});\n\n// Listen to strongly-typed events\ncustomer.on('CALL_ACCEPTED', (event) => {\n  console.log('Call accepted:', event.ticketId);\n  console.log('Media info:', event.media);\n});\n\ncustomer.on('MEDIA_READY', () => {\n  console.log('Media connection ready');\n});\n\ncustomer.on('CALL_ENDED', (event) => {\n  console.log('Call ended:', event.reason);\n});\n\n// Connect and request call\ncustomer.connect();\nawait customer.requestCall({\n  name: 'Jane Doe',\n  queueId: 'sales',\n});\n````\n\n### Custom Media Adapter\n\nImplement `MediaAdapter` interface for other providers (Agora, Twilio, etc):\n\n```typescript\nimport {\n  MediaAdapter,\n  MediaInfo,\n} from '@atel-callcenter/sdk/core/media-adapter';\n\nexport class AgoraMediaAdapter implements MediaAdapter {\n  private client: AgoraRTCClient | null = null;\n\n  async connect(mediaInfo: MediaInfo): Promise<void> {\n    // Implement Agora connection logic\n    this.client = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' });\n    await this.client.join(\n      mediaInfo.roomUrl,\n      mediaInfo.roomName,\n      mediaInfo.token,\n    );\n    this.onReadyCallback?.();\n  }\n\n  async disconnect(): Promise<void> {\n    await this.client?.leave();\n    this.client = null;\n  }\n\n  onReady(callback: () => void): void {\n    this.onReadyCallback = callback;\n  }\n\n  // ... implement other methods\n}\n\n// Use custom adapter\nconst customer = new CustomerClient({\n  url: 'http://localhost:3000',\n  mediaAdapterFactory: () => new AgoraMediaAdapter(),\n});\n```\n\n### Event System\n\nAll events are strongly-typed discriminated unions:\n\n```typescript\nimport type { CallEvent } from '@atel-callcenter/sdk/core/events';\n\ncustomer.on('CALL_ACCEPTED', (event) => {\n  // TypeScript knows this is CallAcceptedEvent\n  console.log(event.ticketId);\n  console.log(event.media.provider); // 'livekit'\n  console.log(event.media.roomUrl);\n});\n\ncustomer.on('ERROR', (event) => {\n  // TypeScript knows this is ErrorEvent\n  console.log(event.code);\n  console.log(event.message);\n});\n```\n\n## 🔄 Call State Machine\n\nThe SDK manages call lifecycle through a state machine:\n\n```\nidle → requesting → ringing → connecting → in-call → ending → ended\n                                                            ↓\n                                                          failed\n```\n\nAccess current state:\n\n```typescript\nconsole.log(customer.currentCallState); // 'idle' | 'requesting' | ...\nconsole.log(agent.currentCallState);\n```\n\n## 📚 API Reference\n\n### CustomerClient\n\n**Constructor:**\n\n- `new CustomerClient(config: CustomerConfig)`\n\n**Methods:**\n\n- `connect(): void` - Connect to signaling server\n- `disconnect(): Promise<void>` - Disconnect and cleanup\n- `requestCall(request: CallRequest): Promise<void>` - Request a call\n- `endCall(): Promise<void>` - End current call\n\n**Properties:**\n\n- `currentCallState: CallState` - Current call state\n- `ticketId?: string` - Current ticket ID\n- `queueId?: string` - Current queue ID\n- `name?: string` - Customer name\n\n**Events:**\n\n- `CALL_REQUESTED` - Call request sent\n- `CALL_RINGING` - Waiting for agent\n- `CALL_ACCEPTED` - Agent accepted, media info provided\n- `CALL_REJECTED` - Agent rejected call\n- `CALL_ENDED` - Call ended by either party\n- `MEDIA_READY` - Media connection established\n- `MEDIA_DISCONNECTED` - Media connection lost\n- `ERROR` - Error occurred\n\n### AgentClient\n\n**Constructor:**\n\n- `new AgentClient(config: AgentConfig)`\n\n**Methods:**\n\n- `connect(): void` - Connect to signaling server\n- `disconnect(): Promise<void>` - Disconnect and cleanup\n- `register(registration: AgentRegistration): Promise<void>` - Register as agent\n- `unregister(): Promise<void>` - Unregister agent\n- `acceptCall(): Promise<void>` - Accept incoming call\n- `rejectCall(reason?: string): void` - Reject incoming call\n- `endCall(): Promise<void>` - End current call\n\n**Properties:**\n\n- `status: AgentStatus` - 'offline' | 'available' | 'busy'\n- `currentCallState: CallState` - Current call state\n- `agentId?: string` - Agent ID\n- `agentName?: string` - Agent name\n- `queueIds: string[]` - Registered queue IDs\n- `incomingCall?: IncomingCallData` - Incoming call info\n\n**Events:**\n\n- Same as CustomerClient, plus legacy events for backward compatibility\n\n## 🎯 Migration from v1\n\nIf upgrading from SDK v1:\n\n1. **Import Paths Changed:**\n\n   ```typescript\n   // Before\n   import { CustomerCore } from '@atel-callcenter/sdk/customer';\n\n   // After\n   import { CustomerClient } from '@atel-callcenter/sdk/core/CustomerCore';\n   // Or use React adapters (recommended)\n   import { useCustomer } from '@atel-callcenter/sdk/react/customer';\n   ```\n\n2. **Event Names Changed:**\n\n   ```typescript\n   // Before\n   customer.on('callAccepted', ...);\n\n   // After\n   customer.on('CALL_ACCEPTED', ...); // Strongly-typed\n   ```\n\n3. **Media Adapter Required:**\n\n   ```typescript\n   // Before - LiveKit was hardcoded\n   const customer = new CustomerCore({ url: '...' });\n\n   // After - Inject media adapter\n   const customer = new CustomerClient({\n     url: '...',\n     mediaAdapterFactory: createLiveKitAdapter,\n   });\n   // Or use React Provider (handles this automatically)\n   ```\n\n## 🛠️ Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Watch mode\nnpm run watch\n\n# Clean\nnpm run clean\n```\n\n## 📄 License\n\nMIT\n\n// Customer\nimport { CustomerCore } from '@atel-callcenter/sdk/customer';\n\nconst customer = new CustomerCore({ url: 'http://localhost:3000' });\n\ncustomer.on('callAccepted', (data) => {\nconsole.log('Connected to:', data.agentName);\n});\n\ncustomer.connect();\nawait customer.requestCall({\ncustomerName: 'Customer Name',\nqueueId: 'sales',\n});\n\n```\n\n## Package Exports\n\n- `@atel-callcenter/sdk` - Main entry (exports all)\n- `@atel-callcenter/sdk/shared` - Shared core only\n- `@atel-callcenter/sdk/agent` - Agent core only\n- `@atel-callcenter/sdk/customer` - Customer core only\n- `@atel-callcenter/sdk/react/agent` - React agent adapter\n- `@atel-callcenter/sdk/react/customer` - React customer adapter\n\n## Design Principles\n\n1. **Shared Core** - Only low-level infrastructure (socket, events, types)\n2. **Role Separation** - Agent and Customer logic completely independent\n3. **Framework Agnostic** - Cores work with any framework\n4. **Adapter Pattern** - React adapters manage lifecycle and provide hooks\n5. **Clean Dependencies** - No circular deps, no role-based conditionals\n```\n","readmeFilename":"README.md"}