@1mcp/agent 0.35.0-beta.3 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/build/admin/assets/admin-AboutRuntimeWorkspace-DH2QC2nJ.js +1 -0
  2. package/build/admin/assets/admin-BackendLogsWorkspace-BKavXT9B.js +1 -0
  3. package/build/admin/assets/admin-InstructionTemplatesWorkspace-CvG4EPdZ.js +1 -0
  4. package/build/admin/assets/admin-OAuthServicesWorkspace-B8y2weAX.js +1 -0
  5. package/build/admin/assets/admin-PresetAuthoringWorkspace-BboJVBFl.js +1 -0
  6. package/build/admin/assets/admin-console-D6jyI73o.css +1 -0
  7. package/build/admin/assets/{admin-console-Bbil6BQU.css → admin-console-DmRyrCWD.css} +1 -1
  8. package/build/admin/assets/admin-console-HJH52xGP.js +3 -0
  9. package/build/admin/assets/admin-icons-CYGTDZA5.js +1 -0
  10. package/build/admin/assets/admin-mantine-xwbfu5Gd.js +53 -0
  11. package/build/admin/assets/admin-react-BSaWeqgv.js +8 -0
  12. package/build/admin/assets/admin-rolldown-runtime-Bh1tDfsg.js +1 -0
  13. package/build/admin/favicon.svg +4 -0
  14. package/build/admin/index.html +8 -2
  15. package/build/auth/sdkOAuthClientProvider.d.ts +4 -0
  16. package/build/auth/sdkOAuthClientProvider.d.ts.map +1 -1
  17. package/build/auth/sdkOAuthClientProvider.js +29 -0
  18. package/build/auth/sdkOAuthClientProvider.js.map +1 -1
  19. package/build/auth/sessionTypes.d.ts +2 -0
  20. package/build/auth/sessionTypes.d.ts.map +1 -1
  21. package/build/auth/sessionTypes.js.map +1 -1
  22. package/build/commands/inspect/inspect.d.ts +1 -0
  23. package/build/commands/inspect/inspect.d.ts.map +1 -1
  24. package/build/commands/inspect/inspect.js +4 -1
  25. package/build/commands/inspect/inspect.js.map +1 -1
  26. package/build/commands/instructions/instructions.d.ts.map +1 -1
  27. package/build/commands/instructions/instructions.js +56 -1
  28. package/build/commands/instructions/instructions.js.map +1 -1
  29. package/build/commands/mcp/add.js +2 -2
  30. package/build/commands/mcp/add.js.map +1 -1
  31. package/build/commands/mcp/list.js +1 -1
  32. package/build/commands/mcp/list.js.map +1 -1
  33. package/build/commands/mcp/update.js +1 -1
  34. package/build/commands/mcp/update.js.map +1 -1
  35. package/build/commands/proxy/proxy.d.ts.map +1 -1
  36. package/build/commands/proxy/proxy.js +2 -0
  37. package/build/commands/proxy/proxy.js.map +1 -1
  38. package/build/commands/run/run.d.ts +1 -0
  39. package/build/commands/run/run.d.ts.map +1 -1
  40. package/build/commands/run/run.js +4 -1
  41. package/build/commands/run/run.js.map +1 -1
  42. package/build/commands/serve/index.d.ts +10 -0
  43. package/build/commands/serve/index.d.ts.map +1 -1
  44. package/build/commands/serve/index.js +10 -0
  45. package/build/commands/serve/index.js.map +1 -1
  46. package/build/commands/serve/serve.d.ts +3 -0
  47. package/build/commands/serve/serve.d.ts.map +1 -1
  48. package/build/commands/serve/serve.js +20 -0
  49. package/build/commands/serve/serve.js.map +1 -1
  50. package/build/commands/serve/serveBackground.d.ts.map +1 -1
  51. package/build/commands/serve/serveBackground.js +2 -0
  52. package/build/commands/serve/serveBackground.js.map +1 -1
  53. package/build/commands/serve/templateContextTrust.d.ts +12 -0
  54. package/build/commands/serve/templateContextTrust.d.ts.map +1 -0
  55. package/build/commands/serve/templateContextTrust.js +23 -0
  56. package/build/commands/serve/templateContextTrust.js.map +1 -0
  57. package/build/commands/shared/apiClient.d.ts +3 -0
  58. package/build/commands/shared/apiClient.d.ts.map +1 -1
  59. package/build/commands/shared/apiClient.js +6 -0
  60. package/build/commands/shared/apiClient.js.map +1 -1
  61. package/build/commands/shared/clientSurfaceAttachment.d.ts +11 -0
  62. package/build/commands/shared/clientSurfaceAttachment.d.ts.map +1 -1
  63. package/build/commands/shared/clientSurfaceAttachment.js +64 -6
  64. package/build/commands/shared/clientSurfaceAttachment.js.map +1 -1
  65. package/build/commands/shared/inspectApiSchemas.d.ts +8 -8
  66. package/build/commands/shared/serveClient.d.ts +2 -1
  67. package/build/commands/shared/serveClient.d.ts.map +1 -1
  68. package/build/commands/shared/serveClient.js +3 -1
  69. package/build/commands/shared/serveClient.js.map +1 -1
  70. package/build/commands/shared/serveTargetResolver.d.ts +4 -0
  71. package/build/commands/shared/serveTargetResolver.d.ts.map +1 -1
  72. package/build/commands/shared/serveTargetResolver.js +22 -22
  73. package/build/commands/shared/serveTargetResolver.js.map +1 -1
  74. package/build/commands/wait/wait.d.ts.map +1 -1
  75. package/build/commands/wait/wait.js +1 -0
  76. package/build/commands/wait/wait.js.map +1 -1
  77. package/build/config/configManager.d.ts +11 -1
  78. package/build/config/configManager.d.ts.map +1 -1
  79. package/build/config/configManager.js +13 -0
  80. package/build/config/configManager.js.map +1 -1
  81. package/build/config/configuredServerTargets.d.ts +3 -0
  82. package/build/config/configuredServerTargets.d.ts.map +1 -0
  83. package/build/config/configuredServerTargets.js +8 -0
  84. package/build/config/configuredServerTargets.js.map +1 -0
  85. package/build/config/mcpConfigManager.d.ts +3 -0
  86. package/build/config/mcpConfigManager.d.ts.map +1 -1
  87. package/build/config/mcpConfigManager.js +15 -0
  88. package/build/config/mcpConfigManager.js.map +1 -1
  89. package/build/constants/api.d.ts +1 -0
  90. package/build/constants/api.d.ts.map +1 -1
  91. package/build/constants/api.js +1 -0
  92. package/build/constants/api.js.map +1 -1
  93. package/build/constants/mcp.d.ts +1 -1
  94. package/build/constants/mcp.d.ts.map +1 -1
  95. package/build/constants/mcp.js +1 -1
  96. package/build/constants/mcp.js.map +1 -1
  97. package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -1
  98. package/build/core/capabilities/capabilityAggregator.js +33 -14
  99. package/build/core/capabilities/capabilityAggregator.js.map +1 -1
  100. package/build/core/capabilities/capabilityCatalog.d.ts +23 -1
  101. package/build/core/capabilities/capabilityCatalog.d.ts.map +1 -1
  102. package/build/core/capabilities/capabilityCatalog.js +81 -7
  103. package/build/core/capabilities/capabilityCatalog.js.map +1 -1
  104. package/build/core/capabilities/capabilityPagination.d.ts +40 -0
  105. package/build/core/capabilities/capabilityPagination.d.ts.map +1 -0
  106. package/build/core/capabilities/capabilityPagination.js +287 -0
  107. package/build/core/capabilities/capabilityPagination.js.map +1 -0
  108. package/build/core/capabilities/capabilityVisibility.d.ts +2 -1
  109. package/build/core/capabilities/capabilityVisibility.d.ts.map +1 -1
  110. package/build/core/capabilities/capabilityVisibility.js +2 -1
  111. package/build/core/capabilities/capabilityVisibility.js.map +1 -1
  112. package/build/core/capabilities/configuredToolSnapshot.d.ts +12 -0
  113. package/build/core/capabilities/configuredToolSnapshot.d.ts.map +1 -0
  114. package/build/core/capabilities/configuredToolSnapshot.js +98 -0
  115. package/build/core/capabilities/configuredToolSnapshot.js.map +1 -0
  116. package/build/core/capabilities/lazyLoadingOrchestrator.d.ts.map +1 -1
  117. package/build/core/capabilities/lazyLoadingOrchestrator.js +8 -4
  118. package/build/core/capabilities/lazyLoadingOrchestrator.js.map +1 -1
  119. package/build/core/capabilities/metaToolProvider.js +3 -3
  120. package/build/core/capabilities/metaToolProvider.js.map +1 -1
  121. package/build/core/client/clientManager.d.ts.map +1 -1
  122. package/build/core/client/clientManager.js +11 -6
  123. package/build/core/client/clientManager.js.map +1 -1
  124. package/build/core/client/postAuthOAuthRecovery.d.ts +6 -0
  125. package/build/core/client/postAuthOAuthRecovery.d.ts.map +1 -0
  126. package/build/core/client/postAuthOAuthRecovery.js +74 -0
  127. package/build/core/client/postAuthOAuthRecovery.js.map +1 -0
  128. package/build/core/configChangeHandler.d.ts +2 -0
  129. package/build/core/configChangeHandler.d.ts.map +1 -1
  130. package/build/core/configChangeHandler.js +38 -11
  131. package/build/core/configChangeHandler.js.map +1 -1
  132. package/build/core/context/templateContextTrust.d.ts +66 -0
  133. package/build/core/context/templateContextTrust.d.ts.map +1 -0
  134. package/build/core/context/templateContextTrust.js +184 -0
  135. package/build/core/context/templateContextTrust.js.map +1 -0
  136. package/build/core/instructions/effectiveServerInstructions.d.ts +17 -0
  137. package/build/core/instructions/effectiveServerInstructions.d.ts.map +1 -0
  138. package/build/core/instructions/effectiveServerInstructions.js +12 -0
  139. package/build/core/instructions/effectiveServerInstructions.js.map +1 -0
  140. package/build/core/instructions/instructionAggregator.d.ts +51 -2
  141. package/build/core/instructions/instructionAggregator.d.ts.map +1 -1
  142. package/build/core/instructions/instructionAggregator.js +191 -30
  143. package/build/core/instructions/instructionAggregator.js.map +1 -1
  144. package/build/core/instructions/instructionsDistribution.d.ts +53 -0
  145. package/build/core/instructions/instructionsDistribution.d.ts.map +1 -1
  146. package/build/core/instructions/instructionsDistribution.js +25 -0
  147. package/build/core/instructions/instructionsDistribution.js.map +1 -1
  148. package/build/core/instructions/templateTypes.d.ts +25 -3
  149. package/build/core/instructions/templateTypes.d.ts.map +1 -1
  150. package/build/core/instructions/templateTypes.js +45 -0
  151. package/build/core/instructions/templateTypes.js.map +1 -1
  152. package/build/core/protocol/notificationHandlers.d.ts.map +1 -1
  153. package/build/core/protocol/notificationHandlers.js +26 -4
  154. package/build/core/protocol/notificationHandlers.js.map +1 -1
  155. package/build/core/protocol/promptRequestHandlers.d.ts.map +1 -1
  156. package/build/core/protocol/promptRequestHandlers.js +20 -11
  157. package/build/core/protocol/promptRequestHandlers.js.map +1 -1
  158. package/build/core/protocol/requestHandlerUtils.d.ts +4 -0
  159. package/build/core/protocol/requestHandlerUtils.d.ts.map +1 -1
  160. package/build/core/protocol/requestHandlerUtils.js +24 -4
  161. package/build/core/protocol/requestHandlerUtils.js.map +1 -1
  162. package/build/core/protocol/resourceRequestHandlers.d.ts.map +1 -1
  163. package/build/core/protocol/resourceRequestHandlers.js +38 -18
  164. package/build/core/protocol/resourceRequestHandlers.js.map +1 -1
  165. package/build/core/protocol/toolRequestHandlers.d.ts.map +1 -1
  166. package/build/core/protocol/toolRequestHandlers.js +79 -23
  167. package/build/core/protocol/toolRequestHandlers.js.map +1 -1
  168. package/build/core/server/agentConfig.d.ts +4 -0
  169. package/build/core/server/agentConfig.d.ts.map +1 -1
  170. package/build/core/server/agentConfig.js +3 -0
  171. package/build/core/server/agentConfig.js.map +1 -1
  172. package/build/core/server/clientInstancePool.js +2 -2
  173. package/build/core/server/clientInstancePool.js.map +1 -1
  174. package/build/core/server/connectionManager.d.ts.map +1 -1
  175. package/build/core/server/connectionManager.js +2 -0
  176. package/build/core/server/connectionManager.js.map +1 -1
  177. package/build/core/server/disabledTools.d.ts +2 -0
  178. package/build/core/server/disabledTools.d.ts.map +1 -1
  179. package/build/core/server/disabledTools.js +7 -4
  180. package/build/core/server/disabledTools.js.map +1 -1
  181. package/build/core/server/requestContextPreparation.d.ts +2 -1
  182. package/build/core/server/requestContextPreparation.d.ts.map +1 -1
  183. package/build/core/server/requestContextPreparation.js.map +1 -1
  184. package/build/core/server/runtimeScopeOwnership.js +1 -1
  185. package/build/core/server/runtimeScopeOwnership.js.map +1 -1
  186. package/build/core/server/serverManager.d.ts.map +1 -1
  187. package/build/core/server/serverManager.js +1 -0
  188. package/build/core/server/serverManager.js.map +1 -1
  189. package/build/core/server/templateIdentity.d.ts +1 -0
  190. package/build/core/server/templateIdentity.d.ts.map +1 -1
  191. package/build/core/server/templateIdentity.js +11 -1
  192. package/build/core/server/templateIdentity.js.map +1 -1
  193. package/build/core/server/templateServerManager.d.ts +5 -1
  194. package/build/core/server/templateServerManager.d.ts.map +1 -1
  195. package/build/core/server/templateServerManager.js +27 -9
  196. package/build/core/server/templateServerManager.js.map +1 -1
  197. package/build/core/server/toolDescriptionOverrides.d.ts +9 -0
  198. package/build/core/server/toolDescriptionOverrides.d.ts.map +1 -0
  199. package/build/core/server/toolDescriptionOverrides.js +44 -0
  200. package/build/core/server/toolDescriptionOverrides.js.map +1 -0
  201. package/build/core/tools/handlers/serverManagementHandler.d.ts +15 -1
  202. package/build/core/tools/handlers/serverManagementHandler.d.ts.map +1 -1
  203. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts +2 -0
  204. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts.map +1 -1
  205. package/build/core/tools/internal/schemas/discovery.d.ts +2 -2
  206. package/build/core/tools/internal/schemas/index.d.ts +9 -9
  207. package/build/core/tools/internal/schemas/installation.d.ts +3 -3
  208. package/build/core/tools/internal/schemas/management.d.ts +4 -4
  209. package/build/core/types/server.d.ts +2 -0
  210. package/build/core/types/server.d.ts.map +1 -1
  211. package/build/core/types/server.js.map +1 -1
  212. package/build/core/types/transport.d.ts +43 -0
  213. package/build/core/types/transport.d.ts.map +1 -1
  214. package/build/core/types/transport.js +60 -1
  215. package/build/core/types/transport.js.map +1 -1
  216. package/build/domains/admin/adminConfiguredServerService.d.ts +131 -4
  217. package/build/domains/admin/adminConfiguredServerService.d.ts.map +1 -1
  218. package/build/domains/admin/adminConfiguredServerService.js +766 -39
  219. package/build/domains/admin/adminConfiguredServerService.js.map +1 -1
  220. package/build/domains/admin/adminDomain.d.ts +13 -0
  221. package/build/domains/admin/adminDomain.d.ts.map +1 -1
  222. package/build/domains/admin/adminDomain.js +16 -0
  223. package/build/domains/admin/adminDomain.js.map +1 -1
  224. package/build/domains/admin/adminInstructionPreviewRuntime.d.ts +7 -0
  225. package/build/domains/admin/adminInstructionPreviewRuntime.d.ts.map +1 -0
  226. package/build/domains/admin/adminInstructionPreviewRuntime.js +154 -0
  227. package/build/domains/admin/adminInstructionPreviewRuntime.js.map +1 -0
  228. package/build/domains/admin/adminInstructionTemplateService.d.ts +169 -0
  229. package/build/domains/admin/adminInstructionTemplateService.d.ts.map +1 -0
  230. package/build/domains/admin/adminInstructionTemplateService.js +181 -0
  231. package/build/domains/admin/adminInstructionTemplateService.js.map +1 -0
  232. package/build/domains/admin/configuredToolInventory.d.ts +46 -0
  233. package/build/domains/admin/configuredToolInventory.d.ts.map +1 -0
  234. package/build/domains/admin/configuredToolInventory.js +135 -0
  235. package/build/domains/admin/configuredToolInventory.js.map +1 -0
  236. package/build/domains/backend-logs/backendLogSource.d.ts.map +1 -1
  237. package/build/domains/backend-logs/backendLogSource.js.map +1 -1
  238. package/build/domains/config-change/configChange.d.ts +2 -1
  239. package/build/domains/config-change/configChange.d.ts.map +1 -1
  240. package/build/domains/config-change/configChange.js +241 -13
  241. package/build/domains/config-change/configChange.js.map +1 -1
  242. package/build/domains/config-change/types.d.ts +34 -2
  243. package/build/domains/config-change/types.d.ts.map +1 -1
  244. package/build/domains/installation/serverInstallationSourceResolution.js +2 -0
  245. package/build/domains/installation/serverInstallationSourceResolution.js.map +1 -1
  246. package/build/domains/installation/serverInstallationTypes.d.ts +8 -0
  247. package/build/domains/installation/serverInstallationTypes.d.ts.map +1 -1
  248. package/build/domains/installation/serverInstallationWorkflow.js +16 -3
  249. package/build/domains/installation/serverInstallationWorkflow.js.map +1 -1
  250. package/build/domains/instruction-template/instructionTemplateManager.d.ts +58 -0
  251. package/build/domains/instruction-template/instructionTemplateManager.d.ts.map +1 -0
  252. package/build/domains/instruction-template/instructionTemplateManager.js +167 -0
  253. package/build/domains/instruction-template/instructionTemplateManager.js.map +1 -0
  254. package/build/domains/runtime-targets/runtimeIdentityVerification.d.ts +1 -0
  255. package/build/domains/runtime-targets/runtimeIdentityVerification.d.ts.map +1 -1
  256. package/build/domains/runtime-targets/runtimeIdentityVerification.js +6 -5
  257. package/build/domains/runtime-targets/runtimeIdentityVerification.js.map +1 -1
  258. package/build/transport/http/middlewares/httpRequestLogger.d.ts.map +1 -1
  259. package/build/transport/http/middlewares/httpRequestLogger.js +3 -2
  260. package/build/transport/http/middlewares/httpRequestLogger.js.map +1 -1
  261. package/build/transport/http/routes/adminRoutes.d.ts +2 -0
  262. package/build/transport/http/routes/adminRoutes.d.ts.map +1 -1
  263. package/build/transport/http/routes/adminRoutes.js +422 -23
  264. package/build/transport/http/routes/adminRoutes.js.map +1 -1
  265. package/build/transport/http/routes/apiRoutes.d.ts.map +1 -1
  266. package/build/transport/http/routes/apiRoutes.js +2 -0
  267. package/build/transport/http/routes/apiRoutes.js.map +1 -1
  268. package/build/transport/http/routes/inspectRequestContext.d.ts +2 -0
  269. package/build/transport/http/routes/inspectRequestContext.d.ts.map +1 -1
  270. package/build/transport/http/routes/inspectRequestContext.js +15 -6
  271. package/build/transport/http/routes/inspectRequestContext.js.map +1 -1
  272. package/build/transport/http/routes/inspectRoutes.d.ts +9 -0
  273. package/build/transport/http/routes/inspectRoutes.d.ts.map +1 -1
  274. package/build/transport/http/routes/inspectRoutes.js +15 -10
  275. package/build/transport/http/routes/inspectRoutes.js.map +1 -1
  276. package/build/transport/http/routes/instructionsRoutes.d.ts +4 -0
  277. package/build/transport/http/routes/instructionsRoutes.d.ts.map +1 -0
  278. package/build/transport/http/routes/instructionsRoutes.js +147 -0
  279. package/build/transport/http/routes/instructionsRoutes.js.map +1 -0
  280. package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
  281. package/build/transport/http/routes/streamableHttpRoutes.js +13 -4
  282. package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
  283. package/build/transport/http/routes/toolRoutes.d.ts.map +1 -1
  284. package/build/transport/http/routes/toolRoutes.js +5 -4
  285. package/build/transport/http/routes/toolRoutes.js.map +1 -1
  286. package/build/transport/http/server.d.ts.map +1 -1
  287. package/build/transport/http/server.js +17 -0
  288. package/build/transport/http/server.js.map +1 -1
  289. package/build/transport/http/storage/streamableSessionRepository.d.ts.map +1 -1
  290. package/build/transport/http/storage/streamableSessionRepository.js +2 -0
  291. package/build/transport/http/storage/streamableSessionRepository.js.map +1 -1
  292. package/build/transport/http/streamableSessionLifecycle.d.ts +3 -1
  293. package/build/transport/http/streamableSessionLifecycle.d.ts.map +1 -1
  294. package/build/transport/http/streamableSessionLifecycle.js +23 -6
  295. package/build/transport/http/streamableSessionLifecycle.js.map +1 -1
  296. package/build/transport/http/utils/contextExtractor.d.ts +14 -16
  297. package/build/transport/http/utils/contextExtractor.d.ts.map +1 -1
  298. package/build/transport/http/utils/contextExtractor.js +124 -33
  299. package/build/transport/http/utils/contextExtractor.js.map +1 -1
  300. package/build/transport/http/utils/templateContextAuthority.d.ts +13 -0
  301. package/build/transport/http/utils/templateContextAuthority.d.ts.map +1 -0
  302. package/build/transport/http/utils/templateContextAuthority.js +121 -0
  303. package/build/transport/http/utils/templateContextAuthority.js.map +1 -0
  304. package/build/transport/stdioProxyTransport.d.ts +3 -0
  305. package/build/transport/stdioProxyTransport.d.ts.map +1 -1
  306. package/build/transport/stdioProxyTransport.js +7 -2
  307. package/build/transport/stdioProxyTransport.js.map +1 -1
  308. package/build/utils/validation/discoveredServer.d.ts +15 -0
  309. package/build/utils/validation/discoveredServer.d.ts.map +1 -0
  310. package/build/utils/validation/discoveredServer.js +2 -0
  311. package/build/utils/validation/discoveredServer.js.map +1 -0
  312. package/build/utils/validation/urlDetection.d.ts +4 -5
  313. package/build/utils/validation/urlDetection.d.ts.map +1 -1
  314. package/build/utils/validation/urlDetection.js +94 -25
  315. package/build/utils/validation/urlDetection.js.map +1 -1
  316. package/package.json +2 -2
  317. package/build/admin/assets/admin-console-BOl7XR0p.js +0 -61
  318. package/build/utils/ui/pagination.d.ts +0 -35
  319. package/build/utils/ui/pagination.d.ts.map +0 -1
  320. package/build/utils/ui/pagination.js +0 -166
  321. package/build/utils/ui/pagination.js.map +0 -1
@@ -6,6 +6,7 @@ import { MCP_PROJECT_METADATA } from '../../../constants.js';
6
6
  import { parseTemplateConnectionKey } from '../../../core/server/templateIdentity.js';
7
7
  import { AdminConfiguredServerApplyError, AdminConfiguredServerNotFoundError, } from '../../../domains/admin/adminConfiguredServerService.js';
8
8
  import { ADMIN_SESSION_COOKIE_NAME, AdminIdentityError, } from '../../../domains/admin/adminIdentityService.js';
9
+ import { AdminInstructionTemplateNotFoundError, } from '../../../domains/admin/adminInstructionTemplateService.js';
9
10
  import { AdminPresetConflictError, AdminPresetNotFoundError, } from '../../../domains/admin/adminPresetService.js';
10
11
  import { sensitiveOperationLimiter } from '../../../transport/http/middlewares/securityMiddleware.js';
11
12
  import { sanitizeErrorMessage } from '../../../utils/validation/sanitization.js';
@@ -40,6 +41,7 @@ const adminOAuthServiceParamsSchema = z.object({
40
41
  const backendLogSnapshotQuerySchema = z.object({
41
42
  sourceId: z.string().trim().min(1).max(256).optional(),
42
43
  });
44
+ const configuredServerModelSchema = z.string().trim().min(1).max(64);
43
45
  const cliConfiguredServerMutationBodySchema = z.object({
44
46
  targetName: z.string().trim().min(1).max(256),
45
47
  dryRun: z.boolean().optional(),
@@ -53,6 +55,67 @@ const cliBackendRestartBodySchema = z
53
55
  .refine((value) => !(value.instance !== undefined && value.allInstances === true), {
54
56
  message: 'instance and allInstances are mutually exclusive',
55
57
  });
58
+ const instructionTemplateIdentitySchema = z.string().trim().min(1).max(128);
59
+ const instructionTemplateVariantsSchema = z.object({ initialization: z.string(), cli: z.string() }).strict();
60
+ const instructionPreviewSelectionSchema = z.discriminatedUnion('mode', [
61
+ z.object({ mode: z.literal('all') }).strict(),
62
+ z.object({ mode: z.literal('preset'), preset: z.string().trim().min(1).max(128) }).strict(),
63
+ z.object({ mode: z.literal('tags'), tags: z.array(z.string().trim().min(1).max(128)).max(256) }).strict(),
64
+ z.object({ mode: z.literal('tag-filter'), expression: z.string().trim().min(1).max(4096) }).strict(),
65
+ ]);
66
+ const requestContextSchema = z
67
+ .object({
68
+ project: z
69
+ .object({
70
+ path: z.string().optional(),
71
+ cwd: z.string().optional(),
72
+ name: z.string().optional(),
73
+ environment: z.string().optional(),
74
+ custom: z.record(z.string(), z.unknown()).optional(),
75
+ git: z
76
+ .object({
77
+ branch: z.string().optional(),
78
+ commit: z.string().optional(),
79
+ repository: z.string().optional(),
80
+ isRepo: z.boolean().optional(),
81
+ })
82
+ .strict()
83
+ .optional(),
84
+ })
85
+ .strict(),
86
+ user: z
87
+ .object({
88
+ name: z.string().optional(),
89
+ email: z.string().optional(),
90
+ home: z.string().optional(),
91
+ username: z.string().optional(),
92
+ uid: z.string().optional(),
93
+ gid: z.string().optional(),
94
+ shell: z.string().optional(),
95
+ })
96
+ .strict(),
97
+ environment: z
98
+ .object({
99
+ variables: z.record(z.string(), z.string()).optional(),
100
+ prefixes: z.array(z.string()).optional(),
101
+ })
102
+ .strict(),
103
+ timestamp: z.string().optional(),
104
+ sessionId: z.string().optional(),
105
+ version: z.string().optional(),
106
+ transport: z
107
+ .object({
108
+ type: z.string(),
109
+ url: z.string().optional(),
110
+ connectionId: z.string().optional(),
111
+ connectionTimestamp: z.string().optional(),
112
+ client: z.object({ name: z.string(), version: z.string(), title: z.string().optional() }).strict().optional(),
113
+ })
114
+ .strict()
115
+ .optional(),
116
+ })
117
+ .strict();
118
+ const configuredServerSourceSchema = z.enum(['mcpServers', 'mcpTemplates']);
56
119
  export function createAdminRoutes(options) {
57
120
  if (!options.adminEnabled) {
58
121
  options.adminService.revokeAllSessions();
@@ -223,6 +286,19 @@ export function createAdminRoutes(options) {
223
286
  sendAdminError(res, error);
224
287
  }
225
288
  });
289
+ router.get('/api/session', (req, res) => {
290
+ const session = options.adminService.validateSession(getAdminSessionCookie(req));
291
+ if (!session) {
292
+ res.status(200).json(unauthenticatedAdminApiResponse(options));
293
+ return;
294
+ }
295
+ res.status(200).json({
296
+ authenticated: true,
297
+ account: session.account,
298
+ csrfToken: session.csrfToken,
299
+ expiresAt: session.expiresAt,
300
+ });
301
+ });
226
302
  router.use('/api', (req, res, next) => {
227
303
  const sessionToken = getAdminSessionCookie(req);
228
304
  const session = options.adminService.validateSession(sessionToken);
@@ -236,19 +312,6 @@ export function createAdminRoutes(options) {
236
312
  }
237
313
  next();
238
314
  });
239
- router.get('/api/session', (req, res) => {
240
- const session = options.adminService.validateSession(getAdminSessionCookie(req));
241
- if (!session) {
242
- res.status(401).json({ authenticated: false });
243
- return;
244
- }
245
- res.status(200).json({
246
- authenticated: true,
247
- account: session.account,
248
- csrfToken: session.csrfToken,
249
- expiresAt: session.expiresAt,
250
- });
251
- });
252
315
  router.post('/api/session/logout', (req, res) => {
253
316
  options.adminService.revokeSession(getAdminSessionCookie(req));
254
317
  clearAdminSessionCookie(res, options.getRuntimeIdentity().externalUrl);
@@ -421,11 +484,83 @@ export function createAdminRoutes(options) {
421
484
  ok: true,
422
485
  operationId: result.operationId,
423
486
  servers: result.result.servers,
487
+ configFingerprint: result.result.configFingerprint,
424
488
  });
425
489
  });
490
+ router.get('/api/instruction-templates', async (req, res) => {
491
+ const service = options.instructionTemplateService;
492
+ if (!service)
493
+ return void res.status(404).json({ error: 'admin_instruction_templates_unavailable' });
494
+ sendAdminOperationResult(res, await service.listTemplates({
495
+ context: buildAdminOperationContext(req, options, { type: 'instruction_template_collection' }),
496
+ }));
497
+ });
498
+ router.get('/api/instruction-templates/:identity', async (req, res) => {
499
+ await handleInstructionTemplateRequest(req, res, options, 'get');
500
+ });
501
+ router.post('/api/instruction-templates', async (req, res) => {
502
+ await handleInstructionTemplateRequest(req, res, options, 'create');
503
+ });
504
+ router.post('/api/instruction-templates/import-legacy', async (req, res) => {
505
+ await handleInstructionTemplateRequest(req, res, options, 'import');
506
+ });
507
+ router.post('/api/instruction-templates/:identity/clone', async (req, res) => {
508
+ await handleInstructionTemplateRequest(req, res, options, 'clone');
509
+ });
510
+ router.post('/api/instruction-templates/:identity/update', async (req, res) => {
511
+ await handleInstructionTemplateRequest(req, res, options, 'update');
512
+ });
513
+ router.post('/api/instruction-templates/:identity/validate', async (req, res) => {
514
+ await handleInstructionTemplateRequest(req, res, options, 'validate');
515
+ });
516
+ router.post('/api/instruction-templates/:identity/preview', async (req, res) => {
517
+ await handleInstructionTemplateRequest(req, res, options, 'preview');
518
+ });
519
+ router.post('/api/instruction-templates/:identity/activate', async (req, res) => {
520
+ await handleInstructionTemplateRequest(req, res, options, 'activate');
521
+ });
522
+ router.post('/api/instruction-templates/:identity/delete-preview', async (req, res) => {
523
+ await handleInstructionTemplateRequest(req, res, options, 'delete-preview');
524
+ });
525
+ router.delete('/api/instruction-templates/:identity', async (req, res) => {
526
+ await handleInstructionTemplateRequest(req, res, options, 'delete');
527
+ });
528
+ router.get('/api/configured-servers/create-contract', async (req, res) => {
529
+ await handleConfiguredServerCreateContract(req, res, options);
530
+ });
531
+ router.post('/api/configured-servers/create-preview', async (req, res) => {
532
+ await handleConfiguredServerCreatePreview(req, res, options);
533
+ });
534
+ router.post('/api/configured-servers', async (req, res) => {
535
+ await handleConfiguredServerCreateApply(req, res, options);
536
+ });
537
+ router.get('/api/configured-servers/:source/:name', async (req, res) => {
538
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
539
+ if (!source.success)
540
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
541
+ await handleConfiguredServerDetail(req, res, options, source.data);
542
+ });
426
543
  router.get('/api/configured-servers/:name', async (req, res) => {
427
544
  await handleConfiguredServerDetail(req, res, options);
428
545
  });
546
+ router.post('/api/configured-servers/:source/:name/preview', async (req, res) => {
547
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
548
+ if (!source.success)
549
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
550
+ await handleConfiguredServerPreview(req, res, options, source.data);
551
+ });
552
+ router.post('/api/configured-servers/:source/:name/apply', async (req, res) => {
553
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
554
+ if (!source.success)
555
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
556
+ await handleConfiguredServerApply(req, res, options, source.data);
557
+ });
558
+ router.post('/api/configured-servers/mcpServers/:name/enable', async (req, res) => {
559
+ await handleConfiguredServerMutation(req, res, options, 'enableConfiguredServer', 'mcpServers');
560
+ });
561
+ router.post('/api/configured-servers/mcpServers/:name/disable', async (req, res) => {
562
+ await handleConfiguredServerMutation(req, res, options, 'disableConfiguredServer', 'mcpServers');
563
+ });
429
564
  router.post('/api/configured-servers/:name/preview', async (req, res) => {
430
565
  await handleConfiguredServerPreview(req, res, options);
431
566
  });
@@ -471,6 +606,113 @@ export function createAdminRoutes(options) {
471
606
  });
472
607
  return router;
473
608
  }
609
+ async function handleInstructionTemplateRequest(req, res, options, action) {
610
+ const service = options.instructionTemplateService;
611
+ if (!service)
612
+ return void res.status(404).json({ error: 'admin_instruction_templates_unavailable' });
613
+ const body = req.body && typeof req.body === 'object' ? req.body : {};
614
+ const identityValue = action === 'create' || action === 'import' ? body.identity : req.params.identity;
615
+ const identity = instructionTemplateIdentitySchema.safeParse(identityValue);
616
+ if (!identity.success)
617
+ return void res.status(400).json({ error: 'instruction_template_identity_invalid' });
618
+ const context = buildAdminOperationContext(req, options, { type: 'instruction_template', id: identity.data });
619
+ const expectedConfigFingerprint = typeof body.expectedConfigFingerprint === 'string' ? body.expectedConfigFingerprint : '';
620
+ try {
621
+ switch (action) {
622
+ case 'get':
623
+ return sendAdminOperationResult(res, await service.getTemplate({ context, identity: identity.data }));
624
+ case 'create':
625
+ case 'update': {
626
+ const variants = instructionTemplateVariantsSchema.safeParse(body.variants);
627
+ if (!variants.success || !expectedConfigFingerprint) {
628
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
629
+ }
630
+ return sendInstructionTemplateResult(res, await (action === 'create' ? service.createTemplate : service.updateTemplate).call(service, {
631
+ context,
632
+ identity: identity.data,
633
+ variants: variants.data,
634
+ expectedConfigFingerprint,
635
+ }));
636
+ }
637
+ case 'clone': {
638
+ const destination = instructionTemplateIdentitySchema.safeParse(body.identity);
639
+ if (!destination.success || !expectedConfigFingerprint) {
640
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
641
+ }
642
+ return sendInstructionTemplateResult(res, await service.cloneTemplate({
643
+ context,
644
+ sourceIdentity: identity.data,
645
+ identity: destination.data,
646
+ expectedConfigFingerprint,
647
+ }));
648
+ }
649
+ case 'validate':
650
+ return sendAdminOperationResult(res, await service.validateTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
651
+ case 'preview': {
652
+ const preview = z
653
+ .object({
654
+ surface: z.enum(['initialize', 'cli']),
655
+ selection: instructionPreviewSelectionSchema,
656
+ requestContext: requestContextSchema.optional(),
657
+ })
658
+ .strict()
659
+ .safeParse(body);
660
+ if (!preview.success)
661
+ return void res.status(400).json({ error: 'instruction_template_preview_invalid' });
662
+ return sendAdminOperationResult(res, await service.previewTemplate({ context, identity: identity.data, ...preview.data }));
663
+ }
664
+ case 'activate':
665
+ case 'delete': {
666
+ const previewFingerprint = typeof body.previewFingerprint === 'string' ? body.previewFingerprint : '';
667
+ if (!expectedConfigFingerprint || !previewFingerprint) {
668
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
669
+ }
670
+ return sendInstructionTemplateResult(res, await (action === 'activate' ? service.activateTemplate : service.deleteTemplate).call(service, {
671
+ context,
672
+ identity: identity.data,
673
+ expectedConfigFingerprint,
674
+ previewFingerprint,
675
+ }));
676
+ }
677
+ case 'import':
678
+ if (!expectedConfigFingerprint) {
679
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
680
+ }
681
+ return sendInstructionTemplateResult(res, await service.importLegacyTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
682
+ case 'delete-preview':
683
+ return sendAdminOperationResult(res, await service.previewDeleteTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
684
+ }
685
+ }
686
+ catch (error) {
687
+ if (error instanceof AdminInstructionTemplateNotFoundError) {
688
+ res.status(404).json({ error: error.code });
689
+ return;
690
+ }
691
+ throw error;
692
+ }
693
+ }
694
+ function sendInstructionTemplateResult(res, result) {
695
+ if (!result.ok)
696
+ return sendAdminOperationResult(res, result);
697
+ const status = result.result?.status;
698
+ if (status === 'not_found')
699
+ return void res.status(404).json({ ok: false, error: 'instruction_template_not_found' });
700
+ if (status === 'invalid') {
701
+ return void res
702
+ .status(422)
703
+ .json({ ok: false, error: 'instruction_template_invalid', validation: result.result.validation });
704
+ }
705
+ if (status === 'legacy_unavailable') {
706
+ return void res.status(409).json({ ok: false, error: 'legacy_instruction_template_unavailable' });
707
+ }
708
+ if (status === 'conflict' ||
709
+ status === 'identity_conflict' ||
710
+ status === 'protected' ||
711
+ status === 'active_conflict') {
712
+ return void res.status(409).json({ ok: false, error: `instruction_template_${status}` });
713
+ }
714
+ sendAdminOperationResult(res, result);
715
+ }
474
716
  function streamBackendLogs(req, res, broker, adminService) {
475
717
  const sessionToken = getAdminSessionCookie(req);
476
718
  let closed = false;
@@ -777,16 +1019,22 @@ function backendRestartFailure(outcome) {
777
1019
  };
778
1020
  }
779
1021
  }
780
- async function handleConfiguredServerDetail(req, res, options) {
1022
+ async function handleConfiguredServerDetail(req, res, options, targetSource) {
781
1023
  if (!options.configuredServerService) {
782
1024
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
783
1025
  return;
784
1026
  }
785
1027
  const targetName = req.params.name;
786
1028
  try {
1029
+ const model = configuredServerModelSchema.safeParse(req.query.model);
787
1030
  const result = await options.configuredServerService.getConfiguredServerDetail({
788
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1031
+ context: buildAdminOperationContext(req, options, {
1032
+ type: 'configured_server',
1033
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1034
+ }),
789
1035
  targetName,
1036
+ ...(targetSource ? { targetSource } : {}),
1037
+ ...(model.success ? { model: model.data } : {}),
790
1038
  });
791
1039
  if (!result.ok) {
792
1040
  sendAdminOperationResult(res, result);
@@ -797,6 +1045,7 @@ async function handleConfiguredServerDetail(req, res, options) {
797
1045
  operationId: result.operationId,
798
1046
  server: result.result.server,
799
1047
  editContract: result.result.editContract,
1048
+ ...(result.result.toolInventory ? { toolInventory: result.result.toolInventory } : {}),
800
1049
  });
801
1050
  }
802
1051
  catch (error) {
@@ -813,7 +1062,91 @@ async function handleConfiguredServerDetail(req, res, options) {
813
1062
  throw error;
814
1063
  }
815
1064
  }
816
- async function handleConfiguredServerPreview(req, res, options) {
1065
+ async function handleConfiguredServerCreateContract(req, res, options) {
1066
+ if (!options.configuredServerService) {
1067
+ res.status(404).json({ error: 'admin_configured_servers_unavailable' });
1068
+ return;
1069
+ }
1070
+ const result = await options.configuredServerService.getConfiguredServerCreateContract({
1071
+ context: buildAdminOperationContext(req, options, { type: 'configured_server_collection' }),
1072
+ });
1073
+ if (!result.ok) {
1074
+ sendAdminOperationResult(res, result);
1075
+ return;
1076
+ }
1077
+ res.status(200).json({ ok: true, operationId: result.operationId, createContract: result.result });
1078
+ }
1079
+ async function handleConfiguredServerCreatePreview(req, res, options) {
1080
+ if (!options.configuredServerService) {
1081
+ res.status(404).json({ error: 'admin_configured_servers_unavailable' });
1082
+ return;
1083
+ }
1084
+ const draft = getBodyValue(req.body, 'draft') ?? {};
1085
+ const result = await options.configuredServerService.previewConfiguredServerCreate({
1086
+ context: buildAdminOperationContext(req, options, {
1087
+ type: 'configured_server',
1088
+ id: configuredServerCreateDraftName(draft),
1089
+ }),
1090
+ draft,
1091
+ connectivityCheck: getBodyString(req.body, 'connectivityCheck') === 'manual' ? 'manual' : 'auto',
1092
+ });
1093
+ if (!result.ok) {
1094
+ sendAdminOperationResult(res, result);
1095
+ return;
1096
+ }
1097
+ res.status(200).json({ ok: true, operationId: result.operationId, preview: result.result });
1098
+ }
1099
+ async function handleConfiguredServerCreateApply(req, res, options) {
1100
+ if (!options.configuredServerService) {
1101
+ res.status(404).json({ error: 'admin_configured_servers_unavailable' });
1102
+ return;
1103
+ }
1104
+ if (!req.header('Idempotency-Key')?.trim()) {
1105
+ res.status(400).json({ ok: false, error: 'idempotency_key_required', code: 'idempotency_key_required' });
1106
+ return;
1107
+ }
1108
+ if (isMutationLocked(options)) {
1109
+ sendAdminOperationResult(res, {
1110
+ ok: false,
1111
+ status: 'runtime_scope_locked',
1112
+ code: 'runtime_scope_locked',
1113
+ retryable: true,
1114
+ operationName: 'applyConfiguredServerCreate',
1115
+ reason: 'writer_lock_unavailable',
1116
+ });
1117
+ return;
1118
+ }
1119
+ const draft = getBodyValue(req.body, 'draft') ?? {};
1120
+ try {
1121
+ const result = await options.configuredServerService.applyConfiguredServerCreate({
1122
+ context: buildAdminOperationContext(req, options, {
1123
+ type: 'configured_server',
1124
+ id: configuredServerCreateDraftName(draft),
1125
+ }),
1126
+ draft,
1127
+ previewFingerprint: getBodyString(req.body, 'previewFingerprint'),
1128
+ });
1129
+ if (!result.ok && result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
1130
+ sendConfiguredServerApplyError(res, result.error);
1131
+ return;
1132
+ }
1133
+ sendAdminOperationResult(res, result);
1134
+ }
1135
+ catch (error) {
1136
+ if (error instanceof AdminConfiguredServerApplyError) {
1137
+ sendConfiguredServerApplyError(res, error.code);
1138
+ return;
1139
+ }
1140
+ throw error;
1141
+ }
1142
+ }
1143
+ function configuredServerCreateDraftName(draft) {
1144
+ if (!draft || typeof draft !== 'object' || Array.isArray(draft))
1145
+ return '';
1146
+ const name = draft.name;
1147
+ return typeof name === 'string' ? name : '';
1148
+ }
1149
+ async function handleConfiguredServerPreview(req, res, options, targetSource) {
817
1150
  if (!options.configuredServerService) {
818
1151
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
819
1152
  return;
@@ -821,11 +1154,17 @@ async function handleConfiguredServerPreview(req, res, options) {
821
1154
  const targetName = req.params.name;
822
1155
  const edit = getBodyValue(req.body, 'edit');
823
1156
  try {
1157
+ const model = configuredServerModelSchema.safeParse(getBodyString(req.body, 'model'));
824
1158
  const result = await options.configuredServerService.previewConfiguredServerEdit({
825
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1159
+ context: buildAdminOperationContext(req, options, {
1160
+ type: 'configured_server',
1161
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1162
+ }),
826
1163
  targetName,
1164
+ ...(targetSource ? { targetSource } : {}),
827
1165
  edit: edit === undefined ? {} : edit,
828
1166
  connectivityCheck: getBodyString(req.body, 'connectivityCheck') === 'manual' ? 'manual' : 'auto',
1167
+ ...(model.success ? { model: model.data } : {}),
829
1168
  });
830
1169
  if (!result.ok) {
831
1170
  sendAdminOperationResult(res, result);
@@ -851,7 +1190,7 @@ async function handleConfiguredServerPreview(req, res, options) {
851
1190
  throw error;
852
1191
  }
853
1192
  }
854
- async function handleConfiguredServerApply(req, res, options) {
1193
+ async function handleConfiguredServerApply(req, res, options, targetSource) {
855
1194
  if (!options.configuredServerService) {
856
1195
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
857
1196
  return;
@@ -869,11 +1208,17 @@ async function handleConfiguredServerApply(req, res, options) {
869
1208
  }
870
1209
  const targetName = req.params.name;
871
1210
  try {
1211
+ const model = configuredServerModelSchema.safeParse(getBodyString(req.body, 'model'));
872
1212
  const result = await options.configuredServerService.applyConfiguredServerEdit({
873
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1213
+ context: buildAdminOperationContext(req, options, {
1214
+ type: 'configured_server',
1215
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1216
+ }),
874
1217
  targetName,
1218
+ ...(targetSource ? { targetSource } : {}),
875
1219
  edit: getBodyValue(req.body, 'edit') ?? {},
876
1220
  previewFingerprint: getBodyString(req.body, 'previewFingerprint'),
1221
+ ...(model.success ? { model: model.data } : {}),
877
1222
  });
878
1223
  if (!result.ok && result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
879
1224
  sendConfiguredServerApplyError(res, result.error);
@@ -908,7 +1253,7 @@ function sendConfiguredServerApplyError(res, code) {
908
1253
  function configuredServerApplyErrorMessage(code) {
909
1254
  switch (code) {
910
1255
  case 'configured_server_stale_preview':
911
- return 'The configured server changed after preview. Preview the edit again.';
1256
+ return 'The Runtime Scope configuration changed after preview. Preview the server again.';
912
1257
  case 'configured_server_destination_conflict':
913
1258
  return 'The requested configured server target name is already in use.';
914
1259
  case 'configured_server_connectivity_blocked':
@@ -917,13 +1262,17 @@ function configuredServerApplyErrorMessage(code) {
917
1262
  return 'The configured server edit is invalid.';
918
1263
  case 'configured_server_edit_unchanged':
919
1264
  return 'The configured server edit does not contain any changes.';
1265
+ case 'configured_server_create_invalid':
1266
+ return 'The proposed configured server is invalid. Correct the fields and preview it again.';
1267
+ case 'configured_server_create_failed':
1268
+ return 'The configured server could not be persisted. Inspect the Runtime Scope configuration and retry with a new idempotency key.';
920
1269
  case 'configured_server_not_found':
921
1270
  return 'Configured server target was not found.';
922
1271
  default:
923
1272
  return 'The configured server edit could not be applied.';
924
1273
  }
925
1274
  }
926
- async function handleConfiguredServerMutation(req, res, options, operationName) {
1275
+ async function handleConfiguredServerMutation(req, res, options, operationName, targetSource) {
927
1276
  if (!options.configuredServerService) {
928
1277
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
929
1278
  return;
@@ -940,8 +1289,11 @@ async function handleConfiguredServerMutation(req, res, options, operationName)
940
1289
  return;
941
1290
  }
942
1291
  const targetName = req.params.name;
943
- const context = buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName });
944
- const input = { context, targetName };
1292
+ const context = buildAdminOperationContext(req, options, {
1293
+ type: 'configured_server',
1294
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1295
+ });
1296
+ const input = { context, targetName, ...(targetSource ? { targetSource } : {}) };
945
1297
  const result = operationName === 'enableConfiguredServer'
946
1298
  ? await options.configuredServerService.enableConfiguredServer(input)
947
1299
  : await options.configuredServerService.disableConfiguredServer(input);
@@ -1420,6 +1772,12 @@ function configuredServerRequestFingerprint(operationName, targetName, body) {
1420
1772
  editDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-edit', stableJsonStringify(getBodyValue(body, 'edit') ?? {})),
1421
1773
  }
1422
1774
  : {}),
1775
+ ...(operationName === 'applyConfiguredServerCreate'
1776
+ ? {
1777
+ previewFingerprint,
1778
+ draftDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-create-draft', stableJsonStringify(getBodyValue(body, 'draft') ?? {})),
1779
+ }
1780
+ : {}),
1423
1781
  ...(operationName === 'restartBackend'
1424
1782
  ? {
1425
1783
  restartSelection: {
@@ -1428,7 +1786,15 @@ function configuredServerRequestFingerprint(operationName, targetName, body) {
1428
1786
  },
1429
1787
  }
1430
1788
  : {}),
1789
+ ...(operationName.includes('InstructionTemplate') || operationName === 'applyConfiguredServerInstructionOverride'
1790
+ ? {
1791
+ bodyDigest: keyedRequestFingerprint(previewFingerprint || getBodyString(body, 'expectedConfigFingerprint') || operationName, 'admin-instruction-operation', stableJsonStringify(body ?? {})),
1792
+ }
1793
+ : {}),
1431
1794
  });
1795
+ if (operationName === 'applyConfiguredServerCreate') {
1796
+ return `configured_server_create_${keyedRequestFingerprint(previewFingerprint, 'configured-server-create', normalized)}`;
1797
+ }
1432
1798
  return operationName === 'applyConfiguredServerEdit'
1433
1799
  ? `configured_server_apply_${keyedRequestFingerprint(previewFingerprint, 'configured-server-apply', normalized)}`
1434
1800
  : normalized;
@@ -1515,6 +1881,30 @@ function cliOperationErrorDetails(result) {
1515
1881
  return details;
1516
1882
  }
1517
1883
  function operationNameForRequest(req) {
1884
+ if (req.path.startsWith('/api/instruction-templates')) {
1885
+ if (req.path.endsWith('/clone'))
1886
+ return 'cloneInstructionTemplate';
1887
+ if (req.path.endsWith('/update'))
1888
+ return 'updateInstructionTemplate';
1889
+ if (req.path.endsWith('/validate'))
1890
+ return 'validateInstructionTemplate';
1891
+ if (req.path.endsWith('/preview'))
1892
+ return 'previewInstructionTemplate';
1893
+ if (req.path.endsWith('/activate'))
1894
+ return 'activateInstructionTemplate';
1895
+ if (req.path.endsWith('/delete-preview'))
1896
+ return 'previewDeleteInstructionTemplate';
1897
+ if (req.path.endsWith('/import-legacy'))
1898
+ return 'importLegacyInstructionTemplate';
1899
+ if (req.method === 'DELETE')
1900
+ return 'deleteInstructionTemplate';
1901
+ if (req.method === 'POST')
1902
+ return 'createInstructionTemplate';
1903
+ return req.path === '/api/instruction-templates' ? 'listInstructionTemplates' : 'getInstructionTemplate';
1904
+ }
1905
+ if (req.path.endsWith('/instruction-override')) {
1906
+ return 'applyConfiguredServerInstructionOverride';
1907
+ }
1518
1908
  if (req.path.startsWith('/api/oauth/')) {
1519
1909
  return req.path.endsWith('/restart') ? 'restartBackendOAuth' : 'authorizeBackendOAuth';
1520
1910
  }
@@ -1527,6 +1917,15 @@ function operationNameForRequest(req) {
1527
1917
  if (req.path.endsWith('/disable') || req.path.endsWith('/disable-server')) {
1528
1918
  return 'disableConfiguredServer';
1529
1919
  }
1920
+ if (req.path === '/api/configured-servers/create-preview') {
1921
+ return 'previewConfiguredServerCreate';
1922
+ }
1923
+ if (req.method === 'POST' && req.path === '/api/configured-servers') {
1924
+ return 'applyConfiguredServerCreate';
1925
+ }
1926
+ if (req.method === 'GET' && req.path === '/api/configured-servers/create-contract') {
1927
+ return 'getConfiguredServerCreateContract';
1928
+ }
1530
1929
  if (req.path.endsWith('/preview')) {
1531
1930
  return 'previewConfiguredServerEdit';
1532
1931
  }