@bevel-software/platform-core-backend 0.1.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 (720) hide show
  1. package/LICENSE +202 -0
  2. package/dist/assets.d.ts +5 -0
  3. package/dist/assets.d.ts.map +1 -0
  4. package/dist/assets.js +23 -0
  5. package/dist/assets.js.map +1 -0
  6. package/dist/core/core-ports.d.ts +83 -0
  7. package/dist/core/core-ports.d.ts.map +1 -0
  8. package/dist/core/core-ports.js +12 -0
  9. package/dist/core/core-ports.js.map +1 -0
  10. package/dist/core/create-core-server.d.ts +62 -0
  11. package/dist/core/create-core-server.d.ts.map +1 -0
  12. package/dist/core/create-core-server.js +204 -0
  13. package/dist/core/create-core-server.js.map +1 -0
  14. package/dist/core/create-core-services.d.ts +95 -0
  15. package/dist/core/create-core-services.d.ts.map +1 -0
  16. package/dist/core/create-core-services.js +352 -0
  17. package/dist/core/create-core-services.js.map +1 -0
  18. package/dist/core-config.d.ts +119 -0
  19. package/dist/core-config.d.ts.map +1 -0
  20. package/dist/core-config.js +240 -0
  21. package/dist/core-config.js.map +1 -0
  22. package/dist/index.d.ts +36 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +36 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/modules/access/access-control.interface.d.ts +348 -0
  27. package/dist/modules/access/access-control.interface.d.ts.map +1 -0
  28. package/dist/modules/access/access-control.interface.js +2 -0
  29. package/dist/modules/access/access-control.interface.js.map +1 -0
  30. package/dist/modules/access/access-control.service.d.ts +323 -0
  31. package/dist/modules/access/access-control.service.d.ts.map +1 -0
  32. package/dist/modules/access/access-control.service.js +1431 -0
  33. package/dist/modules/access/access-control.service.js.map +1 -0
  34. package/dist/modules/access/access-errors.d.ts +34 -0
  35. package/dist/modules/access/access-errors.d.ts.map +1 -0
  36. package/dist/modules/access/access-errors.js +40 -0
  37. package/dist/modules/access/access-errors.js.map +1 -0
  38. package/dist/modules/access/access-mutation.service.d.ts +176 -0
  39. package/dist/modules/access/access-mutation.service.d.ts.map +1 -0
  40. package/dist/modules/access/access-mutation.service.js +307 -0
  41. package/dist/modules/access/access-mutation.service.js.map +1 -0
  42. package/dist/modules/access/access-splice.d.ts +98 -0
  43. package/dist/modules/access/access-splice.d.ts.map +1 -0
  44. package/dist/modules/access/access-splice.js +346 -0
  45. package/dist/modules/access/access-splice.js.map +1 -0
  46. package/dist/modules/access/access.routes.d.ts +10 -0
  47. package/dist/modules/access/access.routes.d.ts.map +1 -0
  48. package/dist/modules/access/access.routes.js +757 -0
  49. package/dist/modules/access/access.routes.js.map +1 -0
  50. package/dist/modules/access/creator-access.d.ts +113 -0
  51. package/dist/modules/access/creator-access.d.ts.map +1 -0
  52. package/dist/modules/access/creator-access.js +212 -0
  53. package/dist/modules/access/creator-access.js.map +1 -0
  54. package/dist/modules/access/kb-read-filter.d.ts +41 -0
  55. package/dist/modules/access/kb-read-filter.d.ts.map +1 -0
  56. package/dist/modules/access/kb-read-filter.js +60 -0
  57. package/dist/modules/access/kb-read-filter.js.map +1 -0
  58. package/dist/modules/access/roles-admin.service.d.ts +240 -0
  59. package/dist/modules/access/roles-admin.service.d.ts.map +1 -0
  60. package/dist/modules/access/roles-admin.service.js +630 -0
  61. package/dist/modules/access/roles-admin.service.js.map +1 -0
  62. package/dist/modules/access/roles-edit.d.ts +91 -0
  63. package/dist/modules/access/roles-edit.d.ts.map +1 -0
  64. package/dist/modules/access/roles-edit.js +232 -0
  65. package/dist/modules/access/roles-edit.js.map +1 -0
  66. package/dist/modules/access/roles-yaml-guard.d.ts +56 -0
  67. package/dist/modules/access/roles-yaml-guard.d.ts.map +1 -0
  68. package/dist/modules/access/roles-yaml-guard.js +79 -0
  69. package/dist/modules/access/roles-yaml-guard.js.map +1 -0
  70. package/dist/modules/admin/admin-access.routes.d.ts +18 -0
  71. package/dist/modules/admin/admin-access.routes.d.ts.map +1 -0
  72. package/dist/modules/admin/admin-access.routes.js +26 -0
  73. package/dist/modules/admin/admin-access.routes.js.map +1 -0
  74. package/dist/modules/admin/admin-access.service.d.ts +24 -0
  75. package/dist/modules/admin/admin-access.service.d.ts.map +1 -0
  76. package/dist/modules/admin/admin-access.service.js +41 -0
  77. package/dist/modules/admin/admin-access.service.js.map +1 -0
  78. package/dist/modules/admin/admin.interface.d.ts +11 -0
  79. package/dist/modules/admin/admin.interface.d.ts.map +1 -0
  80. package/dist/modules/admin/admin.interface.js +2 -0
  81. package/dist/modules/admin/admin.interface.js.map +1 -0
  82. package/dist/modules/auth/account-erasure.service.d.ts +80 -0
  83. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -0
  84. package/dist/modules/auth/account-erasure.service.js +91 -0
  85. package/dist/modules/auth/account-erasure.service.js.map +1 -0
  86. package/dist/modules/auth/auth.middleware.d.ts +23 -0
  87. package/dist/modules/auth/auth.middleware.d.ts.map +1 -0
  88. package/dist/modules/auth/auth.middleware.js +68 -0
  89. package/dist/modules/auth/auth.middleware.js.map +1 -0
  90. package/dist/modules/auth/auth.routes.d.ts +25 -0
  91. package/dist/modules/auth/auth.routes.d.ts.map +1 -0
  92. package/dist/modules/auth/auth.routes.js +72 -0
  93. package/dist/modules/auth/auth.routes.js.map +1 -0
  94. package/dist/modules/auth/auth.service.d.ts +76 -0
  95. package/dist/modules/auth/auth.service.d.ts.map +1 -0
  96. package/dist/modules/auth/auth.service.js +168 -0
  97. package/dist/modules/auth/auth.service.js.map +1 -0
  98. package/dist/modules/code-mode/code-mode-names.d.ts +16 -0
  99. package/dist/modules/code-mode/code-mode-names.d.ts.map +1 -0
  100. package/dist/modules/code-mode/code-mode-names.js +30 -0
  101. package/dist/modules/code-mode/code-mode-names.js.map +1 -0
  102. package/dist/modules/code-mode/code-mode.tool.d.ts +13 -0
  103. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -0
  104. package/dist/modules/code-mode/code-mode.tool.js +112 -0
  105. package/dist/modules/code-mode/code-mode.tool.js.map +1 -0
  106. package/dist/modules/code-mode/index.d.ts +3 -0
  107. package/dist/modules/code-mode/index.d.ts.map +1 -0
  108. package/dist/modules/code-mode/index.js +3 -0
  109. package/dist/modules/code-mode/index.js.map +1 -0
  110. package/dist/modules/database/connection.d.ts +6 -0
  111. package/dist/modules/database/connection.d.ts.map +1 -0
  112. package/dist/modules/database/connection.js +12 -0
  113. package/dist/modules/database/connection.js.map +1 -0
  114. package/dist/modules/database/core-schema.d.ts +2273 -0
  115. package/dist/modules/database/core-schema.d.ts.map +1 -0
  116. package/dist/modules/database/core-schema.js +413 -0
  117. package/dist/modules/database/core-schema.js.map +1 -0
  118. package/dist/modules/database/migrate.d.ts +10 -0
  119. package/dist/modules/database/migrate.d.ts.map +1 -0
  120. package/dist/modules/database/migrate.js +40 -0
  121. package/dist/modules/database/migrate.js.map +1 -0
  122. package/dist/modules/database/schema.d.ts +12 -0
  123. package/dist/modules/database/schema.d.ts.map +1 -0
  124. package/dist/modules/database/schema.js +12 -0
  125. package/dist/modules/database/schema.js.map +1 -0
  126. package/dist/modules/diff/diff-paths.d.ts +2 -0
  127. package/dist/modules/diff/diff-paths.d.ts.map +1 -0
  128. package/dist/modules/diff/diff-paths.js +9 -0
  129. package/dist/modules/diff/diff-paths.js.map +1 -0
  130. package/dist/modules/diff/diff.config.d.ts +8 -0
  131. package/dist/modules/diff/diff.config.d.ts.map +1 -0
  132. package/dist/modules/diff/diff.config.js +13 -0
  133. package/dist/modules/diff/diff.config.js.map +1 -0
  134. package/dist/modules/diff/diff.interface.d.ts +73 -0
  135. package/dist/modules/diff/diff.interface.d.ts.map +1 -0
  136. package/dist/modules/diff/diff.interface.js +2 -0
  137. package/dist/modules/diff/diff.interface.js.map +1 -0
  138. package/dist/modules/diff/diff.routes.d.ts +35 -0
  139. package/dist/modules/diff/diff.routes.d.ts.map +1 -0
  140. package/dist/modules/diff/diff.routes.js +228 -0
  141. package/dist/modules/diff/diff.routes.js.map +1 -0
  142. package/dist/modules/diff/diff.service.d.ts +51 -0
  143. package/dist/modules/diff/diff.service.d.ts.map +1 -0
  144. package/dist/modules/diff/diff.service.js +489 -0
  145. package/dist/modules/diff/diff.service.js.map +1 -0
  146. package/dist/modules/diff/line-diff.d.ts +16 -0
  147. package/dist/modules/diff/line-diff.d.ts.map +1 -0
  148. package/dist/modules/diff/line-diff.js +67 -0
  149. package/dist/modules/diff/line-diff.js.map +1 -0
  150. package/dist/modules/mcp/mcp-auth.middleware.d.ts +27 -0
  151. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -0
  152. package/dist/modules/mcp/mcp-auth.middleware.js +116 -0
  153. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -0
  154. package/dist/modules/mcp/mcp-session-store.d.ts +74 -0
  155. package/dist/modules/mcp/mcp-session-store.d.ts.map +1 -0
  156. package/dist/modules/mcp/mcp-session-store.js +131 -0
  157. package/dist/modules/mcp/mcp-session-store.js.map +1 -0
  158. package/dist/modules/mcp/mcp.routes.d.ts +24 -0
  159. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -0
  160. package/dist/modules/mcp/mcp.routes.js +229 -0
  161. package/dist/modules/mcp/mcp.routes.js.map +1 -0
  162. package/dist/modules/mcp/mcp.service.d.ts +198 -0
  163. package/dist/modules/mcp/mcp.service.d.ts.map +1 -0
  164. package/dist/modules/mcp/mcp.service.js +840 -0
  165. package/dist/modules/mcp/mcp.service.js.map +1 -0
  166. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +76 -0
  167. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -0
  168. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +291 -0
  169. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -0
  170. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +18 -0
  171. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -0
  172. package/dist/modules/mcp/oauth/oauth-consent.routes.js +52 -0
  173. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -0
  174. package/dist/modules/mcp/oauth/oauth-state.d.ts +32 -0
  175. package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -0
  176. package/dist/modules/mcp/oauth/oauth-state.js +34 -0
  177. package/dist/modules/mcp/oauth/oauth-state.js.map +1 -0
  178. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +92 -0
  179. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -0
  180. package/dist/modules/secrets-vault/db-secrets-vault.service.js +728 -0
  181. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -0
  182. package/dist/modules/secrets-vault/index.d.ts +7 -0
  183. package/dist/modules/secrets-vault/index.d.ts.map +1 -0
  184. package/dist/modules/secrets-vault/index.js +6 -0
  185. package/dist/modules/secrets-vault/index.js.map +1 -0
  186. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts +63 -0
  187. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -0
  188. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +269 -0
  189. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -0
  190. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +46 -0
  191. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -0
  192. package/dist/modules/secrets-vault/secrets-variable-loader.js +87 -0
  193. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -0
  194. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +210 -0
  195. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -0
  196. package/dist/modules/secrets-vault/secrets-vault.contract.js +90 -0
  197. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -0
  198. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +30 -0
  199. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -0
  200. package/dist/modules/secrets-vault/secrets-vault.routes.js +490 -0
  201. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -0
  202. package/dist/modules/skills/index.d.ts +5 -0
  203. package/dist/modules/skills/index.d.ts.map +1 -0
  204. package/dist/modules/skills/index.js +4 -0
  205. package/dist/modules/skills/index.js.map +1 -0
  206. package/dist/modules/skills/skills.contract.d.ts +58 -0
  207. package/dist/modules/skills/skills.contract.d.ts.map +1 -0
  208. package/dist/modules/skills/skills.contract.js +10 -0
  209. package/dist/modules/skills/skills.contract.js.map +1 -0
  210. package/dist/modules/skills/skills.routes.d.ts +15 -0
  211. package/dist/modules/skills/skills.routes.d.ts.map +1 -0
  212. package/dist/modules/skills/skills.routes.js +34 -0
  213. package/dist/modules/skills/skills.routes.js.map +1 -0
  214. package/dist/modules/skills/skills.service.d.ts +21 -0
  215. package/dist/modules/skills/skills.service.d.ts.map +1 -0
  216. package/dist/modules/skills/skills.service.js +202 -0
  217. package/dist/modules/skills/skills.service.js.map +1 -0
  218. package/dist/modules/skills/skills.tools.d.ts +15 -0
  219. package/dist/modules/skills/skills.tools.d.ts.map +1 -0
  220. package/dist/modules/skills/skills.tools.js +96 -0
  221. package/dist/modules/skills/skills.tools.js.map +1 -0
  222. package/dist/modules/tool-auth/external-api-key.errors.d.ts +14 -0
  223. package/dist/modules/tool-auth/external-api-key.errors.d.ts.map +1 -0
  224. package/dist/modules/tool-auth/external-api-key.errors.js +23 -0
  225. package/dist/modules/tool-auth/external-api-key.errors.js.map +1 -0
  226. package/dist/modules/tool-auth/external-api-key.interface.d.ts +90 -0
  227. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -0
  228. package/dist/modules/tool-auth/external-api-key.interface.js +2 -0
  229. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -0
  230. package/dist/modules/tool-auth/external-api-key.service.d.ts +25 -0
  231. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -0
  232. package/dist/modules/tool-auth/external-api-key.service.js +164 -0
  233. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -0
  234. package/dist/modules/tool-auth/internal-token.service.d.ts +62 -0
  235. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -0
  236. package/dist/modules/tool-auth/internal-token.service.js +85 -0
  237. package/dist/modules/tool-auth/internal-token.service.js.map +1 -0
  238. package/dist/modules/tool-auth/llm-usage-meter.d.ts +16 -0
  239. package/dist/modules/tool-auth/llm-usage-meter.d.ts.map +1 -0
  240. package/dist/modules/tool-auth/llm-usage-meter.js +6 -0
  241. package/dist/modules/tool-auth/llm-usage-meter.js.map +1 -0
  242. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +101 -0
  243. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -0
  244. package/dist/modules/tool-auth/tool-auth.middleware.js +166 -0
  245. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -0
  246. package/dist/modules/tool-helpers/index.d.ts +19 -0
  247. package/dist/modules/tool-helpers/index.d.ts.map +1 -0
  248. package/dist/modules/tool-helpers/index.js +18 -0
  249. package/dist/modules/tool-helpers/index.js.map +1 -0
  250. package/dist/modules/tool-helpers/tool-context.d.ts +35 -0
  251. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -0
  252. package/dist/modules/tool-helpers/tool-context.js +66 -0
  253. package/dist/modules/tool-helpers/tool-context.js.map +1 -0
  254. package/dist/modules/tool-helpers/tool-def.d.ts +33 -0
  255. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -0
  256. package/dist/modules/tool-helpers/tool-def.js +57 -0
  257. package/dist/modules/tool-helpers/tool-def.js.map +1 -0
  258. package/dist/modules/tool-helpers/tool-handler.d.ts +19 -0
  259. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -0
  260. package/dist/modules/tool-helpers/tool-handler.js +84 -0
  261. package/dist/modules/tool-helpers/tool-handler.js.map +1 -0
  262. package/dist/modules/tool-helpers/tool.contract.d.ts +64 -0
  263. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -0
  264. package/dist/modules/tool-helpers/tool.contract.js +24 -0
  265. package/dist/modules/tool-helpers/tool.contract.js.map +1 -0
  266. package/dist/modules/tool-helpers/validate-token.d.ts +31 -0
  267. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -0
  268. package/dist/modules/tool-helpers/validate-token.js +20 -0
  269. package/dist/modules/tool-helpers/validate-token.js.map +1 -0
  270. package/dist/modules/tool-manuals/index.d.ts +5 -0
  271. package/dist/modules/tool-manuals/index.d.ts.map +1 -0
  272. package/dist/modules/tool-manuals/index.js +5 -0
  273. package/dist/modules/tool-manuals/index.js.map +1 -0
  274. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +182 -0
  275. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -0
  276. package/dist/modules/tool-manuals/tool-manuals.contract.js +19 -0
  277. package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -0
  278. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +24 -0
  279. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -0
  280. package/dist/modules/tool-manuals/tool-manuals.routes.js +102 -0
  281. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -0
  282. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +108 -0
  283. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -0
  284. package/dist/modules/tool-manuals/tool-manuals.service.js +710 -0
  285. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -0
  286. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +35 -0
  287. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -0
  288. package/dist/modules/tool-manuals/tool-manuals.tools.js +157 -0
  289. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -0
  290. package/dist/modules/tool-registry/manual.routes.d.ts +6 -0
  291. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -0
  292. package/dist/modules/tool-registry/manual.routes.js +76 -0
  293. package/dist/modules/tool-registry/manual.routes.js.map +1 -0
  294. package/dist/modules/tool-registry/tool-registry.d.ts +23 -0
  295. package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -0
  296. package/dist/modules/tool-registry/tool-registry.js +46 -0
  297. package/dist/modules/tool-registry/tool-registry.js.map +1 -0
  298. package/dist/modules/tool-registry/tool.contract.d.ts +48 -0
  299. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -0
  300. package/dist/modules/tool-registry/tool.contract.js +2 -0
  301. package/dist/modules/tool-registry/tool.contract.js.map +1 -0
  302. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +14 -0
  303. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -0
  304. package/dist/modules/workflow/agent-tools/workflow.tools.js +437 -0
  305. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -0
  306. package/dist/modules/workflow/event-bus.d.ts +107 -0
  307. package/dist/modules/workflow/event-bus.d.ts.map +1 -0
  308. package/dist/modules/workflow/event-bus.js +224 -0
  309. package/dist/modules/workflow/event-bus.js.map +1 -0
  310. package/dist/modules/workflow/events.routes.d.ts +80 -0
  311. package/dist/modules/workflow/events.routes.d.ts.map +1 -0
  312. package/dist/modules/workflow/events.routes.js +216 -0
  313. package/dist/modules/workflow/events.routes.js.map +1 -0
  314. package/dist/modules/workflow/file-change-notifier.d.ts +38 -0
  315. package/dist/modules/workflow/file-change-notifier.d.ts.map +1 -0
  316. package/dist/modules/workflow/file-change-notifier.js +22 -0
  317. package/dist/modules/workflow/file-change-notifier.js.map +1 -0
  318. package/dist/modules/workflow/file-lock.service.d.ts +57 -0
  319. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -0
  320. package/dist/modules/workflow/file-lock.service.js +202 -0
  321. package/dist/modules/workflow/file-lock.service.js.map +1 -0
  322. package/dist/modules/workflow/git/branch-name.d.ts +10 -0
  323. package/dist/modules/workflow/git/branch-name.d.ts.map +1 -0
  324. package/dist/modules/workflow/git/branch-name.js +76 -0
  325. package/dist/modules/workflow/git/branch-name.js.map +1 -0
  326. package/dist/modules/workflow/git/clone-config.d.ts +61 -0
  327. package/dist/modules/workflow/git/clone-config.d.ts.map +1 -0
  328. package/dist/modules/workflow/git/clone-config.js +69 -0
  329. package/dist/modules/workflow/git/clone-config.js.map +1 -0
  330. package/dist/modules/workflow/git/git-version.d.ts +34 -0
  331. package/dist/modules/workflow/git/git-version.d.ts.map +1 -0
  332. package/dist/modules/workflow/git/git-version.js +63 -0
  333. package/dist/modules/workflow/git/git-version.js.map +1 -0
  334. package/dist/modules/workflow/git/git.service.d.ts +427 -0
  335. package/dist/modules/workflow/git/git.service.d.ts.map +1 -0
  336. package/dist/modules/workflow/git/git.service.js +1987 -0
  337. package/dist/modules/workflow/git/git.service.js.map +1 -0
  338. package/dist/modules/workflow/git/mutex.d.ts +11 -0
  339. package/dist/modules/workflow/git/mutex.d.ts.map +1 -0
  340. package/dist/modules/workflow/git/mutex.js +23 -0
  341. package/dist/modules/workflow/git/mutex.js.map +1 -0
  342. package/dist/modules/workflow/git/pull-request.service.d.ts +124 -0
  343. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -0
  344. package/dist/modules/workflow/git/pull-request.service.js +328 -0
  345. package/dist/modules/workflow/git/pull-request.service.js.map +1 -0
  346. package/dist/modules/workflow/locking-filesystem.d.ts +133 -0
  347. package/dist/modules/workflow/locking-filesystem.d.ts.map +1 -0
  348. package/dist/modules/workflow/locking-filesystem.js +400 -0
  349. package/dist/modules/workflow/locking-filesystem.js.map +1 -0
  350. package/dist/modules/workflow/pending-commits.service.d.ts +221 -0
  351. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -0
  352. package/dist/modules/workflow/pending-commits.service.js +364 -0
  353. package/dist/modules/workflow/pending-commits.service.js.map +1 -0
  354. package/dist/modules/workflow/pending-commits.worker.d.ts +148 -0
  355. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -0
  356. package/dist/modules/workflow/pending-commits.worker.js +245 -0
  357. package/dist/modules/workflow/pending-commits.worker.js.map +1 -0
  358. package/dist/modules/workflow/read-only-filesystem.d.ts +24 -0
  359. package/dist/modules/workflow/read-only-filesystem.d.ts.map +1 -0
  360. package/dist/modules/workflow/read-only-filesystem.js +39 -0
  361. package/dist/modules/workflow/read-only-filesystem.js.map +1 -0
  362. package/dist/modules/workflow/recovery-bot.d.ts +31 -0
  363. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -0
  364. package/dist/modules/workflow/recovery-bot.js +64 -0
  365. package/dist/modules/workflow/recovery-bot.js.map +1 -0
  366. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +137 -0
  367. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -0
  368. package/dist/modules/workflow/review-workflow/review-workflow.interface.js +2 -0
  369. package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +1 -0
  370. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +26 -0
  371. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -0
  372. package/dist/modules/workflow/review-workflow/review-workflow.service.js +636 -0
  373. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -0
  374. package/dist/modules/workflow/sanitize-error.d.ts +29 -0
  375. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -0
  376. package/dist/modules/workflow/sanitize-error.js +60 -0
  377. package/dist/modules/workflow/sanitize-error.js.map +1 -0
  378. package/dist/modules/workflow/session-ontology.policy.d.ts +52 -0
  379. package/dist/modules/workflow/session-ontology.policy.d.ts.map +1 -0
  380. package/dist/modules/workflow/session-ontology.policy.js +62 -0
  381. package/dist/modules/workflow/session-ontology.policy.js.map +1 -0
  382. package/dist/modules/workflow/session-ontology.service.d.ts +100 -0
  383. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -0
  384. package/dist/modules/workflow/session-ontology.service.js +143 -0
  385. package/dist/modules/workflow/session-ontology.service.js.map +1 -0
  386. package/dist/modules/workflow/workflow-hooks.d.ts +87 -0
  387. package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -0
  388. package/dist/modules/workflow/workflow-hooks.js +35 -0
  389. package/dist/modules/workflow/workflow-hooks.js.map +1 -0
  390. package/dist/modules/workflow/workflow.errors.d.ts +171 -0
  391. package/dist/modules/workflow/workflow.errors.d.ts.map +1 -0
  392. package/dist/modules/workflow/workflow.errors.js +260 -0
  393. package/dist/modules/workflow/workflow.errors.js.map +1 -0
  394. package/dist/modules/workflow/workflow.routes.d.ts +26 -0
  395. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -0
  396. package/dist/modules/workflow/workflow.routes.js +804 -0
  397. package/dist/modules/workflow/workflow.routes.js.map +1 -0
  398. package/dist/modules/workflow/workflow.service.d.ts +385 -0
  399. package/dist/modules/workflow/workflow.service.d.ts.map +1 -0
  400. package/dist/modules/workflow/workflow.service.js +1155 -0
  401. package/dist/modules/workflow/workflow.service.js.map +1 -0
  402. package/dist/modules/workspace/bevel-ignore.d.ts +25 -0
  403. package/dist/modules/workspace/bevel-ignore.d.ts.map +1 -0
  404. package/dist/modules/workspace/bevel-ignore.js +57 -0
  405. package/dist/modules/workspace/bevel-ignore.js.map +1 -0
  406. package/dist/modules/workspace/kb-seed.interface.d.ts +36 -0
  407. package/dist/modules/workspace/kb-seed.interface.d.ts.map +1 -0
  408. package/dist/modules/workspace/kb-seed.interface.js +2 -0
  409. package/dist/modules/workspace/kb-seed.interface.js.map +1 -0
  410. package/dist/modules/workspace/kb-seed.service.d.ts +70 -0
  411. package/dist/modules/workspace/kb-seed.service.d.ts.map +1 -0
  412. package/dist/modules/workspace/kb-seed.service.js +325 -0
  413. package/dist/modules/workspace/kb-seed.service.js.map +1 -0
  414. package/dist/modules/workspace/routine-write-policy.d.ts +49 -0
  415. package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -0
  416. package/dist/modules/workspace/routine-write-policy.js +46 -0
  417. package/dist/modules/workspace/routine-write-policy.js.map +1 -0
  418. package/dist/modules/workspace/session-ontology.gate.d.ts +112 -0
  419. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -0
  420. package/dist/modules/workspace/session-ontology.gate.js +161 -0
  421. package/dist/modules/workspace/session-ontology.gate.js.map +1 -0
  422. package/dist/modules/workspace/session-sink.d.ts +25 -0
  423. package/dist/modules/workspace/session-sink.d.ts.map +1 -0
  424. package/dist/modules/workspace/session-sink.js +8 -0
  425. package/dist/modules/workspace/session-sink.js.map +1 -0
  426. package/dist/modules/workspace/spill-store.d.ts +24 -0
  427. package/dist/modules/workspace/spill-store.d.ts.map +1 -0
  428. package/dist/modules/workspace/spill-store.js +87 -0
  429. package/dist/modules/workspace/spill-store.js.map +1 -0
  430. package/dist/modules/workspace/workspace.routes.d.ts +25 -0
  431. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -0
  432. package/dist/modules/workspace/workspace.routes.js +1046 -0
  433. package/dist/modules/workspace/workspace.routes.js.map +1 -0
  434. package/dist/modules/workspace/workspace.service.d.ts +339 -0
  435. package/dist/modules/workspace/workspace.service.d.ts.map +1 -0
  436. package/dist/modules/workspace/workspace.service.js +1221 -0
  437. package/dist/modules/workspace/workspace.service.js.map +1 -0
  438. package/dist/modules/workspace/workspace.tools.d.ts +19 -0
  439. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -0
  440. package/dist/modules/workspace/workspace.tools.js +767 -0
  441. package/dist/modules/workspace/workspace.tools.js.map +1 -0
  442. package/dist/shared/frontmatter-id.d.ts +35 -0
  443. package/dist/shared/frontmatter-id.d.ts.map +1 -0
  444. package/dist/shared/frontmatter-id.js +68 -0
  445. package/dist/shared/frontmatter-id.js.map +1 -0
  446. package/dist/shared/fs-walk.d.ts +9 -0
  447. package/dist/shared/fs-walk.d.ts.map +1 -0
  448. package/dist/shared/fs-walk.js +34 -0
  449. package/dist/shared/fs-walk.js.map +1 -0
  450. package/dist/shared/hash-email.d.ts +11 -0
  451. package/dist/shared/hash-email.d.ts.map +1 -0
  452. package/dist/shared/hash-email.js +14 -0
  453. package/dist/shared/hash-email.js.map +1 -0
  454. package/dist/shared/kb-layout.d.ts +38 -0
  455. package/dist/shared/kb-layout.d.ts.map +1 -0
  456. package/dist/shared/kb-layout.js +102 -0
  457. package/dist/shared/kb-layout.js.map +1 -0
  458. package/dist/shared/kb-layout.test.d.ts +2 -0
  459. package/dist/shared/kb-layout.test.d.ts.map +1 -0
  460. package/dist/shared/kb-layout.test.js +67 -0
  461. package/dist/shared/kb-layout.test.js.map +1 -0
  462. package/dist/shared/ssrf.d.ts +20 -0
  463. package/dist/shared/ssrf.d.ts.map +1 -0
  464. package/dist/shared/ssrf.js +89 -0
  465. package/dist/shared/ssrf.js.map +1 -0
  466. package/dist/shared/token-crypto.d.ts +16 -0
  467. package/dist/shared/token-crypto.d.ts.map +1 -0
  468. package/dist/shared/token-crypto.js +49 -0
  469. package/dist/shared/token-crypto.js.map +1 -0
  470. package/dist/shared/ttl-cache.d.ts +16 -0
  471. package/dist/shared/ttl-cache.d.ts.map +1 -0
  472. package/dist/shared/ttl-cache.js +27 -0
  473. package/dist/shared/ttl-cache.js.map +1 -0
  474. package/dist/shared/utcp-namespace.d.ts +46 -0
  475. package/dist/shared/utcp-namespace.d.ts.map +1 -0
  476. package/dist/shared/utcp-namespace.js +82 -0
  477. package/dist/shared/utcp-namespace.js.map +1 -0
  478. package/dist/version.d.ts +17 -0
  479. package/dist/version.d.ts.map +1 -0
  480. package/dist/version.js +19 -0
  481. package/dist/version.js.map +1 -0
  482. package/kb-template/.bevelignore +21 -0
  483. package/kb-template/Agents/.gitkeep +0 -0
  484. package/kb-template/Agents/README.md +38 -0
  485. package/kb-template/CLAUDE.md +419 -0
  486. package/kb-template/Data/.gitkeep +0 -0
  487. package/kb-template/Data/README.md +39 -0
  488. package/kb-template/KnowledgeBase/.gitkeep +0 -0
  489. package/kb-template/KnowledgeBase/README.md +37 -0
  490. package/kb-template/Pipelines/.gitkeep +0 -0
  491. package/kb-template/Pipelines/README.md +38 -0
  492. package/kb-template/Skills/.gitkeep +0 -0
  493. package/kb-template/Skills/README.md +32 -0
  494. package/kb-template/Tools/.gitkeep +0 -0
  495. package/kb-template/Tools/README.md +42 -0
  496. package/kb-template/access.md +36 -0
  497. package/migrations/0000_core_init.sql +243 -0
  498. package/migrations/meta/0000_snapshot.json +1480 -0
  499. package/migrations/meta/_journal.json +13 -0
  500. package/package.json +80 -0
  501. package/src/assets.ts +25 -0
  502. package/src/core/core-ports.ts +91 -0
  503. package/src/core/create-core-server.ts +338 -0
  504. package/src/core/create-core-services.ts +501 -0
  505. package/src/core-config.ts +257 -0
  506. package/src/index.ts +69 -0
  507. package/src/modules/access/__tests__/access-control.atref-batch.test.ts +98 -0
  508. package/src/modules/access/__tests__/access-control.read-batch.test.ts +132 -0
  509. package/src/modules/access/__tests__/access-control.service.test.ts +1011 -0
  510. package/src/modules/access/__tests__/access-mutation.service.test.ts +439 -0
  511. package/src/modules/access/__tests__/access-splice.test.ts +247 -0
  512. package/src/modules/access/__tests__/access.routes.revoke.test.ts +407 -0
  513. package/src/modules/access/__tests__/creator-access.test.ts +217 -0
  514. package/src/modules/access/__tests__/grant-sources.test.ts +204 -0
  515. package/src/modules/access/__tests__/kb-read-filter.test.ts +70 -0
  516. package/src/modules/access/__tests__/roles-admin.service.test.ts +469 -0
  517. package/src/modules/access/__tests__/roles-edit.test.ts +138 -0
  518. package/src/modules/access/__tests__/roles-yaml-guard.test.ts +70 -0
  519. package/src/modules/access/__tests__/roles.routes.test.ts +234 -0
  520. package/src/modules/access/access-control.interface.ts +383 -0
  521. package/src/modules/access/access-control.service.ts +1794 -0
  522. package/src/modules/access/access-errors.ts +60 -0
  523. package/src/modules/access/access-mutation.service.ts +369 -0
  524. package/src/modules/access/access-splice.ts +413 -0
  525. package/src/modules/access/access.routes.ts +894 -0
  526. package/src/modules/access/creator-access.ts +270 -0
  527. package/src/modules/access/kb-read-filter.ts +76 -0
  528. package/src/modules/access/roles-admin.service.ts +741 -0
  529. package/src/modules/access/roles-edit.ts +248 -0
  530. package/src/modules/access/roles-yaml-guard.ts +89 -0
  531. package/src/modules/admin/admin-access.routes.ts +29 -0
  532. package/src/modules/admin/admin-access.service.ts +38 -0
  533. package/src/modules/admin/admin.interface.ts +10 -0
  534. package/src/modules/auth/account-erasure.service.ts +183 -0
  535. package/src/modules/auth/auth.middleware.ts +78 -0
  536. package/src/modules/auth/auth.routes.ts +97 -0
  537. package/src/modules/auth/auth.service.ts +199 -0
  538. package/src/modules/code-mode/code-mode-names.ts +38 -0
  539. package/src/modules/code-mode/code-mode.tool.ts +117 -0
  540. package/src/modules/code-mode/index.ts +6 -0
  541. package/src/modules/database/connection.ts +15 -0
  542. package/src/modules/database/core-schema.ts +431 -0
  543. package/src/modules/database/migrate.ts +43 -0
  544. package/src/modules/database/schema.ts +11 -0
  545. package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +87 -0
  546. package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +150 -0
  547. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +184 -0
  548. package/src/modules/diff/__tests__/diff.service.test.ts +202 -0
  549. package/src/modules/diff/diff-paths.ts +9 -0
  550. package/src/modules/diff/diff.config.ts +12 -0
  551. package/src/modules/diff/diff.interface.ts +78 -0
  552. package/src/modules/diff/diff.routes.ts +277 -0
  553. package/src/modules/diff/diff.service.ts +508 -0
  554. package/src/modules/diff/line-diff.ts +79 -0
  555. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +287 -0
  556. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +249 -0
  557. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +253 -0
  558. package/src/modules/mcp/__tests__/mcp-session-store.test.ts +151 -0
  559. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +150 -0
  560. package/src/modules/mcp/__tests__/mcp.routes.delete.test.ts +92 -0
  561. package/src/modules/mcp/__tests__/mcp.service.test.ts +414 -0
  562. package/src/modules/mcp/mcp-auth.middleware.ts +126 -0
  563. package/src/modules/mcp/mcp-session-store.ts +162 -0
  564. package/src/modules/mcp/mcp.routes.ts +263 -0
  565. package/src/modules/mcp/mcp.service.ts +973 -0
  566. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +401 -0
  567. package/src/modules/mcp/oauth/oauth-consent.routes.ts +60 -0
  568. package/src/modules/mcp/oauth/oauth-state.ts +61 -0
  569. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +277 -0
  570. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +206 -0
  571. package/src/modules/secrets-vault/__tests__/mcp-oauth-discovery.service.test.ts +178 -0
  572. package/src/modules/secrets-vault/__tests__/scopes-covered.test.ts +101 -0
  573. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +54 -0
  574. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +143 -0
  575. package/src/modules/secrets-vault/db-secrets-vault.service.ts +792 -0
  576. package/src/modules/secrets-vault/index.ts +25 -0
  577. package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +289 -0
  578. package/src/modules/secrets-vault/secrets-variable-loader.ts +104 -0
  579. package/src/modules/secrets-vault/secrets-vault.contract.ts +270 -0
  580. package/src/modules/secrets-vault/secrets-vault.routes.ts +526 -0
  581. package/src/modules/skills/__tests__/skills.service.test.ts +176 -0
  582. package/src/modules/skills/index.ts +10 -0
  583. package/src/modules/skills/skills.contract.ts +54 -0
  584. package/src/modules/skills/skills.routes.ts +38 -0
  585. package/src/modules/skills/skills.service.ts +245 -0
  586. package/src/modules/skills/skills.tools.ts +121 -0
  587. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +358 -0
  588. package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +79 -0
  589. package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +88 -0
  590. package/src/modules/tool-auth/external-api-key.errors.ts +25 -0
  591. package/src/modules/tool-auth/external-api-key.interface.ts +99 -0
  592. package/src/modules/tool-auth/external-api-key.service.ts +209 -0
  593. package/src/modules/tool-auth/internal-token.service.ts +124 -0
  594. package/src/modules/tool-auth/llm-usage-meter.ts +19 -0
  595. package/src/modules/tool-auth/tool-auth.middleware.ts +220 -0
  596. package/src/modules/tool-helpers/__tests__/phase0-loopback-spike.test.ts +129 -0
  597. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +95 -0
  598. package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +146 -0
  599. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +75 -0
  600. package/src/modules/tool-helpers/index.ts +18 -0
  601. package/src/modules/tool-helpers/tool-context.ts +98 -0
  602. package/src/modules/tool-helpers/tool-def.ts +73 -0
  603. package/src/modules/tool-helpers/tool-handler.ts +91 -0
  604. package/src/modules/tool-helpers/tool.contract.ts +85 -0
  605. package/src/modules/tool-helpers/validate-token.ts +50 -0
  606. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +200 -0
  607. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +499 -0
  608. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +156 -0
  609. package/src/modules/tool-manuals/index.ts +12 -0
  610. package/src/modules/tool-manuals/tool-manuals.contract.ts +183 -0
  611. package/src/modules/tool-manuals/tool-manuals.routes.ts +110 -0
  612. package/src/modules/tool-manuals/tool-manuals.service.ts +781 -0
  613. package/src/modules/tool-manuals/tool-manuals.tools.ts +202 -0
  614. package/src/modules/tool-registry/__tests__/tool-registry.test.ts +64 -0
  615. package/src/modules/tool-registry/manual.routes.ts +87 -0
  616. package/src/modules/tool-registry/tool-registry.ts +55 -0
  617. package/src/modules/tool-registry/tool.contract.ts +52 -0
  618. package/src/modules/workflow/__tests__/event-bus.test.ts +322 -0
  619. package/src/modules/workflow/__tests__/file-change-notifier.test.ts +51 -0
  620. package/src/modules/workflow/__tests__/format-affected-owners.test.ts +67 -0
  621. package/src/modules/workflow/__tests__/locking-filesystem.test.ts +445 -0
  622. package/src/modules/workflow/__tests__/pending-commits.canonical.test.ts +36 -0
  623. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +243 -0
  624. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +308 -0
  625. package/src/modules/workflow/__tests__/sanitize-error.test.ts +67 -0
  626. package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +62 -0
  627. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +200 -0
  628. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +232 -0
  629. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +380 -0
  630. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +340 -0
  631. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +192 -0
  632. package/src/modules/workflow/agent-tools/workflow.tools.ts +502 -0
  633. package/src/modules/workflow/event-bus.ts +262 -0
  634. package/src/modules/workflow/events.routes.ts +266 -0
  635. package/src/modules/workflow/file-change-notifier.ts +54 -0
  636. package/src/modules/workflow/file-lock.service.ts +269 -0
  637. package/src/modules/workflow/git/__tests__/branch-name.test.ts +86 -0
  638. package/src/modules/workflow/git/__tests__/branchAuthor.test.ts +80 -0
  639. package/src/modules/workflow/git/__tests__/clone-config.test.ts +15 -0
  640. package/src/modules/workflow/git/__tests__/git-test-helpers.ts +47 -0
  641. package/src/modules/workflow/git/__tests__/git-version.failure.test.ts +24 -0
  642. package/src/modules/workflow/git/__tests__/git-version.test.ts +49 -0
  643. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +389 -0
  644. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
  645. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +105 -0
  646. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +211 -0
  647. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +154 -0
  648. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +320 -0
  649. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +202 -0
  650. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +453 -0
  651. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +198 -0
  652. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +125 -0
  653. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +219 -0
  654. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +145 -0
  655. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +240 -0
  656. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +272 -0
  657. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +232 -0
  658. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +101 -0
  659. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +127 -0
  660. package/src/modules/workflow/git/__tests__/mutex.test.ts +78 -0
  661. package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +225 -0
  662. package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +101 -0
  663. package/src/modules/workflow/git/branch-name.ts +70 -0
  664. package/src/modules/workflow/git/clone-config.ts +71 -0
  665. package/src/modules/workflow/git/git-version.ts +70 -0
  666. package/src/modules/workflow/git/git.service.ts +2248 -0
  667. package/src/modules/workflow/git/mutex.ts +22 -0
  668. package/src/modules/workflow/git/pull-request.service.ts +447 -0
  669. package/src/modules/workflow/locking-filesystem.ts +489 -0
  670. package/src/modules/workflow/pending-commits.service.ts +444 -0
  671. package/src/modules/workflow/pending-commits.worker.ts +361 -0
  672. package/src/modules/workflow/read-only-filesystem.ts +54 -0
  673. package/src/modules/workflow/recovery-bot.ts +73 -0
  674. package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +560 -0
  675. package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +176 -0
  676. package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +258 -0
  677. package/src/modules/workflow/review-workflow/review-workflow.interface.ts +199 -0
  678. package/src/modules/workflow/review-workflow/review-workflow.service.ts +806 -0
  679. package/src/modules/workflow/sanitize-error.ts +62 -0
  680. package/src/modules/workflow/session-ontology.policy.ts +70 -0
  681. package/src/modules/workflow/session-ontology.service.ts +178 -0
  682. package/src/modules/workflow/workflow-hooks.ts +101 -0
  683. package/src/modules/workflow/workflow.errors.ts +285 -0
  684. package/src/modules/workflow/workflow.routes.ts +858 -0
  685. package/src/modules/workflow/workflow.service.ts +1555 -0
  686. package/src/modules/workspace/__tests__/kb-seed.service.test.ts +213 -0
  687. package/src/modules/workspace/__tests__/routine-write-policy.test.ts +68 -0
  688. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +237 -0
  689. package/src/modules/workspace/__tests__/spill-store.test.ts +43 -0
  690. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +233 -0
  691. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +176 -0
  692. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +303 -0
  693. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +276 -0
  694. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +120 -0
  695. package/src/modules/workspace/__tests__/workspace.service.test.ts +565 -0
  696. package/src/modules/workspace/__tests__/workspace.tools.test.ts +504 -0
  697. package/src/modules/workspace/bevel-ignore.ts +62 -0
  698. package/src/modules/workspace/kb-seed.interface.ts +36 -0
  699. package/src/modules/workspace/kb-seed.service.ts +361 -0
  700. package/src/modules/workspace/routine-write-policy.ts +79 -0
  701. package/src/modules/workspace/session-ontology.gate.ts +189 -0
  702. package/src/modules/workspace/session-sink.ts +25 -0
  703. package/src/modules/workspace/spill-store.ts +87 -0
  704. package/src/modules/workspace/workspace.routes.ts +1114 -0
  705. package/src/modules/workspace/workspace.service.ts +1343 -0
  706. package/src/modules/workspace/workspace.tools.ts +885 -0
  707. package/src/shared/__tests__/frontmatter-id.test.ts +88 -0
  708. package/src/shared/__tests__/fs-walk.test.ts +42 -0
  709. package/src/shared/__tests__/ssrf.test.ts +53 -0
  710. package/src/shared/__tests__/utcp-namespace.test.ts +19 -0
  711. package/src/shared/frontmatter-id.ts +72 -0
  712. package/src/shared/fs-walk.ts +30 -0
  713. package/src/shared/hash-email.ts +14 -0
  714. package/src/shared/kb-layout.test.ts +88 -0
  715. package/src/shared/kb-layout.ts +101 -0
  716. package/src/shared/ssrf.ts +78 -0
  717. package/src/shared/token-crypto.ts +54 -0
  718. package/src/shared/ttl-cache.ts +27 -0
  719. package/src/shared/utcp-namespace.ts +88 -0
  720. package/src/version.ts +19 -0
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Persistent queue of "files written to disk but not yet committed to git."
3
+ *
4
+ * Decouples the lock-release path from git work: `WorkflowService.releaseLock`
5
+ * enqueues a row and returns immediately; the background `PendingCommitsWorker`
6
+ * drains rows by running `commitFile + push`. Persistence is the point — a
7
+ * process crash mid-commit (the bug class that stranded the `GTM/Uploads/*.docx`
8
+ * files) leaves resumable work for the next worker pass instead of an orphan
9
+ * on disk that nobody will ever commit.
10
+ *
11
+ * See `lock-decoupling-plan.md` for the full design context.
12
+ *
13
+ * Lifecycle of a row:
14
+ *
15
+ * enqueue ──> status='pending'
16
+ * │
17
+ * claimNext (atomic UPDATE) ──> status='running'
18
+ * │
19
+ * ┌─────┴─────────────────────────────┐
20
+ * │ commit + push succeeds │ commit/push throws
21
+ * ▼ ▼
22
+ * markSucceeded attempts++
23
+ * (row deleted) ┌────────┴────────────────┐
24
+ * │ attempts < N_TRANSIENT │ attempts ≥ N_TRANSIENT
25
+ * ▼ ▼
26
+ * markTransientFailure markRecoveryStarted
27
+ * (status='pending'; (recoveryAgentRuns++;
28
+ * backoff via attempts=0;
29
+ * last_attempted_at) status='pending')
30
+ * │
31
+ * ▼
32
+ * if recoveryAgentRuns ≥ N_RECOVERY:
33
+ * markNeedsAttention
34
+ * (status='needs_attention')
35
+ */
36
+ import type { Database } from '../database/connection.js';
37
+ /**
38
+ * Transient-failure budget per recovery cycle. After this many consecutive
39
+ * `commit + push` failures we hand off to the recovery agent (which gets its
40
+ * own budget of N_RECOVERY runs before we escalate). 3 covers a normal
41
+ * teammate-pushed-while-we-were-pushing race plus a backoff retry, while
42
+ * keeping recovery latency bounded for genuinely stuck rows.
43
+ */
44
+ export declare const N_TRANSIENT = 3;
45
+ /**
46
+ * How many full recovery-agent runs we kick off before declaring a row
47
+ * unrecoverable and emitting a `'system'` feedback notice. Each run gets a
48
+ * fresh transient budget, so the real ceiling is `N_TRANSIENT × N_RECOVERY`
49
+ * commit attempts per row.
50
+ */
51
+ export declare const N_RECOVERY = 3;
52
+ /**
53
+ * Exponential backoff between transient retries, indexed by the current
54
+ * `pending_commits.attempts` value. `claimNext` reads `BACKOFF_MS[attempts]`
55
+ * straight off the row, so:
56
+ *
57
+ * - `attempts === 0` (fresh enqueue, never tried) is gated by
58
+ * `BACKOFF_MS[0]` only when `last_attempted_at` is already set — the
59
+ * usual first-sight case has `last_attempted_at IS NULL` and skips
60
+ * backoff entirely. The `attempts === 0` arm matters for
61
+ * recovery-reset rows (see `markRecoveryStarted`), which leave
62
+ * `last_attempted_at` populated.
63
+ * - After `markTransientFailure` bumps `attempts` to `1`, the next
64
+ * retry waits `BACKOFF_MS[1]` (5s).
65
+ * - And so on, up to `attempts === N_TRANSIENT - 1`, after which the
66
+ * row leaves the transient-retry phase entirely.
67
+ *
68
+ * Length therefore needs `>= N_TRANSIENT` so every value of `attempts` in
69
+ * `[0, N_TRANSIENT)` has a defined backoff entry.
70
+ */
71
+ export declare const BACKOFF_MS: number[];
72
+ /**
73
+ * Canonicalize a workspace id so an enqueued row and the worker's claim always
74
+ * key on the SAME string.
75
+ *
76
+ * The id reaches `enqueue` via a route `:id` path param, which Express
77
+ * URL-decodes — so a slashed feature branch arrives as `alice/feature`. But the
78
+ * worker claims per `WorkspaceService.knownWorkspaces()`, whose ids are
79
+ * `encodeURIComponent(branch)` → `alice%2Ffeature`. Those strings differ, so
80
+ * `WHERE workspace_id = …` never matched and the row was never drained —
81
+ * silently stranding every human save on a feature branch (protected branches
82
+ * have no `/`, so encoded == decoded and they were unaffected).
83
+ *
84
+ * `encodeURIComponent(decodeURIComponent(id))` is idempotent and collapses both
85
+ * forms to the encoded id `knownWorkspaces()` uses. A malformed `%` sequence
86
+ * (which `decodeURIComponent` would throw on) is left untouched.
87
+ */
88
+ export declare function canonicalWorkspaceId(id: string): string;
89
+ export interface PendingCommit {
90
+ id: string;
91
+ workspaceId: string;
92
+ branch: string;
93
+ path: string;
94
+ authorEmail: string;
95
+ authorName: string;
96
+ queuedAt: Date;
97
+ status: 'pending' | 'running' | 'needs_attention';
98
+ attempts: number;
99
+ recoveryAgentRuns: number;
100
+ lastAttemptedAt: Date | null;
101
+ lastError: string | null;
102
+ }
103
+ export interface EnqueueInput {
104
+ workspaceId: string;
105
+ branch: string;
106
+ path: string;
107
+ authorEmail: string;
108
+ authorName: string;
109
+ }
110
+ export interface WorkspaceDescriptor {
111
+ id: string;
112
+ branch: string;
113
+ }
114
+ /**
115
+ * Caller for `startupReconcile` — yields paths the working tree currently
116
+ * has dirty but `pending_commits` doesn't know about (orphans from a prior
117
+ * process crash). Injected rather than baked in so this service stays
118
+ * database-only and the WorkspaceService keeps owning the on-disk walk.
119
+ */
120
+ export interface OrphanScanner {
121
+ scan(workspace: WorkspaceDescriptor): Promise<Array<{
122
+ path: string;
123
+ }>>;
124
+ }
125
+ export declare class PendingCommitsService {
126
+ private readonly db;
127
+ constructor(db: Database);
128
+ /**
129
+ * Enqueue a path for the worker to commit. De-duplicates on
130
+ * `(workspaceId, branch, path)`: a second save of the same file while a
131
+ * prior row is still pending bumps `queued_at` so the latest save's bytes
132
+ * win when the row is eventually claimed (commitFile commits whatever's
133
+ * on disk, not "the version that triggered this row"). A row that's
134
+ * `running` or `needs_attention` is left alone — both states represent
135
+ * in-flight or terminal work the caller shouldn't disturb.
136
+ */
137
+ enqueue(input: EnqueueInput): Promise<void>;
138
+ /**
139
+ * Atomically claim the next ready row for `workspaceId`. "Ready" means:
140
+ *
141
+ * - `status = 'pending'`, AND
142
+ * - either `last_attempted_at IS NULL` (never tried yet) OR
143
+ * `last_attempted_at + backoff(attempts) <= now()` (backoff elapsed).
144
+ * `backoff(attempts)` (not `attempts - 1`) is intentional: it covers
145
+ * the recovery-reset case where `attempts` is `0` but
146
+ * `last_attempted_at` is non-null, otherwise the row would fall into
147
+ * the default arm and idle for the max backoff after each recovery.
148
+ *
149
+ * Uses `FOR UPDATE SKIP LOCKED` inside a sub-select so two worker passes
150
+ * (in case a future deploy ever runs multiple processes) can't double-claim
151
+ * the same row. The outer UPDATE flips `status` to `'running'` and bumps
152
+ * `last_attempted_at` to fence subsequent loops.
153
+ *
154
+ * Returns the claimed row, or `null` if nothing is ready.
155
+ */
156
+ claimNext(rawWorkspaceId: string, now: Date): Promise<PendingCommit | null>;
157
+ /**
158
+ * Commit + push landed. Drop the row.
159
+ */
160
+ markSucceeded(id: string): Promise<void>;
161
+ /**
162
+ * Transient failure. Bump `attempts`, store the error, flip back to
163
+ * `'pending'` so the next worker pass can re-claim once backoff elapses.
164
+ * Caller (worker) only invokes this when `attempts + 1 < N_TRANSIENT`.
165
+ */
166
+ markTransientFailure(id: string, error: string): Promise<void>;
167
+ /**
168
+ * About to spawn a recovery agent. Bump `recovery_agent_runs`, reset
169
+ * `attempts` to 0 so the post-recovery commits get a fresh transient
170
+ * budget, flip back to `'pending'` so the next worker pass picks the
171
+ * row up again (post-recovery the underlying error is usually fixed).
172
+ */
173
+ markRecoveryStarted(id: string): Promise<void>;
174
+ /**
175
+ * Terminal failure. Row stays in `needs_attention` forever (until an
176
+ * admin deletes or repairs it). The worker emits a `'system'` feedback
177
+ * notice in the same pass — that lives in the worker, not here, so the
178
+ * service stays storage-only.
179
+ */
180
+ markNeedsAttention(id: string, error: string): Promise<void>;
181
+ /**
182
+ * Admin / dashboard surface. Returns everything stuck in
183
+ * `needs_attention` for triage.
184
+ */
185
+ listNeedsAttention(): Promise<PendingCommit[]>;
186
+ /**
187
+ * Test / admin helper — how many `pending` rows for this workspace?
188
+ * `running` and `needs_attention` are excluded; both represent work the
189
+ * worker is NOT going to pick up on its next sweep.
190
+ */
191
+ countPending(rawWorkspaceId: string): Promise<number>;
192
+ /**
193
+ * Is there ANY row (regardless of status) for this workspace? Used by the
194
+ * git status path to tell an EXPECTED dirty working tree (files saved to
195
+ * disk whose commits are still queued/running/stuck) apart from a genuinely
196
+ * orphaned one — only the latter deserves the loud "missed lock-release
197
+ * commit" warning.
198
+ */
199
+ hasAnyForWorkspace(rawWorkspaceId: string): Promise<boolean>;
200
+ /**
201
+ * Process startup recovery. Two jobs:
202
+ *
203
+ * 1. Reset any `status='running'` rows back to `'pending'`. The
204
+ * previous process crashed mid-commit; the new worker should pick
205
+ * these up just like any other pending row.
206
+ * 2. For each known workspace, walk the working tree (via the injected
207
+ * scanner) and enqueue any dirty path that isn't already
208
+ * represented in the queue. This is what cleans up disk-only
209
+ * orphans left by past pre-queue crashes (the existing
210
+ * `GTM/Uploads/*.docx` strays on `target-company-state`).
211
+ *
212
+ * `systemAuthor` is the synthetic recovery-bot identity sweep-enqueued
213
+ * rows are attributed to — the original author isn't recoverable
214
+ * post-hoc.
215
+ */
216
+ startupReconcile(workspaces: Iterable<WorkspaceDescriptor>, scanner: OrphanScanner, systemAuthor: {
217
+ email: string;
218
+ name: string;
219
+ }): Promise<void>;
220
+ }
221
+ //# sourceMappingURL=pending-commits.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-commits.service.d.ts","sourceRoot":"","sources":["../../../src/modules/workflow/pending-commits.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Persistent queue of "files written to disk but not yet committed to git."
3
+ *
4
+ * Decouples the lock-release path from git work: `WorkflowService.releaseLock`
5
+ * enqueues a row and returns immediately; the background `PendingCommitsWorker`
6
+ * drains rows by running `commitFile + push`. Persistence is the point — a
7
+ * process crash mid-commit (the bug class that stranded the `GTM/Uploads/*.docx`
8
+ * files) leaves resumable work for the next worker pass instead of an orphan
9
+ * on disk that nobody will ever commit.
10
+ *
11
+ * See `lock-decoupling-plan.md` for the full design context.
12
+ *
13
+ * Lifecycle of a row:
14
+ *
15
+ * enqueue ──> status='pending'
16
+ * │
17
+ * claimNext (atomic UPDATE) ──> status='running'
18
+ * │
19
+ * ┌─────┴─────────────────────────────┐
20
+ * │ commit + push succeeds │ commit/push throws
21
+ * ▼ ▼
22
+ * markSucceeded attempts++
23
+ * (row deleted) ┌────────┴────────────────┐
24
+ * │ attempts < N_TRANSIENT │ attempts ≥ N_TRANSIENT
25
+ * ▼ ▼
26
+ * markTransientFailure markRecoveryStarted
27
+ * (status='pending'; (recoveryAgentRuns++;
28
+ * backoff via attempts=0;
29
+ * last_attempted_at) status='pending')
30
+ * │
31
+ * ▼
32
+ * if recoveryAgentRuns ≥ N_RECOVERY:
33
+ * markNeedsAttention
34
+ * (status='needs_attention')
35
+ */
36
+ import { and, eq, isNull, or, sql } from 'drizzle-orm';
37
+ import { pendingCommits } from '../database/schema.js';
38
+ /**
39
+ * Transient-failure budget per recovery cycle. After this many consecutive
40
+ * `commit + push` failures we hand off to the recovery agent (which gets its
41
+ * own budget of N_RECOVERY runs before we escalate). 3 covers a normal
42
+ * teammate-pushed-while-we-were-pushing race plus a backoff retry, while
43
+ * keeping recovery latency bounded for genuinely stuck rows.
44
+ */
45
+ export const N_TRANSIENT = 3;
46
+ /**
47
+ * How many full recovery-agent runs we kick off before declaring a row
48
+ * unrecoverable and emitting a `'system'` feedback notice. Each run gets a
49
+ * fresh transient budget, so the real ceiling is `N_TRANSIENT × N_RECOVERY`
50
+ * commit attempts per row.
51
+ */
52
+ export const N_RECOVERY = 3;
53
+ /**
54
+ * Exponential backoff between transient retries, indexed by the current
55
+ * `pending_commits.attempts` value. `claimNext` reads `BACKOFF_MS[attempts]`
56
+ * straight off the row, so:
57
+ *
58
+ * - `attempts === 0` (fresh enqueue, never tried) is gated by
59
+ * `BACKOFF_MS[0]` only when `last_attempted_at` is already set — the
60
+ * usual first-sight case has `last_attempted_at IS NULL` and skips
61
+ * backoff entirely. The `attempts === 0` arm matters for
62
+ * recovery-reset rows (see `markRecoveryStarted`), which leave
63
+ * `last_attempted_at` populated.
64
+ * - After `markTransientFailure` bumps `attempts` to `1`, the next
65
+ * retry waits `BACKOFF_MS[1]` (5s).
66
+ * - And so on, up to `attempts === N_TRANSIENT - 1`, after which the
67
+ * row leaves the transient-retry phase entirely.
68
+ *
69
+ * Length therefore needs `>= N_TRANSIENT` so every value of `attempts` in
70
+ * `[0, N_TRANSIENT)` has a defined backoff entry.
71
+ */
72
+ export const BACKOFF_MS = [1_000, 5_000, 30_000];
73
+ /**
74
+ * Canonicalize a workspace id so an enqueued row and the worker's claim always
75
+ * key on the SAME string.
76
+ *
77
+ * The id reaches `enqueue` via a route `:id` path param, which Express
78
+ * URL-decodes — so a slashed feature branch arrives as `alice/feature`. But the
79
+ * worker claims per `WorkspaceService.knownWorkspaces()`, whose ids are
80
+ * `encodeURIComponent(branch)` → `alice%2Ffeature`. Those strings differ, so
81
+ * `WHERE workspace_id = …` never matched and the row was never drained —
82
+ * silently stranding every human save on a feature branch (protected branches
83
+ * have no `/`, so encoded == decoded and they were unaffected).
84
+ *
85
+ * `encodeURIComponent(decodeURIComponent(id))` is idempotent and collapses both
86
+ * forms to the encoded id `knownWorkspaces()` uses. A malformed `%` sequence
87
+ * (which `decodeURIComponent` would throw on) is left untouched.
88
+ */
89
+ export function canonicalWorkspaceId(id) {
90
+ try {
91
+ return encodeURIComponent(decodeURIComponent(id));
92
+ }
93
+ catch {
94
+ return id;
95
+ }
96
+ }
97
+ function rowToPending(row) {
98
+ return {
99
+ id: row.id,
100
+ workspaceId: row.workspaceId,
101
+ branch: row.branch,
102
+ path: row.path,
103
+ authorEmail: row.authorEmail,
104
+ authorName: row.authorName,
105
+ queuedAt: row.queuedAt,
106
+ status: row.status,
107
+ attempts: row.attempts,
108
+ recoveryAgentRuns: row.recoveryAgentRuns,
109
+ lastAttemptedAt: row.lastAttemptedAt,
110
+ lastError: row.lastError,
111
+ };
112
+ }
113
+ export class PendingCommitsService {
114
+ db;
115
+ constructor(db) {
116
+ this.db = db;
117
+ }
118
+ /**
119
+ * Enqueue a path for the worker to commit. De-duplicates on
120
+ * `(workspaceId, branch, path)`: a second save of the same file while a
121
+ * prior row is still pending bumps `queued_at` so the latest save's bytes
122
+ * win when the row is eventually claimed (commitFile commits whatever's
123
+ * on disk, not "the version that triggered this row"). A row that's
124
+ * `running` or `needs_attention` is left alone — both states represent
125
+ * in-flight or terminal work the caller shouldn't disturb.
126
+ */
127
+ async enqueue(input) {
128
+ const email = input.authorEmail.trim().toLowerCase();
129
+ // Store the canonical (encoded) workspace id so the worker's per-workspace
130
+ // claim — which keys on `knownWorkspaces()`'s encoded ids — can find this row
131
+ // even when the enqueuing route delivered a URL-decoded id.
132
+ const workspaceId = canonicalWorkspaceId(input.workspaceId);
133
+ // Try to refresh an existing pending row for this path first. If nothing
134
+ // matches, fall through to an INSERT. The `releaseLock` call path serialises
135
+ // these two statements under the per-workspace mutex (`mutex.run(workspaceId,
136
+ // ...)`), so user-driven saves can't interleave here. `startupReconcile`
137
+ // bypasses the mutex (it enqueues orphans found on disk at boot), but the
138
+ // schema explicitly allows duplicate `(workspaceId, branch, path)` rows
139
+ // (see `database/schema.ts` near the `pendingCommits` definition), so a
140
+ // racing INSERT just produces a second row the worker will collapse on its
141
+ // next idempotent commit pass — no constraint violation, no double-commit.
142
+ const updated = await this.db
143
+ .update(pendingCommits)
144
+ .set({
145
+ queuedAt: new Date(),
146
+ authorEmail: email,
147
+ authorName: input.authorName,
148
+ // Reset transient counters — this is effectively a fresh enqueue.
149
+ attempts: 0,
150
+ lastError: null,
151
+ lastAttemptedAt: null,
152
+ })
153
+ .where(and(eq(pendingCommits.workspaceId, workspaceId), eq(pendingCommits.branch, input.branch), eq(pendingCommits.path, input.path), eq(pendingCommits.status, 'pending')))
154
+ .returning({ id: pendingCommits.id });
155
+ if (updated.length > 0)
156
+ return;
157
+ await this.db.insert(pendingCommits).values({
158
+ workspaceId,
159
+ branch: input.branch,
160
+ path: input.path,
161
+ authorEmail: email,
162
+ authorName: input.authorName,
163
+ });
164
+ }
165
+ /**
166
+ * Atomically claim the next ready row for `workspaceId`. "Ready" means:
167
+ *
168
+ * - `status = 'pending'`, AND
169
+ * - either `last_attempted_at IS NULL` (never tried yet) OR
170
+ * `last_attempted_at + backoff(attempts) <= now()` (backoff elapsed).
171
+ * `backoff(attempts)` (not `attempts - 1`) is intentional: it covers
172
+ * the recovery-reset case where `attempts` is `0` but
173
+ * `last_attempted_at` is non-null, otherwise the row would fall into
174
+ * the default arm and idle for the max backoff after each recovery.
175
+ *
176
+ * Uses `FOR UPDATE SKIP LOCKED` inside a sub-select so two worker passes
177
+ * (in case a future deploy ever runs multiple processes) can't double-claim
178
+ * the same row. The outer UPDATE flips `status` to `'running'` and bumps
179
+ * `last_attempted_at` to fence subsequent loops.
180
+ *
181
+ * Returns the claimed row, or `null` if nothing is ready.
182
+ */
183
+ async claimNext(rawWorkspaceId, now) {
184
+ // Match the canonical form `enqueue` stores (see `canonicalWorkspaceId`).
185
+ const workspaceId = canonicalWorkspaceId(rawWorkspaceId);
186
+ // Backoff schedule as a SQL CASE so the gate runs server-side instead
187
+ // of round-tripping the row to compute eligibility. Index in BACKOFF_MS
188
+ // matches `attempts` directly — covers `attempts == 0` (a recovery-reset
189
+ // row whose `lastAttemptedAt` is non-null; without this, it would fall
190
+ // into ELSE = max backoff and be stuck waiting 30s after every recovery).
191
+ const caseArms = BACKOFF_MS.map((ms, i) => sql `WHEN ${i} THEN ${ms}`);
192
+ const lastMs = BACKOFF_MS[BACKOFF_MS.length - 1];
193
+ const backoffMsExpr = sql `(CASE ${pendingCommits.attempts} ${sql.join(caseArms, sql ` `)} ELSE ${lastMs} END)`;
194
+ const readyExpr = or(isNull(pendingCommits.lastAttemptedAt), sql `${pendingCommits.lastAttemptedAt} + (${backoffMsExpr} || ' milliseconds')::interval <= ${now}`);
195
+ const claimed = await this.db
196
+ .update(pendingCommits)
197
+ .set({ status: 'running', lastAttemptedAt: now })
198
+ .where(sql `${pendingCommits.id} = (
199
+ SELECT ${pendingCommits.id} FROM ${pendingCommits}
200
+ WHERE ${pendingCommits.workspaceId} = ${workspaceId}
201
+ AND ${pendingCommits.status} = 'pending'
202
+ AND ${readyExpr}
203
+ ORDER BY ${pendingCommits.queuedAt} ASC
204
+ LIMIT 1
205
+ FOR UPDATE SKIP LOCKED
206
+ )`)
207
+ .returning();
208
+ return claimed.length > 0 ? rowToPending(claimed[0]) : null;
209
+ }
210
+ /**
211
+ * Commit + push landed. Drop the row.
212
+ */
213
+ async markSucceeded(id) {
214
+ await this.db.delete(pendingCommits).where(eq(pendingCommits.id, id));
215
+ }
216
+ /**
217
+ * Transient failure. Bump `attempts`, store the error, flip back to
218
+ * `'pending'` so the next worker pass can re-claim once backoff elapses.
219
+ * Caller (worker) only invokes this when `attempts + 1 < N_TRANSIENT`.
220
+ */
221
+ async markTransientFailure(id, error) {
222
+ await this.db
223
+ .update(pendingCommits)
224
+ .set({
225
+ status: 'pending',
226
+ attempts: sql `${pendingCommits.attempts} + 1`,
227
+ lastError: error,
228
+ lastAttemptedAt: new Date(),
229
+ })
230
+ .where(eq(pendingCommits.id, id));
231
+ }
232
+ /**
233
+ * About to spawn a recovery agent. Bump `recovery_agent_runs`, reset
234
+ * `attempts` to 0 so the post-recovery commits get a fresh transient
235
+ * budget, flip back to `'pending'` so the next worker pass picks the
236
+ * row up again (post-recovery the underlying error is usually fixed).
237
+ */
238
+ async markRecoveryStarted(id) {
239
+ await this.db
240
+ .update(pendingCommits)
241
+ .set({
242
+ status: 'pending',
243
+ attempts: 0,
244
+ recoveryAgentRuns: sql `${pendingCommits.recoveryAgentRuns} + 1`,
245
+ lastAttemptedAt: new Date(),
246
+ })
247
+ .where(eq(pendingCommits.id, id));
248
+ }
249
+ /**
250
+ * Terminal failure. Row stays in `needs_attention` forever (until an
251
+ * admin deletes or repairs it). The worker emits a `'system'` feedback
252
+ * notice in the same pass — that lives in the worker, not here, so the
253
+ * service stays storage-only.
254
+ */
255
+ async markNeedsAttention(id, error) {
256
+ await this.db
257
+ .update(pendingCommits)
258
+ .set({
259
+ status: 'needs_attention',
260
+ lastError: error,
261
+ lastAttemptedAt: new Date(),
262
+ })
263
+ .where(eq(pendingCommits.id, id));
264
+ }
265
+ /**
266
+ * Admin / dashboard surface. Returns everything stuck in
267
+ * `needs_attention` for triage.
268
+ */
269
+ async listNeedsAttention() {
270
+ const rows = await this.db
271
+ .select()
272
+ .from(pendingCommits)
273
+ .where(eq(pendingCommits.status, 'needs_attention'));
274
+ return rows.map(rowToPending);
275
+ }
276
+ /**
277
+ * Test / admin helper — how many `pending` rows for this workspace?
278
+ * `running` and `needs_attention` are excluded; both represent work the
279
+ * worker is NOT going to pick up on its next sweep.
280
+ */
281
+ async countPending(rawWorkspaceId) {
282
+ const workspaceId = canonicalWorkspaceId(rawWorkspaceId);
283
+ const rows = await this.db
284
+ .select({ count: sql `count(*)::int` })
285
+ .from(pendingCommits)
286
+ .where(and(eq(pendingCommits.workspaceId, workspaceId), eq(pendingCommits.status, 'pending')));
287
+ return rows[0]?.count ?? 0;
288
+ }
289
+ /**
290
+ * Is there ANY row (regardless of status) for this workspace? Used by the
291
+ * git status path to tell an EXPECTED dirty working tree (files saved to
292
+ * disk whose commits are still queued/running/stuck) apart from a genuinely
293
+ * orphaned one — only the latter deserves the loud "missed lock-release
294
+ * commit" warning.
295
+ */
296
+ async hasAnyForWorkspace(rawWorkspaceId) {
297
+ const workspaceId = canonicalWorkspaceId(rawWorkspaceId);
298
+ const rows = await this.db
299
+ .select({ count: sql `count(*)::int` })
300
+ .from(pendingCommits)
301
+ .where(eq(pendingCommits.workspaceId, workspaceId));
302
+ return (rows[0]?.count ?? 0) > 0;
303
+ }
304
+ /**
305
+ * Process startup recovery. Two jobs:
306
+ *
307
+ * 1. Reset any `status='running'` rows back to `'pending'`. The
308
+ * previous process crashed mid-commit; the new worker should pick
309
+ * these up just like any other pending row.
310
+ * 2. For each known workspace, walk the working tree (via the injected
311
+ * scanner) and enqueue any dirty path that isn't already
312
+ * represented in the queue. This is what cleans up disk-only
313
+ * orphans left by past pre-queue crashes (the existing
314
+ * `GTM/Uploads/*.docx` strays on `target-company-state`).
315
+ *
316
+ * `systemAuthor` is the synthetic recovery-bot identity sweep-enqueued
317
+ * rows are attributed to — the original author isn't recoverable
318
+ * post-hoc.
319
+ */
320
+ async startupReconcile(workspaces, scanner, systemAuthor) {
321
+ // One-time backfill: rows enqueued before `canonicalWorkspaceId` landed may
322
+ // hold a URL-decoded workspace_id that `claimNext` (which keys on the encoded
323
+ // `knownWorkspaces()` id) never matched — so they'd sit forever unclaimed.
324
+ // Rewrite any non-canonical id to its canonical form so those rows drain.
325
+ // (Two decoded/encoded variants collapsing to one id just yields duplicate
326
+ // rows, which the worker's idempotent commit pass harmlessly no-ops.)
327
+ const distinctIds = await this.db
328
+ .selectDistinct({ workspaceId: pendingCommits.workspaceId })
329
+ .from(pendingCommits);
330
+ for (const { workspaceId } of distinctIds) {
331
+ const canonical = canonicalWorkspaceId(workspaceId);
332
+ if (canonical !== workspaceId) {
333
+ await this.db
334
+ .update(pendingCommits)
335
+ .set({ workspaceId: canonical })
336
+ .where(eq(pendingCommits.workspaceId, workspaceId));
337
+ }
338
+ }
339
+ await this.db
340
+ .update(pendingCommits)
341
+ .set({ status: 'pending', lastAttemptedAt: new Date() })
342
+ .where(eq(pendingCommits.status, 'running'));
343
+ for (const workspace of workspaces) {
344
+ let dirty;
345
+ try {
346
+ dirty = await scanner.scan(workspace);
347
+ }
348
+ catch (err) {
349
+ console.warn(`[pending-commits] startup scan failed for workspace=${workspace.id}:`, err instanceof Error ? err.message : err);
350
+ continue;
351
+ }
352
+ for (const entry of dirty) {
353
+ await this.enqueue({
354
+ workspaceId: workspace.id,
355
+ branch: workspace.branch,
356
+ path: entry.path,
357
+ authorEmail: systemAuthor.email,
358
+ authorName: systemAuthor.name,
359
+ });
360
+ }
361
+ }
362
+ }
363
+ }
364
+ //# sourceMappingURL=pending-commits.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-commits.service.js","sourceRoot":"","sources":["../../../src/modules/workflow/pending-commits.service.ts"],"names":[],"mappings":"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"}