@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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { A as APP_VIEW_TAG_NAME, a as AssistantAppViewErrorDetail, N as NoodleAppViewElement } from './app-view-element-DSPtyEul.cjs';
|
|
2
|
+
export { A as AssistantClient, a as AssistantViewAvailableDetail } from './client-By4gqB1k.cjs';
|
|
3
|
+
import './appearance-0nS2LFjb.cjs';
|
|
4
|
+
import 'ai';
|
|
5
|
+
|
|
6
|
+
/** Register the framework-neutral MCP App host. Safe to call more than once or during SSR. */
|
|
7
|
+
declare function registerNoodleAppView(): void;
|
|
8
|
+
|
|
9
|
+
export { registerNoodleAppView };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { A as APP_VIEW_TAG_NAME, a as AssistantAppViewErrorDetail, N as NoodleAppViewElement } from './app-view-element-DDtXu08a.js';
|
|
2
|
+
export { A as AssistantClient, a as AssistantViewAvailableDetail } from './client-Cf38TgwN.js';
|
|
3
|
+
import './appearance-0nS2LFjb.js';
|
|
4
|
+
import 'ai';
|
|
5
|
+
|
|
6
|
+
/** Register the framework-neutral MCP App host. Safe to call more than once or during SSR. */
|
|
7
|
+
declare function registerNoodleAppView(): void;
|
|
8
|
+
|
|
9
|
+
export { registerNoodleAppView };
|
package/dist/app-view.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
APP_VIEW_TAG_NAME,
|
|
3
|
+
NoodleAppViewElement,
|
|
4
|
+
registerNoodleAppView
|
|
5
|
+
} from "./chunk-5NBHHNI3.js";
|
|
6
|
+
import "./chunk-XKTUXFGX.js";
|
|
7
|
+
import "./chunk-P223CYPO.js";
|
|
8
|
+
import "./chunk-3YYTUJPJ.js";
|
|
9
|
+
import "./chunk-5FUTL2UF.js";
|
|
10
|
+
export {
|
|
11
|
+
APP_VIEW_TAG_NAME,
|
|
12
|
+
NoodleAppViewElement,
|
|
13
|
+
registerNoodleAppView
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=app-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -124,6 +124,7 @@ interface AssistantLabels {
|
|
|
124
124
|
readonly copy: string;
|
|
125
125
|
readonly newMessages: string;
|
|
126
126
|
readonly reconnect: string;
|
|
127
|
+
readonly newConversation: string;
|
|
127
128
|
readonly retry: string;
|
|
128
129
|
readonly unavailable: string;
|
|
129
130
|
readonly sessionExpired: string;
|
|
@@ -124,6 +124,7 @@ interface AssistantLabels {
|
|
|
124
124
|
readonly copy: string;
|
|
125
125
|
readonly newMessages: string;
|
|
126
126
|
readonly reconnect: string;
|
|
127
|
+
readonly newConversation: string;
|
|
127
128
|
readonly retry: string;
|
|
128
129
|
readonly unavailable: string;
|
|
129
130
|
readonly sessionExpired: string;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ASSISTANT_APP_VIEW_STYLES,
|
|
3
|
+
mountAssistantApp,
|
|
4
|
+
unmountAssistantApp,
|
|
5
|
+
updateAssistantAppTheme
|
|
6
|
+
} from "./chunk-XKTUXFGX.js";
|
|
7
|
+
|
|
8
|
+
// src/app-view-element.ts
|
|
9
|
+
var APP_VIEW_TAG_NAME = "noodle-app-view";
|
|
10
|
+
var HTMLElementBase = globalThis.HTMLElement ?? class {
|
|
11
|
+
};
|
|
12
|
+
function viewIdentity(view) {
|
|
13
|
+
return `${view.id}\0${view.resourceUri}`;
|
|
14
|
+
}
|
|
15
|
+
var NoodleAppViewElement = class extends HTMLElementBase {
|
|
16
|
+
static observedAttributes = ["allow-fullscreen", "theme"];
|
|
17
|
+
#allowFullscreen = false;
|
|
18
|
+
#client;
|
|
19
|
+
#view;
|
|
20
|
+
#theme = "light";
|
|
21
|
+
#container;
|
|
22
|
+
#mounted;
|
|
23
|
+
#mountedClient;
|
|
24
|
+
#mountedAllowFullscreen = false;
|
|
25
|
+
#mountedIdentity;
|
|
26
|
+
#requestedTeardown;
|
|
27
|
+
get client() {
|
|
28
|
+
return this.#client;
|
|
29
|
+
}
|
|
30
|
+
/** Allow the hosted App to request fullscreen. Disabled by default. */
|
|
31
|
+
get allowFullscreen() {
|
|
32
|
+
return this.#allowFullscreen;
|
|
33
|
+
}
|
|
34
|
+
set allowFullscreen(value) {
|
|
35
|
+
const next = value === true;
|
|
36
|
+
if (next === this.#allowFullscreen) return;
|
|
37
|
+
this.#allowFullscreen = next;
|
|
38
|
+
this.toggleAttribute("allow-fullscreen", next);
|
|
39
|
+
this.#reconcile();
|
|
40
|
+
}
|
|
41
|
+
set client(value) {
|
|
42
|
+
if (value === this.#client) return;
|
|
43
|
+
this.#client = value;
|
|
44
|
+
this.#reconcile();
|
|
45
|
+
}
|
|
46
|
+
get view() {
|
|
47
|
+
return this.#view;
|
|
48
|
+
}
|
|
49
|
+
set view(value) {
|
|
50
|
+
this.#view = value;
|
|
51
|
+
this.#reconcile();
|
|
52
|
+
}
|
|
53
|
+
get theme() {
|
|
54
|
+
return this.#theme;
|
|
55
|
+
}
|
|
56
|
+
set theme(value) {
|
|
57
|
+
const next = value === "dark" ? "dark" : "light";
|
|
58
|
+
const changed = next !== this.#theme;
|
|
59
|
+
this.#theme = next;
|
|
60
|
+
if (this.getAttribute("data-theme") !== next) this.setAttribute("data-theme", next);
|
|
61
|
+
if (changed && this.#mounted) updateAssistantAppTheme(this.#mounted, next);
|
|
62
|
+
}
|
|
63
|
+
connectedCallback() {
|
|
64
|
+
this.#ensureContainer();
|
|
65
|
+
this.#upgradeProperty("allowFullscreen");
|
|
66
|
+
this.#upgradeProperty("client");
|
|
67
|
+
this.#upgradeProperty("theme");
|
|
68
|
+
this.#upgradeProperty("view");
|
|
69
|
+
this.#reconcile();
|
|
70
|
+
}
|
|
71
|
+
disconnectedCallback() {
|
|
72
|
+
this.#requestedTeardown = void 0;
|
|
73
|
+
this.#releaseMount();
|
|
74
|
+
}
|
|
75
|
+
attributeChangedCallback(name, _previous, value) {
|
|
76
|
+
if (name === "allow-fullscreen") this.allowFullscreen = value !== null;
|
|
77
|
+
if (name === "theme") this.theme = value === "dark" ? "dark" : "light";
|
|
78
|
+
}
|
|
79
|
+
#ensureContainer() {
|
|
80
|
+
if (this.#container) return this.#container;
|
|
81
|
+
const root = this.shadowRoot ?? this.attachShadow({ mode: "open" });
|
|
82
|
+
root.innerHTML = ASSISTANT_APP_VIEW_STYLES;
|
|
83
|
+
const container = document.createElement("div");
|
|
84
|
+
container.className = "noodle-app-mount";
|
|
85
|
+
container.setAttribute("part", "mount");
|
|
86
|
+
root.append(container);
|
|
87
|
+
this.#container = container;
|
|
88
|
+
return container;
|
|
89
|
+
}
|
|
90
|
+
#upgradeProperty(name) {
|
|
91
|
+
const property = Object.getOwnPropertyDescriptor(this, name);
|
|
92
|
+
if (!property) return;
|
|
93
|
+
Reflect.deleteProperty(this, name);
|
|
94
|
+
Reflect.set(this, name, property.value);
|
|
95
|
+
}
|
|
96
|
+
#releaseMount() {
|
|
97
|
+
const mounted = this.#mounted;
|
|
98
|
+
this.#mounted = void 0;
|
|
99
|
+
this.#mountedClient = void 0;
|
|
100
|
+
this.#mountedAllowFullscreen = false;
|
|
101
|
+
this.#mountedIdentity = void 0;
|
|
102
|
+
this.#container?.replaceChildren();
|
|
103
|
+
if (mounted) void unmountAssistantApp(mounted);
|
|
104
|
+
}
|
|
105
|
+
#reconcile() {
|
|
106
|
+
if (!this.isConnected) return;
|
|
107
|
+
const client = this.#client;
|
|
108
|
+
const detail = this.#view;
|
|
109
|
+
const identity = detail ? viewIdentity(detail) : void 0;
|
|
110
|
+
if (this.#mounted) {
|
|
111
|
+
if (client === this.#mountedClient && identity === this.#mountedIdentity && this.#allowFullscreen === this.#mountedAllowFullscreen) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.#releaseMount();
|
|
115
|
+
}
|
|
116
|
+
if (this.#requestedTeardown && (client !== this.#requestedTeardown.client || identity !== this.#requestedTeardown.identity)) {
|
|
117
|
+
this.#requestedTeardown = void 0;
|
|
118
|
+
}
|
|
119
|
+
if (!client || !detail?.html || !identity || this.#requestedTeardown) return;
|
|
120
|
+
const initialHtml = detail.html;
|
|
121
|
+
const sandboxUrl = client.appSandboxUrl?.();
|
|
122
|
+
let card;
|
|
123
|
+
card = mountAssistantApp(
|
|
124
|
+
detail,
|
|
125
|
+
{
|
|
126
|
+
client,
|
|
127
|
+
sendMessage: (message) => client.sendMessage(message),
|
|
128
|
+
updateModelContext: (update) => client.updateModelContext(update),
|
|
129
|
+
theme: this.#theme
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
allowFullscreen: this.#allowFullscreen,
|
|
133
|
+
...sandboxUrl ? { sandboxUrl } : {},
|
|
134
|
+
getDetail: () => {
|
|
135
|
+
const latest = this.#view;
|
|
136
|
+
if (this.#client !== client || !latest || viewIdentity(latest) !== identity)
|
|
137
|
+
return detail;
|
|
138
|
+
return latest.html ? latest : { ...latest, html: initialHtml };
|
|
139
|
+
},
|
|
140
|
+
onRenderFailure: (failure) => {
|
|
141
|
+
this.dispatchEvent(
|
|
142
|
+
new CustomEvent("assistant-error", {
|
|
143
|
+
detail: failure,
|
|
144
|
+
bubbles: true,
|
|
145
|
+
composed: true
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
},
|
|
149
|
+
onTeardownRequest: () => {
|
|
150
|
+
if (this.#mounted !== card) return;
|
|
151
|
+
this.#mounted = void 0;
|
|
152
|
+
this.#mountedClient = void 0;
|
|
153
|
+
this.#mountedIdentity = void 0;
|
|
154
|
+
this.#requestedTeardown = { client, identity };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
if (!card) return;
|
|
159
|
+
this.#mounted = card;
|
|
160
|
+
this.#mountedClient = client;
|
|
161
|
+
this.#mountedAllowFullscreen = this.#allowFullscreen;
|
|
162
|
+
this.#mountedIdentity = identity;
|
|
163
|
+
this.#ensureContainer().replaceChildren(card);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// src/app-view.ts
|
|
168
|
+
function registerNoodleAppView() {
|
|
169
|
+
if (!globalThis.customElements?.get(APP_VIEW_TAG_NAME)) {
|
|
170
|
+
globalThis.customElements?.define(APP_VIEW_TAG_NAME, NoodleAppViewElement);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
registerNoodleAppView();
|
|
174
|
+
|
|
175
|
+
export {
|
|
176
|
+
APP_VIEW_TAG_NAME,
|
|
177
|
+
NoodleAppViewElement,
|
|
178
|
+
registerNoodleAppView
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=chunk-5NBHHNI3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/app-view-element.ts","../src/app-view.ts"],"sourcesContent":["import { mountAssistantApp, unmountAssistantApp, updateAssistantAppTheme } from './app-host.js';\nimport { ASSISTANT_APP_VIEW_STYLES } from './app-view-styles.js';\nimport type { AssistantClient, AssistantViewAvailableDetail } from './client.js';\nimport type { AssistantErrorDetail } from './transport.js';\n\nexport const APP_VIEW_TAG_NAME = 'noodle-app-view';\n\nexport interface AssistantAppViewErrorDetail {\n readonly code: 'view_render_timeout';\n readonly retryable: false;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'noodle-app-view': NoodleAppViewElement;\n }\n\n interface HTMLElementEventMap {\n 'assistant-error': CustomEvent<AssistantErrorDetail>;\n }\n}\n\nconst HTMLElementBase: typeof HTMLElement =\n globalThis.HTMLElement ?? (class {} as unknown as typeof HTMLElement);\n\nfunction viewIdentity(view: AssistantViewAvailableDetail): string {\n return `${view.id}\\u0000${view.resourceUri}`;\n}\n\n/**\n * Framework-neutral host for one service-resolved MCP App view.\n *\n * `client` and `view` are object properties, not serialized attributes. Vue, Angular, and plain DOM\n * renderers can therefore pass the same `data-view` payload without taking a React dependency.\n */\nexport class NoodleAppViewElement extends HTMLElementBase {\n static readonly observedAttributes = ['allow-fullscreen', 'theme'];\n\n #allowFullscreen = false;\n #client: AssistantClient | undefined;\n #view: AssistantViewAvailableDetail | undefined;\n #theme: 'light' | 'dark' = 'light';\n #container: HTMLElement | undefined;\n #mounted: HTMLElement | undefined;\n #mountedClient: AssistantClient | undefined;\n #mountedAllowFullscreen = false;\n #mountedIdentity: string | undefined;\n #requestedTeardown: { readonly client: AssistantClient; readonly identity: string } | undefined;\n\n get client(): AssistantClient | undefined {\n return this.#client;\n }\n\n /** Allow the hosted App to request fullscreen. Disabled by default. */\n get allowFullscreen(): boolean {\n return this.#allowFullscreen;\n }\n\n set allowFullscreen(value: boolean) {\n const next = value === true;\n if (next === this.#allowFullscreen) return;\n this.#allowFullscreen = next;\n this.toggleAttribute('allow-fullscreen', next);\n this.#reconcile();\n }\n\n set client(value: AssistantClient | undefined) {\n if (value === this.#client) return;\n this.#client = value;\n this.#reconcile();\n }\n\n get view(): AssistantViewAvailableDetail | undefined {\n return this.#view;\n }\n\n set view(value: AssistantViewAvailableDetail | undefined) {\n this.#view = value;\n this.#reconcile();\n }\n\n get theme(): 'light' | 'dark' {\n return this.#theme;\n }\n\n set theme(value: 'light' | 'dark') {\n const next = value === 'dark' ? 'dark' : 'light';\n const changed = next !== this.#theme;\n this.#theme = next;\n if (this.getAttribute('data-theme') !== next) this.setAttribute('data-theme', next);\n if (changed && this.#mounted) updateAssistantAppTheme(this.#mounted, next);\n }\n\n connectedCallback(): void {\n this.#ensureContainer();\n this.#upgradeProperty('allowFullscreen');\n this.#upgradeProperty('client');\n this.#upgradeProperty('theme');\n this.#upgradeProperty('view');\n this.#reconcile();\n }\n\n disconnectedCallback(): void {\n this.#requestedTeardown = undefined;\n this.#releaseMount();\n }\n\n attributeChangedCallback(name: string, _previous: string | null, value: string | null): void {\n if (name === 'allow-fullscreen') this.allowFullscreen = value !== null;\n if (name === 'theme') this.theme = value === 'dark' ? 'dark' : 'light';\n }\n\n #ensureContainer(): HTMLElement {\n if (this.#container) return this.#container;\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n root.innerHTML = ASSISTANT_APP_VIEW_STYLES;\n const container = document.createElement('div');\n container.className = 'noodle-app-mount';\n container.setAttribute('part', 'mount');\n root.append(container);\n this.#container = container;\n return container;\n }\n\n #upgradeProperty(name: 'allowFullscreen' | 'client' | 'theme' | 'view'): void {\n const property = Object.getOwnPropertyDescriptor(this, name);\n if (!property) return;\n Reflect.deleteProperty(this, name);\n Reflect.set(this, name, property.value);\n }\n\n #releaseMount(): void {\n const mounted = this.#mounted;\n this.#mounted = undefined;\n this.#mountedClient = undefined;\n this.#mountedAllowFullscreen = false;\n this.#mountedIdentity = undefined;\n this.#container?.replaceChildren();\n if (mounted) void unmountAssistantApp(mounted);\n }\n\n #reconcile(): void {\n if (!this.isConnected) return;\n const client = this.#client;\n const detail = this.#view;\n const identity = detail ? viewIdentity(detail) : undefined;\n\n if (this.#mounted) {\n if (\n client === this.#mountedClient &&\n identity === this.#mountedIdentity &&\n this.#allowFullscreen === this.#mountedAllowFullscreen\n ) {\n return;\n }\n this.#releaseMount();\n }\n\n if (\n this.#requestedTeardown &&\n (client !== this.#requestedTeardown.client || identity !== this.#requestedTeardown.identity)\n ) {\n this.#requestedTeardown = undefined;\n }\n if (!client || !detail?.html || !identity || this.#requestedTeardown) return;\n\n const initialHtml = detail.html;\n const sandboxUrl = client.appSandboxUrl?.();\n let card: HTMLElement | undefined;\n card = mountAssistantApp(\n detail,\n {\n client,\n sendMessage: (message) => client.sendMessage(message),\n updateModelContext: (update) => client.updateModelContext(update),\n theme: this.#theme,\n },\n {\n allowFullscreen: this.#allowFullscreen,\n ...(sandboxUrl ? { sandboxUrl } : {}),\n getDetail: () => {\n const latest = this.#view;\n if (this.#client !== client || !latest || viewIdentity(latest) !== identity)\n return detail;\n return latest.html ? latest : { ...latest, html: initialHtml };\n },\n onRenderFailure: (failure) => {\n this.dispatchEvent(\n new CustomEvent<AssistantAppViewErrorDetail>('assistant-error', {\n detail: failure,\n bubbles: true,\n composed: true,\n }),\n );\n },\n onTeardownRequest: () => {\n if (this.#mounted !== card) return;\n this.#mounted = undefined;\n this.#mountedClient = undefined;\n this.#mountedIdentity = undefined;\n this.#requestedTeardown = { client, identity };\n },\n },\n );\n if (!card) return;\n this.#mounted = card;\n this.#mountedClient = client;\n this.#mountedAllowFullscreen = this.#allowFullscreen;\n this.#mountedIdentity = identity;\n this.#ensureContainer().replaceChildren(card);\n }\n}\n","import { APP_VIEW_TAG_NAME, NoodleAppViewElement } from './app-view-element.js';\n\nexport {\n APP_VIEW_TAG_NAME,\n type AssistantAppViewErrorDetail,\n NoodleAppViewElement,\n} from './app-view-element.js';\nexport type { AssistantClient, AssistantViewAvailableDetail } from './client.js';\n\n/** Register the framework-neutral MCP App host. Safe to call more than once or during SSR. */\nexport function registerNoodleAppView(): void {\n if (!globalThis.customElements?.get(APP_VIEW_TAG_NAME)) {\n globalThis.customElements?.define(APP_VIEW_TAG_NAME, NoodleAppViewElement);\n }\n}\n\nregisterNoodleAppView();\n"],"mappings":"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","names":[]}
|