@bevel-software/platform-core-backend 0.22.0 → 0.24.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 (466) hide show
  1. package/dist/core/core-ports.d.ts +11 -1
  2. package/dist/core/core-ports.d.ts.map +1 -1
  3. package/dist/core/core-ports.js.map +1 -1
  4. package/dist/core/create-core-server.d.ts +3 -3
  5. package/dist/core/create-core-server.d.ts.map +1 -1
  6. package/dist/core/create-core-server.js +46 -13
  7. package/dist/core/create-core-server.js.map +1 -1
  8. package/dist/core/create-core-services.d.ts +12 -2
  9. package/dist/core/create-core-services.d.ts.map +1 -1
  10. package/dist/core/create-core-services.js +137 -24
  11. package/dist/core/create-core-services.js.map +1 -1
  12. package/dist/core/lifecycle.d.ts +46 -1
  13. package/dist/core/lifecycle.d.ts.map +1 -1
  14. package/dist/core/lifecycle.js +99 -13
  15. package/dist/core/lifecycle.js.map +1 -1
  16. package/dist/core-config.d.ts +16 -12
  17. package/dist/core-config.d.ts.map +1 -1
  18. package/dist/core-config.js +28 -13
  19. package/dist/core-config.js.map +1 -1
  20. package/dist/index.d.ts +6 -4
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +12 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/modules/access/access-control.interface.d.ts +42 -12
  25. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  26. package/dist/modules/access/access-control.service.d.ts +67 -10
  27. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  28. package/dist/modules/access/access-control.service.js +214 -35
  29. package/dist/modules/access/access-control.service.js.map +1 -1
  30. package/dist/modules/access/access.routes.d.ts.map +1 -1
  31. package/dist/modules/access/access.routes.js +17 -16
  32. package/dist/modules/access/access.routes.js.map +1 -1
  33. package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
  34. package/dist/modules/access/directory-sync-bot.js +7 -3
  35. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  36. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +8 -1
  37. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  38. package/dist/modules/agent-instructions/agent-instructions.routes.js +8 -2
  39. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  40. package/dist/modules/agent-instructions/compose.d.ts +38 -6
  41. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  42. package/dist/modules/agent-instructions/compose.js +39 -6
  43. package/dist/modules/agent-instructions/compose.js.map +1 -1
  44. package/dist/modules/agent-instructions/index.d.ts +2 -1
  45. package/dist/modules/agent-instructions/index.d.ts.map +1 -1
  46. package/dist/modules/agent-instructions/index.js +2 -1
  47. package/dist/modules/agent-instructions/index.js.map +1 -1
  48. package/dist/modules/agent-instructions/shared-file-rules.d.ts +115 -0
  49. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -0
  50. package/dist/modules/agent-instructions/shared-file-rules.js +272 -0
  51. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -0
  52. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  53. package/dist/modules/audit/agent-audit.service.js +4 -2
  54. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  55. package/dist/modules/auth/account-admission.d.ts +58 -7
  56. package/dist/modules/auth/account-admission.d.ts.map +1 -1
  57. package/dist/modules/auth/account-admission.js +44 -1
  58. package/dist/modules/auth/account-admission.js.map +1 -1
  59. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  60. package/dist/modules/auth/account-erasure.service.js +57 -16
  61. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  62. package/dist/modules/auth/account.routes.d.ts +1 -1
  63. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  64. package/dist/modules/auth/account.routes.js +61 -5
  65. package/dist/modules/auth/account.routes.js.map +1 -1
  66. package/dist/modules/auth/auth.middleware.d.ts +1 -1
  67. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  68. package/dist/modules/auth/auth.middleware.js +18 -7
  69. package/dist/modules/auth/auth.middleware.js.map +1 -1
  70. package/dist/modules/auth/auth.routes.d.ts.map +1 -1
  71. package/dist/modules/auth/auth.routes.js +8 -0
  72. package/dist/modules/auth/auth.routes.js.map +1 -1
  73. package/dist/modules/auth/auth.service.d.ts +70 -2
  74. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  75. package/dist/modules/auth/auth.service.js +197 -18
  76. package/dist/modules/auth/auth.service.js.map +1 -1
  77. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  78. package/dist/modules/auth/oidc-auth-provider.js +7 -2
  79. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  80. package/dist/modules/code-mode/code-mode.tool.d.ts +20 -2
  81. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  82. package/dist/modules/code-mode/code-mode.tool.js +66 -35
  83. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  84. package/dist/modules/database/connection.d.ts +16 -0
  85. package/dist/modules/database/connection.d.ts.map +1 -1
  86. package/dist/modules/database/connection.js +117 -0
  87. package/dist/modules/database/connection.js.map +1 -1
  88. package/dist/modules/database/core-schema.d.ts +337 -120
  89. package/dist/modules/database/core-schema.d.ts.map +1 -1
  90. package/dist/modules/database/core-schema.js +116 -58
  91. package/dist/modules/database/core-schema.js.map +1 -1
  92. package/dist/modules/database/migrate.d.ts +8 -0
  93. package/dist/modules/database/migrate.d.ts.map +1 -1
  94. package/dist/modules/database/migrate.js +271 -1
  95. package/dist/modules/database/migrate.js.map +1 -1
  96. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  97. package/dist/modules/kb-fs/branch-name.js +12 -2
  98. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  99. package/dist/modules/kb-fs/repo-path.d.ts +11 -16
  100. package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
  101. package/dist/modules/kb-fs/repo-path.js +79 -0
  102. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  103. package/dist/modules/kb-sync/kb-sync.routes.d.ts +2 -2
  104. package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
  105. package/dist/modules/kb-sync/kb-sync.routes.js +14 -3
  106. package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
  107. package/dist/modules/kb-sync/sync-auth.d.ts +3 -1
  108. package/dist/modules/kb-sync/sync-auth.d.ts.map +1 -1
  109. package/dist/modules/kb-sync/sync-auth.js +1 -1
  110. package/dist/modules/kb-sync/sync-auth.js.map +1 -1
  111. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  112. package/dist/modules/mcp/mcp-auth.middleware.js +21 -6
  113. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  114. package/dist/modules/mcp/mcp.service.d.ts +8 -0
  115. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  116. package/dist/modules/mcp/mcp.service.js +38 -8
  117. package/dist/modules/mcp/mcp.service.js.map +1 -1
  118. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  119. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +3 -2
  120. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  121. package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
  122. package/dist/modules/plugins/join-request-records.store.js +7 -4
  123. package/dist/modules/plugins/join-request-records.store.js.map +1 -1
  124. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  125. package/dist/modules/settings/deployment-settings.service.js +8 -3
  126. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  127. package/dist/modules/settings/setup.routes.d.ts +52 -1
  128. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  129. package/dist/modules/settings/setup.routes.js +207 -19
  130. package/dist/modules/settings/setup.routes.js.map +1 -1
  131. package/dist/modules/skills/skills.contract.d.ts +90 -18
  132. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  133. package/dist/modules/skills/skills.contract.js +4 -1
  134. package/dist/modules/skills/skills.contract.js.map +1 -1
  135. package/dist/modules/skills/skills.service.d.ts +98 -9
  136. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  137. package/dist/modules/skills/skills.service.js +239 -37
  138. package/dist/modules/skills/skills.service.js.map +1 -1
  139. package/dist/modules/skills/skills.tools.d.ts +7 -0
  140. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  141. package/dist/modules/skills/skills.tools.js +71 -7
  142. package/dist/modules/skills/skills.tools.js.map +1 -1
  143. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  144. package/dist/modules/tool-auth/external-api-key.service.js +12 -4
  145. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  146. package/dist/modules/tool-auth/internal-token.service.d.ts +3 -3
  147. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +16 -7
  148. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  149. package/dist/modules/tool-auth/tool-auth.middleware.js +34 -12
  150. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  151. package/dist/modules/tool-helpers/tool-handler.d.ts +2 -1
  152. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  153. package/dist/modules/tool-helpers/tool-handler.js +25 -4
  154. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  155. package/dist/modules/tool-helpers/tool.contract.d.ts +3 -2
  156. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  157. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  158. package/dist/modules/tool-helpers/validate-token.js +1 -1
  159. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  160. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  161. package/dist/modules/tool-manuals/tool-manuals.tools.js +42 -31
  162. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  163. package/dist/modules/tool-registry/description-length.d.ts +80 -0
  164. package/dist/modules/tool-registry/description-length.d.ts.map +1 -0
  165. package/dist/modules/tool-registry/description-length.js +108 -0
  166. package/dist/modules/tool-registry/description-length.js.map +1 -0
  167. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +98 -0
  168. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -0
  169. package/dist/modules/workflow/agent-tools/change-request-summary.js +81 -0
  170. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -0
  171. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  172. package/dist/modules/workflow/agent-tools/workflow.tools.js +75 -35
  173. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  174. package/dist/modules/workflow/file-lock.service.d.ts +24 -0
  175. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  176. package/dist/modules/workflow/file-lock.service.js +30 -0
  177. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  178. package/dist/modules/workflow/git/git.service.d.ts +94 -0
  179. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  180. package/dist/modules/workflow/git/git.service.js +193 -3
  181. package/dist/modules/workflow/git/git.service.js.map +1 -1
  182. package/dist/modules/workflow/pending-commits.service.d.ts +38 -0
  183. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  184. package/dist/modules/workflow/pending-commits.service.js +60 -1
  185. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  186. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
  187. package/dist/modules/workflow/recovery-bot.js +7 -3
  188. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  189. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  190. package/dist/modules/workflow/review-workflow/review-workflow.service.js +12 -3
  191. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  192. package/dist/modules/workflow/workflow-hooks.d.ts +54 -32
  193. package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -1
  194. package/dist/modules/workflow/workflow-hooks.js +16 -1
  195. package/dist/modules/workflow/workflow-hooks.js.map +1 -1
  196. package/dist/modules/workflow/workflow.service.d.ts +60 -6
  197. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  198. package/dist/modules/workflow/workflow.service.js +115 -5
  199. package/dist/modules/workflow/workflow.service.js.map +1 -1
  200. package/dist/modules/workspace/agent-access.gate.d.ts +94 -0
  201. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -0
  202. package/dist/modules/workspace/agent-access.gate.js +123 -0
  203. package/dist/modules/workspace/agent-access.gate.js.map +1 -0
  204. package/dist/modules/workspace/agent-upload.routes.d.ts +77 -0
  205. package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -0
  206. package/dist/modules/workspace/agent-upload.routes.js +210 -0
  207. package/dist/modules/workspace/agent-upload.routes.js.map +1 -0
  208. package/dist/modules/workspace/agent-upload.store.d.ts +284 -0
  209. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -0
  210. package/dist/modules/workspace/agent-upload.store.js +553 -0
  211. package/dist/modules/workspace/agent-upload.store.js.map +1 -0
  212. package/dist/modules/workspace/routine-write-policy.d.ts +5 -6
  213. package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -1
  214. package/dist/modules/workspace/routine-write-policy.js +5 -6
  215. package/dist/modules/workspace/routine-write-policy.js.map +1 -1
  216. package/dist/modules/workspace/session-sink.d.ts +5 -5
  217. package/dist/modules/workspace/set-aside-clone.d.ts +46 -0
  218. package/dist/modules/workspace/set-aside-clone.d.ts.map +1 -0
  219. package/dist/modules/workspace/set-aside-clone.js +92 -0
  220. package/dist/modules/workspace/set-aside-clone.js.map +1 -0
  221. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +59 -9
  222. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  223. package/dist/modules/workspace/startup/kb-startup-runner.js +65 -24
  224. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  225. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  226. package/dist/modules/workspace/startup/steps/seed-tree.js +3 -3
  227. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  228. package/dist/modules/workspace/startup/steps/template-source.d.ts +40 -0
  229. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  230. package/dist/modules/workspace/startup/steps/template-source.js +46 -4
  231. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  232. package/dist/modules/workspace/upload-limits.d.ts +13 -0
  233. package/dist/modules/workspace/upload-limits.d.ts.map +1 -0
  234. package/dist/modules/workspace/upload-limits.js +13 -0
  235. package/dist/modules/workspace/upload-limits.js.map +1 -0
  236. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  237. package/dist/modules/workspace/workspace.routes.js +93 -4
  238. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  239. package/dist/modules/workspace/workspace.service.d.ts +128 -5
  240. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  241. package/dist/modules/workspace/workspace.service.js +316 -58
  242. package/dist/modules/workspace/workspace.service.js.map +1 -1
  243. package/dist/modules/workspace/workspace.tools.d.ts +13 -11
  244. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  245. package/dist/modules/workspace/workspace.tools.js +791 -198
  246. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  247. package/dist/modules/workspace/write-denial.d.ts +0 -6
  248. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  249. package/dist/modules/workspace/write-denial.js +0 -6
  250. package/dist/modules/workspace/write-denial.js.map +1 -1
  251. package/dist/modules/workspace/zip-entry-rules.d.ts +114 -0
  252. package/dist/modules/workspace/zip-entry-rules.d.ts.map +1 -0
  253. package/dist/modules/workspace/zip-entry-rules.js +154 -0
  254. package/dist/modules/workspace/zip-entry-rules.js.map +1 -0
  255. package/dist/modules/write-access/write-access.d.ts +60 -0
  256. package/dist/modules/write-access/write-access.d.ts.map +1 -0
  257. package/dist/modules/write-access/write-access.js +129 -0
  258. package/dist/modules/write-access/write-access.js.map +1 -0
  259. package/dist/shared/column-crypto.d.ts +194 -0
  260. package/dist/shared/column-crypto.d.ts.map +1 -0
  261. package/dist/shared/column-crypto.js +144 -0
  262. package/dist/shared/column-crypto.js.map +1 -0
  263. package/dist/shared/domain-errors.d.ts +25 -0
  264. package/dist/shared/domain-errors.d.ts.map +1 -1
  265. package/dist/shared/domain-errors.js +28 -0
  266. package/dist/shared/domain-errors.js.map +1 -1
  267. package/dist/shared/git.contract.d.ts +20 -0
  268. package/dist/shared/git.contract.d.ts.map +1 -1
  269. package/dist/shared/git.contract.js +26 -0
  270. package/dist/shared/git.contract.js.map +1 -1
  271. package/dist/shared/token-crypto.d.ts.map +1 -1
  272. package/dist/shared/token-crypto.js +25 -1
  273. package/dist/shared/token-crypto.js.map +1 -1
  274. package/dist/tenancy/static-tenant-source.d.ts +0 -1
  275. package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
  276. package/dist/tenancy/static-tenant-source.js +1 -2
  277. package/dist/tenancy/static-tenant-source.js.map +1 -1
  278. package/dist/tenancy/tenant-secrets.d.ts +5 -1
  279. package/dist/tenancy/tenant-secrets.d.ts.map +1 -1
  280. package/dist/tenancy/tenant-secrets.js +4 -0
  281. package/dist/tenancy/tenant-secrets.js.map +1 -1
  282. package/kb-template/AGENTS.md +2 -0
  283. package/migrations/0014_change_request_closed_reason.sql +1 -0
  284. package/migrations/0015_account_deactivation.sql +3 -0
  285. package/migrations/0016_pii_encryption.sql +20 -0
  286. package/migrations/meta/0014_snapshot.json +2265 -0
  287. package/migrations/meta/0015_snapshot.json +2271 -0
  288. package/migrations/meta/0016_snapshot.json +2327 -0
  289. package/migrations/meta/_journal.json +21 -0
  290. package/package.json +3 -3
  291. package/src/__tests__/kb-layout-config.test.ts +0 -2
  292. package/src/__tests__/retired-settings.test.ts +96 -0
  293. package/src/core/__tests__/gated-boot.test.ts +132 -0
  294. package/src/core/__tests__/lifecycle.test.ts +241 -5
  295. package/src/core/__tests__/set-aside-root-is-one-place.test.ts +63 -0
  296. package/src/core/core-ports.ts +11 -1
  297. package/src/core/create-core-server.ts +52 -16
  298. package/src/core/create-core-services.ts +156 -24
  299. package/src/core/lifecycle.ts +117 -13
  300. package/src/core-config.ts +31 -14
  301. package/src/index.ts +30 -1
  302. package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +385 -0
  303. package/src/modules/access/__tests__/access-control.prospective.test.ts +94 -18
  304. package/src/modules/access/__tests__/access.routes.prospective.test.ts +6 -7
  305. package/src/modules/access/__tests__/users-db-double.ts +21 -12
  306. package/src/modules/access/access-control.interface.ts +43 -12
  307. package/src/modules/access/access-control.service.ts +234 -36
  308. package/src/modules/access/access.routes.ts +17 -16
  309. package/src/modules/access/directory-sync-bot.ts +7 -3
  310. package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +11 -5
  311. package/src/modules/agent-instructions/__tests__/compose.test.ts +19 -10
  312. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +238 -0
  313. package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -2
  314. package/src/modules/agent-instructions/compose.ts +50 -7
  315. package/src/modules/agent-instructions/index.ts +12 -0
  316. package/src/modules/agent-instructions/shared-file-rules.ts +314 -0
  317. package/src/modules/audit/agent-audit.service.ts +4 -2
  318. package/src/modules/auth/__tests__/account-deactivation.test.ts +253 -0
  319. package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +6 -2
  320. package/src/modules/auth/__tests__/account.routes.test.ts +87 -6
  321. package/src/modules/auth/__tests__/auth.middleware.test.ts +45 -22
  322. package/src/modules/auth/__tests__/auth.service.test.ts +4 -2
  323. package/src/modules/auth/account-admission.ts +78 -9
  324. package/src/modules/auth/account-erasure.service.ts +69 -18
  325. package/src/modules/auth/account.routes.ts +63 -7
  326. package/src/modules/auth/auth.middleware.ts +19 -8
  327. package/src/modules/auth/auth.routes.ts +8 -0
  328. package/src/modules/auth/auth.service.ts +206 -23
  329. package/src/modules/auth/oidc-auth-provider.ts +7 -2
  330. package/src/modules/code-mode/__tests__/chain-runtime.e2e.test.ts +335 -0
  331. package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +46 -2
  332. package/src/modules/code-mode/code-mode.tool.ts +80 -34
  333. package/src/modules/database/__tests__/connection.test.ts +12 -0
  334. package/src/modules/database/__tests__/pii-backfill.pg.test.ts +561 -0
  335. package/src/modules/database/connection.ts +117 -0
  336. package/src/modules/database/core-schema.ts +116 -58
  337. package/src/modules/database/migrate.ts +353 -1
  338. package/src/modules/kb-fs/__tests__/branch-name.test.ts +10 -0
  339. package/src/modules/kb-fs/__tests__/repo-path.test.ts +123 -0
  340. package/src/modules/kb-fs/branch-name.ts +14 -1
  341. package/src/modules/kb-fs/repo-path.ts +85 -0
  342. package/src/modules/kb-sync/__tests__/kb-sync.routes.test.ts +26 -1
  343. package/src/modules/kb-sync/kb-sync.routes.ts +14 -4
  344. package/src/modules/kb-sync/sync-auth.ts +2 -2
  345. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -3
  346. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +4 -3
  347. package/src/modules/mcp/__tests__/mcp.service.test.ts +115 -13
  348. package/src/modules/mcp/mcp-auth.middleware.ts +20 -6
  349. package/src/modules/mcp/mcp.service.ts +46 -7
  350. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -1
  351. package/src/modules/plugins/__tests__/plugins.tools.test.ts +2 -1
  352. package/src/modules/plugins/join-request-records.store.ts +7 -4
  353. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +16 -0
  354. package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +91 -58
  355. package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +25 -8
  356. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +14 -11
  357. package/src/modules/settings/__tests__/setup.routes.repository-change.test.ts +390 -0
  358. package/src/modules/settings/__tests__/setup.routes.test.ts +3 -0
  359. package/src/modules/settings/deployment-settings.service.ts +8 -3
  360. package/src/modules/settings/setup.routes.ts +263 -19
  361. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -1
  362. package/src/modules/skills/__tests__/branch-skills.tools.test.ts +218 -0
  363. package/src/modules/skills/__tests__/skills.service.test.ts +229 -5
  364. package/src/modules/skills/skills.contract.ts +91 -18
  365. package/src/modules/skills/skills.service.ts +278 -41
  366. package/src/modules/skills/skills.tools.ts +80 -8
  367. package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +14 -1
  368. package/src/modules/tool-auth/external-api-key.service.ts +12 -4
  369. package/src/modules/tool-auth/internal-token.service.ts +3 -3
  370. package/src/modules/tool-auth/tool-auth.middleware.ts +34 -11
  371. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +5 -3
  372. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -3
  373. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +11 -1
  374. package/src/modules/tool-helpers/tool-handler.ts +24 -4
  375. package/src/modules/tool-helpers/tool.contract.ts +3 -2
  376. package/src/modules/tool-helpers/validate-token.ts +1 -1
  377. package/src/modules/tool-manuals/tool-manuals.tools.ts +44 -31
  378. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +378 -0
  379. package/src/modules/tool-registry/description-length.ts +111 -0
  380. package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +111 -0
  381. package/src/modules/workflow/__tests__/workflow.routes.history-read-gate.test.ts +25 -0
  382. package/src/modules/workflow/__tests__/workflow.service.repository-replaced.test.ts +249 -0
  383. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +264 -6
  384. package/src/modules/workflow/agent-tools/change-request-summary.ts +182 -0
  385. package/src/modules/workflow/agent-tools/workflow.tools.ts +86 -35
  386. package/src/modules/workflow/file-lock.service.ts +31 -0
  387. package/src/modules/workflow/git/__tests__/git.service.fileBytesAtCommit.test.ts +260 -0
  388. package/src/modules/workflow/git/__tests__/git.service.prFetchFailure.test.ts +170 -0
  389. package/src/modules/workflow/git/git.service.ts +215 -1
  390. package/src/modules/workflow/pending-commits.service.ts +64 -2
  391. package/src/modules/workflow/recovery-bot.ts +7 -3
  392. package/src/modules/workflow/review-workflow/__tests__/carry-approvals-forward.test.ts +4 -0
  393. package/src/modules/workflow/review-workflow/__tests__/erase-approver.test.ts +25 -3
  394. package/src/modules/workflow/review-workflow/review-workflow.service.ts +12 -3
  395. package/src/modules/workflow/workflow-hooks.ts +64 -26
  396. package/src/modules/workflow/workflow.service.ts +125 -5
  397. package/src/modules/workspace/__tests__/agent-access.gate.test.ts +208 -0
  398. package/src/modules/workspace/__tests__/agent-uploads.test.ts +1604 -0
  399. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +394 -0
  400. package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
  401. package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -1
  402. package/src/modules/workspace/__tests__/set-aside-clone.test.ts +52 -0
  403. package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +305 -0
  404. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -0
  405. package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +156 -0
  406. package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +147 -0
  407. package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +402 -0
  408. package/src/modules/workspace/__tests__/workspace.service.test.ts +77 -9
  409. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +41 -39
  410. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +2 -3
  411. package/src/modules/workspace/__tests__/workspace.tools.test.ts +766 -56
  412. package/src/modules/workspace/agent-access.gate.ts +164 -0
  413. package/src/modules/workspace/agent-upload.routes.ts +214 -0
  414. package/src/modules/workspace/agent-upload.store.ts +668 -0
  415. package/src/modules/workspace/routine-write-policy.ts +5 -6
  416. package/src/modules/workspace/session-sink.ts +5 -5
  417. package/src/modules/workspace/set-aside-clone.ts +96 -0
  418. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +86 -0
  419. package/src/modules/workspace/startup/kb-startup-runner.ts +115 -34
  420. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +9 -9
  421. package/src/modules/workspace/startup/steps/seed-tree.ts +3 -6
  422. package/src/modules/workspace/startup/steps/template-source.ts +53 -5
  423. package/src/modules/workspace/upload-limits.ts +12 -0
  424. package/src/modules/workspace/workspace.routes.ts +96 -5
  425. package/src/modules/workspace/workspace.service.ts +319 -61
  426. package/src/modules/workspace/workspace.tools.ts +894 -214
  427. package/src/modules/workspace/write-denial.ts +0 -8
  428. package/src/modules/workspace/zip-entry-rules.ts +173 -0
  429. package/src/modules/write-access/__tests__/write-access.test.ts +248 -0
  430. package/src/modules/write-access/write-access.ts +153 -0
  431. package/src/shared/__tests__/column-crypto.test.ts +217 -0
  432. package/src/shared/column-crypto.ts +218 -0
  433. package/src/shared/domain-errors.ts +31 -0
  434. package/src/shared/git.contract.ts +27 -0
  435. package/src/shared/token-crypto.ts +28 -1
  436. package/src/tenancy/__tests__/static-tenant-source.test.ts +4 -1
  437. package/src/tenancy/static-tenant-source.ts +1 -3
  438. package/src/tenancy/tenant-secrets.ts +5 -1
  439. package/dist/modules/workflow/session-ontology.policy.d.ts +0 -52
  440. package/dist/modules/workflow/session-ontology.policy.d.ts.map +0 -1
  441. package/dist/modules/workflow/session-ontology.policy.js +0 -62
  442. package/dist/modules/workflow/session-ontology.policy.js.map +0 -1
  443. package/dist/modules/workflow/session-ontology.service.d.ts +0 -105
  444. package/dist/modules/workflow/session-ontology.service.d.ts.map +0 -1
  445. package/dist/modules/workflow/session-ontology.service.js +0 -147
  446. package/dist/modules/workflow/session-ontology.service.js.map +0 -1
  447. package/dist/modules/workspace/session-ontology.gate.d.ts +0 -114
  448. package/dist/modules/workspace/session-ontology.gate.d.ts.map +0 -1
  449. package/dist/modules/workspace/session-ontology.gate.js +0 -161
  450. package/dist/modules/workspace/session-ontology.gate.js.map +0 -1
  451. package/dist/shared/kb-layout.d.ts +0 -39
  452. package/dist/shared/kb-layout.d.ts.map +0 -1
  453. package/dist/shared/kb-layout.js +0 -103
  454. package/dist/shared/kb-layout.js.map +0 -1
  455. package/dist/shared/kb-layout.test.d.ts +0 -2
  456. package/dist/shared/kb-layout.test.d.ts.map +0 -1
  457. package/dist/shared/kb-layout.test.js +0 -75
  458. package/dist/shared/kb-layout.test.js.map +0 -1
  459. package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +0 -62
  460. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +0 -201
  461. package/src/modules/workflow/session-ontology.policy.ts +0 -70
  462. package/src/modules/workflow/session-ontology.service.ts +0 -183
  463. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +0 -239
  464. package/src/modules/workspace/session-ontology.gate.ts +0 -191
  465. package/src/shared/kb-layout.test.ts +0 -98
  466. package/src/shared/kb-layout.ts +0 -102
@@ -1,52 +0,0 @@
1
- /**
2
- * Ontology-session boundary — the PURE decision core (no IO, no DB).
3
- *
4
- * Model: each run/session accumulates the SET of named ontologies it has
5
- * touched (via any read or write). The rule is asymmetric:
6
- *
7
- * READS — always allowed. A read that touches a named ontology RECORDS it
8
- * into the session's touched set (so it can poison later writes).
9
- * WRITES — allowed only while the session is confined to a SINGLE named
10
- * ontology and the write targets that same ontology. The moment a
11
- * session has touched two or more named ontologies (typically by
12
- * reading across them), EVERY subsequent write is blocked — "read
13
- * across ontologies → you can't write anymore at all."
14
- *
15
- * Neutral touches (`ontologyOf` → null: root config, Skills, root-level
16
- * Knowledge, non-KB) never record and never block. See
17
- * `docs/rp4-ontology-boundary-plan-v2.md`.
18
- *
19
- * `SessionOntologyService` (Postgres-backed) persists the touched set and calls
20
- * these helpers; this module keeps the rule itself testable in isolation.
21
- */
22
- import type { Ontology } from '@bevel-software/platform-shared';
23
- /** Outcome of a write check against the session's touched-ontology set. */
24
- export type WriteDecision = {
25
- allow: true;
26
- } | {
27
- allow: false;
28
- reason: 'multi-ontology' | 'different-ontology';
29
- touched: string[];
30
- attempted: string;
31
- };
32
- /**
33
- * The set of NAMED ontologies a session has touched after this operation. A
34
- * neutral operation (`ontology === null`) adds nothing. Pure — returns a new
35
- * set, never mutates the input.
36
- */
37
- export declare function recordTouch(touched: ReadonlySet<string>, ontology: Ontology): Set<string>;
38
- /**
39
- * Decide whether a WRITE to `attempted` is allowed given the ontologies the
40
- * session has already touched (NOT counting this write yet).
41
- *
42
- * - A write to a neutral path (`attempted === null`) is always allowed.
43
- * - If the session has already touched two or more named ontologies, the
44
- * write is blocked (`multi-ontology`) — reading across ontologies poisoned
45
- * the session's write ability.
46
- * - If the session has touched exactly one named ontology and it differs from
47
- * the write target, the write is blocked (`different-ontology`).
48
- * - If the session is unpinned (touched none) or its single touched ontology
49
- * equals the target, the write is allowed.
50
- */
51
- export declare function decideWrite(touched: ReadonlySet<string>, attempted: Ontology): WriteDecision;
52
- //# sourceMappingURL=session-ontology.policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ontology.policy.d.ts","sourceRoot":"","sources":["../../../src/modules/workflow/session-ontology.policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAEhE,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GACrB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,GAAG,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5G;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAIzF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,GAAG,aAAa,CAgB5F"}
@@ -1,62 +0,0 @@
1
- /**
2
- * Ontology-session boundary — the PURE decision core (no IO, no DB).
3
- *
4
- * Model: each run/session accumulates the SET of named ontologies it has
5
- * touched (via any read or write). The rule is asymmetric:
6
- *
7
- * READS — always allowed. A read that touches a named ontology RECORDS it
8
- * into the session's touched set (so it can poison later writes).
9
- * WRITES — allowed only while the session is confined to a SINGLE named
10
- * ontology and the write targets that same ontology. The moment a
11
- * session has touched two or more named ontologies (typically by
12
- * reading across them), EVERY subsequent write is blocked — "read
13
- * across ontologies → you can't write anymore at all."
14
- *
15
- * Neutral touches (`ontologyOf` → null: root config, Skills, root-level
16
- * Knowledge, non-KB) never record and never block. See
17
- * `docs/rp4-ontology-boundary-plan-v2.md`.
18
- *
19
- * `SessionOntologyService` (Postgres-backed) persists the touched set and calls
20
- * these helpers; this module keeps the rule itself testable in isolation.
21
- */
22
- /**
23
- * The set of NAMED ontologies a session has touched after this operation. A
24
- * neutral operation (`ontology === null`) adds nothing. Pure — returns a new
25
- * set, never mutates the input.
26
- */
27
- export function recordTouch(touched, ontology) {
28
- const next = new Set(touched);
29
- if (ontology !== null)
30
- next.add(ontology);
31
- return next;
32
- }
33
- /**
34
- * Decide whether a WRITE to `attempted` is allowed given the ontologies the
35
- * session has already touched (NOT counting this write yet).
36
- *
37
- * - A write to a neutral path (`attempted === null`) is always allowed.
38
- * - If the session has already touched two or more named ontologies, the
39
- * write is blocked (`multi-ontology`) — reading across ontologies poisoned
40
- * the session's write ability.
41
- * - If the session has touched exactly one named ontology and it differs from
42
- * the write target, the write is blocked (`different-ontology`).
43
- * - If the session is unpinned (touched none) or its single touched ontology
44
- * equals the target, the write is allowed.
45
- */
46
- export function decideWrite(touched, attempted) {
47
- if (attempted === null)
48
- return { allow: true };
49
- // The set of named ontologies the session would span if this write lands.
50
- const spanned = new Set(touched);
51
- spanned.add(attempted);
52
- if (spanned.size <= 1)
53
- return { allow: true };
54
- // spanned.size >= 2 — the write would put the session across a boundary.
55
- const touchedList = [...touched].sort();
56
- if (touched.size >= 2) {
57
- return { allow: false, reason: 'multi-ontology', touched: touchedList, attempted };
58
- }
59
- // Exactly one prior ontology, and it isn't the write target.
60
- return { allow: false, reason: 'different-ontology', touched: touchedList, attempted };
61
- }
62
- //# sourceMappingURL=session-ontology.policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ontology.policy.js","sourceRoot":"","sources":["../../../src/modules/workflow/session-ontology.policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAA4B,EAAE,QAAkB;IAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,QAAQ,KAAK,IAAI;QAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAA4B,EAAE,SAAmB;IAC3E,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE/C,0EAA0E;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEvB,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE9C,yEAAyE;IACzE,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACrF,CAAC;IACD,6DAA6D;IAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AACzF,CAAC"}
@@ -1,105 +0,0 @@
1
- /**
2
- * Ontology-session boundary — the touched-set store (Postgres + cache).
3
- *
4
- * Each session accumulates the SET of named ontologies it has touched. The gate
5
- * calls `checkOperation` for every gated agent tool call:
6
- *
7
- * READ (isWrite=false) → always allowed; RECORD the touched ontology so it
8
- * can poison later writes.
9
- * WRITE (isWrite=true) → allowed only while the session is confined to a
10
- * single named ontology equal to the target; once the
11
- * session has touched ≥2 ontologies, every write is
12
- * blocked. An allowed write also records its ontology.
13
- *
14
- * Neutral operations (`ontologyOf` → null) never record and never block.
15
- *
16
- * ┌── checkOperation(sessionId, wsPath, isWrite) ───────────────────────────┐
17
- * │ ont = ontologyOf(wsPath) │
18
- * │ ont === null → { allow:true } (neutral; no record) │
19
- * │ touched = loadTouched(sessionId) (cache, else SELECT) │
20
- * │ WRITE → decideWrite(touched, ont); if blocked, return block (no record) │
21
- * │ record(sessionId, ont) (idempotent INSERT; update cache) │
22
- * │ return { allow:true } │
23
- * └──────────────────────────────────────────────────────────────────────────┘
24
- *
25
- * Postgres is the source of truth so the boundary survives a backend restart.
26
- * The cache holds each session's touched set; a miss re-reads PG. See
27
- * `docs/rp4-ontology-boundary-plan-v2.md`.
28
- *
29
- * Eviction: `delete(sessionId)` at run end is the PRIMARY reclamation;
30
- * `sweepOlderThan` is the abandoned-run backstop; the MCP layer also calls
31
- * `delete` from its `onEvict` hook.
32
- */
33
- import type { KbContext } from '../../shared/kb-context.js';
34
- import type { Database } from '../database/connection.js';
35
- export type OperationDecision = {
36
- allow: true;
37
- touched: string[];
38
- } | {
39
- allow: false;
40
- reason: 'multi-ontology' | 'different-ontology';
41
- touched: string[];
42
- attempted: string;
43
- };
44
- export interface ISessionOntologyService {
45
- /**
46
- * Evaluate and record a gated agent operation. Reads always allow (and
47
- * record); writes allow only while confined to a single ontology. Neutral
48
- * paths always allow and record nothing.
49
- */
50
- checkOperation(sessionId: string, wsPath: string, isWrite: boolean, kbDirName?: string): Promise<OperationDecision>;
51
- /** Evaluate/record against an already-resolved ontology (used by graph tools). */
52
- checkOntology(sessionId: string, ontology: string | null, isWrite: boolean): Promise<OperationDecision>;
53
- /** The set of ontologies a session has touched. */
54
- getTouched(sessionId: string): Promise<string[]>;
55
- /** Reclaim a session's touched set (run end / MCP onEvict). */
56
- delete(sessionId: string): Promise<void>;
57
- /** Backstop: drop touch rows older than `cutoff` (abandoned runs). */
58
- sweepOlderThan(cutoff: Date): Promise<number>;
59
- }
60
- export declare class SessionOntologyService implements ISessionOntologyService {
61
- private readonly db;
62
- /** Names the knowledge-base root a path is classified under; read per call. */
63
- private readonly kb;
64
- /**
65
- * Write-through cache of each session's touched-ontology set. A present entry
66
- * is authoritative for the session (we only ever add to it in-process); a
67
- * miss re-reads Postgres. Keyed by the agent thread / sessionId.
68
- */
69
- private readonly cache;
70
- /**
71
- * Serializes each session's read→decide→record path. Without it, two
72
- * concurrent same-session writes (parallel tool calls in one turn) could both
73
- * observe a singleton/empty touched set and both be allowed to different
74
- * ontologies before either INSERT lands — defeating the boundary. Different
75
- * sessions never contend.
76
- */
77
- private readonly locks;
78
- constructor(db: Database,
79
- /** Names the knowledge-base root a path is classified under; read per call. */
80
- kb: Pick<KbContext, 'layout'>);
81
- /**
82
- * Resolve `wsPath` to its ontology and evaluate/record the operation. Thin
83
- * wrapper over {@link checkOntology} for the common path-based call site.
84
- */
85
- checkOperation(sessionId: string, wsPath: string, isWrite: boolean, kbDirName?: string): Promise<OperationDecision>;
86
- /**
87
- * Evaluate (and, when allowed, record) an operation against an
88
- * already-resolved ontology. Neutral ops always allow and record nothing;
89
- * reads always allow and record; writes allow only while the session stays
90
- * confined to the single target ontology (see {@link decideWrite}). A blocked
91
- * write records nothing.
92
- */
93
- checkOntology(sessionId: string, ontology: string | null, isWrite: boolean): Promise<OperationDecision>;
94
- /** The sorted set of named ontologies this session has touched so far. */
95
- getTouched(sessionId: string): Promise<string[]>;
96
- /** Reclaim a session's touched set from both the cache and Postgres (run end / MCP onEvict). */
97
- delete(sessionId: string): Promise<void>;
98
- /** Backstop sweep: drop touch rows older than `cutoff` (abandoned runs) and return how many were removed. */
99
- sweepOlderThan(cutoff: Date): Promise<number>;
100
- /** Load a session's touched set from cache, else from Postgres (and cache it). */
101
- private loadTouched;
102
- /** Record a touched ontology (idempotent) and update the cache. */
103
- private record;
104
- }
105
- //# sourceMappingURL=session-ontology.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ontology.service.d.ts","sourceRoot":"","sources":["../../../src/modules/workflow/session-ontology.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,GAAG,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5G,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpH,kFAAkF;IAClF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxG,mDAAmD;IACnD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,+DAA+D;IAC/D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,sEAAsE;IACtE,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,qBAAa,sBAAuB,YAAW,uBAAuB;IAkBlE,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,EAAE;IAnBrB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IAExD;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAG3B,EAAE,EAAE,QAAQ;IAC7B,+EAA+E;IAC9D,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;IAGhD;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAI7B;;;;;;OAMG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+B7G,0EAA0E;IACpE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAItD,gGAAgG;IAC1F,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,6GAA6G;IACvG,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAWnD,kFAAkF;YACpE,WAAW;IAYzB,mEAAmE;YACrD,MAAM;CAQrB"}
@@ -1,147 +0,0 @@
1
- /**
2
- * Ontology-session boundary — the touched-set store (Postgres + cache).
3
- *
4
- * Each session accumulates the SET of named ontologies it has touched. The gate
5
- * calls `checkOperation` for every gated agent tool call:
6
- *
7
- * READ (isWrite=false) → always allowed; RECORD the touched ontology so it
8
- * can poison later writes.
9
- * WRITE (isWrite=true) → allowed only while the session is confined to a
10
- * single named ontology equal to the target; once the
11
- * session has touched ≥2 ontologies, every write is
12
- * blocked. An allowed write also records its ontology.
13
- *
14
- * Neutral operations (`ontologyOf` → null) never record and never block.
15
- *
16
- * ┌── checkOperation(sessionId, wsPath, isWrite) ───────────────────────────┐
17
- * │ ont = ontologyOf(wsPath) │
18
- * │ ont === null → { allow:true } (neutral; no record) │
19
- * │ touched = loadTouched(sessionId) (cache, else SELECT) │
20
- * │ WRITE → decideWrite(touched, ont); if blocked, return block (no record) │
21
- * │ record(sessionId, ont) (idempotent INSERT; update cache) │
22
- * │ return { allow:true } │
23
- * └──────────────────────────────────────────────────────────────────────────┘
24
- *
25
- * Postgres is the source of truth so the boundary survives a backend restart.
26
- * The cache holds each session's touched set; a miss re-reads PG. See
27
- * `docs/rp4-ontology-boundary-plan-v2.md`.
28
- *
29
- * Eviction: `delete(sessionId)` at run end is the PRIMARY reclamation;
30
- * `sweepOlderThan` is the abandoned-run backstop; the MCP layer also calls
31
- * `delete` from its `onEvict` hook.
32
- */
33
- import { eq, lt } from 'drizzle-orm';
34
- import { ontologyOf } from '../../shared/kb-layout.js';
35
- import { sessionOntologyTouches } from '../database/schema.js';
36
- import { recordTouch, decideWrite } from './session-ontology.policy.js';
37
- import { WorkspaceMutex } from '../kb-fs/mutex.js';
38
- export class SessionOntologyService {
39
- db;
40
- kb;
41
- /**
42
- * Write-through cache of each session's touched-ontology set. A present entry
43
- * is authoritative for the session (we only ever add to it in-process); a
44
- * miss re-reads Postgres. Keyed by the agent thread / sessionId.
45
- */
46
- cache = new Map();
47
- /**
48
- * Serializes each session's read→decide→record path. Without it, two
49
- * concurrent same-session writes (parallel tool calls in one turn) could both
50
- * observe a singleton/empty touched set and both be allowed to different
51
- * ontologies before either INSERT lands — defeating the boundary. Different
52
- * sessions never contend.
53
- */
54
- locks = new WorkspaceMutex();
55
- constructor(db,
56
- /** Names the knowledge-base root a path is classified under; read per call. */
57
- kb) {
58
- this.db = db;
59
- this.kb = kb;
60
- }
61
- /**
62
- * Resolve `wsPath` to its ontology and evaluate/record the operation. Thin
63
- * wrapper over {@link checkOntology} for the common path-based call site.
64
- */
65
- async checkOperation(sessionId, wsPath, isWrite, kbDirName) {
66
- return this.checkOntology(sessionId, ontologyOf(wsPath, this.kb.layout, kbDirName), isWrite);
67
- }
68
- /**
69
- * Evaluate (and, when allowed, record) an operation against an
70
- * already-resolved ontology. Neutral ops always allow and record nothing;
71
- * reads always allow and record; writes allow only while the session stays
72
- * confined to the single target ontology (see {@link decideWrite}). A blocked
73
- * write records nothing.
74
- */
75
- async checkOntology(sessionId, ontology, isWrite) {
76
- // Neutral operation: always allowed, records nothing. No state mutation, so
77
- // it needs no per-session serialization.
78
- if (ontology === null) {
79
- const touched = await this.loadTouched(sessionId);
80
- return { allow: true, touched: [...touched].sort() };
81
- }
82
- // Serialize the decide+record path per session so concurrent same-session
83
- // operations can't both pass the boundary on a stale touched set.
84
- return this.locks.run(sessionId, async () => {
85
- const touched = await this.loadTouched(sessionId);
86
- if (isWrite) {
87
- const decision = decideWrite(touched, ontology);
88
- if (!decision.allow) {
89
- return {
90
- allow: false,
91
- reason: decision.reason,
92
- touched: decision.touched,
93
- attempted: decision.attempted,
94
- };
95
- }
96
- }
97
- // Allowed (read, or a write confined to one ontology): record the touch.
98
- await this.record(sessionId, ontology, touched);
99
- return { allow: true, touched: [...recordTouch(touched, ontology)].sort() };
100
- });
101
- }
102
- /** The sorted set of named ontologies this session has touched so far. */
103
- async getTouched(sessionId) {
104
- return [...(await this.loadTouched(sessionId))].sort();
105
- }
106
- /** Reclaim a session's touched set from both the cache and Postgres (run end / MCP onEvict). */
107
- async delete(sessionId) {
108
- this.cache.delete(sessionId);
109
- await this.db.delete(sessionOntologyTouches).where(eq(sessionOntologyTouches.sessionId, sessionId));
110
- }
111
- /** Backstop sweep: drop touch rows older than `cutoff` (abandoned runs) and return how many were removed. */
112
- async sweepOlderThan(cutoff) {
113
- const removed = await this.db
114
- .delete(sessionOntologyTouches)
115
- .where(lt(sessionOntologyTouches.touchedAt, cutoff))
116
- .returning({ sessionId: sessionOntologyTouches.sessionId });
117
- // A swept session may have other (newer) rows; drop its cache entry so the
118
- // next op re-reads the authoritative remaining set from Postgres.
119
- for (const r of removed)
120
- this.cache.delete(r.sessionId);
121
- return removed.length;
122
- }
123
- /** Load a session's touched set from cache, else from Postgres (and cache it). */
124
- async loadTouched(sessionId) {
125
- const cached = this.cache.get(sessionId);
126
- if (cached)
127
- return cached;
128
- const rows = await this.db
129
- .select({ ontology: sessionOntologyTouches.ontology })
130
- .from(sessionOntologyTouches)
131
- .where(eq(sessionOntologyTouches.sessionId, sessionId));
132
- const set = new Set(rows.map((r) => r.ontology));
133
- this.cache.set(sessionId, set);
134
- return set;
135
- }
136
- /** Record a touched ontology (idempotent) and update the cache. */
137
- async record(sessionId, ontology, current) {
138
- if (current.has(ontology))
139
- return; // already recorded; no DB write needed
140
- await this.db
141
- .insert(sessionOntologyTouches)
142
- .values({ sessionId, ontology })
143
- .onConflictDoNothing({ target: [sessionOntologyTouches.sessionId, sessionOntologyTouches.ontology] });
144
- current.add(ontology);
145
- }
146
- }
147
- //# sourceMappingURL=session-ontology.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ontology.service.js","sourceRoot":"","sources":["../../../src/modules/workflow/session-ontology.service.ts"],"names":[],"mappings":"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"}
@@ -1,114 +0,0 @@
1
- /**
2
- * Ontology-session boundary — the per-call gate used by the agent tool handlers.
3
- *
4
- * One decision fn, called by every gated file/graph handler:
5
- * READS (isWrite=false) record the touched ontology and always allow.
6
- * WRITES (isWrite=true) run the registered BLOCKING `preWrite` hooks
7
- * (`WorkflowHooks`), then record. The core registers
8
- * no hook, so core alone only TRACKS; the enterprise
9
- * overlay registers the ontology block (see
10
- * `modules/kb/ontology-block.hook.ts`), restoring
11
- * "allowed only while the session is confined to a
12
- * single ontology; once it has touched ≥2, all
13
- * writes are blocked".
14
- *
15
- * Skips entirely when: the flag is off, the path is neutral (`ontologyOf` →
16
- * null), the caller is not an agent, or the caller is the recovery bot. Fails
17
- * CLOSED for an agent named-path operation that carries no `sessionId`.
18
- *
19
- * Lives beside `assertCanRead` in the workspace tools — it does NOT touch
20
- * `acquireLock` (that gate is protected-branch-only; this boundary applies on
21
- * all branches and to reads). See `docs/rp4-ontology-boundary-plan-v2.md`.
22
- */
23
- import type { KbContext } from '../../shared/kb-context.js';
24
- import type { JsonSchema } from '../tool-registry/tool.contract.js';
25
- import { ToolError, type ToolContext } from '../tool-helpers/tool.contract.js';
26
- import type { ISessionOntologyService } from '../workflow/session-ontology.service.js';
27
- import type { WorkflowHooks } from '../workflow/workflow-hooks.js';
28
- /**
29
- * The `sessionId` input the ontology-session boundary reads: the agent run /
30
- * conversation id. The in-process agent supplies its thread id automatically
31
- * (via its per-run internal token); an external agent has no ambient run id,
32
- * so it must first mint one with the `start_session` tool and then pass it
33
- * EXPLICITLY on every gated call — the MCP proxy is a pure passthrough and
34
- * never injects args.
35
- */
36
- export declare const SESSION_ID_INPUT: JsonSchema;
37
- /**
38
- * Boundary warning appended to ontology-gated tool descriptions so the agent
39
- * knows the restriction before it calls one. Action-then-why phrasing per
40
- * docs/glossary.md.
41
- */
42
- export declare const ONTOLOGY_BOUNDARY_NOTE = " Stay within one KnowledgeBase ontology per conversation: once this run has read or written files in two different ontologies, every later content write (write_file/edit_file/mkdir/unzip, and both endpoints of move_file/copy_file) is blocked with a 403 and no override. Reads, delete_file and delete_folder never block \u2014 but each one records the ontology it touched and can poison a later content write, so do broad cross-ontology exploration only when you do not intend to write. Note move_file/copy_file are blocked outright when source and destination are different ontologies, since they would carry content across.";
43
- /** Thrown when a write is refused because the session has crossed ontologies. */
44
- export declare class OntologyWriteBlockedError extends ToolError {
45
- constructor(touched: string[], attempted: string, reason: 'multi-ontology' | 'different-ontology');
46
- }
47
- /** Thrown when an agent op on a named ontology carries no session id (fail closed). */
48
- export declare class MissingSessionError extends ToolError {
49
- constructor();
50
- }
51
- export interface SessionOntologyGate {
52
- service: ISessionOntologyService;
53
- enabled: boolean;
54
- /** The checkout folder and the layout a path is classified under. */
55
- kb: Pick<KbContext, 'kbDirName' | 'layout'>;
56
- /** Lowercased email of the recovery/merge bot, which is exempt. */
57
- recoveryBotEmail: string;
58
- /**
59
- * The workflow lifecycle-hook registry whose BLOCKING `preWrite` hooks
60
- * decide whether a gated write/shell op proceeds. Core registers none (the
61
- * gate then only tracks); the enterprise composition root registers the
62
- * ontology block against `workflowService.hooks` — pass that same instance
63
- * here.
64
- */
65
- hooks: WorkflowHooks;
66
- }
67
- /**
68
- * Record a read of `wsPath`'s ontology into the session's touched set. Reads are
69
- * always allowed — recording is the only effect — but each one widens the
70
- * touched set and so can poison a later write (see {@link assertOntologyWriteAllowed}).
71
- * Fails closed (`MissingSessionError`) for an agent read of a named ontology
72
- * with no session id.
73
- */
74
- export declare function recordOntologyRead(gate: SessionOntologyGate, ctx: ToolContext, wsPath: string): Promise<void>;
75
- /**
76
- * Assert a write to `wsPath` is allowed, then record it. A write that would
77
- * carry information into a second ontology is the thing the boundary blocks:
78
- * permitted only while the session stays confined to the target ontology, and
79
- * refused with `OntologyWriteBlockedError` once it has touched ≥2. Note `delete`
80
- * is NOT a write here — removing a node propagates no cross-ontology
81
- * information, so it goes through {@link recordOntologyRead}.
82
- *
83
- * The BLOCKING decision itself lives behind the `preWrite` hooks: the
84
- * enterprise-registered ontology block evaluates-and-records atomically via
85
- * `checkOperation(isWrite=true)` and throws to refuse (identical behavior to
86
- * the previous in-gate decision). Core registers no hook, so with none the
87
- * write is allowed and only the touch is recorded (tracking stays core). The
88
- * follow-up read-record after the hooks is idempotent — a no-op when a hook
89
- * already recorded the allowed write.
90
- */
91
- export declare function assertOntologyWriteAllowed(gate: SessionOntologyGate, ctx: ToolContext, wsPath: string): Promise<void>;
92
- /**
93
- * Session-level write-eligibility gate for write-capable tools that have no
94
- * single resolvable target path to check per-call — currently `execute_command`
95
- * (arbitrary shell). Such a tool cannot be path-confined, so we enforce the
96
- * boundary at the coarser session level: once the run has crossed into ≥2
97
- * ontologies (the point at which EVERY path-checked write is already refused),
98
- * we refuse the tool outright, so shell can't become a write path around the
99
- * boundary. A fresh or single-ontology session is still allowed; a residual gap
100
- * remains (a single-ontology session could shell-write a *different* ontology),
101
- * accepted because arbitrary shell cannot be path-confined and blocking all
102
- * shell after one KB read would gut its read-style diagnostic use (git/grep/ls).
103
- *
104
- * Skips when: the flag is off, the caller is not an agent, the caller is the
105
- * recovery bot, or there is no session id — there is no named path here to fail
106
- * closed on, and with no session there is no touched set to evaluate.
107
- *
108
- * Like {@link assertOntologyWriteAllowed}, the refusal itself is the
109
- * enterprise-registered `preWrite` hook's (it evaluates the touched set and
110
- * throws); core registers none, so shell is never refused in a core-only
111
- * deployment.
112
- */
113
- export declare function assertShellAllowedWithinOntology(gate: SessionOntologyGate, ctx: ToolContext): Promise<void>;
114
- //# sourceMappingURL=session-ontology.gate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-ontology.gate.d.ts","sourceRoot":"","sources":["../../../src/modules/workspace/session-ontology.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,qnBAC4kB,CAAC;AAEhnB,iFAAiF;AACjF,qBAAa,yBAA0B,SAAQ,SAAS;gBAC1C,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,oBAAoB;CAQlG;AAED,uFAAuF;AACvF,qBAAa,mBAAoB,SAAQ,SAAS;;CAQjD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,uBAAuB,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC;IAC5C,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,KAAK,EAAE,aAAa,CAAC;CACtB;AA4BD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnH;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,gCAAgC,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjH"}