alasio 4.2.1 → 5.0.1

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 (63) hide show
  1. package/dist/cli/src/branches.js +295 -0
  2. package/dist/cli/src/branches.js.map +1 -0
  3. package/dist/cli/src/commands/branch.js +114 -0
  4. package/dist/cli/src/commands/branch.js.map +1 -0
  5. package/dist/cli/src/commands/common.js +27 -8
  6. package/dist/cli/src/commands/common.js.map +1 -1
  7. package/dist/cli/src/commands/grafana.js +72 -0
  8. package/dist/cli/src/commands/grafana.js.map +1 -0
  9. package/dist/cli/src/commands/init.js +6 -5
  10. package/dist/cli/src/commands/init.js.map +1 -1
  11. package/dist/cli/src/commands/lake.js +18 -4
  12. package/dist/cli/src/commands/lake.js.map +1 -1
  13. package/dist/cli/src/commands/login.js +12 -7
  14. package/dist/cli/src/commands/login.js.map +1 -1
  15. package/dist/cli/src/commands/logs.js +12 -6
  16. package/dist/cli/src/commands/logs.js.map +1 -1
  17. package/dist/cli/src/commands/uninstall.js +16 -1
  18. package/dist/cli/src/commands/uninstall.js.map +1 -1
  19. package/dist/cli/src/commands.js +3 -1
  20. package/dist/cli/src/commands.js.map +1 -1
  21. package/dist/cli/src/kube/api.js +35 -2
  22. package/dist/cli/src/kube/api.js.map +1 -1
  23. package/dist/cli/src/kube/apply.js +21 -8
  24. package/dist/cli/src/kube/apply.js.map +1 -1
  25. package/dist/cli/src/manifests/alasio.js +143 -74
  26. package/dist/cli/src/manifests/alasio.js.map +1 -1
  27. package/dist/cli/src/manifests/branch.js +45 -0
  28. package/dist/cli/src/manifests/branch.js.map +1 -0
  29. package/dist/cli/src/manifests/collector.js +199 -0
  30. package/dist/cli/src/manifests/collector.js.map +1 -0
  31. package/dist/cli/src/manifests/common.js +44 -11
  32. package/dist/cli/src/manifests/common.js.map +1 -1
  33. package/dist/cli/src/manifests/config.js +33 -19
  34. package/dist/cli/src/manifests/config.js.map +1 -1
  35. package/dist/cli/src/manifests/grafana.js +81 -0
  36. package/dist/cli/src/manifests/grafana.js.map +1 -0
  37. package/dist/cli/src/manifests/index.js +6 -1
  38. package/dist/cli/src/manifests/index.js.map +1 -1
  39. package/dist/cli/src/manifests/lake.js +66 -18
  40. package/dist/cli/src/manifests/lake.js.map +1 -1
  41. package/dist/cli/src/manifests/neon.js +29 -157
  42. package/dist/cli/src/manifests/neon.js.map +1 -1
  43. package/dist/cli/src/manifests/network-policies.js +141 -38
  44. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  45. package/dist/cli/src/manifests/object-store.js +17 -7
  46. package/dist/cli/src/manifests/object-store.js.map +1 -1
  47. package/dist/cli/src/manifests/workspace-storage.js +98 -29
  48. package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
  49. package/dist/cli/src/release.js +6 -5
  50. package/dist/cli/src/release.js.map +1 -1
  51. package/dist/neon/control/branches.js +307 -0
  52. package/dist/neon/control/branches.js.map +1 -0
  53. package/dist/neon/control/jwt.js +58 -0
  54. package/dist/neon/control/jwt.js.map +1 -0
  55. package/dist/neon/control/scram.js +15 -0
  56. package/dist/neon/control/scram.js.map +1 -0
  57. package/dist/neon/control/secrets.js +111 -0
  58. package/dist/neon/control/secrets.js.map +1 -0
  59. package/dist/src/branch/names.js +18 -0
  60. package/dist/src/branch/names.js.map +1 -0
  61. package/dist/src/kube/config.js +14 -1
  62. package/dist/src/kube/config.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Branch environments (./manifests/branch.ts), as alasio's command line makes, lists and
3
+ * deletes them (./commands/branch.ts).
4
+ *
5
+ * A branch is made at main's database's current WAL position, so it holds every commit
6
+ * main has made: a branch of Neon's at that position, by neon-control, and the branch's
7
+ * objects on it, with Secrets of its own: credentials of its own for what it runs (the
8
+ * password of alasio's role on its compute, which neon-control gives the role there, the
9
+ * lake's role's, which its alasio gives it, and its compute's token, which fetches its
10
+ * spec alone), none of which reaches main's compute or another branch's; its bot's;
11
+ * Claude Code's token when main has one; the pull Secrets of its images; and its token to
12
+ * ask main to fork with. Its lake has main's object store identity, as it reads main's
13
+ * files where they are (one data path: DuckLake keeps every file's path relative to it),
14
+ * and SeaweedFS's Write, which writing needs, deletes too. neon-control is called
15
+ * in its own pod, as the API server's service proxy drops the Authorization header it
16
+ * authenticates its callers by, which neon-control would read a token from.
17
+ *
18
+ * A branch is deleted in the order nothing of it outlives what it runs on: its alasio and
19
+ * lake stopped, its Sandboxes and their claims deleted (JuiceFS keeps every chunk main
20
+ * still uses), its compute stopped, its branch of Neon's deleted, and its namespaces with
21
+ * all that is left in them.
22
+ */
23
+ import { randomBytes } from "node:crypto";
24
+ import { Console, Effect, Predicate, Redacted, Result, Schedule, Schema } from "effect";
25
+ import { nameProblem, tokenSha256 } from "../../neon/control/branches.js";
26
+ import { scramVerifier } from "../../neon/control/scram.js";
27
+ import { branchNamespace, branchSessionsNamespace, forkToken } from "../../src/branch/names.js";
28
+ import { installConfigOf, OperatorConfigError } from "./config.js";
29
+ import { runIn, runningPod, runningPodIn } from "./commands/common.js";
30
+ import { hasStatus, kind, KubeApi, refOf } from "./kube/api.js";
31
+ import { applyObjects } from "./kube/apply.js";
32
+ import { awaitGone, awaitReclaimed, readiness, selectorOf } from "./kube/rollout.js";
33
+ import { branchObjects } from "./manifests/branch.js";
34
+ import { BRANCH_FORK_SECRET, BRANCH_LABEL, componentName, NAMESPACE, neonName, RELEASE, selectorLabels } from "./manifests/common.js";
35
+ import { CLAUDE_SECRET, readClaudeToken, readTelegramBot, TELEGRAM_SECRET } from "./secrets.js";
36
+ /** A branch environment alasio will not make or delete now, and why, as the operator is told. */
37
+ export class BranchRefused extends Schema.TaggedError()("BranchRefused", {
38
+ message: Schema.String,
39
+ }) {
40
+ }
41
+ const SECRET = kind("Secret");
42
+ const NAMESPACE_KIND = kind("Namespace");
43
+ const DEPLOYMENT = kind("Deployment");
44
+ const POD = kind("Pod");
45
+ /** The labels of the Secrets alasio writes for the branch `name`. */
46
+ const branchSecretLabels = (name) => ({ "app.kubernetes.io/managed-by": "alasio", "app.kubernetes.io/part-of": "alasio", [BRANCH_LABEL]: name });
47
+ /** The value of `key` of the Secret `name` of main's, or null. */
48
+ const mainSecret = (name, key) => Effect.flatMap(KubeApi, (kube) => kube.get({ ...SECRET, namespace: NAMESPACE, name })).pipe(Effect.map((found) => {
49
+ const encoded = found?.data?.[key];
50
+ return encoded === undefined ? null : Buffer.from(encoded, "base64").toString("utf8");
51
+ }));
52
+ /** A Secret of main's, which the stack's setup makes; the branch is refused when there is none, as Neon has not run yet. */
53
+ const requiredSecret = (name, key) => Effect.flatMap(mainSecret(name, key), (value) => value === null ? Effect.fail(new BranchRefused({ message: `alasio's Secret ${name} has no ${key}: alasio up makes it` })) : Effect.succeed(value));
54
+ /** What a command run in a pod came to, refused unless it exited with 0. */
55
+ const succeeded = (what) => (ran) => ran.exitCode === 0 ? Effect.succeed(ran.stdout) : Effect.fail(new BranchRefused({ message: `${what} failed (exit ${ran.exitCode}): ${ran.stderr.trim() || ran.stdout.trim()}` }));
56
+ /**
57
+ * Calls neon-control's API (neon/control/service.ts) in its pod, with the stack's admin
58
+ * token (the `alasio-branches` Secret's), which goes on stdin, never on a command line.
59
+ */
60
+ function neonControl(method, path, body) {
61
+ return Effect.gen(function* () {
62
+ const token = yield* requiredSecret(componentName("branches"), "control-token");
63
+ const pod = yield* runningPod("neon-control");
64
+ const command = [
65
+ "curl", "-sS", "-X", method, "-H", "@-",
66
+ ...(body === undefined ? [] : ["-H", "content-type: application/json", "--data-binary", JSON.stringify(body)]),
67
+ "-w", "\n%{http_code}", `http://127.0.0.1:8080${path}`,
68
+ ];
69
+ const answered = yield* runIn({ namespace: NAMESPACE, pod, container: "neon-control" }, command, `authorization: Bearer ${token}\n`).pipe(Effect.flatMap(succeeded("calling neon-control")));
70
+ const lines = answered.trimEnd().split("\n");
71
+ const status = Number(lines.pop());
72
+ const text = lines.join("\n");
73
+ const parsed = text ? JSON.parse(text) : null;
74
+ return { status, body: parsed };
75
+ });
76
+ }
77
+ /** What neon-control says of a refusal: its error, or its status. */
78
+ const refusalOf = (answer) => Predicate.hasProperty(answer.body, "error") ? String(answer.body.error) : `it answered ${answer.status}`;
79
+ /** Neon's branches but main, as neon-control lists them. */
80
+ const neonBranches = Effect.gen(function* () {
81
+ const answer = yield* neonControl("GET", "/branches");
82
+ if (answer.status !== 200 || !answer.body)
83
+ return yield* new BranchRefused({ message: `neon-control did not list Neon's branches: ${refusalOf(answer)}` });
84
+ return answer.body.branches.filter(({ parent }) => parent !== null);
85
+ });
86
+ /** Runs `sql` as the compute's own superuser, in its pod: what psql printed of its one value. */
87
+ const onCompute = (namespace, pod, sql) => runIn({ namespace, pod, container: "compute" }, ["psql", "-h", "127.0.0.1", "-p", "55433", "-U", "cloud_admin", "-d", "alasio", "-Atc", sql]).pipe(Effect.flatMap(succeeded(`asking the compute in ${namespace}`)), Effect.map((printed) => printed.trim()));
88
+ /** A memory quantity, in bytes. */
89
+ export function memoryBytes(quantity) {
90
+ const match = /^([0-9.]+)([KMGTPE]i?|k|m)?$/u.exec(quantity.trim());
91
+ if (!match)
92
+ return 0;
93
+ const units = { k: 1e3, K: 1e3, M: 1e6, G: 1e9, T: 1e12, P: 1e15, E: 1e18, Ki: 2 ** 10, Mi: 2 ** 20, Gi: 2 ** 30, Ti: 2 ** 40, Pi: 2 ** 50, Ei: 2 ** 60, m: 1e-3 };
94
+ return Number(match[1]) * (match[2] ? units[match[2]] ?? 1 : 1);
95
+ }
96
+ /** `bytes`, as people read an amount of memory. */
97
+ export function memoryText(bytes) {
98
+ return bytes >= 2 ** 30 ? `${(bytes / 2 ** 30).toFixed(1)} GiB` : `${Math.round(bytes / 2 ** 20)} MiB`;
99
+ }
100
+ /** The containers of main's pods a branch environment runs none of: the lake's query endpoint, as a branch has no Grafana. */
101
+ const UNBRANCHED_CONTAINERS = ["query"];
102
+ /** The memory `of` uses now; of a pod, that of the containers a branch runs its own of. */
103
+ const used = (of) => of.containers
104
+ ? of.containers.filter(({ name }) => !UNBRANCHED_CONTAINERS.includes(name ?? "")).reduce((sum, container) => sum + memoryBytes(container.usage?.memory ?? "0"), 0)
105
+ : memoryBytes(of.usage?.memory ?? "0");
106
+ /** The components a branch environment runs its own of. */
107
+ const BRANCHED_COMPONENTS = ["alasio", "neon-compute", "lake"];
108
+ /** What `measure` lists, or null where the cluster has no metrics server to answer. */
109
+ const measured = (measure) => measure.pipe(Effect.catchIf((error) => error.status === 404 || error.status === 503, () => Effect.succeed(null)));
110
+ /** What a branch takes, as main's alasio, compute and lake use memory now, and the most a node has free. */
111
+ export const measureMemory = Effect.gen(function* () {
112
+ const kube = yield* KubeApi;
113
+ const pods = yield* measured(Effect.forEach(BRANCHED_COMPONENTS, (component) => kube.list(kind("PodMetrics"), { namespace: NAMESPACE, labelSelector: selectorOf(selectorLabels(component)) })));
114
+ const usage = yield* measured(kube.list(kind("NodeMetrics")));
115
+ if (!pods || !usage)
116
+ return null;
117
+ const nodes = yield* kube.list(kind("Node"));
118
+ const free = nodes.map((node) => memoryBytes(node.status?.allocatable?.["memory"] ?? "0") - used(usage.find(({ metadata }) => metadata?.name === node.metadata?.name) ?? {}));
119
+ return { branch: pods.flat().reduce((sum, pod) => sum + used(pod), 0), free: Math.max(0, ...free) };
120
+ });
121
+ /** `overrides` over `base`, objects merged key by key, anything else replaced. */
122
+ function merged(base, overrides) {
123
+ const result = { ...base };
124
+ for (const [key, value] of Object.entries(overrides)) {
125
+ const current = result[key];
126
+ result[key] = Predicate.isObject(value) && !Array.isArray(value) && Predicate.isObject(current) && !Array.isArray(current)
127
+ ? merged(current, value)
128
+ : value;
129
+ }
130
+ return result;
131
+ }
132
+ /**
133
+ * The install configuration of a branch environment: main's, with `overrides` (as the
134
+ * config's `install` holds settings), and without the host profile, whose folders a
135
+ * branch never works in.
136
+ */
137
+ export const branchConfig = Effect.fnUntraced(function* (config, overrides) {
138
+ const claude = (yield* readClaudeToken) !== null;
139
+ const install = merged(config.install, merged(overrides, { host: { enabled: false } }));
140
+ const decoded = installConfigOf(install, { claude });
141
+ if (Result.isFailure(decoded))
142
+ return yield* new OperatorConfigError({ path: config.path, reason: `with the branch's overrides, ${decoded.failure}` });
143
+ return decoded.success;
144
+ });
145
+ /** A Secret of the branch `name`'s, in its namespace. */
146
+ const branchSecret = (name, secret, data) => ({
147
+ apiVersion: "v1",
148
+ kind: "Secret",
149
+ metadata: { name: secret, namespace: branchNamespace(name), labels: branchSecretLabels(name) },
150
+ type: "Opaque",
151
+ data: Object.fromEntries(Object.entries(data).map(([key, value]) => [key, Buffer.from(value, "utf8").toString("base64")])),
152
+ });
153
+ /**
154
+ * A Secret of main's, as the branch `name` is given it, in its namespace: the same, as its
155
+ * copy of the data is; of its keys only `keys`, when given, what the branch uses.
156
+ */
157
+ const copiedSecret = Effect.fnUntraced(function* (name, secret, keys) {
158
+ const kube = yield* KubeApi;
159
+ const found = yield* kube.get({ ...SECRET, namespace: NAMESPACE, name: secret });
160
+ if (!found?.data)
161
+ return yield* new BranchRefused({ message: `alasio has no Secret ${secret}: alasio up makes it` });
162
+ const data = keys ? Object.fromEntries(Object.entries(found.data).filter(([key]) => keys.includes(key))) : found.data;
163
+ return { apiVersion: "v1", kind: "Secret", metadata: { name: secret, namespace: branchNamespace(name), labels: branchSecretLabels(name) }, type: found.type ?? "Opaque", data };
164
+ });
165
+ /**
166
+ * Makes the branch environment `request` asks for, as the module says, and waits until
167
+ * it runs.
168
+ */
169
+ export const createBranch = Effect.fnUntraced(function* (config, { name, bot, overrides }, options) {
170
+ const kube = yield* KubeApi;
171
+ const problem = nameProblem(name);
172
+ if (problem)
173
+ return yield* new BranchRefused({ message: `${name} is no branch's name: ${problem}` });
174
+ const settings = yield* branchConfig(config, overrides);
175
+ if (!settings.neon.enabled)
176
+ return yield* new BranchRefused({ message: "a branch environment is a branch of alasio's Neon, which this installation does not run" });
177
+ if (!(yield* kube.get({ ...DEPLOYMENT, namespace: NAMESPACE, name: RELEASE }))) {
178
+ return yield* new BranchRefused({ message: "alasio is not installed in this cluster: alasio up installs it" });
179
+ }
180
+ if (yield* kube.get({ ...NAMESPACE_KIND, name: branchNamespace(name) }))
181
+ return yield* new BranchRefused({ message: `there is a branch ${name} already` });
182
+ const main = yield* readTelegramBot;
183
+ if (main && Redacted.value(main.token) === Redacted.value(bot.token)) {
184
+ return yield* new BranchRefused({ message: "a branch's bot is its own: Telegram gives a bot's updates to one poller, and main's alasio polls main's bot" });
185
+ }
186
+ const memory = yield* measureMemory;
187
+ if (memory === null)
188
+ yield* Console.log("This cluster has no metrics server, so what a branch takes is not measured: about what main's alasio, compute and lake take.");
189
+ else if (memory.branch > memory.free) {
190
+ yield* Console.log(`Warning: a branch takes about ${memoryText(memory.branch)}, as main's alasio, compute and lake use now, and no node has more than ${memoryText(memory.free)} free.`);
191
+ }
192
+ // The branch's own, as the module says: none of main's passwords or tokens of its Neon.
193
+ const own = () => randomBytes(24).toString("base64url");
194
+ const credentials = { alasio: own(), lake: own(), compute: own() };
195
+ const url = new URL(yield* requiredSecret(componentName("database"), "url"));
196
+ url.password = credentials.alasio;
197
+ const lake = settings.lake.enabled ? yield* copiedSecret(name, componentName("lake"), ["LAKE_S3_KEY", "LAKE_S3_SECRET"]) : null;
198
+ const secrets = [
199
+ branchSecret(name, componentName("database"), { url: url.toString(), "lake-password": credentials.lake }),
200
+ branchSecret(name, neonName("compute"), { NEON_CONTROL_PLANE_TOKEN: credentials.compute }),
201
+ // The lake service's: main's object store identity, the one thing of main's a branch is given (see the module), and its role's password.
202
+ ...(lake ? [{ ...lake, data: { ...lake.data, LAKE_DATABASE_PASSWORD: Buffer.from(credentials.lake, "utf8").toString("base64") } }] : []),
203
+ ...(settings.alasio.claude.existingSecret ? [yield* copiedSecret(name, CLAUDE_SECRET)] : []),
204
+ ...(yield* Effect.forEach(settings.imagePullSecrets, (secret) => copiedSecret(name, secret))),
205
+ branchSecret(name, TELEGRAM_SECRET, { token: Redacted.value(bot.token), allowedUserIds: bot.allowedUserIds.join(",") }),
206
+ branchSecret(name, BRANCH_FORK_SECRET, { token: forkToken(yield* requiredSecret(componentName("branches"), "fork-key"), name) }),
207
+ ];
208
+ // At main's current WAL position, so the branch holds every commit main has made.
209
+ const lsn = yield* onCompute(NAMESPACE, yield* runningPod("neon-compute"), "select pg_current_wal_lsn()");
210
+ yield* Effect.logInfo(`branching Neon at ${lsn}`);
211
+ const made = yield* neonControl("POST", "/branches", {
212
+ name,
213
+ lsn,
214
+ compute: { passwordVerifier: scramVerifier(credentials.alasio), tokenSha256: tokenSha256(credentials.compute) },
215
+ });
216
+ if (made.status !== 201 && made.status !== 200)
217
+ return yield* new BranchRefused({ message: `neon-control did not make the branch ${name}: ${refusalOf(made)}` });
218
+ const objects = branchObjects(settings, name);
219
+ yield* Effect.forEach(objects.filter((object) => object.kind === "Namespace"), (namespace) => kube.apply(namespace), { discard: true });
220
+ yield* Effect.forEach(secrets, (secret) => kube.apply(secret), { discard: true });
221
+ yield* applyObjects(objects, options);
222
+ });
223
+ /** The memory the workloads of `namespace` request. */
224
+ const requestedIn = (namespace) => Effect.flatMap(KubeApi, (kube) => kube.list(DEPLOYMENT, { namespace })).pipe(Effect.map((deployments) => deployments.flatMap(({ spec }) => spec?.template.spec?.containers ?? []).reduce((sum, container) => sum + memoryBytes(container.resources?.requests?.["memory"] ?? "0"), 0)));
225
+ /** The namespaces of branch environments, each its own. */
226
+ const namespacesOfBranches = Effect.flatMap(KubeApi, (kube) => kube.list(NAMESPACE_KIND)).pipe(Effect.map((namespaces) => namespaces.filter(({ metadata }) => metadata?.labels?.[BRANCH_LABEL] && metadata.name === branchNamespace(metadata.labels[BRANCH_LABEL]))));
227
+ /** The names of the branch environments made in the cluster, by their namespaces. */
228
+ export const branchNamespaces = Effect.map(namespacesOfBranches, (namespaces) => namespaces.map(({ metadata }) => metadata?.labels?.[BRANCH_LABEL] ?? ""));
229
+ /** Every branch environment, by Neon's branches and the namespaces made of them. */
230
+ export const listBranches = Effect.gen(function* () {
231
+ const kube = yield* KubeApi;
232
+ const branches = yield* neonBranches;
233
+ const namespaces = yield* namespacesOfBranches;
234
+ const names = [...new Set([...branches.map((branch) => branch.name), ...namespaces.map(({ metadata }) => metadata?.labels?.[BRANCH_LABEL] ?? "")])].sort();
235
+ return yield* Effect.forEach(names, (name) => Effect.gen(function* () {
236
+ const branch = branches.find((each) => each.name === name);
237
+ const namespace = namespaces.find(({ metadata }) => metadata?.name === branchNamespace(name));
238
+ const alasio = namespace ? yield* kube.get({ ...DEPLOYMENT, namespace: branchNamespace(name), name: RELEASE }) : null;
239
+ const pods = namespace ? yield* measured(kube.list(kind("PodMetrics"), { namespace: branchNamespace(name) })) : null;
240
+ return {
241
+ name,
242
+ parent: branch?.parent ?? null,
243
+ createdAt: branch?.createdAt ?? namespace?.metadata?.creationTimestamp?.toString() ?? null,
244
+ neon: branch?.state ?? null,
245
+ ready: alasio ? readiness(alasio)._tag === "Ready" : null,
246
+ requested: namespace ? yield* requestedIn(branchNamespace(name)) : 0,
247
+ used: pods ? pods.reduce((sum, pod) => sum + used(pod), 0) : null,
248
+ };
249
+ }));
250
+ });
251
+ /** Deletes the objects `refs`, and waits until they are gone. */
252
+ const removed = (refs, options) => Effect.flatMap(KubeApi, (kube) => Effect.forEach(refs, (ref) => kube.remove(ref), { concurrency: 8, discard: true })).pipe(Effect.andThen(awaitGone(refs, options)));
253
+ /** Stops the Deployments `names` of `namespace`: deletes them, and waits until their pods are gone. */
254
+ const stopped = Effect.fnUntraced(function* (namespace, names, options) {
255
+ const kube = yield* KubeApi;
256
+ const workloads = (yield* Effect.forEach(names, (name) => kube.get({ ...DEPLOYMENT, namespace, name }))).filter((found) => found !== null);
257
+ const pods = (yield* Effect.forEach(workloads, ({ spec }) => kube.list(POD, { namespace, labelSelector: selectorOf(spec?.selector.matchLabels ?? {}) }))).flat();
258
+ yield* removed([...workloads, ...pods].map(refOf), options);
259
+ });
260
+ /**
261
+ * Deletes the branch environment `name`, as the module says. Unless `force`, refuses
262
+ * while its alasio has a turn running, as its database says, or when that cannot be
263
+ * read.
264
+ */
265
+ export const deleteBranch = Effect.fnUntraced(function* (name, { force }, options) {
266
+ const kube = yield* KubeApi;
267
+ const namespace = branchNamespace(name);
268
+ const sessions = branchSessionsNamespace(name);
269
+ const branch = (yield* neonBranches).find((each) => each.name === name);
270
+ const made = yield* kube.get({ ...NAMESPACE_KIND, name: namespace });
271
+ if (!branch && !made)
272
+ return yield* new BranchRefused({ message: `there is no branch ${name}` });
273
+ if (made && !force) {
274
+ const turns = yield* runningPodIn(namespace, "neon-compute").pipe(Effect.flatMap((pod) => onCompute(namespace, pod, "select count(*) from state.turns where state = 'active'")), Effect.catch((error) => Effect.fail(new BranchRefused({ message: `whether its alasio has a turn running cannot be read: ${error.message}; --force deletes it all the same` }))));
275
+ if (Number(turns) > 0)
276
+ return yield* new BranchRefused({ message: `its alasio has ${turns} turn${turns === "1" ? "" : "s"} running; --force deletes it all the same` });
277
+ }
278
+ if (made) {
279
+ yield* stopped(namespace, [RELEASE, componentName("lake")], options);
280
+ const sandboxes = yield* kube.list(kind("Sandbox"), { namespace: sessions }).pipe(Effect.catchIf(hasStatus(404), () => Effect.succeed([])));
281
+ yield* removed(sandboxes.map(refOf), options);
282
+ const claimed = (yield* kube.list(kind("PersistentVolume"))).filter(({ spec }) => spec?.claimRef?.namespace === sessions);
283
+ yield* removed((yield* kube.list(kind("PersistentVolumeClaim"), { namespace: sessions })).map(refOf), options);
284
+ yield* awaitReclaimed(claimed.map(refOf), options);
285
+ yield* stopped(namespace, [neonName("compute")], options);
286
+ }
287
+ if (branch) {
288
+ // neon-control answers 409 while the storage controller is still deleting it.
289
+ yield* neonControl("DELETE", `/branches/${name}`).pipe(Effect.flatMap((answer) => answer.status === 204 || answer.status === 404
290
+ ? Effect.void
291
+ : Effect.fail(new BranchRefused({ message: `neon-control did not delete the branch ${name}: ${refusalOf(answer)}` }))), Effect.retry({ while: (error) => error._tag === "BranchRefused" && error.message.includes("still deleting"), schedule: Schedule.max([Schedule.spaced(options.poll), Schedule.during(options.timeout)]) }));
292
+ }
293
+ yield* removed([namespace, sessions].map((each) => ({ ...NAMESPACE_KIND, name: each })), options);
294
+ });
295
+ //# sourceMappingURL=branches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../src/branches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /** `alasio branch create|list|delete`: branch environments, a different alasio on a copy-on-write copy of alasio's data. */
2
+ import { Config, Console, Effect, FileSystem, Option, Predicate, Redacted } from "effect";
3
+ import { Argument, Command, Flag } from "effect/cli";
4
+ import { HISTORY } from "../../../neon/control/branches.js";
5
+ import { createBranch, deleteBranch, listBranches, memoryText } from "../branches.js";
6
+ import { loadConfig } from "../config.js";
7
+ import { readTelegramBot } from "../secrets.js";
8
+ import { TelegramBotApi } from "../telegram.js";
9
+ import { onCluster, timeoutFlag, waitOptions } from "./common.js";
10
+ import { SettingInvalid, SettingMissing } from "./init.js";
11
+ const name = Argument.String("name").pipe(Argument.withDescription("The branch's name: lowercase letters, digits and inner hyphens, at most 30 characters"));
12
+ /** How long ago `since` was, as people say it: in minutes, hours, or days. */
13
+ function age(since, now) {
14
+ const minutes = Math.max(0, Math.round((now - since.getTime()) / 60_000));
15
+ return minutes < 120 ? `${minutes}m` : minutes < 2 * 24 * 60 ? `${Math.round(minutes / 60)}h` : `${Math.round(minutes / (24 * 60))}d`;
16
+ }
17
+ /** The settings a branch has over main's: a JSON object, as the config's `install` holds them. */
18
+ const readOverrides = Effect.fnUntraced(function* (path) {
19
+ if (Option.isNone(path))
20
+ return {};
21
+ const fs = yield* FileSystem.FileSystem;
22
+ const text = yield* fs.readFileString(path.value);
23
+ const parsed = yield* Effect.try({
24
+ try: () => JSON.parse(text),
25
+ catch: (cause) => new SettingInvalid({ setting: "--overrides", reason: `is not JSON: ${cause instanceof Error ? cause.message : String(cause)}` }),
26
+ });
27
+ if (!Predicate.isObject(parsed) || Array.isArray(parsed))
28
+ return yield* new SettingInvalid({ setting: "--overrides", reason: "must be a JSON object of install settings" });
29
+ return parsed;
30
+ });
31
+ /** An image named as Docker names one, `repository[:tag][@digest]`, as the install configuration holds it. */
32
+ function imageSetting(reference) {
33
+ const [named = "", digest = ""] = reference.split("@");
34
+ const slash = named.lastIndexOf("/");
35
+ const colon = named.lastIndexOf(":");
36
+ return colon > slash ? { repository: named.slice(0, colon), tag: named.slice(colon + 1), digest } : { repository: named, tag: "", digest };
37
+ }
38
+ /** The branch's bot: its token from a file or the environment, checked with Telegram; and who may use it, main's users unless given. */
39
+ const chooseBot = Effect.fnUntraced(function* (tokenFile, allowedUserIds) {
40
+ const fs = yield* FileSystem.FileSystem;
41
+ const telegram = yield* TelegramBotApi;
42
+ const token = Option.isSome(tokenFile)
43
+ ? Option.some(Redacted.make((yield* fs.readFileString(tokenFile.value)).trim()))
44
+ : yield* Config.option(Config.Redacted("TELEGRAM_BOT_TOKEN"));
45
+ if (Option.isNone(token))
46
+ return yield* new SettingMissing({ setting: "the branch's bot's token", give: "--bot-token-file or TELEGRAM_BOT_TOKEN" });
47
+ const username = yield* telegram.getMe(token.value);
48
+ const ids = Option.isSome(allowedUserIds)
49
+ ? allowedUserIds.value.split(",").map((id) => id.trim()).filter(Boolean)
50
+ : (yield* readTelegramBot)?.allowedUserIds ?? [];
51
+ if (ids.length === 0 || !ids.every((id) => /^\d+$/u.test(id)))
52
+ return yield* new SettingInvalid({ setting: "--allowed-user-ids", reason: "must be Telegram user ids, comma-separated" });
53
+ return { token: token.value, username, allowedUserIds: ids };
54
+ });
55
+ const create = Command.make("create", {
56
+ name,
57
+ botTokenFile: Flag.String("bot-token-file").pipe(Flag.optional, Flag.withMetavar("path"), Flag.withDescription("A file holding the branch's own bot's token, from @BotFather; or set TELEGRAM_BOT_TOKEN")),
58
+ allowedUserIds: Flag.String("allowed-user-ids").pipe(Flag.optional, Flag.withMetavar("ids"), Flag.withDescription("The Telegram user ids allowed to use the branch's bot, comma-separated; main's unless given")),
59
+ image: Flag.String("image").pipe(Flag.optional, Flag.withMetavar("reference"), Flag.withDescription("The image the branch's alasio runs, repository[:tag][@digest], rather than main's")),
60
+ overrides: Flag.String("overrides").pipe(Flag.optional, Flag.withMetavar("path"), Flag.withDescription("A JSON file of install settings the branch has over main's, as the config's install holds them, such as {\"alasio\": {\"defaultHarness\": \"codex\"}}")),
61
+ timeout: timeoutFlag,
62
+ }, ({ name, botTokenFile, allowedUserIds, image, overrides, timeout }) => Effect.gen(function* () {
63
+ const config = yield* loadConfig;
64
+ const settings = yield* readOverrides(overrides);
65
+ const withImage = Option.match(image, { onNone: () => settings, onSome: (reference) => ({ ...settings, images: { alasio: imageSetting(reference) } }) });
66
+ yield* onCluster(() => Effect.gen(function* () {
67
+ const bot = yield* chooseBot(botTokenFile, allowedUserIds);
68
+ yield* createBranch(config, { name, bot, overrides: withImage }, waitOptions(timeout));
69
+ yield* Console.log(`The branch ${name} runs, on a copy of alasio's data as it is now. Message @${bot.username} on Telegram to talk to it; alasio branch delete ${name} deletes it.`);
70
+ }));
71
+ })).pipe(Command.withShortDescription("Make a branch environment"), Command.withDescription("Makes the branch environment name: a branch of alasio's Neon at its database's latest commit, and on it an alasio, a compute " +
72
+ "and a lake of the branch's own, in the namespaces alasio-branch-<name> and alasio-branch-<name>-sessions, serving its own " +
73
+ "bot (--bot-token-file), and running another image (--image) or other settings (--overrides) when given; and waits until it " +
74
+ "runs, past --timeout saying what still waits and why. It says when no node of the cluster has the memory a branch takes, " +
75
+ `about what main's alasio, compute and lake use as it is measured then. Neon keeps ${HISTORY} of its history, so a branch point ` +
76
+ `can be at most ${HISTORY} back.`));
77
+ const list = Command.make("list", {}, () => onCluster(() => Effect.gen(function* () {
78
+ const branches = yield* listBranches;
79
+ if (branches.length === 0)
80
+ return yield* Console.log("alasio has no branch environments.");
81
+ const now = Date.now();
82
+ for (const branch of branches) {
83
+ const old = branch.createdAt === null ? "of no age known" : `${age(new Date(branch.createdAt), now)} old`;
84
+ const alasio = branch.ready === null ? "no alasio" : branch.ready ? "its alasio ready" : "its alasio not ready";
85
+ const memory = `${memoryText(branch.requested)} requested${branch.used === null ? "" : `, ${memoryText(branch.used)} used`}`;
86
+ yield* Console.log(`${branch.name}: a branch of ${branch.parent ?? "nothing Neon has"}, ${old}, ${alasio}, ${memory}${branch.neon && branch.neon !== "ready" ? `, Neon's branch ${branch.neon}` : ""}`);
87
+ }
88
+ }))).pipe(Command.withShortDescription("List the branch environments"), Command.withDescription("Says each branch environment's name, what it is a branch of, its age, whether its alasio runs, and the memory its alasio, compute and lake request and use."));
89
+ const remove = Command.make("delete", {
90
+ name,
91
+ force: Flag.Boolean("force").pipe(Flag.withDefault(false), Flag.withDescription("Delete it even while its alasio has a turn running, or when that cannot be read")),
92
+ timeout: timeoutFlag,
93
+ }, ({ name, force, timeout }) => onCluster(() => Effect.gen(function* () {
94
+ yield* deleteBranch(name, { force }, waitOptions(timeout));
95
+ yield* Console.log(`The branch ${name} is deleted, with all it had; main's data is as it was.`);
96
+ }))).pipe(Command.withShortDescription("Delete a branch environment"), Command.withDescription("Deletes the branch environment name: stops its alasio and lake, deletes its sessions and their volumes (JuiceFS keeps every " +
97
+ "chunk main still uses), stops its compute, deletes its branch of Neon's, and its namespaces with its Secrets. It refuses " +
98
+ "while the branch's alasio has a turn running, as its database says, unless --force."));
99
+ export const branch = Command.make("branch").pipe(Command.withSubcommands([create, list, remove]), Command.withShortDescription("Run a different alasio on a copy of alasio's data"), Command.withDescription("A branch environment is a different alasio (another image, other settings) on a copy-on-write copy of alasio's data, made " +
100
+ "in seconds without copying any: alasio's state and transcripts are a branch of its Neon, and the lake's catalog with them. " +
101
+ "It serves a bot of its own and changes nothing of main's. What it shares with main is what is never branched: Neon's " +
102
+ "storage, the object store, the lake's files (which main's maintenance keeps while any branch exists, and deletes once " +
103
+ "none does, with what branches wrote), the telemetry collector, and JuiceFS. Its telemetry goes to main's lake, its " +
104
+ "resource's alasio.branch its name. A session workspace its conversations inherited is forked from main's, " +
105
+ "copy-on-write, as the branch first uses it, unless main has a turn running in it then; main's sessions are never " +
106
+ "touched by the branch. A folder workspace is refused, as the machine's own files cannot be copied. What was in " +
107
+ "flight in main as it was branched (queued prompts, unsent replies, buttons) is dropped, and so is Codex's login, " +
108
+ "whose refresh token works once: alasio login codex --branch logs the branch's Codex in. Its credentials are its own " +
109
+ "(its database's password, its lake's, its compute's token), none of which reaches main's database, but for two that " +
110
+ "cannot be narrowed: its lake has main's object store identity, as it reads main's files where they are and SeaweedFS's " +
111
+ "write permission deletes too; and its compute has Neon's storage token, the tenant's, as Neon's storage has no " +
112
+ "narrower one. A branch's pods reach main's storage services and nothing else of main's. A branch takes about the " +
113
+ "memory main's alasio, compute and lake take. Branches live until deleted."));
114
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../../../src/commands/branch.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * What alasio's commands share: the cluster the config targets, reached; its
3
+ * components and their pods; and the flags several commands take.
4
+ */
5
+ import { Readable, Writable } from "node:stream";
1
6
  import { Duration, Effect, Schema } from "effect";
2
7
  import { Flag } from "effect/cli";
3
8
  import { DockerCluster } from "../cluster/docker.js";
@@ -6,7 +11,7 @@ import { loadConfig } from "../config.js";
6
11
  import { kind, KubeApi } from "../kube/api.js";
7
12
  import { INSTALLATION_SELECTOR } from "../kube/apply.js";
8
13
  import { podProblems, selectorOf } from "../kube/rollout.js";
9
- import { NAMESPACE, RELEASE } from "../manifests/common.js";
14
+ import { NAMESPACE, RELEASE, selectorLabels } from "../manifests/common.js";
10
15
  import { dockerCluster, kubeApi, resolveTarget } from "../target.js";
11
16
  /** How often a wait looks. */
12
17
  const POLL = "2 seconds";
@@ -88,8 +93,10 @@ export const component = Effect.fnUntraced(function* (name) {
88
93
  return yield* new UnknownComponent({ component: name, known: found.map((each) => each.name).sort() });
89
94
  return match;
90
95
  });
96
+ /** The pods of `namespace` that `labels` select, the newest first. */
97
+ const podsSelected = (namespace, labels) => Effect.flatMap(KubeApi, (kube) => kube.list(kind("Pod"), { namespace, labelSelector: selectorOf(labels) })).pipe(Effect.map((pods) => pods.toSorted((a, b) => new Date(b.metadata?.creationTimestamp ?? 0).getTime() - new Date(a.metadata?.creationTimestamp ?? 0).getTime())));
91
98
  /** The pods of `of`, the newest first. */
92
- export const podsOf = (of) => Effect.flatMap(KubeApi, (kube) => kube.list(kind("Pod"), { namespace: NAMESPACE, labelSelector: selectorOf(of.workload.spec?.selector?.matchLabels ?? {}) })).pipe(Effect.map((pods) => pods.toSorted((a, b) => new Date(b.metadata?.creationTimestamp ?? 0).getTime() - new Date(a.metadata?.creationTimestamp ?? 0).getTime())));
99
+ export const podsOf = (of) => podsSelected(NAMESPACE, of.workload.spec?.selector?.matchLabels ?? {});
93
100
  /** No pod of a component runs ready, so nothing can be run in one. */
94
101
  export class NoRunningPod extends Schema.TaggedError()("NoRunningPod", {
95
102
  component: Schema.String,
@@ -99,13 +106,25 @@ export class NoRunningPod extends Schema.TaggedError()("NoRunningPod", {
99
106
  return `no pod of ${this.component} runs${this.why.length > 0 ? `: ${this.why.join("; ")}` : ""}; alasio status says more`;
100
107
  }
101
108
  }
102
- /** The newest pod of the component `name` that runs ready. */
103
- export const runningPod = Effect.fnUntraced(function* (name) {
104
- const pods = yield* podsOf(yield* component(name));
109
+ /** The newest of `pods`, of the component `name`, that runs ready. */
110
+ const readyPod = (name, pods) => {
105
111
  const running = pods.find((pod) => pod.status?.phase === "Running" && podProblems(pod).length === 0);
106
- if (!running?.metadata?.name)
107
- return yield* new NoRunningPod({ component: name, why: pods.flatMap(podProblems) });
108
- return running.metadata.name;
112
+ return running?.metadata?.name ? Effect.succeed(running.metadata.name) : Effect.fail(new NoRunningPod({ component: name, why: pods.flatMap(podProblems) }));
113
+ };
114
+ /** The newest pod of the component `name` that runs ready. */
115
+ export const runningPod = (name) => component(name).pipe(Effect.flatMap(podsOf), Effect.flatMap((pods) => readyPod(name, pods)));
116
+ /** The newest pod of `component` in `namespace`, a branch environment's, that runs ready. */
117
+ export const runningPodIn = (namespace, component) => podsSelected(namespace, selectorLabels(component)).pipe(Effect.flatMap((pods) => readyPod(`${component} of ${namespace}`, pods)));
118
+ /** Runs `command` in the container, given `stdin` when there is one: what it printed, and its exit code. */
119
+ export const runIn = (target, command, stdin) => Effect.flatMap(KubeApi, (kube) => {
120
+ const printed = { stdout: "", stderr: "" };
121
+ const into = (stream) => new Writable({
122
+ write: (chunk, _encoding, done) => {
123
+ printed[stream] += chunk.toString("utf8");
124
+ done();
125
+ },
126
+ });
127
+ return kube.exec(target, command, { stdin: stdin === undefined ? null : Readable.from([stdin]), stdout: into("stdout"), stderr: into("stderr"), tty: false }).pipe(Effect.map((exitCode) => ({ exitCode, ...printed })));
109
128
  });
110
129
  /** A command run in alasio's cluster exited with another code than 0. */
111
130
  export class CommandFailed extends Schema.TaggedError()("CommandFailed", {
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/commands/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/commands/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAqB,IAAI,EAAE,OAAO,EAAyC,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,OAAO,EAAuB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1F,8BAA8B;AAC9B,MAAM,IAAI,GAAmB,WAAW,CAAC;AAEzC,gEAAgE;AAChE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,+CAA+C,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AACtI,CAAC;AAED,uDAAuD;AACvD,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpK,4FAA4F;AAC5F,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CACrD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EACtC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAC5B,IAAI,CAAC,eAAe,CAAC,2HAA2H,CAAC,CAClJ,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACjD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAC5B,IAAI,CAAC,eAAe,CAAC,8DAA8D,CAAC,CACrF,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAA0B,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAElG,2IAA2I;AAC3I,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAAC,mBAAmB,EAAE;IAClG,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAgE,EAAE,IAAa,EAAqB,EAAE,CAC/H,IAAI,iBAAiB,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM;QAC7B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qDAAqD,CAAC,CAAC,CAAC,4DAA4D;QAC7H,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,IAAI,kCAAkC;YACtE,CAAC,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,0BAA0B;CACzE,CAAC,CAAC;AAEL,8FAA8F;AAC9F,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAgE,EAAE,EAAE,CAC1F,MAAM,CAAC,IAAI,KAAK,MAAM;IACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAChH,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CACrF;IACD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC9G,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAC9E,CAAC,CAAC,CACH,CAAC;AAEN;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAU,GAAuD,EAAE,EAAE,CAC5F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAQL,mEAAmE;AACnE,MAAM,CAAC,MAAM,UAAU,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACrC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EACtD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAwB,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC,CACjH,CAAC;IACF,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,yCAAyC;AACzC,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CACnC,CAAC;IACA,IAAa,OAAO;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,2BAA2B,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC9E,CAAC,CAAC,gEAAgE,CAAC;IACvE,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,IAAY;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAE,MAAwC,EAA0D,EAAE,CAC3I,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACrH,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,iBAAiB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,iBAAiB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC/J,CAAC;AAEJ,0CAA0C;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAa,EAA0D,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;AAExK,sEAAsE;AACtE,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,cAAc,EAAE;IACnF,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CACjC,CAAC;IACA,IAAa,OAAO;QAClB,OAAO,aAAa,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,2BAA2B,CAAC;IAC7H,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,IAAsB,EAAuC,EAAE;IAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IACrG,OAAO,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9J,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAkF,EAAE,CACzH,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAE/F,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAA+D,EAAE,CAChI,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,OAAO,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AASpI,4GAA4G;AAC5G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAoB,EAAE,OAA0B,EAAE,KAAc,EAA6D,EAAE,CACnJ,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,MAA2B,EAAE,EAAE,CAC3C,IAAI,QAAQ,CAAC;QACX,KAAK,EAAE,CAAC,KAAa,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;YACxC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC,CAAC;IACL,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAChK,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,yEAAyE;AACzE,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,WAAW,EAAiB,CAAC,eAAe,EAAE;IACtF,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;CACxB,CAAC;IACA,IAAa,OAAO;QAClB,OAAO,GAAG,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;CACF"}