@sync.so/mcp-server 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -86
- package/deploy/generation-status/app.html.gz +0 -0
- package/deploy/generation-status/release.json +6 -0
- package/dist/abort-signals.d.ts +6 -0
- package/dist/abort-signals.d.ts.map +1 -0
- package/dist/abort-signals.js +23 -0
- package/dist/account-features.d.ts +7 -0
- package/dist/account-features.d.ts.map +1 -0
- package/dist/account-features.js +48 -0
- package/dist/app-upload-relay.d.ts +13 -0
- package/dist/app-upload-relay.d.ts.map +1 -0
- package/dist/app-upload-relay.js +136 -0
- package/dist/asset-thumbnail.d.ts +3 -0
- package/dist/asset-thumbnail.d.ts.map +1 -0
- package/dist/asset-thumbnail.js +2 -0
- package/dist/auth/async-context.d.ts +5 -0
- package/dist/auth/async-context.d.ts.map +1 -0
- package/dist/auth/async-context.js +14 -0
- package/dist/auth/bearer-auth.d.ts +16 -0
- package/dist/auth/bearer-auth.d.ts.map +1 -0
- package/dist/auth/bearer-auth.js +55 -0
- package/dist/auth/client-credentials.d.ts +13 -0
- package/dist/auth/client-credentials.d.ts.map +1 -0
- package/dist/auth/client-credentials.js +67 -0
- package/dist/auth/device-auth.d.ts.map +1 -1
- package/dist/auth/device-auth.js +3 -2
- package/dist/auth/fixture-cleanup.d.ts +4 -0
- package/dist/auth/fixture-cleanup.d.ts.map +1 -0
- package/dist/auth/fixture-cleanup.js +9 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +2 -0
- package/dist/auth/oauth-diagnostics.d.ts +11 -0
- package/dist/auth/oauth-diagnostics.d.ts.map +1 -0
- package/dist/auth/oauth-diagnostics.js +78 -0
- package/dist/auth/oauth-provider.d.ts +16 -0
- package/dist/auth/oauth-provider.d.ts.map +1 -0
- package/dist/auth/oauth-provider.js +107 -0
- package/dist/auth/resource-metadata.d.ts +2 -0
- package/dist/auth/resource-metadata.d.ts.map +1 -0
- package/dist/auth/resource-metadata.js +3 -0
- package/dist/auth/token-verification.d.ts +11 -0
- package/dist/auth/token-verification.d.ts.map +1 -0
- package/dist/auth/token-verification.js +99 -0
- package/dist/auth/verification-cache.d.ts +8 -0
- package/dist/auth/verification-cache.d.ts.map +1 -0
- package/dist/auth/verification-cache.js +111 -0
- package/dist/chatgpt-analytics.d.ts +22 -0
- package/dist/chatgpt-analytics.d.ts.map +1 -0
- package/dist/chatgpt-analytics.js +172 -0
- package/dist/chatgpt-app.d.ts +15 -0
- package/dist/chatgpt-app.d.ts.map +1 -0
- package/dist/chatgpt-app.js +133 -0
- package/dist/chatgpt-release.d.ts +12 -0
- package/dist/chatgpt-release.d.ts.map +1 -0
- package/dist/chatgpt-release.js +30 -0
- package/dist/cli.js +30 -16
- package/dist/client-profile.d.ts +10 -0
- package/dist/client-profile.d.ts.map +1 -0
- package/dist/client-profile.js +45 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +52 -0
- package/dist/generation-status-html.d.ts +2 -0
- package/dist/generation-status-html.d.ts.map +1 -0
- package/dist/generation-status-html.js +26 -0
- package/dist/generation-status.d.ts +6 -0
- package/dist/generation-status.d.ts.map +1 -0
- package/dist/generation-status.js +37 -0
- package/dist/http-client.d.ts +45 -1
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +171 -34
- package/dist/http-server.d.ts +53 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +753 -0
- package/dist/http-session.d.ts +18 -0
- package/dist/http-session.d.ts.map +1 -0
- package/dist/http-session.js +189 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/oauth-response.d.ts +3 -0
- package/dist/oauth-response.d.ts.map +1 -0
- package/dist/oauth-response.js +30 -0
- package/dist/openapi/index.d.ts +2 -2
- package/dist/openapi/index.d.ts.map +1 -1
- package/dist/openapi/index.js +1 -1
- package/dist/openapi/parser.d.ts +2 -0
- package/dist/openapi/parser.d.ts.map +1 -1
- package/dist/openapi/parser.js +41 -1
- package/dist/openapi/types.d.ts +3 -0
- package/dist/openapi/types.d.ts.map +1 -1
- package/dist/organization-selection.d.ts +61 -0
- package/dist/organization-selection.d.ts.map +1 -0
- package/dist/organization-selection.js +142 -0
- package/dist/rate-limits.d.ts +13 -0
- package/dist/rate-limits.d.ts.map +1 -0
- package/dist/rate-limits.js +67 -0
- package/dist/revision.d.ts +6 -0
- package/dist/revision.d.ts.map +1 -0
- package/dist/revision.js +17 -0
- package/dist/runtime-diagnostics.d.ts +32 -0
- package/dist/runtime-diagnostics.d.ts.map +1 -0
- package/dist/runtime-diagnostics.js +58 -0
- package/dist/server.d.ts +23 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +893 -32
- package/dist/session-registry.d.ts +54 -0
- package/dist/session-registry.d.ts.map +1 -0
- package/dist/session-registry.js +202 -0
- package/dist/session-telemetry.d.ts +13 -0
- package/dist/session-telemetry.d.ts.map +1 -0
- package/dist/session-telemetry.js +87 -0
- package/dist/spend-confirmation.d.ts +21 -0
- package/dist/spend-confirmation.d.ts.map +1 -0
- package/dist/spend-confirmation.js +105 -0
- package/dist/tool-analytics-context.d.ts +11 -0
- package/dist/tool-analytics-context.d.ts.map +1 -0
- package/dist/tool-analytics-context.js +8 -0
- package/dist/tool-names.d.ts +35 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +133 -0
- package/dist/tools/account-context.d.ts +5 -0
- package/dist/tools/account-context.d.ts.map +1 -0
- package/dist/tools/account-context.js +131 -0
- package/dist/tools/account-management.d.ts +4 -0
- package/dist/tools/account-management.d.ts.map +1 -0
- package/dist/tools/account-management.js +111 -0
- package/dist/tools/app-tools.d.ts +31 -0
- package/dist/tools/app-tools.d.ts.map +1 -0
- package/dist/tools/app-tools.js +350 -0
- package/dist/tools/asset-analysis.d.ts +4 -0
- package/dist/tools/asset-analysis.d.ts.map +1 -0
- package/dist/tools/asset-analysis.js +172 -0
- package/dist/tools/asset-creators.d.ts +4 -0
- package/dist/tools/asset-creators.d.ts.map +1 -0
- package/dist/tools/asset-creators.js +38 -0
- package/dist/tools/audio-trim.d.ts +6 -0
- package/dist/tools/audio-trim.d.ts.map +1 -0
- package/dist/tools/audio-trim.js +79 -0
- package/dist/tools/batch-results.d.ts +16 -0
- package/dist/tools/batch-results.d.ts.map +1 -0
- package/dist/tools/batch-results.js +103 -0
- package/dist/tools/batches.d.ts +28 -0
- package/dist/tools/batches.d.ts.map +1 -0
- package/dist/tools/batches.js +293 -0
- package/dist/tools/dialogue.d.ts +6 -0
- package/dist/tools/dialogue.d.ts.map +1 -0
- package/dist/tools/dialogue.js +309 -0
- package/dist/tools/estimate-duration.d.ts +35 -0
- package/dist/tools/estimate-duration.d.ts.map +1 -0
- package/dist/tools/estimate-duration.js +66 -0
- package/dist/tools/feedback.d.ts +14 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +72 -0
- package/dist/tools/generated-adapters.d.ts +25 -0
- package/dist/tools/generated-adapters.d.ts.map +1 -0
- package/dist/tools/generated-adapters.js +143 -0
- package/dist/tools/generation-context.d.ts +14 -0
- package/dist/tools/generation-context.d.ts.map +1 -0
- package/dist/tools/generation-context.js +39 -0
- package/dist/tools/generation-continuation.d.ts +4 -0
- package/dist/tools/generation-continuation.d.ts.map +1 -0
- package/dist/tools/generation-continuation.js +124 -0
- package/dist/tools/generation-costs.d.ts +6 -0
- package/dist/tools/generation-costs.d.ts.map +1 -0
- package/dist/tools/generation-costs.js +67 -0
- package/dist/tools/generation-output.d.ts +3 -0
- package/dist/tools/generation-output.d.ts.map +1 -0
- package/dist/tools/generation-output.js +39 -0
- package/dist/tools/generator.d.ts +35 -2
- package/dist/tools/generator.d.ts.map +1 -1
- package/dist/tools/generator.js +127 -9
- package/dist/tools/job-status.d.ts +35 -0
- package/dist/tools/job-status.d.ts.map +1 -0
- package/dist/tools/job-status.js +92 -0
- package/dist/tools/job-wait.d.ts +41 -0
- package/dist/tools/job-wait.d.ts.map +1 -0
- package/dist/tools/job-wait.js +84 -0
- package/dist/tools/jobs.d.ts +3 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +210 -0
- package/dist/tools/media-upload.d.ts +27 -0
- package/dist/tools/media-upload.d.ts.map +1 -0
- package/dist/tools/media-upload.js +247 -0
- package/dist/tools/model-options.d.ts +36 -0
- package/dist/tools/model-options.d.ts.map +1 -0
- package/dist/tools/model-options.js +48 -0
- package/dist/tools/organization-choice.d.ts +9 -0
- package/dist/tools/organization-choice.d.ts.map +1 -0
- package/dist/tools/organization-choice.js +136 -0
- package/dist/tools/organizations.d.ts +56 -0
- package/dist/tools/organizations.d.ts.map +1 -0
- package/dist/tools/organizations.js +235 -0
- package/dist/tools/output-schemas.d.ts +54 -0
- package/dist/tools/output-schemas.d.ts.map +1 -0
- package/dist/tools/output-schemas.js +58 -0
- package/dist/tools/overrides.d.ts +3 -0
- package/dist/tools/overrides.d.ts.map +1 -1
- package/dist/tools/overrides.js +113 -15
- package/dist/tools/playback-metadata.d.ts +4 -0
- package/dist/tools/playback-metadata.d.ts.map +1 -0
- package/dist/tools/playback-metadata.js +51 -0
- package/dist/tools/project-destination.d.ts +13 -0
- package/dist/tools/project-destination.d.ts.map +1 -0
- package/dist/tools/project-destination.js +45 -0
- package/dist/tools/project-history.d.ts +6 -0
- package/dist/tools/project-history.d.ts.map +1 -0
- package/dist/tools/project-history.js +45 -0
- package/dist/tools/project-intent.d.ts +8 -0
- package/dist/tools/project-intent.d.ts.map +1 -0
- package/dist/tools/project-intent.js +87 -0
- package/dist/tools/running-submissions.d.ts +7 -0
- package/dist/tools/running-submissions.d.ts.map +1 -0
- package/dist/tools/running-submissions.js +91 -0
- package/dist/tools/speech.d.ts +6 -0
- package/dist/tools/speech.d.ts.map +1 -0
- package/dist/tools/speech.js +116 -0
- package/dist/tools/studio-draft.d.ts +7 -0
- package/dist/tools/studio-draft.d.ts.map +1 -0
- package/dist/tools/studio-draft.js +195 -0
- package/dist/tools/studio-view-contract.d.ts +184 -0
- package/dist/tools/studio-view-contract.d.ts.map +1 -0
- package/dist/tools/studio-view-contract.js +67 -0
- package/dist/tools/studio-view.d.ts +6 -0
- package/dist/tools/studio-view.d.ts.map +1 -0
- package/dist/tools/studio-view.js +126 -0
- package/dist/tools/timeline-lipsync.d.ts +316 -0
- package/dist/tools/timeline-lipsync.d.ts.map +1 -0
- package/dist/tools/timeline-lipsync.js +304 -0
- package/dist/tools/translation-preview.d.ts +8 -0
- package/dist/tools/translation-preview.d.ts.map +1 -0
- package/dist/tools/translation-preview.js +146 -0
- package/dist/tools/translation.d.ts +6 -0
- package/dist/tools/translation.d.ts.map +1 -0
- package/dist/tools/translation.js +131 -0
- package/dist/tools/upload-widget.d.ts +13 -0
- package/dist/tools/upload-widget.d.ts.map +1 -0
- package/dist/tools/upload-widget.js +788 -0
- package/dist/toolsets.d.ts +18 -0
- package/dist/toolsets.d.ts.map +1 -0
- package/dist/toolsets.js +157 -0
- package/dist/update-check.d.ts +38 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +150 -0
- package/dist/upload-runtime.d.ts +45 -0
- package/dist/upload-runtime.d.ts.map +1 -0
- package/dist/upload-runtime.js +156 -0
- package/dist/upload-source.d.ts +4 -0
- package/dist/upload-source.d.ts.map +1 -0
- package/dist/upload-source.js +46 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/package.json +77 -31
- package/dist/openapi/parser.test.d.ts +0 -2
- package/dist/openapi/parser.test.d.ts.map +0 -1
- package/dist/openapi/parser.test.js +0 -188
- package/dist/tools/generator.test.d.ts +0 -2
- package/dist/tools/generator.test.d.ts.map +0 -1
- package/dist/tools/generator.test.js +0 -178
package/package.json
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sync.so/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP server for the Sync API — give AI agents the ability to create lipsync videos, manage assets, and more",
|
|
5
5
|
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"lipsync",
|
|
6
8
|
"mcp",
|
|
9
|
+
"model-context-protocol",
|
|
7
10
|
"sync",
|
|
8
|
-
"
|
|
9
|
-
"ai",
|
|
10
|
-
"video",
|
|
11
|
-
"model-context-protocol"
|
|
11
|
+
"video"
|
|
12
12
|
],
|
|
13
|
+
"homepage": "https://sync.so/docs",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/synchronicity-labs/mcp-server/issues"
|
|
16
|
+
},
|
|
13
17
|
"license": "MIT",
|
|
14
18
|
"repository": {
|
|
15
19
|
"type": "git",
|
|
16
20
|
"url": "https://github.com/synchronicity-labs/mcp-server.git"
|
|
17
21
|
},
|
|
18
|
-
"homepage": "https://sync.so/docs",
|
|
19
|
-
"bugs": {
|
|
20
|
-
"url": "https://github.com/synchronicity-labs/mcp-server/issues"
|
|
21
|
-
},
|
|
22
|
-
"type": "module",
|
|
23
22
|
"bin": {
|
|
24
23
|
"mcp-server": "./dist/cli.js",
|
|
25
24
|
"sync-mcp": "./dist/cli.js"
|
|
26
25
|
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"deploy/generation-status",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"type": "module",
|
|
27
33
|
"main": "./dist/index.js",
|
|
28
34
|
"types": "./dist/index.d.ts",
|
|
29
35
|
"exports": {
|
|
@@ -33,34 +39,74 @@
|
|
|
33
39
|
"types": "./dist/index.d.ts"
|
|
34
40
|
}
|
|
35
41
|
},
|
|
36
|
-
"files": [
|
|
37
|
-
"dist",
|
|
38
|
-
"README.md",
|
|
39
|
-
"LICENSE"
|
|
40
|
-
],
|
|
41
|
-
"engines": {
|
|
42
|
-
"node": ">=18.0.0"
|
|
43
|
-
},
|
|
44
42
|
"scripts": {
|
|
45
|
-
"build": "tsc -b && chmod +x dist/cli.js",
|
|
43
|
+
"build": "tsc -b tsconfig.build.json && chmod +x dist/cli.js",
|
|
44
|
+
"package:chatgpt": "node scripts/package-chatgpt.mjs",
|
|
45
|
+
"verify:chatgpt-package": "node scripts/verify-chatgpt-package.mjs",
|
|
46
|
+
"package:plugin": "node scripts/package-plugin.mjs",
|
|
47
|
+
"verify:plugin": "node scripts/verify-plugin-package.mjs",
|
|
48
|
+
"skills:update": "node scripts/update-plugin-skills.mjs",
|
|
46
49
|
"clean": "rm -rf dist .cache",
|
|
47
|
-
"dev": "tsc -b --watch",
|
|
48
|
-
"lint": "
|
|
49
|
-
"
|
|
50
|
-
"
|
|
50
|
+
"dev": "tsc -b tsconfig.build.json --watch",
|
|
51
|
+
"lint": "oxlint src scripts && oxfmt --check",
|
|
52
|
+
"knip": "knip && knip --cycles",
|
|
53
|
+
"lint:fix": "oxlint --fix src scripts && oxfmt",
|
|
54
|
+
"format": "oxfmt",
|
|
51
55
|
"test": "vitest run",
|
|
56
|
+
"test:memory": "node --expose-gc --max-old-space-size=512 scripts/verify-session-memory.mjs",
|
|
57
|
+
"test:memory:http": "node --expose-gc --max-old-space-size=512 scripts/verify-http-memory.mjs",
|
|
52
58
|
"test:watch": "vitest",
|
|
53
59
|
"typecheck": "tsc --noEmit --emitDeclarationOnly false",
|
|
54
|
-
"prepublishOnly": "
|
|
60
|
+
"prepublishOnly": "pnpm run clean && pnpm run build",
|
|
61
|
+
"test:browser": "vitest run --config vitest.browser.config.ts",
|
|
62
|
+
"monitor:mcp": "node scripts/check-mcp.mjs",
|
|
63
|
+
"prepare": "husky",
|
|
64
|
+
"test:scripts": "node --test scripts/*.test.mjs",
|
|
65
|
+
"capture:wire": "node scripts/capture-wire.mjs"
|
|
55
66
|
},
|
|
56
67
|
"dependencies": {
|
|
57
|
-
"@modelcontextprotocol/
|
|
58
|
-
"
|
|
68
|
+
"@modelcontextprotocol/client": "2.4.0",
|
|
69
|
+
"@modelcontextprotocol/core": "2.4.0",
|
|
70
|
+
"@modelcontextprotocol/node": "2.1.2",
|
|
71
|
+
"@modelcontextprotocol/server": "2.4.0",
|
|
72
|
+
"@modelcontextprotocol/server-legacy": "2.4.0",
|
|
73
|
+
"cors": "^2.8.6",
|
|
74
|
+
"express": "^5.3.0",
|
|
75
|
+
"express-rate-limit": "^8.7.2",
|
|
76
|
+
"ipaddr.js": "^2.5.0",
|
|
77
|
+
"undici": "^8.12.2",
|
|
78
|
+
"zod": "^4.6.7"
|
|
59
79
|
},
|
|
60
80
|
"devDependencies": {
|
|
61
|
-
"@
|
|
62
|
-
"@types/
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
|
|
81
|
+
"@playwright/test": "1.64.1",
|
|
82
|
+
"@types/cors": "^2.8.19",
|
|
83
|
+
"@types/express": "^5.0.6",
|
|
84
|
+
"@types/node": "^26.6.0",
|
|
85
|
+
"husky": "^9.1.7",
|
|
86
|
+
"knip": "6.44.0",
|
|
87
|
+
"lint-staged": "^17.6.0",
|
|
88
|
+
"oxfmt": "0.75.0",
|
|
89
|
+
"oxlint": "1.90.0",
|
|
90
|
+
"oxlint-tsgolint": "7.0.2005",
|
|
91
|
+
"typescript": "^7.0.2",
|
|
92
|
+
"vitest": "5.0.5"
|
|
93
|
+
},
|
|
94
|
+
"lint-staged": {
|
|
95
|
+
"package.json": "oxfmt --check --no-error-on-unmatched-pattern",
|
|
96
|
+
"*.{js,ts,mjs,cjs,mts,cts}": [
|
|
97
|
+
"oxlint --no-error-on-unmatched-pattern",
|
|
98
|
+
"oxfmt --check --no-error-on-unmatched-pattern"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"devEngines": {
|
|
102
|
+
"runtime": {
|
|
103
|
+
"name": "node",
|
|
104
|
+
"version": ">=26.0.0",
|
|
105
|
+
"onFail": "error"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"engines": {
|
|
109
|
+
"node": ">=22.19.0"
|
|
110
|
+
},
|
|
111
|
+
"packageManager": "pnpm@12.14.0"
|
|
66
112
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../src/openapi/parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { parseSpec, resolveRef, resolveSchemaRefs } from './parser.js';
|
|
3
|
-
const MINIMAL_SPEC = {
|
|
4
|
-
openapi: '3.1.0',
|
|
5
|
-
paths: {
|
|
6
|
-
'/v2/generate': {
|
|
7
|
-
post: {
|
|
8
|
-
operationId: 'GenerateController_createGeneration',
|
|
9
|
-
summary: 'Create a generation',
|
|
10
|
-
tags: ['Generate'],
|
|
11
|
-
parameters: [],
|
|
12
|
-
requestBody: {
|
|
13
|
-
content: {
|
|
14
|
-
'application/json': {
|
|
15
|
-
schema: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
model: { type: 'string' },
|
|
19
|
-
input: { type: 'array', items: { type: 'object' } },
|
|
20
|
-
},
|
|
21
|
-
required: ['model', 'input'],
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
'/v2/generate/{id}': {
|
|
29
|
-
get: {
|
|
30
|
-
operationId: 'GenerateController_getGeneration',
|
|
31
|
-
summary: 'Get a generation by ID',
|
|
32
|
-
tags: ['Generate'],
|
|
33
|
-
parameters: [
|
|
34
|
-
{
|
|
35
|
-
name: 'id',
|
|
36
|
-
in: 'path',
|
|
37
|
-
required: true,
|
|
38
|
-
schema: { type: 'string' },
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
'/v2/internal/something': {
|
|
44
|
-
get: {
|
|
45
|
-
operationId: 'InternalController_doSomething',
|
|
46
|
-
summary: 'Internal endpoint',
|
|
47
|
-
tags: ['internal'],
|
|
48
|
-
parameters: [],
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
describe('parseSpec', () => {
|
|
54
|
-
it('parses operations from OpenAPI spec', () => {
|
|
55
|
-
const operations = parseSpec(MINIMAL_SPEC);
|
|
56
|
-
expect(operations).toHaveLength(2);
|
|
57
|
-
});
|
|
58
|
-
it('extracts operation details correctly', () => {
|
|
59
|
-
const operations = parseSpec(MINIMAL_SPEC);
|
|
60
|
-
const createOp = operations.find((op) => op.operationId === 'GenerateController_createGeneration');
|
|
61
|
-
expect(createOp).toBeDefined();
|
|
62
|
-
expect(createOp?.method).toBe('post');
|
|
63
|
-
expect(createOp?.path).toBe('/v2/generate');
|
|
64
|
-
expect(createOp?.summary).toBe('Create a generation');
|
|
65
|
-
expect(createOp?.requestBody).toBeDefined();
|
|
66
|
-
});
|
|
67
|
-
it('parses path parameters', () => {
|
|
68
|
-
const operations = parseSpec(MINIMAL_SPEC);
|
|
69
|
-
const getOp = operations.find((op) => op.operationId === 'GenerateController_getGeneration');
|
|
70
|
-
expect(getOp).toBeDefined();
|
|
71
|
-
expect(getOp?.parameters).toHaveLength(1);
|
|
72
|
-
expect(getOp?.parameters[0]?.name).toBe('id');
|
|
73
|
-
expect(getOp?.parameters[0]?.in).toBe('path');
|
|
74
|
-
expect(getOp?.parameters[0]?.required).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
it('filters out internal-tagged endpoints', () => {
|
|
77
|
-
const operations = parseSpec(MINIMAL_SPEC);
|
|
78
|
-
const internalOp = operations.find((op) => op.operationId === 'InternalController_doSomething');
|
|
79
|
-
expect(internalOp).toBeUndefined();
|
|
80
|
-
});
|
|
81
|
-
it('skips operations without operationId', () => {
|
|
82
|
-
const spec = {
|
|
83
|
-
openapi: '3.1.0',
|
|
84
|
-
paths: {
|
|
85
|
-
'/v2/test': {
|
|
86
|
-
get: {
|
|
87
|
-
summary: 'No operation ID',
|
|
88
|
-
tags: ['Test'],
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
const operations = parseSpec(spec);
|
|
94
|
-
expect(operations).toHaveLength(0);
|
|
95
|
-
});
|
|
96
|
-
it('detects multipart endpoints', () => {
|
|
97
|
-
const spec = {
|
|
98
|
-
openapi: '3.1.0',
|
|
99
|
-
paths: {
|
|
100
|
-
'/v2/upload': {
|
|
101
|
-
post: {
|
|
102
|
-
operationId: 'UploadController_upload',
|
|
103
|
-
summary: 'Upload a file',
|
|
104
|
-
tags: ['Upload'],
|
|
105
|
-
parameters: [],
|
|
106
|
-
requestBody: {
|
|
107
|
-
content: {
|
|
108
|
-
'multipart/form-data': {
|
|
109
|
-
schema: { type: 'object' },
|
|
110
|
-
},
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
const operations = parseSpec(spec);
|
|
118
|
-
expect(operations[0]?.isMultipart).toBe(true);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
describe('resolveRef', () => {
|
|
122
|
-
it('resolves $ref to component schemas', () => {
|
|
123
|
-
const spec = {
|
|
124
|
-
openapi: '3.1.0',
|
|
125
|
-
paths: {},
|
|
126
|
-
components: {
|
|
127
|
-
schemas: {
|
|
128
|
-
MyModel: { type: 'object', properties: { name: { type: 'string' } } },
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
const resolved = resolveRef(spec, '#/components/schemas/MyModel');
|
|
133
|
-
expect(resolved).toEqual({
|
|
134
|
-
type: 'object',
|
|
135
|
-
properties: { name: { type: 'string' } },
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
describe('resolveSchemaRefs', () => {
|
|
140
|
-
const spec = {
|
|
141
|
-
openapi: '3.1.0',
|
|
142
|
-
paths: {},
|
|
143
|
-
components: {
|
|
144
|
-
schemas: {
|
|
145
|
-
Status: { type: 'string', enum: ['pending', 'completed'] },
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
it('resolves $ref in schema', () => {
|
|
150
|
-
const schema = { $ref: '#/components/schemas/Status' };
|
|
151
|
-
const resolved = resolveSchemaRefs(schema, spec);
|
|
152
|
-
expect(resolved).toEqual({
|
|
153
|
-
type: 'string',
|
|
154
|
-
enum: ['pending', 'completed'],
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
it('passes through schemas without $ref', () => {
|
|
158
|
-
const schema = { type: 'string' };
|
|
159
|
-
const resolved = resolveSchemaRefs(schema, spec);
|
|
160
|
-
expect(resolved).toEqual({ type: 'string' });
|
|
161
|
-
});
|
|
162
|
-
it('resolves nested $ref in properties', () => {
|
|
163
|
-
const schema = {
|
|
164
|
-
type: 'object',
|
|
165
|
-
properties: {
|
|
166
|
-
status: { $ref: '#/components/schemas/Status' },
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
const resolved = resolveSchemaRefs(schema, spec);
|
|
170
|
-
expect(resolved).toEqual({
|
|
171
|
-
type: 'object',
|
|
172
|
-
properties: {
|
|
173
|
-
status: { type: 'string', enum: ['pending', 'completed'] },
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
it('resolves $ref in additionalProperties', () => {
|
|
178
|
-
const schema = {
|
|
179
|
-
type: 'object',
|
|
180
|
-
additionalProperties: { $ref: '#/components/schemas/Status' },
|
|
181
|
-
};
|
|
182
|
-
const resolved = resolveSchemaRefs(schema, spec);
|
|
183
|
-
expect(resolved).toEqual({
|
|
184
|
-
type: 'object',
|
|
185
|
-
additionalProperties: { type: 'string', enum: ['pending', 'completed'] },
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.test.d.ts","sourceRoot":"","sources":["../../src/tools/generator.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { generateTools, operationIdToToolName } from './generator.js';
|
|
3
|
-
describe('operationIdToToolName', () => {
|
|
4
|
-
it('converts controller operation IDs to tool names', () => {
|
|
5
|
-
expect(operationIdToToolName('GenerateController_createGeneration')).toBe('generate_create-generation');
|
|
6
|
-
expect(operationIdToToolName('AssetsController_getAll')).toBe('assets_get-all');
|
|
7
|
-
expect(operationIdToToolName('ModelsController_getPublic')).toBe('models_get-public');
|
|
8
|
-
});
|
|
9
|
-
it('kebab-cases multi-word controller names', () => {
|
|
10
|
-
expect(operationIdToToolName('DeviceAuthController_start')).toBe('device-auth_start');
|
|
11
|
-
expect(operationIdToToolName('AssetMetadataController_getAll')).toBe('asset-metadata_get-all');
|
|
12
|
-
});
|
|
13
|
-
it('handles single-part operation IDs', () => {
|
|
14
|
-
expect(operationIdToToolName('createSomething')).toBe('create-something');
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
describe('generateTools', () => {
|
|
18
|
-
const mockHttpClient = {
|
|
19
|
-
request: vi.fn().mockResolvedValue({ id: 'gen-123' }),
|
|
20
|
-
};
|
|
21
|
-
const operations = [
|
|
22
|
-
{
|
|
23
|
-
operationId: 'GenerateController_createGeneration',
|
|
24
|
-
method: 'post',
|
|
25
|
-
path: '/v2/generate',
|
|
26
|
-
summary: 'Create a generation',
|
|
27
|
-
tags: ['Generate'],
|
|
28
|
-
parameters: [],
|
|
29
|
-
requestBody: {
|
|
30
|
-
schema: {
|
|
31
|
-
type: 'object',
|
|
32
|
-
properties: {
|
|
33
|
-
model: { type: 'string' },
|
|
34
|
-
},
|
|
35
|
-
required: ['model'],
|
|
36
|
-
},
|
|
37
|
-
contentType: 'application/json',
|
|
38
|
-
},
|
|
39
|
-
isMultipart: false,
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
operationId: 'GenerateController_getGeneration',
|
|
43
|
-
method: 'get',
|
|
44
|
-
path: '/v2/generate/{id}',
|
|
45
|
-
summary: 'Get a generation by ID',
|
|
46
|
-
tags: ['Generate'],
|
|
47
|
-
parameters: [
|
|
48
|
-
{
|
|
49
|
-
name: 'id',
|
|
50
|
-
in: 'path',
|
|
51
|
-
required: true,
|
|
52
|
-
schema: { type: 'string' },
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
isMultipart: false,
|
|
56
|
-
},
|
|
57
|
-
];
|
|
58
|
-
it('generates tools from operations', () => {
|
|
59
|
-
const tools = generateTools(operations, mockHttpClient);
|
|
60
|
-
expect(tools).toHaveLength(2);
|
|
61
|
-
expect(tools[0]?.name).toBe('generate_create-generation');
|
|
62
|
-
expect(tools[1]?.name).toBe('generate_get-generation');
|
|
63
|
-
});
|
|
64
|
-
it('uses overrides for known tools', () => {
|
|
65
|
-
const tools = generateTools(operations, mockHttpClient);
|
|
66
|
-
expect(tools[0]?.description).toContain('lipsync video');
|
|
67
|
-
});
|
|
68
|
-
it('handler calls httpClient with correct params', async () => {
|
|
69
|
-
const tools = generateTools(operations, mockHttpClient);
|
|
70
|
-
await tools[0]?.handler({ model: 'sync-1.9.0-beta' });
|
|
71
|
-
expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/generate', {
|
|
72
|
-
query: undefined,
|
|
73
|
-
body: { model: 'sync-1.9.0-beta' },
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
it('handler substitutes path parameters', async () => {
|
|
77
|
-
const tools = generateTools(operations, mockHttpClient);
|
|
78
|
-
await tools[1]?.handler({ id: 'gen-456' });
|
|
79
|
-
expect(mockHttpClient.request).toHaveBeenCalledWith('get', '/v2/generate/gen-456', {
|
|
80
|
-
query: undefined,
|
|
81
|
-
body: undefined,
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
it('handler builds query parameters', async () => {
|
|
85
|
-
const opWithQuery = [
|
|
86
|
-
{
|
|
87
|
-
operationId: 'AssetsController_getAll',
|
|
88
|
-
method: 'get',
|
|
89
|
-
path: '/v2/assets',
|
|
90
|
-
summary: 'List assets',
|
|
91
|
-
tags: ['Assets'],
|
|
92
|
-
parameters: [
|
|
93
|
-
{
|
|
94
|
-
name: 'limit',
|
|
95
|
-
in: 'query',
|
|
96
|
-
required: false,
|
|
97
|
-
schema: { type: 'number' },
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
isMultipart: false,
|
|
101
|
-
},
|
|
102
|
-
];
|
|
103
|
-
const tools = generateTools(opWithQuery, mockHttpClient);
|
|
104
|
-
await tools[0]?.handler({ limit: 10 });
|
|
105
|
-
expect(mockHttpClient.request).toHaveBeenCalledWith('get', '/v2/assets', {
|
|
106
|
-
query: { limit: '10' },
|
|
107
|
-
body: undefined,
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
it('handles allOf composed body schemas', async () => {
|
|
111
|
-
const opWithAllOf = [
|
|
112
|
-
{
|
|
113
|
-
operationId: 'TestController_create',
|
|
114
|
-
method: 'post',
|
|
115
|
-
path: '/v2/test',
|
|
116
|
-
summary: 'Test allOf',
|
|
117
|
-
tags: ['Test'],
|
|
118
|
-
parameters: [],
|
|
119
|
-
requestBody: {
|
|
120
|
-
schema: {
|
|
121
|
-
allOf: [
|
|
122
|
-
{
|
|
123
|
-
type: 'object',
|
|
124
|
-
properties: { name: { type: 'string' } },
|
|
125
|
-
required: ['name'],
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
type: 'object',
|
|
129
|
-
properties: { age: { type: 'number' } },
|
|
130
|
-
},
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
contentType: 'application/json',
|
|
134
|
-
},
|
|
135
|
-
isMultipart: false,
|
|
136
|
-
},
|
|
137
|
-
];
|
|
138
|
-
const tools = generateTools(opWithAllOf, mockHttpClient);
|
|
139
|
-
await tools[0]?.handler({ name: 'test', age: 25 });
|
|
140
|
-
expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/test', {
|
|
141
|
-
query: undefined,
|
|
142
|
-
body: { name: 'test', age: 25 },
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
it('handles schema with both properties and allOf', async () => {
|
|
146
|
-
const opWithBoth = [
|
|
147
|
-
{
|
|
148
|
-
operationId: 'TestController_mixed',
|
|
149
|
-
method: 'post',
|
|
150
|
-
path: '/v2/mixed',
|
|
151
|
-
summary: 'Test mixed',
|
|
152
|
-
tags: ['Test'],
|
|
153
|
-
parameters: [],
|
|
154
|
-
requestBody: {
|
|
155
|
-
schema: {
|
|
156
|
-
type: 'object',
|
|
157
|
-
properties: { base: { type: 'string' } },
|
|
158
|
-
required: ['base'],
|
|
159
|
-
allOf: [
|
|
160
|
-
{
|
|
161
|
-
type: 'object',
|
|
162
|
-
properties: { extra: { type: 'number' } },
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
contentType: 'application/json',
|
|
167
|
-
},
|
|
168
|
-
isMultipart: false,
|
|
169
|
-
},
|
|
170
|
-
];
|
|
171
|
-
const tools = generateTools(opWithBoth, mockHttpClient);
|
|
172
|
-
await tools[0]?.handler({ base: 'hello', extra: 42 });
|
|
173
|
-
expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/mixed', {
|
|
174
|
-
query: undefined,
|
|
175
|
-
body: { base: 'hello', extra: 42 },
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
});
|