skybridge 0.0.0-dev.feb36b5 → 0.0.0-dev.fefabd5

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 (283) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +95 -76
  3. package/bin/run.js +5 -0
  4. package/dist/cli/header.d.ts +4 -0
  5. package/dist/cli/header.js +6 -0
  6. package/dist/cli/header.js.map +1 -0
  7. package/dist/cli/run-command.d.ts +2 -0
  8. package/dist/cli/run-command.js +43 -0
  9. package/dist/cli/run-command.js.map +1 -0
  10. package/dist/cli/telemetry.d.ts +7 -0
  11. package/dist/cli/telemetry.js +123 -0
  12. package/dist/cli/telemetry.js.map +1 -0
  13. package/dist/cli/use-execute-steps.d.ts +11 -0
  14. package/dist/cli/use-execute-steps.js +36 -0
  15. package/dist/cli/use-execute-steps.js.map +1 -0
  16. package/dist/cli/use-nodemon.d.ts +6 -0
  17. package/dist/cli/use-nodemon.js +69 -0
  18. package/dist/cli/use-nodemon.js.map +1 -0
  19. package/dist/cli/use-typescript-check.d.ts +8 -0
  20. package/dist/cli/use-typescript-check.js +59 -0
  21. package/dist/cli/use-typescript-check.js.map +1 -0
  22. package/dist/commands/build.d.ts +9 -0
  23. package/dist/commands/build.js +46 -0
  24. package/dist/commands/build.js.map +1 -0
  25. package/dist/commands/dev.d.ts +9 -0
  26. package/dist/commands/dev.js +31 -0
  27. package/dist/commands/dev.js.map +1 -0
  28. package/dist/commands/start.d.ts +7 -0
  29. package/dist/commands/start.js +28 -0
  30. package/dist/commands/start.js.map +1 -0
  31. package/dist/commands/telemetry/disable.d.ts +5 -0
  32. package/dist/commands/telemetry/disable.js +14 -0
  33. package/dist/commands/telemetry/disable.js.map +1 -0
  34. package/dist/commands/telemetry/enable.d.ts +5 -0
  35. package/dist/commands/telemetry/enable.js +14 -0
  36. package/dist/commands/telemetry/enable.js.map +1 -0
  37. package/dist/commands/telemetry/status.d.ts +5 -0
  38. package/dist/commands/telemetry/status.js +14 -0
  39. package/dist/commands/telemetry/status.js.map +1 -0
  40. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  41. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  42. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  43. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  44. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  45. package/dist/server/express.d.ts +9 -0
  46. package/dist/server/express.js +69 -0
  47. package/dist/server/express.js.map +1 -0
  48. package/dist/server/express.test.js +74 -0
  49. package/dist/server/express.test.js.map +1 -0
  50. package/dist/server/index.d.ts +4 -0
  51. package/dist/server/index.js.map +1 -0
  52. package/dist/server/inferUtilityTypes.d.ts +64 -0
  53. package/dist/server/inferUtilityTypes.js +2 -0
  54. package/dist/server/inferUtilityTypes.js.map +1 -0
  55. package/dist/server/server.d.ts +109 -0
  56. package/dist/server/server.js +194 -0
  57. package/dist/server/server.js.map +1 -0
  58. package/dist/{src/server → server}/templateHelper.d.ts +4 -0
  59. package/dist/{src/server → server}/templateHelper.js +5 -4
  60. package/dist/server/templateHelper.js.map +1 -0
  61. package/dist/server/templates/development.hbs +67 -0
  62. package/dist/{src/server → server}/templates/production.hbs +1 -1
  63. package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
  64. package/dist/server/widgetsDevServer.js +57 -0
  65. package/dist/server/widgetsDevServer.js.map +1 -0
  66. package/dist/test/utils.d.ts +355 -0
  67. package/dist/test/utils.js +242 -0
  68. package/dist/test/utils.js.map +1 -0
  69. package/dist/test/widget.test.d.ts +1 -0
  70. package/dist/test/widget.test.js +261 -0
  71. package/dist/test/widget.test.js.map +1 -0
  72. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  73. package/dist/web/bridges/apps-sdk/adaptor.js +80 -0
  74. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  75. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  76. package/dist/web/bridges/apps-sdk/bridge.js +46 -0
  77. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  78. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  79. package/dist/web/bridges/apps-sdk/index.js +5 -0
  80. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  81. package/dist/web/bridges/apps-sdk/types.d.ts +118 -0
  82. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  83. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  84. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +7 -0
  85. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  86. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  87. package/dist/web/bridges/get-adaptor.js +8 -0
  88. package/dist/web/bridges/get-adaptor.js.map +1 -0
  89. package/dist/web/bridges/index.d.ts +5 -0
  90. package/dist/web/bridges/index.js +6 -0
  91. package/dist/web/bridges/index.js.map +1 -0
  92. package/dist/web/bridges/mcp-app/adaptor.d.ts +36 -0
  93. package/dist/web/bridges/mcp-app/adaptor.js +190 -0
  94. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  95. package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
  96. package/dist/web/bridges/mcp-app/bridge.js +255 -0
  97. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  98. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  99. package/dist/web/bridges/mcp-app/index.js +4 -0
  100. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  101. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  102. package/dist/web/bridges/mcp-app/types.js +2 -0
  103. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  104. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
  105. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  106. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  107. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  108. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +66 -0
  109. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  110. package/dist/web/bridges/types.d.ts +98 -0
  111. package/dist/web/bridges/types.js +2 -0
  112. package/dist/web/bridges/types.js.map +1 -0
  113. package/dist/web/bridges/use-host-context.d.ts +2 -0
  114. package/dist/web/bridges/use-host-context.js +8 -0
  115. package/dist/web/bridges/use-host-context.js.map +1 -0
  116. package/dist/web/components/modal-provider.d.ts +4 -0
  117. package/dist/web/components/modal-provider.js +47 -0
  118. package/dist/web/components/modal-provider.js.map +1 -0
  119. package/dist/web/create-store.d.ts +3 -0
  120. package/dist/web/create-store.js +24 -0
  121. package/dist/web/create-store.js.map +1 -0
  122. package/dist/web/create-store.test.d.ts +1 -0
  123. package/dist/web/create-store.test.js +126 -0
  124. package/dist/web/create-store.test.js.map +1 -0
  125. package/dist/web/data-llm.d.ts +14 -0
  126. package/dist/web/data-llm.js +72 -0
  127. package/dist/web/data-llm.js.map +1 -0
  128. package/dist/web/data-llm.test.d.ts +1 -0
  129. package/dist/web/data-llm.test.js +141 -0
  130. package/dist/web/data-llm.test.js.map +1 -0
  131. package/dist/web/generate-helpers.d.ts +116 -0
  132. package/dist/web/generate-helpers.js +111 -0
  133. package/dist/web/generate-helpers.js.map +1 -0
  134. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  135. package/dist/web/generate-helpers.test-d.js +209 -0
  136. package/dist/web/generate-helpers.test-d.js.map +1 -0
  137. package/dist/web/generate-helpers.test.d.ts +1 -0
  138. package/dist/web/generate-helpers.test.js +17 -0
  139. package/dist/web/generate-helpers.test.js.map +1 -0
  140. package/dist/web/helpers/state.d.ts +7 -0
  141. package/dist/web/helpers/state.js +45 -0
  142. package/dist/web/helpers/state.js.map +1 -0
  143. package/dist/web/helpers/state.test.d.ts +1 -0
  144. package/dist/web/helpers/state.test.js +53 -0
  145. package/dist/web/helpers/state.test.js.map +1 -0
  146. package/dist/web/hooks/index.d.ts +11 -0
  147. package/dist/web/hooks/index.js +12 -0
  148. package/dist/web/hooks/index.js.map +1 -0
  149. package/dist/web/hooks/test/utils.d.ts +16 -0
  150. package/dist/web/hooks/test/utils.js +60 -0
  151. package/dist/web/hooks/test/utils.js.map +1 -0
  152. package/dist/web/hooks/use-call-tool.d.ts +101 -0
  153. package/dist/web/hooks/use-call-tool.js +68 -0
  154. package/dist/web/hooks/use-call-tool.js.map +1 -0
  155. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  156. package/dist/web/hooks/use-call-tool.test-d.js +104 -0
  157. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  158. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  159. package/dist/web/hooks/use-call-tool.test.js +190 -0
  160. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  161. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  162. package/dist/web/hooks/use-display-mode.js +9 -0
  163. package/dist/web/hooks/use-display-mode.js.map +1 -0
  164. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  165. package/dist/web/hooks/use-display-mode.test.js +41 -0
  166. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  167. package/dist/web/hooks/use-files.d.ts +6 -0
  168. package/dist/web/hooks/use-files.js +9 -0
  169. package/dist/web/hooks/use-files.js.map +1 -0
  170. package/dist/web/hooks/use-files.test.d.ts +1 -0
  171. package/dist/web/hooks/use-files.test.js +34 -0
  172. package/dist/web/hooks/use-files.test.js.map +1 -0
  173. package/dist/web/hooks/use-layout.d.ts +22 -0
  174. package/dist/web/hooks/use-layout.js +23 -0
  175. package/dist/web/hooks/use-layout.js.map +1 -0
  176. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  177. package/dist/web/hooks/use-layout.test.js +96 -0
  178. package/dist/web/hooks/use-layout.test.js.map +1 -0
  179. package/dist/web/hooks/use-open-external.d.ts +1 -0
  180. package/dist/web/hooks/use-open-external.js +8 -0
  181. package/dist/web/hooks/use-open-external.js.map +1 -0
  182. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  183. package/dist/web/hooks/use-open-external.test.js +50 -0
  184. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  185. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  186. package/dist/web/hooks/use-request-modal.js +16 -0
  187. package/dist/web/hooks/use-request-modal.js.map +1 -0
  188. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  189. package/dist/web/hooks/use-request-modal.test.js +57 -0
  190. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  191. package/dist/web/hooks/use-send-follow-up-message.d.ts +1 -0
  192. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  193. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  194. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  195. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  196. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  197. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  198. package/dist/web/hooks/use-set-open-in-app-url.test.js +49 -0
  199. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  200. package/dist/web/hooks/use-tool-info.d.ts +36 -0
  201. package/dist/web/hooks/use-tool-info.js +26 -0
  202. package/dist/web/hooks/use-tool-info.js.map +1 -0
  203. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  204. package/dist/web/hooks/use-tool-info.test-d.js +109 -0
  205. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  206. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  207. package/dist/web/hooks/use-tool-info.test.js +130 -0
  208. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  209. package/dist/web/hooks/use-user.d.ts +18 -0
  210. package/dist/web/hooks/use-user.js +19 -0
  211. package/dist/web/hooks/use-user.js.map +1 -0
  212. package/dist/web/hooks/use-user.test.d.ts +1 -0
  213. package/dist/web/hooks/use-user.test.js +94 -0
  214. package/dist/web/hooks/use-user.test.js.map +1 -0
  215. package/dist/web/hooks/use-widget-state.d.ts +4 -0
  216. package/dist/web/hooks/use-widget-state.js +32 -0
  217. package/dist/web/hooks/use-widget-state.js.map +1 -0
  218. package/dist/web/hooks/use-widget-state.test.d.ts +1 -0
  219. package/dist/web/hooks/use-widget-state.test.js +62 -0
  220. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  221. package/dist/web/index.d.ts +8 -0
  222. package/dist/web/index.js +9 -0
  223. package/dist/web/index.js.map +1 -0
  224. package/dist/web/mount-widget.js +27 -0
  225. package/dist/web/mount-widget.js.map +1 -0
  226. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  227. package/dist/web/plugin/data-llm.test.js +81 -0
  228. package/dist/web/plugin/data-llm.test.js.map +1 -0
  229. package/dist/web/plugin/plugin.js +46 -0
  230. package/dist/web/plugin/plugin.js.map +1 -0
  231. package/dist/web/plugin/transform-data-llm.d.ts +12 -0
  232. package/dist/web/plugin/transform-data-llm.js +96 -0
  233. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  234. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  235. package/dist/web/plugin/transform-data-llm.test.js +81 -0
  236. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  237. package/dist/web/proxy.d.ts +1 -0
  238. package/dist/web/proxy.js +52 -0
  239. package/dist/web/proxy.js.map +1 -0
  240. package/dist/web/types.d.ts +16 -0
  241. package/dist/web/types.js +2 -0
  242. package/dist/web/types.js.map +1 -0
  243. package/package.json +67 -28
  244. package/dist/src/server/index.d.ts +0 -2
  245. package/dist/src/server/index.js.map +0 -1
  246. package/dist/src/server/server.d.ts +0 -13
  247. package/dist/src/server/server.js +0 -54
  248. package/dist/src/server/server.js.map +0 -1
  249. package/dist/src/server/templateHelper.js.map +0 -1
  250. package/dist/src/server/templates/development.hbs +0 -12
  251. package/dist/src/server/widgetsDevServer.js +0 -39
  252. package/dist/src/server/widgetsDevServer.js.map +0 -1
  253. package/dist/src/test/setup.js +0 -9
  254. package/dist/src/test/setup.js.map +0 -1
  255. package/dist/src/test/utils.d.ts +0 -28
  256. package/dist/src/test/utils.js +0 -43
  257. package/dist/src/test/utils.js.map +0 -1
  258. package/dist/src/test/widget.test.js +0 -76
  259. package/dist/src/test/widget.test.js.map +0 -1
  260. package/dist/src/web/index.d.ts +0 -5
  261. package/dist/src/web/index.js +0 -6
  262. package/dist/src/web/index.js.map +0 -1
  263. package/dist/src/web/mount-widget.js +0 -14
  264. package/dist/src/web/mount-widget.js.map +0 -1
  265. package/dist/src/web/plugin.js +0 -28
  266. package/dist/src/web/plugin.js.map +0 -1
  267. package/dist/src/web/types.d.ts +0 -95
  268. package/dist/src/web/types.js.map +0 -1
  269. package/dist/src/web/use-openai-global.d.ts +0 -2
  270. package/dist/src/web/use-openai-global.js +0 -21
  271. package/dist/src/web/use-openai-global.js.map +0 -1
  272. package/dist/src/web/use-tool-output.d.ts +0 -3
  273. package/dist/src/web/use-tool-output.js +0 -5
  274. package/dist/src/web/use-tool-output.js.map +0 -1
  275. package/dist/vitest.config.d.ts +0 -2
  276. package/dist/vitest.config.js +0 -9
  277. package/dist/vitest.config.js.map +0 -1
  278. /package/dist/{src/test/setup.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  279. /package/dist/{src/test/widget.test.d.ts → server/express.test.d.ts} +0 -0
  280. /package/dist/{src/server → server}/index.js +0 -0
  281. /package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -0
  282. /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
  283. /package/dist/{src/web → web/plugin}/plugin.d.ts +0 -0
@@ -0,0 +1,45 @@
1
+ import superjson, {} from "superjson";
2
+ import { getAdaptor } from "../bridges/index.js";
3
+ import { WIDGET_CONTEXT_KEY } from "../data-llm.js";
4
+ export function filterWidgetContext(state) {
5
+ if (state === null || state === undefined) {
6
+ return null;
7
+ }
8
+ const { [WIDGET_CONTEXT_KEY]: _, ...filteredState } = state;
9
+ return filteredState;
10
+ }
11
+ export function injectWidgetContext(newState) {
12
+ if (newState === null) {
13
+ return null;
14
+ }
15
+ const currentState = getAdaptor()
16
+ .getHostContextStore("widgetState")
17
+ .getSnapshot();
18
+ if (currentState !== null &&
19
+ currentState !== undefined &&
20
+ WIDGET_CONTEXT_KEY in currentState) {
21
+ return {
22
+ ...newState,
23
+ [WIDGET_CONTEXT_KEY]: currentState[WIDGET_CONTEXT_KEY],
24
+ };
25
+ }
26
+ return newState;
27
+ }
28
+ export function serializeState(value) {
29
+ return superjson.parse(superjson.stringify(value)); // Strips functions
30
+ }
31
+ export function deserializeState(value) {
32
+ return superjson.deserialize(value);
33
+ }
34
+ export function getInitialState(defaultState) {
35
+ const widgetState = getAdaptor()
36
+ .getHostContextStore("widgetState")
37
+ .getSnapshot();
38
+ if (widgetState !== null && widgetState !== undefined) {
39
+ return filterWidgetContext(widgetState);
40
+ }
41
+ return typeof defaultState === "function"
42
+ ? defaultState()
43
+ : (defaultState ?? null);
44
+ }
45
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/web/helpers/state.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAwB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,UAAU,mBAAmB,CACjC,KAAgB;IAEhB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,KAErD,CAAC;IAEF,OAAO,aAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAkB;IAElB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,EAAE;SAC9B,mBAAmB,CAAC,aAAa,CAAC;SAClC,WAAW,EAAqD,CAAC;IAEpE,IACE,YAAY,KAAK,IAAI;QACrB,YAAY,KAAK,SAAS;QAC1B,kBAAkB,IAAI,YAAY,EAClC,CAAC;QACD,OAAO;YACL,GAAG,QAAQ;YACX,CAAC,kBAAkB,CAAC,EAAE,YAAY,CAAC,kBAAkB,CAAC;SAClD,CAAC;IACT,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB;AACzE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,YAAoC;IAEpC,MAAM,WAAW,GAAG,UAAU,EAAE;SAC7B,mBAAmB,CAAC,aAAa,CAAC;SAClC,WAAW,EAAkB,CAAC;IAEjC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,YAAY,KAAK,UAAU;QACvC,CAAC,CAAC,YAAY,EAAE;QAChB,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { WIDGET_CONTEXT_KEY } from "../data-llm.js";
3
+ import { filterWidgetContext, serializeState } from "./state.js";
4
+ describe("state helpers", () => {
5
+ describe("filterWidgetContext", () => {
6
+ it("should return null when state is null", () => {
7
+ expect(filterWidgetContext(null)).toBe(null);
8
+ });
9
+ it("should return null when state is undefined", () => {
10
+ expect(filterWidgetContext(undefined)).toBe(null);
11
+ });
12
+ it("should correctly filter WIDGET_CONTEXT_KEY and preserve other properties", () => {
13
+ const stateWithContextAndOthers = {
14
+ a: 1,
15
+ b: "two",
16
+ c: { nested: true },
17
+ [WIDGET_CONTEXT_KEY]: "context",
18
+ };
19
+ const filteredWithContextAndOthers = filterWidgetContext(stateWithContextAndOthers);
20
+ expect(filteredWithContextAndOthers).toEqual({
21
+ a: 1,
22
+ b: "two",
23
+ c: { nested: true },
24
+ });
25
+ const stateNoContext = { count: 5, name: "test" };
26
+ const filteredNoContext = filterWidgetContext(stateNoContext);
27
+ expect(filteredNoContext).toEqual(stateNoContext);
28
+ });
29
+ });
30
+ describe("serializeState", () => {
31
+ it("should serialize plain objects", () => {
32
+ const array = [1, "two", { three: 3 }];
33
+ const date = new Date("2023-01-01T00:00:00Z");
34
+ const object = {
35
+ a: 1,
36
+ b: "test",
37
+ c: true,
38
+ array,
39
+ date,
40
+ function: () => "test",
41
+ };
42
+ const result = serializeState(object);
43
+ expect(result).toEqual({
44
+ a: 1,
45
+ b: "test",
46
+ c: true,
47
+ array: [1, "two", { three: 3 }],
48
+ date: new Date("2023-01-01T00:00:00.000Z"),
49
+ });
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../../src/web/helpers/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,yBAAyB,GAAG;gBAChC,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACnB,CAAC,kBAAkB,CAAC,EAAE,SAAS;aAChC,CAAC;YACF,MAAM,4BAA4B,GAAG,mBAAmB,CACtD,yBAAyB,CAC1B,CAAC;YACF,MAAM,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC;gBAC3C,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;aACpB,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAClD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG;gBACb,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE,IAAI;gBACP,KAAK;gBACL,IAAI;gBACJ,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;aACvB,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE,IAAI;gBACP,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC/B,IAAI,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { type CallToolAsyncFn, type CallToolFn, type CallToolState, type SideEffects, useCallTool, } from "./use-call-tool.js";
2
+ export { useDisplayMode } from "./use-display-mode.js";
3
+ export { useFiles } from "./use-files.js";
4
+ export { type LayoutState, useLayout } from "./use-layout.js";
5
+ export { useOpenExternal } from "./use-open-external.js";
6
+ export { useRequestModal } from "./use-request-modal.js";
7
+ export { useSendFollowUpMessage } from "./use-send-follow-up-message.js";
8
+ export { useSetOpenInAppUrl } from "./use-set-open-in-app-url.js";
9
+ export { useToolInfo } from "./use-tool-info.js";
10
+ export { type UserState, useUser } from "./use-user.js";
11
+ export { useWidgetState } from "./use-widget-state.js";
@@ -0,0 +1,12 @@
1
+ export { useCallTool, } from "./use-call-tool.js";
2
+ export { useDisplayMode } from "./use-display-mode.js";
3
+ export { useFiles } from "./use-files.js";
4
+ export { useLayout } from "./use-layout.js";
5
+ export { useOpenExternal } from "./use-open-external.js";
6
+ export { useRequestModal } from "./use-request-modal.js";
7
+ export { useSendFollowUpMessage } from "./use-send-follow-up-message.js";
8
+ export { useSetOpenInAppUrl } from "./use-set-open-in-app-url.js";
9
+ export { useToolInfo } from "./use-tool-info.js";
10
+ export { useUser } from "./use-user.js";
11
+ export { useWidgetState } from "./use-widget-state.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAoB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAkB,OAAO,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { McpUiHostContext, McpUiToolResultNotification } from "@modelcontextprotocol/ext-apps";
2
+ export declare class MockResizeObserver {
3
+ observe(): void;
4
+ unobserve(): void;
5
+ disconnect(): void;
6
+ }
7
+ export declare const getMcpAppHostPostMessageMock: (initialContext?: McpUiHostContext) => import("vitest").Mock<(message: {
8
+ method: string;
9
+ id: number;
10
+ }) => void>;
11
+ export declare const fireToolInputNotification: (args: Record<string, unknown>) => void;
12
+ export declare const fireToolResultNotification: (params: {
13
+ content: McpUiToolResultNotification["params"]["content"];
14
+ structuredContent: Record<string, unknown>;
15
+ _meta?: Record<string, unknown>;
16
+ }) => void;
@@ -0,0 +1,60 @@
1
+ import { fireEvent } from "@testing-library/react";
2
+ import { act } from "react";
3
+ import { vi } from "vitest";
4
+ export class MockResizeObserver {
5
+ observe() { }
6
+ unobserve() { }
7
+ disconnect() { }
8
+ }
9
+ const DEFAULT_CONTEXT = {};
10
+ export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT) => vi.fn((message) => {
11
+ switch (message.method) {
12
+ case "ui/initialize": {
13
+ const result = {
14
+ protocolVersion: "2025-06-18",
15
+ hostInfo: { name: "test-host", version: "1.0.0" },
16
+ hostCapabilities: {},
17
+ hostContext: initialContext,
18
+ };
19
+ act(() => fireEvent(window, new MessageEvent("message", {
20
+ data: {
21
+ jsonrpc: "2.0",
22
+ id: message.id,
23
+ result,
24
+ },
25
+ })));
26
+ break;
27
+ }
28
+ case "ui/update-model-context": {
29
+ act(() => fireEvent(window, new MessageEvent("message", {
30
+ data: {
31
+ jsonrpc: "2.0",
32
+ id: message.id,
33
+ result: {},
34
+ },
35
+ })));
36
+ break;
37
+ }
38
+ }
39
+ });
40
+ export const fireToolInputNotification = (args) => {
41
+ fireEvent(window, new MessageEvent("message", {
42
+ data: {
43
+ jsonrpc: "2.0",
44
+ method: "ui/notifications/tool-input",
45
+ params: {
46
+ arguments: args,
47
+ },
48
+ },
49
+ }));
50
+ };
51
+ export const fireToolResultNotification = (params) => {
52
+ fireEvent(window, new MessageEvent("message", {
53
+ data: {
54
+ jsonrpc: "2.0",
55
+ method: "ui/notifications/tool-result",
56
+ params,
57
+ },
58
+ }));
59
+ };
60
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,kBAAkB;IAC7B,OAAO,KAAU,CAAC;IAClB,SAAS,KAAU,CAAC;IACpB,UAAU,KAAU,CAAC;CACtB;AAED,MAAM,eAAe,GAAqB,EAAE,CAAC;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,iBAAmC,eAAe,EAClD,EAAE,CACF,EAAE,CAAC,EAAE,CAAC,CAAC,OAAuC,EAAE,EAAE;IAChD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,MAAM,GAA0B;gBACpC,eAAe,EAAE,YAAY;gBAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;gBACjD,gBAAgB,EAAE,EAAE;gBACpB,WAAW,EAAE,cAAc;aAC5B,CAAC;YACF,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAIb,SAAS,EAAE;gBACZ,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM;iBACP;aACF,CAAC,CACH,CACF,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC/B,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;gBACE,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,EAAE;iBACX;aACF,CACF,CACF,CACF,CAAC;YACF,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAA6B,EAAE,EAAE;IACzE,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI;aAChB;SACF;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAI1C,EAAE,EAAE;IACH,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,8BAA8B;YACtC,MAAM;SACP;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { type CallToolArgs, type CallToolResponse } from "../bridges/index.js";
2
+ import type { HasRequiredKeys } from "../types.js";
3
+ type CallToolIdleState = {
4
+ status: "idle";
5
+ isIdle: true;
6
+ isPending: false;
7
+ isSuccess: false;
8
+ isError: false;
9
+ data: undefined;
10
+ error: undefined;
11
+ };
12
+ type CallToolPendingState = {
13
+ status: "pending";
14
+ isIdle: false;
15
+ isPending: true;
16
+ isSuccess: false;
17
+ isError: false;
18
+ data: undefined;
19
+ error: undefined;
20
+ };
21
+ type CallToolSuccessState<TData extends CallToolResponse = CallToolResponse> = {
22
+ status: "success";
23
+ isIdle: false;
24
+ isPending: false;
25
+ isSuccess: true;
26
+ isError: false;
27
+ data: TData;
28
+ error: undefined;
29
+ };
30
+ type CallToolErrorState = {
31
+ status: "error";
32
+ isIdle: false;
33
+ isPending: false;
34
+ isSuccess: false;
35
+ isError: true;
36
+ data: undefined;
37
+ error: unknown;
38
+ };
39
+ export type CallToolState<TData extends CallToolResponse = CallToolResponse> = CallToolIdleState | CallToolPendingState | CallToolSuccessState<TData> | CallToolErrorState;
40
+ export type SideEffects<ToolArgs, ToolResponse> = {
41
+ onSuccess?: (data: ToolResponse, toolArgs: ToolArgs) => void;
42
+ onError?: (error: unknown, toolArgs: ToolArgs) => void;
43
+ onSettled?: (data: ToolResponse | undefined, error: unknown | undefined, toolArgs: ToolArgs) => void;
44
+ };
45
+ type IsArgsOptional<T> = [T] extends [null] ? true : HasRequiredKeys<T> extends false ? true : false;
46
+ export type CallToolFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
47
+ (): void;
48
+ (sideEffects: SideEffects<TArgs, TResponse>): void;
49
+ (args: TArgs): void;
50
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
51
+ } : {
52
+ (args: TArgs): void;
53
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
54
+ };
55
+ export type CallToolAsyncFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
56
+ (): Promise<TResponse>;
57
+ (args: TArgs): Promise<TResponse>;
58
+ } : (args: TArgs) => Promise<TResponse>;
59
+ type ToolResponseSignature = Pick<CallToolResponse, "structuredContent" | "meta">;
60
+ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>>(name: string) => {
61
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
62
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
63
+ status: "idle";
64
+ isIdle: true;
65
+ isPending: false;
66
+ isSuccess: false;
67
+ isError: false;
68
+ data: undefined;
69
+ error: undefined;
70
+ } | {
71
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
72
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
73
+ status: "pending";
74
+ isIdle: false;
75
+ isPending: true;
76
+ isSuccess: false;
77
+ isError: false;
78
+ data: undefined;
79
+ error: undefined;
80
+ } | {
81
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
82
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
83
+ status: "error";
84
+ isIdle: false;
85
+ isPending: false;
86
+ isSuccess: false;
87
+ isError: true;
88
+ data: undefined;
89
+ error: unknown;
90
+ } | {
91
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
92
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
93
+ status: "success";
94
+ isIdle: false;
95
+ isPending: false;
96
+ isSuccess: true;
97
+ isError: false;
98
+ data: CallToolResponse & ToolResponse;
99
+ error: undefined;
100
+ };
101
+ export {};
@@ -0,0 +1,68 @@
1
+ import { useRef, useState } from "react";
2
+ import { getAdaptor, } from "../bridges/index.js";
3
+ export const useCallTool = (name) => {
4
+ const [{ status, data, error }, setCallToolState] = useState({ status: "idle", data: undefined, error: undefined });
5
+ const callIdRef = useRef(0);
6
+ const adaptor = getAdaptor();
7
+ const execute = async (toolArgs) => {
8
+ const callId = ++callIdRef.current;
9
+ setCallToolState({ status: "pending", data: undefined, error: undefined });
10
+ try {
11
+ const data = await adaptor.callTool(name, toolArgs);
12
+ if (callId === callIdRef.current) {
13
+ setCallToolState({ status: "success", data, error: undefined });
14
+ }
15
+ return data;
16
+ }
17
+ catch (error) {
18
+ if (callId === callIdRef.current) {
19
+ setCallToolState({ status: "error", data: undefined, error });
20
+ }
21
+ throw error;
22
+ }
23
+ };
24
+ const callToolAsync = ((toolArgs) => {
25
+ if (toolArgs === undefined) {
26
+ return execute(null);
27
+ }
28
+ return execute(toolArgs);
29
+ });
30
+ const callTool = ((firstArg, sideEffects) => {
31
+ let toolArgs;
32
+ if (firstArg &&
33
+ typeof firstArg === "object" &&
34
+ ("onSuccess" in firstArg ||
35
+ "onError" in firstArg ||
36
+ "onSettled" in firstArg)) {
37
+ toolArgs = null; // no toolArgs provided
38
+ sideEffects = firstArg;
39
+ }
40
+ else {
41
+ toolArgs = (firstArg === undefined ? null : firstArg);
42
+ }
43
+ execute(toolArgs)
44
+ .then((data) => {
45
+ sideEffects?.onSuccess?.(data, toolArgs);
46
+ sideEffects?.onSettled?.(data, undefined, toolArgs);
47
+ })
48
+ .catch((error) => {
49
+ sideEffects?.onError?.(error, toolArgs);
50
+ sideEffects?.onSettled?.(undefined, error, toolArgs);
51
+ });
52
+ });
53
+ const callToolState = {
54
+ status,
55
+ data,
56
+ error,
57
+ isIdle: status === "idle",
58
+ isPending: status === "pending",
59
+ isSuccess: status === "success",
60
+ isError: status === "error",
61
+ };
62
+ return {
63
+ ...callToolState,
64
+ callTool,
65
+ callToolAsync,
66
+ };
67
+ };
68
+ //# sourceMappingURL=use-call-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-call-tool.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
1
+ import { expectTypeOf, test } from "vitest";
2
+ import { useCallTool, } from "./use-call-tool.js";
3
+ test("callTool can be called without args when ToolArgs is null", () => {
4
+ const { callTool, callToolAsync } = useCallTool("test-tool");
5
+ callTool();
6
+ callTool({ onSuccess: () => { } });
7
+ callToolAsync();
8
+ });
9
+ test("callTool requires args when ToolArgs has required properties", () => {
10
+ const { callTool, callToolAsync } = useCallTool("test-tool");
11
+ // @ts-expect-error - query is required
12
+ callTool();
13
+ callTool({ query: "test" });
14
+ callTool({ query: "test" }, { onSuccess: () => { } });
15
+ // @ts-expect-error - query is required
16
+ callToolAsync();
17
+ callToolAsync({ query: "test" });
18
+ });
19
+ test("callTool supports sideEffects with correct types", () => {
20
+ const { callTool } = useCallTool("test-tool");
21
+ callTool({ id: 1 }, {
22
+ onSuccess: (data, args) => {
23
+ expectTypeOf(data.structuredContent.result).toBeString();
24
+ expectTypeOf(args.id).toBeNumber();
25
+ },
26
+ onError: (error, args) => {
27
+ expectTypeOf(error).toBeUnknown();
28
+ expectTypeOf(args.id).toBeNumber();
29
+ },
30
+ onSettled: (data, error, args) => {
31
+ if (data) {
32
+ expectTypeOf(data.structuredContent.result).toBeString();
33
+ }
34
+ expectTypeOf(error).toEqualTypeOf();
35
+ expectTypeOf(args.id).toBeNumber();
36
+ },
37
+ });
38
+ });
39
+ test("callTool allows sideEffects as first arg when ToolArgs is null", () => {
40
+ const { callTool } = useCallTool("test-tool");
41
+ callTool({
42
+ onSuccess: (data) => {
43
+ expectTypeOf(data.structuredContent.value).toBeNumber();
44
+ },
45
+ });
46
+ });
47
+ test("callToolAsync returns correctly typed promise", () => {
48
+ const { callToolAsync } = useCallTool("test-tool");
49
+ const promise = callToolAsync({ name: "test" });
50
+ expectTypeOf(promise).resolves.toHaveProperty("structuredContent");
51
+ expectTypeOf(promise).resolves.toHaveProperty("meta");
52
+ });
53
+ test("state narrowing works correctly with status", () => {
54
+ const result = useCallTool("test-tool");
55
+ if (result.status === "idle") {
56
+ expectTypeOf(result.isIdle).toEqualTypeOf();
57
+ expectTypeOf(result.data).toEqualTypeOf();
58
+ }
59
+ if (result.status === "pending") {
60
+ expectTypeOf(result.isPending).toEqualTypeOf();
61
+ expectTypeOf(result.data).toEqualTypeOf();
62
+ }
63
+ if (result.status === "success") {
64
+ expectTypeOf(result.isSuccess).toEqualTypeOf();
65
+ expectTypeOf(result.data).not.toEqualTypeOf();
66
+ expectTypeOf(result.data.structuredContent.data).toBeString();
67
+ }
68
+ if (result.status === "error") {
69
+ expectTypeOf(result.isError).toEqualTypeOf();
70
+ expectTypeOf(result.error).toBeUnknown();
71
+ }
72
+ });
73
+ test("state narrowing works correctly with boolean flags", () => {
74
+ const result = useCallTool("test-tool");
75
+ if (result.isIdle) {
76
+ expectTypeOf(result.status).toEqualTypeOf();
77
+ }
78
+ if (result.isPending) {
79
+ expectTypeOf(result.status).toEqualTypeOf();
80
+ }
81
+ if (result.isSuccess) {
82
+ expectTypeOf(result.status).toEqualTypeOf();
83
+ expectTypeOf(result.data.structuredContent.items).toBeArray();
84
+ }
85
+ if (result.isError) {
86
+ expectTypeOf(result.status).toEqualTypeOf();
87
+ }
88
+ });
89
+ test("CallToolState type is correctly exported and usable", () => {
90
+ const state = {};
91
+ if (state.status === "success") {
92
+ expectTypeOf(state.data.structuredContent.foo).toBeString();
93
+ }
94
+ });
95
+ test("SideEffects type is correctly exported and usable", () => {
96
+ const sideEffects = {
97
+ onSuccess: (data, args) => {
98
+ expectTypeOf(data.structuredContent.y).toBeString();
99
+ expectTypeOf(args.x).toBeNumber();
100
+ },
101
+ };
102
+ expectTypeOf(sideEffects).toHaveProperty("onSuccess");
103
+ });
104
+ //# sourceMappingURL=use-call-tool.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-call-tool.test-d.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.test-d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};