@1mcp/agent 0.39.0-beta.2 → 0.39.0-beta.4

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 (761) hide show
  1. package/build/admin/assets/{admin-OAuthServicesWorkspace-CKPMmDQI.js → admin-OAuthServicesWorkspace-CKR1HA-8.js} +1 -1
  2. package/build/admin/assets/{admin-console-CwgYre_s.js → admin-console-OfHKqRm-.js} +3 -3
  3. package/build/admin/index.html +1 -1
  4. package/build/application/services/healthService.js +3 -3
  5. package/build/application/services/healthService.js.map +1 -1
  6. package/build/application/services/tokenEstimationService.d.ts.map +1 -1
  7. package/build/application/services/tokenEstimationService.js +15 -13
  8. package/build/application/services/tokenEstimationService.js.map +1 -1
  9. package/build/auth/oauthAuthority.d.ts +149 -0
  10. package/build/auth/oauthAuthority.d.ts.map +1 -0
  11. package/build/auth/oauthAuthority.js +101 -0
  12. package/build/auth/oauthAuthority.js.map +1 -0
  13. package/build/auth/oauthAuthorizationFlow.d.ts +7 -1
  14. package/build/auth/oauthAuthorizationFlow.d.ts.map +1 -1
  15. package/build/auth/oauthAuthorizationFlow.js +60 -74
  16. package/build/auth/oauthAuthorizationFlow.js.map +1 -1
  17. package/build/auth/oauthEndpointFetch.d.ts +20 -0
  18. package/build/auth/oauthEndpointFetch.d.ts.map +1 -0
  19. package/build/auth/oauthEndpointFetch.js +246 -0
  20. package/build/auth/oauthEndpointFetch.js.map +1 -0
  21. package/build/auth/sessionTypes.d.ts +1 -1
  22. package/build/auth/storage/authCodeRepository.js +2 -2
  23. package/build/auth/storage/authCodeRepository.js.map +1 -1
  24. package/build/auth/storage/authRequestRepository.js +2 -2
  25. package/build/auth/storage/authRequestRepository.js.map +1 -1
  26. package/build/auth/storage/clientDataRepository.js +2 -2
  27. package/build/auth/storage/clientDataRepository.js.map +1 -1
  28. package/build/auth/storage/clientSessionRepository.d.ts +19 -0
  29. package/build/auth/storage/clientSessionRepository.d.ts.map +1 -1
  30. package/build/auth/storage/clientSessionRepository.js +179 -1
  31. package/build/auth/storage/clientSessionRepository.js.map +1 -1
  32. package/build/auth/storage/fileStorageService.d.ts +9 -1
  33. package/build/auth/storage/fileStorageService.d.ts.map +1 -1
  34. package/build/auth/storage/fileStorageService.js +82 -51
  35. package/build/auth/storage/fileStorageService.js.map +1 -1
  36. package/build/auth/storage/inboundOAuthStorage.d.ts +14 -0
  37. package/build/auth/storage/inboundOAuthStorage.d.ts.map +1 -0
  38. package/build/auth/storage/inboundOAuthStorage.js +29 -0
  39. package/build/auth/storage/inboundOAuthStorage.js.map +1 -0
  40. package/build/auth/storage/nativeCredentialStore.d.ts +44 -0
  41. package/build/auth/storage/nativeCredentialStore.d.ts.map +1 -0
  42. package/build/auth/storage/nativeCredentialStore.js +177 -0
  43. package/build/auth/storage/nativeCredentialStore.js.map +1 -0
  44. package/build/auth/storage/oauthStorageService.d.ts +8 -1
  45. package/build/auth/storage/oauthStorageService.d.ts.map +1 -1
  46. package/build/auth/storage/oauthStorageService.js +69 -49
  47. package/build/auth/storage/oauthStorageService.js.map +1 -1
  48. package/build/auth/storage/protectedRecordStorage.d.ts +129 -0
  49. package/build/auth/storage/protectedRecordStorage.d.ts.map +1 -0
  50. package/build/auth/storage/protectedRecordStorage.js +1139 -0
  51. package/build/auth/storage/protectedRecordStorage.js.map +1 -0
  52. package/build/auth/storage/sessionRepository.d.ts.map +1 -1
  53. package/build/auth/storage/sessionRepository.js +13 -3
  54. package/build/auth/storage/sessionRepository.js.map +1 -1
  55. package/build/auth/storage/upstreamOAuthStorage.d.ts +15 -0
  56. package/build/auth/storage/upstreamOAuthStorage.d.ts.map +1 -0
  57. package/build/auth/storage/upstreamOAuthStorage.js +25 -0
  58. package/build/auth/storage/upstreamOAuthStorage.js.map +1 -0
  59. package/build/auth/storage/upstreamOAuthStoragePath.d.ts +3 -0
  60. package/build/auth/storage/upstreamOAuthStoragePath.d.ts.map +1 -0
  61. package/build/auth/storage/upstreamOAuthStoragePath.js +8 -0
  62. package/build/auth/storage/upstreamOAuthStoragePath.js.map +1 -0
  63. package/build/cli.d.ts +4 -0
  64. package/build/cli.d.ts.map +1 -0
  65. package/build/cli.js +133 -0
  66. package/build/cli.js.map +1 -0
  67. package/build/commands/auth/exportOAuthCredentials.d.ts +9 -0
  68. package/build/commands/auth/exportOAuthCredentials.d.ts.map +1 -0
  69. package/build/commands/auth/exportOAuthCredentials.js +71 -0
  70. package/build/commands/auth/exportOAuthCredentials.js.map +1 -0
  71. package/build/commands/auth/exportUpstreamCredentials.d.ts +5 -0
  72. package/build/commands/auth/exportUpstreamCredentials.d.ts.map +1 -0
  73. package/build/commands/auth/exportUpstreamCredentials.js +6 -0
  74. package/build/commands/auth/exportUpstreamCredentials.js.map +1 -0
  75. package/build/commands/auth/index.d.ts.map +1 -1
  76. package/build/commands/auth/index.js +23 -1
  77. package/build/commands/auth/index.js.map +1 -1
  78. package/build/commands/cliSetup/setupFiles.js +1 -1
  79. package/build/commands/cliSetup/setupFiles.js.map +1 -1
  80. package/build/commands/inspect/inspectUtils.d.ts.map +1 -1
  81. package/build/commands/inspect/inspectUtils.js +2 -3
  82. package/build/commands/inspect/inspectUtils.js.map +1 -1
  83. package/build/commands/mcp/install.js +7 -7
  84. package/build/commands/mcp/install.js.map +1 -1
  85. package/build/commands/mcp/installSource.js +2 -2
  86. package/build/commands/mcp/installSource.js.map +1 -1
  87. package/build/commands/mcp/tokens.js +6 -6
  88. package/build/commands/mcp/tokens.js.map +1 -1
  89. package/build/commands/mcp/uninstall.js +4 -4
  90. package/build/commands/mcp/uninstall.js.map +1 -1
  91. package/build/commands/mcp/utils/installWizard.js +2 -2
  92. package/build/commands/mcp/utils/installWizard.js.map +1 -1
  93. package/build/commands/mcp/utils/mcpServerConfig.js +5 -5
  94. package/build/commands/mcp/utils/mcpServerConfig.js.map +1 -1
  95. package/build/commands/mcp/utils/serverUtils.js +4 -4
  96. package/build/commands/mcp/utils/serverUtils.js.map +1 -1
  97. package/build/commands/mcp/wizard/search.js +1 -1
  98. package/build/commands/mcp/wizard/search.js.map +1 -1
  99. package/build/commands/preset/create.js +1 -1
  100. package/build/commands/preset/create.js.map +1 -1
  101. package/build/commands/preset/delete.js +1 -1
  102. package/build/commands/preset/delete.js.map +1 -1
  103. package/build/commands/preset/edit.js +1 -1
  104. package/build/commands/preset/edit.js.map +1 -1
  105. package/build/commands/preset/interactive.js +1 -1
  106. package/build/commands/preset/interactive.js.map +1 -1
  107. package/build/commands/preset/list.js +1 -1
  108. package/build/commands/preset/list.js.map +1 -1
  109. package/build/commands/preset/show.js +1 -1
  110. package/build/commands/preset/show.js.map +1 -1
  111. package/build/commands/preset/test.js +1 -1
  112. package/build/commands/preset/test.js.map +1 -1
  113. package/build/commands/preset/url.js +1 -1
  114. package/build/commands/preset/url.js.map +1 -1
  115. package/build/commands/proxy/proxy.js +13 -13
  116. package/build/commands/proxy/proxy.js.map +1 -1
  117. package/build/commands/registry/search.js +2 -2
  118. package/build/commands/registry/search.js.map +1 -1
  119. package/build/commands/registry/show.d.ts.map +1 -1
  120. package/build/commands/registry/show.js +2 -2
  121. package/build/commands/registry/show.js.map +1 -1
  122. package/build/commands/registry/status.js +2 -2
  123. package/build/commands/registry/status.js.map +1 -1
  124. package/build/commands/registry/versions.js +2 -2
  125. package/build/commands/registry/versions.js.map +1 -1
  126. package/build/commands/run/run.js +3 -3
  127. package/build/commands/run/run.js.map +1 -1
  128. package/build/commands/run/runUtils.js +2 -2
  129. package/build/commands/run/runUtils.js.map +1 -1
  130. package/build/commands/serve/cooperativeRuntime.d.ts.map +1 -1
  131. package/build/commands/serve/cooperativeRuntime.js +24 -20
  132. package/build/commands/serve/cooperativeRuntime.js.map +1 -1
  133. package/build/commands/serve/index.d.ts +5 -0
  134. package/build/commands/serve/index.d.ts.map +1 -1
  135. package/build/commands/serve/index.js +5 -0
  136. package/build/commands/serve/index.js.map +1 -1
  137. package/build/commands/serve/serveBackground.d.ts.map +1 -1
  138. package/build/commands/serve/serveBackground.js +5 -5
  139. package/build/commands/serve/serveBackground.js.map +1 -1
  140. package/build/commands/serve/serveLifecycleError.d.ts +16 -0
  141. package/build/commands/serve/serveLifecycleError.d.ts.map +1 -0
  142. package/build/commands/serve/serveLifecycleError.js +31 -0
  143. package/build/commands/serve/serveLifecycleError.js.map +1 -0
  144. package/build/commands/serve/serveOptions.d.ts.map +1 -1
  145. package/build/commands/serve/serveOptions.js +14 -18
  146. package/build/commands/serve/serveOptions.js.map +1 -1
  147. package/build/commands/serve/serveStop.js +5 -5
  148. package/build/commands/serve/serveStop.js.map +1 -1
  149. package/build/commands/shared/authProfileStore.d.ts.map +1 -1
  150. package/build/commands/shared/authProfileStore.js +4 -2
  151. package/build/commands/shared/authProfileStore.js.map +1 -1
  152. package/build/commands/shared/baseConfigUtils.d.ts.map +1 -1
  153. package/build/commands/shared/baseConfigUtils.js +12 -12
  154. package/build/commands/shared/baseConfigUtils.js.map +1 -1
  155. package/build/commands/shared/clientSurfaceAttachment.d.ts.map +1 -1
  156. package/build/commands/shared/clientSurfaceAttachment.js +4 -2
  157. package/build/commands/shared/clientSurfaceAttachment.js.map +1 -1
  158. package/build/commands/shared/configParsingUtils.js +1 -1
  159. package/build/commands/shared/configParsingUtils.js.map +1 -1
  160. package/build/commands/shared/connectionHelper.d.ts.map +1 -1
  161. package/build/commands/shared/connectionHelper.js +17 -18
  162. package/build/commands/shared/connectionHelper.js.map +1 -1
  163. package/build/commands/shared/inspectApiSchemas.d.ts +20 -20
  164. package/build/config/configLoader.d.ts.map +1 -1
  165. package/build/config/configLoader.js +38 -38
  166. package/build/config/configLoader.js.map +1 -1
  167. package/build/config/configManager.d.ts.map +1 -1
  168. package/build/config/configManager.js +65 -26
  169. package/build/config/configManager.js.map +1 -1
  170. package/build/config/configWatcher.d.ts.map +1 -1
  171. package/build/config/configWatcher.js +15 -18
  172. package/build/config/configWatcher.js.map +1 -1
  173. package/build/config/envProcessor.d.ts.map +1 -1
  174. package/build/config/envProcessor.js +9 -9
  175. package/build/config/envProcessor.js.map +1 -1
  176. package/build/config/mcpConfigManager.d.ts.map +1 -1
  177. package/build/config/mcpConfigManager.js +24 -28
  178. package/build/config/mcpConfigManager.js.map +1 -1
  179. package/build/config/projectConfigLoader.d.ts.map +1 -1
  180. package/build/config/projectConfigLoader.js +14 -11
  181. package/build/config/projectConfigLoader.js.map +1 -1
  182. package/build/config/templateProcessor.d.ts.map +1 -1
  183. package/build/config/templateProcessor.js +5 -5
  184. package/build/config/templateProcessor.js.map +1 -1
  185. package/build/constants/mcp.d.ts +1 -1
  186. package/build/constants/mcp.js +1 -1
  187. package/build/core/capabilities/asyncLoadingOrchestrator.d.ts.map +1 -1
  188. package/build/core/capabilities/asyncLoadingOrchestrator.js +67 -38
  189. package/build/core/capabilities/asyncLoadingOrchestrator.js.map +1 -1
  190. package/build/core/capabilities/capabilityAggregator.d.ts +3 -1
  191. package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -1
  192. package/build/core/capabilities/capabilityAggregator.js +9 -2
  193. package/build/core/capabilities/capabilityAggregator.js.map +1 -1
  194. package/build/core/capabilities/capabilityCatalog.d.ts +24 -1
  195. package/build/core/capabilities/capabilityCatalog.d.ts.map +1 -1
  196. package/build/core/capabilities/capabilityCatalog.js +412 -41
  197. package/build/core/capabilities/capabilityCatalog.js.map +1 -1
  198. package/build/core/capabilities/capabilityManager.js +8 -8
  199. package/build/core/capabilities/capabilityManager.js.map +1 -1
  200. package/build/core/capabilities/capabilityPagination.d.ts +34 -1
  201. package/build/core/capabilities/capabilityPagination.d.ts.map +1 -1
  202. package/build/core/capabilities/capabilityPagination.js +238 -31
  203. package/build/core/capabilities/capabilityPagination.js.map +1 -1
  204. package/build/core/capabilities/capabilityVisibility.d.ts +13 -1
  205. package/build/core/capabilities/capabilityVisibility.d.ts.map +1 -1
  206. package/build/core/capabilities/capabilityVisibility.js +24 -1
  207. package/build/core/capabilities/capabilityVisibility.js.map +1 -1
  208. package/build/core/capabilities/catalogGeneration.d.ts.map +1 -1
  209. package/build/core/capabilities/catalogGeneration.js +20 -1
  210. package/build/core/capabilities/catalogGeneration.js.map +1 -1
  211. package/build/core/capabilities/configuredToolSnapshot.d.ts +1 -0
  212. package/build/core/capabilities/configuredToolSnapshot.d.ts.map +1 -1
  213. package/build/core/capabilities/configuredToolSnapshot.js +30 -4
  214. package/build/core/capabilities/configuredToolSnapshot.js.map +1 -1
  215. package/build/core/capabilities/internalCapabilitiesProvider.d.ts.map +1 -1
  216. package/build/core/capabilities/internalCapabilitiesProvider.js +6 -14
  217. package/build/core/capabilities/internalCapabilitiesProvider.js.map +1 -1
  218. package/build/core/capabilities/lazyLoadingOrchestrator.d.ts +2 -0
  219. package/build/core/capabilities/lazyLoadingOrchestrator.d.ts.map +1 -1
  220. package/build/core/capabilities/lazyLoadingOrchestrator.js +37 -31
  221. package/build/core/capabilities/lazyLoadingOrchestrator.js.map +1 -1
  222. package/build/core/capabilities/metaToolProvider.d.ts +3 -1
  223. package/build/core/capabilities/metaToolProvider.d.ts.map +1 -1
  224. package/build/core/capabilities/metaToolProvider.js +45 -13
  225. package/build/core/capabilities/metaToolProvider.js.map +1 -1
  226. package/build/core/capabilities/runtimeCapabilityCatalog.d.ts +18 -3
  227. package/build/core/capabilities/runtimeCapabilityCatalog.d.ts.map +1 -1
  228. package/build/core/capabilities/runtimeCapabilityCatalog.js +181 -17
  229. package/build/core/capabilities/runtimeCapabilityCatalog.js.map +1 -1
  230. package/build/core/capabilities/schemaCache.d.ts.map +1 -1
  231. package/build/core/capabilities/schemaCache.js +53 -15
  232. package/build/core/capabilities/schemaCache.js.map +1 -1
  233. package/build/core/capabilities/schemas/metaToolSchemas.d.ts +4 -3
  234. package/build/core/capabilities/schemas/metaToolSchemas.d.ts.map +1 -1
  235. package/build/core/capabilities/schemas/metaToolSchemas.js +1 -0
  236. package/build/core/capabilities/schemas/metaToolSchemas.js.map +1 -1
  237. package/build/core/capabilities/toolRegistry.d.ts +7 -3
  238. package/build/core/capabilities/toolRegistry.d.ts.map +1 -1
  239. package/build/core/capabilities/toolRegistry.js +34 -19
  240. package/build/core/capabilities/toolRegistry.js.map +1 -1
  241. package/build/core/client/postAuthOAuthRecovery.d.ts.map +1 -1
  242. package/build/core/client/postAuthOAuthRecovery.js +5 -3
  243. package/build/core/client/postAuthOAuthRecovery.js.map +1 -1
  244. package/build/core/configChangeHandler.d.ts.map +1 -1
  245. package/build/core/configChangeHandler.js +44 -65
  246. package/build/core/configChangeHandler.js.map +1 -1
  247. package/build/core/context/globalContextManager.d.ts.map +1 -1
  248. package/build/core/context/globalContextManager.js +6 -6
  249. package/build/core/context/globalContextManager.js.map +1 -1
  250. package/build/core/filtering/clientFiltering.d.ts.map +1 -1
  251. package/build/core/filtering/clientFiltering.js +16 -67
  252. package/build/core/filtering/clientFiltering.js.map +1 -1
  253. package/build/core/filtering/clientTemplateTracker.d.ts.map +1 -1
  254. package/build/core/filtering/clientTemplateTracker.js +13 -41
  255. package/build/core/filtering/clientTemplateTracker.js.map +1 -1
  256. package/build/core/filtering/filterCache.d.ts.map +1 -1
  257. package/build/core/filtering/filterCache.js +13 -32
  258. package/build/core/filtering/filterCache.js.map +1 -1
  259. package/build/core/filtering/filteringService.d.ts.map +1 -1
  260. package/build/core/filtering/filteringService.js +22 -80
  261. package/build/core/filtering/filteringService.js.map +1 -1
  262. package/build/core/filtering/templateFilteringService.d.ts.map +1 -1
  263. package/build/core/filtering/templateFilteringService.js +25 -89
  264. package/build/core/filtering/templateFilteringService.js.map +1 -1
  265. package/build/core/filtering/templateIndex.d.ts.map +1 -1
  266. package/build/core/filtering/templateIndex.js +11 -23
  267. package/build/core/filtering/templateIndex.js.map +1 -1
  268. package/build/core/flags/flagManager.d.ts.map +1 -1
  269. package/build/core/flags/flagManager.js +2 -5
  270. package/build/core/flags/flagManager.js.map +1 -1
  271. package/build/core/instructions/instructionAggregator.d.ts.map +1 -1
  272. package/build/core/instructions/instructionAggregator.js +18 -36
  273. package/build/core/instructions/instructionAggregator.js.map +1 -1
  274. package/build/core/instructions/templateTypes.d.ts +1 -1
  275. package/build/core/instructions/templateTypes.d.ts.map +1 -1
  276. package/build/core/instructions/templateTypes.js +3 -3
  277. package/build/core/loading/loadingStateTracker.d.ts.map +1 -1
  278. package/build/core/loading/loadingStateTracker.js +17 -9
  279. package/build/core/loading/loadingStateTracker.js.map +1 -1
  280. package/build/core/loading/mcpLoadingManager.d.ts.map +1 -1
  281. package/build/core/loading/mcpLoadingManager.js +33 -30
  282. package/build/core/loading/mcpLoadingManager.js.map +1 -1
  283. package/build/core/loading/parallelExecutor.d.ts.map +1 -1
  284. package/build/core/loading/parallelExecutor.js +1 -4
  285. package/build/core/loading/parallelExecutor.js.map +1 -1
  286. package/build/core/notifications/notificationManager.js +11 -11
  287. package/build/core/notifications/notificationManager.js.map +1 -1
  288. package/build/core/protocol/requestHandlerUtils.d.ts +2 -2
  289. package/build/core/protocol/requestHandlerUtils.d.ts.map +1 -1
  290. package/build/core/protocol/requestHandlerUtils.js +7 -4
  291. package/build/core/protocol/requestHandlerUtils.js.map +1 -1
  292. package/build/core/server/adapters/TemplateServerAdapter.js +3 -3
  293. package/build/core/server/adapters/TemplateServerAdapter.js.map +1 -1
  294. package/build/core/server/agentConfig.d.ts +1 -0
  295. package/build/core/server/agentConfig.d.ts.map +1 -1
  296. package/build/core/server/agentConfig.js +1 -0
  297. package/build/core/server/agentConfig.js.map +1 -1
  298. package/build/core/server/connectionResolver.d.ts.map +1 -1
  299. package/build/core/server/connectionResolver.js +7 -13
  300. package/build/core/server/connectionResolver.js.map +1 -1
  301. package/build/core/server/disabledTools.d.ts +1 -1
  302. package/build/core/server/disabledTools.d.ts.map +1 -1
  303. package/build/core/server/disabledTools.js +18 -25
  304. package/build/core/server/disabledTools.js.map +1 -1
  305. package/build/core/server/pidFileManager.js +6 -6
  306. package/build/core/server/pidFileManager.js.map +1 -1
  307. package/build/core/server/processIdentity.d.ts.map +1 -1
  308. package/build/core/server/processIdentity.js +67 -18
  309. package/build/core/server/processIdentity.js.map +1 -1
  310. package/build/core/server/runtimeLaunchIpc.d.ts +15 -2
  311. package/build/core/server/runtimeLaunchIpc.d.ts.map +1 -1
  312. package/build/core/server/runtimeLifecycle.js +2 -2
  313. package/build/core/server/runtimeLifecycle.js.map +1 -1
  314. package/build/core/server/runtimeReplacementConfig.d.ts +15 -2
  315. package/build/core/server/runtimeReplacementConfig.d.ts.map +1 -1
  316. package/build/core/server/runtimeScopeOwnership.js +1 -1
  317. package/build/core/server/runtimeScopeOwnership.js.map +1 -1
  318. package/build/core/server/templateConfigurationManager.js +16 -15
  319. package/build/core/server/templateConfigurationManager.js.map +1 -1
  320. package/build/core/server/toolDescriptionOverrides.d.ts +1 -0
  321. package/build/core/server/toolDescriptionOverrides.d.ts.map +1 -1
  322. package/build/core/server/toolDescriptionOverrides.js +30 -5
  323. package/build/core/server/toolDescriptionOverrides.js.map +1 -1
  324. package/build/core/tools/handlers/registryHandler.d.ts.map +1 -1
  325. package/build/core/tools/handlers/registryHandler.js +2 -6
  326. package/build/core/tools/handlers/registryHandler.js.map +1 -1
  327. package/build/core/tools/handlers/searchHandler.js +2 -2
  328. package/build/core/tools/handlers/searchHandler.js.map +1 -1
  329. package/build/core/tools/handlers/serverManagementHandler.d.ts +21 -0
  330. package/build/core/tools/handlers/serverManagementHandler.d.ts.map +1 -1
  331. package/build/core/tools/handlers/serverManagementHandler.js +11 -20
  332. package/build/core/tools/handlers/serverManagementHandler.js.map +1 -1
  333. package/build/core/tools/handlers/showHandler.js +2 -2
  334. package/build/core/tools/handlers/showHandler.js.map +1 -1
  335. package/build/core/tools/handlers/versionsHandler.js +2 -2
  336. package/build/core/tools/handlers/versionsHandler.js.map +1 -1
  337. package/build/core/tools/internal/adapters/discoveryAdapter.d.ts.map +1 -1
  338. package/build/core/tools/internal/adapters/discoveryAdapter.js +12 -29
  339. package/build/core/tools/internal/adapters/discoveryAdapter.js.map +1 -1
  340. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts +3 -0
  341. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts.map +1 -1
  342. package/build/core/tools/internal/adapters/installation/directInstallation.d.ts.map +1 -1
  343. package/build/core/tools/internal/adapters/installation/directInstallation.js +4 -6
  344. package/build/core/tools/internal/adapters/installation/directInstallation.js.map +1 -1
  345. package/build/core/tools/internal/adapters/installation/packageResolver.d.ts.map +1 -1
  346. package/build/core/tools/internal/adapters/installation/packageResolver.js +8 -14
  347. package/build/core/tools/internal/adapters/installation/packageResolver.js.map +1 -1
  348. package/build/core/tools/internal/adapters/installationAdapter.d.ts.map +1 -1
  349. package/build/core/tools/internal/adapters/installationAdapter.js +38 -35
  350. package/build/core/tools/internal/adapters/installationAdapter.js.map +1 -1
  351. package/build/core/tools/internal/adapters/management/managementAdapter.d.ts +1 -1
  352. package/build/core/tools/internal/adapters/management/managementAdapter.d.ts.map +1 -1
  353. package/build/core/tools/internal/adapters/management/managementAdapter.js +22 -28
  354. package/build/core/tools/internal/adapters/management/managementAdapter.js.map +1 -1
  355. package/build/core/tools/internal/adapters/management/toolHandlers.js +10 -10
  356. package/build/core/tools/internal/adapters/management/toolHandlers.js.map +1 -1
  357. package/build/core/tools/internal/adapters/management/validation.d.ts.map +1 -1
  358. package/build/core/tools/internal/adapters/management/validation.js +6 -3
  359. package/build/core/tools/internal/adapters/management/validation.js.map +1 -1
  360. package/build/core/tools/internal/discoveryHandlers.d.ts.map +1 -1
  361. package/build/core/tools/internal/discoveryHandlers.js +10 -25
  362. package/build/core/tools/internal/discoveryHandlers.js.map +1 -1
  363. package/build/core/tools/internal/index.js +3 -3
  364. package/build/core/tools/internal/index.js.map +1 -1
  365. package/build/core/tools/internal/installationHandlers.d.ts.map +1 -1
  366. package/build/core/tools/internal/installationHandlers.js +9 -27
  367. package/build/core/tools/internal/installationHandlers.js.map +1 -1
  368. package/build/core/tools/internal/managementHandlers.d.ts.map +1 -1
  369. package/build/core/tools/internal/managementHandlers.js +10 -25
  370. package/build/core/tools/internal/managementHandlers.js.map +1 -1
  371. package/build/core/tools/internal/schemas/discovery.d.ts +1 -1
  372. package/build/core/tools/internal/schemas/index.d.ts +7 -7
  373. package/build/core/tools/internal/schemas/installation.d.ts +1 -1
  374. package/build/core/tools/internal/schemas/management.d.ts +5 -5
  375. package/build/core/types/transport.d.ts +26 -3
  376. package/build/core/types/transport.d.ts.map +1 -1
  377. package/build/core/types/transport.js +12 -0
  378. package/build/core/types/transport.js.map +1 -1
  379. package/build/domains/admin/configuredToolInventory.d.ts.map +1 -1
  380. package/build/domains/admin/configuredToolInventory.js +47 -9
  381. package/build/domains/admin/configuredToolInventory.js.map +1 -1
  382. package/build/domains/admin/runtimeConfiguredToolInspectionService.d.ts.map +1 -1
  383. package/build/domains/admin/runtimeConfiguredToolInspectionService.js +13 -3
  384. package/build/domains/admin/runtimeConfiguredToolInspectionService.js.map +1 -1
  385. package/build/domains/admin/runtimeScopeAdminLock.js +2 -3
  386. package/build/domains/admin/runtimeScopeAdminLock.js.map +1 -1
  387. package/build/domains/backend-logs/backendLogBroker.d.ts +2 -0
  388. package/build/domains/backend-logs/backendLogBroker.d.ts.map +1 -1
  389. package/build/domains/backend-logs/backendLogBroker.js +7 -0
  390. package/build/domains/backend-logs/backendLogBroker.js.map +1 -1
  391. package/build/domains/backend-logs/backendLogProjection.d.ts.map +1 -1
  392. package/build/domains/backend-logs/backendLogProjection.js +2 -13
  393. package/build/domains/backend-logs/backendLogProjection.js.map +1 -1
  394. package/build/domains/config-change/configChange.js +3 -3
  395. package/build/domains/config-change/configChange.js.map +1 -1
  396. package/build/domains/preset/manager/presetManager.d.ts.map +1 -1
  397. package/build/domains/preset/manager/presetManager.js +29 -66
  398. package/build/domains/preset/manager/presetManager.js.map +1 -1
  399. package/build/domains/preset/manager/presetManagerCleanup.js +8 -8
  400. package/build/domains/preset/manager/presetManagerCleanup.js.map +1 -1
  401. package/build/domains/preset/manager/presetTesting.js +1 -7
  402. package/build/domains/preset/manager/presetTesting.js.map +1 -1
  403. package/build/domains/preset/services/presetNotificationService.d.ts.map +1 -1
  404. package/build/domains/preset/services/presetNotificationService.js +15 -32
  405. package/build/domains/preset/services/presetNotificationService.js.map +1 -1
  406. package/build/domains/registry/cacheManager.d.ts.map +1 -1
  407. package/build/domains/registry/cacheManager.js +5 -6
  408. package/build/domains/registry/cacheManager.js.map +1 -1
  409. package/build/domains/registry/mcpRegistryClient.js +11 -11
  410. package/build/domains/registry/mcpRegistryClient.js.map +1 -1
  411. package/build/domains/server-management/progressTrackingService.d.ts.map +1 -1
  412. package/build/domains/server-management/progressTrackingService.js +7 -10
  413. package/build/domains/server-management/progressTrackingService.js.map +1 -1
  414. package/build/domains/server-management/serverInstallationService.d.ts.map +1 -1
  415. package/build/domains/server-management/serverInstallationService.js +14 -12
  416. package/build/domains/server-management/serverInstallationService.js.map +1 -1
  417. package/build/gateway/adapters/legacy/legacyInboundEraAdapter.d.ts.map +1 -1
  418. package/build/gateway/adapters/legacy/legacyInboundEraAdapter.js +2 -1
  419. package/build/gateway/adapters/legacy/legacyInboundEraAdapter.js.map +1 -1
  420. package/build/gateway/adapters/legacy/legacyOutboundEraAdapter.d.ts +4 -1
  421. package/build/gateway/adapters/legacy/legacyOutboundEraAdapter.d.ts.map +1 -1
  422. package/build/gateway/adapters/legacy/legacyOutboundEraAdapter.js +4 -1
  423. package/build/gateway/adapters/legacy/legacyOutboundEraAdapter.js.map +1 -1
  424. package/build/gateway/adapters/modern/modernInboundEraAdapter.d.ts.map +1 -1
  425. package/build/gateway/adapters/modern/modernInboundEraAdapter.js +5 -4
  426. package/build/gateway/adapters/modern/modernInboundEraAdapter.js.map +1 -1
  427. package/build/gateway/adapters/modern/modernOutboundEraAdapter.d.ts.map +1 -1
  428. package/build/gateway/adapters/modern/modernOutboundEraAdapter.js +18 -5
  429. package/build/gateway/adapters/modern/modernOutboundEraAdapter.js.map +1 -1
  430. package/build/gateway/contracts/gatewayFailure.d.ts +39 -1
  431. package/build/gateway/contracts/gatewayFailure.d.ts.map +1 -1
  432. package/build/gateway/contracts/gatewayFailure.js +139 -0
  433. package/build/gateway/contracts/gatewayFailure.js.map +1 -1
  434. package/build/gateway/contracts/gatewayRequest.d.ts +6 -6
  435. package/build/gateway/contracts/immutableJson.d.ts +2 -1
  436. package/build/gateway/contracts/immutableJson.d.ts.map +1 -1
  437. package/build/gateway/contracts/immutableJson.js +2 -2
  438. package/build/gateway/contracts/immutableJson.js.map +1 -1
  439. package/build/gateway/core/gatewayDispatcher.js +1 -1
  440. package/build/gateway/core/gatewayDispatcher.js.map +1 -1
  441. package/build/gateway/interactions/interactionBroker.d.ts.map +1 -1
  442. package/build/gateway/interactions/interactionBroker.js +5 -3
  443. package/build/gateway/interactions/interactionBroker.js.map +1 -1
  444. package/build/gateway/interactions/nativeInputResponses.d.ts +16 -0
  445. package/build/gateway/interactions/nativeInputResponses.d.ts.map +1 -0
  446. package/build/gateway/interactions/nativeInputResponses.js +76 -0
  447. package/build/gateway/interactions/nativeInputResponses.js.map +1 -0
  448. package/build/gateway/interactions/validateInteractionResponse.d.ts.map +1 -1
  449. package/build/gateway/interactions/validateInteractionResponse.js +20 -1
  450. package/build/gateway/interactions/validateInteractionResponse.js.map +1 -1
  451. package/build/gateway/ports/outboundEraAdapter.d.ts +5 -0
  452. package/build/gateway/ports/outboundEraAdapter.d.ts.map +1 -1
  453. package/build/index.d.ts +1 -3
  454. package/build/index.d.ts.map +1 -1
  455. package/build/index.js +7 -131
  456. package/build/index.js.map +1 -1
  457. package/build/logger/backgroundSupervisorLogger.d.ts +4 -0
  458. package/build/logger/backgroundSupervisorLogger.d.ts.map +1 -0
  459. package/build/logger/backgroundSupervisorLogger.js +21 -0
  460. package/build/logger/backgroundSupervisorLogger.js.map +1 -0
  461. package/build/logger/diagnosticRedaction.d.ts +3 -0
  462. package/build/logger/diagnosticRedaction.d.ts.map +1 -0
  463. package/build/logger/diagnosticRedaction.js +12 -0
  464. package/build/logger/diagnosticRedaction.js.map +1 -0
  465. package/build/logger/httpDiagnostics.d.ts +25 -0
  466. package/build/logger/httpDiagnostics.d.ts.map +1 -0
  467. package/build/logger/httpDiagnostics.js +125 -0
  468. package/build/logger/httpDiagnostics.js.map +1 -0
  469. package/build/logger/localDiagnosticRecord.d.ts +11 -0
  470. package/build/logger/localDiagnosticRecord.d.ts.map +1 -0
  471. package/build/logger/localDiagnosticRecord.js +9 -0
  472. package/build/logger/localDiagnosticRecord.js.map +1 -0
  473. package/build/logger/localDiagnostics.d.ts +5 -0
  474. package/build/logger/localDiagnostics.d.ts.map +1 -0
  475. package/build/logger/localDiagnostics.js +116 -0
  476. package/build/logger/localDiagnostics.js.map +1 -0
  477. package/build/logger/logger.d.ts +39 -37
  478. package/build/logger/logger.d.ts.map +1 -1
  479. package/build/logger/logger.js +120 -154
  480. package/build/logger/logger.js.map +1 -1
  481. package/build/logger/secureLogger.d.ts +3 -9
  482. package/build/logger/secureLogger.d.ts.map +1 -1
  483. package/build/logger/secureLogger.js +4 -30
  484. package/build/logger/secureLogger.js.map +1 -1
  485. package/build/observability/events/normalize.d.ts +14 -0
  486. package/build/observability/events/normalize.d.ts.map +1 -0
  487. package/build/observability/events/normalize.js +39 -0
  488. package/build/observability/events/normalize.js.map +1 -0
  489. package/build/observability/events/registry.d.ts +5697 -0
  490. package/build/observability/events/registry.d.ts.map +1 -0
  491. package/build/observability/events/registry.js +5674 -0
  492. package/build/observability/events/registry.js.map +1 -0
  493. package/build/observability/privacy/fields.d.ts +25 -0
  494. package/build/observability/privacy/fields.d.ts.map +1 -0
  495. package/build/observability/privacy/fields.js +195 -0
  496. package/build/observability/privacy/fields.js.map +1 -0
  497. package/build/observability/tracing/bootstrap.d.ts +3 -0
  498. package/build/observability/tracing/bootstrap.d.ts.map +1 -0
  499. package/build/observability/tracing/bootstrap.js +6 -0
  500. package/build/observability/tracing/bootstrap.js.map +1 -0
  501. package/build/observability/tracing/context.d.ts +4 -0
  502. package/build/observability/tracing/context.d.ts.map +1 -0
  503. package/build/observability/tracing/context.js +3 -0
  504. package/build/observability/tracing/context.js.map +1 -0
  505. package/build/observability/tracing/otelAdapter.d.ts +17 -0
  506. package/build/observability/tracing/otelAdapter.d.ts.map +1 -0
  507. package/build/observability/tracing/otelAdapter.js +160 -0
  508. package/build/observability/tracing/otelAdapter.js.map +1 -0
  509. package/build/sdk/contracts/catalogCoverageInvalidation.d.ts +4 -0
  510. package/build/sdk/contracts/catalogCoverageInvalidation.d.ts.map +1 -0
  511. package/build/sdk/contracts/catalogCoverageInvalidation.js +13 -0
  512. package/build/sdk/contracts/catalogCoverageInvalidation.js.map +1 -0
  513. package/build/sdk/contracts/jsonValue.d.ts +30 -7
  514. package/build/sdk/contracts/jsonValue.d.ts.map +1 -1
  515. package/build/sdk/contracts/jsonValue.js +37 -9
  516. package/build/sdk/contracts/jsonValue.js.map +1 -1
  517. package/build/sdk/contracts/mcpParamHeaders.d.ts +17 -0
  518. package/build/sdk/contracts/mcpParamHeaders.d.ts.map +1 -0
  519. package/build/sdk/contracts/mcpParamHeaders.js +134 -0
  520. package/build/sdk/contracts/mcpParamHeaders.js.map +1 -0
  521. package/build/sdk/contracts/requestProgress.d.ts +29 -0
  522. package/build/sdk/contracts/requestProgress.d.ts.map +1 -0
  523. package/build/sdk/contracts/requestProgress.js +126 -0
  524. package/build/sdk/contracts/requestProgress.js.map +1 -0
  525. package/build/sdk/legacy/auth/sdkOAuthClientProvider.d.ts +77 -84
  526. package/build/sdk/legacy/auth/sdkOAuthClientProvider.d.ts.map +1 -1
  527. package/build/sdk/legacy/auth/sdkOAuthClientProvider.js +632 -209
  528. package/build/sdk/legacy/auth/sdkOAuthClientProvider.js.map +1 -1
  529. package/build/sdk/legacy/auth/sdkOAuthServerProvider.d.ts.map +1 -1
  530. package/build/sdk/legacy/auth/sdkOAuthServerProvider.js +42 -37
  531. package/build/sdk/legacy/auth/sdkOAuthServerProvider.js.map +1 -1
  532. package/build/sdk/legacy/client/runtime/clientManager.d.ts +5 -1
  533. package/build/sdk/legacy/client/runtime/clientManager.d.ts.map +1 -1
  534. package/build/sdk/legacy/client/runtime/clientManager.js +247 -93
  535. package/build/sdk/legacy/client/runtime/clientManager.js.map +1 -1
  536. package/build/sdk/legacy/client/runtime/connectionHandler.d.ts.map +1 -1
  537. package/build/sdk/legacy/client/runtime/connectionHandler.js +77 -15
  538. package/build/sdk/legacy/client/runtime/connectionHandler.js.map +1 -1
  539. package/build/sdk/legacy/client/runtime/legacyInteractionLease.d.ts +2 -1
  540. package/build/sdk/legacy/client/runtime/legacyInteractionLease.d.ts.map +1 -1
  541. package/build/sdk/legacy/client/runtime/legacyInteractionLease.js +11 -2
  542. package/build/sdk/legacy/client/runtime/legacyInteractionLease.js.map +1 -1
  543. package/build/sdk/legacy/client/runtime/legacySdkClientAdapter.d.ts.map +1 -1
  544. package/build/sdk/legacy/client/runtime/legacySdkClientAdapter.js +40 -12
  545. package/build/sdk/legacy/client/runtime/legacySdkClientAdapter.js.map +1 -1
  546. package/build/sdk/legacy/client/runtime/mcpParamHeaders.d.ts +2 -0
  547. package/build/sdk/legacy/client/runtime/mcpParamHeaders.d.ts.map +1 -0
  548. package/build/sdk/legacy/client/runtime/mcpParamHeaders.js +2 -0
  549. package/build/sdk/legacy/client/runtime/mcpParamHeaders.js.map +1 -0
  550. package/build/sdk/legacy/client/runtime/modernSdkClientAdapter.d.ts +6 -0
  551. package/build/sdk/legacy/client/runtime/modernSdkClientAdapter.d.ts.map +1 -1
  552. package/build/sdk/legacy/client/runtime/modernSdkClientAdapter.js +119 -6
  553. package/build/sdk/legacy/client/runtime/modernSdkClientAdapter.js.map +1 -1
  554. package/build/sdk/legacy/client/runtime/oauthFlowHandler.d.ts +1 -1
  555. package/build/sdk/legacy/client/runtime/oauthFlowHandler.d.ts.map +1 -1
  556. package/build/sdk/legacy/client/runtime/oauthFlowHandler.js +73 -21
  557. package/build/sdk/legacy/client/runtime/oauthFlowHandler.js.map +1 -1
  558. package/build/sdk/legacy/client/runtime/serveClient.js +1 -1
  559. package/build/sdk/legacy/client/runtime/serveClient.js.map +1 -1
  560. package/build/sdk/legacy/commands/serve.d.ts +1 -0
  561. package/build/sdk/legacy/commands/serve.d.ts.map +1 -1
  562. package/build/sdk/legacy/commands/serve.js +99 -88
  563. package/build/sdk/legacy/commands/serve.js.map +1 -1
  564. package/build/sdk/legacy/server/protocol/notificationHandlers.d.ts.map +1 -1
  565. package/build/sdk/legacy/server/protocol/notificationHandlers.js +9 -14
  566. package/build/sdk/legacy/server/protocol/notificationHandlers.js.map +1 -1
  567. package/build/sdk/legacy/server/protocol/privateInteractionConnection.d.ts +1 -1
  568. package/build/sdk/legacy/server/protocol/privateInteractionConnection.d.ts.map +1 -1
  569. package/build/sdk/legacy/server/protocol/privateInteractionConnection.js +31 -11
  570. package/build/sdk/legacy/server/protocol/privateInteractionConnection.js.map +1 -1
  571. package/build/sdk/legacy/server/protocol/promptRequestHandlers.d.ts.map +1 -1
  572. package/build/sdk/legacy/server/protocol/promptRequestHandlers.js +10 -5
  573. package/build/sdk/legacy/server/protocol/promptRequestHandlers.js.map +1 -1
  574. package/build/sdk/legacy/server/protocol/requestHandlers.js +4 -4
  575. package/build/sdk/legacy/server/protocol/requestHandlers.js.map +1 -1
  576. package/build/sdk/legacy/server/protocol/requestInteractionScope.d.ts.map +1 -1
  577. package/build/sdk/legacy/server/protocol/requestInteractionScope.js +68 -12
  578. package/build/sdk/legacy/server/protocol/requestInteractionScope.js.map +1 -1
  579. package/build/sdk/legacy/server/protocol/requestProviderProgress.d.ts +8 -0
  580. package/build/sdk/legacy/server/protocol/requestProviderProgress.d.ts.map +1 -0
  581. package/build/sdk/legacy/server/protocol/requestProviderProgress.js +29 -0
  582. package/build/sdk/legacy/server/protocol/requestProviderProgress.js.map +1 -0
  583. package/build/sdk/legacy/server/protocol/resourceRequestHandlers.d.ts.map +1 -1
  584. package/build/sdk/legacy/server/protocol/resourceRequestHandlers.js +23 -2
  585. package/build/sdk/legacy/server/protocol/resourceRequestHandlers.js.map +1 -1
  586. package/build/sdk/legacy/server/protocol/resourceSubscriptions.js +1 -1
  587. package/build/sdk/legacy/server/protocol/resourceSubscriptions.js.map +1 -1
  588. package/build/sdk/legacy/server/protocol/toolRequestHandlers.d.ts.map +1 -1
  589. package/build/sdk/legacy/server/protocol/toolRequestHandlers.js +157 -62
  590. package/build/sdk/legacy/server/protocol/toolRequestHandlers.js.map +1 -1
  591. package/build/sdk/legacy/server/retained-sdk/LICENSE +21 -0
  592. package/build/sdk/legacy/server/retained-sdk/provenance.json +17 -0
  593. package/build/sdk/legacy/server/retained-sdk/streamableHttp.js +160 -0
  594. package/build/sdk/legacy/server/retained-sdk/webStandardStreamableHttp.js +950 -0
  595. package/build/sdk/legacy/server/runtime/clientInstancePool.d.ts.map +1 -1
  596. package/build/sdk/legacy/server/runtime/clientInstancePool.js +45 -76
  597. package/build/sdk/legacy/server/runtime/clientInstancePool.js.map +1 -1
  598. package/build/sdk/legacy/server/runtime/connectionManager.d.ts.map +1 -1
  599. package/build/sdk/legacy/server/runtime/connectionManager.js +25 -18
  600. package/build/sdk/legacy/server/runtime/connectionManager.js.map +1 -1
  601. package/build/sdk/legacy/server/runtime/legacySdkServerAdapter.d.ts +2 -0
  602. package/build/sdk/legacy/server/runtime/legacySdkServerAdapter.d.ts.map +1 -1
  603. package/build/sdk/legacy/server/runtime/legacySdkServerAdapter.js +17 -1
  604. package/build/sdk/legacy/server/runtime/legacySdkServerAdapter.js.map +1 -1
  605. package/build/sdk/legacy/server/runtime/mcpLoggingEnhancer.d.ts.map +1 -1
  606. package/build/sdk/legacy/server/runtime/mcpLoggingEnhancer.js +17 -32
  607. package/build/sdk/legacy/server/runtime/mcpLoggingEnhancer.js.map +1 -1
  608. package/build/sdk/legacy/server/runtime/mcpServerLifecycleManager.d.ts.map +1 -1
  609. package/build/sdk/legacy/server/runtime/mcpServerLifecycleManager.js +33 -42
  610. package/build/sdk/legacy/server/runtime/mcpServerLifecycleManager.js.map +1 -1
  611. package/build/sdk/legacy/server/runtime/serverManager.d.ts.map +1 -1
  612. package/build/sdk/legacy/server/runtime/serverManager.js +26 -32
  613. package/build/sdk/legacy/server/runtime/serverManager.js.map +1 -1
  614. package/build/sdk/legacy/server/runtime/templateServerCleanup.d.ts.map +1 -1
  615. package/build/sdk/legacy/server/runtime/templateServerCleanup.js +15 -43
  616. package/build/sdk/legacy/server/runtime/templateServerCleanup.js.map +1 -1
  617. package/build/sdk/legacy/server/runtime/templateServerManager.d.ts.map +1 -1
  618. package/build/sdk/legacy/server/runtime/templateServerManager.js +37 -38
  619. package/build/sdk/legacy/server/runtime/templateServerManager.js.map +1 -1
  620. package/build/sdk/legacy/server/streamableHttp.js +1 -1
  621. package/build/sdk/legacy/shared/capabilityListCapture.d.ts +2 -2
  622. package/build/sdk/legacy/shared/capabilityListCapture.d.ts.map +1 -1
  623. package/build/sdk/legacy/shared/capabilityListCapture.js +3 -3
  624. package/build/sdk/legacy/shared/capabilityListCapture.js.map +1 -1
  625. package/build/sdk/legacy/shared/resourceTemplateRouting.d.ts.map +1 -1
  626. package/build/sdk/legacy/shared/resourceTemplateRouting.js +29 -11
  627. package/build/sdk/legacy/shared/resourceTemplateRouting.js.map +1 -1
  628. package/build/sdk/legacy/shared/schemaProjection.d.ts +3 -1
  629. package/build/sdk/legacy/shared/schemaProjection.d.ts.map +1 -1
  630. package/build/sdk/legacy/shared/schemaProjection.js +7 -2
  631. package/build/sdk/legacy/shared/schemaProjection.js.map +1 -1
  632. package/build/sdk/legacy/transport/http/loggingSseTransport.d.ts.map +1 -1
  633. package/build/sdk/legacy/transport/http/loggingSseTransport.js +2 -11
  634. package/build/sdk/legacy/transport/http/loggingSseTransport.js.map +1 -1
  635. package/build/sdk/legacy/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -1
  636. package/build/sdk/legacy/transport/http/middlewares/scopeAuthMiddleware.js +13 -2
  637. package/build/sdk/legacy/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -1
  638. package/build/sdk/legacy/transport/http/modernInboundLegacyBridge.d.ts +4 -0
  639. package/build/sdk/legacy/transport/http/modernInboundLegacyBridge.d.ts.map +1 -1
  640. package/build/sdk/legacy/transport/http/modernInboundLegacyBridge.js +14 -2
  641. package/build/sdk/legacy/transport/http/modernInboundLegacyBridge.js.map +1 -1
  642. package/build/sdk/legacy/transport/http/routes/sseRoutes.js +5 -5
  643. package/build/sdk/legacy/transport/http/routes/sseRoutes.js.map +1 -1
  644. package/build/sdk/legacy/transport/http/server.d.ts.map +1 -1
  645. package/build/sdk/legacy/transport/http/server.js +20 -7
  646. package/build/sdk/legacy/transport/http/server.js.map +1 -1
  647. package/build/sdk/legacy/transport/http/streamableSessionLifecycle.d.ts.map +1 -1
  648. package/build/sdk/legacy/transport/http/streamableSessionLifecycle.js +28 -45
  649. package/build/sdk/legacy/transport/http/streamableSessionLifecycle.js.map +1 -1
  650. package/build/sdk/legacy/transport/restartableStdioTransport.d.ts.map +1 -1
  651. package/build/sdk/legacy/transport/restartableStdioTransport.js +8 -11
  652. package/build/sdk/legacy/transport/restartableStdioTransport.js.map +1 -1
  653. package/build/sdk/legacy/transport/stdioProxyTransport.d.ts.map +1 -1
  654. package/build/sdk/legacy/transport/stdioProxyTransport.js +28 -36
  655. package/build/sdk/legacy/transport/stdioProxyTransport.js.map +1 -1
  656. package/build/sdk/legacy/transport/transportFactory.d.ts +1 -1
  657. package/build/sdk/legacy/transport/transportFactory.d.ts.map +1 -1
  658. package/build/sdk/legacy/transport/transportFactory.js +53 -40
  659. package/build/sdk/legacy/transport/transportFactory.js.map +1 -1
  660. package/build/server.d.ts.map +1 -1
  661. package/build/server.js +19 -24
  662. package/build/server.js.map +1 -1
  663. package/build/transport/http/middlewares/errorHandler.js +1 -1
  664. package/build/transport/http/middlewares/errorHandler.js.map +1 -1
  665. package/build/transport/http/middlewares/httpRequestLogger.d.ts +4 -14
  666. package/build/transport/http/middlewares/httpRequestLogger.d.ts.map +1 -1
  667. package/build/transport/http/middlewares/httpRequestLogger.js +134 -40
  668. package/build/transport/http/middlewares/httpRequestLogger.js.map +1 -1
  669. package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts.map +1 -1
  670. package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js +8 -20
  671. package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js.map +1 -1
  672. package/build/transport/http/middlewares/securityMiddleware.d.ts.map +1 -1
  673. package/build/transport/http/middlewares/securityMiddleware.js +7 -38
  674. package/build/transport/http/middlewares/securityMiddleware.js.map +1 -1
  675. package/build/transport/http/middlewares/tagsExtractor.js +2 -2
  676. package/build/transport/http/middlewares/tagsExtractor.js.map +1 -1
  677. package/build/transport/http/routes/cliTokenRoute.d.ts.map +1 -1
  678. package/build/transport/http/routes/cliTokenRoute.js +2 -1
  679. package/build/transport/http/routes/cliTokenRoute.js.map +1 -1
  680. package/build/transport/http/routes/healthRoutes.d.ts +11 -1
  681. package/build/transport/http/routes/healthRoutes.d.ts.map +1 -1
  682. package/build/transport/http/routes/healthRoutes.js +12 -8
  683. package/build/transport/http/routes/healthRoutes.js.map +1 -1
  684. package/build/transport/http/routes/inspectHelpers.d.ts.map +1 -1
  685. package/build/transport/http/routes/inspectHelpers.js +4 -3
  686. package/build/transport/http/routes/inspectHelpers.js.map +1 -1
  687. package/build/transport/http/routes/inspectRoutes.js +3 -3
  688. package/build/transport/http/routes/inspectRoutes.js.map +1 -1
  689. package/build/transport/http/routes/instructionsRoutes.js +1 -1
  690. package/build/transport/http/routes/instructionsRoutes.js.map +1 -1
  691. package/build/transport/http/routes/modernHttpRoutes.d.ts +4 -0
  692. package/build/transport/http/routes/modernHttpRoutes.d.ts.map +1 -1
  693. package/build/transport/http/routes/modernHttpRoutes.js +169 -24
  694. package/build/transport/http/routes/modernHttpRoutes.js.map +1 -1
  695. package/build/transport/http/routes/modernInteractionBinding.d.ts +2 -1
  696. package/build/transport/http/routes/modernInteractionBinding.d.ts.map +1 -1
  697. package/build/transport/http/routes/modernInteractionBinding.js +7 -4
  698. package/build/transport/http/routes/modernInteractionBinding.js.map +1 -1
  699. package/build/transport/http/routes/modernToolHeaderRegistry.d.ts +16 -0
  700. package/build/transport/http/routes/modernToolHeaderRegistry.d.ts.map +1 -0
  701. package/build/transport/http/routes/modernToolHeaderRegistry.js +161 -0
  702. package/build/transport/http/routes/modernToolHeaderRegistry.js.map +1 -0
  703. package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -1
  704. package/build/transport/http/routes/oauthRoutes.js +12 -9
  705. package/build/transport/http/routes/oauthRoutes.js.map +1 -1
  706. package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
  707. package/build/transport/http/routes/streamableHttpRoutes.js +11 -21
  708. package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
  709. package/build/transport/http/routes/toolRoutes.d.ts.map +1 -1
  710. package/build/transport/http/routes/toolRoutes.js +25 -9
  711. package/build/transport/http/routes/toolRoutes.js.map +1 -1
  712. package/build/transport/http/storage/streamableSessionRepository.d.ts.map +1 -1
  713. package/build/transport/http/storage/streamableSessionRepository.js +21 -36
  714. package/build/transport/http/storage/streamableSessionRepository.js.map +1 -1
  715. package/build/transport/http/utils/contextExtractor.d.ts.map +1 -1
  716. package/build/transport/http/utils/contextExtractor.js +6 -6
  717. package/build/transport/http/utils/contextExtractor.js.map +1 -1
  718. package/build/transport/http/utils/httpErrorHandler.d.ts +1 -1
  719. package/build/transport/http/utils/httpErrorHandler.d.ts.map +1 -1
  720. package/build/transport/http/utils/httpErrorHandler.js +5 -19
  721. package/build/transport/http/utils/httpErrorHandler.js.map +1 -1
  722. package/build/transport/http/utils/templateContextAuthority.d.ts.map +1 -1
  723. package/build/transport/http/utils/templateContextAuthority.js +6 -21
  724. package/build/transport/http/utils/templateContextAuthority.js.map +1 -1
  725. package/build/transport/http/utils/unifiedLogger.d.ts +10 -50
  726. package/build/transport/http/utils/unifiedLogger.d.ts.map +1 -1
  727. package/build/transport/http/utils/unifiedLogger.js +9 -77
  728. package/build/transport/http/utils/unifiedLogger.js.map +1 -1
  729. package/build/transport/managedStdioStderr.d.ts.map +1 -1
  730. package/build/transport/managedStdioStderr.js +2 -6
  731. package/build/transport/managedStdioStderr.js.map +1 -1
  732. package/build/utils/core/errorHandling.js +1 -1
  733. package/build/utils/core/errorHandling.js.map +1 -1
  734. package/build/utils/core/operationExecution.js +2 -2
  735. package/build/utils/core/operationExecution.js.map +1 -1
  736. package/build/utils/core/parsing.d.ts +2 -0
  737. package/build/utils/core/parsing.d.ts.map +1 -1
  738. package/build/utils/core/parsing.js +19 -0
  739. package/build/utils/core/parsing.js.map +1 -1
  740. package/build/utils/core/resourceUris.d.ts +6 -0
  741. package/build/utils/core/resourceUris.d.ts.map +1 -0
  742. package/build/utils/core/resourceUris.js +104 -0
  743. package/build/utils/core/resourceUris.js.map +1 -0
  744. package/build/utils/core/toolNames.d.ts +8 -0
  745. package/build/utils/core/toolNames.d.ts.map +1 -0
  746. package/build/utils/core/toolNames.js +56 -0
  747. package/build/utils/core/toolNames.js.map +1 -0
  748. package/build/utils/filePermissions.d.ts.map +1 -1
  749. package/build/utils/filePermissions.js +6 -6
  750. package/build/utils/filePermissions.js.map +1 -1
  751. package/build/utils/ui/interactiveSelector.js +1 -1
  752. package/build/utils/ui/interactiveSelector.js.map +1 -1
  753. package/build/utils/ui/urlGenerator.d.ts.map +1 -1
  754. package/build/utils/ui/urlGenerator.js +6 -10
  755. package/build/utils/ui/urlGenerator.js.map +1 -1
  756. package/build/utils/validation/scopeValidation.d.ts.map +1 -1
  757. package/build/utils/validation/scopeValidation.js +4 -12
  758. package/build/utils/validation/scopeValidation.js.map +1 -1
  759. package/build/utils/validation/urlDetection.js +4 -4
  760. package/build/utils/validation/urlDetection.js.map +1 -1
  761. package/package.json +70 -61
@@ -0,0 +1,1139 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { createHash, createHmac, randomBytes, randomUUID } from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { AUTH_CONFIG, getGlobalConfigDir } from '../../constants.js';
6
+ import logger from '../../logger/logger.js';
7
+ import { errorFacts } from '../../observability/privacy/fields.js';
8
+ import { assertOwnerOnlyDirPermissions, enforceOwnerOnlyFilePermissions, openCredentialReadSync, } from '../../utils/filePermissions.js';
9
+ import { z } from 'zod';
10
+ import { FileStorageService, StorageLockBusyError } from './fileStorageService.js';
11
+ import { DockerNativeCredentialStore, NativeCredentialStoreError, } from './nativeCredentialStore.js';
12
+ // Deterministic namespace fingerprints of non-secret identity metadata; never credential contents.
13
+ // codeql[js/insufficient-password-hash]
14
+ const namespaceDigest = (value) => createHash('sha256').update(value).digest('hex');
15
+ const nativeDigest = (encoded, nonce) => createHmac('sha256', Buffer.from(nonce, 'base64url')).update(encoded).digest('hex');
16
+ // Only explicit, confirmed export creates this journal beside an intentionally plaintext
17
+ // destination. The checksum detects changed destinations after native chunks are deleted;
18
+ // it is not a credential-protection mechanism and is removed after export cleanup.
19
+ const exportedPlaintextChecksum = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
20
+ const OwnerSchema = z.object({ version: z.literal(1), runtimeScope: z.string().regex(/^[a-f0-9]{64}$/) });
21
+ const StateSchema = z.object({ mode: z.enum(['file', 'native']), epoch: z.string().uuid() });
22
+ const ReferenceSchema = z.object({
23
+ version: z.literal(1),
24
+ scope: z.string().regex(/^[a-f0-9]{64}$/),
25
+ record: z.string().regex(/^[a-f0-9]{64}$/),
26
+ file: z.string().regex(/^[A-Za-z0-9_.-]+$/),
27
+ category: z.string().max(64).optional(),
28
+ location: z.enum(['current', 'legacy']),
29
+ revision: z.string().uuid(),
30
+ chunks: z.number().int().positive().max(100000),
31
+ digest: z.string().regex(/^[a-f0-9]{64}$/),
32
+ epoch: z.string().uuid(),
33
+ retired: z.boolean().default(false),
34
+ });
35
+ const IntentSchema = z
36
+ .object({
37
+ next: ReferenceSchema,
38
+ previous: ReferenceSchema.optional(),
39
+ migrationSource: z.boolean().optional(),
40
+ fileSuperseded: z.boolean().optional(),
41
+ })
42
+ .strict();
43
+ const ExportSchema = z.object({ reference: ReferenceSchema, digest: z.string().regex(/^[a-f0-9]{64}$/) });
44
+ const EnvelopeSchema = z.object({
45
+ scope: z.string(),
46
+ record: z.string(),
47
+ revision: z.string(),
48
+ nonce: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
49
+ file: z.string().optional(),
50
+ payload: z.unknown(),
51
+ });
52
+ /** Deliberately contains neither helper output nor credential-bearing file contents. */
53
+ export class ProtectedRecordStorageError extends Error {
54
+ constructor(detail = 'Native credential migration or access is incomplete. Unlock the OS credential store and restart; file storage requires fresh authorization or explicit export.') {
55
+ super(detail);
56
+ this.name = 'ProtectedRecordStorageError';
57
+ }
58
+ }
59
+ class StorageEpochError extends ProtectedRecordStorageError {
60
+ }
61
+ class StorageBusyError extends ProtectedRecordStorageError {
62
+ }
63
+ const activations = new Map();
64
+ const failedScopes = new Set();
65
+ const TransactionSchema = z.object({
66
+ version: z.literal(1),
67
+ writes: z.array(IntentSchema),
68
+ deletes: z.array(ReferenceSchema),
69
+ });
70
+ const FileTransactionSchema = z.object({
71
+ version: z.literal(1),
72
+ phase: z.enum(['apply', 'cleanup']),
73
+ stages: z.array(z.string().regex(/^[A-Za-z0-9_.-]+\.tmp$/)),
74
+ });
75
+ const FileStageSchema = z.object({
76
+ file: z.string().regex(/^[A-Za-z0-9_.-]+$/),
77
+ deleted: z.boolean(),
78
+ payload: z.unknown(),
79
+ });
80
+ const transactionOwners = new AsyncLocalStorage();
81
+ /** Startup calls this once after acquiring Runtime Scope ownership. Failure blocks OAuth, not unrelated servers. */
82
+ export async function activateProtectedRecordStore(options) {
83
+ const storage = new ProtectedRecordStorage(options);
84
+ const promise = storage.activate();
85
+ activations.set(storage.getActivationKey(), { storage, promise });
86
+ await promise.catch(() => undefined);
87
+ }
88
+ export function createProtectedRecordStorage(options) {
89
+ return new ProtectedRecordStorage(options);
90
+ }
91
+ /** Cached readiness only: health requests never query helpers or expose failure payloads. */
92
+ export function getProtectedRecordStoreReadiness(options) {
93
+ const base = options.baseDir ?? getGlobalConfigDir();
94
+ try {
95
+ const runtimeScope = namespaceDigest(canonicalPath(options.runtimeScope ?? base));
96
+ const identity = [
97
+ canonicalPath(path.join(base, AUTH_CONFIG.SERVER.STORAGE.DIR, options.layout.subDir)),
98
+ runtimeScope,
99
+ ];
100
+ if (options.layout.domain !== 'upstream-oauth')
101
+ identity.push(options.layout.domain);
102
+ const activation = activations.get(namespaceDigest(JSON.stringify(identity)));
103
+ return { mode: options.mode, ready: activation?.storage.mode === options.mode && activation.storage.isReady() };
104
+ }
105
+ catch {
106
+ return { mode: options.mode, ready: false };
107
+ }
108
+ }
109
+ /**
110
+ * Domain-neutral protected record storage. Entire records are secrets (including arbitrary registration/discovery fields).
111
+ * References and intents are nonexpiring and outside generic JSON/temporary-file cleanup.
112
+ * Every repository transaction uses one scope lock; reads are synchronous and never mutate storage.
113
+ */
114
+ export class ProtectedRecordStorage extends FileStorageService {
115
+ mode;
116
+ nativeStore;
117
+ metadataDir;
118
+ legacyDir;
119
+ scope;
120
+ runtimeScope;
121
+ epoch;
122
+ initialized = false;
123
+ activation;
124
+ busy = false;
125
+ failed = false;
126
+ layout;
127
+ constructionFailed = false;
128
+ expirationTimer;
129
+ verifiedCategories = new Map();
130
+ constructor(options) {
131
+ super(options.baseDir, options.layout.subDir, { manageLifecycle: false, initializeDirectory: false });
132
+ this.layout = options.layout;
133
+ this.mode = options.mode;
134
+ this.nativeStore = options.nativeStore;
135
+ this.legacyDir = path.join(options.baseDir ?? getGlobalConfigDir(), options.layout.legacySubDir);
136
+ this.metadataDir = path.join(this.getStorageDir(), '.native-oauth');
137
+ let runtimeDirectory;
138
+ let storageDirectory;
139
+ try {
140
+ runtimeDirectory = canonicalPath(options.runtimeScope ?? options.baseDir ?? getGlobalConfigDir());
141
+ storageDirectory = canonicalPath(this.getStorageDir());
142
+ }
143
+ catch {
144
+ this.constructionFailed = true;
145
+ runtimeDirectory = path.resolve(options.runtimeScope ?? options.baseDir ?? getGlobalConfigDir());
146
+ storageDirectory = path.resolve(this.getStorageDir());
147
+ }
148
+ this.runtimeScope = namespaceDigest(runtimeDirectory);
149
+ // Preserve the delivered upstream namespace exactly; other domains have an explicit discriminator.
150
+ const identity = [storageDirectory, this.runtimeScope];
151
+ if (this.layout.domain !== 'upstream-oauth')
152
+ identity.push(this.layout.domain);
153
+ this.scope = namespaceDigest(JSON.stringify(identity));
154
+ const existing = activations.get(this.getActivationKey());
155
+ if (!this.nativeStore && existing)
156
+ this.nativeStore = existing.storage.nativeStore;
157
+ if (existing)
158
+ this.verifiedCategories = existing.storage.verifiedCategories;
159
+ if (existing)
160
+ this.activation = existing.promise.then(() => {
161
+ if (existing.storage.mode !== this.mode)
162
+ throw new StorageEpochError('Credential-store selection changed; restart the runtime.');
163
+ if (!existing.storage.isReady())
164
+ throw new ProtectedRecordStorageError();
165
+ this.epoch = existing.storage.epoch;
166
+ this.initialized = true;
167
+ });
168
+ if (this.activation)
169
+ void this.activation.catch(() => undefined);
170
+ if (existing?.storage.initialized && existing.storage.mode === this.mode) {
171
+ this.epoch = existing.storage.epoch;
172
+ this.initialized = true;
173
+ this.activation = existing.promise;
174
+ }
175
+ }
176
+ getActivationKey() {
177
+ return this.scope;
178
+ }
179
+ isReady() {
180
+ return this.initialized && !this.failed && !failedScopes.has(this.scope);
181
+ }
182
+ get native() {
183
+ this.nativeStore ??= new DockerNativeCredentialStore();
184
+ return this.nativeStore;
185
+ }
186
+ ready() {
187
+ if (this.activation)
188
+ return this.activation.then(() => {
189
+ if (!this.isReady())
190
+ throw new ProtectedRecordStorageError();
191
+ });
192
+ const existing = activations.get(this.getActivationKey());
193
+ if (existing) {
194
+ this.activation = existing.promise.then(() => {
195
+ if (existing.storage.mode !== this.mode)
196
+ throw new ProtectedRecordStorageError('Credential-store selection changed; restart the runtime.');
197
+ this.epoch = existing.storage.epoch;
198
+ this.initialized = true;
199
+ });
200
+ }
201
+ else {
202
+ this.activation = this.activate();
203
+ activations.set(this.getActivationKey(), { storage: this, promise: this.activation });
204
+ }
205
+ return this.activation;
206
+ }
207
+ /** File callers historically write synchronously; native readiness remains explicit. */
208
+ initializeFileMode() {
209
+ if (this.initialized || this.activation || this.mode !== 'file')
210
+ return;
211
+ try {
212
+ this.safe(() => this.prepareDirectory());
213
+ super.withExclusiveLockSync(this.layout.domain, () => this.safe(() => this.initialize()));
214
+ this.activation = Promise.resolve();
215
+ }
216
+ catch (error) {
217
+ this.failed = true;
218
+ failedScopes.add(this.scope);
219
+ this.activation = Promise.reject(error);
220
+ void this.activation.catch(() => undefined);
221
+ }
222
+ activations.set(this.getActivationKey(), { storage: this, promise: this.activation });
223
+ }
224
+ getExportDestinations() {
225
+ return [this.getStorageDir(), this.legacyDir];
226
+ }
227
+ /** Explicit startup boundary fences previous runtime writers. */
228
+ activate() {
229
+ this.initialized = false;
230
+ this.activation = Promise.resolve()
231
+ .then(() => {
232
+ this.safe(() => this.prepareDirectory());
233
+ return super.withExclusiveLock(this.layout.domain, () => this.safe(() => this.initialize()));
234
+ })
235
+ .catch((error) => {
236
+ this.failed = true;
237
+ failedScopes.add(this.scope);
238
+ throw error;
239
+ });
240
+ return this.activation;
241
+ }
242
+ prepareDirectory() {
243
+ if (this.constructionFailed)
244
+ throw new ProtectedRecordStorageError();
245
+ fs.mkdirSync(this.getStorageDir(), { recursive: true, mode: 0o700 });
246
+ assertOwnerOnlyDirPermissions(this.getStorageDir());
247
+ fs.mkdirSync(this.metadataDir, { recursive: true, mode: 0o700 });
248
+ assertOwnerOnlyDirPermissions(this.metadataDir);
249
+ }
250
+ initialize() {
251
+ this.assertOwner(true);
252
+ this.failed = false;
253
+ this.verifiedCategories.clear();
254
+ failedScopes.delete(this.scope);
255
+ const previous = this.state();
256
+ // A committed mutation is always completed before changing its generation or storage mode.
257
+ this.recoverTransaction();
258
+ const next = { mode: this.mode, epoch: randomUUID() };
259
+ for (const reference of this.references()) {
260
+ reference.retired = previous?.mode !== 'native' || this.mode !== 'native' || reference.retired;
261
+ reference.epoch = next.epoch;
262
+ this.writeReference(reference);
263
+ }
264
+ this.atomic(this.meta('state'), next);
265
+ this.epoch = next.epoch;
266
+ if (this.mode === 'native') {
267
+ this.native.read(`https://oauth.1mcp.invalid/${this.scope}/readiness`);
268
+ this.recoverExports();
269
+ this.recoverIntents();
270
+ this.migrateInventory();
271
+ this.backfillReferenceCategories();
272
+ }
273
+ else {
274
+ this.migrateLegacyFiles();
275
+ }
276
+ this.initialized = true;
277
+ if (this.layout.manageExpiration && this.mode === 'file' && !this.expirationTimer) {
278
+ this.expirationTimer = setInterval(() => this.cleanupExpiredData(), 5 * 60 * 1000);
279
+ this.expirationTimer.unref();
280
+ }
281
+ }
282
+ shutdown() {
283
+ if (this.expirationTimer)
284
+ clearInterval(this.expirationTimer);
285
+ this.expirationTimer = undefined;
286
+ super.shutdown();
287
+ }
288
+ async withExclusiveLock(_name, operation) {
289
+ await this.ready();
290
+ const owner = transactionOwners.getStore();
291
+ if (owner?.scope === this.scope) {
292
+ if (!owner.transaction.active)
293
+ throw new StorageEpochError('OAuth transaction has already finished. Retry the request.');
294
+ return operation();
295
+ }
296
+ return super.withExclusiveLock(this.layout.domain, async () => {
297
+ this.assertEpoch();
298
+ return this.runTransaction(operation);
299
+ });
300
+ }
301
+ async runTransaction(operation) {
302
+ const transaction = { active: true, writes: new Map(), deletes: new Map() };
303
+ this.busy = true;
304
+ try {
305
+ return await transactionOwners.run({ scope: this.scope, transaction }, async () => {
306
+ const result = await operation();
307
+ this.safe(() => this.commitTransaction(transaction));
308
+ return result;
309
+ });
310
+ }
311
+ finally {
312
+ transaction.active = false;
313
+ this.busy = false;
314
+ }
315
+ }
316
+ mutate(operation) {
317
+ const owner = transactionOwners.getStore();
318
+ if (owner?.scope === this.scope) {
319
+ if (!owner.transaction.active)
320
+ throw new StorageEpochError('OAuth transaction has already finished. Retry the request.');
321
+ return operation(owner.transaction);
322
+ }
323
+ if (this.mode === 'native' && !this.layout.synchronousWrites)
324
+ throw new ProtectedRecordStorageError('Native OAuth writes require a repository transaction.');
325
+ if (this.busy)
326
+ throw new StorageBusyError('OAuth storage is busy. Retry the request after the current transaction completes.');
327
+ return super.withExclusiveLockSync(this.layout.domain, () => {
328
+ this.assertEpoch();
329
+ const transaction = { active: true, writes: new Map(), deletes: new Map() };
330
+ return transactionOwners.run({ scope: this.scope, transaction }, () => {
331
+ try {
332
+ const result = operation(transaction);
333
+ this.safe(() => this.commitTransaction(transaction));
334
+ return result;
335
+ }
336
+ finally {
337
+ transaction.active = false;
338
+ }
339
+ });
340
+ });
341
+ }
342
+ commitTransaction(transaction) {
343
+ if (!transaction.writes.size && !transaction.deletes.size)
344
+ return;
345
+ if (this.mode === 'file') {
346
+ try {
347
+ this.commitFileTransaction(transaction);
348
+ }
349
+ catch (error) {
350
+ if (transaction.deletes.size)
351
+ logger.error('fileStorageService.failed.to.delete.data.for.391c9b0b', { error: this.logSafeError(error) });
352
+ this.failed = true;
353
+ failedScopes.add(this.scope);
354
+ throw error;
355
+ }
356
+ return;
357
+ }
358
+ try {
359
+ const writes = [...transaction.writes.values()].map(({ file, payload }) => this.prepareNative('current', file, payload));
360
+ const manifest = { version: 1, writes, deletes: [...transaction.deletes.values()] };
361
+ // Only metadata is published here; every staged protected revision has been read back.
362
+ this.atomic(this.meta('transaction', 'commit'), manifest);
363
+ this.finishTransaction(manifest);
364
+ }
365
+ catch (error) {
366
+ this.failed = true;
367
+ failedScopes.add(this.scope);
368
+ throw error;
369
+ }
370
+ }
371
+ commitFileTransaction(transaction) {
372
+ const changes = [
373
+ ...[...transaction.writes.values()].map(({ file, payload }) => ({ file, payload, deleted: false })),
374
+ ...[...transaction.deletes.values()].map(({ file }) => ({ file, payload: null, deleted: true })),
375
+ ];
376
+ const stages = changes.map((change) => {
377
+ const prefix = this.layout.prefixes.find((prefix) => prefix && change.file.startsWith(prefix)) ?? 'oauth-';
378
+ const stage = `${prefix}transaction-${randomUUID()}.tmp`;
379
+ this.atomic(path.join(this.getStorageDir(), stage), change);
380
+ const verified = FileStageSchema.parse(this.readJson(path.join(this.getStorageDir(), stage)));
381
+ if (JSON.stringify(verified) !== JSON.stringify(FileStageSchema.parse(change)))
382
+ throw new ProtectedRecordStorageError();
383
+ return stage;
384
+ });
385
+ const manifest = { version: 1, phase: 'apply', stages };
386
+ this.atomic(this.meta('file-transaction', 'commit'), manifest);
387
+ this.finishFileTransaction(manifest);
388
+ }
389
+ finishFileTransaction(manifest) {
390
+ for (const stage of manifest.stages) {
391
+ if (!this.managedFile(stage))
392
+ throw new ProtectedRecordStorageError();
393
+ }
394
+ if (manifest.phase === 'apply') {
395
+ const changes = manifest.stages.map((stage) => FileStageSchema.parse(this.readJson(path.join(this.getStorageDir(), stage))));
396
+ for (const change of changes) {
397
+ if (!this.managedFile(change.file) || !change.file.endsWith('.json'))
398
+ throw new ProtectedRecordStorageError();
399
+ }
400
+ for (const change of changes) {
401
+ if (change.deleted)
402
+ this.remove(path.join(this.getStorageDir(), change.file));
403
+ else
404
+ this.writeFileRecord(change.file, change.payload);
405
+ }
406
+ this.atomic(this.meta('file-transaction', 'commit'), { ...manifest, phase: 'cleanup' });
407
+ }
408
+ for (const stage of manifest.stages)
409
+ this.remove(path.join(this.getStorageDir(), stage));
410
+ this.remove(this.meta('file-transaction', 'commit'));
411
+ }
412
+ recoverTransaction() {
413
+ const fileManifest = this.readJson(this.meta('file-transaction', 'commit'));
414
+ if (fileManifest !== null)
415
+ this.finishFileTransaction(FileTransactionSchema.parse(fileManifest));
416
+ const manifest = this.readJson(this.meta('transaction', 'commit'));
417
+ if (manifest !== null)
418
+ this.finishTransaction(TransactionSchema.parse(manifest));
419
+ }
420
+ finishTransaction(manifest) {
421
+ // Validate every destination before any publication or cleanup. A committed transaction
422
+ // can only roll forward; read paths stay closed until the commit marker disappears.
423
+ for (const intent of manifest.writes)
424
+ this.readNative(intent.next);
425
+ for (const reference of manifest.deletes)
426
+ this.validateReference(reference);
427
+ for (const intent of manifest.writes)
428
+ this.writeReference(intent.next);
429
+ for (const reference of manifest.deletes) {
430
+ const retired = { ...reference, retired: true };
431
+ this.writeReference(retired);
432
+ }
433
+ for (const intent of manifest.writes)
434
+ this.finishIntent(intent);
435
+ for (const reference of manifest.deletes)
436
+ this.finishDeletion(reference);
437
+ this.remove(this.meta('transaction', 'commit'));
438
+ }
439
+ writeFileRecord(file, data) {
440
+ this.atomic(path.join(this.getStorageDir(), file), data);
441
+ const record = this.recordKey('current', file);
442
+ this.atomic(this.meta(record, 'fresh'), { epoch: this.epoch });
443
+ const reference = this.reference(record);
444
+ if (reference) {
445
+ reference.retired = true;
446
+ this.writeReference(reference);
447
+ }
448
+ const pending = this.readJson(this.meta(record, 'intent'));
449
+ if (pending)
450
+ this.atomic(this.meta(record, 'intent'), { ...IntentSchema.parse(pending), fileSuperseded: true });
451
+ }
452
+ readData(prefix, id, schema) {
453
+ return this.safe(() => {
454
+ this.assertEpoch();
455
+ let file;
456
+ try {
457
+ file = path.basename(this.getFilePath(prefix, id));
458
+ }
459
+ catch {
460
+ return null;
461
+ }
462
+ const record = this.recordKey('current', file);
463
+ const owner = transactionOwners.getStore();
464
+ if (owner?.scope === this.scope) {
465
+ if (!owner.transaction.active)
466
+ throw new StorageEpochError('OAuth transaction has already finished. Retry the request.');
467
+ if (owner.transaction.deletes.has(record))
468
+ return null;
469
+ const staged = owner.transaction.writes.get(record);
470
+ if (staged) {
471
+ const data = schema ? schema.parse(staged.payload) : staged.payload;
472
+ return data.expires < Date.now() ? null : data;
473
+ }
474
+ }
475
+ if (this.mode === 'native') {
476
+ if (this.readJson(this.meta(record, 'intent')) !== null)
477
+ throw new ProtectedRecordStorageError();
478
+ if (this.readJson(this.meta(record, 'delete')) !== null)
479
+ throw new ProtectedRecordStorageError();
480
+ }
481
+ const reference = this.reference(record);
482
+ let value;
483
+ if (this.mode === 'native') {
484
+ if (!reference || reference.retired)
485
+ return null;
486
+ value = this.readNative(reference);
487
+ }
488
+ else {
489
+ // A migration source left behind is recovery data, never a file-mode fallback.
490
+ const pending = this.readJson(this.meta(record, 'intent'));
491
+ if (pending && !IntentSchema.parse(pending).fileSuperseded)
492
+ return null;
493
+ if (reference && !this.readJson(this.meta(record, 'fresh')))
494
+ return null;
495
+ value = this.readJson(this.getFilePath(prefix, id));
496
+ }
497
+ if (value === null)
498
+ return null;
499
+ const data = schema ? schema.parse(value) : value;
500
+ if (typeof data.expires !== 'number')
501
+ throw new ProtectedRecordStorageError();
502
+ if (data.expires < Date.now()) {
503
+ if (this.mode === 'file' && !this.busy)
504
+ this.deleteData(prefix, id);
505
+ return null;
506
+ }
507
+ return data;
508
+ });
509
+ }
510
+ writeData(prefix, id, data) {
511
+ this.writeDataDurable(prefix, id, data);
512
+ }
513
+ writeDataDurable(prefix, id, data) {
514
+ this.safe(() => {
515
+ this.assertEpoch();
516
+ const file = path.basename(this.getFilePath(prefix, id));
517
+ const record = this.recordKey('current', file);
518
+ this.mutate((transaction) => {
519
+ transaction.deletes.delete(record);
520
+ transaction.writes.set(record, { file, payload: structuredClone(data) });
521
+ });
522
+ });
523
+ }
524
+ deleteData(prefix, id) {
525
+ return this.safe(() => {
526
+ this.assertEpoch();
527
+ let file;
528
+ try {
529
+ file = path.basename(this.getFilePath(prefix, id));
530
+ }
531
+ catch {
532
+ return false;
533
+ }
534
+ const record = this.recordKey('current', file);
535
+ return this.mutate((transaction) => {
536
+ const staged = transaction.writes.delete(record);
537
+ const reference = this.reference(record);
538
+ if (this.mode === 'native') {
539
+ if (reference)
540
+ transaction.deletes.set(record, reference);
541
+ return staged || !!reference;
542
+ }
543
+ const exists = fs.existsSync(path.join(this.getStorageDir(), file));
544
+ if (exists)
545
+ transaction.deletes.set(record, this.fileReference(file));
546
+ return staged || exists;
547
+ });
548
+ });
549
+ }
550
+ fileReference(file) {
551
+ return {
552
+ version: 1,
553
+ scope: this.scope,
554
+ record: this.recordKey('current', file),
555
+ file,
556
+ location: 'current',
557
+ revision: randomUUID(),
558
+ chunks: 1,
559
+ digest: '0'.repeat(64),
560
+ epoch: this.epoch,
561
+ retired: false,
562
+ };
563
+ }
564
+ listFiles(prefix) {
565
+ return this.safe(() => {
566
+ this.assertEpoch();
567
+ if (this.mode === 'file')
568
+ return super.listFiles(prefix);
569
+ return this.references()
570
+ .filter((reference) => !reference.retired && reference.location === 'current' && reference.file.endsWith('.json'))
571
+ .filter((reference) => this.matchesCategory(reference, prefix))
572
+ .map((reference) => this.logicalFile(reference))
573
+ .filter((file) => file.endsWith('.json') && (!prefix || file.startsWith(prefix)));
574
+ });
575
+ }
576
+ cleanupExpiredData() {
577
+ if (!this.layout.manageExpiration || this.mode !== 'file' || this.busy)
578
+ return 0;
579
+ try {
580
+ return super.withExclusiveLockSync(this.layout.domain, () => {
581
+ this.assertEpoch();
582
+ let cleaned = 0;
583
+ for (const file of fs.readdirSync(this.getStorageDir())) {
584
+ if (!this.managedFile(file))
585
+ continue;
586
+ const target = path.join(this.getStorageDir(), file);
587
+ if (file.endsWith('.tmp')) {
588
+ try {
589
+ const stat = fs.lstatSync(target);
590
+ if (stat.isFile() && Date.now() - stat.mtimeMs >= 60_000 && this.remove(target))
591
+ cleaned++;
592
+ }
593
+ catch (error) {
594
+ logger.warn('fileStorageService.failed.to.clean.temporary.file.48c7fb76', {
595
+ error: this.logSafeError(error),
596
+ });
597
+ }
598
+ continue;
599
+ }
600
+ try {
601
+ const value = this.readJson(target);
602
+ if (value && Number.isFinite(value.expires) && value.expires < Date.now() && this.remove(target)) {
603
+ cleaned++;
604
+ logger.debug('fileStorageService.cleaned.up.expired.file.c453faef');
605
+ }
606
+ }
607
+ catch (error) {
608
+ // Malformed authoritative records are retained for recovery, never erased by a timer.
609
+ logger.warn('fileStorageService.skipping.unreadable.credential.file.b0d290a8', {
610
+ error: this.logSafeError(error),
611
+ });
612
+ }
613
+ }
614
+ return cleaned;
615
+ });
616
+ }
617
+ catch (error) {
618
+ if (!(error instanceof StorageLockBusyError))
619
+ logger.warn('fileStorageService.failed.to.cleanup.expired.data.59c8a76e', { error: this.logSafeError(error) });
620
+ return 0;
621
+ }
622
+ }
623
+ logSafeError(error) {
624
+ const facts = errorFacts(error);
625
+ return { kind: facts.error_kind, code: facts.error_code };
626
+ }
627
+ /** Caller owns explicit plaintext confirmation and exclusive stopped-runtime policy. */
628
+ async exportToFile() {
629
+ this.safe(() => this.prepareDirectory());
630
+ return super.withExclusiveLock(this.layout.domain, () => this.safe(() => {
631
+ this.assertOwner(true);
632
+ this.recoverTransaction();
633
+ let records = this.recoverExports();
634
+ this.recoverIntents();
635
+ for (const reference of this.references()) {
636
+ const existing = this.readSource(reference);
637
+ if (existing !== null) {
638
+ // A fresh file login wins; exporting a retired native generation must never overwrite it.
639
+ if (!reference.retired)
640
+ throw new ProtectedRecordStorageError('Export destination already exists. Preserve it and resolve the conflict before retrying export.');
641
+ this.deleteChunks(reference);
642
+ this.remove(this.meta(reference.record, 'ref'));
643
+ continue;
644
+ }
645
+ const value = this.readNative(reference);
646
+ // The user authorized plaintext export; retain destination provenance only until
647
+ // native cleanup succeeds, including retries after partial chunk deletion.
648
+ const digest = exportedPlaintextChecksum(value);
649
+ this.atomic(this.meta(reference.record, 'export'), { reference, digest });
650
+ this.writeSource(reference, value);
651
+ this.finishExport(reference, digest);
652
+ records++;
653
+ }
654
+ return { records };
655
+ }));
656
+ }
657
+ recoverExports() {
658
+ let records = 0;
659
+ for (const file of fs.readdirSync(this.metadataDir).filter((file) => file.endsWith('.export'))) {
660
+ const pending = ExportSchema.parse(this.readJson(path.join(this.metadataDir, file)));
661
+ this.finishExport(pending.reference, pending.digest);
662
+ records++;
663
+ }
664
+ return records;
665
+ }
666
+ finishExport(reference, digest) {
667
+ this.validateReference(reference);
668
+ const current = this.readSource(reference);
669
+ if (current === null)
670
+ this.writeSource(reference, this.readNative(reference));
671
+ if (exportedPlaintextChecksum(this.readSource(reference)) !== digest) {
672
+ throw new ProtectedRecordStorageError('Export destination changed. Native recovery records were retained; resolve the conflict before retrying.');
673
+ }
674
+ this.deleteChunks(reference);
675
+ if (this.reference(reference.record)?.revision === reference.revision)
676
+ this.remove(this.meta(reference.record, 'ref'));
677
+ this.remove(this.meta(reference.record, 'export'));
678
+ }
679
+ migrateInventory() {
680
+ for (const location of ['current', 'legacy']) {
681
+ const directory = location === 'current' ? this.getStorageDir() : this.legacyDir;
682
+ if (!fs.existsSync(directory))
683
+ continue;
684
+ assertOwnerOnlyDirPermissions(directory);
685
+ for (const file of fs.readdirSync(directory)) {
686
+ if (!this.managedFile(file))
687
+ continue;
688
+ const source = path.join(directory, file);
689
+ // Interrupted atomic writes are recovery fragments, not authoritative JSON records.
690
+ const value = file.endsWith('.tmp') ? this.readText(source) : this.readJson(source);
691
+ if (value === null)
692
+ throw new ProtectedRecordStorageError();
693
+ if (this.layout.opaqueFileNames && file.endsWith('.json')) {
694
+ if (typeof value !== 'object' ||
695
+ !Number.isFinite(value.expires) ||
696
+ !Number.isFinite(value.createdAt))
697
+ throw new ProtectedRecordStorageError('OAuth record is malformed. Preserve its source and repair it before restarting.');
698
+ }
699
+ if (this.layout.opaqueFileNames && location === 'legacy' && file.endsWith('.json')) {
700
+ const current = path.join(this.getStorageDir(), file);
701
+ const currentRecord = this.recordKey('current', file);
702
+ const migrated = fs.existsSync(path.join(this.legacyDir, `.migrated-to-${this.layout.subDir}`));
703
+ if (!migrated && !this.reference(currentRecord) && this.readJson(current) === null) {
704
+ this.atomic(current, value);
705
+ this.storeNative('current', file, value, true);
706
+ }
707
+ else {
708
+ // Duplicate legacy credentials are recovery bytes, never another live authority.
709
+ // Export retains them as .tmp so a later file-layout migration cannot revive a code/session.
710
+ const artifact = `${file}.legacy-recovery.tmp`;
711
+ const recovery = this.reference(this.recordKey('legacy', artifact));
712
+ if (!recovery)
713
+ this.storeNative('legacy', artifact, JSON.stringify(value));
714
+ }
715
+ this.remove(source);
716
+ continue;
717
+ }
718
+ // Existing references win over retained recovery fragments from an older migration.
719
+ const existing = this.reference(this.recordKey(location, file));
720
+ if (this.layout.opaqueFileNames && existing && !this.readJson(this.meta(existing.record, 'fresh'))) {
721
+ const retained = this.readNative(existing);
722
+ if (JSON.stringify(retained) !== JSON.stringify(value))
723
+ throw new ProtectedRecordStorageError();
724
+ this.remove(source);
725
+ continue;
726
+ }
727
+ this.storeNative(location, file, value, true);
728
+ }
729
+ }
730
+ }
731
+ migrateLegacyFiles() {
732
+ if (!fs.existsSync(this.legacyDir))
733
+ return;
734
+ assertOwnerOnlyDirPermissions(this.legacyDir);
735
+ const fence = path.join(this.legacyDir, `.migrated-to-${this.layout.subDir}`);
736
+ const completed = this.layout.opaqueFileNames && fs.existsSync(fence);
737
+ for (const file of fs.readdirSync(this.legacyDir)) {
738
+ if (!this.managedFile(file) || !file.endsWith('.json'))
739
+ continue;
740
+ const source = path.join(this.legacyDir, file);
741
+ const destination = path.join(this.getStorageDir(), file);
742
+ const current = this.readJson(destination);
743
+ if (this.layout.opaqueFileNames && (completed || current !== null)) {
744
+ const artifact = `${source}.legacy-recovery.tmp`;
745
+ const bytes = this.readText(source);
746
+ if (bytes === null)
747
+ continue;
748
+ if (!fs.existsSync(artifact))
749
+ this.atomicBytes(artifact, bytes);
750
+ if (this.readText(artifact) !== bytes)
751
+ throw new ProtectedRecordStorageError();
752
+ this.remove(source);
753
+ continue;
754
+ }
755
+ // Never replace a newer current-layout credential with legacy rollback data.
756
+ if (current !== null)
757
+ continue;
758
+ const record = this.recordKey('legacy', file);
759
+ if (this.reference(record) || this.readJson(this.meta(record, 'intent')))
760
+ continue;
761
+ const value = this.readJson(source);
762
+ this.atomic(destination, value);
763
+ if (JSON.stringify(this.readJson(destination)) !== JSON.stringify(value))
764
+ throw new ProtectedRecordStorageError();
765
+ this.remove(source);
766
+ }
767
+ if (this.layout.opaqueFileNames && !completed)
768
+ this.atomic(fence, { migrated: true, targetSubDir: this.layout.subDir });
769
+ }
770
+ managedFile(file) {
771
+ if (!/^[A-Za-z0-9_.-]+$/.test(file))
772
+ return false;
773
+ if (!file.endsWith('.json') && !file.endsWith('.tmp'))
774
+ return false;
775
+ return this.layout.prefixes.some((prefix) => file.startsWith(prefix));
776
+ }
777
+ prepareNative(location, file, payload, migrationSource) {
778
+ const record = this.recordKey(location, file);
779
+ if (this.readJson(this.meta(record, 'intent')))
780
+ throw new ProtectedRecordStorageError();
781
+ const previous = this.reference(record) ?? undefined;
782
+ const revision = randomUUID();
783
+ // Keep the random nonce only in the OS store: readable reference digests must not
784
+ // provide an offline oracle for guessing low-entropy client-registration secrets.
785
+ const nonce = randomBytes(32).toString('base64url');
786
+ const encoded = Buffer.from(JSON.stringify({
787
+ scope: this.scope,
788
+ record,
789
+ revision,
790
+ nonce,
791
+ file: this.layout.opaqueFileNames ? file : undefined,
792
+ payload,
793
+ })).toString('base64');
794
+ const next = {
795
+ version: 1,
796
+ scope: this.scope,
797
+ record,
798
+ file: this.layout.opaqueFileNames ? `${record}${file.endsWith('.tmp') ? '.tmp' : '.json'}` : file,
799
+ category: this.fileCategory(file),
800
+ location,
801
+ revision,
802
+ chunks: Math.ceil(encoded.length / 1800),
803
+ digest: nativeDigest(encoded, nonce),
804
+ epoch: this.epoch ?? this.state()?.epoch ?? randomUUID(),
805
+ retired: false,
806
+ };
807
+ const intent = { next, previous, migrationSource };
808
+ this.atomic(this.meta(record, 'intent'), intent);
809
+ for (let index = 0; index < next.chunks; index++)
810
+ this.native.write(this.chunkKey(next, index), encoded.slice(index * 1800, (index + 1) * 1800));
811
+ this.readNative(next);
812
+ return intent;
813
+ }
814
+ storeNative(location, file, payload, migrationSource) {
815
+ const intent = this.prepareNative(location, file, payload, migrationSource);
816
+ this.writeReference(intent.next);
817
+ this.remove(this.meta(intent.next.record, 'fresh'));
818
+ this.finishIntent(intent);
819
+ }
820
+ finishDeletion(reference) {
821
+ this.deleteChunks(reference);
822
+ if (this.reference(reference.record)?.revision === reference.revision)
823
+ this.remove(this.meta(reference.record, 'ref'));
824
+ this.remove(this.meta(reference.record, 'delete'));
825
+ }
826
+ recoverIntents() {
827
+ for (const file of fs.readdirSync(this.metadataDir).filter((file) => file.endsWith('.delete'))) {
828
+ this.finishDeletion(ReferenceSchema.parse(this.readJson(path.join(this.metadataDir, file))));
829
+ }
830
+ for (const file of fs.readdirSync(this.metadataDir).filter((file) => file.endsWith('.intent'))) {
831
+ const intent = IntentSchema.parse(this.readJson(path.join(this.metadataDir, file)));
832
+ this.validateReference(intent.next);
833
+ const current = this.reference(intent.next.record);
834
+ if (current?.revision === intent.next.revision) {
835
+ this.readNative(current);
836
+ this.finishIntent(intent);
837
+ continue;
838
+ }
839
+ // An unpublished native write is disposable. Migration retries from the retained source.
840
+ // A newer published revision is never replaced by an older intent.
841
+ this.deleteChunks(intent.next);
842
+ this.remove(path.join(this.metadataDir, file));
843
+ }
844
+ }
845
+ finishIntent(intent) {
846
+ if (intent.migrationSource && !intent.fileSuperseded) {
847
+ const source = this.sourcePath(intent.next);
848
+ const value = this.readSource(intent.next);
849
+ if (value !== null) {
850
+ if (JSON.stringify(value) !== JSON.stringify(this.readNative(intent.next)))
851
+ throw new ProtectedRecordStorageError('Migration source changed; credentials are retained for recovery. Restart to reconcile before OAuth use.');
852
+ this.remove(source);
853
+ }
854
+ }
855
+ if (intent.previous)
856
+ this.deleteChunks(intent.previous);
857
+ this.remove(this.meta(intent.next.record, 'intent'));
858
+ }
859
+ nativeEnvelope(reference) {
860
+ this.validateReference(reference);
861
+ let encoded = '';
862
+ for (let index = 0; index < reference.chunks; index++) {
863
+ const value = this.native.read(this.chunkKey(reference, index));
864
+ if (!value || value.length > 1800 || !/^[A-Za-z0-9+/]+={0,2}$/.test(value))
865
+ throw new ProtectedRecordStorageError();
866
+ encoded += value;
867
+ }
868
+ const envelope = EnvelopeSchema.parse(JSON.parse(Buffer.from(encoded, 'base64').toString('utf8')));
869
+ if (nativeDigest(encoded, envelope.nonce) !== reference.digest)
870
+ throw new ProtectedRecordStorageError();
871
+ if (envelope.scope !== this.scope ||
872
+ envelope.record !== reference.record ||
873
+ envelope.revision !== reference.revision)
874
+ throw new ProtectedRecordStorageError();
875
+ if (this.layout.opaqueFileNames) {
876
+ if (!envelope.file ||
877
+ !this.managedFile(envelope.file) ||
878
+ this.recordKey(reference.location, envelope.file) !== reference.record)
879
+ throw new ProtectedRecordStorageError();
880
+ }
881
+ const category = this.fileCategory(this.layout.opaqueFileNames ? envelope.file : reference.file);
882
+ if (reference.category !== undefined && reference.category !== category)
883
+ throw new ProtectedRecordStorageError();
884
+ return envelope;
885
+ }
886
+ readNative(reference) {
887
+ return this.nativeEnvelope(reference).payload;
888
+ }
889
+ logicalFile(reference) {
890
+ return this.layout.opaqueFileNames ? this.nativeEnvelope(reference).file : reference.file;
891
+ }
892
+ fileCategory(file) {
893
+ if (!this.managedFile(file))
894
+ throw new ProtectedRecordStorageError();
895
+ if (file.endsWith('.tmp'))
896
+ return 'temporary';
897
+ const prefix = this.layout.prefixes.find((prefix) => file.startsWith(prefix));
898
+ if (prefix === undefined)
899
+ throw new ProtectedRecordStorageError();
900
+ return prefix;
901
+ }
902
+ matchesCategory(reference, prefix) {
903
+ if (!prefix)
904
+ return true;
905
+ if (!this.layout.opaqueFileNames)
906
+ return reference.file.startsWith(prefix);
907
+ if (reference.category === undefined)
908
+ throw new ProtectedRecordStorageError();
909
+ // Public callers may use a partial category or a more specific filename prefix.
910
+ return reference.category.startsWith(prefix) || prefix.startsWith(reference.category);
911
+ }
912
+ backfillReferenceCategories() {
913
+ for (const reference of this.references()) {
914
+ const envelope = this.nativeEnvelope(reference);
915
+ const category = this.fileCategory(this.layout.opaqueFileNames ? envelope.file : reference.file);
916
+ if (reference.category === undefined) {
917
+ reference.category = category;
918
+ this.writeReference(reference);
919
+ }
920
+ }
921
+ }
922
+ deleteChunks(reference) {
923
+ this.validateReference(reference);
924
+ for (let index = 0; index < reference.chunks; index++)
925
+ this.native.delete(this.chunkKey(reference, index));
926
+ }
927
+ chunkKey(reference, index) {
928
+ return `https://oauth.1mcp.invalid/${this.scope}/${reference.record}/${reference.revision}/${index}`;
929
+ }
930
+ recordKey(location, file) {
931
+ return namespaceDigest(`${location}/${file}`);
932
+ }
933
+ sourcePath(reference) {
934
+ if (this.mode === 'file' && !/^[a-f0-9]{64}\.(json|tmp)$/.test(reference.file))
935
+ return path.join(this.getStorageDir(), reference.file);
936
+ this.validateReference(reference);
937
+ return path.join(reference.location === 'current' ? this.getStorageDir() : this.legacyDir, this.sourceFile(reference));
938
+ }
939
+ sourceFile(reference) {
940
+ if (!this.layout.opaqueFileNames)
941
+ return reference.file;
942
+ const directory = reference.location === 'current' ? this.getStorageDir() : this.legacyDir;
943
+ if (fs.existsSync(directory)) {
944
+ const candidates = fs
945
+ .readdirSync(directory)
946
+ .filter((file) => this.managedFile(file) && this.recordKey(reference.location, file) === reference.record);
947
+ if (candidates.length === 1)
948
+ return candidates[0];
949
+ }
950
+ return this.logicalFile(reference);
951
+ }
952
+ readSource(reference) {
953
+ const source = this.sourcePath(reference);
954
+ return source.endsWith('.tmp') ? this.readText(source) : this.readJson(source);
955
+ }
956
+ writeSource(reference, value) {
957
+ const source = this.sourcePath(reference);
958
+ if (source.endsWith('.tmp')) {
959
+ if (typeof value !== 'string')
960
+ throw new ProtectedRecordStorageError();
961
+ this.atomicBytes(source, value);
962
+ return;
963
+ }
964
+ this.atomic(source, value);
965
+ }
966
+ validateReference(reference) {
967
+ ReferenceSchema.parse(reference);
968
+ if (reference.category !== undefined &&
969
+ reference.category !== 'temporary' &&
970
+ !this.layout.prefixes.includes(reference.category))
971
+ throw new ProtectedRecordStorageError();
972
+ if (reference.scope !== this.scope ||
973
+ reference.record !==
974
+ (this.layout.opaqueFileNames
975
+ ? reference.file.split('.')[0]
976
+ : this.recordKey(reference.location, reference.file)) ||
977
+ !(this.layout.opaqueFileNames
978
+ ? /^[a-f0-9]{64}\.(json|tmp)$/.test(reference.file)
979
+ : this.managedFile(reference.file)))
980
+ throw new ProtectedRecordStorageError();
981
+ }
982
+ reference(record) {
983
+ const value = this.readJson(this.meta(record, 'ref'));
984
+ if (value === null)
985
+ return null;
986
+ const reference = ReferenceSchema.parse(value);
987
+ this.validateReference(reference);
988
+ if (reference.record !== record)
989
+ throw new ProtectedRecordStorageError();
990
+ const verified = this.verifiedCategories.get(record);
991
+ if (verified && (verified.revision !== reference.revision || verified.category !== reference.category))
992
+ throw new ProtectedRecordStorageError();
993
+ return reference;
994
+ }
995
+ references() {
996
+ return fs
997
+ .readdirSync(this.metadataDir)
998
+ .filter((file) => /^[a-f0-9]{64}\.ref$/.test(file))
999
+ .map((file) => this.reference(file.slice(0, -4)));
1000
+ }
1001
+ writeReference(reference) {
1002
+ this.atomic(this.meta(reference.record, 'ref'), reference);
1003
+ if (reference.retired)
1004
+ this.verifiedCategories.delete(reference.record);
1005
+ else if (reference.category !== undefined)
1006
+ this.verifiedCategories.set(reference.record, { revision: reference.revision, category: reference.category });
1007
+ }
1008
+ meta(key, extension = 'meta') {
1009
+ return path.join(this.metadataDir, `${key}.${extension}`);
1010
+ }
1011
+ state() {
1012
+ const value = this.readJson(this.meta('state'));
1013
+ return value === null ? null : StateSchema.parse(value);
1014
+ }
1015
+ assertOwner(claim = false) {
1016
+ const marker = this.readJson(this.meta('owner'));
1017
+ if (marker === null) {
1018
+ if (!claim)
1019
+ throw new ProtectedRecordStorageError('OAuth storage ownership is not initialized. Restart the runtime.');
1020
+ this.atomic(this.meta('owner'), { version: 1, runtimeScope: this.runtimeScope });
1021
+ return;
1022
+ }
1023
+ if (OwnerSchema.parse(marker).runtimeScope !== this.runtimeScope) {
1024
+ throw new ProtectedRecordStorageError('This OAuth storage directory belongs to another Runtime Scope. Shared session-storage paths are not supported; choose a separate path for this Runtime Scope.');
1025
+ }
1026
+ }
1027
+ assertEpoch() {
1028
+ this.assertOwner();
1029
+ const state = this.state();
1030
+ if (this.failed ||
1031
+ failedScopes.has(this.scope) ||
1032
+ this.readJson(this.meta('transaction', 'commit')) !== null ||
1033
+ this.readJson(this.meta('file-transaction', 'commit')) !== null)
1034
+ throw new ProtectedRecordStorageError();
1035
+ if (!this.epoch || state?.epoch !== this.epoch || state.mode !== this.mode)
1036
+ throw new StorageEpochError('OAuth storage is not ready or its backend changed. Restart the runtime.');
1037
+ }
1038
+ readJson(file) {
1039
+ const text = this.readText(file);
1040
+ return text === null ? null : JSON.parse(text);
1041
+ }
1042
+ readText(file) {
1043
+ if (!fs.existsSync(path.dirname(file)))
1044
+ return null;
1045
+ assertOwnerOnlyDirPermissions(path.dirname(file));
1046
+ let descriptor;
1047
+ try {
1048
+ descriptor = openCredentialReadSync(file);
1049
+ }
1050
+ catch (error) {
1051
+ if (error.code === 'ENOENT')
1052
+ return null;
1053
+ throw error;
1054
+ }
1055
+ try {
1056
+ enforceOwnerOnlyFilePermissions(descriptor, file);
1057
+ if (!fs.fstatSync(descriptor).isFile())
1058
+ throw new ProtectedRecordStorageError();
1059
+ const bytes = fs.readFileSync(descriptor);
1060
+ const text = bytes.toString('utf8');
1061
+ // Never discard byte sequences through replacement decoding during migration.
1062
+ if (!Buffer.from(text, 'utf8').equals(bytes))
1063
+ throw new ProtectedRecordStorageError('OAuth recovery data is not valid UTF-8. Preserve the source and repair its encoding before restarting.');
1064
+ return text;
1065
+ }
1066
+ finally {
1067
+ fs.closeSync(descriptor);
1068
+ }
1069
+ }
1070
+ atomic(file, value) {
1071
+ this.atomicBytes(file, JSON.stringify(value));
1072
+ }
1073
+ atomicBytes(file, text) {
1074
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
1075
+ assertOwnerOnlyDirPermissions(path.dirname(file));
1076
+ const temporary = `${file}.${randomUUID()}.tmp`;
1077
+ const descriptor = fs.openSync(temporary, 'wx', 0o600);
1078
+ try {
1079
+ fs.writeFileSync(descriptor, text, { mode: 0o600 });
1080
+ fs.fsyncSync(descriptor);
1081
+ }
1082
+ finally {
1083
+ fs.closeSync(descriptor);
1084
+ }
1085
+ fs.renameSync(temporary, file);
1086
+ this.flush(path.dirname(file));
1087
+ }
1088
+ remove(file) {
1089
+ try {
1090
+ fs.unlinkSync(file);
1091
+ }
1092
+ catch (error) {
1093
+ if (error.code === 'ENOENT')
1094
+ return false;
1095
+ throw error;
1096
+ }
1097
+ this.flush(path.dirname(file));
1098
+ if (path.dirname(file) === this.metadataDir && /^[a-f0-9]{64}\.ref$/.test(path.basename(file)))
1099
+ this.verifiedCategories.delete(path.basename(file).slice(0, -4));
1100
+ return true;
1101
+ }
1102
+ flush(directory) {
1103
+ if (process.platform === 'win32')
1104
+ return;
1105
+ const descriptor = fs.openSync(directory, 'r');
1106
+ try {
1107
+ fs.fsyncSync(descriptor);
1108
+ }
1109
+ finally {
1110
+ fs.closeSync(descriptor);
1111
+ }
1112
+ }
1113
+ safe(operation) {
1114
+ try {
1115
+ return operation();
1116
+ }
1117
+ catch (error) {
1118
+ if (error instanceof StorageLockBusyError)
1119
+ throw new StorageBusyError('OAuth storage is busy. Retry the request after the current transaction completes.');
1120
+ if (error instanceof StorageEpochError || error instanceof StorageBusyError)
1121
+ throw error;
1122
+ if (this.mode === 'native') {
1123
+ this.failed = true;
1124
+ failedScopes.add(this.scope);
1125
+ }
1126
+ if (error instanceof ProtectedRecordStorageError || error instanceof NativeCredentialStoreError)
1127
+ throw error;
1128
+ throw new ProtectedRecordStorageError();
1129
+ }
1130
+ }
1131
+ }
1132
+ /** Resolve existing symlink ancestors without creating or changing a Runtime Scope directory. */
1133
+ function canonicalPath(directory) {
1134
+ const resolved = path.resolve(directory);
1135
+ if (fs.existsSync(resolved))
1136
+ return fs.realpathSync(resolved);
1137
+ return path.join(canonicalPath(path.dirname(resolved)), path.basename(resolved));
1138
+ }
1139
+ //# sourceMappingURL=protectedRecordStorage.js.map