nitrostack 1.0.73 → 1.0.75

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 (181) hide show
  1. package/dist/auth/__tests__/api-key.test.d.ts +2 -0
  2. package/dist/auth/__tests__/api-key.test.d.ts.map +1 -0
  3. package/dist/auth/__tests__/api-key.test.js +136 -0
  4. package/dist/auth/__tests__/api-key.test.js.map +1 -0
  5. package/dist/auth/__tests__/middleware.test.d.ts +2 -0
  6. package/dist/auth/__tests__/middleware.test.d.ts.map +1 -0
  7. package/dist/auth/__tests__/middleware.test.js +186 -0
  8. package/dist/auth/__tests__/middleware.test.js.map +1 -0
  9. package/dist/auth/__tests__/pkce.test.d.ts +2 -0
  10. package/dist/auth/__tests__/pkce.test.d.ts.map +1 -0
  11. package/dist/auth/__tests__/pkce.test.js +110 -0
  12. package/dist/auth/__tests__/pkce.test.js.map +1 -0
  13. package/dist/auth/__tests__/secure-secret.test.d.ts +2 -0
  14. package/dist/auth/__tests__/secure-secret.test.d.ts.map +1 -0
  15. package/dist/auth/__tests__/secure-secret.test.js +42 -0
  16. package/dist/auth/__tests__/secure-secret.test.js.map +1 -0
  17. package/dist/auth/__tests__/simple-jwt.test.d.ts +2 -0
  18. package/dist/auth/__tests__/simple-jwt.test.d.ts.map +1 -0
  19. package/dist/auth/__tests__/simple-jwt.test.js +219 -0
  20. package/dist/auth/__tests__/simple-jwt.test.js.map +1 -0
  21. package/dist/auth/__tests__/token-store.test.d.ts +2 -0
  22. package/dist/auth/__tests__/token-store.test.d.ts.map +1 -0
  23. package/dist/auth/__tests__/token-store.test.js +79 -0
  24. package/dist/auth/__tests__/token-store.test.js.map +1 -0
  25. package/dist/auth/__tests__/token-validation.test.d.ts +2 -0
  26. package/dist/auth/__tests__/token-validation.test.d.ts.map +1 -0
  27. package/dist/auth/__tests__/token-validation.test.js +23 -0
  28. package/dist/auth/__tests__/token-validation.test.js.map +1 -0
  29. package/dist/cli/__tests__/cli-dev.test.d.ts +2 -0
  30. package/dist/cli/__tests__/cli-dev.test.d.ts.map +1 -0
  31. package/dist/cli/__tests__/cli-dev.test.js +83 -0
  32. package/dist/cli/__tests__/cli-dev.test.js.map +1 -0
  33. package/dist/cli/__tests__/cli-start.test.d.ts +2 -0
  34. package/dist/cli/__tests__/cli-start.test.d.ts.map +1 -0
  35. package/dist/cli/__tests__/cli-start.test.js +61 -0
  36. package/dist/cli/__tests__/cli-start.test.js.map +1 -0
  37. package/dist/cli/__tests__/cli.test.d.ts +2 -0
  38. package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
  39. package/dist/cli/__tests__/cli.test.js +73 -0
  40. package/dist/cli/__tests__/cli.test.js.map +1 -0
  41. package/dist/cli/__tests__/commands.test.d.ts +2 -0
  42. package/dist/cli/__tests__/commands.test.d.ts.map +1 -0
  43. package/dist/cli/__tests__/commands.test.js +64 -0
  44. package/dist/cli/__tests__/commands.test.js.map +1 -0
  45. package/dist/cli/commands/install.d.ts +10 -0
  46. package/dist/cli/commands/install.d.ts.map +1 -0
  47. package/dist/cli/commands/install.js +79 -0
  48. package/dist/cli/commands/install.js.map +1 -0
  49. package/dist/cli/index.d.ts +2 -1
  50. package/dist/cli/index.d.ts.map +1 -1
  51. package/dist/cli/index.js +76 -45
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/core/__tests__/core-modules.test.d.ts +2 -0
  54. package/dist/core/__tests__/core-modules.test.d.ts.map +1 -0
  55. package/dist/core/__tests__/core-modules.test.js +36 -0
  56. package/dist/core/__tests__/core-modules.test.js.map +1 -0
  57. package/dist/core/__tests__/errors.test.d.ts +2 -0
  58. package/dist/core/__tests__/errors.test.d.ts.map +1 -0
  59. package/dist/core/__tests__/errors.test.js +109 -0
  60. package/dist/core/__tests__/errors.test.js.map +1 -0
  61. package/dist/core/__tests__/logger.test.d.ts +2 -0
  62. package/dist/core/__tests__/logger.test.d.ts.map +1 -0
  63. package/dist/core/__tests__/logger.test.js +83 -0
  64. package/dist/core/__tests__/logger.test.js.map +1 -0
  65. package/dist/core/__tests__/models.test.d.ts +2 -0
  66. package/dist/core/__tests__/models.test.d.ts.map +1 -0
  67. package/dist/core/__tests__/models.test.js +142 -0
  68. package/dist/core/__tests__/models.test.js.map +1 -0
  69. package/dist/core/__tests__/module.test.d.ts +2 -0
  70. package/dist/core/__tests__/module.test.d.ts.map +1 -0
  71. package/dist/core/__tests__/module.test.js +60 -0
  72. package/dist/core/__tests__/module.test.js.map +1 -0
  73. package/dist/core/__tests__/prompt.test.d.ts +2 -0
  74. package/dist/core/__tests__/prompt.test.d.ts.map +1 -0
  75. package/dist/core/__tests__/prompt.test.js +126 -0
  76. package/dist/core/__tests__/prompt.test.js.map +1 -0
  77. package/dist/core/__tests__/resource.test.d.ts +2 -0
  78. package/dist/core/__tests__/resource.test.d.ts.map +1 -0
  79. package/dist/core/__tests__/resource.test.js +173 -0
  80. package/dist/core/__tests__/resource.test.js.map +1 -0
  81. package/dist/core/__tests__/server.test.d.ts +2 -0
  82. package/dist/core/__tests__/server.test.d.ts.map +1 -0
  83. package/dist/core/__tests__/server.test.js +120 -0
  84. package/dist/core/__tests__/server.test.js.map +1 -0
  85. package/dist/core/__tests__/transports.test.d.ts +2 -0
  86. package/dist/core/__tests__/transports.test.d.ts.map +1 -0
  87. package/dist/core/__tests__/transports.test.js +12 -0
  88. package/dist/core/__tests__/transports.test.js.map +1 -0
  89. package/dist/core/decorators/__tests__/decorators.test.d.ts +2 -0
  90. package/dist/core/decorators/__tests__/decorators.test.d.ts.map +1 -0
  91. package/dist/core/decorators/__tests__/decorators.test.js +103 -0
  92. package/dist/core/decorators/__tests__/decorators.test.js.map +1 -0
  93. package/dist/core/decorators/__tests__/extended-decorators.test.d.ts +2 -0
  94. package/dist/core/decorators/__tests__/extended-decorators.test.d.ts.map +1 -0
  95. package/dist/core/decorators/__tests__/extended-decorators.test.js +194 -0
  96. package/dist/core/decorators/__tests__/extended-decorators.test.js.map +1 -0
  97. package/dist/core/di/__tests__/container.test.d.ts +2 -0
  98. package/dist/core/di/__tests__/container.test.d.ts.map +1 -0
  99. package/dist/core/di/__tests__/container.test.js +88 -0
  100. package/dist/core/di/__tests__/container.test.js.map +1 -0
  101. package/dist/core/events/__tests__/events.test.d.ts +2 -0
  102. package/dist/core/events/__tests__/events.test.d.ts.map +1 -0
  103. package/dist/core/events/__tests__/events.test.js +177 -0
  104. package/dist/core/events/__tests__/events.test.js.map +1 -0
  105. package/dist/core/filters/__tests__/filters.test.d.ts +2 -0
  106. package/dist/core/filters/__tests__/filters.test.d.ts.map +1 -0
  107. package/dist/core/filters/__tests__/filters.test.js +72 -0
  108. package/dist/core/filters/__tests__/filters.test.js.map +1 -0
  109. package/dist/core/guards/__tests__/guards.test.d.ts +2 -0
  110. package/dist/core/guards/__tests__/guards.test.d.ts.map +1 -0
  111. package/dist/core/guards/__tests__/guards.test.js +55 -0
  112. package/dist/core/guards/__tests__/guards.test.js.map +1 -0
  113. package/dist/core/health/__tests__/health.test.d.ts +2 -0
  114. package/dist/core/health/__tests__/health.test.d.ts.map +1 -0
  115. package/dist/core/health/__tests__/health.test.js +31 -0
  116. package/dist/core/health/__tests__/health.test.js.map +1 -0
  117. package/dist/core/interceptors/__tests__/interceptors.test.d.ts +2 -0
  118. package/dist/core/interceptors/__tests__/interceptors.test.d.ts.map +1 -0
  119. package/dist/core/interceptors/__tests__/interceptors.test.js +52 -0
  120. package/dist/core/interceptors/__tests__/interceptors.test.js.map +1 -0
  121. package/dist/core/middleware/__tests__/middleware.test.d.ts +2 -0
  122. package/dist/core/middleware/__tests__/middleware.test.d.ts.map +1 -0
  123. package/dist/core/middleware/__tests__/middleware.test.js +105 -0
  124. package/dist/core/middleware/__tests__/middleware.test.js.map +1 -0
  125. package/dist/core/pipes/__tests__/pipes.test.d.ts +2 -0
  126. package/dist/core/pipes/__tests__/pipes.test.d.ts.map +1 -0
  127. package/dist/core/pipes/__tests__/pipes.test.js +164 -0
  128. package/dist/core/pipes/__tests__/pipes.test.js.map +1 -0
  129. package/dist/core/transports/__tests__/transports.test.d.ts +2 -0
  130. package/dist/core/transports/__tests__/transports.test.d.ts.map +1 -0
  131. package/dist/core/transports/__tests__/transports.test.js +249 -0
  132. package/dist/core/transports/__tests__/transports.test.js.map +1 -0
  133. package/dist/core/widgets/__tests__/registry.test.d.ts +2 -0
  134. package/dist/core/widgets/__tests__/registry.test.d.ts.map +1 -0
  135. package/dist/core/widgets/__tests__/registry.test.js +69 -0
  136. package/dist/core/widgets/__tests__/registry.test.js.map +1 -0
  137. package/dist/testing/__tests__/testing.test.d.ts +2 -0
  138. package/dist/testing/__tests__/testing.test.d.ts.map +1 -0
  139. package/dist/testing/__tests__/testing.test.js +167 -0
  140. package/dist/testing/__tests__/testing.test.js.map +1 -0
  141. package/dist/testing/index.d.ts +0 -6
  142. package/dist/testing/index.d.ts.map +1 -1
  143. package/dist/testing/index.js.map +1 -1
  144. package/dist/ui-next/__tests__/ui-next.test.d.ts +2 -0
  145. package/dist/ui-next/__tests__/ui-next.test.d.ts.map +1 -0
  146. package/dist/ui-next/__tests__/ui-next.test.js +74 -0
  147. package/dist/ui-next/__tests__/ui-next.test.js.map +1 -0
  148. package/dist/widgets/__tests__/utils.test.d.ts +2 -0
  149. package/dist/widgets/__tests__/utils.test.d.ts.map +1 -0
  150. package/dist/widgets/__tests__/utils.test.js +80 -0
  151. package/dist/widgets/__tests__/utils.test.js.map +1 -0
  152. package/dist/widgets/__tests__/widgets.test.d.ts +2 -0
  153. package/dist/widgets/__tests__/widgets.test.d.ts.map +1 -0
  154. package/dist/widgets/__tests__/widgets.test.js +245 -0
  155. package/dist/widgets/__tests__/widgets.test.js.map +1 -0
  156. package/dist/widgets/hooks/__tests__/hooks.test.d.ts +2 -0
  157. package/dist/widgets/hooks/__tests__/hooks.test.d.ts.map +1 -0
  158. package/dist/widgets/hooks/__tests__/hooks.test.js +129 -0
  159. package/dist/widgets/hooks/__tests__/hooks.test.js.map +1 -0
  160. package/dist/widgets/hooks/__tests__/use-widget-state.test.d.ts +2 -0
  161. package/dist/widgets/hooks/__tests__/use-widget-state.test.d.ts.map +1 -0
  162. package/dist/widgets/hooks/__tests__/use-widget-state.test.js +66 -0
  163. package/dist/widgets/hooks/__tests__/use-widget-state.test.js.map +1 -0
  164. package/dist/widgets/runtime/__tests__/widget-polyfill.test.d.ts +2 -0
  165. package/dist/widgets/runtime/__tests__/widget-polyfill.test.d.ts.map +1 -0
  166. package/dist/widgets/runtime/__tests__/widget-polyfill.test.js +66 -0
  167. package/dist/widgets/runtime/__tests__/widget-polyfill.test.js.map +1 -0
  168. package/package.json +6 -2
  169. package/src/studio/app/chat/page.tsx +21 -0
  170. package/src/studio/components/WidgetErrorBoundary.tsx +1 -0
  171. package/src/studio/components/ops/index.ts +1 -0
  172. package/src/studio/components/ops/nodes/index.ts +1 -0
  173. package/src/studio/lib/llm-service.ts +77 -10
  174. package/templates/typescript-oauth/OAUTH_SETUP.md +592 -0
  175. package/templates/typescript-oauth/README.md +186 -235
  176. package/templates/typescript-oauth/package.json +5 -3
  177. package/templates/typescript-pizzaz/README.md +78 -57
  178. package/templates/typescript-pizzaz/package.json +32 -30
  179. package/templates/typescript-starter/README.md +22 -14
  180. package/templates/typescript-starter/package.json +4 -1
  181. package/templates/typescript-starter/package-lock.json +0 -4112
@@ -0,0 +1,245 @@
1
+ import { jest, describe, it, expect, beforeEach, afterEach } from '@jest/globals';
2
+ import { defineWidgetMetadata } from '../metadata.js';
3
+ // Mock window.openai for WidgetSDK tests
4
+ const mockOpenai = {
5
+ setWidgetState: jest.fn(),
6
+ widgetState: { test: 'state' },
7
+ callTool: jest.fn(),
8
+ requestDisplayMode: jest.fn(),
9
+ requestClose: jest.fn(),
10
+ openExternal: jest.fn(),
11
+ sendFollowUpMessage: jest.fn(),
12
+ toolInput: { input: 'data' },
13
+ toolOutput: { output: 'result' },
14
+ toolResponseMetadata: { meta: 'data' },
15
+ theme: 'dark',
16
+ maxHeight: 500,
17
+ displayMode: 'inline',
18
+ userAgent: { platform: 'test' },
19
+ locale: 'en-US',
20
+ safeArea: { top: 0, bottom: 0, left: 0, right: 0 },
21
+ };
22
+ describe('Widget Metadata', () => {
23
+ it('should define widget metadata', () => {
24
+ const metadata = {
25
+ uri: '/test-widget',
26
+ name: 'Test Widget',
27
+ description: 'A test widget',
28
+ examples: []
29
+ };
30
+ const result = defineWidgetMetadata(metadata);
31
+ expect(result).toBe(metadata);
32
+ });
33
+ it('should pass through complex metadata', () => {
34
+ const metadata = {
35
+ uri: '/calc',
36
+ name: 'Calculator',
37
+ description: 'A calculator',
38
+ examples: [
39
+ { name: 'ex1', description: 'desc1', data: { a: 1 } }
40
+ ],
41
+ tags: ['utility']
42
+ };
43
+ const result = defineWidgetMetadata(metadata);
44
+ expect(result.examples).toHaveLength(1);
45
+ expect(result.tags).toContain('utility');
46
+ });
47
+ });
48
+ describe('WidgetSDK', () => {
49
+ let originalWindow;
50
+ let WidgetSDK;
51
+ let getWidgetSDK;
52
+ beforeEach(async () => {
53
+ // Reset module cache to get fresh singleton
54
+ jest.resetModules();
55
+ // Setup mock window
56
+ originalWindow = globalThis.window;
57
+ globalThis.window = {
58
+ openai: mockOpenai,
59
+ addEventListener: jest.fn(),
60
+ removeEventListener: jest.fn(),
61
+ };
62
+ jest.clearAllMocks();
63
+ // Import fresh module
64
+ const sdk = await import('../sdk.js');
65
+ WidgetSDK = sdk.WidgetSDK;
66
+ getWidgetSDK = sdk.getWidgetSDK;
67
+ });
68
+ afterEach(() => {
69
+ globalThis.window = originalWindow;
70
+ });
71
+ describe('getInstance', () => {
72
+ it('should return singleton instance', () => {
73
+ const instance1 = WidgetSDK.getInstance();
74
+ const instance2 = WidgetSDK.getInstance();
75
+ expect(instance1).toBe(instance2);
76
+ });
77
+ it('should be accessible via getWidgetSDK', () => {
78
+ const instance = getWidgetSDK();
79
+ expect(instance).toBe(WidgetSDK.getInstance());
80
+ });
81
+ });
82
+ describe('isReady', () => {
83
+ it('should return true when window.openai exists', () => {
84
+ const sdk = WidgetSDK.getInstance();
85
+ expect(sdk.isReady()).toBe(true);
86
+ });
87
+ it('should return false when window.openai is missing', () => {
88
+ delete globalThis.window.openai;
89
+ const sdk = WidgetSDK.getInstance();
90
+ expect(sdk.isReady()).toBe(false);
91
+ });
92
+ });
93
+ describe('waitForReady', () => {
94
+ it('should resolve immediately if already ready', async () => {
95
+ const sdk = WidgetSDK.getInstance();
96
+ await expect(sdk.waitForReady()).resolves.toBeUndefined();
97
+ });
98
+ it('should timeout if not ready', async () => {
99
+ delete globalThis.window.openai;
100
+ const sdk = WidgetSDK.getInstance();
101
+ await expect(sdk.waitForReady(100)).rejects.toThrow('timeout');
102
+ });
103
+ });
104
+ describe('State Management', () => {
105
+ it('should set widget state', async () => {
106
+ const sdk = WidgetSDK.getInstance();
107
+ await sdk.setState({ key: 'value' });
108
+ expect(mockOpenai.setWidgetState).toHaveBeenCalledWith({ key: 'value' });
109
+ });
110
+ it('should throw if not ready when setting state', async () => {
111
+ delete globalThis.window.openai;
112
+ const sdk = WidgetSDK.getInstance();
113
+ await expect(sdk.setState({ key: 'value' })).rejects.toThrow('not ready');
114
+ });
115
+ it('should get widget state', () => {
116
+ const sdk = WidgetSDK.getInstance();
117
+ expect(sdk.getState()).toEqual({ test: 'state' });
118
+ });
119
+ it('should return null for state when not ready', () => {
120
+ delete globalThis.window.openai;
121
+ const sdk = WidgetSDK.getInstance();
122
+ expect(sdk.getState()).toBeNull();
123
+ });
124
+ });
125
+ describe('Tool Calling', () => {
126
+ it('should call a tool', async () => {
127
+ mockOpenai.callTool.mockResolvedValue({ result: 'success' });
128
+ const sdk = WidgetSDK.getInstance();
129
+ const result = await sdk.callTool('testTool', { arg: 1 });
130
+ expect(mockOpenai.callTool).toHaveBeenCalledWith('testTool', { arg: 1 });
131
+ expect(result).toEqual({ result: 'success' });
132
+ });
133
+ it('should throw if not ready when calling tool', async () => {
134
+ delete globalThis.window.openai;
135
+ const sdk = WidgetSDK.getInstance();
136
+ await expect(sdk.callTool('test')).rejects.toThrow('not ready');
137
+ });
138
+ });
139
+ describe('Display Controls', () => {
140
+ it('should request fullscreen', async () => {
141
+ const sdk = WidgetSDK.getInstance();
142
+ await sdk.requestFullscreen();
143
+ expect(mockOpenai.requestDisplayMode).toHaveBeenCalledWith({ mode: 'fullscreen' });
144
+ });
145
+ it('should request inline', async () => {
146
+ const sdk = WidgetSDK.getInstance();
147
+ await sdk.requestInline();
148
+ expect(mockOpenai.requestDisplayMode).toHaveBeenCalledWith({ mode: 'inline' });
149
+ });
150
+ it('should request pip', async () => {
151
+ const sdk = WidgetSDK.getInstance();
152
+ await sdk.requestPip();
153
+ expect(mockOpenai.requestDisplayMode).toHaveBeenCalledWith({ mode: 'pip' });
154
+ });
155
+ it('should request display mode', async () => {
156
+ mockOpenai.requestDisplayMode.mockResolvedValue({ mode: 'fullscreen' });
157
+ const sdk = WidgetSDK.getInstance();
158
+ const result = await sdk.requestDisplayMode('fullscreen');
159
+ expect(result).toEqual({ mode: 'fullscreen' });
160
+ });
161
+ it('should request close', () => {
162
+ const sdk = WidgetSDK.getInstance();
163
+ sdk.requestClose();
164
+ expect(mockOpenai.requestClose).toHaveBeenCalled();
165
+ });
166
+ it('should throw if not ready for display controls', async () => {
167
+ delete globalThis.window.openai;
168
+ const sdk = WidgetSDK.getInstance();
169
+ await expect(sdk.requestFullscreen()).rejects.toThrow('not ready');
170
+ await expect(sdk.requestInline()).rejects.toThrow('not ready');
171
+ await expect(sdk.requestPip()).rejects.toThrow('not ready');
172
+ expect(() => sdk.requestClose()).toThrow('not ready');
173
+ });
174
+ });
175
+ describe('Navigation', () => {
176
+ it('should open external URL', () => {
177
+ const sdk = WidgetSDK.getInstance();
178
+ sdk.openExternal('https://example.com');
179
+ expect(mockOpenai.openExternal).toHaveBeenCalledWith({ href: 'https://example.com' });
180
+ });
181
+ it('should send follow-up message', async () => {
182
+ const sdk = WidgetSDK.getInstance();
183
+ await sdk.sendFollowUpMessage('Hello');
184
+ expect(mockOpenai.sendFollowUpMessage).toHaveBeenCalledWith({ prompt: 'Hello' });
185
+ });
186
+ it('should throw if not ready for navigation', async () => {
187
+ delete globalThis.window.openai;
188
+ const sdk = WidgetSDK.getInstance();
189
+ expect(() => sdk.openExternal('url')).toThrow('not ready');
190
+ await expect(sdk.sendFollowUpMessage('msg')).rejects.toThrow('not ready');
191
+ });
192
+ });
193
+ describe('Data Access', () => {
194
+ it('should get tool input', () => {
195
+ const sdk = WidgetSDK.getInstance();
196
+ expect(sdk.getToolInput()).toEqual({ input: 'data' });
197
+ });
198
+ it('should get tool output', () => {
199
+ const sdk = WidgetSDK.getInstance();
200
+ expect(sdk.getToolOutput()).toEqual({ output: 'result' });
201
+ });
202
+ it('should get tool response metadata', () => {
203
+ const sdk = WidgetSDK.getInstance();
204
+ expect(sdk.getToolResponseMetadata()).toEqual({ meta: 'data' });
205
+ });
206
+ it('should get theme', () => {
207
+ const sdk = WidgetSDK.getInstance();
208
+ expect(sdk.getTheme()).toBe('dark');
209
+ });
210
+ it('should get max height', () => {
211
+ const sdk = WidgetSDK.getInstance();
212
+ expect(sdk.getMaxHeight()).toBe(500);
213
+ });
214
+ it('should get display mode', () => {
215
+ const sdk = WidgetSDK.getInstance();
216
+ expect(sdk.getDisplayMode()).toBe('inline');
217
+ });
218
+ it('should get user agent', () => {
219
+ const sdk = WidgetSDK.getInstance();
220
+ expect(sdk.getUserAgent()).toEqual({ platform: 'test' });
221
+ });
222
+ it('should get locale', () => {
223
+ const sdk = WidgetSDK.getInstance();
224
+ expect(sdk.getLocale()).toBe('en-US');
225
+ });
226
+ it('should get safe area', () => {
227
+ const sdk = WidgetSDK.getInstance();
228
+ expect(sdk.getSafeArea()).toEqual({ top: 0, bottom: 0, left: 0, right: 0 });
229
+ });
230
+ it('should return defaults when not ready', () => {
231
+ delete globalThis.window.openai;
232
+ const sdk = WidgetSDK.getInstance();
233
+ expect(sdk.getToolInput()).toBeNull();
234
+ expect(sdk.getToolOutput()).toBeNull();
235
+ expect(sdk.getToolResponseMetadata()).toBeNull();
236
+ expect(sdk.getTheme()).toBe('light');
237
+ expect(sdk.getMaxHeight()).toBe(0);
238
+ expect(sdk.getDisplayMode()).toBe('inline');
239
+ expect(sdk.getUserAgent()).toBeNull();
240
+ expect(sdk.getLocale()).toBe('en-US');
241
+ expect(sdk.getSafeArea()).toBeNull();
242
+ });
243
+ });
244
+ });
245
+ //# sourceMappingURL=widgets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.test.js","sourceRoot":"","sources":["../../../src/widgets/__tests__/widgets.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../../../src/widgets/hooks/__tests__/hooks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { jest, describe, it, expect, beforeEach } from '@jest/globals';
2
+ // Mock React with any type to avoid strict typing issues
3
+ const mockUseSyncExternalStore = jest.fn();
4
+ const mockUseState = jest.fn();
5
+ const mockUseEffect = jest.fn();
6
+ jest.unstable_mockModule('react', () => ({
7
+ useSyncExternalStore: mockUseSyncExternalStore,
8
+ useState: mockUseState,
9
+ useEffect: mockUseEffect,
10
+ }));
11
+ // Mock window.openai
12
+ const mockOpenai = {
13
+ theme: 'dark',
14
+ displayMode: 'inline',
15
+ maxHeight: 500,
16
+ locale: 'en-US',
17
+ userAgent: 'test-agent',
18
+ };
19
+ // Set up window with openai
20
+ global.window = {
21
+ openai: mockOpenai,
22
+ addEventListener: jest.fn(),
23
+ removeEventListener: jest.fn(),
24
+ };
25
+ describe('Widget Hooks', () => {
26
+ beforeEach(() => {
27
+ jest.clearAllMocks();
28
+ // Reset useSyncExternalStore to call getSnapshot
29
+ mockUseSyncExternalStore.mockImplementation((_sub, getSnapshot) => {
30
+ return getSnapshot();
31
+ });
32
+ });
33
+ describe('useOpenAiGlobal', () => {
34
+ it('should return theme from window.openai', async () => {
35
+ const { useOpenAiGlobal } = await import('../use-openai-global.js');
36
+ const result = useOpenAiGlobal('theme');
37
+ expect(result).toBe('dark');
38
+ });
39
+ it('should return displayMode from window.openai', async () => {
40
+ const { useOpenAiGlobal } = await import('../use-openai-global.js');
41
+ const result = useOpenAiGlobal('displayMode');
42
+ expect(result).toBe('inline');
43
+ });
44
+ it('should return maxHeight from window.openai', async () => {
45
+ const { useOpenAiGlobal } = await import('../use-openai-global.js');
46
+ const result = useOpenAiGlobal('maxHeight');
47
+ expect(result).toBe(500);
48
+ });
49
+ it('should return locale from window.openai', async () => {
50
+ const { useOpenAiGlobal } = await import('../use-openai-global.js');
51
+ const result = useOpenAiGlobal('locale');
52
+ expect(result).toBe('en-US');
53
+ });
54
+ });
55
+ describe('useTheme', () => {
56
+ it('should return theme value', async () => {
57
+ const { useTheme } = await import('../use-theme.js');
58
+ const result = useTheme();
59
+ expect(result).toBe('dark');
60
+ });
61
+ });
62
+ describe('useDisplayMode', () => {
63
+ it('should return displayMode value', async () => {
64
+ const { useDisplayMode } = await import('../use-display-mode.js');
65
+ const result = useDisplayMode();
66
+ expect(result).toBe('inline');
67
+ });
68
+ });
69
+ describe('useMaxHeight', () => {
70
+ it('should return maxHeight value', async () => {
71
+ const { useMaxHeight } = await import('../use-max-height.js');
72
+ const result = useMaxHeight();
73
+ expect(result).toBe(500);
74
+ });
75
+ });
76
+ describe('useWidgetSDK', () => {
77
+ beforeEach(() => {
78
+ // Mock useState to return initialized values
79
+ let sdkInstance = null;
80
+ mockUseState.mockImplementation((initializer) => {
81
+ if (typeof initializer === 'function') {
82
+ if (!sdkInstance) {
83
+ sdkInstance = initializer();
84
+ }
85
+ return [sdkInstance, jest.fn()];
86
+ }
87
+ return [initializer, jest.fn()];
88
+ });
89
+ // Mock useEffect to run synchronously
90
+ mockUseEffect.mockImplementation((effect) => {
91
+ effect();
92
+ });
93
+ });
94
+ it('should return SDK methods', async () => {
95
+ const { useWidgetSDK } = await import('../useWidgetSDK.js');
96
+ const result = useWidgetSDK();
97
+ expect(result.sdk).toBeDefined();
98
+ expect(typeof result.isReady).toBe('boolean');
99
+ expect(typeof result.setState).toBe('function');
100
+ expect(typeof result.getState).toBe('function');
101
+ expect(typeof result.callTool).toBe('function');
102
+ expect(typeof result.requestFullscreen).toBe('function');
103
+ expect(typeof result.requestInline).toBe('function');
104
+ expect(typeof result.requestPip).toBe('function');
105
+ expect(typeof result.requestDisplayMode).toBe('function');
106
+ expect(typeof result.requestClose).toBe('function');
107
+ });
108
+ it('should return data access methods', async () => {
109
+ const { useWidgetSDK } = await import('../useWidgetSDK.js');
110
+ const result = useWidgetSDK();
111
+ expect(typeof result.getToolInput).toBe('function');
112
+ expect(typeof result.getToolOutput).toBe('function');
113
+ expect(typeof result.getToolResponseMetadata).toBe('function');
114
+ expect(typeof result.getTheme).toBe('function');
115
+ expect(typeof result.getMaxHeight).toBe('function');
116
+ expect(typeof result.getDisplayMode).toBe('function');
117
+ expect(typeof result.getUserAgent).toBe('function');
118
+ expect(typeof result.getLocale).toBe('function');
119
+ expect(typeof result.getSafeArea).toBe('function');
120
+ });
121
+ it('should return navigation methods', async () => {
122
+ const { useWidgetSDK } = await import('../useWidgetSDK.js');
123
+ const result = useWidgetSDK();
124
+ expect(typeof result.openExternal).toBe('function');
125
+ expect(typeof result.sendFollowUpMessage).toBe('function');
126
+ });
127
+ });
128
+ });
129
+ //# sourceMappingURL=hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../../../../src/widgets/hooks/__tests__/hooks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-widget-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-widget-state.test.d.ts","sourceRoot":"","sources":["../../../../src/widgets/hooks/__tests__/use-widget-state.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { jest, describe, it, expect, beforeEach } from '@jest/globals';
2
+ // Mock React hooks
3
+ const mockUseSyncExternalStore = jest.fn();
4
+ const mockUseState = jest.fn();
5
+ const mockUseEffect = jest.fn();
6
+ const mockUseCallback = jest.fn();
7
+ jest.unstable_mockModule('react', () => ({
8
+ useSyncExternalStore: mockUseSyncExternalStore,
9
+ useState: mockUseState,
10
+ useEffect: mockUseEffect,
11
+ useCallback: mockUseCallback,
12
+ }));
13
+ // Mock window.openai
14
+ global.window = {
15
+ openai: {
16
+ widgetState: undefined,
17
+ setWidgetState: jest.fn(),
18
+ },
19
+ addEventListener: jest.fn(),
20
+ removeEventListener: jest.fn(),
21
+ };
22
+ describe('useWidgetState', () => {
23
+ beforeEach(() => {
24
+ jest.clearAllMocks();
25
+ // Mock useSyncExternalStore to return null (no widget state from window)
26
+ mockUseSyncExternalStore.mockImplementation(() => null);
27
+ // Mock useState with proper state management
28
+ mockUseState.mockImplementation((initializer) => {
29
+ const value = typeof initializer === 'function' ? initializer() : initializer;
30
+ return [value, jest.fn()];
31
+ });
32
+ // Mock useEffect to run synchronously
33
+ mockUseEffect.mockImplementation((effect) => {
34
+ effect();
35
+ });
36
+ // Mock useCallback to return the function directly
37
+ mockUseCallback.mockImplementation((fn) => fn);
38
+ });
39
+ it('should return default state', async () => {
40
+ const { useWidgetState } = await import('../use-widget-state.js');
41
+ const [state] = useWidgetState({ count: 0 });
42
+ expect(state).toEqual({ count: 0 });
43
+ });
44
+ it('should return state from function initializer', async () => {
45
+ const { useWidgetState } = await import('../use-widget-state.js');
46
+ const [state] = useWidgetState(() => ({ items: [] }));
47
+ expect(state).toEqual({ items: [] });
48
+ });
49
+ it('should return null when no default provided', async () => {
50
+ const { useWidgetState } = await import('../use-widget-state.js');
51
+ const [state] = useWidgetState(null);
52
+ expect(state).toBeNull();
53
+ });
54
+ it('should return widget state from window if available', async () => {
55
+ mockUseSyncExternalStore.mockImplementation(() => ({ savedData: 'value' }));
56
+ const { useWidgetState } = await import('../use-widget-state.js');
57
+ const [state] = useWidgetState({ default: 'value' });
58
+ expect(state).toEqual({ savedData: 'value' });
59
+ });
60
+ it('should return setState function', async () => {
61
+ const { useWidgetState } = await import('../use-widget-state.js');
62
+ const [, setState] = useWidgetState({ count: 0 });
63
+ expect(typeof setState).toBe('function');
64
+ });
65
+ });
66
+ //# sourceMappingURL=use-widget-state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-widget-state.test.js","sourceRoot":"","sources":["../../../../src/widgets/hooks/__tests__/use-widget-state.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=widget-polyfill.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-polyfill.test.d.ts","sourceRoot":"","sources":["../../../../src/widgets/runtime/__tests__/widget-polyfill.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { jest, describe, it, expect, beforeEach } from '@jest/globals';
2
+ describe('Widget Polyfill', () => {
3
+ let messageHandler = null;
4
+ beforeEach(() => {
5
+ // Reset
6
+ messageHandler = null;
7
+ global.window = {
8
+ addEventListener: jest.fn((event, handler) => {
9
+ if (event === 'message') {
10
+ messageHandler = handler;
11
+ }
12
+ }),
13
+ dispatchEvent: jest.fn(),
14
+ };
15
+ global.CustomEvent = jest.fn().mockImplementation((name) => ({ type: name }));
16
+ });
17
+ it('should be a module', async () => {
18
+ // Widget polyfill is an IIFE, we just need to check it can be loaded
19
+ // The actual functionality sets up window listeners
20
+ expect(true).toBe(true);
21
+ });
22
+ it('should handle NITRO_INJECT_OPENAI message', async () => {
23
+ // Manually simulate what the polyfill does
24
+ const mockOpenai = { theme: 'dark' };
25
+ const event = {
26
+ data: {
27
+ type: 'NITRO_INJECT_OPENAI',
28
+ openai: mockOpenai
29
+ }
30
+ };
31
+ // Set up window
32
+ global.window = {
33
+ addEventListener: jest.fn(),
34
+ dispatchEvent: jest.fn(),
35
+ openai: undefined,
36
+ };
37
+ // Simulate the message handler behavior
38
+ if (event.data?.type === 'NITRO_INJECT_OPENAI') {
39
+ window.openai = event.data.openai;
40
+ }
41
+ expect(window.openai).toEqual(mockOpenai);
42
+ });
43
+ it('should handle TOOL_OUTPUT message', async () => {
44
+ const mockData = { key: 'value' };
45
+ const event = {
46
+ data: {
47
+ type: 'TOOL_OUTPUT',
48
+ data: mockData
49
+ }
50
+ };
51
+ // Set up window with openai already set
52
+ global.window = {
53
+ addEventListener: jest.fn(),
54
+ dispatchEvent: jest.fn(),
55
+ openai: { toolOutput: undefined },
56
+ };
57
+ // Simulate the message handler behavior
58
+ if (event.data?.type === 'TOOL_OUTPUT' && event.data?.data) {
59
+ if (window.openai) {
60
+ window.openai.toolOutput = event.data.data;
61
+ }
62
+ }
63
+ expect(window.openai.toolOutput).toEqual(mockData);
64
+ });
65
+ });
66
+ //# sourceMappingURL=widget-polyfill.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-polyfill.test.js","sourceRoot":"","sources":["../../../../src/widgets/runtime/__tests__/widget-polyfill.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,IAAI,cAAc,GAAkC,IAAI,CAAC;IAEzD,UAAU,CAAC,GAAG,EAAE;QACZ,QAAQ;QACR,cAAc,GAAG,IAAI,CAAC;QACrB,MAAc,CAAC,MAAM,GAAG;YACrB,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAY,EAAE,EAAE;gBACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACtB,cAAc,GAAG,OAAO,CAAC;gBAC7B,CAAC;YACL,CAAC,CAAC;YACF,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;SAC3B,CAAC;QACD,MAAc,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAChC,qEAAqE;QACrE,oDAAoD;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACvD,2CAA2C;QAC3C,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG;YACV,IAAI,EAAE;gBACF,IAAI,EAAE,qBAAqB;gBAC3B,MAAM,EAAE,UAAU;aACrB;SACJ,CAAC;QAEF,gBAAgB;QACf,MAAc,CAAC,MAAM,GAAG;YACrB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC3B,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,SAAS;SACpB,CAAC;QAEF,wCAAwC;QACxC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC5C,MAAc,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,CAAC;QAED,MAAM,CAAE,MAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG;YACV,IAAI,EAAE;gBACF,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;aACjB;SACJ,CAAC;QAEF,wCAAwC;QACvC,MAAc,CAAC,MAAM,GAAG;YACrB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC3B,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SACpC,CAAC;QAEF,wCAAwC;QACxC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YACzD,IAAK,MAAc,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAc,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACxD,CAAC;QACL,CAAC;QAED,MAAM,CAAE,MAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nitrostack",
3
- "version": "1.0.73",
3
+ "version": "1.0.75",
4
4
  "description": "NitroStack - Build powerful MCP servers with TypeScript",
5
5
  "type": "module",
6
6
  "main": "dist/core/index.js",
@@ -87,6 +87,8 @@
87
87
  "zod-to-json-schema": "^3.24.6"
88
88
  },
89
89
  "devDependencies": {
90
+ "@testing-library/jest-dom": "^6.9.1",
91
+ "@testing-library/react": "^16.3.1",
90
92
  "@types/bcryptjs": "^2.4.6",
91
93
  "@types/better-sqlite3": "^7.6.12",
92
94
  "@types/cors": "^2.8.19",
@@ -100,6 +102,8 @@
100
102
  "@types/uuid": "^10.0.0",
101
103
  "@types/ws": "^8.18.1",
102
104
  "jest": "^29.7.0",
105
+ "react": "^19.2.3",
106
+ "react-dom": "^19.2.3",
103
107
  "ts-jest": "^29.2.5",
104
108
  "typescript": "^5.7.2"
105
109
  },
@@ -115,4 +119,4 @@
115
119
  "url": "https://github.com/abhishekpanditofficial/nitrostack/issues"
116
120
  },
117
121
  "homepage": "https://nitrostack.vercel.app"
118
- }
122
+ }
@@ -2181,6 +2181,27 @@ function ChatMessageComponent({ message, tools }: { message: ChatMessage; tools:
2181
2181
  if (message.role === 'tool') return null;
2182
2182
  const isUser = message.role === 'user';
2183
2183
 
2184
+ // Check if this message has any visible content to show
2185
+ const hasContent = !!message.content;
2186
+ const hasFile = !!message.file;
2187
+ const hasToolCalls = message.toolCalls && message.toolCalls.length > 0;
2188
+
2189
+ // Check if any tool call has a widget to display
2190
+ const hasVisibleWidgets = hasToolCalls && message.toolCalls?.some((tc: ToolCall) => {
2191
+ const tool = tools.find((t) => t.name === tc.name);
2192
+ const componentUri = tool?.widget?.route ||
2193
+ tool?.outputTemplate ||
2194
+ tool?._meta?.['openai/outputTemplate'] ||
2195
+ tool?._meta?.['ui/template'];
2196
+ return !!componentUri && !!(tc.result || tc.arguments);
2197
+ });
2198
+
2199
+ // For assistant messages with tool calls but no widgets and no content, skip rendering
2200
+ // This prevents the empty bubble from showing
2201
+ if (!isUser && !hasContent && !hasFile && hasToolCalls && !hasVisibleWidgets) {
2202
+ return null;
2203
+ }
2204
+
2184
2205
  return (
2185
2206
  <div className="flex gap-4 items-start animate-fade-in group">
2186
2207
  {!isUser && (
@@ -46,3 +46,4 @@ export class WidgetErrorBoundary extends Component<Props, State> {
46
46
  }
47
47
  }
48
48
 
49
+
@@ -3,3 +3,4 @@ export { OpsSummaryBar } from './OpsSummaryBar';
3
3
  export { OpsNodeDetailPanel } from './OpsNodeDetailPanel';
4
4
  export * from './nodes';
5
5
 
6
+