@yak-io/nuxt 0.6.3 → 0.7.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/dist/index.cjs CHANGED
@@ -61,7 +61,10 @@ function createYakProvider(options) {
61
61
  getConfig: options.getConfig,
62
62
  onToolCall: options.onToolCall,
63
63
  onRedirect: resolvedRedirect,
64
- options: { disableRestartButton: options.disableRestartButton },
64
+ options: {
65
+ disableRestartButton: options.disableRestartButton,
66
+ disablePageContent: options.disablePageContent
67
+ },
65
68
  onToolCallComplete: handleToolCallComplete
66
69
  });
67
70
  embed.onStateChange((state) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/plugin.ts"],
4
- "sourcesContent": ["// Public API\n\n// Re-export useful types from @yak-io/javascript for consumers\nexport type {\n ChatConfigProvider,\n GraphQLRequest,\n RESTRequest,\n Theme,\n ThemeColors,\n ToolAdapter,\n ToolCallEvent,\n ToolCallHandler,\n TriggerButtonConfig,\n VoiceMachine,\n VoiceState,\n WidgetMode,\n WidgetPosition,\n YakServerAdapterConfig,\n YakToolset,\n} from \"@yak-io/javascript\";\n// Re-export tool composition + logging utilities\nexport {\n createYakServerAdapter,\n createYakToolset,\n disableYakLogging,\n enableYakLogging,\n isYakLoggingEnabled,\n} from \"@yak-io/javascript\";\nexport type { ToolCallEventHandler, YakApi, YakProviderOptions } from \"./plugin.js\";\nexport { createYakProvider } from \"./plugin.js\";\n", "import {\n type ChatConfigProvider,\n INITIAL_VOICE_MACHINE,\n logger,\n type Theme,\n type ToolCallEvent,\n type ToolCallHandler,\n type TriggerButtonConfig,\n type VoiceMachine,\n type WidgetMode,\n YakEmbed,\n} from \"@yak-io/javascript\";\nimport { computed, type DeepReadonly, type Ref, readonly, ref } from \"vue\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolCallEventHandler = (event: ToolCallEvent) => void;\n\nexport type YakProviderOptions = {\n appId: string;\n mode?: WidgetMode;\n getConfig?: ChatConfigProvider;\n onToolCall?: ToolCallHandler;\n theme?: Theme;\n onRedirect?: (path: string) => void;\n disableRestartButton?: boolean;\n trigger?: boolean | TriggerButtonConfig;\n};\n\n/** Reactive handle for controlling the Yak widget \u2014 chat + voice \u2014 from Nuxt. */\nexport type YakApi = {\n // \u2500\u2500 Chat \u2500\u2500\n /** Whether the chat panel is currently open. */\n isOpen: DeepReadonly<Ref<boolean>>;\n /** Whether the chat iframe is ready to receive messages. */\n isReady: DeepReadonly<Ref<boolean>>;\n /** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */\n chatLoading: DeepReadonly<Ref<boolean>>;\n /** Open the chat panel. */\n open: () => void;\n /** Close the chat panel. */\n close: () => void;\n /** Open the chat panel and send a specific prompt. */\n openWithPrompt: (prompt: string) => void;\n /** Subscribe to tool-call completion events; returns an unsubscribe function. */\n subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;\n // \u2500\u2500 Voice \u2500\u2500\n /** Current voice state-machine snapshot. `idle` when mode is `chat`. */\n voiceMachine: DeepReadonly<Ref<VoiceMachine>>;\n /** Whether the voice session is establishing its connection (`state === \"connecting\"`). */\n voiceLoading: DeepReadonly<Ref<boolean>>;\n /** Start a voice session. Must be invoked from a user gesture. */\n voiceStart: () => Promise<void>;\n /** Stop the current voice session. */\n voiceStop: () => Promise<void>;\n /** Toggle voice: start if idle/error, stop if active. */\n voiceToggle: () => Promise<void>;\n // \u2500\u2500 Lifecycle \u2500\u2500\n /** Mount the widget into the DOM. */\n mount: () => void;\n /** Tear down the widget and remove its listeners. */\n destroy: () => void;\n};\n\n// \u2500\u2500 Provider factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Creates a yak widget (chat + voice) for Nuxt.\n * SSR-safe: call `mount()` only on the client side.\n */\nexport function createYakProvider(options: YakProviderOptions): YakApi {\n const isOpen = ref(false);\n const isReady = ref(false);\n const voiceMachine = ref<VoiceMachine>(INITIAL_VOICE_MACHINE);\n const toolEventSubscribers = new Set<ToolCallEventHandler>();\n\n const handleToolCallComplete = (event: ToolCallEvent) => {\n logger.debug(\"Tool call completed, notifying subscribers:\", {\n name: event.name,\n ok: event.ok,\n subscriberCount: toolEventSubscribers.size,\n });\n for (const handler of toolEventSubscribers) {\n try {\n handler(event);\n } catch (err) {\n logger.warn(\"Error in tool event subscriber:\", err);\n }\n }\n };\n\n const resolvedRedirect =\n options.onRedirect ??\n (typeof window !== \"undefined\" ? (path: string) => window.location.assign(path) : undefined);\n\n const embed = new YakEmbed({\n appId: options.appId,\n mode: options.mode,\n theme: options.theme,\n trigger: options.trigger ?? false,\n getConfig: options.getConfig,\n onToolCall: options.onToolCall,\n onRedirect: resolvedRedirect,\n options: { disableRestartButton: options.disableRestartButton },\n onToolCallComplete: handleToolCallComplete,\n });\n\n embed.onStateChange((state) => {\n isOpen.value = state.isOpen;\n isReady.value = state.isReady;\n });\n embed.onVoiceStateChange((m) => {\n voiceMachine.value = m;\n });\n\n // Fetch chat config on first open\n if (options.getConfig) {\n const getConfig = options.getConfig;\n let configFetched = false;\n\n embed.onStateChange((state) => {\n if (state.isOpen && !configFetched) {\n configFetched = true;\n logger.debug(\"Getting chat config\");\n\n Promise.resolve(getConfig())\n .then((config) => {\n logger.debug(\n `Chat config loaded with ${config.tools?.tools.length ?? 0} tools and ${config.routes?.routes.length ?? 0} routes`\n );\n embed.getClient().updateConfig({ chatConfig: config });\n })\n .catch((err) => {\n logger.warn(\"Error getting chat config:\", err);\n configFetched = false;\n });\n }\n });\n }\n\n const voiceStart = async () => {\n try {\n await embed.voiceStart();\n } catch (err) {\n logger.warn(\"Voice start failed\", err);\n }\n };\n\n const chatLoading = computed(() => isOpen.value && !isReady.value);\n const voiceLoading = computed(() => voiceMachine.value.state === \"connecting\");\n\n return {\n isOpen: readonly(isOpen),\n isReady: readonly(isReady),\n chatLoading,\n open: () => embed.open(),\n close: () => embed.close(),\n openWithPrompt: (prompt: string) => embed.openWithPrompt(prompt),\n subscribeToToolEvents: (handler: ToolCallEventHandler) => {\n toolEventSubscribers.add(handler);\n return () => {\n toolEventSubscribers.delete(handler);\n };\n },\n voiceMachine: readonly(voiceMachine),\n voiceLoading,\n voiceStart,\n voiceStop: () => embed.voiceStop(),\n voiceToggle: () => embed.voiceToggle(),\n mount: () => embed.mount(),\n destroy: () => embed.destroy(),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Public API\n\n// Re-export useful types from @yak-io/javascript for consumers\nexport type {\n ChatConfigProvider,\n GraphQLRequest,\n RESTRequest,\n Theme,\n ThemeColors,\n ToolAdapter,\n ToolCallEvent,\n ToolCallHandler,\n TriggerButtonConfig,\n VoiceMachine,\n VoiceState,\n WidgetMode,\n WidgetPosition,\n YakServerAdapterConfig,\n YakToolset,\n} from \"@yak-io/javascript\";\n// Re-export tool composition + logging utilities\nexport {\n createYakServerAdapter,\n createYakToolset,\n disableYakLogging,\n enableYakLogging,\n isYakLoggingEnabled,\n} from \"@yak-io/javascript\";\nexport type { ToolCallEventHandler, YakApi, YakProviderOptions } from \"./plugin.js\";\nexport { createYakProvider } from \"./plugin.js\";\n", "import {\n type ChatConfigProvider,\n INITIAL_VOICE_MACHINE,\n logger,\n type Theme,\n type ToolCallEvent,\n type ToolCallHandler,\n type TriggerButtonConfig,\n type VoiceMachine,\n type WidgetMode,\n YakEmbed,\n} from \"@yak-io/javascript\";\nimport { computed, type DeepReadonly, type Ref, readonly, ref } from \"vue\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolCallEventHandler = (event: ToolCallEvent) => void;\n\nexport type YakProviderOptions = {\n appId: string;\n mode?: WidgetMode;\n getConfig?: ChatConfigProvider;\n onToolCall?: ToolCallHandler;\n theme?: Theme;\n onRedirect?: (path: string) => void;\n disableRestartButton?: boolean;\n /**\n * Privacy opt-out: stop sending any page context (URL, title, visible text)\n * to the assistant. The widget still works; it just won't be aware of the\n * current page.\n */\n disablePageContent?: boolean;\n trigger?: boolean | TriggerButtonConfig;\n};\n\n/** Reactive handle for controlling the Yak widget \u2014 chat + voice \u2014 from Nuxt. */\nexport type YakApi = {\n // \u2500\u2500 Chat \u2500\u2500\n /** Whether the chat panel is currently open. */\n isOpen: DeepReadonly<Ref<boolean>>;\n /** Whether the chat iframe is ready to receive messages. */\n isReady: DeepReadonly<Ref<boolean>>;\n /** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */\n chatLoading: DeepReadonly<Ref<boolean>>;\n /** Open the chat panel. */\n open: () => void;\n /** Close the chat panel. */\n close: () => void;\n /** Open the chat panel and send a specific prompt. */\n openWithPrompt: (prompt: string) => void;\n /** Subscribe to tool-call completion events; returns an unsubscribe function. */\n subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;\n // \u2500\u2500 Voice \u2500\u2500\n /** Current voice state-machine snapshot. `idle` when mode is `chat`. */\n voiceMachine: DeepReadonly<Ref<VoiceMachine>>;\n /** Whether the voice session is establishing its connection (`state === \"connecting\"`). */\n voiceLoading: DeepReadonly<Ref<boolean>>;\n /** Start a voice session. Must be invoked from a user gesture. */\n voiceStart: () => Promise<void>;\n /** Stop the current voice session. */\n voiceStop: () => Promise<void>;\n /** Toggle voice: start if idle/error, stop if active. */\n voiceToggle: () => Promise<void>;\n // \u2500\u2500 Lifecycle \u2500\u2500\n /** Mount the widget into the DOM. */\n mount: () => void;\n /** Tear down the widget and remove its listeners. */\n destroy: () => void;\n};\n\n// \u2500\u2500 Provider factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Creates a yak widget (chat + voice) for Nuxt.\n * SSR-safe: call `mount()` only on the client side.\n */\nexport function createYakProvider(options: YakProviderOptions): YakApi {\n const isOpen = ref(false);\n const isReady = ref(false);\n const voiceMachine = ref<VoiceMachine>(INITIAL_VOICE_MACHINE);\n const toolEventSubscribers = new Set<ToolCallEventHandler>();\n\n const handleToolCallComplete = (event: ToolCallEvent) => {\n logger.debug(\"Tool call completed, notifying subscribers:\", {\n name: event.name,\n ok: event.ok,\n subscriberCount: toolEventSubscribers.size,\n });\n for (const handler of toolEventSubscribers) {\n try {\n handler(event);\n } catch (err) {\n logger.warn(\"Error in tool event subscriber:\", err);\n }\n }\n };\n\n const resolvedRedirect =\n options.onRedirect ??\n (typeof window !== \"undefined\" ? (path: string) => window.location.assign(path) : undefined);\n\n const embed = new YakEmbed({\n appId: options.appId,\n mode: options.mode,\n theme: options.theme,\n trigger: options.trigger ?? false,\n getConfig: options.getConfig,\n onToolCall: options.onToolCall,\n onRedirect: resolvedRedirect,\n options: {\n disableRestartButton: options.disableRestartButton,\n disablePageContent: options.disablePageContent,\n },\n onToolCallComplete: handleToolCallComplete,\n });\n\n embed.onStateChange((state) => {\n isOpen.value = state.isOpen;\n isReady.value = state.isReady;\n });\n embed.onVoiceStateChange((m) => {\n voiceMachine.value = m;\n });\n\n // Fetch chat config on first open\n if (options.getConfig) {\n const getConfig = options.getConfig;\n let configFetched = false;\n\n embed.onStateChange((state) => {\n if (state.isOpen && !configFetched) {\n configFetched = true;\n logger.debug(\"Getting chat config\");\n\n Promise.resolve(getConfig())\n .then((config) => {\n logger.debug(\n `Chat config loaded with ${config.tools?.tools.length ?? 0} tools and ${config.routes?.routes.length ?? 0} routes`\n );\n embed.getClient().updateConfig({ chatConfig: config });\n })\n .catch((err) => {\n logger.warn(\"Error getting chat config:\", err);\n configFetched = false;\n });\n }\n });\n }\n\n const voiceStart = async () => {\n try {\n await embed.voiceStart();\n } catch (err) {\n logger.warn(\"Voice start failed\", err);\n }\n };\n\n const chatLoading = computed(() => isOpen.value && !isReady.value);\n const voiceLoading = computed(() => voiceMachine.value.state === \"connecting\");\n\n return {\n isOpen: readonly(isOpen),\n isReady: readonly(isReady),\n chatLoading,\n open: () => embed.open(),\n close: () => embed.close(),\n openWithPrompt: (prompt: string) => embed.openWithPrompt(prompt),\n subscribeToToolEvents: (handler: ToolCallEventHandler) => {\n toolEventSubscribers.add(handler);\n return () => {\n toolEventSubscribers.delete(handler);\n };\n },\n voiceMachine: readonly(voiceMachine),\n voiceLoading,\n voiceStart,\n voiceStop: () => embed.voiceStop(),\n voiceToggle: () => embed.voiceToggle(),\n mount: () => embed.mount(),\n destroy: () => embed.destroy(),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_javascript"]
7
7
  }
package/dist/index.js CHANGED
@@ -42,7 +42,10 @@ function createYakProvider(options) {
42
42
  getConfig: options.getConfig,
43
43
  onToolCall: options.onToolCall,
44
44
  onRedirect: resolvedRedirect,
45
- options: { disableRestartButton: options.disableRestartButton },
45
+ options: {
46
+ disableRestartButton: options.disableRestartButton,
47
+ disablePageContent: options.disablePageContent
48
+ },
46
49
  onToolCallComplete: handleToolCallComplete
47
50
  });
48
51
  embed.onStateChange((state) => {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/plugin.ts"],
4
- "sourcesContent": ["// Public API\n\n// Re-export useful types from @yak-io/javascript for consumers\nexport type {\n ChatConfigProvider,\n GraphQLRequest,\n RESTRequest,\n Theme,\n ThemeColors,\n ToolAdapter,\n ToolCallEvent,\n ToolCallHandler,\n TriggerButtonConfig,\n VoiceMachine,\n VoiceState,\n WidgetMode,\n WidgetPosition,\n YakServerAdapterConfig,\n YakToolset,\n} from \"@yak-io/javascript\";\n// Re-export tool composition + logging utilities\nexport {\n createYakServerAdapter,\n createYakToolset,\n disableYakLogging,\n enableYakLogging,\n isYakLoggingEnabled,\n} from \"@yak-io/javascript\";\nexport type { ToolCallEventHandler, YakApi, YakProviderOptions } from \"./plugin.js\";\nexport { createYakProvider } from \"./plugin.js\";\n", "import {\n type ChatConfigProvider,\n INITIAL_VOICE_MACHINE,\n logger,\n type Theme,\n type ToolCallEvent,\n type ToolCallHandler,\n type TriggerButtonConfig,\n type VoiceMachine,\n type WidgetMode,\n YakEmbed,\n} from \"@yak-io/javascript\";\nimport { computed, type DeepReadonly, type Ref, readonly, ref } from \"vue\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolCallEventHandler = (event: ToolCallEvent) => void;\n\nexport type YakProviderOptions = {\n appId: string;\n mode?: WidgetMode;\n getConfig?: ChatConfigProvider;\n onToolCall?: ToolCallHandler;\n theme?: Theme;\n onRedirect?: (path: string) => void;\n disableRestartButton?: boolean;\n trigger?: boolean | TriggerButtonConfig;\n};\n\n/** Reactive handle for controlling the Yak widget \u2014 chat + voice \u2014 from Nuxt. */\nexport type YakApi = {\n // \u2500\u2500 Chat \u2500\u2500\n /** Whether the chat panel is currently open. */\n isOpen: DeepReadonly<Ref<boolean>>;\n /** Whether the chat iframe is ready to receive messages. */\n isReady: DeepReadonly<Ref<boolean>>;\n /** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */\n chatLoading: DeepReadonly<Ref<boolean>>;\n /** Open the chat panel. */\n open: () => void;\n /** Close the chat panel. */\n close: () => void;\n /** Open the chat panel and send a specific prompt. */\n openWithPrompt: (prompt: string) => void;\n /** Subscribe to tool-call completion events; returns an unsubscribe function. */\n subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;\n // \u2500\u2500 Voice \u2500\u2500\n /** Current voice state-machine snapshot. `idle` when mode is `chat`. */\n voiceMachine: DeepReadonly<Ref<VoiceMachine>>;\n /** Whether the voice session is establishing its connection (`state === \"connecting\"`). */\n voiceLoading: DeepReadonly<Ref<boolean>>;\n /** Start a voice session. Must be invoked from a user gesture. */\n voiceStart: () => Promise<void>;\n /** Stop the current voice session. */\n voiceStop: () => Promise<void>;\n /** Toggle voice: start if idle/error, stop if active. */\n voiceToggle: () => Promise<void>;\n // \u2500\u2500 Lifecycle \u2500\u2500\n /** Mount the widget into the DOM. */\n mount: () => void;\n /** Tear down the widget and remove its listeners. */\n destroy: () => void;\n};\n\n// \u2500\u2500 Provider factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Creates a yak widget (chat + voice) for Nuxt.\n * SSR-safe: call `mount()` only on the client side.\n */\nexport function createYakProvider(options: YakProviderOptions): YakApi {\n const isOpen = ref(false);\n const isReady = ref(false);\n const voiceMachine = ref<VoiceMachine>(INITIAL_VOICE_MACHINE);\n const toolEventSubscribers = new Set<ToolCallEventHandler>();\n\n const handleToolCallComplete = (event: ToolCallEvent) => {\n logger.debug(\"Tool call completed, notifying subscribers:\", {\n name: event.name,\n ok: event.ok,\n subscriberCount: toolEventSubscribers.size,\n });\n for (const handler of toolEventSubscribers) {\n try {\n handler(event);\n } catch (err) {\n logger.warn(\"Error in tool event subscriber:\", err);\n }\n }\n };\n\n const resolvedRedirect =\n options.onRedirect ??\n (typeof window !== \"undefined\" ? (path: string) => window.location.assign(path) : undefined);\n\n const embed = new YakEmbed({\n appId: options.appId,\n mode: options.mode,\n theme: options.theme,\n trigger: options.trigger ?? false,\n getConfig: options.getConfig,\n onToolCall: options.onToolCall,\n onRedirect: resolvedRedirect,\n options: { disableRestartButton: options.disableRestartButton },\n onToolCallComplete: handleToolCallComplete,\n });\n\n embed.onStateChange((state) => {\n isOpen.value = state.isOpen;\n isReady.value = state.isReady;\n });\n embed.onVoiceStateChange((m) => {\n voiceMachine.value = m;\n });\n\n // Fetch chat config on first open\n if (options.getConfig) {\n const getConfig = options.getConfig;\n let configFetched = false;\n\n embed.onStateChange((state) => {\n if (state.isOpen && !configFetched) {\n configFetched = true;\n logger.debug(\"Getting chat config\");\n\n Promise.resolve(getConfig())\n .then((config) => {\n logger.debug(\n `Chat config loaded with ${config.tools?.tools.length ?? 0} tools and ${config.routes?.routes.length ?? 0} routes`\n );\n embed.getClient().updateConfig({ chatConfig: config });\n })\n .catch((err) => {\n logger.warn(\"Error getting chat config:\", err);\n configFetched = false;\n });\n }\n });\n }\n\n const voiceStart = async () => {\n try {\n await embed.voiceStart();\n } catch (err) {\n logger.warn(\"Voice start failed\", err);\n }\n };\n\n const chatLoading = computed(() => isOpen.value && !isReady.value);\n const voiceLoading = computed(() => voiceMachine.value.state === \"connecting\");\n\n return {\n isOpen: readonly(isOpen),\n isReady: readonly(isReady),\n chatLoading,\n open: () => embed.open(),\n close: () => embed.close(),\n openWithPrompt: (prompt: string) => embed.openWithPrompt(prompt),\n subscribeToToolEvents: (handler: ToolCallEventHandler) => {\n toolEventSubscribers.add(handler);\n return () => {\n toolEventSubscribers.delete(handler);\n };\n },\n voiceMachine: readonly(voiceMachine),\n voiceLoading,\n voiceStart,\n voiceStop: () => embed.voiceStop(),\n voiceToggle: () => embed.voiceToggle(),\n mount: () => embed.mount(),\n destroy: () => embed.destroy(),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Public API\n\n// Re-export useful types from @yak-io/javascript for consumers\nexport type {\n ChatConfigProvider,\n GraphQLRequest,\n RESTRequest,\n Theme,\n ThemeColors,\n ToolAdapter,\n ToolCallEvent,\n ToolCallHandler,\n TriggerButtonConfig,\n VoiceMachine,\n VoiceState,\n WidgetMode,\n WidgetPosition,\n YakServerAdapterConfig,\n YakToolset,\n} from \"@yak-io/javascript\";\n// Re-export tool composition + logging utilities\nexport {\n createYakServerAdapter,\n createYakToolset,\n disableYakLogging,\n enableYakLogging,\n isYakLoggingEnabled,\n} from \"@yak-io/javascript\";\nexport type { ToolCallEventHandler, YakApi, YakProviderOptions } from \"./plugin.js\";\nexport { createYakProvider } from \"./plugin.js\";\n", "import {\n type ChatConfigProvider,\n INITIAL_VOICE_MACHINE,\n logger,\n type Theme,\n type ToolCallEvent,\n type ToolCallHandler,\n type TriggerButtonConfig,\n type VoiceMachine,\n type WidgetMode,\n YakEmbed,\n} from \"@yak-io/javascript\";\nimport { computed, type DeepReadonly, type Ref, readonly, ref } from \"vue\";\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolCallEventHandler = (event: ToolCallEvent) => void;\n\nexport type YakProviderOptions = {\n appId: string;\n mode?: WidgetMode;\n getConfig?: ChatConfigProvider;\n onToolCall?: ToolCallHandler;\n theme?: Theme;\n onRedirect?: (path: string) => void;\n disableRestartButton?: boolean;\n /**\n * Privacy opt-out: stop sending any page context (URL, title, visible text)\n * to the assistant. The widget still works; it just won't be aware of the\n * current page.\n */\n disablePageContent?: boolean;\n trigger?: boolean | TriggerButtonConfig;\n};\n\n/** Reactive handle for controlling the Yak widget \u2014 chat + voice \u2014 from Nuxt. */\nexport type YakApi = {\n // \u2500\u2500 Chat \u2500\u2500\n /** Whether the chat panel is currently open. */\n isOpen: DeepReadonly<Ref<boolean>>;\n /** Whether the chat iframe is ready to receive messages. */\n isReady: DeepReadonly<Ref<boolean>>;\n /** Whether the chat is opening but not yet interactive (`isOpen && !isReady`). */\n chatLoading: DeepReadonly<Ref<boolean>>;\n /** Open the chat panel. */\n open: () => void;\n /** Close the chat panel. */\n close: () => void;\n /** Open the chat panel and send a specific prompt. */\n openWithPrompt: (prompt: string) => void;\n /** Subscribe to tool-call completion events; returns an unsubscribe function. */\n subscribeToToolEvents: (handler: ToolCallEventHandler) => () => void;\n // \u2500\u2500 Voice \u2500\u2500\n /** Current voice state-machine snapshot. `idle` when mode is `chat`. */\n voiceMachine: DeepReadonly<Ref<VoiceMachine>>;\n /** Whether the voice session is establishing its connection (`state === \"connecting\"`). */\n voiceLoading: DeepReadonly<Ref<boolean>>;\n /** Start a voice session. Must be invoked from a user gesture. */\n voiceStart: () => Promise<void>;\n /** Stop the current voice session. */\n voiceStop: () => Promise<void>;\n /** Toggle voice: start if idle/error, stop if active. */\n voiceToggle: () => Promise<void>;\n // \u2500\u2500 Lifecycle \u2500\u2500\n /** Mount the widget into the DOM. */\n mount: () => void;\n /** Tear down the widget and remove its listeners. */\n destroy: () => void;\n};\n\n// \u2500\u2500 Provider factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Creates a yak widget (chat + voice) for Nuxt.\n * SSR-safe: call `mount()` only on the client side.\n */\nexport function createYakProvider(options: YakProviderOptions): YakApi {\n const isOpen = ref(false);\n const isReady = ref(false);\n const voiceMachine = ref<VoiceMachine>(INITIAL_VOICE_MACHINE);\n const toolEventSubscribers = new Set<ToolCallEventHandler>();\n\n const handleToolCallComplete = (event: ToolCallEvent) => {\n logger.debug(\"Tool call completed, notifying subscribers:\", {\n name: event.name,\n ok: event.ok,\n subscriberCount: toolEventSubscribers.size,\n });\n for (const handler of toolEventSubscribers) {\n try {\n handler(event);\n } catch (err) {\n logger.warn(\"Error in tool event subscriber:\", err);\n }\n }\n };\n\n const resolvedRedirect =\n options.onRedirect ??\n (typeof window !== \"undefined\" ? (path: string) => window.location.assign(path) : undefined);\n\n const embed = new YakEmbed({\n appId: options.appId,\n mode: options.mode,\n theme: options.theme,\n trigger: options.trigger ?? false,\n getConfig: options.getConfig,\n onToolCall: options.onToolCall,\n onRedirect: resolvedRedirect,\n options: {\n disableRestartButton: options.disableRestartButton,\n disablePageContent: options.disablePageContent,\n },\n onToolCallComplete: handleToolCallComplete,\n });\n\n embed.onStateChange((state) => {\n isOpen.value = state.isOpen;\n isReady.value = state.isReady;\n });\n embed.onVoiceStateChange((m) => {\n voiceMachine.value = m;\n });\n\n // Fetch chat config on first open\n if (options.getConfig) {\n const getConfig = options.getConfig;\n let configFetched = false;\n\n embed.onStateChange((state) => {\n if (state.isOpen && !configFetched) {\n configFetched = true;\n logger.debug(\"Getting chat config\");\n\n Promise.resolve(getConfig())\n .then((config) => {\n logger.debug(\n `Chat config loaded with ${config.tools?.tools.length ?? 0} tools and ${config.routes?.routes.length ?? 0} routes`\n );\n embed.getClient().updateConfig({ chatConfig: config });\n })\n .catch((err) => {\n logger.warn(\"Error getting chat config:\", err);\n configFetched = false;\n });\n }\n });\n }\n\n const voiceStart = async () => {\n try {\n await embed.voiceStart();\n } catch (err) {\n logger.warn(\"Voice start failed\", err);\n }\n };\n\n const chatLoading = computed(() => isOpen.value && !isReady.value);\n const voiceLoading = computed(() => voiceMachine.value.state === \"connecting\");\n\n return {\n isOpen: readonly(isOpen),\n isReady: readonly(isReady),\n chatLoading,\n open: () => embed.open(),\n close: () => embed.close(),\n openWithPrompt: (prompt: string) => embed.openWithPrompt(prompt),\n subscribeToToolEvents: (handler: ToolCallEventHandler) => {\n toolEventSubscribers.add(handler);\n return () => {\n toolEventSubscribers.delete(handler);\n };\n },\n voiceMachine: readonly(voiceMachine),\n voiceLoading,\n voiceStart,\n voiceStop: () => embed.voiceStop(),\n voiceToggle: () => embed.voiceToggle(),\n mount: () => embed.mount(),\n destroy: () => embed.destroy(),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/plugin.d.ts CHANGED
@@ -9,6 +9,12 @@ export type YakProviderOptions = {
9
9
  theme?: Theme;
10
10
  onRedirect?: (path: string) => void;
11
11
  disableRestartButton?: boolean;
12
+ /**
13
+ * Privacy opt-out: stop sending any page context (URL, title, visible text)
14
+ * to the assistant. The widget still works; it just won't be aware of the
15
+ * current page.
16
+ */
17
+ disablePageContent?: boolean;
12
18
  trigger?: boolean | TriggerButtonConfig;
13
19
  };
14
20
  /** Reactive handle for controlling the Yak widget — chat + voice — from Nuxt. */
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.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;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,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,CAsGrE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.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;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,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,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,CAyGrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yak-io/nuxt",
3
- "version": "0.6.3",
3
+ "version": "0.7.0",
4
4
  "description": "Nuxt 3 module for embedding yak chatbot",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -43,7 +43,7 @@
43
43
  "./package.json": "./package.json"
44
44
  },
45
45
  "dependencies": {
46
- "@yak-io/javascript": "0.12.0"
46
+ "@yak-io/javascript": "0.13.0"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "nuxt": "^3.0.0",