@better-i18n/mcp 0.15.3 → 0.15.5

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 (99) hide show
  1. package/dist/__tests__/base-tool.test.d.ts +2 -0
  2. package/dist/__tests__/base-tool.test.d.ts.map +1 -0
  3. package/dist/__tests__/base-tool.test.js +193 -0
  4. package/dist/__tests__/base-tool.test.js.map +1 -0
  5. package/dist/__tests__/contract.test.d.ts +24 -0
  6. package/dist/__tests__/contract.test.d.ts.map +1 -0
  7. package/dist/__tests__/contract.test.js +919 -0
  8. package/dist/__tests__/contract.test.js.map +1 -0
  9. package/dist/__tests__/fixtures/mock-client.d.ts +11 -0
  10. package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
  11. package/dist/__tests__/fixtures/mock-client.js +33 -0
  12. package/dist/__tests__/fixtures/mock-client.js.map +1 -0
  13. package/dist/__tests__/helpers.d.ts +10 -0
  14. package/dist/__tests__/helpers.d.ts.map +1 -0
  15. package/dist/__tests__/helpers.js +27 -0
  16. package/dist/__tests__/helpers.js.map +1 -0
  17. package/dist/__tests__/schema-alignment.test.d.ts +15 -0
  18. package/dist/__tests__/schema-alignment.test.d.ts.map +1 -0
  19. package/dist/__tests__/schema-alignment.test.js +1011 -0
  20. package/dist/__tests__/schema-alignment.test.js.map +1 -0
  21. package/dist/__tests__/server-dispatch.test.d.ts +10 -0
  22. package/dist/__tests__/server-dispatch.test.d.ts.map +1 -0
  23. package/dist/__tests__/server-dispatch.test.js +202 -0
  24. package/dist/__tests__/server-dispatch.test.js.map +1 -0
  25. package/dist/tools/__tests__/createKeys.test.d.ts +2 -0
  26. package/dist/tools/__tests__/createKeys.test.d.ts.map +1 -0
  27. package/dist/tools/__tests__/createKeys.test.js +139 -0
  28. package/dist/tools/__tests__/createKeys.test.js.map +1 -0
  29. package/dist/tools/__tests__/deleteKeys.test.d.ts +2 -0
  30. package/dist/tools/__tests__/deleteKeys.test.d.ts.map +1 -0
  31. package/dist/tools/__tests__/deleteKeys.test.js +91 -0
  32. package/dist/tools/__tests__/deleteKeys.test.js.map +1 -0
  33. package/dist/tools/__tests__/getPendingChanges.test.d.ts +2 -0
  34. package/dist/tools/__tests__/getPendingChanges.test.d.ts.map +1 -0
  35. package/dist/tools/__tests__/getPendingChanges.test.js +50 -0
  36. package/dist/tools/__tests__/getPendingChanges.test.js.map +1 -0
  37. package/dist/tools/__tests__/getProject.test.d.ts +2 -0
  38. package/dist/tools/__tests__/getProject.test.d.ts.map +1 -0
  39. package/dist/tools/__tests__/getProject.test.js +55 -0
  40. package/dist/tools/__tests__/getProject.test.js.map +1 -0
  41. package/dist/tools/__tests__/getSync.test.d.ts +2 -0
  42. package/dist/tools/__tests__/getSync.test.d.ts.map +1 -0
  43. package/dist/tools/__tests__/getSync.test.js +42 -0
  44. package/dist/tools/__tests__/getSync.test.js.map +1 -0
  45. package/dist/tools/__tests__/getSyncs.test.d.ts +2 -0
  46. package/dist/tools/__tests__/getSyncs.test.d.ts.map +1 -0
  47. package/dist/tools/__tests__/getSyncs.test.js +66 -0
  48. package/dist/tools/__tests__/getSyncs.test.js.map +1 -0
  49. package/dist/tools/__tests__/getTranslations.test.d.ts +2 -0
  50. package/dist/tools/__tests__/getTranslations.test.d.ts.map +1 -0
  51. package/dist/tools/__tests__/getTranslations.test.js +114 -0
  52. package/dist/tools/__tests__/getTranslations.test.js.map +1 -0
  53. package/dist/tools/__tests__/listKeys.test.d.ts +2 -0
  54. package/dist/tools/__tests__/listKeys.test.d.ts.map +1 -0
  55. package/dist/tools/__tests__/listKeys.test.js +98 -0
  56. package/dist/tools/__tests__/listKeys.test.js.map +1 -0
  57. package/dist/tools/__tests__/listProjects.test.d.ts +2 -0
  58. package/dist/tools/__tests__/listProjects.test.d.ts.map +1 -0
  59. package/dist/tools/__tests__/listProjects.test.js +45 -0
  60. package/dist/tools/__tests__/listProjects.test.js.map +1 -0
  61. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts +2 -0
  62. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts.map +1 -0
  63. package/dist/tools/__tests__/proposeLanguageEdits.test.js +87 -0
  64. package/dist/tools/__tests__/proposeLanguageEdits.test.js.map +1 -0
  65. package/dist/tools/__tests__/proposeLanguages.test.d.ts +2 -0
  66. package/dist/tools/__tests__/proposeLanguages.test.d.ts.map +1 -0
  67. package/dist/tools/__tests__/proposeLanguages.test.js +109 -0
  68. package/dist/tools/__tests__/proposeLanguages.test.js.map +1 -0
  69. package/dist/tools/__tests__/publishTranslations.test.d.ts +2 -0
  70. package/dist/tools/__tests__/publishTranslations.test.d.ts.map +1 -0
  71. package/dist/tools/__tests__/publishTranslations.test.js +127 -0
  72. package/dist/tools/__tests__/publishTranslations.test.js.map +1 -0
  73. package/dist/tools/__tests__/updateKeys.test.d.ts +2 -0
  74. package/dist/tools/__tests__/updateKeys.test.d.ts.map +1 -0
  75. package/dist/tools/__tests__/updateKeys.test.js +122 -0
  76. package/dist/tools/__tests__/updateKeys.test.js.map +1 -0
  77. package/dist/tools/createKeys.d.ts.map +1 -1
  78. package/dist/tools/createKeys.js +19 -7
  79. package/dist/tools/createKeys.js.map +1 -1
  80. package/dist/tools/deleteKeys.d.ts.map +1 -1
  81. package/dist/tools/deleteKeys.js +9 -1
  82. package/dist/tools/deleteKeys.js.map +1 -1
  83. package/dist/tools/getProject.d.ts.map +1 -1
  84. package/dist/tools/getProject.js +2 -1
  85. package/dist/tools/getProject.js.map +1 -1
  86. package/dist/tools/getTranslations.d.ts +1 -1
  87. package/dist/tools/getTranslations.js +4 -4
  88. package/dist/tools/getTranslations.js.map +1 -1
  89. package/dist/tools/publishTranslations.d.ts.map +1 -1
  90. package/dist/tools/publishTranslations.js +12 -3
  91. package/dist/tools/publishTranslations.js.map +1 -1
  92. package/dist/tools/updateKeys.d.ts.map +1 -1
  93. package/dist/tools/updateKeys.js +8 -3
  94. package/dist/tools/updateKeys.js.map +1 -1
  95. package/dist/worker.test.d.ts +16 -0
  96. package/dist/worker.test.d.ts.map +1 -0
  97. package/dist/worker.test.js +244 -0
  98. package/dist/worker.test.js.map +1 -0
  99. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"getProject.js","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4FAA4F;YAC5F,4EAA4E;YAC5E,6GAA6G;YAC7G,+EAA+E;YAC/E,wEAAwE;YACxE,qEAAqE;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;aACxB;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/C,OAAO,EAAE,WAAW;YACpB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"getProject.js","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4FAA4F;YAC5F,qFAAqF;YACrF,6EAA6E;YAC7E,6GAA6G;YAC7G,+EAA+E;YAC/E,wEAAwE;YACxE,qEAAqE;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;aACxB;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/C,OAAO,EAAE,WAAW;YACpB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
@@ -10,7 +10,7 @@
10
10
  * SEARCH + FILTER:
11
11
  * - search: Text to search for (in source text or specified languages)
12
12
  * - languages: Which languages to search in AND return translations for
13
- * - status: Filter by translation status ("missing", "draft", "approved", "all")
13
+ * - status: Filter by translation status ("missing", "draft", "published", "all")
14
14
  * - namespaces: Filter by namespace(s)
15
15
  * - keys: Fetch specific keys by exact name
16
16
  * - limit: Max keys to return (1–200, default 100)
@@ -10,7 +10,7 @@
10
10
  * SEARCH + FILTER:
11
11
  * - search: Text to search for (in source text or specified languages)
12
12
  * - languages: Which languages to search in AND return translations for
13
- * - status: Filter by translation status ("missing", "draft", "approved", "all")
13
+ * - status: Filter by translation status ("missing", "draft", "published", "all")
14
14
  * - namespaces: Filter by namespace(s)
15
15
  * - keys: Fetch specific keys by exact name
16
16
  * - limit: Max keys to return (1–200, default 100)
@@ -35,7 +35,7 @@ const inputSchema = projectSchema.extend({
35
35
  languages: z.array(z.string()).optional(),
36
36
  namespaces: z.array(z.string()).optional(),
37
37
  keys: z.array(z.string()).optional(),
38
- status: z.enum(["missing", "draft", "approved", "all"]).optional(),
38
+ status: z.enum(["missing", "draft", "published", "all"]).optional(),
39
39
  limit: z.number().min(1).max(200).optional(),
40
40
  });
41
41
  export const getTranslations = {
@@ -53,7 +53,7 @@ Always pair: { languages: ["hr"], status: "missing" }
53
53
  SEARCH + FILTER:
54
54
  - search: Text to search for (in source text or specified languages)
55
55
  - languages: Languages to search in AND return translations for
56
- - status: Filter by translation status ("missing", "draft", "approved", "all")
56
+ - status: Filter by translation status ("missing", "draft", "published", "all")
57
57
  - namespaces: Filter by namespace(s)
58
58
  - keys: Fetch specific keys by exact name
59
59
  - limit: Max keys (1–200, default 100)
@@ -97,7 +97,7 @@ Response includes namespaceDetails: a map of namespace metadata (name, keyCount,
97
97
  },
98
98
  status: {
99
99
  type: "string",
100
- enum: ["missing", "draft", "approved", "all"],
100
+ enum: ["missing", "draft", "published", "all"],
101
101
  description: "Filter by translation status. WARNING: ignored without languages parameter. Always use with languages: ['hr']. Default: all.",
102
102
  },
103
103
  limit: {
@@ -1 +1 @@
1
- {"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"publishTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,mBAAmB,EAAE,IAmDjC,CAAC"}
1
+ {"version":3,"file":"publishTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,mBAAmB,EAAE,IA4DjC,CAAC"}
@@ -13,13 +13,22 @@ export const publishTranslations = {
13
13
  name: "publishTranslations",
14
14
  description: `Deploy pending changes to production (CDN or GitHub).
15
15
 
16
- ⚠️ PRODUCTION IMPACT - deploys to live systems.
17
- ALWAYS call getPendingChanges first to verify what will be deployed.
16
+ ⚠️ PRODUCTION IMPACT deploys to live systems.
17
+
18
+ REQUIRED WORKFLOW (follow in order):
19
+ 1. Call getPendingChanges FIRST to see what will be deployed.
20
+ 2. Check 'cannotPublishReason' — if set, publishing is blocked (fix the issue first).
21
+ 3. Review the changes, then call publishTranslations.
22
+ 4. Use getSync(syncId) to verify completion.
23
+
24
+ ⚠️ COOLDOWN: 30-second per-project cooldown between publishes. Calling too frequently returns TOO_MANY_REQUESTS error. Wait and retry.
25
+
26
+ ⚠️ PERMANENT DELETION: Soft-deleted keys (from deleteKeys) become permanently deleted after publish. There is NO way to recover them. Verify with getPendingChanges → deletedKeys before publishing.
18
27
 
19
28
  If translations array is omitted, ALL pending changes are published.
20
29
  If translations array is provided, only those specific items are published.
21
30
 
22
- Returns syncJobIds - use getSync(syncId) to verify deployment completed successfully.`,
31
+ Returns syncJobIds use getSync(syncId) to verify deployment completed successfully.`,
23
32
  inputSchema: {
24
33
  type: "object",
25
34
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"publishTranslations.js","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE;;;;;;;;sFAQqE;QAClF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,kFAAkF;oBACpF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;4BAC9D,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4BAA4B;6BAC1C;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;qBACpC;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,wCAAwC;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,GAAG,CAAC;YACJ,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACzD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,YAAY;SACb,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"publishTranslations.js","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE;;;;;;;;;;;;;;;;;sFAiBqE;QAClF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,kFAAkF;oBACpF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;4BAC9D,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4BAA4B;6BAC1C;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;qBACpC;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,wCAAwC;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,GAAG,CAAC;YACJ,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACzD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,YAAY;SACb,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateKeys.d.ts","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAc9C,eAAO,MAAM,UAAU,EAAE,IAsDxB,CAAC"}
1
+ {"version":3,"file":"updateKeys.d.ts","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAc9C,eAAO,MAAM,UAAU,EAAE,IA2DxB,CAAC"}
@@ -15,7 +15,7 @@ const inputSchema = projectSchema.extend({
15
15
  l: z.string().describe("Language code (e.g., 'tr', 'de')"),
16
16
  t: z.string().describe("Translation text"),
17
17
  s: z.boolean().optional().describe("true if updating source language text"),
18
- st: z.string().optional().describe("Translation status (e.g., 'approved')"),
18
+ st: z.string().optional().describe("Translation status (e.g., 'published')"),
19
19
  })).min(1),
20
20
  });
21
21
  export const updateKeys = {
@@ -27,7 +27,12 @@ WORKFLOW to add missing translations:
27
27
  1. listKeys({ missingLanguage: 'hr', fields: ['id'] }) → get UUIDs
28
28
  2. updateKeys({ t: [{ id: '<uuid>', l: 'hr', t: '<translation>' }] })
29
29
 
30
- Each entry updates ONE language for ONE key. Set s=true to update the source text.`,
30
+ Each entry updates ONE language for ONE key. Set s=true to update the source text.
31
+
32
+ IMPORTANT:
33
+ - 'id' MUST be a UUID (from listKeys/getTranslations id field), NOT a key name.
34
+ - Check 'notFound' in response — lists IDs that didn't match any key.
35
+ - Human-approved translations are silently overwritten with no confirmation.`,
31
36
  inputSchema: {
32
37
  type: "object",
33
38
  properties: {
@@ -42,7 +47,7 @@ Each entry updates ONE language for ONE key. Set s=true to update the source tex
42
47
  l: { type: "string", description: "Language code (e.g., 'tr', 'de')" },
43
48
  t: { type: "string", description: "Translation text" },
44
49
  s: { type: "boolean", description: "true if updating source language text" },
45
- st: { type: "string", description: "Translation status (e.g., 'approved')" },
50
+ st: { type: "string", description: "Translation status (e.g., 'published')" },
46
51
  },
47
52
  required: ["id", "l", "t"],
48
53
  },
@@ -1 +1 @@
1
- {"version":3,"file":"updateKeys.js","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;QAC7G,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1C,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC3E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAC5E,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;mFAMkE;QAC/E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,4EAA4E;oBACzF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;4BACzH,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;4BACtE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;4BACtD,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;4BAC5E,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;yBAC7E;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;qBAC3B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;SAC3B;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CACT,IAAI,EACJ,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,wCAAwC;QACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,IAAI;YACP,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;SACxB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACF;CACJ,CAAC"}
1
+ {"version":3,"file":"updateKeys.js","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;QAC7G,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1C,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC3E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KAC7E,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;;;;;;6EAW4D;QACzE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,4EAA4E;oBACzF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;4BACzH,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;4BACtE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;4BACtD,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;4BAC5E,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;yBAC9E;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;qBAC3B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;SAC3B;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CACT,IAAI,EACJ,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,wCAAwC;QACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,IAAI;YACP,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;SACxB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACF;CACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * worker.test.ts
3
+ *
4
+ * Tests for the Cloudflare Worker fetch handler exported from worker.ts.
5
+ *
6
+ * Strategy:
7
+ * - CORS, health, OAuth discovery, and auth-gate paths are pure HTTP
8
+ * logic and can be tested without any external services.
9
+ * - POST /mcp requests that pass auth will attempt to create a real
10
+ * tRPC client and MCP transport. Those calls will fail at the network
11
+ * layer (no live API), so we assert they do NOT return 401 (auth passed)
12
+ * and accept either a 4xx/5xx from the transport error path or a
13
+ * structured error response.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=worker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.test.d.ts","sourceRoot":"","sources":["../src/worker.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * worker.test.ts
3
+ *
4
+ * Tests for the Cloudflare Worker fetch handler exported from worker.ts.
5
+ *
6
+ * Strategy:
7
+ * - CORS, health, OAuth discovery, and auth-gate paths are pure HTTP
8
+ * logic and can be tested without any external services.
9
+ * - POST /mcp requests that pass auth will attempt to create a real
10
+ * tRPC client and MCP transport. Those calls will fail at the network
11
+ * layer (no live API), so we assert they do NOT return 401 (auth passed)
12
+ * and accept either a 4xx/5xx from the transport error path or a
13
+ * structured error response.
14
+ */
15
+ import { describe, it, expect } from "vitest";
16
+ import worker from "./worker.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Helpers
19
+ // ---------------------------------------------------------------------------
20
+ const BASE_URL = "https://mcp.test";
21
+ function makeRequest(path, method = "GET", headers = {}, body) {
22
+ return new Request(`${BASE_URL}${path}`, {
23
+ method,
24
+ headers,
25
+ body,
26
+ });
27
+ }
28
+ /** Minimal Env with no service bindings */
29
+ const emptyEnv = {};
30
+ /** Env with a fake AUTH_API service binding (for OAuth error path tests) */
31
+ const envWithFakeAuthApi = {
32
+ AUTH_API: {
33
+ fetch: async () => new Response(JSON.stringify({ error: "unauthorized" }), { status: 401 }),
34
+ },
35
+ MCP_SERVICE_SECRET: "test-secret",
36
+ };
37
+ // ---------------------------------------------------------------------------
38
+ // CORS
39
+ // ---------------------------------------------------------------------------
40
+ describe("Worker — CORS preflight", () => {
41
+ it("OPTIONS returns 204 with CORS headers", async () => {
42
+ const req = makeRequest("/mcp", "OPTIONS");
43
+ const res = await worker.fetch(req, emptyEnv);
44
+ expect(res.status).toBe(204);
45
+ expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
46
+ expect(res.headers.get("Access-Control-Allow-Methods")).toContain("POST");
47
+ expect(res.headers.get("Access-Control-Allow-Headers")).toContain("Authorization");
48
+ });
49
+ it("OPTIONS on any path returns 204", async () => {
50
+ const req = makeRequest("/health", "OPTIONS");
51
+ const res = await worker.fetch(req, emptyEnv);
52
+ expect(res.status).toBe(204);
53
+ });
54
+ });
55
+ // ---------------------------------------------------------------------------
56
+ // Health check
57
+ // ---------------------------------------------------------------------------
58
+ describe("Worker — health endpoint", () => {
59
+ it("GET /health returns 200 with status ok", async () => {
60
+ const req = makeRequest("/health");
61
+ const res = await worker.fetch(req, emptyEnv);
62
+ expect(res.status).toBe(200);
63
+ const body = (await res.json());
64
+ expect(body.status).toBe("ok");
65
+ expect(body.runtime).toBe("cloudflare-workers");
66
+ });
67
+ it("GET /health response has Content-Type application/json", async () => {
68
+ const req = makeRequest("/health");
69
+ const res = await worker.fetch(req, emptyEnv);
70
+ expect(res.headers.get("Content-Type")).toContain("application/json");
71
+ });
72
+ });
73
+ // ---------------------------------------------------------------------------
74
+ // OAuth discovery — Protected Resource Metadata (RFC 9728)
75
+ // ---------------------------------------------------------------------------
76
+ describe("Worker — OAuth discovery", () => {
77
+ it("GET /.well-known/oauth-protected-resource returns 200 with required fields", async () => {
78
+ const req = makeRequest("/.well-known/oauth-protected-resource");
79
+ const res = await worker.fetch(req, emptyEnv);
80
+ expect(res.status).toBe(200);
81
+ const body = (await res.json());
82
+ expect(body).toHaveProperty("resource");
83
+ expect(body).toHaveProperty("authorization_servers");
84
+ expect(body).toHaveProperty("bearer_methods_supported");
85
+ expect(body.bearer_methods_supported).toContain("header");
86
+ });
87
+ it("GET /.well-known/oauth-protected-resource resource points to request host", async () => {
88
+ const req = makeRequest("/.well-known/oauth-protected-resource");
89
+ const res = await worker.fetch(req, emptyEnv);
90
+ const body = (await res.json());
91
+ expect(body.resource).toBe("https://mcp.test");
92
+ });
93
+ it("GET /.well-known/oauth-authorization-server returns 200 with required fields", async () => {
94
+ const req = makeRequest("/.well-known/oauth-authorization-server");
95
+ const res = await worker.fetch(req, emptyEnv);
96
+ expect(res.status).toBe(200);
97
+ const body = (await res.json());
98
+ expect(body).toHaveProperty("issuer");
99
+ expect(body).toHaveProperty("authorization_endpoint");
100
+ expect(body).toHaveProperty("token_endpoint");
101
+ expect(body).toHaveProperty("code_challenge_methods_supported");
102
+ });
103
+ it("GET /.well-known/oauth-authorization-server supports S256 PKCE", async () => {
104
+ const req = makeRequest("/.well-known/oauth-authorization-server");
105
+ const res = await worker.fetch(req, emptyEnv);
106
+ const body = (await res.json());
107
+ expect(body.code_challenge_methods_supported).toContain("S256");
108
+ });
109
+ });
110
+ // ---------------------------------------------------------------------------
111
+ // MCP endpoint — authentication gate
112
+ // ---------------------------------------------------------------------------
113
+ describe("Worker — /mcp auth gate", () => {
114
+ it("POST /mcp without Authorization header returns 401", async () => {
115
+ const req = makeRequest("/mcp", "POST", {}, "{}");
116
+ const res = await worker.fetch(req, emptyEnv);
117
+ expect(res.status).toBe(401);
118
+ });
119
+ it("POST /mcp without Authorization header has WWW-Authenticate header", async () => {
120
+ const req = makeRequest("/mcp", "POST", {}, "{}");
121
+ const res = await worker.fetch(req, emptyEnv);
122
+ expect(res.headers.get("WWW-Authenticate")).toBeTruthy();
123
+ expect(res.headers.get("WWW-Authenticate")).toContain("Bearer");
124
+ });
125
+ it("POST /mcp with empty Authorization header returns 401", async () => {
126
+ const req = makeRequest("/mcp", "POST", { Authorization: "" }, "{}");
127
+ const res = await worker.fetch(req, emptyEnv);
128
+ expect(res.status).toBe(401);
129
+ });
130
+ it("POST /mcp with malformed Authorization (no Bearer prefix) returns 401", async () => {
131
+ const req = makeRequest("/mcp", "POST", { Authorization: "Basic abc123" }, "{}");
132
+ const res = await worker.fetch(req, emptyEnv);
133
+ expect(res.status).toBe(401);
134
+ });
135
+ it("GET /mcp without token returns 401", async () => {
136
+ const req = makeRequest("/mcp", "GET");
137
+ const res = await worker.fetch(req, emptyEnv);
138
+ expect(res.status).toBe(401);
139
+ });
140
+ });
141
+ // ---------------------------------------------------------------------------
142
+ // MCP endpoint — API key auth path (bi- prefix)
143
+ // ---------------------------------------------------------------------------
144
+ describe("Worker — /mcp API key auth (bi- prefix)", () => {
145
+ it("GET /mcp with bi- prefix token returns 200 SSE stream", async () => {
146
+ const req = makeRequest("/mcp", "GET", {
147
+ Authorization: "Bearer bi-test-api-key",
148
+ });
149
+ const res = await worker.fetch(req, emptyEnv);
150
+ // Auth passed — worker returns an SSE stream
151
+ expect(res.status).toBe(200);
152
+ expect(res.headers.get("Content-Type")).toContain("text/event-stream");
153
+ });
154
+ it("GET /mcp SSE response has CORS headers when authenticated", async () => {
155
+ const req = makeRequest("/mcp", "GET", {
156
+ Authorization: "Bearer bi-abc",
157
+ });
158
+ const res = await worker.fetch(req, emptyEnv);
159
+ expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
160
+ });
161
+ it("POST /mcp with bi- prefix token does not return 401 (auth passed)", async () => {
162
+ const req = makeRequest("/mcp", "POST", {
163
+ Authorization: "Bearer bi-test-api-key",
164
+ "Content-Type": "application/json",
165
+ }, JSON.stringify({
166
+ jsonrpc: "2.0",
167
+ id: 1,
168
+ method: "tools/list",
169
+ params: {},
170
+ }));
171
+ // The handler will attempt a real tRPC call and likely error at the
172
+ // network layer, but it MUST NOT return 401 — the auth gate was passed.
173
+ const res = await worker.fetch(req, emptyEnv);
174
+ expect(res.status).not.toBe(401);
175
+ });
176
+ });
177
+ // ---------------------------------------------------------------------------
178
+ // MCP endpoint — OAuth token path (no AUTH_API binding)
179
+ // ---------------------------------------------------------------------------
180
+ describe("Worker — /mcp OAuth token path", () => {
181
+ it("POST /mcp with OAuth token but no AUTH_API returns 500", async () => {
182
+ const req = makeRequest("/mcp", "POST", {
183
+ Authorization: "Bearer oauth-token-without-bi-prefix",
184
+ "Content-Type": "application/json",
185
+ }, "{}");
186
+ // No AUTH_API service binding → explicit 500 error
187
+ const res = await worker.fetch(req, emptyEnv);
188
+ expect(res.status).toBe(500);
189
+ const body = (await res.json());
190
+ expect(typeof body.error).toBe("string");
191
+ expect(body.error.toLowerCase()).toContain("oauth");
192
+ });
193
+ it("POST /mcp with OAuth token but only AUTH_API (no MCP_SERVICE_SECRET) returns 500", async () => {
194
+ const envWithOnlyAuthApi = {
195
+ AUTH_API: {
196
+ fetch: async () => new Response(JSON.stringify({}), { status: 200 }),
197
+ },
198
+ // MCP_SERVICE_SECRET intentionally omitted
199
+ };
200
+ const req = makeRequest("/mcp", "POST", {
201
+ Authorization: "Bearer some-oauth-token",
202
+ "Content-Type": "application/json",
203
+ }, "{}");
204
+ const res = await worker.fetch(req, envWithOnlyAuthApi);
205
+ expect(res.status).toBe(500);
206
+ });
207
+ it("POST /mcp with invalid OAuth token (AUTH_API returns 401) returns 401", async () => {
208
+ const req = makeRequest("/mcp", "POST", {
209
+ Authorization: "Bearer expired-oauth-token",
210
+ "Content-Type": "application/json",
211
+ }, "{}");
212
+ const res = await worker.fetch(req, envWithFakeAuthApi);
213
+ expect(res.status).toBe(401);
214
+ });
215
+ });
216
+ // ---------------------------------------------------------------------------
217
+ // Unknown paths
218
+ // ---------------------------------------------------------------------------
219
+ describe("Worker — unknown routes", () => {
220
+ it("GET /unknown returns 404", async () => {
221
+ const req = makeRequest("/unknown-path");
222
+ const res = await worker.fetch(req, emptyEnv);
223
+ expect(res.status).toBe(404);
224
+ const body = (await res.json());
225
+ expect(body.error).toBeTruthy();
226
+ });
227
+ it("GET / returns 404", async () => {
228
+ const req = makeRequest("/");
229
+ const res = await worker.fetch(req, emptyEnv);
230
+ expect(res.status).toBe(404);
231
+ });
232
+ it("POST /webhook returns 404", async () => {
233
+ const req = makeRequest("/webhook", "POST", {}, "{}");
234
+ const res = await worker.fetch(req, emptyEnv);
235
+ expect(res.status).toBe(404);
236
+ });
237
+ it("404 response has CORS headers", async () => {
238
+ const req = makeRequest("/not-a-real-endpoint");
239
+ const res = await worker.fetch(req, emptyEnv);
240
+ expect(res.status).toBe(404);
241
+ expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
242
+ });
243
+ });
244
+ //# sourceMappingURL=worker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.test.js","sourceRoot":"","sources":["../src/worker.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-i18n/mcp",
3
- "version": "0.15.3",
3
+ "version": "0.15.5",
4
4
  "description": "MCP server for Better i18n translation management - AI-powered translation workflow for Cursor, Claude, and other AI assistants",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -50,7 +50,7 @@
50
50
  "prepublishOnly": "npm run clean && npm run build && chmod +x ./dist/index.js ./dist/http.js"
51
51
  },
52
52
  "dependencies": {
53
- "@better-i18n/mcp-types": "^0.15.4",
53
+ "@better-i18n/mcp-types": "0.0.0",
54
54
  "@modelcontextprotocol/sdk": "^1.25.3",
55
55
  "@trpc/client": "^11.0.0",
56
56
  "zod": "^3.25.1"