@superglue/cli 1.1.26 → 1.1.27
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/.claude-plugin/plugin.json +1 -1
- package/README.md +12 -0
- package/dist/cli.js +214 -174
- package/dist/skills/superglue/SKILL.md +63 -23
- package/dist/skills/superglue/references/access-rules.md +35 -105
- package/dist/skills/superglue/references/superglue-info.md +1 -2
- package/package.json +1 -1
- package/skills/superglue/SKILL.md +63 -23
- package/skills/superglue/references/access-rules.md +35 -105
- package/skills/superglue/references/superglue-info.md +1 -2
|
@@ -1,147 +1,77 @@
|
|
|
1
1
|
# Access Rules (RBAC)
|
|
2
2
|
|
|
3
|
-
On superglue, roles define tool-level and system-level allowlists. Users can have multiple roles. Roles and access rules are only available on enterprise organizations.
|
|
3
|
+
On superglue, roles define binary tool-level and system-level allowlists. Users can have multiple roles. Roles and access rules are only available on enterprise organizations.
|
|
4
4
|
|
|
5
5
|
## Data Model
|
|
6
6
|
|
|
7
|
-
### Role
|
|
8
|
-
|
|
9
7
|
```typescript
|
|
10
8
|
interface Role {
|
|
11
9
|
id: string;
|
|
12
10
|
name: string;
|
|
13
11
|
description?: string;
|
|
14
|
-
tools: "ALL" | string[];
|
|
15
|
-
systems: "ALL" |
|
|
16
|
-
isBaseRole?: boolean;
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### SystemPermission
|
|
21
|
-
|
|
22
|
-
Each system entry is either a predefined access level or a custom rule:
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
type SystemPermission = SystemAccessLevel | { rules: CustomRule[] };
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
| Type | Meaning |
|
|
29
|
-
| ------------------ | ------------------------------------------------ |
|
|
30
|
-
| `"read-write"` | All HTTP methods allowed |
|
|
31
|
-
| `"read-only"` | Only GET and HEAD; POST/PUT/PATCH/DELETE blocked |
|
|
32
|
-
| `{ rules: [...] }` | Custom JS expressions that gate access |
|
|
33
|
-
|
|
34
|
-
Systems not listed in the role's `systems` map are DENIED, unless the system access is set to `"ALL"`.
|
|
35
|
-
|
|
36
|
-
### CustomRule
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
interface CustomRule {
|
|
40
|
-
id: string;
|
|
41
|
-
name: string;
|
|
42
|
-
expression?: string; // JS expression, receives stepConfig
|
|
43
|
-
isActive: boolean;
|
|
12
|
+
tools: "ALL" | string[];
|
|
13
|
+
systems: "ALL" | string[];
|
|
14
|
+
isBaseRole?: boolean;
|
|
44
15
|
}
|
|
45
16
|
```
|
|
46
17
|
|
|
47
|
-
|
|
18
|
+
Only `"ALL"` means open access. Empty arrays, missing fields, or `null` mean no direct access from that role.
|
|
48
19
|
|
|
49
20
|
## Tool Permissions
|
|
50
21
|
|
|
51
22
|
- `tools: "ALL"` — every tool is allowed, including tools created in the future
|
|
52
|
-
- `tools: ["tool-id-1", "tool-id-2"]` — only these specific tools are allowed
|
|
23
|
+
- `tools: ["tool-id-1", "tool-id-2"]` — only these specific tools are allowed
|
|
24
|
+
- Effective tool visibility also requires access to every system referenced by that tool's request steps
|
|
53
25
|
|
|
54
26
|
## System Permissions
|
|
55
27
|
|
|
56
|
-
- `systems: "ALL"` — every
|
|
57
|
-
- `systems:
|
|
58
|
-
-
|
|
28
|
+
- `systems: "ALL"` — every current and future system is allowed
|
|
29
|
+
- `systems: ["gmail", "stripe"]` — only these specific systems are allowed
|
|
30
|
+
- System access is binary by system ID: listed means allowed, omitted means denied.
|
|
59
31
|
|
|
60
|
-
##
|
|
32
|
+
## Tool/System Entanglement
|
|
61
33
|
|
|
62
|
-
|
|
34
|
+
A saved tool is effectively visible and runnable only when both are true:
|
|
63
35
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **FTP / SMB** — operations other than `list`, `get`, `exists`, `stat` are mutating
|
|
67
|
-
- **Redis** — commands not in the read-only set (GET, MGET, EXISTS, KEYS, SCAN, TTL, TYPE, HGET, HGETALL, LRANGE, SMEMBERS, SCARD, etc.) are mutating
|
|
68
|
-
- **Transform** — never mutating (pure data transformation, no external system)
|
|
36
|
+
1. The user has tool access through at least one role.
|
|
37
|
+
2. The user has access to every `systemId` referenced by the tool's request steps.
|
|
69
38
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
## Custom Rule Expressions
|
|
73
|
-
|
|
74
|
-
Custom rules only apply in SPECIFIC mode. If systems is `"ALL"`, no custom rules exist.
|
|
75
|
-
|
|
76
|
-
Expressions receive a **resolved** `stepConfig` object — all template variables (`<<variable>>` and `<<(sourceData) => ...>>` expressions) are substituted with their actual runtime values before the rule evaluates. This means rules see the real URL, headers, body, and query params, not raw templates.
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
interface StepConfig {
|
|
80
|
-
url: string;
|
|
81
|
-
method: string;
|
|
82
|
-
headers: Record<string, string>;
|
|
83
|
-
queryParams: Record<string, string>;
|
|
84
|
-
body: unknown;
|
|
85
|
-
systemId: string;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Example expressions:
|
|
90
|
-
|
|
91
|
-
```javascript
|
|
92
|
-
// Block all POST requests to a specific endpoint
|
|
93
|
-
stepConfig.method !== "POST" || !stepConfig.url.includes("/admin");
|
|
94
|
-
|
|
95
|
-
// Only allow GET requests to /api/v1/read endpoints
|
|
96
|
-
stepConfig.method === "GET" && stepConfig.url.includes("/api/v1/read");
|
|
97
|
-
|
|
98
|
-
// Block requests with certain headers
|
|
99
|
-
!stepConfig.headers["x-dangerous-header"];
|
|
100
|
-
|
|
101
|
-
// Block a specific datasource ID in the resolved body
|
|
102
|
-
!(typeof stepConfig.body === "object" && stepConfig.body?.datasource?.id === "blocked-id");
|
|
103
|
-
```
|
|
39
|
+
When granting a tool, inspect the tool's request-step `systemId` values and grant required systems when the user should be able to see or run the tool.
|
|
104
40
|
|
|
105
41
|
## Multi-Role Semantics
|
|
106
42
|
|
|
107
|
-
Users can have multiple roles. Resolution is
|
|
108
|
-
|
|
109
|
-
| Layer | Semantics | Example |
|
|
110
|
-
| ------------ | ------------------------------ | --------------------------------------------------------------------------- |
|
|
111
|
-
| Tools | Union (most permissive wins) | If role A allows tool X and role B doesn't, tool X is allowed |
|
|
112
|
-
| Systems | Union (most permissive wins) | If role A gives READ_ONLY and role B gives READ_WRITE, result is READ_WRITE |
|
|
113
|
-
| Custom rules | Per-role union (any role wins) | If any role's complete rule set allows the request, it goes through |
|
|
43
|
+
Users can have multiple roles. Resolution is union:
|
|
114
44
|
|
|
115
|
-
|
|
45
|
+
| Layer | Semantics |
|
|
46
|
+
| ------- | ----------------------------------------------------- |
|
|
47
|
+
| Tools | If any role allows a tool, the tool ID is allowed |
|
|
48
|
+
| Systems | If any role allows a system, the system ID is allowed |
|
|
116
49
|
|
|
117
|
-
|
|
118
|
-
- **Across roles**, evaluation is per-role: if any role fully allows the request (all its rules pass, or it has no custom rule for that system), the request is allowed (OR logic)
|
|
50
|
+
Assigned roles can add access but cannot remove access granted by another role.
|
|
119
51
|
|
|
120
52
|
## Base Roles
|
|
121
53
|
|
|
122
|
-
Every user has exactly
|
|
54
|
+
Every user has exactly one base role:
|
|
123
55
|
|
|
124
|
-
- **`admin`** —
|
|
125
|
-
- **`member`** —
|
|
126
|
-
- **`enduser`** — Default for end users with Credentials-only access. Starts with `tools: []`, `systems: {}` (no access). Tool and system allowlists must be explicitly populated to grant access. Name and description cannot be changed. Cannot be deleted.
|
|
56
|
+
- **`admin`** — full access to everything. The admin role is immutable.
|
|
57
|
+
- **`member`** — default for org team members. Starts with `tools: "ALL"`, `systems: "ALL"`. Tool and system allowlists can be narrowed. Name and description cannot be changed. Cannot be deleted.
|
|
127
58
|
|
|
128
|
-
|
|
59
|
+
Users can also have additional custom roles on top of their base role. Custom roles are fully editable and can be created/deleted.
|
|
129
60
|
|
|
130
61
|
## Personal Roles
|
|
131
62
|
|
|
132
|
-
Admins can create a
|
|
63
|
+
Admins can create a personal role for a specific user. A personal role is a per-user override that grants individual tool and system access independent of shared roles.
|
|
133
64
|
|
|
134
|
-
- Each user can have at most one personal role
|
|
135
|
-
- Personal roles
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
- Managed via the **Personal Roles** tab in Access Rules (web app) or the REST API (`POST /v1/users/:userId/personal-role`)
|
|
65
|
+
- Each user can have at most one personal role.
|
|
66
|
+
- Personal roles use the same `tools` and `systems` allowlist structure.
|
|
67
|
+
- Personal role allowlists are unioned with the user's other roles.
|
|
68
|
+
- Managed via the Personal Roles tab in Access Rules or the REST API (`POST /v1/users/:userId/personal-role`).
|
|
139
69
|
|
|
140
|
-
|
|
70
|
+
## Auto-Append On Resource Creation
|
|
141
71
|
|
|
142
|
-
When a user creates a new tool or system, the backend automatically adds it to the
|
|
72
|
+
When a user creates a new tool or system, the backend automatically adds it to the creator's personal role:
|
|
143
73
|
|
|
144
|
-
- New tool created
|
|
145
|
-
- New system created
|
|
74
|
+
- New tool created -> appended to the creator's personal role `tools` list
|
|
75
|
+
- New system created -> appended to the creator's personal role `systems` list
|
|
146
76
|
|
|
147
|
-
This only affects the creator's personal role, not base roles or additional custom roles.
|
|
77
|
+
This only affects the creator's personal role, not base roles or additional custom roles.
|
|
@@ -54,7 +54,7 @@ The persistent left sidebar contains these top-level items:
|
|
|
54
54
|
- **Landscape** (`/landscape`) — graph overview of tools, systems, and their connections.
|
|
55
55
|
- **Tools** (`/tools`, detail at `/tools/{toolId}`) — saved tools; opens the tool playground for editing, testing, and running.
|
|
56
56
|
- **Systems** (`/systems`, detail at `/systems/{systemId}`) — connected external systems with credentials and documentation.
|
|
57
|
-
- **My Credentials** (`/credentials`) — credential management. The **My Credentials** section is for personal user-owned system credentials; the **superglue API keys** section is for API keys. Admins and members open it inside the normal app shell from the sidebar
|
|
57
|
+
- **My Credentials** (`/credentials`) — credential management. The **My Credentials** section is for personal user-owned system credentials; the **superglue API keys** section is for API keys. Admins and members open it inside the normal app shell from the sidebar.
|
|
58
58
|
- **Runs** (`/runs`, detail at `/runs/{runId}`) — execution history for full, draft, and single-step tool runs. Runs is a top-level sidebar item, not a Control Panel sub-item.
|
|
59
59
|
- **Control Panel** (`/admin`) — expandable group for organization and account administration:
|
|
60
60
|
- **Overview** (`/admin`) — dashboard summary, including failed-run and schedule summaries.
|
|
@@ -81,7 +81,6 @@ Below the navigation, the sidebar shows the organization switcher and Sign Out.
|
|
|
81
81
|
e. Wrap result: `{ currentItem, data, success }`
|
|
82
82
|
f. On failure: abort if `failureBehavior !== "continue"`
|
|
83
83
|
3. **Output transform** (if present): run JS function, validate against outputSchema
|
|
84
|
-
4. **Response filters** (if present): remove/mask/fail on pattern matches
|
|
85
84
|
|
|
86
85
|
### Strategy Routing
|
|
87
86
|
|