@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
package/dist/index.cjs CHANGED
@@ -22427,7 +22427,8 @@ var DEFAULT_APPEARANCE = {
22427
22427
  showHeader: true,
22428
22428
  showAvatars: true,
22429
22429
  showTimestamps: false,
22430
- showPoweredBy: true
22430
+ showPoweredBy: true,
22431
+ showConfirmationDetails: true
22431
22432
  },
22432
22433
  labels: {
22433
22434
  welcomeHeading: "",
@@ -27357,6 +27358,178 @@ function isRecord(value) {
27357
27358
  return typeof value === "object" && value !== null && !Array.isArray(value);
27358
27359
  }
27359
27360
 
27361
+ // src/assistant-configuration-schema.ts
27362
+ var hexColorSchema = external_exports.string().regex(/^#[0-9A-Fa-f]{6}$/);
27363
+ var resolvedBorderColorSchema = external_exports.union([
27364
+ hexColorSchema,
27365
+ external_exports.string().max(64).refine(isBoundedRgbaColor, "must be a six-digit hex or bounded rgba color")
27366
+ ]);
27367
+ var browserAssetUrlSchema = external_exports.string().trim().url().refine(isSecureBrowserAssetUrl, "must use https (http is allowed only for loopback testing)");
27368
+ var httpsUrlSchema = external_exports.string().trim().url().refine(isHttpsUrl, "must use https");
27369
+ var brandAssetSchema = external_exports.object({
27370
+ uri: browserAssetUrlSchema,
27371
+ darkUri: browserAssetUrlSchema.optional(),
27372
+ alt: external_exports.string().trim().min(1).max(240)
27373
+ }).strict();
27374
+ var brandThemeSchema = external_exports.object({
27375
+ surface: hexColorSchema.optional(),
27376
+ surfaceRaised: hexColorSchema.optional(),
27377
+ surfaceMuted: hexColorSchema.optional(),
27378
+ text: hexColorSchema.optional(),
27379
+ textMuted: hexColorSchema.optional(),
27380
+ accent: hexColorSchema.optional(),
27381
+ accentText: hexColorSchema.optional(),
27382
+ link: hexColorSchema.optional(),
27383
+ border: resolvedBorderColorSchema.optional(),
27384
+ borderStrong: resolvedBorderColorSchema.optional(),
27385
+ focus: hexColorSchema.optional(),
27386
+ success: hexColorSchema.optional(),
27387
+ warning: hexColorSchema.optional(),
27388
+ danger: hexColorSchema.optional(),
27389
+ code: hexColorSchema.optional()
27390
+ }).strict();
27391
+ var brandingSchema = external_exports.object({
27392
+ name: external_exports.string().trim().min(1).max(160).optional(),
27393
+ accent: hexColorSchema.optional(),
27394
+ surface: hexColorSchema.optional(),
27395
+ surfaceDark: hexColorSchema.optional(),
27396
+ logo: brandAssetSchema.optional(),
27397
+ mark: brandAssetSchema.optional(),
27398
+ avatar: brandAssetSchema.optional(),
27399
+ theme: external_exports.object({ light: brandThemeSchema.optional(), dark: brandThemeSchema.optional() }).strict().optional(),
27400
+ radius: external_exports.enum(["none", "sm", "md", "lg"]).optional(),
27401
+ density: external_exports.enum(["compact", "comfortable"]).optional(),
27402
+ typography: external_exports.enum(["system", "serif", "mono"]).optional(),
27403
+ colorScheme: external_exports.enum(["auto", "light", "dark"]).optional()
27404
+ }).strict();
27405
+ var labelsSchema = external_exports.object({
27406
+ welcomeHeading: external_exports.string().trim().min(1).max(160).optional(),
27407
+ welcomeMessage: external_exports.string().max(1e3).optional(),
27408
+ launcherPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
27409
+ composerPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
27410
+ thinking: external_exports.string().trim().min(1).max(80).optional(),
27411
+ send: external_exports.string().trim().min(1).max(80).optional(),
27412
+ stop: external_exports.string().trim().min(1).max(80).optional(),
27413
+ close: external_exports.string().trim().min(1).max(80).optional(),
27414
+ open: external_exports.string().trim().min(1).max(80).optional(),
27415
+ confirm: external_exports.string().trim().min(1).max(80).optional(),
27416
+ decline: external_exports.string().trim().min(1).max(80).optional(),
27417
+ cancel: external_exports.string().trim().min(1).max(80).optional(),
27418
+ confirmationHeading: external_exports.string().trim().min(1).max(120).optional(),
27419
+ additionalDetails: external_exports.string().trim().min(1).max(120).optional(),
27420
+ redacted: external_exports.string().trim().min(1).max(120).optional(),
27421
+ completed: external_exports.string().trim().min(1).max(80).optional(),
27422
+ stopped: external_exports.string().trim().min(1).max(80).optional(),
27423
+ copy: external_exports.string().trim().min(1).max(80).optional(),
27424
+ newMessages: external_exports.string().trim().min(1).max(80).optional(),
27425
+ reconnect: external_exports.string().trim().min(1).max(80).optional(),
27426
+ newConversation: external_exports.string().trim().min(1).max(80).optional(),
27427
+ retry: external_exports.string().trim().min(1).max(80).optional(),
27428
+ unavailable: external_exports.string().trim().min(1).max(240).optional(),
27429
+ sessionExpired: external_exports.string().trim().min(1).max(240).optional(),
27430
+ sessionIdle: external_exports.string().trim().min(1).max(120).optional(),
27431
+ sessionLoading: external_exports.string().trim().min(1).max(120).optional(),
27432
+ sessionReady: external_exports.string().trim().min(1).max(120).optional(),
27433
+ sessionError: external_exports.string().trim().min(1).max(120).optional(),
27434
+ signInHeading: external_exports.string().trim().min(1).max(120).optional(),
27435
+ signInBody: external_exports.string().max(240).optional(),
27436
+ signInAction: external_exports.string().trim().min(1).max(80).optional(),
27437
+ signUpAction: external_exports.string().trim().min(1).max(80).optional()
27438
+ }).strict();
27439
+ var presentationSchema = external_exports.object({
27440
+ panel: external_exports.object({
27441
+ surface: external_exports.enum(["solid", "glass"]).optional(),
27442
+ elevation: external_exports.enum(["soft", "dramatic"]).optional(),
27443
+ border: external_exports.enum(["subtle", "strong"]).optional(),
27444
+ radius: external_exports.number().int().min(0).max(64).optional()
27445
+ }).strict().optional(),
27446
+ launcher: external_exports.object({
27447
+ style: external_exports.enum(["pill", "bubble"]).optional(),
27448
+ icon: external_exports.enum(["brand-mark", "chat", "none"]).optional(),
27449
+ size: external_exports.enum(["md", "lg"]).optional(),
27450
+ status: external_exports.enum(["none", "session"]).optional(),
27451
+ effect: external_exports.enum(["none", "pulse"]).optional()
27452
+ }).strict().optional(),
27453
+ header: external_exports.object({
27454
+ mark: external_exports.enum(["none", "brand-mark", "status"]).optional(),
27455
+ badge: external_exports.object({
27456
+ text: external_exports.string().trim().min(1).max(80),
27457
+ tone: external_exports.enum(["neutral", "success", "warning", "danger"]).optional(),
27458
+ indicator: external_exports.boolean().optional()
27459
+ }).strict().optional()
27460
+ }).strict().optional(),
27461
+ composer: external_exports.object({
27462
+ leadingIcon: external_exports.enum(["none", "brand-mark"]).optional(),
27463
+ sendIcon: external_exports.enum(["arrow-up", "paper-plane"]).optional(),
27464
+ shape: external_exports.enum(["rounded", "pill"]).optional()
27465
+ }).strict().optional(),
27466
+ messages: external_exports.object({
27467
+ userStyle: external_exports.enum(["bubble", "accent"]).optional(),
27468
+ assistantStyle: external_exports.enum(["plain", "bubble"]).optional()
27469
+ }).strict().optional()
27470
+ }).strict();
27471
+ var assistantUiSchema = external_exports.object({
27472
+ theme: external_exports.enum(["auto", "light", "dark", "invert"]).optional(),
27473
+ layout: external_exports.object({
27474
+ mode: external_exports.enum(["floating", "inline", "drawer"]).optional(),
27475
+ position: external_exports.enum(["bottom-left", "bottom-center", "bottom-right"]).optional(),
27476
+ panelWidth: external_exports.number().int().min(280).max(1200).optional(),
27477
+ panelMinHeight: external_exports.number().int().min(240).max(1600).optional(),
27478
+ panelMaxHeight: external_exports.number().int().min(320).max(2400).optional(),
27479
+ edgeOffset: external_exports.number().int().min(0).max(96).optional(),
27480
+ zIndex: external_exports.number().int().min(0).max(2147483647).optional(),
27481
+ density: external_exports.enum(["compact", "comfortable"]).optional(),
27482
+ mobileFullscreen: external_exports.boolean().optional()
27483
+ }).strict().optional(),
27484
+ behavior: external_exports.object({
27485
+ startOpen: external_exports.boolean().optional(),
27486
+ closeOnEscape: external_exports.boolean().optional(),
27487
+ closeOnOutsideClick: external_exports.boolean().optional(),
27488
+ showLauncher: external_exports.boolean().optional(),
27489
+ showHeader: external_exports.boolean().optional(),
27490
+ showAvatars: external_exports.boolean().optional(),
27491
+ showTimestamps: external_exports.boolean().optional(),
27492
+ showPoweredBy: external_exports.boolean().optional(),
27493
+ showConfirmationDetails: external_exports.boolean().optional()
27494
+ }).strict().optional(),
27495
+ labels: labelsSchema.optional(),
27496
+ presentation: presentationSchema.optional(),
27497
+ suggestedPrompts: external_exports.array(external_exports.string().trim().min(1).max(240)).max(8).optional(),
27498
+ privacyUrl: httpsUrlSchema.optional(),
27499
+ termsUrl: httpsUrlSchema.optional(),
27500
+ locale: external_exports.string().trim().min(2).max(35).optional(),
27501
+ direction: external_exports.enum(["ltr", "rtl", "auto"]).optional()
27502
+ }).strict();
27503
+ var assistantConfigurationSchema = external_exports.object({ branding: brandingSchema.optional(), assistant: assistantUiSchema.optional() }).strict();
27504
+ function parseAssistantConfiguration(value) {
27505
+ const parsed = assistantConfigurationSchema.safeParse(value);
27506
+ return parsed.success ? parsed.data : void 0;
27507
+ }
27508
+ function isHttpsUrl(value) {
27509
+ try {
27510
+ return new URL(value).protocol === "https:";
27511
+ } catch {
27512
+ return false;
27513
+ }
27514
+ }
27515
+ function isSecureBrowserAssetUrl(value) {
27516
+ try {
27517
+ const url2 = new URL(value);
27518
+ if (url2.protocol === "https:") return true;
27519
+ if (url2.protocol !== "http:") return false;
27520
+ return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
27521
+ } catch {
27522
+ return false;
27523
+ }
27524
+ }
27525
+ function isBoundedRgbaColor(value) {
27526
+ 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(
27527
+ value
27528
+ );
27529
+ if (match === null) return false;
27530
+ return match.slice(1, 4).every((channel) => Number(channel) <= 255);
27531
+ }
27532
+
27360
27533
  // src/client-errors.ts
27361
27534
  async function refusalCode(response) {
27362
27535
  try {
@@ -27390,6 +27563,7 @@ function parseSession(value) {
27390
27563
  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") {
27391
27564
  throw clientError("session_failed", "Assistant session response is invalid", true);
27392
27565
  }
27566
+ const configuration = parseAssistantConfiguration(value.configuration);
27393
27567
  return {
27394
27568
  token: value.token,
27395
27569
  expiresAt: value.expiresAt,
@@ -27401,7 +27575,7 @@ function parseSession(value) {
27401
27575
  ...typeof sandbox === "string" ? { sandbox } : {},
27402
27576
  ...typeof transcript === "string" ? { transcript } : {}
27403
27577
  },
27404
- ...isRecord2(value.configuration) ? { configuration: value.configuration } : {},
27578
+ ...configuration === void 0 ? {} : { configuration },
27405
27579
  ...isRecord2(value.resume) && typeof value.resume.tool === "string" ? { resume: { tool: value.resume.tool } } : {}
27406
27580
  };
27407
27581
  }
@@ -27495,9 +27669,9 @@ function toAssistantClientEvent(event) {
27495
27669
  return { event: "unrecognized", data: { name: event.event, payload: value } };
27496
27670
  }
27497
27671
  function isViewAvailableDetail(value) {
27498
- 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);
27672
+ 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);
27499
27673
  }
27500
- function isHttpsUrl(value) {
27674
+ function isHttpsUrl2(value) {
27501
27675
  if (typeof value !== "string") return false;
27502
27676
  try {
27503
27677
  return new URL(value).protocol === "https:";
@@ -28581,7 +28755,7 @@ function createInteractionCard(options) {
28581
28755
  if (Object.keys(businessArguments).length > 0) {
28582
28756
  card.append(createArgumentList(businessArguments, options.reviewSchema, options.labels));
28583
28757
  }
28584
- if (action !== void 0) {
28758
+ if (action !== void 0 && options.showDetails !== false) {
28585
28759
  const technical = document.createElement("details");
28586
28760
  technical.className = "proposal-details";
28587
28761
  const summary = document.createElement("summary");
@@ -28663,7 +28837,7 @@ function createArgumentList(arguments_, schema, labels) {
28663
28837
  return list;
28664
28838
  }
28665
28839
  function appendValue(parent, value, schema, labels) {
28666
- if (value === "[REDACTED]") {
28840
+ if (schema?.writeOnly === true || schema?.["x-sensitive"] === true || value === "[REDACTED]") {
28667
28841
  const hidden = document.createElement("span");
28668
28842
  hidden.className = "proposal-redacted";
28669
28843
  hidden.textContent = labels.redacted;
@@ -31584,6 +31758,7 @@ var AssistantElementEventController = class {
31584
31758
  ...description ? { description } : {},
31585
31759
  ...arguments_ ? { arguments: arguments_ } : {},
31586
31760
  ...reviewSchema ? { reviewSchema } : {},
31761
+ showDetails: this.#host.showConfirmationDetails(),
31587
31762
  labels: {
31588
31763
  heading: labels.confirmationHeading,
31589
31764
  accept: labels.confirm,
@@ -31853,12 +32028,14 @@ var AssistantElementHostEnvironmentController = class {
31853
32028
  };
31854
32029
 
31855
32030
  // src/element-launcher-controller.ts
32031
+ var COLLAPSED_LAUNCHER_WIDTH_PROPERTY = "--_ns-assistant-launcher-collapsed-width";
31856
32032
  var AssistantElementLauncherController = class {
31857
32033
  #host;
31858
32034
  #appearance;
31859
32035
  #openPanel;
31860
32036
  #sendMessage;
31861
32037
  #root;
32038
+ #measurementFrame;
31862
32039
  constructor(options) {
31863
32040
  this.#host = options.host;
31864
32041
  this.#appearance = options.appearance;
@@ -31889,6 +32066,8 @@ var AssistantElementLauncherController = class {
31889
32066
  }
31890
32067
  disconnect() {
31891
32068
  document.removeEventListener("pointerdown", this.#handleDocumentPointerDown);
32069
+ this.#cancelWidthMeasurement();
32070
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
31892
32071
  this.#root = void 0;
31893
32072
  }
31894
32073
  sync() {
@@ -31910,7 +32089,13 @@ var AssistantElementLauncherController = class {
31910
32089
  );
31911
32090
  queryRequired(root, ".launcher").hidden = !appearance.behavior.showLauncher;
31912
32091
  queryRequired(root, ".powered-by-row").hidden = !appearance.behavior.showPoweredBy;
31913
- if (style === "bubble" || this.#host.hasAttribute("open")) this.collapse(true);
32092
+ if (style === "bubble" || this.#host.hasAttribute("open")) {
32093
+ this.#cancelWidthMeasurement();
32094
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32095
+ this.collapse(true);
32096
+ return;
32097
+ }
32098
+ if (!this.#host.hasAttribute("launcher-expanded")) this.#scheduleWidthMeasurement();
31914
32099
  }
31915
32100
  collapse(force = false) {
31916
32101
  const root = this.#root;
@@ -31931,6 +32116,9 @@ var AssistantElementLauncherController = class {
31931
32116
  #expand() {
31932
32117
  const root = this.#root;
31933
32118
  if (!root || this.#appearance().presentation.launcher.style === "bubble") return;
32119
+ this.#cancelWidthMeasurement();
32120
+ this.#measureCollapsedWidth();
32121
+ void queryRequired(root, ".launcher").offsetWidth;
31934
32122
  this.#host.setAttribute("launcher-expanded", "");
31935
32123
  const form = queryRequired(root, ".launcher-form");
31936
32124
  const trigger = queryRequired(root, ".launcher-trigger");
@@ -31942,6 +32130,31 @@ var AssistantElementLauncherController = class {
31942
32130
  if (this.#host.hasAttribute("launcher-expanded")) input.focus();
31943
32131
  });
31944
32132
  }
32133
+ #scheduleWidthMeasurement() {
32134
+ this.#cancelWidthMeasurement();
32135
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32136
+ this.#measurementFrame = requestAnimationFrame(() => {
32137
+ this.#measurementFrame = void 0;
32138
+ this.#measureCollapsedWidth();
32139
+ });
32140
+ }
32141
+ #cancelWidthMeasurement() {
32142
+ if (this.#measurementFrame === void 0) return;
32143
+ cancelAnimationFrame(this.#measurementFrame);
32144
+ this.#measurementFrame = void 0;
32145
+ }
32146
+ #measureCollapsedWidth() {
32147
+ const root = this.#root;
32148
+ if (!root || this.#host.hasAttribute("launcher-expanded") || this.#appearance().presentation.launcher.style === "bubble") {
32149
+ return;
32150
+ }
32151
+ const launcher = queryRequired(root, ".launcher");
32152
+ this.#host.style.removeProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY);
32153
+ const collapsedWidth = launcher.offsetWidth;
32154
+ if (collapsedWidth > 0) {
32155
+ this.#host.style.setProperty(COLLAPSED_LAUNCHER_WIDTH_PROPERTY, `${collapsedWidth}px`);
32156
+ }
32157
+ }
31945
32158
  #handleTrigger = () => {
31946
32159
  if (this.#appearance().presentation.launcher.style === "bubble") {
31947
32160
  this.#openPanel();
@@ -31981,7 +32194,7 @@ var AssistantElementLauncherController = class {
31981
32194
  };
31982
32195
  #handleDocumentPointerDown = (event) => {
31983
32196
  if (event.composedPath().includes(this.#host)) return;
31984
- this.collapse();
32197
+ this.collapse(true);
31985
32198
  };
31986
32199
  };
31987
32200
 
@@ -32054,177 +32267,6 @@ var AssistantElementPresentationGate = class {
32054
32267
  }
32055
32268
  };
32056
32269
 
32057
- // src/assistant-configuration-schema.ts
32058
- var hexColorSchema = external_exports.string().regex(/^#[0-9A-Fa-f]{6}$/);
32059
- var resolvedBorderColorSchema = external_exports.union([
32060
- hexColorSchema,
32061
- external_exports.string().max(64).refine(isBoundedRgbaColor, "must be a six-digit hex or bounded rgba color")
32062
- ]);
32063
- var browserAssetUrlSchema = external_exports.string().trim().url().refine(isSecureBrowserAssetUrl, "must use https (http is allowed only for loopback testing)");
32064
- var httpsUrlSchema = external_exports.string().trim().url().refine(isHttpsUrl2, "must use https");
32065
- var brandAssetSchema = external_exports.object({
32066
- uri: browserAssetUrlSchema,
32067
- darkUri: browserAssetUrlSchema.optional(),
32068
- alt: external_exports.string().trim().min(1).max(240)
32069
- }).strict();
32070
- var brandThemeSchema = external_exports.object({
32071
- surface: hexColorSchema.optional(),
32072
- surfaceRaised: hexColorSchema.optional(),
32073
- surfaceMuted: hexColorSchema.optional(),
32074
- text: hexColorSchema.optional(),
32075
- textMuted: hexColorSchema.optional(),
32076
- accent: hexColorSchema.optional(),
32077
- accentText: hexColorSchema.optional(),
32078
- link: hexColorSchema.optional(),
32079
- border: resolvedBorderColorSchema.optional(),
32080
- borderStrong: resolvedBorderColorSchema.optional(),
32081
- focus: hexColorSchema.optional(),
32082
- success: hexColorSchema.optional(),
32083
- warning: hexColorSchema.optional(),
32084
- danger: hexColorSchema.optional(),
32085
- code: hexColorSchema.optional()
32086
- }).strict();
32087
- var brandingSchema = external_exports.object({
32088
- name: external_exports.string().trim().min(1).max(160).optional(),
32089
- accent: hexColorSchema.optional(),
32090
- surface: hexColorSchema.optional(),
32091
- surfaceDark: hexColorSchema.optional(),
32092
- logo: brandAssetSchema.optional(),
32093
- mark: brandAssetSchema.optional(),
32094
- avatar: brandAssetSchema.optional(),
32095
- theme: external_exports.object({ light: brandThemeSchema.optional(), dark: brandThemeSchema.optional() }).strict().optional(),
32096
- radius: external_exports.enum(["none", "sm", "md", "lg"]).optional(),
32097
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32098
- typography: external_exports.enum(["system", "serif", "mono"]).optional(),
32099
- colorScheme: external_exports.enum(["auto", "light", "dark"]).optional()
32100
- }).strict();
32101
- var labelsSchema = external_exports.object({
32102
- welcomeHeading: external_exports.string().trim().min(1).max(160).optional(),
32103
- welcomeMessage: external_exports.string().max(1e3).optional(),
32104
- launcherPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32105
- composerPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32106
- thinking: external_exports.string().trim().min(1).max(80).optional(),
32107
- send: external_exports.string().trim().min(1).max(80).optional(),
32108
- stop: external_exports.string().trim().min(1).max(80).optional(),
32109
- close: external_exports.string().trim().min(1).max(80).optional(),
32110
- open: external_exports.string().trim().min(1).max(80).optional(),
32111
- confirm: external_exports.string().trim().min(1).max(80).optional(),
32112
- decline: external_exports.string().trim().min(1).max(80).optional(),
32113
- cancel: external_exports.string().trim().min(1).max(80).optional(),
32114
- confirmationHeading: external_exports.string().trim().min(1).max(120).optional(),
32115
- additionalDetails: external_exports.string().trim().min(1).max(120).optional(),
32116
- redacted: external_exports.string().trim().min(1).max(120).optional(),
32117
- completed: external_exports.string().trim().min(1).max(80).optional(),
32118
- stopped: external_exports.string().trim().min(1).max(80).optional(),
32119
- copy: external_exports.string().trim().min(1).max(80).optional(),
32120
- newMessages: external_exports.string().trim().min(1).max(80).optional(),
32121
- reconnect: external_exports.string().trim().min(1).max(80).optional(),
32122
- newConversation: external_exports.string().trim().min(1).max(80).optional(),
32123
- retry: external_exports.string().trim().min(1).max(80).optional(),
32124
- unavailable: external_exports.string().trim().min(1).max(240).optional(),
32125
- sessionExpired: external_exports.string().trim().min(1).max(240).optional(),
32126
- sessionIdle: external_exports.string().trim().min(1).max(120).optional(),
32127
- sessionLoading: external_exports.string().trim().min(1).max(120).optional(),
32128
- sessionReady: external_exports.string().trim().min(1).max(120).optional(),
32129
- sessionError: external_exports.string().trim().min(1).max(120).optional(),
32130
- signInHeading: external_exports.string().trim().min(1).max(120).optional(),
32131
- signInBody: external_exports.string().max(240).optional(),
32132
- signInAction: external_exports.string().trim().min(1).max(80).optional(),
32133
- signUpAction: external_exports.string().trim().min(1).max(80).optional()
32134
- }).strict();
32135
- var presentationSchema = external_exports.object({
32136
- panel: external_exports.object({
32137
- surface: external_exports.enum(["solid", "glass"]).optional(),
32138
- elevation: external_exports.enum(["soft", "dramatic"]).optional(),
32139
- border: external_exports.enum(["subtle", "strong"]).optional(),
32140
- radius: external_exports.number().int().min(0).max(64).optional()
32141
- }).strict().optional(),
32142
- launcher: external_exports.object({
32143
- style: external_exports.enum(["pill", "bubble"]).optional(),
32144
- icon: external_exports.enum(["brand-mark", "chat", "none"]).optional(),
32145
- size: external_exports.enum(["md", "lg"]).optional(),
32146
- status: external_exports.enum(["none", "session"]).optional(),
32147
- effect: external_exports.enum(["none", "pulse"]).optional()
32148
- }).strict().optional(),
32149
- header: external_exports.object({
32150
- mark: external_exports.enum(["none", "brand-mark", "status"]).optional(),
32151
- badge: external_exports.object({
32152
- text: external_exports.string().trim().min(1).max(80),
32153
- tone: external_exports.enum(["neutral", "success", "warning", "danger"]).optional(),
32154
- indicator: external_exports.boolean().optional()
32155
- }).strict().optional()
32156
- }).strict().optional(),
32157
- composer: external_exports.object({
32158
- leadingIcon: external_exports.enum(["none", "brand-mark"]).optional(),
32159
- sendIcon: external_exports.enum(["arrow-up", "paper-plane"]).optional(),
32160
- shape: external_exports.enum(["rounded", "pill"]).optional()
32161
- }).strict().optional(),
32162
- messages: external_exports.object({
32163
- userStyle: external_exports.enum(["bubble", "accent"]).optional(),
32164
- assistantStyle: external_exports.enum(["plain", "bubble"]).optional()
32165
- }).strict().optional()
32166
- }).strict();
32167
- var assistantUiSchema = external_exports.object({
32168
- theme: external_exports.enum(["auto", "light", "dark", "invert"]).optional(),
32169
- layout: external_exports.object({
32170
- mode: external_exports.enum(["floating", "inline", "drawer"]).optional(),
32171
- position: external_exports.enum(["bottom-left", "bottom-center", "bottom-right"]).optional(),
32172
- panelWidth: external_exports.number().int().min(280).max(1200).optional(),
32173
- panelMinHeight: external_exports.number().int().min(240).max(1600).optional(),
32174
- panelMaxHeight: external_exports.number().int().min(320).max(2400).optional(),
32175
- edgeOffset: external_exports.number().int().min(0).max(96).optional(),
32176
- zIndex: external_exports.number().int().min(0).max(2147483647).optional(),
32177
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32178
- mobileFullscreen: external_exports.boolean().optional()
32179
- }).strict().optional(),
32180
- behavior: external_exports.object({
32181
- startOpen: external_exports.boolean().optional(),
32182
- closeOnEscape: external_exports.boolean().optional(),
32183
- closeOnOutsideClick: external_exports.boolean().optional(),
32184
- showLauncher: external_exports.boolean().optional(),
32185
- showHeader: external_exports.boolean().optional(),
32186
- showAvatars: external_exports.boolean().optional(),
32187
- showTimestamps: external_exports.boolean().optional(),
32188
- showPoweredBy: external_exports.boolean().optional()
32189
- }).strict().optional(),
32190
- labels: labelsSchema.optional(),
32191
- presentation: presentationSchema.optional(),
32192
- suggestedPrompts: external_exports.array(external_exports.string().trim().min(1).max(240)).max(8).optional(),
32193
- privacyUrl: httpsUrlSchema.optional(),
32194
- termsUrl: httpsUrlSchema.optional(),
32195
- locale: external_exports.string().trim().min(2).max(35).optional(),
32196
- direction: external_exports.enum(["ltr", "rtl", "auto"]).optional()
32197
- }).strict();
32198
- var assistantConfigurationSchema = external_exports.object({ branding: brandingSchema.optional(), assistant: assistantUiSchema.optional() }).strict();
32199
- function parseAssistantConfiguration(value) {
32200
- const parsed = assistantConfigurationSchema.safeParse(value);
32201
- return parsed.success ? parsed.data : void 0;
32202
- }
32203
- function isHttpsUrl2(value) {
32204
- try {
32205
- return new URL(value).protocol === "https:";
32206
- } catch {
32207
- return false;
32208
- }
32209
- }
32210
- function isSecureBrowserAssetUrl(value) {
32211
- try {
32212
- const url2 = new URL(value);
32213
- if (url2.protocol === "https:") return true;
32214
- if (url2.protocol !== "http:") return false;
32215
- return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
32216
- } catch {
32217
- return false;
32218
- }
32219
- }
32220
- function isBoundedRgbaColor(value) {
32221
- 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(
32222
- value
32223
- );
32224
- if (match === null) return false;
32225
- return match.slice(1, 4).every((channel) => Number(channel) <= 255);
32226
- }
32227
-
32228
32270
  // src/element-public-configuration-controller.ts
32229
32271
  var AssistantElementPublicConfigurationController = class {
32230
32272
  #source;
@@ -32427,12 +32469,12 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
32427
32469
  :host([data-mode="floating"][open]) { width: min(var(--ns-assistant-panel-width, var(--ns-assistant-default-panel-width)), 100vw); }
32428
32470
  button { font: inherit; }
32429
32471
  button, textarea, input, select { -webkit-tap-highlight-color: transparent; }
32430
- .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; }
32472
+ .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; }
32431
32473
  :host([data-presentation-ready]) .launcher { padding: 10px 12px; }
32432
32474
  .launcher[hidden] { display: none; }
32433
32475
  .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); }
32434
32476
  .launcher-trigger, .launcher-form { min-width: 0; margin: 0; padding: 0; border: 0; background: transparent; font: inherit; }
32435
- .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; }
32477
+ .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; }
32436
32478
  .launcher-label { padding-left: 6px; white-space: nowrap; font-size: 15px; line-height: 20px; }
32437
32479
  .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; }
32438
32480
  .launcher-arrow:hover, .launcher-send:hover { background: var(--ns-assistant-launcher-action-hover, var(--ns-assistant-halo-launcher-action-hover)); }
@@ -32971,19 +33013,11 @@ var presentationStyles = `<style>
32971
33013
  width: 28px;
32972
33014
  height: 28px;
32973
33015
  border-radius: 50%;
32974
- filter: grayscale(100%);
32975
- opacity: .6;
32976
- 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);
32977
- }
32978
- .launcher:hover .launcher-glyph:is(img), :host([launcher-expanded]) .launcher-glyph:is(img) {
32979
- filter: none;
32980
- opacity: 1;
33016
+ transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1);
32981
33017
  }
32982
33018
  :host([data-launcher-style="bubble"]) .launcher-glyph:is(img) {
32983
33019
  width: 32px;
32984
33020
  height: 32px;
32985
- filter: none;
32986
- opacity: 1;
32987
33021
  }
32988
33022
  .launcher-status {
32989
33023
  position: absolute;
@@ -33179,6 +33213,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
33179
33213
  },
33180
33214
  applyConfiguration: (configuration) => this.#applyConfiguration(configuration),
33181
33215
  labels: () => this.#appearance.labels,
33216
+ showConfirmationDetails: () => this.#appearance.behavior.showConfirmationDetails,
33182
33217
  respond: (id, response) => this.respond(id, response),
33183
33218
  dispatchError: (detail) => this.#dispatchError(detail),
33184
33219
  revealLatest: () => this.#revealLatest(),