@bevel-software/platform-core-backend 0.20.0 → 0.21.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 (576) hide show
  1. package/dist/core/catalog-cache-invalidation.d.ts +7 -2
  2. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  3. package/dist/core/catalog-cache-invalidation.js +8 -9
  4. package/dist/core/catalog-cache-invalidation.js.map +1 -1
  5. package/dist/core/core-ports.d.ts +19 -0
  6. package/dist/core/core-ports.d.ts.map +1 -1
  7. package/dist/core/core-ports.js.map +1 -1
  8. package/dist/core/create-core-server.d.ts +2 -0
  9. package/dist/core/create-core-server.d.ts.map +1 -1
  10. package/dist/core/create-core-server.js +23 -105
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +30 -5
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +136 -81
  15. package/dist/core/create-core-services.js.map +1 -1
  16. package/dist/core/lifecycle.d.ts +74 -28
  17. package/dist/core/lifecycle.d.ts.map +1 -1
  18. package/dist/core/lifecycle.js +157 -20
  19. package/dist/core/lifecycle.js.map +1 -1
  20. package/dist/core/public-config.d.ts +5 -1
  21. package/dist/core/public-config.d.ts.map +1 -1
  22. package/dist/core/public-config.js +7 -5
  23. package/dist/core/public-config.js.map +1 -1
  24. package/dist/core-config.d.ts +95 -1
  25. package/dist/core-config.d.ts.map +1 -1
  26. package/dist/core-config.js +24 -8
  27. package/dist/core-config.js.map +1 -1
  28. package/dist/index.d.ts +5 -3
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/modules/access/access-control.service.d.ts +18 -1
  33. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  34. package/dist/modules/access/access-control.service.js +19 -8
  35. package/dist/modules/access/access-control.service.js.map +1 -1
  36. package/dist/modules/access/access.routes.d.ts +2 -1
  37. package/dist/modules/access/access.routes.d.ts.map +1 -1
  38. package/dist/modules/access/access.routes.js +10 -10
  39. package/dist/modules/access/access.routes.js.map +1 -1
  40. package/dist/modules/access/change-read-gate.d.ts +6 -3
  41. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  42. package/dist/modules/access/change-read-gate.js +9 -6
  43. package/dist/modules/access/change-read-gate.js.map +1 -1
  44. package/dist/modules/access/creator-access.d.ts +4 -2
  45. package/dist/modules/access/creator-access.d.ts.map +1 -1
  46. package/dist/modules/access/creator-access.js +7 -4
  47. package/dist/modules/access/creator-access.js.map +1 -1
  48. package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
  49. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  50. package/dist/modules/agent-instructions/read-preamble.js +6 -9
  51. package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
  52. package/dist/modules/auth/account-admission.d.ts +40 -0
  53. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  54. package/dist/modules/auth/account-admission.js +17 -0
  55. package/dist/modules/auth/account-admission.js.map +1 -0
  56. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  57. package/dist/modules/auth/account.routes.js +4 -1
  58. package/dist/modules/auth/account.routes.js.map +1 -1
  59. package/dist/modules/auth/auth.service.d.ts +19 -1
  60. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  61. package/dist/modules/auth/auth.service.js +33 -1
  62. package/dist/modules/auth/auth.service.js.map +1 -1
  63. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  64. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  65. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  66. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  67. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  68. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  69. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  70. package/dist/modules/database/advisory-lock.d.ts +17 -0
  71. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  72. package/dist/modules/database/advisory-lock.js +24 -3
  73. package/dist/modules/database/advisory-lock.js.map +1 -1
  74. package/dist/modules/database/connection.d.ts +67 -2
  75. package/dist/modules/database/connection.d.ts.map +1 -1
  76. package/dist/modules/database/connection.js +118 -12
  77. package/dist/modules/database/connection.js.map +1 -1
  78. package/dist/modules/database/migrate.d.ts +1 -1
  79. package/dist/modules/database/migrate.d.ts.map +1 -1
  80. package/dist/modules/database/migrate.js +27 -3
  81. package/dist/modules/database/migrate.js.map +1 -1
  82. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  83. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  84. package/dist/modules/kb-fs/branch-name.js +3 -3
  85. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  86. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  87. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  88. package/dist/modules/kb-fs/clone-config.js +14 -12
  89. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  90. package/dist/modules/mcp/mcp.service.d.ts +7 -0
  91. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  92. package/dist/modules/mcp/mcp.service.js +4 -4
  93. package/dist/modules/mcp/mcp.service.js.map +1 -1
  94. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  95. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  96. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  97. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  98. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  99. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  100. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  101. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  102. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  103. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  104. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  105. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  106. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  107. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  108. package/dist/modules/plugins/discovery/native.source.js +4 -2
  109. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  110. package/dist/modules/plugins/index.d.ts +1 -1
  111. package/dist/modules/plugins/index.d.ts.map +1 -1
  112. package/dist/modules/plugins/index.js +1 -1
  113. package/dist/modules/plugins/index.js.map +1 -1
  114. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  115. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  116. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  117. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  118. package/dist/modules/plugins/join-requests.service.d.ts +3 -1
  119. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  120. package/dist/modules/plugins/join-requests.service.js +9 -8
  121. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  122. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  123. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  124. package/dist/modules/plugins/plugin-links.js +136 -31
  125. package/dist/modules/plugins/plugin-links.js.map +1 -1
  126. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  127. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  128. package/dist/modules/plugins/plugin-links.service.js +151 -21
  129. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  130. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  131. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  132. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  133. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  134. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  135. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  136. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  137. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  138. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  139. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  140. package/dist/modules/plugins/plugins.routes.js +45 -15
  141. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  142. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  143. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  144. package/dist/modules/plugins/plugins.service.js +7 -10
  145. package/dist/modules/plugins/plugins.service.js.map +1 -1
  146. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  147. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  148. package/dist/modules/plugins/teams.routes.js +11 -9
  149. package/dist/modules/plugins/teams.routes.js.map +1 -1
  150. package/dist/modules/secrets-vault/index.d.ts +1 -1
  151. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  152. package/dist/modules/secrets-vault/index.js +1 -1
  153. package/dist/modules/secrets-vault/index.js.map +1 -1
  154. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  155. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  156. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  157. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  158. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  159. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  160. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  161. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  162. package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
  163. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  164. package/dist/modules/settings/deployment-settings.service.js +20 -22
  165. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  166. package/dist/modules/settings/setup.routes.d.ts +9 -2
  167. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  168. package/dist/modules/settings/setup.routes.js +20 -14
  169. package/dist/modules/settings/setup.routes.js.map +1 -1
  170. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  171. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  172. package/dist/modules/skills/allowed-tools-check.js +8 -8
  173. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  174. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  175. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  176. package/dist/modules/skills/pending-skills.service.js +9 -6
  177. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  178. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
  179. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  180. package/dist/modules/skills/skill-access-requests.routes.js +6 -6
  181. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  182. package/dist/modules/skills/skills.routes.d.ts +4 -1
  183. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  184. package/dist/modules/skills/skills.routes.js +4 -4
  185. package/dist/modules/skills/skills.routes.js.map +1 -1
  186. package/dist/modules/skills/skills.service.d.ts +4 -2
  187. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  188. package/dist/modules/skills/skills.service.js +13 -11
  189. package/dist/modules/skills/skills.service.js.map +1 -1
  190. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  191. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  192. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  193. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  194. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  195. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  196. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  197. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  198. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  199. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  200. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  201. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  202. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  203. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  204. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  205. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  206. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  207. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  208. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  209. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  210. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  211. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  212. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  213. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  214. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  215. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  216. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  217. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  218. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  219. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  220. package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
  221. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  222. package/dist/modules/workflow/git/git.service.d.ts +11 -5
  223. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  224. package/dist/modules/workflow/git/git.service.js +23 -14
  225. package/dist/modules/workflow/git/git.service.js.map +1 -1
  226. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  227. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  228. package/dist/modules/workflow/git/node-git-runner.js +35 -5
  229. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  230. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  231. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  232. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  233. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  234. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  235. package/dist/modules/workflow/session-ontology.service.js +6 -2
  236. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  237. package/dist/modules/workflow/workflow.service.d.ts +8 -3
  238. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  239. package/dist/modules/workflow/workflow.service.js +33 -23
  240. package/dist/modules/workflow/workflow.service.js.map +1 -1
  241. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  242. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  243. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  244. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  245. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  246. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  247. package/dist/modules/workspace/startup/kb-git.js +15 -13
  248. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  249. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
  250. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  251. package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
  252. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  253. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  254. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  255. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  256. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  257. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  258. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  259. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  260. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  261. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  262. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  263. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  264. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  265. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  266. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  267. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  268. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  269. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  270. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  271. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  272. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  273. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  274. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  275. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  276. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  277. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  278. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  279. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  280. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  281. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  282. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  283. package/dist/modules/workspace/workspace.routes.js +8 -7
  284. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  285. package/dist/modules/workspace/workspace.service.d.ts +18 -12
  286. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  287. package/dist/modules/workspace/workspace.service.js +32 -28
  288. package/dist/modules/workspace/workspace.service.js.map +1 -1
  289. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  290. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  291. package/dist/modules/workspace/workspace.tools.js +20 -18
  292. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  293. package/dist/modules/workspace/write-denial.d.ts +3 -2
  294. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  295. package/dist/modules/workspace/write-denial.js +6 -5
  296. package/dist/modules/workspace/write-denial.js.map +1 -1
  297. package/dist/shared/git.contract.d.ts +52 -7
  298. package/dist/shared/git.contract.d.ts.map +1 -1
  299. package/dist/shared/git.contract.js +30 -8
  300. package/dist/shared/git.contract.js.map +1 -1
  301. package/dist/shared/kb-context.d.ts +76 -0
  302. package/dist/shared/kb-context.d.ts.map +1 -0
  303. package/dist/shared/kb-context.js +108 -0
  304. package/dist/shared/kb-context.js.map +1 -0
  305. package/dist/shared/kb-layout.d.ts +3 -2
  306. package/dist/shared/kb-layout.d.ts.map +1 -1
  307. package/dist/shared/kb-layout.js +4 -3
  308. package/dist/shared/kb-layout.js.map +1 -1
  309. package/dist/shared/kb-layout.test.js +35 -27
  310. package/dist/shared/kb-layout.test.js.map +1 -1
  311. package/dist/shared/pending-proposals.d.ts +4 -1
  312. package/dist/shared/pending-proposals.d.ts.map +1 -1
  313. package/dist/shared/pending-proposals.js +3 -4
  314. package/dist/shared/pending-proposals.js.map +1 -1
  315. package/dist/shared/redact-secret.d.ts +5 -5
  316. package/dist/shared/redact-secret.js +5 -5
  317. package/dist/tenancy/index.d.ts +13 -0
  318. package/dist/tenancy/index.d.ts.map +1 -0
  319. package/dist/tenancy/index.js +13 -0
  320. package/dist/tenancy/index.js.map +1 -0
  321. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  322. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  323. package/dist/tenancy/static-tenant-source.js +220 -0
  324. package/dist/tenancy/static-tenant-source.js.map +1 -0
  325. package/dist/tenancy/tenant-host.d.ts +80 -0
  326. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  327. package/dist/tenancy/tenant-host.js +217 -0
  328. package/dist/tenancy/tenant-host.js.map +1 -0
  329. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  330. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  331. package/dist/tenancy/tenant-runtime.js +174 -0
  332. package/dist/tenancy/tenant-runtime.js.map +1 -0
  333. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  334. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  335. package/dist/tenancy/tenant-secrets.js +30 -0
  336. package/dist/tenancy/tenant-secrets.js.map +1 -0
  337. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  338. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  339. package/dist/tenancy/tenant-source.contract.js +21 -0
  340. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  341. package/migrations/0000_core_init.sql +14 -14
  342. package/migrations/0003_deployment_settings.sql +1 -1
  343. package/migrations/0005_github_facade.sql +1 -1
  344. package/migrations/0012_agent_audit.sql +6 -6
  345. package/package.json +3 -3
  346. package/src/__tests__/branch-model.test.ts +7 -6
  347. package/src/__tests__/kb-context.ts +30 -0
  348. package/src/__tests__/kb-layout-config.test.ts +35 -30
  349. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  350. package/src/core/__tests__/lifecycle.test.ts +78 -1
  351. package/src/core/__tests__/public-config.test.ts +5 -1
  352. package/src/core/catalog-cache-invalidation.ts +16 -11
  353. package/src/core/core-ports.ts +19 -0
  354. package/src/core/create-core-server.ts +27 -106
  355. package/src/core/create-core-services.ts +180 -95
  356. package/src/core/lifecycle.ts +214 -29
  357. package/src/core/public-config.ts +8 -5
  358. package/src/core-config.ts +107 -8
  359. package/src/index.ts +25 -2
  360. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  361. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  362. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  363. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  364. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  365. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  366. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  367. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  368. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  369. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  370. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  371. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  372. package/src/modules/access/access-control.service.ts +20 -6
  373. package/src/modules/access/access.routes.ts +10 -13
  374. package/src/modules/access/change-read-gate.ts +10 -4
  375. package/src/modules/access/creator-access.ts +7 -2
  376. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  377. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  378. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  379. package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
  380. package/src/modules/auth/account-admission.ts +44 -0
  381. package/src/modules/auth/account.routes.ts +4 -1
  382. package/src/modules/auth/auth.service.ts +33 -1
  383. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  384. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  385. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  386. package/src/modules/database/__tests__/connection.test.ts +98 -0
  387. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  388. package/src/modules/database/advisory-lock.ts +28 -4
  389. package/src/modules/database/connection.ts +143 -13
  390. package/src/modules/database/migrate.ts +48 -14
  391. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  392. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  393. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  394. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  395. package/src/modules/kb-fs/branch-name.ts +3 -3
  396. package/src/modules/kb-fs/clone-config.ts +15 -12
  397. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  398. package/src/modules/mcp/mcp.service.ts +11 -4
  399. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  400. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  401. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  402. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  403. package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
  404. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  405. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  406. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  407. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  408. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  409. package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
  410. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  411. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  412. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  413. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  414. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  415. package/src/modules/plugins/discovery/native.source.ts +4 -1
  416. package/src/modules/plugins/index.ts +1 -1
  417. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  418. package/src/modules/plugins/join-requests.service.ts +7 -7
  419. package/src/modules/plugins/plugin-links.service.ts +192 -19
  420. package/src/modules/plugins/plugin-links.ts +147 -27
  421. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  422. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  423. package/src/modules/plugins/plugins.routes.ts +45 -15
  424. package/src/modules/plugins/plugins.service.ts +7 -11
  425. package/src/modules/plugins/teams.routes.ts +16 -8
  426. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  427. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  428. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  429. package/src/modules/secrets-vault/index.ts +2 -0
  430. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  431. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  432. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
  433. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  434. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  435. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  436. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  437. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  438. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  439. package/src/modules/settings/deployment-settings.service.ts +21 -20
  440. package/src/modules/settings/setup.routes.ts +26 -16
  441. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  442. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  443. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  444. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
  445. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  446. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  447. package/src/modules/skills/allowed-tools-check.ts +7 -6
  448. package/src/modules/skills/pending-skills.service.ts +9 -8
  449. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  450. package/src/modules/skills/skills.routes.ts +4 -3
  451. package/src/modules/skills/skills.service.ts +13 -9
  452. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  453. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  454. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  455. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  456. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  457. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  458. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  459. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  460. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  461. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  462. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  463. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  464. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  465. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  466. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  467. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  468. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  469. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  470. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  471. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  472. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  473. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  474. package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
  475. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  476. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  477. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  478. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  479. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  480. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  481. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  482. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
  483. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  484. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  485. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  486. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  487. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  488. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
  489. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
  490. package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
  491. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  492. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  493. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  494. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  495. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  496. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  497. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  498. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  499. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  500. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  501. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  502. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  503. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  504. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  505. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  506. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  507. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  508. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  509. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
  510. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  511. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  512. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  513. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  514. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  515. package/src/modules/workflow/git/git.service.ts +24 -13
  516. package/src/modules/workflow/git/node-git-runner.ts +37 -4
  517. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  518. package/src/modules/workflow/session-ontology.service.ts +7 -2
  519. package/src/modules/workflow/workflow.service.ts +31 -24
  520. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  521. package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
  522. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  523. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  524. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  525. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  526. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  527. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  528. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  529. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  530. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  531. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  532. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  533. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  534. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  535. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  536. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  537. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  538. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
  539. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  540. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
  541. package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
  542. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  543. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  544. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  545. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
  546. package/src/modules/workspace/startup/kb-git.ts +15 -22
  547. package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
  548. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  549. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  550. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  551. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  552. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  553. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  554. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  555. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  556. package/src/modules/workspace/workspace.routes.ts +8 -7
  557. package/src/modules/workspace/workspace.service.ts +30 -27
  558. package/src/modules/workspace/workspace.tools.ts +21 -20
  559. package/src/modules/workspace/write-denial.ts +7 -5
  560. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  561. package/src/shared/git.contract.ts +70 -8
  562. package/src/shared/kb-context.ts +130 -0
  563. package/src/shared/kb-layout.test.ts +37 -27
  564. package/src/shared/kb-layout.ts +4 -3
  565. package/src/shared/pending-proposals.ts +7 -4
  566. package/src/shared/redact-secret.ts +5 -5
  567. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  568. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  569. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  570. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  571. package/src/tenancy/index.ts +35 -0
  572. package/src/tenancy/static-tenant-source.ts +296 -0
  573. package/src/tenancy/tenant-host.ts +261 -0
  574. package/src/tenancy/tenant-runtime.ts +208 -0
  575. package/src/tenancy/tenant-secrets.ts +41 -0
  576. package/src/tenancy/tenant-source.contract.ts +59 -0
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -86,7 +87,7 @@ describe('GitService.fileContentsAtCommit', () => {
86
87
  const svc = new GitService(
87
88
  stubWorkspaceService(workspaceId, workspaceDir),
88
89
  new WorkflowHooks(),
89
- 'knowledge-base',
90
+ testKbContext(),
90
91
  );
91
92
 
92
93
  const rootAdd = await commitFile(repo, 'Knowledge/Foo.md', '# one\n', 'add foo');
@@ -123,7 +124,7 @@ describe('GitService.fileContentsAtCommit', () => {
123
124
  const svc = new GitService(
124
125
  stubWorkspaceService(workspaceId, workspaceDir),
125
126
  new WorkflowHooks(),
126
- 'knowledge-base',
127
+ testKbContext(),
127
128
  );
128
129
  await expect(
129
130
  svc.fileContentsAtCommit(workspaceId, 'Knowledge/Foo.md', 'not-a-sha'),
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import os from 'node:os';
@@ -52,7 +53,7 @@ describe('GitService — fork point, behind, and Update', () => {
52
53
  git = new GitService(
53
54
  stubWorkspaceService({ [WS]: path.dirname(repo) }),
54
55
  stubWorkflowHooks(),
55
- 'knowledge-base',
56
+ testKbContext(),
56
57
  );
57
58
  });
58
59
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import os from 'node:os';
@@ -34,7 +35,7 @@ describe('GitService history guards', () => {
34
35
  svc = new GitService(
35
36
  stubWorkspaceService({ [workspaceId]: workspaceDir }),
36
37
  stubWorkflowHooks(),
37
- 'knowledge-base',
38
+ testKbContext(),
38
39
  );
39
40
  });
40
41
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -82,7 +83,7 @@ describe('GitService.listBranches', () => {
82
83
  const svc = new GitService(
83
84
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
84
85
  new WorkflowHooks(),
85
- 'knowledge-base',
86
+ testKbContext(),
86
87
  );
87
88
 
88
89
  const branches = await svc.listBranches(workspaceId);
@@ -101,7 +102,7 @@ describe('GitService.listBranches', () => {
101
102
  const svc = new GitService(
102
103
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
103
104
  new WorkflowHooks(),
104
- 'knowledge-base',
105
+ testKbContext(),
105
106
  );
106
107
 
107
108
  const branches = await svc.listBranches(workspaceId);
@@ -115,7 +116,7 @@ describe('GitService.listBranches', () => {
115
116
  const svc = new GitService(
116
117
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
117
118
  new WorkflowHooks(),
118
- 'knowledge-base',
119
+ testKbContext(),
119
120
  );
120
121
  // Prime the cache: first call fetches and populates lastImplicitFetchAt.
121
122
  await svc.listBranches(workspaceId);
@@ -131,7 +132,7 @@ describe('GitService.listBranches', () => {
131
132
  const freshSvc = new GitService(
132
133
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
133
134
  new WorkflowHooks(),
134
- 'knowledge-base',
135
+ testKbContext(),
135
136
  );
136
137
  const branches = await freshSvc.listBranches(workspaceId);
137
138
  expect(branches.map((b) => b.name)).toContain('bob/draft-two');
@@ -145,7 +146,7 @@ describe('GitService.listBranches', () => {
145
146
  const svc = new GitService(
146
147
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
147
148
  new WorkflowHooks(),
148
- 'knowledge-base',
149
+ testKbContext(),
149
150
  );
150
151
 
151
152
  // Should not throw and should return the refs we already had on disk.
@@ -159,7 +160,7 @@ describe('GitService.listBranches', () => {
159
160
  const svc = new GitService(
160
161
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
161
162
  new WorkflowHooks(),
162
- 'knowledge-base',
163
+ testKbContext(),
163
164
  );
164
165
 
165
166
  // current-company-state is the workspace clone's checked-out branch (the
@@ -179,7 +180,7 @@ describe('GitService.listBranches', () => {
179
180
  const svc = new GitService(
180
181
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
181
182
  new WorkflowHooks(),
182
- 'knowledge-base',
183
+ testKbContext(),
183
184
  );
184
185
  // Simulate a just-completed clone — the workspace is freshly fetched.
185
186
  svc.noteWorkspaceFetched(workspaceId);
@@ -205,7 +206,7 @@ describe('GitService.listBranches', () => {
205
206
  const svc = new GitService(
206
207
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
207
208
  new WorkflowHooks(),
208
- 'knowledge-base',
209
+ testKbContext(),
209
210
  );
210
211
  const seen: string[][] = [];
211
212
  svc.setBranchesListedListener((names) => seen.push(names));
@@ -222,7 +223,7 @@ describe('GitService.listBranches', () => {
222
223
  const svc = new GitService(
223
224
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
224
225
  new WorkflowHooks(),
225
- 'knowledge-base',
226
+ testKbContext(),
226
227
  );
227
228
  svc.setBranchesListedListener(() => { throw new Error('listener blew up'); });
228
229
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -63,7 +64,7 @@ async function makeSvc(root: string, workspaceId: string) {
63
64
  const svc = new GitService(
64
65
  stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
65
66
  new WorkflowHooks(),
66
- 'knowledge-base',
67
+ testKbContext(),
67
68
  );
68
69
  return { svc, repo };
69
70
  }
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -120,7 +121,7 @@ describe('GitService.logForFile', () => {
120
121
  const svc = new GitService(
121
122
  stubWorkspaceService(workspaceId, workspaceDir),
122
123
  new WorkflowHooks(),
123
- 'knowledge-base',
124
+ testKbContext(),
124
125
  );
125
126
 
126
127
  await commitFile(repo, 'Knowledge/Foo.md', 'one\n', 'first save');
@@ -140,7 +141,7 @@ describe('GitService.logForFile', () => {
140
141
  const svc = new GitService(
141
142
  stubWorkspaceService(workspaceId, workspaceDir),
142
143
  new WorkflowHooks(),
143
- 'knowledge-base',
144
+ testKbContext(),
144
145
  );
145
146
 
146
147
  await commitFile(repo, 'Knowledge/Foo.md', 'base\n', 'base edit');
@@ -159,7 +160,7 @@ describe('GitService.logForFile', () => {
159
160
  const svc = new GitService(
160
161
  stubWorkspaceService(workspaceId, workspaceDir),
161
162
  new WorkflowHooks(),
162
- 'knowledge-base',
163
+ testKbContext(),
163
164
  );
164
165
 
165
166
  await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
@@ -174,7 +175,7 @@ describe('GitService.logForFile', () => {
174
175
  const svc = new GitService(
175
176
  stubWorkspaceService(workspaceId, workspaceDir),
176
177
  new WorkflowHooks(),
177
- 'knowledge-base',
178
+ testKbContext(),
178
179
  );
179
180
 
180
181
  // 110 commits is the minimum that still proves "clamped to 100" — going
@@ -206,7 +207,7 @@ describe('GitService.logForFile', () => {
206
207
  const svc = new GitService(
207
208
  stubWorkspaceService(workspaceId, workspaceDir),
208
209
  new WorkflowHooks(),
209
- 'knowledge-base',
210
+ testKbContext(),
210
211
  );
211
212
  await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
212
213
  const user = { id: 'u', name: 'Test', email: 't@x.com' };
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -94,7 +95,7 @@ describe('GitService.mergeChangeRequest', () => {
94
95
  await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
95
96
  });
96
97
 
97
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
98
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
98
99
  const result = await git.mergeChangeRequest(
99
100
  baseWsId, 'alice/add', BASE, { subject: 'Add feature (#1)', body: 'Merged via Bevel' }, USER,
100
101
  );
@@ -129,7 +130,7 @@ describe('GitService.mergeChangeRequest', () => {
129
130
  await runGit(root, ['clone', '-b', 'tmp-base-advance', upstream, advancer]);
130
131
  await runGit(advancer, ['push', 'origin', 'tmp-base-advance:' + BASE]);
131
132
 
132
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
133
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
133
134
  const result = await git.mergeChangeRequest(
134
135
  baseWsId, 'alice/edit', BASE, { subject: 'Edit (#2)', body: 'x' }, USER,
135
136
  );
@@ -163,7 +164,7 @@ describe('GitService.mergeChangeRequest', () => {
163
164
  // A save that has not been shared yet, exactly as a file tool leaves it.
164
165
  await fs.writeFile(path.join(baseRepo, 'base.md'), 'edited but not shared\n');
165
166
 
166
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
167
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
167
168
  await expect(
168
169
  git.mergeChangeRequest(
169
170
  baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
@@ -188,7 +189,7 @@ describe('GitService.mergeChangeRequest', () => {
188
189
  await runGit(baseRepo, ['add', '-A']);
189
190
  await runGit(baseRepo, ['commit', '-m', 'local only']);
190
191
 
191
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
192
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
192
193
  await expect(
193
194
  git.mergeChangeRequest(
194
195
  baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
@@ -203,7 +204,7 @@ describe('GitService.mergeChangeRequest', () => {
203
204
  await pushFeatureBranch(root, upstream, 'alice/add', async (dir) => {
204
205
  await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
205
206
  });
206
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
207
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
207
208
  const result = await git.mergeChangeRequest(
208
209
  baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
209
210
  { requireCleanTarget: true },
@@ -236,7 +237,7 @@ describe('GitService.mergeChangeRequest', () => {
236
237
  const publishedTip = (await gitOut(advancer, ['rev-parse', 'HEAD'])).trim();
237
238
  expect(staleHead).not.toBe(publishedTip);
238
239
 
239
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
240
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
240
241
  const seen: { sha: string; changedPaths: string[] }[] = [];
241
242
  const result = await git.mergeChangeRequest(
242
243
  baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
@@ -254,7 +255,7 @@ describe('GitService.mergeChangeRequest', () => {
254
255
  await pushFeatureBranch(root, upstream, 'alice/add', async (dir) => {
255
256
  await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
256
257
  });
257
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
258
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
258
259
  await expect(
259
260
  git.mergeChangeRequest(
260
261
  baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
@@ -279,7 +280,7 @@ describe('GitService.mergeChangeRequest', () => {
279
280
  await runGit(dir, ['mv', 'roles.yaml', 'people.yaml']);
280
281
  });
281
282
 
282
- const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), 'knowledge-base');
283
+ const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
283
284
  const seen: string[][] = [];
284
285
  const result = await git.mergeChangeRequest(
285
286
  baseWsId, 'alice/rename', BASE, { subject: 'Rename (#1)', body: 'x' }, USER,
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -72,7 +73,7 @@ async function makeSvc(root: string, workspaceId: string) {
72
73
  const svc = new GitService(
73
74
  stubWorkspaceService(workspaceId, workspaceDir),
74
75
  new WorkflowHooks(),
75
- 'knowledge-base',
76
+ testKbContext(),
76
77
  );
77
78
  return { svc, repo };
78
79
  }
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -109,7 +110,7 @@ describe('post-merge refresh of the target branch workspace', () => {
109
110
  [baseWsId]: path.dirname(baseRepo),
110
111
  }),
111
112
  stubWorkflowHooks(),
112
- KB_DIR,
113
+ testKbContext({ kbDirName: KB_DIR }),
113
114
  );
114
115
 
115
116
  // 1. The merge lands on origin/BASE (run from the caller's workspace).
@@ -163,7 +164,7 @@ describe('post-merge refresh of the target branch workspace', () => {
163
164
  [baseWsId]: path.dirname(baseRepo),
164
165
  }),
165
166
  stubWorkflowHooks(),
166
- KB_DIR,
167
+ testKbContext({ kbDirName: KB_DIR }),
167
168
  );
168
169
 
169
170
  const merged = await git.mergeChangeRequest(
@@ -254,7 +255,7 @@ describe('post-merge refresh of the target branch workspace', () => {
254
255
  [baseWsId]: path.dirname(baseRepo),
255
256
  }),
256
257
  stubWorkflowHooks(),
257
- KB_DIR,
258
+ testKbContext({ kbDirName: KB_DIR }),
258
259
  );
259
260
 
260
261
  const merged = await git.mergeChangeRequest(
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import os from 'node:os';
@@ -85,7 +86,7 @@ describe('GitService.pull', () => {
85
86
  const svc = new GitService(
86
87
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
87
88
  stubWorkflowHooks(),
88
- 'knowledge-base',
89
+ testKbContext(),
89
90
  );
90
91
 
91
92
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
@@ -128,7 +129,7 @@ describe('GitService.pull', () => {
128
129
  const svc = new GitService(
129
130
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
130
131
  stubWorkflowHooks(),
131
- 'knowledge-base',
132
+ testKbContext(),
132
133
  );
133
134
 
134
135
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
@@ -174,7 +175,7 @@ describe('GitService.pull', () => {
174
175
  const svc = new GitService(
175
176
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
176
177
  stubWorkflowHooks(),
177
- 'knowledge-base',
178
+ testKbContext(),
178
179
  );
179
180
 
180
181
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
@@ -219,7 +220,7 @@ describe('GitService.pull', () => {
219
220
  const svc = new GitService(
220
221
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
221
222
  stubWorkflowHooks(),
222
- 'knowledge-base',
223
+ testKbContext(),
223
224
  );
224
225
 
225
226
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
@@ -247,7 +248,7 @@ describe('GitService.pull', () => {
247
248
  const svc = new GitService(
248
249
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
249
250
  stubWorkflowHooks(),
250
- 'knowledge-base',
251
+ testKbContext(),
251
252
  );
252
253
 
253
254
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: false });
@@ -269,7 +270,7 @@ describe('GitService.pull', () => {
269
270
  const svc = new GitService(
270
271
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
271
272
  stubWorkflowHooks(),
272
- 'knowledge-base',
273
+ testKbContext(),
273
274
  );
274
275
 
275
276
  await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: false });
@@ -311,7 +312,7 @@ describe('GitService.pull', () => {
311
312
  const svc = new GitService(
312
313
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
313
314
  stubWorkflowHooks(),
314
- 'knowledge-base',
315
+ testKbContext(),
315
316
  );
316
317
 
317
318
  const err = await svc.pull(workspaceId).then(() => null).catch((e: unknown) => e);
@@ -338,7 +339,7 @@ describe('GitService.pull', () => {
338
339
  const svc = new GitService(
339
340
  stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
340
341
  stubWorkflowHooks(),
341
- 'knowledge-base',
342
+ testKbContext(),
342
343
  );
343
344
 
344
345
  await expect(svc.hasUnpushedCommits(workspaceId)).resolves.toBe(false);
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -59,7 +60,7 @@ describe('GitService.readFileAtRef', () => {
59
60
  return new GitService(
60
61
  stubWorkspaceService(workspaceId, workspaceDir),
61
62
  new WorkflowHooks(),
62
- PROCESS_MAP_DIR,
63
+ testKbContext({ kbDirName: PROCESS_MAP_DIR }),
63
64
  );
64
65
  }
65
66
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import os from 'node:os';
@@ -58,7 +59,7 @@ async function seed(root: string, branches: string[]): Promise<Fixture> {
58
59
  await runGit(repo, ['config', 'core.autocrlf', 'false']);
59
60
  repos[b] = repo;
60
61
  }
61
- const svc = new GitService(stubWorkspaceService(dirs), stubWorkflowHooks(), KB);
62
+ const svc = new GitService(stubWorkspaceService(dirs), stubWorkflowHooks(), testKbContext({ kbDirName: KB }));
62
63
  return { upstream, base, repos, svc };
63
64
  }
64
65
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import { execFile } from 'node:child_process';
3
4
  import { promisify } from 'node:util';
4
5
  import fs from 'node:fs/promises';
@@ -80,7 +81,7 @@ describe('GitService.status — hasUpstream', () => {
80
81
 
81
82
  it('reports hasUpstream=true on a tracked branch (cloned from origin)', async () => {
82
83
  const { workspaceDir } = await seedWorkspace(root, workspaceId);
83
- const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), 'knowledge-base');
84
+ const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
84
85
 
85
86
  const status = await svc.status(workspaceId);
86
87
  expect(status.branch).toBe('current-company-state');
@@ -96,7 +97,7 @@ describe('GitService.status — hasUpstream', () => {
96
97
  await runGit(repo, ['checkout', '-b', 'alice/unpublished-draft']);
97
98
  await runGit(repo, ['commit', '--allow-empty', '-m', 'local-only edit']);
98
99
 
99
- const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), 'knowledge-base');
100
+ const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
100
101
  const status = await svc.status(workspaceId);
101
102
 
102
103
  expect(status.branch).toBe('alice/unpublished-draft');
@@ -114,7 +115,7 @@ describe('GitService.status — hasUpstream', () => {
114
115
  await runGit(repo, ['commit', '--allow-empty', '-m', 'two']);
115
116
  await runGit(repo, ['push', '-u', 'origin', 'alice/published-draft']);
116
117
 
117
- const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), 'knowledge-base');
118
+ const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
118
119
  const status = await svc.status(workspaceId);
119
120
 
120
121
  expect(status.branch).toBe('alice/published-draft');
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { testKbContext } from '../../../../__tests__/kb-context.js';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import os from 'node:os';
@@ -81,7 +82,7 @@ describe('GitService.syncFromRemote', () => {
81
82
  await fs.writeFile(path.join(dir, 'b.md'), 'b\n');
82
83
  await fs.rename(path.join(dir, 'old name.md'), path.join(dir, 'new name.md'));
83
84
  });
84
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
85
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
85
86
 
86
87
  const r = await git.syncFromRemote('ws');
87
88
  expect(r.before).toBe(before);
@@ -105,7 +106,7 @@ describe('GitService.syncFromRemote', () => {
105
106
  await runGit(repo, ['config', 'user.email', 'workspace@bevel.test']);
106
107
  await runGit(repo, ['config', 'user.name', 'bevel Workspace']);
107
108
  await runGit(repo, ['checkout', '-b', BRANCH]).catch(() => undefined);
108
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
109
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
109
110
 
110
111
  // Still empty on both sides: nothing to sync, and NOT 'remote gone' — a
111
112
  // fresh deployment nobody has pushed to must never have its clone retired.
@@ -134,7 +135,7 @@ describe('GitService.syncFromRemote', () => {
134
135
  await runGit(upstream, ['branch', 'ali/x', BRANCH]);
135
136
  const { workspaceDir } = await cloneWorkspace(root, upstream, 'ali%2Fx', 'ali/x');
136
137
  await runGit(upstream, ['update-ref', '-d', 'refs/heads/ali/x']);
137
- const git = new GitService(stubWorkspaceService({ 'ali%2Fx': workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
138
+ const git = new GitService(stubWorkspaceService({ 'ali%2Fx': workspaceDir }), stubWorkflowHooks(), testKbContext());
138
139
  await expect(git.syncFromRemote('ali%2Fx')).rejects.toBeInstanceOf(RemoteBranchGoneError);
139
140
  });
140
141
  });
@@ -163,7 +164,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
163
164
  await pushFromElsewhere(root, upstream, async (dir) => {
164
165
  await fs.writeFile(path.join(dir, 'a.md'), 'edited on the host\n');
165
166
  });
166
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
167
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
167
168
 
168
169
  await expect(git.syncFromRemote('ws')).rejects.toMatchObject({
169
170
  name: 'PullRebaseConflictError',
@@ -186,7 +187,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
186
187
  await runGit(repo, ['rm', '-rf', '--cached', '.']).catch(() => undefined);
187
188
  await fs.rm(path.join(repo, 'a.md'), { force: true });
188
189
  await fs.rm(path.join(repo, 'old name.md'), { force: true });
189
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
190
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
190
191
  await expect(git.syncFromRemote('ws')).rejects.toBeInstanceOf(RemoteBranchGoneError);
191
192
  });
192
193
 
@@ -194,7 +195,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
194
195
  const upstream = await bareUpstream(root, true);
195
196
  await runGit(upstream, ['branch', 'ali/x', BRANCH]);
196
197
  const { workspaceDir } = await cloneWorkspace(root, upstream, 'ws');
197
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
198
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
198
199
  expect(await git.remoteBranchExists('ws', 'ali/x')).toBe(true);
199
200
  await runGit(upstream, ['update-ref', '-d', 'refs/heads/ali/x']);
200
201
  expect(await git.remoteBranchExists('ws', 'ali/x')).toBe(false);
@@ -241,7 +242,7 @@ describe('GitService.syncFromRemote — an unborn clone that already holds stage
241
242
  await runGit(seed, ['add', '.']);
242
243
  await runGit(seed, ['commit', '-m', 'first']);
243
244
  await runGit(seed, ['push', upstream, BRANCH]);
244
- const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), 'knowledge-base');
245
+ const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
245
246
 
246
247
  await expect(git.syncFromRemote('ws')).rejects.toMatchObject({
247
248
  name: 'PullRebaseConflictError',
@@ -3,7 +3,7 @@ import fs from 'node:fs/promises';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { NodeGitRunner } from '../node-git-runner.js';
6
- import { GitRunError, isGitTimeout } from '../../../../shared/git.contract.js';
6
+ import { GitRunError, gitCredentials, isGitTimeout } from '../../../../shared/git.contract.js';
7
7
 
8
8
  /**
9
9
  * These run REAL git, like the rest of this module's suites: the behaviours
@@ -94,10 +94,48 @@ describe('NodeGitRunner', () => {
94
94
  expect(true).toBe(true);
95
95
  });
96
96
 
97
+ /**
98
+ * The helper the runner's callers stamp into a clone, reduced to the one
99
+ * thing under test here: what `$GITHUB_TOKEN` is in the child. `credential
100
+ * fill` runs it through git's own shell and prints what it answered, which
101
+ * is the same path a push takes to its password.
102
+ */
103
+ const ECHO_TOKEN_HELPER = `!f() { printf '%s\\n' "username=u" "password=\${GITHUB_TOKEN-none}"; }; f`;
104
+ const fill = (runner: NodeGitRunner, env?: NodeJS.ProcessEnv) =>
105
+ runner.run(dir, ['-c', `credential.helper=${ECHO_TOKEN_HELPER}`, 'credential', 'fill'], {
106
+ input: 'protocol=https\nhost=example.test\n\n',
107
+ env,
108
+ });
109
+
110
+ it('hands its token to the child, where the helper reads it, and never puts it in argv', async () => {
111
+ const runner = new NodeGitRunner(undefined, gitCredentials('x-access-token', 'ghp_child_secret'));
112
+ const { stdout } = await fill(runner);
113
+ expect(stdout).toContain('password=ghp_child_secret');
114
+ });
115
+
116
+ it('drops a token this process inherited: only the credentials in effect reach git', async () => {
117
+ const previous = process.env.GITHUB_TOKEN;
118
+ process.env.GITHUB_TOKEN = 'ghp_stale_in_process_env';
119
+ try {
120
+ const { stdout } = await fill(new NodeGitRunner());
121
+ expect(stdout).toContain('password=none');
122
+ expect(stdout).not.toContain('ghp_stale_in_process_env');
123
+ } finally {
124
+ if (previous === undefined) delete process.env.GITHUB_TOKEN;
125
+ else process.env.GITHUB_TOKEN = previous;
126
+ }
127
+ });
128
+
129
+ it('lets a per-call environment entry win over its own token: the setup probe checks the token it was given', async () => {
130
+ const runner = new NodeGitRunner(undefined, gitCredentials('x-access-token', 'ghp_in_effect'));
131
+ const { stdout } = await fill(runner, { GITHUB_TOKEN: 'ghp_being_checked' });
132
+ expect(stdout).toContain('password=ghp_being_checked');
133
+ });
134
+
97
135
  it('keeps the configured git token out of failures', async () => {
98
- const runner = new NodeGitRunner();
136
+ const runner = new NodeGitRunner(undefined, gitCredentials('x-access-token', 'ghp_secret_value_here'));
99
137
  const previous = process.env.GITHUB_TOKEN;
100
- process.env.GITHUB_TOKEN = 'ghp_secret_value_here';
138
+ delete process.env.GITHUB_TOKEN;
101
139
  try {
102
140
  const err = await runner
103
141
  .run(dir, ['ls-remote', 'https://x-access-token:ghp_secret_value_here@127.0.0.1:1/r.git'], {