@wix/mcp 1.0.74 → 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.
- package/build/bin-standalone.js +83500 -12272
- package/build/cjs/index.cjs +41 -14
- package/build/cjs/toolkit.cjs +41 -14
- package/build/dts/docs/searchFormatting.d.ts +1 -0
- package/build/dts/docs/searchFormatting.js +49 -14
- package/build/dts/index.d.ts +1 -0
- package/build/dts/index.js +0 -1
- package/build/dts/infra/tool-bi.d.ts +4 -4
- package/build/dts/infra/tool-bi.js +1 -1
- package/build/dts/toolkit-entry.d.cts +410 -0
- package/build/dts/toolkit-entry.d.ts +409 -19
- package/build/dts/toolkit-entry.js +0 -1
- package/build/dts/toolkit-types.d.ts +31 -0
- package/build/dts/toolkit-types.js +12 -0
- package/build/dts/toolkit.d.ts +5 -5
- package/build/esm/index.js +41 -14
- package/build/esm/toolkit.js +41 -14
- package/package.json +26 -19
- package/build/bin-standalone.js.map +0 -7
- package/build/cjs/index.cjs.map +0 -7
- package/build/cjs/toolkit.cjs.map +0 -7
- package/build/dts/api-call/index.d.ts.map +0 -1
- package/build/dts/api-call/index.js.map +0 -1
- package/build/dts/api-call/upload-image-tool.d.ts.map +0 -1
- package/build/dts/api-call/upload-image-tool.js.map +0 -1
- package/build/dts/api-call/upload-image-tool.test.d.ts +0 -2
- package/build/dts/api-call/upload-image-tool.test.d.ts.map +0 -1
- package/build/dts/api-call/upload-image-tool.test.js +0 -217
- package/build/dts/api-call/upload-image-tool.test.js.map +0 -1
- package/build/dts/api-call/upload-image-utils.d.ts.map +0 -1
- package/build/dts/api-call/upload-image-utils.js.map +0 -1
- package/build/dts/api-call/upload-image-utils.test.d.ts +0 -2
- package/build/dts/api-call/upload-image-utils.test.d.ts.map +0 -1
- package/build/dts/api-call/upload-image-utils.test.js +0 -121
- package/build/dts/api-call/upload-image-utils.test.js.map +0 -1
- package/build/dts/api-call/validation.d.ts.map +0 -1
- package/build/dts/api-call/validation.js.map +0 -1
- package/build/dts/api-call/validation.test.d.ts +0 -2
- package/build/dts/api-call/validation.test.d.ts.map +0 -1
- package/build/dts/api-call/validation.test.js +0 -42
- package/build/dts/api-call/validation.test.js.map +0 -1
- package/build/dts/auth/auth-error-handling.test.d.ts +0 -2
- package/build/dts/auth/auth-error-handling.test.d.ts.map +0 -1
- package/build/dts/auth/auth-error-handling.test.js +0 -347
- package/build/dts/auth/auth-error-handling.test.js.map +0 -1
- package/build/dts/auth/index.d.ts.map +0 -1
- package/build/dts/auth/index.js.map +0 -1
- package/build/dts/bin.d.ts.map +0 -1
- package/build/dts/bin.js.map +0 -1
- package/build/dts/cli-tools/account-auth-strategy.d.ts.map +0 -1
- package/build/dts/cli-tools/account-auth-strategy.js.map +0 -1
- package/build/dts/cli-tools/account-token-store.d.ts.map +0 -1
- package/build/dts/cli-tools/account-token-store.js.map +0 -1
- package/build/dts/cli-tools/cli.d.ts.map +0 -1
- package/build/dts/cli-tools/cli.js.map +0 -1
- package/build/dts/cli-tools/utils.d.ts.map +0 -1
- package/build/dts/cli-tools/utils.js.map +0 -1
- package/build/dts/code-mode/index.d.ts.map +0 -1
- package/build/dts/code-mode/index.js.map +0 -1
- package/build/dts/code-mode/index.test.d.ts +0 -2
- package/build/dts/code-mode/index.test.d.ts.map +0 -1
- package/build/dts/code-mode/index.test.js +0 -342
- package/build/dts/code-mode/index.test.js.map +0 -1
- package/build/dts/code-mode/truncate-response.d.ts.map +0 -1
- package/build/dts/code-mode/truncate-response.js.map +0 -1
- package/build/dts/code-mode/truncate-response.test.d.ts +0 -2
- package/build/dts/code-mode/truncate-response.test.d.ts.map +0 -1
- package/build/dts/code-mode/truncate-response.test.js +0 -32
- package/build/dts/code-mode/truncate-response.test.js.map +0 -1
- package/build/dts/code-mode/validation.d.ts.map +0 -1
- package/build/dts/code-mode/validation.js.map +0 -1
- package/build/dts/code-mode/validation.test.d.ts +0 -2
- package/build/dts/code-mode/validation.test.d.ts.map +0 -1
- package/build/dts/code-mode/validation.test.js +0 -72
- package/build/dts/code-mode/validation.test.js.map +0 -1
- package/build/dts/config/default-config.bulk-preference.test.d.ts +0 -2
- package/build/dts/config/default-config.bulk-preference.test.d.ts.map +0 -1
- package/build/dts/config/default-config.bulk-preference.test.js +0 -42
- package/build/dts/config/default-config.bulk-preference.test.js.map +0 -1
- package/build/dts/config/default-config.d.ts.map +0 -1
- package/build/dts/config/default-config.execute-orchestration.test.d.ts +0 -2
- package/build/dts/config/default-config.execute-orchestration.test.d.ts.map +0 -1
- package/build/dts/config/default-config.execute-orchestration.test.js +0 -40
- package/build/dts/config/default-config.execute-orchestration.test.js.map +0 -1
- package/build/dts/config/default-config.js.map +0 -1
- package/build/dts/config/default-config.readme.test.d.ts +0 -2
- package/build/dts/config/default-config.readme.test.d.ts.map +0 -1
- package/build/dts/config/default-config.readme.test.js +0 -84
- package/build/dts/config/default-config.readme.test.js.map +0 -1
- package/build/dts/config/default-config.searchspec-goal.test.d.ts +0 -2
- package/build/dts/config/default-config.searchspec-goal.test.d.ts.map +0 -1
- package/build/dts/config/default-config.searchspec-goal.test.js +0 -30
- package/build/dts/config/default-config.searchspec-goal.test.js.map +0 -1
- package/build/dts/config/param-descriptions.d.ts.map +0 -1
- package/build/dts/config/param-descriptions.js.map +0 -1
- package/build/dts/constants.d.ts.map +0 -1
- package/build/dts/constants.js.map +0 -1
- package/build/dts/docs/browse-menu.d.ts.map +0 -1
- package/build/dts/docs/browse-menu.js.map +0 -1
- package/build/dts/docs/browse-menu.test.d.ts +0 -2
- package/build/dts/docs/browse-menu.test.d.ts.map +0 -1
- package/build/dts/docs/browse-menu.test.js +0 -66
- package/build/dts/docs/browse-menu.test.js.map +0 -1
- package/build/dts/docs/browse-tool.test.d.ts +0 -2
- package/build/dts/docs/browse-tool.test.d.ts.map +0 -1
- package/build/dts/docs/browse-tool.test.js +0 -77
- package/build/dts/docs/browse-tool.test.js.map +0 -1
- package/build/dts/docs/create-site-guide.d.ts.map +0 -1
- package/build/dts/docs/create-site-guide.js.map +0 -1
- package/build/dts/docs/docs.d.ts.map +0 -1
- package/build/dts/docs/docs.js.map +0 -1
- package/build/dts/docs/fetch-article.d.ts.map +0 -1
- package/build/dts/docs/fetch-article.js.map +0 -1
- package/build/dts/docs/fetch-article.test.d.ts +0 -2
- package/build/dts/docs/fetch-article.test.d.ts.map +0 -1
- package/build/dts/docs/fetch-article.test.js +0 -93
- package/build/dts/docs/fetch-article.test.js.map +0 -1
- package/build/dts/docs/fetch-skills.d.ts.map +0 -1
- package/build/dts/docs/fetch-skills.js.map +0 -1
- package/build/dts/docs/fetch-skills.test.d.ts +0 -2
- package/build/dts/docs/fetch-skills.test.d.ts.map +0 -1
- package/build/dts/docs/fetch-skills.test.js +0 -140
- package/build/dts/docs/fetch-skills.test.js.map +0 -1
- package/build/dts/docs/get-to-know.d.ts.map +0 -1
- package/build/dts/docs/get-to-know.js.map +0 -1
- package/build/dts/docs/get-to-know.test.d.ts +0 -2
- package/build/dts/docs/get-to-know.test.d.ts.map +0 -1
- package/build/dts/docs/get-to-know.test.js +0 -152
- package/build/dts/docs/get-to-know.test.js.map +0 -1
- package/build/dts/docs/long-content.d.ts.map +0 -1
- package/build/dts/docs/long-content.js.map +0 -1
- package/build/dts/docs/normalize-menu-content.d.ts.map +0 -1
- package/build/dts/docs/normalize-menu-content.js.map +0 -1
- package/build/dts/docs/searchFormatting.d.ts.map +0 -1
- package/build/dts/docs/searchFormatting.js.map +0 -1
- package/build/dts/docs/searchFormatting.test.d.ts +0 -2
- package/build/dts/docs/searchFormatting.test.d.ts.map +0 -1
- package/build/dts/docs/searchFormatting.test.js +0 -39
- package/build/dts/docs/searchFormatting.test.js.map +0 -1
- package/build/dts/docs/semanticSearch.d.ts.map +0 -1
- package/build/dts/docs/semanticSearch.js.map +0 -1
- package/build/dts/docs/semanticSearch.test.d.ts +0 -2
- package/build/dts/docs/semanticSearch.test.d.ts.map +0 -1
- package/build/dts/docs/semanticSearch.test.js +0 -923
- package/build/dts/docs/semanticSearch.test.js.map +0 -1
- package/build/dts/docs/velo-readme.d.ts.map +0 -1
- package/build/dts/docs/velo-readme.js.map +0 -1
- package/build/dts/import-claude-design-tool/banner.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/banner.js.map +0 -1
- package/build/dts/import-claude-design-tool/constants.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/constants.js.map +0 -1
- package/build/dts/import-claude-design-tool/index.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/index.js.map +0 -1
- package/build/dts/import-claude-design-tool/index.test.d.ts +0 -2
- package/build/dts/import-claude-design-tool/index.test.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/index.test.js +0 -329
- package/build/dts/import-claude-design-tool/index.test.js.map +0 -1
- package/build/dts/import-claude-design-tool/sanitize.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/sanitize.js.map +0 -1
- package/build/dts/import-claude-design-tool/wixstro-client.d.ts.map +0 -1
- package/build/dts/import-claude-design-tool/wixstro-client.js.map +0 -1
- package/build/dts/index.d.ts.map +0 -1
- package/build/dts/index.js.map +0 -1
- package/build/dts/infra/bi-logger.d.ts.map +0 -1
- package/build/dts/infra/bi-logger.js.map +0 -1
- package/build/dts/infra/environment.d.ts.map +0 -1
- package/build/dts/infra/environment.js.map +0 -1
- package/build/dts/infra/file-logger.d.ts.map +0 -1
- package/build/dts/infra/file-logger.js.map +0 -1
- package/build/dts/infra/logger.d.ts.map +0 -1
- package/build/dts/infra/logger.js.map +0 -1
- package/build/dts/infra/panorama.d.ts.map +0 -1
- package/build/dts/infra/panorama.js.map +0 -1
- package/build/dts/infra/response-size-limits.d.ts.map +0 -1
- package/build/dts/infra/response-size-limits.js.map +0 -1
- package/build/dts/infra/sentry.d.ts.map +0 -1
- package/build/dts/infra/sentry.js.map +0 -1
- package/build/dts/infra/tool-bi.d.ts.map +0 -1
- package/build/dts/infra/tool-bi.js.map +0 -1
- package/build/dts/infra/widget-payload.d.ts.map +0 -1
- package/build/dts/infra/widget-payload.js.map +0 -1
- package/build/dts/resources/docs.d.ts.map +0 -1
- package/build/dts/resources/docs.js.map +0 -1
- package/build/dts/site-widget-tools/claim-site-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/claim-site-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/constants.d.ts.map +0 -1
- package/build/dts/site-widget-tools/constants.js.map +0 -1
- package/build/dts/site-widget-tools/create-site-from-template-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/create-site-from-template-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/edit-site-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/edit-site-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/index.js.map +0 -1
- package/build/dts/site-widget-tools/pull-site-creation-job-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/pull-site-creation-job-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/search-site-templates-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/search-site-templates-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/site-builder-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/site-builder-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/site-builder-tool/index.test.d.ts +0 -2
- package/build/dts/site-widget-tools/site-builder-tool/index.test.d.ts.map +0 -1
- package/build/dts/site-widget-tools/site-builder-tool/index.test.js +0 -46
- package/build/dts/site-widget-tools/site-builder-tool/index.test.js.map +0 -1
- package/build/dts/site-widget-tools/site-creation-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/site-creation-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/site-creation-tool/index.test.d.ts +0 -2
- package/build/dts/site-widget-tools/site-creation-tool/index.test.d.ts.map +0 -1
- package/build/dts/site-widget-tools/site-creation-tool/index.test.js +0 -57
- package/build/dts/site-widget-tools/site-creation-tool/index.test.js.map +0 -1
- package/build/dts/site-widget-tools/suggested-domain-tool/index.d.ts.map +0 -1
- package/build/dts/site-widget-tools/suggested-domain-tool/index.js.map +0 -1
- package/build/dts/site-widget-tools/types.d.ts.map +0 -1
- package/build/dts/site-widget-tools/types.js.map +0 -1
- package/build/dts/site-widget-tools/utils.d.ts.map +0 -1
- package/build/dts/site-widget-tools/utils.js.map +0 -1
- package/build/dts/support/index.d.ts.map +0 -1
- package/build/dts/support/index.js.map +0 -1
- package/build/dts/tool-bi-reporting.test.d.ts +0 -2
- package/build/dts/tool-bi-reporting.test.d.ts.map +0 -1
- package/build/dts/tool-bi-reporting.test.js +0 -219
- package/build/dts/tool-bi-reporting.test.js.map +0 -1
- package/build/dts/tool-utils.d.ts.map +0 -1
- package/build/dts/tool-utils.js.map +0 -1
- package/build/dts/tool-utils.spec.d.ts +0 -2
- package/build/dts/tool-utils.spec.d.ts.map +0 -1
- package/build/dts/tool-utils.spec.js +0 -98
- package/build/dts/tool-utils.spec.js.map +0 -1
- package/build/dts/toolkit-entry.d.ts.map +0 -1
- package/build/dts/toolkit-entry.js.map +0 -1
- package/build/dts/toolkit-json-schema.test.d.ts +0 -2
- package/build/dts/toolkit-json-schema.test.d.ts.map +0 -1
- package/build/dts/toolkit-json-schema.test.js +0 -36
- package/build/dts/toolkit-json-schema.test.js.map +0 -1
- package/build/dts/toolkit.d.ts.map +0 -1
- package/build/dts/toolkit.js.map +0 -1
- package/build/dts/toolkit.test.d.ts +0 -2
- package/build/dts/toolkit.test.d.ts.map +0 -1
- package/build/dts/toolkit.test.js +0 -691
- package/build/dts/toolkit.test.js.map +0 -1
- package/build/dts/widget-manifest.d.ts.map +0 -1
- package/build/dts/widget-manifest.js.map +0 -1
- package/build/dts/wix-fetch-error.d.ts.map +0 -1
- package/build/dts/wix-fetch-error.js.map +0 -1
- package/build/dts/wix-mcp-server.d.ts.map +0 -1
- package/build/dts/wix-mcp-server.js.map +0 -1
- package/build/dts/wixel/api.d.ts.map +0 -1
- package/build/dts/wixel/api.js.map +0 -1
- package/build/dts/wixel/constants.d.ts.map +0 -1
- package/build/dts/wixel/constants.js.map +0 -1
- package/build/dts/wixel/external-agent-api.d.ts.map +0 -1
- package/build/dts/wixel/external-agent-api.js.map +0 -1
- package/build/dts/wixel/get-wixel-asset-tool.d.ts.map +0 -1
- package/build/dts/wixel/get-wixel-asset-tool.js.map +0 -1
- package/build/dts/wixel/get-wixel-job-status-tool.d.ts.map +0 -1
- package/build/dts/wixel/get-wixel-job-status-tool.js.map +0 -1
- package/build/dts/wixel/get-wixel-project-assets-tool.d.ts.map +0 -1
- package/build/dts/wixel/get-wixel-project-assets-tool.js.map +0 -1
- package/build/dts/wixel/index.d.ts.map +0 -1
- package/build/dts/wixel/index.js.map +0 -1
- package/build/dts/wixel/mark-wixel-job-as-fulfilled-tool.d.ts.map +0 -1
- package/build/dts/wixel/mark-wixel-job-as-fulfilled-tool.js.map +0 -1
- package/build/dts/wixel/open-headless-wixel-project-tool.d.ts.map +0 -1
- package/build/dts/wixel/open-headless-wixel-project-tool.js.map +0 -1
- package/build/dts/wixel/pull-headless-wixel-job-tool.d.ts.map +0 -1
- package/build/dts/wixel/pull-headless-wixel-job-tool.js.map +0 -1
- package/build/dts/wixel/update-headless-wixel-job-tool.d.ts.map +0 -1
- package/build/dts/wixel/update-headless-wixel-job-tool.js.map +0 -1
- package/build/dts/wixel/utils.d.ts.map +0 -1
- package/build/dts/wixel/utils.js.map +0 -1
- package/build/dts/wixel/wixel-bi.d.ts.map +0 -1
- package/build/dts/wixel/wixel-bi.js.map +0 -1
- package/build/dts/wixel/wixel-bi.test.d.ts +0 -2
- package/build/dts/wixel/wixel-bi.test.d.ts.map +0 -1
- package/build/dts/wixel/wixel-bi.test.js +0 -35
- package/build/dts/wixel/wixel-bi.test.js.map +0 -1
- package/build/dts/wixel/wixel-session-tools.d.ts.map +0 -1
- package/build/dts/wixel/wixel-session-tools.js.map +0 -1
- package/build/dts/wixel/wixel-session-tools.test.d.ts +0 -2
- package/build/dts/wixel/wixel-session-tools.test.d.ts.map +0 -1
- package/build/dts/wixel/wixel-session-tools.test.js +0 -143
- package/build/dts/wixel/wixel-session-tools.test.js.map +0 -1
- package/build/esm/index.js.map +0 -7
- 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
|