@cyanheads/mcp-ts-core 0.1.0-beta.12

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 (485) hide show
  1. package/CLAUDE.md +583 -0
  2. package/LICENSE +201 -0
  3. package/README.md +287 -0
  4. package/biome.json +103 -0
  5. package/dist/app.d.ts +82 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +222 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/cli/init.d.ts +8 -0
  10. package/dist/cli/init.d.ts.map +1 -0
  11. package/dist/cli/init.js +161 -0
  12. package/dist/cli/init.js.map +1 -0
  13. package/dist/config/index.d.ts +349 -0
  14. package/dist/config/index.d.ts.map +1 -0
  15. package/dist/config/index.js +464 -0
  16. package/dist/config/index.js.map +1 -0
  17. package/dist/context.d.ts +119 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +144 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/index.d.ts +8 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +9 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/mcp-server/prompts/prompt-registration.d.ts +33 -0
  26. package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -0
  27. package/dist/mcp-server/prompts/prompt-registration.js +91 -0
  28. package/dist/mcp-server/prompts/prompt-registration.js.map +1 -0
  29. package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts +49 -0
  30. package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts.map +1 -0
  31. package/dist/mcp-server/prompts/utils/newPromptDefinition.js +39 -0
  32. package/dist/mcp-server/prompts/utils/newPromptDefinition.js.map +1 -0
  33. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +37 -0
  34. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -0
  35. package/dist/mcp-server/prompts/utils/promptDefinition.js +2 -0
  36. package/dist/mcp-server/prompts/utils/promptDefinition.js.map +1 -0
  37. package/dist/mcp-server/resources/resource-registration.d.ts +27 -0
  38. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -0
  39. package/dist/mcp-server/resources/resource-registration.js +85 -0
  40. package/dist/mcp-server/resources/resource-registration.js.map +1 -0
  41. package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts +84 -0
  42. package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts.map +1 -0
  43. package/dist/mcp-server/resources/utils/newResourceDefinition.js +40 -0
  44. package/dist/mcp-server/resources/utils/newResourceDefinition.js.map +1 -0
  45. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts +32 -0
  46. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts.map +1 -0
  47. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js +103 -0
  48. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js.map +1 -0
  49. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +94 -0
  50. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -0
  51. package/dist/mcp-server/resources/utils/resourceDefinition.js +2 -0
  52. package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -0
  53. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +14 -0
  54. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -0
  55. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +111 -0
  56. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -0
  57. package/dist/mcp-server/roots/roots-registration.d.ts +22 -0
  58. package/dist/mcp-server/roots/roots-registration.d.ts.map +1 -0
  59. package/dist/mcp-server/roots/roots-registration.js +25 -0
  60. package/dist/mcp-server/roots/roots-registration.js.map +1 -0
  61. package/dist/mcp-server/server.d.ts +34 -0
  62. package/dist/mcp-server/server.d.ts.map +1 -0
  63. package/dist/mcp-server/server.js +62 -0
  64. package/dist/mcp-server/server.js.map +1 -0
  65. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +42 -0
  66. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +1 -0
  67. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +70 -0
  68. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +1 -0
  69. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +109 -0
  70. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +1 -0
  71. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +209 -0
  72. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +1 -0
  73. package/dist/mcp-server/tasks/core/taskManager.d.ts +103 -0
  74. package/dist/mcp-server/tasks/core/taskManager.d.ts.map +1 -0
  75. package/dist/mcp-server/tasks/core/taskManager.js +144 -0
  76. package/dist/mcp-server/tasks/core/taskManager.js.map +1 -0
  77. package/dist/mcp-server/tasks/core/taskTypes.d.ts +11 -0
  78. package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +1 -0
  79. package/dist/mcp-server/tasks/core/taskTypes.js +13 -0
  80. package/dist/mcp-server/tasks/core/taskTypes.js.map +1 -0
  81. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +108 -0
  82. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +1 -0
  83. package/dist/mcp-server/tasks/utils/taskToolDefinition.js +14 -0
  84. package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +1 -0
  85. package/dist/mcp-server/tools/tool-registration.d.ts +49 -0
  86. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -0
  87. package/dist/mcp-server/tools/tool-registration.js +269 -0
  88. package/dist/mcp-server/tools/tool-registration.js.map +1 -0
  89. package/dist/mcp-server/tools/utils/newToolDefinition.d.ts +73 -0
  90. package/dist/mcp-server/tools/utils/newToolDefinition.d.ts.map +1 -0
  91. package/dist/mcp-server/tools/utils/newToolDefinition.js +45 -0
  92. package/dist/mcp-server/tools/utils/newToolDefinition.js.map +1 -0
  93. package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts +33 -0
  94. package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts.map +1 -0
  95. package/dist/mcp-server/tools/utils/newToolHandlerFactory.js +107 -0
  96. package/dist/mcp-server/tools/utils/newToolHandlerFactory.js.map +1 -0
  97. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +118 -0
  98. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -0
  99. package/dist/mcp-server/tools/utils/toolDefinition.js +2 -0
  100. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -0
  101. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +34 -0
  102. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -0
  103. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +68 -0
  104. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -0
  105. package/dist/mcp-server/transports/ITransport.d.ts +15 -0
  106. package/dist/mcp-server/transports/ITransport.d.ts.map +1 -0
  107. package/dist/mcp-server/transports/ITransport.js +2 -0
  108. package/dist/mcp-server/transports/ITransport.js.map +1 -0
  109. package/dist/mcp-server/transports/auth/authFactory.d.ts +11 -0
  110. package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
  111. package/dist/mcp-server/transports/auth/authFactory.js +43 -0
  112. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
  113. package/dist/mcp-server/transports/auth/authMiddleware.d.ts +24 -0
  114. package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
  115. package/dist/mcp-server/transports/auth/authMiddleware.js +69 -0
  116. package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
  117. package/dist/mcp-server/transports/auth/lib/authContext.d.ts +34 -0
  118. package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
  119. package/dist/mcp-server/transports/auth/lib/authContext.js +25 -0
  120. package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
  121. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +19 -0
  122. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
  123. package/dist/mcp-server/transports/auth/lib/authTypes.js +2 -0
  124. package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
  125. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +18 -0
  126. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
  127. package/dist/mcp-server/transports/auth/lib/authUtils.js +64 -0
  128. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
  129. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts +25 -0
  130. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts.map +1 -0
  131. package/dist/mcp-server/transports/auth/lib/checkScopes.js +34 -0
  132. package/dist/mcp-server/transports/auth/lib/checkScopes.js.map +1 -0
  133. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts +34 -0
  134. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts.map +1 -0
  135. package/dist/mcp-server/transports/auth/lib/claimParser.js +58 -0
  136. package/dist/mcp-server/transports/auth/lib/claimParser.js.map +1 -0
  137. package/dist/mcp-server/transports/auth/lib/withAuth.d.ts +25 -0
  138. package/dist/mcp-server/transports/auth/lib/withAuth.d.ts.map +1 -0
  139. package/dist/mcp-server/transports/auth/lib/withAuth.js +30 -0
  140. package/dist/mcp-server/transports/auth/lib/withAuth.js.map +1 -0
  141. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +18 -0
  142. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
  143. package/dist/mcp-server/transports/auth/strategies/authStrategy.js +2 -0
  144. package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
  145. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +14 -0
  146. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
  147. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +86 -0
  148. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
  149. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +14 -0
  150. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
  151. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +113 -0
  152. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
  153. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +25 -0
  154. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
  155. package/dist/mcp-server/transports/http/httpErrorHandler.js +112 -0
  156. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
  157. package/dist/mcp-server/transports/http/httpTransport.d.ts +47 -0
  158. package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
  159. package/dist/mcp-server/transports/http/httpTransport.js +396 -0
  160. package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
  161. package/dist/mcp-server/transports/http/httpTypes.d.ts +17 -0
  162. package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
  163. package/dist/mcp-server/transports/http/httpTypes.js +2 -0
  164. package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
  165. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts +21 -0
  166. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -0
  167. package/dist/mcp-server/transports/http/protectedResourceMetadata.js +44 -0
  168. package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -0
  169. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts +33 -0
  170. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts.map +1 -0
  171. package/dist/mcp-server/transports/http/sessionIdUtils.js +54 -0
  172. package/dist/mcp-server/transports/http/sessionIdUtils.js.map +1 -0
  173. package/dist/mcp-server/transports/http/sessionStore.d.ts +87 -0
  174. package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -0
  175. package/dist/mcp-server/transports/http/sessionStore.js +209 -0
  176. package/dist/mcp-server/transports/http/sessionStore.js.map +1 -0
  177. package/dist/mcp-server/transports/manager.d.ts +22 -0
  178. package/dist/mcp-server/transports/manager.d.ts.map +1 -0
  179. package/dist/mcp-server/transports/manager.js +62 -0
  180. package/dist/mcp-server/transports/manager.js.map +1 -0
  181. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +44 -0
  182. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
  183. package/dist/mcp-server/transports/stdio/stdioTransport.js +63 -0
  184. package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
  185. package/dist/services/graph/core/GraphService.d.ts +205 -0
  186. package/dist/services/graph/core/GraphService.d.ts.map +1 -0
  187. package/dist/services/graph/core/GraphService.js +231 -0
  188. package/dist/services/graph/core/GraphService.js.map +1 -0
  189. package/dist/services/graph/core/IGraphProvider.d.ts +295 -0
  190. package/dist/services/graph/core/IGraphProvider.d.ts.map +1 -0
  191. package/dist/services/graph/core/IGraphProvider.js +8 -0
  192. package/dist/services/graph/core/IGraphProvider.js.map +1 -0
  193. package/dist/services/graph/types.d.ts +107 -0
  194. package/dist/services/graph/types.d.ts.map +1 -0
  195. package/dist/services/graph/types.js +8 -0
  196. package/dist/services/graph/types.js.map +1 -0
  197. package/dist/services/llm/core/ILlmProvider.d.ts +86 -0
  198. package/dist/services/llm/core/ILlmProvider.d.ts.map +1 -0
  199. package/dist/services/llm/core/ILlmProvider.js +2 -0
  200. package/dist/services/llm/core/ILlmProvider.js.map +1 -0
  201. package/dist/services/llm/providers/openrouter.provider.d.ts +187 -0
  202. package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -0
  203. package/dist/services/llm/providers/openrouter.provider.js +302 -0
  204. package/dist/services/llm/providers/openrouter.provider.js.map +1 -0
  205. package/dist/services/llm/types.d.ts +16 -0
  206. package/dist/services/llm/types.d.ts.map +1 -0
  207. package/dist/services/llm/types.js +9 -0
  208. package/dist/services/llm/types.js.map +1 -0
  209. package/dist/services/speech/core/ISpeechProvider.d.ts +92 -0
  210. package/dist/services/speech/core/ISpeechProvider.d.ts.map +1 -0
  211. package/dist/services/speech/core/ISpeechProvider.js +34 -0
  212. package/dist/services/speech/core/ISpeechProvider.js.map +1 -0
  213. package/dist/services/speech/core/SpeechService.d.ts +87 -0
  214. package/dist/services/speech/core/SpeechService.d.ts.map +1 -0
  215. package/dist/services/speech/core/SpeechService.js +135 -0
  216. package/dist/services/speech/core/SpeechService.js.map +1 -0
  217. package/dist/services/speech/providers/elevenlabs.provider.d.ts +77 -0
  218. package/dist/services/speech/providers/elevenlabs.provider.d.ts.map +1 -0
  219. package/dist/services/speech/providers/elevenlabs.provider.js +199 -0
  220. package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -0
  221. package/dist/services/speech/providers/whisper.provider.d.ts +94 -0
  222. package/dist/services/speech/providers/whisper.provider.d.ts.map +1 -0
  223. package/dist/services/speech/providers/whisper.provider.js +240 -0
  224. package/dist/services/speech/providers/whisper.provider.js.map +1 -0
  225. package/dist/services/speech/types.d.ts +173 -0
  226. package/dist/services/speech/types.d.ts.map +1 -0
  227. package/dist/services/speech/types.js +8 -0
  228. package/dist/services/speech/types.js.map +1 -0
  229. package/dist/storage/core/IStorageProvider.d.ts +159 -0
  230. package/dist/storage/core/IStorageProvider.d.ts.map +1 -0
  231. package/dist/storage/core/IStorageProvider.js +2 -0
  232. package/dist/storage/core/IStorageProvider.js.map +1 -0
  233. package/dist/storage/core/StorageService.d.ts +22 -0
  234. package/dist/storage/core/StorageService.d.ts.map +1 -0
  235. package/dist/storage/core/StorageService.js +151 -0
  236. package/dist/storage/core/StorageService.js.map +1 -0
  237. package/dist/storage/core/storageFactory.d.ts +66 -0
  238. package/dist/storage/core/storageFactory.d.ts.map +1 -0
  239. package/dist/storage/core/storageFactory.js +122 -0
  240. package/dist/storage/core/storageFactory.js.map +1 -0
  241. package/dist/storage/core/storageValidation.d.ts +77 -0
  242. package/dist/storage/core/storageValidation.d.ts.map +1 -0
  243. package/dist/storage/core/storageValidation.js +303 -0
  244. package/dist/storage/core/storageValidation.js.map +1 -0
  245. package/dist/storage/providers/cloudflare/d1Provider.d.ts +94 -0
  246. package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -0
  247. package/dist/storage/providers/cloudflare/d1Provider.js +347 -0
  248. package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -0
  249. package/dist/storage/providers/cloudflare/kvProvider.d.ts +21 -0
  250. package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -0
  251. package/dist/storage/providers/cloudflare/kvProvider.js +183 -0
  252. package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -0
  253. package/dist/storage/providers/cloudflare/r2Provider.d.ts +28 -0
  254. package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -0
  255. package/dist/storage/providers/cloudflare/r2Provider.js +222 -0
  256. package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -0
  257. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts +20 -0
  258. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts.map +1 -0
  259. package/dist/storage/providers/fileSystem/fileSystemProvider.js +282 -0
  260. package/dist/storage/providers/fileSystem/fileSystemProvider.js.map +1 -0
  261. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +21 -0
  262. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -0
  263. package/dist/storage/providers/inMemory/inMemoryProvider.js +139 -0
  264. package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -0
  265. package/dist/storage/providers/supabase/supabase.types.d.ts +49 -0
  266. package/dist/storage/providers/supabase/supabase.types.d.ts.map +1 -0
  267. package/dist/storage/providers/supabase/supabase.types.js +8 -0
  268. package/dist/storage/providers/supabase/supabase.types.js.map +1 -0
  269. package/dist/storage/providers/supabase/supabaseProvider.d.ts +24 -0
  270. package/dist/storage/providers/supabase/supabaseProvider.d.ts.map +1 -0
  271. package/dist/storage/providers/supabase/supabaseProvider.js +209 -0
  272. package/dist/storage/providers/supabase/supabaseProvider.js.map +1 -0
  273. package/dist/testing/index.d.ts +53 -0
  274. package/dist/testing/index.d.ts.map +1 -0
  275. package/dist/testing/index.js +132 -0
  276. package/dist/testing/index.js.map +1 -0
  277. package/dist/types-global/errors.d.ts +83 -0
  278. package/dist/types-global/errors.d.ts.map +1 -0
  279. package/dist/types-global/errors.js +113 -0
  280. package/dist/types-global/errors.js.map +1 -0
  281. package/dist/utils/formatting/diffFormatter.d.ts +227 -0
  282. package/dist/utils/formatting/diffFormatter.d.ts.map +1 -0
  283. package/dist/utils/formatting/diffFormatter.js +369 -0
  284. package/dist/utils/formatting/diffFormatter.js.map +1 -0
  285. package/dist/utils/formatting/index.d.ts +9 -0
  286. package/dist/utils/formatting/index.d.ts.map +1 -0
  287. package/dist/utils/formatting/index.js +9 -0
  288. package/dist/utils/formatting/index.js.map +1 -0
  289. package/dist/utils/formatting/markdownBuilder.d.ts +543 -0
  290. package/dist/utils/formatting/markdownBuilder.d.ts.map +1 -0
  291. package/dist/utils/formatting/markdownBuilder.js +674 -0
  292. package/dist/utils/formatting/markdownBuilder.js.map +1 -0
  293. package/dist/utils/formatting/tableFormatter.d.ts +261 -0
  294. package/dist/utils/formatting/tableFormatter.d.ts.map +1 -0
  295. package/dist/utils/formatting/tableFormatter.js +456 -0
  296. package/dist/utils/formatting/tableFormatter.js.map +1 -0
  297. package/dist/utils/formatting/treeFormatter.d.ts +344 -0
  298. package/dist/utils/formatting/treeFormatter.d.ts.map +1 -0
  299. package/dist/utils/formatting/treeFormatter.js +400 -0
  300. package/dist/utils/formatting/treeFormatter.js.map +1 -0
  301. package/dist/utils/internal/encoding.d.ts +42 -0
  302. package/dist/utils/internal/encoding.d.ts.map +1 -0
  303. package/dist/utils/internal/encoding.js +87 -0
  304. package/dist/utils/internal/encoding.js.map +1 -0
  305. package/dist/utils/internal/error-handler/errorHandler.d.ts +140 -0
  306. package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -0
  307. package/dist/utils/internal/error-handler/errorHandler.js +318 -0
  308. package/dist/utils/internal/error-handler/errorHandler.js.map +1 -0
  309. package/dist/utils/internal/error-handler/helpers.d.ts +98 -0
  310. package/dist/utils/internal/error-handler/helpers.d.ts.map +1 -0
  311. package/dist/utils/internal/error-handler/helpers.js +214 -0
  312. package/dist/utils/internal/error-handler/helpers.js.map +1 -0
  313. package/dist/utils/internal/error-handler/mappings.d.ts +85 -0
  314. package/dist/utils/internal/error-handler/mappings.d.ts.map +1 -0
  315. package/dist/utils/internal/error-handler/mappings.js +234 -0
  316. package/dist/utils/internal/error-handler/mappings.js.map +1 -0
  317. package/dist/utils/internal/error-handler/types.d.ts +160 -0
  318. package/dist/utils/internal/error-handler/types.d.ts.map +1 -0
  319. package/dist/utils/internal/error-handler/types.js +6 -0
  320. package/dist/utils/internal/error-handler/types.js.map +1 -0
  321. package/dist/utils/internal/health.d.ts +60 -0
  322. package/dist/utils/internal/health.d.ts.map +1 -0
  323. package/dist/utils/internal/health.js +46 -0
  324. package/dist/utils/internal/health.js.map +1 -0
  325. package/dist/utils/internal/logger.d.ts +300 -0
  326. package/dist/utils/internal/logger.d.ts.map +1 -0
  327. package/dist/utils/internal/logger.js +573 -0
  328. package/dist/utils/internal/logger.js.map +1 -0
  329. package/dist/utils/internal/performance.d.ts +78 -0
  330. package/dist/utils/internal/performance.d.ts.map +1 -0
  331. package/dist/utils/internal/performance.js +227 -0
  332. package/dist/utils/internal/performance.js.map +1 -0
  333. package/dist/utils/internal/requestContext.d.ts +200 -0
  334. package/dist/utils/internal/requestContext.d.ts.map +1 -0
  335. package/dist/utils/internal/requestContext.js +163 -0
  336. package/dist/utils/internal/requestContext.js.map +1 -0
  337. package/dist/utils/internal/runtime.d.ts +49 -0
  338. package/dist/utils/internal/runtime.d.ts.map +1 -0
  339. package/dist/utils/internal/runtime.js +90 -0
  340. package/dist/utils/internal/runtime.js.map +1 -0
  341. package/dist/utils/internal/startupBanner.d.ts +23 -0
  342. package/dist/utils/internal/startupBanner.d.ts.map +1 -0
  343. package/dist/utils/internal/startupBanner.js +34 -0
  344. package/dist/utils/internal/startupBanner.js.map +1 -0
  345. package/dist/utils/metrics/tokenCounter.d.ts +97 -0
  346. package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
  347. package/dist/utils/metrics/tokenCounter.js +162 -0
  348. package/dist/utils/metrics/tokenCounter.js.map +1 -0
  349. package/dist/utils/network/fetchWithTimeout.d.ts +91 -0
  350. package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
  351. package/dist/utils/network/fetchWithTimeout.js +305 -0
  352. package/dist/utils/network/fetchWithTimeout.js.map +1 -0
  353. package/dist/utils/pagination/pagination.d.ts +157 -0
  354. package/dist/utils/pagination/pagination.d.ts.map +1 -0
  355. package/dist/utils/pagination/pagination.js +191 -0
  356. package/dist/utils/pagination/pagination.js.map +1 -0
  357. package/dist/utils/parsing/csvParser.d.ts +84 -0
  358. package/dist/utils/parsing/csvParser.d.ts.map +1 -0
  359. package/dist/utils/parsing/csvParser.js +132 -0
  360. package/dist/utils/parsing/csvParser.js.map +1 -0
  361. package/dist/utils/parsing/dateParser.d.ts +103 -0
  362. package/dist/utils/parsing/dateParser.d.ts.map +1 -0
  363. package/dist/utils/parsing/dateParser.js +142 -0
  364. package/dist/utils/parsing/dateParser.js.map +1 -0
  365. package/dist/utils/parsing/frontmatterParser.d.ts +91 -0
  366. package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -0
  367. package/dist/utils/parsing/frontmatterParser.js +163 -0
  368. package/dist/utils/parsing/frontmatterParser.js.map +1 -0
  369. package/dist/utils/parsing/index.d.ts +15 -0
  370. package/dist/utils/parsing/index.d.ts.map +1 -0
  371. package/dist/utils/parsing/index.js +15 -0
  372. package/dist/utils/parsing/index.js.map +1 -0
  373. package/dist/utils/parsing/jsonParser.d.ts +115 -0
  374. package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
  375. package/dist/utils/parsing/jsonParser.js +177 -0
  376. package/dist/utils/parsing/jsonParser.js.map +1 -0
  377. package/dist/utils/parsing/pdfParser.d.ts +563 -0
  378. package/dist/utils/parsing/pdfParser.d.ts.map +1 -0
  379. package/dist/utils/parsing/pdfParser.js +775 -0
  380. package/dist/utils/parsing/pdfParser.js.map +1 -0
  381. package/dist/utils/parsing/thinkBlock.d.ts +31 -0
  382. package/dist/utils/parsing/thinkBlock.d.ts.map +1 -0
  383. package/dist/utils/parsing/thinkBlock.js +31 -0
  384. package/dist/utils/parsing/thinkBlock.js.map +1 -0
  385. package/dist/utils/parsing/xmlParser.d.ts +69 -0
  386. package/dist/utils/parsing/xmlParser.d.ts.map +1 -0
  387. package/dist/utils/parsing/xmlParser.js +140 -0
  388. package/dist/utils/parsing/xmlParser.js.map +1 -0
  389. package/dist/utils/parsing/yamlParser.d.ts +64 -0
  390. package/dist/utils/parsing/yamlParser.d.ts.map +1 -0
  391. package/dist/utils/parsing/yamlParser.js +129 -0
  392. package/dist/utils/parsing/yamlParser.js.map +1 -0
  393. package/dist/utils/scheduling/scheduler.d.ts +174 -0
  394. package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
  395. package/dist/utils/scheduling/scheduler.js +248 -0
  396. package/dist/utils/scheduling/scheduler.js.map +1 -0
  397. package/dist/utils/security/idGenerator.d.ts +189 -0
  398. package/dist/utils/security/idGenerator.d.ts.map +1 -0
  399. package/dist/utils/security/idGenerator.js +301 -0
  400. package/dist/utils/security/idGenerator.js.map +1 -0
  401. package/dist/utils/security/index.d.ts +8 -0
  402. package/dist/utils/security/index.d.ts.map +1 -0
  403. package/dist/utils/security/index.js +8 -0
  404. package/dist/utils/security/index.js.map +1 -0
  405. package/dist/utils/security/rateLimiter.d.ts +171 -0
  406. package/dist/utils/security/rateLimiter.d.ts.map +1 -0
  407. package/dist/utils/security/rateLimiter.js +294 -0
  408. package/dist/utils/security/rateLimiter.js.map +1 -0
  409. package/dist/utils/security/sanitization.d.ts +430 -0
  410. package/dist/utils/security/sanitization.d.ts.map +1 -0
  411. package/dist/utils/security/sanitization.js +759 -0
  412. package/dist/utils/security/sanitization.js.map +1 -0
  413. package/dist/utils/telemetry/index.d.ts +12 -0
  414. package/dist/utils/telemetry/index.d.ts.map +1 -0
  415. package/dist/utils/telemetry/index.js +12 -0
  416. package/dist/utils/telemetry/index.js.map +1 -0
  417. package/dist/utils/telemetry/instrumentation.d.ts +62 -0
  418. package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
  419. package/dist/utils/telemetry/instrumentation.js +223 -0
  420. package/dist/utils/telemetry/instrumentation.js.map +1 -0
  421. package/dist/utils/telemetry/metrics.d.ts +170 -0
  422. package/dist/utils/telemetry/metrics.d.ts.map +1 -0
  423. package/dist/utils/telemetry/metrics.js +205 -0
  424. package/dist/utils/telemetry/metrics.js.map +1 -0
  425. package/dist/utils/telemetry/semconv.d.ts +147 -0
  426. package/dist/utils/telemetry/semconv.d.ts.map +1 -0
  427. package/dist/utils/telemetry/semconv.js +159 -0
  428. package/dist/utils/telemetry/semconv.js.map +1 -0
  429. package/dist/utils/telemetry/trace.d.ts +141 -0
  430. package/dist/utils/telemetry/trace.d.ts.map +1 -0
  431. package/dist/utils/telemetry/trace.js +193 -0
  432. package/dist/utils/telemetry/trace.js.map +1 -0
  433. package/dist/utils/types/guards.d.ts +209 -0
  434. package/dist/utils/types/guards.d.ts.map +1 -0
  435. package/dist/utils/types/guards.js +229 -0
  436. package/dist/utils/types/guards.js.map +1 -0
  437. package/dist/utils/types/index.d.ts +6 -0
  438. package/dist/utils/types/index.d.ts.map +1 -0
  439. package/dist/utils/types/index.js +6 -0
  440. package/dist/utils/types/index.js.map +1 -0
  441. package/dist/worker.d.ts +59 -0
  442. package/dist/worker.d.ts.map +1 -0
  443. package/dist/worker.js +216 -0
  444. package/dist/worker.js.map +1 -0
  445. package/package.json +377 -0
  446. package/skills/README.md +38 -0
  447. package/skills/add-export/SKILL.md +49 -0
  448. package/skills/add-prompt/SKILL.md +97 -0
  449. package/skills/add-provider/SKILL.md +53 -0
  450. package/skills/add-resource/SKILL.md +107 -0
  451. package/skills/add-service/SKILL.md +113 -0
  452. package/skills/add-tool/SKILL.md +110 -0
  453. package/skills/api-auth/SKILL.md +173 -0
  454. package/skills/api-config/SKILL.md +68 -0
  455. package/skills/api-context/SKILL.md +321 -0
  456. package/skills/api-errors/SKILL.md +146 -0
  457. package/skills/api-services/SKILL.md +24 -0
  458. package/skills/api-services/references/graph.md +124 -0
  459. package/skills/api-services/references/llm.md +46 -0
  460. package/skills/api-services/references/speech.md +72 -0
  461. package/skills/api-testing/SKILL.md +263 -0
  462. package/skills/api-utils/SKILL.md +106 -0
  463. package/skills/api-utils/references/formatting.md +237 -0
  464. package/skills/api-utils/references/parsing.md +263 -0
  465. package/skills/api-utils/references/security.md +226 -0
  466. package/skills/api-workers/SKILL.md +165 -0
  467. package/skills/devcheck/SKILL.md +31 -0
  468. package/skills/maintenance/SKILL.md +52 -0
  469. package/skills/migrate-mcp-ts-template/SKILL.md +131 -0
  470. package/skills/release/SKILL.md +67 -0
  471. package/skills/setup/SKILL.md +89 -0
  472. package/skills/walkthrough-init/SKILL.md +50 -0
  473. package/templates/.env.example +17 -0
  474. package/templates/AGENTS.md +113 -0
  475. package/templates/CLAUDE.md +113 -0
  476. package/templates/_tsconfig.json +33 -0
  477. package/templates/biome.template.json +43 -0
  478. package/templates/package.json +26 -0
  479. package/templates/src/index.ts +16 -0
  480. package/templates/src/mcp-server/prompts/definitions/echo.prompt.ts +19 -0
  481. package/templates/src/mcp-server/resources/definitions/echo.resource.ts +30 -0
  482. package/templates/src/mcp-server/tools/definitions/echo.tool.ts +24 -0
  483. package/templates/vitest.config.ts +12 -0
  484. package/tsconfig.base.json +44 -0
  485. package/vitest.config.base.ts +38 -0
@@ -0,0 +1,573 @@
1
+ import pino from 'pino';
2
+ import { config } from '../../config/index.js';
3
+ import { requestContextService } from '../../utils/internal/requestContext.js';
4
+ const mcpToPinoLevel = {
5
+ emerg: 'fatal',
6
+ alert: 'fatal',
7
+ crit: 'error',
8
+ error: 'error',
9
+ warning: 'warn',
10
+ notice: 'info',
11
+ info: 'info',
12
+ debug: 'debug',
13
+ };
14
+ const pinoToMcpLevelSeverity = {
15
+ fatal: 0,
16
+ error: 2,
17
+ warn: 4,
18
+ info: 6,
19
+ debug: 7,
20
+ };
21
+ const isServerless = typeof process === 'undefined' || process.env.IS_SERVERLESS === 'true';
22
+ /** Pino redact paths for sensitive fields (top-level, one-deep, two-deep). */
23
+ const SENSITIVE_PINO_FIELDS = [
24
+ 'password',
25
+ 'token',
26
+ 'secret',
27
+ 'apiKey',
28
+ 'credential',
29
+ 'jwt',
30
+ 'ssn',
31
+ 'cvv',
32
+ 'authorization',
33
+ 'cookie',
34
+ 'clientsecret',
35
+ 'client_secret',
36
+ 'private_key',
37
+ 'privatekey',
38
+ ].flatMap((field) => [field, `*.${field}`, `*.*.${field}`]);
39
+ /**
40
+ * Singleton structured logger backed by Pino with RFC 5424 level semantics.
41
+ *
42
+ * Features:
43
+ * - Environment-adaptive output: pretty-printed (pino-pretty) in HTTP development mode,
44
+ * JSON to stderr in stdio/production mode (MCP spec requires clean stdout).
45
+ * - Optional file sinks: `combined.log` at the configured log level, `error.log` for
46
+ * errors and above, and `interactions.log` for structured interaction records.
47
+ * - Sensitive field redaction via Pino's `redact` option.
48
+ * - Per-message rate limiting to suppress log storms; suppressed counts are flushed
49
+ * at the end of each rate-limit window.
50
+ * - OpenTelemetry trace context is auto-injected via {@link RequestContext} fields.
51
+ * - Serverless-safe: when `IS_SERVERLESS=true` or `process` is unavailable, falls
52
+ * back to minimal Pino config without file transports or Node.js APIs.
53
+ *
54
+ * Obtain the singleton via {@link logger} or `Logger.getInstance()`.
55
+ */
56
+ export class Logger {
57
+ static instance = new Logger();
58
+ pinoLogger;
59
+ interactionLogger;
60
+ initialized = false;
61
+ currentMcpLevel = 'info';
62
+ transportType;
63
+ rateLimitThreshold = 10;
64
+ rateLimitWindow = 60000;
65
+ messageCounts = new Map();
66
+ suppressedMessages = new Map();
67
+ cleanupTimer;
68
+ constructor() {
69
+ // The constructor is now safe to call in a global scope.
70
+ }
71
+ /**
72
+ * Returns the singleton `Logger` instance.
73
+ *
74
+ * Prefer importing the pre-resolved {@link logger} export rather than calling this directly.
75
+ *
76
+ * @returns The singleton `Logger` instance.
77
+ * @example
78
+ * ```ts
79
+ * import { Logger } from '../../utils/internal/logger.js';
80
+ * const log = Logger.getInstance();
81
+ * ```
82
+ */
83
+ static getInstance() {
84
+ return Logger.instance;
85
+ }
86
+ async createPinoLogger(level, transportType) {
87
+ const pinoLevel = mcpToPinoLevel[level] ?? 'info';
88
+ const pinoOptions = {
89
+ level: pinoLevel,
90
+ base: {
91
+ env: config.environment,
92
+ version: config.mcpServerVersion,
93
+ pid: !isServerless ? process.pid : undefined,
94
+ },
95
+ redact: {
96
+ paths: SENSITIVE_PINO_FIELDS,
97
+ censor: '[REDACTED]',
98
+ },
99
+ };
100
+ if (isServerless) {
101
+ return pino(pinoOptions);
102
+ }
103
+ // Node.js specific transports
104
+ const { default: fs } = await import('node:fs');
105
+ const { default: path } = await import('node:path');
106
+ const transports = [];
107
+ const isDevelopment = config.environment === 'development';
108
+ const isTest = config.environment === 'testing';
109
+ // CRITICAL: STDIO transport MUST NOT output colored logs to stdout.
110
+ // The MCP specification requires clean JSON-RPC on stdout with no ANSI codes.
111
+ // Only use pretty/colored output for HTTP mode or when explicitly debugging.
112
+ // Respect NO_COLOR environment variable (https://no-color.org/)
113
+ const noColorEnv = process.env.NO_COLOR === '1' || process.env.FORCE_COLOR === '0';
114
+ const useColoredOutput = isDevelopment && transportType !== 'stdio' && !noColorEnv;
115
+ if (useColoredOutput && !isServerless) {
116
+ // Try to resolve 'pino-pretty' robustly even when bundled (e.g., Bun/ESM),
117
+ // falling back to JSON stdout if resolution fails.
118
+ try {
119
+ const { createRequire } = await import('node:module');
120
+ const require = createRequire(import.meta.url);
121
+ const prettyTarget = require.resolve('pino-pretty');
122
+ transports.push({
123
+ target: prettyTarget,
124
+ options: { colorize: true, translateTime: 'yyyy-mm-dd HH:MM:ss' },
125
+ });
126
+ }
127
+ catch (err) {
128
+ // Only log to console if TTY to avoid polluting stderr in STDIO mode
129
+ if (process.stderr?.isTTY) {
130
+ console.warn(`[Logger Init] Pretty transport unavailable (${err instanceof Error ? err.message : String(err)}); falling back to stdout JSON.`);
131
+ }
132
+ transports.push({ target: 'pino/file', options: { destination: 1 } });
133
+ }
134
+ }
135
+ else if (!isTest) {
136
+ // CRITICAL: For STDIO transport, logs MUST go to stderr (fd 2), NOT stdout (fd 1).
137
+ // The MCP specification requires only JSON-RPC messages on stdout.
138
+ // For HTTP transport or production, we also use stderr to avoid polluting stdout.
139
+ transports.push({ target: 'pino/file', options: { destination: 2 } });
140
+ }
141
+ if (config.logsPath) {
142
+ try {
143
+ if (!fs.existsSync(config.logsPath)) {
144
+ fs.mkdirSync(config.logsPath, { recursive: true });
145
+ }
146
+ transports.push({
147
+ level: pinoLevel,
148
+ target: 'pino/file',
149
+ options: {
150
+ destination: path.join(config.logsPath, 'combined.log'),
151
+ mkdir: true,
152
+ },
153
+ });
154
+ transports.push({
155
+ level: 'error',
156
+ target: 'pino/file',
157
+ options: {
158
+ destination: path.join(config.logsPath, 'error.log'),
159
+ mkdir: true,
160
+ },
161
+ });
162
+ }
163
+ catch (err) {
164
+ // Only log to console if TTY to avoid polluting stderr in STDIO mode
165
+ if (process.stderr?.isTTY) {
166
+ console.error(`[Logger Init] Failed to configure file logging: ${err instanceof Error ? err.message : String(err)}`);
167
+ }
168
+ }
169
+ }
170
+ return pino({ ...pinoOptions, transport: { targets: transports } });
171
+ }
172
+ async createInteractionLogger() {
173
+ if (isServerless || !config.logsPath)
174
+ return;
175
+ const { default: path } = await import('node:path');
176
+ return pino({
177
+ redact: {
178
+ paths: SENSITIVE_PINO_FIELDS,
179
+ censor: '[REDACTED]',
180
+ },
181
+ transport: {
182
+ target: 'pino/file',
183
+ options: {
184
+ destination: path.join(config.logsPath, 'interactions.log'),
185
+ mkdir: true,
186
+ },
187
+ },
188
+ });
189
+ }
190
+ /**
191
+ * Initializes the logger, constructing Pino transports appropriate for the environment.
192
+ *
193
+ * Must be called once at server startup before any log methods are used. Subsequent calls
194
+ * are no-ops (a warning is emitted instead). After initialization, a startup `info` entry
195
+ * is written confirming the active level.
196
+ *
197
+ * @param level - MCP log level to apply. Defaults to `'info'`.
198
+ * @param transportType - Active transport (`'stdio'` or `'http'`). Determines whether
199
+ * colored pretty-print output is enabled. In `'stdio'` mode, logs are always written
200
+ * to stderr (fd 2) to preserve stdout for MCP JSON-RPC.
201
+ * @returns Promise that resolves when Pino transports and file sinks are ready.
202
+ * @example
203
+ * ```ts
204
+ * await logger.initialize('debug', 'http');
205
+ * ```
206
+ */
207
+ async initialize(level = 'info', transportType) {
208
+ if (this.initialized) {
209
+ this.warning('Logger already initialized.', requestContextService.createRequestContext({
210
+ operation: 'loggerReinit',
211
+ }));
212
+ return;
213
+ }
214
+ this.currentMcpLevel = level;
215
+ this.transportType = transportType;
216
+ this.pinoLogger = await this.createPinoLogger(level, transportType);
217
+ this.interactionLogger = await this.createInteractionLogger();
218
+ // Start the cleanup timer only after initialization and only in Node.js
219
+ if (!isServerless && !this.cleanupTimer) {
220
+ this.cleanupTimer = setInterval(() => this.flushSuppressedMessages(), this.rateLimitWindow);
221
+ this.cleanupTimer.unref?.();
222
+ }
223
+ this.initialized = true;
224
+ this.info(`Logger initialized. MCP level: ${level}.`, requestContextService.createRequestContext({ operation: 'loggerInit' }));
225
+ }
226
+ /**
227
+ * Changes the active log level at runtime without restarting transports.
228
+ *
229
+ * Has no effect if the logger has not been initialized; a console error is emitted
230
+ * to stderr when running in a TTY. After the level is updated, an `info` entry is
231
+ * written to confirm the change.
232
+ *
233
+ * @param newLevel - The new MCP log level to apply.
234
+ * @example
235
+ * ```ts
236
+ * logger.setLevel('debug');
237
+ * ```
238
+ */
239
+ setLevel(newLevel) {
240
+ if (!this.pinoLogger || !this.initialized) {
241
+ // Only log to console if TTY to avoid polluting stderr in STDIO mode
242
+ if (process.stderr?.isTTY) {
243
+ console.error('Cannot set level: Logger not initialized.');
244
+ }
245
+ return;
246
+ }
247
+ this.currentMcpLevel = newLevel;
248
+ this.pinoLogger.level = mcpToPinoLevel[newLevel] ?? 'info';
249
+ this.info(`Log level changed to ${newLevel}.`, requestContextService.createRequestContext({
250
+ operation: 'loggerSetLevel',
251
+ }));
252
+ }
253
+ /**
254
+ * Implements the `AsyncDisposable` protocol (`await using logger`).
255
+ *
256
+ * Delegates to {@link close}. Allows the logger to be used with `await using` in
257
+ * TypeScript 5.2+ explicit resource management contexts.
258
+ *
259
+ * @returns Promise that resolves when all transports have been flushed and closed.
260
+ */
261
+ async [Symbol.asyncDispose]() {
262
+ return await this.close();
263
+ }
264
+ /**
265
+ * Flushes all pending log entries and shuts down transports gracefully.
266
+ *
267
+ * Clears the rate-limit cleanup timer, flushes any suppressed message counts,
268
+ * and waits for both the main Pino logger and the interaction logger to drain
269
+ * before resolving. Safe to call multiple times — subsequent calls on an
270
+ * already-closed logger resolve immediately.
271
+ *
272
+ * @returns Promise that resolves when all writes have completed.
273
+ * @example
274
+ * ```ts
275
+ * process.on('SIGTERM', () => logger.close());
276
+ * ```
277
+ */
278
+ async close() {
279
+ if (!this.initialized)
280
+ return Promise.resolve();
281
+ this.info('Logger shutting down.', requestContextService.createRequestContext({ operation: 'loggerClose' }));
282
+ if (this.cleanupTimer)
283
+ clearInterval(this.cleanupTimer);
284
+ this.flushSuppressedMessages();
285
+ // Wait for all pending writes to complete
286
+ const flushPino = (pinoInstance, label) => {
287
+ const { promise, resolve } = Promise.withResolvers();
288
+ if (pinoInstance != null) {
289
+ pinoInstance.flush((err) => {
290
+ // Only log to console if TTY AND not in STDIO mode
291
+ // In STDIO mode, stdout is reserved for MCP JSON-RPC, so avoid polluting stderr with shutdown noise
292
+ if (err && process.stderr?.isTTY && this.transportType !== 'stdio') {
293
+ console.error(`Error flushing ${label}:`, err);
294
+ }
295
+ resolve();
296
+ });
297
+ }
298
+ else {
299
+ resolve();
300
+ }
301
+ return promise;
302
+ };
303
+ await Promise.all([
304
+ flushPino(this.pinoLogger, 'main logger'),
305
+ flushPino(this.interactionLogger, 'interaction logger'),
306
+ ]);
307
+ this.initialized = false;
308
+ }
309
+ /**
310
+ * Returns whether the logger has been successfully initialized.
311
+ *
312
+ * Use this to guard code that should only run after {@link initialize} has resolved,
313
+ * or to skip logging in contexts where initialization may not have occurred.
314
+ *
315
+ * @returns `true` if {@link initialize} has completed and {@link close} has not yet been called.
316
+ * @example
317
+ * ```ts
318
+ * if (logger.isInitialized()) {
319
+ * logger.info('Server ready', ctx);
320
+ * }
321
+ * ```
322
+ */
323
+ isInitialized() {
324
+ return this.initialized;
325
+ }
326
+ isRateLimited(message) {
327
+ const now = Date.now();
328
+ const entry = this.messageCounts.get(message);
329
+ if (!entry) {
330
+ this.messageCounts.set(message, { count: 1, firstSeen: now });
331
+ return false;
332
+ }
333
+ if (now - entry.firstSeen > this.rateLimitWindow) {
334
+ this.messageCounts.set(message, { count: 1, firstSeen: now });
335
+ return false;
336
+ }
337
+ entry.count++;
338
+ if (entry.count > this.rateLimitThreshold) {
339
+ this.suppressedMessages.set(message, (this.suppressedMessages.get(message) || 0) + 1);
340
+ return true;
341
+ }
342
+ return false;
343
+ }
344
+ flushSuppressedMessages() {
345
+ if (this.suppressedMessages.size === 0)
346
+ return;
347
+ for (const [message, count] of this.suppressedMessages.entries()) {
348
+ this.warning(`Log message suppressed ${count} times due to rate limiting.`, requestContextService.createRequestContext({
349
+ operation: 'loggerRateLimitFlush',
350
+ additionalContext: { originalMessage: message },
351
+ }));
352
+ }
353
+ this.suppressedMessages.clear();
354
+ this.messageCounts.clear();
355
+ }
356
+ log(level, msg, context, error) {
357
+ if (!this.pinoLogger || !this.initialized)
358
+ return;
359
+ const pinoLevel = mcpToPinoLevel[level] ?? 'info';
360
+ const currentPinoLevel = mcpToPinoLevel[this.currentMcpLevel] ?? 'info';
361
+ const levelSeverity = pinoToMcpLevelSeverity[pinoLevel];
362
+ const currentLevelSeverity = pinoToMcpLevelSeverity[currentPinoLevel];
363
+ if (typeof levelSeverity === 'number' &&
364
+ typeof currentLevelSeverity === 'number' &&
365
+ levelSeverity > currentLevelSeverity) {
366
+ return;
367
+ }
368
+ if (this.isRateLimited(msg))
369
+ return;
370
+ const logObject = { ...context };
371
+ if (error)
372
+ logObject.err = pino.stdSerializers.err(error);
373
+ this.pinoLogger[pinoLevel](logObject, msg);
374
+ }
375
+ logWithError(level, msg, errorOrContext, context) {
376
+ const errorObj = errorOrContext instanceof Error ? errorOrContext : undefined;
377
+ const actualContext = errorOrContext instanceof Error ? context : errorOrContext;
378
+ this.log(level, msg, actualContext, errorObj);
379
+ }
380
+ /**
381
+ * Logs a diagnostic message at `debug` severity (RFC 5424 level 7).
382
+ *
383
+ * Suppressed unless the active log level is `'debug'`. Use for verbose tracing,
384
+ * internal state dumps, and low-level request/response details.
385
+ *
386
+ * @param msg - Human-readable log message.
387
+ * @param context - Optional request context providing `requestId`, `traceId`, and related fields.
388
+ * @example
389
+ * ```ts
390
+ * logger.debug('Cache miss', ctx);
391
+ * ```
392
+ */
393
+ debug(msg, context) {
394
+ this.log('debug', msg, context);
395
+ }
396
+ /**
397
+ * Logs an informational message at `info` severity (RFC 5424 level 6).
398
+ *
399
+ * Use for normal operational events: server startup, request completions, configuration loaded.
400
+ *
401
+ * @param msg - Human-readable log message.
402
+ * @param context - Optional request context.
403
+ * @example
404
+ * ```ts
405
+ * logger.info('Server listening on :3000', ctx);
406
+ * ```
407
+ */
408
+ info(msg, context) {
409
+ this.log('info', msg, context);
410
+ }
411
+ /**
412
+ * Logs a notice-level message at `notice` severity (RFC 5424 level 5).
413
+ *
414
+ * Use for significant but non-error conditions: configuration changes, deprecation notices,
415
+ * expected state transitions worth tracking. Maps to pino `info` level internally.
416
+ *
417
+ * @param msg - Human-readable log message.
418
+ * @param context - Optional request context.
419
+ * @example
420
+ * ```ts
421
+ * logger.notice('Feature flag toggled', ctx);
422
+ * ```
423
+ */
424
+ notice(msg, context) {
425
+ this.log('notice', msg, context);
426
+ }
427
+ /**
428
+ * Logs a warning message at `warning` severity (RFC 5424 level 4).
429
+ *
430
+ * Use for recoverable abnormal conditions: deprecated API usage, retried operations,
431
+ * non-fatal misconfigurations. Maps to pino `warn` level internally.
432
+ *
433
+ * @param msg - Human-readable log message.
434
+ * @param context - Optional request context.
435
+ * @example
436
+ * ```ts
437
+ * logger.warning('Rate limit approaching', ctx);
438
+ * ```
439
+ */
440
+ warning(msg, context) {
441
+ this.log('warning', msg, context);
442
+ }
443
+ /**
444
+ * Logs an error-level message at `error` severity (RFC 5424 level 3).
445
+ *
446
+ * Use when an operation fails but the server can continue. The `errorOrContext`
447
+ * parameter accepts either an `Error` (serialized via `pino.stdSerializers.err`) or a
448
+ * `RequestContext` when no error object is available. Maps to pino `error` level.
449
+ *
450
+ * @param msg - Human-readable description of the failure.
451
+ * @param errorOrContext - The `Error` to serialize, or a `RequestContext` if no error object exists.
452
+ * @param context - Request context; required when `errorOrContext` is an `Error`.
453
+ * @example
454
+ * ```ts
455
+ * logger.error('Failed to fetch resource', err, ctx);
456
+ * logger.error('Invalid state encountered', ctx);
457
+ * ```
458
+ */
459
+ error(msg, errorOrContext, context) {
460
+ this.logWithError('error', msg, errorOrContext, context);
461
+ }
462
+ /**
463
+ * Logs a critical error at `crit` severity (RFC 5424 level 2).
464
+ *
465
+ * Use for serious failures that impair a subsystem but do not crash the process —
466
+ * for example, a storage provider going offline. Maps to pino `error` level.
467
+ *
468
+ * @param msg - Human-readable description of the critical condition.
469
+ * @param errorOrContext - The `Error` to serialize, or a `RequestContext` if no error object exists.
470
+ * @param context - Request context; required when `errorOrContext` is an `Error`.
471
+ * @example
472
+ * ```ts
473
+ * logger.crit('Database connection pool exhausted', err, ctx);
474
+ * ```
475
+ */
476
+ crit(msg, errorOrContext, context) {
477
+ this.logWithError('crit', msg, errorOrContext, context);
478
+ }
479
+ /**
480
+ * Logs an alert-level message at `alert` severity (RFC 5424 level 1).
481
+ *
482
+ * Use when immediate human intervention is required — for example, a security breach
483
+ * detected or critical data loss imminent. Maps to pino `fatal` level.
484
+ *
485
+ * @param msg - Human-readable description of the alert condition.
486
+ * @param errorOrContext - The `Error` to serialize, or a `RequestContext` if no error object exists.
487
+ * @param context - Request context; required when `errorOrContext` is an `Error`.
488
+ * @example
489
+ * ```ts
490
+ * logger.alert('Unauthorized admin access detected', err, ctx);
491
+ * ```
492
+ */
493
+ alert(msg, errorOrContext, context) {
494
+ this.logWithError('alert', msg, errorOrContext, context);
495
+ }
496
+ /**
497
+ * Logs an emergency-level message at `emerg` severity (RFC 5424 level 0).
498
+ *
499
+ * Use for conditions that render the system completely unusable — process about to exit,
500
+ * unrecoverable internal state. Maps to pino `fatal` level.
501
+ *
502
+ * @param msg - Human-readable description of the emergency.
503
+ * @param errorOrContext - The `Error` to serialize, or a `RequestContext` if no error object exists.
504
+ * @param context - Request context; required when `errorOrContext` is an `Error`.
505
+ * @example
506
+ * ```ts
507
+ * logger.emerg('Unrecoverable state — shutting down', err, ctx);
508
+ * ```
509
+ */
510
+ emerg(msg, errorOrContext, context) {
511
+ this.logWithError('emerg', msg, errorOrContext, context);
512
+ }
513
+ /**
514
+ * Alias for {@link emerg}. Provided for callers familiar with the pino/winston `fatal` level.
515
+ *
516
+ * Maps to RFC 5424 `emerg` (level 0) and pino `fatal` internally.
517
+ *
518
+ * @param msg - Human-readable description of the fatal condition.
519
+ * @param errorOrContext - The `Error` to serialize, or a `RequestContext` if no error object exists.
520
+ * @param context - Request context; required when `errorOrContext` is an `Error`.
521
+ * @example
522
+ * ```ts
523
+ * logger.fatal('Process terminating due to unhandled exception', err, ctx);
524
+ * ```
525
+ */
526
+ fatal(msg, errorOrContext, context) {
527
+ this.emerg(msg, errorOrContext, context);
528
+ }
529
+ /**
530
+ * Writes a structured interaction record to the dedicated `interactions.log` file sink.
531
+ *
532
+ * Interaction logs capture high-level semantic events (tool invocations, resource reads,
533
+ * prompt renders) as structured JSON, separate from the main operational log stream.
534
+ * This sink is only available when `config.logsPath` is set and the runtime is not serverless;
535
+ * a `warning` is emitted if the logger is called before the sink is ready.
536
+ *
537
+ * @param interactionName - Identifier for the interaction type (e.g., `'tool:my_tool'`).
538
+ * @param data - Arbitrary structured data to include alongside `interactionName` in the log record.
539
+ * @example
540
+ * ```ts
541
+ * logger.logInteraction('tool:echo_message', { requestId: ctx.requestId, input });
542
+ * ```
543
+ */
544
+ logInteraction(interactionName, data) {
545
+ if (!this.interactionLogger) {
546
+ if (!isServerless)
547
+ this.warning('Interaction logger not available.', (data.context || {}));
548
+ return;
549
+ }
550
+ this.interactionLogger.info({ interactionName, ...data });
551
+ }
552
+ }
553
+ /**
554
+ * Pre-resolved singleton logger instance. Import this directly rather than calling
555
+ * `Logger.getInstance()` in most contexts.
556
+ *
557
+ * Must be initialized once at startup via `logger.initialize()` before any log methods
558
+ * will produce output. Log calls made before initialization are silently dropped.
559
+ *
560
+ * @example
561
+ * ```ts
562
+ * import { logger } from '../../utils/internal/logger.js';
563
+ *
564
+ * // At startup:
565
+ * await logger.initialize('debug', 'http');
566
+ *
567
+ * // In application code:
568
+ * logger.info('Request received', ctx);
569
+ * logger.error('Upstream failure', err, ctx);
570
+ * ```
571
+ */
572
+ export const logger = Logger.getInstance();
573
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/internal/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview Performance utility for tool execution with modern observability.
3
+ * Wraps tool logic to measure duration, payload sizes, and memory usage, and
4
+ * records results to OpenTelemetry plus structured logs. No manual spans beyond
5
+ * the single wrapper span here per project guidelines.
6
+ * @module src/utils/internal/performance
7
+ */
8
+ import type { performance as PerfHooksPerformance } from 'node:perf_hooks';
9
+ import type { RequestContext } from '../../utils/internal/requestContext.js';
10
+ /**
11
+ * Dynamically loads Node's `perf_hooks` module.
12
+ * Exposed as a named export so tests can inject a mock loader into
13
+ * {@link initHighResTimer} without patching the dynamic import machinery.
14
+ *
15
+ * @returns A promise resolving to the `perf_hooks` module shape (just the `performance` export).
16
+ */
17
+ export declare function loadPerfHooks(): Promise<{
18
+ performance: typeof PerfHooksPerformance;
19
+ }>;
20
+ /**
21
+ * Initializes the module-level high-resolution timer used by {@link nowMs}.
22
+ *
23
+ * Resolution priority:
24
+ * 1. `globalThis.performance.now` — available in Cloudflare Workers and modern browsers.
25
+ * 2. `node:perf_hooks` `performance.now` — loaded dynamically to stay Workers-compatible.
26
+ * 3. `Date.now()` — millisecond-precision fallback; a warning is logged when this path is taken.
27
+ *
28
+ * Must be called once during server startup (before any tool executions) to ensure
29
+ * sub-millisecond timing accuracy. Subsequent calls are safe but no-ops in practice
30
+ * because the module-level `performanceNow` closure is overwritten each time.
31
+ *
32
+ * @param perfLoader - Optional override for the `perf_hooks` import; defaults to
33
+ * {@link loadPerfHooks}. Inject a mock here in unit tests.
34
+ * @returns A promise that resolves once the timer is ready.
35
+ */
36
+ export declare function initHighResTimer(perfLoader?: typeof loadPerfHooks): Promise<void>;
37
+ /**
38
+ * Returns the current time in milliseconds using the highest-resolution timer
39
+ * available in this environment.
40
+ *
41
+ * The precision depends on which timer was selected by {@link initHighResTimer}:
42
+ * sub-millisecond after a successful init, millisecond-granular otherwise.
43
+ * The returned value is suitable for computing durations but its epoch origin
44
+ * is implementation-defined — do not treat it as a wall-clock timestamp.
45
+ *
46
+ * @returns Current time in milliseconds.
47
+ */
48
+ export declare const nowMs: () => number;
49
+ /**
50
+ * Wraps a tool's logic function with full observability: an OpenTelemetry span,
51
+ * OTel metric counters/histogram, structured log, and memory/payload size capture.
52
+ *
53
+ * The caller supplies the raw tool logic as `toolLogicFn`; this function handles
54
+ * all instrumentation so tool handlers stay free of telemetry boilerplate.
55
+ *
56
+ * On success the resolved value is passed through transparently.
57
+ * On failure the error is re-thrown after being recorded on the span and metrics;
58
+ * `McpError` instances surface their numeric `code` as the error code attribute.
59
+ *
60
+ * @template T - The resolved type of the tool's return value.
61
+ * @param toolLogicFn - Zero-argument async function containing the tool's business logic.
62
+ * @param context - Request context extended with `toolName`; used for span/log correlation.
63
+ * @param inputPayload - The raw input object passed to the tool, serialized to compute byte size.
64
+ * @returns A promise that resolves with the tool's return value or rejects with the original error.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const result = await measureToolExecution(
69
+ * () => myToolHandler(parsedInput),
70
+ * { ...requestContext, toolName: 'my_tool' },
71
+ * parsedInput,
72
+ * );
73
+ * ```
74
+ */
75
+ export declare function measureToolExecution<T>(toolLogicFn: () => Promise<T>, context: RequestContext & {
76
+ toolName: string;
77
+ }, inputPayload: unknown): Promise<T>;
78
+ //# sourceMappingURL=performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/utils/internal/performance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAM3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAkCzE;;;;;;GAMG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,WAAW,EAAE,OAAO,oBAAoB,CAAC;CAC1C,CAAC,CAID;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,GAAE,OAAO,aAA6B,GAC/C,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,QAAO,MAA0B,CAAC;AAgCpD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC9C,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,CAAC,CAAC,CA6FZ"}