@apollo/client-ai-apps 0.4.0 → 0.5.1

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 +361 -0
  6. package/__mocks__/fs/promises.cjs +3 -0
  7. package/__mocks__/fs.cjs +3 -0
  8. package/dist/config/defineConfig.d.ts +28 -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 +1 -14
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -13
  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 +5 -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 +105 -9
  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 +2 -27
  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 +7 -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 -317
  377. package/dist/vite/application_manifest_plugin.js.map +0 -1
  378. package/src/core/__tests__/ApolloClient.test.ts +0 -646
  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 -1199
  401. package/src/vite/absolute_asset_imports_plugin.ts +0 -22
  402. package/src/vite/application_manifest_plugin.ts +0 -539
  403. /package/dist/{react → openai/react}/hooks/useToolName.d.ts +0 -0
  404. /package/dist/{react → openai/react}/hooks/useWidgetState.js +0 -0
@@ -1,22 +0,0 @@
1
- export const AbsoluteAssetImportsPlugin = () => {
2
- return {
3
- name: "absolute-asset-imports",
4
-
5
- transformIndexHtml(html: string, ctx: any) {
6
- if (!ctx.server) return html;
7
-
8
- let baseUrl = (
9
- ctx.server.config?.server?.origin ?? ctx.server.resolvedUrls?.local[0]
10
- ).replace(/\/$/, "");
11
- baseUrl = baseUrl.replace(/\/$/, "");
12
-
13
- return (
14
- html
15
- // import "/@vite/..." or "/@react-refresh"
16
- .replace(/(from\s+["'])\/([^"']+)/g, `$1${baseUrl}/$2`)
17
- // src="/src/..."
18
- .replace(/(src=["'])\/([^"']+)/gi, `$1${baseUrl}/$2`)
19
- );
20
- },
21
- };
22
- };
@@ -1,539 +0,0 @@
1
- import { readFileSync, writeFileSync, mkdirSync } from "fs";
2
- import { glob } from "glob";
3
- import { gqlPluckFromCodeStringSync } from "@graphql-tools/graphql-tag-pluck";
4
- import { createHash } from "crypto";
5
- import type {
6
- ArgumentNode,
7
- ListTypeNode,
8
- NamedTypeNode,
9
- NonNullTypeNode,
10
- TypeNode,
11
- ValueNode,
12
- DocumentNode,
13
- OperationDefinitionNode,
14
- DirectiveNode,
15
- } from "graphql";
16
- import { Kind, parse, print } from "graphql";
17
- import { ApolloClient, ApolloLink, InMemoryCache } from "@apollo/client";
18
- import { removeDirectivesFromDocument } from "@apollo/client/utilities/internal";
19
- import { of } from "rxjs";
20
- import path from "path";
21
- import type {
22
- ApplicationManifest,
23
- ManifestExtraInput,
24
- ManifestLabels,
25
- ManifestTool,
26
- ManifestWidgetSettings,
27
- } from "../types/application-manifest.js";
28
-
29
- const root = process.cwd();
30
-
31
- function getRawValue(node: ValueNode): unknown {
32
- switch (node.kind) {
33
- case Kind.STRING:
34
- case Kind.BOOLEAN:
35
- return node.value;
36
- case Kind.LIST:
37
- return node.values.map(getRawValue);
38
- case Kind.OBJECT:
39
- return node.fields.reduce<Record<string, any>>((acc, field) => {
40
- acc[field.name.value] = getRawValue(field.value);
41
- return acc;
42
- }, {});
43
- default:
44
- throw new Error(
45
- `Error when parsing directive values: unexpected type '${node.kind}'`
46
- );
47
- }
48
- }
49
-
50
- function getArgumentValue(
51
- argument: ArgumentNode,
52
- expectedType: Kind.STRING
53
- ): string;
54
-
55
- function getArgumentValue(
56
- argument: ArgumentNode,
57
- expectedType: Kind.BOOLEAN
58
- ): boolean;
59
-
60
- function getArgumentValue(
61
- argument: ArgumentNode,
62
- expectedType: Kind.LIST
63
- ): unknown[];
64
-
65
- function getArgumentValue(
66
- argument: ArgumentNode,
67
- expectedType: Kind.OBJECT
68
- ): Record<string, unknown>;
69
-
70
- function getArgumentValue(argument: ArgumentNode, expectedType: Kind) {
71
- const argumentType = argument.value.kind;
72
-
73
- invariant(
74
- argumentType === expectedType,
75
- `Expected argument '${argument.name.value}' to be of type '${expectedType}' but found '${argumentType}' instead.`
76
- );
77
-
78
- return getRawValue(argument.value);
79
- }
80
-
81
- interface GetArgumentNodeOptions {
82
- required?: boolean;
83
- }
84
-
85
- function getDirectiveArgument(
86
- argumentName: string,
87
- directive: DirectiveNode,
88
- opts: GetArgumentNodeOptions & { required: true }
89
- ): ArgumentNode;
90
-
91
- function getDirectiveArgument(
92
- argumentName: string,
93
- directive: DirectiveNode,
94
- opts?: GetArgumentNodeOptions
95
- ): ArgumentNode | undefined;
96
-
97
- function getDirectiveArgument(
98
- argumentName: string,
99
- directive: DirectiveNode,
100
- { required = false }: { required?: boolean } = {}
101
- ) {
102
- const argument = directive.arguments?.find(
103
- (directiveArgument) => directiveArgument.name.value === argumentName
104
- );
105
-
106
- invariant(
107
- argument || !required,
108
- `'${argumentName}' argument must be supplied for @tool`
109
- );
110
-
111
- return argument;
112
- }
113
-
114
- function getTypeName(type: TypeNode): string {
115
- let t = type;
116
- while (t.kind === "NonNullType" || t.kind === "ListType") {
117
- t = (t as NonNullTypeNode | ListTypeNode).type;
118
- }
119
- return (t as NamedTypeNode).name.value;
120
- }
121
-
122
- export const ApplicationManifestPlugin = () => {
123
- const cache = new Map();
124
- let packageJson: any = null;
125
- let config: any = null;
126
-
127
- const clientCache = new InMemoryCache();
128
- const client = new ApolloClient({
129
- cache: clientCache,
130
- link: new ApolloLink((operation) => {
131
- const body = print(
132
- removeClientDirective(sortTopLevelDefinitions(operation.query))
133
- );
134
- const name = operation.operationName;
135
- const definition = operation.query.definitions.find(
136
- (d) => d.kind === "OperationDefinition"
137
- );
138
-
139
- // Use `operation.query` so that the error reflects the end-user defined
140
- // document, not our sorted one
141
- invariant(
142
- definition,
143
- `Document does not contain an operation:\n${print(operation.query)}`
144
- );
145
-
146
- const { directives, operation: type } = definition;
147
-
148
- const variables = definition.variableDefinitions?.reduce(
149
- (obj, varDef) => ({
150
- ...obj,
151
- [varDef.variable.name.value]: getTypeName(varDef.type),
152
- }),
153
- {}
154
- );
155
-
156
- const prefetch = directives?.some((d) => d.name.value === "prefetch");
157
- const id = createHash("sha256").update(body).digest("hex");
158
- // TODO: For now, you can only have 1 operation marked as prefetch. In the future, we'll likely support more than 1, and the "prefetchId" will be defined on the `@prefetch` itself as an argument
159
- const prefetchID = prefetch ? "__anonymous" : undefined;
160
-
161
- const tools = directives
162
- ?.filter((d) => d.name.value === "tool")
163
- .map((directive) => {
164
- const name = getArgumentValue(
165
- getDirectiveArgument("name", directive, { required: true }),
166
- Kind.STRING
167
- );
168
-
169
- invariant(
170
- name.indexOf(" ") === -1,
171
- `Tool with name "${name}" contains spaces which is not allowed.`
172
- );
173
-
174
- const description = getArgumentValue(
175
- getDirectiveArgument("description", directive, { required: true }),
176
- Kind.STRING
177
- );
178
-
179
- const extraInputsNode = getDirectiveArgument(
180
- "extraInputs",
181
- directive
182
- );
183
-
184
- const labelsNode = getDirectiveArgument("labels", directive);
185
-
186
- const toolOptions: ManifestTool = {
187
- name,
188
- description,
189
- };
190
-
191
- if (extraInputsNode) {
192
- toolOptions.extraInputs = getArgumentValue(
193
- extraInputsNode,
194
- Kind.LIST
195
- ) as ManifestExtraInput[];
196
- }
197
-
198
- if (labelsNode) {
199
- const labels = getLabelsFromConfig(
200
- getArgumentValue(labelsNode, Kind.OBJECT)
201
- );
202
-
203
- if (labels) {
204
- toolOptions.labels = labels;
205
- }
206
- }
207
-
208
- return toolOptions;
209
- });
210
-
211
- // TODO: Make this object satisfy the `ManifestOperation` type. Currently
212
- // it errors because we need more validation on a few of these fields
213
- return of({
214
- data: { id, name, type, body, variables, prefetch, prefetchID, tools },
215
- });
216
- }),
217
- });
218
-
219
- const processFile = async (file: string) => {
220
- const code = readFileSync(file, "utf-8");
221
-
222
- if (!code.includes("gql")) return;
223
-
224
- const fileHash = createHash("md5").update(code).digest("hex");
225
- if (cache.get("file")?.hash === fileHash) return;
226
- const sources = gqlPluckFromCodeStringSync(file, code, {
227
- modules: [
228
- { name: "graphql-tag", identifier: "gql" },
229
- { name: "@apollo/client", identifier: "gql" },
230
- ],
231
- }).map((source) => ({
232
- node: parse(source.body),
233
- file,
234
- location: source.locationOffset,
235
- }));
236
-
237
- const operations = [];
238
- for (const source of sources) {
239
- const type = (
240
- source.node.definitions.find(
241
- (d) => d.kind === "OperationDefinition"
242
- ) as OperationDefinitionNode
243
- ).operation;
244
-
245
- let result;
246
- if (type === "query") {
247
- result = await client.query({
248
- query: source.node,
249
- fetchPolicy: "no-cache",
250
- });
251
- } else if (type === "mutation") {
252
- result = await client.mutate({
253
- mutation: source.node,
254
- fetchPolicy: "no-cache",
255
- });
256
- } else {
257
- throw new Error(
258
- "Found an unsupported operation type. Only Query and Mutation are supported."
259
- );
260
- }
261
- operations.push(result.data);
262
- }
263
-
264
- cache.set(file, {
265
- file: file,
266
- hash: fileHash,
267
- operations,
268
- });
269
- };
270
-
271
- const generateManifest = async () => {
272
- const operations = Array.from(cache.values()).flatMap(
273
- (entry) => entry.operations
274
- );
275
-
276
- invariant(
277
- operations.filter((o) => o.prefetch).length <= 1,
278
- "Found multiple operations marked as `@prefetch`. You can only mark 1 operation with `@prefetch`."
279
- );
280
-
281
- let resource = "";
282
- if (config.command === "serve") {
283
- resource =
284
- packageJson.entry?.[config.mode] ??
285
- `http${config.server.https ? "s" : ""}://${config.server.host ?? "localhost"}:${config.server.port}`;
286
- } else {
287
- let entryPoint = packageJson.entry?.[config.mode];
288
- if (entryPoint) {
289
- resource = entryPoint;
290
- } else if (config.mode === "production") {
291
- resource = "index.html";
292
- } else {
293
- throw new Error(
294
- `No entry point found for mode "${config.mode}". Entry points other than "development" and "production" must be defined in package.json file.`
295
- );
296
- }
297
- }
298
-
299
- const manifest: ApplicationManifest = {
300
- format: "apollo-ai-app-manifest",
301
- version: "1",
302
- name: packageJson.name,
303
- description: packageJson.description,
304
- hash: createHash("sha256").update(Date.now().toString()).digest("hex"),
305
- operations: Array.from(cache.values()).flatMap(
306
- (entry) => entry.operations
307
- ),
308
- resource,
309
- csp: {
310
- connectDomains: packageJson.csp?.connectDomains ?? [],
311
- frameDomains: packageJson.csp?.frameDomains ?? [],
312
- redirectDomains: packageJson.csp?.redirectDomains ?? [],
313
- resourceDomains: packageJson.csp?.resourceDomains ?? [],
314
- },
315
- };
316
-
317
- if (
318
- packageJson.widgetSettings &&
319
- isNonEmptyObject(packageJson.widgetSettings)
320
- ) {
321
- function validateWidgetSetting(
322
- key: keyof ManifestWidgetSettings,
323
- type: "string" | "boolean"
324
- ) {
325
- if (key in widgetSettings) {
326
- invariant(
327
- typeof widgetSettings[key] === type,
328
- `Expected 'widgetSettings.${key}' to be of type '${type}' but found '${typeof widgetSettings[key]}' instead.`
329
- );
330
- }
331
- }
332
-
333
- const widgetSettings =
334
- packageJson.widgetSettings as ManifestWidgetSettings;
335
-
336
- validateWidgetSetting("prefersBorder", "boolean");
337
- validateWidgetSetting("description", "string");
338
- validateWidgetSetting("domain", "string");
339
-
340
- manifest.widgetSettings = packageJson.widgetSettings;
341
- }
342
-
343
- if (packageJson.labels) {
344
- const labels = getLabelsFromConfig(packageJson.labels);
345
-
346
- if (labels) {
347
- manifest.labels = labels;
348
- }
349
- }
350
-
351
- // Always write to build directory so the MCP server picks it up
352
- const dest = path.resolve(
353
- root,
354
- config.build.outDir,
355
- ".application-manifest.json"
356
- );
357
- mkdirSync(path.dirname(dest), { recursive: true });
358
- writeFileSync(dest, JSON.stringify(manifest));
359
-
360
- // Always write to the dev location so that the app can bundle the manifest content
361
- writeFileSync(".application-manifest.json", JSON.stringify(manifest));
362
- };
363
-
364
- return {
365
- name: "OperationManifest",
366
-
367
- async configResolved(resolvedConfig: any) {
368
- config = resolvedConfig;
369
- },
370
-
371
- async buildStart() {
372
- // Read package.json on start
373
- packageJson = JSON.parse(readFileSync("package.json", "utf-8"));
374
-
375
- // Scan all files on startup
376
- const files = await glob("src/**/*.{ts,tsx,js,jsx}");
377
-
378
- for (const file of files) {
379
- const fullPath = path.resolve(root, file);
380
- await processFile(fullPath);
381
- }
382
-
383
- // We don't want to do this here on builds cause it just gets overwritten anyways. We'll call it on writeBundle instead.
384
- if (config.command === "serve") {
385
- await generateManifest();
386
- }
387
- },
388
-
389
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
390
- configureServer(server: any) {
391
- server.watcher.on("change", async (file: string) => {
392
- if (file.endsWith("package.json")) {
393
- packageJson = JSON.parse(readFileSync("package.json", "utf-8"));
394
- await generateManifest();
395
- } else if (file.match(/\.(jsx?|tsx?)$/)) {
396
- await processFile(file);
397
- await generateManifest();
398
- }
399
- });
400
- },
401
-
402
- async writeBundle() {
403
- await generateManifest();
404
- },
405
- };
406
- };
407
-
408
- // Sort the definitions in this document so that operations come before fragments,
409
- // and so that each kind of definition is sorted by name.
410
- export function sortTopLevelDefinitions(query: DocumentNode): DocumentNode {
411
- const definitions = [...query.definitions];
412
- // We want to avoid unnecessary dependencies, so write out a comparison
413
- // function instead of using _.orderBy.
414
- definitions.sort((a, b) => {
415
- // This is a reverse sort by kind, so that OperationDefinition precedes FragmentDefinition.
416
- if (a.kind > b.kind) {
417
- return -1;
418
- }
419
- if (a.kind < b.kind) {
420
- return 1;
421
- }
422
-
423
- // Extract the name from each definition. Jump through some hoops because
424
- // non-executable definitions don't have to have names (even though any
425
- // DocumentNode actually passed here should only have executable
426
- // definitions).
427
- const aName =
428
- a.kind === "OperationDefinition" || a.kind === "FragmentDefinition" ?
429
- (a.name?.value ?? "")
430
- : "";
431
- const bName =
432
- b.kind === "OperationDefinition" || b.kind === "FragmentDefinition" ?
433
- (b.name?.value ?? "")
434
- : "";
435
-
436
- // Sort by name ascending.
437
- if (aName < bName) {
438
- return -1;
439
- }
440
- if (aName > bName) {
441
- return 1;
442
- }
443
-
444
- // Assuming that the document is "valid", no operation or fragment name can appear
445
- // more than once, so we don't need to differentiate further to have a deterministic
446
- // sort.
447
- return 0;
448
- });
449
- return {
450
- ...query,
451
- definitions,
452
- };
453
- }
454
-
455
- interface LabelConfig {
456
- toolInvocation?: {
457
- invoking?: string;
458
- invoked?: string;
459
- };
460
- }
461
-
462
- function getLabelsFromConfig(config: LabelConfig): ManifestLabels | undefined {
463
- if (!("toolInvocation" in config)) {
464
- return;
465
- }
466
-
467
- const { toolInvocation } = config;
468
- const labels: ManifestLabels = {};
469
-
470
- if (Object.hasOwn(toolInvocation, "invoking")) {
471
- validateType(toolInvocation.invoking, "string", {
472
- propertyName: "labels.toolInvocation.invoking",
473
- });
474
-
475
- labels["toolInvocation/invoking"] = toolInvocation.invoking;
476
- }
477
-
478
- if (Object.hasOwn(toolInvocation, "invoked")) {
479
- validateType(toolInvocation.invoked, "string", {
480
- propertyName: "labels.toolInvocation.invoked",
481
- });
482
-
483
- labels["toolInvocation/invoked"] = toolInvocation.invoked;
484
- }
485
-
486
- if (isNonEmptyObject(labels)) {
487
- return labels;
488
- }
489
- }
490
-
491
- function removeClientDirective(doc: DocumentNode) {
492
- return removeDirectivesFromDocument(
493
- [{ name: "prefetch" }, { name: "tool" }],
494
- doc
495
- )!;
496
- }
497
-
498
- function invariant(condition: any, message: string): asserts condition {
499
- if (!condition) {
500
- throw new Error(message);
501
- }
502
- }
503
-
504
- // possible values of `typeof`
505
- type TypeofResult =
506
- | "string"
507
- | "number"
508
- | "bigint"
509
- | "boolean"
510
- | "symbol"
511
- | "undefined"
512
- | "object"
513
- | "function";
514
-
515
- type TypeofResultToConcreteType<T extends TypeofResult> =
516
- T extends "string" ? string
517
- : T extends "number" ? number
518
- : T extends "bigint" ? bigint
519
- : T extends "boolean" ? boolean
520
- : T extends "symbol" ? symbol
521
- : T extends "undefined" ? undefined
522
- : T extends "object" ? object
523
- : T extends "function" ? Function
524
- : never;
525
-
526
- function validateType<Typeof extends TypeofResult>(
527
- value: unknown,
528
- expectedType: Typeof,
529
- options: { propertyName: string }
530
- ): asserts value is TypeofResultToConcreteType<Typeof> {
531
- invariant(
532
- typeof value === expectedType,
533
- `Expected '${options.propertyName}' to be of type '${expectedType}' but found '${typeof value}' instead.`
534
- );
535
- }
536
-
537
- function isNonEmptyObject(obj: object) {
538
- return Object.keys(obj).length > 0;
539
- }