@noodleseed/assistant 1.22.0 → 1.23.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 (44) hide show
  1. package/README.md +43 -8
  2. package/dist/app-view-element-1i_w6FDf.d.cts +40 -0
  3. package/dist/app-view-element-7ZQZLYbL.d.ts +40 -0
  4. package/dist/app-view.cjs +18666 -0
  5. package/dist/app-view.cjs.map +1 -0
  6. package/dist/app-view.d.cts +9 -0
  7. package/dist/app-view.d.ts +9 -0
  8. package/dist/app-view.js +15 -0
  9. package/dist/app-view.js.map +1 -0
  10. package/dist/chunk-5NBHHNI3.js +180 -0
  11. package/dist/chunk-5NBHHNI3.js.map +1 -0
  12. package/dist/{chunk-ZPZHPXIQ.js → chunk-IBDP6PXQ.js} +9 -3882
  13. package/dist/chunk-IBDP6PXQ.js.map +1 -0
  14. package/dist/chunk-P223CYPO.js +3880 -0
  15. package/dist/chunk-P223CYPO.js.map +1 -0
  16. package/dist/{chunk-6TT3R555.js → chunk-X7UQDIGS.js} +784 -4040
  17. package/dist/chunk-X7UQDIGS.js.map +1 -0
  18. package/dist/chunk-XKTUXFGX.js +3323 -0
  19. package/dist/chunk-XKTUXFGX.js.map +1 -0
  20. package/dist/{client-BkJlpN5N.d.ts → client-Bp_VKpMg.d.ts} +1 -1
  21. package/dist/{client-BZ7xPwfW.d.cts → client-uo57Swlm.d.cts} +1 -1
  22. package/dist/client.d.cts +1 -1
  23. package/dist/client.d.ts +1 -1
  24. package/dist/client.js +2 -1
  25. package/dist/embed.global.js +87 -73
  26. package/dist/index.cjs +71 -15
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +2 -2
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.js +4 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/react/client.d.cts +1 -1
  33. package/dist/react/client.d.ts +1 -1
  34. package/dist/react/client.js +2 -1
  35. package/dist/react/client.js.map +1 -1
  36. package/dist/react.cjs +259 -47
  37. package/dist/react.cjs.map +1 -1
  38. package/dist/react.d.cts +7 -8
  39. package/dist/react.d.ts +7 -8
  40. package/dist/react.js +31 -41
  41. package/dist/react.js.map +1 -1
  42. package/package.json +16 -2
  43. package/dist/chunk-6TT3R555.js.map +0 -1
  44. package/dist/chunk-ZPZHPXIQ.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -22112,11 +22112,11 @@ function isAllowedAppLink(value, allowedDomains, baseUrl) {
22112
22112
  return void 0;
22113
22113
  }
22114
22114
  }
22115
- function createAssistantAppHostContext(theme) {
22115
+ function createAssistantAppHostContext(theme, allowFullscreen = false, displayMode = "inline") {
22116
22116
  return {
22117
22117
  theme,
22118
- displayMode: "inline",
22119
- availableDisplayModes: ["inline", "fullscreen"],
22118
+ displayMode: allowFullscreen && displayMode === "fullscreen" ? "fullscreen" : "inline",
22119
+ availableDisplayModes: allowFullscreen ? ["inline", "fullscreen"] : ["inline"],
22120
22120
  platform: "web"
22121
22121
  };
22122
22122
  }
@@ -22142,6 +22142,13 @@ function mountAssistantApp(detail, actions, options = {}) {
22142
22142
  title.textContent = detail.title;
22143
22143
  card.append(title);
22144
22144
  }
22145
+ const exitFullscreen = document.createElement("button");
22146
+ exitFullscreen.className = "noodle-app-fullscreen-exit";
22147
+ exitFullscreen.type = "button";
22148
+ exitFullscreen.setAttribute("aria-label", "Exit fullscreen");
22149
+ exitFullscreen.title = "Exit fullscreen";
22150
+ exitFullscreen.hidden = true;
22151
+ card.append(exitFullscreen);
22145
22152
  const frame = document.createElement("iframe");
22146
22153
  frame.className = "noodle-app-frame";
22147
22154
  frame.title = detail.title ?? detail.tool;
@@ -22155,8 +22162,31 @@ function mountAssistantApp(detail, actions, options = {}) {
22155
22162
  let mountedTransport;
22156
22163
  let destroyed = false;
22157
22164
  let initialized = false;
22158
- let hostContext = createAssistantAppHostContext(actions.theme);
22165
+ let currentTheme = actions.theme;
22166
+ let displayMode = "inline";
22167
+ let hostContext = createAssistantAppHostContext(
22168
+ currentTheme,
22169
+ options.allowFullscreen === true,
22170
+ displayMode
22171
+ );
22159
22172
  let destroyPromise;
22173
+ const applyDisplayMode = (requestedMode) => {
22174
+ displayMode = requestedMode === "fullscreen" && options.allowFullscreen === true ? "fullscreen" : "inline";
22175
+ card.toggleAttribute("data-fullscreen", displayMode === "fullscreen");
22176
+ exitFullscreen.hidden = displayMode !== "fullscreen";
22177
+ hostContext = createAssistantAppHostContext(
22178
+ currentTheme,
22179
+ options.allowFullscreen === true,
22180
+ displayMode
22181
+ );
22182
+ if (initialized) mountedBridge?.setHostContext(hostContext);
22183
+ return displayMode;
22184
+ };
22185
+ exitFullscreen.addEventListener("click", () => {
22186
+ if (destroyed) return;
22187
+ applyDisplayMode("inline");
22188
+ frame.focus();
22189
+ });
22160
22190
  const renderTimer = setTimeout(() => {
22161
22191
  if (initialized || !frame.isConnected) return;
22162
22192
  const note = document.createElement("div");
@@ -22214,6 +22244,11 @@ function mountAssistantApp(detail, actions, options = {}) {
22214
22244
  actions.updateModelContext(update);
22215
22245
  return {};
22216
22246
  };
22247
+ bridge.onrequestteardown = () => {
22248
+ if (destroyed) return;
22249
+ options.onTeardownRequest?.();
22250
+ void destroy();
22251
+ };
22217
22252
  bridge.onopenlink = async ({ url: url2 }) => {
22218
22253
  if (destroyed) return { isError: true };
22219
22254
  const current = options.getDetail?.() ?? detail;
@@ -22227,10 +22262,8 @@ function mountAssistantApp(detail, actions, options = {}) {
22227
22262
  return {};
22228
22263
  };
22229
22264
  bridge.onrequestdisplaymode = async ({ mode }) => {
22230
- const accepted = mode === "fullscreen" ? "fullscreen" : "inline";
22231
- if (destroyed) return { mode: accepted };
22232
- card.toggleAttribute("data-fullscreen", accepted === "fullscreen");
22233
- return { mode: accepted };
22265
+ if (destroyed) return { mode: displayMode };
22266
+ return { mode: applyDisplayMode(mode) };
22234
22267
  };
22235
22268
  bridge.oncalltool = async (params) => {
22236
22269
  if (destroyed) {
@@ -22275,7 +22308,12 @@ function mountAssistantApp(detail, actions, options = {}) {
22275
22308
  );
22276
22309
  const updateTheme = (theme) => {
22277
22310
  if (destroyed) return;
22278
- hostContext = createAssistantAppHostContext(theme);
22311
+ currentTheme = theme;
22312
+ hostContext = createAssistantAppHostContext(
22313
+ currentTheme,
22314
+ options.allowFullscreen === true,
22315
+ displayMode
22316
+ );
22279
22317
  if (initialized) mountedBridge?.setHostContext(hostContext);
22280
22318
  };
22281
22319
  const destroy = () => {
@@ -31724,6 +31762,29 @@ var AssistantElementScrollController = class {
31724
31762
  }
31725
31763
  };
31726
31764
 
31765
+ // src/app-view-styles.ts
31766
+ var ASSISTANT_APP_VIEW_CSS = `
31767
+ .noodle-app-card { position: relative; display: grid; gap: 8px; width: 100%; margin: 4px 0 16px; overflow: hidden; color: var(--ns-assistant-app-text, inherit); border: 1px solid var(--ns-assistant-app-border, var(--ns-assistant-divider, var(--ns-assistant-default-divider, var(--ns-app-view-border, #d1d5db)))); border-radius: var(--ns-assistant-card-radius, var(--ns-assistant-default-card-radius, 12px)); background: var(--ns-assistant-app, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated, var(--ns-app-view-surface, #fff)))); }
31768
+ .noodle-app-title { padding: 10px 12px 0; font-size: .86em; font-weight: 650; }
31769
+ .noodle-app-fullscreen-exit { position: absolute; top: max(12px, env(safe-area-inset-top)); right: max(12px, env(safe-area-inset-right)); z-index: 1; display: grid; place-items: center; width: 44px; height: 44px; padding: 0; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text, var(--ns-app-view-muted, #6b7280))); border: 1px solid var(--ns-assistant-secondary-button-border, var(--ns-assistant-divider, var(--ns-assistant-default-divider, var(--ns-app-view-border, #d1d5db)))); border-radius: 999px; background: var(--ns-assistant-secondary-button, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated, var(--ns-app-view-surface, #fff)))); box-shadow: 0 6px 20px rgba(0,0,0,.14); cursor: pointer; font: inherit; transition: color .15s ease, background .15s ease, transform .15s ease; }
31770
+ .noodle-app-fullscreen-exit[hidden] { display: none; }
31771
+ .noodle-app-fullscreen-exit::before { content: ''; width: 18px; height: 18px; 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='m6 6 12 12M18 6 6 18' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%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='m6 6 12 12M18 6 6 18' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat; }
31772
+ .noodle-app-fullscreen-exit:hover { color: var(--ns-assistant-text, var(--ns-assistant-default-text, inherit)); background: var(--ns-assistant-hover, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated, var(--ns-app-view-surface, #fff)))); }
31773
+ .noodle-app-fullscreen-exit:focus-visible { outline: 3px solid var(--ns-assistant-focus, var(--ns-assistant-default-focus, #2563eb)); outline-offset: 2px; }
31774
+ .noodle-app-fullscreen-exit:active { transform: scale(.96); }
31775
+ .noodle-app-frame { display: block; width: 100%; min-height: 120px; border: 0; background: transparent; }
31776
+ .noodle-app-fallback { padding: 14px 16px; font-size: 13px; color: var(--ns-assistant-muted, var(--ns-assistant-default-muted, var(--ns-app-view-muted, #6b7280))); }
31777
+ .noodle-app-card[data-fullscreen] { position: fixed; inset: 0; z-index: 2; margin: 0; border-radius: 0; background: var(--ns-assistant-panel, var(--ns-assistant-default-panel, var(--ns-app-view-surface, #fff))); }
31778
+ .noodle-app-card[data-fullscreen] .noodle-app-frame { height: 100% !important; }
31779
+ `;
31780
+ var ASSISTANT_APP_VIEW_STYLES = `<style>
31781
+ *, *::before, *::after { box-sizing: border-box; }
31782
+ :host { --ns-app-view-surface: #fff; --ns-app-view-border: #d1d5db; --ns-app-view-muted: #6b7280; display: block; min-width: 0; color: #111827; color-scheme: light; font: inherit; }
31783
+ :host([data-theme="dark"]) { --ns-app-view-surface: #17191f; --ns-app-view-border: #343741; --ns-app-view-muted: #a7adb8; color: #f3f4f6; color-scheme: dark; }
31784
+ :host([hidden]) { display: none; }
31785
+ ${ASSISTANT_APP_VIEW_CSS}
31786
+ </style>`;
31787
+
31727
31788
  // src/element-styles.ts
31728
31789
  var ASSISTANT_ELEMENT_STYLES = `<style>
31729
31790
  *, *::before, *::after { box-sizing: border-box; }
@@ -31826,12 +31887,7 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
31826
31887
  .input-request input[type="checkbox"] { width: auto; min-height: auto; justify-self: start; accent-color: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); }
31827
31888
  .input-request input:focus-visible, .input-request select:focus-visible { border-color: var(--ns-assistant-focus, var(--ns-assistant-default-focus)); box-shadow: 0 0 0 2px var(--ns-assistant-focus, var(--ns-assistant-default-focus)); }
31828
31889
  .input-request .proposal-actions { margin-top: 2px; }
31829
- .noodle-app-card { position: relative; display: grid; gap: 8px; width: 100%; margin: 4px 0 16px; overflow: hidden; color: var(--ns-assistant-app-text, inherit); border: 1px solid var(--ns-assistant-app-border, var(--ns-assistant-divider, var(--ns-assistant-default-divider))); border-radius: var(--ns-assistant-card-radius, var(--ns-assistant-default-card-radius)); background: var(--ns-assistant-app, var(--ns-assistant-elevated, var(--ns-assistant-default-elevated))); }
31830
- .noodle-app-title { padding: 10px 12px 0; font-size: .86em; font-weight: 650; }
31831
- .noodle-app-frame { display: block; width: 100%; min-height: 120px; border: 0; background: transparent; }
31832
- .noodle-app-fallback { padding: 14px 16px; font-size: 13px; color: var(--ns-assistant-muted, var(--ns-assistant-default-muted, #6b7280)); }
31833
- .noodle-app-card[data-fullscreen] { position: fixed; inset: 0; z-index: 2; margin: 0; border-radius: 0; background: var(--ns-assistant-panel, var(--ns-assistant-default-panel)); }
31834
- .noodle-app-card[data-fullscreen] .noodle-app-frame { height: 100% !important; }
31890
+ ${ASSISTANT_APP_VIEW_CSS}
31835
31891
  form { display: flex; flex: 0 0 auto; gap: 8px; align-items: center; min-height: 56px; margin: 8px 16px 16px; padding: 6px 6px 6px 16px; color: var(--ns-assistant-composer-text, inherit); border: 1px solid var(--ns-assistant-composer-border, color-mix(in srgb, var(--ns-assistant-divider, var(--ns-assistant-default-divider)) 86%, transparent)); border-radius: var(--ns-assistant-input-radius, var(--ns-assistant-default-input-radius)); background: var(--ns-assistant-composer, color-mix(in srgb, var(--ns-assistant-input, var(--ns-assistant-default-input)) 92%, transparent)); box-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 24px rgba(0,0,0,.035); transition: border-color .15s ease, box-shadow .15s ease; }
31836
31892
  form:focus-within { box-shadow: inset 0 0 0 1px var(--ns-assistant-focus, var(--ns-assistant-default-focus)), 0 0 0 2px var(--ns-assistant-focus, var(--ns-assistant-default-focus)); }
31837
31893
  textarea { flex: 1; min-height: 24px; max-height: 120px; resize: none; padding: 0; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: transparent; border: 0; border-radius: 0; outline: 0; box-shadow: none; appearance: none; -webkit-appearance: none; font: inherit; font-size: 16px; line-height: 24px; }