@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
@@ -0,0 +1,259 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Client and index for the supported Persist "effective capabilities" RPC
4
+ * (`public.fnd_get_effective_capabilities()`), owned by WI-0003499.
5
+ *
6
+ * The RPC returns one row per (resource_group, resource_name, operation)
7
+ * tuple that the authenticated user may exercise. MCP uses that set to
8
+ * authorise both tool advertisement (`ListTools`) and tool dispatch
9
+ * (`CallTool`).
10
+ *
11
+ * Row semantics — see `docs/mcp-effective-capabilities.md` in the Persist
12
+ * repository:
13
+ *
14
+ * - `resource_group` — 3-letter module code (e.g. `HRM`, `DSM`, `FAR`).
15
+ * Matches `resources[*].permission.resource_group` in the pinned MCP
16
+ * resource contract.
17
+ * - `resource_name` — resource-scoped code (e.g. `ACCESS_APPLICATIONS`),
18
+ * or `null` for a domain-level permission that applies to every
19
+ * resource in the group. Persist suppresses domain rows when
20
+ * table-specific entries exist for the same (group, operation) —
21
+ * MCP relies on that shadowing and does not re-check it here.
22
+ * - `operation` — one of `SELECT`, `INSERT`, `UPDATE`, `DELETE`, or a
23
+ * semantic operation seeded into the `HRM_PERMISSIONS_OPERATION`
24
+ * lookup.
25
+ * - `scope` — exactly one of `ALL_RECORDS` or `ROW_BOUNDED` on the wire.
26
+ * `ALL_RECORDS` means "verified unbounded HRM access". `ROW_BOUNDED`
27
+ * means "the HRM grant exists at OWN_RECORDS scope but real access is
28
+ * via ownership / ReBAC / row filters — treat as informational". A
29
+ * `NULL` scope is coerced to `ROW_BOUNDED` inside the RPC, never to
30
+ * unbounded. MCP normalises `ROW_BOUNDED` to the pre-existing internal
31
+ * alias `OWN_RECORDS` on ingress (see {@link CAPABILITY_SCOPES}); both
32
+ * names refer to the same "not verified unbounded" semantic, so the
33
+ * rest of the MCP code path — CapabilityRequirement, satisfies(),
34
+ * dispatch — is unchanged. Reconciled in WI-0003661.
35
+ * - `advisory` — `TRUE` iff `scope = ROW_BOUNDED`; `FALSE` for
36
+ * `ALL_RECORDS`. Redundant with `scope` today; accepted (optional) on
37
+ * the wire so a producer-side addition remains non-breaking.
38
+ *
39
+ * When the caller reaches the same capability at both `ALL_RECORDS` and
40
+ * `ROW_BOUNDED`, the RPC collapses the row to `ALL_RECORDS`. MCP relies
41
+ * on that guarantee — the client does not attempt its own scope merge.
42
+ *
43
+ * MCP fails closed on any of:
44
+ * - HTTP transport failure,
45
+ * - JSON that does not parse or does not match the schema below,
46
+ * - unknown values in `operation` or `scope`,
47
+ * - a required tool capability that is not present in the returned set.
48
+ *
49
+ * `OWN_RECORDS` MUST NEVER silently become `ALL_RECORDS` — the tool
50
+ * declaration carries the scope its handler is safe with, and a broader
51
+ * effective capability satisfies it; a narrower one does not.
52
+ *
53
+ * ---
54
+ *
55
+ * Deliberate deviation from Persist's interpretation invariant
56
+ * (WI-0003661):
57
+ *
58
+ * Persist's contract states that "absence means unknown — ask the
59
+ * database" and that `ROW_BOUNDED` rows are informational, not a
60
+ * deny-side authorisation gate. MCP intentionally departs from that on
61
+ * the tool-advertisement path:
62
+ *
63
+ * - {@link filterToolsByCapabilities} HIDES any tool whose declared
64
+ * capabilities are missing from the caller's returned set.
65
+ * - {@link EffectiveCapabilityIndex.satisfies} returns `false` when the
66
+ * caller holds no matching row.
67
+ *
68
+ * The rationale is fail-closed advertisement: exposing a tool a caller
69
+ * cannot execute is a poor UX and leaks the shape of the denied surface.
70
+ * The database still enforces at call time — HRM permissions, ownership,
71
+ * and ReBAC all continue to gate the underlying query — so any tool
72
+ * whose actual access path is via ownership or ReBAC (never surfaced by
73
+ * this RPC) will be hidden until an explicit capability is granted or
74
+ * the tool's declaration is loosened. This is a design choice, not an
75
+ * oversight; revisit if MCP ever needs to advertise
76
+ * ownership/ReBAC-only tools.
77
+ */
78
+ /**
79
+ * Wire-side scope vocabulary the RPC emits (per Persist's
80
+ * `docs/mcp-effective-capabilities.md`, WI-0003499):
81
+ *
82
+ * - `ALL_RECORDS` — verified unbounded HRM access.
83
+ * - `ROW_BOUNDED` — advisory HRM row; actual access via
84
+ * ownership / ReBAC / row filters.
85
+ *
86
+ * The legacy `OWN_RECORDS` label — the pre-rename name for `ROW_BOUNDED`
87
+ * — is still accepted for transitional deployments of Persist; both
88
+ * legacy and current values are normalised to the internal
89
+ * `OWN_RECORDS` alias.
90
+ */
91
+ export const WIRE_CAPABILITY_SCOPES = [
92
+ 'ALL_RECORDS',
93
+ 'ROW_BOUNDED',
94
+ 'OWN_RECORDS',
95
+ ];
96
+ /**
97
+ * MCP-internal scope vocabulary used by {@link CapabilityRequirement}
98
+ * declarations and by the scope stored inside
99
+ * {@link EffectiveCapabilityIndex}. Persist's `ROW_BOUNDED` is
100
+ * normalised to `OWN_RECORDS` on ingress — the two names encode the
101
+ * same semantic ("not a verified unbounded HRM grant — enforcement of
102
+ * access is via ownership / ReBAC / row filters at call time").
103
+ *
104
+ * Vocabulary decision (WI-0003678): the internal alias is permanent.
105
+ * WI-0003661 deferred the internal `OWN_RECORDS → ROW_BOUNDED` rename
106
+ * on the grounds that no tool declared a scope yet. WI-0003678 changed
107
+ * that — every tool in {@link Tool.capabilities} now declares
108
+ * requirements through the contract-derived {@link cap} helper, and
109
+ * OWN_RECORDS is the default scope that helper produces. Renaming at
110
+ * this point would touch every capability declaration for no wire-side
111
+ * benefit (the wire vocabulary is already `ROW_BOUNDED` in Persist and
112
+ * the transform on ingress hides that from the rest of the code path).
113
+ * Keep {@link CAPABILITY_SCOPES} as-is; do not add a `ROW_BOUNDED`
114
+ * alias inside MCP.
115
+ */
116
+ export const CAPABILITY_SCOPES = ['ALL_RECORDS', 'OWN_RECORDS'];
117
+ const wireScopeSchema = z
118
+ .enum(WIRE_CAPABILITY_SCOPES)
119
+ .transform((wire) => wire === 'ROW_BOUNDED' ? 'OWN_RECORDS' : wire);
120
+ /**
121
+ * Zod schema for one row returned by `fnd_get_effective_capabilities()`.
122
+ * The RPC guarantees a `NOT NULL` `resource_group`, `operation`, and
123
+ * `scope`; `resource_name` may be `NULL` for a domain-level permission.
124
+ *
125
+ * Any structural drift here is a hard error — MCP MUST NOT accept an
126
+ * unknown scope value, empty operation, or malformed resource_group.
127
+ */
128
+ export const effectiveCapabilityRowSchema = z
129
+ .object({
130
+ resource_group: z
131
+ .string()
132
+ .min(1)
133
+ .max(16)
134
+ .describe('Persist resource group code, e.g. "HRM", "DSM", "FAR"'),
135
+ resource_name: z
136
+ .string()
137
+ .min(1)
138
+ .nullable()
139
+ .describe('Resource-specific code, or null for a domain-level permission'),
140
+ operation: z
141
+ .string()
142
+ .min(1)
143
+ .describe('Operation code, e.g. "SELECT", "INSERT", "UPDATE", "DELETE"'),
144
+ scope: wireScopeSchema,
145
+ // Redundant with `scope` — always true when scope=ROW_BOUNDED, false
146
+ // when scope=ALL_RECORDS. Not consumed by MCP today but declared so
147
+ // producer additions do not silently drop; optional so older Persist
148
+ // deployments that predate the advisory column still parse.
149
+ advisory: z.boolean().optional(),
150
+ })
151
+ .passthrough();
152
+ export const effectiveCapabilityResponseSchema = z.array(effectiveCapabilityRowSchema);
153
+ /**
154
+ * Immutable index over the caller's effective capability set. Answers
155
+ * "does the user hold capability X at scope Y?" in O(1). Domain-level
156
+ * rows (`resource_name: null`) are pre-expanded so table-specific lookups
157
+ * still hit the map.
158
+ */
159
+ export class EffectiveCapabilityIndex {
160
+ /**
161
+ * Map keys are `${GROUP}|${NAME|*}|${OPERATION}` (uppercase). The value
162
+ * is the strongest scope observed for that tuple.
163
+ *
164
+ * Domain-level rows are stored with `resource_name = "*"` — table-level
165
+ * lookups probe both the specific name and the wildcard.
166
+ */
167
+ index;
168
+ constructor(rows) {
169
+ this.index = new Map();
170
+ for (const row of rows) {
171
+ const group = row.resource_group.toUpperCase();
172
+ const name = (row.resource_name ?? '*').toUpperCase();
173
+ const op = row.operation.toUpperCase();
174
+ const key = `${group}|${name}|${op}`;
175
+ const previous = this.index.get(key);
176
+ // ALL_RECORDS always wins over OWN_RECORDS. The RPC already
177
+ // collapses duplicates but we defend in depth in case the row set
178
+ // is ever assembled from multiple sources.
179
+ if (previous === 'ALL_RECORDS')
180
+ continue;
181
+ this.index.set(key, row.scope);
182
+ }
183
+ }
184
+ /** Total number of effective (group, name, operation) rows held. */
185
+ get size() {
186
+ return this.index.size;
187
+ }
188
+ /**
189
+ * Return the strongest scope the caller holds for the (group, name,
190
+ * operation) tuple, or `undefined` if they hold no matching capability.
191
+ *
192
+ * A domain-level grant (`resource_name = null`) satisfies any resource
193
+ * in the same group.
194
+ */
195
+ lookup(resourceGroup, resourceName, operation) {
196
+ const group = resourceGroup.toUpperCase();
197
+ const name = resourceName.toUpperCase();
198
+ const op = operation.toUpperCase();
199
+ const specific = this.index.get(`${group}|${name}|${op}`);
200
+ const domain = this.index.get(`${group}|*|${op}`);
201
+ if (specific === 'ALL_RECORDS' || domain === 'ALL_RECORDS')
202
+ return 'ALL_RECORDS';
203
+ if (specific === 'OWN_RECORDS' || domain === 'OWN_RECORDS')
204
+ return 'OWN_RECORDS';
205
+ return undefined;
206
+ }
207
+ /**
208
+ * `true` iff the caller holds a capability that satisfies the
209
+ * requirement. `OWN_RECORDS` requirements are satisfied by any grant.
210
+ * `ALL_RECORDS` requirements are satisfied only by an `ALL_RECORDS`
211
+ * grant — an `OWN_RECORDS` grant does NOT silently upgrade.
212
+ */
213
+ satisfies(requirement) {
214
+ const held = this.lookup(requirement.resourceGroup, requirement.resourceName, requirement.operation);
215
+ if (!held)
216
+ return false;
217
+ const need = requirement.scope ?? 'OWN_RECORDS';
218
+ if (need === 'ALL_RECORDS')
219
+ return held === 'ALL_RECORDS';
220
+ return true;
221
+ }
222
+ }
223
+ /**
224
+ * Error thrown when the RPC cannot be fetched, decoded, or validated.
225
+ * Callers MUST fail closed (expose no tools) on this error.
226
+ */
227
+ export class EffectiveCapabilityError extends Error {
228
+ cause;
229
+ constructor(message, cause) {
230
+ super(message);
231
+ this.cause = cause;
232
+ this.name = 'EffectiveCapabilityError';
233
+ }
234
+ }
235
+ /** PostgREST path to the Persist RPC. */
236
+ export const EFFECTIVE_CAPABILITIES_RPC_PATH = '/db/v1/rpc/fnd_get_effective_capabilities';
237
+ /**
238
+ * Fetch the caller's effective capabilities from Persist, validate the
239
+ * response shape, and return an index ready for constant-time lookup.
240
+ *
241
+ * Throws {@link EffectiveCapabilityError} on any transport, decode, or
242
+ * validation failure. Callers MUST fail closed on that error — never fall
243
+ * back to a permissive default.
244
+ */
245
+ export async function fetchEffectiveCapabilities(apiClient) {
246
+ let raw;
247
+ try {
248
+ raw = await apiClient.post(EFFECTIVE_CAPABILITIES_RPC_PATH, {});
249
+ }
250
+ catch (error) {
251
+ throw new EffectiveCapabilityError(`effective capabilities RPC failed: ${error.message}`, error);
252
+ }
253
+ const parsed = effectiveCapabilityResponseSchema.safeParse(raw);
254
+ if (!parsed.success) {
255
+ throw new EffectiveCapabilityError(`effective capabilities response failed validation: ${parsed.error.message}`);
256
+ }
257
+ return new EffectiveCapabilityIndex(parsed.data);
258
+ }
259
+ //# sourceMappingURL=effective-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-capabilities.js","sourceRoot":"","sources":["../../src/capabilities/effective-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { CapabilityRequirement, CapabilityScope } from './effective-capabilities.js';
2
+ interface ContractPermission {
3
+ resourceGroup: string;
4
+ resourceName: string;
5
+ operations: ReadonlySet<string>;
6
+ }
7
+ /**
8
+ * Capability requirements for the 6 RPC endpoints MCP calls. RPCs do not
9
+ * have a `table` entry in the pinned contract, so a matching capability
10
+ * MUST be declared by hand here and referenced via {@link rpcCap}. A tool
11
+ * calling an RPC not listed here fails the completeness test.
12
+ */
13
+ export declare const RPC_CAPABILITIES: Readonly<Record<string, readonly ContractPermission[]>>;
14
+ /** All operations that MCP knows how to map from an HTTP verb. */
15
+ export declare const HTTP_VERBS: string[];
16
+ /** Convert an HTTP verb (lower-case) into the Persist operation code. */
17
+ export declare function verbToOperation(verb: string): string;
18
+ /**
19
+ * Return a {@link CapabilityRequirement} for a tool that calls
20
+ * `/db/v1/<table>` with the given operation.
21
+ *
22
+ * Fails fast on:
23
+ * - unknown table (typo, dropped from contract, forgot to sync);
24
+ * - operation not in the contract's `operations` list for that resource
25
+ * (e.g. declaring UPDATE on a view that is SELECT-only);
26
+ * - invalid scope (guarded by {@link CAPABILITY_SCOPES}).
27
+ *
28
+ * @param table PostgREST endpoint segment (e.g. `ppm_work_items`).
29
+ * @param operation One of `SELECT|INSERT|UPDATE|DELETE`, case-insensitive.
30
+ * Also accepts the HTTP verb (`get`/`post`/`patch`/`delete`).
31
+ * @param scope Defaults to `OWN_RECORDS`. Only set to `ALL_RECORDS`
32
+ * when the tool genuinely needs cross-record reach
33
+ * (tenant-wide list/summary tools). See the WI-0003678
34
+ * scope-guidance block.
35
+ */
36
+ export declare function cap(table: string, operation: string, scope?: CapabilityScope): CapabilityRequirement;
37
+ /**
38
+ * Return the capability requirement(s) for a tool that calls
39
+ * `/db/v1/rpc/<name>`. Every RPC MCP surfaces MUST have an entry in
40
+ * {@link RPC_CAPABILITIES}; a missing entry throws.
41
+ */
42
+ export declare function rpcCap(name: string, scope?: CapabilityScope): CapabilityRequirement[];
43
+ /**
44
+ * Test-only: is this table known to the helper (via contract or override)?
45
+ * The completeness test uses this to detect drift between the tool source
46
+ * and the pinned contract without shelling out through {@link cap}.
47
+ */
48
+ export declare function isKnownTable(table: string): boolean;
49
+ /** Test-only: names of all RPCs the helper knows a capability for. */
50
+ export declare function knownRpcs(): readonly string[];
51
+ export {};
52
+ //# sourceMappingURL=tool-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-capability.d.ts","sourceRoot":"","sources":["../../src/capabilities/tool-capability.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,qBAAqB,EACrB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAsBrC,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjC;AAyDD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC,CAoDpF,CAAC;AAUF,kEAAkE;AAClE,eAAO,MAAM,UAAU,UAA0B,CAAC;AAElD,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AAiBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,GAAG,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,eAA+B,GACrC,qBAAqB,CAuBvB;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,eAA+B,GACrC,qBAAqB,EAAE,CAqBzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,sEAAsE;AACtE,wBAAgB,SAAS,IAAI,SAAS,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,238 @@
1
+ import { loadPersistResourceContract } from '../contracts/persist-resource-contract.js';
2
+ import { CAPABILITY_SCOPES, } from './effective-capabilities.js';
3
+ /**
4
+ * Contract-derived helper for declaring `Tool.capabilities` (WI-0003678).
5
+ *
6
+ * The pinned Persist resource contract (`contracts/persist/mcp_resource_contract.json`)
7
+ * already carries the resource-group / resource-name / operations tuple for
8
+ * every table MCP is allowed to surface. Rather than hand-writing those tuples
9
+ * in every tool file (a 748-call surface across 188 tools with predictable
10
+ * copy-paste drift), a tool calls {@link cap} with the table and operation it
11
+ * touches — the helper resolves the tuple at module load, and typos or dropped
12
+ * tables produce a hard error immediately.
13
+ *
14
+ * The completeness test (`src/tools/capability-completeness.test.ts`) scans
15
+ * every tool source for `/db/v1/<table>` literals and enforces that each is
16
+ * covered by a declared capability. Without that test, missing declarations
17
+ * fail open — the tool stays advertised even though it will short-circuit on
18
+ * dispatch.
19
+ */
20
+ const contract = loadPersistResourceContract();
21
+ const TABLE_TO_PERMISSION = (() => {
22
+ const map = new Map();
23
+ for (const resource of contract.resources) {
24
+ map.set(resource.table, {
25
+ resourceGroup: resource.permission.resource_group,
26
+ resourceName: resource.permission.resource_name,
27
+ operations: new Set(resource.permission.operations.map((o) => o.toUpperCase())),
28
+ });
29
+ }
30
+ return map;
31
+ })();
32
+ /**
33
+ * Overrides for tables that are deliberately EXCLUDED from the pinned
34
+ * resource contract (credentials-sensitive, internal permission tables,
35
+ * platform infrastructure) but that legitimate MCP tools still need to
36
+ * declare capabilities against.
37
+ *
38
+ * Every entry is a documented, reviewed exception — anything not in the
39
+ * pinned contract and not listed here will throw at module load. Do not
40
+ * add entries speculatively: an entry here means "MCP tools call this
41
+ * endpoint and we accept the sensitivity trade-off". Removing a tool that
42
+ * used one of these should remove the entry too.
43
+ *
44
+ * Verified against Persist naming convention (`<module>_<plural_snake>` →
45
+ * `<MODULE>.<PLURAL_SNAKE_UPPER>`), consistent across all in-contract
46
+ * resources in the same module. See wrm/, fnd/ sections of the contract.
47
+ */
48
+ const CONTRACT_OVERRIDES = new Map([
49
+ [
50
+ 'wrm_worker_credentials',
51
+ {
52
+ resourceGroup: 'WRM',
53
+ resourceName: 'WORKER_CREDENTIALS',
54
+ operations: new Set(['INSERT', 'SELECT', 'UPDATE']),
55
+ },
56
+ ],
57
+ [
58
+ 'wrm_credential_requests',
59
+ {
60
+ resourceGroup: 'WRM',
61
+ resourceName: 'CREDENTIAL_REQUESTS',
62
+ operations: new Set(['INSERT', 'SELECT', 'UPDATE']),
63
+ },
64
+ ],
65
+ [
66
+ 'fnd_notifications',
67
+ {
68
+ resourceGroup: 'FND',
69
+ resourceName: 'NOTIFICATIONS',
70
+ operations: new Set(['INSERT', 'SELECT', 'UPDATE']),
71
+ },
72
+ ],
73
+ ]);
74
+ /**
75
+ * Capability requirements for the 6 RPC endpoints MCP calls. RPCs do not
76
+ * have a `table` entry in the pinned contract, so a matching capability
77
+ * MUST be declared by hand here and referenced via {@link rpcCap}. A tool
78
+ * calling an RPC not listed here fails the completeness test.
79
+ */
80
+ export const RPC_CAPABILITIES = {
81
+ ppm_instantiate_epic_template: [
82
+ {
83
+ resourceGroup: 'PPM',
84
+ resourceName: 'EPIC_TEMPLATES',
85
+ operations: new Set(['SELECT']),
86
+ },
87
+ {
88
+ resourceGroup: 'PPM',
89
+ resourceName: 'WORK_ITEMS',
90
+ operations: new Set(['INSERT']),
91
+ },
92
+ ],
93
+ wrm_knowledge_chunk_search: [
94
+ {
95
+ resourceGroup: 'WRM',
96
+ resourceName: 'KNOWLEDGE_CHUNKS',
97
+ operations: new Set(['SELECT']),
98
+ },
99
+ ],
100
+ wrm_context_aware_memory_search: [
101
+ {
102
+ resourceGroup: 'WRM',
103
+ resourceName: 'ROLE_MEMORIES',
104
+ operations: new Set(['SELECT']),
105
+ },
106
+ ],
107
+ wrm_semantic_memory_search: [
108
+ {
109
+ resourceGroup: 'WRM',
110
+ resourceName: 'ROLE_MEMORIES',
111
+ operations: new Set(['SELECT']),
112
+ },
113
+ ],
114
+ wrm_update_memory_access: [
115
+ {
116
+ resourceGroup: 'WRM',
117
+ resourceName: 'ROLE_MEMORIES',
118
+ operations: new Set(['UPDATE']),
119
+ },
120
+ ],
121
+ // fnd_authz_user_groups — advertised in the WI as a supported RPC; no
122
+ // current tool file calls it, but keep the row so a future consumer can
123
+ // reference it via `rpcCap('fnd_authz_user_groups')` without touching
124
+ // the helper. Verified as a semantic authz RPC per Persist docs.
125
+ fnd_authz_user_groups: [
126
+ {
127
+ resourceGroup: 'FND',
128
+ resourceName: 'USER_GROUPS',
129
+ operations: new Set(['SELECT']),
130
+ },
131
+ ],
132
+ };
133
+ const VERB_TO_OP = {
134
+ get: 'SELECT',
135
+ post: 'INSERT',
136
+ patch: 'UPDATE',
137
+ put: 'UPDATE',
138
+ delete: 'DELETE',
139
+ };
140
+ /** All operations that MCP knows how to map from an HTTP verb. */
141
+ export const HTTP_VERBS = Object.keys(VERB_TO_OP);
142
+ /** Convert an HTTP verb (lower-case) into the Persist operation code. */
143
+ export function verbToOperation(verb) {
144
+ const op = VERB_TO_OP[verb.toLowerCase()];
145
+ if (!op) {
146
+ throw new Error(`Unknown HTTP verb "${verb}" — cannot map to a Persist operation. ` +
147
+ 'Update VERB_TO_OP in src/capabilities/tool-capability.ts.');
148
+ }
149
+ return op;
150
+ }
151
+ function resolveTable(table) {
152
+ const fromContract = TABLE_TO_PERMISSION.get(table);
153
+ if (fromContract)
154
+ return fromContract;
155
+ const fromOverride = CONTRACT_OVERRIDES.get(table);
156
+ if (fromOverride)
157
+ return fromOverride;
158
+ throw new Error(`cap(): unknown table "${table}". The pinned Persist contract does not ` +
159
+ 'declare a permission for it and no override is registered. Either the ' +
160
+ 'table has been renamed / removed upstream (re-sync the contract with ' +
161
+ '`npm run contract:sync-resource`), or add a documented override in ' +
162
+ 'src/capabilities/tool-capability.ts if MCP legitimately needs to hit ' +
163
+ 'a resource excluded from the surface.');
164
+ }
165
+ /**
166
+ * Return a {@link CapabilityRequirement} for a tool that calls
167
+ * `/db/v1/<table>` with the given operation.
168
+ *
169
+ * Fails fast on:
170
+ * - unknown table (typo, dropped from contract, forgot to sync);
171
+ * - operation not in the contract's `operations` list for that resource
172
+ * (e.g. declaring UPDATE on a view that is SELECT-only);
173
+ * - invalid scope (guarded by {@link CAPABILITY_SCOPES}).
174
+ *
175
+ * @param table PostgREST endpoint segment (e.g. `ppm_work_items`).
176
+ * @param operation One of `SELECT|INSERT|UPDATE|DELETE`, case-insensitive.
177
+ * Also accepts the HTTP verb (`get`/`post`/`patch`/`delete`).
178
+ * @param scope Defaults to `OWN_RECORDS`. Only set to `ALL_RECORDS`
179
+ * when the tool genuinely needs cross-record reach
180
+ * (tenant-wide list/summary tools). See the WI-0003678
181
+ * scope-guidance block.
182
+ */
183
+ export function cap(table, operation, scope = 'OWN_RECORDS') {
184
+ const permission = resolveTable(table);
185
+ const opUpper = VERB_TO_OP[operation.toLowerCase()] ?? operation.toUpperCase();
186
+ if (!permission.operations.has(opUpper)) {
187
+ throw new Error(`cap("${table}", "${operation}"): operation ${opUpper} is not in the ` +
188
+ `contract's permitted operations for ${permission.resourceGroup}.${permission.resourceName} ` +
189
+ `(supported: ${[...permission.operations].sort().join(', ')}). ` +
190
+ 'Pick a different endpoint or fix the tool.');
191
+ }
192
+ if (!CAPABILITY_SCOPES.includes(scope)) {
193
+ throw new Error(`cap("${table}", "${operation}"): invalid scope "${scope}" — ` +
194
+ `must be one of ${CAPABILITY_SCOPES.join(', ')}.`);
195
+ }
196
+ return {
197
+ resourceGroup: permission.resourceGroup,
198
+ resourceName: permission.resourceName,
199
+ operation: opUpper,
200
+ scope,
201
+ };
202
+ }
203
+ /**
204
+ * Return the capability requirement(s) for a tool that calls
205
+ * `/db/v1/rpc/<name>`. Every RPC MCP surfaces MUST have an entry in
206
+ * {@link RPC_CAPABILITIES}; a missing entry throws.
207
+ */
208
+ export function rpcCap(name, scope = 'OWN_RECORDS') {
209
+ const perms = RPC_CAPABILITIES[name];
210
+ if (!perms) {
211
+ throw new Error(`rpcCap(): unknown RPC "${name}". Add a documented entry to ` +
212
+ 'RPC_CAPABILITIES in src/capabilities/tool-capability.ts before ' +
213
+ 'referencing it from a tool.');
214
+ }
215
+ // Expand every operation in each entry. Taking only the first
216
+ // (`[...p.operations][0]`) silently dropped the rest, so a multi-op
217
+ // entry would under-declare and the tool would be advertised more
218
+ // permissively than it can actually execute.
219
+ return perms.flatMap((p) => [...p.operations].map((operation) => ({
220
+ resourceGroup: p.resourceGroup,
221
+ resourceName: p.resourceName,
222
+ operation,
223
+ scope,
224
+ })));
225
+ }
226
+ /**
227
+ * Test-only: is this table known to the helper (via contract or override)?
228
+ * The completeness test uses this to detect drift between the tool source
229
+ * and the pinned contract without shelling out through {@link cap}.
230
+ */
231
+ export function isKnownTable(table) {
232
+ return TABLE_TO_PERMISSION.has(table) || CONTRACT_OVERRIDES.has(table);
233
+ }
234
+ /** Test-only: names of all RPCs the helper knows a capability for. */
235
+ export function knownRpcs() {
236
+ return Object.keys(RPC_CAPABILITIES);
237
+ }
238
+ //# sourceMappingURL=tool-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-capability.js","sourceRoot":"","sources":["../../src/capabilities/tool-capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Assemble the full set of generated read tools from a pinned Persist
3
+ * resource contract. Consumers pass the contract loaded by
4
+ * {@link loadPersistResourceContract}; this module hands back a
5
+ * deterministic, filterable list of {@link Tool} objects ready to be
6
+ * exposed alongside hand-written tools.
7
+ *
8
+ * Safety filters applied by default (WI-0003501):
9
+ *
10
+ * - Resources without a `list` or `read` operation are skipped — the
11
+ * resource may exist only for write-only side-effect paths.
12
+ * - Resources with `sensitivity` other than `normal` are skipped.
13
+ * Callers who genuinely need them must set `includeSensitive: true`
14
+ * on the filter; the resource-tools factory will still redact any
15
+ * credential-shaped columns from every response.
16
+ * - Resources that declare `side_effects` are ALWAYS skipped — there
17
+ * is no opt-in. Generic CRUD around a state-transition or
18
+ * notification path is a category error; dedicated tools with
19
+ * explicit confirmation/idempotency semantics are required.
20
+ *
21
+ * Composite-primary-key resources still get describe + list; only the
22
+ * get-by-id tool is skipped.
23
+ */
24
+ import type { PersistResource, PersistResourceContract } from '../contracts/persist-resource-contract.js';
25
+ import { Tool } from '../tools/registry.js';
26
+ import { ExclusionReason } from './guardrails.js';
27
+ export interface CatalogueFilter {
28
+ /** Only emit tools for these modules. Case-insensitive; empty = all. */
29
+ modules?: string[];
30
+ /** Additional predicate — return `true` to include the resource. */
31
+ include?: (resource: PersistResource) => boolean;
32
+ /**
33
+ * When `true`, resources marked `sensitive`/`restricted` become
34
+ * eligible. Sensitive-field redaction still applies — the caller
35
+ * gains access to the resource's non-secret columns only. Default
36
+ * `false`.
37
+ *
38
+ * Side-effecting resources are NEVER made eligible by this flag —
39
+ * dedicated tools remain the only supported path for them.
40
+ */
41
+ includeSensitive?: boolean;
42
+ }
43
+ /**
44
+ * Result of one resource's exclusion, exposed on the report so
45
+ * operators and doc generators can explain "why is `foo_list` not in
46
+ * the surface?" without re-implementing the guardrails.
47
+ */
48
+ export interface CatalogueExclusion {
49
+ resourceId: string;
50
+ module: string;
51
+ reasons: ExclusionReason[];
52
+ }
53
+ /** Report returned alongside the generated tool list. */
54
+ export interface CatalogueReport {
55
+ tools: Tool[];
56
+ excluded: CatalogueExclusion[];
57
+ }
58
+ /**
59
+ * Deterministic, sorted list of generated read tools drawn from the
60
+ * pinned contract. Sorting is by (module, resource_id, tool_name) so
61
+ * `docs/tools.md` regeneration is reproducible.
62
+ *
63
+ * Sensitive and side-effecting resources are filtered out by default —
64
+ * see {@link CatalogueFilter} for the opt-in that lifts the sensitivity
65
+ * bar (nothing lifts the side-effect bar).
66
+ */
67
+ export declare function buildGeneratedReadCatalogue(contract: PersistResourceContract, filter?: CatalogueFilter): Tool[];
68
+ /**
69
+ * Same as {@link buildGeneratedReadCatalogue}, but also returns the list
70
+ * of resources the guardrails excluded and why. Used by tests and the
71
+ * doc generator to prove that the safety filter is doing its job — a
72
+ * silent skip is indistinguishable from a bug.
73
+ */
74
+ export declare function buildGeneratedReadCatalogueReport(contract: PersistResourceContract, filter?: CatalogueFilter): CatalogueReport;
75
+ /**
76
+ * Group the generated read tools by module. Modules with no eligible
77
+ * resources are omitted from the returned record.
78
+ */
79
+ export declare function groupGeneratedReadsByModule(contract: PersistResourceContract, filter?: CatalogueFilter): Record<string, Tool[]>;
80
+ //# sourceMappingURL=catalogue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../src/generated-reads/catalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAK5C,OAAO,EAEL,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC;IACjD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,uBAAuB,EACjC,MAAM,GAAE,eAAoB,GAC3B,IAAI,EAAE,CAER;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,uBAAuB,EACjC,MAAM,GAAE,eAAoB,GAC3B,eAAe,CAkCjB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,uBAAuB,EACjC,MAAM,GAAE,eAAoB,GAC3B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAqBxB"}