@cyanheads/mcp-ts-core 0.12.7 → 0.12.8

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 (215) hide show
  1. package/AGENTS.md +8 -3
  2. package/CLAUDE.md +8 -3
  3. package/README.md +11 -4
  4. package/changelog/0.12.x/0.12.8.md +55 -0
  5. package/dist/config/index.d.ts +3 -34
  6. package/dist/config/index.d.ts.map +1 -1
  7. package/dist/config/index.js +4 -26
  8. package/dist/config/index.js.map +1 -1
  9. package/dist/core/app.d.ts +0 -8
  10. package/dist/core/app.d.ts.map +1 -1
  11. package/dist/core/app.js +0 -7
  12. package/dist/core/app.js.map +1 -1
  13. package/dist/core/serverManifest.d.ts +0 -7
  14. package/dist/core/serverManifest.d.ts.map +1 -1
  15. package/dist/core/serverManifest.js +1 -13
  16. package/dist/core/serverManifest.js.map +1 -1
  17. package/dist/linter/rules/enrichment-rules.js +2 -2
  18. package/dist/linter/rules/enrichment-rules.js.map +1 -1
  19. package/dist/linter/rules/format-parity-rules.d.ts.map +1 -1
  20. package/dist/linter/rules/format-parity-rules.js +14 -36
  21. package/dist/linter/rules/format-parity-rules.js.map +1 -1
  22. package/dist/linter/rules/prompt-rules.d.ts +1 -1
  23. package/dist/linter/rules/prompt-rules.d.ts.map +1 -1
  24. package/dist/linter/rules/prompt-rules.js +2 -19
  25. package/dist/linter/rules/prompt-rules.js.map +1 -1
  26. package/dist/linter/rules/resource-rules.d.ts +1 -1
  27. package/dist/linter/rules/resource-rules.d.ts.map +1 -1
  28. package/dist/linter/rules/resource-rules.js +9 -39
  29. package/dist/linter/rules/resource-rules.js.map +1 -1
  30. package/dist/linter/rules/schema-rules.d.ts +22 -2
  31. package/dist/linter/rules/schema-rules.d.ts.map +1 -1
  32. package/dist/linter/rules/schema-rules.js +28 -5
  33. package/dist/linter/rules/schema-rules.js.map +1 -1
  34. package/dist/linter/rules/tool-rules.d.ts +1 -1
  35. package/dist/linter/rules/tool-rules.d.ts.map +1 -1
  36. package/dist/linter/rules/tool-rules.js +13 -41
  37. package/dist/linter/rules/tool-rules.js.map +1 -1
  38. package/dist/linter/validate.d.ts.map +1 -1
  39. package/dist/linter/validate.js +22 -42
  40. package/dist/linter/validate.js.map +1 -1
  41. package/dist/mcp-server/apps/appBuilders.d.ts.map +1 -1
  42. package/dist/mcp-server/apps/appBuilders.js +2 -16
  43. package/dist/mcp-server/apps/appBuilders.js.map +1 -1
  44. package/dist/mcp-server/handlerContext.d.ts +66 -0
  45. package/dist/mcp-server/handlerContext.d.ts.map +1 -0
  46. package/dist/mcp-server/handlerContext.js +71 -0
  47. package/dist/mcp-server/handlerContext.js.map +1 -0
  48. package/dist/mcp-server/inputRequired.d.ts +7 -1
  49. package/dist/mcp-server/inputRequired.d.ts.map +1 -1
  50. package/dist/mcp-server/inputRequired.js +10 -3
  51. package/dist/mcp-server/inputRequired.js.map +1 -1
  52. package/dist/mcp-server/resources/resource-registration.d.ts +2 -2
  53. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
  54. package/dist/mcp-server/resources/resource-registration.js.map +1 -1
  55. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +14 -43
  56. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
  57. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +11 -50
  58. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
  59. package/dist/mcp-server/tools/tool-registration.d.ts +5 -9
  60. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
  61. package/dist/mcp-server/tools/tool-registration.js +9 -11
  62. package/dist/mcp-server/tools/tool-registration.js.map +1 -1
  63. package/dist/mcp-server/tools/utils/schemaShape.d.ts +21 -0
  64. package/dist/mcp-server/tools/utils/schemaShape.d.ts.map +1 -1
  65. package/dist/mcp-server/tools/utils/schemaShape.js +8 -6
  66. package/dist/mcp-server/tools/utils/schemaShape.js.map +1 -1
  67. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +15 -43
  68. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  69. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +31 -72
  70. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  71. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -1
  72. package/dist/mcp-server/transports/http/httpErrorHandler.js +2 -1
  73. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -1
  74. package/dist/mcp-server/transports/http/landing-page/handler.d.ts.map +1 -1
  75. package/dist/mcp-server/transports/http/landing-page/handler.js +2 -1
  76. package/dist/mcp-server/transports/http/landing-page/handler.js.map +1 -1
  77. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -1
  78. package/dist/mcp-server/transports/http/protectedResourceMetadata.js +2 -1
  79. package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -1
  80. package/dist/mcp-server/transports/http/publicOrigin.d.ts +11 -0
  81. package/dist/mcp-server/transports/http/publicOrigin.d.ts.map +1 -0
  82. package/dist/mcp-server/transports/http/publicOrigin.js +13 -0
  83. package/dist/mcp-server/transports/http/publicOrigin.js.map +1 -0
  84. package/dist/mcp-server/transports/http/serverCard.d.ts.map +1 -1
  85. package/dist/mcp-server/transports/http/serverCard.js +2 -1
  86. package/dist/mcp-server/transports/http/serverCard.js.map +1 -1
  87. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts +4 -0
  88. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts.map +1 -1
  89. package/dist/mcp-server/transports/http/sessionIdUtils.js +3 -13
  90. package/dist/mcp-server/transports/http/sessionIdUtils.js.map +1 -1
  91. package/dist/mcp-server/transports/manager.d.ts +0 -3
  92. package/dist/mcp-server/transports/manager.d.ts.map +1 -1
  93. package/dist/mcp-server/transports/manager.js +0 -7
  94. package/dist/mcp-server/transports/manager.js.map +1 -1
  95. package/dist/services/canvas/core/CanvasRegistry.d.ts +14 -0
  96. package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
  97. package/dist/services/canvas/core/CanvasRegistry.js +3 -2
  98. package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
  99. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +16 -0
  100. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
  101. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +78 -103
  102. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
  103. package/dist/services/graph/core/GraphService.d.ts +3 -3
  104. package/dist/services/graph/core/GraphService.js +3 -3
  105. package/dist/services/graph/types.d.ts +2 -79
  106. package/dist/services/graph/types.d.ts.map +1 -1
  107. package/dist/services/graph/types.js +2 -2
  108. package/dist/services/index.d.ts +1 -2
  109. package/dist/services/index.d.ts.map +1 -1
  110. package/dist/services/index.js +0 -1
  111. package/dist/services/index.js.map +1 -1
  112. package/dist/services/mirror/sqlite/handle.d.ts.map +1 -1
  113. package/dist/services/mirror/sqlite/handle.js +22 -36
  114. package/dist/services/mirror/sqlite/handle.js.map +1 -1
  115. package/dist/services/speech/core/ISpeechProvider.d.ts +0 -24
  116. package/dist/services/speech/core/ISpeechProvider.d.ts.map +1 -1
  117. package/dist/services/speech/core/ISpeechProvider.js +1 -28
  118. package/dist/services/speech/core/ISpeechProvider.js.map +1 -1
  119. package/dist/services/speech/core/SpeechService.d.ts.map +1 -1
  120. package/dist/services/speech/core/SpeechService.js +5 -8
  121. package/dist/services/speech/core/SpeechService.js.map +1 -1
  122. package/dist/services/speech/providers/elevenlabs.provider.d.ts.map +1 -1
  123. package/dist/services/speech/providers/elevenlabs.provider.js +1 -0
  124. package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -1
  125. package/dist/services/speech/types.d.ts +2 -19
  126. package/dist/services/speech/types.d.ts.map +1 -1
  127. package/dist/storage/core/providerHelpers.d.ts +52 -0
  128. package/dist/storage/core/providerHelpers.d.ts.map +1 -0
  129. package/dist/storage/core/providerHelpers.js +96 -0
  130. package/dist/storage/core/providerHelpers.js.map +1 -0
  131. package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -1
  132. package/dist/storage/providers/cloudflare/d1Provider.js +1 -4
  133. package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -1
  134. package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -1
  135. package/dist/storage/providers/cloudflare/kvProvider.js +4 -31
  136. package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -1
  137. package/dist/storage/providers/cloudflare/r2Provider.d.ts +1 -1
  138. package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -1
  139. package/dist/storage/providers/cloudflare/r2Provider.js +8 -48
  140. package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -1
  141. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts +1 -1
  142. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts.map +1 -1
  143. package/dist/storage/providers/fileSystem/fileSystemProvider.js +17 -86
  144. package/dist/storage/providers/fileSystem/fileSystemProvider.js.map +1 -1
  145. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -1
  146. package/dist/storage/providers/inMemory/inMemoryProvider.js +5 -38
  147. package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -1
  148. package/dist/storage/providers/supabase/supabaseProvider.d.ts.map +1 -1
  149. package/dist/storage/providers/supabase/supabaseProvider.js +1 -4
  150. package/dist/storage/providers/supabase/supabaseProvider.js.map +1 -1
  151. package/dist/testing/fuzz.d.ts.map +1 -1
  152. package/dist/testing/fuzz.js +17 -31
  153. package/dist/testing/fuzz.js.map +1 -1
  154. package/dist/testing/index.d.ts.map +1 -1
  155. package/dist/testing/index.js +4 -26
  156. package/dist/testing/index.js.map +1 -1
  157. package/dist/utils/internal/error-handler/types.d.ts +0 -4
  158. package/dist/utils/internal/error-handler/types.d.ts.map +1 -1
  159. package/dist/utils/internal/logger.d.ts.map +1 -1
  160. package/dist/utils/internal/logger.js +2 -16
  161. package/dist/utils/internal/logger.js.map +1 -1
  162. package/dist/utils/internal/performance.d.ts +8 -31
  163. package/dist/utils/internal/performance.d.ts.map +1 -1
  164. package/dist/utils/internal/performance.js +173 -295
  165. package/dist/utils/internal/performance.js.map +1 -1
  166. package/dist/utils/security/idGenerator.d.ts.map +1 -1
  167. package/dist/utils/security/idGenerator.js +24 -43
  168. package/dist/utils/security/idGenerator.js.map +1 -1
  169. package/dist/utils/security/sanitization.d.ts +0 -7
  170. package/dist/utils/security/sanitization.d.ts.map +1 -1
  171. package/dist/utils/security/sanitization.js +4 -31
  172. package/dist/utils/security/sanitization.js.map +1 -1
  173. package/dist/utils/security/sensitiveFields.d.ts +14 -0
  174. package/dist/utils/security/sensitiveFields.d.ts.map +1 -0
  175. package/dist/utils/security/sensitiveFields.js +31 -0
  176. package/dist/utils/security/sensitiveFields.js.map +1 -0
  177. package/dist/utils/telemetry/trace.d.ts +8 -10
  178. package/dist/utils/telemetry/trace.d.ts.map +1 -1
  179. package/dist/utils/telemetry/trace.js +19 -18
  180. package/dist/utils/telemetry/trace.js.map +1 -1
  181. package/dist/utils/types/guards.d.ts +0 -102
  182. package/dist/utils/types/guards.d.ts.map +1 -1
  183. package/dist/utils/types/guards.js +0 -114
  184. package/dist/utils/types/guards.js.map +1 -1
  185. package/package.json +6 -6
  186. package/skills/add-provider/SKILL.md +18 -4
  187. package/skills/api-config/SKILL.md +4 -18
  188. package/skills/api-services/SKILL.md +1 -1
  189. package/skills/api-services/references/speech.md +1 -2
  190. package/skills/api-telemetry/SKILL.md +2 -2
  191. package/skills/api-utils/SKILL.md +2 -2
  192. package/skills/code-simplifier/SKILL.md +47 -20
  193. package/skills/field-test/SKILL.md +93 -14
  194. package/skills/git-wrapup/SKILL.md +64 -27
  195. package/skills/orchestrations/SKILL.md +17 -6
  196. package/skills/orchestrations/workflows/field-test-fix.md +6 -4
  197. package/skills/orchestrations/workflows/fix-wrapup-release.md +6 -4
  198. package/skills/orchestrations/workflows/greenfield-build.md +2 -2
  199. package/skills/orchestrations/workflows/maintenance-release.md +4 -2
  200. package/skills/release-and-publish/SKILL.md +101 -23
  201. package/skills/release-pr-review/SKILL.md +147 -0
  202. package/templates/AGENTS.md +4 -2
  203. package/templates/CLAUDE.md +4 -2
  204. package/dist/mcp-server/transports/ITransport.d.ts +0 -15
  205. package/dist/mcp-server/transports/ITransport.d.ts.map +0 -1
  206. package/dist/mcp-server/transports/ITransport.js +0 -2
  207. package/dist/mcp-server/transports/ITransport.js.map +0 -1
  208. package/dist/services/llm/types.d.ts +0 -16
  209. package/dist/services/llm/types.d.ts.map +0 -1
  210. package/dist/services/llm/types.js +0 -9
  211. package/dist/services/llm/types.js.map +0 -1
  212. package/dist/utils/internal/health.d.ts +0 -60
  213. package/dist/utils/internal/health.d.ts.map +0 -1
  214. package/dist/utils/internal/health.js +0 -46
  215. package/dist/utils/internal/health.js.map +0 -1
@@ -54,56 +54,6 @@ export declare function isRecord(value: unknown): value is Record<string, unknow
54
54
  * ```
55
55
  */
56
56
  export declare function hasProperty<K extends PropertyKey>(obj: unknown, key: K): obj is Record<K, unknown>;
57
- /**
58
- * Type guard to check if an object has a property of a specific type.
59
- *
60
- * @param obj - Object to check
61
- * @param key - Property key to look for
62
- * @param typeGuard - Type guard function for the property value
63
- * @returns True if object has the property and it matches the type
64
- *
65
- * @example
66
- * ```typescript
67
- * if (hasPropertyOfType(obj, 'count', (v): v is number => typeof v === 'number')) {
68
- * // obj.count is now typed as number
69
- * console.log(obj.count + 1);
70
- * }
71
- * ```
72
- */
73
- export declare function hasPropertyOfType<K extends PropertyKey, T>(obj: unknown, key: K, typeGuard: (value: unknown) => value is T): obj is Record<K, T>;
74
- /**
75
- * Type guard to check if a value is a string.
76
- *
77
- * @param value - Value to check
78
- * @returns True if value is a string
79
- *
80
- * @example
81
- * ```typescript
82
- * if (isString(value)) {
83
- * // value is now typed as string
84
- * console.log(value.toUpperCase());
85
- * }
86
- * ```
87
- */
88
- export declare function isString(value: unknown): value is string;
89
- /**
90
- * Type guard to check if a value is a number.
91
- *
92
- * `NaN` is explicitly excluded — `typeof NaN === 'number'` is true in JavaScript,
93
- * but `NaN` is almost never a valid value in the contexts where this guard is used.
94
- *
95
- * @param value - Value to check
96
- * @returns True if value is a finite or infinite number (excluding NaN)
97
- *
98
- * @example
99
- * ```typescript
100
- * if (isNumber(value)) {
101
- * // value is now typed as number (NaN excluded)
102
- * console.log(value.toFixed(2));
103
- * }
104
- * ```
105
- */
106
- export declare function isNumber(value: unknown): value is number;
107
57
  /**
108
58
  * Type guard to check if an error is an AggregateError.
109
59
  *
@@ -140,22 +90,6 @@ export declare function isAggregateError(error: unknown): error is Error & {
140
90
  export declare function isErrorWithCode(error: unknown): error is Error & {
141
91
  code: unknown;
142
92
  };
143
- /**
144
- * Type guard to check if an error has a status property.
145
- *
146
- * @param error - Error to check
147
- * @returns True if error has a status property
148
- *
149
- * @example
150
- * ```typescript
151
- * if (isErrorWithStatus(error)) {
152
- * console.log(`HTTP status: ${error.status}`);
153
- * }
154
- * ```
155
- */
156
- export declare function isErrorWithStatus(error: unknown): error is Error & {
157
- status: unknown;
158
- };
159
93
  /**
160
94
  * Safely get a property from an object if it exists.
161
95
  *
@@ -170,40 +104,4 @@ export declare function isErrorWithStatus(error: unknown): error is Error & {
170
104
  * ```
171
105
  */
172
106
  export declare function getProperty<K extends PropertyKey>(obj: unknown, key: K): unknown;
173
- /**
174
- * Safely get a string property from an object.
175
- *
176
- * @param obj - Object to get property from
177
- * @param key - Property key
178
- * @returns String value or undefined if property doesn't exist or is not a string
179
- *
180
- * @example
181
- * ```typescript
182
- * const traceId = getStringProperty(context, 'traceId');
183
- * if (traceId) {
184
- * // traceId is typed as string
185
- * console.log(traceId.toUpperCase());
186
- * }
187
- * ```
188
- */
189
- export declare function getStringProperty<K extends PropertyKey>(obj: unknown, key: K): string | undefined;
190
- /**
191
- * Safely get a number property from an object.
192
- *
193
- * Returns `undefined` if the property is absent, not a number, or is `NaN`.
194
- *
195
- * @param obj - Object to get property from
196
- * @param key - Property key
197
- * @returns Number value or undefined if property doesn't exist, is not a number, or is NaN
198
- *
199
- * @example
200
- * ```typescript
201
- * const retries = getNumberProperty(config, 'maxRetries');
202
- * if (retries !== undefined) {
203
- * // retries is typed as number
204
- * console.log(`Max retries: ${retries}`);
205
- * }
206
- * ```
207
- */
208
- export declare function getNumberProperty<K extends PropertyKey>(obj: unknown, key: K): number | undefined;
209
107
  //# sourceMappingURL=guards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/utils/types/guards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAC/C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,CAAC,GACL,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAE3B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EACxD,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACxC,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAErB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAEvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAElF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAEtF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAEhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAGjG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAGjG"}
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/utils/types/guards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAC/C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,CAAC,GACL,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAE3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAEvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAElF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAEhF"}
@@ -60,62 +60,6 @@ export function isRecord(value) {
60
60
  export function hasProperty(obj, key) {
61
61
  return isObject(obj) && key in obj;
62
62
  }
63
- /**
64
- * Type guard to check if an object has a property of a specific type.
65
- *
66
- * @param obj - Object to check
67
- * @param key - Property key to look for
68
- * @param typeGuard - Type guard function for the property value
69
- * @returns True if object has the property and it matches the type
70
- *
71
- * @example
72
- * ```typescript
73
- * if (hasPropertyOfType(obj, 'count', (v): v is number => typeof v === 'number')) {
74
- * // obj.count is now typed as number
75
- * console.log(obj.count + 1);
76
- * }
77
- * ```
78
- */
79
- export function hasPropertyOfType(obj, key, typeGuard) {
80
- return hasProperty(obj, key) && typeGuard(obj[key]);
81
- }
82
- /**
83
- * Type guard to check if a value is a string.
84
- *
85
- * @param value - Value to check
86
- * @returns True if value is a string
87
- *
88
- * @example
89
- * ```typescript
90
- * if (isString(value)) {
91
- * // value is now typed as string
92
- * console.log(value.toUpperCase());
93
- * }
94
- * ```
95
- */
96
- export function isString(value) {
97
- return typeof value === 'string';
98
- }
99
- /**
100
- * Type guard to check if a value is a number.
101
- *
102
- * `NaN` is explicitly excluded — `typeof NaN === 'number'` is true in JavaScript,
103
- * but `NaN` is almost never a valid value in the contexts where this guard is used.
104
- *
105
- * @param value - Value to check
106
- * @returns True if value is a finite or infinite number (excluding NaN)
107
- *
108
- * @example
109
- * ```typescript
110
- * if (isNumber(value)) {
111
- * // value is now typed as number (NaN excluded)
112
- * console.log(value.toFixed(2));
113
- * }
114
- * ```
115
- */
116
- export function isNumber(value) {
117
- return typeof value === 'number' && !Number.isNaN(value);
118
- }
119
63
  /**
120
64
  * Type guard to check if an error is an AggregateError.
121
65
  *
@@ -152,22 +96,6 @@ export function isAggregateError(error) {
152
96
  export function isErrorWithCode(error) {
153
97
  return error instanceof Error && hasProperty(error, 'code');
154
98
  }
155
- /**
156
- * Type guard to check if an error has a status property.
157
- *
158
- * @param error - Error to check
159
- * @returns True if error has a status property
160
- *
161
- * @example
162
- * ```typescript
163
- * if (isErrorWithStatus(error)) {
164
- * console.log(`HTTP status: ${error.status}`);
165
- * }
166
- * ```
167
- */
168
- export function isErrorWithStatus(error) {
169
- return error instanceof Error && hasProperty(error, 'status');
170
- }
171
99
  /**
172
100
  * Safely get a property from an object if it exists.
173
101
  *
@@ -184,46 +112,4 @@ export function isErrorWithStatus(error) {
184
112
  export function getProperty(obj, key) {
185
113
  return hasProperty(obj, key) ? obj[key] : undefined;
186
114
  }
187
- /**
188
- * Safely get a string property from an object.
189
- *
190
- * @param obj - Object to get property from
191
- * @param key - Property key
192
- * @returns String value or undefined if property doesn't exist or is not a string
193
- *
194
- * @example
195
- * ```typescript
196
- * const traceId = getStringProperty(context, 'traceId');
197
- * if (traceId) {
198
- * // traceId is typed as string
199
- * console.log(traceId.toUpperCase());
200
- * }
201
- * ```
202
- */
203
- export function getStringProperty(obj, key) {
204
- const value = getProperty(obj, key);
205
- return isString(value) ? value : undefined;
206
- }
207
- /**
208
- * Safely get a number property from an object.
209
- *
210
- * Returns `undefined` if the property is absent, not a number, or is `NaN`.
211
- *
212
- * @param obj - Object to get property from
213
- * @param key - Property key
214
- * @returns Number value or undefined if property doesn't exist, is not a number, or is NaN
215
- *
216
- * @example
217
- * ```typescript
218
- * const retries = getNumberProperty(config, 'maxRetries');
219
- * if (retries !== undefined) {
220
- * // retries is typed as number
221
- * console.log(`Max retries: ${retries}`);
222
- * }
223
- * ```
224
- */
225
- export function getNumberProperty(obj, key) {
226
- const value = getProperty(obj, key);
227
- return isNumber(value) ? value : undefined;
228
- }
229
115
  //# sourceMappingURL=guards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../../src/utils/types/guards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,GAAM;IAEN,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAY,EACZ,GAAM,EACN,SAAyC;IAEzC,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAwB,GAAY,EAAE,GAAM;IACrE,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAAwB,GAAY,EAAE,GAAM;IAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAAwB,GAAY,EAAE,GAAM;IAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../../src/utils/types/guards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,GAAM;IAEN,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAwB,GAAY,EAAE,GAAM;IACrE,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/mcp-ts-core",
3
- "version": "0.12.7",
3
+ "version": "0.12.8",
4
4
  "mcpName": "io.github.cyanheads/mcp-ts-core",
5
5
  "description": "Agent-native TypeScript framework for MCP servers. Includes runtime infrastructure and agent skills for building, testing, and shipping servers.",
6
6
  "files": [
@@ -206,10 +206,10 @@
206
206
  "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
207
207
  "@opentelemetry/instrumentation-http": "^0.222.0",
208
208
  "@opentelemetry/instrumentation-pino": "^0.68.0",
209
- "@opentelemetry/resources": "^2.10.0",
210
- "@opentelemetry/sdk-metrics": "^2.10.0",
209
+ "@opentelemetry/resources": "^2.11.0",
210
+ "@opentelemetry/sdk-metrics": "^2.11.0",
211
211
  "@opentelemetry/sdk-node": "^0.222.0",
212
- "@opentelemetry/sdk-trace-node": "^2.10.0",
212
+ "@opentelemetry/sdk-trace-node": "^2.11.0",
213
213
  "@opentelemetry/semantic-conventions": "^1.43.0",
214
214
  "@socketsecurity/bun-security-scanner": "^1.1.2",
215
215
  "@supabase/supabase-js": "^2.115.0",
@@ -230,7 +230,7 @@
230
230
  "execa": "^10.0.1",
231
231
  "fast-check": "^4.9.0",
232
232
  "fast-xml-parser": "^5.11.1",
233
- "ignore": "^7.0.7",
233
+ "ignore": "^7.0.8",
234
234
  "js-yaml": "^5.4.1",
235
235
  "linkedom": "^0.18.13",
236
236
  "node-cron": "^4.6.0",
@@ -241,7 +241,7 @@
241
241
  "pino-pretty": "^13.1.3",
242
242
  "repomix": "^1.18.0",
243
243
  "sanitize-html": "^2.17.7",
244
- "tsc-alias": "^1.9.2",
244
+ "tsc-alias": "^1.9.4",
245
245
  "typedoc": "^0.28.20",
246
246
  "typescript": "^7.0.2",
247
247
  "typescript-v6": "npm:typescript@^6.0.3",
@@ -4,7 +4,7 @@ description: >
4
4
  Add a new storage or service provider to the core package. Use when implementing a new backend for StorageService (e.g., a new database) or a new service provider (e.g., a new LLM backend).
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.0"
7
+ version: "1.1"
8
8
  audience: internal
9
9
  type: reference
10
10
  ---
@@ -53,7 +53,20 @@ Provider file location and naming differ by domain:
53
53
  1. **Identify the provider interface** — read the interface file for the target domain
54
54
  (see table above).
55
55
  2. **Create the provider file** following the file convention for its domain (see above).
56
- 3. **Implement the interface** — all methods must be implemented.
56
+ 3. **Implement the interface** — all methods must be implemented. Storage providers build
57
+ on `src/storage/core/providerHelpers.ts` rather than re-deriving what the existing
58
+ providers share:
59
+
60
+ - `getManyViaGet` / `setManyViaSet` / `deleteManyViaDelete` — the batch methods as a
61
+ parallel fan-out over the single-key methods, for backends with no native batch API.
62
+ - `encodeEnvelope` / `decodeEnvelope` — the TTL envelope for backends with no TTL of their
63
+ own (R2, filesystem). `decodeEnvelope` returns `{ kind: 'expired' }` so the provider can
64
+ delete on read, returns pre-envelope JSON as a plain value, and throws `SyntaxError` on
65
+ invalid JSON so the provider can attach the key to the error it raises.
66
+ - `paginateSortedKeys` — one `list()` page over an already-sorted key set, with the cursor
67
+ for the page that follows.
68
+ - `escapeLikePattern` — escapes `%`, `_`, and `\` in a prefix before a SQL `LIKE`.
69
+
57
70
  4. **Lazy-load dependencies** if Tier 3:
58
71
 
59
72
  ```typescript
@@ -94,7 +107,7 @@ Provider file location and naming differ by domain:
94
107
  `isServerless()` guard:
95
108
 
96
109
  ```typescript
97
- // src/storage/core/storageFactory.ts ~line 112
110
+ // src/storage/core/storageFactory.ts
98
111
  !['in-memory', 'cloudflare-r2', 'cloudflare-kv', 'cloudflare-d1'].includes(providerType)
99
112
  ```
100
113
 
@@ -115,9 +128,10 @@ Provider file location and naming differ by domain:
115
128
  - [ ] Registered in the correct factory for the domain (see Step 5)
116
129
  - [ ] Storage: provider string added to `z.enum` in `src/config/index.ts`
117
130
  - [ ] Storage: Worker-compatible array in `storageFactory.ts` updated if applicable
131
+ - [ ] Storage: batch, TTL envelope, paging, and `LIKE` escaping come from `providerHelpers.ts`, not a local copy
118
132
  - [ ] Speech: `provider` literal added to `SpeechProviderConfig` union in `types.ts`
119
133
  - [ ] LLM: `src/core/app.ts` instantiation logic updated if adding a second LLM provider
120
134
  - [ ] Optional peer dependency added to both `peerDependencies` and `peerDependenciesMeta` in `package.json` if Tier 3
121
135
  - [ ] `bun run rebuild` succeeds
122
136
  - [ ] `bun run devcheck` passes
123
- - [ ] Test file created at `src/storage/providers/{{name}}/{{name}}Provider.test.ts` (or equivalent path for the domain) and `bun run test` passes
137
+ - [ ] Tests added under `tests/unit/storage/providers/{{providerName}}/` (storage) or `tests/unit/services/{{domain}}/providers/{{provider-name}}.provider.test.ts` (LLM / speech), and `bun run test` passes
@@ -4,7 +4,7 @@ description: >
4
4
  Reference for core and server configuration in `@cyanheads/mcp-ts-core`. Covers env var tables with defaults, priority order, server-specific Zod schema pattern, and Workers lazy-parsing requirement.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.15"
7
+ version: "1.16"
8
8
  audience: external
9
9
  type: reference
10
10
  ---
@@ -95,7 +95,6 @@ await createApp({
95
95
  | `MCP_HTTP_RESUMABILITY` | `mcpHttpResumability` | `true` | SSE stream replay under stateful HTTP. On by default — selecting a session mode is the opt-in. Kill switch only; no effect on stateless serving or the session-less 2026-07-28 era |
96
96
  | `MCP_HTTP_RESUMABILITY_MAX_EVENTS` | `mcpHttpResumabilityMaxEvents` | `512` | Events retained per session for replay; oldest evicted first. Lower it on a server whose tools return large results |
97
97
  | `MCP_HTTP_RESUMABILITY_TTL_MS` | `mcpHttpResumabilityTtlMs` | `300000` | 5 min; how long a retained event stays replayable |
98
- | `MCP_RESPONSE_VERBOSITY` | `mcpResponseVerbosity` | `standard` | `minimal` \| `standard` \| `full` |
99
98
  | `MCP_ALLOWED_ORIGINS` | `mcpAllowedOrigins` | — | Comma-separated list; omit to allow all |
100
99
  | `MCP_SERVER_RESOURCE_IDENTIFIER` | `mcpServerResourceIdentifier` | — | RFC 8707 resource indicator URL |
101
100
  | `MCP_PUBLIC_URL` | `mcpPublicUrl` | — | Public-facing origin for reverse proxies (Cloudflare Tunnel, nginx, ALB) so emitted URLs carry the correct scheme |
@@ -131,19 +130,6 @@ await createApp({
131
130
  | `DEV_MCP_CLIENT_ID` | `devMcpClientId` | — | Dev-only: override client ID |
132
131
  | `DEV_MCP_SCOPES` | `devMcpScopes` | — | Dev-only: comma-separated scope overrides |
133
132
 
134
- #### OAuth proxy (optional sub-object)
135
-
136
- Activated when `OAUTH_PROXY_AUTHORIZATION_URL` or `OAUTH_PROXY_TOKEN_URL` is set.
137
-
138
- | Env Var | `AppConfig` field | Notes |
139
- |:--------|:-----------------|:------|
140
- | `OAUTH_PROXY_AUTHORIZATION_URL` | `oauthProxy.authorizationUrl` | Proxy authorization endpoint |
141
- | `OAUTH_PROXY_TOKEN_URL` | `oauthProxy.tokenUrl` | Proxy token endpoint |
142
- | `OAUTH_PROXY_REVOCATION_URL` | `oauthProxy.revocationUrl` | Optional |
143
- | `OAUTH_PROXY_ISSUER_URL` | `oauthProxy.issuerUrl` | Optional |
144
- | `OAUTH_PROXY_SERVICE_DOCUMENTATION_URL` | `oauthProxy.serviceDocumentationUrl` | Optional |
145
- | `OAUTH_PROXY_DEFAULT_CLIENT_REDIRECT_URIS` | `oauthProxy.defaultClientRedirectUris` | Comma-separated list |
146
-
147
133
  ---
148
134
 
149
135
  ### Storage
@@ -174,13 +160,13 @@ Activated when `OAUTH_PROXY_AUTHORIZATION_URL` or `OAUTH_PROXY_TOKEN_URL` is set
174
160
 
175
161
  #### Supabase (optional sub-object)
176
162
 
177
- Activated when both `SUPABASE_URL` and `SUPABASE_ANON_KEY` are set.
163
+ Activated when `SUPABASE_URL` is set.
178
164
 
179
165
  | Env Var | `AppConfig` field | Notes |
180
166
  |:--------|:-----------------|:------|
181
167
  | `SUPABASE_URL` | `supabase.url` | Required to activate |
182
- | `SUPABASE_ANON_KEY` | `supabase.anonKey` | Required to activate |
183
- | `SUPABASE_SERVICE_ROLE_KEY` | `supabase.serviceRoleKey` | Optional; elevated access |
168
+ | `SUPABASE_SERVICE_ROLE_KEY` | `supabase.serviceRoleKey` | Required by the `supabase` storage provider (admin client) |
169
+ | `SUPABASE_ANON_KEY` | `supabase.anonKey` | Optional; for the server's own public client — the framework never reads it |
184
170
 
185
171
  ---
186
172
 
@@ -4,7 +4,7 @@ description: >
4
4
  API reference for built-in service providers (LLM, Speech, Graph). Use when looking up service interfaces, provider capabilities, or integration patterns.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.4"
7
+ version: "1.5"
8
8
  audience: external
9
9
  type: reference
10
10
  ---
@@ -24,7 +24,7 @@ The provider interface — implemented by ElevenLabs (TTS) and Whisper (STT):
24
24
  | `.getSTTProvider()` | `ISpeechProvider` | Throws `McpError(InvalidRequest)` if no STT provider configured |
25
25
  | `.hasTTS()` | `boolean` | Check if TTS is available |
26
26
  | `.hasSTT()` | `boolean` | Check if STT is available |
27
- | `.healthCheck()` | `Promise<{ tts: boolean; stt: boolean }>` | Checks both providers sequentially |
27
+ | `.healthCheck()` | `Promise<{ tts: boolean; stt: boolean }>` | Checks both providers in parallel |
28
28
 
29
29
  ## Providers
30
30
 
@@ -52,7 +52,6 @@ const ttsProvider = speechService.getTTSProvider();
52
52
  const ttsResult = await ttsProvider.textToSpeech({
53
53
  text: 'Hello, world!',
54
54
  voice: { voiceId: 'some-voice-id' },
55
- format: 'mp3',
56
55
  });
57
56
 
58
57
  // Speech-to-Text
@@ -4,7 +4,7 @@ description: >
4
4
  Catalog of OpenTelemetry instrumentation built into framework `@cyanheads/mcp-ts-core` — spans, metrics, completion logs, env config, runtime caveats, custom instrumentation patterns, and cardinality rules. Use when enabling OTel export, adding custom spans or metrics in services, debugging missing telemetry, looking up attribute names, or deciding what's safe to put on a metric attribute vs. a span.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.7"
7
+ version: "1.8"
8
8
  audience: external
9
9
  type: reference
10
10
  ---
@@ -227,7 +227,7 @@ export async function doWork() {
227
227
  }
228
228
  ```
229
229
 
230
- Span context propagates automatically — `withSpan` calls inside a `tool_execution:*` span appear as children. `runInContext(ctx, fn)` carries the active OTel context across async boundaries (`setTimeout`, `queueMicrotask`).
230
+ Span context propagates automatically — `withSpan` calls inside a `tool_execution:*` span appear as children. `runInContext(ctx, fn)` re-establishes the span `ctx` names as the active one across async boundaries (`setTimeout`, `queueMicrotask`), so spans opened inside `fn` parent to the request's span.
231
231
 
232
232
  For attribute keys, prefer the `ATTR_*` constants exported from `@cyanheads/mcp-ts-core/utils` (telemetry/attributes) over hand-typed strings — keeps you in step with framework conventions and avoids typos. Standard OTel semantic conventions (HTTP, cloud, service, network, etc.) are NOT re-exported — import those directly from `@opentelemetry/semantic-conventions`.
233
233
 
@@ -4,7 +4,7 @@ description: >
4
4
  API reference for all utilities exported from `@cyanheads/mcp-ts-core/utils`. Use when looking up utility method signatures, options, peer dependencies, or usage patterns.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "2.8"
7
+ version: "2.9"
8
8
  audience: external
9
9
  type: reference
10
10
  ---
@@ -163,7 +163,7 @@ Helper API only. For the catalog of what the framework auto-emits (span names, m
163
163
  | Export | Signature | Notes |
164
164
  |:-------|:----------|:------|
165
165
  | `withSpan` | `async <T>(operationName: string, fn: (span: Span) => Promise<T>, attributes?: Record<string, string \| number \| boolean>) -> Promise<T>` | Creates an active span, calls `fn(span)`, sets `OK` on success or records exception + sets `ERROR` on throw, then ends the span. Always rethrows. |
166
- | `runInContext` | `(ctx: RequestContext \| undefined, fn: () => T) -> T` | Runs `fn` inside the currently active OTel context. When `ctx` has no `traceId`/`spanId`, calls `fn` directly. Does not restore a specific span — use for carrying context across async boundaries (`setTimeout`, `queueMicrotask`). |
166
+ | `runInContext` | `(ctx: RequestContext \| undefined, fn: () => T) -> T` | Runs `fn` with the span `ctx` names (`traceId`/`spanId`) re-established as the active OTel span, so spans opened inside `fn` parent to it. When `ctx` has no `traceId`/`spanId`, calls `fn` directly. Use for carrying a request's trace across async boundaries (`setTimeout`, `queueMicrotask`). |
167
167
  | `buildTraceparent` | `(ctx?: RequestContext) -> string \| undefined` | Builds a W3C `traceparent` header (`00-<traceId>-<spanId>-01`) from `ctx` or the active span. Returns `undefined` when neither source yields both IDs. |
168
168
  | `extractTraceparent` | `(headers: Headers \| Record<string, string \| undefined>) -> TraceparentInfo \| undefined` | Parses a W3C `traceparent` header. Returns `undefined` when absent or malformed. `TraceparentInfo: { traceId, spanId, sampled }`. |
169
169
  | `createContextWithParentTrace` | `(parentHeaders: Headers \| Record<string, string \| undefined>, operation: string) -> RequestContext` | Extracts `traceparent` from headers and creates a child `RequestContext` inheriting `traceId`/`parentSpanId`. |