@noodleseed/assistant 1.26.1 → 1.28.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.
Files changed (39) hide show
  1. package/README.md +25 -2
  2. package/dist/{app-view-element-CiFVNIke.d.cts → app-view-element-BjRkwNN1.d.cts} +1 -1
  3. package/dist/{app-view-element-C_ATXseu.d.ts → app-view-element-mXHvcAXc.d.ts} +1 -1
  4. package/dist/app-view.d.cts +3 -3
  5. package/dist/app-view.d.ts +3 -3
  6. package/dist/{appearance-C24W6BRj.d.cts → appearance-BpVu3lpk.d.cts} +1 -0
  7. package/dist/{appearance-C24W6BRj.d.ts → appearance-BpVu3lpk.d.ts} +1 -0
  8. package/dist/{chunk-OZVDL77T.js → chunk-QH7PL3GU.js} +52 -192
  9. package/dist/chunk-QH7PL3GU.js.map +1 -0
  10. package/dist/{chunk-FNXAVRL5.js → chunk-WJV4MJUR.js} +178 -4
  11. package/dist/chunk-WJV4MJUR.js.map +1 -0
  12. package/dist/{client-BheCOERq.d.ts → client-CPFw8tfo.d.ts} +1 -1
  13. package/dist/{client-BiMRVxjs.d.cts → client-_xivfs4q.d.cts} +1 -1
  14. package/dist/client.cjs +176 -3
  15. package/dist/client.cjs.map +1 -1
  16. package/dist/client.d.cts +2 -2
  17. package/dist/client.d.ts +2 -2
  18. package/dist/client.js +1 -1
  19. package/dist/embed.global.js +42 -50
  20. package/dist/index.cjs +225 -190
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +3 -3
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.js +2 -2
  25. package/dist/react/client.cjs +176 -3
  26. package/dist/react/client.cjs.map +1 -1
  27. package/dist/react/client.d.cts +2 -2
  28. package/dist/react/client.d.ts +2 -2
  29. package/dist/react/client.js +1 -1
  30. package/dist/react.cjs +225 -190
  31. package/dist/react.cjs.map +1 -1
  32. package/dist/react.d.cts +3 -3
  33. package/dist/react.d.ts +3 -3
  34. package/dist/react.js +2 -2
  35. package/dist/server.d.cts +1 -1
  36. package/dist/server.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-FNXAVRL5.js.map +0 -1
  39. package/dist/chunk-OZVDL77T.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-BiMRVxjs.cjs';
2
- import '../appearance-C24W6BRj.cjs';
1
+ import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-_xivfs4q.cjs';
2
+ import '../appearance-BpVu3lpk.cjs';
3
3
  import 'ai';
4
4
 
5
5
  type UseNoodleAssistantOptions<TPageContext extends AssistantPageContext = AssistantContext> = CreateAssistantClientOptions<TPageContext> & {
@@ -1,5 +1,5 @@
1
- import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-BheCOERq.js';
2
- import '../appearance-C24W6BRj.js';
1
+ import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-CPFw8tfo.js';
2
+ import '../appearance-BpVu3lpk.js';
3
3
  import 'ai';
4
4
 
5
5
  type UseNoodleAssistantOptions<TPageContext extends AssistantPageContext = AssistantContext> = CreateAssistantClientOptions<TPageContext> & {
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  createAssistantClient
4
- } from "../chunk-FNXAVRL5.js";
4
+ } from "../chunk-WJV4MJUR.js";
5
5
  import "../chunk-P223CYPO.js";
6
6
  import "../chunk-3YYTUJPJ.js";
7
7
  import "../chunk-5FUTL2UF.js";
package/dist/react.cjs CHANGED
@@ -22430,7 +22430,8 @@ var DEFAULT_APPEARANCE = {
22430
22430
  showHeader: true,
22431
22431
  showAvatars: true,
22432
22432
  showTimestamps: false,
22433
- showPoweredBy: true
22433
+ showPoweredBy: true,
22434
+ showConfirmationDetails: true
22434
22435
  },
22435
22436
  labels: {
22436
22437
  welcomeHeading: "",
@@ -27360,6 +27361,178 @@ function isRecord(value) {
27360
27361
  return typeof value === "object" && value !== null && !Array.isArray(value);
27361
27362
  }
27362
27363
 
27364
+ // src/assistant-configuration-schema.ts
27365
+ var hexColorSchema = external_exports.string().regex(/^#[0-9A-Fa-f]{6}$/);
27366
+ var resolvedBorderColorSchema = external_exports.union([
27367
+ hexColorSchema,
27368
+ external_exports.string().max(64).refine(isBoundedRgbaColor, "must be a six-digit hex or bounded rgba color")
27369
+ ]);
27370
+ var browserAssetUrlSchema = external_exports.string().trim().url().refine(isSecureBrowserAssetUrl, "must use https (http is allowed only for loopback testing)");
27371
+ var httpsUrlSchema = external_exports.string().trim().url().refine(isHttpsUrl, "must use https");
27372
+ var brandAssetSchema = external_exports.object({
27373
+ uri: browserAssetUrlSchema,
27374
+ darkUri: browserAssetUrlSchema.optional(),
27375
+ alt: external_exports.string().trim().min(1).max(240)
27376
+ }).strict();
27377
+ var brandThemeSchema = external_exports.object({
27378
+ surface: hexColorSchema.optional(),
27379
+ surfaceRaised: hexColorSchema.optional(),
27380
+ surfaceMuted: hexColorSchema.optional(),
27381
+ text: hexColorSchema.optional(),
27382
+ textMuted: hexColorSchema.optional(),
27383
+ accent: hexColorSchema.optional(),
27384
+ accentText: hexColorSchema.optional(),
27385
+ link: hexColorSchema.optional(),
27386
+ border: resolvedBorderColorSchema.optional(),
27387
+ borderStrong: resolvedBorderColorSchema.optional(),
27388
+ focus: hexColorSchema.optional(),
27389
+ success: hexColorSchema.optional(),
27390
+ warning: hexColorSchema.optional(),
27391
+ danger: hexColorSchema.optional(),
27392
+ code: hexColorSchema.optional()
27393
+ }).strict();
27394
+ var brandingSchema = external_exports.object({
27395
+ name: external_exports.string().trim().min(1).max(160).optional(),
27396
+ accent: hexColorSchema.optional(),
27397
+ surface: hexColorSchema.optional(),
27398
+ surfaceDark: hexColorSchema.optional(),
27399
+ logo: brandAssetSchema.optional(),
27400
+ mark: brandAssetSchema.optional(),
27401
+ avatar: brandAssetSchema.optional(),
27402
+ theme: external_exports.object({ light: brandThemeSchema.optional(), dark: brandThemeSchema.optional() }).strict().optional(),
27403
+ radius: external_exports.enum(["none", "sm", "md", "lg"]).optional(),
27404
+ density: external_exports.enum(["compact", "comfortable"]).optional(),
27405
+ typography: external_exports.enum(["system", "serif", "mono"]).optional(),
27406
+ colorScheme: external_exports.enum(["auto", "light", "dark"]).optional()
27407
+ }).strict();
27408
+ var labelsSchema = external_exports.object({
27409
+ welcomeHeading: external_exports.string().trim().min(1).max(160).optional(),
27410
+ welcomeMessage: external_exports.string().max(1e3).optional(),
27411
+ launcherPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
27412
+ composerPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
27413
+ thinking: external_exports.string().trim().min(1).max(80).optional(),
27414
+ send: external_exports.string().trim().min(1).max(80).optional(),
27415
+ stop: external_exports.string().trim().min(1).max(80).optional(),
27416
+ close: external_exports.string().trim().min(1).max(80).optional(),
27417
+ open: external_exports.string().trim().min(1).max(80).optional(),
27418
+ confirm: external_exports.string().trim().min(1).max(80).optional(),
27419
+ decline: external_exports.string().trim().min(1).max(80).optional(),
27420
+ cancel: external_exports.string().trim().min(1).max(80).optional(),
27421
+ confirmationHeading: external_exports.string().trim().min(1).max(120).optional(),
27422
+ additionalDetails: external_exports.string().trim().min(1).max(120).optional(),
27423
+ redacted: external_exports.string().trim().min(1).max(120).optional(),
27424
+ completed: external_exports.string().trim().min(1).max(80).optional(),
27425
+ stopped: external_exports.string().trim().min(1).max(80).optional(),
27426
+ copy: external_exports.string().trim().min(1).max(80).optional(),
27427
+ newMessages: external_exports.string().trim().min(1).max(80).optional(),
27428
+ reconnect: external_exports.string().trim().min(1).max(80).optional(),
27429
+ newConversation: external_exports.string().trim().min(1).max(80).optional(),
27430
+ retry: external_exports.string().trim().min(1).max(80).optional(),
27431
+ unavailable: external_exports.string().trim().min(1).max(240).optional(),
27432
+ sessionExpired: external_exports.string().trim().min(1).max(240).optional(),
27433
+ sessionIdle: external_exports.string().trim().min(1).max(120).optional(),
27434
+ sessionLoading: external_exports.string().trim().min(1).max(120).optional(),
27435
+ sessionReady: external_exports.string().trim().min(1).max(120).optional(),
27436
+ sessionError: external_exports.string().trim().min(1).max(120).optional(),
27437
+ signInHeading: external_exports.string().trim().min(1).max(120).optional(),
27438
+ signInBody: external_exports.string().max(240).optional(),
27439
+ signInAction: external_exports.string().trim().min(1).max(80).optional(),
27440
+ signUpAction: external_exports.string().trim().min(1).max(80).optional()
27441
+ }).strict();
27442
+ var presentationSchema = external_exports.object({
27443
+ panel: external_exports.object({
27444
+ surface: external_exports.enum(["solid", "glass"]).optional(),
27445
+ elevation: external_exports.enum(["soft", "dramatic"]).optional(),
27446
+ border: external_exports.enum(["subtle", "strong"]).optional(),
27447
+ radius: external_exports.number().int().min(0).max(64).optional()
27448
+ }).strict().optional(),
27449
+ launcher: external_exports.object({
27450
+ style: external_exports.enum(["pill", "bubble"]).optional(),
27451
+ icon: external_exports.enum(["brand-mark", "chat", "none"]).optional(),
27452
+ size: external_exports.enum(["md", "lg"]).optional(),
27453
+ status: external_exports.enum(["none", "session"]).optional(),
27454
+ effect: external_exports.enum(["none", "pulse"]).optional()
27455
+ }).strict().optional(),
27456
+ header: external_exports.object({
27457
+ mark: external_exports.enum(["none", "brand-mark", "status"]).optional(),
27458
+ badge: external_exports.object({
27459
+ text: external_exports.string().trim().min(1).max(80),
27460
+ tone: external_exports.enum(["neutral", "success", "warning", "danger"]).optional(),
27461
+ indicator: external_exports.boolean().optional()
27462
+ }).strict().optional()
27463
+ }).strict().optional(),
27464
+ composer: external_exports.object({
27465
+ leadingIcon: external_exports.enum(["none", "brand-mark"]).optional(),
27466
+ sendIcon: external_exports.enum(["arrow-up", "paper-plane"]).optional(),
27467
+ shape: external_exports.enum(["rounded", "pill"]).optional()
27468
+ }).strict().optional(),
27469
+ messages: external_exports.object({
27470
+ userStyle: external_exports.enum(["bubble", "accent"]).optional(),
27471
+ assistantStyle: external_exports.enum(["plain", "bubble"]).optional()
27472
+ }).strict().optional()
27473
+ }).strict();
27474
+ var assistantUiSchema = external_exports.object({
27475
+ theme: external_exports.enum(["auto", "light", "dark", "invert"]).optional(),
27476
+ layout: external_exports.object({
27477
+ mode: external_exports.enum(["floating", "inline", "drawer"]).optional(),
27478
+ position: external_exports.enum(["bottom-left", "bottom-center", "bottom-right"]).optional(),
27479
+ panelWidth: external_exports.number().int().min(280).max(1200).optional(),
27480
+ panelMinHeight: external_exports.number().int().min(240).max(1600).optional(),
27481
+ panelMaxHeight: external_exports.number().int().min(320).max(2400).optional(),
27482
+ edgeOffset: external_exports.number().int().min(0).max(96).optional(),
27483
+ zIndex: external_exports.number().int().min(0).max(2147483647).optional(),
27484
+ density: external_exports.enum(["compact", "comfortable"]).optional(),
27485
+ mobileFullscreen: external_exports.boolean().optional()
27486
+ }).strict().optional(),
27487
+ behavior: external_exports.object({
27488
+ startOpen: external_exports.boolean().optional(),
27489
+ closeOnEscape: external_exports.boolean().optional(),
27490
+ closeOnOutsideClick: external_exports.boolean().optional(),
27491
+ showLauncher: external_exports.boolean().optional(),
27492
+ showHeader: external_exports.boolean().optional(),
27493
+ showAvatars: external_exports.boolean().optional(),
27494
+ showTimestamps: external_exports.boolean().optional(),
27495
+ showPoweredBy: external_exports.boolean().optional(),
27496
+ showConfirmationDetails: external_exports.boolean().optional()
27497
+ }).strict().optional(),
27498
+ labels: labelsSchema.optional(),
27499
+ presentation: presentationSchema.optional(),
27500
+ suggestedPrompts: external_exports.array(external_exports.string().trim().min(1).max(240)).max(8).optional(),
27501
+ privacyUrl: httpsUrlSchema.optional(),
27502
+ termsUrl: httpsUrlSchema.optional(),
27503
+ locale: external_exports.string().trim().min(2).max(35).optional(),
27504
+ direction: external_exports.enum(["ltr", "rtl", "auto"]).optional()
27505
+ }).strict();
27506
+ var assistantConfigurationSchema = external_exports.object({ branding: brandingSchema.optional(), assistant: assistantUiSchema.optional() }).strict();
27507
+ function parseAssistantConfiguration(value) {
27508
+ const parsed = assistantConfigurationSchema.safeParse(value);
27509
+ return parsed.success ? parsed.data : void 0;
27510
+ }
27511
+ function isHttpsUrl(value) {
27512
+ try {
27513
+ return new URL(value).protocol === "https:";
27514
+ } catch {
27515
+ return false;
27516
+ }
27517
+ }
27518
+ function isSecureBrowserAssetUrl(value) {
27519
+ try {
27520
+ const url2 = new URL(value);
27521
+ if (url2.protocol === "https:") return true;
27522
+ if (url2.protocol !== "http:") return false;
27523
+ return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
27524
+ } catch {
27525
+ return false;
27526
+ }
27527
+ }
27528
+ function isBoundedRgbaColor(value) {
27529
+ const match = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0(?:\.\d{1,6})?|1(?:\.0{1,6})?)\s*\)$/.exec(
27530
+ value
27531
+ );
27532
+ if (match === null) return false;
27533
+ return match.slice(1, 4).every((channel) => Number(channel) <= 255);
27534
+ }
27535
+
27363
27536
  // src/client-errors.ts
27364
27537
  async function refusalCode(response) {
27365
27538
  try {
@@ -27393,6 +27566,7 @@ function parseSession(value) {
27393
27566
  if (typeof value.token !== "string" || typeof value.expiresAt !== "string" || typeof value.endpoints.turns !== "string" || typeof value.endpoints.toolConfirmations !== "string" || interactions !== void 0 && typeof interactions !== "string" || apps !== void 0 && typeof apps !== "string" || sandbox !== void 0 && typeof sandbox !== "string" || transcript !== void 0 && typeof transcript !== "string") {
27394
27567
  throw clientError("session_failed", "Assistant session response is invalid", true);
27395
27568
  }
27569
+ const configuration = parseAssistantConfiguration(value.configuration);
27396
27570
  return {
27397
27571
  token: value.token,
27398
27572
  expiresAt: value.expiresAt,
@@ -27404,7 +27578,7 @@ function parseSession(value) {
27404
27578
  ...typeof sandbox === "string" ? { sandbox } : {},
27405
27579
  ...typeof transcript === "string" ? { transcript } : {}
27406
27580
  },
27407
- ...isRecord2(value.configuration) ? { configuration: value.configuration } : {},
27581
+ ...configuration === void 0 ? {} : { configuration },
27408
27582
  ...isRecord2(value.resume) && typeof value.resume.tool === "string" ? { resume: { tool: value.resume.tool } } : {}
27409
27583
  };
27410
27584
  }
@@ -27498,9 +27672,9 @@ function toAssistantClientEvent(event) {
27498
27672
  return { event: "unrecognized", data: { name: event.event, payload: value } };
27499
27673
  }
27500
27674
  function isViewAvailableDetail(value) {
27501
- return hasString(value, "id") && hasString(value, "tool") && typeof value.resourceUri === "string" && value.resourceUri.startsWith("ui://") && hasOptionalString(value.title) && (value.replayed === void 0 || value.replayed === true) && isJsonValue(value.result, 0) && hasOptionalJson(value.arguments) && hasOptionalString(value.html) && (value.resourceMeta === void 0 || isRecord3(value.resourceMeta)) && (value.allowedOpenDomains === void 0 || Array.isArray(value.allowedOpenDomains) && value.allowedOpenDomains.every(isHttpsUrl)) && hasOptionalTurnId(value);
27675
+ return hasString(value, "id") && hasString(value, "tool") && typeof value.resourceUri === "string" && value.resourceUri.startsWith("ui://") && hasOptionalString(value.title) && (value.replayed === void 0 || value.replayed === true) && isJsonValue(value.result, 0) && hasOptionalJson(value.arguments) && hasOptionalString(value.html) && (value.resourceMeta === void 0 || isRecord3(value.resourceMeta)) && (value.allowedOpenDomains === void 0 || Array.isArray(value.allowedOpenDomains) && value.allowedOpenDomains.every(isHttpsUrl2)) && hasOptionalTurnId(value);
27502
27676
  }
27503
- function isHttpsUrl(value) {
27677
+ function isHttpsUrl2(value) {
27504
27678
  if (typeof value !== "string") return false;
27505
27679
  try {
27506
27680
  return new URL(value).protocol === "https:";
@@ -28584,7 +28758,7 @@ function createInteractionCard(options) {
28584
28758
  if (Object.keys(businessArguments).length > 0) {
28585
28759
  card.append(createArgumentList(businessArguments, options.reviewSchema, options.labels));
28586
28760
  }
28587
- if (action !== void 0) {
28761
+ if (action !== void 0 && options.showDetails !== false) {
28588
28762
  const technical = document.createElement("details");
28589
28763
  technical.className = "proposal-details";
28590
28764
  const summary = document.createElement("summary");
@@ -28666,7 +28840,7 @@ function createArgumentList(arguments_, schema, labels) {
28666
28840
  return list;
28667
28841
  }
28668
28842
  function appendValue(parent, value, schema, labels) {
28669
- if (value === "[REDACTED]") {
28843
+ if (schema?.writeOnly === true || schema?.["x-sensitive"] === true || value === "[REDACTED]") {
28670
28844
  const hidden = document.createElement("span");
28671
28845
  hidden.className = "proposal-redacted";
28672
28846
  hidden.textContent = labels.redacted;
@@ -31587,6 +31761,7 @@ var AssistantElementEventController = class {
31587
31761
  ...description ? { description } : {},
31588
31762
  ...arguments_ ? { arguments: arguments_ } : {},
31589
31763
  ...reviewSchema ? { reviewSchema } : {},
31764
+ showDetails: this.#host.showConfirmationDetails(),
31590
31765
  labels: {
31591
31766
  heading: labels.confirmationHeading,
31592
31767
  accept: labels.confirm,
@@ -31856,12 +32031,14 @@ var AssistantElementHostEnvironmentController = class {
31856
32031
  };
31857
32032
 
31858
32033
  // src/element-launcher-controller.ts
32034
+ var COLLAPSED_LAUNCHER_WIDTH_PROPERTY = "--_ns-assistant-launcher-collapsed-width";
31859
32035
  var AssistantElementLauncherController = class {
31860
32036
  #host;
31861
32037
  #appearance;
31862
32038
  #openPanel;
31863
32039
  #sendMessage;
31864
32040
  #root;
32041
+ #measurementFrame;
31865
32042
  constructor(options) {
31866
32043
  this.#host = options.host;
31867
32044
  this.#appearance = options.appearance;
@@ -31892,6 +32069,8 @@ var AssistantElementLauncherController = class {
31892
32069
  }
31893
32070
  disconnect() {
31894
32071
  document.removeEventListener("pointerdown", this.#handleDocumentPointerDown);
32072
+ this.#cancelWidthMeasurement();
32073
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
31895
32074
  this.#root = void 0;
31896
32075
  }
31897
32076
  sync() {
@@ -31913,7 +32092,13 @@ var AssistantElementLauncherController = class {
31913
32092
  );
31914
32093
  queryRequired(root, ".launcher").hidden = !appearance.behavior.showLauncher;
31915
32094
  queryRequired(root, ".powered-by-row").hidden = !appearance.behavior.showPoweredBy;
31916
- if (style === "bubble" || this.#host.hasAttribute("open")) this.collapse(true);
32095
+ if (style === "bubble" || this.#host.hasAttribute("open")) {
32096
+ this.#cancelWidthMeasurement();
32097
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32098
+ this.collapse(true);
32099
+ return;
32100
+ }
32101
+ if (!this.#host.hasAttribute("launcher-expanded")) this.#scheduleWidthMeasurement();
31917
32102
  }
31918
32103
  collapse(force = false) {
31919
32104
  const root = this.#root;
@@ -31934,6 +32119,9 @@ var AssistantElementLauncherController = class {
31934
32119
  #expand() {
31935
32120
  const root = this.#root;
31936
32121
  if (!root || this.#appearance().presentation.launcher.style === "bubble") return;
32122
+ this.#cancelWidthMeasurement();
32123
+ this.#measureCollapsedWidth();
32124
+ void queryRequired(root, ".launcher").offsetWidth;
31937
32125
  this.#host.setAttribute("launcher-expanded", "");
31938
32126
  const form = queryRequired(root, ".launcher-form");
31939
32127
  const trigger = queryRequired(root, ".launcher-trigger");
@@ -31945,6 +32133,31 @@ var AssistantElementLauncherController = class {
31945
32133
  if (this.#host.hasAttribute("launcher-expanded")) input.focus();
31946
32134
  });
31947
32135
  }
32136
+ #scheduleWidthMeasurement() {
32137
+ this.#cancelWidthMeasurement();
32138
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32139
+ this.#measurementFrame = requestAnimationFrame(() => {
32140
+ this.#measurementFrame = void 0;
32141
+ this.#measureCollapsedWidth();
32142
+ });
32143
+ }
32144
+ #cancelWidthMeasurement() {
32145
+ if (this.#measurementFrame === void 0) return;
32146
+ cancelAnimationFrame(this.#measurementFrame);
32147
+ this.#measurementFrame = void 0;
32148
+ }
32149
+ #measureCollapsedWidth() {
32150
+ const root = this.#root;
32151
+ if (!root || this.#host.hasAttribute("launcher-expanded") || this.#appearance().presentation.launcher.style === "bubble") {
32152
+ return;
32153
+ }
32154
+ const launcher = queryRequired(root, ".launcher");
32155
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32156
+ const collapsedWidth = launcher.offsetWidth;
32157
+ if (collapsedWidth > 0) {
32158
+ this.#host.style.setProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY, `${collapsedWidth}px`);
32159
+ }
32160
+ }
31948
32161
  #handleTrigger = () => {
31949
32162
  if (this.#appearance().presentation.launcher.style === "bubble") {
31950
32163
  this.#openPanel();
@@ -31984,7 +32197,7 @@ var AssistantElementLauncherController = class {
31984
32197
  };
31985
32198
  #handleDocumentPointerDown = (event) => {
31986
32199
  if (event.composedPath().includes(this.#host)) return;
31987
- this.collapse();
32200
+ this.collapse(true);
31988
32201
  };
31989
32202
  };
31990
32203
 
@@ -32057,177 +32270,6 @@ var AssistantElementPresentationGate = class {
32057
32270
  }
32058
32271
  };
32059
32272
 
32060
- // src/assistant-configuration-schema.ts
32061
- var hexColorSchema = external_exports.string().regex(/^#[0-9A-Fa-f]{6}$/);
32062
- var resolvedBorderColorSchema = external_exports.union([
32063
- hexColorSchema,
32064
- external_exports.string().max(64).refine(isBoundedRgbaColor, "must be a six-digit hex or bounded rgba color")
32065
- ]);
32066
- var browserAssetUrlSchema = external_exports.string().trim().url().refine(isSecureBrowserAssetUrl, "must use https (http is allowed only for loopback testing)");
32067
- var httpsUrlSchema = external_exports.string().trim().url().refine(isHttpsUrl2, "must use https");
32068
- var brandAssetSchema = external_exports.object({
32069
- uri: browserAssetUrlSchema,
32070
- darkUri: browserAssetUrlSchema.optional(),
32071
- alt: external_exports.string().trim().min(1).max(240)
32072
- }).strict();
32073
- var brandThemeSchema = external_exports.object({
32074
- surface: hexColorSchema.optional(),
32075
- surfaceRaised: hexColorSchema.optional(),
32076
- surfaceMuted: hexColorSchema.optional(),
32077
- text: hexColorSchema.optional(),
32078
- textMuted: hexColorSchema.optional(),
32079
- accent: hexColorSchema.optional(),
32080
- accentText: hexColorSchema.optional(),
32081
- link: hexColorSchema.optional(),
32082
- border: resolvedBorderColorSchema.optional(),
32083
- borderStrong: resolvedBorderColorSchema.optional(),
32084
- focus: hexColorSchema.optional(),
32085
- success: hexColorSchema.optional(),
32086
- warning: hexColorSchema.optional(),
32087
- danger: hexColorSchema.optional(),
32088
- code: hexColorSchema.optional()
32089
- }).strict();
32090
- var brandingSchema = external_exports.object({
32091
- name: external_exports.string().trim().min(1).max(160).optional(),
32092
- accent: hexColorSchema.optional(),
32093
- surface: hexColorSchema.optional(),
32094
- surfaceDark: hexColorSchema.optional(),
32095
- logo: brandAssetSchema.optional(),
32096
- mark: brandAssetSchema.optional(),
32097
- avatar: brandAssetSchema.optional(),
32098
- theme: external_exports.object({ light: brandThemeSchema.optional(), dark: brandThemeSchema.optional() }).strict().optional(),
32099
- radius: external_exports.enum(["none", "sm", "md", "lg"]).optional(),
32100
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32101
- typography: external_exports.enum(["system", "serif", "mono"]).optional(),
32102
- colorScheme: external_exports.enum(["auto", "light", "dark"]).optional()
32103
- }).strict();
32104
- var labelsSchema = external_exports.object({
32105
- welcomeHeading: external_exports.string().trim().min(1).max(160).optional(),
32106
- welcomeMessage: external_exports.string().max(1e3).optional(),
32107
- launcherPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32108
- composerPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32109
- thinking: external_exports.string().trim().min(1).max(80).optional(),
32110
- send: external_exports.string().trim().min(1).max(80).optional(),
32111
- stop: external_exports.string().trim().min(1).max(80).optional(),
32112
- close: external_exports.string().trim().min(1).max(80).optional(),
32113
- open: external_exports.string().trim().min(1).max(80).optional(),
32114
- confirm: external_exports.string().trim().min(1).max(80).optional(),
32115
- decline: external_exports.string().trim().min(1).max(80).optional(),
32116
- cancel: external_exports.string().trim().min(1).max(80).optional(),
32117
- confirmationHeading: external_exports.string().trim().min(1).max(120).optional(),
32118
- additionalDetails: external_exports.string().trim().min(1).max(120).optional(),
32119
- redacted: external_exports.string().trim().min(1).max(120).optional(),
32120
- completed: external_exports.string().trim().min(1).max(80).optional(),
32121
- stopped: external_exports.string().trim().min(1).max(80).optional(),
32122
- copy: external_exports.string().trim().min(1).max(80).optional(),
32123
- newMessages: external_exports.string().trim().min(1).max(80).optional(),
32124
- reconnect: external_exports.string().trim().min(1).max(80).optional(),
32125
- newConversation: external_exports.string().trim().min(1).max(80).optional(),
32126
- retry: external_exports.string().trim().min(1).max(80).optional(),
32127
- unavailable: external_exports.string().trim().min(1).max(240).optional(),
32128
- sessionExpired: external_exports.string().trim().min(1).max(240).optional(),
32129
- sessionIdle: external_exports.string().trim().min(1).max(120).optional(),
32130
- sessionLoading: external_exports.string().trim().min(1).max(120).optional(),
32131
- sessionReady: external_exports.string().trim().min(1).max(120).optional(),
32132
- sessionError: external_exports.string().trim().min(1).max(120).optional(),
32133
- signInHeading: external_exports.string().trim().min(1).max(120).optional(),
32134
- signInBody: external_exports.string().max(240).optional(),
32135
- signInAction: external_exports.string().trim().min(1).max(80).optional(),
32136
- signUpAction: external_exports.string().trim().min(1).max(80).optional()
32137
- }).strict();
32138
- var presentationSchema = external_exports.object({
32139
- panel: external_exports.object({
32140
- surface: external_exports.enum(["solid", "glass"]).optional(),
32141
- elevation: external_exports.enum(["soft", "dramatic"]).optional(),
32142
- border: external_exports.enum(["subtle", "strong"]).optional(),
32143
- radius: external_exports.number().int().min(0).max(64).optional()
32144
- }).strict().optional(),
32145
- launcher: external_exports.object({
32146
- style: external_exports.enum(["pill", "bubble"]).optional(),
32147
- icon: external_exports.enum(["brand-mark", "chat", "none"]).optional(),
32148
- size: external_exports.enum(["md", "lg"]).optional(),
32149
- status: external_exports.enum(["none", "session"]).optional(),
32150
- effect: external_exports.enum(["none", "pulse"]).optional()
32151
- }).strict().optional(),
32152
- header: external_exports.object({
32153
- mark: external_exports.enum(["none", "brand-mark", "status"]).optional(),
32154
- badge: external_exports.object({
32155
- text: external_exports.string().trim().min(1).max(80),
32156
- tone: external_exports.enum(["neutral", "success", "warning", "danger"]).optional(),
32157
- indicator: external_exports.boolean().optional()
32158
- }).strict().optional()
32159
- }).strict().optional(),
32160
- composer: external_exports.object({
32161
- leadingIcon: external_exports.enum(["none", "brand-mark"]).optional(),
32162
- sendIcon: external_exports.enum(["arrow-up", "paper-plane"]).optional(),
32163
- shape: external_exports.enum(["rounded", "pill"]).optional()
32164
- }).strict().optional(),
32165
- messages: external_exports.object({
32166
- userStyle: external_exports.enum(["bubble", "accent"]).optional(),
32167
- assistantStyle: external_exports.enum(["plain", "bubble"]).optional()
32168
- }).strict().optional()
32169
- }).strict();
32170
- var assistantUiSchema = external_exports.object({
32171
- theme: external_exports.enum(["auto", "light", "dark", "invert"]).optional(),
32172
- layout: external_exports.object({
32173
- mode: external_exports.enum(["floating", "inline", "drawer"]).optional(),
32174
- position: external_exports.enum(["bottom-left", "bottom-center", "bottom-right"]).optional(),
32175
- panelWidth: external_exports.number().int().min(280).max(1200).optional(),
32176
- panelMinHeight: external_exports.number().int().min(240).max(1600).optional(),
32177
- panelMaxHeight: external_exports.number().int().min(320).max(2400).optional(),
32178
- edgeOffset: external_exports.number().int().min(0).max(96).optional(),
32179
- zIndex: external_exports.number().int().min(0).max(2147483647).optional(),
32180
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32181
- mobileFullscreen: external_exports.boolean().optional()
32182
- }).strict().optional(),
32183
- behavior: external_exports.object({
32184
- startOpen: external_exports.boolean().optional(),
32185
- closeOnEscape: external_exports.boolean().optional(),
32186
- closeOnOutsideClick: external_exports.boolean().optional(),
32187
- showLauncher: external_exports.boolean().optional(),
32188
- showHeader: external_exports.boolean().optional(),
32189
- showAvatars: external_exports.boolean().optional(),
32190
- showTimestamps: external_exports.boolean().optional(),
32191
- showPoweredBy: external_exports.boolean().optional()
32192
- }).strict().optional(),
32193
- labels: labelsSchema.optional(),
32194
- presentation: presentationSchema.optional(),
32195
- suggestedPrompts: external_exports.array(external_exports.string().trim().min(1).max(240)).max(8).optional(),
32196
- privacyUrl: httpsUrlSchema.optional(),
32197
- termsUrl: httpsUrlSchema.optional(),
32198
- locale: external_exports.string().trim().min(2).max(35).optional(),
32199
- direction: external_exports.enum(["ltr", "rtl", "auto"]).optional()
32200
- }).strict();
32201
- var assistantConfigurationSchema = external_exports.object({ branding: brandingSchema.optional(), assistant: assistantUiSchema.optional() }).strict();
32202
- function parseAssistantConfiguration(value) {
32203
- const parsed = assistantConfigurationSchema.safeParse(value);
32204
- return parsed.success ? parsed.data : void 0;
32205
- }
32206
- function isHttpsUrl2(value) {
32207
- try {
32208
- return new URL(value).protocol === "https:";
32209
- } catch {
32210
- return false;
32211
- }
32212
- }
32213
- function isSecureBrowserAssetUrl(value) {
32214
- try {
32215
- const url2 = new URL(value);
32216
- if (url2.protocol === "https:") return true;
32217
- if (url2.protocol !== "http:") return false;
32218
- return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
32219
- } catch {
32220
- return false;
32221
- }
32222
- }
32223
- function isBoundedRgbaColor(value) {
32224
- const match = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0(?:\.\d{1,6})?|1(?:\.0{1,6})?)\s*\)$/.exec(
32225
- value
32226
- );
32227
- if (match === null) return false;
32228
- return match.slice(1, 4).every((channel) => Number(channel) <= 255);
32229
- }
32230
-
32231
32273
  // src/element-public-configuration-controller.ts
32232
32274
  var AssistantElementPublicConfigurationController = class {
32233
32275
  #source;
@@ -32430,12 +32472,12 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
32430
32472
  :host([data-mode="floating"][open]) { width: min(var(--ns-assistant-panel-width, var(--ns-assistant-default-panel-width)), 100vw); }
32431
32473
  button { font: inherit; }
32432
32474
  button, textarea, input, select { -webkit-tap-highlight-color: transparent; }
32433
- .launcher { display: flex; align-items: center; justify-content: center; gap: 12px; width: max-content; min-height: 44px; padding: 10px 14px; color: var(--ns-assistant-launcher-text, var(--ns-assistant-text, var(--ns-assistant-default-text))); background: var(--ns-assistant-launcher, color-mix(in srgb, var(--ns-assistant-panel, var(--ns-assistant-default-panel)) 50%, transparent)); border: 1px solid var(--ns-assistant-launcher-border, var(--ns-assistant-halo-launcher-border)); border-radius: 999px; box-shadow: var(--ns-assistant-halo-launcher-shadow), -6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent), 6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent), 0 0 40px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 10%, transparent); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1), padding .5s cubic-bezier(.25,1,.5,1), gap .35s cubic-bezier(.25,1,.5,1), transform .6s cubic-bezier(.25,1,.5,1), background-color .3s ease, box-shadow .3s ease; }
32475
+ .launcher { display: flex; align-items: center; justify-content: center; gap: 12px; width: var(--_ns-assistant-launcher-collapsed-width, max-content); min-height: 44px; padding: 10px 14px; color: var(--ns-assistant-launcher-text, var(--ns-assistant-text, var(--ns-assistant-default-text))); background: var(--ns-assistant-launcher, color-mix(in srgb, var(--ns-assistant-panel, var(--ns-assistant-default-panel)) 50%, transparent)); border: 1px solid var(--ns-assistant-launcher-border, var(--ns-assistant-halo-launcher-border)); border-radius: 999px; box-shadow: var(--ns-assistant-halo-launcher-shadow), -6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent), 6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent), 0 0 40px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 10%, transparent); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1), padding .5s cubic-bezier(.25,1,.5,1), gap .35s cubic-bezier(.25,1,.5,1), transform .6s cubic-bezier(.25,1,.5,1), background-color .3s ease, box-shadow .3s ease; will-change: width; }
32434
32476
  :host([data-presentation-ready]) .launcher { padding: 10px 12px; }
32435
32477
  .launcher[hidden] { display: none; }
32436
32478
  .launcher:hover { transform: scale(1.02); box-shadow: var(--ns-assistant-halo-launcher-shadow-hover), -6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent), 6px 0 18px color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 20%, transparent); }
32437
32479
  .launcher-trigger, .launcher-form { min-width: 0; margin: 0; padding: 0; border: 0; background: transparent; font: inherit; }
32438
- .launcher-trigger { display: flex; align-items: center; gap: 12px; min-height: 28px; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); cursor: text; }
32480
+ .launcher-trigger { display: flex; align-items: center; gap: 12px; min-height: 28px; color: var(--ns-assistant-launcher-text, var(--ns-assistant-text, var(--ns-assistant-default-text))); cursor: text; }
32439
32481
  .launcher-label { padding-left: 6px; white-space: nowrap; font-size: 15px; line-height: 20px; }
32440
32482
  .launcher-arrow, .launcher-send { position: relative; display: grid; width: 28px; height: 28px; flex: 0 0 28px; place-items: center; border: 0; border-radius: 50%; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: var(--ns-assistant-launcher-action, var(--ns-assistant-halo-launcher-action)); cursor: pointer; }
32441
32483
  .launcher-arrow:hover, .launcher-send:hover { background: var(--ns-assistant-launcher-action-hover, var(--ns-assistant-halo-launcher-action-hover)); }
@@ -32974,19 +33016,11 @@ var presentationStyles = `<style>
32974
33016
  width: 28px;
32975
33017
  height: 28px;
32976
33018
  border-radius: 50%;
32977
- filter: grayscale(100%);
32978
- opacity: .6;
32979
- transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1), filter .5s cubic-bezier(.25,1,.5,1), opacity .5s cubic-bezier(.25,1,.5,1);
32980
- }
32981
- .launcher:hover .launcher-glyph:is(img), :host([launcher-expanded]) .launcher-glyph:is(img) {
32982
- filter: none;
32983
- opacity: 1;
33019
+ transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1);
32984
33020
  }
32985
33021
  :host([data-launcher-style="bubble"]) .launcher-glyph:is(img) {
32986
33022
  width: 32px;
32987
33023
  height: 32px;
32988
- filter: none;
32989
- opacity: 1;
32990
33024
  }
32991
33025
  .launcher-status {
32992
33026
  position: absolute;
@@ -33182,6 +33216,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
33182
33216
  },
33183
33217
  applyConfiguration: (configuration) => this.#applyConfiguration(configuration),
33184
33218
  labels: () => this.#appearance.labels,
33219
+ showConfirmationDetails: () => this.#appearance.behavior.showConfirmationDetails,
33185
33220
  respond: (id, response) => this.respond(id, response),
33186
33221
  dispatchError: (detail) => this.#dispatchError(detail),
33187
33222
  revealLatest: () => this.#revealLatest(),