@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,7 +1,7 @@
1
1
  import type { Server } from 'node:http';
2
2
  import { closeDb, type Database } from '../modules/database/connection.js';
3
3
  import type { AdvisoryLease } from '../modules/database/advisory-lock.js';
4
- import { KbRemoteUnreachableError, type KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
4
+ import { bootMaySurvive, type KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
5
5
  import { noteBesideCheckout } from '../modules/workspace/startup/beside-checkout.js';
6
6
  import { unregisterBevelSecretsVariableLoader } from '../modules/secrets-vault/secrets-variable-loader.js';
7
7
  import type { WorkflowService } from '../modules/workflow/workflow.service.js';
@@ -164,7 +164,13 @@ export function holdCommitWorkerLease(
164
164
  running = false;
165
165
  wake?.();
166
166
  await loop;
167
+ // The worker is asked to stop whether or not this process is running
168
+ // it: a worker that can be held still (`holdable`) may be in the
169
+ // middle of a hold that uses the database, and its stop is what
170
+ // waits for that. Stopping a worker that is not running is nothing.
171
+ const idle = !workerRunning && !stopping;
167
172
  await stopWorker();
173
+ if (idle) await worker.stop().catch((err: unknown) => log(`commit worker stop failed: ${String(err)}`));
168
174
  await lease.release();
169
175
  })();
170
176
  return stopped;
@@ -202,6 +208,80 @@ export function withStartupTask(
202
208
  };
203
209
  }
204
210
 
211
+ /** A worker the lease loop drives, which something else may hold still for a while. */
212
+ export interface HoldableWorker extends LeasedWorker {
213
+ /**
214
+ * Run `work` with the worker stopped, and start it again afterwards if the
215
+ * lease loop still wants it running. A hold waits for the commit in flight
216
+ * to finish, as a stop does. Holds may overlap; the worker starts again
217
+ * when the last one ends, whether `work` resolved or threw.
218
+ */
219
+ whileHeld<T>(work: () => Promise<T>): Promise<T>;
220
+ }
221
+
222
+ /**
223
+ * A worker that can be HELD STILL without the lease loop knowing.
224
+ *
225
+ * The lease loop decides whether this process is the one draining the commit
226
+ * queue; it starts the worker when the lease is taken and stops it when the
227
+ * lease is lost. Moving the deployment to another repository needs a second,
228
+ * independent reason for the worker not to run: while working copies are
229
+ * being set aside and cloned again, a queued commit must not be written into
230
+ * a directory that is being renamed away, nor into the fresh clone of a
231
+ * repository it was never meant for. Stopping the loop itself would release
232
+ * the lease, and another process would take the queue over mid-move.
233
+ *
234
+ * So the two reasons are kept apart. `wanted` is the lease loop's word,
235
+ * `holds` counts the moves in flight, and the worker runs exactly when it is
236
+ * wanted and nothing holds it.
237
+ *
238
+ * A stop waits for the holds in flight as well as for the worker. Shutdown
239
+ * awaits this stop (bounded by its own budget) before it ends the database
240
+ * pool, and a move still setting copies aside and cloning needs that pool:
241
+ * it is either finished, or known to have been cut.
242
+ */
243
+ export function holdable(worker: LeasedWorker): HoldableWorker {
244
+ let wanted = false;
245
+ const inFlight = new Set<Promise<unknown>>();
246
+ /**
247
+ * ONE stop at a time, shared by everyone who asks. A worker's own stop is
248
+ * idempotent by answering a second caller at once, while the first is
249
+ * still waiting for the commit in flight; a second hold given that answer
250
+ * would set a working copy aside under that commit.
251
+ */
252
+ let stopping: Promise<void> | null = null;
253
+ const stopWorker = (): Promise<void> => {
254
+ stopping ??= worker.stop().finally(() => {
255
+ stopping = null;
256
+ });
257
+ return stopping;
258
+ };
259
+ return {
260
+ start() {
261
+ wanted = true;
262
+ if (inFlight.size === 0) worker.start();
263
+ },
264
+ async stop() {
265
+ wanted = false;
266
+ await stopWorker();
267
+ await Promise.allSettled([...inFlight]);
268
+ },
269
+ whileHeld<T>(work: () => Promise<T>): Promise<T> {
270
+ const held = (async () => {
271
+ await stopWorker();
272
+ return work();
273
+ })();
274
+ inFlight.add(held);
275
+ const ended = (): void => {
276
+ inFlight.delete(held);
277
+ if (inFlight.size === 0 && wanted) worker.start();
278
+ };
279
+ held.then(ended, ended);
280
+ return held;
281
+ },
282
+ };
283
+ }
284
+
205
285
  /**
206
286
  * What one knowledge base's graph needs of itself to be STARTED: the boot
207
287
  * side effects that used to run inside `createCoreServer`, named so a host
@@ -228,7 +308,8 @@ export interface BootableCore {
228
308
  * jobs. `createCoreServer` runs this for a single-tenant deployment; a host
229
309
  * serving several knowledge bases runs it when a tenant is activated.
230
310
  *
231
- * Throws to stop the boot on every failure but an unreachable remote — the
311
+ * Throws to stop the boot on every failure but the ones the host answered
312
+ * about the repository or the credentials (see `bootMaySurvive`) — the
232
313
  * container's restart policy is the retry — see `kb-startup-runner.ts`.
233
314
  */
234
315
  export async function startCore<C extends BootableCore>(
@@ -267,18 +348,22 @@ export async function startCore<C extends BootableCore>(
267
348
  try {
268
349
  await core.kbStartupRunner.runAll();
269
350
  } catch (err) {
270
- // The one failure a boot survives: the remote cannot be reached. That
271
- // says nothing about the knowledge base — what we would write is not
272
- // known to be wrong, we cannot get there — so refusing to boot only took
273
- // away the login and setup screens an operator needs to fix it (a
274
- // rotated token, say). The deployment comes up GATED: the setup routes
351
+ // The failures a boot survives: the host ANSWERED about the repository or
352
+ // the credentials, or could not be reached at all. None of them says
353
+ // anything about the knowledge base — what we would write is not known to
354
+ // be wrong — and every one of them is fixed somewhere else: the host comes
355
+ // back, the repository is created, the token is granted access, a rotated
356
+ // token is typed into the setup screen. Refusing to boot took away the
357
+ // login and setup screens the fix is entered on, and on 2026-09-28 a
358
+ // repository that had been replaced crash-looped a deployment for exactly
359
+ // that reason. The deployment comes up GATED instead: the setup routes
275
360
  // read the runner's standing failure and keep the app shut, the setup
276
- // screen shows why, saving it retries, and the runner keeps trying on
277
- // its own. Every other failure still stops the boot, because it means
278
- // the template or a step would write something wrong.
279
- if (!(err instanceof KbRemoteUnreachableError)) throw err;
280
- startupLog.error('booting UNMAINTAINED and gated — the knowledge-base remote could not be reached:', {
281
- detail: err.message,
361
+ // screen shows why, saving it retries, and the runner keeps trying on its
362
+ // own. Every other failure still stops the boot, because it means the
363
+ // template or a step would write something wrong. See `bootMaySurvive`.
364
+ if (!bootMaySurvive(err)) throw err;
365
+ startupLog.error('booting UNMAINTAINED and gated — the knowledge base could not be initialized:', {
366
+ detail: err instanceof Error ? err.message : String(err),
282
367
  });
283
368
  // Kept on the graph so that stopping the graph stops the asking: a
284
369
  // retry that outlived its graph would clone into a workspaces folder
@@ -343,6 +428,15 @@ export interface CoreStopDeps {
343
428
  * to it. Optional: a caller that has not built them yet passes nothing.
344
429
  */
345
430
  backgroundJobs?: { stopSweeping(): void; drain(): Promise<void> };
431
+ /**
432
+ * The agent upload store, whose own sweep deletes staged bytes nobody
433
+ * applied. Stopped with this graph because the next graph for the same
434
+ * tenant stages into the SAME directory with an empty record map: a sweep
435
+ * left running from a store that is gone would read the replacement's files
436
+ * as orphans and delete them under an apply that is about to read them.
437
+ * Optional: a caller that has not built one passes nothing.
438
+ */
439
+ agentUploadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
346
440
  /** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
347
441
  startupRetry?: { stop(): void } | null;
348
442
  /** The database — its pool is ended last, once nothing above can still need it. */
@@ -426,6 +520,10 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
426
520
  // earliest point the interval is dead weight. Synchronous and unfailing
427
521
  // — it just clears an interval — so it needs no budget of its own.
428
522
  deps.backgroundJobs?.stopSweeping();
523
+ // And the upload store's sweep, for the same reason and in the same breath:
524
+ // synchronous, and it only clears an interval and tells a sweep already
525
+ // running to stop deleting.
526
+ deps.agentUploadStore?.stopSweeping();
429
527
  // A startup phase still asking for an unreachable remote stops asking:
430
528
  // synchronous, and nothing after it must be able to clone into a
431
529
  // workspaces folder that is about to belong to nobody.
@@ -439,6 +537,12 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
439
537
  if (deps.backgroundJobs) {
440
538
  await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
441
539
  }
540
+ // The sweep in flight when the interval was cleared: awaited so the next
541
+ // graph for this tenant cannot start staging bytes while a store it has
542
+ // never heard of is still walking the same directory.
543
+ if (deps.agentUploadStore) {
544
+ await bounded(deps.agentUploadStore.drainSweep(), remaining(), 'finishing the upload sweep', log);
545
+ }
442
546
  await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
443
547
  if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
444
548
  await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
@@ -6,6 +6,8 @@ import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
6
6
  import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
7
7
  import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
8
8
  import { logger } from './shared/logging.js';
9
+ import { hasControlCharacter } from './modules/kb-fs/repo-path.js';
10
+ import { sanitizedPath } from './shared/printable.js';
9
11
 
10
12
  const log = logger('config');
11
13
 
@@ -86,6 +88,7 @@ export interface TenantConfig {
86
88
  readonly workspacesRoot: string;
87
89
  readonly backupsRoot: string;
88
90
  readonly spillRoot: string;
91
+ readonly agentUploadsRoot: string;
89
92
  readonly docExtractCacheRoot: string;
90
93
  readonly jwtSecret: string;
91
94
  readonly adminEmail: string;
@@ -100,7 +103,6 @@ export interface TenantConfig {
100
103
  readonly gitUsername: string;
101
104
  readonly gitToken: string;
102
105
  readonly kbTemplateDir: string;
103
- readonly ontologySessionBlock: boolean;
104
106
  readonly updateCheckEnabled: boolean;
105
107
  readonly loginPasswordEnabled: boolean;
106
108
  readonly allowedEmailDomains: string[];
@@ -183,6 +185,21 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
183
185
  * never committed, best-effort GC'd on write.
184
186
  */
185
187
  readonly spillRoot: string;
188
+ /**
189
+ * Sibling-to-`workspacesRoot` location for the bytes an agent uploads with
190
+ * `request_file_upload`, held until `apply_file_upload` lands them (or their
191
+ * token expires, whichever comes first). BESIDE the workspaces, never inside
192
+ * one, and that placement is the point: an upload is content the server has
193
+ * accepted but not yet judged, so no file tool may name it — every workspace
194
+ * path resolves against a branch's checkout, and there is no spelling of one
195
+ * that reaches in here. Ephemeral and never committed.
196
+ *
197
+ * `AGENT_UPLOADS_ROOT` overrides it, and the placement is CHECKED at boot
198
+ * (`assertUploadsRootOutsideWorkspaces`): a value inside `workspacesRoot` —
199
+ * or one that resolves there through a link — refuses to start rather than
200
+ * quietly staging unjudged bytes where the file tools read.
201
+ */
202
+ readonly agentUploadsRoot: string;
186
203
  /**
187
204
  * Sibling-to-`workspacesRoot` location for the document-extraction cache —
188
205
  * text extracted from office documents/PDFs (`read_file`/`grep`), keyed by
@@ -259,17 +276,6 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
259
276
  * existing one. Override with `KB_TEMPLATE_DIR`.
260
277
  */
261
278
  readonly kbTemplateDir: string;
262
- /**
263
- * Ontology-session boundary kill-switch. When true (default), an agent run
264
- * that has read across more than one ontology can no longer write. A no-op on
265
- * a single-ontology KB. Set `ONTOLOGY_SESSION_BLOCK=false` to disable.
266
- *
267
- * Stays on CORE config (not `AppConfig`) even though the write BLOCK itself
268
- * is an enterprise-registered hook: the flag also switches off the core-owned
269
- * touch TRACKING (the gate skips entirely when false — see
270
- * `session-ontology.gate.ts`), so it must exist wherever the tracking runs.
271
- */
272
- readonly ontologySessionBlock: boolean;
273
279
  /**
274
280
  * In-app update check. When true (default), `GET /api/update-check` lazily
275
281
  * asks api.github.com for the newest Hexis release — only when an admin's
@@ -390,6 +396,8 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
390
396
  this.workspacesRoot = process.env.WORKSPACES_ROOT || path.resolve(process.cwd(), 'workspaces');
391
397
  this.backupsRoot = process.env.BACKUPS_ROOT || path.resolve(this.workspacesRoot, '..', 'backups');
392
398
  this.spillRoot = process.env.SPILL_ROOT || path.resolve(this.workspacesRoot, '..', 'tool-chain-spills');
399
+ this.agentUploadsRoot =
400
+ process.env.AGENT_UPLOADS_ROOT || path.resolve(this.workspacesRoot, '..', 'agent-uploads');
393
401
  this.docExtractCacheRoot =
394
402
  process.env.DOC_EXTRACT_CACHE_ROOT || path.resolve(this.workspacesRoot, '..', 'doc-extract-cache');
395
403
  // Required, and checked BEFORE the auth routes it signs for are ever
@@ -469,8 +477,6 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
469
477
  // Default: the `kb-template/` folder shipped inside this package (works
470
478
  // both from src/ and compiled dist/ — see assets.ts).
471
479
  this.kbTemplateDir = process.env.KB_TEMPLATE_DIR || defaultKbTemplateDir();
472
- this.ontologySessionBlock =
473
- (process.env.ONTOLOGY_SESSION_BLOCK ?? 'true').trim().toLowerCase() !== 'false';
474
480
  this.updateCheckEnabled =
475
481
  (process.env.UPDATE_CHECK ?? 'true').trim().toLowerCase() !== 'false';
476
482
  this.allowedEmailDomains = (process.env.ALLOWED_EMAIL_DOMAINS || '')
@@ -621,5 +627,16 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
621
627
  ) {
622
628
  throw new Error(`KB_DIR_NAME must be a single path segment: ${this.kbDirName}`);
623
629
  }
630
+ // A control character, a line break above all: this name is PREFIXED onto
631
+ // every workspace-relative path, and a line break in a path is a separator
632
+ // in git's line-oriented stdin protocols (`cat-file --batch` reads one
633
+ // `<ref>:<path>` per line). A name carrying one would make the normaliser
634
+ // emit the very path it refuses from a caller — so the deployment fails to
635
+ // boot rather than resolving paths nothing downstream can safely read.
636
+ if (hasControlCharacter(this.kbDirName)) {
637
+ throw new Error(
638
+ `KB_DIR_NAME must not contain a control character: "${sanitizedPath(this.kbDirName)}"`,
639
+ );
640
+ }
624
641
  }
625
642
  }
package/src/index.ts CHANGED
@@ -52,18 +52,36 @@ export { coreMigrationsDir, defaultKbTemplateDir } from './assets.js';
52
52
  export {
53
53
  runCoreMigrations,
54
54
  runEnterpriseMigrations,
55
+ runPiiEncryptionBackfill,
55
56
  } from './modules/database/migrate.js';
56
57
  export {
57
58
  getDb,
58
59
  createDb,
59
60
  closeDb,
60
61
  dbSchemaOf,
62
+ piiKeysOf,
61
63
  assertSchemaName,
62
64
  DEFAULT_DB_SCHEMA,
63
65
  type Database,
64
66
  type DbOptions,
65
67
  } from './modules/database/connection.js';
66
68
 
69
+ // PII column encryption (see shared/column-crypto.ts). The key belongs to the
70
+ // database handle (`createDb(url, { piiKey })`), so an overlay seals its own
71
+ // schema's columns by declaring them `encryptedText` / `blindIndexText` and
72
+ // running on the handle the composition root built. `derivePiiKeys` and
73
+ // `piiKeysOf` are for code that handles the stored form itself: SQL written
74
+ // by hand, or a process that reads a knowledge base's tables without a handle
75
+ // of this package's.
76
+ export {
77
+ encryptedText,
78
+ blindIndexText,
79
+ derivePiiKeys,
80
+ isEncryptedBlob,
81
+ PII_CIPHERTEXT_PREFIX,
82
+ type PiiKeys,
83
+ } from './shared/column-crypto.js';
84
+
67
85
  // Build identity surfaced by GET /api/health.
68
86
  export { GIT_SHA, resolveGitSha } from './version.js';
69
87
 
@@ -101,8 +119,18 @@ export type {
101
119
  export type { ILlmUsageMeter } from './modules/tool-auth/llm-usage-meter.js';
102
120
  export type { AuthProviderPlugin } from './modules/auth/auth.routes.js';
103
121
  export type { IErasureParticipant } from './modules/auth/account-erasure.service.js';
122
+ export {
123
+ alwaysWritable,
124
+ READ_ONLY_CODE,
125
+ type IWriteAccess,
126
+ type WriteAccessVerdict,
127
+ } from './modules/write-access/write-access.js';
104
128
  export {
105
129
  AccountAdmissionRefusedError,
130
+ AccountDeactivatedError,
131
+ AccountChangeRefusedError,
132
+ AuthBackendError,
133
+ ACCOUNT_DEACTIVATED_MESSAGE,
106
134
  admitEveryone,
107
135
  type AccountAdmissionVerdict,
108
136
  type AccountProvisionReason,
@@ -112,6 +140,7 @@ export {
112
140
  WorkflowHooks,
113
141
  type CommitValidationHook,
114
142
  type CommitValidationContext,
143
+ type AgentOperationContext,
144
+ type AgentReadHook,
115
145
  type PreWriteHook,
116
- type PreWriteContext,
117
146
  } from './modules/workflow/workflow-hooks.js';