@paperclipai/plugin-kubernetes 0.1.0 → 2026.620.0-canary.3
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/LICENSE +21 -0
- package/dist/adapter-defaults.d.ts +29 -0
- package/dist/adapter-defaults.d.ts.map +1 -0
- package/dist/adapter-defaults.js +104 -0
- package/dist/adapter-defaults.js.map +1 -0
- package/dist/adapter-registry.d.ts +64 -0
- package/dist/adapter-registry.d.ts.map +1 -0
- package/dist/adapter-registry.js +25 -0
- package/dist/adapter-registry.js.map +1 -0
- package/dist/cilium-network-policy.d.ts +8 -0
- package/dist/cilium-network-policy.d.ts.map +1 -0
- package/dist/cilium-network-policy.js +57 -0
- package/dist/cilium-network-policy.js.map +1 -0
- package/dist/image-allowlist.d.ts +18 -0
- package/dist/image-allowlist.d.ts.map +1 -0
- package/dist/image-allowlist.js +39 -0
- package/dist/image-allowlist.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/job-orchestrator.d.ts +24 -0
- package/dist/job-orchestrator.d.ts.map +1 -0
- package/dist/job-orchestrator.js +90 -0
- package/dist/job-orchestrator.js.map +1 -0
- package/dist/kube-client.d.ts +15 -0
- package/dist/kube-client.d.ts.map +1 -0
- package/dist/kube-client.js +23 -0
- package/dist/kube-client.js.map +1 -0
- package/dist/lease-lifecycle.d.ts +62 -0
- package/dist/lease-lifecycle.d.ts.map +1 -0
- package/dist/lease-lifecycle.js +155 -0
- package/dist/lease-lifecycle.js.map +1 -0
- package/dist/manifest.d.ts +4 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +108 -0
- package/dist/manifest.js.map +1 -0
- package/dist/network-policy.d.ts +18 -0
- package/dist/network-policy.d.ts.map +1 -0
- package/dist/network-policy.js +113 -0
- package/dist/network-policy.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +687 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pod-exec.d.ts +28 -0
- package/dist/pod-exec.d.ts.map +1 -0
- package/dist/pod-exec.js +164 -0
- package/dist/pod-exec.js.map +1 -0
- package/dist/pod-spec-builder.d.ts +25 -0
- package/dist/pod-spec-builder.d.ts.map +1 -0
- package/dist/pod-spec-builder.js +82 -0
- package/dist/pod-spec-builder.js.map +1 -0
- package/dist/sandbox-cr-builder.d.ts +40 -0
- package/dist/sandbox-cr-builder.d.ts.map +1 -0
- package/dist/sandbox-cr-builder.js +123 -0
- package/dist/sandbox-cr-builder.js.map +1 -0
- package/dist/sandbox-cr-orchestrator.d.ts +62 -0
- package/dist/sandbox-cr-orchestrator.d.ts.map +1 -0
- package/dist/sandbox-cr-orchestrator.js +248 -0
- package/dist/sandbox-cr-orchestrator.js.map +1 -0
- package/dist/sandbox-orchestrator.d.ts +39 -0
- package/dist/sandbox-orchestrator.d.ts.map +1 -0
- package/dist/sandbox-orchestrator.js +2 -0
- package/dist/sandbox-orchestrator.js.map +1 -0
- package/dist/secret-manager.d.ts +14 -0
- package/dist/secret-manager.d.ts.map +1 -0
- package/dist/secret-manager.js +39 -0
- package/dist/secret-manager.js.map +1 -0
- package/dist/tenant-orchestrator.d.ts +35 -0
- package/dist/tenant-orchestrator.d.ts.map +1 -0
- package/dist/tenant-orchestrator.js +263 -0
- package/dist/tenant-orchestrator.js.map +1 -0
- package/dist/types.d.ts +264 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +65 -0
- package/dist/types.js.map +1 -0
- package/dist/upload-interceptor.d.ts +44 -0
- package/dist/upload-interceptor.d.ts.map +1 -0
- package/dist/upload-interceptor.js +114 -0
- package/dist/upload-interceptor.js.map +1 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +51 -0
- package/dist/utils.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/package.json +4 -12
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { buildNetworkPolicyManifests } from "./network-policy.js";
|
|
2
|
+
import { buildCiliumNetworkPolicyManifest } from "./cilium-network-policy.js";
|
|
3
|
+
const SERVICE_ACCOUNT_NAME = "paperclip-tenant-sa";
|
|
4
|
+
const ROLE_NAME = "paperclip-tenant-role";
|
|
5
|
+
const ROLE_BINDING_NAME = "paperclip-tenant-rb";
|
|
6
|
+
const RESOURCE_QUOTA_NAME = "paperclip-quota";
|
|
7
|
+
const LIMIT_RANGE_NAME = "paperclip-limits";
|
|
8
|
+
/**
|
|
9
|
+
* Lazy, first-write-wins tenant provisioning. Each helper checks if the named
|
|
10
|
+
* resource exists and creates it only on 404; if it already exists, it is
|
|
11
|
+
* left as-is — config-driven values (quota limits, RBAC permissions, network
|
|
12
|
+
* policies, egress allow-list) are FROZEN at first provisioning time.
|
|
13
|
+
*
|
|
14
|
+
* V1 limitation: changing KubernetesProviderConfig after a tenant namespace
|
|
15
|
+
* is provisioned does NOT update the in-cluster resources. To apply config
|
|
16
|
+
* changes, an operator must delete the per-tenant resources manually (or
|
|
17
|
+
* the namespace itself). A future iteration should add strategic-merge
|
|
18
|
+
* reconciliation here.
|
|
19
|
+
*
|
|
20
|
+
* Particular gotcha: switching egressMode "standard" → "cilium" leaves the
|
|
21
|
+
* old paperclip-egress-allow NetworkPolicy in place alongside the new
|
|
22
|
+
* CiliumNetworkPolicy. Both apply; the effective egress is the intersection.
|
|
23
|
+
*/
|
|
24
|
+
export async function ensureTenant(clients, input) {
|
|
25
|
+
await ensureNamespace(clients, input);
|
|
26
|
+
await ensureServiceAccount(clients, input);
|
|
27
|
+
await ensureRole(clients, input);
|
|
28
|
+
await ensureRoleBinding(clients, input);
|
|
29
|
+
await ensureResourceQuota(clients, input);
|
|
30
|
+
await ensureLimitRange(clients, input);
|
|
31
|
+
await ensureNetworkPolicies(clients, input);
|
|
32
|
+
}
|
|
33
|
+
async function ensureNamespace(clients, input) {
|
|
34
|
+
try {
|
|
35
|
+
await clients.core.readNamespace({ name: input.namespace });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (!isNotFound(err))
|
|
40
|
+
throw err;
|
|
41
|
+
}
|
|
42
|
+
await createIgnoringAlreadyExists(clients.core.createNamespace({
|
|
43
|
+
body: {
|
|
44
|
+
apiVersion: "v1",
|
|
45
|
+
kind: "Namespace",
|
|
46
|
+
metadata: {
|
|
47
|
+
name: input.namespace,
|
|
48
|
+
labels: {
|
|
49
|
+
"paperclip.io/company-id": input.companyId,
|
|
50
|
+
"paperclip.io/managed-by": "paperclip-k8s-plugin",
|
|
51
|
+
"pod-security.kubernetes.io/enforce": "restricted",
|
|
52
|
+
"pod-security.kubernetes.io/audit": "restricted",
|
|
53
|
+
"pod-security.kubernetes.io/warn": "restricted",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
async function ensureServiceAccount(clients, input) {
|
|
60
|
+
try {
|
|
61
|
+
await clients.core.readNamespacedServiceAccount({ name: SERVICE_ACCOUNT_NAME, namespace: input.namespace });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (!isNotFound(err))
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
await createIgnoringAlreadyExists(clients.core.createNamespacedServiceAccount({
|
|
69
|
+
namespace: input.namespace,
|
|
70
|
+
body: {
|
|
71
|
+
apiVersion: "v1",
|
|
72
|
+
kind: "ServiceAccount",
|
|
73
|
+
metadata: {
|
|
74
|
+
name: SERVICE_ACCOUNT_NAME,
|
|
75
|
+
namespace: input.namespace,
|
|
76
|
+
annotations: input.serviceAccountAnnotations,
|
|
77
|
+
labels: { "paperclip.io/managed-by": "paperclip-k8s-plugin" },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
async function ensureRole(clients, input) {
|
|
83
|
+
try {
|
|
84
|
+
await clients.rbac.readNamespacedRole({ name: ROLE_NAME, namespace: input.namespace });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
if (!isNotFound(err))
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
await createIgnoringAlreadyExists(clients.rbac.createNamespacedRole({
|
|
92
|
+
namespace: input.namespace,
|
|
93
|
+
body: {
|
|
94
|
+
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
95
|
+
kind: "Role",
|
|
96
|
+
metadata: { name: ROLE_NAME, namespace: input.namespace },
|
|
97
|
+
rules: [
|
|
98
|
+
{ apiGroups: [""], resources: ["pods/log"], verbs: ["get"] },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
async function ensureRoleBinding(clients, input) {
|
|
104
|
+
try {
|
|
105
|
+
await clients.rbac.readNamespacedRoleBinding({ name: ROLE_BINDING_NAME, namespace: input.namespace });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
if (!isNotFound(err))
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
await createIgnoringAlreadyExists(clients.rbac.createNamespacedRoleBinding({
|
|
113
|
+
namespace: input.namespace,
|
|
114
|
+
body: {
|
|
115
|
+
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
116
|
+
kind: "RoleBinding",
|
|
117
|
+
metadata: { name: ROLE_BINDING_NAME, namespace: input.namespace },
|
|
118
|
+
roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: ROLE_NAME },
|
|
119
|
+
subjects: [{ kind: "ServiceAccount", name: SERVICE_ACCOUNT_NAME, namespace: input.namespace }],
|
|
120
|
+
},
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
async function ensureResourceQuota(clients, input) {
|
|
124
|
+
try {
|
|
125
|
+
await clients.core.readNamespacedResourceQuota({ name: RESOURCE_QUOTA_NAME, namespace: input.namespace });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (!isNotFound(err))
|
|
130
|
+
throw err;
|
|
131
|
+
}
|
|
132
|
+
await createIgnoringAlreadyExists(clients.core.createNamespacedResourceQuota({
|
|
133
|
+
namespace: input.namespace,
|
|
134
|
+
body: {
|
|
135
|
+
apiVersion: "v1",
|
|
136
|
+
kind: "ResourceQuota",
|
|
137
|
+
metadata: { name: RESOURCE_QUOTA_NAME, namespace: input.namespace },
|
|
138
|
+
spec: {
|
|
139
|
+
hard: {
|
|
140
|
+
pods: input.resourceQuota.pods,
|
|
141
|
+
"requests.cpu": input.resourceQuota.requestsCpu,
|
|
142
|
+
"requests.memory": input.resourceQuota.requestsMemory,
|
|
143
|
+
"limits.cpu": input.resourceQuota.limitsCpu,
|
|
144
|
+
"limits.memory": input.resourceQuota.limitsMemory,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
async function ensureLimitRange(clients, input) {
|
|
151
|
+
try {
|
|
152
|
+
await clients.core.readNamespacedLimitRange({ name: LIMIT_RANGE_NAME, namespace: input.namespace });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (!isNotFound(err))
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
await createIgnoringAlreadyExists(clients.core.createNamespacedLimitRange({
|
|
160
|
+
namespace: input.namespace,
|
|
161
|
+
body: {
|
|
162
|
+
apiVersion: "v1",
|
|
163
|
+
kind: "LimitRange",
|
|
164
|
+
metadata: { name: LIMIT_RANGE_NAME, namespace: input.namespace },
|
|
165
|
+
spec: {
|
|
166
|
+
limits: [
|
|
167
|
+
{
|
|
168
|
+
type: "Container",
|
|
169
|
+
max: { cpu: "4", memory: "8Gi" },
|
|
170
|
+
min: { cpu: "100m", memory: "128Mi" },
|
|
171
|
+
// The k8s client-node type names this `_default` but the actual
|
|
172
|
+
// Kubernetes API field is `default`. We produce a JSON-shape
|
|
173
|
+
// manifest so the cast is safe.
|
|
174
|
+
default: { cpu: "1", memory: "2Gi" },
|
|
175
|
+
defaultRequest: { cpu: "250m", memory: "512Mi" },
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
async function ensureNetworkPolicies(clients, input) {
|
|
183
|
+
const [denyAll, egressStd] = buildNetworkPolicyManifests({
|
|
184
|
+
namespace: input.namespace,
|
|
185
|
+
paperclipServerNamespace: input.paperclipServerNamespace,
|
|
186
|
+
egressAllowCidrs: input.egressAllowCidrs,
|
|
187
|
+
egressAllowFqdns: input.egressAllowFqdns,
|
|
188
|
+
});
|
|
189
|
+
await ensureNetworkPolicy(clients, input.namespace, denyAll);
|
|
190
|
+
if (input.egressMode === "cilium") {
|
|
191
|
+
const cnp = buildCiliumNetworkPolicyManifest({
|
|
192
|
+
namespace: input.namespace,
|
|
193
|
+
paperclipServerNamespace: input.paperclipServerNamespace,
|
|
194
|
+
egressAllowFqdns: input.egressAllowFqdns,
|
|
195
|
+
egressAllowCidrs: input.egressAllowCidrs,
|
|
196
|
+
});
|
|
197
|
+
await ensureCiliumNetworkPolicy(clients, input.namespace, cnp);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
await ensureNetworkPolicy(clients, input.namespace, egressStd);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function ensureNetworkPolicy(clients, namespace, manifest) {
|
|
204
|
+
const name = manifest.metadata.name;
|
|
205
|
+
try {
|
|
206
|
+
await clients.networking.readNamespacedNetworkPolicy({ name, namespace });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
if (!isNotFound(err))
|
|
211
|
+
throw err;
|
|
212
|
+
}
|
|
213
|
+
await createIgnoringAlreadyExists(clients.networking.createNamespacedNetworkPolicy({ namespace, body: manifest }));
|
|
214
|
+
}
|
|
215
|
+
async function ensureCiliumNetworkPolicy(clients, namespace, manifest) {
|
|
216
|
+
const name = manifest.metadata.name;
|
|
217
|
+
try {
|
|
218
|
+
await clients.custom.getNamespacedCustomObject({
|
|
219
|
+
group: "cilium.io",
|
|
220
|
+
version: "v2",
|
|
221
|
+
namespace,
|
|
222
|
+
plural: "ciliumnetworkpolicies",
|
|
223
|
+
name,
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
if (!isNotFound(err))
|
|
229
|
+
throw err;
|
|
230
|
+
}
|
|
231
|
+
await createIgnoringAlreadyExists(clients.custom.createNamespacedCustomObject({
|
|
232
|
+
group: "cilium.io",
|
|
233
|
+
version: "v2",
|
|
234
|
+
namespace,
|
|
235
|
+
plural: "ciliumnetworkpolicies",
|
|
236
|
+
body: manifest,
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
function isNotFound(err) {
|
|
240
|
+
if (typeof err !== "object" || err === null)
|
|
241
|
+
return false;
|
|
242
|
+
const e = err;
|
|
243
|
+
return e.code === 404 || e.statusCode === 404;
|
|
244
|
+
}
|
|
245
|
+
function isAlreadyExists(err) {
|
|
246
|
+
if (typeof err !== "object" || err === null)
|
|
247
|
+
return false;
|
|
248
|
+
const e = err;
|
|
249
|
+
return e.code === 409 || e.statusCode === 409;
|
|
250
|
+
}
|
|
251
|
+
// Two concurrent lease acquisitions for a brand-new tenant can both observe
|
|
252
|
+
// the 404 read and race the create; a 409 AlreadyExists from the loser means
|
|
253
|
+
// the desired state already exists, which is exactly what ensure* wants.
|
|
254
|
+
async function createIgnoringAlreadyExists(create) {
|
|
255
|
+
try {
|
|
256
|
+
await create;
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
if (!isAlreadyExists(err))
|
|
260
|
+
throw err;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=tenant-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-orchestrator.js","sourceRoot":"","sources":["../src/tenant-orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const kubernetesProviderConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
3
|
+
inCluster: z.ZodDefault<z.ZodBoolean>;
|
|
4
|
+
kubeconfig: z.ZodOptional<z.ZodString>;
|
|
5
|
+
namespacePrefix: z.ZodDefault<z.ZodString>;
|
|
6
|
+
companySlug: z.ZodOptional<z.ZodString>;
|
|
7
|
+
imageRegistry: z.ZodOptional<z.ZodString>;
|
|
8
|
+
imageAllowList: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
9
|
+
imagePullSecrets: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
egressAllowFqdns: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
11
|
+
egressAllowCidrs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
12
|
+
egressMode: z.ZodDefault<z.ZodEnum<["cilium", "standard"]>>;
|
|
13
|
+
defaultResources: z.ZodOptional<z.ZodObject<{
|
|
14
|
+
requests: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
cpu: z.ZodOptional<z.ZodString>;
|
|
16
|
+
memory: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
cpu?: string | undefined;
|
|
19
|
+
memory?: string | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
cpu?: string | undefined;
|
|
22
|
+
memory?: string | undefined;
|
|
23
|
+
}>>;
|
|
24
|
+
limits: z.ZodOptional<z.ZodObject<{
|
|
25
|
+
cpu: z.ZodOptional<z.ZodString>;
|
|
26
|
+
memory: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
cpu?: string | undefined;
|
|
29
|
+
memory?: string | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
cpu?: string | undefined;
|
|
32
|
+
memory?: string | undefined;
|
|
33
|
+
}>>;
|
|
34
|
+
}, "strip", z.ZodTypeAny, {
|
|
35
|
+
requests?: {
|
|
36
|
+
cpu?: string | undefined;
|
|
37
|
+
memory?: string | undefined;
|
|
38
|
+
} | undefined;
|
|
39
|
+
limits?: {
|
|
40
|
+
cpu?: string | undefined;
|
|
41
|
+
memory?: string | undefined;
|
|
42
|
+
} | undefined;
|
|
43
|
+
}, {
|
|
44
|
+
requests?: {
|
|
45
|
+
cpu?: string | undefined;
|
|
46
|
+
memory?: string | undefined;
|
|
47
|
+
} | undefined;
|
|
48
|
+
limits?: {
|
|
49
|
+
cpu?: string | undefined;
|
|
50
|
+
memory?: string | undefined;
|
|
51
|
+
} | undefined;
|
|
52
|
+
}>>;
|
|
53
|
+
runtimeClassName: z.ZodOptional<z.ZodString>;
|
|
54
|
+
serviceAccountAnnotations: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
55
|
+
jobTtlSecondsAfterFinished: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
podActivityDeadlineSec: z.ZodDefault<z.ZodNumber>;
|
|
57
|
+
/**
|
|
58
|
+
* The adapter type that Jobs in this environment will run.
|
|
59
|
+
* Each Kubernetes environment is bound to one adapter; create multiple
|
|
60
|
+
* environments for different adapters.
|
|
61
|
+
* Defaults to `"claude_local"`.
|
|
62
|
+
*/
|
|
63
|
+
adapterType: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Optional declarative adapter registry. When present it is authoritative
|
|
66
|
+
* for runtime image / envKeys / allowFqdns / probe / defaultEnv resolution
|
|
67
|
+
* (replace semantics). Absent = built-in defaults.
|
|
68
|
+
*/
|
|
69
|
+
adapters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
70
|
+
adapterType: z.ZodString;
|
|
71
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
72
|
+
runtimeImage: z.ZodOptional<z.ZodString>;
|
|
73
|
+
envKeys: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
74
|
+
allowFqdns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
75
|
+
probeCommand: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
76
|
+
defaultEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
77
|
+
}, "strict", z.ZodTypeAny, {
|
|
78
|
+
adapterType: string;
|
|
79
|
+
enabled: boolean;
|
|
80
|
+
runtimeImage?: string | undefined;
|
|
81
|
+
envKeys?: string[] | undefined;
|
|
82
|
+
allowFqdns?: string[] | undefined;
|
|
83
|
+
probeCommand?: string[] | undefined;
|
|
84
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
85
|
+
}, {
|
|
86
|
+
adapterType: string;
|
|
87
|
+
enabled?: boolean | undefined;
|
|
88
|
+
runtimeImage?: string | undefined;
|
|
89
|
+
envKeys?: string[] | undefined;
|
|
90
|
+
allowFqdns?: string[] | undefined;
|
|
91
|
+
probeCommand?: string[] | undefined;
|
|
92
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
93
|
+
}>, "many">>;
|
|
94
|
+
/**
|
|
95
|
+
* The sandbox backend to use.
|
|
96
|
+
*
|
|
97
|
+
* - `"sandbox-cr"` (default, alpha) — uses the kubernetes-sigs/agent-sandbox
|
|
98
|
+
* Sandbox CRD (agents.x-k8s.io/v1alpha1). Creates a long-lived pod that
|
|
99
|
+
* paperclip-server can exec into for multi-command adapter-install workflows.
|
|
100
|
+
* Requires the agent-sandbox controller to be installed in the cluster.
|
|
101
|
+
*
|
|
102
|
+
* - `"job"` — uses batch/v1 Job (stable fallback). One-shot entrypoint; does
|
|
103
|
+
* NOT support multi-command exec. Use this for clusters without agent-sandbox
|
|
104
|
+
* installed, or when you need stable (non-alpha) k8s APIs.
|
|
105
|
+
*/
|
|
106
|
+
backend: z.ZodDefault<z.ZodEnum<["sandbox-cr", "job"]>>;
|
|
107
|
+
}, "strip", z.ZodTypeAny, {
|
|
108
|
+
adapterType: string;
|
|
109
|
+
inCluster: boolean;
|
|
110
|
+
namespacePrefix: string;
|
|
111
|
+
imageAllowList: string[];
|
|
112
|
+
imagePullSecrets: string[];
|
|
113
|
+
egressAllowFqdns: string[];
|
|
114
|
+
egressAllowCidrs: string[];
|
|
115
|
+
egressMode: "standard" | "cilium";
|
|
116
|
+
serviceAccountAnnotations: Record<string, string>;
|
|
117
|
+
jobTtlSecondsAfterFinished: number;
|
|
118
|
+
podActivityDeadlineSec: number;
|
|
119
|
+
backend: "job" | "sandbox-cr";
|
|
120
|
+
kubeconfig?: string | undefined;
|
|
121
|
+
companySlug?: string | undefined;
|
|
122
|
+
imageRegistry?: string | undefined;
|
|
123
|
+
defaultResources?: {
|
|
124
|
+
requests?: {
|
|
125
|
+
cpu?: string | undefined;
|
|
126
|
+
memory?: string | undefined;
|
|
127
|
+
} | undefined;
|
|
128
|
+
limits?: {
|
|
129
|
+
cpu?: string | undefined;
|
|
130
|
+
memory?: string | undefined;
|
|
131
|
+
} | undefined;
|
|
132
|
+
} | undefined;
|
|
133
|
+
runtimeClassName?: string | undefined;
|
|
134
|
+
adapters?: {
|
|
135
|
+
adapterType: string;
|
|
136
|
+
enabled: boolean;
|
|
137
|
+
runtimeImage?: string | undefined;
|
|
138
|
+
envKeys?: string[] | undefined;
|
|
139
|
+
allowFqdns?: string[] | undefined;
|
|
140
|
+
probeCommand?: string[] | undefined;
|
|
141
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
142
|
+
}[] | undefined;
|
|
143
|
+
}, {
|
|
144
|
+
adapterType?: string | undefined;
|
|
145
|
+
inCluster?: boolean | undefined;
|
|
146
|
+
kubeconfig?: string | undefined;
|
|
147
|
+
namespacePrefix?: string | undefined;
|
|
148
|
+
companySlug?: string | undefined;
|
|
149
|
+
imageRegistry?: string | undefined;
|
|
150
|
+
imageAllowList?: string[] | undefined;
|
|
151
|
+
imagePullSecrets?: string[] | undefined;
|
|
152
|
+
egressAllowFqdns?: string[] | undefined;
|
|
153
|
+
egressAllowCidrs?: string[] | undefined;
|
|
154
|
+
egressMode?: "standard" | "cilium" | undefined;
|
|
155
|
+
defaultResources?: {
|
|
156
|
+
requests?: {
|
|
157
|
+
cpu?: string | undefined;
|
|
158
|
+
memory?: string | undefined;
|
|
159
|
+
} | undefined;
|
|
160
|
+
limits?: {
|
|
161
|
+
cpu?: string | undefined;
|
|
162
|
+
memory?: string | undefined;
|
|
163
|
+
} | undefined;
|
|
164
|
+
} | undefined;
|
|
165
|
+
runtimeClassName?: string | undefined;
|
|
166
|
+
serviceAccountAnnotations?: Record<string, string> | undefined;
|
|
167
|
+
jobTtlSecondsAfterFinished?: number | undefined;
|
|
168
|
+
podActivityDeadlineSec?: number | undefined;
|
|
169
|
+
adapters?: {
|
|
170
|
+
adapterType: string;
|
|
171
|
+
enabled?: boolean | undefined;
|
|
172
|
+
runtimeImage?: string | undefined;
|
|
173
|
+
envKeys?: string[] | undefined;
|
|
174
|
+
allowFqdns?: string[] | undefined;
|
|
175
|
+
probeCommand?: string[] | undefined;
|
|
176
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
177
|
+
}[] | undefined;
|
|
178
|
+
backend?: "job" | "sandbox-cr" | undefined;
|
|
179
|
+
}>, {
|
|
180
|
+
adapterType: string;
|
|
181
|
+
inCluster: boolean;
|
|
182
|
+
namespacePrefix: string;
|
|
183
|
+
imageAllowList: string[];
|
|
184
|
+
imagePullSecrets: string[];
|
|
185
|
+
egressAllowFqdns: string[];
|
|
186
|
+
egressAllowCidrs: string[];
|
|
187
|
+
egressMode: "standard" | "cilium";
|
|
188
|
+
serviceAccountAnnotations: Record<string, string>;
|
|
189
|
+
jobTtlSecondsAfterFinished: number;
|
|
190
|
+
podActivityDeadlineSec: number;
|
|
191
|
+
backend: "job" | "sandbox-cr";
|
|
192
|
+
kubeconfig?: string | undefined;
|
|
193
|
+
companySlug?: string | undefined;
|
|
194
|
+
imageRegistry?: string | undefined;
|
|
195
|
+
defaultResources?: {
|
|
196
|
+
requests?: {
|
|
197
|
+
cpu?: string | undefined;
|
|
198
|
+
memory?: string | undefined;
|
|
199
|
+
} | undefined;
|
|
200
|
+
limits?: {
|
|
201
|
+
cpu?: string | undefined;
|
|
202
|
+
memory?: string | undefined;
|
|
203
|
+
} | undefined;
|
|
204
|
+
} | undefined;
|
|
205
|
+
runtimeClassName?: string | undefined;
|
|
206
|
+
adapters?: {
|
|
207
|
+
adapterType: string;
|
|
208
|
+
enabled: boolean;
|
|
209
|
+
runtimeImage?: string | undefined;
|
|
210
|
+
envKeys?: string[] | undefined;
|
|
211
|
+
allowFqdns?: string[] | undefined;
|
|
212
|
+
probeCommand?: string[] | undefined;
|
|
213
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
214
|
+
}[] | undefined;
|
|
215
|
+
}, {
|
|
216
|
+
adapterType?: string | undefined;
|
|
217
|
+
inCluster?: boolean | undefined;
|
|
218
|
+
kubeconfig?: string | undefined;
|
|
219
|
+
namespacePrefix?: string | undefined;
|
|
220
|
+
companySlug?: string | undefined;
|
|
221
|
+
imageRegistry?: string | undefined;
|
|
222
|
+
imageAllowList?: string[] | undefined;
|
|
223
|
+
imagePullSecrets?: string[] | undefined;
|
|
224
|
+
egressAllowFqdns?: string[] | undefined;
|
|
225
|
+
egressAllowCidrs?: string[] | undefined;
|
|
226
|
+
egressMode?: "standard" | "cilium" | undefined;
|
|
227
|
+
defaultResources?: {
|
|
228
|
+
requests?: {
|
|
229
|
+
cpu?: string | undefined;
|
|
230
|
+
memory?: string | undefined;
|
|
231
|
+
} | undefined;
|
|
232
|
+
limits?: {
|
|
233
|
+
cpu?: string | undefined;
|
|
234
|
+
memory?: string | undefined;
|
|
235
|
+
} | undefined;
|
|
236
|
+
} | undefined;
|
|
237
|
+
runtimeClassName?: string | undefined;
|
|
238
|
+
serviceAccountAnnotations?: Record<string, string> | undefined;
|
|
239
|
+
jobTtlSecondsAfterFinished?: number | undefined;
|
|
240
|
+
podActivityDeadlineSec?: number | undefined;
|
|
241
|
+
adapters?: {
|
|
242
|
+
adapterType: string;
|
|
243
|
+
enabled?: boolean | undefined;
|
|
244
|
+
runtimeImage?: string | undefined;
|
|
245
|
+
envKeys?: string[] | undefined;
|
|
246
|
+
allowFqdns?: string[] | undefined;
|
|
247
|
+
probeCommand?: string[] | undefined;
|
|
248
|
+
defaultEnv?: Record<string, string> | undefined;
|
|
249
|
+
}[] | undefined;
|
|
250
|
+
backend?: "job" | "sandbox-cr" | undefined;
|
|
251
|
+
}>;
|
|
252
|
+
export type KubernetesProviderConfig = z.infer<typeof kubernetesProviderConfigSchema>;
|
|
253
|
+
export declare function parseKubernetesProviderConfig(input: unknown): KubernetesProviderConfig;
|
|
254
|
+
export interface KubernetesLeaseMetadata {
|
|
255
|
+
namespace: string;
|
|
256
|
+
/** Name of the workload resource (Job name for job backend, Sandbox CR name for sandbox-cr backend). */
|
|
257
|
+
jobName: string;
|
|
258
|
+
podName: string | null;
|
|
259
|
+
secretName: string;
|
|
260
|
+
phase: "Pending" | "Running" | "Succeeded" | "Failed";
|
|
261
|
+
/** Which backend provisioned this lease. */
|
|
262
|
+
backend: "sandbox-cr" | "job";
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6BvC;;;;;OAKG;;IAQH;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;IAGH;;;;;;;;;;;OAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASJ,CAAC;AAEJ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,wBAAwB,CAEtF;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,wGAAwG;IACxG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtD,4CAA4C;IAC5C,OAAO,EAAE,YAAY,GAAG,KAAK,CAAC;CAC/B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { adapterRegistrySchema } from "./adapter-registry.js";
|
|
3
|
+
import { KNOWN_ADAPTER_TYPES } from "./adapter-defaults.js";
|
|
4
|
+
const cidrRegex = /^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$/;
|
|
5
|
+
export const kubernetesProviderConfigSchema = z
|
|
6
|
+
.object({
|
|
7
|
+
inCluster: z.boolean().default(false),
|
|
8
|
+
kubeconfig: z.string().optional(),
|
|
9
|
+
namespacePrefix: z.string().regex(/^[a-z0-9-]{1,32}$/).default("paperclip-"),
|
|
10
|
+
companySlug: z.string().regex(/^[a-z0-9-]{1,32}$/).optional(),
|
|
11
|
+
imageRegistry: z.string().url().optional(),
|
|
12
|
+
imageAllowList: z.array(z.string()).default([]),
|
|
13
|
+
imagePullSecrets: z.array(z.string()).default([]),
|
|
14
|
+
egressAllowFqdns: z.array(z.string()).default([]),
|
|
15
|
+
egressAllowCidrs: z.array(z.string().regex(cidrRegex, "Invalid CIDR")).default([]),
|
|
16
|
+
egressMode: z.enum(["cilium", "standard"]).default("standard"),
|
|
17
|
+
defaultResources: z
|
|
18
|
+
.object({
|
|
19
|
+
requests: z.object({ cpu: z.string(), memory: z.string() }).partial().optional(),
|
|
20
|
+
limits: z.object({ cpu: z.string(), memory: z.string() }).partial().optional(),
|
|
21
|
+
})
|
|
22
|
+
.optional(),
|
|
23
|
+
runtimeClassName: z.string().optional(),
|
|
24
|
+
serviceAccountAnnotations: z.record(z.string()).default({}),
|
|
25
|
+
jobTtlSecondsAfterFinished: z.number().int().nonnegative().default(900),
|
|
26
|
+
podActivityDeadlineSec: z.number().int().positive().default(3600),
|
|
27
|
+
/**
|
|
28
|
+
* The adapter type that Jobs in this environment will run.
|
|
29
|
+
* Each Kubernetes environment is bound to one adapter; create multiple
|
|
30
|
+
* environments for different adapters.
|
|
31
|
+
* Defaults to `"claude_local"`.
|
|
32
|
+
*/
|
|
33
|
+
adapterType: z
|
|
34
|
+
.string()
|
|
35
|
+
.default("claude_local")
|
|
36
|
+
.refine((v) => KNOWN_ADAPTER_TYPES.has(v), {
|
|
37
|
+
message: "adapterType must be one of the known adapter types",
|
|
38
|
+
}),
|
|
39
|
+
/**
|
|
40
|
+
* Optional declarative adapter registry. When present it is authoritative
|
|
41
|
+
* for runtime image / envKeys / allowFqdns / probe / defaultEnv resolution
|
|
42
|
+
* (replace semantics). Absent = built-in defaults.
|
|
43
|
+
*/
|
|
44
|
+
adapters: adapterRegistrySchema.optional(),
|
|
45
|
+
/**
|
|
46
|
+
* The sandbox backend to use.
|
|
47
|
+
*
|
|
48
|
+
* - `"sandbox-cr"` (default, alpha) — uses the kubernetes-sigs/agent-sandbox
|
|
49
|
+
* Sandbox CRD (agents.x-k8s.io/v1alpha1). Creates a long-lived pod that
|
|
50
|
+
* paperclip-server can exec into for multi-command adapter-install workflows.
|
|
51
|
+
* Requires the agent-sandbox controller to be installed in the cluster.
|
|
52
|
+
*
|
|
53
|
+
* - `"job"` — uses batch/v1 Job (stable fallback). One-shot entrypoint; does
|
|
54
|
+
* NOT support multi-command exec. Use this for clusters without agent-sandbox
|
|
55
|
+
* installed, or when you need stable (non-alpha) k8s APIs.
|
|
56
|
+
*/
|
|
57
|
+
backend: z.enum(["sandbox-cr", "job"]).default("sandbox-cr"),
|
|
58
|
+
})
|
|
59
|
+
.refine((cfg) => cfg.inCluster || cfg.kubeconfig, {
|
|
60
|
+
message: "kubernetes provider requires one of `inCluster` or `kubeconfig`",
|
|
61
|
+
});
|
|
62
|
+
export function parseKubernetesProviderConfig(input) {
|
|
63
|
+
return kubernetesProviderConfigSchema.parse(input);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface InterceptStateFlush {
|
|
2
|
+
/** Final target path on the remote (decoded payload goes here). */
|
|
3
|
+
targetPath: string;
|
|
4
|
+
/** Decoded payload bytes. */
|
|
5
|
+
payload: Buffer;
|
|
6
|
+
}
|
|
7
|
+
export type InterceptDecision =
|
|
8
|
+
/** Pattern recognized; respond with success without running the command. */
|
|
9
|
+
{
|
|
10
|
+
action: "ack";
|
|
11
|
+
reason: string;
|
|
12
|
+
}
|
|
13
|
+
/** Pattern recognized; flush via single exec. Caller does the exec. */
|
|
14
|
+
| {
|
|
15
|
+
action: "flush";
|
|
16
|
+
flush: InterceptStateFlush;
|
|
17
|
+
}
|
|
18
|
+
/** Pattern not recognized; pass through to the normal exec path. */
|
|
19
|
+
| {
|
|
20
|
+
action: "passthrough";
|
|
21
|
+
reason: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Stateful interceptor. Keyed by the base64 temp path (`<TARGET>.paperclip-upload.b64`).
|
|
25
|
+
* One instance per plugin worker is fine — concurrent uploads to different paths
|
|
26
|
+
* don't interfere.
|
|
27
|
+
*/
|
|
28
|
+
export declare class FastUploadInterceptor {
|
|
29
|
+
private buffers;
|
|
30
|
+
/**
|
|
31
|
+
* Inspect a single shell command (the literal argument to `sh -c <cmd>`).
|
|
32
|
+
* Returns the action the plugin should take.
|
|
33
|
+
*/
|
|
34
|
+
decide(command: string): InterceptDecision;
|
|
35
|
+
/**
|
|
36
|
+
* Drop all buffered state. Called on releaseLease so a new lease doesn't
|
|
37
|
+
* inherit stale buffers (lease IDs are unique so target paths shouldn't
|
|
38
|
+
* collide, but cleanup is hygiene).
|
|
39
|
+
*/
|
|
40
|
+
reset(): void;
|
|
41
|
+
/** Number of in-flight uploads being tracked. Mostly for tests / diagnostics. */
|
|
42
|
+
get pendingCount(): number;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=upload-interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-interceptor.d.ts","sourceRoot":"","sources":["../src/upload-interceptor.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB;AAC3B,4EAA4E;AAC1E;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnC,uEAAuE;GACrE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE;AACjD,oEAAoE;GAClE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAQ9C;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAkC;IAEjD;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IA+D1C;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAIb,iFAAiF;IACjF,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|