@noodleseed/assistant 1.24.0 → 1.25.1

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 (48) hide show
  1. package/dist/{app-view-element-DDtXu08a.d.ts → app-view-element-BNkQab1B.d.ts} +1 -1
  2. package/dist/{app-view-element-DSPtyEul.d.cts → app-view-element-DhuiNW_x.d.cts} +1 -1
  3. package/dist/app-view.cjs +5 -5
  4. package/dist/app-view.cjs.map +1 -1
  5. package/dist/app-view.d.cts +3 -3
  6. package/dist/app-view.d.ts +3 -3
  7. package/dist/app-view.js +2 -2
  8. package/dist/{appearance-0nS2LFjb.d.cts → appearance-B6vSg8Ub.d.cts} +4 -0
  9. package/dist/{appearance-0nS2LFjb.d.ts → appearance-B6vSg8Ub.d.ts} +4 -0
  10. package/dist/{chunk-5NBHHNI3.js → chunk-5TYS2Q6S.js} +2 -2
  11. package/dist/{chunk-IBDP6PXQ.js → chunk-7BQHW37I.js} +71 -3
  12. package/dist/chunk-7BQHW37I.js.map +1 -0
  13. package/dist/{chunk-XKTUXFGX.js → chunk-CF2SCDLF.js} +6 -6
  14. package/dist/chunk-CF2SCDLF.js.map +1 -0
  15. package/dist/{chunk-6PVDV7SO.js → chunk-FJYPE4GC.js} +55 -21
  16. package/dist/chunk-FJYPE4GC.js.map +1 -0
  17. package/dist/{client-By4gqB1k.d.cts → client-BkogON2A.d.ts} +11 -1
  18. package/dist/{client-Cf38TgwN.d.ts → client-C07ppTU_.d.cts} +11 -1
  19. package/dist/client.cjs +70 -2
  20. package/dist/client.cjs.map +1 -1
  21. package/dist/client.d.cts +2 -2
  22. package/dist/client.d.ts +2 -2
  23. package/dist/client.js +1 -1
  24. package/dist/embed.global.js +70 -68
  25. package/dist/index.cjs +127 -25
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +3 -3
  28. package/dist/index.d.ts +3 -3
  29. package/dist/index.js +3 -3
  30. package/dist/react/client.cjs +70 -2
  31. package/dist/react/client.cjs.map +1 -1
  32. package/dist/react/client.d.cts +2 -2
  33. package/dist/react/client.d.ts +2 -2
  34. package/dist/react/client.js +1 -1
  35. package/dist/react.cjs +127 -25
  36. package/dist/react.cjs.map +1 -1
  37. package/dist/react.d.cts +3 -3
  38. package/dist/react.d.ts +3 -3
  39. package/dist/react.js +4 -4
  40. package/dist/server.cjs.map +1 -1
  41. package/dist/server.d.cts +3 -1
  42. package/dist/server.d.ts +3 -1
  43. package/dist/server.js.map +1 -1
  44. package/package.json +1 -1
  45. package/dist/chunk-6PVDV7SO.js.map +0 -1
  46. package/dist/chunk-IBDP6PXQ.js.map +0 -1
  47. package/dist/chunk-XKTUXFGX.js.map +0 -1
  48. /package/dist/{chunk-5NBHHNI3.js.map → chunk-5TYS2Q6S.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-By4gqB1k.cjs';
2
- import '../appearance-0nS2LFjb.cjs';
1
+ import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-C07ppTU_.cjs';
2
+ import '../appearance-B6vSg8Ub.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-Cf38TgwN.js';
2
- import '../appearance-0nS2LFjb.js';
1
+ import { b as AssistantPageContext, c as AssistantContext, C as CreateAssistantClientOptions, d as AssistantChatState, A as AssistantClient } from '../client-BkogON2A.js';
2
+ import '../appearance-B6vSg8Ub.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-IBDP6PXQ.js";
4
+ } from "../chunk-7BQHW37I.js";
5
5
  import "../chunk-P223CYPO.js";
6
6
  import "../chunk-3YYTUJPJ.js";
7
7
  import "../chunk-5FUTL2UF.js";
package/dist/react.cjs CHANGED
@@ -15197,7 +15197,7 @@ __export(react_exports, {
15197
15197
  module.exports = __toCommonJS(react_exports);
15198
15198
  var import_react2 = require("react");
15199
15199
 
15200
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
15200
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
15201
15201
  init_v4();
15202
15202
  var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task";
15203
15203
  var JSONRPC_VERSION = "2.0";
@@ -20594,7 +20594,7 @@ var pipelineType = ZodPipeline.create;
20594
20594
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/mini/parse.js
20595
20595
  init_core2();
20596
20596
 
20597
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
20597
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
20598
20598
  function isZ4Schema(s2) {
20599
20599
  const schema = s2;
20600
20600
  return !!schema._zod;
@@ -20657,7 +20657,7 @@ function getLiteralValue(schema) {
20657
20657
  return void 0;
20658
20658
  }
20659
20659
 
20660
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
20660
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
20661
20661
  function isTerminal(status) {
20662
20662
  return status === "completed" || status === "failed" || status === "cancelled";
20663
20663
  }
@@ -20665,7 +20665,7 @@ function isTerminal(status) {
20665
20665
  // ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/string.js
20666
20666
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
20667
20667
 
20668
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
20668
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
20669
20669
  function getMethodLiteral(schema) {
20670
20670
  const shape = getObjectShape(schema);
20671
20671
  const methodSchema = shape?.method;
@@ -20686,7 +20686,7 @@ function parseWithCompat(schema, data) {
20686
20686
  return result.data;
20687
20687
  }
20688
20688
 
20689
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
20689
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
20690
20690
  var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4;
20691
20691
  var Protocol = class {
20692
20692
  constructor(_options) {
@@ -22458,7 +22458,12 @@ var DEFAULT_APPEARANCE = {
22458
22458
  sessionIdle: "Assistant session idle",
22459
22459
  sessionLoading: "Assistant session loading",
22460
22460
  sessionReady: "Assistant session ready",
22461
- sessionError: "Assistant session unavailable"
22461
+ sessionError: "Assistant session unavailable",
22462
+ signInHeading: "Sign in to continue",
22463
+ signInBody: "",
22464
+ signInAction: "Sign in",
22465
+ // Empty means no sign-up button: authoring the label is the opt-in (ADR 0201, 2026-08-22).
22466
+ signUpAction: ""
22462
22467
  },
22463
22468
  presentation: {
22464
22469
  panel: {
@@ -27098,6 +27103,9 @@ var AssistantChatStateStore = class {
27098
27103
  })
27099
27104
  );
27100
27105
  return;
27106
+ case "auth_requested":
27107
+ this.#writeStandaloneData(() => this.#writeData("sign-in", event.data.id, event.data));
27108
+ return;
27101
27109
  case "tool_completed":
27102
27110
  this.#writeData("tool-result", event.data.id, event.data);
27103
27111
  return;
@@ -27362,7 +27370,8 @@ function parseSession(value) {
27362
27370
  const interactions = value.endpoints.interactions;
27363
27371
  const apps = value.endpoints.apps;
27364
27372
  const sandbox = value.endpoints.sandbox;
27365
- 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") {
27373
+ const transcript = value.endpoints.transcript;
27374
+ 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") {
27366
27375
  throw clientError("session_failed", "Assistant session response is invalid", true);
27367
27376
  }
27368
27377
  return {
@@ -27373,7 +27382,8 @@ function parseSession(value) {
27373
27382
  toolConfirmations: value.endpoints.toolConfirmations,
27374
27383
  ...typeof interactions === "string" ? { interactions } : {},
27375
27384
  ...typeof apps === "string" ? { apps } : {},
27376
- ...typeof sandbox === "string" ? { sandbox } : {}
27385
+ ...typeof sandbox === "string" ? { sandbox } : {},
27386
+ ...typeof transcript === "string" ? { transcript } : {}
27377
27387
  },
27378
27388
  ...isRecord2(value.configuration) ? { configuration: value.configuration } : {},
27379
27389
  ...isRecord2(value.resume) && typeof value.resume.tool === "string" ? { resume: { tool: value.resume.tool } } : {}
@@ -27528,6 +27538,43 @@ function sessionSourceKey(options) {
27528
27538
  return `${options.embedId ?? ""}|${options.serviceUrl ?? ""}|${options.sessionEndpoint ?? ""}`;
27529
27539
  }
27530
27540
 
27541
+ // src/transcript-replay.ts
27542
+ function parseTranscriptEntries(value) {
27543
+ if (typeof value !== "object" || value === null) return [];
27544
+ const entries2 = value.entries;
27545
+ if (!Array.isArray(entries2)) return [];
27546
+ const parsed = [];
27547
+ for (const entry of entries2) {
27548
+ const { role, text: text3 } = entry ?? {};
27549
+ if (role !== "user" && role !== "assistant" || typeof text3 !== "string") return [];
27550
+ parsed.push({ role, text: text3 });
27551
+ }
27552
+ return parsed;
27553
+ }
27554
+ function transcriptReplayEvents(entries2) {
27555
+ const events = [];
27556
+ let open = false;
27557
+ let awaitingAssistant = false;
27558
+ for (const entry of entries2) {
27559
+ if (entry.role === "user") {
27560
+ if (open) events.push({ event: "message_completed", data: {} });
27561
+ events.push({ event: "message_started", data: { message: entry.text } });
27562
+ open = true;
27563
+ awaitingAssistant = true;
27564
+ continue;
27565
+ }
27566
+ if (!open || !awaitingAssistant) {
27567
+ if (open) events.push({ event: "message_completed", data: {} });
27568
+ events.push({ event: "resume_started", data: { tool: "" } });
27569
+ open = true;
27570
+ }
27571
+ events.push({ event: "content", data: { delta: entry.text } });
27572
+ awaitingAssistant = false;
27573
+ }
27574
+ if (open) events.push({ event: "message_completed", data: {} });
27575
+ return events;
27576
+ }
27577
+
27531
27578
  // src/transport.ts
27532
27579
  var AssistantTransportError = class extends Error {
27533
27580
  code = "invalid_response";
@@ -27698,6 +27745,12 @@ var DefaultAssistantClient = class {
27698
27745
  await this.#singleFlight(async (signal) => {
27699
27746
  if (this.#session) return;
27700
27747
  const session = await this.#createSession(signal);
27748
+ if (this.#source.kind !== "public" && session.endpoints.transcript) {
27749
+ try {
27750
+ await this.#replayTranscript(session, signal);
27751
+ } catch {
27752
+ }
27753
+ }
27701
27754
  if (session.resume) {
27702
27755
  try {
27703
27756
  await this.#runChatOperation(signal, () => this.#resumeTurn(session, signal));
@@ -27706,6 +27759,26 @@ var DefaultAssistantClient = class {
27706
27759
  }
27707
27760
  });
27708
27761
  }
27762
+ /** Fetch and re-emit the bounded visible transcript through the standard event path. */
27763
+ async #replayTranscript(session, signal) {
27764
+ const endpoint = session.endpoints.transcript;
27765
+ if (!endpoint) return;
27766
+ const response = await this.#request(
27767
+ endpoint,
27768
+ {
27769
+ method: "POST",
27770
+ headers: authorizedHeaders(session.token, "application/json"),
27771
+ body: "{}",
27772
+ signal
27773
+ },
27774
+ "turn_failed"
27775
+ );
27776
+ if (!response.ok) return;
27777
+ for (const event of transcriptReplayEvents(parseTranscriptEntries(await response.json()))) {
27778
+ this.#emit(event);
27779
+ if (event.event === "message_completed") await this.#chat.flush();
27780
+ }
27781
+ }
27709
27782
  /** POST the one-shot resume trigger; a 409 means nothing was pending, which renders as silence. */
27710
27783
  async #resumeTurn(session, signal) {
27711
27784
  const response = await this.#request(
@@ -31272,22 +31345,46 @@ function renderMarkdown(text3) {
31272
31345
  // src/sign-in-card.ts
31273
31346
  function createSignInCard(options) {
31274
31347
  const card = document.createElement("div");
31275
- card.className = "noodle-assistant-card noodle-assistant-sign-in";
31348
+ card.className = "tool-proposal sign-in";
31276
31349
  card.dataset.tool = options.tool;
31277
31350
  card.setAttribute("role", "status");
31278
- const heading = document.createElement("p");
31279
- heading.className = "noodle-assistant-card-heading";
31351
+ const badge = document.createElement("span");
31352
+ badge.className = "sign-in-badge";
31353
+ badge.setAttribute("aria-hidden", "true");
31354
+ card.append(badge);
31355
+ const heading = document.createElement("h3");
31280
31356
  heading.textContent = options.labels.heading;
31281
31357
  card.append(heading);
31282
- const action = document.createElement("button");
31283
- action.type = "button";
31284
- action.className = "noodle-assistant-card-action";
31285
- action.textContent = options.labels.action;
31286
- action.addEventListener("click", () => {
31287
- action.disabled = true;
31288
- options.onSignIn();
31289
- });
31290
- card.append(action);
31358
+ if (options.labels.body) {
31359
+ const body = document.createElement("p");
31360
+ body.className = "proposal-description";
31361
+ body.textContent = options.labels.body;
31362
+ card.append(body);
31363
+ }
31364
+ const actions = document.createElement("div");
31365
+ actions.className = "proposal-actions";
31366
+ const buttons = [];
31367
+ const act = (intent) => {
31368
+ for (const button2 of buttons) button2.disabled = true;
31369
+ options.onAction(intent);
31370
+ };
31371
+ const signIn = document.createElement("button");
31372
+ signIn.type = "button";
31373
+ signIn.className = "sign-in-action";
31374
+ signIn.textContent = options.labels.action;
31375
+ signIn.addEventListener("click", () => act("sign-in"));
31376
+ buttons.push(signIn);
31377
+ actions.append(signIn);
31378
+ if (options.labels.signUpAction) {
31379
+ const signUp = document.createElement("button");
31380
+ signUp.type = "button";
31381
+ signUp.className = "sign-up-action";
31382
+ signUp.textContent = options.labels.signUpAction;
31383
+ signUp.addEventListener("click", () => act("sign-up"));
31384
+ buttons.push(signUp);
31385
+ actions.append(signUp);
31386
+ }
31387
+ card.append(actions);
31291
31388
  return card;
31292
31389
  }
31293
31390
 
@@ -31493,17 +31590,20 @@ var AssistantElementEventController = class {
31493
31590
  const messages = this.#host.messages();
31494
31591
  if (!messages) return;
31495
31592
  this.#proposalCards.get(id)?.remove();
31593
+ const labels = this.#host.labels();
31496
31594
  const card = createSignInCard({
31497
31595
  tool,
31498
31596
  signInTicket,
31499
31597
  expiresAt,
31500
31598
  labels: {
31501
- heading: "Sign in to continue",
31502
- action: "Sign in"
31599
+ heading: labels.signInHeading,
31600
+ body: labels.signInBody,
31601
+ action: labels.signInAction,
31602
+ signUpAction: labels.signUpAction
31503
31603
  },
31504
- onSignIn: () => this.#host.element.dispatchEvent(
31604
+ onAction: (intent) => this.#host.element.dispatchEvent(
31505
31605
  new CustomEvent("assistant-sign-in-requested", {
31506
- detail: { id, tool, signInTicket, expiresAt },
31606
+ detail: { id, tool, signInTicket, expiresAt, intent },
31507
31607
  bubbles: true,
31508
31608
  composed: true
31509
31609
  })
@@ -31899,8 +31999,10 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
31899
31999
  .proposal-details .proposal-arguments { margin-top: 4px; }
31900
32000
  .proposal-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: end; }
31901
32001
  .tool-proposal button { min-height: 44px; padding: 9px 16px; border: 1px solid var(--ns-assistant-secondary-button-border, transparent); border-radius: var(--ns-assistant-button-radius, var(--ns-assistant-default-button-radius)); color: var(--ns-assistant-secondary-button-text, var(--ns-assistant-text, var(--ns-assistant-default-text))); background: var(--ns-assistant-secondary-button, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated))); cursor: pointer; font-weight: 600; }
31902
- .tool-proposal .proposal-accept { color: var(--ns-assistant-primary-button-text, var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text))); background: var(--ns-assistant-primary-button, var(--ns-assistant-accent, var(--ns-assistant-default-accent))); border-color: var(--ns-assistant-primary-button-border, transparent); }
32002
+ .tool-proposal .proposal-accept, .tool-proposal .sign-in-action { color: var(--ns-assistant-primary-button-text, var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text))); background: var(--ns-assistant-primary-button, var(--ns-assistant-accent, var(--ns-assistant-default-accent))); border-color: var(--ns-assistant-primary-button-border, transparent); }
31903
32003
  .tool-proposal button:disabled { opacity: .55; cursor: not-allowed; }
32004
+ .sign-in .sign-in-badge { display: grid; place-items: center; width: 38px; height: 38px; border-radius: 999px; color: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); background: color-mix(in srgb, var(--ns-assistant-accent, var(--ns-assistant-default-accent)) 12%, transparent); }
32005
+ .sign-in .sign-in-badge::before { content: ''; width: 19px; height: 19px; background: currentColor; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 12a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9Zm0 2.2c-4.3 0-7.8 2.6-7.8 5.8v1h15.6v-1c0-3.2-3.5-5.8-7.8-5.8Z'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 12a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9Zm0 2.2c-4.3 0-7.8 2.6-7.8 5.8v1h15.6v-1c0-3.2-3.5-5.8-7.8-5.8Z'/%3E%3C/svg%3E") center / contain no-repeat; }
31904
32006
  .tool-proposal button { min-height: 45px; }
31905
32007
  .tool-result { display: grid; gap: 10px; margin: 8px 0 16px; padding: 16px; border: 1px solid var(--ns-assistant-divider, var(--ns-assistant-default-divider)); border-radius: var(--ns-assistant-card-radius, 14px); background: var(--ns-assistant-assistant-message, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated))); }
31906
32008
  .tool-result > strong { color: var(--ns-assistant-success, var(--ns-assistant-default-success)); }