@wix/mcp 1.0.75 → 1.0.76

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 (277) hide show
  1. package/build/bin-standalone.js +83486 -12285
  2. package/build/dts/index.d.ts +1 -0
  3. package/build/dts/index.js +0 -1
  4. package/build/dts/infra/tool-bi.d.ts +4 -4
  5. package/build/dts/infra/tool-bi.js +1 -1
  6. package/build/dts/toolkit-entry.d.cts +410 -0
  7. package/build/dts/toolkit-entry.d.ts +409 -19
  8. package/build/dts/toolkit-entry.js +0 -1
  9. package/build/dts/toolkit-types.d.ts +31 -0
  10. package/build/dts/toolkit-types.js +12 -0
  11. package/build/dts/toolkit.d.ts +5 -5
  12. package/package.json +26 -19
  13. package/build/bin-standalone.js.map +0 -7
  14. package/build/cjs/index.cjs.map +0 -7
  15. package/build/cjs/toolkit.cjs.map +0 -7
  16. package/build/dts/api-call/index.d.ts.map +0 -1
  17. package/build/dts/api-call/index.js.map +0 -1
  18. package/build/dts/api-call/upload-image-tool.d.ts.map +0 -1
  19. package/build/dts/api-call/upload-image-tool.js.map +0 -1
  20. package/build/dts/api-call/upload-image-tool.test.d.ts +0 -2
  21. package/build/dts/api-call/upload-image-tool.test.d.ts.map +0 -1
  22. package/build/dts/api-call/upload-image-tool.test.js +0 -217
  23. package/build/dts/api-call/upload-image-tool.test.js.map +0 -1
  24. package/build/dts/api-call/upload-image-utils.d.ts.map +0 -1
  25. package/build/dts/api-call/upload-image-utils.js.map +0 -1
  26. package/build/dts/api-call/upload-image-utils.test.d.ts +0 -2
  27. package/build/dts/api-call/upload-image-utils.test.d.ts.map +0 -1
  28. package/build/dts/api-call/upload-image-utils.test.js +0 -121
  29. package/build/dts/api-call/upload-image-utils.test.js.map +0 -1
  30. package/build/dts/api-call/validation.d.ts.map +0 -1
  31. package/build/dts/api-call/validation.js.map +0 -1
  32. package/build/dts/api-call/validation.test.d.ts +0 -2
  33. package/build/dts/api-call/validation.test.d.ts.map +0 -1
  34. package/build/dts/api-call/validation.test.js +0 -42
  35. package/build/dts/api-call/validation.test.js.map +0 -1
  36. package/build/dts/auth/auth-error-handling.test.d.ts +0 -2
  37. package/build/dts/auth/auth-error-handling.test.d.ts.map +0 -1
  38. package/build/dts/auth/auth-error-handling.test.js +0 -347
  39. package/build/dts/auth/auth-error-handling.test.js.map +0 -1
  40. package/build/dts/auth/index.d.ts.map +0 -1
  41. package/build/dts/auth/index.js.map +0 -1
  42. package/build/dts/bin.d.ts.map +0 -1
  43. package/build/dts/bin.js.map +0 -1
  44. package/build/dts/cli-tools/account-auth-strategy.d.ts.map +0 -1
  45. package/build/dts/cli-tools/account-auth-strategy.js.map +0 -1
  46. package/build/dts/cli-tools/account-token-store.d.ts.map +0 -1
  47. package/build/dts/cli-tools/account-token-store.js.map +0 -1
  48. package/build/dts/cli-tools/cli.d.ts.map +0 -1
  49. package/build/dts/cli-tools/cli.js.map +0 -1
  50. package/build/dts/cli-tools/utils.d.ts.map +0 -1
  51. package/build/dts/cli-tools/utils.js.map +0 -1
  52. package/build/dts/code-mode/index.d.ts.map +0 -1
  53. package/build/dts/code-mode/index.js.map +0 -1
  54. package/build/dts/code-mode/index.test.d.ts +0 -2
  55. package/build/dts/code-mode/index.test.d.ts.map +0 -1
  56. package/build/dts/code-mode/index.test.js +0 -342
  57. package/build/dts/code-mode/index.test.js.map +0 -1
  58. package/build/dts/code-mode/truncate-response.d.ts.map +0 -1
  59. package/build/dts/code-mode/truncate-response.js.map +0 -1
  60. package/build/dts/code-mode/truncate-response.test.d.ts +0 -2
  61. package/build/dts/code-mode/truncate-response.test.d.ts.map +0 -1
  62. package/build/dts/code-mode/truncate-response.test.js +0 -32
  63. package/build/dts/code-mode/truncate-response.test.js.map +0 -1
  64. package/build/dts/code-mode/validation.d.ts.map +0 -1
  65. package/build/dts/code-mode/validation.js.map +0 -1
  66. package/build/dts/code-mode/validation.test.d.ts +0 -2
  67. package/build/dts/code-mode/validation.test.d.ts.map +0 -1
  68. package/build/dts/code-mode/validation.test.js +0 -72
  69. package/build/dts/code-mode/validation.test.js.map +0 -1
  70. package/build/dts/config/default-config.bulk-preference.test.d.ts +0 -2
  71. package/build/dts/config/default-config.bulk-preference.test.d.ts.map +0 -1
  72. package/build/dts/config/default-config.bulk-preference.test.js +0 -42
  73. package/build/dts/config/default-config.bulk-preference.test.js.map +0 -1
  74. package/build/dts/config/default-config.d.ts.map +0 -1
  75. package/build/dts/config/default-config.execute-orchestration.test.d.ts +0 -2
  76. package/build/dts/config/default-config.execute-orchestration.test.d.ts.map +0 -1
  77. package/build/dts/config/default-config.execute-orchestration.test.js +0 -40
  78. package/build/dts/config/default-config.execute-orchestration.test.js.map +0 -1
  79. package/build/dts/config/default-config.js.map +0 -1
  80. package/build/dts/config/default-config.readme.test.d.ts +0 -2
  81. package/build/dts/config/default-config.readme.test.d.ts.map +0 -1
  82. package/build/dts/config/default-config.readme.test.js +0 -84
  83. package/build/dts/config/default-config.readme.test.js.map +0 -1
  84. package/build/dts/config/default-config.searchspec-goal.test.d.ts +0 -2
  85. package/build/dts/config/default-config.searchspec-goal.test.d.ts.map +0 -1
  86. package/build/dts/config/default-config.searchspec-goal.test.js +0 -30
  87. package/build/dts/config/default-config.searchspec-goal.test.js.map +0 -1
  88. package/build/dts/config/param-descriptions.d.ts.map +0 -1
  89. package/build/dts/config/param-descriptions.js.map +0 -1
  90. package/build/dts/constants.d.ts.map +0 -1
  91. package/build/dts/constants.js.map +0 -1
  92. package/build/dts/docs/browse-menu.d.ts.map +0 -1
  93. package/build/dts/docs/browse-menu.js.map +0 -1
  94. package/build/dts/docs/browse-menu.test.d.ts +0 -2
  95. package/build/dts/docs/browse-menu.test.d.ts.map +0 -1
  96. package/build/dts/docs/browse-menu.test.js +0 -66
  97. package/build/dts/docs/browse-menu.test.js.map +0 -1
  98. package/build/dts/docs/browse-tool.test.d.ts +0 -2
  99. package/build/dts/docs/browse-tool.test.d.ts.map +0 -1
  100. package/build/dts/docs/browse-tool.test.js +0 -77
  101. package/build/dts/docs/browse-tool.test.js.map +0 -1
  102. package/build/dts/docs/create-site-guide.d.ts.map +0 -1
  103. package/build/dts/docs/create-site-guide.js.map +0 -1
  104. package/build/dts/docs/docs.d.ts.map +0 -1
  105. package/build/dts/docs/docs.js.map +0 -1
  106. package/build/dts/docs/fetch-article.d.ts.map +0 -1
  107. package/build/dts/docs/fetch-article.js.map +0 -1
  108. package/build/dts/docs/fetch-article.test.d.ts +0 -2
  109. package/build/dts/docs/fetch-article.test.d.ts.map +0 -1
  110. package/build/dts/docs/fetch-article.test.js +0 -93
  111. package/build/dts/docs/fetch-article.test.js.map +0 -1
  112. package/build/dts/docs/fetch-skills.d.ts.map +0 -1
  113. package/build/dts/docs/fetch-skills.js.map +0 -1
  114. package/build/dts/docs/fetch-skills.test.d.ts +0 -2
  115. package/build/dts/docs/fetch-skills.test.d.ts.map +0 -1
  116. package/build/dts/docs/fetch-skills.test.js +0 -140
  117. package/build/dts/docs/fetch-skills.test.js.map +0 -1
  118. package/build/dts/docs/get-to-know.d.ts.map +0 -1
  119. package/build/dts/docs/get-to-know.js.map +0 -1
  120. package/build/dts/docs/get-to-know.test.d.ts +0 -2
  121. package/build/dts/docs/get-to-know.test.d.ts.map +0 -1
  122. package/build/dts/docs/get-to-know.test.js +0 -152
  123. package/build/dts/docs/get-to-know.test.js.map +0 -1
  124. package/build/dts/docs/long-content.d.ts.map +0 -1
  125. package/build/dts/docs/long-content.js.map +0 -1
  126. package/build/dts/docs/normalize-menu-content.d.ts.map +0 -1
  127. package/build/dts/docs/normalize-menu-content.js.map +0 -1
  128. package/build/dts/docs/searchFormatting.d.ts.map +0 -1
  129. package/build/dts/docs/searchFormatting.js.map +0 -1
  130. package/build/dts/docs/searchFormatting.test.d.ts +0 -2
  131. package/build/dts/docs/searchFormatting.test.d.ts.map +0 -1
  132. package/build/dts/docs/searchFormatting.test.js +0 -102
  133. package/build/dts/docs/searchFormatting.test.js.map +0 -1
  134. package/build/dts/docs/semanticSearch.d.ts.map +0 -1
  135. package/build/dts/docs/semanticSearch.js.map +0 -1
  136. package/build/dts/docs/semanticSearch.test.d.ts +0 -2
  137. package/build/dts/docs/semanticSearch.test.d.ts.map +0 -1
  138. package/build/dts/docs/semanticSearch.test.js +0 -923
  139. package/build/dts/docs/semanticSearch.test.js.map +0 -1
  140. package/build/dts/docs/velo-readme.d.ts.map +0 -1
  141. package/build/dts/docs/velo-readme.js.map +0 -1
  142. package/build/dts/import-claude-design-tool/banner.d.ts.map +0 -1
  143. package/build/dts/import-claude-design-tool/banner.js.map +0 -1
  144. package/build/dts/import-claude-design-tool/constants.d.ts.map +0 -1
  145. package/build/dts/import-claude-design-tool/constants.js.map +0 -1
  146. package/build/dts/import-claude-design-tool/index.d.ts.map +0 -1
  147. package/build/dts/import-claude-design-tool/index.js.map +0 -1
  148. package/build/dts/import-claude-design-tool/index.test.d.ts +0 -2
  149. package/build/dts/import-claude-design-tool/index.test.d.ts.map +0 -1
  150. package/build/dts/import-claude-design-tool/index.test.js +0 -329
  151. package/build/dts/import-claude-design-tool/index.test.js.map +0 -1
  152. package/build/dts/import-claude-design-tool/sanitize.d.ts.map +0 -1
  153. package/build/dts/import-claude-design-tool/sanitize.js.map +0 -1
  154. package/build/dts/import-claude-design-tool/wixstro-client.d.ts.map +0 -1
  155. package/build/dts/import-claude-design-tool/wixstro-client.js.map +0 -1
  156. package/build/dts/index.d.ts.map +0 -1
  157. package/build/dts/index.js.map +0 -1
  158. package/build/dts/infra/bi-logger.d.ts.map +0 -1
  159. package/build/dts/infra/bi-logger.js.map +0 -1
  160. package/build/dts/infra/environment.d.ts.map +0 -1
  161. package/build/dts/infra/environment.js.map +0 -1
  162. package/build/dts/infra/file-logger.d.ts.map +0 -1
  163. package/build/dts/infra/file-logger.js.map +0 -1
  164. package/build/dts/infra/logger.d.ts.map +0 -1
  165. package/build/dts/infra/logger.js.map +0 -1
  166. package/build/dts/infra/panorama.d.ts.map +0 -1
  167. package/build/dts/infra/panorama.js.map +0 -1
  168. package/build/dts/infra/response-size-limits.d.ts.map +0 -1
  169. package/build/dts/infra/response-size-limits.js.map +0 -1
  170. package/build/dts/infra/sentry.d.ts.map +0 -1
  171. package/build/dts/infra/sentry.js.map +0 -1
  172. package/build/dts/infra/tool-bi.d.ts.map +0 -1
  173. package/build/dts/infra/tool-bi.js.map +0 -1
  174. package/build/dts/infra/widget-payload.d.ts.map +0 -1
  175. package/build/dts/infra/widget-payload.js.map +0 -1
  176. package/build/dts/resources/docs.d.ts.map +0 -1
  177. package/build/dts/resources/docs.js.map +0 -1
  178. package/build/dts/site-widget-tools/claim-site-tool/index.d.ts.map +0 -1
  179. package/build/dts/site-widget-tools/claim-site-tool/index.js.map +0 -1
  180. package/build/dts/site-widget-tools/constants.d.ts.map +0 -1
  181. package/build/dts/site-widget-tools/constants.js.map +0 -1
  182. package/build/dts/site-widget-tools/create-site-from-template-tool/index.d.ts.map +0 -1
  183. package/build/dts/site-widget-tools/create-site-from-template-tool/index.js.map +0 -1
  184. package/build/dts/site-widget-tools/edit-site-tool/index.d.ts.map +0 -1
  185. package/build/dts/site-widget-tools/edit-site-tool/index.js.map +0 -1
  186. package/build/dts/site-widget-tools/index.d.ts.map +0 -1
  187. package/build/dts/site-widget-tools/index.js.map +0 -1
  188. package/build/dts/site-widget-tools/pull-site-creation-job-tool/index.d.ts.map +0 -1
  189. package/build/dts/site-widget-tools/pull-site-creation-job-tool/index.js.map +0 -1
  190. package/build/dts/site-widget-tools/search-site-templates-tool/index.d.ts.map +0 -1
  191. package/build/dts/site-widget-tools/search-site-templates-tool/index.js.map +0 -1
  192. package/build/dts/site-widget-tools/site-builder-tool/index.d.ts.map +0 -1
  193. package/build/dts/site-widget-tools/site-builder-tool/index.js.map +0 -1
  194. package/build/dts/site-widget-tools/site-builder-tool/index.test.d.ts +0 -2
  195. package/build/dts/site-widget-tools/site-builder-tool/index.test.d.ts.map +0 -1
  196. package/build/dts/site-widget-tools/site-builder-tool/index.test.js +0 -46
  197. package/build/dts/site-widget-tools/site-builder-tool/index.test.js.map +0 -1
  198. package/build/dts/site-widget-tools/site-creation-tool/index.d.ts.map +0 -1
  199. package/build/dts/site-widget-tools/site-creation-tool/index.js.map +0 -1
  200. package/build/dts/site-widget-tools/site-creation-tool/index.test.d.ts +0 -2
  201. package/build/dts/site-widget-tools/site-creation-tool/index.test.d.ts.map +0 -1
  202. package/build/dts/site-widget-tools/site-creation-tool/index.test.js +0 -57
  203. package/build/dts/site-widget-tools/site-creation-tool/index.test.js.map +0 -1
  204. package/build/dts/site-widget-tools/suggested-domain-tool/index.d.ts.map +0 -1
  205. package/build/dts/site-widget-tools/suggested-domain-tool/index.js.map +0 -1
  206. package/build/dts/site-widget-tools/types.d.ts.map +0 -1
  207. package/build/dts/site-widget-tools/types.js.map +0 -1
  208. package/build/dts/site-widget-tools/utils.d.ts.map +0 -1
  209. package/build/dts/site-widget-tools/utils.js.map +0 -1
  210. package/build/dts/support/index.d.ts.map +0 -1
  211. package/build/dts/support/index.js.map +0 -1
  212. package/build/dts/tool-bi-reporting.test.d.ts +0 -2
  213. package/build/dts/tool-bi-reporting.test.d.ts.map +0 -1
  214. package/build/dts/tool-bi-reporting.test.js +0 -219
  215. package/build/dts/tool-bi-reporting.test.js.map +0 -1
  216. package/build/dts/tool-utils.d.ts.map +0 -1
  217. package/build/dts/tool-utils.js.map +0 -1
  218. package/build/dts/tool-utils.spec.d.ts +0 -2
  219. package/build/dts/tool-utils.spec.d.ts.map +0 -1
  220. package/build/dts/tool-utils.spec.js +0 -98
  221. package/build/dts/tool-utils.spec.js.map +0 -1
  222. package/build/dts/toolkit-entry.d.ts.map +0 -1
  223. package/build/dts/toolkit-entry.js.map +0 -1
  224. package/build/dts/toolkit-json-schema.test.d.ts +0 -2
  225. package/build/dts/toolkit-json-schema.test.d.ts.map +0 -1
  226. package/build/dts/toolkit-json-schema.test.js +0 -36
  227. package/build/dts/toolkit-json-schema.test.js.map +0 -1
  228. package/build/dts/toolkit.d.ts.map +0 -1
  229. package/build/dts/toolkit.js.map +0 -1
  230. package/build/dts/toolkit.test.d.ts +0 -2
  231. package/build/dts/toolkit.test.d.ts.map +0 -1
  232. package/build/dts/toolkit.test.js +0 -691
  233. package/build/dts/toolkit.test.js.map +0 -1
  234. package/build/dts/widget-manifest.d.ts.map +0 -1
  235. package/build/dts/widget-manifest.js.map +0 -1
  236. package/build/dts/wix-fetch-error.d.ts.map +0 -1
  237. package/build/dts/wix-fetch-error.js.map +0 -1
  238. package/build/dts/wix-mcp-server.d.ts.map +0 -1
  239. package/build/dts/wix-mcp-server.js.map +0 -1
  240. package/build/dts/wixel/api.d.ts.map +0 -1
  241. package/build/dts/wixel/api.js.map +0 -1
  242. package/build/dts/wixel/constants.d.ts.map +0 -1
  243. package/build/dts/wixel/constants.js.map +0 -1
  244. package/build/dts/wixel/external-agent-api.d.ts.map +0 -1
  245. package/build/dts/wixel/external-agent-api.js.map +0 -1
  246. package/build/dts/wixel/get-wixel-asset-tool.d.ts.map +0 -1
  247. package/build/dts/wixel/get-wixel-asset-tool.js.map +0 -1
  248. package/build/dts/wixel/get-wixel-job-status-tool.d.ts.map +0 -1
  249. package/build/dts/wixel/get-wixel-job-status-tool.js.map +0 -1
  250. package/build/dts/wixel/get-wixel-project-assets-tool.d.ts.map +0 -1
  251. package/build/dts/wixel/get-wixel-project-assets-tool.js.map +0 -1
  252. package/build/dts/wixel/index.d.ts.map +0 -1
  253. package/build/dts/wixel/index.js.map +0 -1
  254. package/build/dts/wixel/mark-wixel-job-as-fulfilled-tool.d.ts.map +0 -1
  255. package/build/dts/wixel/mark-wixel-job-as-fulfilled-tool.js.map +0 -1
  256. package/build/dts/wixel/open-headless-wixel-project-tool.d.ts.map +0 -1
  257. package/build/dts/wixel/open-headless-wixel-project-tool.js.map +0 -1
  258. package/build/dts/wixel/pull-headless-wixel-job-tool.d.ts.map +0 -1
  259. package/build/dts/wixel/pull-headless-wixel-job-tool.js.map +0 -1
  260. package/build/dts/wixel/update-headless-wixel-job-tool.d.ts.map +0 -1
  261. package/build/dts/wixel/update-headless-wixel-job-tool.js.map +0 -1
  262. package/build/dts/wixel/utils.d.ts.map +0 -1
  263. package/build/dts/wixel/utils.js.map +0 -1
  264. package/build/dts/wixel/wixel-bi.d.ts.map +0 -1
  265. package/build/dts/wixel/wixel-bi.js.map +0 -1
  266. package/build/dts/wixel/wixel-bi.test.d.ts +0 -2
  267. package/build/dts/wixel/wixel-bi.test.d.ts.map +0 -1
  268. package/build/dts/wixel/wixel-bi.test.js +0 -35
  269. package/build/dts/wixel/wixel-bi.test.js.map +0 -1
  270. package/build/dts/wixel/wixel-session-tools.d.ts.map +0 -1
  271. package/build/dts/wixel/wixel-session-tools.js.map +0 -1
  272. package/build/dts/wixel/wixel-session-tools.test.d.ts +0 -2
  273. package/build/dts/wixel/wixel-session-tools.test.d.ts.map +0 -1
  274. package/build/dts/wixel/wixel-session-tools.test.js +0 -143
  275. package/build/dts/wixel/wixel-session-tools.test.js.map +0 -1
  276. package/build/esm/index.js.map +0 -7
  277. package/build/esm/toolkit.js.map +0 -7
@@ -1,691 +0,0 @@
1
- import { describe, test, expect, vi, beforeEach } from 'vitest';
2
- import { createWixToolkit, extractText, formatToolResultAdditionalFields } from './toolkit.js';
3
- vi.mock('./docs/get-to-know.js', async (importOriginal) => {
4
- const original = await importOriginal();
5
- return {
6
- ...original,
7
- getDynamicContext: vi.fn().mockResolvedValue('')
8
- };
9
- });
10
- vi.mock('@wix/dynamic-context-enricher', async (importOriginal) => {
11
- const original = await importOriginal();
12
- return {
13
- ...original,
14
- getDynamicContext: vi.fn().mockResolvedValue('')
15
- };
16
- });
17
- // ---------------------------------------------------------------------------
18
- // Helpers
19
- // ---------------------------------------------------------------------------
20
- /** Minimal auth config for tests */
21
- const testAuth = {
22
- siteToken: async () => ({ Authorization: 'Bearer test-site-token' }),
23
- accountToken: async () => ({ Authorization: 'Bearer test-account-token' })
24
- };
25
- // ---------------------------------------------------------------------------
26
- // extractText
27
- // ---------------------------------------------------------------------------
28
- describe('extractText()', () => {
29
- test('extracts text from a single text block', () => {
30
- const result = {
31
- content: [{ type: 'text', text: 'hello world' }]
32
- };
33
- expect(extractText(result)).toBe('hello world');
34
- });
35
- test('concatenates multiple text blocks with newline', () => {
36
- const result = {
37
- content: [
38
- { type: 'text', text: 'line 1' },
39
- { type: 'text', text: 'line 2' }
40
- ]
41
- };
42
- expect(extractText(result)).toBe('line 1\nline 2');
43
- });
44
- test('filters out non-text content blocks', () => {
45
- const result = {
46
- content: [
47
- { type: 'text', text: 'hello' },
48
- { type: 'image', data: 'base64...', mimeType: 'image/png' },
49
- { type: 'text', text: 'world' }
50
- ]
51
- };
52
- expect(extractText(result)).toBe('hello\nworld');
53
- });
54
- test('returns empty string for content with no text blocks', () => {
55
- const result = {
56
- content: [
57
- { type: 'image', data: 'base64...', mimeType: 'image/png' }
58
- ]
59
- };
60
- expect(extractText(result)).toBe('');
61
- });
62
- test('returns empty string for empty content array', () => {
63
- const result = { content: [] };
64
- expect(extractText(result)).toBe('');
65
- });
66
- });
67
- describe('formatToolResultAdditionalFields()', () => {
68
- test('serializes a bounded successful result preview', () => {
69
- const result = {
70
- content: [{ type: 'text', text: 'hello world' }]
71
- };
72
- expect(JSON.parse(formatToolResultAdditionalFields(result))).toEqual({
73
- resultPreview: 'hello world',
74
- resultTextLength: 11,
75
- resultPreviewTruncated: false,
76
- resultContentTypes: ['text']
77
- });
78
- });
79
- test('truncates long text previews', () => {
80
- const result = {
81
- content: [{ type: 'text', text: 'x'.repeat(4001) }]
82
- };
83
- const additionalFields = JSON.parse(formatToolResultAdditionalFields(result));
84
- expect(additionalFields.resultPreview).toHaveLength(4000);
85
- expect(additionalFields.resultTextLength).toBe(4001);
86
- expect(additionalFields.resultPreviewTruncated).toBe(true);
87
- });
88
- test('keeps content type metadata for non-text results', () => {
89
- const result = {
90
- content: [
91
- { type: 'image', data: 'base64...', mimeType: 'image/png' }
92
- ]
93
- };
94
- expect(JSON.parse(formatToolResultAdditionalFields(result))).toEqual({
95
- resultPreview: '',
96
- resultTextLength: 0,
97
- resultPreviewTruncated: false,
98
- resultContentTypes: ['image']
99
- });
100
- });
101
- });
102
- // ---------------------------------------------------------------------------
103
- // createWixToolkit - tool registration
104
- // ---------------------------------------------------------------------------
105
- describe('createWixToolkit()', () => {
106
- test('registers docs and API tools by default', () => {
107
- const toolkit = createWixToolkit({ auth: testAuth });
108
- const names = toolkit.getToolNames();
109
- // Should have at least some docs tools and API tools
110
- expect(names.length).toBeGreaterThan(0);
111
- // WixREADME is registered by default (getToKnowWixEnabled defaults to false in addDocsTools,
112
- // but the toolkit passes authStrategy so it should still register docs tools)
113
- expect(names).toContain('SearchWixRESTDocumentation');
114
- expect(names).toContain('ReadFullDocsArticle');
115
- expect(names).toContain('CallWixSiteAPI');
116
- expect(names).toContain('ListWixSites');
117
- expect(names).toContain('ManageWixSite');
118
- });
119
- test('registers only specified docs tools', () => {
120
- const toolkit = createWixToolkit({
121
- auth: testAuth,
122
- docs: { tools: ['REST'] },
123
- api: { tools: [] }
124
- });
125
- const names = toolkit.getToolNames();
126
- expect(names).toContain('SearchWixRESTDocumentation');
127
- expect(names).not.toContain('SearchWixSDKDocumentation');
128
- });
129
- test('registers only specified API tools', () => {
130
- const toolkit = createWixToolkit({
131
- auth: testAuth,
132
- docs: { tools: [] },
133
- api: { tools: ['CallWixSiteAPI'] }
134
- });
135
- const names = toolkit.getToolNames();
136
- expect(names).toContain('CallWixSiteAPI');
137
- expect(names).not.toContain('ListWixSites');
138
- expect(names).not.toContain('ManageWixSite');
139
- });
140
- test('registers ExecuteWixAPI when requested with API tools', () => {
141
- const toolkit = createWixToolkit({
142
- auth: testAuth,
143
- docs: { tools: [] },
144
- api: { tools: ['CallWixSiteAPI', 'ExecuteWixAPI'] }
145
- });
146
- const names = toolkit.getToolNames();
147
- expect(names).toContain('CallWixSiteAPI');
148
- expect(names).toContain('ExecuteWixAPI');
149
- });
150
- test('preserves consumer ExecuteWixAPI description override', () => {
151
- const toolkit = createWixToolkit({
152
- auth: testAuth,
153
- docs: { tools: [] },
154
- api: {
155
- tools: ['ExecuteWixAPI'],
156
- toolDescriptions: { ExecuteWixAPI: 'custom execute description' }
157
- }
158
- });
159
- expect(toolkit.getTool('ExecuteWixAPI')?.description).toBe('custom execute description');
160
- });
161
- test('exclude filters out tools', () => {
162
- const toolkit = createWixToolkit({
163
- auth: testAuth,
164
- docs: { tools: ['REST'] },
165
- api: { tools: ['CallWixSiteAPI', 'ListWixSites'] },
166
- exclude: ['ListWixSites']
167
- });
168
- const names = toolkit.getToolNames();
169
- expect(names).toContain('CallWixSiteAPI');
170
- expect(names).not.toContain('ListWixSites');
171
- });
172
- test('getTool returns tool by name', () => {
173
- const toolkit = createWixToolkit({
174
- auth: testAuth,
175
- docs: { tools: ['REST'] },
176
- api: { tools: ['CallWixSiteAPI'] }
177
- });
178
- const tool = toolkit.getTool('CallWixSiteAPI');
179
- expect(tool).toBeDefined();
180
- expect(tool.name).toBe('CallWixSiteAPI');
181
- expect(tool.description).toBeTruthy();
182
- expect(tool.inputSchema).toBeDefined();
183
- expect(typeof tool.execute).toBe('function');
184
- });
185
- test('SearchWixAPISpec sends the caller credential on the loopback call', async () => {
186
- const fetchMock = vi
187
- .spyOn(globalThis, 'fetch')
188
- .mockImplementation(async () => Response.json({ result: 'ok' }));
189
- const toolkit = createWixToolkit({
190
- auth: testAuth,
191
- docs: { tools: [] },
192
- api: { tools: ['SearchWixAPISpec'] }
193
- });
194
- await toolkit
195
- .getTool('SearchWixAPISpec')
196
- .execute({ code: 'async () => 1', reason: 'test' });
197
- const [url, init] = fetchMock.mock.calls.at(-1);
198
- expect(url).toContain('/api/code-mode/search');
199
- expect(init.headers).toMatchObject({
200
- Authorization: 'Bearer test-account-token'
201
- });
202
- fetchMock.mockRestore();
203
- });
204
- test('getTool returns undefined for non-existent tool', () => {
205
- const toolkit = createWixToolkit({
206
- auth: testAuth,
207
- docs: { tools: [] },
208
- api: { tools: [] }
209
- });
210
- expect(toolkit.getTool('NonExistent')).toBeUndefined();
211
- });
212
- test('WixREADME is registered when getToKnowWixEnabled is true', () => {
213
- const toolkit = createWixToolkit({
214
- auth: testAuth,
215
- docs: { tools: ['REST'], getToKnowWixEnabled: true },
216
- api: { tools: [] }
217
- });
218
- expect(toolkit.getToolNames()).toContain('WixREADME');
219
- });
220
- test('WixREADME is not registered when getToKnowWixEnabled is false', () => {
221
- const toolkit = createWixToolkit({
222
- auth: testAuth,
223
- docs: { tools: ['REST'], getToKnowWixEnabled: false },
224
- api: { tools: [] }
225
- });
226
- expect(toolkit.getToolNames()).not.toContain('WixREADME');
227
- });
228
- test('GetSiteContext is registered when getToKnowWixEnabled is true', () => {
229
- const toolkit = createWixToolkit({
230
- auth: testAuth,
231
- docs: { getToKnowWixEnabled: true },
232
- api: { tools: [] }
233
- });
234
- expect(toolkit.getToolNames()).toContain('GetSiteContext');
235
- });
236
- test('GetSiteContext is registered regardless of getToKnowWixEnabled', () => {
237
- const toolkit = createWixToolkit({
238
- auth: testAuth,
239
- docs: { getToKnowWixEnabled: false },
240
- api: { tools: [] }
241
- });
242
- expect(toolkit.getToolNames()).toContain('GetSiteContext');
243
- });
244
- test('GetSiteContext is not registered when excluded', () => {
245
- const toolkit = createWixToolkit({
246
- auth: testAuth,
247
- docs: { getToKnowWixEnabled: true },
248
- api: { tools: [] },
249
- exclude: ['GetSiteContext']
250
- });
251
- expect(toolkit.getToolNames()).not.toContain('GetSiteContext');
252
- });
253
- test('GetSiteContext is registered even when WixREADME is disabled', () => {
254
- const toolkit = createWixToolkit({
255
- auth: testAuth,
256
- docs: { getToKnowWixEnabled: true },
257
- api: { tools: [] },
258
- exclude: ['WixREADME']
259
- });
260
- expect(toolkit.getToolNames()).toContain('GetSiteContext');
261
- });
262
- });
263
- // ---------------------------------------------------------------------------
264
- // createWixToolkit - conversationId
265
- // ---------------------------------------------------------------------------
266
- describe('createWixToolkit() - conversationId', () => {
267
- test('registers tools normally when conversationId is provided', () => {
268
- const toolkit = createWixToolkit({
269
- auth: testAuth,
270
- docs: { tools: [] },
271
- api: { tools: ['CallWixSiteAPI'] },
272
- conversationId: 'conv-123'
273
- });
274
- expect(toolkit.getToolNames()).toContain('CallWixSiteAPI');
275
- });
276
- test('registers tools normally when conversationId is omitted', () => {
277
- const toolkit = createWixToolkit({
278
- auth: testAuth,
279
- docs: { tools: [] },
280
- api: { tools: ['CallWixSiteAPI'] }
281
- });
282
- expect(toolkit.getToolNames()).toContain('CallWixSiteAPI');
283
- });
284
- });
285
- // ---------------------------------------------------------------------------
286
- // createWixToolkit - schema manipulation (defaults)
287
- // ---------------------------------------------------------------------------
288
- describe('createWixToolkit() - defaults', () => {
289
- test('defaults removes field from inputSchema', () => {
290
- const toolkit = createWixToolkit({
291
- auth: testAuth,
292
- docs: { tools: [] },
293
- api: { tools: ['CallWixSiteAPI'] },
294
- defaults: { siteId: 'my-site-id' }
295
- });
296
- const tool = toolkit.getTool('CallWixSiteAPI');
297
- const shape = tool.inputSchema.shape;
298
- // siteId should be removed from schema
299
- expect(shape.siteId).toBeUndefined();
300
- // Other fields should remain
301
- expect(shape.url).toBeDefined();
302
- expect(shape.method).toBeDefined();
303
- });
304
- test('defaults with empty value still removes field from schema', () => {
305
- const toolkit = createWixToolkit({
306
- auth: testAuth,
307
- docs: { tools: [] },
308
- api: { tools: ['CallWixSiteAPI'] },
309
- defaults: { siteId: '' }
310
- });
311
- const tool = toolkit.getTool('CallWixSiteAPI');
312
- const shape = tool.inputSchema.shape;
313
- expect(shape.siteId).toBeUndefined();
314
- expect(shape.url).toBeDefined();
315
- });
316
- test('defaults removes siteId from ExecuteWixAPI schema', () => {
317
- const toolkit = createWixToolkit({
318
- auth: testAuth,
319
- docs: { tools: [] },
320
- api: { tools: ['ExecuteWixAPI'] },
321
- defaults: { siteId: 'my-site-id' }
322
- });
323
- const tool = toolkit.getTool('ExecuteWixAPI');
324
- const shape = tool.inputSchema.shape;
325
- expect(shape.siteId).toBeUndefined();
326
- expect(shape.code).toBeDefined();
327
- expect(shape.reason).toBeDefined();
328
- expect(shape.hasMutations).toBeDefined();
329
- });
330
- });
331
- // ---------------------------------------------------------------------------
332
- // createWixToolkit - auth normalization
333
- // ---------------------------------------------------------------------------
334
- describe('createWixToolkit() - auth', () => {
335
- test('accepts McpAuthenticationStrategy directly', () => {
336
- const strategy = {
337
- getSiteAuthHeaders: async () => ({ Authorization: 'Bearer token' }),
338
- getAccountAuthHeaders: async () => ({ Authorization: 'Bearer token' })
339
- };
340
- // Should not throw -- create toolkit with no tools
341
- const toolkit = createWixToolkit({
342
- auth: strategy,
343
- docs: { tools: [] },
344
- api: { tools: [] },
345
- exclude: [
346
- 'BrowseWixRESTDocsMenu',
347
- 'ReadFullDocsArticle',
348
- 'ReadFullDocsMethodSchema',
349
- 'CreateWixBusinessGuide',
350
- 'GetSiteContext'
351
- ]
352
- });
353
- expect(toolkit.getTools()).toHaveLength(0);
354
- });
355
- test('accepts siteToken/accountToken functions', () => {
356
- // Should not throw
357
- const toolkit = createWixToolkit({
358
- auth: {
359
- siteToken: async () => ({ Authorization: 'Bearer site' }),
360
- accountToken: async () => ({ Authorization: 'Bearer account' })
361
- },
362
- docs: { tools: [] },
363
- api: { tools: [] },
364
- exclude: [
365
- 'BrowseWixRESTDocsMenu',
366
- 'ReadFullDocsArticle',
367
- 'ReadFullDocsMethodSchema',
368
- 'CreateWixBusinessGuide',
369
- 'GetSiteContext'
370
- ]
371
- });
372
- expect(toolkit.getTools()).toHaveLength(0);
373
- });
374
- });
375
- // ---------------------------------------------------------------------------
376
- // createWixToolkit - error flows (errorBody)
377
- // ---------------------------------------------------------------------------
378
- const mockHttpRequest = vi.hoisted(() => vi.fn());
379
- vi.mock('@wix/http-client', async (importOriginal) => {
380
- const original = await importOriginal();
381
- const MockHttpClient = vi
382
- .fn()
383
- .mockImplementation(() => ({ request: mockHttpRequest }));
384
- MockHttpClient.isHttpError = vi.fn().mockReturnValue(false);
385
- return { ...original, HttpClient: MockHttpClient };
386
- });
387
- describe('createWixToolkit() - error flows', () => {
388
- beforeEach(() => mockHttpRequest.mockReset());
389
- test('afterExecute receives isError result with content when tool returns a controlled error', async () => {
390
- const afterExecute = vi.fn();
391
- const toolkit = createWixToolkit({
392
- auth: testAuth,
393
- docs: { tools: [] },
394
- api: { tools: ['CallWixSiteAPI'] },
395
- defaults: { siteId: 'test-site' },
396
- hooks: { afterExecute }
397
- });
398
- // HTML response triggers CallWixSiteAPI to return { isError: true } without throwing
399
- mockHttpRequest.mockResolvedValue({
400
- status: 200,
401
- headers: {},
402
- data: '<!DOCTYPE html><html><body>Login page</body></html>'
403
- });
404
- const result = await toolkit.getTool('CallWixSiteAPI').execute({
405
- url: 'https://www.wixapis.com/test',
406
- method: 'GET',
407
- reason: 'test'
408
- });
409
- expect(result.isError).toBe(true);
410
- expect(extractText(result)).toMatch(/HTML/);
411
- expect(afterExecute).toHaveBeenCalledWith('CallWixSiteAPI', expect.objectContaining({ isError: true }), expect.any(Number));
412
- });
413
- test('onError is called with exception message when tool throws', async () => {
414
- const onError = vi.fn();
415
- const toolkit = createWixToolkit({
416
- // siteToken throwing causes the tool callback to throw before any HTTP call
417
- auth: {
418
- siteToken: async () => {
419
- throw new Error('Auth failed');
420
- },
421
- accountToken: async () => ({ Authorization: 'Bearer test' })
422
- },
423
- docs: { tools: [] },
424
- api: { tools: ['CallWixSiteAPI'] },
425
- defaults: { siteId: 'test-site' },
426
- hooks: { onError }
427
- });
428
- const result = await toolkit.getTool('CallWixSiteAPI').execute({
429
- url: 'https://www.wixapis.com/test',
430
- method: 'GET',
431
- reason: 'test'
432
- });
433
- expect(result.isError).toBe(true);
434
- expect(extractText(result)).toMatch(/Auth failed/);
435
- expect(onError).toHaveBeenCalledWith('CallWixSiteAPI', expect.objectContaining({
436
- message: expect.stringContaining('Auth failed')
437
- }), expect.any(Number));
438
- });
439
- });
440
- // ---------------------------------------------------------------------------
441
- // createWixToolkit - hooks
442
- // ---------------------------------------------------------------------------
443
- describe('createWixToolkit() - hooks', () => {
444
- test('beforeExecute hook is called with tool name and args', async () => {
445
- const beforeExecute = vi.fn();
446
- const toolkit = createWixToolkit({
447
- auth: testAuth,
448
- docs: { tools: ['REST'], getToKnowWixEnabled: true },
449
- api: { tools: [] },
450
- hooks: { beforeExecute }
451
- });
452
- const readmeTool = toolkit.getTool('WixREADME');
453
- if (readmeTool) {
454
- // Execute will likely fail (network), but beforeExecute should still fire
455
- await readmeTool.execute({}).catch(() => { });
456
- expect(beforeExecute).toHaveBeenCalledWith('WixREADME', {});
457
- }
458
- });
459
- });
460
- // ---------------------------------------------------------------------------
461
- // createWixToolkit - preloadReadme
462
- // ---------------------------------------------------------------------------
463
- describe('createWixToolkit() - preloadReadme', () => {
464
- test('returns null when WixREADME is not registered', async () => {
465
- const toolkit = createWixToolkit({
466
- auth: testAuth,
467
- docs: { tools: ['REST'], getToKnowWixEnabled: false },
468
- api: { tools: [] }
469
- });
470
- const result = await toolkit.preloadReadme();
471
- expect(result).toBeNull();
472
- });
473
- test('preloadReadme() returns static README content even when getDynamicContext fails', async () => {
474
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
475
- vi.mocked(getDynamicContext).mockRejectedValue(new Error('permission denied'));
476
- const toolkit = createWixToolkit({
477
- auth: testAuth,
478
- docs: { getToKnowWixEnabled: true },
479
- api: { tools: [] }
480
- });
481
- const result = await toolkit.preloadReadme();
482
- expect(result).not.toBeNull();
483
- });
484
- test('WixREADME injects account-wide dynamic context when dynamicContextEnabled', async () => {
485
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
486
- vi.mocked(getDynamicContext).mockReset();
487
- vi.mocked(getDynamicContext).mockResolvedValue('# My Wix Sites Context');
488
- const toolkit = createWixToolkit({
489
- auth: testAuth,
490
- docs: { getToKnowWixEnabled: true, dynamicContextEnabled: true },
491
- api: { tools: [] }
492
- });
493
- const result = await toolkit.preloadReadme();
494
- expect(result).toContain('# My Wix Sites Context');
495
- // No specific site targeted → account-wide (undefined filter).
496
- expect(vi.mocked(getDynamicContext)).toHaveBeenCalledWith(expect.anything(), expect.anything(), undefined, {
497
- partnerContextEnabled: true,
498
- includeAccountContext: true
499
- });
500
- });
501
- test('preloadReadme() uses execute-aware README when ExecuteWixAPI is requested', async () => {
502
- const toolkit = createWixToolkit({
503
- auth: testAuth,
504
- docs: { getToKnowWixEnabled: true },
505
- api: { tools: ['ExecuteWixAPI'] }
506
- });
507
- const result = await toolkit.preloadReadme();
508
- expect(result).toContain('ExecuteWixAPI');
509
- expect(result).toContain('a single invocation can chain');
510
- });
511
- test('preloadReadme() preserves consumer readmeDocs override', async () => {
512
- const toolkit = createWixToolkit({
513
- auth: testAuth,
514
- docs: {
515
- getToKnowWixEnabled: true,
516
- readmeDocs: [{ action: 'text', content: 'custom README content' }]
517
- },
518
- api: { tools: ['ExecuteWixAPI'] }
519
- });
520
- const result = await toolkit.preloadReadme();
521
- expect(result).toContain('custom README content');
522
- expect(result).not.toContain('a single invocation can chain');
523
- });
524
- test('preloadReadme() injects defaults.siteId into WixREADME execution', async () => {
525
- const beforeExecute = vi.fn();
526
- const toolkit = createWixToolkit({
527
- auth: testAuth,
528
- docs: { tools: [], getToKnowWixEnabled: true },
529
- api: { tools: [] },
530
- defaults: { siteId: 'a3f5e8d1-4b2c-4a9f-b6e7-1c8d9a0f2b3e' },
531
- hooks: { beforeExecute }
532
- });
533
- // preloadReadme() passes no args, but defaults merge should inject siteId
534
- await toolkit.preloadReadme();
535
- expect(beforeExecute).toHaveBeenCalledWith('WixREADME', {
536
- siteId: 'a3f5e8d1-4b2c-4a9f-b6e7-1c8d9a0f2b3e'
537
- });
538
- });
539
- });
540
- // ---------------------------------------------------------------------------
541
- // createWixToolkit - preloadDynamicContext
542
- // ---------------------------------------------------------------------------
543
- describe('createWixToolkit() - preloadDynamicContext', () => {
544
- test('preloadDynamicContext() passes defaults context to getDynamicContext', async () => {
545
- const { getDynamicContext } = await import('./docs/get-to-know.js');
546
- const mockedGetDynamicContext = vi.mocked(getDynamicContext);
547
- mockedGetDynamicContext.mockResolvedValue('dynamic context result');
548
- const toolkit = createWixToolkit({
549
- auth: testAuth,
550
- docs: {
551
- tools: [],
552
- partnerContextEnabled: true
553
- },
554
- api: { tools: [] },
555
- defaults: {
556
- siteId: 'a3f5e8d1-4b2c-4a9f-b6e7-1c8d9a0f2b3e'
557
- }
558
- });
559
- const result = await toolkit.preloadDynamicContext();
560
- expect(result).toBe('dynamic context result');
561
- expect(mockedGetDynamicContext).toHaveBeenCalledWith(expect.anything(), expect.anything(), {
562
- siteId: 'a3f5e8d1-4b2c-4a9f-b6e7-1c8d9a0f2b3e'
563
- }, {
564
- partnerContextEnabled: true,
565
- includeAccountContext: true
566
- });
567
- });
568
- });
569
- // ---------------------------------------------------------------------------
570
- // GetSiteContext tool behaviour
571
- // ---------------------------------------------------------------------------
572
- describe('GetSiteContext tool', () => {
573
- const getSiteContextTool = () => {
574
- const toolkit = createWixToolkit({
575
- auth: testAuth,
576
- docs: { getToKnowWixEnabled: true },
577
- api: { tools: [] }
578
- });
579
- return toolkit.getTool('GetSiteContext');
580
- };
581
- test('passes siteId filter to getDynamicContext', async () => {
582
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
583
- vi.mocked(getDynamicContext).mockResolvedValue('site context');
584
- await getSiteContextTool().execute({ siteId: 'site-123' });
585
- expect(vi.mocked(getDynamicContext)).toHaveBeenCalledWith(expect.anything(), expect.anything(), { siteId: 'site-123' }, {
586
- partnerContextEnabled: false,
587
- includeAccountContext: false
588
- });
589
- });
590
- test('passes siteName filter to getDynamicContext', async () => {
591
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
592
- vi.mocked(getDynamicContext).mockResolvedValue('site context');
593
- await getSiteContextTool().execute({ siteName: 'My Site' });
594
- expect(vi.mocked(getDynamicContext)).toHaveBeenCalledWith(expect.anything(), expect.anything(), { siteName: 'My Site' }, {
595
- partnerContextEnabled: false,
596
- includeAccountContext: false
597
- });
598
- });
599
- test('returns error when neither siteId nor siteName is provided', async () => {
600
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
601
- vi.mocked(getDynamicContext).mockClear();
602
- const result = await getSiteContextTool().execute({});
603
- expect(extractText(result)).toBe('Provide either siteId or siteName to identify the site.');
604
- expect(vi.mocked(getDynamicContext)).not.toHaveBeenCalled();
605
- });
606
- test('returns context text on success', async () => {
607
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
608
- vi.mocked(getDynamicContext).mockResolvedValue('## Site: My Site\nApps: Stores');
609
- const result = await getSiteContextTool().execute({ siteId: 'site-123' });
610
- expect(extractText(result)).toBe('## Site: My Site\nApps: Stores');
611
- });
612
- test('returns "No context found" when getDynamicContext returns empty string', async () => {
613
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
614
- vi.mocked(getDynamicContext).mockResolvedValue('');
615
- const result = await getSiteContextTool().execute({ siteId: 'site-123' });
616
- expect(extractText(result)).toBe('No context found for the specified site.');
617
- });
618
- test('returns error message when getDynamicContext throws a non-auth error', async () => {
619
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
620
- vi.mocked(getDynamicContext).mockRejectedValue(new Error('upstream timeout'));
621
- const result = await getSiteContextTool().execute({ siteId: 'site-123' });
622
- expect(extractText(result)).toContain('upstream timeout');
623
- });
624
- test('surfaces unauthorized errors as isError with error message', async () => {
625
- const { getDynamicContext } = await import('@wix/dynamic-context-enricher');
626
- const { UNAUTHORIZED_ERROR_NAME } = await import('./auth/index.js');
627
- const authErr = Object.assign(new Error('session revoked'), {
628
- name: UNAUTHORIZED_ERROR_NAME
629
- });
630
- vi.mocked(getDynamicContext).mockRejectedValue(authErr);
631
- const result = await getSiteContextTool().execute({ siteId: 'site-123' });
632
- expect(result.isError).toBe(true);
633
- expect(extractText(result)).toContain('session revoked');
634
- });
635
- });
636
- // ---------------------------------------------------------------------------
637
- // createWixToolkit - includeReadmeMentions
638
- // ---------------------------------------------------------------------------
639
- describe('createWixToolkit() - includeReadmeMentions', () => {
640
- const makeToolkit = (includeReadmeMentions) => createWixToolkit({
641
- auth: testAuth,
642
- docs: { tools: ['REST'] },
643
- api: { tools: ['CallWixSiteAPI', 'ExecuteWixAPI', 'SearchWixAPISpec'] },
644
- ...(includeReadmeMentions === undefined ? {} : { includeReadmeMentions })
645
- });
646
- test('defaults to scrubbing WixREADME mentions from descriptions', () => {
647
- const toolkit = makeToolkit();
648
- expect(toolkit.getTool('CallWixSiteAPI').description).not.toContain('WixREADME');
649
- const restDesc = toolkit.getTool('SearchWixRESTDocumentation').description;
650
- expect(restDesc).not.toContain('WixREADME');
651
- expect(restDesc).not.toContain('MANDATORY FIRST STEP');
652
- // Body content is preserved.
653
- expect(toolkit.getTool('CallWixSiteAPI').description).toContain('SearchWixRESTDocumentation');
654
- });
655
- test('includeReadmeMentions:true keeps WixREADME mentions (matches server text)', async () => {
656
- const { defaultToolDescriptions } = await import('./config/default-config.js');
657
- const toolkit = makeToolkit(true);
658
- expect(toolkit.getTool('CallWixSiteAPI').description).toContain('WixREADME');
659
- // Byte-for-byte identical to the canonical server description.
660
- expect(toolkit.getTool('CallWixSiteAPI').description).toBe(defaultToolDescriptions.CallWixSiteAPI);
661
- });
662
- test('code-mode ExecuteWixAPI/SearchWixAPISpec are scrubbed by default', () => {
663
- const toolkit = makeToolkit();
664
- expect(toolkit.getTool('ExecuteWixAPI').description).not.toContain('WixREADME');
665
- expect(toolkit.getTool('SearchWixAPISpec').description).not.toContain('WixREADME');
666
- });
667
- test('consumer description override wins even when scrubbing', () => {
668
- const toolkit = createWixToolkit({
669
- auth: testAuth,
670
- docs: { tools: [] },
671
- api: {
672
- tools: ['CallWixSiteAPI'],
673
- toolDescriptions: { CallWixSiteAPI: 'custom call description' }
674
- }
675
- // includeReadmeMentions omitted -> false
676
- });
677
- expect(toolkit.getTool('CallWixSiteAPI').description).toBe('custom call description');
678
- });
679
- test("WixREADME's own description is left untouched when scrubbing", () => {
680
- const toolkit = createWixToolkit({
681
- auth: testAuth,
682
- docs: { tools: ['REST'], getToKnowWixEnabled: true },
683
- api: { tools: [] }
684
- // includeReadmeMentions omitted -> false
685
- });
686
- // The flag scrubs OTHER tools' descriptions; the WixREADME tool, if present,
687
- // keeps its self-describing default text.
688
- expect(toolkit.getTool('WixREADME').description).toContain('MANDATORY FIRST STEP');
689
- });
690
- });
691
- //# sourceMappingURL=toolkit.test.js.map