mcp4openapi 0.3.0 → 0.3.1

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 (188) hide show
  1. package/dist/src/argument-normalizer.d.ts +5 -0
  2. package/dist/src/argument-normalizer.d.ts.map +1 -0
  3. package/dist/src/argument-normalizer.js +61 -0
  4. package/dist/src/argument-normalizer.js.map +1 -0
  5. package/dist/src/auth/oauth-provider.d.ts.map +1 -1
  6. package/dist/src/auth/oauth-provider.js +5 -2
  7. package/dist/src/auth/oauth-provider.js.map +1 -1
  8. package/dist/src/cli-config.d.ts +9 -0
  9. package/dist/src/cli-config.d.ts.map +1 -0
  10. package/dist/src/cli-config.js +111 -0
  11. package/dist/src/cli-config.js.map +1 -0
  12. package/dist/src/composite-executor.d.ts +77 -0
  13. package/dist/src/composite-executor.d.ts.map +1 -0
  14. package/dist/src/composite-executor.js +193 -0
  15. package/dist/src/composite-executor.js.map +1 -0
  16. package/dist/src/constants.d.ts +85 -0
  17. package/dist/src/constants.d.ts.map +1 -0
  18. package/dist/src/constants.js +85 -0
  19. package/dist/src/constants.js.map +1 -0
  20. package/dist/src/core/cli-config.d.ts.map +1 -1
  21. package/dist/src/core/cli-config.js +1 -0
  22. package/dist/src/core/cli-config.js.map +1 -1
  23. package/dist/src/core/index.d.ts.map +1 -1
  24. package/dist/src/core/index.js +1 -0
  25. package/dist/src/core/index.js.map +1 -1
  26. package/dist/src/dag-executor.d.ts +49 -0
  27. package/dist/src/dag-executor.d.ts.map +1 -0
  28. package/dist/src/dag-executor.js +138 -0
  29. package/dist/src/dag-executor.js.map +1 -0
  30. package/dist/src/errors.d.ts +59 -0
  31. package/dist/src/errors.d.ts.map +1 -0
  32. package/dist/src/errors.js +119 -0
  33. package/dist/src/errors.js.map +1 -0
  34. package/dist/src/filtering.d.ts +19 -0
  35. package/dist/src/filtering.d.ts.map +1 -0
  36. package/dist/src/filtering.js +292 -0
  37. package/dist/src/filtering.js.map +1 -0
  38. package/dist/src/generated-schemas.d.ts +45 -0
  39. package/dist/src/generated-schemas.d.ts.map +1 -1
  40. package/dist/src/generated-schemas.js +3 -0
  41. package/dist/src/generated-schemas.js.map +1 -1
  42. package/dist/src/http-client-factory.d.ts +62 -0
  43. package/dist/src/http-client-factory.d.ts.map +1 -0
  44. package/dist/src/http-client-factory.js +133 -0
  45. package/dist/src/http-client-factory.js.map +1 -0
  46. package/dist/src/http-transport-config.d.ts +6 -0
  47. package/dist/src/http-transport-config.d.ts.map +1 -0
  48. package/dist/src/http-transport-config.js +47 -0
  49. package/dist/src/http-transport-config.js.map +1 -0
  50. package/dist/src/http-transport.d.ts +316 -0
  51. package/dist/src/http-transport.d.ts.map +1 -0
  52. package/dist/src/http-transport.js +2412 -0
  53. package/dist/src/http-transport.js.map +1 -0
  54. package/dist/src/index.js +0 -0
  55. package/dist/src/interceptors.d.ts +116 -0
  56. package/dist/src/interceptors.d.ts.map +1 -0
  57. package/dist/src/interceptors.js +392 -0
  58. package/dist/src/interceptors.js.map +1 -0
  59. package/dist/src/jsonrpc-validator.d.ts +27 -0
  60. package/dist/src/jsonrpc-validator.d.ts.map +1 -0
  61. package/dist/src/jsonrpc-validator.js +58 -0
  62. package/dist/src/jsonrpc-validator.js.map +1 -0
  63. package/dist/src/logger.d.ts +59 -0
  64. package/dist/src/logger.d.ts.map +1 -0
  65. package/dist/src/logger.js +177 -0
  66. package/dist/src/logger.js.map +1 -0
  67. package/dist/src/mcp-server-manager.d.ts +20 -0
  68. package/dist/src/mcp-server-manager.d.ts.map +1 -0
  69. package/dist/src/mcp-server-manager.js +38 -0
  70. package/dist/src/mcp-server-manager.js.map +1 -0
  71. package/dist/src/mcp-server.d.ts +203 -0
  72. package/dist/src/mcp-server.d.ts.map +1 -0
  73. package/dist/src/mcp-server.js +1369 -0
  74. package/dist/src/mcp-server.js.map +1 -0
  75. package/dist/src/metrics.d.ts +97 -0
  76. package/dist/src/metrics.d.ts.map +1 -0
  77. package/dist/src/metrics.js +273 -0
  78. package/dist/src/metrics.js.map +1 -0
  79. package/dist/src/naming-warnings.d.ts +23 -0
  80. package/dist/src/naming-warnings.d.ts.map +1 -0
  81. package/dist/src/naming-warnings.js +83 -0
  82. package/dist/src/naming-warnings.js.map +1 -0
  83. package/dist/src/naming.d.ts +58 -0
  84. package/dist/src/naming.d.ts.map +1 -0
  85. package/dist/src/naming.js +510 -0
  86. package/dist/src/naming.js.map +1 -0
  87. package/dist/src/oauth-provider.d.ts +131 -0
  88. package/dist/src/oauth-provider.d.ts.map +1 -0
  89. package/dist/src/oauth-provider.js +836 -0
  90. package/dist/src/oauth-provider.js.map +1 -0
  91. package/dist/src/openapi/openapi-parser.d.ts.map +1 -1
  92. package/dist/src/openapi/openapi-parser.js +22 -0
  93. package/dist/src/openapi/openapi-parser.js.map +1 -1
  94. package/dist/src/openapi-parser.d.ts +70 -0
  95. package/dist/src/openapi-parser.d.ts.map +1 -0
  96. package/dist/src/openapi-parser.js +436 -0
  97. package/dist/src/openapi-parser.js.map +1 -0
  98. package/dist/src/profile/profile-loader.d.ts.map +1 -1
  99. package/dist/src/profile/profile-loader.js +8 -1
  100. package/dist/src/profile/profile-loader.js.map +1 -1
  101. package/dist/src/profile/profile-registry.d.ts +2 -1
  102. package/dist/src/profile/profile-registry.d.ts.map +1 -1
  103. package/dist/src/profile/profile-registry.js +18 -1
  104. package/dist/src/profile/profile-registry.js.map +1 -1
  105. package/dist/src/profile/profile-resolver.d.ts +16 -0
  106. package/dist/src/profile/profile-resolver.d.ts.map +1 -1
  107. package/dist/src/profile/profile-resolver.js +120 -0
  108. package/dist/src/profile/profile-resolver.js.map +1 -1
  109. package/dist/src/profile-loader.d.ts +78 -0
  110. package/dist/src/profile-loader.d.ts.map +1 -0
  111. package/dist/src/profile-loader.js +483 -0
  112. package/dist/src/profile-loader.js.map +1 -0
  113. package/dist/src/profile-registry.d.ts +18 -0
  114. package/dist/src/profile-registry.d.ts.map +1 -0
  115. package/dist/src/profile-registry.js +26 -0
  116. package/dist/src/profile-registry.js.map +1 -0
  117. package/dist/src/profile-resolver.d.ts +19 -0
  118. package/dist/src/profile-resolver.d.ts.map +1 -0
  119. package/dist/src/profile-resolver.js +167 -0
  120. package/dist/src/profile-resolver.js.map +1 -0
  121. package/dist/src/proxy-executor.d.ts +86 -0
  122. package/dist/src/proxy-executor.d.ts.map +1 -0
  123. package/dist/src/proxy-executor.js +497 -0
  124. package/dist/src/proxy-executor.js.map +1 -0
  125. package/dist/src/schema-validator.d.ts +30 -0
  126. package/dist/src/schema-validator.d.ts.map +1 -0
  127. package/dist/src/schema-validator.js +128 -0
  128. package/dist/src/schema-validator.js.map +1 -0
  129. package/dist/src/startup-profile.d.ts +17 -0
  130. package/dist/src/startup-profile.d.ts.map +1 -0
  131. package/dist/src/startup-profile.js +30 -0
  132. package/dist/src/startup-profile.js.map +1 -0
  133. package/dist/src/startup-validation.d.ts +11 -0
  134. package/dist/src/startup-validation.d.ts.map +1 -0
  135. package/dist/src/startup-validation.js +21 -0
  136. package/dist/src/startup-validation.js.map +1 -0
  137. package/dist/src/tool-filter.d.ts +65 -0
  138. package/dist/src/tool-filter.d.ts.map +1 -0
  139. package/dist/src/tool-filter.js +471 -0
  140. package/dist/src/tool-filter.js.map +1 -0
  141. package/dist/src/tool-generator.d.ts +67 -0
  142. package/dist/src/tool-generator.d.ts.map +1 -0
  143. package/dist/src/tool-generator.js +182 -0
  144. package/dist/src/tool-generator.js.map +1 -0
  145. package/dist/src/tooling/composite-executor.d.ts.map +1 -1
  146. package/dist/src/tooling/composite-executor.js +7 -2
  147. package/dist/src/tooling/composite-executor.js.map +1 -1
  148. package/dist/src/tooling/proxy-executor.d.ts.map +1 -1
  149. package/dist/src/tooling/proxy-executor.js +4 -0
  150. package/dist/src/tooling/proxy-executor.js.map +1 -1
  151. package/dist/src/tooling/tool-generator.d.ts.map +1 -1
  152. package/dist/src/tooling/tool-generator.js +36 -3
  153. package/dist/src/tooling/tool-generator.js.map +1 -1
  154. package/dist/src/transport/http-transport-config.d.ts.map +1 -1
  155. package/dist/src/transport/http-transport-config.js +1 -0
  156. package/dist/src/transport/http-transport-config.js.map +1 -1
  157. package/dist/src/transport/http-transport.d.ts +5 -0
  158. package/dist/src/transport/http-transport.d.ts.map +1 -1
  159. package/dist/src/transport/http-transport.js +63 -1
  160. package/dist/src/transport/http-transport.js.map +1 -1
  161. package/dist/src/transport/profile-index.d.ts +84 -0
  162. package/dist/src/transport/profile-index.d.ts.map +1 -0
  163. package/dist/src/transport/profile-index.js +405 -0
  164. package/dist/src/transport/profile-index.js.map +1 -0
  165. package/dist/src/types/http-transport.d.ts +1 -0
  166. package/dist/src/types/http-transport.d.ts.map +1 -1
  167. package/dist/src/types/openapi.d.ts +3 -0
  168. package/dist/src/types/openapi.d.ts.map +1 -1
  169. package/dist/src/types/profile.d.ts +3 -0
  170. package/dist/src/types/profile.d.ts.map +1 -1
  171. package/dist/src/validation/validation-utils.d.ts.map +1 -1
  172. package/dist/src/validation/validation-utils.js +1 -0
  173. package/dist/src/validation/validation-utils.js.map +1 -1
  174. package/dist/src/validation-utils.d.ts +49 -0
  175. package/dist/src/validation-utils.d.ts.map +1 -0
  176. package/dist/src/validation-utils.js +138 -0
  177. package/dist/src/validation-utils.js.map +1 -0
  178. package/html/profile-index.html +386 -0
  179. package/package.json +2 -1
  180. package/profile-schema.json +14 -0
  181. package/profiles/gitlab/developer-profile-oauth.json +1 -1
  182. package/profiles/gitlab/developer-profile.json +1508 -0
  183. package/profiles/gitlab/developer-profile.test.json +3432 -0
  184. package/profiles/n8n/profile-optimized.json +1 -1
  185. package/profiles/n8n/profile.json +1 -1
  186. package/profiles/n8n-nodes/profile-nodes.json +1 -1
  187. package/profiles/semgrep/profile.json +1 -1
  188. package/profiles/youtrack/profile.json +1 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Tool name shortening strategies
3
+ *
4
+ * Why: MCP tool names combined with server name must stay under limits.
5
+ * Different strategies offer trade-offs between readability and compactness.
6
+ */
7
+ export declare enum NamingStrategy {
8
+ None = "none",
9
+ Balanced = "balanced",
10
+ Iterative = "iterative",
11
+ Hash = "hash",
12
+ Auto = "auto"
13
+ }
14
+ export interface OperationForNaming {
15
+ operationId: string;
16
+ method: string;
17
+ path: string;
18
+ tags?: string[];
19
+ }
20
+ export interface ShortenResult {
21
+ name: string;
22
+ truncated: boolean;
23
+ strategy: NamingStrategy;
24
+ originalLength: number;
25
+ partsUsed?: number;
26
+ }
27
+ export interface SimilarPair {
28
+ opA: OperationForNaming;
29
+ opB: OperationForNaming;
30
+ similarity: number;
31
+ }
32
+ export interface ShorteningOptions {
33
+ maxLength: number;
34
+ minParts?: number;
35
+ minLength?: number;
36
+ allOperations?: OperationForNaming[];
37
+ }
38
+ /**
39
+ * Shorten tool name using specified strategy
40
+ */
41
+ export declare function shortenToolName(op: OperationForNaming, strategy: NamingStrategy, maxLength: number, allOperations?: OperationForNaming[], options?: Partial<ShorteningOptions>): ShortenResult;
42
+ /**
43
+ * Generate stable short hash from string
44
+ */
45
+ export declare function stableHash(str: string, length?: number): string;
46
+ /**
47
+ * Calculate Levenshtein distance between two strings
48
+ */
49
+ export declare function levenshteinDistance(a: string, b: string): number;
50
+ /**
51
+ * Pick most similar pairs of operations
52
+ */
53
+ export declare function pickMostSimilarPairs(operations: OperationForNaming[], topN: number, threshold?: number): SimilarPair[];
54
+ /**
55
+ * Detect potential collisions when shortening multiple operations
56
+ */
57
+ export declare function detectCollisions(operations: OperationForNaming[], strategy: NamingStrategy, maxLength: number, options?: Partial<ShorteningOptions>): Map<string, OperationForNaming[]>;
58
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,cAAc;IACxB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,kBAAkB,CAAC;IACxB,GAAG,EAAE,kBAAkB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,kBAAkB,EAAE,EACpC,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,aAAa,CAoDf;AAiYD;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAUlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBhE;AAaD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,kBAAkB,EAAE,EAChC,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAa,GACvB,WAAW,EAAE,CA4Df;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAAE,EAChC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAmBnC"}
@@ -0,0 +1,510 @@
1
+ /**
2
+ * Tool name shortening strategies
3
+ *
4
+ * Why: MCP tool names combined with server name must stay under limits.
5
+ * Different strategies offer trade-offs between readability and compactness.
6
+ */
7
+ export var NamingStrategy;
8
+ (function (NamingStrategy) {
9
+ NamingStrategy["None"] = "none";
10
+ NamingStrategy["Balanced"] = "balanced";
11
+ NamingStrategy["Iterative"] = "iterative";
12
+ NamingStrategy["Hash"] = "hash";
13
+ NamingStrategy["Auto"] = "auto";
14
+ })(NamingStrategy || (NamingStrategy = {}));
15
+ /**
16
+ * Shorten tool name using specified strategy
17
+ */
18
+ export function shortenToolName(op, strategy, maxLength, allOperations, options) {
19
+ const originalLength = op.operationId.length;
20
+ if (strategy === NamingStrategy.None) {
21
+ return {
22
+ name: op.operationId,
23
+ truncated: false,
24
+ strategy,
25
+ originalLength,
26
+ };
27
+ }
28
+ const opts = {
29
+ maxLength,
30
+ minParts: options?.minParts ?? 3,
31
+ minLength: options?.minLength ?? 20,
32
+ allOperations: allOperations || [op],
33
+ };
34
+ let result;
35
+ switch (strategy) {
36
+ case NamingStrategy.Balanced:
37
+ result = shortenWithBalanced(op, opts);
38
+ break;
39
+ case NamingStrategy.Iterative:
40
+ result = shortenWithIterative(op, opts);
41
+ break;
42
+ case NamingStrategy.Hash:
43
+ result = shortenWithHash(op, opts);
44
+ break;
45
+ case NamingStrategy.Auto:
46
+ // Try strategies in order: balanced → iterative → hash
47
+ result = shortenWithBalanced(op, opts);
48
+ if (result.name.length > maxLength) {
49
+ result = shortenWithIterative(op, opts);
50
+ }
51
+ if (result.name.length > maxLength) {
52
+ result = shortenWithHash(op, opts);
53
+ }
54
+ result.strategy = NamingStrategy.Auto;
55
+ break;
56
+ default:
57
+ result = {
58
+ name: op.operationId,
59
+ truncated: false,
60
+ strategy,
61
+ originalLength,
62
+ };
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Split camelCase/snake_case into parts
68
+ */
69
+ function splitCamelCase(str) {
70
+ return str
71
+ .replace(/([a-z])([A-Z])/g, '$1_$2')
72
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
73
+ .split(/[_\-\/]/)
74
+ .filter(Boolean);
75
+ }
76
+ /**
77
+ * Sanitize name to valid identifier
78
+ */
79
+ function sanitizeName(name) {
80
+ return name
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9_]/g, '_')
83
+ .replace(/_+/g, '_')
84
+ .replace(/^_|_$/g, '');
85
+ }
86
+ /**
87
+ * Analyze part frequency across all operations
88
+ */
89
+ function analyzeFrequency(operations) {
90
+ const partCounts = new Map();
91
+ operations.forEach(op => {
92
+ const parts = splitCamelCase(op.operationId);
93
+ const uniqueParts = new Set(parts.map(p => p.toLowerCase()));
94
+ uniqueParts.forEach(part => {
95
+ partCounts.set(part, (partCounts.get(part) || 0) + 1);
96
+ });
97
+ });
98
+ return partCounts;
99
+ }
100
+ /**
101
+ * Check if candidate is unique across all operations
102
+ */
103
+ function isUniqueCandidate(candidate, candidateName, op, allOps) {
104
+ return !allOps.some(other => {
105
+ if (other.operationId === op.operationId)
106
+ return false;
107
+ const otherParts = splitCamelCase(other.operationId);
108
+ const otherCandidate = candidate
109
+ .filter(c => c.index < otherParts.length)
110
+ .map(c => otherParts[c.index])
111
+ .filter(Boolean);
112
+ const otherCandidateName = sanitizeName(otherCandidate.join('_'));
113
+ return candidateName === otherCandidateName;
114
+ });
115
+ }
116
+ /**
117
+ * Extract path parameters from path
118
+ */
119
+ function extractPathParams(path) {
120
+ return (path.match(/\{([^}]+)\}/g) || [])
121
+ .map(p => p.slice(1, -1).replace(/[^a-z0-9]/gi, '').toLowerCase());
122
+ }
123
+ /**
124
+ * Balanced strategy: Add parts by importance until unique, meaningful, and under limit
125
+ */
126
+ function shortenWithBalanced(op, opts) {
127
+ const parts = splitCamelCase(op.operationId);
128
+ const normalized = sanitizeName(parts.join('_'));
129
+ // If already under limit, don't shorten
130
+ if (normalized.length <= opts.maxLength) {
131
+ return {
132
+ name: normalized,
133
+ truncated: false,
134
+ strategy: NamingStrategy.Balanced,
135
+ originalLength: op.operationId.length,
136
+ partsUsed: parts.length,
137
+ };
138
+ }
139
+ const allOps = opts.allOperations || [op];
140
+ const total = allOps.length;
141
+ const partCounts = analyzeFrequency(allOps);
142
+ const verb = parts[0]?.toLowerCase();
143
+ const knownVerbs = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
144
+ const hasVerb = knownVerbs.includes(verb);
145
+ // Score each part by informativeness
146
+ const partScores = parts.map((part, index) => {
147
+ const lower = part.toLowerCase();
148
+ const count = partCounts.get(lower) || 0;
149
+ const frequency = count / total;
150
+ const rarityScore = 1 - frequency;
151
+ const verbBonus = (index === 0 && hasVerb) ? 2.0 : 0;
152
+ const commonPenalty = frequency > 0.5 ? -0.5 : 0;
153
+ return {
154
+ part,
155
+ index,
156
+ frequency,
157
+ score: rarityScore + verbBonus + commonPenalty,
158
+ };
159
+ });
160
+ const sortedParts = [...partScores].sort((a, b) => b.score - a.score);
161
+ let candidate = [];
162
+ let candidateName = '';
163
+ let bestValidCandidate = null;
164
+ // Add parts iteratively
165
+ for (const scored of sortedParts) {
166
+ candidate.push(scored);
167
+ candidate.sort((a, b) => a.index - b.index);
168
+ candidateName = sanitizeName(candidate.map(c => c.part).join('_'));
169
+ const isUnique = isUniqueCandidate(candidate, candidateName, op, allOps);
170
+ const underLimit = candidateName.length <= opts.maxLength;
171
+ const hasMinParts = candidate.length >= (opts.minParts || 3);
172
+ const hasMinLength = candidateName.length >= (opts.minLength || 20);
173
+ // Check if we've reached optimal
174
+ if (isUnique && underLimit && hasMinParts && hasMinLength) {
175
+ return {
176
+ name: candidateName,
177
+ truncated: true,
178
+ strategy: NamingStrategy.Balanced,
179
+ originalLength: op.operationId.length,
180
+ partsUsed: candidate.length,
181
+ };
182
+ }
183
+ // Track best valid (unique + under limit)
184
+ if (isUnique && underLimit) {
185
+ bestValidCandidate = {
186
+ name: candidateName,
187
+ parts: candidate.length,
188
+ };
189
+ }
190
+ // Stop if over limit or too many parts
191
+ if (candidateName.length > opts.maxLength || candidate.length >= Math.min(8, parts.length * 0.7)) {
192
+ break;
193
+ }
194
+ }
195
+ // Use best valid candidate if found
196
+ if (bestValidCandidate) {
197
+ return {
198
+ name: bestValidCandidate.name,
199
+ truncated: true,
200
+ strategy: NamingStrategy.Balanced,
201
+ originalLength: op.operationId.length,
202
+ partsUsed: bestValidCandidate.parts,
203
+ };
204
+ }
205
+ // Fallback: remove very common parts (≥95%)
206
+ const veryCommon = new Set();
207
+ partCounts.forEach((count, part) => {
208
+ if ((count / total) >= 0.95)
209
+ veryCommon.add(part);
210
+ });
211
+ const filtered = parts.filter((p, i) => {
212
+ if (i === 0 && hasVerb)
213
+ return true;
214
+ return !veryCommon.has(p.toLowerCase());
215
+ });
216
+ candidateName = sanitizeName(filtered.join('_'));
217
+ if (candidateName.length > opts.maxLength) {
218
+ candidateName = candidateName.substring(0, opts.maxLength);
219
+ }
220
+ return {
221
+ name: candidateName,
222
+ truncated: true,
223
+ strategy: NamingStrategy.Balanced,
224
+ originalLength: op.operationId.length,
225
+ partsUsed: filtered.length,
226
+ };
227
+ }
228
+ /**
229
+ * Iterative strategy: Remove parts progressively until under limit
230
+ */
231
+ function shortenWithIterative(op, opts) {
232
+ const originalParts = splitCamelCase(op.operationId);
233
+ let parts = [...originalParts];
234
+ const normalized = sanitizeName(parts.join('_'));
235
+ // If already under limit, don't shorten
236
+ if (normalized.length <= opts.maxLength) {
237
+ return {
238
+ name: normalized,
239
+ truncated: false,
240
+ strategy: NamingStrategy.Iterative,
241
+ originalLength: op.operationId.length,
242
+ partsUsed: parts.length,
243
+ };
244
+ }
245
+ const allOps = opts.allOperations || [op];
246
+ const total = allOps.length;
247
+ const partCounts = analyzeFrequency(allOps);
248
+ const verb = parts[0]?.toLowerCase();
249
+ const knownVerbs = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
250
+ const hasVerb = knownVerbs.includes(verb);
251
+ const pathParams = extractPathParams(op.path);
252
+ const currentLength = () => sanitizeName(parts.join('_')).length;
253
+ // Step 1: Remove very common noise (≥95%)
254
+ if (currentLength() > opts.maxLength) {
255
+ const veryCommon = new Set();
256
+ partCounts.forEach((count, part) => {
257
+ if ((count / total) >= 0.95)
258
+ veryCommon.add(part);
259
+ });
260
+ if (veryCommon.size > 0) {
261
+ parts = parts.filter((p, i) => {
262
+ if (i === 0 && hasVerb)
263
+ return true;
264
+ return !veryCommon.has(p.toLowerCase());
265
+ });
266
+ }
267
+ }
268
+ // Step 2: Remove common noise (≥80%)
269
+ if (currentLength() > opts.maxLength) {
270
+ const common = new Set();
271
+ partCounts.forEach((count, part) => {
272
+ if ((count / total) >= 0.80 && (count / total) < 0.95) {
273
+ common.add(part);
274
+ }
275
+ });
276
+ if (common.size > 0) {
277
+ parts = parts.filter((p, i) => {
278
+ if (i === 0 && hasVerb)
279
+ return true;
280
+ return !common.has(p.toLowerCase());
281
+ });
282
+ }
283
+ }
284
+ // Step 3: Remove path parameter suffixes
285
+ if (currentLength() > opts.maxLength) {
286
+ const paramSuffixes = ['id', 'iid'];
287
+ parts = parts.filter((p, i) => {
288
+ if (i === 0 && hasVerb)
289
+ return true;
290
+ const lower = p.toLowerCase();
291
+ if (paramSuffixes.includes(lower))
292
+ return false;
293
+ const normalized = lower.replace(/id$|iid$/i, '');
294
+ if (pathParams.includes(normalized) || pathParams.includes(lower)) {
295
+ return false;
296
+ }
297
+ return true;
298
+ });
299
+ }
300
+ // Step 4: Remove duplicates
301
+ if (currentLength() > opts.maxLength) {
302
+ const seen = new Set();
303
+ parts = parts.filter((p, i) => {
304
+ if (i === 0 && hasVerb)
305
+ return true;
306
+ const lower = p.toLowerCase();
307
+ if (seen.has(lower))
308
+ return false;
309
+ seen.add(lower);
310
+ return true;
311
+ });
312
+ }
313
+ // Step 5: Remove moderately common (≥50%)
314
+ if (currentLength() > opts.maxLength) {
315
+ const moderate = new Set();
316
+ partCounts.forEach((count, part) => {
317
+ if ((count / total) >= 0.50 && (count / total) < 0.80) {
318
+ moderate.add(part);
319
+ }
320
+ });
321
+ if (moderate.size > 0) {
322
+ parts = parts.filter((p, i) => {
323
+ if (i === 0 && hasVerb)
324
+ return true;
325
+ return !moderate.has(p.toLowerCase());
326
+ });
327
+ }
328
+ }
329
+ // Step 6: Keep only verb + last 2 parts
330
+ if (currentLength() > opts.maxLength) {
331
+ const keepCount = Math.min(3, parts.length);
332
+ if (parts.length > keepCount) {
333
+ const kept = hasVerb
334
+ ? [parts[0], ...parts.slice(-2)]
335
+ : parts.slice(-keepCount);
336
+ parts = kept;
337
+ }
338
+ }
339
+ let result = sanitizeName(parts.join('_'));
340
+ // Last resort: truncate
341
+ if (result.length > opts.maxLength) {
342
+ result = result.substring(0, opts.maxLength);
343
+ }
344
+ return {
345
+ name: result,
346
+ truncated: true,
347
+ strategy: NamingStrategy.Iterative,
348
+ originalLength: op.operationId.length,
349
+ partsUsed: parts.length,
350
+ };
351
+ }
352
+ /**
353
+ * Hash strategy: <verb>_<resource>_<hash4>
354
+ */
355
+ function shortenWithHash(op, opts) {
356
+ const verb = op.method.toLowerCase();
357
+ const resource = extractResourceFromPath(op.path);
358
+ const hash = stableHash(op.operationId, 4);
359
+ let result = `${verb}_${resource}_${hash}`;
360
+ // Ensure under limit
361
+ if (result.length > opts.maxLength) {
362
+ // Try shortening resource
363
+ const shortResource = resource.substring(0, Math.max(3, opts.maxLength - verb.length - hash.length - 2));
364
+ result = `${verb}_${shortResource}_${hash}`;
365
+ // Last resort: truncate
366
+ if (result.length > opts.maxLength) {
367
+ result = result.substring(0, opts.maxLength);
368
+ }
369
+ }
370
+ return {
371
+ name: sanitizeName(result),
372
+ truncated: true,
373
+ strategy: NamingStrategy.Hash,
374
+ originalLength: op.operationId.length,
375
+ };
376
+ }
377
+ /**
378
+ * Extract main resource from path
379
+ */
380
+ function extractResourceFromPath(path) {
381
+ const segments = path.split('/').filter(s => s && !s.startsWith('{'));
382
+ // Find last non-action meaningful segment
383
+ const actionWords = ['protect', 'unprotect', 'merge', 'approve', 'cancel', 'authorize'];
384
+ for (let i = segments.length - 1; i >= 0; i--) {
385
+ const segment = segments[i].toLowerCase();
386
+ if (!['api', 'v1', 'v2', 'v3', 'v4', 'repository'].includes(segment) &&
387
+ !actionWords.includes(segment)) {
388
+ return sanitizeName(segments[i]);
389
+ }
390
+ }
391
+ return sanitizeName(segments[segments.length - 1] || 'resource');
392
+ }
393
+ /**
394
+ * Generate stable short hash from string
395
+ */
396
+ export function stableHash(str, length = 4) {
397
+ let hash = 0;
398
+ for (let i = 0; i < str.length; i++) {
399
+ const char = str.charCodeAt(i);
400
+ hash = ((hash << 5) - hash) + char;
401
+ hash = hash & hash; // Convert to 32-bit integer
402
+ }
403
+ // Convert to base36 and take first N characters
404
+ return Math.abs(hash).toString(36).substring(0, length).padEnd(length, '0');
405
+ }
406
+ /**
407
+ * Calculate Levenshtein distance between two strings
408
+ */
409
+ export function levenshteinDistance(a, b) {
410
+ const matrix = Array(b.length + 1)
411
+ .fill(null)
412
+ .map(() => Array(a.length + 1).fill(null));
413
+ for (let i = 0; i <= a.length; i++)
414
+ matrix[0][i] = i;
415
+ for (let j = 0; j <= b.length; j++)
416
+ matrix[j][0] = j;
417
+ for (let j = 1; j <= b.length; j++) {
418
+ for (let i = 1; i <= a.length; i++) {
419
+ const indicator = a[i - 1] === b[j - 1] ? 0 : 1;
420
+ matrix[j][i] = Math.min(matrix[j][i - 1] + 1, matrix[j - 1][i] + 1, matrix[j - 1][i - 1] + indicator);
421
+ }
422
+ }
423
+ return matrix[b.length][a.length];
424
+ }
425
+ /**
426
+ * Normalize operation name for similarity comparison
427
+ */
428
+ function normalizeForSimilarity(op) {
429
+ return op.operationId
430
+ .toLowerCase()
431
+ .replace(/^(get|post|put|delete|patch)/, '')
432
+ .replace(/^apiv[0-9]/, '')
433
+ .replace(/[^a-z0-9]/g, '');
434
+ }
435
+ /**
436
+ * Pick most similar pairs of operations
437
+ */
438
+ export function pickMostSimilarPairs(operations, topN, threshold = 0.75) {
439
+ if (operations.length < 2) {
440
+ return [];
441
+ }
442
+ const pairs = [];
443
+ const normalized = operations.map(op => normalizeForSimilarity(op));
444
+ // Calculate similarity for all pairs
445
+ for (let i = 0; i < operations.length; i++) {
446
+ for (let j = i + 1; j < operations.length; j++) {
447
+ const distance = levenshteinDistance(normalized[i], normalized[j]);
448
+ const maxLen = Math.max(normalized[i].length, normalized[j].length);
449
+ // Similarity: 1.0 (100%) = identical, 0.0 (0%) = completely different
450
+ const similarity = 1 - (distance / maxLen);
451
+ // Keep pairs with similarity >= threshold (high similarity)
452
+ if (similarity >= threshold) {
453
+ pairs.push({
454
+ opA: operations[i],
455
+ opB: operations[j],
456
+ similarity,
457
+ });
458
+ }
459
+ }
460
+ }
461
+ // Sort by similarity (highest = most similar)
462
+ pairs.sort((a, b) => b.similarity - a.similarity);
463
+ // Pick top N pairs, trying to avoid duplicate operations
464
+ const selected = [];
465
+ const usedOps = new Set();
466
+ for (const pair of pairs) {
467
+ if (selected.length >= topN)
468
+ break;
469
+ const aId = pair.opA.operationId;
470
+ const bId = pair.opB.operationId;
471
+ const isNew = !usedOps.has(aId) && !usedOps.has(bId);
472
+ if (isNew || selected.length < topN) {
473
+ selected.push(pair);
474
+ usedOps.add(aId);
475
+ usedOps.add(bId);
476
+ }
477
+ }
478
+ // If we don't have enough, add pairs even with reused ops
479
+ if (selected.length < topN) {
480
+ for (const pair of pairs) {
481
+ if (selected.length >= topN)
482
+ break;
483
+ if (!selected.includes(pair)) {
484
+ selected.push(pair);
485
+ }
486
+ }
487
+ }
488
+ return selected.slice(0, topN);
489
+ }
490
+ /**
491
+ * Detect potential collisions when shortening multiple operations
492
+ */
493
+ export function detectCollisions(operations, strategy, maxLength, options) {
494
+ const nameMap = new Map();
495
+ for (const op of operations) {
496
+ const result = shortenToolName(op, strategy, maxLength, operations, options);
497
+ const existing = nameMap.get(result.name) || [];
498
+ existing.push(op);
499
+ nameMap.set(result.name, existing);
500
+ }
501
+ // Filter to only collisions
502
+ const collisions = new Map();
503
+ for (const [name, ops] of nameMap.entries()) {
504
+ if (ops.length > 1) {
505
+ collisions.set(name, ops);
506
+ }
507
+ }
508
+ return collisions;
509
+ }
510
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"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"}