@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
package/dist/index.cjs CHANGED
@@ -15197,7 +15197,7 @@ __export(src_exports, {
15197
15197
  });
15198
15198
  module.exports = __toCommonJS(src_exports);
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) {
@@ -22455,7 +22455,12 @@ var DEFAULT_APPEARANCE = {
22455
22455
  sessionIdle: "Assistant session idle",
22456
22456
  sessionLoading: "Assistant session loading",
22457
22457
  sessionReady: "Assistant session ready",
22458
- sessionError: "Assistant session unavailable"
22458
+ sessionError: "Assistant session unavailable",
22459
+ signInHeading: "Sign in to continue",
22460
+ signInBody: "",
22461
+ signInAction: "Sign in",
22462
+ // Empty means no sign-up button: authoring the label is the opt-in (ADR 0201, 2026-08-22).
22463
+ signUpAction: ""
22459
22464
  },
22460
22465
  presentation: {
22461
22466
  panel: {
@@ -27095,6 +27100,9 @@ var AssistantChatStateStore = class {
27095
27100
  })
27096
27101
  );
27097
27102
  return;
27103
+ case "auth_requested":
27104
+ this.#writeStandaloneData(() => this.#writeData("sign-in", event.data.id, event.data));
27105
+ return;
27098
27106
  case "tool_completed":
27099
27107
  this.#writeData("tool-result", event.data.id, event.data);
27100
27108
  return;
@@ -27359,7 +27367,8 @@ function parseSession(value) {
27359
27367
  const interactions = value.endpoints.interactions;
27360
27368
  const apps = value.endpoints.apps;
27361
27369
  const sandbox = value.endpoints.sandbox;
27362
- 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") {
27370
+ const transcript = value.endpoints.transcript;
27371
+ 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") {
27363
27372
  throw clientError("session_failed", "Assistant session response is invalid", true);
27364
27373
  }
27365
27374
  return {
@@ -27370,7 +27379,8 @@ function parseSession(value) {
27370
27379
  toolConfirmations: value.endpoints.toolConfirmations,
27371
27380
  ...typeof interactions === "string" ? { interactions } : {},
27372
27381
  ...typeof apps === "string" ? { apps } : {},
27373
- ...typeof sandbox === "string" ? { sandbox } : {}
27382
+ ...typeof sandbox === "string" ? { sandbox } : {},
27383
+ ...typeof transcript === "string" ? { transcript } : {}
27374
27384
  },
27375
27385
  ...isRecord2(value.configuration) ? { configuration: value.configuration } : {},
27376
27386
  ...isRecord2(value.resume) && typeof value.resume.tool === "string" ? { resume: { tool: value.resume.tool } } : {}
@@ -27525,6 +27535,43 @@ function sessionSourceKey(options) {
27525
27535
  return `${options.embedId ?? ""}|${options.serviceUrl ?? ""}|${options.sessionEndpoint ?? ""}`;
27526
27536
  }
27527
27537
 
27538
+ // src/transcript-replay.ts
27539
+ function parseTranscriptEntries(value) {
27540
+ if (typeof value !== "object" || value === null) return [];
27541
+ const entries2 = value.entries;
27542
+ if (!Array.isArray(entries2)) return [];
27543
+ const parsed = [];
27544
+ for (const entry of entries2) {
27545
+ const { role, text: text3 } = entry ?? {};
27546
+ if (role !== "user" && role !== "assistant" || typeof text3 !== "string") return [];
27547
+ parsed.push({ role, text: text3 });
27548
+ }
27549
+ return parsed;
27550
+ }
27551
+ function transcriptReplayEvents(entries2) {
27552
+ const events = [];
27553
+ let open = false;
27554
+ let awaitingAssistant = false;
27555
+ for (const entry of entries2) {
27556
+ if (entry.role === "user") {
27557
+ if (open) events.push({ event: "message_completed", data: {} });
27558
+ events.push({ event: "message_started", data: { message: entry.text } });
27559
+ open = true;
27560
+ awaitingAssistant = true;
27561
+ continue;
27562
+ }
27563
+ if (!open || !awaitingAssistant) {
27564
+ if (open) events.push({ event: "message_completed", data: {} });
27565
+ events.push({ event: "resume_started", data: { tool: "" } });
27566
+ open = true;
27567
+ }
27568
+ events.push({ event: "content", data: { delta: entry.text } });
27569
+ awaitingAssistant = false;
27570
+ }
27571
+ if (open) events.push({ event: "message_completed", data: {} });
27572
+ return events;
27573
+ }
27574
+
27528
27575
  // src/transport.ts
27529
27576
  var AssistantTransportError = class extends Error {
27530
27577
  code = "invalid_response";
@@ -27695,6 +27742,12 @@ var DefaultAssistantClient = class {
27695
27742
  await this.#singleFlight(async (signal) => {
27696
27743
  if (this.#session) return;
27697
27744
  const session = await this.#createSession(signal);
27745
+ if (this.#source.kind !== "public" && session.endpoints.transcript) {
27746
+ try {
27747
+ await this.#replayTranscript(session, signal);
27748
+ } catch {
27749
+ }
27750
+ }
27698
27751
  if (session.resume) {
27699
27752
  try {
27700
27753
  await this.#runChatOperation(signal, () => this.#resumeTurn(session, signal));
@@ -27703,6 +27756,26 @@ var DefaultAssistantClient = class {
27703
27756
  }
27704
27757
  });
27705
27758
  }
27759
+ /** Fetch and re-emit the bounded visible transcript through the standard event path. */
27760
+ async #replayTranscript(session, signal) {
27761
+ const endpoint = session.endpoints.transcript;
27762
+ if (!endpoint) return;
27763
+ const response = await this.#request(
27764
+ endpoint,
27765
+ {
27766
+ method: "POST",
27767
+ headers: authorizedHeaders(session.token, "application/json"),
27768
+ body: "{}",
27769
+ signal
27770
+ },
27771
+ "turn_failed"
27772
+ );
27773
+ if (!response.ok) return;
27774
+ for (const event of transcriptReplayEvents(parseTranscriptEntries(await response.json()))) {
27775
+ this.#emit(event);
27776
+ if (event.event === "message_completed") await this.#chat.flush();
27777
+ }
27778
+ }
27706
27779
  /** POST the one-shot resume trigger; a 409 means nothing was pending, which renders as silence. */
27707
27780
  async #resumeTurn(session, signal) {
27708
27781
  const response = await this.#request(
@@ -31269,22 +31342,46 @@ function renderMarkdown(text3) {
31269
31342
  // src/sign-in-card.ts
31270
31343
  function createSignInCard(options) {
31271
31344
  const card = document.createElement("div");
31272
- card.className = "noodle-assistant-card noodle-assistant-sign-in";
31345
+ card.className = "tool-proposal sign-in";
31273
31346
  card.dataset.tool = options.tool;
31274
31347
  card.setAttribute("role", "status");
31275
- const heading = document.createElement("p");
31276
- heading.className = "noodle-assistant-card-heading";
31348
+ const badge = document.createElement("span");
31349
+ badge.className = "sign-in-badge";
31350
+ badge.setAttribute("aria-hidden", "true");
31351
+ card.append(badge);
31352
+ const heading = document.createElement("h3");
31277
31353
  heading.textContent = options.labels.heading;
31278
31354
  card.append(heading);
31279
- const action = document.createElement("button");
31280
- action.type = "button";
31281
- action.className = "noodle-assistant-card-action";
31282
- action.textContent = options.labels.action;
31283
- action.addEventListener("click", () => {
31284
- action.disabled = true;
31285
- options.onSignIn();
31286
- });
31287
- card.append(action);
31355
+ if (options.labels.body) {
31356
+ const body = document.createElement("p");
31357
+ body.className = "proposal-description";
31358
+ body.textContent = options.labels.body;
31359
+ card.append(body);
31360
+ }
31361
+ const actions = document.createElement("div");
31362
+ actions.className = "proposal-actions";
31363
+ const buttons = [];
31364
+ const act = (intent) => {
31365
+ for (const button2 of buttons) button2.disabled = true;
31366
+ options.onAction(intent);
31367
+ };
31368
+ const signIn = document.createElement("button");
31369
+ signIn.type = "button";
31370
+ signIn.className = "sign-in-action";
31371
+ signIn.textContent = options.labels.action;
31372
+ signIn.addEventListener("click", () => act("sign-in"));
31373
+ buttons.push(signIn);
31374
+ actions.append(signIn);
31375
+ if (options.labels.signUpAction) {
31376
+ const signUp = document.createElement("button");
31377
+ signUp.type = "button";
31378
+ signUp.className = "sign-up-action";
31379
+ signUp.textContent = options.labels.signUpAction;
31380
+ signUp.addEventListener("click", () => act("sign-up"));
31381
+ buttons.push(signUp);
31382
+ actions.append(signUp);
31383
+ }
31384
+ card.append(actions);
31288
31385
  return card;
31289
31386
  }
31290
31387
 
@@ -31490,17 +31587,20 @@ var AssistantElementEventController = class {
31490
31587
  const messages = this.#host.messages();
31491
31588
  if (!messages) return;
31492
31589
  this.#proposalCards.get(id)?.remove();
31590
+ const labels = this.#host.labels();
31493
31591
  const card = createSignInCard({
31494
31592
  tool,
31495
31593
  signInTicket,
31496
31594
  expiresAt,
31497
31595
  labels: {
31498
- heading: "Sign in to continue",
31499
- action: "Sign in"
31596
+ heading: labels.signInHeading,
31597
+ body: labels.signInBody,
31598
+ action: labels.signInAction,
31599
+ signUpAction: labels.signUpAction
31500
31600
  },
31501
- onSignIn: () => this.#host.element.dispatchEvent(
31601
+ onAction: (intent) => this.#host.element.dispatchEvent(
31502
31602
  new CustomEvent("assistant-sign-in-requested", {
31503
- detail: { id, tool, signInTicket, expiresAt },
31603
+ detail: { id, tool, signInTicket, expiresAt, intent },
31504
31604
  bubbles: true,
31505
31605
  composed: true
31506
31606
  })
@@ -31896,8 +31996,10 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
31896
31996
  .proposal-details .proposal-arguments { margin-top: 4px; }
31897
31997
  .proposal-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: end; }
31898
31998
  .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; }
31899
- .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); }
31999
+ .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); }
31900
32000
  .tool-proposal button:disabled { opacity: .55; cursor: not-allowed; }
32001
+ .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); }
32002
+ .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; }
31901
32003
  .tool-proposal button { min-height: 45px; }
31902
32004
  .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))); }
31903
32005
  .tool-result > strong { color: var(--ns-assistant-success, var(--ns-assistant-default-success)); }