@apollo/client-ai-apps 0.3.3 → 0.5.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 (404) hide show
  1. package/.github/CODEOWNERS +1 -0
  2. package/.github/workflows/pr.yaml +23 -1
  3. package/.github/workflows/release.yaml +1 -5
  4. package/.github/workflows/verify-changeset.yml +112 -21
  5. package/CHANGELOG.md +416 -0
  6. package/__mocks__/fs/promises.cjs +3 -0
  7. package/__mocks__/fs.cjs +3 -0
  8. package/dist/config/defineConfig.d.ts +26 -0
  9. package/dist/config/defineConfig.d.ts.map +1 -0
  10. package/dist/config/defineConfig.js +7 -0
  11. package/dist/config/defineConfig.js.map +1 -0
  12. package/dist/config/index.d.ts +3 -0
  13. package/dist/config/index.d.ts.map +1 -0
  14. package/dist/config/index.js +2 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/config/schema.d.ts +29 -0
  17. package/dist/config/schema.d.ts.map +1 -0
  18. package/dist/config/schema.js +51 -0
  19. package/dist/config/schema.js.map +1 -0
  20. package/dist/config/types.d.ts +7 -0
  21. package/dist/config/types.d.ts.map +1 -0
  22. package/dist/config/types.js +2 -0
  23. package/dist/config/types.js.map +1 -0
  24. package/dist/core/ApolloClient.d.ts +4 -3
  25. package/dist/core/ApolloClient.d.ts.map +1 -1
  26. package/dist/core/ApolloClient.js +6 -59
  27. package/dist/core/ApolloClient.js.map +1 -1
  28. package/dist/core/Platform.d.ts +8 -0
  29. package/dist/core/Platform.d.ts.map +1 -0
  30. package/dist/core/Platform.js +20 -0
  31. package/dist/core/Platform.js.map +1 -0
  32. package/dist/core/types.d.ts +13 -0
  33. package/dist/core/types.d.ts.map +1 -0
  34. package/dist/core/types.js +2 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/index.d.ts +2 -16
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -14
  39. package/dist/index.js.map +1 -1
  40. package/dist/index.mcp.d.ts +5 -0
  41. package/dist/index.mcp.d.ts.map +1 -0
  42. package/dist/index.mcp.js +5 -0
  43. package/dist/index.mcp.js.map +1 -0
  44. package/dist/index.openai.d.ts +5 -0
  45. package/dist/index.openai.d.ts.map +1 -0
  46. package/dist/index.openai.js +5 -0
  47. package/dist/index.openai.js.map +1 -0
  48. package/dist/link/ToolCallLink.d.ts +3 -3
  49. package/dist/link/ToolCallLink.d.ts.map +1 -1
  50. package/dist/link/ToolCallLink.js +5 -14
  51. package/dist/link/ToolCallLink.js.map +1 -1
  52. package/dist/mcp/core/ApolloClient.d.ts +21 -0
  53. package/dist/mcp/core/ApolloClient.d.ts.map +1 -0
  54. package/dist/mcp/core/ApolloClient.js +65 -0
  55. package/dist/mcp/core/ApolloClient.js.map +1 -0
  56. package/dist/mcp/core/McpAppManager.d.ts +34 -0
  57. package/dist/mcp/core/McpAppManager.d.ts.map +1 -0
  58. package/dist/mcp/core/McpAppManager.js +63 -0
  59. package/dist/mcp/core/McpAppManager.js.map +1 -0
  60. package/dist/mcp/core/Platform.d.ts +8 -0
  61. package/dist/mcp/core/Platform.d.ts.map +1 -0
  62. package/dist/mcp/core/Platform.js +8 -0
  63. package/dist/mcp/core/Platform.js.map +1 -0
  64. package/dist/mcp/index.d.ts +3 -0
  65. package/dist/mcp/index.d.ts.map +1 -0
  66. package/dist/mcp/index.js +3 -0
  67. package/dist/mcp/index.js.map +1 -0
  68. package/dist/mcp/link/ToolCallLink.d.ts +28 -0
  69. package/dist/mcp/link/ToolCallLink.d.ts.map +1 -0
  70. package/dist/mcp/link/ToolCallLink.js +35 -0
  71. package/dist/mcp/link/ToolCallLink.js.map +1 -0
  72. package/dist/mcp/react/hooks/useApolloClient.d.ts +3 -0
  73. package/dist/mcp/react/hooks/useApolloClient.d.ts.map +1 -0
  74. package/dist/mcp/react/hooks/useApolloClient.js +9 -0
  75. package/dist/mcp/react/hooks/useApolloClient.js.map +1 -0
  76. package/dist/mcp/react/hooks/useApp.d.ts +2 -0
  77. package/dist/mcp/react/hooks/useApp.d.ts.map +1 -0
  78. package/dist/mcp/react/hooks/useApp.js +5 -0
  79. package/dist/mcp/react/hooks/useApp.js.map +1 -0
  80. package/dist/mcp/react/hooks/useToolInput.d.ts +2 -0
  81. package/dist/mcp/react/hooks/useToolInput.d.ts.map +1 -0
  82. package/dist/mcp/react/hooks/useToolInput.js +5 -0
  83. package/dist/mcp/react/hooks/useToolInput.js.map +1 -0
  84. package/dist/mcp/react/hooks/useToolMetadata.d.ts +8 -0
  85. package/dist/mcp/react/hooks/useToolMetadata.d.ts.map +1 -0
  86. package/dist/mcp/react/hooks/useToolMetadata.js +5 -0
  87. package/dist/mcp/react/hooks/useToolMetadata.js.map +1 -0
  88. package/dist/mcp/react/hooks/useToolName.d.ts +2 -0
  89. package/dist/mcp/react/hooks/useToolName.d.ts.map +1 -0
  90. package/dist/mcp/react/hooks/useToolName.js +5 -0
  91. package/dist/mcp/react/hooks/useToolName.js.map +1 -0
  92. package/dist/mcp/react/index.d.ts +5 -0
  93. package/dist/mcp/react/index.d.ts.map +1 -0
  94. package/dist/mcp/react/index.js +5 -0
  95. package/dist/mcp/react/index.js.map +1 -0
  96. package/dist/openai/core/ApolloClient.d.ts +21 -0
  97. package/dist/openai/core/ApolloClient.d.ts.map +1 -0
  98. package/dist/openai/core/ApolloClient.js +66 -0
  99. package/dist/openai/core/ApolloClient.js.map +1 -0
  100. package/dist/openai/core/McpAppManager.d.ts +28 -0
  101. package/dist/openai/core/McpAppManager.d.ts.map +1 -0
  102. package/dist/openai/core/McpAppManager.js +73 -0
  103. package/dist/openai/core/McpAppManager.js.map +1 -0
  104. package/dist/openai/core/Platform.d.ts +8 -0
  105. package/dist/openai/core/Platform.d.ts.map +1 -0
  106. package/dist/openai/core/Platform.js +8 -0
  107. package/dist/openai/core/Platform.js.map +1 -0
  108. package/dist/openai/globals.d.ts +12 -0
  109. package/dist/openai/globals.d.ts.map +1 -0
  110. package/dist/openai/globals.js +2 -0
  111. package/dist/openai/globals.js.map +1 -0
  112. package/dist/openai/index.d.ts +3 -0
  113. package/dist/openai/index.d.ts.map +1 -0
  114. package/dist/openai/index.js +3 -0
  115. package/dist/openai/index.js.map +1 -0
  116. package/dist/openai/link/ToolCallLink.d.ts +28 -0
  117. package/dist/openai/link/ToolCallLink.d.ts.map +1 -0
  118. package/dist/openai/link/ToolCallLink.js +35 -0
  119. package/dist/openai/link/ToolCallLink.js.map +1 -0
  120. package/dist/openai/react/hooks/useApolloClient.d.ts +3 -0
  121. package/dist/openai/react/hooks/useApolloClient.d.ts.map +1 -0
  122. package/dist/openai/react/hooks/useApolloClient.js +9 -0
  123. package/dist/openai/react/hooks/useApolloClient.js.map +1 -0
  124. package/dist/openai/react/hooks/useApp.d.ts +2 -0
  125. package/dist/openai/react/hooks/useApp.d.ts.map +1 -0
  126. package/dist/openai/react/hooks/useApp.js +5 -0
  127. package/dist/openai/react/hooks/useApp.js.map +1 -0
  128. package/dist/openai/react/hooks/useOpenAiGlobal.d.ts +3 -0
  129. package/dist/openai/react/hooks/useOpenAiGlobal.d.ts.map +1 -0
  130. package/dist/{react → openai/react}/hooks/useOpenAiGlobal.js +1 -1
  131. package/dist/openai/react/hooks/useOpenAiGlobal.js.map +1 -0
  132. package/dist/openai/react/hooks/useToolInput.d.ts +2 -0
  133. package/dist/openai/react/hooks/useToolInput.d.ts.map +1 -0
  134. package/dist/openai/react/hooks/useToolInput.js +5 -0
  135. package/dist/openai/react/hooks/useToolInput.js.map +1 -0
  136. package/dist/openai/react/hooks/useToolMetadata.d.ts +2 -0
  137. package/dist/openai/react/hooks/useToolMetadata.d.ts.map +1 -0
  138. package/dist/openai/react/hooks/useToolMetadata.js +5 -0
  139. package/dist/openai/react/hooks/useToolMetadata.js.map +1 -0
  140. package/dist/openai/react/hooks/useToolName.d.ts.map +1 -0
  141. package/dist/openai/react/hooks/useToolName.js +5 -0
  142. package/dist/openai/react/hooks/useToolName.js.map +1 -0
  143. package/dist/{react → openai/react}/hooks/useWidgetState.d.ts +1 -1
  144. package/dist/openai/react/hooks/useWidgetState.d.ts.map +1 -0
  145. package/dist/openai/react/hooks/useWidgetState.js.map +1 -0
  146. package/dist/openai/react/index.d.ts +6 -0
  147. package/dist/openai/react/index.d.ts.map +1 -0
  148. package/dist/openai/react/index.js +6 -0
  149. package/dist/openai/react/index.js.map +1 -0
  150. package/dist/{types/openai.d.ts → openai/types.d.ts} +7 -11
  151. package/dist/openai/types.d.ts.map +1 -0
  152. package/dist/{types/openai.js → openai/types.js} +1 -1
  153. package/dist/openai/types.js.map +1 -0
  154. package/dist/react/ApolloProvider.d.ts +6 -2
  155. package/dist/react/ApolloProvider.d.ts.map +1 -1
  156. package/dist/react/ApolloProvider.js +12 -27
  157. package/dist/react/ApolloProvider.js.map +1 -1
  158. package/dist/react/index.d.ts +6 -0
  159. package/dist/react/index.d.ts.map +1 -0
  160. package/dist/react/index.js +9 -0
  161. package/dist/react/index.js.map +1 -0
  162. package/dist/react/index.mcp.d.ts +3 -0
  163. package/dist/react/index.mcp.d.ts.map +1 -0
  164. package/dist/react/index.mcp.js +3 -0
  165. package/dist/react/index.mcp.js.map +1 -0
  166. package/dist/react/index.openai.d.ts +3 -0
  167. package/dist/react/index.openai.d.ts.map +1 -0
  168. package/dist/react/index.openai.js +3 -0
  169. package/dist/react/index.openai.js.map +1 -0
  170. package/dist/react/missingHook.d.ts +2 -0
  171. package/dist/react/missingHook.d.ts.map +1 -0
  172. package/dist/react/missingHook.js +6 -0
  173. package/dist/react/missingHook.js.map +1 -0
  174. package/dist/tsconfig/core/tsconfig.json +5 -0
  175. package/dist/tsconfig/mcp/tsconfig.json +6 -0
  176. package/dist/tsconfig/openai/tsconfig.json +7 -0
  177. package/dist/types/application-manifest.d.ts +13 -1
  178. package/dist/types/application-manifest.d.ts.map +1 -1
  179. package/dist/types/application-manifest.js.map +1 -1
  180. package/dist/utilities/cacheAsync.d.ts +4 -0
  181. package/dist/utilities/cacheAsync.d.ts.map +1 -0
  182. package/dist/utilities/cacheAsync.js +19 -0
  183. package/dist/utilities/cacheAsync.js.map +1 -0
  184. package/dist/utilities/constants.d.ts +6 -0
  185. package/dist/utilities/constants.d.ts.map +1 -0
  186. package/dist/utilities/constants.js +6 -0
  187. package/dist/utilities/constants.js.map +1 -0
  188. package/dist/utilities/emptyModule.d.ts +2 -0
  189. package/dist/utilities/emptyModule.d.ts.map +1 -0
  190. package/dist/utilities/emptyModule.js +2 -0
  191. package/dist/utilities/emptyModule.js.map +1 -0
  192. package/dist/utilities/getVariablesForOperationFromToolInput.d.ts +5 -0
  193. package/dist/utilities/getVariablesForOperationFromToolInput.d.ts.map +1 -0
  194. package/dist/utilities/getVariablesForOperationFromToolInput.js +18 -0
  195. package/dist/utilities/getVariablesForOperationFromToolInput.js.map +1 -0
  196. package/dist/utilities/index.d.ts +6 -0
  197. package/dist/utilities/index.d.ts.map +1 -0
  198. package/dist/utilities/index.js +6 -0
  199. package/dist/utilities/index.js.map +1 -0
  200. package/dist/utilities/invariant.d.ts +2 -0
  201. package/dist/utilities/invariant.d.ts.map +1 -0
  202. package/dist/utilities/invariant.js +6 -0
  203. package/dist/utilities/invariant.js.map +1 -0
  204. package/dist/utilities/promiseWithResolvers.d.ts +7 -0
  205. package/dist/utilities/promiseWithResolvers.d.ts.map +1 -0
  206. package/dist/utilities/promiseWithResolvers.js +16 -0
  207. package/dist/utilities/promiseWithResolvers.js.map +1 -0
  208. package/dist/vite/__tests__/utilities/build.d.ts +41 -0
  209. package/dist/vite/__tests__/utilities/build.d.ts.map +1 -0
  210. package/dist/vite/__tests__/utilities/build.js +63 -0
  211. package/dist/vite/__tests__/utilities/build.js.map +1 -0
  212. package/dist/vite/apolloClientAiApps.d.ts +14 -0
  213. package/dist/vite/apolloClientAiApps.d.ts.map +1 -0
  214. package/dist/vite/apolloClientAiApps.js +350 -0
  215. package/dist/vite/apolloClientAiApps.js.map +1 -0
  216. package/dist/vite/index.d.ts +1 -2
  217. package/dist/vite/index.d.ts.map +1 -1
  218. package/dist/vite/index.js +1 -2
  219. package/dist/vite/index.js.map +1 -1
  220. package/dist/vite/utilities/config.d.ts +2 -0
  221. package/dist/vite/utilities/config.d.ts.map +1 -0
  222. package/dist/vite/utilities/config.js +11 -0
  223. package/dist/vite/utilities/config.js.map +1 -0
  224. package/dist/vite/utilities/graphql.d.ts +20 -0
  225. package/dist/vite/utilities/graphql.d.ts.map +1 -0
  226. package/dist/vite/utilities/graphql.js +42 -0
  227. package/dist/vite/utilities/graphql.js.map +1 -0
  228. package/knope.toml +1 -1
  229. package/package.json +109 -12
  230. package/src/config/defineConfig.ts +8 -0
  231. package/src/config/index.ts +2 -0
  232. package/src/config/schema.ts +73 -0
  233. package/src/config/types.ts +7 -0
  234. package/src/core/ApolloClient.ts +7 -95
  235. package/src/core/Platform.ts +27 -0
  236. package/src/core/types.ts +14 -0
  237. package/src/index.mcp.ts +5 -0
  238. package/src/index.openai.ts +5 -0
  239. package/src/index.ts +4 -28
  240. package/src/link/ToolCallLink.ts +6 -22
  241. package/src/mcp/core/ApolloClient.ts +102 -0
  242. package/src/mcp/core/McpAppManager.ts +98 -0
  243. package/src/mcp/core/Platform.ts +11 -0
  244. package/src/mcp/core/__tests__/ApolloClient.test.ts +464 -0
  245. package/src/mcp/index.ts +2 -0
  246. package/src/mcp/link/ToolCallLink.ts +40 -0
  247. package/src/mcp/link/__tests__/ToolCallLink.test.ts +53 -0
  248. package/src/mcp/react/hooks/__tests__/useApp.test.tsx +46 -0
  249. package/src/mcp/react/hooks/__tests__/useToolInput.test.tsx +50 -0
  250. package/src/mcp/react/hooks/__tests__/useToolMetadata.test.tsx +53 -0
  251. package/src/mcp/react/hooks/__tests__/useToolName.test.tsx +50 -0
  252. package/src/mcp/react/hooks/useApolloClient.ts +14 -0
  253. package/src/mcp/react/hooks/useApp.ts +5 -0
  254. package/src/mcp/react/hooks/useToolInput.ts +5 -0
  255. package/src/mcp/react/hooks/useToolMetadata.ts +5 -0
  256. package/src/mcp/react/hooks/useToolName.ts +5 -0
  257. package/src/mcp/react/index.ts +4 -0
  258. package/src/openai/core/ApolloClient.ts +100 -0
  259. package/src/openai/core/McpAppManager.ts +110 -0
  260. package/src/openai/core/Platform.ts +11 -0
  261. package/src/openai/core/__tests__/ApolloClient.test.ts +537 -0
  262. package/src/openai/globals.ts +14 -0
  263. package/src/openai/index.ts +2 -0
  264. package/src/openai/link/ToolCallLink.ts +40 -0
  265. package/src/{react → openai/react}/hooks/__tests__/useOpenAiGlobal.test.ts +1 -1
  266. package/src/openai/react/hooks/__tests__/useToolInput.test.tsx +85 -0
  267. package/src/openai/react/hooks/__tests__/useToolMetadata.test.tsx +86 -0
  268. package/src/openai/react/hooks/__tests__/useToolName.test.tsx +50 -0
  269. package/src/{react → openai/react}/hooks/__tests__/useWidgetState.test.tsx +1 -1
  270. package/src/openai/react/hooks/useApolloClient.ts +14 -0
  271. package/src/openai/react/hooks/useApp.ts +5 -0
  272. package/src/{react → openai/react}/hooks/useOpenAiGlobal.ts +2 -2
  273. package/src/openai/react/hooks/useToolInput.ts +5 -0
  274. package/src/openai/react/hooks/useToolMetadata.ts +5 -0
  275. package/src/openai/react/hooks/useToolName.ts +5 -0
  276. package/src/{react → openai/react}/hooks/useWidgetState.ts +1 -1
  277. package/src/openai/react/index.ts +5 -0
  278. package/src/{types/openai.ts → openai/types.ts} +9 -13
  279. package/src/react/ApolloProvider.tsx +23 -31
  280. package/src/react/__tests__/ApolloProvider/mcp.test.tsx +74 -0
  281. package/src/react/__tests__/ApolloProvider/openai.test.tsx +146 -0
  282. package/src/react/index.mcp.ts +7 -0
  283. package/src/react/index.openai.ts +7 -0
  284. package/src/react/index.ts +19 -0
  285. package/src/react/missingHook.ts +9 -0
  286. package/src/testing/internal/index.ts +8 -0
  287. package/src/testing/internal/matchers/index.ts +2 -0
  288. package/src/testing/internal/matchers/toComplete.ts +46 -0
  289. package/src/testing/internal/matchers/toEmitValue.ts +71 -0
  290. package/src/testing/internal/matchers/types.ts +3 -0
  291. package/src/testing/internal/mcp/graphqlToolResult.ts +31 -0
  292. package/src/testing/internal/mcp/minimalHostContextWithToolName.ts +9 -0
  293. package/src/testing/internal/mcp/mockMcpHost.ts +188 -0
  294. package/src/testing/internal/openai/dispatchStateChange.ts +1 -1
  295. package/src/testing/internal/openai/stubOpenAiGlobals.ts +22 -9
  296. package/src/testing/internal/react/renderAsync.ts +7 -0
  297. package/src/testing/internal/utilities/ObservableStream.ts +172 -0
  298. package/src/testing/internal/utilities/getSerializableProperties.ts +55 -0
  299. package/src/testing/internal/utilities/mockApplicationManifest.ts +39 -0
  300. package/src/testing/internal/utilities/spyOnConsole.ts +29 -0
  301. package/src/testing/internal/utilities/wait.ts +3 -0
  302. package/src/tsconfig/core/tsconfig.json +5 -0
  303. package/src/tsconfig/mcp/tsconfig.json +6 -0
  304. package/src/tsconfig/openai/tsconfig.json +7 -0
  305. package/src/types/application-manifest.ts +16 -1
  306. package/src/utilities/__tests__/cacheAsync.test.ts +64 -0
  307. package/src/utilities/cacheAsync.ts +25 -0
  308. package/src/utilities/constants.ts +5 -0
  309. package/src/utilities/emptyModule.ts +1 -0
  310. package/src/utilities/getVariablesForOperationFromToolInput.ts +27 -0
  311. package/src/utilities/index.ts +5 -0
  312. package/src/utilities/invariant.ts +5 -0
  313. package/src/utilities/promiseWithResolvers.ts +18 -0
  314. package/src/vite/__tests__/apolloClientAiApps.test.ts +1521 -0
  315. package/src/vite/__tests__/utilities/build.ts +72 -0
  316. package/src/vite/apolloClientAiApps.ts +515 -0
  317. package/src/vite/index.ts +1 -2
  318. package/src/vite/utilities/config.ts +13 -0
  319. package/src/vite/utilities/graphql.ts +123 -0
  320. package/tsconfig.base.json +2 -2
  321. package/tsconfig.vite.build.json +4 -1
  322. package/tsconfig.vite.json +8 -2
  323. package/vitest-setup.ts +28 -0
  324. package/dist/react/context/ToolUseContext.d.ts +0 -16
  325. package/dist/react/context/ToolUseContext.d.ts.map +0 -1
  326. package/dist/react/context/ToolUseContext.js +0 -11
  327. package/dist/react/context/ToolUseContext.js.map +0 -1
  328. package/dist/react/hooks/useCallTool.d.ts +0 -4
  329. package/dist/react/hooks/useCallTool.d.ts.map +0 -1
  330. package/dist/react/hooks/useCallTool.js +0 -5
  331. package/dist/react/hooks/useCallTool.js.map +0 -1
  332. package/dist/react/hooks/useOpenAiGlobal.d.ts +0 -3
  333. package/dist/react/hooks/useOpenAiGlobal.d.ts.map +0 -1
  334. package/dist/react/hooks/useOpenAiGlobal.js.map +0 -1
  335. package/dist/react/hooks/useOpenExternal.d.ts +0 -4
  336. package/dist/react/hooks/useOpenExternal.d.ts.map +0 -1
  337. package/dist/react/hooks/useOpenExternal.js +0 -5
  338. package/dist/react/hooks/useOpenExternal.js.map +0 -1
  339. package/dist/react/hooks/useRequestDisplayMode.d.ts +0 -7
  340. package/dist/react/hooks/useRequestDisplayMode.d.ts.map +0 -1
  341. package/dist/react/hooks/useRequestDisplayMode.js +0 -6
  342. package/dist/react/hooks/useRequestDisplayMode.js.map +0 -1
  343. package/dist/react/hooks/useSendFollowUpMessage.d.ts +0 -2
  344. package/dist/react/hooks/useSendFollowUpMessage.d.ts.map +0 -1
  345. package/dist/react/hooks/useSendFollowUpMessage.js +0 -8
  346. package/dist/react/hooks/useSendFollowUpMessage.js.map +0 -1
  347. package/dist/react/hooks/useToolEffect.d.ts +0 -3
  348. package/dist/react/hooks/useToolEffect.d.ts.map +0 -1
  349. package/dist/react/hooks/useToolEffect.js +0 -28
  350. package/dist/react/hooks/useToolEffect.js.map +0 -1
  351. package/dist/react/hooks/useToolInput.d.ts +0 -2
  352. package/dist/react/hooks/useToolInput.d.ts.map +0 -1
  353. package/dist/react/hooks/useToolInput.js +0 -6
  354. package/dist/react/hooks/useToolInput.js.map +0 -1
  355. package/dist/react/hooks/useToolName.d.ts.map +0 -1
  356. package/dist/react/hooks/useToolName.js +0 -6
  357. package/dist/react/hooks/useToolName.js.map +0 -1
  358. package/dist/react/hooks/useToolOutput.d.ts +0 -2
  359. package/dist/react/hooks/useToolOutput.d.ts.map +0 -1
  360. package/dist/react/hooks/useToolOutput.js +0 -5
  361. package/dist/react/hooks/useToolOutput.js.map +0 -1
  362. package/dist/react/hooks/useToolResponseMetadata.d.ts +0 -2
  363. package/dist/react/hooks/useToolResponseMetadata.d.ts.map +0 -1
  364. package/dist/react/hooks/useToolResponseMetadata.js +0 -5
  365. package/dist/react/hooks/useToolResponseMetadata.js.map +0 -1
  366. package/dist/react/hooks/useWidgetState.d.ts.map +0 -1
  367. package/dist/react/hooks/useWidgetState.js.map +0 -1
  368. package/dist/types/openai.d.ts.map +0 -1
  369. package/dist/types/openai.js.map +0 -1
  370. package/dist/vite/absolute_asset_imports_plugin.d.ts +0 -5
  371. package/dist/vite/absolute_asset_imports_plugin.d.ts.map +0 -1
  372. package/dist/vite/absolute_asset_imports_plugin.js +0 -17
  373. package/dist/vite/absolute_asset_imports_plugin.js.map +0 -1
  374. package/dist/vite/application_manifest_plugin.d.ts +0 -10
  375. package/dist/vite/application_manifest_plugin.d.ts.map +0 -1
  376. package/dist/vite/application_manifest_plugin.js +0 -274
  377. package/dist/vite/application_manifest_plugin.js.map +0 -1
  378. package/src/core/__tests__/ApolloClient.test.ts +0 -626
  379. package/src/react/__tests__/ApolloProvider.test.tsx +0 -41
  380. package/src/react/context/ToolUseContext.tsx +0 -31
  381. package/src/react/hooks/__tests__/useCallTool.test.ts +0 -46
  382. package/src/react/hooks/__tests__/useOpenExternal.test.tsx +0 -24
  383. package/src/react/hooks/__tests__/useRequestDisplayMode.test.ts +0 -17
  384. package/src/react/hooks/__tests__/useSendFollowUpMessage.test.ts +0 -15
  385. package/src/react/hooks/__tests__/useToolEffect.test.tsx +0 -67
  386. package/src/react/hooks/__tests__/useToolInput.test.ts +0 -13
  387. package/src/react/hooks/__tests__/useToolName.test.ts +0 -13
  388. package/src/react/hooks/__tests__/useToolOutput.test.tsx +0 -49
  389. package/src/react/hooks/__tests__/useToolResponseMetadata.test.tsx +0 -49
  390. package/src/react/hooks/useCallTool.ts +0 -13
  391. package/src/react/hooks/useOpenExternal.ts +0 -11
  392. package/src/react/hooks/useRequestDisplayMode.ts +0 -7
  393. package/src/react/hooks/useSendFollowUpMessage.ts +0 -7
  394. package/src/react/hooks/useToolEffect.tsx +0 -37
  395. package/src/react/hooks/useToolInput.ts +0 -7
  396. package/src/react/hooks/useToolName.ts +0 -7
  397. package/src/react/hooks/useToolOutput.ts +0 -5
  398. package/src/react/hooks/useToolResponseMetadata.ts +0 -5
  399. package/src/vite/__tests__/absolute_asset_imports_plugin.test.ts +0 -102
  400. package/src/vite/__tests__/application_manifest_plugin.test.ts +0 -1038
  401. package/src/vite/absolute_asset_imports_plugin.ts +0 -22
  402. package/src/vite/application_manifest_plugin.ts +0 -443
  403. /package/dist/{react → openai/react}/hooks/useToolName.d.ts +0 -0
  404. /package/dist/{react → openai/react}/hooks/useWidgetState.js +0 -0
@@ -0,0 +1,50 @@
1
+ import { test, expect } from "vitest";
2
+ import {
3
+ disableActEnvironment,
4
+ renderHookToSnapshotStream,
5
+ } from "@testing-library/react-render-stream";
6
+ import { Suspense } from "react";
7
+ import { InMemoryCache } from "@apollo/client";
8
+
9
+ import { useToolInput } from "../useToolInput.js";
10
+ import { ApolloClient } from "../../../core/ApolloClient.js";
11
+ import {
12
+ graphqlToolResult,
13
+ minimalHostContextWithToolName,
14
+ mockApplicationManifest,
15
+ mockMcpHost,
16
+ spyOnConsole,
17
+ } from "../../../../testing/internal/index.js";
18
+ import { ApolloProvider } from "../../../../react/ApolloProvider.js";
19
+
20
+ test("returns the tool input from the MCP host", async () => {
21
+ using _ = spyOnConsole("debug");
22
+ const client = new ApolloClient({
23
+ cache: new InMemoryCache(),
24
+ manifest: mockApplicationManifest(),
25
+ });
26
+
27
+ using host = await mockMcpHost({
28
+ hostContext: minimalHostContextWithToolName("GetProduct"),
29
+ });
30
+ host.onCleanup(() => client.stop());
31
+
32
+ host.sendToolInput({ arguments: { id: "1" } });
33
+ host.sendToolResult(graphqlToolResult({ data: { product: null } }));
34
+
35
+ using _disabledAct = disableActEnvironment();
36
+ const { takeSnapshot } = await renderHookToSnapshotStream(
37
+ () => useToolInput(),
38
+ {
39
+ wrapper: ({ children }) => (
40
+ <Suspense>
41
+ <ApolloProvider client={client}>{children}</ApolloProvider>
42
+ </Suspense>
43
+ ),
44
+ }
45
+ );
46
+
47
+ await expect(takeSnapshot()).resolves.toEqual({ id: "1" });
48
+
49
+ await expect(takeSnapshot).not.toRerender();
50
+ });
@@ -0,0 +1,53 @@
1
+ import { test, expect } from "vitest";
2
+ import {
3
+ disableActEnvironment,
4
+ renderHookToSnapshotStream,
5
+ } from "@testing-library/react-render-stream";
6
+ import { Suspense } from "react";
7
+ import { InMemoryCache } from "@apollo/client";
8
+
9
+ import { useToolMetadata } from "../useToolMetadata.js";
10
+ import { ApolloClient } from "../../../core/ApolloClient.js";
11
+ import {
12
+ mockApplicationManifest,
13
+ mockMcpHost,
14
+ spyOnConsole,
15
+ } from "../../../../testing/internal/index.js";
16
+ import { ApolloProvider } from "../../../../react/ApolloProvider.js";
17
+
18
+ test("returns the tool metadata from the MCP host", async () => {
19
+ using _ = spyOnConsole("debug");
20
+ const client = new ApolloClient({
21
+ cache: new InMemoryCache(),
22
+ manifest: mockApplicationManifest(),
23
+ });
24
+
25
+ using host = await mockMcpHost();
26
+ host.onCleanup(() => client.stop());
27
+
28
+ host.sendToolInput({ arguments: {} });
29
+ host.sendToolResult({
30
+ _meta: { toolName: "TestTool", customField: "customValue" },
31
+ content: [],
32
+ structuredContent: {},
33
+ });
34
+
35
+ using _disabledAct = disableActEnvironment();
36
+ const { takeSnapshot } = await renderHookToSnapshotStream(
37
+ () => useToolMetadata(),
38
+ {
39
+ wrapper: ({ children }) => (
40
+ <Suspense>
41
+ <ApolloProvider client={client}>{children}</ApolloProvider>
42
+ </Suspense>
43
+ ),
44
+ }
45
+ );
46
+
47
+ await expect(takeSnapshot()).resolves.toEqual({
48
+ toolName: "TestTool",
49
+ customField: "customValue",
50
+ });
51
+
52
+ await expect(takeSnapshot).not.toRerender();
53
+ });
@@ -0,0 +1,50 @@
1
+ import { test, expect } from "vitest";
2
+ import {
3
+ disableActEnvironment,
4
+ renderHookToSnapshotStream,
5
+ } from "@testing-library/react-render-stream";
6
+ import { Suspense } from "react";
7
+ import { InMemoryCache } from "@apollo/client";
8
+
9
+ import { useToolName } from "../useToolName.js";
10
+ import { ApolloClient } from "../../../core/ApolloClient.js";
11
+ import {
12
+ graphqlToolResult,
13
+ minimalHostContextWithToolName,
14
+ mockApplicationManifest,
15
+ mockMcpHost,
16
+ spyOnConsole,
17
+ } from "../../../../testing/internal/index.js";
18
+ import { ApolloProvider } from "../../../../react/ApolloProvider.js";
19
+
20
+ test("returns the tool name from the MCP host", async () => {
21
+ using _ = spyOnConsole("debug");
22
+ const client = new ApolloClient({
23
+ cache: new InMemoryCache(),
24
+ manifest: mockApplicationManifest(),
25
+ });
26
+
27
+ using host = await mockMcpHost({
28
+ hostContext: minimalHostContextWithToolName("GetProduct"),
29
+ });
30
+ host.onCleanup(() => client.stop());
31
+
32
+ host.sendToolInput({ arguments: {} });
33
+ host.sendToolResult(graphqlToolResult({ data: { product: null } }));
34
+
35
+ using _disabledAct = disableActEnvironment();
36
+ const { takeSnapshot } = await renderHookToSnapshotStream(
37
+ () => useToolName(),
38
+ {
39
+ wrapper: ({ children }) => (
40
+ <Suspense>
41
+ <ApolloProvider client={client}>{children}</ApolloProvider>
42
+ </Suspense>
43
+ ),
44
+ }
45
+ );
46
+
47
+ await expect(takeSnapshot()).resolves.toBe("GetProduct");
48
+
49
+ await expect(takeSnapshot).not.toRerender();
50
+ });
@@ -0,0 +1,14 @@
1
+ import { useApolloClient as useBaseApolloClient } from "@apollo/client/react";
2
+ import { ApolloClient } from "../../core/ApolloClient.js";
3
+ import { aiClientSymbol, invariant } from "../../../utilities/index.js";
4
+
5
+ export function useApolloClient(override?: ApolloClient) {
6
+ const client = useBaseApolloClient(override) as ApolloClient;
7
+
8
+ invariant(
9
+ client[aiClientSymbol],
10
+ 'The "client" instance provided to <ApolloProvider /> is the wrong instance. You might have imported `ApolloClient` from `@apollo/client`. Please import `ApolloClient` from `@apollo/client-ai-apps` instead.'
11
+ );
12
+
13
+ return client;
14
+ }
@@ -0,0 +1,5 @@
1
+ import { useApolloClient } from "./useApolloClient.js";
2
+
3
+ export function useApp() {
4
+ return useApolloClient()["appManager"].app;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { useApolloClient } from "./useApolloClient.js";
2
+
3
+ export function useToolInput() {
4
+ return useApolloClient()["appManager"].toolInput;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { useApolloClient } from "./useApolloClient.js";
2
+
3
+ export function useToolMetadata() {
4
+ return useApolloClient()["appManager"].toolMetadata;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { useApolloClient } from "./useApolloClient.js";
2
+
3
+ export function useToolName() {
4
+ return useApolloClient()["appManager"].toolName;
5
+ }
@@ -0,0 +1,4 @@
1
+ export { useApp } from "./hooks/useApp.js";
2
+ export { useToolName } from "./hooks/useToolName.js";
3
+ export { useToolMetadata } from "./hooks/useToolMetadata.js";
4
+ export { useToolInput } from "./hooks/useToolInput.js";
@@ -0,0 +1,100 @@
1
+ import type { ApolloLink } from "@apollo/client";
2
+ import { ApolloClient as BaseApolloClient } from "@apollo/client";
3
+ import { DocumentTransform } from "@apollo/client";
4
+ import { removeDirectivesFromDocument } from "@apollo/client/utilities/internal";
5
+ import { parse } from "graphql";
6
+ import { __DEV__ } from "@apollo/client/utilities/environment";
7
+ import type { ApplicationManifest } from "../../types/application-manifest.js";
8
+ import { ToolCallLink } from "../link/ToolCallLink.js";
9
+ import {
10
+ aiClientSymbol,
11
+ cacheAsync,
12
+ getVariablesForOperationFromToolInput,
13
+ } from "../../utilities/index.js";
14
+ import { McpAppManager } from "./McpAppManager.js";
15
+
16
+ export declare namespace ApolloClient {
17
+ export interface Options extends Omit<BaseApolloClient.Options, "link"> {
18
+ link?: BaseApolloClient.Options["link"];
19
+ manifest: ApplicationManifest;
20
+ }
21
+ }
22
+
23
+ export class ApolloClient extends BaseApolloClient {
24
+ manifest: ApplicationManifest;
25
+ private readonly appManager: McpAppManager;
26
+
27
+ /** @internal */
28
+ readonly [aiClientSymbol] = true;
29
+
30
+ constructor(options: ApolloClient.Options) {
31
+ const link = options.link ?? new ToolCallLink();
32
+
33
+ if (__DEV__) {
34
+ validateTerminatingLink(link);
35
+ }
36
+
37
+ super({
38
+ ...options,
39
+ link,
40
+ // Strip out the prefetch/tool directives so they don't get sent with the operation to the server
41
+ documentTransform: new DocumentTransform((document) => {
42
+ return removeDirectivesFromDocument(
43
+ [{ name: "prefetch" }, { name: "tool" }],
44
+ document
45
+ )!;
46
+ }).concat(options.documentTransform ?? DocumentTransform.identity()),
47
+ });
48
+
49
+ this.manifest = options.manifest;
50
+ this.appManager = new McpAppManager(this.manifest);
51
+ }
52
+
53
+ stop() {
54
+ super.stop();
55
+ this.appManager.close().catch(() => {});
56
+ }
57
+
58
+ waitForInitialization = cacheAsync(async () => {
59
+ const { prefetch, result, toolName, args } =
60
+ await this.appManager.waitForInitialization();
61
+
62
+ this.manifest.operations.forEach((operation) => {
63
+ if (operation.prefetchID && prefetch?.[operation.prefetchID]) {
64
+ this.writeQuery({
65
+ query: parse(operation.body),
66
+ data: prefetch[operation.prefetchID].data,
67
+ });
68
+ }
69
+
70
+ if (operation.tools.find((tool) => tool.name === toolName)) {
71
+ this.writeQuery({
72
+ query: parse(operation.body),
73
+ data: result.data,
74
+ variables: getVariablesForOperationFromToolInput(operation, args),
75
+ });
76
+ }
77
+ });
78
+ });
79
+ }
80
+
81
+ function validateTerminatingLink(link: ApolloLink) {
82
+ let terminatingLink = link;
83
+
84
+ while (terminatingLink.right) {
85
+ terminatingLink = terminatingLink.right;
86
+ }
87
+
88
+ if (
89
+ !isNamedLink(terminatingLink) ||
90
+ terminatingLink.name !== "ToolCallLink"
91
+ ) {
92
+ throw new Error(
93
+ "The terminating link must be a `ToolCallLink`. If you are using a `split` link, ensure the `right` branch uses a `ToolCallLink` as the terminating link."
94
+ );
95
+ }
96
+ }
97
+
98
+ function isNamedLink(link: ApolloLink): link is ApolloLink & { name: string } {
99
+ return "name" in link;
100
+ }
@@ -0,0 +1,110 @@
1
+ import { App, PostMessageTransport } from "@modelcontextprotocol/ext-apps";
2
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ import type { ApplicationManifest } from "../../types/application-manifest";
4
+ import type { FormattedExecutionResult } from "graphql";
5
+ import type { DocumentNode, OperationVariables } from "@apollo/client";
6
+ import { print } from "@apollo/client/utilities";
7
+ import { cacheAsync, promiseWithResolvers } from "../../utilities";
8
+ import type { ApolloMcpServerApps } from "../../core/types";
9
+
10
+ type ExecuteQueryCallToolResult = Omit<CallToolResult, "structuredContent"> & {
11
+ structuredContent: FormattedExecutionResult;
12
+ };
13
+
14
+ /** @internal */
15
+ export class McpAppManager {
16
+ readonly app: App;
17
+
18
+ #toolName: string | undefined;
19
+ #toolMetadata: Record<string, unknown> | null = null;
20
+ #toolInput: Record<string, unknown> | undefined;
21
+
22
+ constructor(manifest: ApplicationManifest) {
23
+ this.app = new App({ name: manifest.name, version: manifest.appVersion });
24
+ }
25
+
26
+ get toolName() {
27
+ return this.#toolName;
28
+ }
29
+
30
+ get toolMetadata() {
31
+ return this.#toolMetadata;
32
+ }
33
+
34
+ get toolInput() {
35
+ return this.#toolInput;
36
+ }
37
+
38
+ waitForInitialization = cacheAsync(async () => {
39
+ let toolResult = promiseWithResolvers<ApolloMcpServerApps.CallToolResult>();
40
+ let toolInput = promiseWithResolvers<Parameters<App["ontoolinput"]>[0]>();
41
+
42
+ this.app.ontoolresult = (params) => {
43
+ toolResult.resolve(
44
+ params as unknown as ApolloMcpServerApps.CallToolResult
45
+ );
46
+
47
+ // OpenAI is not consistent about sending `ui/notifications/tool-input`
48
+ // before we get the rool result (which should happen according to the
49
+ // spec). We resolve this promise in case it wasn't sent to avoid stalling
50
+ // initialization indefinitely.
51
+ //
52
+ // When OpenAI fixes this issue and sends `ui/notifications/tool-input`
53
+ // consistently, this can be removed.
54
+ toolInput.resolve({});
55
+ };
56
+
57
+ this.app.ontoolinput = (params) => {
58
+ toolInput.resolve(params);
59
+ };
60
+
61
+ await this.connect();
62
+
63
+ const { structuredContent } = await toolResult.promise;
64
+ const { arguments: args } = await toolInput.promise;
65
+
66
+ this.#toolName = this.app.getHostContext()?.toolInfo?.tool.name;
67
+ this.#toolInput = args;
68
+
69
+ // OpenAI doesn't provide access to `_meta`, so we need to use
70
+ // window.openai.toolResponseMetadata directly
71
+ this.#toolMetadata = window.openai.toolResponseMetadata;
72
+
73
+ return {
74
+ ...structuredContent,
75
+ toolName: this.toolName,
76
+ args,
77
+ };
78
+ });
79
+
80
+ close() {
81
+ return this.app.close();
82
+ }
83
+
84
+ async executeQuery({
85
+ query,
86
+ variables,
87
+ }: {
88
+ query: DocumentNode;
89
+ variables: OperationVariables | undefined;
90
+ }) {
91
+ const result = (await this.app.callServerTool({
92
+ name: "execute",
93
+ arguments: { query: print(query), variables },
94
+ })) as ExecuteQueryCallToolResult;
95
+
96
+ return result.structuredContent;
97
+ }
98
+
99
+ private async connect() {
100
+ try {
101
+ return await this.app.connect(
102
+ new PostMessageTransport(window.parent, window.parent)
103
+ );
104
+ } catch (e) {
105
+ const error = e instanceof Error ? e : new Error("Failed to connect");
106
+
107
+ throw error;
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,11 @@
1
+ export const Platform = Object.freeze({
2
+ target: "openai",
3
+ select<
4
+ T = unknown,
5
+ TReturn = T extends (...args: any[]) => infer TReturn ? TReturn : T,
6
+ >(config: { mcp?: T; openai?: T }): TReturn | undefined {
7
+ const value = config.openai;
8
+
9
+ return typeof value === "function" ? value() : (value as TReturn);
10
+ },
11
+ });