alasio 4.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.
Files changed (72) hide show
  1. package/dist/cli/src/cluster/docker.js +219 -0
  2. package/dist/cli/src/cluster/docker.js.map +1 -0
  3. package/dist/cli/src/cluster/local.js +392 -0
  4. package/dist/cli/src/cluster/local.js.map +1 -0
  5. package/dist/cli/src/commands/common.js +108 -0
  6. package/dist/cli/src/commands/common.js.map +1 -0
  7. package/dist/cli/src/commands/down.js +26 -0
  8. package/dist/cli/src/commands/down.js.map +1 -0
  9. package/dist/cli/src/commands/init.js +314 -0
  10. package/dist/cli/src/commands/init.js.map +1 -0
  11. package/dist/cli/src/commands/lake.js +33 -0
  12. package/dist/cli/src/commands/lake.js.map +1 -0
  13. package/dist/cli/src/commands/login.js +38 -0
  14. package/dist/cli/src/commands/login.js.map +1 -0
  15. package/dist/cli/src/commands/logs.js +27 -0
  16. package/dist/cli/src/commands/logs.js.map +1 -0
  17. package/dist/cli/src/commands/restart.js +23 -0
  18. package/dist/cli/src/commands/restart.js.map +1 -0
  19. package/dist/cli/src/commands/status.js +58 -0
  20. package/dist/cli/src/commands/status.js.map +1 -0
  21. package/dist/cli/src/commands/uninstall.js +47 -0
  22. package/dist/cli/src/commands/uninstall.js.map +1 -0
  23. package/dist/cli/src/commands/up.js +33 -0
  24. package/dist/cli/src/commands/up.js.map +1 -0
  25. package/dist/cli/src/commands/upgrade.js +50 -0
  26. package/dist/cli/src/commands/upgrade.js.map +1 -0
  27. package/dist/cli/src/commands.js +16 -0
  28. package/dist/cli/src/commands.js.map +1 -0
  29. package/dist/cli/src/config.js +169 -0
  30. package/dist/cli/src/config.js.map +1 -0
  31. package/dist/cli/src/images.js +7 -0
  32. package/dist/cli/src/images.js.map +1 -0
  33. package/dist/cli/src/install.js +39 -0
  34. package/dist/cli/src/install.js.map +1 -0
  35. package/dist/cli/src/kube/api.js +231 -0
  36. package/dist/cli/src/kube/api.js.map +1 -0
  37. package/dist/cli/src/kube/apply.js +98 -0
  38. package/dist/cli/src/kube/apply.js.map +1 -0
  39. package/dist/cli/src/kube/rollout.js +166 -0
  40. package/dist/cli/src/kube/rollout.js.map +1 -0
  41. package/dist/cli/src/main.js +30 -0
  42. package/dist/cli/src/main.js.map +1 -0
  43. package/dist/cli/src/manifests/agent-sandbox.js +89 -0
  44. package/dist/cli/src/manifests/agent-sandbox.js.map +1 -0
  45. package/dist/cli/src/manifests/alasio.js +367 -0
  46. package/dist/cli/src/manifests/alasio.js.map +1 -0
  47. package/dist/cli/src/manifests/common.js +157 -0
  48. package/dist/cli/src/manifests/common.js.map +1 -0
  49. package/dist/cli/src/manifests/config.js +283 -0
  50. package/dist/cli/src/manifests/config.js.map +1 -0
  51. package/dist/cli/src/manifests/index.js +20 -0
  52. package/dist/cli/src/manifests/index.js.map +1 -0
  53. package/dist/cli/src/manifests/lake.js +56 -0
  54. package/dist/cli/src/manifests/lake.js.map +1 -0
  55. package/dist/cli/src/manifests/neon.js +656 -0
  56. package/dist/cli/src/manifests/neon.js.map +1 -0
  57. package/dist/cli/src/manifests/network-policies.js +86 -0
  58. package/dist/cli/src/manifests/network-policies.js.map +1 -0
  59. package/dist/cli/src/manifests/object-store.js +204 -0
  60. package/dist/cli/src/manifests/object-store.js.map +1 -0
  61. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +6295 -0
  62. package/dist/cli/src/release.js +15 -0
  63. package/dist/cli/src/release.js.map +1 -0
  64. package/dist/cli/src/secrets.js +49 -0
  65. package/dist/cli/src/secrets.js.map +1 -0
  66. package/dist/cli/src/target.js +55 -0
  67. package/dist/cli/src/target.js.map +1 -0
  68. package/dist/cli/src/telegram.js +27 -0
  69. package/dist/cli/src/telegram.js.map +1 -0
  70. package/dist/src/kube/config.js +99 -0
  71. package/dist/src/kube/config.js.map +1 -0
  72. package/package.json +32 -0
@@ -0,0 +1,89 @@
1
+ import { given, NAMESPACE, RELEASE } from "./common.js";
2
+ import sandboxes from "./sandboxes.agents.x-k8s.io.json" with { type: "json" };
3
+ /**
4
+ * The Sandbox CRD, agents.x-k8s.io's `sandboxes`, as the API server takes it, whose
5
+ * schema's keys (`x-kubernetes-*`, say) are not client-node's model's.
6
+ */
7
+ export const SANDBOX_CRD = sandboxes;
8
+ const NAME = `${RELEASE}-agent-sandbox-controller`;
9
+ /** The labels of the controller's objects: the controller's name and version, the installation, and alasio as their manager. */
10
+ const LABELS = {
11
+ "app.kubernetes.io/name": "agent-sandbox-controller",
12
+ "app.kubernetes.io/instance": RELEASE,
13
+ "app.kubernetes.io/version": "v1.0.5",
14
+ "app.kubernetes.io/managed-by": "alasio",
15
+ };
16
+ /** The controller: its identity, what it may do (Sandboxes and their pods, volumes and Services, cluster-wide; its leader lease, here), and its Deployment. */
17
+ function controller(config) {
18
+ const { image, resources, nodeSelector, tolerations, affinity } = config.agentSandbox;
19
+ const serviceAccount = { apiVersion: "v1", kind: "ServiceAccount", metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS } };
20
+ const clusterRole = {
21
+ apiVersion: "rbac.authorization.k8s.io/v1",
22
+ kind: "ClusterRole",
23
+ metadata: { name: NAME, labels: LABELS },
24
+ rules: [
25
+ { apiGroups: [""], resources: ["persistentvolumeclaims", "pods", "services"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
26
+ { apiGroups: ["", "events.k8s.io"], resources: ["events"], verbs: ["create", "patch"] },
27
+ { apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
28
+ { apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes/finalizers", "sandboxes/status"], verbs: ["get", "patch", "update"] },
29
+ ],
30
+ };
31
+ const subjects = [{ kind: "ServiceAccount", name: NAME, namespace: NAMESPACE }];
32
+ const clusterRoleBinding = {
33
+ apiVersion: "rbac.authorization.k8s.io/v1",
34
+ kind: "ClusterRoleBinding",
35
+ metadata: { name: NAME, labels: LABELS },
36
+ subjects,
37
+ roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: NAME },
38
+ };
39
+ // Leader election's lease, in the controller's own namespace only.
40
+ const role = {
41
+ apiVersion: "rbac.authorization.k8s.io/v1",
42
+ kind: "Role",
43
+ metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
44
+ rules: [{ apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["create", "get", "list", "patch", "update", "watch"] }],
45
+ };
46
+ const roleBinding = {
47
+ apiVersion: "rbac.authorization.k8s.io/v1",
48
+ kind: "RoleBinding",
49
+ metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
50
+ subjects,
51
+ roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: NAME },
52
+ };
53
+ const deployment = {
54
+ apiVersion: "apps/v1",
55
+ kind: "Deployment",
56
+ metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
57
+ spec: {
58
+ replicas: 1,
59
+ selector: { matchLabels: { "app.kubernetes.io/name": "agent-sandbox-controller", "app.kubernetes.io/instance": RELEASE } },
60
+ template: {
61
+ metadata: { labels: LABELS },
62
+ spec: {
63
+ serviceAccountName: NAME,
64
+ securityContext: { runAsNonRoot: true, seccompProfile: { type: "RuntimeDefault" } },
65
+ containers: [{
66
+ name: "controller",
67
+ image: `${image.repository}:${image.tag}${image.digest ? `@${image.digest}` : ""}`,
68
+ imagePullPolicy: image.pullPolicy,
69
+ args: ["--leader-elect=true"],
70
+ ports: [{ name: "metrics", containerPort: 8080 }, { name: "healthz", containerPort: 8081 }],
71
+ livenessProbe: { httpGet: { path: "/healthz", port: "healthz" } },
72
+ readinessProbe: { httpGet: { path: "/readyz", port: "healthz" } },
73
+ securityContext: { allowPrivilegeEscalation: false, readOnlyRootFilesystem: true, runAsNonRoot: true, capabilities: { drop: ["ALL"] } },
74
+ resources,
75
+ }],
76
+ ...given("nodeSelector", { ...nodeSelector }),
77
+ ...given("tolerations", [...tolerations]),
78
+ ...given("affinity", affinity),
79
+ },
80
+ },
81
+ },
82
+ };
83
+ return [serviceAccount, clusterRole, clusterRoleBinding, role, roleBinding, deployment];
84
+ }
85
+ /** agent-sandbox's objects, unless the cluster already has it. */
86
+ export function agentSandboxObjects(config) {
87
+ return config.agentSandbox.enabled ? [SANDBOX_CRD, ...controller(config)] : [];
88
+ }
89
+ //# sourceMappingURL=agent-sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-sandbox.js","sourceRoot":"","sources":["../../../../src/manifests/agent-sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,367 @@
1
+ import { imageReference } from "../images.js";
2
+ import { componentName, databaseSecret, envOf, given, goJson, helperResources, hostVolumeMounts, hostVolumes, imagePullSecrets, labels, NAMESPACE, otelEnv, RELEASE, restrictedContainer, restrictedPod, selectorLabels, sha256, } from "./common.js";
3
+ /** The port every workspace's bayma serves MCP on. */
4
+ const BAYMA_PORT = 7290;
5
+ /** The namespaces whose Sandboxes alasio drives: the sessions', and the host profile's. */
6
+ function workspaceNamespaces(config) {
7
+ return [...(config.sessions.enabled ? [config.sessions.namespace] : []), ...(config.host.enabled ? [config.host.namespace] : [])];
8
+ }
9
+ /**
10
+ * The template of session filesystems' Sandboxes: an empty, isolated workspace under
11
+ * the sessions' runtime, restricted. alasio adds what is per Sandbox: its name and
12
+ * labels, bayma's token, and its network mode.
13
+ */
14
+ function sessionsProfile(config) {
15
+ const { sessions } = config;
16
+ const agent = imageReference(config.images.agent);
17
+ return {
18
+ namespace: sessions.namespace,
19
+ port: BAYMA_PORT,
20
+ workspaceDir: "/workspace",
21
+ egressGate: sessions.egressGate,
22
+ fullModeNameservers: [...sessions.fullModeNameservers],
23
+ podTemplate: {
24
+ metadata: { labels: { "app.kubernetes.io/part-of": "alasio", "app.kubernetes.io/instance": RELEASE, "app.kubernetes.io/component": "session" } },
25
+ spec: {
26
+ ...(sessions.runtimeClassName ? { runtimeClassName: sessions.runtimeClassName } : {}),
27
+ securityContext: restrictedPod(1000, 1000),
28
+ ...imagePullSecrets(config),
29
+ ...given("nodeSelector", { ...sessions.nodeSelector }),
30
+ ...given("tolerations", [...sessions.tolerations]),
31
+ initContainers: [
32
+ // The workspace and home on the session's volume, and bayma's toolbelt, which the
33
+ // image installs, linked into the home.
34
+ {
35
+ name: "prepare",
36
+ image: agent,
37
+ imagePullPolicy: config.images.pullPolicy,
38
+ command: [
39
+ "/bin/sh",
40
+ "-c",
41
+ "mkdir -p /data/workspace /data/home/.local/share/bayma && ln -sfn /opt/bayma-data/bayma/toolbelt /data/home/.local/share/bayma/toolbelt",
42
+ ],
43
+ securityContext: restrictedContainer(),
44
+ ...helperResources(),
45
+ volumeMounts: [{ name: "data", mountPath: "/data" }],
46
+ },
47
+ ],
48
+ containers: [{
49
+ name: "bayma",
50
+ image: agent,
51
+ imagePullPolicy: config.images.pullPolicy,
52
+ command: ["/usr/bin/tini", "-s", "--", "node", "/opt/bayma/bayma.js"],
53
+ args: ["mcp-http", "--host", "0.0.0.0", "--port", String(BAYMA_PORT), "--state-dir", "/home/agent/.bayma"],
54
+ workingDir: "/workspace",
55
+ env: [
56
+ { name: "HOME", value: "/home/agent" },
57
+ { name: "USER", value: "agent" },
58
+ { name: "BAYMA_PAYLOAD_DIR", value: "/opt/bayma/payload" },
59
+ ],
60
+ ports: [{ name: "mcp", containerPort: BAYMA_PORT }],
61
+ securityContext: restrictedContainer(),
62
+ resources: sessions.resources,
63
+ volumeMounts: [
64
+ { name: "data", mountPath: "/workspace", subPath: "workspace" },
65
+ { name: "data", mountPath: "/home/agent", subPath: "home" },
66
+ { name: "tmp", mountPath: "/tmp" },
67
+ ],
68
+ }],
69
+ volumes: [{ name: "tmp", emptyDir: { sizeLimit: "2Gi" } }],
70
+ },
71
+ },
72
+ volumeClaimTemplates: [{
73
+ metadata: { name: "data" },
74
+ spec: {
75
+ accessModes: ["ReadWriteOnce"],
76
+ ...(sessions.storage.storageClassName ? { storageClassName: sessions.storage.storageClassName } : {}),
77
+ resources: { requests: { storage: sessions.storage.size } },
78
+ },
79
+ }],
80
+ };
81
+ }
82
+ /** The template of folder workspaces' bayma: bayma itself, as the operator, with the machine's mounts. */
83
+ function hostProfile(config) {
84
+ const { host } = config;
85
+ return {
86
+ namespace: host.namespace,
87
+ port: BAYMA_PORT,
88
+ stateRoot: host.stateRoot,
89
+ podTemplate: {
90
+ metadata: { labels: { "app.kubernetes.io/part-of": "alasio", "app.kubernetes.io/instance": RELEASE, "app.kubernetes.io/component": "folder-bayma" } },
91
+ spec: {
92
+ // May restart alasio, by rolling out its Deployment, as an agent restarts it.
93
+ serviceAccountName: componentName("host-agent"),
94
+ securityContext: {
95
+ runAsUser: host.uid,
96
+ runAsGroup: host.gid,
97
+ // The group the bayma token's Secret volume is given, which the operator's user
98
+ // reads it as; the node's own paths the mounts give are left as they are.
99
+ fsGroup: host.gid,
100
+ ...given("supplementalGroups", [...host.supplementalGroups]),
101
+ },
102
+ ...imagePullSecrets(config),
103
+ containers: [{
104
+ name: "bayma",
105
+ image: imageReference(host.baymaImage),
106
+ imagePullPolicy: "IfNotPresent",
107
+ args: ["mcp-http", "--host", "0.0.0.0", "--port", String(BAYMA_PORT), "--default-durability", "checkpointed"],
108
+ workingDir: host.home,
109
+ env: [{ name: "HOME", value: host.home }, ...envOf(host.env)],
110
+ ports: [{ name: "mcp", containerPort: BAYMA_PORT }],
111
+ securityContext: {
112
+ // What bayma needs to snapshot its REPL sessions' processes as it stops and
113
+ // restore them whole as it starts again.
114
+ capabilities: { add: ["CHECKPOINT_RESTORE", "SYS_PTRACE"] },
115
+ seccompProfile: { type: "Unconfined" },
116
+ appArmorProfile: { type: "Unconfined" },
117
+ },
118
+ resources: host.resources,
119
+ ...given("volumeMounts", hostVolumeMounts(config)),
120
+ }],
121
+ ...given("volumes", hostVolumes(config)),
122
+ },
123
+ },
124
+ };
125
+ }
126
+ /** The ConfigMap of the templates, and their checksum, which alasio's pod carries so it is replaced when they change. */
127
+ function sandboxTemplates(config) {
128
+ const name = componentName("sandbox-templates");
129
+ const templates = goJson({ ...(config.sessions.enabled ? { sessions: sessionsProfile(config) } : {}), ...(config.host.enabled ? { host: hostProfile(config) } : {}) }, " ");
130
+ return {
131
+ configMap: { apiVersion: "v1", kind: "ConfigMap", metadata: { name, namespace: NAMESPACE, labels: labels("alasio") }, data: { "templates.json": templates } },
132
+ checksum: sha256(templates),
133
+ };
134
+ }
135
+ /** alasio's environment: where its templates, state, database and receiver are, and what the configuration adds. */
136
+ function alasioEnv(config, home) {
137
+ const { alasio, host } = config;
138
+ return [
139
+ { name: "ALASIO_KUBE_TEMPLATES", value: "/etc/alasio/templates.json" },
140
+ { name: "ALASIO_STATE_DIR", value: "/var/lib/alasio/state" },
141
+ { name: "HOME", value: home },
142
+ { name: "ALASIO_DEPLOYMENT", value: RELEASE },
143
+ { name: "ALASIO_NAMESPACE", valueFrom: { fieldRef: { fieldPath: "metadata.namespace" } } },
144
+ { name: "TELEGRAM_BOT_TOKEN", valueFrom: { secretKeyRef: { name: alasio.telegram.existingSecret, key: "token" } } },
145
+ { name: "TELEGRAM_ALLOWED_USER_IDS", valueFrom: { secretKeyRef: { name: alasio.telegram.existingSecret, key: "allowedUserIds" } } },
146
+ { name: "ALASIO_DATABASE_URL_FILE", value: "/run/alasio/database/url" },
147
+ { name: "ALASIO_LAKE_PASSWORD_FILE", value: "/run/alasio/database/lake-password" },
148
+ { name: "ALASIO_LAKE_ENABLED", value: config.lake.enabled && config.neon.enabled ? "1" : "0" },
149
+ { name: "ALASIO_TELEMETRY_RECEIVER_SERVICE", value: `${componentName("telemetry")}.${NAMESPACE}.svc` },
150
+ { name: "ALASIO_TELEMETRY_RECEIVER_PORT", value: String(config.telemetry.receiverPort) },
151
+ ...(alasio.defaultHarness ? [{ name: "ALASIO_DEFAULT_HARNESS", value: alasio.defaultHarness }] : []),
152
+ ...(host.enabled && host.workspaceRoot ? [{ name: "ALASIO_WORKSPACE_ROOT", value: host.workspaceRoot }] : []),
153
+ ...(alasio.claude.existingSecret
154
+ ? [{ name: "CLAUDE_CODE_OAUTH_TOKEN", valueFrom: { secretKeyRef: { name: alasio.claude.existingSecret, key: alasio.claude.key } } }]
155
+ : []),
156
+ ...otelEnv(config),
157
+ ...envOf(alasio.env),
158
+ ];
159
+ }
160
+ /**
161
+ * alasio's Deployment: one replica, as one Telegram poller and one SQLite writer, so an
162
+ * update stops the old pod before the new one starts. Under the host profile it runs as
163
+ * the operator, in their home, with the machine's mounts.
164
+ */
165
+ function deployment(config, templatesChecksum) {
166
+ const { alasio, host } = config;
167
+ const home = host.enabled && host.alasioHome ? host.home : "/var/lib/alasio/home";
168
+ const uid = host.enabled ? host.uid : alasio.runAsUser;
169
+ const gid = host.enabled ? host.gid : alasio.runAsGroup;
170
+ const groups = [...new Set([...alasio.supplementalGroups, ...(host.enabled ? host.supplementalGroups : [])])];
171
+ const image = imageReference(config.images.alasio);
172
+ return {
173
+ apiVersion: "apps/v1",
174
+ kind: "Deployment",
175
+ metadata: { name: RELEASE, namespace: NAMESPACE, labels: labels("alasio") },
176
+ spec: {
177
+ replicas: 1,
178
+ strategy: { type: "Recreate" },
179
+ selector: { matchLabels: selectorLabels("alasio") },
180
+ template: {
181
+ metadata: { labels: labels("alasio"), annotations: { "checksum/sandbox-templates": templatesChecksum } },
182
+ spec: {
183
+ serviceAccountName: RELEASE,
184
+ // alasio finishes its turns' bookkeeping and records what it interrupts as it stops.
185
+ terminationGracePeriodSeconds: 60,
186
+ securityContext: { ...restrictedPod(uid, gid), ...given("supplementalGroups", groups) },
187
+ ...imagePullSecrets(config),
188
+ initContainers: [
189
+ // alasio's state directory and, unless it is the operator's, its home, on its volume.
190
+ {
191
+ name: "prepare",
192
+ image,
193
+ imagePullPolicy: config.images.pullPolicy,
194
+ command: ["mkdir", "-p", "/var/lib/alasio/state", "/var/lib/alasio/home"],
195
+ securityContext: restrictedContainer(),
196
+ ...helperResources(),
197
+ volumeMounts: [{ name: "state", mountPath: "/var/lib/alasio" }],
198
+ },
199
+ ],
200
+ containers: [{
201
+ name: "alasio",
202
+ image,
203
+ imagePullPolicy: config.images.pullPolicy,
204
+ workingDir: home,
205
+ env: alasioEnv(config, home),
206
+ ...given("envFrom", [...alasio.envFrom]),
207
+ ports: [{ name: "telemetry", containerPort: config.telemetry.receiverPort }],
208
+ securityContext: restrictedContainer(),
209
+ resources: alasio.resources,
210
+ volumeMounts: [
211
+ { name: "state", mountPath: "/var/lib/alasio" },
212
+ { name: "templates", mountPath: "/etc/alasio", readOnly: true },
213
+ { name: "database", mountPath: "/run/alasio/database", readOnly: true },
214
+ ...(host.enabled ? hostVolumeMounts(config) : []),
215
+ ],
216
+ }],
217
+ volumes: [
218
+ { name: "state", persistentVolumeClaim: { claimName: alasio.persistence.existingClaim || RELEASE } },
219
+ { name: "templates", configMap: { name: componentName("sandbox-templates") } },
220
+ {
221
+ name: "database",
222
+ secret: { secretName: databaseSecret(config), items: [{ key: "url", path: "url" }, { key: "lake-password", path: "lake-password" }] },
223
+ },
224
+ ...(host.enabled ? hostVolumes(config) : []),
225
+ ],
226
+ ...given("nodeSelector", { ...alasio.nodeSelector }),
227
+ ...given("tolerations", [...alasio.tolerations]),
228
+ ...given("affinity", alasio.affinity),
229
+ },
230
+ },
231
+ },
232
+ };
233
+ }
234
+ /** alasio's volume, unless the configuration names an existing claim. */
235
+ function volume(config) {
236
+ const { persistence } = config.alasio;
237
+ if (persistence.existingClaim)
238
+ return [];
239
+ return [{
240
+ apiVersion: "v1",
241
+ kind: "PersistentVolumeClaim",
242
+ metadata: { name: RELEASE, namespace: NAMESPACE, labels: labels("alasio") },
243
+ spec: {
244
+ accessModes: ["ReadWriteOnce"],
245
+ ...(persistence.storageClassName ? { storageClassName: persistence.storageClassName } : {}),
246
+ resources: { requests: { storage: persistence.size } },
247
+ },
248
+ }];
249
+ }
250
+ /** Where session sandboxes export their telemetry: alasio's receiver. */
251
+ function telemetryService(config) {
252
+ return {
253
+ apiVersion: "v1",
254
+ kind: "Service",
255
+ metadata: { name: componentName("telemetry"), namespace: NAMESPACE, labels: labels("alasio") },
256
+ spec: { selector: selectorLabels("alasio"), ports: [{ name: "otlp-http", port: config.telemetry.receiverPort, targetPort: "telemetry" }] },
257
+ };
258
+ }
259
+ /**
260
+ * The namespaces workspaces run in, which alasio makes unless told not to. Sessions'
261
+ * enforces Pod Security "restricted": nothing privileged, no host paths, no added
262
+ * capabilities. The host profile's is "privileged", as its pods mount the machine.
263
+ */
264
+ function namespaces(config) {
265
+ const { sessions, host } = config;
266
+ return [
267
+ ...(sessions.enabled && sessions.createNamespace
268
+ ? [{
269
+ apiVersion: "v1",
270
+ kind: "Namespace",
271
+ metadata: {
272
+ name: sessions.namespace,
273
+ labels: {
274
+ ...labels("session"),
275
+ "pod-security.kubernetes.io/enforce": "restricted",
276
+ "pod-security.kubernetes.io/enforce-version": "latest",
277
+ "pod-security.kubernetes.io/warn": "restricted",
278
+ },
279
+ },
280
+ }]
281
+ : []),
282
+ ...(host.enabled && host.createNamespace
283
+ ? [{
284
+ apiVersion: "v1",
285
+ kind: "Namespace",
286
+ metadata: { name: host.namespace, labels: { ...labels("folder-bayma"), "pod-security.kubernetes.io/enforce": "privileged" } },
287
+ }]
288
+ : []),
289
+ ];
290
+ }
291
+ /**
292
+ * alasio's identity: it drives its workspaces' Sandboxes, their token Secrets, and reads
293
+ * files from sessions through exec, in the namespaces it owns, and nothing else.
294
+ */
295
+ function identity(config) {
296
+ const serviceAccount = { apiVersion: "v1", kind: "ServiceAccount", metadata: { name: RELEASE, namespace: NAMESPACE, labels: labels("alasio") } };
297
+ return [
298
+ serviceAccount,
299
+ ...workspaceNamespaces(config).flatMap((namespace) => {
300
+ const metadata = { name: RELEASE, namespace, labels: labels("alasio") };
301
+ const role = {
302
+ apiVersion: "rbac.authorization.k8s.io/v1",
303
+ kind: "Role",
304
+ metadata,
305
+ rules: [
306
+ { apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes"], verbs: ["get", "list", "watch", "create", "patch", "delete"] },
307
+ { apiGroups: [""], resources: ["secrets"], verbs: ["get", "create"] },
308
+ { apiGroups: [""], resources: ["pods"], verbs: ["get"] },
309
+ { apiGroups: [""], resources: ["pods/exec"], verbs: ["create", "get"] },
310
+ ],
311
+ };
312
+ const binding = {
313
+ apiVersion: "rbac.authorization.k8s.io/v1",
314
+ kind: "RoleBinding",
315
+ metadata,
316
+ subjects: [{ kind: "ServiceAccount", name: RELEASE, namespace: NAMESPACE }],
317
+ roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: RELEASE },
318
+ };
319
+ return [role, binding];
320
+ }),
321
+ ...(config.host.enabled ? hostAgentIdentity(config) : []),
322
+ ];
323
+ }
324
+ /**
325
+ * Folder workspaces' bayma: the operator's agents, which may restart alasio as they
326
+ * would restart it on the machine, by rolling out its Deployment, and do nothing else
327
+ * with the cluster.
328
+ */
329
+ function hostAgentIdentity(config) {
330
+ const agent = componentName("host-agent");
331
+ const restart = componentName("restart");
332
+ const serviceAccount = {
333
+ apiVersion: "v1",
334
+ kind: "ServiceAccount",
335
+ metadata: { name: agent, namespace: config.host.namespace, labels: labels("folder-bayma") },
336
+ };
337
+ const role = {
338
+ apiVersion: "rbac.authorization.k8s.io/v1",
339
+ kind: "Role",
340
+ metadata: { name: restart, namespace: NAMESPACE, labels: labels("folder-bayma") },
341
+ rules: [
342
+ { apiGroups: ["apps"], resources: ["deployments"], resourceNames: [RELEASE], verbs: ["get", "patch"] },
343
+ { apiGroups: ["apps"], resources: ["replicasets"], verbs: ["get", "list", "watch"] },
344
+ ],
345
+ };
346
+ const binding = {
347
+ apiVersion: "rbac.authorization.k8s.io/v1",
348
+ kind: "RoleBinding",
349
+ metadata: { name: restart, namespace: NAMESPACE, labels: labels("folder-bayma") },
350
+ subjects: [{ kind: "ServiceAccount", name: agent, namespace: config.host.namespace }],
351
+ roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: restart },
352
+ };
353
+ return [serviceAccount, role, binding];
354
+ }
355
+ /** alasio's objects. */
356
+ export function alasioObjects(config) {
357
+ const templates = sandboxTemplates(config);
358
+ return [
359
+ ...namespaces(config),
360
+ ...identity(config),
361
+ templates.configMap,
362
+ ...volume(config),
363
+ deployment(config, templates.checksum),
364
+ telemetryService(config),
365
+ ];
366
+ }
367
+ //# sourceMappingURL=alasio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alasio.js","sourceRoot":"","sources":["../../../../src/manifests/alasio.ts"],"names":[],"mappings":"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"}