@cyanheads/mcp-ts-core 0.11.4 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/AGENTS.md +28 -24
  2. package/CLAUDE.md +28 -24
  3. package/README.md +10 -10
  4. package/biome.json +1 -1
  5. package/changelog/0.11.x/0.11.5.md +28 -0
  6. package/changelog/0.12.x/0.12.0.md +96 -0
  7. package/changelog/template.md +55 -16
  8. package/dist/cli/init.js +1 -1
  9. package/dist/cli/init.js.map +1 -1
  10. package/dist/config/index.d.ts +0 -18
  11. package/dist/config/index.d.ts.map +1 -1
  12. package/dist/config/index.js +0 -25
  13. package/dist/config/index.js.map +1 -1
  14. package/dist/core/app.d.ts +5 -7
  15. package/dist/core/app.d.ts.map +1 -1
  16. package/dist/core/app.js +18 -27
  17. package/dist/core/app.js.map +1 -1
  18. package/dist/core/context.d.ts +90 -57
  19. package/dist/core/context.d.ts.map +1 -1
  20. package/dist/core/context.js +32 -33
  21. package/dist/core/context.js.map +1 -1
  22. package/dist/core/gcPressure.d.ts.map +1 -1
  23. package/dist/core/gcPressure.js +3 -4
  24. package/dist/core/gcPressure.js.map +1 -1
  25. package/dist/core/index.d.ts +6 -7
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +10 -2
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/serverManifest.d.ts +1 -3
  30. package/dist/core/serverManifest.d.ts.map +1 -1
  31. package/dist/core/serverManifest.js +9 -4
  32. package/dist/core/serverManifest.js.map +1 -1
  33. package/dist/core/worker.d.ts.map +1 -1
  34. package/dist/core/worker.js +32 -35
  35. package/dist/core/worker.js.map +1 -1
  36. package/dist/logs/combined.log +10 -0
  37. package/dist/logs/error.log +6 -0
  38. package/dist/logs/interactions.log +0 -0
  39. package/dist/mcp-server/inputRequired.d.ts +52 -0
  40. package/dist/mcp-server/inputRequired.d.ts.map +1 -0
  41. package/dist/mcp-server/inputRequired.js +76 -0
  42. package/dist/mcp-server/inputRequired.js.map +1 -0
  43. package/dist/mcp-server/notifications.d.ts +33 -31
  44. package/dist/mcp-server/notifications.d.ts.map +1 -1
  45. package/dist/mcp-server/notifications.js +34 -26
  46. package/dist/mcp-server/notifications.js.map +1 -1
  47. package/dist/mcp-server/prompts/prompt-registration.d.ts +2 -2
  48. package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -1
  49. package/dist/mcp-server/prompts/prompt-registration.js +15 -5
  50. package/dist/mcp-server/prompts/prompt-registration.js.map +1 -1
  51. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +1 -1
  52. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -1
  53. package/dist/mcp-server/resources/resource-registration.d.ts +3 -3
  54. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
  55. package/dist/mcp-server/resources/resource-registration.js +8 -15
  56. package/dist/mcp-server/resources/resource-registration.js.map +1 -1
  57. package/dist/mcp-server/resources/resourceSubscriptions.d.ts +45 -0
  58. package/dist/mcp-server/resources/resourceSubscriptions.d.ts.map +1 -0
  59. package/dist/mcp-server/resources/resourceSubscriptions.js +51 -0
  60. package/dist/mcp-server/resources/resourceSubscriptions.js.map +1 -0
  61. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +3 -5
  62. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -1
  63. package/dist/mcp-server/resources/utils/resourceDefinition.js +1 -1
  64. package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -1
  65. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +8 -15
  66. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
  67. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +21 -22
  68. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
  69. package/dist/mcp-server/server.d.ts +12 -21
  70. package/dist/mcp-server/server.d.ts.map +1 -1
  71. package/dist/mcp-server/server.js +38 -28
  72. package/dist/mcp-server/server.js.map +1 -1
  73. package/dist/mcp-server/tools/tool-registration.d.ts +11 -33
  74. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
  75. package/dist/mcp-server/tools/tool-registration.js +17 -243
  76. package/dist/mcp-server/tools/tool-registration.js.map +1 -1
  77. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +1 -3
  78. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
  79. package/dist/mcp-server/tools/utils/toolDefinition.js +48 -1
  80. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
  81. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +46 -20
  82. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  83. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +131 -25
  84. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  85. package/dist/mcp-server/transports/ITransport.d.ts +2 -2
  86. package/dist/mcp-server/transports/ITransport.d.ts.map +1 -1
  87. package/dist/mcp-server/transports/auth/authFactory.js +1 -1
  88. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -1
  89. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +1 -1
  90. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -1
  91. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -1
  92. package/dist/mcp-server/transports/auth/lib/authUtils.js +5 -13
  93. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -1
  94. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +5 -11
  95. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -1
  96. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -1
  97. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +9 -22
  98. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -1
  99. package/dist/mcp-server/transports/heartbeat.d.ts.map +1 -1
  100. package/dist/mcp-server/transports/heartbeat.js +4 -8
  101. package/dist/mcp-server/transports/heartbeat.js.map +1 -1
  102. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -1
  103. package/dist/mcp-server/transports/http/httpErrorHandler.js +6 -24
  104. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -1
  105. package/dist/mcp-server/transports/http/httpServer.d.ts +3 -3
  106. package/dist/mcp-server/transports/http/httpServer.d.ts.map +1 -1
  107. package/dist/mcp-server/transports/http/httpServer.js +15 -32
  108. package/dist/mcp-server/transports/http/httpServer.js.map +1 -1
  109. package/dist/mcp-server/transports/http/httpTransport.d.ts +25 -8
  110. package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
  111. package/dist/mcp-server/transports/http/httpTransport.js +156 -310
  112. package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
  113. package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
  114. package/dist/mcp-server/transports/http/landing-page/assets/styles.js +0 -1
  115. package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
  116. package/dist/mcp-server/transports/http/landing-page/handler.d.ts.map +1 -1
  117. package/dist/mcp-server/transports/http/landing-page/handler.js +4 -8
  118. package/dist/mcp-server/transports/http/landing-page/handler.js.map +1 -1
  119. package/dist/mcp-server/transports/http/landing-page/sections/tools.js +0 -2
  120. package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
  121. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -1
  122. package/dist/mcp-server/transports/http/protectedResourceMetadata.js +2 -6
  123. package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -1
  124. package/dist/mcp-server/transports/http/robotsTxt.js +2 -2
  125. package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -1
  126. package/dist/mcp-server/transports/http/serverCard.d.ts.map +1 -1
  127. package/dist/mcp-server/transports/http/serverCard.js +2 -6
  128. package/dist/mcp-server/transports/http/serverCard.js.map +1 -1
  129. package/dist/mcp-server/transports/http/sessionStore.d.ts +48 -45
  130. package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -1
  131. package/dist/mcp-server/transports/http/sessionStore.js +141 -185
  132. package/dist/mcp-server/transports/http/sessionStore.js.map +1 -1
  133. package/dist/mcp-server/transports/manager.d.ts +12 -4
  134. package/dist/mcp-server/transports/manager.d.ts.map +1 -1
  135. package/dist/mcp-server/transports/manager.js +35 -33
  136. package/dist/mcp-server/transports/manager.js.map +1 -1
  137. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +24 -31
  138. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -1
  139. package/dist/mcp-server/transports/stdio/stdioTransport.js +23 -38
  140. package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -1
  141. package/dist/mcp-server/types.d.ts +25 -0
  142. package/dist/mcp-server/types.d.ts.map +1 -0
  143. package/dist/mcp-server/types.js +10 -0
  144. package/dist/mcp-server/types.js.map +1 -0
  145. package/dist/services/canvas/core/CanvasInstance.d.ts +2 -2
  146. package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
  147. package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
  148. package/dist/services/canvas/core/CanvasRegistry.d.ts +4 -4
  149. package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
  150. package/dist/services/canvas/core/CanvasRegistry.js +8 -18
  151. package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
  152. package/dist/services/canvas/core/DataCanvas.d.ts +5 -5
  153. package/dist/services/canvas/core/DataCanvas.d.ts.map +1 -1
  154. package/dist/services/canvas/core/DataCanvas.js +2 -3
  155. package/dist/services/canvas/core/DataCanvas.js.map +1 -1
  156. package/dist/services/canvas/core/IDataCanvasProvider.d.ts +11 -11
  157. package/dist/services/canvas/core/IDataCanvasProvider.d.ts.map +1 -1
  158. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +11 -11
  159. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
  160. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +4 -10
  161. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
  162. package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -1
  163. package/dist/services/llm/providers/openrouter.provider.js +2 -5
  164. package/dist/services/llm/providers/openrouter.provider.js.map +1 -1
  165. package/dist/services/mirror/core/defineMirror.js +1 -1
  166. package/dist/services/mirror/core/defineMirror.js.map +1 -1
  167. package/dist/services/mirror/types.d.ts +5 -5
  168. package/dist/services/mirror/types.d.ts.map +1 -1
  169. package/dist/services/speech/providers/elevenlabs.provider.js +1 -1
  170. package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -1
  171. package/dist/services/speech/providers/whisper.provider.js +1 -1
  172. package/dist/services/speech/providers/whisper.provider.js.map +1 -1
  173. package/dist/storage/core/StorageService.d.ts +1 -1
  174. package/dist/storage/core/StorageService.d.ts.map +1 -1
  175. package/dist/storage/core/StorageService.js +12 -20
  176. package/dist/storage/core/StorageService.js.map +1 -1
  177. package/dist/storage/core/storageFactory.d.ts.map +1 -1
  178. package/dist/storage/core/storageFactory.js.map +1 -1
  179. package/dist/storage/core/storageValidation.d.ts +1 -1
  180. package/dist/storage/core/storageValidation.d.ts.map +1 -1
  181. package/dist/storage/core/storageValidation.js +2 -2
  182. package/dist/storage/core/storageValidation.js.map +1 -1
  183. package/dist/storage/providers/cloudflare/d1Provider.d.ts +1 -1
  184. package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -1
  185. package/dist/storage/providers/cloudflare/d1Provider.js +4 -12
  186. package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -1
  187. package/dist/storage/providers/cloudflare/kvProvider.d.ts +1 -1
  188. package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -1
  189. package/dist/storage/providers/cloudflare/kvProvider.js +3 -8
  190. package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -1
  191. package/dist/storage/providers/cloudflare/r2Provider.d.ts +1 -1
  192. package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -1
  193. package/dist/storage/providers/cloudflare/r2Provider.js +3 -8
  194. package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -1
  195. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +1 -1
  196. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -1
  197. package/dist/storage/providers/inMemory/inMemoryProvider.js +2 -4
  198. package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -1
  199. package/dist/testing/index.d.ts +35 -12
  200. package/dist/testing/index.d.ts.map +1 -1
  201. package/dist/testing/index.js +53 -38
  202. package/dist/testing/index.js.map +1 -1
  203. package/dist/testing/vitest.d.ts +1 -1
  204. package/dist/testing/vitest.d.ts.map +1 -1
  205. package/dist/types-global/errors.d.ts +28 -15
  206. package/dist/types-global/errors.d.ts.map +1 -1
  207. package/dist/types-global/errors.js +8 -1
  208. package/dist/types-global/errors.js.map +1 -1
  209. package/dist/utils/formatting/diffFormatter.d.ts +5 -5
  210. package/dist/utils/formatting/diffFormatter.d.ts.map +1 -1
  211. package/dist/utils/formatting/diffFormatter.js +7 -20
  212. package/dist/utils/formatting/diffFormatter.js.map +1 -1
  213. package/dist/utils/formatting/tableFormatter.d.ts +3 -3
  214. package/dist/utils/formatting/tableFormatter.d.ts.map +1 -1
  215. package/dist/utils/formatting/tableFormatter.js +6 -17
  216. package/dist/utils/formatting/tableFormatter.js.map +1 -1
  217. package/dist/utils/formatting/treeFormatter.d.ts +3 -3
  218. package/dist/utils/formatting/treeFormatter.d.ts.map +1 -1
  219. package/dist/utils/formatting/treeFormatter.js +5 -18
  220. package/dist/utils/formatting/treeFormatter.js.map +1 -1
  221. package/dist/utils/index.d.ts +4 -2
  222. package/dist/utils/index.d.ts.map +1 -1
  223. package/dist/utils/index.js +2 -2
  224. package/dist/utils/index.js.map +1 -1
  225. package/dist/utils/internal/error-handler/errorHandler.d.ts +1 -1
  226. package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
  227. package/dist/utils/internal/error-handler/errorHandler.js +23 -11
  228. package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
  229. package/dist/utils/internal/error-handler/types.d.ts +10 -13
  230. package/dist/utils/internal/error-handler/types.d.ts.map +1 -1
  231. package/dist/utils/internal/logger.d.ts +3 -3
  232. package/dist/utils/internal/logger.d.ts.map +1 -1
  233. package/dist/utils/internal/logger.js +11 -5
  234. package/dist/utils/internal/logger.js.map +1 -1
  235. package/dist/utils/internal/performance.d.ts +1 -1
  236. package/dist/utils/internal/performance.d.ts.map +1 -1
  237. package/dist/utils/internal/performance.js +57 -13
  238. package/dist/utils/internal/performance.js.map +1 -1
  239. package/dist/utils/internal/requestContext.d.ts +79 -55
  240. package/dist/utils/internal/requestContext.d.ts.map +1 -1
  241. package/dist/utils/internal/requestContext.js +77 -32
  242. package/dist/utils/internal/requestContext.js.map +1 -1
  243. package/dist/utils/metrics/tokenCounter.d.ts +3 -3
  244. package/dist/utils/metrics/tokenCounter.d.ts.map +1 -1
  245. package/dist/utils/metrics/tokenCounter.js.map +1 -1
  246. package/dist/utils/network/fetchWithTimeout.d.ts +2 -2
  247. package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -1
  248. package/dist/utils/network/fetchWithTimeout.js +8 -24
  249. package/dist/utils/network/fetchWithTimeout.js.map +1 -1
  250. package/dist/utils/network/retry.d.ts +2 -2
  251. package/dist/utils/network/retry.d.ts.map +1 -1
  252. package/dist/utils/overflow/outlineOnOverflow.d.ts +1 -1
  253. package/dist/utils/overflow/outlineOnOverflow.d.ts.map +1 -1
  254. package/dist/utils/pagination/pagination.d.ts +3 -3
  255. package/dist/utils/pagination/pagination.d.ts.map +1 -1
  256. package/dist/utils/pagination/pagination.js +3 -3
  257. package/dist/utils/pagination/pagination.js.map +1 -1
  258. package/dist/utils/parsing/csvParser.d.ts +2 -2
  259. package/dist/utils/parsing/csvParser.d.ts.map +1 -1
  260. package/dist/utils/parsing/csvParser.js +4 -8
  261. package/dist/utils/parsing/csvParser.js.map +1 -1
  262. package/dist/utils/parsing/dateParser.d.ts +3 -3
  263. package/dist/utils/parsing/dateParser.d.ts.map +1 -1
  264. package/dist/utils/parsing/dateParser.js +3 -2
  265. package/dist/utils/parsing/dateParser.js.map +1 -1
  266. package/dist/utils/parsing/frontmatterParser.d.ts +2 -2
  267. package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -1
  268. package/dist/utils/parsing/frontmatterParser.js +7 -10
  269. package/dist/utils/parsing/frontmatterParser.js.map +1 -1
  270. package/dist/utils/parsing/htmlExtractor.d.ts +2 -2
  271. package/dist/utils/parsing/htmlExtractor.d.ts.map +1 -1
  272. package/dist/utils/parsing/htmlExtractor.js +6 -11
  273. package/dist/utils/parsing/htmlExtractor.js.map +1 -1
  274. package/dist/utils/parsing/jsonParser.d.ts +2 -2
  275. package/dist/utils/parsing/jsonParser.d.ts.map +1 -1
  276. package/dist/utils/parsing/jsonParser.js +4 -8
  277. package/dist/utils/parsing/jsonParser.js.map +1 -1
  278. package/dist/utils/parsing/pdfParser.d.ts +10 -10
  279. package/dist/utils/parsing/pdfParser.d.ts.map +1 -1
  280. package/dist/utils/parsing/pdfParser.js +26 -89
  281. package/dist/utils/parsing/pdfParser.js.map +1 -1
  282. package/dist/utils/parsing/xmlParser.d.ts +2 -2
  283. package/dist/utils/parsing/xmlParser.d.ts.map +1 -1
  284. package/dist/utils/parsing/xmlParser.js +4 -8
  285. package/dist/utils/parsing/xmlParser.js.map +1 -1
  286. package/dist/utils/parsing/yamlParser.d.ts +2 -2
  287. package/dist/utils/parsing/yamlParser.d.ts.map +1 -1
  288. package/dist/utils/parsing/yamlParser.js +4 -8
  289. package/dist/utils/parsing/yamlParser.js.map +1 -1
  290. package/dist/utils/scheduling/scheduler.d.ts.map +1 -1
  291. package/dist/utils/scheduling/scheduler.js +5 -6
  292. package/dist/utils/scheduling/scheduler.js.map +1 -1
  293. package/dist/utils/security/rateLimiter.d.ts +2 -2
  294. package/dist/utils/security/rateLimiter.d.ts.map +1 -1
  295. package/dist/utils/security/rateLimiter.js +1 -1
  296. package/dist/utils/security/rateLimiter.js.map +1 -1
  297. package/dist/utils/telemetry/attributes.d.ts +23 -7
  298. package/dist/utils/telemetry/attributes.d.ts.map +1 -1
  299. package/dist/utils/telemetry/attributes.js +23 -10
  300. package/dist/utils/telemetry/attributes.js.map +1 -1
  301. package/dist/utils/telemetry/trace.d.ts +3 -3
  302. package/dist/utils/telemetry/trace.d.ts.map +1 -1
  303. package/dist/utils/telemetry/trace.js +4 -2
  304. package/dist/utils/telemetry/trace.js.map +1 -1
  305. package/package.json +22 -26
  306. package/scripts/lint-mcp.ts +1 -3
  307. package/scripts/lint-packaging.ts +1 -1
  308. package/skills/add-service/SKILL.md +2 -2
  309. package/skills/add-test/SKILL.md +42 -20
  310. package/skills/add-tool/SKILL.md +68 -19
  311. package/skills/api-canvas/SKILL.md +2 -2
  312. package/skills/api-config/SKILL.md +1 -11
  313. package/skills/api-context/SKILL.md +175 -111
  314. package/skills/api-linter/SKILL.md +2 -2
  315. package/skills/api-telemetry/SKILL.md +8 -12
  316. package/skills/api-testing/SKILL.md +53 -52
  317. package/skills/code-simplifier/SKILL.md +2 -2
  318. package/skills/design-mcp-server/SKILL.md +34 -18
  319. package/skills/field-test/SKILL.md +4 -2
  320. package/skills/git-wrapup/SKILL.md +3 -3
  321. package/skills/polish-docs-meta/SKILL.md +1 -1
  322. package/skills/polish-docs-meta/references/agent-protocol.md +2 -2
  323. package/skills/polish-docs-meta/references/readme.md +1 -1
  324. package/skills/release-and-publish/SKILL.md +3 -1
  325. package/skills/report-issue-framework/SKILL.md +2 -2
  326. package/skills/report-issue-local/SKILL.md +2 -2
  327. package/skills/security-pass/SKILL.md +16 -14
  328. package/templates/.github/CODE_OF_CONDUCT.md +28 -0
  329. package/templates/.github/CONTRIBUTING.md +50 -0
  330. package/templates/.github/SECURITY.md +24 -0
  331. package/templates/AGENTS.md +6 -6
  332. package/templates/CLAUDE.md +6 -6
  333. package/templates/changelog/template.md +55 -16
  334. package/templates/tests/resources/echo.resource.test.ts +16 -9
  335. package/dist/mcp-server/elicitation.d.ts +0 -64
  336. package/dist/mcp-server/elicitation.d.ts.map +0 -1
  337. package/dist/mcp-server/elicitation.js +0 -81
  338. package/dist/mcp-server/elicitation.js.map +0 -1
  339. package/dist/mcp-server/protocolSession.d.ts +0 -34
  340. package/dist/mcp-server/protocolSession.d.ts.map +0 -1
  341. package/dist/mcp-server/protocolSession.js +0 -13
  342. package/dist/mcp-server/protocolSession.js.map +0 -1
  343. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts +0 -53
  344. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts.map +0 -1
  345. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js +0 -65
  346. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js.map +0 -1
  347. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +0 -70
  348. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +0 -1
  349. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +0 -130
  350. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +0 -1
  351. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +0 -109
  352. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +0 -1
  353. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +0 -209
  354. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +0 -1
  355. package/dist/mcp-server/tasks/core/taskManager.d.ts +0 -91
  356. package/dist/mcp-server/tasks/core/taskManager.d.ts.map +0 -1
  357. package/dist/mcp-server/tasks/core/taskManager.js +0 -210
  358. package/dist/mcp-server/tasks/core/taskManager.js.map +0 -1
  359. package/dist/mcp-server/tasks/core/taskTypes.d.ts +0 -18
  360. package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +0 -1
  361. package/dist/mcp-server/tasks/core/taskTypes.js +0 -20
  362. package/dist/mcp-server/tasks/core/taskTypes.js.map +0 -1
  363. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +0 -101
  364. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +0 -1
  365. package/dist/mcp-server/tasks/utils/taskToolDefinition.js +0 -14
  366. package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +0 -1
@@ -1,65 +0,0 @@
1
- /**
2
- * Wraps a {@link TaskMessageQueue} so each task's queue is reclaimed once its
3
- * TTL elapses.
4
- *
5
- * Eviction is lazy and traffic-driven rather than timer-based: a deadline is
6
- * refreshed whenever a task's queue is touched, expired queues are dropped on
7
- * the next operation, and `dequeueAll` releases the deadline outright. That
8
- * keeps the wrapper free of per-task timers and correct on runtimes where a
9
- * timer would never fire.
10
- *
11
- * @experimental
12
- */
13
- export class EvictingTaskMessageQueue {
14
- inner;
15
- ttlMs;
16
- deadlines = new Map();
17
- /**
18
- * @param inner - Queue to delegate to.
19
- * @param ttlMs - Lifetime of an untouched queue. A non-positive value
20
- * disables eviction, matching a task store configured without a TTL.
21
- */
22
- constructor(inner, ttlMs) {
23
- this.inner = inner;
24
- this.ttlMs = ttlMs;
25
- }
26
- get evicts() {
27
- return this.ttlMs > 0;
28
- }
29
- /**
30
- * Drain queues whose deadline has passed, then extend `taskId`'s.
31
- *
32
- * `dequeueAll` is the inner queue's only delete path, so it doubles as the
33
- * eviction primitive here — dropping the messages and the map entry in one
34
- * call.
35
- */
36
- async expireAndTouch(taskId) {
37
- if (!this.evicts)
38
- return;
39
- const now = Date.now();
40
- for (const [id, deadline] of this.deadlines) {
41
- if (now < deadline)
42
- continue;
43
- this.deadlines.delete(id);
44
- await this.inner.dequeueAll(id);
45
- }
46
- this.deadlines.set(taskId, now + this.ttlMs);
47
- }
48
- async enqueue(taskId, message, sessionId, maxSize) {
49
- await this.expireAndTouch(taskId);
50
- await this.inner.enqueue(taskId, message, sessionId, maxSize);
51
- }
52
- async dequeue(taskId, sessionId) {
53
- await this.expireAndTouch(taskId);
54
- return await this.inner.dequeue(taskId, sessionId);
55
- }
56
- async dequeueAll(taskId, sessionId) {
57
- this.deadlines.delete(taskId);
58
- return await this.inner.dequeueAll(taskId, sessionId);
59
- }
60
- /** Number of queues currently tracked for eviction. Exposed for tests. */
61
- get trackedCount() {
62
- return this.deadlines.size;
63
- }
64
- }
65
- //# sourceMappingURL=evictingTaskMessageQueue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evictingTaskMessageQueue.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/evictingTaskMessageQueue.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,wBAAwB;IAShB,KAAK;IACL,KAAK;IATP,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD;;;;OAIG;IACH,YACmB,KAAuB,EACvB,KAAa;qBADb,KAAK;qBACL,KAAK;IACrB,CAAC;IAEJ,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,MAAc;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,IAAI,GAAG,GAAG,QAAQ;gBAAE,SAAS;YAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,OAAsB,EACtB,SAAkB,EAClB,OAAgB;QAEhB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,SAAkB;QAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,SAAkB;QACjD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,0EAA0E;IAC1E,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF"}
@@ -1,70 +0,0 @@
1
- /**
2
- * @fileoverview A TaskStore wrapper that enforces session ownership on top of
3
- * the SDK's InMemoryTaskStore (which ignores sessionId parameters).
4
- *
5
- * This ensures that in HTTP mode, tasks created by one session cannot be
6
- * accessed by another session, even when using the in-memory store.
7
- *
8
- * @experimental These APIs are experimental and may change without notice.
9
- * @module src/mcp-server/tasks/core/sessionAwareTaskStore
10
- */
11
- import type { Request, RequestId, Result } from '@modelcontextprotocol/sdk/types.js';
12
- import { type CreateTaskOptions, type Task, type TaskStore } from './taskTypes.js';
13
- /**
14
- * Wraps an InMemoryTaskStore to add session ownership enforcement.
15
- *
16
- * Tracks which session created each task and rejects access from
17
- * non-owning sessions. Tasks created without a sessionId are accessible
18
- * by any session (backwards-compatible with stdio/unauth flows).
19
- *
20
- * @experimental
21
- */
22
- export declare class SessionAwareTaskStore implements TaskStore {
23
- private readonly inner;
24
- /**
25
- * Maps taskId -> owning sessionId and the deadline past which the row is
26
- * reclaimable.
27
- *
28
- * The inner store drops a task once its TTL elapses, so an ownership row
29
- * that outlives it is pure leak — one permanent entry per task call, since
30
- * every HTTP request transport carries a sessionId. Mirroring the inner
31
- * store's own expiry keeps this map's lifetime bounded by the tasks it
32
- * describes. `Infinity` covers a task created without a TTL, which the
33
- * inner store likewise never evicts.
34
- */
35
- private readonly ownership;
36
- constructor(inner: TaskStore);
37
- /**
38
- * Owning session for a task, or `undefined` when unowned or expired.
39
- * Prunes the row on the way past — a lazy sweep costs one comparison on a
40
- * path that is already touching the entry.
41
- */
42
- private ownerOf;
43
- /**
44
- * Refresh a row's deadline, mirroring the inner store's TTL reset. The TTL
45
- * is fixed when the task is created, so this needs no read of the inner
46
- * store.
47
- */
48
- private touch;
49
- /** Drop every expired row. Runs on task creation, where the map grows. */
50
- private sweepExpired;
51
- createTask(taskParams: CreateTaskOptions, requestId: RequestId, request: Request, sessionId?: string): Promise<Task>;
52
- getTask(taskId: string, sessionId?: string): Promise<Task | null>;
53
- storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Result, sessionId?: string): Promise<void>;
54
- getTaskResult(taskId: string, sessionId?: string): Promise<Result>;
55
- updateTaskStatus(taskId: string, status: Task['status'], statusMessage?: string, sessionId?: string): Promise<void>;
56
- listTasks(cursor?: string, sessionId?: string): Promise<{
57
- tasks: Task[];
58
- nextCursor?: string;
59
- }>;
60
- /**
61
- * Validates that the caller's session matches the task's owner.
62
- * Tasks created without a sessionId are accessible by any session.
63
- *
64
- * Once the row expires this falls through rather than throwing, so a probe
65
- * for an evicted taskId gets the inner store's uniform not-found instead of
66
- * a `Forbidden` that would confirm the id had once existed.
67
- */
68
- private assertOwnership;
69
- }
70
- //# sourceMappingURL=sessionAwareTaskStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionAwareTaskStore.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/sessionAwareTaskStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAGrF,OAAO,EAAE,KAAK,iBAAiB,EAAc,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/F;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IAiBzC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAhBlC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGtB;IAEJ,YAA6B,KAAK,EAAE,SAAS,EAAI;IAEjD;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAUf;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAMb,0EAA0E;IAC1E,OAAO,CAAC,YAAY;IAOd,UAAU,CACd,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAGtE;IAEK,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;IAEK,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf;IAEK,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAYjD;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;CAOxB"}
@@ -1,130 +0,0 @@
1
- import { forbidden } from '../../../types-global/errors.js';
2
- import { isTerminal } from './taskTypes.js';
3
- /**
4
- * Wraps an InMemoryTaskStore to add session ownership enforcement.
5
- *
6
- * Tracks which session created each task and rejects access from
7
- * non-owning sessions. Tasks created without a sessionId are accessible
8
- * by any session (backwards-compatible with stdio/unauth flows).
9
- *
10
- * @experimental
11
- */
12
- export class SessionAwareTaskStore {
13
- inner;
14
- /**
15
- * Maps taskId -> owning sessionId and the deadline past which the row is
16
- * reclaimable.
17
- *
18
- * The inner store drops a task once its TTL elapses, so an ownership row
19
- * that outlives it is pure leak — one permanent entry per task call, since
20
- * every HTTP request transport carries a sessionId. Mirroring the inner
21
- * store's own expiry keeps this map's lifetime bounded by the tasks it
22
- * describes. `Infinity` covers a task created without a TTL, which the
23
- * inner store likewise never evicts.
24
- */
25
- ownership = new Map();
26
- constructor(inner) {
27
- this.inner = inner;
28
- }
29
- /**
30
- * Owning session for a task, or `undefined` when unowned or expired.
31
- * Prunes the row on the way past — a lazy sweep costs one comparison on a
32
- * path that is already touching the entry.
33
- */
34
- ownerOf(taskId) {
35
- const record = this.ownership.get(taskId);
36
- if (!record)
37
- return;
38
- if (Date.now() >= record.expiresAt) {
39
- this.ownership.delete(taskId);
40
- return;
41
- }
42
- return record.sessionId;
43
- }
44
- /**
45
- * Refresh a row's deadline, mirroring the inner store's TTL reset. The TTL
46
- * is fixed when the task is created, so this needs no read of the inner
47
- * store.
48
- */
49
- touch(taskId) {
50
- const record = this.ownership.get(taskId);
51
- if (!record)
52
- return;
53
- record.expiresAt = record.ttl ? Date.now() + record.ttl : Number.POSITIVE_INFINITY;
54
- }
55
- /** Drop every expired row. Runs on task creation, where the map grows. */
56
- sweepExpired() {
57
- const now = Date.now();
58
- for (const [taskId, record] of this.ownership) {
59
- if (now >= record.expiresAt)
60
- this.ownership.delete(taskId);
61
- }
62
- }
63
- async createTask(taskParams, requestId, request, sessionId) {
64
- const task = await this.inner.createTask(taskParams, requestId, request, sessionId);
65
- if (sessionId) {
66
- this.sweepExpired();
67
- const ttl = task.ttl ?? null;
68
- this.ownership.set(task.taskId, {
69
- sessionId,
70
- ttl,
71
- expiresAt: ttl ? Date.now() + ttl : Number.POSITIVE_INFINITY,
72
- });
73
- }
74
- return task;
75
- }
76
- async getTask(taskId, sessionId) {
77
- this.assertOwnership(taskId, sessionId);
78
- return await this.inner.getTask(taskId, sessionId);
79
- }
80
- async storeTaskResult(taskId, status, result, sessionId) {
81
- this.assertOwnership(taskId, sessionId);
82
- await this.inner.storeTaskResult(taskId, status, result, sessionId);
83
- // The inner store restarts the task's cleanup timer here; keep the
84
- // ownership row alive exactly as long as the task it describes.
85
- this.touch(taskId);
86
- }
87
- async getTaskResult(taskId, sessionId) {
88
- this.assertOwnership(taskId, sessionId);
89
- return await this.inner.getTaskResult(taskId, sessionId);
90
- }
91
- async updateTaskStatus(taskId, status, statusMessage, sessionId) {
92
- this.assertOwnership(taskId, sessionId);
93
- await this.inner.updateTaskStatus(taskId, status, statusMessage, sessionId);
94
- // Terminal status starts the inner store's TTL countdown afresh.
95
- if (isTerminal(status))
96
- this.touch(taskId);
97
- }
98
- async listTasks(cursor, sessionId) {
99
- const result = await this.inner.listTasks(cursor, sessionId);
100
- // Filter: session-bound tasks are only visible to their owning session.
101
- // Sessionless callers see only unowned tasks (consistent with StorageBackedTaskStore).
102
- const filtered = result.tasks.filter((task) => {
103
- const owner = this.ownerOf(task.taskId);
104
- if (!owner)
105
- return true; // Unowned — visible to everyone
106
- return owner === sessionId; // Session-bound — visible only to owner
107
- });
108
- const out = { tasks: filtered };
109
- if (result.nextCursor)
110
- out.nextCursor = result.nextCursor;
111
- return out;
112
- }
113
- /**
114
- * Validates that the caller's session matches the task's owner.
115
- * Tasks created without a sessionId are accessible by any session.
116
- *
117
- * Once the row expires this falls through rather than throwing, so a probe
118
- * for an evicted taskId gets the inner store's uniform not-found instead of
119
- * a `Forbidden` that would confirm the id had once existed.
120
- */
121
- assertOwnership(taskId, callerSessionId) {
122
- const owner = this.ownerOf(taskId);
123
- if (!owner)
124
- return; // No owner recorded — accessible by anyone
125
- if (owner !== callerSessionId) {
126
- throw forbidden(`Access denied to task ${taskId}`);
127
- }
128
- }
129
- }
130
- //# sourceMappingURL=sessionAwareTaskStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionAwareTaskStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/sessionAwareTaskStore.ts"],"names":[],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- /**
2
- * @fileoverview A TaskStore implementation backed by the framework's StorageService.
3
- * This provides persistent task storage that survives server restarts, using
4
- * whatever storage backend is configured (filesystem, Supabase, SurrealDB, etc.).
5
- *
6
- * Use this instead of InMemoryTaskStore when you need task durability.
7
- *
8
- * @experimental These APIs are experimental and may change without notice.
9
- * @module src/mcp-server/tasks/core/storageBackedTaskStore
10
- */
11
- import type { Request, RequestId, Result } from '@modelcontextprotocol/sdk/types.js';
12
- import type { StorageService } from '../../../storage/core/StorageService.js';
13
- import type { CreateTaskOptions, Task, TaskStore } from './taskTypes.js';
14
- /**
15
- * Configuration options for StorageBackedTaskStore.
16
- */
17
- export interface StorageBackedTaskStoreOptions {
18
- /**
19
- * Default TTL in milliseconds if not specified in task creation.
20
- * Set to null for unlimited lifetime.
21
- * @default null
22
- */
23
- defaultTtl?: number | null;
24
- /**
25
- * Prefix for storage keys.
26
- * @default 'tasks'
27
- */
28
- keyPrefix?: string;
29
- /**
30
- * Page size for listTasks pagination.
31
- * @default 10
32
- */
33
- pageSize?: number;
34
- /**
35
- * The tenant ID to use for storage operations.
36
- * Tasks are stored under this tenant for isolation.
37
- * @default 'system-tasks'
38
- */
39
- tenantId?: string;
40
- }
41
- /**
42
- * A TaskStore implementation backed by StorageService for persistent task storage.
43
- *
44
- * Unlike InMemoryTaskStore, this implementation:
45
- * - Persists tasks across server restarts
46
- * - Works with any configured storage backend (filesystem, Supabase, SurrealDB, etc.)
47
- * - Supports TTL via storage provider options
48
- *
49
- * @example
50
- * ```typescript
51
- * const taskStore = new StorageBackedTaskStore(storageService, {
52
- * tenantId: 'my-app-tasks',
53
- * defaultTtl: 3600000, // 1 hour
54
- * });
55
- * ```
56
- *
57
- * @experimental
58
- */
59
- export declare class StorageBackedTaskStore implements TaskStore {
60
- private readonly storage;
61
- private readonly tenantId;
62
- private readonly keyPrefix;
63
- private readonly defaultTtl;
64
- private readonly pageSize;
65
- constructor(storage: StorageService, options?: StorageBackedTaskStoreOptions);
66
- /**
67
- * Creates a request context for storage operations.
68
- */
69
- private createContext;
70
- /**
71
- * Generates the storage key for a task.
72
- */
73
- private getTaskKey;
74
- /**
75
- * Validates that the caller's sessionId matches the stored task's sessionId.
76
- * Tasks created without a sessionId (legacy/pre-ownership) are accessible by any session.
77
- * @throws {McpError} Forbidden if sessionId mismatch
78
- */
79
- private assertOwnership;
80
- /**
81
- * Generates a unique task ID.
82
- * Uses the framework's idGenerator for consistent ID format.
83
- */
84
- private generateTaskId;
85
- createTask(taskParams: CreateTaskOptions, requestId: RequestId, request: Request, sessionId?: string): Promise<Task>;
86
- getTask(taskId: string, sessionId?: string): Promise<Task | null>;
87
- storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Result, sessionId?: string): Promise<void>;
88
- getTaskResult(taskId: string, sessionId?: string): Promise<Result>;
89
- updateTaskStatus(taskId: string, status: Task['status'], statusMessage?: string, sessionId?: string): Promise<void>;
90
- listTasks(cursor?: string, sessionId?: string): Promise<{
91
- tasks: Task[];
92
- nextCursor?: string;
93
- }>;
94
- /**
95
- * Deletes a task from storage.
96
- * Useful for manual cleanup or testing.
97
- *
98
- * @param taskId - The task ID to delete
99
- */
100
- deleteTask(taskId: string): Promise<void>;
101
- /**
102
- * Clears all tasks from storage.
103
- * Useful for testing or administrative purposes.
104
- *
105
- * WARNING: This deletes ALL tasks for the configured tenant.
106
- */
107
- clearAllTasks(): Promise<void>;
108
- }
109
- //# sourceMappingURL=storageBackedTaskStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storageBackedTaskStore.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/storageBackedTaskStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAIvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgBzE;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IAOpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YACmB,OAAO,EAAE,cAAc,EACxC,OAAO,GAAE,6BAAkC,EAM5C;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAKhB,UAAU,CACd,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAoCf;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAMtE;IAEK,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Bf;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvE;IAEK,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Bf;IAEK,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CA+BjD;IAED;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9C;IAED;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnC;CACF"}
@@ -1,209 +0,0 @@
1
- import { forbidden, invalidRequest, notFound } from '../../../types-global/errors.js';
2
- import { idGenerator } from '../../../utils/security/idGenerator.js';
3
- import { isTerminal } from './taskTypes.js';
4
- /**
5
- * A TaskStore implementation backed by StorageService for persistent task storage.
6
- *
7
- * Unlike InMemoryTaskStore, this implementation:
8
- * - Persists tasks across server restarts
9
- * - Works with any configured storage backend (filesystem, Supabase, SurrealDB, etc.)
10
- * - Supports TTL via storage provider options
11
- *
12
- * @example
13
- * ```typescript
14
- * const taskStore = new StorageBackedTaskStore(storageService, {
15
- * tenantId: 'my-app-tasks',
16
- * defaultTtl: 3600000, // 1 hour
17
- * });
18
- * ```
19
- *
20
- * @experimental
21
- */
22
- export class StorageBackedTaskStore {
23
- storage;
24
- tenantId;
25
- keyPrefix;
26
- defaultTtl;
27
- pageSize;
28
- constructor(storage, options = {}) {
29
- this.storage = storage;
30
- this.tenantId = options.tenantId ?? 'system-tasks';
31
- this.keyPrefix = options.keyPrefix ?? 'tasks';
32
- this.defaultTtl = options.defaultTtl ?? null;
33
- this.pageSize = options.pageSize ?? 10;
34
- }
35
- /**
36
- * Creates a request context for storage operations.
37
- */
38
- createContext(operation) {
39
- return {
40
- operation: `StorageBackedTaskStore.${operation}`,
41
- requestId: idGenerator.generate('req'),
42
- timestamp: new Date().toISOString(),
43
- tenantId: this.tenantId,
44
- };
45
- }
46
- /**
47
- * Generates the storage key for a task.
48
- */
49
- getTaskKey(taskId) {
50
- return `${this.keyPrefix}/${taskId}`;
51
- }
52
- /**
53
- * Validates that the caller's sessionId matches the stored task's sessionId.
54
- * Tasks created without a sessionId (legacy/pre-ownership) are accessible by any session.
55
- * @throws {McpError} Forbidden if sessionId mismatch
56
- */
57
- assertOwnership(stored, callerSessionId, taskId) {
58
- if (!stored.sessionId)
59
- return;
60
- if (stored.sessionId !== callerSessionId) {
61
- throw forbidden(`Access denied to task ${taskId}`);
62
- }
63
- }
64
- /**
65
- * Generates a unique task ID.
66
- * Uses the framework's idGenerator for consistent ID format.
67
- */
68
- generateTaskId() {
69
- // Generate a longer ID for global uniqueness (16 chars)
70
- return idGenerator.generate('task', { length: 16 });
71
- }
72
- async createTask(taskParams, requestId, request, sessionId) {
73
- const context = this.createContext('createTask');
74
- const taskId = this.generateTaskId();
75
- const actualTtl = taskParams.ttl ?? this.defaultTtl;
76
- const createdAt = new Date().toISOString();
77
- const task = {
78
- taskId,
79
- status: 'working',
80
- ttl: actualTtl,
81
- createdAt,
82
- lastUpdatedAt: createdAt,
83
- pollInterval: taskParams.pollInterval ?? 1000,
84
- };
85
- const storedTask = {
86
- task,
87
- request,
88
- requestId,
89
- };
90
- // Bind session ownership if provided
91
- if (sessionId) {
92
- storedTask.sessionId = sessionId;
93
- }
94
- // Store with TTL if specified (convert ms to seconds for StorageService)
95
- await this.storage.set(this.getTaskKey(taskId), storedTask, context, actualTtl ? { ttl: Math.ceil(actualTtl / 1000) } : undefined);
96
- return task;
97
- }
98
- async getTask(taskId, sessionId) {
99
- const context = this.createContext('getTask');
100
- const stored = await this.storage.get(this.getTaskKey(taskId), context);
101
- if (!stored)
102
- return null;
103
- this.assertOwnership(stored, sessionId, taskId);
104
- return { ...stored.task };
105
- }
106
- async storeTaskResult(taskId, status, result, sessionId) {
107
- const context = this.createContext('storeTaskResult');
108
- const key = this.getTaskKey(taskId);
109
- const stored = await this.storage.get(key, context);
110
- if (!stored) {
111
- throw notFound(`Task with ID ${taskId} not found`);
112
- }
113
- this.assertOwnership(stored, sessionId, taskId);
114
- // Don't allow storing results for tasks already in terminal state
115
- if (isTerminal(stored.task.status)) {
116
- throw invalidRequest(`Cannot store result for task ${taskId} in terminal status '${stored.task.status}'. Task results can only be stored once.`);
117
- }
118
- stored.result = result;
119
- stored.task.status = status;
120
- stored.task.lastUpdatedAt = new Date().toISOString();
121
- // Re-store with TTL reset (if ttl is set, convert ms to seconds)
122
- await this.storage.set(key, stored, context, stored.task.ttl ? { ttl: Math.ceil(stored.task.ttl / 1000) } : undefined);
123
- }
124
- async getTaskResult(taskId, sessionId) {
125
- const context = this.createContext('getTaskResult');
126
- const stored = await this.storage.get(this.getTaskKey(taskId), context);
127
- if (!stored) {
128
- throw notFound(`Task with ID ${taskId} not found`);
129
- }
130
- this.assertOwnership(stored, sessionId, taskId);
131
- if (!stored.result) {
132
- throw invalidRequest(`Task ${taskId} has no result stored`);
133
- }
134
- return stored.result;
135
- }
136
- async updateTaskStatus(taskId, status, statusMessage, sessionId) {
137
- const context = this.createContext('updateTaskStatus');
138
- const key = this.getTaskKey(taskId);
139
- const stored = await this.storage.get(key, context);
140
- if (!stored) {
141
- throw notFound(`Task with ID ${taskId} not found`);
142
- }
143
- this.assertOwnership(stored, sessionId, taskId);
144
- // Don't allow transitions from terminal states
145
- if (isTerminal(stored.task.status)) {
146
- throw invalidRequest(`Cannot update task ${taskId} from terminal status '${stored.task.status}' to '${status}'. Terminal states (completed, failed, cancelled) cannot transition to other states.`);
147
- }
148
- stored.task.status = status;
149
- if (statusMessage) {
150
- stored.task.statusMessage = statusMessage;
151
- }
152
- stored.task.lastUpdatedAt = new Date().toISOString();
153
- // Re-store, reset TTL if transitioning to terminal state (convert ms to seconds)
154
- const shouldResetTtl = isTerminal(status) && stored.task.ttl;
155
- await this.storage.set(key, stored, context, shouldResetTtl ? { ttl: Math.ceil(stored.task.ttl / 1000) } : undefined);
156
- }
157
- async listTasks(cursor, sessionId) {
158
- const context = this.createContext('listTasks');
159
- // List all task keys with pagination
160
- const listResult = await this.storage.list(this.keyPrefix, context, cursor ? { cursor, limit: this.pageSize } : { limit: this.pageSize });
161
- // Fetch all tasks in parallel, filtering by session ownership
162
- const taskPromises = listResult.keys.map(async (key) => {
163
- const stored = await this.storage.get(key, context);
164
- if (!stored)
165
- return null;
166
- // Filter: hide tasks whose sessionId doesn't match the caller's.
167
- // Consistent with assertOwnership: session-bound tasks are only
168
- // visible to the session that created them.
169
- if (stored.sessionId && stored.sessionId !== sessionId) {
170
- return null;
171
- }
172
- return { ...stored.task };
173
- });
174
- const tasksOrNull = await Promise.all(taskPromises);
175
- const tasks = tasksOrNull.filter((t) => t !== null);
176
- // Handle exactOptionalPropertyTypes - only include nextCursor if defined
177
- if (listResult.nextCursor !== undefined) {
178
- return { tasks, nextCursor: listResult.nextCursor };
179
- }
180
- return { tasks };
181
- }
182
- /**
183
- * Deletes a task from storage.
184
- * Useful for manual cleanup or testing.
185
- *
186
- * @param taskId - The task ID to delete
187
- */
188
- async deleteTask(taskId) {
189
- const context = this.createContext('deleteTask');
190
- await this.storage.delete(this.getTaskKey(taskId), context);
191
- }
192
- /**
193
- * Clears all tasks from storage.
194
- * Useful for testing or administrative purposes.
195
- *
196
- * WARNING: This deletes ALL tasks for the configured tenant.
197
- */
198
- async clearAllTasks() {
199
- const context = this.createContext('clearAllTasks');
200
- // List and delete all tasks
201
- let cursor;
202
- do {
203
- const result = await this.storage.list(this.keyPrefix, context, cursor ? { cursor, limit: 100 } : { limit: 100 });
204
- await Promise.all(result.keys.map((key) => this.storage.delete(key, context)));
205
- cursor = result.nextCursor;
206
- } while (cursor);
207
- }
208
- }
209
- //# sourceMappingURL=storageBackedTaskStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storageBackedTaskStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/storageBackedTaskStore.ts"],"names":[],"mappings":"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"}