@kb-labs/perm-presets 1.0.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 +78 -0
- package/dist/index.d.ts +299 -0
- package/dist/index.js +472 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# @kb-labs/perm-presets
|
|
2
|
+
|
|
3
|
+
> Composable permission presets for KB Labs plugin manifests.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @kb-labs/perm-presets
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use via `@kb-labs/sdk` (already bundled):
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { minimalPreset, combinePermissions } from '@kb-labs/sdk';
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { combine, minimal, llmAccess, gitWorkflow } from '@kb-labs/perm-presets';
|
|
21
|
+
import { defineManifest } from '@kb-labs/sdk';
|
|
22
|
+
|
|
23
|
+
export default defineManifest({
|
|
24
|
+
schema: 'kb.plugin/3',
|
|
25
|
+
id: 'my-plugin',
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
permissions: combine(minimal, llmAccess, gitWorkflow),
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Available Presets
|
|
32
|
+
|
|
33
|
+
| Preset | Description |
|
|
34
|
+
|--------|-------------|
|
|
35
|
+
| `minimal` | Minimal permissions (read-only workspace) |
|
|
36
|
+
| `gitWorkflow` | Git read/write operations |
|
|
37
|
+
| `npmPublish` | npm publish permissions |
|
|
38
|
+
| `fullEnv` | Full environment variable access |
|
|
39
|
+
| `kbPlatform` | KB Labs platform API access |
|
|
40
|
+
| `llmAccess` | LLM API access |
|
|
41
|
+
| `vectorStore` | Vector store access |
|
|
42
|
+
| `ciEnvironment` | CI/CD environment permissions |
|
|
43
|
+
|
|
44
|
+
## API
|
|
45
|
+
|
|
46
|
+
### `combine(...presets)`
|
|
47
|
+
|
|
48
|
+
Merge multiple presets into a single `PermissionSpec`:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { combine, minimal, llmAccess } from '@kb-labs/perm-presets';
|
|
52
|
+
|
|
53
|
+
const permissions = combine(minimal, llmAccess);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### `combinePresets(presets[])`
|
|
57
|
+
|
|
58
|
+
Same as `combine` but accepts an array:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { combinePresets, presets } from '@kb-labs/perm-presets';
|
|
62
|
+
|
|
63
|
+
const permissions = combinePresets([presets.minimal, presets.llmAccess]);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### `presets` namespace
|
|
67
|
+
|
|
68
|
+
All presets accessible as a namespace:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { presets, combine } from '@kb-labs/perm-presets';
|
|
72
|
+
|
|
73
|
+
const permissions = combine(presets.minimal, presets.kbPlatform);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform service permissions
|
|
3
|
+
*/
|
|
4
|
+
interface PlatformPermissions {
|
|
5
|
+
/** LLM access */
|
|
6
|
+
llm?: boolean | {
|
|
7
|
+
models?: string[];
|
|
8
|
+
};
|
|
9
|
+
/** Vector store access */
|
|
10
|
+
vectorStore?: boolean | {
|
|
11
|
+
collections?: string[];
|
|
12
|
+
};
|
|
13
|
+
/** Cache access */
|
|
14
|
+
cache?: boolean | string[];
|
|
15
|
+
/**
|
|
16
|
+
* Storage access (file/blob storage)
|
|
17
|
+
*
|
|
18
|
+
* **Formats:**
|
|
19
|
+
* - `true` - full access (all read/write)
|
|
20
|
+
* - `false` - no access
|
|
21
|
+
* - `string[]` - path prefixes (both read + write)
|
|
22
|
+
* - `{ read?: string[]; write?: string[] }` - granular read/write
|
|
23
|
+
*
|
|
24
|
+
* **Examples:**
|
|
25
|
+
* ```typescript
|
|
26
|
+
* storage: true // Full access
|
|
27
|
+
* storage: ['.kb/artifacts/**'] // Read + write .kb/artifacts
|
|
28
|
+
* storage: { read: ['**'], write: ['.kb/artifacts/**'] } // Read all, write only .kb/artifacts
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
storage?: boolean | string[] | {
|
|
32
|
+
read?: string[];
|
|
33
|
+
write?: string[];
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Database access (SQL, Document, KV, TimeSeries)
|
|
37
|
+
*
|
|
38
|
+
* **Formats:**
|
|
39
|
+
* - `true` - full access to all databases
|
|
40
|
+
* - `false` - no access
|
|
41
|
+
* - Granular per database type:
|
|
42
|
+
* - `sql?: { tables?: string[] }` - SQL table access
|
|
43
|
+
* - `document?: { collections?: string[] }` - Document collection access
|
|
44
|
+
* - `kv?: { prefixes?: string[] }` - KV key prefix access
|
|
45
|
+
* - `timeseries?: { metrics?: string[] }` - TimeSeries metric access
|
|
46
|
+
*
|
|
47
|
+
* **Examples:**
|
|
48
|
+
* ```typescript
|
|
49
|
+
* database: true // Full access to all databases
|
|
50
|
+
* database: {
|
|
51
|
+
* sql: { tables: ['incidents', 'audit_log'] },
|
|
52
|
+
* document: { collections: ['workflows'] }
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
database?: boolean | {
|
|
57
|
+
sql?: boolean | {
|
|
58
|
+
tables?: string[];
|
|
59
|
+
};
|
|
60
|
+
document?: boolean | {
|
|
61
|
+
collections?: string[];
|
|
62
|
+
};
|
|
63
|
+
kv?: boolean | {
|
|
64
|
+
prefixes?: string[];
|
|
65
|
+
};
|
|
66
|
+
timeseries?: boolean | {
|
|
67
|
+
metrics?: string[];
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/** Analytics access */
|
|
71
|
+
analytics?: boolean;
|
|
72
|
+
/** Embeddings access */
|
|
73
|
+
embeddings?: boolean;
|
|
74
|
+
/** Event bus access */
|
|
75
|
+
eventBus?: boolean | {
|
|
76
|
+
publish?: string[];
|
|
77
|
+
subscribe?: string[];
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Permission specification for preset building (declarative format)
|
|
82
|
+
* This is the format used when defining presets and combining them.
|
|
83
|
+
*
|
|
84
|
+
* Design:
|
|
85
|
+
* - Presets declare what plugin WANTS (allow-list only)
|
|
86
|
+
* - No deny - platform enforces hardcoded security patterns
|
|
87
|
+
*/
|
|
88
|
+
interface PermissionSpec {
|
|
89
|
+
/** File system permissions */
|
|
90
|
+
fs?: {
|
|
91
|
+
mode?: 'read' | 'readWrite';
|
|
92
|
+
allow?: string[];
|
|
93
|
+
};
|
|
94
|
+
/** Environment variable permissions */
|
|
95
|
+
env?: {
|
|
96
|
+
read?: string[];
|
|
97
|
+
};
|
|
98
|
+
/** Network permissions */
|
|
99
|
+
network?: {
|
|
100
|
+
fetch?: string[];
|
|
101
|
+
};
|
|
102
|
+
/** Platform service permissions */
|
|
103
|
+
platform?: PlatformPermissions;
|
|
104
|
+
/** Shell execution permissions */
|
|
105
|
+
shell?: {
|
|
106
|
+
allow?: string[];
|
|
107
|
+
};
|
|
108
|
+
/** Resource quotas */
|
|
109
|
+
quotas?: {
|
|
110
|
+
timeoutMs?: number;
|
|
111
|
+
memoryMb?: number;
|
|
112
|
+
cpuMs?: number;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Runtime permission specification (explicit format)
|
|
117
|
+
* This is the format used by plugin-runtime fs-shim.
|
|
118
|
+
* Matches PermissionSpec from @kb-labs/plugin-contracts.
|
|
119
|
+
*/
|
|
120
|
+
interface RuntimePermissionSpec {
|
|
121
|
+
/** File system permissions - explicit read/write lists */
|
|
122
|
+
fs?: {
|
|
123
|
+
read?: string[];
|
|
124
|
+
write?: string[];
|
|
125
|
+
};
|
|
126
|
+
/** Environment variable permissions */
|
|
127
|
+
env?: {
|
|
128
|
+
read?: string[];
|
|
129
|
+
};
|
|
130
|
+
/** Network permissions */
|
|
131
|
+
network?: {
|
|
132
|
+
fetch?: string[];
|
|
133
|
+
};
|
|
134
|
+
/** Platform service permissions */
|
|
135
|
+
platform?: PlatformPermissions;
|
|
136
|
+
/** Shell execution permissions */
|
|
137
|
+
shell?: {
|
|
138
|
+
allow?: string[];
|
|
139
|
+
};
|
|
140
|
+
/** Resource quotas */
|
|
141
|
+
quotas?: {
|
|
142
|
+
timeoutMs?: number;
|
|
143
|
+
memoryMb?: number;
|
|
144
|
+
cpuMs?: number;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* A preset is a named permission configuration
|
|
149
|
+
*/
|
|
150
|
+
interface PermissionPreset {
|
|
151
|
+
/** Unique preset identifier */
|
|
152
|
+
id: string;
|
|
153
|
+
/** Human-readable description */
|
|
154
|
+
description: string;
|
|
155
|
+
/** The permission spec this preset provides */
|
|
156
|
+
permissions: PermissionSpec;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Builder for combining multiple presets
|
|
160
|
+
*/
|
|
161
|
+
interface PresetBuilder {
|
|
162
|
+
/** Add a preset to the combination */
|
|
163
|
+
with(preset: PermissionPreset | PermissionSpec): PresetBuilder;
|
|
164
|
+
/** Add environment variables to read */
|
|
165
|
+
withEnv(vars: string[]): PresetBuilder;
|
|
166
|
+
/** Add file system permissions */
|
|
167
|
+
withFs(fs: PermissionSpec['fs']): PresetBuilder;
|
|
168
|
+
/** Add network permissions */
|
|
169
|
+
withNetwork(network: PermissionSpec['network']): PresetBuilder;
|
|
170
|
+
/** Add platform service permissions */
|
|
171
|
+
withPlatform(platform: PlatformPermissions): PresetBuilder;
|
|
172
|
+
/** Add shell execution permissions */
|
|
173
|
+
withShell(shell: PermissionSpec['shell']): PresetBuilder;
|
|
174
|
+
/** Add quotas */
|
|
175
|
+
withQuotas(quotas: PermissionSpec['quotas']): PresetBuilder;
|
|
176
|
+
/**
|
|
177
|
+
* Add storage permissions.
|
|
178
|
+
*
|
|
179
|
+
* @param storage - Storage permissions (true, string[], or { read, write })
|
|
180
|
+
* @returns Builder for chaining
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* .withStorage({ read: ['**'], write: ['.kb/artifacts/**'] })
|
|
185
|
+
* .withStorage(['.kb/data/**']) // Both read + write
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
withStorage(storage: PlatformPermissions['storage']): PresetBuilder;
|
|
189
|
+
/**
|
|
190
|
+
* Add database permissions.
|
|
191
|
+
*
|
|
192
|
+
* @param database - Database permissions (true or granular per type)
|
|
193
|
+
* @returns Builder for chaining
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* .withDatabase({ sql: { tables: ['incidents'] } })
|
|
198
|
+
* .withDatabase(true) // Full database access
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
withDatabase(database: PlatformPermissions['database']): PresetBuilder;
|
|
202
|
+
/** Build the final permission spec (converts to runtime format) */
|
|
203
|
+
build(): RuntimePermissionSpec;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Minimal preset - only basic Node.js environment
|
|
208
|
+
* Use when plugin doesn't need any external access
|
|
209
|
+
*/
|
|
210
|
+
declare const minimal: PermissionPreset;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Git workflow preset - for plugins that use git (simple-git, etc.)
|
|
214
|
+
* Includes HOME for ~/.gitconfig, USER for author info
|
|
215
|
+
*/
|
|
216
|
+
declare const gitWorkflow: PermissionPreset;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* NPM publish preset - for plugins that publish to npm
|
|
220
|
+
* Includes HOME for ~/.npmrc, npm auth tokens
|
|
221
|
+
*/
|
|
222
|
+
declare const npmPublish: PermissionPreset;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Full environment preset - access to all environment variables
|
|
226
|
+
* Use for trusted plugins that need full system access
|
|
227
|
+
* WARNING: This bypasses env filtering entirely
|
|
228
|
+
*/
|
|
229
|
+
declare const fullEnv: PermissionPreset;
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* KB Platform preset - for KB Labs internal plugins
|
|
233
|
+
* Includes KB_* env vars and .kb/ directory access
|
|
234
|
+
*/
|
|
235
|
+
declare const kbPlatform: PermissionPreset;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* LLM Access preset - for plugins that use LLM APIs
|
|
239
|
+
* Includes OpenAI and Anthropic API keys and network access
|
|
240
|
+
*/
|
|
241
|
+
declare const llmAccess: PermissionPreset;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Vector Store preset - for plugins that use vector databases
|
|
245
|
+
* Includes Qdrant, Pinecone, Weaviate access
|
|
246
|
+
*/
|
|
247
|
+
declare const vectorStore: PermissionPreset;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* CI Environment preset - for plugins running in CI/CD
|
|
251
|
+
* Includes GitHub Actions, GitLab CI, and common CI variables
|
|
252
|
+
*/
|
|
253
|
+
declare const ciEnvironment: PermissionPreset;
|
|
254
|
+
|
|
255
|
+
declare const index_ciEnvironment: typeof ciEnvironment;
|
|
256
|
+
declare const index_fullEnv: typeof fullEnv;
|
|
257
|
+
declare const index_gitWorkflow: typeof gitWorkflow;
|
|
258
|
+
declare const index_kbPlatform: typeof kbPlatform;
|
|
259
|
+
declare const index_llmAccess: typeof llmAccess;
|
|
260
|
+
declare const index_minimal: typeof minimal;
|
|
261
|
+
declare const index_npmPublish: typeof npmPublish;
|
|
262
|
+
declare const index_vectorStore: typeof vectorStore;
|
|
263
|
+
declare namespace index {
|
|
264
|
+
export { index_ciEnvironment as ciEnvironment, index_fullEnv as fullEnv, index_gitWorkflow as gitWorkflow, index_kbPlatform as kbPlatform, index_llmAccess as llmAccess, index_minimal as minimal, index_npmPublish as npmPublish, index_vectorStore as vectorStore };
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Convert declarative PermissionSpec to explicit RuntimePermissionSpec
|
|
269
|
+
*
|
|
270
|
+
* Transforms:
|
|
271
|
+
* { mode: 'readWrite', allow: ['*.json'] }
|
|
272
|
+
* Into:
|
|
273
|
+
* { read: ['*.json'], write: ['*.json'] }
|
|
274
|
+
*/
|
|
275
|
+
declare function toRuntimeFormat(spec: PermissionSpec): RuntimePermissionSpec;
|
|
276
|
+
/**
|
|
277
|
+
* Create a builder for combining permission presets
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```typescript
|
|
281
|
+
* const permissions = combine()
|
|
282
|
+
* .with(presets.gitWorkflow)
|
|
283
|
+
* .with(presets.npmPublish)
|
|
284
|
+
* .withEnv(['MY_CUSTOM_VAR'])
|
|
285
|
+
* .build();
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
declare function combine(): PresetBuilder;
|
|
289
|
+
/**
|
|
290
|
+
* Quickly combine multiple presets into a single permission spec
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* ```typescript
|
|
294
|
+
* const permissions = combinePresets(presets.gitWorkflow, presets.npmPublish);
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
declare function combinePresets(...presets: (PermissionPreset | PermissionSpec)[]): RuntimePermissionSpec;
|
|
298
|
+
|
|
299
|
+
export { type PermissionPreset, type PermissionSpec, type PresetBuilder, type RuntimePermissionSpec, ciEnvironment, combine, combinePresets, fullEnv, gitWorkflow, kbPlatform, llmAccess, minimal, npmPublish, index as presets, toRuntimeFormat, vectorStore };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/presets/minimal.ts
|
|
8
|
+
var minimal = {
|
|
9
|
+
id: "minimal",
|
|
10
|
+
description: "Minimal permissions - basic Node.js environment only",
|
|
11
|
+
permissions: {
|
|
12
|
+
env: {
|
|
13
|
+
read: [
|
|
14
|
+
"NODE_ENV",
|
|
15
|
+
"PATH",
|
|
16
|
+
"LANG",
|
|
17
|
+
"LC_ALL",
|
|
18
|
+
"TZ"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/presets/git-workflow.ts
|
|
25
|
+
var gitWorkflow = {
|
|
26
|
+
id: "git-workflow",
|
|
27
|
+
description: "Git operations - includes HOME, USER, and git config access",
|
|
28
|
+
permissions: {
|
|
29
|
+
env: {
|
|
30
|
+
read: [
|
|
31
|
+
// System (required for git to find config)
|
|
32
|
+
"HOME",
|
|
33
|
+
"USER",
|
|
34
|
+
"PATH",
|
|
35
|
+
"SHELL",
|
|
36
|
+
"TERM",
|
|
37
|
+
"LANG",
|
|
38
|
+
"LC_ALL",
|
|
39
|
+
"TZ",
|
|
40
|
+
"TMPDIR",
|
|
41
|
+
// Git-specific
|
|
42
|
+
"GIT_*",
|
|
43
|
+
// All git env vars (GIT_AUTHOR_NAME, GIT_DIR, etc.)
|
|
44
|
+
"SSH_AUTH_SOCK",
|
|
45
|
+
// For SSH key auth
|
|
46
|
+
"SSH_AGENT_PID",
|
|
47
|
+
// Node
|
|
48
|
+
"NODE_ENV"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
fs: {
|
|
52
|
+
mode: "readWrite",
|
|
53
|
+
allow: [
|
|
54
|
+
"**/.git/**",
|
|
55
|
+
// Git directory
|
|
56
|
+
"**/.gitignore",
|
|
57
|
+
"**/.gitattributes"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/presets/npm-publish.ts
|
|
64
|
+
var npmPublish = {
|
|
65
|
+
id: "npm-publish",
|
|
66
|
+
description: "NPM operations - includes HOME, npm tokens, and registry access",
|
|
67
|
+
permissions: {
|
|
68
|
+
env: {
|
|
69
|
+
read: [
|
|
70
|
+
// System (required for npm to find config)
|
|
71
|
+
"HOME",
|
|
72
|
+
"USER",
|
|
73
|
+
"PATH",
|
|
74
|
+
"TMPDIR",
|
|
75
|
+
"LANG",
|
|
76
|
+
"LC_ALL",
|
|
77
|
+
"TZ",
|
|
78
|
+
// NPM-specific
|
|
79
|
+
"NPM_TOKEN",
|
|
80
|
+
"NPM_AUTH_TOKEN",
|
|
81
|
+
"NODE_AUTH_TOKEN",
|
|
82
|
+
"npm_*",
|
|
83
|
+
// All npm env vars
|
|
84
|
+
// Node
|
|
85
|
+
"NODE_ENV",
|
|
86
|
+
"NODE_OPTIONS"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
fs: {
|
|
90
|
+
mode: "readWrite",
|
|
91
|
+
allow: [
|
|
92
|
+
"**/package.json",
|
|
93
|
+
"**/package-lock.json",
|
|
94
|
+
"**/pnpm-lock.yaml",
|
|
95
|
+
"**/.npmrc",
|
|
96
|
+
"**/.npmignore"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
network: {
|
|
100
|
+
fetch: [
|
|
101
|
+
"registry.npmjs.org",
|
|
102
|
+
"npm.pkg.github.com"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// src/presets/full-env.ts
|
|
109
|
+
var fullEnv = {
|
|
110
|
+
id: "full-env",
|
|
111
|
+
description: "Full environment access - all env vars available (trusted plugins only)",
|
|
112
|
+
permissions: {
|
|
113
|
+
env: {
|
|
114
|
+
read: ["*"]
|
|
115
|
+
// Wildcard - all env vars
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// src/presets/kb-platform.ts
|
|
121
|
+
var kbPlatform = {
|
|
122
|
+
id: "kb-platform",
|
|
123
|
+
description: "KB Labs platform access - KB_* env vars and .kb/ directory",
|
|
124
|
+
permissions: {
|
|
125
|
+
env: {
|
|
126
|
+
read: [
|
|
127
|
+
// System basics
|
|
128
|
+
"HOME",
|
|
129
|
+
"USER",
|
|
130
|
+
"PATH",
|
|
131
|
+
"TMPDIR",
|
|
132
|
+
"NODE_ENV",
|
|
133
|
+
// KB Labs specific
|
|
134
|
+
"KB_*"
|
|
135
|
+
// All KB env vars
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
fs: {
|
|
139
|
+
mode: "readWrite",
|
|
140
|
+
allow: [
|
|
141
|
+
".kb/**"
|
|
142
|
+
// KB Labs config directory
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// src/presets/llm-access.ts
|
|
149
|
+
var llmAccess = {
|
|
150
|
+
id: "llm-access",
|
|
151
|
+
description: "LLM API access - OpenAI, Anthropic keys and network",
|
|
152
|
+
permissions: {
|
|
153
|
+
env: {
|
|
154
|
+
read: [
|
|
155
|
+
"OPENAI_API_KEY",
|
|
156
|
+
"OPENAI_ORG_ID",
|
|
157
|
+
"OPENAI_BASE_URL",
|
|
158
|
+
"ANTHROPIC_API_KEY",
|
|
159
|
+
"AZURE_OPENAI_*",
|
|
160
|
+
// Azure OpenAI
|
|
161
|
+
"LLM_*"
|
|
162
|
+
// Generic LLM config
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
network: {
|
|
166
|
+
fetch: [
|
|
167
|
+
"api.openai.com",
|
|
168
|
+
"api.anthropic.com",
|
|
169
|
+
"*.openai.azure.com"
|
|
170
|
+
// Azure OpenAI
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// src/presets/vector-store.ts
|
|
177
|
+
var vectorStore = {
|
|
178
|
+
id: "vector-store",
|
|
179
|
+
description: "Vector database access - Qdrant, Pinecone, Weaviate",
|
|
180
|
+
permissions: {
|
|
181
|
+
env: {
|
|
182
|
+
read: [
|
|
183
|
+
// Qdrant
|
|
184
|
+
"QDRANT_URL",
|
|
185
|
+
"QDRANT_API_KEY",
|
|
186
|
+
"QDRANT_*",
|
|
187
|
+
// Pinecone
|
|
188
|
+
"PINECONE_API_KEY",
|
|
189
|
+
"PINECONE_ENVIRONMENT",
|
|
190
|
+
"PINECONE_*",
|
|
191
|
+
// Weaviate
|
|
192
|
+
"WEAVIATE_URL",
|
|
193
|
+
"WEAVIATE_API_KEY",
|
|
194
|
+
"WEAVIATE_*",
|
|
195
|
+
// Generic
|
|
196
|
+
"VECTOR_STORE_*",
|
|
197
|
+
"EMBEDDING_*"
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
network: {
|
|
201
|
+
fetch: [
|
|
202
|
+
"localhost",
|
|
203
|
+
"127.0.0.1",
|
|
204
|
+
"*.qdrant.io",
|
|
205
|
+
"*.pinecone.io",
|
|
206
|
+
"*.weaviate.io"
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// src/presets/ci-environment.ts
|
|
213
|
+
var ciEnvironment = {
|
|
214
|
+
id: "ci-environment",
|
|
215
|
+
description: "CI/CD environment - GitHub Actions, GitLab CI tokens and vars",
|
|
216
|
+
permissions: {
|
|
217
|
+
env: {
|
|
218
|
+
read: [
|
|
219
|
+
// Common CI
|
|
220
|
+
"CI",
|
|
221
|
+
"CI_*",
|
|
222
|
+
"CONTINUOUS_INTEGRATION",
|
|
223
|
+
// GitHub Actions
|
|
224
|
+
"GITHUB_TOKEN",
|
|
225
|
+
"GITHUB_*",
|
|
226
|
+
"GH_TOKEN",
|
|
227
|
+
// GitLab CI
|
|
228
|
+
"GITLAB_*",
|
|
229
|
+
"CI_JOB_TOKEN",
|
|
230
|
+
// Jenkins
|
|
231
|
+
"JENKINS_*",
|
|
232
|
+
"BUILD_*",
|
|
233
|
+
// Generic
|
|
234
|
+
"BRANCH_NAME",
|
|
235
|
+
"TAG_NAME",
|
|
236
|
+
"COMMIT_SHA"
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// src/presets/index.ts
|
|
243
|
+
var presets_exports = {};
|
|
244
|
+
__export(presets_exports, {
|
|
245
|
+
ciEnvironment: () => ciEnvironment,
|
|
246
|
+
fullEnv: () => fullEnv,
|
|
247
|
+
gitWorkflow: () => gitWorkflow,
|
|
248
|
+
kbPlatform: () => kbPlatform,
|
|
249
|
+
llmAccess: () => llmAccess,
|
|
250
|
+
minimal: () => minimal,
|
|
251
|
+
npmPublish: () => npmPublish,
|
|
252
|
+
vectorStore: () => vectorStore
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// src/combine.ts
|
|
256
|
+
function mergeArrays(a, b) {
|
|
257
|
+
if (!a && !b) {
|
|
258
|
+
return void 0;
|
|
259
|
+
}
|
|
260
|
+
const set = /* @__PURE__ */ new Set([...a ?? [], ...b ?? []]);
|
|
261
|
+
return set.size > 0 ? [...set] : void 0;
|
|
262
|
+
}
|
|
263
|
+
function mergePlatformPermissions(base, next) {
|
|
264
|
+
if (!base && !next) {
|
|
265
|
+
return void 0;
|
|
266
|
+
}
|
|
267
|
+
if (!base) {
|
|
268
|
+
return next;
|
|
269
|
+
}
|
|
270
|
+
if (!next) {
|
|
271
|
+
return base;
|
|
272
|
+
}
|
|
273
|
+
const result = {};
|
|
274
|
+
const keys = /* @__PURE__ */ new Set([...Object.keys(base), ...Object.keys(next)]);
|
|
275
|
+
for (const key of keys) {
|
|
276
|
+
const baseVal = base[key];
|
|
277
|
+
const nextVal = next[key];
|
|
278
|
+
if (nextVal === void 0) {
|
|
279
|
+
result[key] = baseVal;
|
|
280
|
+
} else if (Array.isArray(nextVal)) {
|
|
281
|
+
result[key] = mergeArrays(
|
|
282
|
+
Array.isArray(baseVal) ? baseVal : void 0,
|
|
283
|
+
nextVal
|
|
284
|
+
);
|
|
285
|
+
} else if (typeof nextVal === "object" && nextVal !== null) {
|
|
286
|
+
result[key] = { ...typeof baseVal === "object" ? baseVal : {}, ...nextVal };
|
|
287
|
+
} else {
|
|
288
|
+
result[key] = nextVal;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
292
|
+
}
|
|
293
|
+
function mergeSpecs(base, next) {
|
|
294
|
+
const result = {};
|
|
295
|
+
if (base.fs || next.fs) {
|
|
296
|
+
result.fs = {
|
|
297
|
+
// readWrite wins over read
|
|
298
|
+
mode: next.fs?.mode ?? base.fs?.mode,
|
|
299
|
+
allow: mergeArrays(base.fs?.allow, next.fs?.allow)
|
|
300
|
+
};
|
|
301
|
+
if (result.fs.mode === void 0) {
|
|
302
|
+
delete result.fs.mode;
|
|
303
|
+
}
|
|
304
|
+
if (result.fs.allow === void 0) {
|
|
305
|
+
delete result.fs.allow;
|
|
306
|
+
}
|
|
307
|
+
if (Object.keys(result.fs).length === 0) {
|
|
308
|
+
delete result.fs;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (base.env || next.env) {
|
|
312
|
+
result.env = {
|
|
313
|
+
read: mergeArrays(base.env?.read, next.env?.read)
|
|
314
|
+
};
|
|
315
|
+
if (result.env.read === void 0) {
|
|
316
|
+
delete result.env.read;
|
|
317
|
+
}
|
|
318
|
+
if (Object.keys(result.env).length === 0) {
|
|
319
|
+
delete result.env;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (base.network || next.network) {
|
|
323
|
+
result.network = {
|
|
324
|
+
fetch: mergeArrays(base.network?.fetch, next.network?.fetch)
|
|
325
|
+
};
|
|
326
|
+
if (result.network.fetch === void 0) {
|
|
327
|
+
delete result.network.fetch;
|
|
328
|
+
}
|
|
329
|
+
if (Object.keys(result.network).length === 0) {
|
|
330
|
+
delete result.network;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (base.shell || next.shell) {
|
|
334
|
+
result.shell = {
|
|
335
|
+
allow: mergeArrays(base.shell?.allow, next.shell?.allow)
|
|
336
|
+
};
|
|
337
|
+
if (result.shell.allow === void 0) {
|
|
338
|
+
delete result.shell.allow;
|
|
339
|
+
}
|
|
340
|
+
if (Object.keys(result.shell).length === 0) {
|
|
341
|
+
delete result.shell;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
result.platform = mergePlatformPermissions(base.platform, next.platform);
|
|
345
|
+
if (base.quotas || next.quotas) {
|
|
346
|
+
result.quotas = {
|
|
347
|
+
timeoutMs: next.quotas?.timeoutMs ?? base.quotas?.timeoutMs,
|
|
348
|
+
memoryMb: next.quotas?.memoryMb ?? base.quotas?.memoryMb,
|
|
349
|
+
cpuMs: next.quotas?.cpuMs ?? base.quotas?.cpuMs
|
|
350
|
+
};
|
|
351
|
+
if (result.quotas.timeoutMs === void 0) {
|
|
352
|
+
delete result.quotas.timeoutMs;
|
|
353
|
+
}
|
|
354
|
+
if (result.quotas.memoryMb === void 0) {
|
|
355
|
+
delete result.quotas.memoryMb;
|
|
356
|
+
}
|
|
357
|
+
if (result.quotas.cpuMs === void 0) {
|
|
358
|
+
delete result.quotas.cpuMs;
|
|
359
|
+
}
|
|
360
|
+
if (Object.keys(result.quotas).length === 0) {
|
|
361
|
+
delete result.quotas;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return result;
|
|
365
|
+
}
|
|
366
|
+
function toRuntimeFormat(spec) {
|
|
367
|
+
const result = {};
|
|
368
|
+
if (spec.fs) {
|
|
369
|
+
const { mode, allow } = spec.fs;
|
|
370
|
+
result.fs = {};
|
|
371
|
+
if (allow && allow.length > 0) {
|
|
372
|
+
result.fs.read = [...allow];
|
|
373
|
+
if (mode === "readWrite") {
|
|
374
|
+
result.fs.write = [...allow];
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (Object.keys(result.fs).length === 0) {
|
|
378
|
+
delete result.fs;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (spec.env) {
|
|
382
|
+
result.env = { ...spec.env };
|
|
383
|
+
}
|
|
384
|
+
if (spec.network) {
|
|
385
|
+
result.network = { ...spec.network };
|
|
386
|
+
}
|
|
387
|
+
if (spec.shell) {
|
|
388
|
+
result.shell = { ...spec.shell };
|
|
389
|
+
}
|
|
390
|
+
if (spec.platform) {
|
|
391
|
+
result.platform = { ...spec.platform };
|
|
392
|
+
}
|
|
393
|
+
if (spec.quotas) {
|
|
394
|
+
result.quotas = { ...spec.quotas };
|
|
395
|
+
}
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
function combine() {
|
|
399
|
+
let accumulated = {};
|
|
400
|
+
const builder = {
|
|
401
|
+
with(preset) {
|
|
402
|
+
const spec = "permissions" in preset ? preset.permissions : preset;
|
|
403
|
+
accumulated = mergeSpecs(accumulated, spec);
|
|
404
|
+
return builder;
|
|
405
|
+
},
|
|
406
|
+
withEnv(vars) {
|
|
407
|
+
accumulated = mergeSpecs(accumulated, { env: { read: vars } });
|
|
408
|
+
return builder;
|
|
409
|
+
},
|
|
410
|
+
withFs(fs) {
|
|
411
|
+
if (fs) {
|
|
412
|
+
accumulated = mergeSpecs(accumulated, { fs });
|
|
413
|
+
}
|
|
414
|
+
return builder;
|
|
415
|
+
},
|
|
416
|
+
withNetwork(network) {
|
|
417
|
+
if (network) {
|
|
418
|
+
accumulated = mergeSpecs(accumulated, { network });
|
|
419
|
+
}
|
|
420
|
+
return builder;
|
|
421
|
+
},
|
|
422
|
+
withShell(shell) {
|
|
423
|
+
if (shell) {
|
|
424
|
+
accumulated = mergeSpecs(accumulated, { shell });
|
|
425
|
+
}
|
|
426
|
+
return builder;
|
|
427
|
+
},
|
|
428
|
+
withPlatform(platform) {
|
|
429
|
+
if (platform) {
|
|
430
|
+
accumulated = mergeSpecs(accumulated, { platform });
|
|
431
|
+
}
|
|
432
|
+
return builder;
|
|
433
|
+
},
|
|
434
|
+
withQuotas(quotas) {
|
|
435
|
+
if (quotas) {
|
|
436
|
+
accumulated = mergeSpecs(accumulated, { quotas });
|
|
437
|
+
}
|
|
438
|
+
return builder;
|
|
439
|
+
},
|
|
440
|
+
withStorage(storage) {
|
|
441
|
+
if (storage !== void 0) {
|
|
442
|
+
accumulated = mergeSpecs(accumulated, {
|
|
443
|
+
platform: { storage }
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
return builder;
|
|
447
|
+
},
|
|
448
|
+
withDatabase(database) {
|
|
449
|
+
if (database !== void 0) {
|
|
450
|
+
accumulated = mergeSpecs(accumulated, {
|
|
451
|
+
platform: { database }
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
return builder;
|
|
455
|
+
},
|
|
456
|
+
build() {
|
|
457
|
+
return toRuntimeFormat(accumulated);
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
return builder;
|
|
461
|
+
}
|
|
462
|
+
function combinePresets(...presets) {
|
|
463
|
+
let builder = combine();
|
|
464
|
+
for (const preset of presets) {
|
|
465
|
+
builder = builder.with(preset);
|
|
466
|
+
}
|
|
467
|
+
return builder.build();
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export { ciEnvironment, combine, combinePresets, fullEnv, gitWorkflow, kbPlatform, llmAccess, minimal, npmPublish, presets_exports as presets, toRuntimeFormat, vectorStore };
|
|
471
|
+
//# sourceMappingURL=index.js.map
|
|
472
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presets/minimal.ts","../src/presets/git-workflow.ts","../src/presets/npm-publish.ts","../src/presets/full-env.ts","../src/presets/kb-platform.ts","../src/presets/llm-access.ts","../src/presets/vector-store.ts","../src/presets/ci-environment.ts","../src/presets/index.ts","../src/combine.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { PermissionPreset } from '../types';\n\n/**\n * Minimal preset - only basic Node.js environment\n * Use when plugin doesn't need any external access\n */\nexport const minimal: PermissionPreset = {\n id: 'minimal',\n description: 'Minimal permissions - basic Node.js environment only',\n permissions: {\n env: {\n read: [\n 'NODE_ENV',\n 'PATH',\n 'LANG',\n 'LC_ALL',\n 'TZ',\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * Git workflow preset - for plugins that use git (simple-git, etc.)\n * Includes HOME for ~/.gitconfig, USER for author info\n */\nexport const gitWorkflow: PermissionPreset = {\n id: 'git-workflow',\n description: 'Git operations - includes HOME, USER, and git config access',\n permissions: {\n env: {\n read: [\n // System (required for git to find config)\n 'HOME',\n 'USER',\n 'PATH',\n 'SHELL',\n 'TERM',\n 'LANG',\n 'LC_ALL',\n 'TZ',\n 'TMPDIR',\n // Git-specific\n 'GIT_*', // All git env vars (GIT_AUTHOR_NAME, GIT_DIR, etc.)\n 'SSH_AUTH_SOCK', // For SSH key auth\n 'SSH_AGENT_PID',\n // Node\n 'NODE_ENV',\n ],\n },\n fs: {\n mode: 'readWrite',\n allow: [\n '**/.git/**', // Git directory\n '**/.gitignore',\n '**/.gitattributes',\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * NPM publish preset - for plugins that publish to npm\n * Includes HOME for ~/.npmrc, npm auth tokens\n */\nexport const npmPublish: PermissionPreset = {\n id: 'npm-publish',\n description: 'NPM operations - includes HOME, npm tokens, and registry access',\n permissions: {\n env: {\n read: [\n // System (required for npm to find config)\n 'HOME',\n 'USER',\n 'PATH',\n 'TMPDIR',\n 'LANG',\n 'LC_ALL',\n 'TZ',\n // NPM-specific\n 'NPM_TOKEN',\n 'NPM_AUTH_TOKEN',\n 'NODE_AUTH_TOKEN',\n 'npm_*', // All npm env vars\n // Node\n 'NODE_ENV',\n 'NODE_OPTIONS',\n ],\n },\n fs: {\n mode: 'readWrite',\n allow: [\n '**/package.json',\n '**/package-lock.json',\n '**/pnpm-lock.yaml',\n '**/.npmrc',\n '**/.npmignore',\n ],\n },\n network: {\n fetch: [\n 'registry.npmjs.org',\n 'npm.pkg.github.com',\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * Full environment preset - access to all environment variables\n * Use for trusted plugins that need full system access\n * WARNING: This bypasses env filtering entirely\n */\nexport const fullEnv: PermissionPreset = {\n id: 'full-env',\n description: 'Full environment access - all env vars available (trusted plugins only)',\n permissions: {\n env: {\n read: ['*'], // Wildcard - all env vars\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * KB Platform preset - for KB Labs internal plugins\n * Includes KB_* env vars and .kb/ directory access\n */\nexport const kbPlatform: PermissionPreset = {\n id: 'kb-platform',\n description: 'KB Labs platform access - KB_* env vars and .kb/ directory',\n permissions: {\n env: {\n read: [\n // System basics\n 'HOME',\n 'USER',\n 'PATH',\n 'TMPDIR',\n 'NODE_ENV',\n // KB Labs specific\n 'KB_*', // All KB env vars\n ],\n },\n fs: {\n mode: 'readWrite',\n allow: [\n '.kb/**', // KB Labs config directory\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * LLM Access preset - for plugins that use LLM APIs\n * Includes OpenAI and Anthropic API keys and network access\n */\nexport const llmAccess: PermissionPreset = {\n id: 'llm-access',\n description: 'LLM API access - OpenAI, Anthropic keys and network',\n permissions: {\n env: {\n read: [\n 'OPENAI_API_KEY',\n 'OPENAI_ORG_ID',\n 'OPENAI_BASE_URL',\n 'ANTHROPIC_API_KEY',\n 'AZURE_OPENAI_*', // Azure OpenAI\n 'LLM_*', // Generic LLM config\n ],\n },\n network: {\n fetch: [\n 'api.openai.com',\n 'api.anthropic.com',\n '*.openai.azure.com', // Azure OpenAI\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * Vector Store preset - for plugins that use vector databases\n * Includes Qdrant, Pinecone, Weaviate access\n */\nexport const vectorStore: PermissionPreset = {\n id: 'vector-store',\n description: 'Vector database access - Qdrant, Pinecone, Weaviate',\n permissions: {\n env: {\n read: [\n // Qdrant\n 'QDRANT_URL',\n 'QDRANT_API_KEY',\n 'QDRANT_*',\n // Pinecone\n 'PINECONE_API_KEY',\n 'PINECONE_ENVIRONMENT',\n 'PINECONE_*',\n // Weaviate\n 'WEAVIATE_URL',\n 'WEAVIATE_API_KEY',\n 'WEAVIATE_*',\n // Generic\n 'VECTOR_STORE_*',\n 'EMBEDDING_*',\n ],\n },\n network: {\n fetch: [\n 'localhost',\n '127.0.0.1',\n '*.qdrant.io',\n '*.pinecone.io',\n '*.weaviate.io',\n ],\n },\n },\n};\n","import type { PermissionPreset } from '../types';\n\n/**\n * CI Environment preset - for plugins running in CI/CD\n * Includes GitHub Actions, GitLab CI, and common CI variables\n */\nexport const ciEnvironment: PermissionPreset = {\n id: 'ci-environment',\n description: 'CI/CD environment - GitHub Actions, GitLab CI tokens and vars',\n permissions: {\n env: {\n read: [\n // Common CI\n 'CI',\n 'CI_*',\n 'CONTINUOUS_INTEGRATION',\n // GitHub Actions\n 'GITHUB_TOKEN',\n 'GITHUB_*',\n 'GH_TOKEN',\n // GitLab CI\n 'GITLAB_*',\n 'CI_JOB_TOKEN',\n // Jenkins\n 'JENKINS_*',\n 'BUILD_*',\n // Generic\n 'BRANCH_NAME',\n 'TAG_NAME',\n 'COMMIT_SHA',\n ],\n },\n },\n};\n","export { minimal } from './minimal';\nexport { gitWorkflow } from './git-workflow';\nexport { npmPublish } from './npm-publish';\nexport { fullEnv } from './full-env';\nexport { kbPlatform } from './kb-platform';\nexport { llmAccess } from './llm-access';\nexport { vectorStore } from './vector-store';\nexport { ciEnvironment } from './ci-environment';\n","import type { PermissionSpec, PermissionPreset, PresetBuilder, RuntimePermissionSpec, PlatformPermissions } from './types';\n\n/**\n * Merge two string arrays, removing duplicates\n */\nfunction mergeArrays(a?: string[], b?: string[]): string[] | undefined {\n if (!a && !b) {return undefined;}\n const set = new Set([...(a ?? []), ...(b ?? [])]);\n return set.size > 0 ? [...set] : undefined;\n}\n\n/**\n * Merge platform permissions\n */\nfunction mergePlatformPermissions(\n base?: PermissionSpec['platform'],\n next?: PermissionSpec['platform']\n): PermissionSpec['platform'] | undefined {\n if (!base && !next) {return undefined;}\n if (!base) {return next;}\n if (!next) {return base;}\n\n const result: PermissionSpec['platform'] = {};\n\n // Merge each platform service (second value wins for booleans, arrays are merged)\n const keys = new Set([...Object.keys(base), ...Object.keys(next)]) as Set<keyof typeof base>;\n\n for (const key of keys) {\n const baseVal = base[key];\n const nextVal = next[key];\n\n if (nextVal === undefined) {\n result[key] = baseVal as any;\n } else if (Array.isArray(nextVal)) {\n // Merge arrays (for cache namespaces, storage paths)\n result[key] = mergeArrays(\n Array.isArray(baseVal) ? baseVal : undefined,\n nextVal\n ) as any;\n } else if (typeof nextVal === 'object' && nextVal !== null) {\n // Merge objects (for llm.models, vectorStore.collections, etc.)\n result[key] = { ...(typeof baseVal === 'object' ? baseVal : {}), ...nextVal } as any;\n } else {\n // Boolean or primitive - second value wins\n result[key] = nextVal as any;\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Merge two permission specs together\n * Arrays are merged (union), scalars use the second value\n */\nfunction mergeSpecs(base: PermissionSpec, next: PermissionSpec): PermissionSpec {\n const result: PermissionSpec = {};\n\n // Merge fs\n if (base.fs || next.fs) {\n result.fs = {\n // readWrite wins over read\n mode: next.fs?.mode ?? base.fs?.mode,\n allow: mergeArrays(base.fs?.allow, next.fs?.allow),\n };\n // Clean up undefined fields\n if (result.fs.mode === undefined) {delete result.fs.mode;}\n if (result.fs.allow === undefined) {delete result.fs.allow;}\n if (Object.keys(result.fs).length === 0) {delete result.fs;}\n }\n\n // Merge env\n if (base.env || next.env) {\n result.env = {\n read: mergeArrays(base.env?.read, next.env?.read),\n };\n if (result.env.read === undefined) {delete result.env.read;}\n if (Object.keys(result.env).length === 0) {delete result.env;}\n }\n\n // Merge network\n if (base.network || next.network) {\n result.network = {\n fetch: mergeArrays(base.network?.fetch, next.network?.fetch),\n };\n if (result.network.fetch === undefined) {delete result.network.fetch;}\n if (Object.keys(result.network).length === 0) {delete result.network;}\n }\n\n // Merge shell\n if (base.shell || next.shell) {\n result.shell = {\n allow: mergeArrays(base.shell?.allow, next.shell?.allow),\n };\n if (result.shell.allow === undefined) {delete result.shell.allow;}\n if (Object.keys(result.shell).length === 0) {delete result.shell;}\n }\n\n // Merge platform\n result.platform = mergePlatformPermissions(base.platform, next.platform);\n\n // Merge quotas (second value wins)\n if (base.quotas || next.quotas) {\n result.quotas = {\n timeoutMs: next.quotas?.timeoutMs ?? base.quotas?.timeoutMs,\n memoryMb: next.quotas?.memoryMb ?? base.quotas?.memoryMb,\n cpuMs: next.quotas?.cpuMs ?? base.quotas?.cpuMs,\n };\n if (result.quotas.timeoutMs === undefined) {delete result.quotas.timeoutMs;}\n if (result.quotas.memoryMb === undefined) {delete result.quotas.memoryMb;}\n if (result.quotas.cpuMs === undefined) {delete result.quotas.cpuMs;}\n if (Object.keys(result.quotas).length === 0) {delete result.quotas;}\n }\n\n return result;\n}\n\n/**\n * Convert declarative PermissionSpec to explicit RuntimePermissionSpec\n *\n * Transforms:\n * { mode: 'readWrite', allow: ['*.json'] }\n * Into:\n * { read: ['*.json'], write: ['*.json'] }\n */\nfunction toRuntimeFormat(spec: PermissionSpec): RuntimePermissionSpec {\n const result: RuntimePermissionSpec = {};\n\n // Convert fs: mode + allow → read[] + write[]\n if (spec.fs) {\n const { mode, allow } = spec.fs;\n result.fs = {};\n\n if (allow && allow.length > 0) {\n // read is always granted for allowed paths\n result.fs.read = [...allow];\n\n // write only if mode is 'readWrite'\n if (mode === 'readWrite') {\n result.fs.write = [...allow];\n }\n }\n\n if (Object.keys(result.fs).length === 0) {delete result.fs;}\n }\n\n // env, network, shell, platform, quotas pass through unchanged\n if (spec.env) {\n result.env = { ...spec.env };\n }\n\n if (spec.network) {\n result.network = { ...spec.network };\n }\n\n if (spec.shell) {\n result.shell = { ...spec.shell };\n }\n\n if (spec.platform) {\n result.platform = { ...spec.platform };\n }\n\n if (spec.quotas) {\n result.quotas = { ...spec.quotas };\n }\n\n return result;\n}\n\n/**\n * Create a builder for combining permission presets\n *\n * @example\n * ```typescript\n * const permissions = combine()\n * .with(presets.gitWorkflow)\n * .with(presets.npmPublish)\n * .withEnv(['MY_CUSTOM_VAR'])\n * .build();\n * ```\n */\nexport function combine(): PresetBuilder {\n let accumulated: PermissionSpec = {};\n\n const builder: PresetBuilder = {\n with(preset: PermissionPreset | PermissionSpec): PresetBuilder {\n const spec = 'permissions' in preset ? preset.permissions : preset;\n accumulated = mergeSpecs(accumulated, spec);\n return builder;\n },\n\n withEnv(vars: string[]): PresetBuilder {\n accumulated = mergeSpecs(accumulated, { env: { read: vars } });\n return builder;\n },\n\n withFs(fs: PermissionSpec['fs']): PresetBuilder {\n if (fs) {\n accumulated = mergeSpecs(accumulated, { fs });\n }\n return builder;\n },\n\n withNetwork(network: PermissionSpec['network']): PresetBuilder {\n if (network) {\n accumulated = mergeSpecs(accumulated, { network });\n }\n return builder;\n },\n\n withShell(shell: PermissionSpec['shell']): PresetBuilder {\n if (shell) {\n accumulated = mergeSpecs(accumulated, { shell });\n }\n return builder;\n },\n\n withPlatform(platform: PermissionSpec['platform']): PresetBuilder {\n if (platform) {\n accumulated = mergeSpecs(accumulated, { platform });\n }\n return builder;\n },\n\n withQuotas(quotas: PermissionSpec['quotas']): PresetBuilder {\n if (quotas) {\n accumulated = mergeSpecs(accumulated, { quotas });\n }\n return builder;\n },\n\n withStorage(storage: PlatformPermissions['storage']): PresetBuilder {\n if (storage !== undefined) {\n accumulated = mergeSpecs(accumulated, {\n platform: { storage },\n });\n }\n return builder;\n },\n\n withDatabase(database: PlatformPermissions['database']): PresetBuilder {\n if (database !== undefined) {\n accumulated = mergeSpecs(accumulated, {\n platform: { database },\n });\n }\n return builder;\n },\n\n build(): RuntimePermissionSpec {\n return toRuntimeFormat(accumulated);\n },\n };\n\n return builder;\n}\n\n/**\n * Quickly combine multiple presets into a single permission spec\n *\n * @example\n * ```typescript\n * const permissions = combinePresets(presets.gitWorkflow, presets.npmPublish);\n * ```\n */\nexport function combinePresets(...presets: (PermissionPreset | PermissionSpec)[]): RuntimePermissionSpec {\n let builder = combine();\n for (const preset of presets) {\n builder = builder.with(preset);\n }\n return builder.build();\n}\n\n/**\n * Export toRuntimeFormat for advanced use cases\n */\nexport { toRuntimeFormat };\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kb-labs/perm-presets",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Composable permission presets for KB Labs plugins",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@kb-labs/devkit": "link:../../../kb-labs-devkit",
|
|
22
|
+
"typescript": "^5.6.3",
|
|
23
|
+
"tsup": "^8.5.0",
|
|
24
|
+
"rimraf": "^6.0.1",
|
|
25
|
+
"vitest": "^3.2.4",
|
|
26
|
+
"@types/node": "^24.3.3"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20.0.0",
|
|
33
|
+
"pnpm": ">=9.0.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"clean": "rimraf dist",
|
|
38
|
+
"test": "vitest run --passWithNoTests",
|
|
39
|
+
"test:watch": "vitest",
|
|
40
|
+
"dev": "tsup --config tsup.config.ts --watch",
|
|
41
|
+
"lint": "eslint src --ext .ts",
|
|
42
|
+
"lint:fix": "eslint . --fix",
|
|
43
|
+
"type-check": "tsc --noEmit"
|
|
44
|
+
}
|
|
45
|
+
}
|