@bevel-software/platform-core-backend 0.25.2 → 0.27.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 (733) hide show
  1. package/agent-guide/access-control.md +251 -0
  2. package/agent-guide/conventions.md +35 -0
  3. package/agent-guide/directory-structure.md +145 -0
  4. package/agent-guide/finding-things.md +7 -0
  5. package/agent-guide/html-views.md +83 -0
  6. package/agent-guide/introduction.md +27 -0
  7. package/agent-guide/new-knowledge-base.md +24 -0
  8. package/agent-guide/skills.md +47 -0
  9. package/agent-guide/tool-manuals.md +227 -0
  10. package/agent-guide/where-a-new-file-goes.md +36 -0
  11. package/dist/assets.d.ts +26 -0
  12. package/dist/assets.d.ts.map +1 -1
  13. package/dist/assets.js +35 -2
  14. package/dist/assets.js.map +1 -1
  15. package/dist/core/catalog-revision.d.ts +19 -1
  16. package/dist/core/catalog-revision.d.ts.map +1 -1
  17. package/dist/core/catalog-revision.js +14 -3
  18. package/dist/core/catalog-revision.js.map +1 -1
  19. package/dist/core/core-ports.d.ts +11 -0
  20. package/dist/core/core-ports.d.ts.map +1 -1
  21. package/dist/core/core-ports.js.map +1 -1
  22. package/dist/core/create-core-server.d.ts +5 -0
  23. package/dist/core/create-core-server.d.ts.map +1 -1
  24. package/dist/core/create-core-server.js +65 -3
  25. package/dist/core/create-core-server.js.map +1 -1
  26. package/dist/core/create-core-services.d.ts +35 -0
  27. package/dist/core/create-core-services.d.ts.map +1 -1
  28. package/dist/core/create-core-services.js +114 -12
  29. package/dist/core/create-core-services.js.map +1 -1
  30. package/dist/core/lifecycle.d.ts +16 -1
  31. package/dist/core/lifecycle.d.ts.map +1 -1
  32. package/dist/core/lifecycle.js +18 -1
  33. package/dist/core/lifecycle.js.map +1 -1
  34. package/dist/core-config.d.ts +21 -0
  35. package/dist/core-config.d.ts.map +1 -1
  36. package/dist/core-config.js +22 -1
  37. package/dist/core-config.js.map +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/modules/access/access-control.interface.d.ts +17 -0
  43. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  44. package/dist/modules/access/access-control.service.d.ts +2 -0
  45. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  46. package/dist/modules/access/access-control.service.js +27 -0
  47. package/dist/modules/access/access-control.service.js.map +1 -1
  48. package/dist/modules/access/directory-sync-bot.js +1 -1
  49. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  50. package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
  51. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
  52. package/dist/modules/agent-guide/agent-guide.js +199 -0
  53. package/dist/modules/agent-guide/agent-guide.js.map +1 -0
  54. package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
  55. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
  56. package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
  57. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
  58. package/dist/modules/agent-guide/index.d.ts +4 -0
  59. package/dist/modules/agent-guide/index.d.ts.map +1 -0
  60. package/dist/modules/agent-guide/index.js +4 -0
  61. package/dist/modules/agent-guide/index.js.map +1 -0
  62. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
  63. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  64. package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
  65. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  66. package/dist/modules/agent-instructions/compose.d.ts +14 -6
  67. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  68. package/dist/modules/agent-instructions/compose.js +28 -8
  69. package/dist/modules/agent-instructions/compose.js.map +1 -1
  70. package/dist/modules/agent-instructions/index.d.ts +1 -1
  71. package/dist/modules/agent-instructions/index.d.ts.map +1 -1
  72. package/dist/modules/agent-instructions/index.js +1 -1
  73. package/dist/modules/agent-instructions/index.js.map +1 -1
  74. package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
  75. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  76. package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
  77. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  78. package/dist/modules/audit/agent-audit.service.d.ts +21 -2
  79. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  80. package/dist/modules/audit/agent-audit.service.js +43 -2
  81. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  82. package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
  83. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
  84. package/dist/modules/audit/agent-connection.routes.js +38 -0
  85. package/dist/modules/audit/agent-connection.routes.js.map +1 -0
  86. package/dist/modules/audit/audit.contract.d.ts +24 -0
  87. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  88. package/dist/modules/audit/audit.contract.js.map +1 -1
  89. package/dist/modules/audit/index.d.ts +1 -0
  90. package/dist/modules/audit/index.d.ts.map +1 -1
  91. package/dist/modules/audit/index.js +1 -0
  92. package/dist/modules/audit/index.js.map +1 -1
  93. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  94. package/dist/modules/auth/account.routes.js +10 -3
  95. package/dist/modules/auth/account.routes.js.map +1 -1
  96. package/dist/modules/auth/auth.middleware.d.ts +7 -0
  97. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  98. package/dist/modules/auth/auth.middleware.js +1 -1
  99. package/dist/modules/auth/auth.middleware.js.map +1 -1
  100. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  101. package/dist/modules/code-mode/code-mode.tool.js +11 -3
  102. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  103. package/dist/modules/database/core-schema.d.ts +96 -0
  104. package/dist/modules/database/core-schema.d.ts.map +1 -1
  105. package/dist/modules/database/core-schema.js +32 -3
  106. package/dist/modules/database/core-schema.js.map +1 -1
  107. package/dist/modules/embed/account-link.service.d.ts +42 -0
  108. package/dist/modules/embed/account-link.service.d.ts.map +1 -0
  109. package/dist/modules/embed/account-link.service.js +50 -0
  110. package/dist/modules/embed/account-link.service.js.map +1 -0
  111. package/dist/modules/embed/embed-link.d.ts +58 -0
  112. package/dist/modules/embed/embed-link.d.ts.map +1 -0
  113. package/dist/modules/embed/embed-link.js +160 -0
  114. package/dist/modules/embed/embed-link.js.map +1 -0
  115. package/dist/modules/embed/embed.errors.d.ts +30 -0
  116. package/dist/modules/embed/embed.errors.d.ts.map +1 -0
  117. package/dist/modules/embed/embed.errors.js +42 -0
  118. package/dist/modules/embed/embed.errors.js.map +1 -0
  119. package/dist/modules/embed/embed.interface.d.ts +204 -0
  120. package/dist/modules/embed/embed.interface.d.ts.map +1 -0
  121. package/dist/modules/embed/embed.interface.js +2 -0
  122. package/dist/modules/embed/embed.interface.js.map +1 -0
  123. package/dist/modules/embed/embed.routes.d.ts +59 -0
  124. package/dist/modules/embed/embed.routes.d.ts.map +1 -0
  125. package/dist/modules/embed/embed.routes.js +343 -0
  126. package/dist/modules/embed/embed.routes.js.map +1 -0
  127. package/dist/modules/embed/embed.service.d.ts +169 -0
  128. package/dist/modules/embed/embed.service.d.ts.map +1 -0
  129. package/dist/modules/embed/embed.service.js +627 -0
  130. package/dist/modules/embed/embed.service.js.map +1 -0
  131. package/dist/modules/embed/embed.tools.d.ts +51 -0
  132. package/dist/modules/embed/embed.tools.d.ts.map +1 -0
  133. package/dist/modules/embed/embed.tools.js +170 -0
  134. package/dist/modules/embed/embed.tools.js.map +1 -0
  135. package/dist/modules/embed/mcp-app.d.ts +64 -0
  136. package/dist/modules/embed/mcp-app.d.ts.map +1 -0
  137. package/dist/modules/embed/mcp-app.js +147 -0
  138. package/dist/modules/embed/mcp-app.js.map +1 -0
  139. package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
  140. package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
  141. package/dist/modules/embed/mcp-app.routes.js +36 -0
  142. package/dist/modules/embed/mcp-app.routes.js.map +1 -0
  143. package/dist/modules/github-app/github-app.connection.d.ts +15 -0
  144. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  145. package/dist/modules/github-app/github-app.connection.js +34 -3
  146. package/dist/modules/github-app/github-app.connection.js.map +1 -1
  147. package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
  148. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  149. package/dist/modules/kb-fs/locking-filesystem.js +300 -0
  150. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  151. package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
  152. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  153. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  154. package/dist/modules/kb-sync/kb-sync.service.js +6 -0
  155. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  156. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  157. package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
  158. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  159. package/dist/modules/mcp/mcp.service.d.ts +57 -3
  160. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  161. package/dist/modules/mcp/mcp.service.js +177 -24
  162. package/dist/modules/mcp/mcp.service.js.map +1 -1
  163. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
  164. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  165. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
  166. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  167. package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
  168. package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
  169. package/dist/modules/mcp/tool-schema-guard.js +171 -0
  170. package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
  171. package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
  172. package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
  173. package/dist/modules/onboarding/onboarding.contract.js +7 -0
  174. package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
  175. package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
  176. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
  177. package/dist/modules/onboarding/onboarding.routes.js +81 -0
  178. package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
  179. package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
  180. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
  181. package/dist/modules/onboarding/starter-pack.service.js +492 -0
  182. package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
  183. package/dist/modules/onboarding/starter-packs.d.ts +78 -0
  184. package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
  185. package/dist/modules/onboarding/starter-packs.js +156 -0
  186. package/dist/modules/onboarding/starter-packs.js.map +1 -0
  187. package/dist/modules/plugins/index.d.ts +1 -1
  188. package/dist/modules/plugins/index.d.ts.map +1 -1
  189. package/dist/modules/plugins/index.js +1 -1
  190. package/dist/modules/plugins/index.js.map +1 -1
  191. package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
  192. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  193. package/dist/modules/plugins/plugin-provision.service.js +18 -1
  194. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  195. package/dist/modules/plugins/plugins.routes.d.ts +0 -36
  196. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  197. package/dist/modules/plugins/plugins.routes.js +31 -0
  198. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  199. package/dist/modules/plugins/plugins.tools.d.ts +36 -2
  200. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  201. package/dist/modules/plugins/plugins.tools.js +71 -14
  202. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  203. package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
  204. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  205. package/dist/modules/settings/deployment-settings.service.js +148 -54
  206. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  207. package/dist/modules/settings/repository-source.d.ts +1 -0
  208. package/dist/modules/settings/repository-source.d.ts.map +1 -1
  209. package/dist/modules/settings/repository-source.js +3 -3
  210. package/dist/modules/settings/repository-source.js.map +1 -1
  211. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  212. package/dist/modules/settings/setup.routes.js +3 -6
  213. package/dist/modules/settings/setup.routes.js.map +1 -1
  214. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  215. package/dist/modules/skills/skills.tools.js +103 -43
  216. package/dist/modules/skills/skills.tools.js.map +1 -1
  217. package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
  218. package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
  219. package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
  220. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  221. package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
  222. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  223. package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
  224. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  225. package/dist/modules/tool-auth/external-api-key.service.js +59 -2
  226. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  227. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  228. package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
  229. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  230. package/dist/modules/tool-helpers/index.d.ts +28 -1
  231. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  232. package/dist/modules/tool-helpers/index.js +28 -1
  233. package/dist/modules/tool-helpers/index.js.map +1 -1
  234. package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
  235. package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
  236. package/dist/modules/tool-helpers/route-argument-check.js +132 -0
  237. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
  238. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
  239. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
  240. package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
  241. package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
  242. package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
  243. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  244. package/dist/modules/tool-helpers/tool-def.js +70 -6
  245. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  246. package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
  247. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  248. package/dist/modules/tool-helpers/tool-handler.js +157 -8
  249. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  250. package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
  251. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  252. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  253. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
  254. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  255. package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
  256. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
  257. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  258. package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
  259. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  260. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
  261. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  262. package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
  263. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  264. package/dist/modules/tool-registry/description-length.d.ts +20 -16
  265. package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
  266. package/dist/modules/tool-registry/description-length.js +50 -30
  267. package/dist/modules/tool-registry/description-length.js.map +1 -1
  268. package/dist/modules/tool-registry/guide-first.d.ts +27 -0
  269. package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
  270. package/dist/modules/tool-registry/guide-first.js +40 -0
  271. package/dist/modules/tool-registry/guide-first.js.map +1 -0
  272. package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
  273. package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
  274. package/dist/modules/tool-registry/tool-registry.js +9 -2
  275. package/dist/modules/tool-registry/tool-registry.js.map +1 -1
  276. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
  277. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
  278. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
  279. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
  280. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
  281. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
  282. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
  283. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
  284. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
  285. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  286. package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
  287. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  288. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
  289. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  290. package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
  291. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  292. package/dist/modules/workflow/file-lock.service.d.ts +29 -5
  293. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  294. package/dist/modules/workflow/file-lock.service.js +62 -5
  295. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  296. package/dist/modules/workflow/git/git.service.d.ts +282 -14
  297. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  298. package/dist/modules/workflow/git/git.service.js +627 -126
  299. package/dist/modules/workflow/git/git.service.js.map +1 -1
  300. package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
  301. package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
  302. package/dist/modules/workflow/git/merge-commit.js +89 -0
  303. package/dist/modules/workflow/git/merge-commit.js.map +1 -0
  304. package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
  305. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  306. package/dist/modules/workflow/git/node-git-runner.js +78 -6
  307. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  308. package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
  309. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  310. package/dist/modules/workflow/git/pull-request.service.js +332 -37
  311. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  312. package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
  313. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  314. package/dist/modules/workflow/pending-commits.service.js +25 -1
  315. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  316. package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
  317. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
  318. package/dist/modules/workflow/pending-commits.worker.js +23 -6
  319. package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
  320. package/dist/modules/workflow/recovery-bot.js +1 -1
  321. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  322. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
  323. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  324. package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
  325. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  326. package/dist/modules/workflow/sanitize-error.d.ts +16 -0
  327. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
  328. package/dist/modules/workflow/sanitize-error.js +45 -0
  329. package/dist/modules/workflow/sanitize-error.js.map +1 -1
  330. package/dist/modules/workflow/workflow.routes.d.ts +6 -2
  331. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  332. package/dist/modules/workflow/workflow.routes.js +7 -2
  333. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  334. package/dist/modules/workflow/workflow.service.d.ts +187 -15
  335. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  336. package/dist/modules/workflow/workflow.service.js +808 -106
  337. package/dist/modules/workflow/workflow.service.js.map +1 -1
  338. package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
  339. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
  340. package/dist/modules/workspace/agent-download.builder.js +238 -0
  341. package/dist/modules/workspace/agent-download.builder.js.map +1 -0
  342. package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
  343. package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
  344. package/dist/modules/workspace/agent-download.routes.js +156 -0
  345. package/dist/modules/workspace/agent-download.routes.js.map +1 -0
  346. package/dist/modules/workspace/agent-download.store.d.ts +225 -0
  347. package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
  348. package/dist/modules/workspace/agent-download.store.js +423 -0
  349. package/dist/modules/workspace/agent-download.store.js.map +1 -0
  350. package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
  351. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  352. package/dist/modules/workspace/agent-upload.store.js +16 -6
  353. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  354. package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
  355. package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
  356. package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
  357. package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
  358. package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
  359. package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
  360. package/dist/modules/workspace/file-readers/text-reader.js +5 -8
  361. package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
  362. package/dist/modules/workspace/first-run.d.ts +111 -0
  363. package/dist/modules/workspace/first-run.d.ts.map +1 -0
  364. package/dist/modules/workspace/first-run.js +181 -0
  365. package/dist/modules/workspace/first-run.js.map +1 -0
  366. package/dist/modules/workspace/move-links.d.ts +92 -0
  367. package/dist/modules/workspace/move-links.d.ts.map +1 -0
  368. package/dist/modules/workspace/move-links.js +173 -0
  369. package/dist/modules/workspace/move-links.js.map +1 -0
  370. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  371. package/dist/modules/workspace/startup/steps/seed-tree.js +24 -39
  372. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  373. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
  374. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  375. package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
  376. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  377. package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
  378. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  379. package/dist/modules/workspace/startup/steps/template-source.js +5 -3
  380. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  381. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  382. package/dist/modules/workspace/workspace.routes.js +63 -22
  383. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  384. package/dist/modules/workspace/workspace.service.d.ts +75 -2
  385. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  386. package/dist/modules/workspace/workspace.service.js +197 -24
  387. package/dist/modules/workspace/workspace.service.js.map +1 -1
  388. package/dist/modules/workspace/workspace.tools.d.ts +68 -1
  389. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  390. package/dist/modules/workspace/workspace.tools.js +642 -71
  391. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  392. package/dist/modules/write-access/write-access.d.ts.map +1 -1
  393. package/dist/modules/write-access/write-access.js +9 -0
  394. package/dist/modules/write-access/write-access.js.map +1 -1
  395. package/dist/shared/domain-errors.d.ts +84 -1
  396. package/dist/shared/domain-errors.d.ts.map +1 -1
  397. package/dist/shared/domain-errors.js +100 -12
  398. package/dist/shared/domain-errors.js.map +1 -1
  399. package/dist/shared/git.contract.d.ts +10 -1
  400. package/dist/shared/git.contract.d.ts.map +1 -1
  401. package/dist/shared/git.contract.js.map +1 -1
  402. package/dist/shared/hidden-tools.d.ts +44 -0
  403. package/dist/shared/hidden-tools.d.ts.map +1 -0
  404. package/dist/shared/hidden-tools.js +13 -0
  405. package/dist/shared/hidden-tools.js.map +1 -0
  406. package/dist/shared/utf8-text.d.ts +15 -0
  407. package/dist/shared/utf8-text.d.ts.map +1 -0
  408. package/dist/shared/utf8-text.js +20 -0
  409. package/dist/shared/utf8-text.js.map +1 -0
  410. package/dist/tenancy/static-tenant-source.d.ts +2 -1
  411. package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
  412. package/dist/tenancy/static-tenant-source.js +9 -2
  413. package/dist/tenancy/static-tenant-source.js.map +1 -1
  414. package/kb-template/.bevelignore +0 -5
  415. package/mcp-app/page.html +349 -0
  416. package/migrations/0017_atlassian_account_links.sql +37 -0
  417. package/migrations/meta/0017_snapshot.json +2396 -0
  418. package/migrations/meta/_journal.json +8 -1
  419. package/package.json +6 -3
  420. package/src/__tests__/kb-layout-config.test.ts +10 -100
  421. package/src/__tests__/packaged-assets-ship.test.ts +66 -0
  422. package/src/assets.ts +38 -2
  423. package/src/core/__tests__/catalog-revision.test.ts +40 -0
  424. package/src/core/__tests__/gated-boot.test.ts +1 -0
  425. package/src/core/__tests__/lifecycle.test.ts +14 -0
  426. package/src/core/catalog-revision.ts +15 -2
  427. package/src/core/core-ports.ts +11 -0
  428. package/src/core/create-core-server.ts +78 -3
  429. package/src/core/create-core-services.ts +168 -10
  430. package/src/core/lifecycle.ts +28 -2
  431. package/src/core-config.ts +24 -1
  432. package/src/index.ts +2 -2
  433. package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
  434. package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
  435. package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
  436. package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
  437. package/src/modules/access/access-control.interface.ts +28 -0
  438. package/src/modules/access/access-control.service.ts +37 -0
  439. package/src/modules/access/directory-sync-bot.ts +1 -1
  440. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
  441. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
  442. package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
  443. package/src/modules/agent-guide/agent-guide.ts +300 -0
  444. package/src/modules/agent-guide/index.ts +22 -0
  445. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
  446. package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
  447. package/src/modules/agent-instructions/compose.ts +26 -8
  448. package/src/modules/agent-instructions/index.ts +0 -3
  449. package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
  450. package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
  451. package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
  452. package/src/modules/audit/agent-audit.service.ts +58 -3
  453. package/src/modules/audit/agent-connection.routes.ts +56 -0
  454. package/src/modules/audit/audit.contract.ts +26 -0
  455. package/src/modules/audit/index.ts +1 -0
  456. package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
  457. package/src/modules/auth/account.routes.ts +10 -3
  458. package/src/modules/auth/auth.middleware.ts +1 -1
  459. package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
  460. package/src/modules/code-mode/code-mode.tool.ts +13 -2
  461. package/src/modules/database/core-schema.ts +33 -3
  462. package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
  463. package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
  464. package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
  465. package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
  466. package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
  467. package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
  468. package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
  469. package/src/modules/embed/account-link.service.ts +76 -0
  470. package/src/modules/embed/embed-link.ts +180 -0
  471. package/src/modules/embed/embed.errors.ts +43 -0
  472. package/src/modules/embed/embed.interface.ts +203 -0
  473. package/src/modules/embed/embed.routes.ts +363 -0
  474. package/src/modules/embed/embed.service.ts +705 -0
  475. package/src/modules/embed/embed.tools.ts +206 -0
  476. package/src/modules/embed/mcp-app.routes.ts +41 -0
  477. package/src/modules/embed/mcp-app.ts +173 -0
  478. package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
  479. package/src/modules/github-app/github-app.connection.ts +38 -4
  480. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
  481. package/src/modules/kb-fs/locking-filesystem.ts +287 -0
  482. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
  483. package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
  484. package/src/modules/kb-sync/kb-sync.service.ts +6 -0
  485. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
  486. package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
  487. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
  488. package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
  489. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
  490. package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
  491. package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
  492. package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
  493. package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
  494. package/src/modules/mcp/mcp.service.ts +218 -31
  495. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
  496. package/src/modules/mcp/tool-schema-guard.ts +196 -0
  497. package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
  498. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
  499. package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
  500. package/src/modules/onboarding/onboarding.contract.ts +85 -0
  501. package/src/modules/onboarding/onboarding.routes.ts +85 -0
  502. package/src/modules/onboarding/starter-pack.service.ts +580 -0
  503. package/src/modules/onboarding/starter-packs.ts +182 -0
  504. package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
  505. package/src/modules/plugins/index.ts +1 -0
  506. package/src/modules/plugins/plugin-provision.service.ts +22 -1
  507. package/src/modules/plugins/plugins.routes.ts +29 -0
  508. package/src/modules/plugins/plugins.tools.ts +75 -15
  509. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
  510. package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
  511. package/src/modules/settings/deployment-settings.service.ts +144 -55
  512. package/src/modules/settings/repository-source.ts +4 -4
  513. package/src/modules/settings/setup.routes.ts +3 -6
  514. package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
  515. package/src/modules/skills/skills.tools.ts +112 -46
  516. package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
  517. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
  518. package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
  519. package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
  520. package/src/modules/tool-auth/external-api-key.service.ts +61 -4
  521. package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
  522. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
  523. package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
  524. package/src/modules/tool-helpers/index.ts +34 -1
  525. package/src/modules/tool-helpers/route-argument-check.ts +149 -0
  526. package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
  527. package/src/modules/tool-helpers/tool-def.ts +132 -7
  528. package/src/modules/tool-helpers/tool-handler.ts +196 -8
  529. package/src/modules/tool-helpers/tool.contract.ts +9 -0
  530. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
  531. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
  532. package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
  533. package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
  534. package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
  535. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
  536. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
  537. package/src/modules/tool-registry/description-length.ts +57 -32
  538. package/src/modules/tool-registry/guide-first.ts +41 -0
  539. package/src/modules/tool-registry/tool-registry.ts +9 -2
  540. package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
  541. package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
  542. package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
  543. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
  544. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
  545. package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
  546. package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
  547. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
  548. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
  549. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
  550. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
  551. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
  552. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
  553. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
  554. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
  555. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
  556. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
  557. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
  558. package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
  559. package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
  560. package/src/modules/workflow/file-lock.service.ts +67 -5
  561. package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
  562. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
  563. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
  564. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
  565. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
  566. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
  567. package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
  568. package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
  569. package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
  570. package/src/modules/workflow/git/git.service.ts +714 -133
  571. package/src/modules/workflow/git/merge-commit.ts +88 -0
  572. package/src/modules/workflow/git/node-git-runner.ts +82 -7
  573. package/src/modules/workflow/git/pull-request.service.ts +380 -54
  574. package/src/modules/workflow/pending-commits.service.ts +29 -1
  575. package/src/modules/workflow/pending-commits.worker.ts +24 -6
  576. package/src/modules/workflow/recovery-bot.ts +1 -1
  577. package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
  578. package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
  579. package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
  580. package/src/modules/workflow/sanitize-error.ts +50 -0
  581. package/src/modules/workflow/workflow.routes.ts +7 -2
  582. package/src/modules/workflow/workflow.service.ts +886 -112
  583. package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
  584. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
  585. package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
  586. package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
  587. package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
  588. package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
  589. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
  590. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
  591. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
  592. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
  593. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
  594. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
  595. package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
  596. package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
  597. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
  598. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
  599. package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
  600. package/src/modules/workspace/agent-download.builder.ts +308 -0
  601. package/src/modules/workspace/agent-download.routes.ts +183 -0
  602. package/src/modules/workspace/agent-download.store.ts +533 -0
  603. package/src/modules/workspace/agent-upload.store.ts +23 -7
  604. package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
  605. package/src/modules/workspace/file-readers/text-reader.ts +5 -8
  606. package/src/modules/workspace/first-run.ts +222 -0
  607. package/src/modules/workspace/move-links.ts +237 -0
  608. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
  609. package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
  610. package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
  611. package/src/modules/workspace/startup/steps/template-source.ts +5 -3
  612. package/src/modules/workspace/workspace.routes.ts +64 -22
  613. package/src/modules/workspace/workspace.service.ts +202 -25
  614. package/src/modules/workspace/workspace.tools.ts +707 -68
  615. package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
  616. package/src/modules/write-access/write-access.ts +9 -0
  617. package/src/shared/domain-errors.ts +123 -11
  618. package/src/shared/git.contract.ts +8 -1
  619. package/src/shared/hidden-tools.ts +45 -0
  620. package/src/shared/utf8-text.ts +21 -0
  621. package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
  622. package/src/tenancy/static-tenant-source.ts +10 -2
  623. package/starter-packs/README.md +103 -0
  624. package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
  625. package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
  626. package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
  627. package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
  628. package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
  629. package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
  630. package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
  631. package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
  632. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
  633. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
  634. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
  635. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
  636. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
  637. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
  638. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
  639. package/starter-packs/engineering/pack.yaml +11 -0
  640. package/starter-packs/general/KnowledgeBase/About us.md +9 -0
  641. package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
  642. package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
  643. package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
  644. package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
  645. package/starter-packs/general/Plugins/general-starter/access.md +19 -0
  646. package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
  647. package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
  648. package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
  649. package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
  650. package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
  651. package/starter-packs/general/pack.yaml +10 -0
  652. package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
  653. package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
  654. package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
  655. package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
  656. package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
  657. package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
  658. package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
  659. package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
  660. package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
  661. package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
  662. package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
  663. package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
  664. package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
  665. package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
  666. package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
  667. package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
  668. package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
  669. package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
  670. package/starter-packs/operations/pack.yaml +12 -0
  671. package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
  672. package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
  673. package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
  674. package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
  675. package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
  676. package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
  677. package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
  678. package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
  679. package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
  680. package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
  681. package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
  682. package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
  683. package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
  684. package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
  685. package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
  686. package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
  687. package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
  688. package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
  689. package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
  690. package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
  691. package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
  692. package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
  693. package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
  694. package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
  695. package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
  696. package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
  697. package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
  698. package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
  699. package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
  700. package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
  701. package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
  702. package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
  703. package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
  704. package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
  705. package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
  706. package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
  707. package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
  708. package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
  709. package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
  710. package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
  711. package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
  712. package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
  713. package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
  714. package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
  715. package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
  716. package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
  717. package/starter-packs/sales/pack.yaml +13 -0
  718. package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
  719. package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
  720. package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
  721. package/starter-packs/support/KnowledgeBase/Products.md +9 -0
  722. package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
  723. package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
  724. package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
  725. package/starter-packs/support/Plugins/support-starter/access.md +19 -0
  726. package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
  727. package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
  728. package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
  729. package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
  730. package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
  731. package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
  732. package/starter-packs/support/pack.yaml +12 -0
  733. package/kb-template/AGENTS.md +0 -730
@@ -0,0 +1,113 @@
1
+ import { logger } from '../../shared/logging.js';
2
+ const log = logger('tools');
3
+ /**
4
+ * What every route-hosted tool declared, by the last segment of its route and
5
+ * then by the whole route. Process-wide, because the declarations are made by
6
+ * CODE — a module's or a deployment's `toolDef` — which is the same for every
7
+ * tenant a process serves: two tenants mount the same tools with the same
8
+ * arguments. A route re-declared with DIFFERENT arguments would break that, so
9
+ * it is logged (once per route) rather than passing silently.
10
+ */
11
+ const byLastSegment = new Map();
12
+ /** Tool name → its declaration. */
13
+ const byName = new Map();
14
+ /** Routes already reported as re-declared with other arguments. */
15
+ const conflicting = new Set();
16
+ /** A route path as declarations and requests are compared: no query, no trailing slash. */
17
+ function normalizePath(path) {
18
+ const withoutQuery = path.split('?')[0] ?? '';
19
+ return withoutQuery.length > 1 ? withoutQuery.replace(/\/+$/, '') : withoutQuery;
20
+ }
21
+ /** Does this flat input schema require any argument at all? */
22
+ function requiresAnything(inputs) {
23
+ const required = inputs.required;
24
+ return Array.isArray(required) && required.length > 0;
25
+ }
26
+ /**
27
+ * The flat inputs inside the `body` envelope every module-hosted tool advertises
28
+ * — the only standard-http way to ride multiple fields in a JSON body.
29
+ *
30
+ * The envelope is required only when something inside it is. A tool whose flat
31
+ * inputs are all optional is legitimately called as `Bevel.<name>({})` — agents
32
+ * have always called `list_branches` and `start_session` that way, and the
33
+ * endpoint reads `req.body` as `{}` either way — so declaring `body` required
34
+ * would make the schema disagree with the tool, and a check must never refuse a
35
+ * call the tool accepts.
36
+ */
37
+ export function bodyEnvelope(inputs) {
38
+ return {
39
+ type: 'object',
40
+ properties: { body: inputs },
41
+ ...(requiresAnything(inputs) ? { required: ['body'] } : {}),
42
+ additionalProperties: false,
43
+ };
44
+ }
45
+ /**
46
+ * Record what the route-hosted tool `name` takes, and answer with the wire
47
+ * schema its def must advertise.
48
+ *
49
+ * `toolDef` calls this for every tool it builds, so declaring a tool IS
50
+ * declaring its arguments to the check. A module that builds its def lazily
51
+ * (the skill tools rebuild theirs per catalog listing, to name the skills that
52
+ * exist now) calls it once at registration as well, so a direct REST call that
53
+ * lands before the first catalog listing is checked too.
54
+ *
55
+ * Idempotent in effect: a tool whose def is rebuilt re-declares the same
56
+ * arguments, and the last declaration for a name is the one in force.
57
+ */
58
+ export function declareRouteTool(name, inputs, refusesItself = [], path = `/api/agent/tools/${name}`) {
59
+ const wire = bodyEnvelope(inputs);
60
+ if (!name)
61
+ return wire;
62
+ const route = normalizePath(path);
63
+ const entry = { name, path: route, flat: inputs, wire, refusesItself: new Set(refusesItself) };
64
+ const segment = routeToolName(route);
65
+ const same = (byLastSegment.get(segment) ?? []).filter((e) => e.path !== route);
66
+ const previous = (byLastSegment.get(segment) ?? []).find((e) => e.path === route);
67
+ if (previous && !conflicting.has(route) && JSON.stringify(previous.flat) !== JSON.stringify(inputs)) {
68
+ conflicting.add(route);
69
+ log.warn(`the route "${route}" was declared again with other arguments; calls are checked against the latest.`);
70
+ }
71
+ byLastSegment.set(segment, [...same, entry]);
72
+ byName.set(name, entry);
73
+ return wire;
74
+ }
75
+ /** What the tool named `name` takes, or `undefined` when nothing declared it. */
76
+ export function routeToolSchemas(name) {
77
+ return byName.get(name);
78
+ }
79
+ /**
80
+ * What the tool hosted at the route a request arrived on takes, or
81
+ * `undefined` when no tool is declared there. `requestPath` is the request's
82
+ * WHOLE path (`req.originalUrl`): it ends with the declared route whatever
83
+ * the app is mounted under — a tenant's loopback prefix included.
84
+ */
85
+ export function routeToolSchemasForRequest(requestPath) {
86
+ const path = normalizePath(requestPath);
87
+ const candidates = byLastSegment.get(routeToolName(path)) ?? [];
88
+ // The route that fits the request BEST wins, not the first one declared: an
89
+ // exact match, then the longest declared route the path ends with, so
90
+ // `/api/foo` is never checked against a `/foo` declared before it. A path
91
+ // shorter than every declaration (a test mounting a route bare) comes last.
92
+ const exact = candidates.find((e) => path === e.path);
93
+ if (exact)
94
+ return exact;
95
+ const longest = (list) => [...list].sort((a, b) => b.path.length - a.path.length)[0];
96
+ return (longest(candidates.filter((e) => path.endsWith(e.path))) ??
97
+ longest(candidates.filter((e) => e.path.endsWith(path))));
98
+ }
99
+ /**
100
+ * The tool a request to `/api/agent/tools/<name>` is for: the last segment of
101
+ * the path, query and trailing slash left out.
102
+ *
103
+ * Read off the path rather than taken as a parameter, because the path is the
104
+ * only thing every mounting style agrees on — the modules mount their routes on
105
+ * a router at `/api`, the tests mount theirs wherever they like, and a
106
+ * deployment mounts its own.
107
+ */
108
+ export function routeToolName(path) {
109
+ const withoutQuery = path.split('?')[0] ?? '';
110
+ const segments = withoutQuery.split('/').filter((s) => s.length > 0);
111
+ return segments[segments.length - 1] ?? '';
112
+ }
113
+ //# sourceMappingURL=route-tool-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-tool-schemas.js","sourceRoot":"","sources":["../../../src/modules/tool-helpers/route-tool-schemas.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,52 @@ import type { JsonSchema, UtcpTool } from '../tool-registry/tool.contract.js';
7
7
  * comes from this argument.
8
8
  */
9
9
  export declare const BRANCH_INPUT: JsonSchema;
10
+ /**
11
+ * The optional `branch` of a tool that declares `defaults-to-default-branch`:
12
+ * the same input, saying what happens without it.
13
+ */
14
+ export declare const DEFAULTED_BRANCH_INPUT: JsonSchema;
15
+ /**
16
+ * How a tool treats its `branch` input — the declaration the tool handler
17
+ * resolves the branch from, once, before the tool runs:
18
+ *
19
+ * - `required`: the call must name a branch. A call without one, or with an
20
+ * empty or non-string one, is refused with the `branch-required` refusal
21
+ * and the tool does not run. The default for a tool whose inputs require
22
+ * `branch`.
23
+ * - `defaults-to-default-branch`: a call without a branch runs on the
24
+ * deployment's default branch, and an object answer without a `branch`
25
+ * field gets one naming it. An empty or non-string branch is still refused:
26
+ * only an ABSENT one is defaulted. Read-only tools only — a writing tool
27
+ * declaring it fails at startup, since its write would land on the default
28
+ * branch without the caller having named it.
29
+ *
30
+ * A tool that declares neither, and whose inputs have no `branch`, takes no
31
+ * branch.
32
+ *
33
+ * Under both declarations a branch that is given must exist: one that does not
34
+ * is answered 404 naming it, before the tool runs. The tool reads the resolved
35
+ * name from `ctx.branch` — or from `args.branch`, which the handler overwrites
36
+ * with it — and never sees a missing, empty or non-string one.
37
+ */
38
+ export type BranchDeclaration = 'required' | 'defaults-to-default-branch';
39
+ /**
40
+ * What the tool handler does with a call's `branch`: a {@link BranchDeclaration},
41
+ * `none` for a tool that takes no branch, or `own` for a tool with an OPTIONAL
42
+ * `branch` and no declaration (the platform's skill tools, `list_tool_setup`)
43
+ * — such a tool keeps its own handling of an absent branch, and gets only the
44
+ * 404 for a named branch that does not exist.
45
+ */
46
+ export type BranchHandling = BranchDeclaration | 'none' | 'own';
47
+ /** How the tool hosted at `path` treats its branch; `undefined` for a route no `toolDef` described. */
48
+ export declare function branchHandlingFor(path: string): BranchHandling | undefined;
49
+ /**
50
+ * The input schema with `branch` as `declaration` says: required, or optional
51
+ * with the sentence about the default. A tool that declares its own `branch`
52
+ * property with its own meaning (a fork base, a switch target) keeps that
53
+ * property under `required`.
54
+ */
55
+ export declare function withBranchDeclaration(inputs: JsonSchema, declaration: BranchDeclaration): JsonSchema;
10
56
  /** Add a required `branch` property to an object input schema (KB tools). */
11
57
  export declare function withBranchInput(inputs: JsonSchema): JsonSchema;
12
58
  export interface ToolDefSpec {
@@ -19,6 +65,26 @@ export interface ToolDefSpec {
19
65
  tags?: string[];
20
66
  /** The route the owning module hosts, e.g. `/agent/tools/list_branches`. */
21
67
  path: string;
68
+ /**
69
+ * Arguments this tool's own handler refuses by name, with a message of its
70
+ * own. The generic argument check its route runs then says nothing about
71
+ * them, so that message is what the caller reads — which is the point of
72
+ * having written it. A missing `branch` needs no entry here: the route
73
+ * check leaves a call that names no branch to `branch-required`.
74
+ */
75
+ refusesItself?: string[];
76
+ /**
77
+ * How the tool treats `branch` — see {@link BranchDeclaration}. Given, the
78
+ * `branch` input is added to `inputs` to match. Omitted, a tool whose
79
+ * `inputs` require `branch` is `required`, and one without `branch` takes
80
+ * no branch.
81
+ */
82
+ branch?: BranchDeclaration;
83
+ /**
84
+ * The tool writes. A `write` tag says the same. A writing tool cannot
85
+ * declare `defaults-to-default-branch`.
86
+ */
87
+ write?: boolean;
22
88
  }
23
89
  /**
24
90
  * Build a self-describing UTCP `Tool` def for a module-hosted endpoint. The flat
@@ -28,6 +94,11 @@ export interface ToolDefSpec {
28
94
  * as the flat args. The URL + bearer are `${API_URL}` / `${CONNECTION_KEY}`
29
95
  * placeholders the consumer resolves (public URL + key for external; loopback +
30
96
  * internal token for our agent), so one def serves both surfaces.
97
+ *
98
+ * Also records the tool's branch handling for its route, which is what the
99
+ * tool handler mounted on that route resolves the branch from. Throws — at
100
+ * startup, where defs are built — for a writing tool that declares
101
+ * `defaults-to-default-branch`.
31
102
  */
32
103
  export declare function toolDef(spec: ToolDefSpec): UtcpTool;
33
104
  //# sourceMappingURL=tool-def.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-def.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-def.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAK9E;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,UAI1B,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAO9D;AAED,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAqBnD"}
1
+ {"version":3,"file":"tool-def.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-def.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAM9E;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,UAI1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,UAMpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,4BAA4B,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,MAAM,GAAG,KAAK,CAAC;AAWhE,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1E;AAWD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,GAAG,UAAU,CAapG;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAO9D;AAED,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CA8BnD"}
@@ -1,6 +1,7 @@
1
1
  import '@utcp/http';
2
2
  import { HttpCallTemplateSerializer } from '@utcp/http';
3
3
  import { ToolSerializer } from '@utcp/sdk';
4
+ import { declareRouteTool } from './route-tool-schemas.js';
4
5
  const httpTemplate = new HttpCallTemplateSerializer();
5
6
  const toolSerializer = new ToolSerializer();
6
7
  /**
@@ -14,6 +15,57 @@ export const BRANCH_INPUT = {
14
15
  minLength: 1,
15
16
  description: 'The branch (draft) whose workspace this operates on — pass the branch you are currently working on.',
16
17
  };
18
+ /**
19
+ * The optional `branch` of a tool that declares `defaults-to-default-branch`:
20
+ * the same input, saying what happens without it.
21
+ */
22
+ export const DEFAULTED_BRANCH_INPUT = {
23
+ type: 'string',
24
+ minLength: 1,
25
+ description: "Optional: the branch (draft) to read. Without it the call runs on the deployment's default branch, " +
26
+ "and the answer's `branch` field names that branch.",
27
+ };
28
+ /**
29
+ * Every route path a `toolDef` was built for, with how its branch is handled.
30
+ * Kept here rather than on the registry so the tool handler finds a tool's
31
+ * declaration from its route alone: a deployment's tool is covered by building
32
+ * its def with `toolDef` and mounting its route with `toolHandler`, as it
33
+ * already does, with nothing in between to keep in step.
34
+ */
35
+ const branchHandlingByPath = new Map();
36
+ /** How the tool hosted at `path` treats its branch; `undefined` for a route no `toolDef` described. */
37
+ export function branchHandlingFor(path) {
38
+ return branchHandlingByPath.get(path);
39
+ }
40
+ /** A tool's branch handling read off inputs that carry no declaration. */
41
+ function inferBranchHandling(inputs) {
42
+ const o = inputs;
43
+ if ((o.required ?? []).includes('branch'))
44
+ return 'required';
45
+ return o.properties && 'branch' in o.properties ? 'own' : 'none';
46
+ }
47
+ /**
48
+ * The input schema with `branch` as `declaration` says: required, or optional
49
+ * with the sentence about the default. A tool that declares its own `branch`
50
+ * property with its own meaning (a fork base, a switch target) keeps that
51
+ * property under `required`.
52
+ */
53
+ export function withBranchDeclaration(inputs, declaration) {
54
+ const o = inputs;
55
+ const properties = { ...(o.properties ?? {}) };
56
+ const others = (o.required ?? []).filter((r) => r !== 'branch');
57
+ if (declaration === 'required') {
58
+ properties.branch = properties.branch ?? BRANCH_INPUT;
59
+ return { ...inputs, properties, required: [...others, 'branch'] };
60
+ }
61
+ properties.branch = DEFAULTED_BRANCH_INPUT;
62
+ const out = { ...inputs, properties };
63
+ if (others.length > 0)
64
+ out.required = others;
65
+ else
66
+ delete out.required;
67
+ return out;
68
+ }
17
69
  /** Add a required `branch` property to an object input schema (KB tools). */
18
70
  export function withBranchInput(inputs) {
19
71
  const o = inputs;
@@ -31,17 +83,29 @@ export function withBranchInput(inputs) {
31
83
  * as the flat args. The URL + bearer are `${API_URL}` / `${CONNECTION_KEY}`
32
84
  * placeholders the consumer resolves (public URL + key for external; loopback +
33
85
  * internal token for our agent), so one def serves both surfaces.
86
+ *
87
+ * Also records the tool's branch handling for its route, which is what the
88
+ * tool handler mounted on that route resolves the branch from. Throws — at
89
+ * startup, where defs are built — for a writing tool that declares
90
+ * `defaults-to-default-branch`.
34
91
  */
35
92
  export function toolDef(spec) {
93
+ if (spec.branch === 'defaults-to-default-branch' && (spec.write || (spec.tags ?? []).includes('write'))) {
94
+ throw new Error(`Tool "${spec.name}" writes, so it cannot declare branch: 'defaults-to-default-branch' — a write must ` +
95
+ "name its branch. Declare branch: 'required' instead.");
96
+ }
97
+ const inputs = spec.branch ? withBranchDeclaration(spec.inputs, spec.branch) : spec.inputs;
98
+ branchHandlingByPath.set(spec.path, spec.branch ?? inferBranchHandling(inputs));
99
+ // Declaring the tool IS declaring its arguments to the check that its route
100
+ // runs, which is why the envelope comes back from the declaration rather than
101
+ // being built here: a tool declared with this helper — the platform's own and
102
+ // a deployment's alike — refuses a call whose arguments do not match it on
103
+ // every way in, the REST route included, with no code of its own.
104
+ const wire = declareRouteTool(spec.name, inputs, spec.refusesItself, spec.path);
36
105
  return toolSerializer.validateDict({
37
106
  name: spec.name,
38
107
  description: spec.description,
39
- inputs: {
40
- type: 'object',
41
- properties: { body: spec.inputs },
42
- required: ['body'],
43
- additionalProperties: false,
44
- },
108
+ inputs: wire,
45
109
  outputs: spec.outputs ?? { type: 'object', properties: {} },
46
110
  tags: spec.tags ?? [],
47
111
  tool_call_template: httpTemplate.validateDict({
@@ -1 +1 @@
1
- {"version":3,"file":"tool-def.js","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-def.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,EAAE,CAAC;AACtD,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,qGAAqG;CACnH,CAAC;AAEF,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,MAAM,CAAC,GAAG,MAA0E,CAAC;IACrF,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE;QAC7D,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;KAC5C,CAAC;AAClB,CAAC;AAcD;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,OAAO,cAAc,CAAC,YAAY,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACjC,QAAQ,EAAE,CAAC,MAAM,CAAC;YAClB,oBAAoB,EAAE,KAAK;SAC5B;QACD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC3D,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACrB,kBAAkB,EAAE,YAAY,CAAC,YAAY,CAAC;YAC5C,kBAAkB,EAAE,MAAM;YAC1B,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE,cAAc,IAAI,CAAC,IAAI,EAAE;YAC9B,YAAY,EAAE,kBAAkB;YAChC,OAAO,EAAE,EAAE,aAAa,EAAE,0BAA0B,EAAE;YACtD,UAAU,EAAE,MAAM;SACnB,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"tool-def.js","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-def.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,60 @@
1
1
  import type { Request, Response } from 'express';
2
2
  import { type ToolHandler } from './tool.contract.js';
3
+ import { type BranchHandling } from './tool-def.js';
3
4
  import type { ResolveToolContext } from './tool-context.js';
4
5
  import { type IWriteAccess } from '../write-access/write-access.js';
5
6
  import '../tool-auth/tool-auth.middleware.js';
6
7
  export interface ToolHandlerOptions {
7
8
  /** Mutating tool — refuse read-scoped callers up front (defense in depth). */
8
9
  write?: boolean;
10
+ /**
11
+ * Refuse read-scoped callers up front WITHOUT making the tool a write: the
12
+ * read-only-deployment gate below is not applied. For a tool a read-only
13
+ * credential may not use that is nonetheless a read — `request_file_download`
14
+ * takes bytes out, so a read-only deployment must still serve it.
15
+ */
16
+ writeScope?: boolean;
17
+ /**
18
+ * How this route treats `branch`, when it must differ from what its
19
+ * `toolDef` recorded. Only `execute_command` sets it (`own`): it falls back
20
+ * to an internal caller's focused branch rather than being refused.
21
+ */
22
+ branch?: BranchHandling;
23
+ }
24
+ /**
25
+ * What the tool handler needs to know about branches, asked at call time so a
26
+ * default branch renamed in the settings is the next call's default.
27
+ */
28
+ export interface ToolBranchPort {
29
+ /** The deployment's default branch; `''` until one is configured. */
30
+ defaultBranch(): string;
31
+ /**
32
+ * True only when `branch` certainly does not exist. Creates no workspace
33
+ * and clones nothing. A name it cannot judge — malformed, or a remote it
34
+ * could not ask — is `false`: opening the branch then answers for it.
35
+ */
36
+ isMissing(branch: string): Promise<boolean>;
9
37
  }
10
38
  /**
11
39
  * Wrap a pure tool handler into an Express handler. Resolves the `ToolContext`
12
- * from `req.toolAuth` (set by `toolAuth`), enforces write-scope, runs the
13
- * handler, and serializes the result — JSON for a value, SSE for an
14
- * async-iterable (streaming). `ToolError`/`hasHttpStatus` map to HTTP status.
15
- * The handler receives `req.body` as the flat args (UTCP's `body_field` already
16
- * delivered the inner body as the request body).
40
+ * from `req.toolAuth` (set by `toolAuth`), enforces write-scope, CHECKS THE
41
+ * ARGUMENTS against what the tool declared, runs the handler, and serializes the
42
+ * result — JSON for a value, SSE for an async-iterable (streaming).
43
+ * `ToolError`/`hasHttpStatus` map to HTTP status. The handler receives
44
+ * `req.body` as the flat args (UTCP's `body_field` already delivered the inner
45
+ * body as the request body).
46
+ *
47
+ * The argument check is HERE, in the route, because the route is where every
48
+ * caller of a route-hosted tool arrives: an agent over MCP, a `call_tool_chain`
49
+ * chain, the in-process agent over loopback, and a script calling
50
+ * `POST /api/agent/tools/<name>` with a connection key. Checked one layer up,
51
+ * in the MCP dispatch, the last of those was left answering a 500 for a missing
52
+ * argument — or running: `grep` without a `pattern` matched every file. Every
53
+ * tool mounted through this factory gets it, a deployment's included, without
54
+ * saying so (see `route-argument-check.ts`).
17
55
  */
18
- export declare function createToolHandlerFactory(resolve: ResolveToolContext, writeAccess?: IWriteAccess): (handler: ToolHandler, opts?: ToolHandlerOptions) => (req: Request, res: Response) => Promise<void>;
56
+ export declare function createToolHandlerFactory(resolve: ResolveToolContext, writeAccess?: IWriteAccess,
57
+ /** Absent: no default branch to fall back on, and no existence check before the tool runs. */
58
+ branches?: ToolBranchPort): (handler: ToolHandler, opts?: ToolHandlerOptions) => (req: Request, res: Response) => Promise<void>;
19
59
  export type ToolHandlerFactory = ReturnType<typeof createToolHandlerFactory>;
20
60
  //# sourceMappingURL=tool-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-handler.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAmD,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACrH,OAAO,sCAAsC,CAAC;AAU9C,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,GAAE,YAA6B,IAClF,SAAS,WAAW,EAAE,OAAM,kBAAuB,MAC/D,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CA4F5D;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"tool-handler.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-helpers/tool-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOhF,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAmD,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACrH,OAAO,sCAAsC,CAAC;AAU9C,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,aAAa,IAAI,MAAM,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAsED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,WAAW,GAAE,YAA6B;AAC1C,8FAA8F;AAC9F,QAAQ,CAAC,EAAE,cAAc,IAEG,SAAS,WAAW,EAAE,OAAM,kBAAuB,MAE/D,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CA0J5D;AASD,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -1,8 +1,10 @@
1
1
  import { logger } from '../../shared/logging.js';
2
2
  const log = logger('tools');
3
3
  import { hasHttpStatus, ToolError } from './tool.contract.js';
4
- import { WorkflowDomainError } from '../../shared/domain-errors.js';
4
+ import { assertBranchProvided, BranchNotFoundError, DefaultBranchUnsetError, WorkflowDomainError, } from '../../shared/domain-errors.js';
5
+ import { branchHandlingFor } from './tool-def.js';
5
6
  import { domainErrorBody } from '../../shared/http-errors.js';
7
+ import { argumentsRefusal } from './route-argument-check.js';
6
8
  import { alwaysWritable, READ_ONLY_CODE, refuseWriteTool } from '../write-access/write-access.js';
7
9
  import '../tool-auth/tool-auth.middleware.js'; // Express Request.toolAuth augmentation
8
10
  function isAsyncIterable(v) {
@@ -10,16 +12,96 @@ function isAsyncIterable(v) {
10
12
  v !== null &&
11
13
  typeof v[Symbol.asyncIterator] === 'function');
12
14
  }
15
+ /**
16
+ * Refuse a branch that certainly does not exist. A fault while finding out —
17
+ * a storage error reading the workspaces root, say — is logged here in full
18
+ * and answered as a 500 that names the branch and nothing else: its message
19
+ * would carry the deployment's paths to the caller.
20
+ */
21
+ async function assertBranchExists(branch, branches) {
22
+ let missing;
23
+ try {
24
+ missing = await branches?.isMissing(branch);
25
+ }
26
+ catch (err) {
27
+ log.error('branch existence check failed:', { branch, err });
28
+ throw new ToolError(`Could not check whether branch ${branch} exists.`, 500);
29
+ }
30
+ if (missing)
31
+ throw new BranchNotFoundError(branch);
32
+ }
33
+ /**
34
+ * The branch a call runs on, from the tool's handling and the call's
35
+ * arguments — or the refusal. `defaulted` says the caller named none.
36
+ */
37
+ async function resolveBranch(handling, args, branches) {
38
+ if (handling === 'none')
39
+ return null;
40
+ const given = args.branch;
41
+ if (handling === 'own') {
42
+ // The tool reads its optional branch itself, absence and all; only a
43
+ // name it was given is ours to check, and only one that names something —
44
+ // what the tool makes of a value that does not is the tool's to answer.
45
+ if (namesSomething(given))
46
+ await assertBranchExists(given, branches);
47
+ return null;
48
+ }
49
+ // ABSENT, and only absent, is defaulted. An empty or non-string value is a
50
+ // caller that meant to name a branch and got it wrong: refused by name
51
+ // under both declarations rather than quietly read as the default.
52
+ if (handling === 'defaults-to-default-branch' && given === undefined) {
53
+ const fallback = branches?.defaultBranch() ?? '';
54
+ if (fallback.length === 0)
55
+ throw new DefaultBranchUnsetError();
56
+ return { branch: fallback, defaulted: true };
57
+ }
58
+ assertBranchProvided(given);
59
+ await assertBranchExists(given, branches);
60
+ return { branch: given, defaulted: false };
61
+ }
62
+ function namesSomething(v) {
63
+ try {
64
+ assertBranchProvided(v);
65
+ return true;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ /**
72
+ * A plain JSON object answer — the only kind a `branch` field can be added to.
73
+ * A `Date`, a class instance or an array serializes as something else, and
74
+ * spreading it into `{ branch }` would lose that answer.
75
+ */
76
+ function isPlainObject(v) {
77
+ if (typeof v !== 'object' || v === null)
78
+ return false;
79
+ const prototype = Object.getPrototypeOf(v);
80
+ return prototype === Object.prototype || prototype === null;
81
+ }
13
82
  /**
14
83
  * Wrap a pure tool handler into an Express handler. Resolves the `ToolContext`
15
- * from `req.toolAuth` (set by `toolAuth`), enforces write-scope, runs the
16
- * handler, and serializes the result — JSON for a value, SSE for an
17
- * async-iterable (streaming). `ToolError`/`hasHttpStatus` map to HTTP status.
18
- * The handler receives `req.body` as the flat args (UTCP's `body_field` already
19
- * delivered the inner body as the request body).
84
+ * from `req.toolAuth` (set by `toolAuth`), enforces write-scope, CHECKS THE
85
+ * ARGUMENTS against what the tool declared, runs the handler, and serializes the
86
+ * result — JSON for a value, SSE for an async-iterable (streaming).
87
+ * `ToolError`/`hasHttpStatus` map to HTTP status. The handler receives
88
+ * `req.body` as the flat args (UTCP's `body_field` already delivered the inner
89
+ * body as the request body).
90
+ *
91
+ * The argument check is HERE, in the route, because the route is where every
92
+ * caller of a route-hosted tool arrives: an agent over MCP, a `call_tool_chain`
93
+ * chain, the in-process agent over loopback, and a script calling
94
+ * `POST /api/agent/tools/<name>` with a connection key. Checked one layer up,
95
+ * in the MCP dispatch, the last of those was left answering a 500 for a missing
96
+ * argument — or running: `grep` without a `pattern` matched every file. Every
97
+ * tool mounted through this factory gets it, a deployment's included, without
98
+ * saying so (see `route-argument-check.ts`).
20
99
  */
21
- export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable) {
100
+ export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable,
101
+ /** Absent: no default branch to fall back on, and no existence check before the tool runs. */
102
+ branches) {
22
103
  return function toolHandler(handler, opts = {}) {
104
+ let warnedHeldToRequired = false;
23
105
  return async (req, res) => {
24
106
  const auth = req.toolAuth;
25
107
  if (!auth) {
@@ -30,6 +112,12 @@ export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable)
30
112
  res.status(403).json({ error: 'This tool requires write access.' });
31
113
  return;
32
114
  }
115
+ // About the CREDENTIAL, not the deployment: the tool is a read, and a
116
+ // read-only deployment serves it — the key used here is what may not.
117
+ if (opts.writeScope && auth.scope === 'read') {
118
+ res.status(403).json({ error: 'This tool cannot be used with a read-only credential; use a full-scope key.' });
119
+ return;
120
+ }
33
121
  // Before anything is awaited: a client that goes away during the
34
122
  // write-access check below must still abort the call.
35
123
  //
@@ -61,6 +149,18 @@ export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable)
61
149
  return;
62
150
  }
63
151
  const args = (body ?? {});
152
+ // Before the context is resolved and before the handler runs: nothing is
153
+ // read, written or sent on a call that does not match its tool. The more
154
+ // specific refusals each tool makes for itself (a missing `branch`,
155
+ // above all) are left to the handler and keep their own wording — this
156
+ // reports what the SCHEMA alone can settle.
157
+ // The WHOLE path: a module mounts its routes on a router, which sees only
158
+ // the part below its mount point.
159
+ const mismatch = argumentsRefusal(req.originalUrl, args, req.query);
160
+ if (mismatch) {
161
+ res.status(mismatch.status).json({ ...mismatch.details, error: mismatch.message });
162
+ return;
163
+ }
64
164
  // `sessionId` rides the tool body like `branch` does: the external MCP
65
165
  // proxy injects it (ask-tool continuity convention) and the in-process
66
166
  // agent passes its thread id. Surfaced on the context so the
@@ -69,8 +169,50 @@ export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable)
69
169
  ? args.sessionId
70
170
  : undefined;
71
171
  try {
172
+ // The branch is resolved HERE, once, before the tool runs: refused,
173
+ // defaulted or checked to exist, by what the tool declared — so no
174
+ // tool, the platform's or a deployment's, carries a guard of its own,
175
+ // and none can be handed a branch that is missing, empty or not a
176
+ // string. Its declaration comes from the `toolDef` built for this
177
+ // route; a route no `toolDef` described is read like an optional
178
+ // `branch` the tool handles itself.
179
+ //
180
+ // A writing route never defaults, whatever was recorded for it:
181
+ // `toolDef` refuses the declaration at startup for a tool it knows
182
+ // writes, and one only mounted as writing is held to `required` here,
183
+ // so its write cannot land on the default branch unasked. Its
184
+ // published schema still calls `branch` optional — the tool's
185
+ // declaration is wrong, not the call — so the mismatch is logged,
186
+ // once per route, for the tool's author to fix by declaring both
187
+ // `write: true` and `branch: 'required'` (`write` alone with the
188
+ // defaulting declaration makes `toolDef` throw at startup).
189
+ const declared = opts.branch ?? branchHandlingFor(req.baseUrl + (req.route?.path ?? req.path)) ?? 'own';
190
+ const heldToRequired = declared === 'defaults-to-default-branch' && opts.write === true;
191
+ const handling = heldToRequired ? 'required' : declared;
192
+ if (heldToRequired && !warnedHeldToRequired) {
193
+ warnedHeldToRequired = true;
194
+ log.warn(`Tool route ${req.baseUrl + (req.route?.path ?? req.path)} is mounted as writing but declared ` +
195
+ `branch: 'defaults-to-default-branch'; it is held to 'required'. ` +
196
+ `Declare both \`write: true\` and \`branch: 'required'\` to its toolDef.`);
197
+ }
198
+ const resolved = await resolveBranch(handling, args, branches);
199
+ // The tool can read no other branch than the resolved one: `args`
200
+ // carries it under the same name, and a tool that takes no branch
201
+ // gets none at all.
202
+ const toolArgs = resolved
203
+ ? { ...args, branch: resolved.branch }
204
+ : handling === 'none'
205
+ ? withoutBranch(args)
206
+ : args;
72
207
  const ctx = await resolve(auth, abort.signal, sessionId);
73
- const out = await handler(args, ctx);
208
+ if (resolved)
209
+ ctx.branch = resolved.branch;
210
+ let out = await handler(toolArgs, ctx);
211
+ // A defaulted call's answer says which branch it ran on, so a caller
212
+ // that forgot its branch can see it was answered about another.
213
+ if (resolved?.defaulted && isPlainObject(out) && out.branch === undefined) {
214
+ out = { ...out, branch: resolved.branch };
215
+ }
74
216
  if (isAsyncIterable(out)) {
75
217
  res.setHeader('Content-Type', 'text/event-stream');
76
218
  res.setHeader('Cache-Control', 'no-cache');
@@ -119,4 +261,11 @@ export function createToolHandlerFactory(resolve, writeAccess = alwaysWritable)
119
261
  };
120
262
  };
121
263
  }
264
+ function withoutBranch(args) {
265
+ if (!('branch' in args))
266
+ return args;
267
+ const rest = { ...args };
268
+ delete rest.branch;
269
+ return rest;
270
+ }
122
271
  //# sourceMappingURL=tool-handler.js.map