@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 +104 -84
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/service.d.ts +20 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +13 -3
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
# @yak-io/angular
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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
|
-
|
|
84
|
+
register(yak: YakApi) {
|
|
82
85
|
this.yak = yak;
|
|
83
|
-
yak.subscribeToState((
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
109
|
-
|
|
102
|
+
export class HeaderComponent {
|
|
103
|
+
yak = inject(YakService);
|
|
110
104
|
}
|
|
111
105
|
```
|
|
112
106
|
|
|
113
|
-
##
|
|
107
|
+
## Voice
|
|
114
108
|
|
|
115
|
-
|
|
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
|
-
|
|
128
|
+
## API reference
|
|
118
129
|
|
|
119
|
-
|
|
130
|
+
### `createYakProvider(options)`
|
|
120
131
|
|
|
121
|
-
|
|
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
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
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;
|
|
140
|
-
readonly isReady: 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:
|
|
146
|
-
mount: () => void; //
|
|
147
|
-
destroy: () => void; //
|
|
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();
|
|
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
|
-
|
|
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
|
|
208
|
+
Proprietary — see [LICENSE](./LICENSE).
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type { ChatConfigProvider, GraphQLRequest,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,
|
|
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
|
|
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
|
/**
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,
|
|
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 = {
|
|
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
|
+
"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.
|
|
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",
|