@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
@@ -0,0 +1,9 @@
1
+ export { A as APP_VIEW_TAG_NAME, a as AssistantAppViewErrorDetail, N as NoodleAppViewElement } from './app-view-element-1i_w6FDf.cjs';
2
+ export { A as AssistantClient, a as AssistantViewAvailableDetail } from './client-uo57Swlm.cjs';
3
+ import './appearance-Cc-eqSbp.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-7ZQZLYbL.js';
2
+ export { A as AssistantClient, a as AssistantViewAvailableDetail } from './client-Bp_VKpMg.js';
3
+ import './appearance-Cc-eqSbp.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 };
@@ -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":[]}
@@ -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":[]}