@noodleseed/assistant 1.22.0 → 1.24.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.
- package/README.md +43 -8
- package/dist/app-view-element-DDtXu08a.d.ts +40 -0
- package/dist/app-view-element-DSPtyEul.d.cts +40 -0
- package/dist/app-view.cjs +18666 -0
- package/dist/app-view.cjs.map +1 -0
- package/dist/app-view.d.cts +9 -0
- package/dist/app-view.d.ts +9 -0
- package/dist/app-view.js +15 -0
- package/dist/app-view.js.map +1 -0
- package/dist/{appearance-Cc-eqSbp.d.cts → appearance-0nS2LFjb.d.cts} +1 -0
- package/dist/{appearance-Cc-eqSbp.d.ts → appearance-0nS2LFjb.d.ts} +1 -0
- package/dist/chunk-5NBHHNI3.js +180 -0
- package/dist/chunk-5NBHHNI3.js.map +1 -0
- package/dist/{chunk-6TT3R555.js → chunk-6PVDV7SO.js} +823 -4062
- package/dist/chunk-6PVDV7SO.js.map +1 -0
- package/dist/{chunk-ZPZHPXIQ.js → chunk-IBDP6PXQ.js} +9 -3882
- package/dist/chunk-IBDP6PXQ.js.map +1 -0
- package/dist/chunk-P223CYPO.js +3880 -0
- package/dist/chunk-P223CYPO.js.map +1 -0
- package/dist/chunk-XKTUXFGX.js +3323 -0
- package/dist/chunk-XKTUXFGX.js.map +1 -0
- package/dist/{client-BZ7xPwfW.d.cts → client-By4gqB1k.d.cts} +2 -2
- package/dist/{client-BkJlpN5N.d.ts → client-Cf38TgwN.d.ts} +2 -2
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +2 -1
- package/dist/embed.global.js +87 -73
- package/dist/index.cjs +110 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/react/client.d.cts +2 -2
- package/dist/react/client.d.ts +2 -2
- package/dist/react/client.js +2 -1
- package/dist/react/client.js.map +1 -1
- package/dist/react.cjs +298 -69
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +8 -9
- package/dist/react.d.ts +8 -9
- package/dist/react.js +31 -41
- package/dist/react.js.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/package.json +16 -2
- package/dist/chunk-6TT3R555.js.map +0 -1
- 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
|
|
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
|
-
|
|
22231
|
-
|
|
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
|
-
|
|
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 = () => {
|
|
@@ -22410,6 +22448,7 @@ var DEFAULT_APPEARANCE = {
|
|
|
22410
22448
|
copy: "Copy",
|
|
22411
22449
|
newMessages: "New messages",
|
|
22412
22450
|
reconnect: "Reconnect",
|
|
22451
|
+
newConversation: "New conversation",
|
|
22413
22452
|
retry: "Try again",
|
|
22414
22453
|
unavailable: "The assistant is temporarily unavailable.",
|
|
22415
22454
|
sessionExpired: "Your assistant session expired. Reopen it to continue.",
|
|
@@ -28119,6 +28158,27 @@ function appInteractionStopped(action) {
|
|
|
28119
28158
|
};
|
|
28120
28159
|
}
|
|
28121
28160
|
|
|
28161
|
+
// src/conversation-recovery.ts
|
|
28162
|
+
function appendConversationRecovery(input) {
|
|
28163
|
+
if (!input.messages) return;
|
|
28164
|
+
input.messages.querySelector(".conversation-error")?.remove();
|
|
28165
|
+
const error51 = document.createElement("section");
|
|
28166
|
+
error51.className = "conversation-error";
|
|
28167
|
+
error51.setAttribute("role", input.action ? "alert" : "status");
|
|
28168
|
+
const text3 = document.createElement("p");
|
|
28169
|
+
text3.textContent = input.message;
|
|
28170
|
+
error51.append(text3);
|
|
28171
|
+
if (input.action) {
|
|
28172
|
+
const button2 = document.createElement("button");
|
|
28173
|
+
button2.type = "button";
|
|
28174
|
+
button2.textContent = input.action.label;
|
|
28175
|
+
button2.addEventListener("click", input.action.run);
|
|
28176
|
+
error51.append(button2);
|
|
28177
|
+
}
|
|
28178
|
+
input.messages.append(error51);
|
|
28179
|
+
input.revealLatest();
|
|
28180
|
+
}
|
|
28181
|
+
|
|
28122
28182
|
// src/input-request-card.ts
|
|
28123
28183
|
function createInputRequestCard(options) {
|
|
28124
28184
|
const card = document.createElement("section");
|
|
@@ -31724,6 +31784,29 @@ var AssistantElementScrollController = class {
|
|
|
31724
31784
|
}
|
|
31725
31785
|
};
|
|
31726
31786
|
|
|
31787
|
+
// src/app-view-styles.ts
|
|
31788
|
+
var ASSISTANT_APP_VIEW_CSS = `
|
|
31789
|
+
.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)))); }
|
|
31790
|
+
.noodle-app-title { padding: 10px 12px 0; font-size: .86em; font-weight: 650; }
|
|
31791
|
+
.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; }
|
|
31792
|
+
.noodle-app-fullscreen-exit[hidden] { display: none; }
|
|
31793
|
+
.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; }
|
|
31794
|
+
.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)))); }
|
|
31795
|
+
.noodle-app-fullscreen-exit:focus-visible { outline: 3px solid var(--ns-assistant-focus, var(--ns-assistant-default-focus, #2563eb)); outline-offset: 2px; }
|
|
31796
|
+
.noodle-app-fullscreen-exit:active { transform: scale(.96); }
|
|
31797
|
+
.noodle-app-frame { display: block; width: 100%; min-height: 120px; border: 0; background: transparent; }
|
|
31798
|
+
.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))); }
|
|
31799
|
+
.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))); }
|
|
31800
|
+
.noodle-app-card[data-fullscreen] .noodle-app-frame { height: 100% !important; }
|
|
31801
|
+
`;
|
|
31802
|
+
var ASSISTANT_APP_VIEW_STYLES = `<style>
|
|
31803
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
31804
|
+
: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; }
|
|
31805
|
+
:host([data-theme="dark"]) { --ns-app-view-surface: #17191f; --ns-app-view-border: #343741; --ns-app-view-muted: #a7adb8; color: #f3f4f6; color-scheme: dark; }
|
|
31806
|
+
:host([hidden]) { display: none; }
|
|
31807
|
+
${ASSISTANT_APP_VIEW_CSS}
|
|
31808
|
+
</style>`;
|
|
31809
|
+
|
|
31727
31810
|
// src/element-styles.ts
|
|
31728
31811
|
var ASSISTANT_ELEMENT_STYLES = `<style>
|
|
31729
31812
|
*, *::before, *::after { box-sizing: border-box; }
|
|
@@ -31826,12 +31909,7 @@ var ASSISTANT_ELEMENT_STYLES = `<style>
|
|
|
31826
31909
|
.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
31910
|
.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
31911
|
.input-request .proposal-actions { margin-top: 2px; }
|
|
31829
|
-
|
|
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; }
|
|
31912
|
+
${ASSISTANT_APP_VIEW_CSS}
|
|
31835
31913
|
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
31914
|
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
31915
|
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; }
|
|
@@ -32787,33 +32865,28 @@ var NoodleAssistantElement = class extends HTMLElementBase {
|
|
|
32787
32865
|
this.#setSessionState("error");
|
|
32788
32866
|
}
|
|
32789
32867
|
const detail = error51 instanceof AssistantClientError ? error51.detail : { code: fallbackCode, retryable: false };
|
|
32790
|
-
|
|
32791
|
-
|
|
32868
|
+
const startNewConversation = detail.serviceCode === "session_turn_budget_exhausted";
|
|
32869
|
+
const reconnect = detail.retryable !== false || detail.serviceCode === void 0;
|
|
32870
|
+
const recoveryAction = startNewConversation ? {
|
|
32871
|
+
label: this.#appearance.labels.newConversation,
|
|
32872
|
+
run: () => this.#startNewConversation()
|
|
32873
|
+
} : reconnect ? { label: this.#appearance.labels.reconnect, run: () => this.reconnect() } : void 0;
|
|
32874
|
+
appendConversationRecovery({
|
|
32875
|
+
messages: this.#messages,
|
|
32876
|
+
message: detail.code === "session_expired" ? this.#appearance.labels.sessionExpired : this.#appearance.labels.unavailable,
|
|
32792
32877
|
// A spent or switched-off daily budget offers no retry. Reconnecting cannot succeed, and every
|
|
32793
32878
|
// open tab trying is exactly the load the cap was set to refuse — so the button goes, not just
|
|
32794
32879
|
// the alarming words. A spent *session* keeps it: reconnect mints a fresh one, which is the fix.
|
|
32795
|
-
|
|
32796
|
-
|
|
32880
|
+
...recoveryAction === void 0 ? {} : { action: recoveryAction },
|
|
32881
|
+
revealLatest: () => this.#revealLatest()
|
|
32882
|
+
});
|
|
32797
32883
|
this.#dispatchError(detail);
|
|
32798
32884
|
}
|
|
32799
|
-
#
|
|
32800
|
-
|
|
32801
|
-
this.#
|
|
32802
|
-
|
|
32803
|
-
|
|
32804
|
-
error51.setAttribute("role", offerRetry ? "alert" : "status");
|
|
32805
|
-
const text3 = document.createElement("p");
|
|
32806
|
-
text3.textContent = message;
|
|
32807
|
-
error51.append(text3);
|
|
32808
|
-
if (offerRetry) {
|
|
32809
|
-
const retry = document.createElement("button");
|
|
32810
|
-
retry.type = "button";
|
|
32811
|
-
retry.textContent = this.#appearance.labels.reconnect;
|
|
32812
|
-
retry.addEventListener("click", () => this.reconnect());
|
|
32813
|
-
error51.append(retry);
|
|
32814
|
-
}
|
|
32815
|
-
this.#messages.append(error51);
|
|
32816
|
-
this.#revealLatest();
|
|
32885
|
+
#startNewConversation() {
|
|
32886
|
+
this.resetSession();
|
|
32887
|
+
this.#setSessionState("loading");
|
|
32888
|
+
this.#primeSession();
|
|
32889
|
+
this.dispatchEvent(new CustomEvent("assistant-new-conversation"));
|
|
32817
32890
|
}
|
|
32818
32891
|
#resolvedMode() {
|
|
32819
32892
|
const configured = this.getAttribute("theme") ?? this.#appearance.theme.defaultMode;
|