@ourlu/assistant-sdk 0.2.4 → 0.2.6

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.
Files changed (68) hide show
  1. package/dist/iife/audio.v1.028c93fe.js +160 -0
  2. package/dist/iife/audio.v1.051ececf.js +183 -0
  3. package/dist/iife/audio.v1.200db1a6.js +208 -0
  4. package/dist/iife/audio.v1.20858b08.js +191 -0
  5. package/dist/iife/audio.v1.2690e445.js +179 -0
  6. package/dist/iife/audio.v1.2742ff12.js +188 -0
  7. package/dist/iife/audio.v1.70af81b3.js +191 -0
  8. package/dist/iife/audio.v1.95146620.js +1 -1
  9. package/dist/iife/audio.v1.b330baaf.js +166 -0
  10. package/dist/iife/audio.v1.bb9c2d88.js +181 -0
  11. package/dist/iife/audio.v1.ea7571b2.js +182 -0
  12. package/dist/iife/audio.v1.fc0aa8af.js +191 -0
  13. package/dist/iife/audio.v1.js +107 -95
  14. package/dist/iife/engine.v1.19c589a2.js +861 -0
  15. package/dist/iife/engine.v1.2b5bb43b.js +3 -3
  16. package/dist/iife/engine.v1.3b09dc20.js +3 -3
  17. package/dist/iife/engine.v1.56074e5a.js +769 -0
  18. package/dist/iife/engine.v1.61c10e6c.js +770 -0
  19. package/dist/iife/engine.v1.773fc15d.js +2 -2
  20. package/dist/iife/engine.v1.80d2230f.js +3 -3
  21. package/dist/iife/engine.v1.940ba9ea.js +764 -0
  22. package/dist/iife/engine.v1.99a33ee2.js +767 -0
  23. package/dist/iife/engine.v1.9ca6b7ec.js +3 -3
  24. package/dist/iife/engine.v1.a1f7dea2.js +764 -0
  25. package/dist/iife/engine.v1.bc9c0b5e.js +838 -0
  26. package/dist/iife/engine.v1.c0c00bd0.js +3 -3
  27. package/dist/iife/engine.v1.c127656e.js +820 -0
  28. package/dist/iife/engine.v1.c54c9a1a.js +3 -3
  29. package/dist/iife/engine.v1.d1052e81.js +3 -3
  30. package/dist/iife/engine.v1.ec035c58.js +782 -0
  31. package/dist/iife/engine.v1.f6d23a0f.js +770 -0
  32. package/dist/iife/engine.v1.js +116 -25
  33. package/dist/iife/loader.v1.js +9 -1
  34. package/dist/iife/plu.v1.cc853a2d.js +458 -0
  35. package/dist/iife/plu.v1.js +458 -0
  36. package/dist/iife/signalement.v1.d321dfde.js +518 -0
  37. package/dist/iife/signalement.v1.js +518 -0
  38. package/dist/iife/ui.v1.00abf020.js +895 -0
  39. package/dist/iife/ui.v1.0caedc90.js +1018 -0
  40. package/dist/iife/ui.v1.0ccf99d5.js +997 -0
  41. package/dist/iife/ui.v1.11a41f0d.js +1007 -0
  42. package/dist/iife/ui.v1.12986798.js +962 -0
  43. package/dist/iife/ui.v1.15b2cd71.js +986 -0
  44. package/dist/iife/ui.v1.163772e6.js +962 -0
  45. package/dist/iife/ui.v1.3a1d08a0.js +1007 -0
  46. package/dist/iife/ui.v1.3c0cf4da.js +947 -0
  47. package/dist/iife/ui.v1.3fcff562.js +997 -0
  48. package/dist/iife/ui.v1.44616ccb.js +986 -0
  49. package/dist/iife/ui.v1.4e202266.js +1007 -0
  50. package/dist/iife/ui.v1.6becaa84.js +895 -0
  51. package/dist/iife/ui.v1.6c9e4995.js +895 -0
  52. package/dist/iife/ui.v1.7432d2af.js +995 -0
  53. package/dist/iife/ui.v1.84d77387.js +1003 -0
  54. package/dist/iife/ui.v1.857a0e8b.js +986 -0
  55. package/dist/iife/ui.v1.88bf5494.js +898 -0
  56. package/dist/iife/ui.v1.89fbfdd9.js +963 -0
  57. package/dist/iife/ui.v1.a588a766.js +997 -0
  58. package/dist/iife/ui.v1.a8cfe724.js +900 -0
  59. package/dist/iife/ui.v1.cd72e7c3.js +1006 -0
  60. package/dist/iife/ui.v1.e007c7c4.js +926 -0
  61. package/dist/iife/ui.v1.e24ba2bd.js +903 -0
  62. package/dist/iife/ui.v1.e8703c6d.js +1006 -0
  63. package/dist/iife/ui.v1.f1d8e998.js +903 -0
  64. package/dist/iife/ui.v1.f6857351.js +995 -0
  65. package/dist/iife/ui.v1.fc52b520.js +895 -0
  66. package/dist/iife/ui.v1.js +145 -86
  67. package/dist/iife/widget-manifest.json +5 -3
  68. package/package.json +3 -1
@@ -10,7 +10,7 @@
10
10
  var WidgetUIManager = runtime.WidgetUIManager, WidgetAudioManager = runtime.WidgetAudioManager;
11
11
  var EventBus = runtime.EventBus, CONTAINER_ID = runtime.constants.CONTAINER_ID;
12
12
  var MASCOT_SPECS = JSON.parse('[["mascotSecondaryColor","mascot_secondary_color","data-mascot-secondary-color","#68b1d6"],["mascotSecondaryDarkColor","mascot_secondary_dark_color","data-mascot-secondary-dark-color","#1472a8"],["mascotGoldColor","mascot_gold_color","data-mascot-gold-color","#ffd22e"],["mascotEyeColor","mascot_eye_color","data-mascot-eye-color","#040402"],["mascotBeakColor","mascot_beak_color","data-mascot-beak-color","#ab5f30"],["mascotClawColor","mascot_claw_color","data-mascot-claw-color","#ab5f30"],["mascotNeutralColor","mascot_neutral_color","data-mascot-neutral-color","#e6e6e6"],["mascotBrowColor","mascot_brow_color","data-mascot-brow-color","#3e3e3e"]]');
13
- var CONFIG_STRING_ATTRS = JSON.parse('[["tenantId","data-tenant-id",""],["widgetKey","data-widget-key",""],["apiBaseUrl","data-api-base-url",""],["widgetOrigin","data-widget-origin",""],["bootstrapEndpoint","data-bootstrap-endpoint",""],["configEndpoint","data-config-endpoint",""],["sessionBootstrapToken","data-session-bootstrap-token",""],["sessionBootstrapTokenExpiresAt","data-session-bootstrap-token-expires-at",""],["chatSessionEndpoint","data-chat-session-endpoint","/v1/occe/chat/sessions"],["chatMessageTemplate","data-chat-message-template","/v1/occe/chat/sessions/{session_id}/messages"],["chatStreamTemplate","data-chat-stream-template","/v1/occe/chat/sessions/{session_id}/stream"],["chatAudioSessionTemplate","data-chat-audio-session-template","/v1/occe/chat/sessions/{session_id}/audio/session"],["chatAudioChunkTemplate","data-chat-audio-chunk-template","/v1/occe/chat/sessions/{session_id}/audio/chunk"],["chatAudioCloseTemplate","data-chat-audio-close-template","/v1/occe/chat/sessions/{session_id}/audio/close"],["chatAudioStreamTemplate","data-chat-audio-stream-template","/v1/occe/chat/sessions/{session_id}/audio/stream"],["panelWidth","data-panel-width","420"],["panelHeight","data-panel-height","640"],["panelMaxHeightVh","data-panel-max-height-vh","85"],["mascotUrl","data-mascot-url",""],["welcomeMessage","data-welcome-message","Bonjour ! Comment puis-je vous aider ?"],["disclaimerText","data-disclaimer-text","Assistant IA - Les reponses ne constituent pas une decision administrative officielle."],["transparencyText","data-transparency-text","Reponses generees par intelligence artificielle."]]');
13
+ var CONFIG_STRING_ATTRS = JSON.parse('[["tenantId","data-tenant-id",""],["widgetKey","data-widget-key",""],["apiBaseUrl","data-api-base-url",""],["widgetOrigin","data-widget-origin",""],["bootstrapEndpoint","data-bootstrap-endpoint",""],["configEndpoint","data-config-endpoint",""],["sessionBootstrapToken","data-session-bootstrap-token",""],["sessionBootstrapTokenExpiresAt","data-session-bootstrap-token-expires-at",""],["chatSessionEndpoint","data-chat-session-endpoint","/v1/occe/chat/sessions"],["chatMessageTemplate","data-chat-message-template","/v1/occe/chat/sessions/{session_id}/messages"],["chatStreamTemplate","data-chat-stream-template","/v1/occe/chat/sessions/{session_id}/stream"],["chatAudioSessionTemplate","data-chat-audio-session-template","/v1/occe/chat/sessions/{session_id}/audio/session"],["chatAudioChunkTemplate","data-chat-audio-chunk-template","/v1/occe/chat/sessions/{session_id}/audio/chunk"],["chatAudioCloseTemplate","data-chat-audio-close-template","/v1/occe/chat/sessions/{session_id}/audio/close"],["chatAudioStreamTemplate","data-chat-audio-stream-template","/v1/occe/chat/sessions/{session_id}/audio/stream"],["panelWidth","data-panel-width","420"],["panelHeight","data-panel-height","640"],["panelMaxHeightVh","data-panel-max-height-vh","85"],["mascotUrl","data-mascot-url",""],["welcomeMessage","data-welcome-message","Bonjour ! Comment puis-je vous aider ?"],["disclaimerText","data-disclaimer-text","Les r\u00e9ponses g\u00e9n\u00e9r\u00e9es par IA ne constituent pas une d\u00e9cision administrative officielle."],["transparencyText","data-transparency-text","Propuls\u00e9 par Ourlu \u00b7 IA locale et transparente."]]');
14
14
  var RUNTIME_ENDPOINT_SPECS = JSON.parse('[["chatSessionEndpoint","chat_session_endpoint","/v1/occe/chat/sessions"],["chatMessageTemplate","chat_message_template","/v1/occe/chat/sessions/{session_id}/messages"],["chatStreamTemplate","chat_stream_template","/v1/occe/chat/sessions/{session_id}/stream"],["chatAudioSessionTemplate","chat_audio_session_template","/v1/occe/chat/sessions/{session_id}/audio/session"],["chatAudioChunkTemplate","chat_audio_chunk_template","/v1/occe/chat/sessions/{session_id}/audio/chunk"],["chatAudioCloseTemplate","chat_audio_close_template","/v1/occe/chat/sessions/{session_id}/audio/close"],["chatAudioStreamTemplate","chat_audio_stream_template","/v1/occe/chat/sessions/{session_id}/audio/stream"]]');
15
15
  function applyMascotLabelColors(config, labels) {
16
16
  MASCOT_SPECS.forEach(function(spec) {
@@ -51,6 +51,12 @@ function normalizeHexColor(rawValue, fallbackColor) {
51
51
  var normalized = String(rawValue || "").trim().toLowerCase();
52
52
  return /^#[0-9a-f]{6}$/.test(normalized) ? normalized : fallbackColor;
53
53
  }
54
+ function normalizeLabelBool(rawValue, fallbackValue) {
55
+ var normalized = String(rawValue || "").trim().toLowerCase();
56
+ if (normalized === "true") return true;
57
+ if (normalized === "false") return false;
58
+ return Boolean(fallbackValue);
59
+ }
54
60
  function normalizePosition(rawValue, fallbackValue) {
55
61
  var normalized = String(rawValue || "").trim().toLowerCase();
56
62
  return normalized === "bottom-left" || normalized === "bottom-right" ? normalized : fallbackValue;
@@ -129,6 +135,18 @@ function applyThemeConfigToRuntime(config, rawWidgetConfig) {
129
135
  config.panelBackgroundColor = normalizeHexColor(labels.panel_background_color, config.panelBackgroundColor || "#ffffff");
130
136
  config.panelBackgroundAlpha = clampNumericString(labels.panel_background_alpha, config.panelBackgroundAlpha || "1", 0, 1, false);
131
137
  config.panelBorderRadius = clampNumericString(labels.panel_border_radius, config.panelBorderRadius || "16", 0, 32, true);
138
+ config.headerGradientEnabled = normalizeLabelBool(labels.header_gradient_enabled, config.headerGradientEnabled !== false);
139
+ config.headerGradientColor2Auto = normalizeLabelBool(labels.header_gradient_color2_auto, config.headerGradientColor2Auto !== false);
140
+ config.headerGradientColor2 = normalizeHexColor(labels.header_gradient_color2, config.headerGradientColor2 || "#0047b3");
141
+ config.userBubbleColor = normalizeHexColor(labels.user_bubble_color, config.userBubbleColor || "");
142
+ config.userBubbleGradientEnabled = normalizeLabelBool(labels.user_bubble_gradient_enabled, config.userBubbleGradientEnabled === true);
143
+ config.userBubbleGradientColor2Auto = normalizeLabelBool(labels.user_bubble_gradient_color2_auto, config.userBubbleGradientColor2Auto !== false);
144
+ config.userBubbleGradientColor2 = normalizeHexColor(labels.user_bubble_gradient_color2, config.userBubbleGradientColor2 || "");
145
+ config.assistantBubbleColor = normalizeHexColor(labels.assistant_bubble_color, config.assistantBubbleColor || "#f0f4f8");
146
+ config.assistantBubbleTextColor = normalizeHexColor(labels.assistant_bubble_text_color, config.assistantBubbleTextColor || "#1a1a2e");
147
+ config.assistantBubbleGradientEnabled = normalizeLabelBool(labels.assistant_bubble_gradient_enabled, config.assistantBubbleGradientEnabled === true);
148
+ config.assistantBubbleGradientColor2Auto = normalizeLabelBool(labels.assistant_bubble_gradient_color2_auto, config.assistantBubbleGradientColor2Auto !== false);
149
+ config.assistantBubbleGradientColor2 = normalizeHexColor(labels.assistant_bubble_gradient_color2, config.assistantBubbleGradientColor2 || "");
132
150
  applyMascotLabelColors(config, labels);
133
151
  var candidateVersion = normalizeThemeVersion(rawWidgetConfig.theme_updated_at);
134
152
  if (candidateVersion > 0) config.themeVersion = candidateVersion;
@@ -147,9 +165,9 @@ function applyWidgetTextConfig(config, widgetConfig) {
147
165
  }
148
166
  var TURNSTILE_SCRIPT_URL = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
149
167
  var TURNSTILE_CONTAINER_ID = "__ourlu_turnstile_container";
150
- var TURNSTILE_LOAD_TIMEOUT_MS = 10000;
151
- var TURNSTILE_CHALLENGE_TIMEOUT_MS = 30000;
152
- var TURNSTILE_TOKEN_TTL_MS = 240000;
168
+ var TURNSTILE_LOAD_TIMEOUT_MS = 15000;
169
+ var TURNSTILE_CHALLENGE_TIMEOUT_MS = 120000;
170
+ var TURNSTILE_TOKEN_TTL_MS = 280000;
153
171
  function TurnstileChallengeManager(siteKey) {
154
172
  this.siteKey = String(siteKey || "").trim();
155
173
  this.scriptLoaded = false;
@@ -159,7 +177,7 @@ function TurnstileChallengeManager(siteKey) {
159
177
  this.cachedTokenTimestamp = 0;
160
178
  }
161
179
  Object.assign(TurnstileChallengeManager.prototype, {
162
- isEnabled: function() { return Boolean(this.siteKey); },
180
+ isEnabled: function() { return false; /* TURNSTILE_DISABLED_FOR_DEV */ },
163
181
  loadScript: function() {
164
182
  if (this.scriptLoaded) return Promise.resolve();
165
183
  if (this.scriptLoadPromise) return this.scriptLoadPromise;
@@ -228,6 +246,7 @@ Object.assign(TurnstileChallengeManager.prototype, {
228
246
  return Boolean(this.cachedToken) && (Date.now() - this.cachedTokenTimestamp) < TURNSTILE_TOKEN_TTL_MS;
229
247
  },
230
248
  execute: async function() {
249
+ return ""; /* TURNSTILE_DISABLED_FOR_DEV */
231
250
  if (!this.isEnabled()) return "";
232
251
  if (this.isCachedTokenValid()) return this.cachedToken;
233
252
  await this.loadScript();
@@ -314,11 +333,7 @@ Object.assign(WidgetApiManager.prototype, {
314
333
  applyRuntimeConfig: function(payload, sourceLabel) {
315
334
  var runtimeConfig = payload && payload.runtime_config ? payload.runtime_config : {};
316
335
  assignRuntimeEndpoints(this.config, runtimeConfig);
317
- var incomingTurnstileKey = String((payload && payload.turnstile_site_key) || (runtimeConfig && runtimeConfig.turnstile_site_key) || "").trim();
318
- if (incomingTurnstileKey && !this.config.turnstileSiteKey) {
319
- this.config.turnstileSiteKey = incomingTurnstileKey;
320
- if (!this.turnstile) this.turnstile = new TurnstileChallengeManager(incomingTurnstileKey);
321
- }
336
+ /* TURNSTILE_DISABLED_FOR_DEV skip dynamic Turnstile instantiation */
322
337
  var widgetConfig = payload && payload.widget_config ? payload.widget_config : null;
323
338
  if (!widgetConfig) return;
324
339
  var currentThemeVersion = normalizeThemeVersion(this.config.themeVersion);
@@ -463,7 +478,7 @@ Object.assign(WidgetApiManager.prototype, {
463
478
  });
464
479
  var payload = await response.json();
465
480
  var sessionId = payload.session_id || payload.id || "";
466
- if (!sessionId) throw new Error("chat session id absent");
481
+ if (!sessionId) throw new Error("Identifiant de session introuvable.");
467
482
  self.state.sessionId = sessionId;
468
483
  self.state.sessionPromise = null;
469
484
  self.events.emit("ready", payload || {});
@@ -542,6 +557,8 @@ Object.assign(WidgetApiManager.prototype, {
542
557
  if (eventName === "final" && callbacks.onFinal) callbacks.onFinal(payload);
543
558
  if (eventName === "done" && callbacks.onDone) callbacks.onDone(payload);
544
559
  if (eventName === "error" && callbacks.onError) callbacks.onError(payload.message || "Erreur de streaming");
560
+ if (eventName === "module_signalement" && callbacks.onModuleSignalement) callbacks.onModuleSignalement(payload);
561
+ if (eventName === "module_plu" && callbacks.onModulePlu) callbacks.onModulePlu(payload);
545
562
  if (eventName === "transcription_draft_delta" && callbacks.onDelta) callbacks.onDelta(payload);
546
563
  if (eventName === "transcription_draft_complete" && callbacks.onComplete) callbacks.onComplete(payload);
547
564
  if (eventName === "transcription_draft_error" && callbacks.onError) callbacks.onError(payload);
@@ -573,24 +590,22 @@ Object.assign(WidgetApiManager.prototype, {
573
590
  if (requestOptions) Object.assign(options, requestOptions);
574
591
  return options;
575
592
  }, sessionId);
576
- if (!response.body) throw new Error("stream response body is missing");
593
+ if (!response.body) throw new Error("Le flux de réponse est indisponible.");
577
594
  return this.consumeSSE(response.body.getReader(), callbacks, allowedEvents);
578
595
  },
579
596
  streamSession: async function(sessionId, callbacks) {
580
- return this.openEventStream("stream_session", this.config.chatStreamTemplate, sessionId, callbacks, ["token", "final", "error", "done"]);
597
+ return this.openEventStream("stream_session", this.config.chatStreamTemplate, sessionId, callbacks, ["token", "final", "error", "done", "module_signalement", "module_plu"]);
581
598
  },
582
599
  streamAudioDraft: async function(sessionId, callbacks) {
583
600
  var self = this;
584
601
  var controller = new AbortController();
585
- var streamPromise = this.openEventStream(
586
- "audio_stream",
587
- this.config.chatAudioStreamTemplate,
588
- sessionId,
589
- callbacks,
590
- ["transcription_draft_delta", "transcription_draft_complete", "transcription_draft_error"],
591
- { signal: controller.signal }
592
- );
593
- streamPromise.catch(function(error) {
602
+ var response = await this.fetchWithBootstrapRetry("audio_stream", this.config.chatAudioStreamTemplate, function() {
603
+ return { method: "GET", headers: self.buildHeaders(), signal: controller.signal };
604
+ }, sessionId);
605
+ if (!response.body) throw new Error("Le flux de réponse est indisponible.");
606
+ var consumePromise = this.consumeSSE(response.body.getReader(), callbacks,
607
+ ["transcription_draft_delta", "transcription_draft_complete", "transcription_draft_error"]);
608
+ consumePromise.catch(function(error) {
594
609
  if (self.isExpectedStreamAbortError(error)) return;
595
610
  if (callbacks.onTransportError) callbacks.onTransportError(error.message || "Erreur stream audio");
596
611
  });
@@ -668,11 +683,24 @@ function mountFromScript(scriptTag) {
668
683
  var state = { open: false, sessionId: "", token: config.sessionBootstrapToken || "", sending: false, listening: false, bootstrapPromise: null, sessionPromise: null };
669
684
  var ui = new WidgetUIManager(config);
670
685
  if (!ui.mount()) return;
671
- var turnstile = config.turnstileSiteKey ? new TurnstileChallengeManager(config.turnstileSiteKey) : null;
686
+ var turnstile = null; /* TURNSTILE_DISABLED_FOR_DEV */
672
687
  var api = new WidgetApiManager(config, state, events, ui, turnstile);
673
688
  var audio = new WidgetAudioManager(state, api, ui);
674
689
  if (!audio.isSupported()) ui.micButton.style.display = "none";
675
690
  api.hydrateTheme().catch(function() {});
691
+
692
+ var signalementModule = null;
693
+ var SignalementModuleManager = runtime.SignalementModuleManager;
694
+ if (SignalementModuleManager) {
695
+ signalementModule = new SignalementModuleManager(ui.getRoot(), events, api, ui);
696
+ signalementModule.mount(ui.getPanel(), ui.getHeader());
697
+ }
698
+ var pluModule = null;
699
+ var PluModuleManager = runtime.PluModuleManager;
700
+ if (PluModuleManager) {
701
+ pluModule = new PluModuleManager(ui.getRoot(), events, api, ui);
702
+ pluModule.mount();
703
+ }
676
704
  var mediaQueryList = null;
677
705
  var handleHostThemeChange = null;
678
706
  if (typeof window.matchMedia === "function") {
@@ -686,9 +714,50 @@ function mountFromScript(scriptTag) {
686
714
  if (typeof mediaQueryList.addEventListener === "function") mediaQueryList.addEventListener("change", handleHostThemeChange);
687
715
  else if (typeof mediaQueryList.addListener === "function") mediaQueryList.addListener(handleHostThemeChange);
688
716
  }
717
+ var signalementActive = false;
718
+ var pluActive = false;
719
+
720
+ if (signalementModule) {
721
+ events.on("module:signalement:open", function() { signalementActive = true; });
722
+ events.on("module:signalement:closed", function() { signalementActive = false; });
723
+ events.on("module:signalement:submitted", function(result) {
724
+ signalementActive = false;
725
+ ui.addMessage("assistant", "");
726
+ var lastMsg = ui.messages.lastElementChild;
727
+ if (lastMsg) ui.setAssistantFinalText(lastMsg, "Merci, votre signalement a été transmis. Référence : **" + (result.signalement_id || "N/A") + "**");
728
+ });
729
+ }
730
+
731
+ if (pluModule) {
732
+ events.on("module:plu:open", function() { pluActive = true; });
733
+ events.on("module:plu:closed", function() { pluActive = false; });
734
+ }
735
+
736
+ async function handleSignalementSubmit() {
737
+ if (!signalementModule || !signalementActive) return;
738
+ state.sending = true;
739
+ ui.setComposerDisabled(true);
740
+ ui.showError("");
741
+ try {
742
+ await api.ensureSession();
743
+ await signalementModule.submit();
744
+ } catch (error) {
745
+ ui.showError((error && error.message) || "Erreur lors de l'envoi du signalement.");
746
+ } finally {
747
+ state.sending = false;
748
+ ui.setComposerDisabled(false);
749
+ }
750
+ }
751
+
689
752
  async function handleSend(event) {
690
753
  event.preventDefault();
691
754
  if (state.sending || state.listening) return;
755
+
756
+ if (signalementActive && signalementModule) {
757
+ await handleSignalementSubmit();
758
+ return;
759
+ }
760
+
692
761
  var message = ui.pullInput();
693
762
  if (!message) return;
694
763
  state.sending = true;
@@ -699,9 +768,32 @@ function mountFromScript(scriptTag) {
699
768
  try {
700
769
  var sessionId = await api.postMessage(message);
701
770
  ui.startAssistantStream();
771
+ var pendingSignalementData = null;
772
+ var pendingPluData = null;
702
773
  await api.streamSession(sessionId, {
703
774
  onToken: function(token) { ui.appendAssistantToken(token); },
704
- onFinal: function(payload) { ui.finalizeAssistantMessage(payload.content || ""); },
775
+ onModuleSignalement: function(payload) {
776
+ pendingSignalementData = payload || {};
777
+ },
778
+ onModulePlu: function(payload) {
779
+ pendingPluData = payload || {};
780
+ },
781
+ onFinal: function(payload) {
782
+ ui.finalizeAssistantMessage(payload.content || "");
783
+ var streamEl = ui.messages.lastElementChild;
784
+ var sigData = pendingSignalementData || (payload.module_signalement ? payload.module_signalement : null);
785
+ if (signalementModule && sigData) {
786
+ ui.injectSignalementButton(streamEl, function() {
787
+ signalementModule.open(sigData);
788
+ });
789
+ }
790
+ var pluData = pendingPluData || (payload.module_plu ? payload.module_plu : null);
791
+ if (pluModule && pluData) {
792
+ ui.injectPluButton(streamEl, function() {
793
+ pluModule.open();
794
+ });
795
+ }
796
+ },
705
797
  onError: function(errorText) { ui.showError(errorText || "Erreur de streaming."); },
706
798
  onDone: function() {}
707
799
  });
@@ -754,7 +846,6 @@ function mountFromScript(scriptTag) {
754
846
  if (typeof mediaQueryList.removeEventListener === "function") mediaQueryList.removeEventListener("change", handleHostThemeChange);
755
847
  else if (typeof mediaQueryList.removeListener === "function") mediaQueryList.removeListener(handleHostThemeChange);
756
848
  }
757
- if (audio.stopDraftStream) audio.stopDraftStream();
758
849
  audio.cleanupMedia();
759
850
  if (ui.host && ui.host.parentNode) ui.host.parentNode.removeChild(ui.host);
760
851
  }, on: function(eventName, handler) { events.on(eventName, handler); } };
@@ -1,6 +1,6 @@
1
1
  (function() {
2
2
  "use strict";
3
- var __WIDGET_MANIFEST__ = {"ui.v1.js":"ui.v1.c58e1d58.js","audio.v1.js":"audio.v1.95146620.js","engine.v1.js":"engine.v1.d1052e81.js"};
3
+ var __WIDGET_MANIFEST__ = {"ui.v1.js":"ui.v1.0caedc90.js","audio.v1.js":"audio.v1.20858b08.js","signalement.v1.js":"signalement.v1.d321dfde.js","plu.v1.js":"plu.v1.cc853a2d.js","engine.v1.js":"engine.v1.19c589a2.js"};
4
4
 
5
5
 
6
6
  var RUNTIME_NS = "__OurluWidgetRuntimeV1";
@@ -45,14 +45,22 @@
45
45
  if (!window[RUNTIME_FLAG]) {
46
46
  var uiFileName = resolveManifestFileName("ui.v1.js");
47
47
  var audioFileName = resolveManifestFileName("audio.v1.js");
48
+ var signalementFileName = resolveManifestFileName("signalement.v1.js");
49
+ var pluFileName = resolveManifestFileName("plu.v1.js");
48
50
  var engineFileName = resolveManifestFileName("engine.v1.js");
49
51
 
50
52
  var uiRuntimeUrl = scriptTag.getAttribute("data-runtime-ui-url") || buildApiRuntimeAssetUrl(scriptTag, uiFileName);
51
53
  var audioRuntimeUrl = scriptTag.getAttribute("data-runtime-audio-url") || buildApiRuntimeAssetUrl(scriptTag, audioFileName);
54
+ var signalementRuntimeUrl = scriptTag.getAttribute("data-runtime-signalement-url") || buildApiRuntimeAssetUrl(scriptTag, signalementFileName);
55
+ var pluRuntimeUrl = scriptTag.getAttribute("data-runtime-plu-url") || buildApiRuntimeAssetUrl(scriptTag, pluFileName);
52
56
  var engineRuntimeUrl = scriptTag.getAttribute("data-runtime-engine-url") || buildApiRuntimeAssetUrl(scriptTag, engineFileName);
53
57
 
54
58
  window[RUNTIME_FLAG] = loadScript(uiRuntimeUrl).then(function() {
55
59
  return loadScript(audioRuntimeUrl);
60
+ }).then(function() {
61
+ return loadScript(signalementRuntimeUrl);
62
+ }).then(function() {
63
+ return loadScript(pluRuntimeUrl);
56
64
  }).then(function() {
57
65
  return loadScript(engineRuntimeUrl);
58
66
  });