@noodleseed/assistant 1.26.0 → 1.27.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-5PW6PXCI.js → chunk-2A3ZEYZV.js} +51 -180
  9. package/dist/chunk-2A3ZEYZV.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 +41 -49
  20. package/dist/index.cjs +224 -178
  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 +224 -178
  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-5PW6PXCI.js.map +0 -1
  39. package/dist/chunk-FNXAVRL5.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,166 +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 browserAssetUrlSchema = external_exports.string().trim().url().refine(isSecureBrowserAssetUrl, "must use https (http is allowed only for loopback testing)");
32060
- var httpsUrlSchema = external_exports.string().trim().url().refine(isHttpsUrl2, "must use https");
32061
- var brandAssetSchema = external_exports.object({
32062
- uri: browserAssetUrlSchema,
32063
- darkUri: browserAssetUrlSchema.optional(),
32064
- alt: external_exports.string().trim().min(1).max(240)
32065
- }).strict();
32066
- var brandThemeSchema = external_exports.object({
32067
- surface: hexColorSchema.optional(),
32068
- surfaceRaised: hexColorSchema.optional(),
32069
- surfaceMuted: hexColorSchema.optional(),
32070
- text: hexColorSchema.optional(),
32071
- textMuted: hexColorSchema.optional(),
32072
- accent: hexColorSchema.optional(),
32073
- accentText: hexColorSchema.optional(),
32074
- link: hexColorSchema.optional(),
32075
- border: hexColorSchema.optional(),
32076
- borderStrong: hexColorSchema.optional(),
32077
- focus: hexColorSchema.optional(),
32078
- success: hexColorSchema.optional(),
32079
- warning: hexColorSchema.optional(),
32080
- danger: hexColorSchema.optional(),
32081
- code: hexColorSchema.optional()
32082
- }).strict();
32083
- var brandingSchema = external_exports.object({
32084
- name: external_exports.string().trim().min(1).max(160).optional(),
32085
- accent: hexColorSchema.optional(),
32086
- surface: hexColorSchema.optional(),
32087
- surfaceDark: hexColorSchema.optional(),
32088
- logo: brandAssetSchema.optional(),
32089
- mark: brandAssetSchema.optional(),
32090
- avatar: brandAssetSchema.optional(),
32091
- theme: external_exports.object({ light: brandThemeSchema.optional(), dark: brandThemeSchema.optional() }).strict().optional(),
32092
- radius: external_exports.enum(["none", "sm", "md", "lg"]).optional(),
32093
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32094
- typography: external_exports.enum(["system", "serif", "mono"]).optional(),
32095
- colorScheme: external_exports.enum(["auto", "light", "dark"]).optional()
32096
- }).strict();
32097
- var labelsSchema = external_exports.object({
32098
- welcomeHeading: external_exports.string().trim().min(1).max(160).optional(),
32099
- welcomeMessage: external_exports.string().max(1e3).optional(),
32100
- launcherPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32101
- composerPlaceholder: external_exports.string().trim().min(1).max(160).optional(),
32102
- thinking: external_exports.string().trim().min(1).max(80).optional(),
32103
- send: external_exports.string().trim().min(1).max(80).optional(),
32104
- stop: external_exports.string().trim().min(1).max(80).optional(),
32105
- close: external_exports.string().trim().min(1).max(80).optional(),
32106
- open: external_exports.string().trim().min(1).max(80).optional(),
32107
- confirm: external_exports.string().trim().min(1).max(80).optional(),
32108
- decline: external_exports.string().trim().min(1).max(80).optional(),
32109
- cancel: external_exports.string().trim().min(1).max(80).optional(),
32110
- confirmationHeading: external_exports.string().trim().min(1).max(120).optional(),
32111
- additionalDetails: external_exports.string().trim().min(1).max(120).optional(),
32112
- redacted: external_exports.string().trim().min(1).max(120).optional(),
32113
- completed: external_exports.string().trim().min(1).max(80).optional(),
32114
- stopped: external_exports.string().trim().min(1).max(80).optional(),
32115
- copy: external_exports.string().trim().min(1).max(80).optional(),
32116
- newMessages: external_exports.string().trim().min(1).max(80).optional(),
32117
- reconnect: external_exports.string().trim().min(1).max(80).optional(),
32118
- newConversation: external_exports.string().trim().min(1).max(80).optional(),
32119
- retry: external_exports.string().trim().min(1).max(80).optional(),
32120
- unavailable: external_exports.string().trim().min(1).max(240).optional(),
32121
- sessionExpired: external_exports.string().trim().min(1).max(240).optional(),
32122
- sessionIdle: external_exports.string().trim().min(1).max(120).optional(),
32123
- sessionLoading: external_exports.string().trim().min(1).max(120).optional(),
32124
- sessionReady: external_exports.string().trim().min(1).max(120).optional(),
32125
- sessionError: external_exports.string().trim().min(1).max(120).optional(),
32126
- signInHeading: external_exports.string().trim().min(1).max(120).optional(),
32127
- signInBody: external_exports.string().max(240).optional(),
32128
- signInAction: external_exports.string().trim().min(1).max(80).optional(),
32129
- signUpAction: external_exports.string().trim().min(1).max(80).optional()
32130
- }).strict();
32131
- var presentationSchema = external_exports.object({
32132
- panel: external_exports.object({
32133
- surface: external_exports.enum(["solid", "glass"]).optional(),
32134
- elevation: external_exports.enum(["soft", "dramatic"]).optional(),
32135
- border: external_exports.enum(["subtle", "strong"]).optional(),
32136
- radius: external_exports.number().int().min(0).max(64).optional()
32137
- }).strict().optional(),
32138
- launcher: external_exports.object({
32139
- style: external_exports.enum(["pill", "bubble"]).optional(),
32140
- icon: external_exports.enum(["brand-mark", "chat", "none"]).optional(),
32141
- size: external_exports.enum(["md", "lg"]).optional(),
32142
- status: external_exports.enum(["none", "session"]).optional(),
32143
- effect: external_exports.enum(["none", "pulse"]).optional()
32144
- }).strict().optional(),
32145
- header: external_exports.object({
32146
- mark: external_exports.enum(["none", "brand-mark", "status"]).optional(),
32147
- badge: external_exports.object({
32148
- text: external_exports.string().trim().min(1).max(80),
32149
- tone: external_exports.enum(["neutral", "success", "warning", "danger"]).optional(),
32150
- indicator: external_exports.boolean().optional()
32151
- }).strict().optional()
32152
- }).strict().optional(),
32153
- composer: external_exports.object({
32154
- leadingIcon: external_exports.enum(["none", "brand-mark"]).optional(),
32155
- sendIcon: external_exports.enum(["arrow-up", "paper-plane"]).optional(),
32156
- shape: external_exports.enum(["rounded", "pill"]).optional()
32157
- }).strict().optional(),
32158
- messages: external_exports.object({
32159
- userStyle: external_exports.enum(["bubble", "accent"]).optional(),
32160
- assistantStyle: external_exports.enum(["plain", "bubble"]).optional()
32161
- }).strict().optional()
32162
- }).strict();
32163
- var assistantUiSchema = external_exports.object({
32164
- theme: external_exports.enum(["auto", "light", "dark", "invert"]).optional(),
32165
- layout: external_exports.object({
32166
- mode: external_exports.enum(["floating", "inline", "drawer"]).optional(),
32167
- position: external_exports.enum(["bottom-left", "bottom-center", "bottom-right"]).optional(),
32168
- panelWidth: external_exports.number().int().min(280).max(1200).optional(),
32169
- panelMinHeight: external_exports.number().int().min(240).max(1600).optional(),
32170
- panelMaxHeight: external_exports.number().int().min(320).max(2400).optional(),
32171
- edgeOffset: external_exports.number().int().min(0).max(96).optional(),
32172
- zIndex: external_exports.number().int().min(0).max(2147483647).optional(),
32173
- density: external_exports.enum(["compact", "comfortable"]).optional(),
32174
- mobileFullscreen: external_exports.boolean().optional()
32175
- }).strict().optional(),
32176
- behavior: external_exports.object({
32177
- startOpen: external_exports.boolean().optional(),
32178
- closeOnEscape: external_exports.boolean().optional(),
32179
- closeOnOutsideClick: external_exports.boolean().optional(),
32180
- showLauncher: external_exports.boolean().optional(),
32181
- showHeader: external_exports.boolean().optional(),
32182
- showAvatars: external_exports.boolean().optional(),
32183
- showTimestamps: external_exports.boolean().optional(),
32184
- showPoweredBy: external_exports.boolean().optional()
32185
- }).strict().optional(),
32186
- labels: labelsSchema.optional(),
32187
- presentation: presentationSchema.optional(),
32188
- suggestedPrompts: external_exports.array(external_exports.string().trim().min(1).max(240)).max(8).optional(),
32189
- privacyUrl: httpsUrlSchema.optional(),
32190
- termsUrl: httpsUrlSchema.optional(),
32191
- locale: external_exports.string().trim().min(2).max(35).optional(),
32192
- direction: external_exports.enum(["ltr", "rtl", "auto"]).optional()
32193
- }).strict();
32194
- var assistantConfigurationSchema = external_exports.object({ branding: brandingSchema.optional(), assistant: assistantUiSchema.optional() }).strict();
32195
- function parseAssistantConfiguration(value) {
32196
- const parsed = assistantConfigurationSchema.safeParse(value);
32197
- return parsed.success ? parsed.data : void 0;
32198
- }
32199
- function isHttpsUrl2(value) {
32200
- try {
32201
- return new URL(value).protocol === "https:";
32202
- } catch {
32203
- return false;
32204
- }
32205
- }
32206
- function isSecureBrowserAssetUrl(value) {
32207
- try {
32208
- const url2 = new URL(value);
32209
- if (url2.protocol === "https:") return true;
32210
- if (url2.protocol !== "http:") return false;
32211
- return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
32212
- } catch {
32213
- return false;
32214
- }
32215
- }
32216
-
32217
32270
  // src/element-public-configuration-controller.ts
32218
32271
  var AssistantElementPublicConfigurationController = class {
32219
32272
  #source;
@@ -32416,7 +32469,7 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
32416
32469
  :host([data-mode="floating"][open]) { width: min(var(--ns-assistant-panel-width, var(--ns-assistant-default-panel-width)), 100vw); }
32417
32470
  button { font: inherit; }
32418
32471
  button, textarea, input, select { -webkit-tap-highlight-color: transparent; }
32419
- .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; }
32420
32473
  :host([data-presentation-ready]) .launcher { padding: 10px 12px; }
32421
32474
  .launcher[hidden] { display: none; }
32422
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); }
@@ -32960,19 +33013,11 @@ var presentationStyles = `<style>
32960
33013
  width: 28px;
32961
33014
  height: 28px;
32962
33015
  border-radius: 50%;
32963
- filter: grayscale(100%);
32964
- opacity: .6;
32965
- 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);
32966
- }
32967
- .launcher:hover .launcher-glyph:is(img), :host([launcher-expanded]) .launcher-glyph:is(img) {
32968
- filter: none;
32969
- opacity: 1;
33016
+ transition: width .5s cubic-bezier(.25,1,.5,1), height .5s cubic-bezier(.25,1,.5,1);
32970
33017
  }
32971
33018
  :host([data-launcher-style="bubble"]) .launcher-glyph:is(img) {
32972
33019
  width: 32px;
32973
33020
  height: 32px;
32974
- filter: none;
32975
- opacity: 1;
32976
33021
  }
32977
33022
  .launcher-status {
32978
33023
  position: absolute;
@@ -33168,6 +33213,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
33168
33213
  },
33169
33214
  applyConfiguration: (configuration) => this.#applyConfiguration(configuration),
33170
33215
  labels: () => this.#appearance.labels,
33216
+ showConfirmationDetails: () => this.#appearance.behavior.showConfirmationDetails,
33171
33217
  respond: (id, response) => this.respond(id, response),
33172
33218
  dispatchError: (detail) => this.#dispatchError(detail),
33173
33219
  revealLatest: () => this.#revealLatest(),