@yak-io/nuxt 0.2.0 → 0.4.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 +84 -60
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/plugin.d.ts +26 -33
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +26 -27
- package/package.json +6 -4
package/README.md
CHANGED
|
@@ -1,29 +1,39 @@
|
|
|
1
1
|
# @yak-io/nuxt
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 📚 **Full documentation:** https://docs.yak.io/docs/sdks/nuxt
|
|
4
|
+
>
|
|
5
|
+
> 🤖 **For LLMs / AI agents:** https://docs.yak.io/llms.txt
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
Nuxt 3 SDK for [Yak](https://docs.yak.io) — an embeddable AI assistant (text chat **and** push-to-talk voice) for web apps. Register `createYakProvider` in a client plugin and expose the `YakApi` (Vue refs) through `useNuxtApp()`.
|
|
6
8
|
|
|
7
9
|
```bash
|
|
8
10
|
pnpm add @yak-io/nuxt
|
|
9
11
|
```
|
|
10
12
|
|
|
13
|
+
## Exports
|
|
14
|
+
|
|
15
|
+
| Export | Kind | Purpose |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `createYakProvider(options)` | fn | Create a widget instance. Returns a `YakApi` with refs + `mount`/`destroy`. |
|
|
18
|
+
| `enableYakLogging` / `disableYakLogging` / `isYakLoggingEnabled` | fn | Toggle verbose SDK logging. |
|
|
19
|
+
| Types | — | `YakProviderOptions`, `YakApi`, `ToolCallEventHandler`, plus core types from `@yak-io/javascript`. |
|
|
20
|
+
|
|
11
21
|
## Quickstart
|
|
12
22
|
|
|
13
|
-
### 1. Create a
|
|
23
|
+
### 1. Create a client plugin
|
|
14
24
|
|
|
15
25
|
```ts
|
|
16
26
|
// plugins/yak.client.ts
|
|
17
|
-
import {
|
|
18
|
-
import { createYakProvider, enableYakLogging, disableYakLogging, isYakLoggingEnabled } from "@yak-io/nuxt";
|
|
27
|
+
import { createYakProvider } from "@yak-io/nuxt";
|
|
19
28
|
|
|
20
29
|
export default defineNuxtPlugin((nuxtApp) => {
|
|
21
30
|
const runtimeConfig = useRuntimeConfig();
|
|
22
31
|
|
|
23
32
|
const yak = createYakProvider({
|
|
24
|
-
appId: runtimeConfig.public.yakAppId,
|
|
33
|
+
appId: runtimeConfig.public.yakAppId as string,
|
|
34
|
+
mode: "both", // "chat" | "voice" | "both" — default "chat"
|
|
35
|
+
trigger: true, // show the floating launcher pill
|
|
25
36
|
theme: { position: "bottom-right", colorMode: "system" },
|
|
26
|
-
trigger: { label: "Ask with AI" },
|
|
27
37
|
getConfig: async () => {
|
|
28
38
|
const res = await fetch("/api/yak");
|
|
29
39
|
return res.json();
|
|
@@ -38,89 +48,103 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|
|
38
48
|
if (!data.ok) throw new Error(data.error);
|
|
39
49
|
return data.result;
|
|
40
50
|
},
|
|
41
|
-
onRedirect: (path) =>
|
|
42
|
-
navigateTo(path);
|
|
43
|
-
},
|
|
51
|
+
onRedirect: (path) => navigateTo(path),
|
|
44
52
|
});
|
|
45
53
|
|
|
46
|
-
// Mount on client, clean up on HMR
|
|
47
54
|
nuxtApp.hook("app:mounted", () => yak.mount());
|
|
48
|
-
if (import.meta.hot)
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
provide: {
|
|
54
|
-
yak,
|
|
55
|
-
yakLogging: { enableYakLogging, disableYakLogging, isYakLoggingEnabled },
|
|
56
|
-
},
|
|
57
|
-
};
|
|
55
|
+
if (import.meta.hot) import.meta.hot.dispose(() => yak.destroy());
|
|
56
|
+
|
|
57
|
+
return { provide: { yak } };
|
|
58
58
|
});
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
The `.client.ts` suffix keeps the widget out of SSR. Use `runtimeConfig.public.yakAppId` (set via `NUXT_PUBLIC_YAK_APP_ID`).
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
### 2. Access it in components
|
|
64
|
+
|
|
65
|
+
```vue
|
|
66
|
+
<script setup lang="ts">
|
|
65
67
|
const { $yak } = useNuxtApp();
|
|
66
|
-
const { open, openWithPrompt, isOpen
|
|
68
|
+
const { open, openWithPrompt, isOpen } = $yak;
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<template>
|
|
72
|
+
<button @click="open">Open chat</button>
|
|
73
|
+
<button @click="openWithPrompt('How do I get started?')">Get help</button>
|
|
74
|
+
<span v-if="isOpen">Chat is open</span>
|
|
75
|
+
</template>
|
|
67
76
|
```
|
|
68
77
|
|
|
69
|
-
`isOpen
|
|
78
|
+
`isOpen`/`isReady` are `readonly` Vue refs.
|
|
79
|
+
|
|
80
|
+
## Voice
|
|
81
|
+
|
|
82
|
+
Set `mode: "voice"` or `mode: "both"`, then drive the session. `voiceStart()` must run from a user gesture (browser mic requirement).
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<script setup lang="ts">
|
|
86
|
+
const { $yak } = useNuxtApp();
|
|
87
|
+
const { voiceToggle, voiceLoading, voiceMachine } = $yak;
|
|
88
|
+
</script>
|
|
70
89
|
|
|
71
|
-
```html
|
|
72
90
|
<template>
|
|
73
|
-
<button @click="
|
|
74
|
-
|
|
91
|
+
<button @click="voiceToggle" :disabled="voiceLoading">
|
|
92
|
+
{{ voiceMachine.state === "idle" ? "Start voice" : `Stop (${voiceMachine.state})` }}
|
|
93
|
+
</button>
|
|
75
94
|
</template>
|
|
76
95
|
```
|
|
77
96
|
|
|
78
|
-
|
|
97
|
+
## Tool events
|
|
79
98
|
|
|
80
99
|
```ts
|
|
81
100
|
const { $yak } = useNuxtApp();
|
|
82
101
|
|
|
83
102
|
$yak.subscribeToToolEvents((event) => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
103
|
+
// { name, args, ok, result?, error? }
|
|
104
|
+
if (event.ok && event.name.startsWith("tasks.")) refreshTasks();
|
|
87
105
|
});
|
|
88
106
|
```
|
|
89
107
|
|
|
90
|
-
## API
|
|
108
|
+
## API reference
|
|
91
109
|
|
|
92
110
|
### `createYakProvider(options)`
|
|
93
111
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
| `onRedirect` | `(path: string) => void` | Navigation handler (defaults to `window.location.assign`) |
|
|
109
|
-
| `disableRestartButton` | `boolean` | Hide the restart session button |
|
|
110
|
-
| `trigger` | `boolean \| TriggerButtonConfig` | Built-in trigger button |
|
|
112
|
+
Returns a `YakApi`. Call `yak.mount()` on the client (e.g. the `app:mounted` hook) and `yak.destroy()` on cleanup.
|
|
113
|
+
|
|
114
|
+
| Option | Type | Default | Description |
|
|
115
|
+
| --- | --- | --- | --- |
|
|
116
|
+
| `appId` | `string` | — | Your Yak app ID (required). |
|
|
117
|
+
| `mode` | `"chat" \| "voice" \| "both"` | `"chat"` | Which surfaces the widget exposes. |
|
|
118
|
+
| `trigger` | `boolean \| TriggerButtonConfig` | `false` | Show the floating pill. **Set `true`** to display it; `TriggerButtonConfig` recolors it. |
|
|
119
|
+
| `getConfig` | `ChatConfigProvider` | — | Async provider of routes + tools. Called on open / voice start. |
|
|
120
|
+
| `onToolCall` | `ToolCallHandler` | — | Executes a tool the assistant calls. |
|
|
121
|
+
| `onGraphQLSchemaCall` | `GraphQLSchemaHandler` | — | Handles GraphQL schema tool calls. |
|
|
122
|
+
| `onRESTSchemaCall` | `RESTSchemaHandler` | — | Handles REST/OpenAPI schema tool calls. |
|
|
123
|
+
| `theme` | `Theme` | — | Position, color mode, and colors. |
|
|
124
|
+
| `onRedirect` | `(path: string) => void` | `window.location.assign` | Navigation handler. |
|
|
125
|
+
| `disableRestartButton` | `boolean` | `false` | Hide the restart-session button. |
|
|
111
126
|
|
|
112
127
|
### `YakApi`
|
|
113
128
|
|
|
114
129
|
```ts
|
|
115
130
|
type YakApi = {
|
|
116
|
-
|
|
117
|
-
|
|
131
|
+
// chat
|
|
132
|
+
isOpen: DeepReadonly<Ref<boolean>>;
|
|
133
|
+
isReady: DeepReadonly<Ref<boolean>>;
|
|
134
|
+
chatLoading: DeepReadonly<Ref<boolean>>; // isOpen && !isReady
|
|
118
135
|
open: () => void;
|
|
119
136
|
close: () => void;
|
|
120
137
|
openWithPrompt: (prompt: string) => void;
|
|
121
138
|
subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;
|
|
122
|
-
|
|
123
|
-
|
|
139
|
+
// voice
|
|
140
|
+
voiceMachine: DeepReadonly<Ref<VoiceMachine>>; // { state, errorMessage? }
|
|
141
|
+
voiceLoading: DeepReadonly<Ref<boolean>>; // state === "connecting"
|
|
142
|
+
voiceStart: () => Promise<void>;
|
|
143
|
+
voiceStop: () => Promise<void>;
|
|
144
|
+
voiceToggle: () => Promise<void>;
|
|
145
|
+
// lifecycle
|
|
146
|
+
mount: () => void; // call in app:mounted
|
|
147
|
+
destroy: () => void; // call on HMR dispose / cleanup
|
|
124
148
|
};
|
|
125
149
|
```
|
|
126
150
|
|
|
@@ -129,9 +153,7 @@ type YakApi = {
|
|
|
129
153
|
```ts
|
|
130
154
|
import { enableYakLogging, disableYakLogging, isYakLoggingEnabled } from "@yak-io/nuxt";
|
|
131
155
|
|
|
132
|
-
enableYakLogging();
|
|
133
|
-
disableYakLogging(); // Disable SDK logs
|
|
134
|
-
isYakLoggingEnabled(); // → boolean
|
|
156
|
+
enableYakLogging(); // verbose SDK logs
|
|
135
157
|
```
|
|
136
158
|
|
|
137
159
|
## Types
|
|
@@ -145,11 +167,13 @@ import type {
|
|
|
145
167
|
ToolCallHandler,
|
|
146
168
|
ToolCallEvent,
|
|
147
169
|
Theme,
|
|
148
|
-
|
|
170
|
+
WidgetMode,
|
|
149
171
|
WidgetPosition,
|
|
172
|
+
VoiceState,
|
|
173
|
+
VoiceMachine,
|
|
150
174
|
} from "@yak-io/nuxt";
|
|
151
175
|
```
|
|
152
176
|
|
|
153
177
|
## License
|
|
154
178
|
|
|
155
|
-
Proprietary — see LICENSE
|
|
179
|
+
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";
|
|
3
|
+
export type { ToolCallEventHandler, YakApi, YakProviderOptions } from "./plugin.js";
|
|
1
4
|
export { createYakProvider } from "./plugin.js";
|
|
2
|
-
export type { YakProviderOptions, YakApi, ToolCallEventHandler } from "./plugin.js";
|
|
3
|
-
export { enableYakLogging, disableYakLogging, isYakLoggingEnabled } from "@yak-io/javascript";
|
|
4
|
-
export type { GraphQLSchemaHandler, RESTSchemaHandler, GraphQLRequest, RESTRequest, ToolCallHandler, ToolCallEvent, SchemaSource, GraphQLSchemaSource, OpenAPISchemaSource, Theme, ThemeColors, TriggerButtonConfig, WidgetPosition, ChatConfigProvider, } from "@yak-io/javascript";
|
|
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":"
|
|
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,EAAE,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Public API
|
|
2
|
-
export { createYakProvider } from "./plugin.js";
|
|
3
2
|
// Re-export logging utilities
|
|
4
|
-
export {
|
|
3
|
+
export { disableYakLogging, enableYakLogging, isYakLoggingEnabled } from "@yak-io/javascript";
|
|
4
|
+
export { createYakProvider } from "./plugin.js";
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type
|
|
1
|
+
import { type ChatConfigProvider, type GraphQLSchemaHandler, type RESTSchemaHandler, type Theme, type ToolCallEvent, type ToolCallHandler, type TriggerButtonConfig, type VoiceMachine, type WidgetMode } from "@yak-io/javascript";
|
|
2
|
+
import { type DeepReadonly, type Ref } from "vue";
|
|
3
3
|
export type ToolCallEventHandler = (event: ToolCallEvent) => void;
|
|
4
4
|
export type YakProviderOptions = {
|
|
5
5
|
appId: string;
|
|
6
|
+
mode?: WidgetMode;
|
|
6
7
|
getConfig?: ChatConfigProvider;
|
|
7
8
|
onToolCall?: ToolCallHandler;
|
|
8
9
|
onGraphQLSchemaCall?: GraphQLSchemaHandler;
|
|
@@ -12,48 +13,40 @@ export type YakProviderOptions = {
|
|
|
12
13
|
disableRestartButton?: boolean;
|
|
13
14
|
trigger?: boolean | TriggerButtonConfig;
|
|
14
15
|
};
|
|
16
|
+
/** Reactive handle for controlling the Yak widget — chat + voice — from Nuxt. */
|
|
15
17
|
export type YakApi = {
|
|
16
|
-
/**
|
|
18
|
+
/** Whether the chat panel is currently open. */
|
|
17
19
|
isOpen: DeepReadonly<Ref<boolean>>;
|
|
18
|
-
/**
|
|
20
|
+
/** Whether the chat iframe is ready to receive messages. */
|
|
19
21
|
isReady: DeepReadonly<Ref<boolean>>;
|
|
20
|
-
/**
|
|
22
|
+
/** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */
|
|
23
|
+
chatLoading: DeepReadonly<Ref<boolean>>;
|
|
24
|
+
/** Open the chat panel. */
|
|
21
25
|
open: () => void;
|
|
22
|
-
/** Close the chat
|
|
26
|
+
/** Close the chat panel. */
|
|
23
27
|
close: () => void;
|
|
24
|
-
/** Open the chat
|
|
28
|
+
/** Open the chat panel and send a specific prompt. */
|
|
25
29
|
openWithPrompt: (prompt: string) => void;
|
|
26
|
-
/** Subscribe to tool
|
|
30
|
+
/** Subscribe to tool-call completion events; returns an unsubscribe function. */
|
|
27
31
|
subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;
|
|
28
|
-
/**
|
|
32
|
+
/** Current voice state-machine snapshot. `idle` when mode is `chat`. */
|
|
33
|
+
voiceMachine: DeepReadonly<Ref<VoiceMachine>>;
|
|
34
|
+
/** Whether the voice session is establishing its connection (`state === "connecting"`). */
|
|
35
|
+
voiceLoading: DeepReadonly<Ref<boolean>>;
|
|
36
|
+
/** Start a voice session. Must be invoked from a user gesture. */
|
|
37
|
+
voiceStart: () => Promise<void>;
|
|
38
|
+
/** Stop the current voice session. */
|
|
39
|
+
voiceStop: () => Promise<void>;
|
|
40
|
+
/** Toggle voice: start if idle/error, stop if active. */
|
|
41
|
+
voiceToggle: () => Promise<void>;
|
|
42
|
+
/** Mount the widget into the DOM. */
|
|
29
43
|
mount: () => void;
|
|
30
|
-
/**
|
|
44
|
+
/** Tear down the widget and remove its listeners. */
|
|
31
45
|
destroy: () => void;
|
|
32
46
|
};
|
|
33
47
|
/**
|
|
34
|
-
* Creates a yak chat
|
|
35
|
-
* SSR-safe: call `mount()` only on the client side
|
|
36
|
-
* or inside `onMounted`).
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```ts
|
|
40
|
-
* // plugins/yak.client.ts
|
|
41
|
-
* import { createYakProvider } from "@yak-io/nuxt";
|
|
42
|
-
*
|
|
43
|
-
* export default defineNuxtPlugin((nuxtApp) => {
|
|
44
|
-
* const yak = createYakProvider({ appId: "my-app" });
|
|
45
|
-
*
|
|
46
|
-
* nuxtApp.hook("app:mounted", () => yak.mount());
|
|
47
|
-
* nuxtApp.hook("app:beforeMount", () => {});
|
|
48
|
-
*
|
|
49
|
-
* nuxtApp.provide("yak", yak);
|
|
50
|
-
*
|
|
51
|
-
* // Cleanup on HMR
|
|
52
|
-
* if (import.meta.hot) {
|
|
53
|
-
* import.meta.hot.dispose(() => yak.destroy());
|
|
54
|
-
* }
|
|
55
|
-
* });
|
|
56
|
-
* ```
|
|
48
|
+
* Creates a yak widget (chat + voice) for Nuxt.
|
|
49
|
+
* SSR-safe: call `mount()` only on the client side.
|
|
57
50
|
*/
|
|
58
51
|
export declare function createYakProvider(options: YakProviderOptions): YakApi;
|
|
59
52
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.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;AAC5B,OAAO,EAAY,KAAK,YAAY,EAAE,KAAK,GAAG,EAAiB,MAAM,KAAK,CAAC;AAI3E,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,iFAAiF;AACjF,MAAM,MAAM,MAAM,GAAG;IAEnB,gDAAgD;IAChD,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,4DAA4D;IAC5D,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,kFAAkF;IAClF,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,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,iFAAiF;IACjF,qBAAqB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,IAAI,CAAC;IAErE,wEAAwE;IACxE,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9C,2FAA2F;IAC3F,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,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;IAEjC,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,CAwGrE"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,35 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { logger } from "@yak-io/javascript";
|
|
1
|
+
import { INITIAL_VOICE_MACHINE, logger, YakEmbed, } from "@yak-io/javascript";
|
|
2
|
+
import { computed, readonly, ref } from "vue";
|
|
4
3
|
// ── Provider factory ────────────────────────────────────────────────────────
|
|
5
4
|
/**
|
|
6
|
-
* Creates a yak chat
|
|
7
|
-
* SSR-safe: call `mount()` only on the client side
|
|
8
|
-
* or inside `onMounted`).
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* // plugins/yak.client.ts
|
|
13
|
-
* import { createYakProvider } from "@yak-io/nuxt";
|
|
14
|
-
*
|
|
15
|
-
* export default defineNuxtPlugin((nuxtApp) => {
|
|
16
|
-
* const yak = createYakProvider({ appId: "my-app" });
|
|
17
|
-
*
|
|
18
|
-
* nuxtApp.hook("app:mounted", () => yak.mount());
|
|
19
|
-
* nuxtApp.hook("app:beforeMount", () => {});
|
|
20
|
-
*
|
|
21
|
-
* nuxtApp.provide("yak", yak);
|
|
22
|
-
*
|
|
23
|
-
* // Cleanup on HMR
|
|
24
|
-
* if (import.meta.hot) {
|
|
25
|
-
* import.meta.hot.dispose(() => yak.destroy());
|
|
26
|
-
* }
|
|
27
|
-
* });
|
|
28
|
-
* ```
|
|
5
|
+
* Creates a yak widget (chat + voice) for Nuxt.
|
|
6
|
+
* SSR-safe: call `mount()` only on the client side.
|
|
29
7
|
*/
|
|
30
8
|
export function createYakProvider(options) {
|
|
31
9
|
const isOpen = ref(false);
|
|
32
10
|
const isReady = ref(false);
|
|
11
|
+
const voiceMachine = ref(INITIAL_VOICE_MACHINE);
|
|
33
12
|
const toolEventSubscribers = new Set();
|
|
34
13
|
const handleToolCallComplete = (event) => {
|
|
35
14
|
logger.debug("Tool call completed, notifying subscribers:", {
|
|
@@ -50,8 +29,10 @@ export function createYakProvider(options) {
|
|
|
50
29
|
(typeof window !== "undefined" ? (path) => window.location.assign(path) : undefined);
|
|
51
30
|
const embed = new YakEmbed({
|
|
52
31
|
appId: options.appId,
|
|
32
|
+
mode: options.mode,
|
|
53
33
|
theme: options.theme,
|
|
54
34
|
trigger: options.trigger ?? false,
|
|
35
|
+
getConfig: options.getConfig,
|
|
55
36
|
onToolCall: options.onToolCall,
|
|
56
37
|
onGraphQLSchemaCall: options.onGraphQLSchemaCall,
|
|
57
38
|
onRESTSchemaCall: options.onRESTSchemaCall,
|
|
@@ -59,11 +40,13 @@ export function createYakProvider(options) {
|
|
|
59
40
|
options: { disableRestartButton: options.disableRestartButton },
|
|
60
41
|
onToolCallComplete: handleToolCallComplete,
|
|
61
42
|
});
|
|
62
|
-
// Sync embed state → refs
|
|
63
43
|
embed.onStateChange((state) => {
|
|
64
44
|
isOpen.value = state.isOpen;
|
|
65
45
|
isReady.value = state.isReady;
|
|
66
46
|
});
|
|
47
|
+
embed.onVoiceStateChange((m) => {
|
|
48
|
+
voiceMachine.value = m;
|
|
49
|
+
});
|
|
67
50
|
// Fetch chat config on first open
|
|
68
51
|
if (options.getConfig) {
|
|
69
52
|
const getConfig = options.getConfig;
|
|
@@ -84,9 +67,20 @@ export function createYakProvider(options) {
|
|
|
84
67
|
}
|
|
85
68
|
});
|
|
86
69
|
}
|
|
70
|
+
const voiceStart = async () => {
|
|
71
|
+
try {
|
|
72
|
+
await embed.voiceStart();
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger.warn("Voice start failed", err);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const chatLoading = computed(() => isOpen.value && !isReady.value);
|
|
79
|
+
const voiceLoading = computed(() => voiceMachine.value.state === "connecting");
|
|
87
80
|
return {
|
|
88
81
|
isOpen: readonly(isOpen),
|
|
89
82
|
isReady: readonly(isReady),
|
|
83
|
+
chatLoading,
|
|
90
84
|
open: () => embed.open(),
|
|
91
85
|
close: () => embed.close(),
|
|
92
86
|
openWithPrompt: (prompt) => embed.openWithPrompt(prompt),
|
|
@@ -96,6 +90,11 @@ export function createYakProvider(options) {
|
|
|
96
90
|
toolEventSubscribers.delete(handler);
|
|
97
91
|
};
|
|
98
92
|
},
|
|
93
|
+
voiceMachine: readonly(voiceMachine),
|
|
94
|
+
voiceLoading,
|
|
95
|
+
voiceStart,
|
|
96
|
+
voiceStop: () => embed.voiceStop(),
|
|
97
|
+
voiceToggle: () => embed.voiceToggle(),
|
|
99
98
|
mount: () => embed.mount(),
|
|
100
99
|
destroy: () => embed.destroy(),
|
|
101
100
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yak-io/nuxt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Nuxt 3 module 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,18 +42,19 @@
|
|
|
41
42
|
"./package.json": "./package.json"
|
|
42
43
|
},
|
|
43
44
|
"dependencies": {
|
|
44
|
-
"@yak-io/javascript": "0.
|
|
45
|
+
"@yak-io/javascript": "0.9.0"
|
|
45
46
|
},
|
|
46
47
|
"peerDependencies": {
|
|
47
48
|
"nuxt": "^3.0.0",
|
|
48
49
|
"vue": "^3.3.0"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
|
-
"@types/node": "^24.12.
|
|
52
|
+
"@types/node": "^24.12.4",
|
|
52
53
|
"typescript": "^5.3.0",
|
|
53
|
-
"vue": "^3.5.
|
|
54
|
+
"vue": "^3.5.34",
|
|
54
55
|
"@repo/typescript-config": "0.0.0"
|
|
55
56
|
},
|
|
57
|
+
"homepage": "https://docs.yak.io/docs/sdks/nuxt",
|
|
56
58
|
"scripts": {
|
|
57
59
|
"build": "tsc",
|
|
58
60
|
"check-types": "tsc --noEmit",
|