@ourlu/assistant-sdk 0.2.4 → 0.2.5

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 (44) 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.2b5bb43b.js +3 -3
  15. package/dist/iife/engine.v1.3b09dc20.js +3 -3
  16. package/dist/iife/engine.v1.56074e5a.js +769 -0
  17. package/dist/iife/engine.v1.61c10e6c.js +770 -0
  18. package/dist/iife/engine.v1.773fc15d.js +2 -2
  19. package/dist/iife/engine.v1.80d2230f.js +3 -3
  20. package/dist/iife/engine.v1.940ba9ea.js +764 -0
  21. package/dist/iife/engine.v1.99a33ee2.js +767 -0
  22. package/dist/iife/engine.v1.9ca6b7ec.js +3 -3
  23. package/dist/iife/engine.v1.a1f7dea2.js +764 -0
  24. package/dist/iife/engine.v1.c0c00bd0.js +3 -3
  25. package/dist/iife/engine.v1.c127656e.js +820 -0
  26. package/dist/iife/engine.v1.c54c9a1a.js +3 -3
  27. package/dist/iife/engine.v1.d1052e81.js +3 -3
  28. package/dist/iife/engine.v1.f6d23a0f.js +770 -0
  29. package/dist/iife/engine.v1.js +75 -25
  30. package/dist/iife/loader.v1.js +5 -1
  31. package/dist/iife/signalement.v1.d321dfde.js +518 -0
  32. package/dist/iife/signalement.v1.js +518 -0
  33. package/dist/iife/ui.v1.00abf020.js +895 -0
  34. package/dist/iife/ui.v1.6becaa84.js +895 -0
  35. package/dist/iife/ui.v1.6c9e4995.js +895 -0
  36. package/dist/iife/ui.v1.88bf5494.js +898 -0
  37. package/dist/iife/ui.v1.a8cfe724.js +900 -0
  38. package/dist/iife/ui.v1.e007c7c4.js +926 -0
  39. package/dist/iife/ui.v1.e24ba2bd.js +903 -0
  40. package/dist/iife/ui.v1.f1d8e998.js +903 -0
  41. package/dist/iife/ui.v1.fc52b520.js +895 -0
  42. package/dist/iife/ui.v1.js +44 -77
  43. package/dist/iife/widget-manifest.json +4 -3
  44. package/package.json +2 -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) {
@@ -147,9 +147,9 @@ function applyWidgetTextConfig(config, widgetConfig) {
147
147
  }
148
148
  var TURNSTILE_SCRIPT_URL = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
149
149
  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;
150
+ var TURNSTILE_LOAD_TIMEOUT_MS = 15000;
151
+ var TURNSTILE_CHALLENGE_TIMEOUT_MS = 120000;
152
+ var TURNSTILE_TOKEN_TTL_MS = 280000;
153
153
  function TurnstileChallengeManager(siteKey) {
154
154
  this.siteKey = String(siteKey || "").trim();
155
155
  this.scriptLoaded = false;
@@ -159,7 +159,7 @@ function TurnstileChallengeManager(siteKey) {
159
159
  this.cachedTokenTimestamp = 0;
160
160
  }
161
161
  Object.assign(TurnstileChallengeManager.prototype, {
162
- isEnabled: function() { return Boolean(this.siteKey); },
162
+ isEnabled: function() { return false; /* TURNSTILE_DISABLED_FOR_DEV */ },
163
163
  loadScript: function() {
164
164
  if (this.scriptLoaded) return Promise.resolve();
165
165
  if (this.scriptLoadPromise) return this.scriptLoadPromise;
@@ -228,6 +228,7 @@ Object.assign(TurnstileChallengeManager.prototype, {
228
228
  return Boolean(this.cachedToken) && (Date.now() - this.cachedTokenTimestamp) < TURNSTILE_TOKEN_TTL_MS;
229
229
  },
230
230
  execute: async function() {
231
+ return ""; /* TURNSTILE_DISABLED_FOR_DEV */
231
232
  if (!this.isEnabled()) return "";
232
233
  if (this.isCachedTokenValid()) return this.cachedToken;
233
234
  await this.loadScript();
@@ -314,11 +315,7 @@ Object.assign(WidgetApiManager.prototype, {
314
315
  applyRuntimeConfig: function(payload, sourceLabel) {
315
316
  var runtimeConfig = payload && payload.runtime_config ? payload.runtime_config : {};
316
317
  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
- }
318
+ /* TURNSTILE_DISABLED_FOR_DEV skip dynamic Turnstile instantiation */
322
319
  var widgetConfig = payload && payload.widget_config ? payload.widget_config : null;
323
320
  if (!widgetConfig) return;
324
321
  var currentThemeVersion = normalizeThemeVersion(this.config.themeVersion);
@@ -463,7 +460,7 @@ Object.assign(WidgetApiManager.prototype, {
463
460
  });
464
461
  var payload = await response.json();
465
462
  var sessionId = payload.session_id || payload.id || "";
466
- if (!sessionId) throw new Error("chat session id absent");
463
+ if (!sessionId) throw new Error("Identifiant de session introuvable.");
467
464
  self.state.sessionId = sessionId;
468
465
  self.state.sessionPromise = null;
469
466
  self.events.emit("ready", payload || {});
@@ -542,6 +539,7 @@ Object.assign(WidgetApiManager.prototype, {
542
539
  if (eventName === "final" && callbacks.onFinal) callbacks.onFinal(payload);
543
540
  if (eventName === "done" && callbacks.onDone) callbacks.onDone(payload);
544
541
  if (eventName === "error" && callbacks.onError) callbacks.onError(payload.message || "Erreur de streaming");
542
+ if (eventName === "module_signalement" && callbacks.onModuleSignalement) callbacks.onModuleSignalement(payload);
545
543
  if (eventName === "transcription_draft_delta" && callbacks.onDelta) callbacks.onDelta(payload);
546
544
  if (eventName === "transcription_draft_complete" && callbacks.onComplete) callbacks.onComplete(payload);
547
545
  if (eventName === "transcription_draft_error" && callbacks.onError) callbacks.onError(payload);
@@ -573,24 +571,22 @@ Object.assign(WidgetApiManager.prototype, {
573
571
  if (requestOptions) Object.assign(options, requestOptions);
574
572
  return options;
575
573
  }, sessionId);
576
- if (!response.body) throw new Error("stream response body is missing");
574
+ if (!response.body) throw new Error("Le flux de réponse est indisponible.");
577
575
  return this.consumeSSE(response.body.getReader(), callbacks, allowedEvents);
578
576
  },
579
577
  streamSession: async function(sessionId, callbacks) {
580
- return this.openEventStream("stream_session", this.config.chatStreamTemplate, sessionId, callbacks, ["token", "final", "error", "done"]);
578
+ return this.openEventStream("stream_session", this.config.chatStreamTemplate, sessionId, callbacks, ["token", "final", "error", "done", "module_signalement"]);
581
579
  },
582
580
  streamAudioDraft: async function(sessionId, callbacks) {
583
581
  var self = this;
584
582
  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) {
583
+ var response = await this.fetchWithBootstrapRetry("audio_stream", this.config.chatAudioStreamTemplate, function() {
584
+ return { method: "GET", headers: self.buildHeaders(), signal: controller.signal };
585
+ }, sessionId);
586
+ if (!response.body) throw new Error("Le flux de réponse est indisponible.");
587
+ var consumePromise = this.consumeSSE(response.body.getReader(), callbacks,
588
+ ["transcription_draft_delta", "transcription_draft_complete", "transcription_draft_error"]);
589
+ consumePromise.catch(function(error) {
594
590
  if (self.isExpectedStreamAbortError(error)) return;
595
591
  if (callbacks.onTransportError) callbacks.onTransportError(error.message || "Erreur stream audio");
596
592
  });
@@ -668,11 +664,18 @@ function mountFromScript(scriptTag) {
668
664
  var state = { open: false, sessionId: "", token: config.sessionBootstrapToken || "", sending: false, listening: false, bootstrapPromise: null, sessionPromise: null };
669
665
  var ui = new WidgetUIManager(config);
670
666
  if (!ui.mount()) return;
671
- var turnstile = config.turnstileSiteKey ? new TurnstileChallengeManager(config.turnstileSiteKey) : null;
667
+ var turnstile = null; /* TURNSTILE_DISABLED_FOR_DEV */
672
668
  var api = new WidgetApiManager(config, state, events, ui, turnstile);
673
669
  var audio = new WidgetAudioManager(state, api, ui);
674
670
  if (!audio.isSupported()) ui.micButton.style.display = "none";
675
671
  api.hydrateTheme().catch(function() {});
672
+
673
+ var signalementModule = null;
674
+ var SignalementModuleManager = runtime.SignalementModuleManager;
675
+ if (SignalementModuleManager) {
676
+ signalementModule = new SignalementModuleManager(ui.getRoot(), events, api, ui);
677
+ signalementModule.mount(ui.getPanel(), ui.getHeader());
678
+ }
676
679
  var mediaQueryList = null;
677
680
  var handleHostThemeChange = null;
678
681
  if (typeof window.matchMedia === "function") {
@@ -686,9 +689,44 @@ function mountFromScript(scriptTag) {
686
689
  if (typeof mediaQueryList.addEventListener === "function") mediaQueryList.addEventListener("change", handleHostThemeChange);
687
690
  else if (typeof mediaQueryList.addListener === "function") mediaQueryList.addListener(handleHostThemeChange);
688
691
  }
692
+ var signalementActive = false;
693
+
694
+ if (signalementModule) {
695
+ events.on("module:signalement:open", function() { signalementActive = true; });
696
+ events.on("module:signalement:closed", function() { signalementActive = false; });
697
+ events.on("module:signalement:submitted", function(result) {
698
+ signalementActive = false;
699
+ ui.addMessage("assistant", "");
700
+ var lastMsg = ui.messages.lastElementChild;
701
+ if (lastMsg) ui.setAssistantFinalText(lastMsg, "Merci, votre signalement a été transmis. Référence : **" + (result.signalement_id || "N/A") + "**");
702
+ });
703
+ }
704
+
705
+ async function handleSignalementSubmit() {
706
+ if (!signalementModule || !signalementActive) return;
707
+ state.sending = true;
708
+ ui.setComposerDisabled(true);
709
+ ui.showError("");
710
+ try {
711
+ await api.ensureSession();
712
+ await signalementModule.submit();
713
+ } catch (error) {
714
+ ui.showError((error && error.message) || "Erreur lors de l'envoi du signalement.");
715
+ } finally {
716
+ state.sending = false;
717
+ ui.setComposerDisabled(false);
718
+ }
719
+ }
720
+
689
721
  async function handleSend(event) {
690
722
  event.preventDefault();
691
723
  if (state.sending || state.listening) return;
724
+
725
+ if (signalementActive && signalementModule) {
726
+ await handleSignalementSubmit();
727
+ return;
728
+ }
729
+
692
730
  var message = ui.pullInput();
693
731
  if (!message) return;
694
732
  state.sending = true;
@@ -699,9 +737,22 @@ function mountFromScript(scriptTag) {
699
737
  try {
700
738
  var sessionId = await api.postMessage(message);
701
739
  ui.startAssistantStream();
740
+ var pendingSignalementData = null;
702
741
  await api.streamSession(sessionId, {
703
742
  onToken: function(token) { ui.appendAssistantToken(token); },
704
- onFinal: function(payload) { ui.finalizeAssistantMessage(payload.content || ""); },
743
+ onModuleSignalement: function(payload) {
744
+ pendingSignalementData = payload || {};
745
+ },
746
+ onFinal: function(payload) {
747
+ ui.finalizeAssistantMessage(payload.content || "");
748
+ var sigData = pendingSignalementData || (payload.module_signalement ? payload.module_signalement : null);
749
+ if (signalementModule && sigData) {
750
+ var streamEl = ui.messages.lastElementChild;
751
+ ui.injectSignalementButton(streamEl, function() {
752
+ signalementModule.open(sigData);
753
+ });
754
+ }
755
+ },
705
756
  onError: function(errorText) { ui.showError(errorText || "Erreur de streaming."); },
706
757
  onDone: function() {}
707
758
  });
@@ -754,7 +805,6 @@ function mountFromScript(scriptTag) {
754
805
  if (typeof mediaQueryList.removeEventListener === "function") mediaQueryList.removeEventListener("change", handleHostThemeChange);
755
806
  else if (typeof mediaQueryList.removeListener === "function") mediaQueryList.removeListener(handleHostThemeChange);
756
807
  }
757
- if (audio.stopDraftStream) audio.stopDraftStream();
758
808
  audio.cleanupMedia();
759
809
  if (ui.host && ui.host.parentNode) ui.host.parentNode.removeChild(ui.host);
760
810
  }, 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.e007c7c4.js","audio.v1.js":"audio.v1.20858b08.js","signalement.v1.js":"signalement.v1.d321dfde.js","engine.v1.js":"engine.v1.c127656e.js"};
4
4
 
5
5
 
6
6
  var RUNTIME_NS = "__OurluWidgetRuntimeV1";
@@ -45,14 +45,18 @@
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");
48
49
  var engineFileName = resolveManifestFileName("engine.v1.js");
49
50
 
50
51
  var uiRuntimeUrl = scriptTag.getAttribute("data-runtime-ui-url") || buildApiRuntimeAssetUrl(scriptTag, uiFileName);
51
52
  var audioRuntimeUrl = scriptTag.getAttribute("data-runtime-audio-url") || buildApiRuntimeAssetUrl(scriptTag, audioFileName);
53
+ var signalementRuntimeUrl = scriptTag.getAttribute("data-runtime-signalement-url") || buildApiRuntimeAssetUrl(scriptTag, signalementFileName);
52
54
  var engineRuntimeUrl = scriptTag.getAttribute("data-runtime-engine-url") || buildApiRuntimeAssetUrl(scriptTag, engineFileName);
53
55
 
54
56
  window[RUNTIME_FLAG] = loadScript(uiRuntimeUrl).then(function() {
55
57
  return loadScript(audioRuntimeUrl);
58
+ }).then(function() {
59
+ return loadScript(signalementRuntimeUrl);
56
60
  }).then(function() {
57
61
  return loadScript(engineRuntimeUrl);
58
62
  });