obi-sdk 0.3.1 → 0.3.3

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.
@@ -0,0 +1,59 @@
1
+ import { O as ObiWidget } from "./chunks/obi-widget-93253f25.js";
2
+ import "./chunks/types-82772f00.js";
3
+ if (!customElements.get("obi-widget")) {
4
+ customElements.define("obi-widget", ObiWidget);
5
+ }
6
+ function mountSDK() {
7
+ const w = window;
8
+ if (typeof w.ObiSDK === "function" || typeof w.ObiSDK === "object") {
9
+ return;
10
+ }
11
+ w.ObiSDK = function(command, config) {
12
+ if (command === "update" && config) {
13
+ w.obiWidgetConfig = {
14
+ ...w.obiWidgetConfig,
15
+ ...config
16
+ };
17
+ }
18
+ };
19
+ w.ObiSDK.q = [];
20
+ }
21
+ function mountWidget() {
22
+ if (!document.querySelector("obi-widget")) {
23
+ const widget = document.createElement("obi-widget");
24
+ document.body.appendChild(widget);
25
+ console.log("Obi Widget mounted");
26
+ }
27
+ }
28
+ function processQueue() {
29
+ const w = window;
30
+ if (w.ObiSDK && Array.isArray(w.ObiSDK.q)) {
31
+ w.ObiSDK.q.forEach((args) => {
32
+ const [command, config] = args;
33
+ if (command === "update" && config) {
34
+ w.obiWidgetConfig = {
35
+ ...w.obiWidgetConfig,
36
+ ...config
37
+ };
38
+ }
39
+ });
40
+ w.ObiSDK.q = [];
41
+ }
42
+ }
43
+ function loadFonts() {
44
+ const link = document.createElement("link");
45
+ link.href = "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Syne:wght@400..800&display=swap";
46
+ link.rel = "stylesheet";
47
+ document.head.appendChild(link);
48
+ }
49
+ function initializeObiWidget() {
50
+ loadFonts();
51
+ mountSDK();
52
+ mountWidget();
53
+ processQueue();
54
+ }
55
+ initializeObiWidget();
56
+ export {
57
+ ObiWidget
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/core/init.ts"],"sourcesContent":["import { ObiWidget } from \"../ui/components/obi-widget\"\n\nif (!customElements.get(\"obi-widget\")) {\n customElements.define(\"obi-widget\", ObiWidget)\n}\n\nfunction mountSDK(): void {\n const w = window as any\n if (typeof w.ObiSDK === \"function\" || typeof w.ObiSDK === \"object\") {\n return\n }\n\n // Initialize the SDK\n w.ObiSDK = function (command: string, config?: any) {\n if (command === \"update\" && config) {\n w.obiWidgetConfig = {\n ...w.obiWidgetConfig,\n ...config,\n }\n }\n }\n w.ObiSDK.q = []\n}\n\n// Mount the widget if not already present\nfunction mountWidget() {\n if (!document.querySelector(\"obi-widget\")) {\n const widget = document.createElement(\"obi-widget\")\n document.body.appendChild(widget)\n console.log(\"Obi Widget mounted\")\n }\n}\n\n// Optionally process a queue if you want to support it\nfunction processQueue() {\n const w = window as any\n if (w.ObiSDK && Array.isArray(w.ObiSDK.q)) {\n // Process each command in the queue\n w.ObiSDK.q.forEach((args: any[]) => {\n const [command, config] = args\n if (command === \"update\" && config) {\n w.obiWidgetConfig = {\n ...w.obiWidgetConfig,\n ...config,\n }\n }\n })\n w.ObiSDK.q = []\n }\n}\n\nfunction loadFonts() {\n const link = document.createElement(\"link\")\n link.href =\n \"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Syne:wght@400..800&display=swap\"\n link.rel = \"stylesheet\"\n document.head.appendChild(link)\n}\n\n// Main init\nexport function initializeObiWidget() {\n loadFonts()\n mountSDK()\n mountWidget()\n processQueue()\n}\n\n// Auto-initialize\ninitializeObiWidget()\n"],"names":[],"mappings":";;AAEA,IAAI,CAAC,eAAe,IAAI,YAAY,GAAG;AACtB,iBAAA,OAAO,cAAc,SAAS;AAC/C;AAEA,SAAS,WAAiB;AACxB,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,cAAc,OAAO,EAAE,WAAW,UAAU;AAClE;AAAA,EACF;AAGE,IAAA,SAAS,SAAU,SAAiB,QAAc;AAC9C,QAAA,YAAY,YAAY,QAAQ;AAClC,QAAE,kBAAkB;AAAA,QAClB,GAAG,EAAE;AAAA,QACL,GAAG;AAAA,MAAA;AAAA,IAEP;AAAA,EAAA;AAEA,IAAA,OAAO,IAAI;AACf;AAGA,SAAS,cAAc;AACrB,MAAI,CAAC,SAAS,cAAc,YAAY,GAAG;AACnC,UAAA,SAAS,SAAS,cAAc,YAAY;AACzC,aAAA,KAAK,YAAY,MAAM;AAChC,YAAQ,IAAI,oBAAoB;AAAA,EAClC;AACF;AAGA,SAAS,eAAe;AACtB,QAAM,IAAI;AACV,MAAI,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,CAAC,GAAG;AAEzC,MAAE,OAAO,EAAE,QAAQ,CAAC,SAAgB;AAC5B,YAAA,CAAC,SAAS,MAAM,IAAI;AACtB,UAAA,YAAY,YAAY,QAAQ;AAClC,UAAE,kBAAkB;AAAA,UAClB,GAAG,EAAE;AAAA,UACL,GAAG;AAAA,QAAA;AAAA,MAEP;AAAA,IAAA,CACD;AACC,MAAA,OAAO,IAAI;EACf;AACF;AAEA,SAAS,YAAY;AACb,QAAA,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,OACH;AACF,OAAK,MAAM;AACF,WAAA,KAAK,YAAY,IAAI;AAChC;AAGO,SAAS,sBAAsB;AAC1B;AACD;AACG;AACC;AACf;AAGA,oBAAoB;"}
@@ -0,0 +1,253 @@
1
+ import { S as SDKState } from "./chunks/types-82772f00.js";
2
+ import { i, n, a as i$1, x } from "./chunks/obi-widget-93253f25.js";
3
+ import { A, C, c, d, D, N, b, O, S } from "./chunks/obi-widget-93253f25.js";
4
+ var __defProp$1 = Object.defineProperty;
5
+ var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
6
+ var __decorateClass$1 = (decorators, target, key, kind) => {
7
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
8
+ for (var i2 = decorators.length - 1, decorator; i2 >= 0; i2--)
9
+ if (decorator = decorators[i2])
10
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
+ if (kind && result)
12
+ __defProp$1(target, key, result);
13
+ return result;
14
+ };
15
+ class ObiStatusWidget extends i$1 {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.state = SDKState.READY;
19
+ }
20
+ render() {
21
+ return x`
22
+ <div class="status-container">
23
+ <div class="status-indicator ${this.state}"></div>
24
+ <div class="status-text">${this.getStatusText()}</div>
25
+ </div>
26
+ `;
27
+ }
28
+ getStatusText() {
29
+ switch (this.state) {
30
+ case SDKState.READY:
31
+ return "Ready";
32
+ case SDKState.ERROR:
33
+ return "Error";
34
+ default:
35
+ return "Unknown";
36
+ }
37
+ }
38
+ }
39
+ ObiStatusWidget.styles = i`
40
+ :host {
41
+ display: inline-block;
42
+ font-family: Arial, sans-serif;
43
+ }
44
+
45
+ .status-container {
46
+ display: flex;
47
+ align-items: center;
48
+ padding: 8px 12px;
49
+ border-radius: 16px;
50
+ background-color: #f3f4f6;
51
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
52
+ }
53
+
54
+ .status-indicator {
55
+ width: 10px;
56
+ height: 10px;
57
+ border-radius: 50%;
58
+ margin-right: 8px;
59
+ }
60
+
61
+ .ready {
62
+ background-color: #10b981;
63
+ }
64
+
65
+ .active {
66
+ background-color: #3b82f6;
67
+ }
68
+
69
+ .error {
70
+ background-color: #ef4444;
71
+ }
72
+
73
+ .status-text {
74
+ font-size: 14px;
75
+ font-weight: 500;
76
+ color: #1f2937;
77
+ }
78
+ `;
79
+ __decorateClass$1([
80
+ n({ type: String })
81
+ ], ObiStatusWidget.prototype, "state", 2);
82
+ if (!customElements.get("obi-status-widget")) {
83
+ customElements.define("obi-status-widget", ObiStatusWidget);
84
+ }
85
+ const statusWidget = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
86
+ __proto__: null,
87
+ ObiStatusWidget
88
+ }, Symbol.toStringTag, { value: "Module" }));
89
+ var __defProp = Object.defineProperty;
90
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
91
+ var __decorateClass = (decorators, target, key, kind) => {
92
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
93
+ for (var i2 = decorators.length - 1, decorator; i2 >= 0; i2--)
94
+ if (decorator = decorators[i2])
95
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
96
+ if (kind && result)
97
+ __defProp(target, key, result);
98
+ return result;
99
+ };
100
+ class ObiControlPanel extends i$1 {
101
+ constructor() {
102
+ super(...arguments);
103
+ this.state = SDKState.READY;
104
+ this.voiceEnabled = true;
105
+ this.screenEnabled = true;
106
+ }
107
+ render() {
108
+ const isActive = this.state === SDKState.AGENT_SPEAKING;
109
+ const isReady = this.state === SDKState.READY;
110
+ return x`
111
+ <div class="control-container">
112
+ <div class="control-header">Obi Controls</div>
113
+ <div class="control-buttons">
114
+ <button
115
+ class="btn-voice"
116
+ ?disabled=${!isReady || !this.voiceEnabled}
117
+ @click=${this.handleVoiceClick}
118
+ >
119
+ Start Voice
120
+ </button>
121
+
122
+ <button
123
+ class="btn-screen"
124
+ ?disabled=${!isReady || !this.screenEnabled}
125
+ @click=${this.handleScreenClick}
126
+ >
127
+ Capture Screen
128
+ </button>
129
+
130
+ <button class="btn-stop" ?disabled=${!isActive} @click=${this.handleStopClick}>
131
+ Stop
132
+ </button>
133
+ </div>
134
+ </div>
135
+ `;
136
+ }
137
+ handleVoiceClick() {
138
+ this.dispatchEvent(new CustomEvent("voice-start"));
139
+ }
140
+ handleScreenClick() {
141
+ this.dispatchEvent(new CustomEvent("screen-start"));
142
+ }
143
+ handleStopClick() {
144
+ this.dispatchEvent(new CustomEvent("stop"));
145
+ }
146
+ }
147
+ ObiControlPanel.styles = i`
148
+ :host {
149
+ display: block;
150
+ font-family: Arial, sans-serif;
151
+ --obi-primary: #3b82f6;
152
+ --obi-danger: #ef4444;
153
+ --obi-gray: #6b7280;
154
+ }
155
+
156
+ .control-container {
157
+ display: flex;
158
+ flex-direction: column;
159
+ padding: 16px;
160
+ border-radius: 8px;
161
+ background-color: #ffffff;
162
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
163
+ max-width: 300px;
164
+ }
165
+
166
+ .control-header {
167
+ margin-bottom: 16px;
168
+ font-size: 16px;
169
+ font-weight: 600;
170
+ color: #111827;
171
+ }
172
+
173
+ .control-buttons {
174
+ display: flex;
175
+ gap: 8px;
176
+ margin-bottom: 16px;
177
+ }
178
+
179
+ button {
180
+ padding: 8px 12px;
181
+ border: none;
182
+ border-radius: 4px;
183
+ font-size: 14px;
184
+ font-weight: 500;
185
+ cursor: pointer;
186
+ transition:
187
+ background-color 0.2s,
188
+ opacity 0.2s;
189
+ }
190
+
191
+ button:disabled {
192
+ opacity: 0.5;
193
+ cursor: not-allowed;
194
+ }
195
+
196
+ .btn-voice {
197
+ background-color: var(--obi-primary);
198
+ color: white;
199
+ }
200
+
201
+ .btn-screen {
202
+ background-color: var(--obi-primary);
203
+ color: white;
204
+ }
205
+
206
+ .btn-stop {
207
+ background-color: var(--obi-danger);
208
+ color: white;
209
+ }
210
+ `;
211
+ __decorateClass([
212
+ n({ type: String })
213
+ ], ObiControlPanel.prototype, "state", 2);
214
+ __decorateClass([
215
+ n({ type: Boolean })
216
+ ], ObiControlPanel.prototype, "voiceEnabled", 2);
217
+ __decorateClass([
218
+ n({ type: Boolean })
219
+ ], ObiControlPanel.prototype, "screenEnabled", 2);
220
+ if (!customElements.get("obi-control-panel")) {
221
+ customElements.define("obi-control-panel", ObiControlPanel);
222
+ }
223
+ const controlPanel = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
224
+ __proto__: null,
225
+ ObiControlPanel
226
+ }, Symbol.toStringTag, { value: "Module" }));
227
+ function defineCustomElements() {
228
+ Promise.resolve().then(() => statusWidget);
229
+ Promise.resolve().then(() => controlPanel);
230
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.o);
231
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.j);
232
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.k);
233
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.e);
234
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.f);
235
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.s);
236
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.g);
237
+ import("./chunks/obi-widget-93253f25.js").then((n2) => n2.h);
238
+ }
239
+ export {
240
+ A as AudioEqualizer,
241
+ C as Course,
242
+ c as CourseList,
243
+ d as CourseModal,
244
+ D as DotLoader,
245
+ N as NavIcon,
246
+ b as NavigationBar,
247
+ ObiControlPanel,
248
+ ObiStatusWidget,
249
+ O as ObiWidget,
250
+ S as SearchingLoader,
251
+ defineCustomElements
252
+ };
253
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sources":["../../src/ui/components/status-widget.ts","../../src/ui/components/control-panel.ts","../../src/ui/components/index.ts"],"sourcesContent":["import { SDKState } from \"@obi/obi-session\"\nimport { LitElement, html, css } from \"lit\"\nimport { property } from \"lit/decorators.js\"\n\nexport class ObiStatusWidget extends LitElement {\n @property({ type: String })\n state: SDKState = SDKState.READY\n\n static styles = css`\n :host {\n display: inline-block;\n font-family: Arial, sans-serif;\n }\n\n .status-container {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n border-radius: 16px;\n background-color: #f3f4f6;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n }\n\n .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n margin-right: 8px;\n }\n\n .ready {\n background-color: #10b981;\n }\n\n .active {\n background-color: #3b82f6;\n }\n\n .error {\n background-color: #ef4444;\n }\n\n .status-text {\n font-size: 14px;\n font-weight: 500;\n color: #1f2937;\n }\n `\n\n render() {\n return html`\n <div class=\"status-container\">\n <div class=\"status-indicator ${this.state}\"></div>\n <div class=\"status-text\">${this.getStatusText()}</div>\n </div>\n `\n }\n\n private getStatusText(): string {\n switch (this.state) {\n case SDKState.READY:\n return \"Ready\"\n case SDKState.ERROR:\n return \"Error\"\n default:\n return \"Unknown\"\n }\n }\n}\n\nif (!customElements.get(\"obi-status-widget\")) {\n customElements.define(\"obi-status-widget\", ObiStatusWidget)\n}\n","import { SDKState } from \"@obi/obi-session\"\nimport { LitElement, html, css } from \"lit\"\nimport { property } from \"lit/decorators.js\"\n\nexport class ObiControlPanel extends LitElement {\n @property({ type: String })\n state: SDKState = SDKState.READY\n\n @property({ type: Boolean })\n voiceEnabled: boolean = true\n\n @property({ type: Boolean })\n screenEnabled: boolean = true\n\n static styles = css`\n :host {\n display: block;\n font-family: Arial, sans-serif;\n --obi-primary: #3b82f6;\n --obi-danger: #ef4444;\n --obi-gray: #6b7280;\n }\n\n .control-container {\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 8px;\n background-color: #ffffff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n max-width: 300px;\n }\n\n .control-header {\n margin-bottom: 16px;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n }\n\n .control-buttons {\n display: flex;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n button {\n padding: 8px 12px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition:\n background-color 0.2s,\n opacity 0.2s;\n }\n\n button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-voice {\n background-color: var(--obi-primary);\n color: white;\n }\n\n .btn-screen {\n background-color: var(--obi-primary);\n color: white;\n }\n\n .btn-stop {\n background-color: var(--obi-danger);\n color: white;\n }\n `\n\n render() {\n const isActive = this.state === SDKState.AGENT_SPEAKING\n const isReady = this.state === SDKState.READY\n\n return html`\n <div class=\"control-container\">\n <div class=\"control-header\">Obi Controls</div>\n <div class=\"control-buttons\">\n <button\n class=\"btn-voice\"\n ?disabled=${!isReady || !this.voiceEnabled}\n @click=${this.handleVoiceClick}\n >\n Start Voice\n </button>\n\n <button\n class=\"btn-screen\"\n ?disabled=${!isReady || !this.screenEnabled}\n @click=${this.handleScreenClick}\n >\n Capture Screen\n </button>\n\n <button class=\"btn-stop\" ?disabled=${!isActive} @click=${this.handleStopClick}>\n Stop\n </button>\n </div>\n </div>\n `\n }\n\n private handleVoiceClick() {\n this.dispatchEvent(new CustomEvent(\"voice-start\"))\n }\n\n private handleScreenClick() {\n this.dispatchEvent(new CustomEvent(\"screen-start\"))\n }\n\n private handleStopClick() {\n this.dispatchEvent(new CustomEvent(\"stop\"))\n }\n}\n\nif (!customElements.get(\"obi-control-panel\")) {\n customElements.define(\"obi-control-panel\", ObiControlPanel)\n}\n","export * from \"./status-widget\"\nexport * from \"./control-panel\"\nexport * from \"./obi-widget\"\nexport * from \"./audio-equalizer\"\nexport * from \"./dot-loader\"\nexport * from \"./nav-icon\"\nexport * from \"./navigation-bar\"\nexport * from \"./searching-loader\"\nexport * from \"./courses/courses\"\nexport * from \"./courses/course-modal\"\n\n// Function to define all custom elements at once for development\nexport function defineCustomElements() {\n // Import all components to ensure they're registered\n // This is primarily useful for development\n import(\"./status-widget\")\n import(\"./control-panel\")\n import(\"./obi-widget\")\n import(\"./audio-equalizer\")\n import(\"./dot-loader\")\n import(\"./nav-icon\")\n import(\"./navigation-bar\")\n import(\"./searching-loader\")\n import(\"./courses/courses\")\n import(\"./courses/course-modal\")\n}\n"],"names":["LitElement","html","css","__decorateClass","property","n"],"mappings":"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"}