@bevel-software/platform-core-backend 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/agent-guide/access-control.md +146 -300
  2. package/agent-guide/conventions.md +23 -25
  3. package/agent-guide/directory-structure.md +72 -120
  4. package/agent-guide/drafts-and-change-requests.md +92 -0
  5. package/agent-guide/for-git-users.md +47 -0
  6. package/agent-guide/glossary.md +36 -0
  7. package/agent-guide/how-agents-find-things.md +49 -0
  8. package/agent-guide/html-views.md +16 -11
  9. package/agent-guide/new-knowledge-base.md +9 -8
  10. package/agent-guide/skills.md +67 -42
  11. package/agent-guide/start-here.md +65 -0
  12. package/agent-guide/tool-manuals.md +132 -154
  13. package/agent-guide/tools.md +67 -0
  14. package/agent-guide/where-a-new-file-goes.md +45 -28
  15. package/dist/core/create-core-server.js +1 -1
  16. package/dist/core/create-core-server.js.map +1 -1
  17. package/dist/core/create-core-services.d.ts +6 -0
  18. package/dist/core/create-core-services.d.ts.map +1 -1
  19. package/dist/core/create-core-services.js +7 -4
  20. package/dist/core/create-core-services.js.map +1 -1
  21. package/dist/modules/access/access-control.interface.d.ts +22 -0
  22. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  23. package/dist/modules/access/access-control.service.d.ts +3 -1
  24. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  25. package/dist/modules/access/access-control.service.js +75 -0
  26. package/dist/modules/access/access-control.service.js.map +1 -1
  27. package/dist/modules/access/access.routes.d.ts.map +1 -1
  28. package/dist/modules/access/access.routes.js +23 -4
  29. package/dist/modules/access/access.routes.js.map +1 -1
  30. package/dist/modules/access/index.d.ts +1 -1
  31. package/dist/modules/access/index.d.ts.map +1 -1
  32. package/dist/modules/agent-guide/agent-guide.d.ts +47 -7
  33. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  34. package/dist/modules/agent-guide/agent-guide.js +103 -13
  35. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  36. package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
  37. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  38. package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
  39. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  40. package/dist/modules/agent-guide/guide-budget.d.ts +48 -0
  41. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
  42. package/dist/modules/agent-guide/guide-budget.js +67 -0
  43. package/dist/modules/agent-guide/guide-budget.js.map +1 -0
  44. package/dist/modules/agent-guide/index.d.ts +2 -1
  45. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  46. package/dist/modules/agent-guide/index.js +2 -1
  47. package/dist/modules/agent-guide/index.js.map +1 -1
  48. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  49. package/dist/modules/agent-instructions/compose.js +4 -0
  50. package/dist/modules/agent-instructions/compose.js.map +1 -1
  51. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  52. package/dist/modules/agent-instructions/shared-file-rules.js +10 -8
  53. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  54. package/dist/modules/code-mode/code-mode.tool.js +2 -2
  55. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  56. package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
  57. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  58. package/dist/modules/connection-probe/connection-probe.service.js +1 -38
  59. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  60. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  61. package/dist/modules/mcp/mcp.service.js +6 -35
  62. package/dist/modules/mcp/mcp.service.js.map +1 -1
  63. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +11 -1
  64. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  65. package/dist/modules/secrets-vault/db-secrets-vault.service.js +159 -24
  66. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  67. package/dist/modules/secrets-vault/index.d.ts +1 -1
  68. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  69. package/dist/modules/secrets-vault/index.js +1 -1
  70. package/dist/modules/secrets-vault/index.js.map +1 -1
  71. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +53 -11
  72. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  73. package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
  74. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  75. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  76. package/dist/modules/secrets-vault/secrets-vault.routes.js +85 -39
  77. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  78. package/dist/modules/settings/oidc-check.d.ts.map +1 -1
  79. package/dist/modules/settings/oidc-check.js +5 -17
  80. package/dist/modules/settings/oidc-check.js.map +1 -1
  81. package/dist/modules/skills/skills.tools.js +1 -1
  82. package/dist/modules/skills/skills.tools.js.map +1 -1
  83. package/dist/modules/tool-helpers/tool-def.js +1 -1
  84. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  85. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
  86. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  87. package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
  88. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  89. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +27 -0
  90. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  91. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +12 -8
  92. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  93. package/dist/modules/tool-manuals/tool-manuals.service.js +115 -44
  94. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  95. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +8 -2
  96. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  97. package/dist/modules/tool-manuals/tool-manuals.tools.js +31 -10
  98. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  99. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  100. package/dist/modules/workflow/agent-tools/workflow.tools.js +22 -18
  101. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  102. package/dist/modules/workspace/agent-access.gate.d.ts +1 -1
  103. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  104. package/dist/modules/workspace/agent-access.gate.js +1 -1
  105. package/dist/modules/workspace/agent-access.gate.js.map +1 -1
  106. package/dist/modules/workspace/workspace.tools.d.ts +3 -2
  107. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  108. package/dist/modules/workspace/workspace.tools.js +71 -21
  109. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  110. package/dist/shared/oauth-token-error.d.ts +23 -0
  111. package/dist/shared/oauth-token-error.d.ts.map +1 -0
  112. package/dist/shared/oauth-token-error.js +47 -0
  113. package/dist/shared/oauth-token-error.js.map +1 -0
  114. package/dist/shared/read-capped.d.ts +19 -0
  115. package/dist/shared/read-capped.d.ts.map +1 -0
  116. package/dist/shared/read-capped.js +45 -0
  117. package/dist/shared/read-capped.js.map +1 -0
  118. package/package.json +4 -3
  119. package/src/__tests__/hexis-catalog.ts +144 -0
  120. package/src/__tests__/real-disk.ts +21 -0
  121. package/src/__tests__/tokens.ts +19 -0
  122. package/src/__tests__/tool-manuals.ts +32 -0
  123. package/src/__tests__/tool-wiring.ts +25 -0
  124. package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
  125. package/src/core/create-core-server.ts +1 -1
  126. package/src/core/create-core-services.ts +13 -3
  127. package/src/modules/access/__tests__/access.routes.prospective.test.ts +52 -12
  128. package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
  129. package/src/modules/access/access-control.interface.ts +26 -0
  130. package/src/modules/access/access-control.service.ts +92 -0
  131. package/src/modules/access/access.routes.ts +23 -4
  132. package/src/modules/access/index.ts +1 -1
  133. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +79 -25
  134. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +38 -11
  135. package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
  136. package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
  137. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
  138. package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
  139. package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
  140. package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
  141. package/src/modules/agent-guide/agent-guide.ts +120 -13
  142. package/src/modules/agent-guide/guide-budget.ts +73 -0
  143. package/src/modules/agent-guide/index.ts +12 -0
  144. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +4 -4
  145. package/src/modules/agent-instructions/compose.ts +4 -0
  146. package/src/modules/agent-instructions/shared-file-rules.ts +10 -8
  147. package/src/modules/code-mode/code-mode.tool.ts +2 -2
  148. package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
  149. package/src/modules/connection-probe/connection-probe.service.ts +1 -34
  150. package/src/modules/mcp/mcp.service.ts +5 -35
  151. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +430 -3
  152. package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
  153. package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
  154. package/src/modules/secrets-vault/db-secrets-vault.service.ts +170 -27
  155. package/src/modules/secrets-vault/index.ts +1 -1
  156. package/src/modules/secrets-vault/secrets-vault.contract.ts +61 -11
  157. package/src/modules/secrets-vault/secrets-vault.routes.ts +91 -39
  158. package/src/modules/settings/oidc-check.ts +5 -18
  159. package/src/modules/skills/skills.tools.ts +1 -1
  160. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +19 -11
  161. package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
  162. package/src/modules/tool-helpers/tool-def.ts +1 -1
  163. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
  164. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +96 -5
  165. package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
  166. package/src/modules/tool-manuals/tool-manuals.contract.ts +22 -0
  167. package/src/modules/tool-manuals/tool-manuals.service.ts +138 -46
  168. package/src/modules/tool-manuals/tool-manuals.tools.ts +53 -14
  169. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -113
  170. package/src/modules/workflow/agent-tools/workflow.tools.ts +22 -18
  171. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +8 -10
  172. package/src/modules/workspace/__tests__/workspace.tools.test.ts +156 -49
  173. package/src/modules/workspace/agent-access.gate.ts +1 -1
  174. package/src/modules/workspace/workspace.tools.ts +74 -21
  175. package/src/shared/__tests__/read-capped.test.ts +68 -0
  176. package/src/shared/oauth-token-error.ts +46 -0
  177. package/src/shared/read-capped.ts +40 -0
  178. package/agent-guide/finding-things.md +0 -7
  179. package/agent-guide/introduction.md +0 -27
@@ -0,0 +1,514 @@
1
+ {
2
+ "apply_file_upload": {
3
+ "servedTo": [
4
+ "MCP",
5
+ "in-app agent"
6
+ ],
7
+ "arguments": [
8
+ "body.all",
9
+ "body.branch (required)",
10
+ "body.destination (required)",
11
+ "body.mode: create | overwrite | update",
12
+ "body.sessionId",
13
+ "body.token (required)"
14
+ ]
15
+ },
16
+ "branch_status": {
17
+ "servedTo": [
18
+ "MCP",
19
+ "in-app agent"
20
+ ],
21
+ "arguments": [
22
+ "body.base",
23
+ "body.branch (required)",
24
+ "body.sessionId"
25
+ ]
26
+ },
27
+ "call_tool_chain": {
28
+ "servedTo": [
29
+ "MCP"
30
+ ],
31
+ "arguments": [
32
+ "code (required)",
33
+ "max_output_size",
34
+ "timeout"
35
+ ]
36
+ },
37
+ "commit_change": {
38
+ "servedTo": [
39
+ "MCP",
40
+ "in-app agent"
41
+ ],
42
+ "arguments": [
43
+ "body.branch (required)",
44
+ "body.description",
45
+ "body.summary (required)"
46
+ ]
47
+ },
48
+ "compare_file": {
49
+ "servedTo": [
50
+ "MCP",
51
+ "in-app agent"
52
+ ],
53
+ "arguments": [
54
+ "body.at",
55
+ "body.branch (required)",
56
+ "body.from",
57
+ "body.path (required)",
58
+ "body.sessionId",
59
+ "body.to"
60
+ ]
61
+ },
62
+ "copy_file": {
63
+ "servedTo": [
64
+ "MCP",
65
+ "in-app agent"
66
+ ],
67
+ "arguments": [
68
+ "body.branch (required)",
69
+ "body.dest (required)",
70
+ "body.dryRun",
71
+ "body.sessionId",
72
+ "body.src (required)"
73
+ ]
74
+ },
75
+ "create_branch": {
76
+ "servedTo": [
77
+ "MCP",
78
+ "in-app agent"
79
+ ],
80
+ "arguments": [
81
+ "body.branch (required)",
82
+ "body.name (required)"
83
+ ]
84
+ },
85
+ "create_plugin": {
86
+ "servedTo": [
87
+ "MCP",
88
+ "in-app agent"
89
+ ],
90
+ "arguments": [
91
+ "body.name (required)",
92
+ "body.parent"
93
+ ]
94
+ },
95
+ "delete_branch": {
96
+ "servedTo": [
97
+ "MCP",
98
+ "in-app agent"
99
+ ],
100
+ "arguments": [
101
+ "body.discardUnmerged",
102
+ "body.dryRun",
103
+ "body.name (required)"
104
+ ]
105
+ },
106
+ "delete_file": {
107
+ "servedTo": [
108
+ "MCP",
109
+ "in-app agent"
110
+ ],
111
+ "arguments": [
112
+ "body.branch (required)",
113
+ "body.path (required)",
114
+ "body.sessionId"
115
+ ]
116
+ },
117
+ "delete_folder": {
118
+ "servedTo": [
119
+ "MCP",
120
+ "in-app agent"
121
+ ],
122
+ "arguments": [
123
+ "body.branch (required)",
124
+ "body.confirm",
125
+ "body.dryRun",
126
+ "body.path (required)",
127
+ "body.sessionId"
128
+ ]
129
+ },
130
+ "edit_file": {
131
+ "servedTo": [
132
+ "MCP",
133
+ "in-app agent"
134
+ ],
135
+ "arguments": [
136
+ "body.branch (required)",
137
+ "body.new_string (required)",
138
+ "body.old_string (required)",
139
+ "body.path (required)",
140
+ "body.replace_all",
141
+ "body.sessionId"
142
+ ]
143
+ },
144
+ "file_stat": {
145
+ "servedTo": [
146
+ "MCP",
147
+ "in-app agent"
148
+ ],
149
+ "arguments": [
150
+ "body.branch (required)",
151
+ "body.explainAccess",
152
+ "body.path (required)",
153
+ "body.sessionId"
154
+ ]
155
+ },
156
+ "get_agent_guide": {
157
+ "servedTo": [
158
+ "MCP",
159
+ "in-app agent"
160
+ ],
161
+ "arguments": [
162
+ "body.section"
163
+ ]
164
+ },
165
+ "get_change_request": {
166
+ "servedTo": [
167
+ "MCP",
168
+ "in-app agent"
169
+ ],
170
+ "arguments": [
171
+ "body.number (required)"
172
+ ]
173
+ },
174
+ "get_skill": {
175
+ "servedTo": [
176
+ "MCP",
177
+ "in-app agent"
178
+ ],
179
+ "arguments": [
180
+ "body.branch",
181
+ "body.file",
182
+ "body.name (required)",
183
+ "body.version"
184
+ ]
185
+ },
186
+ "grep": {
187
+ "servedTo": [
188
+ "MCP",
189
+ "in-app agent"
190
+ ],
191
+ "arguments": [
192
+ "body.branch (required)",
193
+ "body.ignore_case",
194
+ "body.max_results",
195
+ "body.path",
196
+ "body.pattern (required)",
197
+ "body.sessionId"
198
+ ]
199
+ },
200
+ "list_branches": {
201
+ "servedTo": [
202
+ "MCP",
203
+ "in-app agent"
204
+ ],
205
+ "arguments": []
206
+ },
207
+ "list_change_request_files": {
208
+ "servedTo": [
209
+ "MCP",
210
+ "in-app agent"
211
+ ],
212
+ "arguments": [
213
+ "body.include: patches",
214
+ "body.number (required)",
215
+ "body.page",
216
+ "body.per_page"
217
+ ]
218
+ },
219
+ "list_change_request_reviews": {
220
+ "servedTo": [
221
+ "MCP",
222
+ "in-app agent"
223
+ ],
224
+ "arguments": [
225
+ "body.number (required)",
226
+ "body.page",
227
+ "body.per_page"
228
+ ]
229
+ },
230
+ "list_change_requests": {
231
+ "servedTo": [
232
+ "MCP",
233
+ "in-app agent"
234
+ ],
235
+ "arguments": [
236
+ "body.author",
237
+ "body.base",
238
+ "body.head",
239
+ "body.page",
240
+ "body.per_page",
241
+ "body.state: open | closed | all"
242
+ ]
243
+ },
244
+ "list_file_changes": {
245
+ "servedTo": [
246
+ "MCP",
247
+ "in-app agent"
248
+ ],
249
+ "arguments": [
250
+ "body.branch (required)",
251
+ "body.limit",
252
+ "body.path (required)",
253
+ "body.sessionId"
254
+ ]
255
+ },
256
+ "list_files": {
257
+ "servedTo": [
258
+ "MCP",
259
+ "in-app agent"
260
+ ],
261
+ "arguments": [
262
+ "body.branch (required)",
263
+ "body.path",
264
+ "body.sessionId"
265
+ ]
266
+ },
267
+ "list_local_tools": {
268
+ "servedTo": [
269
+ "MCP",
270
+ "in-app agent"
271
+ ],
272
+ "arguments": []
273
+ },
274
+ "list_skills": {
275
+ "servedTo": [
276
+ "MCP",
277
+ "in-app agent"
278
+ ],
279
+ "arguments": [
280
+ "body.branch"
281
+ ]
282
+ },
283
+ "list_tool_setup": {
284
+ "servedTo": [
285
+ "MCP",
286
+ "in-app agent"
287
+ ],
288
+ "arguments": [
289
+ "body.branch"
290
+ ]
291
+ },
292
+ "list_tools": {
293
+ "servedTo": [
294
+ "MCP"
295
+ ],
296
+ "arguments": []
297
+ },
298
+ "merge_branch": {
299
+ "servedTo": [
300
+ "MCP",
301
+ "in-app agent"
302
+ ],
303
+ "arguments": [
304
+ "body.source (required)",
305
+ "body.target (required)"
306
+ ]
307
+ },
308
+ "mkdir": {
309
+ "servedTo": [
310
+ "MCP",
311
+ "in-app agent"
312
+ ],
313
+ "arguments": [
314
+ "body.branch (required)",
315
+ "body.path (required)",
316
+ "body.sessionId"
317
+ ]
318
+ },
319
+ "move_file": {
320
+ "servedTo": [
321
+ "MCP",
322
+ "in-app agent"
323
+ ],
324
+ "arguments": [
325
+ "body.branch (required)",
326
+ "body.confirm",
327
+ "body.dest (required)",
328
+ "body.dryRun",
329
+ "body.rewriteLinks",
330
+ "body.sessionId",
331
+ "body.src (required)"
332
+ ]
333
+ },
334
+ "my_plugin": {
335
+ "servedTo": [
336
+ "MCP",
337
+ "in-app agent"
338
+ ],
339
+ "arguments": []
340
+ },
341
+ "open_change_request": {
342
+ "servedTo": [
343
+ "MCP",
344
+ "in-app agent"
345
+ ],
346
+ "arguments": [
347
+ "body.description",
348
+ "body.include: patches | all-paths",
349
+ "body.sourceBranch (required)",
350
+ "body.targetBranch (required)",
351
+ "body.title (required)"
352
+ ]
353
+ },
354
+ "open_page": {
355
+ "servedTo": [
356
+ "MCP"
357
+ ],
358
+ "arguments": [
359
+ "body.heading",
360
+ "body.path (required)",
361
+ "body.sessionId"
362
+ ]
363
+ },
364
+ "read_file": {
365
+ "servedTo": [
366
+ "MCP",
367
+ "in-app agent"
368
+ ],
369
+ "arguments": [
370
+ "body.branch (required)",
371
+ "body.limit",
372
+ "body.offset",
373
+ "body.path (required)",
374
+ "body.sessionId"
375
+ ]
376
+ },
377
+ "read_file_at": {
378
+ "servedTo": [
379
+ "MCP",
380
+ "in-app agent"
381
+ ],
382
+ "arguments": [
383
+ "body.at (required)",
384
+ "body.branch (required)",
385
+ "body.path (required)",
386
+ "body.sessionId"
387
+ ]
388
+ },
389
+ "request_file_download": {
390
+ "servedTo": [
391
+ "MCP",
392
+ "in-app agent"
393
+ ],
394
+ "arguments": [
395
+ "body.branch (required)",
396
+ "body.paths (required)",
397
+ "body.sessionId"
398
+ ]
399
+ },
400
+ "request_file_upload": {
401
+ "servedTo": [
402
+ "MCP",
403
+ "in-app agent"
404
+ ],
405
+ "arguments": []
406
+ },
407
+ "save_file": {
408
+ "servedTo": [
409
+ "MCP",
410
+ "in-app agent"
411
+ ],
412
+ "arguments": [
413
+ "body.branch (required)",
414
+ "body.path (required)"
415
+ ]
416
+ },
417
+ "share_current_branch": {
418
+ "servedTo": [
419
+ "MCP",
420
+ "in-app agent"
421
+ ],
422
+ "arguments": [
423
+ "body.branch (required)"
424
+ ]
425
+ },
426
+ "start_session": {
427
+ "servedTo": [
428
+ "MCP"
429
+ ],
430
+ "arguments": []
431
+ },
432
+ "switch_branch": {
433
+ "servedTo": [
434
+ "in-app agent"
435
+ ],
436
+ "arguments": [
437
+ "body.branch (required)"
438
+ ]
439
+ },
440
+ "tools_info": {
441
+ "servedTo": [
442
+ "MCP"
443
+ ],
444
+ "arguments": [
445
+ "tool_names (required)"
446
+ ]
447
+ },
448
+ "unzip": {
449
+ "servedTo": [
450
+ "MCP",
451
+ "in-app agent"
452
+ ],
453
+ "arguments": [
454
+ "body.branch (required)",
455
+ "body.destination",
456
+ "body.path (required)",
457
+ "body.sessionId"
458
+ ]
459
+ },
460
+ "update_branch": {
461
+ "servedTo": [
462
+ "MCP",
463
+ "in-app agent"
464
+ ],
465
+ "arguments": [
466
+ "body.branch (required)",
467
+ "body.from",
468
+ "body.resolutions",
469
+ "body.resolutions[].choose: ours | theirs | delete",
470
+ "body.resolutions[].content",
471
+ "body.resolutions[].path (required)",
472
+ "body.sessionId"
473
+ ]
474
+ },
475
+ "update_change_request": {
476
+ "servedTo": [
477
+ "MCP",
478
+ "in-app agent"
479
+ ],
480
+ "arguments": [
481
+ "body.appendDescription",
482
+ "body.description",
483
+ "body.number (required)",
484
+ "body.title"
485
+ ]
486
+ },
487
+ "write_file": {
488
+ "servedTo": [
489
+ "MCP",
490
+ "in-app agent"
491
+ ],
492
+ "arguments": [
493
+ "body.branch (required)",
494
+ "body.content (required)",
495
+ "body.mode: create | overwrite | update",
496
+ "body.path (required)",
497
+ "body.sessionId"
498
+ ]
499
+ },
500
+ "write_files": {
501
+ "servedTo": [
502
+ "MCP",
503
+ "in-app agent"
504
+ ],
505
+ "arguments": [
506
+ "body.branch (required)",
507
+ "body.files (required)",
508
+ "body.files[].content (required)",
509
+ "body.files[].path (required)",
510
+ "body.mode: create | overwrite | update",
511
+ "body.sessionId"
512
+ ]
513
+ }
514
+ }
@@ -0,0 +1,75 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { hexisCatalog } from '../../../__tests__/hexis-catalog.js';
3
+ import type { UtcpTool } from '../../tool-registry/index.js';
4
+
5
+ /**
6
+ * The platform's tools as an agent can call them: each tool's name, where it
7
+ * is served, and every argument it takes (nested ones by their dotted path),
8
+ * which are required, and the values an enum allows. Kept as a committed file,
9
+ * `tool-surface.json` beside this test.
10
+ *
11
+ * Why: the guide teaches these calls, and a change to them is the change most
12
+ * likely to leave the guide wrong without failing anything else. The guide
13
+ * check (`guide-matches-code.test.ts`) catches a name the guide uses that the
14
+ * code lost; it cannot catch an argument the code GAINED, or one that became
15
+ * required, that the guide should now mention. This file does: a pull request
16
+ * that changes the surface fails here until it updates the file, and the
17
+ * updated file shows the change in the diff where reviewers see it. That is
18
+ * the moment to update the guide, or to say in the pull request that no guide
19
+ * change is needed. Accept with
20
+ * `pnpm --filter @bevel-software/platform-core-backend exec vitest run src/modules/agent-guide -u`.
21
+ */
22
+
23
+ const ACCEPT =
24
+ 'The tool surface changed (a tool, an argument, a required flag or an enum value). If agents need to know, ' +
25
+ 'update the guide in packages/core-backend/agent-guide/ in this pull request; then accept the new surface with ' +
26
+ '`pnpm --filter @bevel-software/platform-core-backend exec vitest run src/modules/agent-guide -u`. See AGENTS.md.';
27
+
28
+ type Schema = { type?: unknown; properties?: Record<string, Schema>; required?: string[]; items?: Schema; enum?: unknown[] };
29
+
30
+ /** Every argument under `schema`, by dotted path (`files[].path`), with its required flag and enum. */
31
+ function argumentsOf(schema: Schema | undefined, prefix = '', depth = 0): string[] {
32
+ if (!schema?.properties || depth > 3) return [];
33
+ return Object.entries(schema.properties)
34
+ .sort(([a], [b]) => a.localeCompare(b))
35
+ .flatMap(([name, sub]) => {
36
+ const path = `${prefix}${name}`;
37
+ const required = schema.required?.includes(name) ? ' (required)' : '';
38
+ const allowed = sub.enum ?? sub.items?.enum;
39
+ const line = `${path}${required}${allowed ? `: ${allowed.join(' | ')}` : ''}`;
40
+ const nested = sub.items?.properties ? argumentsOf(sub.items, `${path}[].`, depth + 1) : argumentsOf(sub, `${path}.`, depth + 1);
41
+ return [line, ...nested];
42
+ });
43
+ }
44
+
45
+ /** A platform tool's own arguments: under `body` when it takes them there, flat otherwise. */
46
+ function ownArguments(tool: UtcpTool): string[] {
47
+ const inputs = (tool.inputs ?? (tool as { inputSchema?: unknown }).inputSchema) as Schema | undefined;
48
+ const body = inputs?.properties?.body;
49
+ return body ? argumentsOf(body).map((a) => `body.${a}`) : argumentsOf(inputs);
50
+ }
51
+
52
+ describe('the tool surface agents are taught', () => {
53
+ it('matches the surface the guide was last checked against', async () => {
54
+ const { internal, external, metaTools } = await hexisCatalog();
55
+ const surfaces = new Map<string, Set<string>>();
56
+ const tools = new Map<string, UtcpTool>();
57
+ for (const [surface, list] of [
58
+ ['in-app agent', internal],
59
+ ['MCP', external],
60
+ ['MCP', metaTools as unknown as UtcpTool[]],
61
+ ] as const) {
62
+ for (const tool of list) {
63
+ tools.set(tool.name, tool);
64
+ surfaces.set(tool.name, (surfaces.get(tool.name) ?? new Set()).add(surface));
65
+ }
66
+ }
67
+ const surface = Object.fromEntries(
68
+ [...tools.keys()].sort().map((name) => [
69
+ name,
70
+ { servedTo: [...surfaces.get(name)!].sort(), arguments: ownArguments(tools.get(name)!) },
71
+ ]),
72
+ );
73
+ await expect(`${JSON.stringify(surface, null, 2)}\n`).toMatchFileSnapshot('./tool-surface.json', ACCEPT);
74
+ });
75
+ });