@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Capability.d.ts","sourceRoot":"","sources":["../../src/policy/Capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,sKAsBjB,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Closed enumeration of capability identifiers known to the core
3
+ * platform. Plugins can register their own checks under custom string
4
+ * ids; this list is the central catalog so first-party code has a
5
+ * type-safe handle.
6
+ *
7
+ * New capability = add to CAPABILITY_IDS + write a CapabilityCheck
8
+ * class implementing it. Existing checks don't care about new ids.
9
+ */
10
+ export const CAPABILITY_IDS = [
11
+ // Server-scope. No workspace member required; resolveViewer is built
12
+ // with member=undefined so only admins resolve to effectiveRole='owner'.
13
+ 'workspace.create', // scaffold a new workspace or register a path
14
+ // Workspace-scope. Each resource has at most one read and one write
15
+ // capability. "Read" means see, "write" means change anything mutable
16
+ // in that resource. We deliberately don't split write into submit /
17
+ // approve / delete sub-verbs. If you can change anything, you can
18
+ // change everything inside that resource.
19
+ 'workspace.read', // open the workspace, see settings, sources, members, graph, history
20
+ 'workspace.write', // edit PRODUCT.md / sources / plugins / ontology / members / delete
21
+ 'proposal.read', // list and read pending or decided proposals
22
+ 'proposal.write', // submit, apply, reject
23
+ 'clarify.read', // list and read clarify tickets
24
+ 'clarify.write', // answer, skip
25
+ 'history.write', // restore a past commit, manage tags
26
+ // Skill execution carries a per-(member, skill) override matrix on
27
+ // top of role default, so it can't be collapsed into a plain
28
+ // read/write pair. Kept as its own verb for that reason.
29
+ 'skill.run',
30
+ ];
31
+ //# sourceMappingURL=Capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Capability.js","sourceRoot":"","sources":["../../src/policy/Capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,qEAAqE;IACrE,yEAAyE;IACzE,kBAAkB,EAAE,8CAA8C;IAElE,oEAAoE;IACpE,sEAAsE;IACtE,oEAAoE;IACpE,kEAAkE;IAClE,0CAA0C;IAC1C,gBAAgB,EAAE,qEAAqE;IACvF,iBAAiB,EAAE,oEAAoE;IACvF,eAAe,EAAE,6CAA6C;IAC9D,gBAAgB,EAAE,wBAAwB;IAC1C,cAAc,EAAE,gCAAgC;IAChD,eAAe,EAAE,eAAe;IAChC,eAAe,EAAE,qCAAqC;IAEtD,mEAAmE;IACnE,6DAA6D;IAC7D,yDAAyD;IACzD,WAAW;CACH,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { Capability } from './Capability.js';
2
+ import type { ViewerContext } from './ViewerContext.js';
3
+ /**
4
+ * Each capability owns its decision logic in a single class. This is
5
+ * the Strategy interface; concrete checks live under `./checks/`.
6
+ *
7
+ * Implementations MUST be pure (no I/O, no time, no rng) so the same
8
+ * `(viewer)` always produces the same answer.
9
+ */
10
+ export interface CapabilityCheck {
11
+ readonly id: Capability;
12
+ evaluate: (viewer: ViewerContext) => boolean;
13
+ }
14
+ //# sourceMappingURL=CapabilityCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapabilityCheck.d.ts","sourceRoot":"","sources":["../../src/policy/CapabilityCheck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAA;CAC7C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CapabilityCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapabilityCheck.js","sourceRoot":"","sources":["../../src/policy/CapabilityCheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { Capability } from './Capability.js';
2
+ import type { CapabilityCheck } from './CapabilityCheck.js';
3
+ import type { ViewerContext } from './ViewerContext.js';
4
+ /**
5
+ * Open registry of capability strategies. Adding a new capability =
6
+ * `registry.register(new MyCheck())`; existing checks are untouched.
7
+ *
8
+ * Unknown capability ids resolve to `false` (default deny). This makes
9
+ * it safe to typo a capability id; the call denies instead of
10
+ * accidentally allowing.
11
+ */
12
+ export declare class PermissionRegistry {
13
+ private readonly checks;
14
+ register(check: CapabilityCheck): this;
15
+ has(capability: Capability): boolean;
16
+ /**
17
+ * Decide whether a viewer can perform a capability. The viewer
18
+ * already carries its own resource (e.g. skill for skill.run); the
19
+ * caller is responsible for building the right viewer.
20
+ */
21
+ can(capability: Capability, viewer: ViewerContext): boolean;
22
+ }
23
+ //# sourceMappingURL=PermissionRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionRegistry.d.ts","sourceRoot":"","sources":["../../src/policy/PermissionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD;;;;;;;GAOG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAEhE,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAKtC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAIpC;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;CAG5D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Open registry of capability strategies. Adding a new capability =
3
+ * `registry.register(new MyCheck())`; existing checks are untouched.
4
+ *
5
+ * Unknown capability ids resolve to `false` (default deny). This makes
6
+ * it safe to typo a capability id; the call denies instead of
7
+ * accidentally allowing.
8
+ */
9
+ export class PermissionRegistry {
10
+ checks = new Map();
11
+ register(check) {
12
+ this.checks.set(check.id, check);
13
+ return this;
14
+ }
15
+ has(capability) {
16
+ return this.checks.has(capability);
17
+ }
18
+ /**
19
+ * Decide whether a viewer can perform a capability. The viewer
20
+ * already carries its own resource (e.g. skill for skill.run); the
21
+ * caller is responsible for building the right viewer.
22
+ */
23
+ can(capability, viewer) {
24
+ return this.checks.get(capability)?.evaluate(viewer) ?? false;
25
+ }
26
+ }
27
+ //# sourceMappingURL=PermissionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionRegistry.js","sourceRoot":"","sources":["../../src/policy/PermissionRegistry.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IACZ,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAA;IAEhE,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG,CAAC,UAAsB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,UAAsB,EAAE,MAAqB;QAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;IAC/D,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { SkillFrontmatter, User, WorkspaceMember, WorkspaceRole } from '@braidhq/schema';
2
+ /**
3
+ * The single resolved-identity object that every capability check
4
+ * reads. Built once per request by `resolveViewer`; passed unchanged
5
+ * into the registry.
6
+ *
7
+ * `effectiveRole` is what permission gates use: admins always land as
8
+ * `'owner'` here, regardless of whether they have an explicit member
9
+ * row. `member` is the stored row when present (used for display +
10
+ * skillOverrides lookup) and is independent of effectiveRole. Admin
11
+ * who joined as Guest has member.role='guest' but effectiveRole='owner'.
12
+ *
13
+ * `resource` is the per-action context the check needs:
14
+ * - skill.run uses `skill` (manifest) + `skillId`
15
+ * - future checks can extend this without breaking siblings
16
+ */
17
+ export interface ViewerContext {
18
+ readonly user: User;
19
+ readonly member: WorkspaceMember | undefined;
20
+ readonly effectiveRole: WorkspaceRole | null;
21
+ readonly resource?: ViewerResource | undefined;
22
+ }
23
+ export interface ViewerResource {
24
+ readonly skill?: SkillFrontmatter;
25
+ readonly skillId?: string;
26
+ }
27
+ //# sourceMappingURL=ViewerContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewerContext.d.ts","sourceRoot":"","sources":["../../src/policy/ViewerContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE7F;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ViewerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewerContext.js","sourceRoot":"","sources":["../../src/policy/ViewerContext.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { CapabilityCheck } from './CapabilityCheck.js';
2
+ /**
3
+ * First-party capability checks, mirrored byte-equivalent in
4
+ * `packages/studio/src/policy/checks.ts`. The server is the
5
+ * authoritative gate; the client copy lets Studio render Locked-style
6
+ * affordances without hitting a 403.
7
+ *
8
+ * Workspace-scope verbs collapse to `read` + `write` per resource.
9
+ * Workspace.create is server-scope (resolveViewer with no member).
10
+ * Skill.run keeps its own verb because its three-step resolution
11
+ * (owner short-circuit, per-member override, manifest allowedRoles)
12
+ * doesn't fit a read/write pair.
13
+ */
14
+ export declare const checks: readonly CapabilityCheck[];
15
+ //# sourceMappingURL=checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/policy/checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,eAAe,EAsC5C,CAAA"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * First-party capability checks, mirrored byte-equivalent in
3
+ * `packages/studio/src/policy/checks.ts`. The server is the
4
+ * authoritative gate; the client copy lets Studio render Locked-style
5
+ * affordances without hitting a 403.
6
+ *
7
+ * Workspace-scope verbs collapse to `read` + `write` per resource.
8
+ * Workspace.create is server-scope (resolveViewer with no member).
9
+ * Skill.run keeps its own verb because its three-step resolution
10
+ * (owner short-circuit, per-member override, manifest allowedRoles)
11
+ * doesn't fit a read/write pair.
12
+ */
13
+ export const checks = [
14
+ { id: 'workspace.create', evaluate: v => v.effectiveRole === 'owner' },
15
+ { id: 'workspace.read', evaluate: v => v.effectiveRole !== null },
16
+ { id: 'workspace.write', evaluate: v => v.effectiveRole === 'owner' },
17
+ {
18
+ id: 'proposal.read',
19
+ evaluate: v => v.effectiveRole === 'owner' || v.effectiveRole === 'maintainer',
20
+ },
21
+ {
22
+ id: 'proposal.write',
23
+ evaluate: v => v.effectiveRole === 'owner' || v.effectiveRole === 'maintainer',
24
+ },
25
+ {
26
+ id: 'clarify.read',
27
+ evaluate: v => v.effectiveRole === 'owner' || v.effectiveRole === 'maintainer',
28
+ },
29
+ {
30
+ id: 'clarify.write',
31
+ evaluate: v => v.effectiveRole === 'owner' || v.effectiveRole === 'maintainer',
32
+ },
33
+ { id: 'history.write', evaluate: v => v.effectiveRole === 'owner' },
34
+ {
35
+ id: 'skill.run',
36
+ evaluate: (v) => {
37
+ const skill = v.resource?.skill;
38
+ const skillId = v.resource?.skillId;
39
+ if (!skill || !skillId)
40
+ return false;
41
+ if (v.effectiveRole === null)
42
+ return false;
43
+ if (v.effectiveRole === 'owner')
44
+ return true;
45
+ const override = v.member?.skillOverrides?.[skillId];
46
+ if (override)
47
+ return override === 'allow';
48
+ return skill.braid.allowedRoles.includes(v.effectiveRole);
49
+ },
50
+ },
51
+ ];
52
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/policy/checks.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAA+B;IAChD,EAAE,EAAE,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,EAAE;IACtE,EAAE,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,EAAE;IACjE,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,EAAE;IACrE;QACE,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY;KAC/E;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY;KAC/E;IACD;QACE,EAAE,EAAE,cAAc;QAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY;KAC/E;IACD;QACE,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY;KAC/E;IACD,EAAE,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,EAAE;IACnE;QACE,EAAE,EAAE,WAAW;QACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAA;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAA;YACnC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;gBACpB,OAAO,KAAK,CAAA;YACd,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI;gBAC1B,OAAO,KAAK,CAAA;YACd,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO;gBAC7B,OAAO,IAAI,CAAA;YACb,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,OAA+C,CAAC,CAAA;YAC5F,IAAI,QAAQ;gBACV,OAAO,QAAQ,KAAK,OAAO,CAAA;YAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QAC3D,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { PermissionRegistry } from './PermissionRegistry.js';
2
+ /**
3
+ * Default registry preloaded with the platform's first-party
4
+ * capabilities. Plugins that want to register their own checks should
5
+ * call `register()` on this instance; tests can build a fresh registry
6
+ * via `new PermissionRegistry()` to inject mocks.
7
+ */
8
+ export declare function buildDefaultPermissionRegistry(): PermissionRegistry;
9
+ export declare const defaultPermissionRegistry: PermissionRegistry;
10
+ //# sourceMappingURL=defaultRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultRegistry.d.ts","sourceRoot":"","sources":["../../src/policy/defaultRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,kBAAkB,CAKnE;AAED,eAAO,MAAM,yBAAyB,oBAAmC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { checks } from './checks.js';
2
+ import { PermissionRegistry } from './PermissionRegistry.js';
3
+ /**
4
+ * Default registry preloaded with the platform's first-party
5
+ * capabilities. Plugins that want to register their own checks should
6
+ * call `register()` on this instance; tests can build a fresh registry
7
+ * via `new PermissionRegistry()` to inject mocks.
8
+ */
9
+ export function buildDefaultPermissionRegistry() {
10
+ const registry = new PermissionRegistry();
11
+ for (const check of checks)
12
+ registry.register(check);
13
+ return registry;
14
+ }
15
+ export const defaultPermissionRegistry = buildDefaultPermissionRegistry();
16
+ //# sourceMappingURL=defaultRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultRegistry.js","sourceRoot":"","sources":["../../src/policy/defaultRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B;IAC5C,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAA;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM;QACxB,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,8BAA8B,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ export type { Capability } from './Capability.js';
2
+ export { CAPABILITY_IDS } from './Capability.js';
3
+ export type { CapabilityCheck } from './CapabilityCheck.js';
4
+ export { buildDefaultPermissionRegistry, defaultPermissionRegistry } from './defaultRegistry.js';
5
+ export { PermissionRegistry } from './PermissionRegistry.js';
6
+ export { resolveViewer } from './resolveViewer.js';
7
+ export type { ViewerContext, ViewerResource } from './ViewerContext.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { CAPABILITY_IDS } from './Capability.js';
2
+ export { buildDefaultPermissionRegistry, defaultPermissionRegistry } from './defaultRegistry.js';
3
+ export { PermissionRegistry } from './PermissionRegistry.js';
4
+ export { resolveViewer } from './resolveViewer.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { User, WorkspaceMember } from '@braidhq/schema';
2
+ import type { ViewerContext, ViewerResource } from './ViewerContext.js';
3
+ /**
4
+ * The sole place server-admin promotion happens. Every other layer
5
+ * (middleware, capability checks, Studio mirror) consumes the resulting
6
+ * `effectiveRole` and never re-derives it.
7
+ *
8
+ * Resolution:
9
+ * 1. user.serverRole === 'admin' → effectiveRole = 'owner'
10
+ * (the stored member.role, if any, is kept on `member` for
11
+ * display, but ignored by gates)
12
+ * 2. member present → effectiveRole = member.role
13
+ * 3. otherwise → effectiveRole = null (no access)
14
+ */
15
+ export declare function resolveViewer(user: User, member: WorkspaceMember | undefined, resource?: ViewerResource): ViewerContext;
16
+ //# sourceMappingURL=resolveViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveViewer.d.ts","sourceRoot":"","sources":["../../src/policy/resolveViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEvE;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,QAAQ,CAAC,EAAE,cAAc,GACxB,aAAa,CAuBf"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The sole place server-admin promotion happens. Every other layer
3
+ * (middleware, capability checks, Studio mirror) consumes the resulting
4
+ * `effectiveRole` and never re-derives it.
5
+ *
6
+ * Resolution:
7
+ * 1. user.serverRole === 'admin' → effectiveRole = 'owner'
8
+ * (the stored member.role, if any, is kept on `member` for
9
+ * display, but ignored by gates)
10
+ * 2. member present → effectiveRole = member.role
11
+ * 3. otherwise → effectiveRole = null (no access)
12
+ */
13
+ export function resolveViewer(user, member, resource) {
14
+ if (user.serverRole === 'admin') {
15
+ return {
16
+ user,
17
+ member,
18
+ effectiveRole: 'owner',
19
+ ...(resource ? { resource } : {}),
20
+ };
21
+ }
22
+ if (member) {
23
+ return {
24
+ user,
25
+ member,
26
+ effectiveRole: member.role,
27
+ ...(resource ? { resource } : {}),
28
+ };
29
+ }
30
+ return {
31
+ user,
32
+ member: undefined,
33
+ effectiveRole: null,
34
+ ...(resource ? { resource } : {}),
35
+ };
36
+ }
37
+ //# sourceMappingURL=resolveViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveViewer.js","sourceRoot":"","sources":["../../src/policy/resolveViewer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,MAAmC,EACnC,QAAyB;IAEzB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO;YACL,IAAI;YACJ,MAAM;YACN,aAAa,EAAE,OAAO;YACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAA;IACH,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,IAAI;YACJ,MAAM;YACN,aAAa,EAAE,MAAM,CAAC,IAAI;YAC1B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,IAAI;QACnB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAA;AACH,CAAC"}
@@ -0,0 +1,198 @@
1
+ import { z } from '@hono/zod-openapi';
2
+ export declare const WorkspaceIdParam: z.ZodObject<{
3
+ workspaceId: z.ZodBranded<z.ZodString, "WorkspaceId">;
4
+ }, "strip", z.ZodTypeAny, {
5
+ workspaceId: string & z.BRAND<"WorkspaceId">;
6
+ }, {
7
+ workspaceId: string;
8
+ }>;
9
+ export declare const ProblemJsonResponseContent: {
10
+ 'application/problem+json': {
11
+ schema: z.ZodObject<{
12
+ type: z.ZodString;
13
+ title: z.ZodString;
14
+ status: z.ZodNumber;
15
+ code: z.ZodString;
16
+ detail: z.ZodOptional<z.ZodString>;
17
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
18
+ code: z.ZodBranded<z.ZodString, "ValidationCode">;
19
+ severity: z.ZodEnum<["error", "warning", "info"]>;
20
+ message: z.ZodString;
21
+ nodeId: z.ZodOptional<z.ZodBranded<z.ZodString, "NodeId">>;
22
+ edgeId: z.ZodOptional<z.ZodBranded<z.ZodString, "EdgeId">>;
23
+ path: z.ZodOptional<z.ZodString>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ code: string & z.BRAND<"ValidationCode">;
26
+ message: string;
27
+ severity: "error" | "warning" | "info";
28
+ path?: string | undefined;
29
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
30
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
31
+ }, {
32
+ code: string;
33
+ message: string;
34
+ severity: "error" | "warning" | "info";
35
+ path?: string | undefined;
36
+ nodeId?: string | undefined;
37
+ edgeId?: string | undefined;
38
+ }>, "many">>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ code: string;
41
+ type: string;
42
+ title: string;
43
+ status: number;
44
+ issues?: {
45
+ code: string & z.BRAND<"ValidationCode">;
46
+ message: string;
47
+ severity: "error" | "warning" | "info";
48
+ path?: string | undefined;
49
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
50
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
51
+ }[] | undefined;
52
+ detail?: string | undefined;
53
+ }, {
54
+ code: string;
55
+ type: string;
56
+ title: string;
57
+ status: number;
58
+ issues?: {
59
+ code: string;
60
+ message: string;
61
+ severity: "error" | "warning" | "info";
62
+ path?: string | undefined;
63
+ nodeId?: string | undefined;
64
+ edgeId?: string | undefined;
65
+ }[] | undefined;
66
+ detail?: string | undefined;
67
+ }>;
68
+ };
69
+ };
70
+ export declare const NotFoundResponse: {
71
+ readonly description: "The requested entity does not exist.";
72
+ readonly content: {
73
+ 'application/problem+json': {
74
+ schema: z.ZodObject<{
75
+ type: z.ZodString;
76
+ title: z.ZodString;
77
+ status: z.ZodNumber;
78
+ code: z.ZodString;
79
+ detail: z.ZodOptional<z.ZodString>;
80
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
+ code: z.ZodBranded<z.ZodString, "ValidationCode">;
82
+ severity: z.ZodEnum<["error", "warning", "info"]>;
83
+ message: z.ZodString;
84
+ nodeId: z.ZodOptional<z.ZodBranded<z.ZodString, "NodeId">>;
85
+ edgeId: z.ZodOptional<z.ZodBranded<z.ZodString, "EdgeId">>;
86
+ path: z.ZodOptional<z.ZodString>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ code: string & z.BRAND<"ValidationCode">;
89
+ message: string;
90
+ severity: "error" | "warning" | "info";
91
+ path?: string | undefined;
92
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
93
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
94
+ }, {
95
+ code: string;
96
+ message: string;
97
+ severity: "error" | "warning" | "info";
98
+ path?: string | undefined;
99
+ nodeId?: string | undefined;
100
+ edgeId?: string | undefined;
101
+ }>, "many">>;
102
+ }, "strip", z.ZodTypeAny, {
103
+ code: string;
104
+ type: string;
105
+ title: string;
106
+ status: number;
107
+ issues?: {
108
+ code: string & z.BRAND<"ValidationCode">;
109
+ message: string;
110
+ severity: "error" | "warning" | "info";
111
+ path?: string | undefined;
112
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
113
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
114
+ }[] | undefined;
115
+ detail?: string | undefined;
116
+ }, {
117
+ code: string;
118
+ type: string;
119
+ title: string;
120
+ status: number;
121
+ issues?: {
122
+ code: string;
123
+ message: string;
124
+ severity: "error" | "warning" | "info";
125
+ path?: string | undefined;
126
+ nodeId?: string | undefined;
127
+ edgeId?: string | undefined;
128
+ }[] | undefined;
129
+ detail?: string | undefined;
130
+ }>;
131
+ };
132
+ };
133
+ };
134
+ export declare const ValidationFailureResponse: {
135
+ readonly description: "Request body or query failed validation.";
136
+ readonly content: {
137
+ 'application/problem+json': {
138
+ schema: z.ZodObject<{
139
+ type: z.ZodString;
140
+ title: z.ZodString;
141
+ status: z.ZodNumber;
142
+ code: z.ZodString;
143
+ detail: z.ZodOptional<z.ZodString>;
144
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
145
+ code: z.ZodBranded<z.ZodString, "ValidationCode">;
146
+ severity: z.ZodEnum<["error", "warning", "info"]>;
147
+ message: z.ZodString;
148
+ nodeId: z.ZodOptional<z.ZodBranded<z.ZodString, "NodeId">>;
149
+ edgeId: z.ZodOptional<z.ZodBranded<z.ZodString, "EdgeId">>;
150
+ path: z.ZodOptional<z.ZodString>;
151
+ }, "strip", z.ZodTypeAny, {
152
+ code: string & z.BRAND<"ValidationCode">;
153
+ message: string;
154
+ severity: "error" | "warning" | "info";
155
+ path?: string | undefined;
156
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
157
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
158
+ }, {
159
+ code: string;
160
+ message: string;
161
+ severity: "error" | "warning" | "info";
162
+ path?: string | undefined;
163
+ nodeId?: string | undefined;
164
+ edgeId?: string | undefined;
165
+ }>, "many">>;
166
+ }, "strip", z.ZodTypeAny, {
167
+ code: string;
168
+ type: string;
169
+ title: string;
170
+ status: number;
171
+ issues?: {
172
+ code: string & z.BRAND<"ValidationCode">;
173
+ message: string;
174
+ severity: "error" | "warning" | "info";
175
+ path?: string | undefined;
176
+ nodeId?: (string & z.BRAND<"NodeId">) | undefined;
177
+ edgeId?: (string & z.BRAND<"EdgeId">) | undefined;
178
+ }[] | undefined;
179
+ detail?: string | undefined;
180
+ }, {
181
+ code: string;
182
+ type: string;
183
+ title: string;
184
+ status: number;
185
+ issues?: {
186
+ code: string;
187
+ message: string;
188
+ severity: "error" | "warning" | "info";
189
+ path?: string | undefined;
190
+ nodeId?: string | undefined;
191
+ edgeId?: string | undefined;
192
+ }[] | undefined;
193
+ detail?: string | undefined;
194
+ }>;
195
+ };
196
+ };
197
+ };
198
+ //# sourceMappingURL=_shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../src/routes/_shared.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAErC,eAAO,MAAM,gBAAgB;;;;;;EAK3B,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAEtC,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGnB,CAAA;AAEV,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG5B,CAAA"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared OpenAPI building blocks used across workspace-scoped routes.
3
+ *
4
+ * Path parameters declared on parent app.route() mounts are NOT
5
+ * automatically merged into child routes' OpenAPI definitions. Each
6
+ * route under `/workspaces/:workspaceId/*` must therefore re-declare
7
+ * `workspaceId` in its `request.params`. Use `WorkspaceIdParam` to
8
+ * keep the declaration consistent.
9
+ */
10
+ import { BraidProblemJson, WorkspaceId } from '@braidhq/schema';
11
+ import { z } from '@hono/zod-openapi';
12
+ export const WorkspaceIdParam = z.object({
13
+ workspaceId: WorkspaceId.openapi({
14
+ param: { name: 'workspaceId', in: 'path' },
15
+ example: 'my-workspace',
16
+ }),
17
+ });
18
+ export const ProblemJsonResponseContent = {
19
+ 'application/problem+json': { schema: BraidProblemJson },
20
+ };
21
+ export const NotFoundResponse = {
22
+ description: 'The requested entity does not exist.',
23
+ content: ProblemJsonResponseContent,
24
+ };
25
+ export const ValidationFailureResponse = {
26
+ description: 'Request body or query failed validation.',
27
+ content: ProblemJsonResponseContent,
28
+ };
29
+ //# sourceMappingURL=_shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../src/routes/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;QAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE;QAC1C,OAAO,EAAE,cAAc;KACxB,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,0BAA0B,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE;CACzD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW,EAAE,sCAAsC;IACnD,OAAO,EAAE,0BAA0B;CAC3B,CAAA;AAEV,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,WAAW,EAAE,0CAA0C;IACvD,OAAO,EAAE,0BAA0B;CAC3B,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { WorkspaceService } from '@braidhq/core';
2
+ import type { AccessPolicy } from '../infrastructure/auth/AccessPolicy.js';
3
+ import type { WorkspaceRegistryFile } from '../infrastructure/fs/WorkspaceRegistryFile.js';
4
+ import type { UserRegistryFile } from '../infrastructure/users/UserRegistryFile.js';
5
+ import { OpenAPIHono } from '@hono/zod-openapi';
6
+ export interface AdminRouterDeps {
7
+ userRegistry: UserRegistryFile;
8
+ accessPolicy: AccessPolicy;
9
+ workspaceRegistry: WorkspaceRegistryFile;
10
+ workspaceService: WorkspaceService;
11
+ }
12
+ export declare function createAdminRouter(deps: AdminRouterDeps): OpenAPIHono;
13
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAA;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAA;AAGnF,OAAO,EAAe,WAAW,EAAK,MAAM,mBAAmB,CAAA;AA6C/D,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,gBAAgB,CAAA;IAC9B,YAAY,EAAE,YAAY,CAAA;IAC1B,iBAAiB,EAAE,qBAAqB,CAAA;IACxC,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAqHD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CA0FpE"}