svamp-cli 0.2.341 → 0.2.346
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/bin/skills/artifact/SKILL.md +1 -1
- package/bin/skills/crew/SKILL.md +21 -3
- package/dist/DefaultTransport-vfp78fug.mjs +47 -0
- package/dist/GeminiTransport-3OkhtFRO.mjs +130 -0
- package/dist/KimiTransport-D8n009Tr.mjs +141 -0
- package/dist/acpAgentConfig-CObOPlA8.mjs +48 -0
- package/dist/acpBackend-BZ1MJhQV.mjs +922 -0
- package/dist/{adminCommands-Btl3is3z.mjs → adminCommands-BvsYnRDA.mjs} +2 -18
- package/dist/{agentCommands-B7JaByb0.mjs → agentCommands-B2Nl7Fof.mjs} +6 -23
- package/dist/api-BHjyC0Ph.mjs +157 -0
- package/dist/{auth-pTUm-zt4.mjs → auth-CRz8TsEl.mjs} +1 -22
- package/dist/bootStatus-DqtNgJch.mjs +143 -0
- package/dist/claudeAuth-iAerdaMr.mjs +247 -0
- package/dist/cli.mjs +2939 -5
- package/dist/codexAppServerBackend-VGsYtbqg.mjs +786 -0
- package/dist/codexProvider-BtxYc5Rj.mjs +68 -0
- package/dist/{commands-BaxjRuxM.mjs → commands-BB1Kcyt-.mjs} +13 -19
- package/dist/{commands-BUkV04q6.mjs → commands-BOpoVBOM.mjs} +55 -25
- package/dist/{commands-C1L_R1H6.mjs → commands-C2aODeVc.mjs} +58 -33
- package/dist/{commands-znQSQbTX.mjs → commands-CiRCwjkJ.mjs} +10 -32
- package/dist/{commands-C4whLEwv.mjs → commands-D1pZq3d4.mjs} +103 -41
- package/dist/{commands-CMCSUI4A.mjs → commands-D69mnkYu.mjs} +20 -30
- package/dist/{commands-CfP6gPZF.mjs → commands-DW5RnHZw.mjs} +2 -19
- package/dist/{commands-EcIOSJHF.mjs → commands-H4PsTGn8.mjs} +58 -26
- package/dist/cron-hHGdb5kU.mjs +132 -0
- package/dist/detectIsolation-CzoDCEnh.mjs +319 -0
- package/dist/envFlag-COOuJ3AH.mjs +11 -0
- package/dist/fileLock-BMPwCrB6.mjs +80 -0
- package/dist/{fleet-U-WXVbW_.mjs → fleet-DM_Q7w69.mjs} +85 -24
- package/dist/flushExit-C-i6SGjj.mjs +37 -0
- package/dist/friendlyName-1UZcyDhu.mjs +586 -0
- package/dist/{headlessCli-CptF7_lZ.mjs → headlessCli-C8HzQvis.mjs} +3 -21
- package/dist/hookSettings-DYMTUgVA.mjs +10399 -0
- package/dist/{httpServer-Be1Hcddr.mjs → httpServer-BzEDbOGn.mjs} +14 -5
- package/dist/hyphaClient-ybivOjZo.mjs +49 -0
- package/dist/index.mjs +40 -8
- package/dist/instance-CeHz5C8v.mjs +203 -0
- package/dist/kimiProvider-DbxODebR.mjs +69 -0
- package/dist/kimiSetup-NGsoYB5h.mjs +48 -0
- package/dist/loopVerify-B47sSjxe.mjs +444 -0
- package/dist/machineTools-DygM1jXW.mjs +580 -0
- package/dist/model-CUHojegn.mjs +66 -0
- package/dist/{notifyCommands-DitnhzYz.mjs → notifyCommands-D-IKIxiq.mjs} +3 -18
- package/dist/package-DtuINqf5.mjs +64 -0
- package/dist/pinnedCodex-XW4qvOAe.mjs +11 -0
- package/dist/pinnedNono-5ZHb6328.mjs +15 -0
- package/dist/{rpc-zndUgvJ7.mjs → rpc-BB6RF4-F.mjs} +38 -6
- package/dist/{rpc-BPT9DJXL.mjs → rpc-Cf0grcru.mjs} +28 -20
- package/dist/{run-CrUTBmi4.mjs → run-ChdsgaSD.mjs} +17 -9
- package/dist/run-DkjwF-zA.mjs +9695 -0
- package/dist/sandboxDetect-Cdzsj5TC.mjs +19 -0
- package/dist/{scheduler-B0h2sfGn.mjs → scheduler-BY30ZrB9.mjs} +38 -6
- package/dist/securityContext-Cm5UTCuD.mjs +218 -0
- package/dist/serveAuth-DbVLRCRR.mjs +418 -0
- package/dist/{serveCommands-DpF0xKvz.mjs → serveCommands-CUHUiYnZ.mjs} +13 -34
- package/dist/sharingNotificationSync-qGIQ-3yf.mjs +359 -0
- package/dist/{sideband-B5n9fNxM.mjs → sideband-68HhGT0i.mjs} +1 -21
- package/dist/store-Bn0ByYev.mjs +347 -0
- package/dist/store-fi0f-ff1.mjs +184 -0
- package/dist/types-57J3Re0n.mjs +17 -0
- package/dist/wantsHelp-6bMOeNUz.mjs +5 -0
- package/dist/wrapCommand-CdNawSaa.mjs +117 -0
- package/package.json +3 -3
- package/dist/cli-pFCLXDrP.mjs +0 -2749
- package/dist/package-CigJ8nhu.mjs +0 -64
- package/dist/run-LHJh7jLy.mjs +0 -26384
- package/dist/sandboxDetect-DNTcbgWD.mjs +0 -12
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function isSandboxed() {
|
|
2
|
+
return process.env.SVAMP_SANDBOXED === "1";
|
|
3
|
+
}
|
|
4
|
+
const SANDBOX_SAFE_SESSION_CMDS = [
|
|
5
|
+
"set-title",
|
|
6
|
+
"set-link",
|
|
7
|
+
"link",
|
|
8
|
+
"set-project-description",
|
|
9
|
+
"set-project"
|
|
10
|
+
];
|
|
11
|
+
const SANDBOX_BLOCKED_MSG = `This command is not available in sandboxed sessions. Available commands: ${SANDBOX_SAFE_SESSION_CMDS.join(", ")}`;
|
|
12
|
+
function requireNotSandboxed(commandName) {
|
|
13
|
+
if (isSandboxed()) {
|
|
14
|
+
console.error(`${commandName}: ${SANDBOX_BLOCKED_MSG}`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { SANDBOX_BLOCKED_MSG, SANDBOX_SAFE_SESSION_CMDS, isSandboxed, requireNotSandboxed };
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as inZone, c as cronMatches } from './cron-hHGdb5kU.mjs';
|
|
2
|
+
import { r as resolveProjectRoot } from './store-Bn0ByYev.mjs';
|
|
3
|
+
import { l as listWorkflows, i as isWorkflowEnabled, w as workflowSchedules } from './store-fi0f-ff1.mjs';
|
|
4
|
+
import { r as runWorkflow } from './run-DkjwF-zA.mjs';
|
|
5
|
+
import 'node:fs';
|
|
6
|
+
import 'node:path';
|
|
7
|
+
import 'node:crypto';
|
|
8
|
+
import 'node:child_process';
|
|
9
|
+
import './fileLock-BMPwCrB6.mjs';
|
|
10
|
+
import 'yaml';
|
|
2
11
|
import 'os';
|
|
3
12
|
import 'fs/promises';
|
|
4
13
|
import 'fs';
|
|
@@ -6,20 +15,43 @@ import 'path';
|
|
|
6
15
|
import 'url';
|
|
7
16
|
import 'child_process';
|
|
8
17
|
import 'crypto';
|
|
9
|
-
import '
|
|
10
|
-
import '
|
|
11
|
-
import '
|
|
12
|
-
import '
|
|
18
|
+
import './hookSettings-DYMTUgVA.mjs';
|
|
19
|
+
import './types-57J3Re0n.mjs';
|
|
20
|
+
import './securityContext-Cm5UTCuD.mjs';
|
|
21
|
+
import './machineTools-DygM1jXW.mjs';
|
|
22
|
+
import './model-CUHojegn.mjs';
|
|
13
23
|
import 'util';
|
|
14
24
|
import 'http';
|
|
15
25
|
import 'net';
|
|
26
|
+
import './instance-CeHz5C8v.mjs';
|
|
27
|
+
import './serveAuth-DbVLRCRR.mjs';
|
|
16
28
|
import 'node:os';
|
|
29
|
+
import './envFlag-COOuJ3AH.mjs';
|
|
30
|
+
import './claudeAuth-iAerdaMr.mjs';
|
|
31
|
+
import './codexProvider-BtxYc5Rj.mjs';
|
|
32
|
+
import './friendlyName-1UZcyDhu.mjs';
|
|
17
33
|
import 'node:events';
|
|
34
|
+
import './hyphaClient-ybivOjZo.mjs';
|
|
35
|
+
import './sharingNotificationSync-qGIQ-3yf.mjs';
|
|
36
|
+
import './acpBackend-BZ1MJhQV.mjs';
|
|
18
37
|
import '@agentclientprotocol/sdk';
|
|
38
|
+
import './DefaultTransport-vfp78fug.mjs';
|
|
39
|
+
import './wrapCommand-CdNawSaa.mjs';
|
|
40
|
+
import './acpAgentConfig-CObOPlA8.mjs';
|
|
41
|
+
import './codexAppServerBackend-VGsYtbqg.mjs';
|
|
19
42
|
import 'node:util';
|
|
20
43
|
import 'node:readline';
|
|
44
|
+
import './pinnedCodex-XW4qvOAe.mjs';
|
|
45
|
+
import './GeminiTransport-3OkhtFRO.mjs';
|
|
46
|
+
import './KimiTransport-D8n009Tr.mjs';
|
|
47
|
+
import './kimiProvider-DbxODebR.mjs';
|
|
48
|
+
import './kimiSetup-NGsoYB5h.mjs';
|
|
49
|
+
import './detectIsolation-CzoDCEnh.mjs';
|
|
21
50
|
import 'node:fs/promises';
|
|
22
|
-
import '
|
|
51
|
+
import './pinnedNono-5ZHb6328.mjs';
|
|
52
|
+
import './bootStatus-DqtNgJch.mjs';
|
|
53
|
+
import './loopVerify-B47sSjxe.mjs';
|
|
54
|
+
import './api-BHjyC0Ph.mjs';
|
|
23
55
|
|
|
24
56
|
function cronMatchesSafe(expr, date) {
|
|
25
57
|
try {
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
function loadSecurityContextConfig(filePath) {
|
|
4
|
+
if (!existsSync(filePath)) {
|
|
5
|
+
throw new Error(`Security context config file not found: ${filePath}`);
|
|
6
|
+
}
|
|
7
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
8
|
+
let parsed;
|
|
9
|
+
try {
|
|
10
|
+
parsed = JSON.parse(raw);
|
|
11
|
+
} catch (err) {
|
|
12
|
+
throw new Error(`Invalid JSON in security context config: ${err.message}`);
|
|
13
|
+
}
|
|
14
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
15
|
+
throw new Error("Security context config must be a JSON object");
|
|
16
|
+
}
|
|
17
|
+
if (parsed.default !== void 0) {
|
|
18
|
+
validateSecurityContext(parsed.default, "default");
|
|
19
|
+
}
|
|
20
|
+
if (parsed.users !== void 0) {
|
|
21
|
+
if (typeof parsed.users !== "object" || parsed.users === null || Array.isArray(parsed.users)) {
|
|
22
|
+
throw new Error('Security context config "users" must be an object');
|
|
23
|
+
}
|
|
24
|
+
for (const [email, ctx] of Object.entries(parsed.users)) {
|
|
25
|
+
validateSecurityContext(ctx, `users.${email}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return parsed;
|
|
29
|
+
}
|
|
30
|
+
const VALID_ROLES = ["view", "interact", "admin"];
|
|
31
|
+
function validateSecurityContext(ctx, path) {
|
|
32
|
+
if (typeof ctx !== "object" || ctx === null || Array.isArray(ctx)) {
|
|
33
|
+
throw new Error(`Security context at "${path}" must be an object`);
|
|
34
|
+
}
|
|
35
|
+
if (ctx.role !== void 0 && !VALID_ROLES.includes(ctx.role)) {
|
|
36
|
+
throw new Error(`Invalid role "${ctx.role}" at "${path}". Must be one of: ${VALID_ROLES.join(", ")}`);
|
|
37
|
+
}
|
|
38
|
+
if (ctx.filesystem !== void 0) {
|
|
39
|
+
validateStringArray(ctx.filesystem.denyRead, `${path}.filesystem.denyRead`);
|
|
40
|
+
validateStringArray(ctx.filesystem.allowWrite, `${path}.filesystem.allowWrite`);
|
|
41
|
+
validateStringArray(ctx.filesystem.denyWrite, `${path}.filesystem.denyWrite`);
|
|
42
|
+
}
|
|
43
|
+
if (ctx.network !== void 0) {
|
|
44
|
+
validateStringArray(ctx.network.allowedDomains, `${path}.network.allowedDomains`);
|
|
45
|
+
validateStringArray(ctx.network.deniedDomains, `${path}.network.deniedDomains`);
|
|
46
|
+
}
|
|
47
|
+
if (ctx.denyAllNetwork !== void 0 && typeof ctx.denyAllNetwork !== "boolean") {
|
|
48
|
+
throw new Error(`"${path}.denyAllNetwork" must be a boolean`);
|
|
49
|
+
}
|
|
50
|
+
validateStringArray(ctx.allowedDirectories, `${path}.allowedDirectories`);
|
|
51
|
+
}
|
|
52
|
+
function validateStringArray(arr, path) {
|
|
53
|
+
if (arr === void 0) return;
|
|
54
|
+
if (!Array.isArray(arr)) {
|
|
55
|
+
throw new Error(`"${path}" must be an array`);
|
|
56
|
+
}
|
|
57
|
+
for (let i = 0; i < arr.length; i++) {
|
|
58
|
+
if (typeof arr[i] !== "string") {
|
|
59
|
+
throw new Error(`"${path}[${i}]" must be a string`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function dedup(arr) {
|
|
64
|
+
return [...new Set(arr)];
|
|
65
|
+
}
|
|
66
|
+
function mergeArrays(a, b) {
|
|
67
|
+
if (!a && !b) return void 0;
|
|
68
|
+
return dedup([...a || [], ...b || []]);
|
|
69
|
+
}
|
|
70
|
+
function mergeSecurityContexts(base, override) {
|
|
71
|
+
if (!base && !override) return void 0;
|
|
72
|
+
if (!base) return override;
|
|
73
|
+
if (!override) return base;
|
|
74
|
+
const merged = {};
|
|
75
|
+
merged.role = override.role ?? base.role;
|
|
76
|
+
merged.denyAllNetwork = override.denyAllNetwork ?? base.denyAllNetwork;
|
|
77
|
+
const baseFs = base.filesystem;
|
|
78
|
+
const overFs = override.filesystem;
|
|
79
|
+
if (baseFs || overFs) {
|
|
80
|
+
merged.filesystem = {
|
|
81
|
+
denyRead: mergeArrays(baseFs?.denyRead, overFs?.denyRead),
|
|
82
|
+
allowWrite: mergeArrays(baseFs?.allowWrite, overFs?.allowWrite),
|
|
83
|
+
denyWrite: mergeArrays(baseFs?.denyWrite, overFs?.denyWrite)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const baseNet = base.network;
|
|
87
|
+
const overNet = override.network;
|
|
88
|
+
if (baseNet || overNet) {
|
|
89
|
+
merged.network = {
|
|
90
|
+
allowedDomains: mergeArrays(baseNet?.allowedDomains, overNet?.allowedDomains),
|
|
91
|
+
deniedDomains: mergeArrays(baseNet?.deniedDomains, overNet?.deniedDomains)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
merged.allowedDirectories = mergeArrays(base.allowedDirectories, override.allowedDirectories);
|
|
95
|
+
return merged;
|
|
96
|
+
}
|
|
97
|
+
function clampSecurityContextToCeiling(ceiling, requested) {
|
|
98
|
+
if (!ceiling) return void 0;
|
|
99
|
+
if (!requested) return ceiling;
|
|
100
|
+
const merged = {};
|
|
101
|
+
merged.role = ceiling.role;
|
|
102
|
+
merged.denyAllNetwork = (ceiling.denyAllNetwork ?? false) || (requested.denyAllNetwork ?? false);
|
|
103
|
+
const cf = ceiling.filesystem;
|
|
104
|
+
const rf = requested.filesystem;
|
|
105
|
+
if (cf || rf) {
|
|
106
|
+
merged.filesystem = {
|
|
107
|
+
// Grants: ceiling only (caller cannot widen writable paths).
|
|
108
|
+
allowWrite: cf?.allowWrite ? dedup(cf.allowWrite) : void 0,
|
|
109
|
+
// Denials: union (caller may add more).
|
|
110
|
+
denyRead: mergeArrays(cf?.denyRead, rf?.denyRead),
|
|
111
|
+
denyWrite: mergeArrays(cf?.denyWrite, rf?.denyWrite)
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const cn = ceiling.network;
|
|
115
|
+
const rn = requested.network;
|
|
116
|
+
if (cn || rn) {
|
|
117
|
+
merged.network = {
|
|
118
|
+
allowedDomains: cn?.allowedDomains ? dedup(cn.allowedDomains) : void 0,
|
|
119
|
+
deniedDomains: mergeArrays(cn?.deniedDomains, rn?.deniedDomains)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
merged.allowedDirectories = ceiling.allowedDirectories ? dedup(ceiling.allowedDirectories) : void 0;
|
|
123
|
+
return merged;
|
|
124
|
+
}
|
|
125
|
+
function resolveSecurityContext(config, userEmail) {
|
|
126
|
+
if (!config) return void 0;
|
|
127
|
+
const defaultCtx = config.default;
|
|
128
|
+
let userCtx;
|
|
129
|
+
if (userEmail && config.users) {
|
|
130
|
+
const emailLower = userEmail.toLowerCase();
|
|
131
|
+
for (const [key, ctx] of Object.entries(config.users)) {
|
|
132
|
+
if (key.toLowerCase() === emailLower) {
|
|
133
|
+
userCtx = ctx;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return mergeSecurityContexts(defaultCtx, userCtx);
|
|
139
|
+
}
|
|
140
|
+
function buildSecurityContextFromFlags(flags) {
|
|
141
|
+
const ctx = {};
|
|
142
|
+
if (flags.denyRead?.length || flags.allowWrite?.length) {
|
|
143
|
+
ctx.filesystem = {};
|
|
144
|
+
if (flags.denyRead?.length) ctx.filesystem.denyRead = flags.denyRead;
|
|
145
|
+
if (flags.allowWrite?.length) ctx.filesystem.allowWrite = flags.allowWrite;
|
|
146
|
+
}
|
|
147
|
+
if (flags.denyNetwork) {
|
|
148
|
+
ctx.denyAllNetwork = true;
|
|
149
|
+
}
|
|
150
|
+
if (flags.allowDomain?.length) {
|
|
151
|
+
ctx.network = { allowedDomains: flags.allowDomain };
|
|
152
|
+
}
|
|
153
|
+
return ctx;
|
|
154
|
+
}
|
|
155
|
+
function unenforceableRules(method, context) {
|
|
156
|
+
const unsupported = [];
|
|
157
|
+
const fs = context.filesystem;
|
|
158
|
+
if (fs?.denyRead?.length) unsupported.push("filesystem.denyRead");
|
|
159
|
+
if (fs?.denyWrite?.length) unsupported.push("filesystem.denyWrite");
|
|
160
|
+
if (context.network?.deniedDomains?.length) unsupported.push("network.deniedDomains");
|
|
161
|
+
if (method === "docker" || method === "podman") {
|
|
162
|
+
if (fs?.allowWrite?.length) unsupported.push("filesystem.allowWrite");
|
|
163
|
+
if (context.network?.allowedDomains?.length) unsupported.push("network.allowedDomains");
|
|
164
|
+
}
|
|
165
|
+
return unsupported;
|
|
166
|
+
}
|
|
167
|
+
function describeUnenforceable(method, context) {
|
|
168
|
+
const unsupported = unenforceableRules(method, context);
|
|
169
|
+
if (!unsupported.length) return null;
|
|
170
|
+
return `securityContext: ${unsupported.join(", ")} is NOT ENFORCED by the "${method}" sandbox \u2014 these rules are accepted but have no effect (#0878). ` + (method === "nono" ? `nono is allow-list based and the workspace is granted via --allow-cwd, so a deny rule for a path inside the workspace does nothing. allowedDirectories and filesystem.allowWrite do NOT help \u2014 they GRANT additional paths on top of that. The only confinement that works today is to keep the sensitive path OUTSIDE the session workspace.` : `The container backend maps only allowedDirectories and denyAllNetwork. Use those, or run the machine under the nono sandbox.`);
|
|
171
|
+
}
|
|
172
|
+
function applySecurityContext(baseConfig, context) {
|
|
173
|
+
const warning = describeUnenforceable(baseConfig.method, context);
|
|
174
|
+
if (warning) console.warn(`[security] ${warning}`);
|
|
175
|
+
const config = { ...baseConfig };
|
|
176
|
+
if (config.method === "nono") {
|
|
177
|
+
const nonoConfig = { ...config.nonoConfig };
|
|
178
|
+
if (context.filesystem?.allowWrite) {
|
|
179
|
+
nonoConfig.allowDirs = dedup([
|
|
180
|
+
...nonoConfig.allowDirs || [],
|
|
181
|
+
...context.filesystem.allowWrite
|
|
182
|
+
]);
|
|
183
|
+
}
|
|
184
|
+
if (context.allowedDirectories) {
|
|
185
|
+
nonoConfig.allowDirs = dedup([
|
|
186
|
+
...nonoConfig.allowDirs || [],
|
|
187
|
+
...context.allowedDirectories
|
|
188
|
+
]);
|
|
189
|
+
}
|
|
190
|
+
if (context.denyAllNetwork) {
|
|
191
|
+
nonoConfig.netBlock = true;
|
|
192
|
+
nonoConfig.proxyAllow = [];
|
|
193
|
+
}
|
|
194
|
+
if (!context.denyAllNetwork && context.network?.allowedDomains) {
|
|
195
|
+
nonoConfig.proxyAllow = dedup([
|
|
196
|
+
...nonoConfig.proxyAllow || [],
|
|
197
|
+
...context.network.allowedDomains
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
config.nonoConfig = nonoConfig;
|
|
201
|
+
} else if (config.method === "docker" || config.method === "podman") {
|
|
202
|
+
const containerConfig = { ...config.containerConfig };
|
|
203
|
+
if (context.denyAllNetwork) {
|
|
204
|
+
containerConfig.networkMode = "none";
|
|
205
|
+
}
|
|
206
|
+
if (context.allowedDirectories) {
|
|
207
|
+
const extraMounts = [...containerConfig.extraMounts || []];
|
|
208
|
+
for (const dir of context.allowedDirectories) {
|
|
209
|
+
extraMounts.push(`${dir}:${dir}`);
|
|
210
|
+
}
|
|
211
|
+
containerConfig.extraMounts = dedup(extraMounts);
|
|
212
|
+
}
|
|
213
|
+
config.containerConfig = containerConfig;
|
|
214
|
+
}
|
|
215
|
+
return config;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export { applySecurityContext, buildSecurityContextFromFlags, clampSecurityContextToCeiling, describeUnenforceable, loadSecurityContextConfig, mergeSecurityContexts, resolveSecurityContext };
|