@raytio/mcp-server 3.0.0 → 3.4.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 (510) hide show
  1. package/README.md +6 -5
  2. package/dist/authorization.d.ts +27 -2
  3. package/dist/authorization.d.ts.map +1 -1
  4. package/dist/authorization.js +67 -4
  5. package/dist/authorization.js.map +1 -1
  6. package/dist/capabilities/effective-capabilities.d.ts +248 -0
  7. package/dist/capabilities/effective-capabilities.d.ts.map +1 -0
  8. package/dist/capabilities/effective-capabilities.js +259 -0
  9. package/dist/capabilities/effective-capabilities.js.map +1 -0
  10. package/dist/capabilities/tool-capability.d.ts +52 -0
  11. package/dist/capabilities/tool-capability.d.ts.map +1 -0
  12. package/dist/capabilities/tool-capability.js +238 -0
  13. package/dist/capabilities/tool-capability.js.map +1 -0
  14. package/dist/generated-reads/catalogue.d.ts +80 -0
  15. package/dist/generated-reads/catalogue.d.ts.map +1 -0
  16. package/dist/generated-reads/catalogue.js +127 -0
  17. package/dist/generated-reads/catalogue.js.map +1 -0
  18. package/dist/generated-reads/guardrails.d.ts +147 -0
  19. package/dist/generated-reads/guardrails.d.ts.map +1 -0
  20. package/dist/generated-reads/guardrails.js +190 -0
  21. package/dist/generated-reads/guardrails.js.map +1 -0
  22. package/dist/generated-reads/index.d.ts +9 -0
  23. package/dist/generated-reads/index.d.ts.map +1 -0
  24. package/dist/generated-reads/index.js +5 -0
  25. package/dist/generated-reads/index.js.map +1 -0
  26. package/dist/generated-reads/query-builder.d.ts +99 -0
  27. package/dist/generated-reads/query-builder.d.ts.map +1 -0
  28. package/dist/generated-reads/query-builder.js +240 -0
  29. package/dist/generated-reads/query-builder.js.map +1 -0
  30. package/dist/generated-reads/resource-tools.d.ts +110 -0
  31. package/dist/generated-reads/resource-tools.d.ts.map +1 -0
  32. package/dist/generated-reads/resource-tools.js +280 -0
  33. package/dist/generated-reads/resource-tools.js.map +1 -0
  34. package/dist/index.js +20 -8
  35. package/dist/index.js.map +1 -1
  36. package/dist/tools/dispatch.d.ts +8 -1
  37. package/dist/tools/dispatch.d.ts.map +1 -1
  38. package/dist/tools/dispatch.js +16 -1
  39. package/dist/tools/dispatch.js.map +1 -1
  40. package/dist/tools/dsm/index.d.ts.map +1 -1
  41. package/dist/tools/dsm/index.js +18 -0
  42. package/dist/tools/dsm/index.js.map +1 -1
  43. package/dist/tools/ppm/activity-create.d.ts.map +1 -1
  44. package/dist/tools/ppm/activity-create.js +4 -0
  45. package/dist/tools/ppm/activity-create.js.map +1 -1
  46. package/dist/tools/ppm/activity-update.d.ts.map +1 -1
  47. package/dist/tools/ppm/activity-update.js +4 -0
  48. package/dist/tools/ppm/activity-update.js.map +1 -1
  49. package/dist/tools/ppm/external-system-list.d.ts.map +1 -1
  50. package/dist/tools/ppm/external-system-list.js +4 -0
  51. package/dist/tools/ppm/external-system-list.js.map +1 -1
  52. package/dist/tools/ppm/template-create.d.ts.map +1 -1
  53. package/dist/tools/ppm/template-create.js +4 -0
  54. package/dist/tools/ppm/template-create.js.map +1 -1
  55. package/dist/tools/ppm/template-get.d.ts.map +1 -1
  56. package/dist/tools/ppm/template-get.js +5 -0
  57. package/dist/tools/ppm/template-get.js.map +1 -1
  58. package/dist/tools/ppm/template-instantiate.d.ts.map +1 -1
  59. package/dist/tools/ppm/template-instantiate.js +4 -0
  60. package/dist/tools/ppm/template-instantiate.js.map +1 -1
  61. package/dist/tools/ppm/template-list.d.ts.map +1 -1
  62. package/dist/tools/ppm/template-list.js +4 -0
  63. package/dist/tools/ppm/template-list.js.map +1 -1
  64. package/dist/tools/ppm/template-slot-create.d.ts.map +1 -1
  65. package/dist/tools/ppm/template-slot-create.js +4 -0
  66. package/dist/tools/ppm/template-slot-create.js.map +1 -1
  67. package/dist/tools/ppm/template-slot-list.d.ts.map +1 -1
  68. package/dist/tools/ppm/template-slot-list.js +4 -0
  69. package/dist/tools/ppm/template-slot-list.js.map +1 -1
  70. package/dist/tools/ppm/work-item-activities.d.ts.map +1 -1
  71. package/dist/tools/ppm/work-item-activities.js +4 -0
  72. package/dist/tools/ppm/work-item-activities.js.map +1 -1
  73. package/dist/tools/ppm/work-item-block.d.ts.map +1 -1
  74. package/dist/tools/ppm/work-item-block.js +5 -0
  75. package/dist/tools/ppm/work-item-block.js.map +1 -1
  76. package/dist/tools/ppm/work-item-cancel.d.ts.map +1 -1
  77. package/dist/tools/ppm/work-item-cancel.js +14 -2
  78. package/dist/tools/ppm/work-item-cancel.js.map +1 -1
  79. package/dist/tools/ppm/work-item-comment.d.ts.map +1 -1
  80. package/dist/tools/ppm/work-item-comment.js +4 -0
  81. package/dist/tools/ppm/work-item-comment.js.map +1 -1
  82. package/dist/tools/ppm/work-item-complete.d.ts.map +1 -1
  83. package/dist/tools/ppm/work-item-complete.js +5 -0
  84. package/dist/tools/ppm/work-item-complete.js.map +1 -1
  85. package/dist/tools/ppm/work-item-create.d.ts.map +1 -1
  86. package/dist/tools/ppm/work-item-create.js +4 -0
  87. package/dist/tools/ppm/work-item-create.js.map +1 -1
  88. package/dist/tools/ppm/work-item-dependency-create.d.ts.map +1 -1
  89. package/dist/tools/ppm/work-item-dependency-create.js +4 -0
  90. package/dist/tools/ppm/work-item-dependency-create.js.map +1 -1
  91. package/dist/tools/ppm/work-item-dependency-list.d.ts.map +1 -1
  92. package/dist/tools/ppm/work-item-dependency-list.js +4 -0
  93. package/dist/tools/ppm/work-item-dependency-list.js.map +1 -1
  94. package/dist/tools/ppm/work-item-get.d.ts.map +1 -1
  95. package/dist/tools/ppm/work-item-get.js +4 -0
  96. package/dist/tools/ppm/work-item-get.js.map +1 -1
  97. package/dist/tools/ppm/work-item-link-create.d.ts.map +1 -1
  98. package/dist/tools/ppm/work-item-link-create.js +4 -0
  99. package/dist/tools/ppm/work-item-link-create.js.map +1 -1
  100. package/dist/tools/ppm/work-item-link-list.d.ts.map +1 -1
  101. package/dist/tools/ppm/work-item-link-list.js +4 -0
  102. package/dist/tools/ppm/work-item-link-list.js.map +1 -1
  103. package/dist/tools/ppm/work-item-list.d.ts.map +1 -1
  104. package/dist/tools/ppm/work-item-list.js +4 -0
  105. package/dist/tools/ppm/work-item-list.js.map +1 -1
  106. package/dist/tools/ppm/work-item-ready.d.ts.map +1 -1
  107. package/dist/tools/ppm/work-item-ready.js +5 -0
  108. package/dist/tools/ppm/work-item-ready.js.map +1 -1
  109. package/dist/tools/ppm/work-item-start.d.ts.map +1 -1
  110. package/dist/tools/ppm/work-item-start.js +5 -0
  111. package/dist/tools/ppm/work-item-start.js.map +1 -1
  112. package/dist/tools/ppm/work-item-tree.d.ts.map +1 -1
  113. package/dist/tools/ppm/work-item-tree.js +4 -0
  114. package/dist/tools/ppm/work-item-tree.js.map +1 -1
  115. package/dist/tools/ppm/work-item-unblock.d.ts.map +1 -1
  116. package/dist/tools/ppm/work-item-unblock.js +5 -0
  117. package/dist/tools/ppm/work-item-unblock.js.map +1 -1
  118. package/dist/tools/ppm/work-item-update-progress.d.ts.map +1 -1
  119. package/dist/tools/ppm/work-item-update-progress.js +5 -0
  120. package/dist/tools/ppm/work-item-update-progress.js.map +1 -1
  121. package/dist/tools/ppm/work-item-update.d.ts.map +1 -1
  122. package/dist/tools/ppm/work-item-update.js +4 -0
  123. package/dist/tools/ppm/work-item-update.js.map +1 -1
  124. package/dist/tools/prm/prm-party-create.d.ts.map +1 -1
  125. package/dist/tools/prm/prm-party-create.js +4 -0
  126. package/dist/tools/prm/prm-party-create.js.map +1 -1
  127. package/dist/tools/prm/prm-party-list.d.ts.map +1 -1
  128. package/dist/tools/prm/prm-party-list.js +4 -0
  129. package/dist/tools/prm/prm-party-list.js.map +1 -1
  130. package/dist/tools/registry.d.ts +81 -0
  131. package/dist/tools/registry.d.ts.map +1 -1
  132. package/dist/tools/wrm/wrm-agent-run-artifact-create.d.ts.map +1 -1
  133. package/dist/tools/wrm/wrm-agent-run-artifact-create.js +4 -0
  134. package/dist/tools/wrm/wrm-agent-run-artifact-create.js.map +1 -1
  135. package/dist/tools/wrm/wrm-agent-run-artifact-get.d.ts.map +1 -1
  136. package/dist/tools/wrm/wrm-agent-run-artifact-get.js +4 -0
  137. package/dist/tools/wrm/wrm-agent-run-artifact-get.js.map +1 -1
  138. package/dist/tools/wrm/wrm-agent-run-artifact-list.d.ts.map +1 -1
  139. package/dist/tools/wrm/wrm-agent-run-artifact-list.js +4 -0
  140. package/dist/tools/wrm/wrm-agent-run-artifact-list.js.map +1 -1
  141. package/dist/tools/wrm/wrm-agent-run-cost-summary.d.ts.map +1 -1
  142. package/dist/tools/wrm/wrm-agent-run-cost-summary.js +6 -0
  143. package/dist/tools/wrm/wrm-agent-run-cost-summary.js.map +1 -1
  144. package/dist/tools/wrm/wrm-agent-run-create.d.ts.map +1 -1
  145. package/dist/tools/wrm/wrm-agent-run-create.js +4 -0
  146. package/dist/tools/wrm/wrm-agent-run-create.js.map +1 -1
  147. package/dist/tools/wrm/wrm-agent-run-eval-create.d.ts.map +1 -1
  148. package/dist/tools/wrm/wrm-agent-run-eval-create.js +4 -0
  149. package/dist/tools/wrm/wrm-agent-run-eval-create.js.map +1 -1
  150. package/dist/tools/wrm/wrm-agent-run-eval-list.d.ts.map +1 -1
  151. package/dist/tools/wrm/wrm-agent-run-eval-list.js +4 -0
  152. package/dist/tools/wrm/wrm-agent-run-eval-list.js.map +1 -1
  153. package/dist/tools/wrm/wrm-agent-run-eval-summary.d.ts.map +1 -1
  154. package/dist/tools/wrm/wrm-agent-run-eval-summary.js +8 -0
  155. package/dist/tools/wrm/wrm-agent-run-eval-summary.js.map +1 -1
  156. package/dist/tools/wrm/wrm-agent-run-get.d.ts.map +1 -1
  157. package/dist/tools/wrm/wrm-agent-run-get.js +4 -0
  158. package/dist/tools/wrm/wrm-agent-run-get.js.map +1 -1
  159. package/dist/tools/wrm/wrm-agent-run-guardrail-result-create.d.ts.map +1 -1
  160. package/dist/tools/wrm/wrm-agent-run-guardrail-result-create.js +4 -0
  161. package/dist/tools/wrm/wrm-agent-run-guardrail-result-create.js.map +1 -1
  162. package/dist/tools/wrm/wrm-agent-run-guardrail-result-list.d.ts.map +1 -1
  163. package/dist/tools/wrm/wrm-agent-run-guardrail-result-list.js +4 -0
  164. package/dist/tools/wrm/wrm-agent-run-guardrail-result-list.js.map +1 -1
  165. package/dist/tools/wrm/wrm-agent-run-guardrail-summary.d.ts.map +1 -1
  166. package/dist/tools/wrm/wrm-agent-run-guardrail-summary.js +5 -0
  167. package/dist/tools/wrm/wrm-agent-run-guardrail-summary.js.map +1 -1
  168. package/dist/tools/wrm/wrm-agent-run-list.d.ts.map +1 -1
  169. package/dist/tools/wrm/wrm-agent-run-list.js +4 -0
  170. package/dist/tools/wrm/wrm-agent-run-list.js.map +1 -1
  171. package/dist/tools/wrm/wrm-agent-run-step-create.d.ts.map +1 -1
  172. package/dist/tools/wrm/wrm-agent-run-step-create.js +4 -0
  173. package/dist/tools/wrm/wrm-agent-run-step-create.js.map +1 -1
  174. package/dist/tools/wrm/wrm-agent-run-step-list.d.ts.map +1 -1
  175. package/dist/tools/wrm/wrm-agent-run-step-list.js +4 -0
  176. package/dist/tools/wrm/wrm-agent-run-step-list.js.map +1 -1
  177. package/dist/tools/wrm/wrm-agent-run-step-update.d.ts.map +1 -1
  178. package/dist/tools/wrm/wrm-agent-run-step-update.js +4 -0
  179. package/dist/tools/wrm/wrm-agent-run-step-update.js.map +1 -1
  180. package/dist/tools/wrm/wrm-agent-run-summary.d.ts.map +1 -1
  181. package/dist/tools/wrm/wrm-agent-run-summary.js +7 -0
  182. package/dist/tools/wrm/wrm-agent-run-summary.js.map +1 -1
  183. package/dist/tools/wrm/wrm-agent-run-update.d.ts.map +1 -1
  184. package/dist/tools/wrm/wrm-agent-run-update.js +4 -0
  185. package/dist/tools/wrm/wrm-agent-run-update.js.map +1 -1
  186. package/dist/tools/wrm/wrm-credential-list.d.ts.map +1 -1
  187. package/dist/tools/wrm/wrm-credential-list.js +4 -0
  188. package/dist/tools/wrm/wrm-credential-list.js.map +1 -1
  189. package/dist/tools/wrm/wrm-credential-request-create.d.ts.map +1 -1
  190. package/dist/tools/wrm/wrm-credential-request-create.js +14 -0
  191. package/dist/tools/wrm/wrm-credential-request-create.js.map +1 -1
  192. package/dist/tools/wrm/wrm-credential-request-status.d.ts.map +1 -1
  193. package/dist/tools/wrm/wrm-credential-request-status.js +5 -0
  194. package/dist/tools/wrm/wrm-credential-request-status.js.map +1 -1
  195. package/dist/tools/wrm/wrm-credential-retrieve.d.ts.map +1 -1
  196. package/dist/tools/wrm/wrm-credential-retrieve.js +4 -0
  197. package/dist/tools/wrm/wrm-credential-retrieve.js.map +1 -1
  198. package/dist/tools/wrm/wrm-credential-revoke.d.ts.map +1 -1
  199. package/dist/tools/wrm/wrm-credential-revoke.js +7 -0
  200. package/dist/tools/wrm/wrm-credential-revoke.js.map +1 -1
  201. package/dist/tools/wrm/wrm-domain-create.d.ts.map +1 -1
  202. package/dist/tools/wrm/wrm-domain-create.js +4 -0
  203. package/dist/tools/wrm/wrm-domain-create.js.map +1 -1
  204. package/dist/tools/wrm/wrm-domain-get.d.ts.map +1 -1
  205. package/dist/tools/wrm/wrm-domain-get.js +4 -0
  206. package/dist/tools/wrm/wrm-domain-get.js.map +1 -1
  207. package/dist/tools/wrm/wrm-domain-list.d.ts.map +1 -1
  208. package/dist/tools/wrm/wrm-domain-list.js +4 -0
  209. package/dist/tools/wrm/wrm-domain-list.js.map +1 -1
  210. package/dist/tools/wrm/wrm-domain-repository-create.d.ts.map +1 -1
  211. package/dist/tools/wrm/wrm-domain-repository-create.js +4 -0
  212. package/dist/tools/wrm/wrm-domain-repository-create.js.map +1 -1
  213. package/dist/tools/wrm/wrm-domain-repository-get.d.ts.map +1 -1
  214. package/dist/tools/wrm/wrm-domain-repository-get.js +4 -0
  215. package/dist/tools/wrm/wrm-domain-repository-get.js.map +1 -1
  216. package/dist/tools/wrm/wrm-domain-repository-list.d.ts.map +1 -1
  217. package/dist/tools/wrm/wrm-domain-repository-list.js +4 -0
  218. package/dist/tools/wrm/wrm-domain-repository-list.js.map +1 -1
  219. package/dist/tools/wrm/wrm-domain-repository-update.d.ts.map +1 -1
  220. package/dist/tools/wrm/wrm-domain-repository-update.js +4 -0
  221. package/dist/tools/wrm/wrm-domain-repository-update.js.map +1 -1
  222. package/dist/tools/wrm/wrm-domain-update.d.ts.map +1 -1
  223. package/dist/tools/wrm/wrm-domain-update.js +4 -0
  224. package/dist/tools/wrm/wrm-domain-update.js.map +1 -1
  225. package/dist/tools/wrm/wrm-effective-mcp-servers.d.ts.map +1 -1
  226. package/dist/tools/wrm/wrm-effective-mcp-servers.js +4 -0
  227. package/dist/tools/wrm/wrm-effective-mcp-servers.js.map +1 -1
  228. package/dist/tools/wrm/wrm-effective-mcp-tools.d.ts.map +1 -1
  229. package/dist/tools/wrm/wrm-effective-mcp-tools.js +4 -0
  230. package/dist/tools/wrm/wrm-effective-mcp-tools.js.map +1 -1
  231. package/dist/tools/wrm/wrm-effective-model-prefs.d.ts.map +1 -1
  232. package/dist/tools/wrm/wrm-effective-model-prefs.js +4 -0
  233. package/dist/tools/wrm/wrm-effective-model-prefs.js.map +1 -1
  234. package/dist/tools/wrm/wrm-eval-scorer-create.d.ts.map +1 -1
  235. package/dist/tools/wrm/wrm-eval-scorer-create.js +4 -0
  236. package/dist/tools/wrm/wrm-eval-scorer-create.js.map +1 -1
  237. package/dist/tools/wrm/wrm-eval-scorer-get.d.ts.map +1 -1
  238. package/dist/tools/wrm/wrm-eval-scorer-get.js +4 -0
  239. package/dist/tools/wrm/wrm-eval-scorer-get.js.map +1 -1
  240. package/dist/tools/wrm/wrm-eval-scorer-list.d.ts.map +1 -1
  241. package/dist/tools/wrm/wrm-eval-scorer-list.js +4 -0
  242. package/dist/tools/wrm/wrm-eval-scorer-list.js.map +1 -1
  243. package/dist/tools/wrm/wrm-eval-scorer-update.d.ts.map +1 -1
  244. package/dist/tools/wrm/wrm-eval-scorer-update.js +4 -0
  245. package/dist/tools/wrm/wrm-eval-scorer-update.js.map +1 -1
  246. package/dist/tools/wrm/wrm-guardrail-create.d.ts.map +1 -1
  247. package/dist/tools/wrm/wrm-guardrail-create.js +4 -0
  248. package/dist/tools/wrm/wrm-guardrail-create.js.map +1 -1
  249. package/dist/tools/wrm/wrm-guardrail-get.d.ts.map +1 -1
  250. package/dist/tools/wrm/wrm-guardrail-get.js +4 -0
  251. package/dist/tools/wrm/wrm-guardrail-get.js.map +1 -1
  252. package/dist/tools/wrm/wrm-guardrail-list.d.ts.map +1 -1
  253. package/dist/tools/wrm/wrm-guardrail-list.js +4 -0
  254. package/dist/tools/wrm/wrm-guardrail-list.js.map +1 -1
  255. package/dist/tools/wrm/wrm-guardrail-update.d.ts.map +1 -1
  256. package/dist/tools/wrm/wrm-guardrail-update.js +4 -0
  257. package/dist/tools/wrm/wrm-guardrail-update.js.map +1 -1
  258. package/dist/tools/wrm/wrm-knowledge-chunk-search.d.ts.map +1 -1
  259. package/dist/tools/wrm/wrm-knowledge-chunk-search.js +4 -0
  260. package/dist/tools/wrm/wrm-knowledge-chunk-search.js.map +1 -1
  261. package/dist/tools/wrm/wrm-knowledge-source-create.d.ts.map +1 -1
  262. package/dist/tools/wrm/wrm-knowledge-source-create.js +4 -0
  263. package/dist/tools/wrm/wrm-knowledge-source-create.js.map +1 -1
  264. package/dist/tools/wrm/wrm-knowledge-source-get.d.ts.map +1 -1
  265. package/dist/tools/wrm/wrm-knowledge-source-get.js +4 -0
  266. package/dist/tools/wrm/wrm-knowledge-source-get.js.map +1 -1
  267. package/dist/tools/wrm/wrm-knowledge-source-list.d.ts.map +1 -1
  268. package/dist/tools/wrm/wrm-knowledge-source-list.js +4 -0
  269. package/dist/tools/wrm/wrm-knowledge-source-list.js.map +1 -1
  270. package/dist/tools/wrm/wrm-knowledge-source-update.d.ts.map +1 -1
  271. package/dist/tools/wrm/wrm-knowledge-source-update.js +4 -0
  272. package/dist/tools/wrm/wrm-knowledge-source-update.js.map +1 -1
  273. package/dist/tools/wrm/wrm-mcp-server-create.d.ts.map +1 -1
  274. package/dist/tools/wrm/wrm-mcp-server-create.js +4 -0
  275. package/dist/tools/wrm/wrm-mcp-server-create.js.map +1 -1
  276. package/dist/tools/wrm/wrm-mcp-server-get.d.ts.map +1 -1
  277. package/dist/tools/wrm/wrm-mcp-server-get.js +4 -0
  278. package/dist/tools/wrm/wrm-mcp-server-get.js.map +1 -1
  279. package/dist/tools/wrm/wrm-mcp-server-list.d.ts.map +1 -1
  280. package/dist/tools/wrm/wrm-mcp-server-list.js +4 -0
  281. package/dist/tools/wrm/wrm-mcp-server-list.js.map +1 -1
  282. package/dist/tools/wrm/wrm-mcp-server-update.d.ts.map +1 -1
  283. package/dist/tools/wrm/wrm-mcp-server-update.js +4 -0
  284. package/dist/tools/wrm/wrm-mcp-server-update.js.map +1 -1
  285. package/dist/tools/wrm/wrm-mcp-tool-create.d.ts.map +1 -1
  286. package/dist/tools/wrm/wrm-mcp-tool-create.js +4 -0
  287. package/dist/tools/wrm/wrm-mcp-tool-create.js.map +1 -1
  288. package/dist/tools/wrm/wrm-mcp-tool-get.d.ts.map +1 -1
  289. package/dist/tools/wrm/wrm-mcp-tool-get.js +4 -0
  290. package/dist/tools/wrm/wrm-mcp-tool-get.js.map +1 -1
  291. package/dist/tools/wrm/wrm-mcp-tool-list.d.ts.map +1 -1
  292. package/dist/tools/wrm/wrm-mcp-tool-list.js +4 -0
  293. package/dist/tools/wrm/wrm-mcp-tool-list.js.map +1 -1
  294. package/dist/tools/wrm/wrm-mcp-tool-update.d.ts.map +1 -1
  295. package/dist/tools/wrm/wrm-mcp-tool-update.js +4 -0
  296. package/dist/tools/wrm/wrm-mcp-tool-update.js.map +1 -1
  297. package/dist/tools/wrm/wrm-memory-create.d.ts.map +1 -1
  298. package/dist/tools/wrm/wrm-memory-create.js +6 -0
  299. package/dist/tools/wrm/wrm-memory-create.js.map +1 -1
  300. package/dist/tools/wrm/wrm-memory-get.d.ts.map +1 -1
  301. package/dist/tools/wrm/wrm-memory-get.js +4 -0
  302. package/dist/tools/wrm/wrm-memory-get.js.map +1 -1
  303. package/dist/tools/wrm/wrm-memory-list.d.ts.map +1 -1
  304. package/dist/tools/wrm/wrm-memory-list.js +4 -0
  305. package/dist/tools/wrm/wrm-memory-list.js.map +1 -1
  306. package/dist/tools/wrm/wrm-memory-search.d.ts.map +1 -1
  307. package/dist/tools/wrm/wrm-memory-search.js +4 -0
  308. package/dist/tools/wrm/wrm-memory-search.js.map +1 -1
  309. package/dist/tools/wrm/wrm-memory-update.d.ts.map +1 -1
  310. package/dist/tools/wrm/wrm-memory-update.js +5 -0
  311. package/dist/tools/wrm/wrm-memory-update.js.map +1 -1
  312. package/dist/tools/wrm/wrm-model-availability-create.d.ts.map +1 -1
  313. package/dist/tools/wrm/wrm-model-availability-create.js +4 -0
  314. package/dist/tools/wrm/wrm-model-availability-create.js.map +1 -1
  315. package/dist/tools/wrm/wrm-model-availability-get.d.ts.map +1 -1
  316. package/dist/tools/wrm/wrm-model-availability-get.js +4 -0
  317. package/dist/tools/wrm/wrm-model-availability-get.js.map +1 -1
  318. package/dist/tools/wrm/wrm-model-availability-list.d.ts.map +1 -1
  319. package/dist/tools/wrm/wrm-model-availability-list.js +4 -0
  320. package/dist/tools/wrm/wrm-model-availability-list.js.map +1 -1
  321. package/dist/tools/wrm/wrm-model-availability-update.d.ts.map +1 -1
  322. package/dist/tools/wrm/wrm-model-availability-update.js +4 -0
  323. package/dist/tools/wrm/wrm-model-availability-update.js.map +1 -1
  324. package/dist/tools/wrm/wrm-model-create.d.ts.map +1 -1
  325. package/dist/tools/wrm/wrm-model-create.js +4 -0
  326. package/dist/tools/wrm/wrm-model-create.js.map +1 -1
  327. package/dist/tools/wrm/wrm-model-get.d.ts.map +1 -1
  328. package/dist/tools/wrm/wrm-model-get.js +4 -0
  329. package/dist/tools/wrm/wrm-model-get.js.map +1 -1
  330. package/dist/tools/wrm/wrm-model-list.d.ts.map +1 -1
  331. package/dist/tools/wrm/wrm-model-list.js +4 -0
  332. package/dist/tools/wrm/wrm-model-list.js.map +1 -1
  333. package/dist/tools/wrm/wrm-model-parameter-create.d.ts.map +1 -1
  334. package/dist/tools/wrm/wrm-model-parameter-create.js +4 -0
  335. package/dist/tools/wrm/wrm-model-parameter-create.js.map +1 -1
  336. package/dist/tools/wrm/wrm-model-parameter-get.d.ts.map +1 -1
  337. package/dist/tools/wrm/wrm-model-parameter-get.js +4 -0
  338. package/dist/tools/wrm/wrm-model-parameter-get.js.map +1 -1
  339. package/dist/tools/wrm/wrm-model-parameter-list.d.ts.map +1 -1
  340. package/dist/tools/wrm/wrm-model-parameter-list.js +4 -0
  341. package/dist/tools/wrm/wrm-model-parameter-list.js.map +1 -1
  342. package/dist/tools/wrm/wrm-model-parameter-update.d.ts.map +1 -1
  343. package/dist/tools/wrm/wrm-model-parameter-update.js +4 -0
  344. package/dist/tools/wrm/wrm-model-parameter-update.js.map +1 -1
  345. package/dist/tools/wrm/wrm-model-update.d.ts.map +1 -1
  346. package/dist/tools/wrm/wrm-model-update.js +4 -0
  347. package/dist/tools/wrm/wrm-model-update.js.map +1 -1
  348. package/dist/tools/wrm/wrm-platform-label-map-create.d.ts.map +1 -1
  349. package/dist/tools/wrm/wrm-platform-label-map-create.js +4 -0
  350. package/dist/tools/wrm/wrm-platform-label-map-create.js.map +1 -1
  351. package/dist/tools/wrm/wrm-platform-label-map-get.d.ts.map +1 -1
  352. package/dist/tools/wrm/wrm-platform-label-map-get.js +4 -0
  353. package/dist/tools/wrm/wrm-platform-label-map-get.js.map +1 -1
  354. package/dist/tools/wrm/wrm-platform-label-map-list.d.ts.map +1 -1
  355. package/dist/tools/wrm/wrm-platform-label-map-list.js +4 -0
  356. package/dist/tools/wrm/wrm-platform-label-map-list.js.map +1 -1
  357. package/dist/tools/wrm/wrm-platform-label-map-resolve.d.ts.map +1 -1
  358. package/dist/tools/wrm/wrm-platform-label-map-resolve.js +4 -0
  359. package/dist/tools/wrm/wrm-platform-label-map-resolve.js.map +1 -1
  360. package/dist/tools/wrm/wrm-platform-label-map-update.d.ts.map +1 -1
  361. package/dist/tools/wrm/wrm-platform-label-map-update.js +4 -0
  362. package/dist/tools/wrm/wrm-platform-label-map-update.js.map +1 -1
  363. package/dist/tools/wrm/wrm-provider-create.d.ts.map +1 -1
  364. package/dist/tools/wrm/wrm-provider-create.js +4 -0
  365. package/dist/tools/wrm/wrm-provider-create.js.map +1 -1
  366. package/dist/tools/wrm/wrm-provider-get.d.ts.map +1 -1
  367. package/dist/tools/wrm/wrm-provider-get.js +4 -0
  368. package/dist/tools/wrm/wrm-provider-get.js.map +1 -1
  369. package/dist/tools/wrm/wrm-provider-list.d.ts.map +1 -1
  370. package/dist/tools/wrm/wrm-provider-list.js +4 -0
  371. package/dist/tools/wrm/wrm-provider-list.js.map +1 -1
  372. package/dist/tools/wrm/wrm-provider-update.d.ts.map +1 -1
  373. package/dist/tools/wrm/wrm-provider-update.js +4 -0
  374. package/dist/tools/wrm/wrm-provider-update.js.map +1 -1
  375. package/dist/tools/wrm/wrm-role-create.d.ts.map +1 -1
  376. package/dist/tools/wrm/wrm-role-create.js +4 -0
  377. package/dist/tools/wrm/wrm-role-create.js.map +1 -1
  378. package/dist/tools/wrm/wrm-role-get.d.ts.map +1 -1
  379. package/dist/tools/wrm/wrm-role-get.js +4 -0
  380. package/dist/tools/wrm/wrm-role-get.js.map +1 -1
  381. package/dist/tools/wrm/wrm-role-list.d.ts.map +1 -1
  382. package/dist/tools/wrm/wrm-role-list.js +4 -0
  383. package/dist/tools/wrm/wrm-role-list.js.map +1 -1
  384. package/dist/tools/wrm/wrm-role-memory-create.d.ts.map +1 -1
  385. package/dist/tools/wrm/wrm-role-memory-create.js +4 -0
  386. package/dist/tools/wrm/wrm-role-memory-create.js.map +1 -1
  387. package/dist/tools/wrm/wrm-role-memory-get.d.ts.map +1 -1
  388. package/dist/tools/wrm/wrm-role-memory-get.js +4 -0
  389. package/dist/tools/wrm/wrm-role-memory-get.js.map +1 -1
  390. package/dist/tools/wrm/wrm-role-memory-list.d.ts.map +1 -1
  391. package/dist/tools/wrm/wrm-role-memory-list.js +4 -0
  392. package/dist/tools/wrm/wrm-role-memory-list.js.map +1 -1
  393. package/dist/tools/wrm/wrm-role-memory-search.d.ts.map +1 -1
  394. package/dist/tools/wrm/wrm-role-memory-search.js +5 -0
  395. package/dist/tools/wrm/wrm-role-memory-search.js.map +1 -1
  396. package/dist/tools/wrm/wrm-role-memory-update.d.ts.map +1 -1
  397. package/dist/tools/wrm/wrm-role-memory-update.js +4 -0
  398. package/dist/tools/wrm/wrm-role-memory-update.js.map +1 -1
  399. package/dist/tools/wrm/wrm-role-update.d.ts.map +1 -1
  400. package/dist/tools/wrm/wrm-role-update.js +4 -0
  401. package/dist/tools/wrm/wrm-role-update.js.map +1 -1
  402. package/dist/tools/wrm/wrm-sandbox-provider-create.d.ts.map +1 -1
  403. package/dist/tools/wrm/wrm-sandbox-provider-create.js +4 -0
  404. package/dist/tools/wrm/wrm-sandbox-provider-create.js.map +1 -1
  405. package/dist/tools/wrm/wrm-sandbox-provider-get.d.ts.map +1 -1
  406. package/dist/tools/wrm/wrm-sandbox-provider-get.js +4 -0
  407. package/dist/tools/wrm/wrm-sandbox-provider-get.js.map +1 -1
  408. package/dist/tools/wrm/wrm-sandbox-provider-list.d.ts.map +1 -1
  409. package/dist/tools/wrm/wrm-sandbox-provider-list.js +4 -0
  410. package/dist/tools/wrm/wrm-sandbox-provider-list.js.map +1 -1
  411. package/dist/tools/wrm/wrm-sandbox-provider-update.d.ts.map +1 -1
  412. package/dist/tools/wrm/wrm-sandbox-provider-update.js +4 -0
  413. package/dist/tools/wrm/wrm-sandbox-provider-update.js.map +1 -1
  414. package/dist/tools/wrm/wrm-worker-create.d.ts.map +1 -1
  415. package/dist/tools/wrm/wrm-worker-create.js +4 -0
  416. package/dist/tools/wrm/wrm-worker-create.js.map +1 -1
  417. package/dist/tools/wrm/wrm-worker-def-mcp-server-create.d.ts.map +1 -1
  418. package/dist/tools/wrm/wrm-worker-def-mcp-server-create.js +4 -0
  419. package/dist/tools/wrm/wrm-worker-def-mcp-server-create.js.map +1 -1
  420. package/dist/tools/wrm/wrm-worker-def-mcp-server-list.d.ts.map +1 -1
  421. package/dist/tools/wrm/wrm-worker-def-mcp-server-list.js +4 -0
  422. package/dist/tools/wrm/wrm-worker-def-mcp-server-list.js.map +1 -1
  423. package/dist/tools/wrm/wrm-worker-def-mcp-server-update.d.ts.map +1 -1
  424. package/dist/tools/wrm/wrm-worker-def-mcp-server-update.js +4 -0
  425. package/dist/tools/wrm/wrm-worker-def-mcp-server-update.js.map +1 -1
  426. package/dist/tools/wrm/wrm-worker-def-mcp-tool-create.d.ts.map +1 -1
  427. package/dist/tools/wrm/wrm-worker-def-mcp-tool-create.js +4 -0
  428. package/dist/tools/wrm/wrm-worker-def-mcp-tool-create.js.map +1 -1
  429. package/dist/tools/wrm/wrm-worker-def-mcp-tool-list.d.ts.map +1 -1
  430. package/dist/tools/wrm/wrm-worker-def-mcp-tool-list.js +4 -0
  431. package/dist/tools/wrm/wrm-worker-def-mcp-tool-list.js.map +1 -1
  432. package/dist/tools/wrm/wrm-worker-def-mcp-tool-update.d.ts.map +1 -1
  433. package/dist/tools/wrm/wrm-worker-def-mcp-tool-update.js +4 -0
  434. package/dist/tools/wrm/wrm-worker-def-mcp-tool-update.js.map +1 -1
  435. package/dist/tools/wrm/wrm-worker-def-model-pref-create.d.ts.map +1 -1
  436. package/dist/tools/wrm/wrm-worker-def-model-pref-create.js +4 -0
  437. package/dist/tools/wrm/wrm-worker-def-model-pref-create.js.map +1 -1
  438. package/dist/tools/wrm/wrm-worker-def-model-pref-list.d.ts.map +1 -1
  439. package/dist/tools/wrm/wrm-worker-def-model-pref-list.js +4 -0
  440. package/dist/tools/wrm/wrm-worker-def-model-pref-list.js.map +1 -1
  441. package/dist/tools/wrm/wrm-worker-def-model-pref-update.d.ts.map +1 -1
  442. package/dist/tools/wrm/wrm-worker-def-model-pref-update.js +4 -0
  443. package/dist/tools/wrm/wrm-worker-def-model-pref-update.js.map +1 -1
  444. package/dist/tools/wrm/wrm-worker-definition-create.d.ts.map +1 -1
  445. package/dist/tools/wrm/wrm-worker-definition-create.js +4 -0
  446. package/dist/tools/wrm/wrm-worker-definition-create.js.map +1 -1
  447. package/dist/tools/wrm/wrm-worker-definition-get.d.ts.map +1 -1
  448. package/dist/tools/wrm/wrm-worker-definition-get.js +4 -0
  449. package/dist/tools/wrm/wrm-worker-definition-get.js.map +1 -1
  450. package/dist/tools/wrm/wrm-worker-definition-list.d.ts.map +1 -1
  451. package/dist/tools/wrm/wrm-worker-definition-list.js +4 -0
  452. package/dist/tools/wrm/wrm-worker-definition-list.js.map +1 -1
  453. package/dist/tools/wrm/wrm-worker-definition-update.d.ts.map +1 -1
  454. package/dist/tools/wrm/wrm-worker-definition-update.js +4 -0
  455. package/dist/tools/wrm/wrm-worker-definition-update.js.map +1 -1
  456. package/dist/tools/wrm/wrm-worker-find-for-role.d.ts.map +1 -1
  457. package/dist/tools/wrm/wrm-worker-find-for-role.js +5 -0
  458. package/dist/tools/wrm/wrm-worker-find-for-role.js.map +1 -1
  459. package/dist/tools/wrm/wrm-worker-get.d.ts.map +1 -1
  460. package/dist/tools/wrm/wrm-worker-get.js +4 -0
  461. package/dist/tools/wrm/wrm-worker-get.js.map +1 -1
  462. package/dist/tools/wrm/wrm-worker-list.d.ts.map +1 -1
  463. package/dist/tools/wrm/wrm-worker-list.js +4 -0
  464. package/dist/tools/wrm/wrm-worker-list.js.map +1 -1
  465. package/dist/tools/wrm/wrm-worker-mcp-server-create.d.ts.map +1 -1
  466. package/dist/tools/wrm/wrm-worker-mcp-server-create.js +4 -0
  467. package/dist/tools/wrm/wrm-worker-mcp-server-create.js.map +1 -1
  468. package/dist/tools/wrm/wrm-worker-mcp-server-list.d.ts.map +1 -1
  469. package/dist/tools/wrm/wrm-worker-mcp-server-list.js +4 -0
  470. package/dist/tools/wrm/wrm-worker-mcp-server-list.js.map +1 -1
  471. package/dist/tools/wrm/wrm-worker-mcp-server-update.d.ts.map +1 -1
  472. package/dist/tools/wrm/wrm-worker-mcp-server-update.js +4 -0
  473. package/dist/tools/wrm/wrm-worker-mcp-server-update.js.map +1 -1
  474. package/dist/tools/wrm/wrm-worker-mcp-tool-create.d.ts.map +1 -1
  475. package/dist/tools/wrm/wrm-worker-mcp-tool-create.js +4 -0
  476. package/dist/tools/wrm/wrm-worker-mcp-tool-create.js.map +1 -1
  477. package/dist/tools/wrm/wrm-worker-mcp-tool-list.d.ts.map +1 -1
  478. package/dist/tools/wrm/wrm-worker-mcp-tool-list.js +4 -0
  479. package/dist/tools/wrm/wrm-worker-mcp-tool-list.js.map +1 -1
  480. package/dist/tools/wrm/wrm-worker-mcp-tool-update.d.ts.map +1 -1
  481. package/dist/tools/wrm/wrm-worker-mcp-tool-update.js +4 -0
  482. package/dist/tools/wrm/wrm-worker-mcp-tool-update.js.map +1 -1
  483. package/dist/tools/wrm/wrm-worker-model-pref-create.d.ts.map +1 -1
  484. package/dist/tools/wrm/wrm-worker-model-pref-create.js +4 -0
  485. package/dist/tools/wrm/wrm-worker-model-pref-create.js.map +1 -1
  486. package/dist/tools/wrm/wrm-worker-model-pref-list.d.ts.map +1 -1
  487. package/dist/tools/wrm/wrm-worker-model-pref-list.js +4 -0
  488. package/dist/tools/wrm/wrm-worker-model-pref-list.js.map +1 -1
  489. package/dist/tools/wrm/wrm-worker-model-pref-update.d.ts.map +1 -1
  490. package/dist/tools/wrm/wrm-worker-model-pref-update.js +4 -0
  491. package/dist/tools/wrm/wrm-worker-model-pref-update.js.map +1 -1
  492. package/dist/tools/wrm/wrm-worker-resolve-config.d.ts.map +1 -1
  493. package/dist/tools/wrm/wrm-worker-resolve-config.js +13 -0
  494. package/dist/tools/wrm/wrm-worker-resolve-config.js.map +1 -1
  495. package/dist/tools/wrm/wrm-worker-role-assignment-create.d.ts.map +1 -1
  496. package/dist/tools/wrm/wrm-worker-role-assignment-create.js +4 -0
  497. package/dist/tools/wrm/wrm-worker-role-assignment-create.js.map +1 -1
  498. package/dist/tools/wrm/wrm-worker-role-assignment-get.d.ts.map +1 -1
  499. package/dist/tools/wrm/wrm-worker-role-assignment-get.js +4 -0
  500. package/dist/tools/wrm/wrm-worker-role-assignment-get.js.map +1 -1
  501. package/dist/tools/wrm/wrm-worker-role-assignment-list.d.ts.map +1 -1
  502. package/dist/tools/wrm/wrm-worker-role-assignment-list.js +4 -0
  503. package/dist/tools/wrm/wrm-worker-role-assignment-list.js.map +1 -1
  504. package/dist/tools/wrm/wrm-worker-role-assignment-update.d.ts.map +1 -1
  505. package/dist/tools/wrm/wrm-worker-role-assignment-update.js +4 -0
  506. package/dist/tools/wrm/wrm-worker-role-assignment-update.js.map +1 -1
  507. package/dist/tools/wrm/wrm-worker-update.d.ts.map +1 -1
  508. package/dist/tools/wrm/wrm-worker-update.js +4 -0
  509. package/dist/tools/wrm/wrm-worker-update.js.map +1 -1
  510. package/package.json +1 -1
package/README.md CHANGED
@@ -145,13 +145,14 @@ Restart Codex CLI after editing the config. Inside a session, `/mcp` lists loade
145
145
 
146
146
  ### Tool domain selection
147
147
 
148
- The server decides which tools to expose using the following precedence:
148
+ The server decides which tools to expose in two layers:
149
149
 
150
- 1. **`RAYTIO_TOOL_DOMAINS` env var** (static override) — if set and non-empty, this value is used directly. No backend query is made.
151
- 2. **Dynamic role resolution** — if `RAYTIO_TOOL_DOMAINS` is not set, the server queries the authenticated user's roles via `fnd_authz_user_groups()` at startup and maps them to tool domains automatically.
152
- 3. **All domains** (fallback) — if the role query fails or returns no recognised roles, every domain is exposed (matching pre-v1.4.0 behaviour).
150
+ 1. **Role-domain filter** (coarse) — at startup the server queries the authenticated user's roles via `fnd_authz_user_groups()` and maps them to tool domains. The `RAYTIO_TOOL_DOMAINS` env var can further restrict this set but never expand it.
151
+ 2. **Effective-capability filter** (fine) — the server then calls the Persist RPC `fnd_get_effective_capabilities()` and drops any tool whose declared `(resource_group, resource_name, operation, scope)` requirement is not satisfied. `OWN_RECORDS` grants NEVER silently satisfy `ALL_RECORDS` requirements.
153
152
 
154
- The server logs which path was taken at startup (to stderr).
153
+ Both layers **fail closed**: if the role query or capability RPC fails, or returns no recognised roles / no capabilities for a gated tool, that tool is not exposed. Dispatch re-checks capabilities at call time, so a stale `ListTools` result cannot bypass the check.
154
+
155
+ The server logs which path was taken and how many tools were hidden at startup (to stderr).
155
156
 
156
157
  #### How dynamic resolution works
157
158
 
@@ -1,4 +1,6 @@
1
+ import { EffectiveCapabilityIndex } from './capabilities/effective-capabilities.js';
1
2
  import { RaytioApiClient } from './raytio/api-client.js';
3
+ import { Tool } from './tools/registry.js';
2
4
  /**
3
5
  * Result of resolving the effective tool domain set for the authenticated
4
6
  * user. When `authorized` is `false`, the caller MUST expose no tools.
@@ -10,20 +12,43 @@ export interface AuthorizationResult {
10
12
  reason: string;
11
13
  /** `true` when the caller should expose tools. `false` means fail closed — expose nothing. */
12
14
  authorized: boolean;
15
+ /**
16
+ * Immutable index over the caller's effective Persist capabilities.
17
+ * Present only when the effective-capabilities RPC was fetched and
18
+ * validated successfully. Consumers use this both to filter the
19
+ * advertised tool list and to gate `CallTool` dispatch.
20
+ */
21
+ capabilities?: EffectiveCapabilityIndex;
13
22
  }
14
23
  type StderrLogger = Pick<Console, 'error'>;
15
24
  /**
16
25
  * Resolve the tool domain surface for the authenticated user.
17
26
  *
18
27
  * Behaviour:
19
- * - Always queries the backend for the user's resolved roles. On any
20
- * failure, fails closed and exposes no tools.
28
+ * - Always queries the backend for the user's resolved roles AND
29
+ * effective Persist capabilities. On any failure of either query,
30
+ * fails closed and exposes no tools.
21
31
  * - The static `RAYTIO_TOOL_DOMAINS` override may only *restrict* the
22
32
  * user's resolved domain set. It never grants access to domains the
23
33
  * user does not have.
24
34
  * - If the intersection is empty (or the user has no recognised roles),
25
35
  * fails closed.
36
+ * - The returned `capabilities` index is used downstream by
37
+ * {@link filterToolsByCapabilities} and by the dispatch layer to
38
+ * enforce per-tool authorisation at both advertisement and call time.
26
39
  */
27
40
  export declare function resolveToolDomains(apiClient: RaytioApiClient, envSpec: string | undefined, logger?: StderrLogger): Promise<AuthorizationResult>;
41
+ /**
42
+ * Drop any tool whose declared `capabilities` are not satisfied by the
43
+ * caller's effective capability set. Tools that have no `capabilities`
44
+ * declaration pass through unchanged — they are gated only by the
45
+ * coarser role-domain filter until they are migrated onto the pinned
46
+ * Persist resource contract (see WI-0003500 onward).
47
+ *
48
+ * A tool with an empty `capabilities` array is treated as declaring
49
+ * "requires no permission" and passes through — the empty list is an
50
+ * explicit affirmation, not a fallthrough.
51
+ */
52
+ export declare function filterToolsByCapabilities(tools: readonly Tool[], capabilities: EffectiveCapabilityIndex, logger?: StderrLogger): Tool[];
28
53
  export {};
29
54
  //# sourceMappingURL=authorization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,mHAAmH;IACnH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAgD3C;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,YAAsB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAyC9B"}
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EAEzB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,mHAAmH;IACnH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC;AAED,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAgD3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,YAAsB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAqE9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,YAAY,EAAE,wBAAwB,EACtC,MAAM,GAAE,YAAsB,GAC7B,IAAI,EAAE,CA8BR"}
@@ -1,3 +1,4 @@
1
+ import { EffectiveCapabilityError, fetchEffectiveCapabilities, } from './capabilities/effective-capabilities.js';
1
2
  import { resolveUserDomains } from './tools/role-mapping.js';
2
3
  /**
3
4
  * Domains that a static override may resolve to when the user only holds
@@ -44,13 +45,17 @@ function restrictToUserDomains(staticDomains, userDomains) {
44
45
  * Resolve the tool domain surface for the authenticated user.
45
46
  *
46
47
  * Behaviour:
47
- * - Always queries the backend for the user's resolved roles. On any
48
- * failure, fails closed and exposes no tools.
48
+ * - Always queries the backend for the user's resolved roles AND
49
+ * effective Persist capabilities. On any failure of either query,
50
+ * fails closed and exposes no tools.
49
51
  * - The static `RAYTIO_TOOL_DOMAINS` override may only *restrict* the
50
52
  * user's resolved domain set. It never grants access to domains the
51
53
  * user does not have.
52
54
  * - If the intersection is empty (or the user has no recognised roles),
53
55
  * fails closed.
56
+ * - The returned `capabilities` index is used downstream by
57
+ * {@link filterToolsByCapabilities} and by the dispatch layer to
58
+ * enforce per-tool authorisation at both advertisement and call time.
54
59
  */
55
60
  export async function resolveToolDomains(apiClient, envSpec, logger = console) {
56
61
  const staticDomains = parseSpec(envSpec);
@@ -69,10 +74,28 @@ export async function resolveToolDomains(apiClient, envSpec, logger = console) {
69
74
  logger.error(`Raytio MCP: ${reason} — exposing no tools (fail closed)`);
70
75
  return { domainSpec: undefined, reason, authorized: false };
71
76
  }
77
+ let capabilities;
78
+ try {
79
+ capabilities = await fetchEffectiveCapabilities(apiClient);
80
+ }
81
+ catch (err) {
82
+ const detail = err instanceof EffectiveCapabilityError
83
+ ? err.message
84
+ : `unexpected error: ${err.message}`;
85
+ const reason = `effective capabilities discovery failed: ${detail}`;
86
+ logger.error(`Raytio MCP: ${reason} — exposing no tools (fail closed)`);
87
+ return { domainSpec: undefined, reason, authorized: false };
88
+ }
89
+ logger.error(`Raytio MCP: fetched ${capabilities.size} effective capability rows for authenticated user`);
72
90
  if (staticDomains.length === 0) {
73
91
  const spec = userDomains.join(',');
74
92
  logger.error(`Raytio MCP: resolved domains from user roles: ${spec}`);
75
- return { domainSpec: spec, reason: 'resolved from user roles', authorized: true };
93
+ return {
94
+ domainSpec: spec,
95
+ reason: 'resolved from user roles',
96
+ authorized: true,
97
+ capabilities,
98
+ };
76
99
  }
77
100
  const allowed = restrictToUserDomains(staticDomains, userDomains);
78
101
  if (allowed.length === 0) {
@@ -82,6 +105,46 @@ export async function resolveToolDomains(apiClient, envSpec, logger = console) {
82
105
  }
83
106
  const spec = allowed.join(',');
84
107
  logger.error(`Raytio MCP: static RAYTIO_TOOL_DOMAINS restricted user roles (${userDomains.join(',')}) to ${spec}`);
85
- return { domainSpec: spec, reason: 'restricted by static override', authorized: true };
108
+ return {
109
+ domainSpec: spec,
110
+ reason: 'restricted by static override',
111
+ authorized: true,
112
+ capabilities,
113
+ };
114
+ }
115
+ /**
116
+ * Drop any tool whose declared `capabilities` are not satisfied by the
117
+ * caller's effective capability set. Tools that have no `capabilities`
118
+ * declaration pass through unchanged — they are gated only by the
119
+ * coarser role-domain filter until they are migrated onto the pinned
120
+ * Persist resource contract (see WI-0003500 onward).
121
+ *
122
+ * A tool with an empty `capabilities` array is treated as declaring
123
+ * "requires no permission" and passes through — the empty list is an
124
+ * explicit affirmation, not a fallthrough.
125
+ */
126
+ export function filterToolsByCapabilities(tools, capabilities, logger = console) {
127
+ const allowed = [];
128
+ let hidden = 0;
129
+ for (const tool of tools) {
130
+ if (!tool.capabilities || tool.capabilities.length === 0) {
131
+ allowed.push(tool);
132
+ continue;
133
+ }
134
+ const missing = tool.capabilities.filter((req) => !capabilities.satisfies(req));
135
+ if (missing.length === 0) {
136
+ allowed.push(tool);
137
+ continue;
138
+ }
139
+ hidden += 1;
140
+ const detail = missing
141
+ .map((r) => `${r.resourceGroup}.${r.resourceName}#${r.operation}@${r.scope ?? 'OWN_RECORDS'}`)
142
+ .join(', ');
143
+ logger.error(`Raytio MCP: hiding tool "${tool.name}" — missing capability: ${detail}`);
144
+ }
145
+ if (hidden > 0) {
146
+ logger.error(`Raytio MCP: capability filter hid ${hidden}/${tools.length} tools`);
147
+ }
148
+ return allowed;
86
149
  }
87
150
  //# sourceMappingURL=authorization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,248 @@
1
+ import { z } from 'zod';
2
+ import { RaytioApiClient } from '../raytio/api-client.js';
3
+ /**
4
+ * Client and index for the supported Persist "effective capabilities" RPC
5
+ * (`public.fnd_get_effective_capabilities()`), owned by WI-0003499.
6
+ *
7
+ * The RPC returns one row per (resource_group, resource_name, operation)
8
+ * tuple that the authenticated user may exercise. MCP uses that set to
9
+ * authorise both tool advertisement (`ListTools`) and tool dispatch
10
+ * (`CallTool`).
11
+ *
12
+ * Row semantics — see `docs/mcp-effective-capabilities.md` in the Persist
13
+ * repository:
14
+ *
15
+ * - `resource_group` — 3-letter module code (e.g. `HRM`, `DSM`, `FAR`).
16
+ * Matches `resources[*].permission.resource_group` in the pinned MCP
17
+ * resource contract.
18
+ * - `resource_name` — resource-scoped code (e.g. `ACCESS_APPLICATIONS`),
19
+ * or `null` for a domain-level permission that applies to every
20
+ * resource in the group. Persist suppresses domain rows when
21
+ * table-specific entries exist for the same (group, operation) —
22
+ * MCP relies on that shadowing and does not re-check it here.
23
+ * - `operation` — one of `SELECT`, `INSERT`, `UPDATE`, `DELETE`, or a
24
+ * semantic operation seeded into the `HRM_PERMISSIONS_OPERATION`
25
+ * lookup.
26
+ * - `scope` — exactly one of `ALL_RECORDS` or `ROW_BOUNDED` on the wire.
27
+ * `ALL_RECORDS` means "verified unbounded HRM access". `ROW_BOUNDED`
28
+ * means "the HRM grant exists at OWN_RECORDS scope but real access is
29
+ * via ownership / ReBAC / row filters — treat as informational". A
30
+ * `NULL` scope is coerced to `ROW_BOUNDED` inside the RPC, never to
31
+ * unbounded. MCP normalises `ROW_BOUNDED` to the pre-existing internal
32
+ * alias `OWN_RECORDS` on ingress (see {@link CAPABILITY_SCOPES}); both
33
+ * names refer to the same "not verified unbounded" semantic, so the
34
+ * rest of the MCP code path — CapabilityRequirement, satisfies(),
35
+ * dispatch — is unchanged. Reconciled in WI-0003661.
36
+ * - `advisory` — `TRUE` iff `scope = ROW_BOUNDED`; `FALSE` for
37
+ * `ALL_RECORDS`. Redundant with `scope` today; accepted (optional) on
38
+ * the wire so a producer-side addition remains non-breaking.
39
+ *
40
+ * When the caller reaches the same capability at both `ALL_RECORDS` and
41
+ * `ROW_BOUNDED`, the RPC collapses the row to `ALL_RECORDS`. MCP relies
42
+ * on that guarantee — the client does not attempt its own scope merge.
43
+ *
44
+ * MCP fails closed on any of:
45
+ * - HTTP transport failure,
46
+ * - JSON that does not parse or does not match the schema below,
47
+ * - unknown values in `operation` or `scope`,
48
+ * - a required tool capability that is not present in the returned set.
49
+ *
50
+ * `OWN_RECORDS` MUST NEVER silently become `ALL_RECORDS` — the tool
51
+ * declaration carries the scope its handler is safe with, and a broader
52
+ * effective capability satisfies it; a narrower one does not.
53
+ *
54
+ * ---
55
+ *
56
+ * Deliberate deviation from Persist's interpretation invariant
57
+ * (WI-0003661):
58
+ *
59
+ * Persist's contract states that "absence means unknown — ask the
60
+ * database" and that `ROW_BOUNDED` rows are informational, not a
61
+ * deny-side authorisation gate. MCP intentionally departs from that on
62
+ * the tool-advertisement path:
63
+ *
64
+ * - {@link filterToolsByCapabilities} HIDES any tool whose declared
65
+ * capabilities are missing from the caller's returned set.
66
+ * - {@link EffectiveCapabilityIndex.satisfies} returns `false` when the
67
+ * caller holds no matching row.
68
+ *
69
+ * The rationale is fail-closed advertisement: exposing a tool a caller
70
+ * cannot execute is a poor UX and leaks the shape of the denied surface.
71
+ * The database still enforces at call time — HRM permissions, ownership,
72
+ * and ReBAC all continue to gate the underlying query — so any tool
73
+ * whose actual access path is via ownership or ReBAC (never surfaced by
74
+ * this RPC) will be hidden until an explicit capability is granted or
75
+ * the tool's declaration is loosened. This is a design choice, not an
76
+ * oversight; revisit if MCP ever needs to advertise
77
+ * ownership/ReBAC-only tools.
78
+ */
79
+ /**
80
+ * Wire-side scope vocabulary the RPC emits (per Persist's
81
+ * `docs/mcp-effective-capabilities.md`, WI-0003499):
82
+ *
83
+ * - `ALL_RECORDS` — verified unbounded HRM access.
84
+ * - `ROW_BOUNDED` — advisory HRM row; actual access via
85
+ * ownership / ReBAC / row filters.
86
+ *
87
+ * The legacy `OWN_RECORDS` label — the pre-rename name for `ROW_BOUNDED`
88
+ * — is still accepted for transitional deployments of Persist; both
89
+ * legacy and current values are normalised to the internal
90
+ * `OWN_RECORDS` alias.
91
+ */
92
+ export declare const WIRE_CAPABILITY_SCOPES: readonly ["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"];
93
+ export type WireCapabilityScope = (typeof WIRE_CAPABILITY_SCOPES)[number];
94
+ /**
95
+ * MCP-internal scope vocabulary used by {@link CapabilityRequirement}
96
+ * declarations and by the scope stored inside
97
+ * {@link EffectiveCapabilityIndex}. Persist's `ROW_BOUNDED` is
98
+ * normalised to `OWN_RECORDS` on ingress — the two names encode the
99
+ * same semantic ("not a verified unbounded HRM grant — enforcement of
100
+ * access is via ownership / ReBAC / row filters at call time").
101
+ *
102
+ * Vocabulary decision (WI-0003678): the internal alias is permanent.
103
+ * WI-0003661 deferred the internal `OWN_RECORDS → ROW_BOUNDED` rename
104
+ * on the grounds that no tool declared a scope yet. WI-0003678 changed
105
+ * that — every tool in {@link Tool.capabilities} now declares
106
+ * requirements through the contract-derived {@link cap} helper, and
107
+ * OWN_RECORDS is the default scope that helper produces. Renaming at
108
+ * this point would touch every capability declaration for no wire-side
109
+ * benefit (the wire vocabulary is already `ROW_BOUNDED` in Persist and
110
+ * the transform on ingress hides that from the rest of the code path).
111
+ * Keep {@link CAPABILITY_SCOPES} as-is; do not add a `ROW_BOUNDED`
112
+ * alias inside MCP.
113
+ */
114
+ export declare const CAPABILITY_SCOPES: readonly ["ALL_RECORDS", "OWN_RECORDS"];
115
+ export type CapabilityScope = (typeof CAPABILITY_SCOPES)[number];
116
+ /**
117
+ * Zod schema for one row returned by `fnd_get_effective_capabilities()`.
118
+ * The RPC guarantees a `NOT NULL` `resource_group`, `operation`, and
119
+ * `scope`; `resource_name` may be `NULL` for a domain-level permission.
120
+ *
121
+ * Any structural drift here is a hard error — MCP MUST NOT accept an
122
+ * unknown scope value, empty operation, or malformed resource_group.
123
+ */
124
+ export declare const effectiveCapabilityRowSchema: z.ZodObject<{
125
+ resource_group: z.ZodString;
126
+ resource_name: z.ZodNullable<z.ZodString>;
127
+ operation: z.ZodString;
128
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
129
+ advisory: z.ZodOptional<z.ZodBoolean>;
130
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
131
+ resource_group: z.ZodString;
132
+ resource_name: z.ZodNullable<z.ZodString>;
133
+ operation: z.ZodString;
134
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
135
+ advisory: z.ZodOptional<z.ZodBoolean>;
136
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
137
+ resource_group: z.ZodString;
138
+ resource_name: z.ZodNullable<z.ZodString>;
139
+ operation: z.ZodString;
140
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
141
+ advisory: z.ZodOptional<z.ZodBoolean>;
142
+ }, z.ZodTypeAny, "passthrough">>;
143
+ export type EffectiveCapabilityRow = z.infer<typeof effectiveCapabilityRowSchema>;
144
+ export declare const effectiveCapabilityResponseSchema: z.ZodArray<z.ZodObject<{
145
+ resource_group: z.ZodString;
146
+ resource_name: z.ZodNullable<z.ZodString>;
147
+ operation: z.ZodString;
148
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
149
+ advisory: z.ZodOptional<z.ZodBoolean>;
150
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
151
+ resource_group: z.ZodString;
152
+ resource_name: z.ZodNullable<z.ZodString>;
153
+ operation: z.ZodString;
154
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
155
+ advisory: z.ZodOptional<z.ZodBoolean>;
156
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
157
+ resource_group: z.ZodString;
158
+ resource_name: z.ZodNullable<z.ZodString>;
159
+ operation: z.ZodString;
160
+ scope: z.ZodEffects<z.ZodEnum<["ALL_RECORDS", "ROW_BOUNDED", "OWN_RECORDS"]>, "ALL_RECORDS" | "OWN_RECORDS", "ALL_RECORDS" | "ROW_BOUNDED" | "OWN_RECORDS">;
161
+ advisory: z.ZodOptional<z.ZodBoolean>;
162
+ }, z.ZodTypeAny, "passthrough">>, "many">;
163
+ /**
164
+ * The declared capability requirement for a tool. A tool is authorised iff
165
+ * every requirement in its list is satisfied by the caller's effective
166
+ * capability set.
167
+ *
168
+ * The requirement is intentionally narrow — no wildcards, no "any op". A
169
+ * tool that reads and writes must declare both requirements. This keeps
170
+ * the authorisation graph auditable and cheap to reason about.
171
+ */
172
+ export interface CapabilityRequirement {
173
+ /**
174
+ * Persist resource group (e.g. `WRM`). Compared case-insensitively
175
+ * against the RPC's `resource_group`.
176
+ */
177
+ resourceGroup: string;
178
+ /**
179
+ * Persist resource name (e.g. `ROLES`). Compared case-insensitively
180
+ * against the RPC's `resource_name`. A domain-level row
181
+ * (`resource_name: null`) satisfies any resource in the same group.
182
+ */
183
+ resourceName: string;
184
+ /** Operation code (e.g. `SELECT`). Compared case-insensitively. */
185
+ operation: string;
186
+ /**
187
+ * The minimum scope the tool's handler is safe with. `OWN_RECORDS`
188
+ * (the default) is satisfied by either `OWN_RECORDS` or `ALL_RECORDS`
189
+ * capabilities. `ALL_RECORDS` requires an `ALL_RECORDS` capability —
190
+ * an `OWN_RECORDS` capability is NOT sufficient, so an own-record
191
+ * grant can never silently become an all-record grant.
192
+ */
193
+ scope?: CapabilityScope;
194
+ }
195
+ /**
196
+ * Immutable index over the caller's effective capability set. Answers
197
+ * "does the user hold capability X at scope Y?" in O(1). Domain-level
198
+ * rows (`resource_name: null`) are pre-expanded so table-specific lookups
199
+ * still hit the map.
200
+ */
201
+ export declare class EffectiveCapabilityIndex {
202
+ /**
203
+ * Map keys are `${GROUP}|${NAME|*}|${OPERATION}` (uppercase). The value
204
+ * is the strongest scope observed for that tuple.
205
+ *
206
+ * Domain-level rows are stored with `resource_name = "*"` — table-level
207
+ * lookups probe both the specific name and the wildcard.
208
+ */
209
+ private readonly index;
210
+ constructor(rows: EffectiveCapabilityRow[]);
211
+ /** Total number of effective (group, name, operation) rows held. */
212
+ get size(): number;
213
+ /**
214
+ * Return the strongest scope the caller holds for the (group, name,
215
+ * operation) tuple, or `undefined` if they hold no matching capability.
216
+ *
217
+ * A domain-level grant (`resource_name = null`) satisfies any resource
218
+ * in the same group.
219
+ */
220
+ lookup(resourceGroup: string, resourceName: string, operation: string): CapabilityScope | undefined;
221
+ /**
222
+ * `true` iff the caller holds a capability that satisfies the
223
+ * requirement. `OWN_RECORDS` requirements are satisfied by any grant.
224
+ * `ALL_RECORDS` requirements are satisfied only by an `ALL_RECORDS`
225
+ * grant — an `OWN_RECORDS` grant does NOT silently upgrade.
226
+ */
227
+ satisfies(requirement: CapabilityRequirement): boolean;
228
+ }
229
+ /**
230
+ * Error thrown when the RPC cannot be fetched, decoded, or validated.
231
+ * Callers MUST fail closed (expose no tools) on this error.
232
+ */
233
+ export declare class EffectiveCapabilityError extends Error {
234
+ readonly cause?: unknown | undefined;
235
+ constructor(message: string, cause?: unknown | undefined);
236
+ }
237
+ /** PostgREST path to the Persist RPC. */
238
+ export declare const EFFECTIVE_CAPABILITIES_RPC_PATH = "/db/v1/rpc/fnd_get_effective_capabilities";
239
+ /**
240
+ * Fetch the caller's effective capabilities from Persist, validate the
241
+ * response shape, and return an index ready for constant-time lookup.
242
+ *
243
+ * Throws {@link EffectiveCapabilityError} on any transport, decode, or
244
+ * validation failure. Callers MUST fail closed on that error — never fall
245
+ * back to a permissive default.
246
+ */
247
+ export declare function fetchEffectiveCapabilities(apiClient: RaytioApiClient): Promise<EffectiveCapabilityIndex>;
248
+ //# sourceMappingURL=effective-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-capabilities.d.ts","sourceRoot":"","sources":["../../src/capabilities/effective-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,wDAIzB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,yCAA0C,CAAC;AACzE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAQjE;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;gCAuBzB,CAAC;AAEjB,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;yCAAwC,CAAC;AAEvF;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,wBAAwB;IACnC;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,IAAI,EAAE,sBAAsB,EAAE;IAgB1C,oEAAoE;IACpE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;OAMG;IACH,MAAM,CACJ,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,SAAS;IAW9B;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO;CAWvD;AAED;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,OAAO,YAAA;CAItD;AAED,yCAAyC;AACzC,eAAO,MAAM,+BAA+B,8CACC,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,wBAAwB,CAAC,CAmBnC"}