@braidhq/server 0.0.1 → 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 (258) hide show
  1. package/README.md +136 -0
  2. package/dist/app.d.ts +19 -2
  3. package/dist/app.d.ts.map +1 -1
  4. package/dist/app.js +121 -3
  5. package/dist/app.js.map +1 -1
  6. package/dist/composeFs.d.ts +41 -6
  7. package/dist/composeFs.d.ts.map +1 -1
  8. package/dist/composeFs.js +234 -52
  9. package/dist/composeFs.js.map +1 -1
  10. package/dist/composition.d.ts +86 -2
  11. package/dist/composition.d.ts.map +1 -1
  12. package/dist/composition.js +71 -1
  13. package/dist/composition.js.map +1 -1
  14. package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts +21 -0
  15. package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts.map +1 -1
  16. package/dist/infrastructure/agent/SubprocessSkillRunner.js +35 -3
  17. package/dist/infrastructure/agent/SubprocessSkillRunner.js.map +1 -1
  18. package/dist/infrastructure/agent/mcpConfig.d.ts +25 -5
  19. package/dist/infrastructure/agent/mcpConfig.d.ts.map +1 -1
  20. package/dist/infrastructure/agent/mcpConfig.js +22 -14
  21. package/dist/infrastructure/agent/mcpConfig.js.map +1 -1
  22. package/dist/infrastructure/auth/AccessPolicy.d.ts +112 -0
  23. package/dist/infrastructure/auth/AccessPolicy.d.ts.map +1 -0
  24. package/dist/infrastructure/auth/AccessPolicy.js +184 -0
  25. package/dist/infrastructure/auth/AccessPolicy.js.map +1 -0
  26. package/dist/infrastructure/auth/SessionStore.d.ts +40 -0
  27. package/dist/infrastructure/auth/SessionStore.d.ts.map +1 -0
  28. package/dist/infrastructure/auth/SessionStore.js +107 -0
  29. package/dist/infrastructure/auth/SessionStore.js.map +1 -0
  30. package/dist/infrastructure/auth/ensureApprovedEmails.d.ts +16 -0
  31. package/dist/infrastructure/auth/ensureApprovedEmails.d.ts.map +1 -0
  32. package/dist/infrastructure/auth/ensureApprovedEmails.js +20 -0
  33. package/dist/infrastructure/auth/ensureApprovedEmails.js.map +1 -0
  34. package/dist/infrastructure/env.d.ts +11 -0
  35. package/dist/infrastructure/env.d.ts.map +1 -0
  36. package/dist/infrastructure/env.js +20 -0
  37. package/dist/infrastructure/env.js.map +1 -0
  38. package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts +300 -0
  39. package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts.map +1 -0
  40. package/dist/infrastructure/fs/FsBatchPlanRepository.js +42 -0
  41. package/dist/infrastructure/fs/FsBatchPlanRepository.js.map +1 -0
  42. package/dist/infrastructure/fs/FsClarifyTicketRepository.d.ts.map +1 -1
  43. package/dist/infrastructure/fs/FsClarifyTicketRepository.js +7 -1
  44. package/dist/infrastructure/fs/FsClarifyTicketRepository.js.map +1 -1
  45. package/dist/infrastructure/fs/FsGraphSerializer.d.ts +629 -0
  46. package/dist/infrastructure/fs/FsGraphSerializer.d.ts.map +1 -0
  47. package/dist/infrastructure/fs/FsGraphSerializer.js +60 -0
  48. package/dist/infrastructure/fs/FsGraphSerializer.js.map +1 -0
  49. package/dist/infrastructure/fs/FsProposalRepository.d.ts.map +1 -1
  50. package/dist/infrastructure/fs/FsProposalRepository.js +8 -0
  51. package/dist/infrastructure/fs/FsProposalRepository.js.map +1 -1
  52. package/dist/infrastructure/fs/FsRunRepository.d.ts +4 -1
  53. package/dist/infrastructure/fs/FsRunRepository.d.ts.map +1 -1
  54. package/dist/infrastructure/fs/FsRunRepository.js +75 -3
  55. package/dist/infrastructure/fs/FsRunRepository.js.map +1 -1
  56. package/dist/infrastructure/fs/FsSkillRegistry.d.ts.map +1 -1
  57. package/dist/infrastructure/fs/FsSkillRegistry.js +15 -3
  58. package/dist/infrastructure/fs/FsSkillRegistry.js.map +1 -1
  59. package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts +19 -0
  60. package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts.map +1 -0
  61. package/dist/infrastructure/fs/FsSourceUnitDigest.js +58 -0
  62. package/dist/infrastructure/fs/FsSourceUnitDigest.js.map +1 -0
  63. package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts +30 -0
  64. package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts.map +1 -0
  65. package/dist/infrastructure/fs/FsSourceUnitStateRepository.js +87 -0
  66. package/dist/infrastructure/fs/FsSourceUnitStateRepository.js.map +1 -0
  67. package/dist/infrastructure/fs/FsWorkspaceRepository.d.ts.map +1 -1
  68. package/dist/infrastructure/fs/FsWorkspaceRepository.js +12 -3
  69. package/dist/infrastructure/fs/FsWorkspaceRepository.js.map +1 -1
  70. package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts +15 -0
  71. package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts.map +1 -0
  72. package/dist/infrastructure/fs/WorkspaceDiscovery.js +46 -0
  73. package/dist/infrastructure/fs/WorkspaceDiscovery.js.map +1 -0
  74. package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts +26 -2
  75. package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts.map +1 -1
  76. package/dist/infrastructure/fs/WorkspaceRegistryFile.js +109 -5
  77. package/dist/infrastructure/fs/WorkspaceRegistryFile.js.map +1 -1
  78. package/dist/infrastructure/fs/intentScan.d.ts +9 -0
  79. package/dist/infrastructure/fs/intentScan.d.ts.map +1 -0
  80. package/dist/infrastructure/fs/intentScan.js +135 -0
  81. package/dist/infrastructure/fs/intentScan.js.map +1 -0
  82. package/dist/infrastructure/fs/paths.d.ts +14 -0
  83. package/dist/infrastructure/fs/paths.d.ts.map +1 -1
  84. package/dist/infrastructure/fs/paths.js +43 -0
  85. package/dist/infrastructure/fs/paths.js.map +1 -1
  86. package/dist/infrastructure/fs/productManifestWriter.d.ts +1 -1
  87. package/dist/infrastructure/fs/productManifestWriter.d.ts.map +1 -1
  88. package/dist/infrastructure/fs/productManifestWriter.js +1 -3
  89. package/dist/infrastructure/fs/productManifestWriter.js.map +1 -1
  90. package/dist/infrastructure/git/GitWorkspaceHistory.d.ts +18 -0
  91. package/dist/infrastructure/git/GitWorkspaceHistory.d.ts.map +1 -0
  92. package/dist/infrastructure/git/GitWorkspaceHistory.js +303 -0
  93. package/dist/infrastructure/git/GitWorkspaceHistory.js.map +1 -0
  94. package/dist/infrastructure/git/commitMessage.d.ts +4 -0
  95. package/dist/infrastructure/git/commitMessage.d.ts.map +1 -0
  96. package/dist/infrastructure/git/commitMessage.js +71 -0
  97. package/dist/infrastructure/git/commitMessage.js.map +1 -0
  98. package/dist/infrastructure/oauth/GoogleOAuth.d.ts +48 -1
  99. package/dist/infrastructure/oauth/GoogleOAuth.d.ts.map +1 -1
  100. package/dist/infrastructure/oauth/GoogleOAuth.js +68 -0
  101. package/dist/infrastructure/oauth/GoogleOAuth.js.map +1 -1
  102. package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts +14 -0
  103. package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts.map +1 -0
  104. package/dist/infrastructure/users/UserDirectoryFromRegistry.js +21 -0
  105. package/dist/infrastructure/users/UserDirectoryFromRegistry.js.map +1 -0
  106. package/dist/infrastructure/users/UserRegistryFile.d.ts +23 -0
  107. package/dist/infrastructure/users/UserRegistryFile.d.ts.map +1 -0
  108. package/dist/infrastructure/users/UserRegistryFile.js +91 -0
  109. package/dist/infrastructure/users/UserRegistryFile.js.map +1 -0
  110. package/dist/infrastructure/users/ensureLocalUser.d.ts +15 -0
  111. package/dist/infrastructure/users/ensureLocalUser.d.ts.map +1 -0
  112. package/dist/infrastructure/users/ensureLocalUser.js +38 -0
  113. package/dist/infrastructure/users/ensureLocalUser.js.map +1 -0
  114. package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts +9 -0
  115. package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts.map +1 -0
  116. package/dist/infrastructure/users/ensureWorkspaceOwners.js +22 -0
  117. package/dist/infrastructure/users/ensureWorkspaceOwners.js.map +1 -0
  118. package/dist/middleware/auth.d.ts +29 -0
  119. package/dist/middleware/auth.d.ts.map +1 -0
  120. package/dist/middleware/auth.js +81 -0
  121. package/dist/middleware/auth.js.map +1 -0
  122. package/dist/middleware/cors.js +1 -1
  123. package/dist/middleware/cors.js.map +1 -1
  124. package/dist/middleware/requireAdmin.d.ts +10 -0
  125. package/dist/middleware/requireAdmin.d.ts.map +1 -0
  126. package/dist/middleware/requireAdmin.js +24 -0
  127. package/dist/middleware/requireAdmin.js.map +1 -0
  128. package/dist/middleware/userId.d.ts +16 -0
  129. package/dist/middleware/userId.d.ts.map +1 -0
  130. package/dist/middleware/userId.js +27 -0
  131. package/dist/middleware/userId.js.map +1 -0
  132. package/dist/middleware/workspaceAccess.d.ts +47 -0
  133. package/dist/middleware/workspaceAccess.d.ts.map +1 -0
  134. package/dist/middleware/workspaceAccess.js +86 -0
  135. package/dist/middleware/workspaceAccess.js.map +1 -0
  136. package/dist/policy/Capability.d.ts +12 -0
  137. package/dist/policy/Capability.d.ts.map +1 -0
  138. package/dist/policy/Capability.js +31 -0
  139. package/dist/policy/Capability.js.map +1 -0
  140. package/dist/policy/CapabilityCheck.d.ts +14 -0
  141. package/dist/policy/CapabilityCheck.d.ts.map +1 -0
  142. package/dist/policy/CapabilityCheck.js +2 -0
  143. package/dist/policy/CapabilityCheck.js.map +1 -0
  144. package/dist/policy/PermissionRegistry.d.ts +23 -0
  145. package/dist/policy/PermissionRegistry.d.ts.map +1 -0
  146. package/dist/policy/PermissionRegistry.js +27 -0
  147. package/dist/policy/PermissionRegistry.js.map +1 -0
  148. package/dist/policy/ViewerContext.d.ts +27 -0
  149. package/dist/policy/ViewerContext.d.ts.map +1 -0
  150. package/dist/policy/ViewerContext.js +2 -0
  151. package/dist/policy/ViewerContext.js.map +1 -0
  152. package/dist/policy/checks.d.ts +15 -0
  153. package/dist/policy/checks.d.ts.map +1 -0
  154. package/dist/policy/checks.js +52 -0
  155. package/dist/policy/checks.js.map +1 -0
  156. package/dist/policy/defaultRegistry.d.ts +10 -0
  157. package/dist/policy/defaultRegistry.d.ts.map +1 -0
  158. package/dist/policy/defaultRegistry.js +16 -0
  159. package/dist/policy/defaultRegistry.js.map +1 -0
  160. package/dist/policy/index.d.ts +8 -0
  161. package/dist/policy/index.d.ts.map +1 -0
  162. package/dist/policy/index.js +5 -0
  163. package/dist/policy/index.js.map +1 -0
  164. package/dist/policy/resolveViewer.d.ts +16 -0
  165. package/dist/policy/resolveViewer.d.ts.map +1 -0
  166. package/dist/policy/resolveViewer.js +37 -0
  167. package/dist/policy/resolveViewer.js.map +1 -0
  168. package/dist/routes/_shared.d.ts +198 -0
  169. package/dist/routes/_shared.d.ts.map +1 -0
  170. package/dist/routes/_shared.js +29 -0
  171. package/dist/routes/_shared.js.map +1 -0
  172. package/dist/routes/admin.d.ts +13 -0
  173. package/dist/routes/admin.d.ts.map +1 -0
  174. package/dist/routes/admin.js +227 -0
  175. package/dist/routes/admin.js.map +1 -0
  176. package/dist/routes/auth.d.ts +33 -0
  177. package/dist/routes/auth.d.ts.map +1 -0
  178. package/dist/routes/auth.js +170 -0
  179. package/dist/routes/auth.js.map +1 -0
  180. package/dist/routes/batch.d.ts +7 -0
  181. package/dist/routes/batch.d.ts.map +1 -0
  182. package/dist/routes/batch.js +47 -0
  183. package/dist/routes/batch.js.map +1 -0
  184. package/dist/routes/clarify.d.ts +4 -3
  185. package/dist/routes/clarify.d.ts.map +1 -1
  186. package/dist/routes/clarify.js +247 -57
  187. package/dist/routes/clarify.js.map +1 -1
  188. package/dist/routes/decisions.d.ts +2 -2
  189. package/dist/routes/decisions.d.ts.map +1 -1
  190. package/dist/routes/decisions.js +50 -12
  191. package/dist/routes/decisions.js.map +1 -1
  192. package/dist/routes/edges.d.ts +2 -2
  193. package/dist/routes/edges.d.ts.map +1 -1
  194. package/dist/routes/edges.js +35 -13
  195. package/dist/routes/edges.js.map +1 -1
  196. package/dist/routes/health.d.ts +2 -2
  197. package/dist/routes/health.d.ts.map +1 -1
  198. package/dist/routes/health.js +21 -3
  199. package/dist/routes/health.js.map +1 -1
  200. package/dist/routes/history.d.ts +7 -0
  201. package/dist/routes/history.d.ts.map +1 -0
  202. package/dist/routes/history.js +88 -0
  203. package/dist/routes/history.js.map +1 -0
  204. package/dist/routes/model.d.ts +2 -2
  205. package/dist/routes/model.d.ts.map +1 -1
  206. package/dist/routes/model.js +20 -4
  207. package/dist/routes/model.js.map +1 -1
  208. package/dist/routes/nodes.d.ts +2 -2
  209. package/dist/routes/nodes.d.ts.map +1 -1
  210. package/dist/routes/nodes.js +75 -19
  211. package/dist/routes/nodes.js.map +1 -1
  212. package/dist/routes/ontology.d.ts +2 -2
  213. package/dist/routes/ontology.d.ts.map +1 -1
  214. package/dist/routes/ontology.js +22 -5
  215. package/dist/routes/ontology.js.map +1 -1
  216. package/dist/routes/proposals.d.ts +4 -3
  217. package/dist/routes/proposals.d.ts.map +1 -1
  218. package/dist/routes/proposals.js +170 -41
  219. package/dist/routes/proposals.js.map +1 -1
  220. package/dist/routes/runs.d.ts.map +1 -1
  221. package/dist/routes/runs.js +52 -1
  222. package/dist/routes/runs.js.map +1 -1
  223. package/dist/routes/skillInputOptions.d.ts +10 -0
  224. package/dist/routes/skillInputOptions.d.ts.map +1 -0
  225. package/dist/routes/skillInputOptions.js +161 -0
  226. package/dist/routes/skillInputOptions.js.map +1 -0
  227. package/dist/routes/skills.d.ts +2 -2
  228. package/dist/routes/skills.d.ts.map +1 -1
  229. package/dist/routes/skills.js +89 -19
  230. package/dist/routes/skills.js.map +1 -1
  231. package/dist/routes/sourceLoaders.d.ts +7 -0
  232. package/dist/routes/sourceLoaders.d.ts.map +1 -0
  233. package/dist/routes/sourceLoaders.js +29 -0
  234. package/dist/routes/sourceLoaders.js.map +1 -0
  235. package/dist/routes/sourceUnitStates.d.ts +7 -0
  236. package/dist/routes/sourceUnitStates.d.ts.map +1 -0
  237. package/dist/routes/sourceUnitStates.js +45 -0
  238. package/dist/routes/sourceUnitStates.js.map +1 -0
  239. package/dist/routes/users.d.ts +9 -0
  240. package/dist/routes/users.d.ts.map +1 -0
  241. package/dist/routes/users.js +127 -0
  242. package/dist/routes/users.js.map +1 -0
  243. package/dist/routes/workspaceMembers.d.ts +11 -0
  244. package/dist/routes/workspaceMembers.d.ts.map +1 -0
  245. package/dist/routes/workspaceMembers.js +81 -0
  246. package/dist/routes/workspaceMembers.js.map +1 -0
  247. package/dist/routes/workspaces.d.ts +19 -1
  248. package/dist/routes/workspaces.d.ts.map +1 -1
  249. package/dist/routes/workspaces.js +161 -45
  250. package/dist/routes/workspaces.js.map +1 -1
  251. package/dist/server.js +69 -25
  252. package/dist/server.js.map +1 -1
  253. package/package.json +48 -31
  254. package/LICENSE +0 -21
  255. package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts +0 -8
  256. package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts.map +0 -1
  257. package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js +0 -62
  258. package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,WAAW,EACX,+BAA+B,EAC/B,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AA+CtB,MAAM,UAAU,UAAU,CAAC,UAA0B,EAAE;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,WAAW,EAAE,CAAA;IAChD,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,0BAA0B,EAAE,CAAA;IACzF,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,+BAA+B,EAAE,CAAA;IAC5F,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,0BAA0B,EAAE,CAAA;IACzF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,uBAAuB,EAAE,CAAA;IAChF,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,2BAA2B,EAAE,CAAA;IAC5F,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,cAAc,EAAE,CAAA;IAErE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,yBAAyB,EAAE,CAAA;IACpE,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAA;IACtE,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IAC1D,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC,CAAA;IACnE,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IACtF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,kBAAkB;QAClB,iBAAiB;QACjB,kBAAkB;QAClB,eAAe;QACf,iBAAiB;QACjB,KAAK;QACL,QAAQ;KACT,CAAC,CAAA;IAEF,OAAO;QACL,gBAAgB;QAChB,WAAW;QACX,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,QAAQ;QACR,cAAc;QACd,kBAAkB;QAClB,iBAAiB;QACjB,kBAAkB;QAClB,eAAe;QACf,mBAAmB;QACnB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,iBAAiB;QACzD,KAAK;KACN,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,27 @@ export interface SubprocessSkillRunnerDeps {
23
23
  readonly referenceDirs?: readonly SkillReferenceDir[];
24
24
  /** Delete the per-run session directory after the run. Default `true`. */
25
25
  readonly cleanupSession?: boolean;
26
+ /**
27
+ * Enables the built-in `braid-core` MCP gateway. When set, every
28
+ * spawned skill receives a stdio MCP server entry that runs
29
+ * `<uvxBin> openapi-mcp-gateway --spec <specUrl> --transport stdio`
30
+ * — claude spawns the gateway as a per-session child, the gateway
31
+ * fetches the OpenAPI spec from `specUrl`, and the REST surface is
32
+ * exposed as MCP tools (`braid_search_nodes`,
33
+ * `braid_submit_proposal`, …).
34
+ *
35
+ * `specUrl` is typically `${apiUrl}/openapi.json`. `uvxBin` defaults
36
+ * to `'uvx'` (resolved against PATH); composeFs preflight-checks for
37
+ * its presence at boot.
38
+ *
39
+ * Leave undefined to skip the entry entirely (skills with
40
+ * `requiredMcpServers: ['braid-core']` will then surface as
41
+ * not-ready via SkillManifest.readinessIssuesFor).
42
+ */
43
+ readonly coreGateway?: {
44
+ readonly specUrl: string;
45
+ readonly uvxBin?: string;
46
+ };
26
47
  /**
27
48
  * Optional pub/sub for workspace-scoped notifications. Used by Studio
28
49
  * to invalidate run / proposal lists in real time without polling.
@@ -1 +1 @@
1
- {"version":3,"file":"SubprocessSkillRunner.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/agent/SubprocessSkillRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EAClB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,YAAY,EAAyB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAcpE,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAA;AAEvG;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,sFAAsF;IACtF,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACrD,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAOD,qBAAa,qBAAsB,YAAW,WAAW;IAQ3C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE7B,IAAI,EAAE,yBAAyB;IAEtD,KAAK,CACT,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,UAAU,CAAC;IAgEtB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,GAAG,oBAAoB;IAchF,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAI9B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASvC,KAAK;YAgFL,IAAI;YAiBJ,iBAAiB;YAkBjB,iBAAiB;YAQjB,eAAe;IAyB7B,OAAO,CAAC,GAAG;CAGZ"}
1
+ {"version":3,"file":"SubprocessSkillRunner.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/agent/SubprocessSkillRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EAClB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,YAAY,EAAyB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAUpE,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAA;AAEvG;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,sFAAsF;IACtF,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACrD,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KACzB,CAAA;IACD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAOD,qBAAa,qBAAsB,YAAW,WAAW;IAQ3C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE7B,IAAI,EAAE,yBAAyB;IAEtD,KAAK,CACT,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,UAAU,CAAC;IAgGtB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,GAAG,oBAAoB;IAchF,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAI9B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASvC,KAAK;YAgFL,IAAI;YAiBJ,iBAAiB;YAkBjB,iBAAiB;YAQjB,eAAe;IAyB7B,OAAO,CAAC,GAAG;CAGZ"}
@@ -1,7 +1,7 @@
1
1
  import { mkdir, rm, symlink } from 'node:fs/promises';
2
2
  import { dirname, join } from 'node:path';
3
3
  import { newSkillRunId, NotFoundError } from '@braidhq/core';
4
- import { AbsolutePath as AbsolutePathSchema, SkillEvent as SkillEventSchema, SkillRunId as SkillRunIdSchema, } from '@braidhq/schema';
4
+ import { AbsolutePath as AbsolutePathSchema, McpServerId, SkillEvent as SkillEventSchema, SkillRunId as SkillRunIdSchema } from '@braidhq/schema';
5
5
  import { sessionDirPath } from '../fs/paths.js';
6
6
  import { createAsyncQueue } from './asyncQueue.js';
7
7
  import { writeMcpConfigFile } from './mcpConfig.js';
@@ -21,7 +21,31 @@ export class SubprocessSkillRunner {
21
21
  const manifest = await this.deps.skillRegistry.get(workspace, skillId);
22
22
  const runId = newSkillRunId();
23
23
  const sessionDir = await this.resolveSessionDir(workspace, runId, options?.resumeSessionId);
24
- const mcpConfigFile = await writeMcpConfigFile(workspace, sessionDir);
24
+ const gatewayArgs = [
25
+ 'openapi-mcp-gateway',
26
+ '--spec',
27
+ this.deps.coreGateway?.specUrl ?? '',
28
+ '--transport',
29
+ 'stdio',
30
+ '--name',
31
+ 'braid-core',
32
+ // Forward the caller's Bearer token so the gateway authenticates
33
+ // its outgoing API calls. The gateway resolves `${BRAID_TOKEN}`
34
+ // against its inherited process env at startup; without this the
35
+ // server's auth middleware rejects every callback with 401.
36
+ // eslint-disable-next-line no-template-curly-in-string
37
+ ...(options?.callerToken ? ['--auth-type', 'bearer', '--auth-token', '${BRAID_TOKEN}'] : []),
38
+ ];
39
+ const mcpConfigFile = await writeMcpConfigFile(workspace, sessionDir, {
40
+ extraServers: this.deps.coreGateway
41
+ ? [{
42
+ id: McpServerId.parse('braid-core'),
43
+ transport: 'stdio',
44
+ command: this.deps.coreGateway.uvxBin ?? 'uvx',
45
+ args: gatewayArgs,
46
+ }]
47
+ : [],
48
+ });
25
49
  const invocation = this.deps.agentBinding.resolveSpawn({
26
50
  skillId,
27
51
  args,
@@ -37,7 +61,15 @@ export class SubprocessSkillRunner {
37
61
  // otherwise guess wrong about which one `.claude/skills/...` is rooted in.
38
62
  const child = spawnFn(invocation.bin, [...invocation.args], {
39
63
  cwd: sessionDir,
40
- env: { ...invocation.env, BRAID_SESSION_DIR: sessionDir },
64
+ env: {
65
+ ...invocation.env,
66
+ BRAID_SESSION_DIR: sessionDir,
67
+ // BRAID_TOKEN is read by the braid-core MCP gateway and by any
68
+ // shell-level callback (curl in a SKILL.md) so the subprocess
69
+ // can authenticate against the running server.
70
+ ...(options?.callerToken ? { BRAID_TOKEN: options.callerToken } : {}),
71
+ ...(options?.extraEnv ?? {}),
72
+ },
41
73
  stdio: ['ignore', 'pipe', 'pipe'],
42
74
  });
43
75
  this.running.set(runId, { workspace, child });
@@ -1 +1 @@
1
- {"version":3,"file":"SubprocessSkillRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/agent/SubprocessSkillRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubprocessSkillRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/agent/SubprocessSkillRunner.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,38 @@
1
1
  import type { Workspace } from '@braidhq/core';
2
+ import type { McpServerConfig } from '@braidhq/schema';
2
3
  export interface McpConfigFile {
3
4
  readonly mcpServers: Readonly<Record<string, McpServerEntry>>;
4
5
  }
5
6
  /**
6
- * Shape claude expects in `--mcp-config <file>`. Mirrors the spec's
7
- * Streamable HTTP transport: a single endpoint URL with optional headers.
7
+ * Shape claude expects in `--mcp-config <file>`.
8
+ *
9
+ * The Streamable HTTP transport is `type: 'http'` (the claude CLI's
10
+ * legacy name; predates the rename in the MCP 2025-06-18 spec). We
11
+ * use the new name in PRODUCT.md to match the spec and emit the
12
+ * legacy name here so claude understands.
8
13
  */
9
14
  interface McpStreamableHttpEntry {
10
15
  readonly type: 'http';
11
16
  readonly url: string;
12
17
  readonly headers?: Record<string, string>;
13
18
  }
14
- type McpServerEntry = McpStreamableHttpEntry;
15
- export declare function buildMcpConfig(workspace: Workspace): McpConfigFile;
16
- export declare function writeMcpConfigFile(workspace: Workspace, targetDir: string): Promise<string>;
19
+ interface McpStdioEntry {
20
+ readonly type: 'stdio';
21
+ readonly command: string;
22
+ readonly args?: readonly string[];
23
+ readonly env?: Record<string, string>;
24
+ }
25
+ type McpServerEntry = McpStreamableHttpEntry | McpStdioEntry;
26
+ export interface BuildMcpConfigOptions {
27
+ /**
28
+ * Extra MCP server entries injected on top of the workspace's own
29
+ * `mcpServers`. Used to wire the built-in `braid-core` gateway —
30
+ * see `SubprocessSkillRunner`. Workspace entries with the same id
31
+ * take precedence (so a workspace can override a built-in).
32
+ */
33
+ extraServers?: readonly McpServerConfig[];
34
+ }
35
+ export declare function buildMcpConfig(workspace: Workspace, options?: BuildMcpConfigOptions): McpConfigFile;
36
+ export declare function writeMcpConfigFile(workspace: Workspace, targetDir: string, options?: BuildMcpConfigOptions): Promise<string>;
17
37
  export {};
18
38
  //# sourceMappingURL=mcpConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcpConfig.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/agent/mcpConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAM9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;CAC9D;AAED;;;GAGG;AACH,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAED,KAAK,cAAc,GAAG,sBAAsB,CAAA;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,CAMlE;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjG"}
1
+ {"version":3,"file":"mcpConfig.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/agent/mcpConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAKtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;CAC9D;AAED;;;;;;;GAOG;AACH,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,KAAK,cAAc,GAAG,sBAAsB,GAAG,aAAa,CAAA;AAE5D,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC1C;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,qBAA0B,GAAG,aAAa,CASvG;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -1,43 +1,51 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises';
2
2
  import { dirname, join } from 'node:path';
3
3
  import process from 'node:process';
4
- export function buildMcpConfig(workspace) {
4
+ export function buildMcpConfig(workspace, options = {}) {
5
5
  const entries = {};
6
+ for (const server of options.extraServers ?? []) {
7
+ entries[server.id] = toEntry(server);
8
+ }
6
9
  for (const server of workspace.mcpServers) {
7
10
  entries[server.id] = toEntry(server);
8
11
  }
9
12
  return { mcpServers: entries };
10
13
  }
11
- export async function writeMcpConfigFile(workspace, targetDir) {
12
- const config = buildMcpConfig(workspace);
14
+ export async function writeMcpConfigFile(workspace, targetDir, options = {}) {
15
+ const config = buildMcpConfig(workspace, options);
13
16
  const targetPath = join(targetDir, `.braid-mcp-${workspace.id}.json`);
14
17
  await mkdir(dirname(targetPath), { recursive: true });
15
18
  await writeFile(targetPath, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
16
19
  return targetPath;
17
20
  }
18
21
  function toEntry(server) {
19
- // `type: 'http'` is what the claude CLI's mcp-config schema currently
20
- // names the Streamable HTTP transport (it predates the rename in the MCP
21
- // 2025-06-18 spec). We use the new name in PRODUCT.md to match the spec;
22
- // we emit the legacy name here so claude understands.
22
+ if (server.transport === 'stdio') {
23
+ return {
24
+ type: 'stdio',
25
+ command: server.command,
26
+ ...(server.args ? { args: [...server.args] } : {}),
27
+ ...(server.env ? { env: resolveEnv(server.env) } : {}),
28
+ };
29
+ }
23
30
  return {
24
31
  type: 'http',
25
32
  url: server.url,
26
- ...(server.headers ? { headers: resolveHeaders(server.headers) } : {}),
33
+ ...(server.headers ? { headers: resolveEnv(server.headers) } : {}),
27
34
  };
28
35
  }
29
36
  /**
30
- * Replace `${VAR}` references in header values with the matching env var.
31
- * Throws if a referenced var is missing so the user gets a clear error at
32
- * config-write time rather than a confusing 401 from the MCP server.
37
+ * Replace `${VAR}` references in header / env values with the matching
38
+ * parent-process env var. Throws if a referenced var is missing so the
39
+ * user gets a clear error at config-write time rather than a confusing
40
+ * 401 from the MCP server or a silently-misconfigured subprocess.
33
41
  */
34
- function resolveHeaders(headers) {
42
+ function resolveEnv(values) {
35
43
  const out = {};
36
- for (const [name, value] of Object.entries(headers)) {
44
+ for (const [name, value] of Object.entries(values)) {
37
45
  out[name] = value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (_match, varName) => {
38
46
  const resolved = process.env[varName];
39
47
  if (resolved === undefined) {
40
- throw new Error(`MCP header "${name}": environment variable "${varName}" is not set`);
48
+ throw new Error(`MCP entry "${name}": environment variable "${varName}" is not set`);
41
49
  }
42
50
  return resolved;
43
51
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mcpConfig.js","sourceRoot":"","sources":["../../../src/infrastructure/agent/mcpConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,OAAO,MAAM,cAAc,CAAA;AAkBlC,MAAM,UAAU,cAAc,CAAC,SAAoB;IACjD,MAAM,OAAO,GAAmC,EAAE,CAAA;IAClD,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAoB,EAAE,SAAiB;IAC9E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,SAAS,CAAC,EAAE,OAAO,CAAC,CAAA;IACrE,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5E,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,MAAuB;IACtC,sEAAsE;IACtE,yEAAyE;IACzE,yEAAyE;IACzE,sDAAsD;IACtD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAA+B;IACrD,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;YACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,4BAA4B,OAAO,cAAc,CAAC,CAAA;YACvF,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"mcpConfig.js","sourceRoot":"","sources":["../../../src/infrastructure/agent/mcpConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { z } from 'zod';
2
+ declare const Invite: z.ZodObject<{
3
+ email: z.ZodEffects<z.ZodString, string, string>;
4
+ invitedAt: z.ZodString;
5
+ /**
6
+ * Initial server role to apply when the invite is redeemed. Defaults
7
+ * to `user` so an admin who invites someone is making a deliberate
8
+ * choice when they pick `admin`.
9
+ */
10
+ serverRole: z.ZodDefault<z.ZodEnum<["admin", "user"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ email: string;
13
+ serverRole: "user" | "admin";
14
+ invitedAt: string;
15
+ }, {
16
+ email: string;
17
+ invitedAt: string;
18
+ serverRole?: "user" | "admin" | undefined;
19
+ }>;
20
+ export type Invite = z.infer<typeof Invite>;
21
+ export interface AccessDecision {
22
+ readonly allow: boolean;
23
+ /**
24
+ * Human-readable reason. Surfaced to the user when access is denied
25
+ * so they can self-diagnose ("not in allowlist", "no invite found").
26
+ * Suppressed when `allow=true`.
27
+ */
28
+ readonly reason?: string;
29
+ /**
30
+ * For allowed access, whether this user's email matched an invite.
31
+ * When true, the caller redeems the invite via `consumeInvite` after
32
+ * creating the user record.
33
+ */
34
+ readonly viaInvite?: Invite;
35
+ }
36
+ export interface AccessPolicyConfig {
37
+ /** Comma-separated list of allowed email domains (e.g. "kdanmobile.com,example.com"). */
38
+ readonly allowedDomains?: readonly string[];
39
+ /** Comma-separated allowlist of specific emails (per-user, not domain-based). */
40
+ readonly allowedEmails?: readonly string[];
41
+ /** Comma-separated list of admin email addresses. Matched users get serverRole='admin'. */
42
+ readonly adminEmails?: readonly string[];
43
+ }
44
+ /**
45
+ * Gate 1: decides whether a Google account is allowed to log in to this
46
+ * Braid server. Composed of two layers:
47
+ *
48
+ * 1. **Static allowlist**: `BRAID_ALLOWED_DOMAINS` / `BRAID_ALLOWED_EMAILS`
49
+ * env vars. Domain matches (`@kdanmobile.com`) auto-pass, email
50
+ * matches (`alice@example.com`) auto-pass. Free to leave both
51
+ * unset on a public instance; combined with an empty invite list
52
+ * this rejects everyone (fail closed).
53
+ *
54
+ * 2. **Invite list**: `${BRAID_HOME}/access.json` maintained by admin
55
+ * via `/admin/invites` (Phase B/C admin UI). One invite per email;
56
+ * consumed on first successful login.
57
+ *
58
+ * The policy is open for either path: domain pass OR invite present.
59
+ * That matches the "hybrid" Gate 1 the design picked.
60
+ */
61
+ export declare class AccessPolicy {
62
+ private readonly invitesPath;
63
+ private readonly allowedDomains;
64
+ private readonly allowedEmails;
65
+ private readonly adminEmails;
66
+ constructor(invitesPath: string, config?: AccessPolicyConfig);
67
+ /**
68
+ * Evaluate against the current allowlist + invite file. Reads the
69
+ * invite file every call: invite mgmt is low-frequency and a stale
70
+ * cache would create a frustrating race (admin invites Bob, Bob
71
+ * logs in, server still says "no").
72
+ */
73
+ decide(email: string): Promise<AccessDecision>;
74
+ /**
75
+ * Whether the email should be marked `serverRole='admin'` on the
76
+ * resulting user record. Independent of `decide`: invites carry
77
+ * their own role override, and an admin email might also be the
78
+ * allowlist path with no invite.
79
+ */
80
+ isAdmin(email: string): boolean;
81
+ listInvites(): Promise<Invite[]>;
82
+ addInvite(input: {
83
+ email: string;
84
+ serverRole?: 'admin' | 'user';
85
+ }): Promise<Invite>;
86
+ removeInvite(email: string): Promise<void>;
87
+ /**
88
+ * Consume an invite once the user record exists: remove from invites,
89
+ * add to approvedEmails so the user can sign in again without the
90
+ * admin re-inviting them. Idempotent.
91
+ */
92
+ consumeInvite(email: string): Promise<void>;
93
+ /**
94
+ * Add an email to the persistent allowlist directly (without going
95
+ * through the invite step). Used by the bootstrap migration that
96
+ * back-fills approvedEmails for users who registered before this
97
+ * field existed.
98
+ */
99
+ approveEmail(email: string): Promise<void>;
100
+ /**
101
+ * Drop an email from the persistent allowlist. Called when an admin
102
+ * deletes a user so the underlying email can't sneak back in without
103
+ * a fresh invite. Idempotent.
104
+ */
105
+ revokeApproval(email: string): Promise<void>;
106
+ listApprovedEmails(): Promise<string[]>;
107
+ private readInvites;
108
+ private readContent;
109
+ private writeContent;
110
+ }
111
+ export {};
112
+ //# sourceMappingURL=AccessPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessPolicy.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/auth/AccessPolicy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,QAAA,MAAM,MAAM;;;IAGV;;;;OAIG;;;;;;;;;;EAEH,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAA;AAgB3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAG9B,WAAW,EAAE,MAAM,EACpC,MAAM,GAAE,kBAAuB;IAOjC;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBpD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIzB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhC,SAAS,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAenF,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD;;;;OAIG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAI/B,WAAW;YAIX,WAAW;YAeX,YAAY;CAI3B"}
@@ -0,0 +1,184 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { ValidationError } from '@braidhq/core';
4
+ import { z } from 'zod';
5
+ const Invite = z.object({
6
+ email: z.string().email().transform(s => s.toLowerCase()),
7
+ invitedAt: z.string().datetime({ offset: true }),
8
+ /**
9
+ * Initial server role to apply when the invite is redeemed. Defaults
10
+ * to `user` so an admin who invites someone is making a deliberate
11
+ * choice when they pick `admin`.
12
+ */
13
+ serverRole: z.enum(['admin', 'user']).default('user'),
14
+ });
15
+ const Content = z.object({
16
+ invites: z.array(Invite).default([]),
17
+ /**
18
+ * Emails that have already redeemed an invite (or been approved
19
+ * directly) and are persistently allowed to sign in. Without this,
20
+ * an invite would be a one-shot ticket: after the first login the
21
+ * invite is gone and the user gets locked out on the second login.
22
+ * Treat this as the "dynamic allowlist" that grows as invites get
23
+ * consumed; revoking a user removes their entry here.
24
+ */
25
+ approvedEmails: z.array(z.string().email().transform(s => s.toLowerCase())).default([]),
26
+ });
27
+ /**
28
+ * Gate 1: decides whether a Google account is allowed to log in to this
29
+ * Braid server. Composed of two layers:
30
+ *
31
+ * 1. **Static allowlist**: `BRAID_ALLOWED_DOMAINS` / `BRAID_ALLOWED_EMAILS`
32
+ * env vars. Domain matches (`@kdanmobile.com`) auto-pass, email
33
+ * matches (`alice@example.com`) auto-pass. Free to leave both
34
+ * unset on a public instance; combined with an empty invite list
35
+ * this rejects everyone (fail closed).
36
+ *
37
+ * 2. **Invite list**: `${BRAID_HOME}/access.json` maintained by admin
38
+ * via `/admin/invites` (Phase B/C admin UI). One invite per email;
39
+ * consumed on first successful login.
40
+ *
41
+ * The policy is open for either path: domain pass OR invite present.
42
+ * That matches the "hybrid" Gate 1 the design picked.
43
+ */
44
+ export class AccessPolicy {
45
+ invitesPath;
46
+ allowedDomains;
47
+ allowedEmails;
48
+ adminEmails;
49
+ constructor(invitesPath, config = {}) {
50
+ this.invitesPath = invitesPath;
51
+ this.allowedDomains = new Set((config.allowedDomains ?? []).map(s => s.toLowerCase()));
52
+ this.allowedEmails = new Set((config.allowedEmails ?? []).map(s => s.toLowerCase()));
53
+ this.adminEmails = new Set((config.adminEmails ?? []).map(s => s.toLowerCase()));
54
+ }
55
+ /**
56
+ * Evaluate against the current allowlist + invite file. Reads the
57
+ * invite file every call: invite mgmt is low-frequency and a stale
58
+ * cache would create a frustrating race (admin invites Bob, Bob
59
+ * logs in, server still says "no").
60
+ */
61
+ async decide(email) {
62
+ const lower = email.toLowerCase();
63
+ if (this.allowedEmails.has(lower))
64
+ return { allow: true };
65
+ const domain = lower.split('@')[1] ?? '';
66
+ if (domain && this.allowedDomains.has(domain))
67
+ return { allow: true };
68
+ const content = await this.readContent();
69
+ // Approved (post-redemption) allowlist persists across logins.
70
+ if (content.approvedEmails.includes(lower))
71
+ return { allow: true };
72
+ const invite = content.invites.find(i => i.email === lower);
73
+ if (invite)
74
+ return { allow: true, viaInvite: invite };
75
+ return {
76
+ allow: false,
77
+ reason: 'This Google account is not authorized to sign in. Ask an admin to invite you.',
78
+ };
79
+ }
80
+ /**
81
+ * Whether the email should be marked `serverRole='admin'` on the
82
+ * resulting user record. Independent of `decide`: invites carry
83
+ * their own role override, and an admin email might also be the
84
+ * allowlist path with no invite.
85
+ */
86
+ isAdmin(email) {
87
+ return this.adminEmails.has(email.toLowerCase());
88
+ }
89
+ async listInvites() {
90
+ return this.readInvites();
91
+ }
92
+ async addInvite(input) {
93
+ const lower = input.email.toLowerCase();
94
+ const content = await this.readContent();
95
+ if (content.invites.some(i => i.email === lower))
96
+ throw new ValidationError(`Invite for "${lower}" already exists`);
97
+ const invite = {
98
+ email: lower,
99
+ invitedAt: new Date().toISOString(),
100
+ serverRole: input.serverRole ?? 'user',
101
+ };
102
+ content.invites.push(invite);
103
+ await this.writeContent(content);
104
+ return invite;
105
+ }
106
+ async removeInvite(email) {
107
+ const lower = email.toLowerCase();
108
+ const content = await this.readContent();
109
+ const filtered = content.invites.filter(i => i.email !== lower);
110
+ if (filtered.length === content.invites.length)
111
+ return;
112
+ await this.writeContent({ ...content, invites: filtered });
113
+ }
114
+ /**
115
+ * Consume an invite once the user record exists: remove from invites,
116
+ * add to approvedEmails so the user can sign in again without the
117
+ * admin re-inviting them. Idempotent.
118
+ */
119
+ async consumeInvite(email) {
120
+ const lower = email.toLowerCase();
121
+ const content = await this.readContent();
122
+ const invites = content.invites.filter(i => i.email !== lower);
123
+ const approvedEmails = content.approvedEmails.includes(lower)
124
+ ? content.approvedEmails
125
+ : [...content.approvedEmails, lower];
126
+ if (invites.length === content.invites.length && approvedEmails === content.approvedEmails)
127
+ return;
128
+ await this.writeContent({ invites, approvedEmails });
129
+ }
130
+ /**
131
+ * Add an email to the persistent allowlist directly (without going
132
+ * through the invite step). Used by the bootstrap migration that
133
+ * back-fills approvedEmails for users who registered before this
134
+ * field existed.
135
+ */
136
+ async approveEmail(email) {
137
+ const lower = email.toLowerCase();
138
+ const content = await this.readContent();
139
+ if (content.approvedEmails.includes(lower))
140
+ return;
141
+ await this.writeContent({
142
+ ...content,
143
+ approvedEmails: [...content.approvedEmails, lower],
144
+ });
145
+ }
146
+ /**
147
+ * Drop an email from the persistent allowlist. Called when an admin
148
+ * deletes a user so the underlying email can't sneak back in without
149
+ * a fresh invite. Idempotent.
150
+ */
151
+ async revokeApproval(email) {
152
+ const lower = email.toLowerCase();
153
+ const content = await this.readContent();
154
+ const filtered = content.approvedEmails.filter(e => e !== lower);
155
+ if (filtered.length === content.approvedEmails.length)
156
+ return;
157
+ await this.writeContent({ ...content, approvedEmails: filtered });
158
+ }
159
+ async listApprovedEmails() {
160
+ return (await this.readContent()).approvedEmails;
161
+ }
162
+ async readInvites() {
163
+ return (await this.readContent()).invites;
164
+ }
165
+ async readContent() {
166
+ try {
167
+ const raw = await readFile(this.invitesPath, 'utf-8');
168
+ const parsed = Content.safeParse(JSON.parse(raw));
169
+ if (!parsed.success)
170
+ throw new ValidationError(`Invalid access file at "${this.invitesPath}": ${parsed.error.message}`);
171
+ return parsed.data;
172
+ }
173
+ catch (error) {
174
+ if (error.code === 'ENOENT')
175
+ return { invites: [], approvedEmails: [] };
176
+ throw error;
177
+ }
178
+ }
179
+ async writeContent(content) {
180
+ await mkdir(dirname(this.invitesPath), { recursive: true });
181
+ await writeFile(this.invitesPath, `${JSON.stringify(content, null, 2)}\n`, 'utf-8');
182
+ }
183
+ }
184
+ //# sourceMappingURL=AccessPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessPolicy.js","sourceRoot":"","sources":["../../../src/infrastructure/auth/AccessPolicy.ts"],"names":[],"mappings":"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"}