@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.
Files changed (261) hide show
  1. package/README.md +261 -86
  2. package/deploy/generation-status/app.html.gz +0 -0
  3. package/deploy/generation-status/release.json +6 -0
  4. package/dist/abort-signals.d.ts +6 -0
  5. package/dist/abort-signals.d.ts.map +1 -0
  6. package/dist/abort-signals.js +23 -0
  7. package/dist/account-features.d.ts +7 -0
  8. package/dist/account-features.d.ts.map +1 -0
  9. package/dist/account-features.js +48 -0
  10. package/dist/app-upload-relay.d.ts +13 -0
  11. package/dist/app-upload-relay.d.ts.map +1 -0
  12. package/dist/app-upload-relay.js +136 -0
  13. package/dist/asset-thumbnail.d.ts +3 -0
  14. package/dist/asset-thumbnail.d.ts.map +1 -0
  15. package/dist/asset-thumbnail.js +2 -0
  16. package/dist/auth/async-context.d.ts +5 -0
  17. package/dist/auth/async-context.d.ts.map +1 -0
  18. package/dist/auth/async-context.js +14 -0
  19. package/dist/auth/bearer-auth.d.ts +16 -0
  20. package/dist/auth/bearer-auth.d.ts.map +1 -0
  21. package/dist/auth/bearer-auth.js +55 -0
  22. package/dist/auth/client-credentials.d.ts +13 -0
  23. package/dist/auth/client-credentials.d.ts.map +1 -0
  24. package/dist/auth/client-credentials.js +67 -0
  25. package/dist/auth/device-auth.d.ts.map +1 -1
  26. package/dist/auth/device-auth.js +3 -2
  27. package/dist/auth/fixture-cleanup.d.ts +4 -0
  28. package/dist/auth/fixture-cleanup.d.ts.map +1 -0
  29. package/dist/auth/fixture-cleanup.js +9 -0
  30. package/dist/auth/index.d.ts +2 -0
  31. package/dist/auth/index.d.ts.map +1 -1
  32. package/dist/auth/index.js +2 -0
  33. package/dist/auth/oauth-diagnostics.d.ts +11 -0
  34. package/dist/auth/oauth-diagnostics.d.ts.map +1 -0
  35. package/dist/auth/oauth-diagnostics.js +78 -0
  36. package/dist/auth/oauth-provider.d.ts +16 -0
  37. package/dist/auth/oauth-provider.d.ts.map +1 -0
  38. package/dist/auth/oauth-provider.js +107 -0
  39. package/dist/auth/resource-metadata.d.ts +2 -0
  40. package/dist/auth/resource-metadata.d.ts.map +1 -0
  41. package/dist/auth/resource-metadata.js +3 -0
  42. package/dist/auth/token-verification.d.ts +11 -0
  43. package/dist/auth/token-verification.d.ts.map +1 -0
  44. package/dist/auth/token-verification.js +99 -0
  45. package/dist/auth/verification-cache.d.ts +8 -0
  46. package/dist/auth/verification-cache.d.ts.map +1 -0
  47. package/dist/auth/verification-cache.js +111 -0
  48. package/dist/chatgpt-analytics.d.ts +22 -0
  49. package/dist/chatgpt-analytics.d.ts.map +1 -0
  50. package/dist/chatgpt-analytics.js +172 -0
  51. package/dist/chatgpt-app.d.ts +15 -0
  52. package/dist/chatgpt-app.d.ts.map +1 -0
  53. package/dist/chatgpt-app.js +133 -0
  54. package/dist/chatgpt-release.d.ts +12 -0
  55. package/dist/chatgpt-release.d.ts.map +1 -0
  56. package/dist/chatgpt-release.js +30 -0
  57. package/dist/cli.js +30 -16
  58. package/dist/client-profile.d.ts +10 -0
  59. package/dist/client-profile.d.ts.map +1 -0
  60. package/dist/client-profile.js +45 -0
  61. package/dist/config.d.ts +17 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +52 -0
  64. package/dist/generation-status-html.d.ts +2 -0
  65. package/dist/generation-status-html.d.ts.map +1 -0
  66. package/dist/generation-status-html.js +26 -0
  67. package/dist/generation-status.d.ts +6 -0
  68. package/dist/generation-status.d.ts.map +1 -0
  69. package/dist/generation-status.js +37 -0
  70. package/dist/http-client.d.ts +45 -1
  71. package/dist/http-client.d.ts.map +1 -1
  72. package/dist/http-client.js +171 -34
  73. package/dist/http-server.d.ts +53 -0
  74. package/dist/http-server.d.ts.map +1 -0
  75. package/dist/http-server.js +753 -0
  76. package/dist/http-session.d.ts +18 -0
  77. package/dist/http-session.d.ts.map +1 -0
  78. package/dist/http-session.js +189 -0
  79. package/dist/index.d.ts +4 -3
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +3 -2
  82. package/dist/oauth-response.d.ts +3 -0
  83. package/dist/oauth-response.d.ts.map +1 -0
  84. package/dist/oauth-response.js +30 -0
  85. package/dist/openapi/index.d.ts +2 -2
  86. package/dist/openapi/index.d.ts.map +1 -1
  87. package/dist/openapi/index.js +1 -1
  88. package/dist/openapi/parser.d.ts +2 -0
  89. package/dist/openapi/parser.d.ts.map +1 -1
  90. package/dist/openapi/parser.js +41 -1
  91. package/dist/openapi/types.d.ts +3 -0
  92. package/dist/openapi/types.d.ts.map +1 -1
  93. package/dist/organization-selection.d.ts +61 -0
  94. package/dist/organization-selection.d.ts.map +1 -0
  95. package/dist/organization-selection.js +142 -0
  96. package/dist/rate-limits.d.ts +13 -0
  97. package/dist/rate-limits.d.ts.map +1 -0
  98. package/dist/rate-limits.js +67 -0
  99. package/dist/revision.d.ts +6 -0
  100. package/dist/revision.d.ts.map +1 -0
  101. package/dist/revision.js +17 -0
  102. package/dist/runtime-diagnostics.d.ts +32 -0
  103. package/dist/runtime-diagnostics.d.ts.map +1 -0
  104. package/dist/runtime-diagnostics.js +58 -0
  105. package/dist/server.d.ts +23 -2
  106. package/dist/server.d.ts.map +1 -1
  107. package/dist/server.js +893 -32
  108. package/dist/session-registry.d.ts +54 -0
  109. package/dist/session-registry.d.ts.map +1 -0
  110. package/dist/session-registry.js +202 -0
  111. package/dist/session-telemetry.d.ts +13 -0
  112. package/dist/session-telemetry.d.ts.map +1 -0
  113. package/dist/session-telemetry.js +87 -0
  114. package/dist/spend-confirmation.d.ts +21 -0
  115. package/dist/spend-confirmation.d.ts.map +1 -0
  116. package/dist/spend-confirmation.js +105 -0
  117. package/dist/tool-analytics-context.d.ts +11 -0
  118. package/dist/tool-analytics-context.d.ts.map +1 -0
  119. package/dist/tool-analytics-context.js +8 -0
  120. package/dist/tool-names.d.ts +35 -0
  121. package/dist/tool-names.d.ts.map +1 -0
  122. package/dist/tool-names.js +133 -0
  123. package/dist/tools/account-context.d.ts +5 -0
  124. package/dist/tools/account-context.d.ts.map +1 -0
  125. package/dist/tools/account-context.js +131 -0
  126. package/dist/tools/account-management.d.ts +4 -0
  127. package/dist/tools/account-management.d.ts.map +1 -0
  128. package/dist/tools/account-management.js +111 -0
  129. package/dist/tools/app-tools.d.ts +31 -0
  130. package/dist/tools/app-tools.d.ts.map +1 -0
  131. package/dist/tools/app-tools.js +350 -0
  132. package/dist/tools/asset-analysis.d.ts +4 -0
  133. package/dist/tools/asset-analysis.d.ts.map +1 -0
  134. package/dist/tools/asset-analysis.js +172 -0
  135. package/dist/tools/asset-creators.d.ts +4 -0
  136. package/dist/tools/asset-creators.d.ts.map +1 -0
  137. package/dist/tools/asset-creators.js +38 -0
  138. package/dist/tools/audio-trim.d.ts +6 -0
  139. package/dist/tools/audio-trim.d.ts.map +1 -0
  140. package/dist/tools/audio-trim.js +79 -0
  141. package/dist/tools/batch-results.d.ts +16 -0
  142. package/dist/tools/batch-results.d.ts.map +1 -0
  143. package/dist/tools/batch-results.js +103 -0
  144. package/dist/tools/batches.d.ts +28 -0
  145. package/dist/tools/batches.d.ts.map +1 -0
  146. package/dist/tools/batches.js +293 -0
  147. package/dist/tools/dialogue.d.ts +6 -0
  148. package/dist/tools/dialogue.d.ts.map +1 -0
  149. package/dist/tools/dialogue.js +309 -0
  150. package/dist/tools/estimate-duration.d.ts +35 -0
  151. package/dist/tools/estimate-duration.d.ts.map +1 -0
  152. package/dist/tools/estimate-duration.js +66 -0
  153. package/dist/tools/feedback.d.ts +14 -0
  154. package/dist/tools/feedback.d.ts.map +1 -0
  155. package/dist/tools/feedback.js +72 -0
  156. package/dist/tools/generated-adapters.d.ts +25 -0
  157. package/dist/tools/generated-adapters.d.ts.map +1 -0
  158. package/dist/tools/generated-adapters.js +143 -0
  159. package/dist/tools/generation-context.d.ts +14 -0
  160. package/dist/tools/generation-context.d.ts.map +1 -0
  161. package/dist/tools/generation-context.js +39 -0
  162. package/dist/tools/generation-continuation.d.ts +4 -0
  163. package/dist/tools/generation-continuation.d.ts.map +1 -0
  164. package/dist/tools/generation-continuation.js +124 -0
  165. package/dist/tools/generation-costs.d.ts +6 -0
  166. package/dist/tools/generation-costs.d.ts.map +1 -0
  167. package/dist/tools/generation-costs.js +67 -0
  168. package/dist/tools/generation-output.d.ts +3 -0
  169. package/dist/tools/generation-output.d.ts.map +1 -0
  170. package/dist/tools/generation-output.js +39 -0
  171. package/dist/tools/generator.d.ts +35 -2
  172. package/dist/tools/generator.d.ts.map +1 -1
  173. package/dist/tools/generator.js +127 -9
  174. package/dist/tools/job-status.d.ts +35 -0
  175. package/dist/tools/job-status.d.ts.map +1 -0
  176. package/dist/tools/job-status.js +92 -0
  177. package/dist/tools/job-wait.d.ts +41 -0
  178. package/dist/tools/job-wait.d.ts.map +1 -0
  179. package/dist/tools/job-wait.js +84 -0
  180. package/dist/tools/jobs.d.ts +3 -0
  181. package/dist/tools/jobs.d.ts.map +1 -0
  182. package/dist/tools/jobs.js +210 -0
  183. package/dist/tools/media-upload.d.ts +27 -0
  184. package/dist/tools/media-upload.d.ts.map +1 -0
  185. package/dist/tools/media-upload.js +247 -0
  186. package/dist/tools/model-options.d.ts +36 -0
  187. package/dist/tools/model-options.d.ts.map +1 -0
  188. package/dist/tools/model-options.js +48 -0
  189. package/dist/tools/organization-choice.d.ts +9 -0
  190. package/dist/tools/organization-choice.d.ts.map +1 -0
  191. package/dist/tools/organization-choice.js +136 -0
  192. package/dist/tools/organizations.d.ts +56 -0
  193. package/dist/tools/organizations.d.ts.map +1 -0
  194. package/dist/tools/organizations.js +235 -0
  195. package/dist/tools/output-schemas.d.ts +54 -0
  196. package/dist/tools/output-schemas.d.ts.map +1 -0
  197. package/dist/tools/output-schemas.js +58 -0
  198. package/dist/tools/overrides.d.ts +3 -0
  199. package/dist/tools/overrides.d.ts.map +1 -1
  200. package/dist/tools/overrides.js +113 -15
  201. package/dist/tools/playback-metadata.d.ts +4 -0
  202. package/dist/tools/playback-metadata.d.ts.map +1 -0
  203. package/dist/tools/playback-metadata.js +51 -0
  204. package/dist/tools/project-destination.d.ts +13 -0
  205. package/dist/tools/project-destination.d.ts.map +1 -0
  206. package/dist/tools/project-destination.js +45 -0
  207. package/dist/tools/project-history.d.ts +6 -0
  208. package/dist/tools/project-history.d.ts.map +1 -0
  209. package/dist/tools/project-history.js +45 -0
  210. package/dist/tools/project-intent.d.ts +8 -0
  211. package/dist/tools/project-intent.d.ts.map +1 -0
  212. package/dist/tools/project-intent.js +87 -0
  213. package/dist/tools/running-submissions.d.ts +7 -0
  214. package/dist/tools/running-submissions.d.ts.map +1 -0
  215. package/dist/tools/running-submissions.js +91 -0
  216. package/dist/tools/speech.d.ts +6 -0
  217. package/dist/tools/speech.d.ts.map +1 -0
  218. package/dist/tools/speech.js +116 -0
  219. package/dist/tools/studio-draft.d.ts +7 -0
  220. package/dist/tools/studio-draft.d.ts.map +1 -0
  221. package/dist/tools/studio-draft.js +195 -0
  222. package/dist/tools/studio-view-contract.d.ts +184 -0
  223. package/dist/tools/studio-view-contract.d.ts.map +1 -0
  224. package/dist/tools/studio-view-contract.js +67 -0
  225. package/dist/tools/studio-view.d.ts +6 -0
  226. package/dist/tools/studio-view.d.ts.map +1 -0
  227. package/dist/tools/studio-view.js +126 -0
  228. package/dist/tools/timeline-lipsync.d.ts +316 -0
  229. package/dist/tools/timeline-lipsync.d.ts.map +1 -0
  230. package/dist/tools/timeline-lipsync.js +304 -0
  231. package/dist/tools/translation-preview.d.ts +8 -0
  232. package/dist/tools/translation-preview.d.ts.map +1 -0
  233. package/dist/tools/translation-preview.js +146 -0
  234. package/dist/tools/translation.d.ts +6 -0
  235. package/dist/tools/translation.d.ts.map +1 -0
  236. package/dist/tools/translation.js +131 -0
  237. package/dist/tools/upload-widget.d.ts +13 -0
  238. package/dist/tools/upload-widget.d.ts.map +1 -0
  239. package/dist/tools/upload-widget.js +788 -0
  240. package/dist/toolsets.d.ts +18 -0
  241. package/dist/toolsets.d.ts.map +1 -0
  242. package/dist/toolsets.js +157 -0
  243. package/dist/update-check.d.ts +38 -0
  244. package/dist/update-check.d.ts.map +1 -0
  245. package/dist/update-check.js +150 -0
  246. package/dist/upload-runtime.d.ts +45 -0
  247. package/dist/upload-runtime.d.ts.map +1 -0
  248. package/dist/upload-runtime.js +156 -0
  249. package/dist/upload-source.d.ts +4 -0
  250. package/dist/upload-source.d.ts.map +1 -0
  251. package/dist/upload-source.js +46 -0
  252. package/dist/version.d.ts +2 -0
  253. package/dist/version.d.ts.map +1 -0
  254. package/dist/version.js +3 -0
  255. package/package.json +77 -31
  256. package/dist/openapi/parser.test.d.ts +0 -2
  257. package/dist/openapi/parser.test.d.ts.map +0 -1
  258. package/dist/openapi/parser.test.js +0 -188
  259. package/dist/tools/generator.test.d.ts +0 -2
  260. package/dist/tools/generator.test.d.ts.map +0 -1
  261. package/dist/tools/generator.test.js +0 -178
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Tool names follow one `<noun>_<verb>` scheme (CRAFT-7786). This is the permanent record
3
+ * of every rename, old → new: operationIdToToolName names generated tools through it,
4
+ * nameTakenByRenamedTool reserves its new names, and analytics report the old names.
5
+ * Never delete entries; ending the old names' deprecation is OLD_NAME_ALIASES below.
6
+ */
7
+ export const RENAMED_TOOLS = {
8
+ 'create-lipsync': 'lipsync_create',
9
+ 'create-lipsync-from-assets': 'lipsync_create-from-assets',
10
+ 'create-timeline-lipsync': 'lipsync_create-timeline',
11
+ 'generate_create-generation': 'generations_create',
12
+ 'generate_get-generation': 'generations_get',
13
+ 'generate_get-generations': 'generations_list',
14
+ 'generate_estimate-cost': 'generations_estimate-cost',
15
+ 'generations_estimate-cost': 'generations_estimate',
16
+ 'generations_get-by-id': 'generations_get-details',
17
+ 'generations_get-count': 'generations_count',
18
+ 'get-generation-costs': 'generations_get-costs',
19
+ 'get-generation-continuation': 'generations_get-continuation',
20
+ models_get: 'models_list',
21
+ 'create-translate-and-dub': 'dubbing_create',
22
+ 'get-translation-options': 'dubbing_get-options',
23
+ 'estimate-translation-preview': 'translation-previews_estimate',
24
+ 'create-translation-preview': 'translation-previews_create',
25
+ 'get-translation-preview': 'translation-previews_get',
26
+ 'get-speech-options': 'speech-previews_get-options',
27
+ 'create-speech-preview': 'speech-previews_create',
28
+ 'get-speech-preview': 'speech-previews_get',
29
+ 'voices_get-voices': 'voices_list',
30
+ 'voices_get-voice': 'voices_get',
31
+ 'voices_clone-voice': 'voices_clone',
32
+ 'voices_delete-voice': 'voices_delete',
33
+ 'tts_create-job': 'tts-jobs_create',
34
+ 'tts_get-job': 'tts-jobs_get',
35
+ 'get-dialogue-options': 'dialogue_get-options',
36
+ 'upload-dialogue-source': 'dialogue_upload-source',
37
+ 'create-dialogue-transcription': 'dialogue-transcriptions_create',
38
+ 'get-dialogue-transcription': 'dialogue-transcriptions_get',
39
+ 'create-dialogue-preview': 'dialogue-previews_create',
40
+ 'get-dialogue-preview': 'dialogue-previews_get',
41
+ 'estimate-dialogue-video': 'dialogue-videos_estimate',
42
+ 'create-dialogue-video': 'dialogue-videos_create',
43
+ 'dialogue-edits_create-dialogue-edit': 'dialogue-edits_create',
44
+ 'dialogue-edits_get-dialogue-edit-job': 'dialogue-edits_get',
45
+ 'transcriptions_create-transcription': 'transcriptions_create',
46
+ 'transcriptions_get-transcription-job': 'transcriptions_get',
47
+ 'assets_get-all': 'assets_list',
48
+ 'get-playback-metadata': 'assets_get-playback-metadata',
49
+ 'get-asset-creators': 'assets_list-creators',
50
+ 'upload-media': 'assets_upload',
51
+ 'open-upload-widget': 'assets_open-upload-widget',
52
+ 'trim-audio': 'audio-trims_create',
53
+ 'get-audio-trim': 'audio-trims_get',
54
+ 'projects_get-all': 'projects_list',
55
+ 'projects_get-generations': 'projects_list-generations',
56
+ 'rename-project': 'projects_rename',
57
+ 'get-account-context': 'account_get-context',
58
+ 'get-account-usage': 'account_get-usage',
59
+ 'send-feedback': 'feedback_send',
60
+ 'track-chatgpt-event': 'analytics_track-event',
61
+ 'open-sync-app': 'app_open',
62
+ 'get-studio-view': 'studio-views_get',
63
+ 'open-studio-project': 'studio-views_open-project',
64
+ 'refresh-studio-project': 'studio-views_refresh-project',
65
+ 'refresh-studio-assets': 'studio-views_refresh-assets',
66
+ 'show-studio-generation': 'studio-views_show-generation',
67
+ 'continue-studio-generation': 'studio-views_continue-generation',
68
+ 'register-studio-view': 'studio-views_register',
69
+ 'ack-studio-view': 'studio-views_ack',
70
+ 'get-studio-draft': 'studio-drafts_get',
71
+ 'update-studio-draft': 'studio-drafts_update',
72
+ 'save-studio-draft': 'studio-drafts_save',
73
+ 'ack-studio-draft': 'studio-drafts_ack',
74
+ };
75
+ const LEGACY_BY_NAME = new Map(Object.entries(RENAMED_TOOLS).map(([legacy, name]) => [name, legacy]));
76
+ /** The current name for a name derived from an operationId or used before the rename. */
77
+ export function currentToolName(name) {
78
+ return RENAMED_TOOLS[name] ?? name;
79
+ }
80
+ const CURRENT_NAMES = new Set(Object.values(RENAMED_TOOLS));
81
+ /**
82
+ * True when a generated tool's derived name is already a renamed tool's new name, such as
83
+ * StudioViewsController_get → studio-views_get. The hand-written tool owns that name, so
84
+ * the raw operation is never exposed under it.
85
+ */
86
+ export function nameTakenByRenamedTool(derived) {
87
+ return !(derived in RENAMED_TOOLS) && CURRENT_NAMES.has(derived);
88
+ }
89
+ /** The name a tool had before the rename, if it changed. Permanent; see oldNameAlias. */
90
+ export function previousToolName(name) {
91
+ return LEGACY_BY_NAME.get(name);
92
+ }
93
+ /**
94
+ * Temporary: the old names that stay callable, as unlisted aliases that add a notice
95
+ * naming the new tool, and that app profiles list as app-only tools because retained
96
+ * Studio bundles and widget templates call them. Remove names here (eventually all of
97
+ * them) to end the deprecation; RENAMED_TOOLS and generated tool names stay as they are.
98
+ */
99
+ export const OLD_NAME_ALIASES = new Set(Object.keys(RENAMED_TOOLS));
100
+ /** The old name still callable for this tool during the deprecation, if any. */
101
+ export function oldNameAlias(name, aliases = OLD_NAME_ALIASES) {
102
+ const previous = previousToolName(name);
103
+ return previous !== undefined && aliases.has(previous) ? previous : undefined;
104
+ }
105
+ export function renamedToolNotice(legacy, name) {
106
+ return `Tool ${legacy} is now named ${name}; call ${name} from now on, as the old name will stop working after the deprecation period.`;
107
+ }
108
+ /**
109
+ * Widgets cannot call a tool that is not listed, and ChatGPT keeps earlier Studio bundles
110
+ * and widget templates that call tools by their old names. On app profiles, list those
111
+ * old names as app-only tools (the model does not see them) for the deprecation period.
112
+ */
113
+ export function withLegacyAppDescriptors(descriptors) {
114
+ const current = new Set(descriptors.map((descriptor) => descriptor.name));
115
+ const legacy = descriptors.flatMap((descriptor) => {
116
+ const name = oldNameAlias(descriptor.name);
117
+ const meta = descriptor._meta ?? {};
118
+ const ui = (meta.ui ?? {});
119
+ const forApp = (Array.isArray(ui.visibility) && ui.visibility.includes('app')) ||
120
+ meta['openai/widgetAccessible'] === true;
121
+ if (!name || !forApp || current.has(name))
122
+ return [];
123
+ return [
124
+ {
125
+ ...descriptor,
126
+ name,
127
+ description: `Deprecated name of ${descriptor.name}, kept for Sync app widgets. Call ${descriptor.name}.`,
128
+ _meta: { ...meta, ui: { ...ui, visibility: ['app'] } },
129
+ },
130
+ ];
131
+ });
132
+ return [...descriptors, ...legacy];
133
+ }
@@ -0,0 +1,5 @@
1
+ import { type HttpClient } from '../http-client.js';
2
+ import type { McpToolDefinition } from './generator.js';
3
+ import { type CredentialKind } from './organizations.js';
4
+ export declare function createAccountContextTool(http: HttpClient, studioDraftSync?: boolean, studioViewSync?: boolean, audioTrimming?: boolean, chatgptAnalytics?: boolean, credential?: CredentialKind): McpToolDefinition;
5
+ //# sourceMappingURL=account-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-context.d.ts","sourceRoot":"","sources":["../../src/tools/account-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,oBAAoB,CAAC;AA8E5B,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,UAAU,EAChB,eAAe,UAAQ,EACvB,cAAc,UAAQ,EACtB,aAAa,UAAQ,EACrB,gBAAgB,UAAQ,EACxB,UAAU,GAAE,cAAuB,GAClC,iBAAiB,CA6DnB"}
@@ -0,0 +1,131 @@
1
+ import { z } from 'zod';
2
+ import { ApiRequestError } from '../http-client.js';
3
+ import { currentOrganizationSession } from '../organization-selection.js';
4
+ import { featuresSchema, parseAccountOverview, switchHint, } from './organizations.js';
5
+ const accountContext = z.object({
6
+ account: z
7
+ .object({
8
+ id: z.uuid(),
9
+ email: z.string().nullable(),
10
+ name: z.string().nullable(),
11
+ })
12
+ .nullable(),
13
+ limits: z
14
+ .object({
15
+ seats: z.number().finite().nonnegative(),
16
+ voiceClone: z.number().finite().nonnegative(),
17
+ })
18
+ .optional(),
19
+ organization: z.object({
20
+ id: z.uuid(),
21
+ name: z.string().nullable(),
22
+ role: z.string(),
23
+ }),
24
+ plan: z.object({ id: z.string(), name: z.string() }).optional(),
25
+ generationLimits: z
26
+ .object({
27
+ concurrency: z.number().finite().nonnegative(),
28
+ maxOutputDurationSeconds: z.number().finite().nonnegative(),
29
+ })
30
+ .optional()
31
+ .describe('Generations that can run at once and the longest output one may produce, in seconds. Plan a job within these before creating it.'),
32
+ capabilities: z.object({
33
+ projectRenaming: z.literal(true),
34
+ chatgptAnalytics: z.literal(true).optional(),
35
+ studioDraftSync: z.literal(true).optional(),
36
+ studioViewSync: z.literal(true).optional(),
37
+ audioTrimming: z.literal(true).optional(),
38
+ }),
39
+ features: featuresSchema.optional(),
40
+ organizationChoice: z
41
+ .object({
42
+ selectedBy: z
43
+ .enum(['session', 'credential'])
44
+ .describe('session: chosen with organizations_select. credential: the default of this sign-in or API key.'),
45
+ howToSwitch: z.string(),
46
+ })
47
+ .describe('How the active organization was chosen, and how to work in another one.'),
48
+ });
49
+ /**
50
+ * GET /v2/account reflects the organization chosen for this request, so it wins over the
51
+ * caller identity. Remembers what was read for this MCP session, unless the session switched
52
+ * organization while it was read (`stamp`, taken before the read).
53
+ */
54
+ function activeOrganization(caller, overview, stamp) {
55
+ const organization = overview?.organization
56
+ ? {
57
+ id: overview.organization.id,
58
+ name: overview.organization.name,
59
+ role: overview.organization.role ?? caller.organization.role,
60
+ }
61
+ : caller.organization;
62
+ const session = currentOrganizationSession();
63
+ if (session && !session.selected)
64
+ session.rememberDefault({ id: organization.id, name: organization.name });
65
+ if (session && overview && stamp)
66
+ session.recordFeatures(overview.features, stamp, overview.organization?.id);
67
+ return organization;
68
+ }
69
+ export function createAccountContextTool(http, studioDraftSync = false, studioViewSync = false, audioTrimming = false, chatgptAnalytics = false, credential = 'user') {
70
+ return {
71
+ name: 'account_get-context',
72
+ title: 'Read connected Sync account',
73
+ description: 'Read the authenticated account and the organization this session runs in (all generations are created there), for account display and personal asset scope, its plan, generation limits (concurrency and longest output), feature flags, team seats and voice-clone limits. organizationChoice says how that organization was chosen and how to switch. API keys have no signed-in account. This does not grant permissions or change the organization.',
74
+ inputSchema: {},
75
+ outputSchema: accountContext.shape,
76
+ annotations: {
77
+ readOnlyHint: true,
78
+ destructiveHint: false,
79
+ idempotentHint: true,
80
+ openWorldHint: false,
81
+ },
82
+ handler: async (_args, context) => {
83
+ const identity = await http.request('get', '/v2/oauth/account', {
84
+ signal: context?.signal,
85
+ });
86
+ // A limits outage must not erase verified identity; expired credentials still need linking.
87
+ const optional = async (path) => {
88
+ try {
89
+ return await http.request('get', path, { signal: context?.signal });
90
+ }
91
+ catch (error) {
92
+ context?.signal?.throwIfAborted();
93
+ if (error instanceof ApiRequestError && error.status === 401)
94
+ throw error;
95
+ return undefined;
96
+ }
97
+ };
98
+ const limits = await optional('/v2/plans/limits');
99
+ const stamp = currentOrganizationSession()?.featureStamp();
100
+ const overview = await optional('/v2/account');
101
+ const plan = overview === undefined ? undefined : parseAccountOverview(overview);
102
+ const caller = z
103
+ .object({
104
+ account: accountContext.shape.account,
105
+ organization: accountContext.shape.organization,
106
+ })
107
+ .parse(identity);
108
+ return accountContext.parse({
109
+ account: caller.account,
110
+ organization: activeOrganization(caller, plan, stamp),
111
+ ...(limits === undefined ? {} : { limits }),
112
+ ...(plan?.plan ? { plan: plan.plan } : {}),
113
+ ...(plan?.limits ? { generationLimits: plan.limits } : {}),
114
+ capabilities: {
115
+ projectRenaming: true,
116
+ ...(chatgptAnalytics && context?.clientProfile?.name === 'chatgpt'
117
+ ? { chatgptAnalytics: true }
118
+ : {}),
119
+ ...(studioDraftSync ? { studioDraftSync: true } : {}),
120
+ ...(studioViewSync ? { studioViewSync: true } : {}),
121
+ ...(audioTrimming ? { audioTrimming: true } : {}),
122
+ },
123
+ ...(plan?.features ? { features: plan.features } : {}),
124
+ organizationChoice: {
125
+ selectedBy: currentOrganizationSession()?.selected ? 'session' : 'credential',
126
+ howToSwitch: switchHint(credential),
127
+ },
128
+ });
129
+ },
130
+ };
131
+ }
@@ -0,0 +1,4 @@
1
+ import type { HttpClient } from '../http-client.js';
2
+ import type { McpToolDefinition } from './generator.js';
3
+ export declare function createAccountManagementTools(http: HttpClient): McpToolDefinition[];
4
+ //# sourceMappingURL=account-management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-management.d.ts","sourceRoot":"","sources":["../../src/tools/account-management.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA+CxD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,EAAE,CAkFlF"}
@@ -0,0 +1,111 @@
1
+ import { z } from 'zod';
2
+ const counter = z.object({
3
+ used: z.number().finite().nonnegative(),
4
+ max: z.number().finite().nonnegative(),
5
+ });
6
+ const billing = z.object({
7
+ plan: z.string().nullable(),
8
+ canManageBilling: z.boolean(),
9
+ credits: z
10
+ .object({
11
+ balance: z.number().finite(),
12
+ available: z.number().finite(),
13
+ inFlight: z.number().finite(),
14
+ })
15
+ .nullish(),
16
+ freeMonthlyLimits: z
17
+ .object({ generations: counter, tts: counter, monthlyResetDate: z.string().datetime() })
18
+ .nullable(),
19
+ });
20
+ const usage = z.object({
21
+ totalCostCents: z.number().finite(),
22
+ totalFrames: z.number().finite().nonnegative(),
23
+ totalTtsSeconds: z.number().finite().nonnegative(),
24
+ });
25
+ const response = billing.extend({
26
+ credits: billing.shape.credits.unwrap().nullable(),
27
+ usage: usage.nullable(),
28
+ });
29
+ const totals = z.object({
30
+ isComplete: z.boolean(),
31
+ items: z.array(z.union([
32
+ z.object({
33
+ totalGenerationsAmountBilledCents: z.number().finite(),
34
+ totalFramesCount: z.number().finite().nonnegative(),
35
+ }),
36
+ z.object({
37
+ totalIntegrationsAmountBilledCents: z.number().finite(),
38
+ totalSecondsGenerated: z.number().finite().nonnegative(),
39
+ }),
40
+ ])),
41
+ });
42
+ const rename = z.object({ projectId: z.uuid(), name: z.string().trim().min(1).max(255) });
43
+ const project = z.object({ id: z.uuid(), name: z.string() });
44
+ export function createAccountManagementTools(http) {
45
+ return [
46
+ {
47
+ name: 'account_get-usage',
48
+ title: 'Read Sync usage and balance',
49
+ description: 'Read the connected organization’s available credits, free allowance, or complete billed usage for the current period. Does not purchase credits, change plans, or start generation.',
50
+ inputSchema: {},
51
+ outputSchema: response.shape,
52
+ annotations: {
53
+ readOnlyHint: true,
54
+ destructiveHint: false,
55
+ openWorldHint: false,
56
+ idempotentHint: true,
57
+ },
58
+ handler: async (_args, context) => {
59
+ const identity = z
60
+ .object({ organization: z.object({ role: z.string() }) })
61
+ .parse(await http.request('get', '/v2/oauth/account', { signal: context?.signal }));
62
+ const info = billing.parse(await http.request('get', '/v2/billing', { signal: context?.signal }));
63
+ let summary = null;
64
+ if (!info.credits && !info.freeMonthlyLimits) {
65
+ const data = totals.parse(await http.request('get', '/v2/usage/totals-with-completeness', {
66
+ signal: context?.signal,
67
+ }));
68
+ if (data.isComplete)
69
+ summary = data.items.reduce((sum, item) => ({
70
+ totalCostCents: sum.totalCostCents +
71
+ ('totalGenerationsAmountBilledCents' in item
72
+ ? item.totalGenerationsAmountBilledCents
73
+ : item.totalIntegrationsAmountBilledCents),
74
+ totalFrames: sum.totalFrames + ('totalFramesCount' in item ? item.totalFramesCount : 0),
75
+ totalTtsSeconds: sum.totalTtsSeconds +
76
+ ('totalSecondsGenerated' in item ? item.totalSecondsGenerated : 0),
77
+ }), { totalCostCents: 0, totalFrames: 0, totalTtsSeconds: 0 });
78
+ }
79
+ return response.parse({
80
+ ...info,
81
+ canManageBilling: info.canManageBilling && ['owner', 'admin'].includes(identity.organization.role),
82
+ credits: info.credits ?? null,
83
+ usage: summary,
84
+ });
85
+ },
86
+ },
87
+ {
88
+ name: 'projects_rename',
89
+ title: 'Rename a Sync project',
90
+ description: 'Change only the name of an accessible Sync project in the connected organization. Does not change visibility, ownership, media, or generations. Requires an explicit user request.',
91
+ inputSchema: rename.shape,
92
+ outputSchema: project.shape,
93
+ annotations: {
94
+ readOnlyHint: false,
95
+ destructiveHint: false,
96
+ openWorldHint: false,
97
+ idempotentHint: true,
98
+ },
99
+ handler: async (args, context) => {
100
+ const { projectId, name } = rename.parse(args);
101
+ const result = project.parse(await http.request('patch', `/v2/projects/${projectId}`, {
102
+ body: { name },
103
+ signal: context?.signal,
104
+ }));
105
+ if (result.id.toLowerCase() !== projectId.toLowerCase())
106
+ throw new Error('Could not verify the renamed project.');
107
+ return result;
108
+ },
109
+ },
110
+ ];
111
+ }
@@ -0,0 +1,31 @@
1
+ import { type ClientProfile } from '../client-profile.js';
2
+ import type { HttpClient } from '../http-client.js';
3
+ import { type UploadRuntime } from '../upload-runtime.js';
4
+ import type { McpToolDefinition } from './generator.js';
5
+ /**
6
+ * Hand-written tools layered on top of the auto-generated ones.
7
+ *
8
+ * `lipsync_create` is a flat convenience wrapper over POST /v2/generate (the
9
+ * auto-generated generations_create takes a nested `input[]` array).
10
+ *
11
+ * Each media input can arrive three ways:
12
+ * - `*Url` string — a hosted/public URL, e.g. the `url` returned by tts_create
13
+ * or an asset URL. This is the only way to chain another tool's output (the
14
+ * model can't synthesise a fileParam object), and it's passed straight to
15
+ * the generation as `url`.
16
+ * - `*AssetId` string — a durable Sync asset created earlier, typically by
17
+ * assets_upload. This keeps uploaded-file handling separate from generation
18
+ * creation when the host supports file params but should not pass the file
19
+ * directly to the generation tool. For public URLs, use the explicit `*Url`
20
+ * fields or the generated assets_create tool instead.
21
+ * - `video`/`image`/`audio` file objects — declared as `openai/fileParams` so
22
+ * ChatGPT can hand a user-uploaded file straight in. These carry a
23
+ * short-lived `download_url`, so we re-host the bytes through the assets
24
+ * pipeline and pass a durable `assetId` (see rehostUpload).
25
+ *
26
+ * The generation can be driven by either audio (`audioUrl`/`audioAssetId`/
27
+ * `audio`) or text (`script` + `voiceId`). Text is sent directly to POST
28
+ * /v2/generate as a text input, avoiding a separate tts_create call.
29
+ */
30
+ export declare function createAppTools(httpClient: HttpClient, runtime?: UploadRuntime, getProfile?: () => ClientProfile): McpToolDefinition[];
31
+ //# sourceMappingURL=app-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tools.d.ts","sourceRoot":"","sources":["../../src/tools/app-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAmExD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,aAA6B,EACtC,UAAU,GAAE,MAAM,aAA4C,GAC7D,iBAAiB,EAAE,CA0YrB"}