@yak-io/angular 0.3.0 → 0.5.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/README.md CHANGED
@@ -1,13 +1,24 @@
1
1
  # @yak-io/angular
2
2
 
3
- Angular integration for the Yak embeddable chat widget. Uses a factory function compatible with Angular's component and service patterns.
3
+ > 📚 **Full documentation:** https://docs.yak.io/docs/sdks/angular
4
+ >
5
+ > 🤖 **For LLMs / AI agents:** https://docs.yak.io/llms.txt
4
6
 
5
- ## Installation
7
+ Angular SDK for [Yak](https://docs.yak.io) — an embeddable AI assistant (text chat **and** push-to-talk voice) for web apps. `createYakProvider` returns a `YakApi`; bridge its state into Angular signals (or RxJS) with `subscribeToState`.
6
8
 
7
9
  ```bash
8
10
  pnpm add @yak-io/angular
9
11
  ```
10
12
 
13
+ ## Exports
14
+
15
+ | Export | Kind | Purpose |
16
+ | --- | --- | --- |
17
+ | `createYakProvider(options)` | fn | Create a widget instance. Returns a `YakApi` with `mount`/`destroy` + `subscribeToState`. |
18
+ | `createYakToolset` / `createYakServerAdapter` | fn | Compose GraphQL/REST/tRPC/custom tool adapters into one `onToolCall` (re-exported from `@yak-io/javascript`). |
19
+ | `enableYakLogging` / `disableYakLogging` / `isYakLoggingEnabled` | fn | Toggle verbose SDK logging. |
20
+ | Types | — | `YakProviderOptions`, `YakApi`, `YakState`, `ToolCallEventHandler`, plus core types from `@yak-io/javascript`. |
21
+
11
22
  ## Quickstart
12
23
 
13
24
  ### 1. Initialize in your root component
@@ -26,32 +37,27 @@ import { environment } from "../environments/environment";
26
37
  })
27
38
  export class AppComponent implements OnInit, OnDestroy {
28
39
  private router = inject(Router);
29
- private yak: YakApi;
30
-
31
- constructor() {
32
- this.yak = createYakProvider({
33
- appId: environment.yakAppId,
34
- theme: { position: "bottom-right", colorMode: "system" },
35
- trigger: { label: "Ask with AI" },
36
- getConfig: async () => {
37
- const res = await fetch("/api/yak");
38
- return res.json();
39
- },
40
- onToolCall: async (name, args) => {
41
- const res = await fetch("/api/yak", {
42
- method: "POST",
43
- headers: { "Content-Type": "application/json" },
44
- body: JSON.stringify({ name, args }),
45
- });
46
- const data = await res.json();
47
- if (!data.ok) throw new Error(data.error);
48
- return data.result;
49
- },
50
- onRedirect: (path) => {
51
- this.router.navigateByUrl(path);
52
- },
53
- });
54
- }
40
+ private yak: YakApi = createYakProvider({
41
+ appId: environment.yakAppId,
42
+ mode: "both", // "chat" | "voice" | "both" — default "chat"
43
+ trigger: true, // show the floating launcher pill
44
+ theme: { position: "bottom-right", colorMode: "system" },
45
+ getConfig: async () => {
46
+ const res = await fetch("/api/yak");
47
+ return res.json();
48
+ },
49
+ onToolCall: async (name, args) => {
50
+ const res = await fetch("/api/yak", {
51
+ method: "POST",
52
+ headers: { "Content-Type": "application/json" },
53
+ body: JSON.stringify({ name, args }),
54
+ });
55
+ const data = await res.json();
56
+ if (!data.ok) throw new Error(data.error);
57
+ return data.result;
58
+ },
59
+ onRedirect: (path) => this.router.navigateByUrl(path),
60
+ });
55
61
 
56
62
  ngOnInit() {
57
63
  this.yak.mount();
@@ -63,9 +69,7 @@ export class AppComponent implements OnInit, OnDestroy {
63
69
  }
64
70
  ```
65
71
 
66
- ### 2. Share via an Angular service
67
-
68
- Create a service to share the widget API across components:
72
+ ### 2. Share via a service
69
73
 
70
74
  ```ts
71
75
  // yak.service.ts
@@ -76,95 +80,105 @@ import type { YakApi } from "@yak-io/angular";
76
80
  export class YakService {
77
81
  private yak: YakApi | null = null;
78
82
  readonly isOpen = signal(false);
79
- readonly isReady = signal(false);
80
83
 
81
- setYak(yak: YakApi) {
84
+ register(yak: YakApi) {
82
85
  this.yak = yak;
83
- yak.subscribeToState(({ isOpen, isReady }) => {
84
- this.isOpen.set(isOpen);
85
- this.isReady.set(isReady);
86
- });
86
+ yak.subscribeToState((state) => this.isOpen.set(state.isOpen));
87
87
  }
88
88
 
89
89
  open() { this.yak?.open(); }
90
- close() { this.yak?.close(); }
91
90
  openWithPrompt(prompt: string) { this.yak?.openWithPrompt(prompt); }
91
+ voiceToggle() { return this.yak?.voiceToggle(); }
92
92
  }
93
93
  ```
94
94
 
95
- ### 3. Use in components
95
+ Call `yakService.register(this.yak)` from your root component, then inject `YakService` anywhere:
96
96
 
97
97
  ```ts
98
- // any.component.ts
99
- import { Component, inject } from "@angular/core";
100
- import { YakService } from "./yak.service";
101
-
102
98
  @Component({
103
- template: `
104
- <button (click)="yakService.open()">Open Chat</button>
105
- <p *ngIf="yakService.isOpen()">Chat is open</p>
106
- `,
99
+ template: `<button (click)="yak.open()">Open chat</button>
100
+ <span *ngIf="yak.isOpen()">Chat is open</span>`,
107
101
  })
108
- export class AnyComponent {
109
- yakService = inject(YakService);
102
+ export class HeaderComponent {
103
+ yak = inject(YakService);
110
104
  }
111
105
  ```
112
106
 
113
- ## API Reference
107
+ ## Voice
114
108
 
115
- ### `createYakProvider(options)`
109
+ Set `mode: "voice"` or `mode: "both"`, then drive the session. `voiceStart()` must run from a user gesture (browser mic requirement). Voice state arrives through `subscribeToState` as `state.voiceMachine`:
110
+
111
+ ```ts
112
+ yak.subscribeToState((state) => {
113
+ this.voiceState.set(state.voiceMachine.state); // "idle" | "listening" | "speaking" | ...
114
+ });
115
+ // button handler:
116
+ this.yak.voiceToggle();
117
+ ```
118
+
119
+ ## Tool events
120
+
121
+ ```ts
122
+ yak.subscribeToToolEvents((event) => {
123
+ // { name, args, ok, result?, error? }
124
+ if (event.ok && event.name.startsWith("tasks.")) this.refreshTasks();
125
+ });
126
+ ```
116
127
 
117
- Creates a Yak widget instance. Returns a `YakApi` object.
128
+ ## API reference
118
129
 
119
- Call `yak.mount()` in `ngOnInit()` and `yak.destroy()` in `ngOnDestroy()`.
130
+ ### `createYakProvider(options)`
120
131
 
121
- **Options:**
132
+ Returns a `YakApi`. Call `yak.mount()` in `ngOnInit()` and `yak.destroy()` in `ngOnDestroy()`.
122
133
 
123
- | Option | Type | Description |
124
- |--------|------|-------------|
125
- | `appId` | `string` | Your Yak app ID |
126
- | `getConfig` | `ChatConfigProvider` | Async function returning routes + tools. Called on first open. |
127
- | `onToolCall` | `ToolCallHandler` | Handle tool invocations from the assistant |
128
- | `onGraphQLSchemaCall` | `GraphQLSchemaHandler` | Handle GraphQL schema tool calls |
129
- | `onRESTSchemaCall` | `RESTSchemaHandler` | Handle REST/OpenAPI schema tool calls |
130
- | `theme` | `Theme` | Position, color mode, and custom colors |
131
- | `onRedirect` | `(path: string) => void` | Navigation handler (defaults to `window.location.assign`) |
132
- | `disableRestartButton` | `boolean` | Hide the restart session button |
133
- | `trigger` | `boolean \| TriggerButtonConfig` | Built-in trigger button |
134
+ | Option | Type | Default | Description |
135
+ | --- | --- | --- | --- |
136
+ | `appId` | `string` | — | Your Yak app ID (required). |
137
+ | `mode` | `"chat" \| "voice" \| "both"` | `"chat"` | Which surfaces the widget exposes. |
138
+ | `trigger` | `boolean \| TriggerButtonConfig` | `false` | Show the floating pill. **Set `true`** to display it; `TriggerButtonConfig` recolors it. |
139
+ | `getConfig` | `ChatConfigProvider` | | Async provider of routes + tools. Called on open / voice start. |
140
+ | `onToolCall` | `ToolCallHandler` | | Executes a tool the assistant calls. || `theme` | `Theme` | — | Position, color mode, and colors. |
141
+ | `onRedirect` | `(path: string) => void` | `window.location.assign` | Navigation handler. |
142
+ | `disableRestartButton` | `boolean` | `false` | Hide the restart-session button. |
134
143
 
135
144
  ### `YakApi`
136
145
 
146
+ State (`isOpen`/`isReady`/`voiceMachine`) is read via the `subscribeToState` callback — Angular has no built-in reactive primitive the SDK can return, so wire it into signals or RxJS yourself.
147
+
137
148
  ```ts
149
+ type YakState = {
150
+ isOpen: boolean;
151
+ isReady: boolean;
152
+ chatLoading: boolean;
153
+ voiceMachine: VoiceMachine;
154
+ voiceLoading: boolean;
155
+ };
156
+
138
157
  type YakApi = {
139
- readonly isOpen: boolean; // Plain boolean (use subscribeToState for reactivity)
140
- readonly isReady: boolean; // Plain boolean
158
+ readonly isOpen: boolean; // snapshot use subscribeToState for reactivity
159
+ readonly isReady: boolean; // snapshot
160
+ readonly chatLoading: boolean; // snapshot — isOpen && !isReady
161
+ readonly voiceMachine: VoiceMachine; // snapshot — { state, errorMessage? }
162
+ readonly voiceLoading: boolean; // snapshot — state === "connecting"
141
163
  open: () => void;
142
164
  close: () => void;
143
165
  openWithPrompt: (prompt: string) => void;
166
+ voiceStart: () => Promise<void>;
167
+ voiceStop: () => Promise<void>;
168
+ voiceToggle: () => Promise<void>;
144
169
  subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;
145
- subscribeToState: (handler: (state: { isOpen: boolean; isReady: boolean }) => void) => () => void;
146
- mount: () => void; // Call in ngOnInit() or ngAfterViewInit()
147
- destroy: () => void; // Call in ngOnDestroy()
170
+ subscribeToState: (handler: (state: YakState) => void) => () => void;
171
+ mount: () => void; // call in ngOnInit()
172
+ destroy: () => void; // call in ngOnDestroy()
148
173
  };
149
174
  ```
150
175
 
151
- Use `subscribeToState` to react to state changes — wire it to Angular signals, `BehaviorSubject`s, or change detection:
152
-
153
- ```ts
154
- yak.subscribeToState(({ isOpen, isReady }) => {
155
- this.isOpen.set(isOpen);
156
- this.changeDetector.markForCheck();
157
- });
158
- ```
159
-
160
176
  ## Logging
161
177
 
162
178
  ```ts
163
179
  import { enableYakLogging, disableYakLogging, isYakLoggingEnabled } from "@yak-io/angular";
164
180
 
165
- enableYakLogging(); // Enable verbose SDK logs
166
- disableYakLogging(); // Disable SDK logs
167
- isYakLoggingEnabled(); // → boolean
181
+ enableYakLogging(); // verbose SDK logs
168
182
  ```
169
183
 
170
184
  ## Types
@@ -173,16 +187,22 @@ isYakLoggingEnabled(); // → boolean
173
187
  import type {
174
188
  YakProviderOptions,
175
189
  YakApi,
190
+ YakState,
176
191
  ToolCallEventHandler,
177
192
  ChatConfigProvider,
178
193
  ToolCallHandler,
179
194
  ToolCallEvent,
195
+ ToolAdapter,
196
+ YakToolset,
197
+ YakServerAdapterConfig,
180
198
  Theme,
181
- TriggerButtonConfig,
199
+ WidgetMode,
182
200
  WidgetPosition,
201
+ VoiceState,
202
+ VoiceMachine,
183
203
  } from "@yak-io/angular";
184
204
  ```
185
205
 
186
206
  ## License
187
207
 
188
- Proprietary — see LICENSE file.
208
+ Proprietary — see [LICENSE](./LICENSE).
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export type { ChatConfigProvider, GraphQLRequest, GraphQLSchemaHandler, GraphQLSchemaSource, OpenAPISchemaSource, RESTRequest, RESTSchemaHandler, SchemaSource, Theme, ThemeColors, ToolCallEvent, ToolCallHandler, TriggerButtonConfig, VoiceMachine, VoiceState, WidgetMode, WidgetPosition, } from "@yak-io/javascript";
2
- export { disableYakLogging, enableYakLogging, isYakLoggingEnabled } from "@yak-io/javascript";
1
+ export type { ChatConfigProvider, GraphQLRequest, RESTRequest, Theme, ThemeColors, ToolAdapter, ToolCallEvent, ToolCallHandler, TriggerButtonConfig, VoiceMachine, VoiceState, WidgetMode, WidgetPosition, YakServerAdapterConfig, YakToolset, } from "@yak-io/javascript";
2
+ export { createYakServerAdapter, createYakToolset, disableYakLogging, enableYakLogging, isYakLoggingEnabled, } from "@yak-io/javascript";
3
3
  export type { ToolCallEventHandler, YakApi, YakProviderOptions, YakState, } from "./service.js";
4
4
  export { createYakProvider } from "./service.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACL,WAAW,EACX,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EACV,oBAAoB,EACpB,MAAM,EACN,kBAAkB,EAClB,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,KAAK,EACL,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,oBAAoB,EACpB,MAAM,EACN,kBAAkB,EAClB,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // Public API
2
- // Re-export logging utilities
3
- export { disableYakLogging, enableYakLogging, isYakLoggingEnabled } from "@yak-io/javascript";
2
+ // Re-export tool composition + logging utilities
3
+ export { createYakServerAdapter, createYakToolset, disableYakLogging, enableYakLogging, isYakLoggingEnabled, } from "@yak-io/javascript";
4
4
  export { createYakProvider } from "./service.js";
package/dist/service.d.ts CHANGED
@@ -1,12 +1,10 @@
1
- import { type ChatConfigProvider, type GraphQLSchemaHandler, type RESTSchemaHandler, type Theme, type ToolCallEvent, type ToolCallHandler, type TriggerButtonConfig, type VoiceMachine, type WidgetMode } from "@yak-io/javascript";
1
+ import { type ChatConfigProvider, type Theme, type ToolCallEvent, type ToolCallHandler, type TriggerButtonConfig, type VoiceMachine, type WidgetMode } from "@yak-io/javascript";
2
2
  export type ToolCallEventHandler = (event: ToolCallEvent) => void;
3
3
  export type YakProviderOptions = {
4
4
  appId: string;
5
5
  mode?: WidgetMode;
6
6
  getConfig?: ChatConfigProvider;
7
7
  onToolCall?: ToolCallHandler;
8
- onGraphQLSchemaCall?: GraphQLSchemaHandler;
9
- onRESTSchemaCall?: RESTSchemaHandler;
10
8
  theme?: Theme;
11
9
  onRedirect?: (path: string) => void;
12
10
  disableRestartButton?: boolean;
@@ -15,22 +13,41 @@ export type YakProviderOptions = {
15
13
  export type YakState = {
16
14
  isOpen: boolean;
17
15
  isReady: boolean;
16
+ chatLoading: boolean;
18
17
  voiceMachine: VoiceMachine;
18
+ voiceLoading: boolean;
19
19
  };
20
+ /** Handle for controlling the Yak widget — chat + voice — from Angular. */
20
21
  export type YakApi = {
22
+ /** Whether the chat panel is currently open. */
21
23
  readonly isOpen: boolean;
24
+ /** Whether the chat iframe is ready to receive messages. */
22
25
  readonly isReady: boolean;
26
+ /** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */
27
+ readonly chatLoading: boolean;
28
+ /** Current voice state-machine snapshot. `idle` when mode is `chat`. */
23
29
  readonly voiceMachine: VoiceMachine;
30
+ /** Whether the voice session is establishing its connection (`state === "connecting"`). */
31
+ readonly voiceLoading: boolean;
32
+ /** Open the chat panel. */
24
33
  open: () => void;
34
+ /** Close the chat panel. */
25
35
  close: () => void;
36
+ /** Open the chat panel and send a specific prompt. */
26
37
  openWithPrompt: (prompt: string) => void;
38
+ /** Start a voice session. Must be invoked from a user gesture. */
27
39
  voiceStart: () => Promise<void>;
40
+ /** Stop the current voice session. */
28
41
  voiceStop: () => Promise<void>;
42
+ /** Toggle voice: start if idle/error, stop if active. */
29
43
  voiceToggle: () => Promise<void>;
44
+ /** Subscribe to tool-call completion events; returns an unsubscribe function. */
30
45
  subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;
31
46
  /** Subscribe to chat + voice state changes. */
32
47
  subscribeToState: (handler: (state: YakState) => void) => () => void;
48
+ /** Mount the widget into the DOM. */
33
49
  mount: () => void;
50
+ /** Tear down the widget and remove its listeners. */
34
51
  destroy: () => void;
35
52
  };
36
53
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAGzB,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,qBAAqB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,IAAI,CAAC;IACrE,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACrE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAIF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA6HrE"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAGvB,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,MAAM,GAAG;IACnB,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,2FAA2F;IAC3F,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,sDAAsD;IACtD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,kEAAkE;IAClE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,sCAAsC;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,yDAAyD;IACzD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,iFAAiF;IACjF,qBAAqB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,IAAI,CAAC;IACrE,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACrE,qCAAqC;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAIF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAuIrE"}
package/dist/service.js CHANGED
@@ -11,7 +11,13 @@ export function createYakProvider(options) {
11
11
  const toolEventSubscribers = new Set();
12
12
  const stateSubscribers = new Set();
13
13
  const notifyState = () => {
14
- const snap = { isOpen: _isOpen, isReady: _isReady, voiceMachine: _voiceMachine };
14
+ const snap = {
15
+ isOpen: _isOpen,
16
+ isReady: _isReady,
17
+ chatLoading: _isOpen && !_isReady,
18
+ voiceMachine: _voiceMachine,
19
+ voiceLoading: _voiceMachine.state === "connecting",
20
+ };
15
21
  for (const subscriber of stateSubscribers) {
16
22
  try {
17
23
  subscriber(snap);
@@ -45,8 +51,6 @@ export function createYakProvider(options) {
45
51
  trigger: options.trigger ?? false,
46
52
  getConfig: options.getConfig,
47
53
  onToolCall: options.onToolCall,
48
- onGraphQLSchemaCall: options.onGraphQLSchemaCall,
49
- onRESTSchemaCall: options.onRESTSchemaCall,
50
54
  onRedirect: resolvedRedirect,
51
55
  options: { disableRestartButton: options.disableRestartButton },
52
56
  onToolCallComplete: handleToolCallComplete,
@@ -95,9 +99,15 @@ export function createYakProvider(options) {
95
99
  get isReady() {
96
100
  return _isReady;
97
101
  },
102
+ get chatLoading() {
103
+ return _isOpen && !_isReady;
104
+ },
98
105
  get voiceMachine() {
99
106
  return _voiceMachine;
100
107
  },
108
+ get voiceLoading() {
109
+ return _voiceMachine.state === "connecting";
110
+ },
101
111
  open: () => embed.open(),
102
112
  close: () => embed.close(),
103
113
  openWithPrompt: (prompt) => embed.openWithPrompt(prompt),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yak-io/angular",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Angular SDK for embedding yak chatbot",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -25,6 +25,7 @@
25
25
  "node": ">=18"
26
26
  },
27
27
  "files": [
28
+ "README.md",
28
29
  "dist",
29
30
  "LICENSE"
30
31
  ],
@@ -41,7 +42,7 @@
41
42
  "./package.json": "./package.json"
42
43
  },
43
44
  "dependencies": {
44
- "@yak-io/javascript": "0.8.0"
45
+ "@yak-io/javascript": "0.10.0"
45
46
  },
46
47
  "peerDependencies": {
47
48
  "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"
@@ -51,6 +52,7 @@
51
52
  "typescript": "^5.3.0",
52
53
  "@repo/typescript-config": "0.0.0"
53
54
  },
55
+ "homepage": "https://docs.yak.io/docs/sdks/angular",
54
56
  "scripts": {
55
57
  "build": "tsc",
56
58
  "check-types": "tsc --noEmit",