@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.
- package/README.md +136 -0
- package/dist/app.d.ts +19 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +121 -3
- package/dist/app.js.map +1 -1
- package/dist/composeFs.d.ts +41 -6
- package/dist/composeFs.d.ts.map +1 -1
- package/dist/composeFs.js +234 -52
- package/dist/composeFs.js.map +1 -1
- package/dist/composition.d.ts +86 -2
- package/dist/composition.d.ts.map +1 -1
- package/dist/composition.js +71 -1
- package/dist/composition.js.map +1 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts +21 -0
- package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts.map +1 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.js +35 -3
- package/dist/infrastructure/agent/SubprocessSkillRunner.js.map +1 -1
- package/dist/infrastructure/agent/mcpConfig.d.ts +25 -5
- package/dist/infrastructure/agent/mcpConfig.d.ts.map +1 -1
- package/dist/infrastructure/agent/mcpConfig.js +22 -14
- package/dist/infrastructure/agent/mcpConfig.js.map +1 -1
- package/dist/infrastructure/auth/AccessPolicy.d.ts +112 -0
- package/dist/infrastructure/auth/AccessPolicy.d.ts.map +1 -0
- package/dist/infrastructure/auth/AccessPolicy.js +184 -0
- package/dist/infrastructure/auth/AccessPolicy.js.map +1 -0
- package/dist/infrastructure/auth/SessionStore.d.ts +40 -0
- package/dist/infrastructure/auth/SessionStore.d.ts.map +1 -0
- package/dist/infrastructure/auth/SessionStore.js +107 -0
- package/dist/infrastructure/auth/SessionStore.js.map +1 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.d.ts +16 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.d.ts.map +1 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.js +20 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.js.map +1 -0
- package/dist/infrastructure/env.d.ts +11 -0
- package/dist/infrastructure/env.d.ts.map +1 -0
- package/dist/infrastructure/env.js +20 -0
- package/dist/infrastructure/env.js.map +1 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts +300 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.js +42 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.js.map +1 -0
- package/dist/infrastructure/fs/FsClarifyTicketRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js +7 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsGraphSerializer.d.ts +629 -0
- package/dist/infrastructure/fs/FsGraphSerializer.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsGraphSerializer.js +60 -0
- package/dist/infrastructure/fs/FsGraphSerializer.js.map +1 -0
- package/dist/infrastructure/fs/FsProposalRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsProposalRepository.js +8 -0
- package/dist/infrastructure/fs/FsProposalRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsRunRepository.d.ts +4 -1
- package/dist/infrastructure/fs/FsRunRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsRunRepository.js +75 -3
- package/dist/infrastructure/fs/FsRunRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsSkillRegistry.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsSkillRegistry.js +15 -3
- package/dist/infrastructure/fs/FsSkillRegistry.js.map +1 -1
- package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts +19 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.js +58 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.js.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts +30 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.js +87 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.js.map +1 -0
- package/dist/infrastructure/fs/FsWorkspaceRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsWorkspaceRepository.js +12 -3
- package/dist/infrastructure/fs/FsWorkspaceRepository.js.map +1 -1
- package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts +15 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.js +46 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.js.map +1 -0
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts +26 -2
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts.map +1 -1
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js +109 -5
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js.map +1 -1
- package/dist/infrastructure/fs/intentScan.d.ts +9 -0
- package/dist/infrastructure/fs/intentScan.d.ts.map +1 -0
- package/dist/infrastructure/fs/intentScan.js +135 -0
- package/dist/infrastructure/fs/intentScan.js.map +1 -0
- package/dist/infrastructure/fs/paths.d.ts +14 -0
- package/dist/infrastructure/fs/paths.d.ts.map +1 -1
- package/dist/infrastructure/fs/paths.js +43 -0
- package/dist/infrastructure/fs/paths.js.map +1 -1
- package/dist/infrastructure/fs/productManifestWriter.d.ts +1 -1
- package/dist/infrastructure/fs/productManifestWriter.d.ts.map +1 -1
- package/dist/infrastructure/fs/productManifestWriter.js +1 -3
- package/dist/infrastructure/fs/productManifestWriter.js.map +1 -1
- package/dist/infrastructure/git/GitWorkspaceHistory.d.ts +18 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.d.ts.map +1 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.js +303 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.js.map +1 -0
- package/dist/infrastructure/git/commitMessage.d.ts +4 -0
- package/dist/infrastructure/git/commitMessage.d.ts.map +1 -0
- package/dist/infrastructure/git/commitMessage.js +71 -0
- package/dist/infrastructure/git/commitMessage.js.map +1 -0
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts +48 -1
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts.map +1 -1
- package/dist/infrastructure/oauth/GoogleOAuth.js +68 -0
- package/dist/infrastructure/oauth/GoogleOAuth.js.map +1 -1
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts +14 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts.map +1 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js +21 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts +23 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.js +91 -0
- package/dist/infrastructure/users/UserRegistryFile.js.map +1 -0
- package/dist/infrastructure/users/ensureLocalUser.d.ts +15 -0
- package/dist/infrastructure/users/ensureLocalUser.d.ts.map +1 -0
- package/dist/infrastructure/users/ensureLocalUser.js +38 -0
- package/dist/infrastructure/users/ensureLocalUser.js.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts +9 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js +22 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js.map +1 -0
- package/dist/middleware/auth.d.ts +29 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +81 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.js +1 -1
- package/dist/middleware/cors.js.map +1 -1
- package/dist/middleware/requireAdmin.d.ts +10 -0
- package/dist/middleware/requireAdmin.d.ts.map +1 -0
- package/dist/middleware/requireAdmin.js +24 -0
- package/dist/middleware/requireAdmin.js.map +1 -0
- package/dist/middleware/userId.d.ts +16 -0
- package/dist/middleware/userId.d.ts.map +1 -0
- package/dist/middleware/userId.js +27 -0
- package/dist/middleware/userId.js.map +1 -0
- package/dist/middleware/workspaceAccess.d.ts +47 -0
- package/dist/middleware/workspaceAccess.d.ts.map +1 -0
- package/dist/middleware/workspaceAccess.js +86 -0
- package/dist/middleware/workspaceAccess.js.map +1 -0
- package/dist/policy/Capability.d.ts +12 -0
- package/dist/policy/Capability.d.ts.map +1 -0
- package/dist/policy/Capability.js +31 -0
- package/dist/policy/Capability.js.map +1 -0
- package/dist/policy/CapabilityCheck.d.ts +14 -0
- package/dist/policy/CapabilityCheck.d.ts.map +1 -0
- package/dist/policy/CapabilityCheck.js +2 -0
- package/dist/policy/CapabilityCheck.js.map +1 -0
- package/dist/policy/PermissionRegistry.d.ts +23 -0
- package/dist/policy/PermissionRegistry.d.ts.map +1 -0
- package/dist/policy/PermissionRegistry.js +27 -0
- package/dist/policy/PermissionRegistry.js.map +1 -0
- package/dist/policy/ViewerContext.d.ts +27 -0
- package/dist/policy/ViewerContext.d.ts.map +1 -0
- package/dist/policy/ViewerContext.js +2 -0
- package/dist/policy/ViewerContext.js.map +1 -0
- package/dist/policy/checks.d.ts +15 -0
- package/dist/policy/checks.d.ts.map +1 -0
- package/dist/policy/checks.js +52 -0
- package/dist/policy/checks.js.map +1 -0
- package/dist/policy/defaultRegistry.d.ts +10 -0
- package/dist/policy/defaultRegistry.d.ts.map +1 -0
- package/dist/policy/defaultRegistry.js +16 -0
- package/dist/policy/defaultRegistry.js.map +1 -0
- package/dist/policy/index.d.ts +8 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/resolveViewer.d.ts +16 -0
- package/dist/policy/resolveViewer.d.ts.map +1 -0
- package/dist/policy/resolveViewer.js +37 -0
- package/dist/policy/resolveViewer.js.map +1 -0
- package/dist/routes/_shared.d.ts +198 -0
- package/dist/routes/_shared.d.ts.map +1 -0
- package/dist/routes/_shared.js +29 -0
- package/dist/routes/_shared.js.map +1 -0
- package/dist/routes/admin.d.ts +13 -0
- package/dist/routes/admin.d.ts.map +1 -0
- package/dist/routes/admin.js +227 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/auth.d.ts +33 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +170 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/batch.d.ts +7 -0
- package/dist/routes/batch.d.ts.map +1 -0
- package/dist/routes/batch.js +47 -0
- package/dist/routes/batch.js.map +1 -0
- package/dist/routes/clarify.d.ts +4 -3
- package/dist/routes/clarify.d.ts.map +1 -1
- package/dist/routes/clarify.js +247 -57
- package/dist/routes/clarify.js.map +1 -1
- package/dist/routes/decisions.d.ts +2 -2
- package/dist/routes/decisions.d.ts.map +1 -1
- package/dist/routes/decisions.js +50 -12
- package/dist/routes/decisions.js.map +1 -1
- package/dist/routes/edges.d.ts +2 -2
- package/dist/routes/edges.d.ts.map +1 -1
- package/dist/routes/edges.js +35 -13
- package/dist/routes/edges.js.map +1 -1
- package/dist/routes/health.d.ts +2 -2
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +21 -3
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/history.d.ts +7 -0
- package/dist/routes/history.d.ts.map +1 -0
- package/dist/routes/history.js +88 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/model.d.ts +2 -2
- package/dist/routes/model.d.ts.map +1 -1
- package/dist/routes/model.js +20 -4
- package/dist/routes/model.js.map +1 -1
- package/dist/routes/nodes.d.ts +2 -2
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +75 -19
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/ontology.d.ts +2 -2
- package/dist/routes/ontology.d.ts.map +1 -1
- package/dist/routes/ontology.js +22 -5
- package/dist/routes/ontology.js.map +1 -1
- package/dist/routes/proposals.d.ts +4 -3
- package/dist/routes/proposals.d.ts.map +1 -1
- package/dist/routes/proposals.js +170 -41
- package/dist/routes/proposals.js.map +1 -1
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +52 -1
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/skillInputOptions.d.ts +10 -0
- package/dist/routes/skillInputOptions.d.ts.map +1 -0
- package/dist/routes/skillInputOptions.js +161 -0
- package/dist/routes/skillInputOptions.js.map +1 -0
- package/dist/routes/skills.d.ts +2 -2
- package/dist/routes/skills.d.ts.map +1 -1
- package/dist/routes/skills.js +89 -19
- package/dist/routes/skills.js.map +1 -1
- package/dist/routes/sourceLoaders.d.ts +7 -0
- package/dist/routes/sourceLoaders.d.ts.map +1 -0
- package/dist/routes/sourceLoaders.js +29 -0
- package/dist/routes/sourceLoaders.js.map +1 -0
- package/dist/routes/sourceUnitStates.d.ts +7 -0
- package/dist/routes/sourceUnitStates.d.ts.map +1 -0
- package/dist/routes/sourceUnitStates.js +45 -0
- package/dist/routes/sourceUnitStates.js.map +1 -0
- package/dist/routes/users.d.ts +9 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +127 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/routes/workspaceMembers.d.ts +11 -0
- package/dist/routes/workspaceMembers.d.ts.map +1 -0
- package/dist/routes/workspaceMembers.js +81 -0
- package/dist/routes/workspaceMembers.js.map +1 -0
- package/dist/routes/workspaces.d.ts +19 -1
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/routes/workspaces.js +161 -45
- package/dist/routes/workspaces.js.map +1 -1
- package/dist/server.js +69 -25
- package/dist/server.js.map +1 -1
- package/package.json +48 -31
- package/LICENSE +0 -21
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts +0 -8
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts.map +0 -1
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js +0 -62
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|