@intentic/providers 1.239.0 → 1.242.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 (60) hide show
  1. package/README.md +5 -0
  2. package/dist/auth/authentik.d.ts +1 -1
  3. package/dist/auth/authentik.d.ts.map +1 -1
  4. package/dist/auth/authentik.js +28 -99
  5. package/dist/auth/authentik.js.map +1 -1
  6. package/dist/backings/garage-bucket.d.ts +1 -1
  7. package/dist/backings/garage-bucket.d.ts.map +1 -1
  8. package/dist/backings/garage-bucket.js +18 -63
  9. package/dist/backings/garage-bucket.js.map +1 -1
  10. package/dist/backings/garage.d.ts +1 -1
  11. package/dist/backings/garage.d.ts.map +1 -1
  12. package/dist/backings/garage.js +19 -87
  13. package/dist/backings/garage.js.map +1 -1
  14. package/dist/backings/postgres-database.d.ts +1 -1
  15. package/dist/backings/postgres-database.d.ts.map +1 -1
  16. package/dist/backings/postgres-database.js +20 -72
  17. package/dist/backings/postgres-database.js.map +1 -1
  18. package/dist/backings/postgres.d.ts +1 -1
  19. package/dist/backings/postgres.d.ts.map +1 -1
  20. package/dist/backings/postgres.js +15 -98
  21. package/dist/backings/postgres.js.map +1 -1
  22. package/dist/backings/valkey-namespace.d.ts +1 -1
  23. package/dist/backings/valkey-namespace.d.ts.map +1 -1
  24. package/dist/backings/valkey-namespace.js +15 -60
  25. package/dist/backings/valkey-namespace.js.map +1 -1
  26. package/dist/backings/valkey.d.ts +1 -1
  27. package/dist/backings/valkey.d.ts.map +1 -1
  28. package/dist/backings/valkey.js +18 -98
  29. package/dist/backings/valkey.js.map +1 -1
  30. package/dist/core/backing-provider.d.ts +33 -0
  31. package/dist/core/backing-provider.d.ts.map +1 -0
  32. package/dist/core/backing-provider.js +97 -0
  33. package/dist/core/backing-provider.js.map +1 -0
  34. package/dist/core/backing-ssh.d.ts +2 -0
  35. package/dist/core/backing-ssh.d.ts.map +1 -1
  36. package/dist/core/backing-ssh.js +2 -0
  37. package/dist/core/backing-ssh.js.map +1 -1
  38. package/dist/core/host-files.d.ts +13 -0
  39. package/dist/core/host-files.d.ts.map +1 -0
  40. package/dist/core/host-files.js +27 -0
  41. package/dist/core/host-files.js.map +1 -0
  42. package/dist/core/instance-binding.d.ts +24 -0
  43. package/dist/core/instance-binding.d.ts.map +1 -0
  44. package/dist/core/instance-binding.js +68 -0
  45. package/dist/core/instance-binding.js.map +1 -0
  46. package/dist/core/ssh-diagnostics.d.ts.map +1 -1
  47. package/dist/core/ssh-diagnostics.js +3 -2
  48. package/dist/core/ssh-diagnostics.js.map +1 -1
  49. package/dist/network/cloudflare-api.d.ts.map +1 -1
  50. package/dist/network/cloudflare-api.js +2 -1
  51. package/dist/network/cloudflare-api.js.map +1 -1
  52. package/dist/observability/signoz.d.ts +1 -1
  53. package/dist/observability/signoz.d.ts.map +1 -1
  54. package/dist/observability/signoz.js +25 -127
  55. package/dist/observability/signoz.js.map +1 -1
  56. package/dist/services/compose-service.d.ts +3 -5
  57. package/dist/services/compose-service.d.ts.map +1 -1
  58. package/dist/services/compose-service.js +4 -22
  59. package/dist/services/compose-service.js.map +1 -1
  60. package/package.json +8 -7
@@ -1,17 +1,14 @@
1
1
  import { shellQuote, sqlIdentifier, sqlLiteral } from "@intentic/sandbox-run/quote";
2
2
  import { z } from "zod";
3
- import { containerId } from "../core/backing-ssh.js";
4
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
3
+ import { bindingSchema, createInstanceBindingProvider } from "../core/instance-binding.js";
5
4
  import { sshExecutor } from "../core/ssh.js";
6
- const databaseSchema = sshSchema.extend({
7
- instance: z.string(),
5
+ const databaseSchema = bindingSchema.extend({
8
6
  instanceHost: z.string(),
9
7
  instancePort: z.string(),
10
8
  database: z.string(),
11
9
  role: z.string(),
12
10
  password: z.string(),
13
11
  });
14
- const parse = (inputs) => parseInputs(databaseSchema, inputs, "postgres-database");
15
12
  const url = (parsed) => `postgres://${parsed.role}:${parsed.password}@${parsed.instanceHost}:${parsed.instancePort}/${parsed.database}`;
16
13
  const psql = async (session, cid, sql) => {
17
14
  const result = await session.exec(`docker exec ${cid} psql -U postgres -tAc ${shellQuote(sql)}`);
@@ -20,73 +17,24 @@ const psql = async (session, cid, sql) => {
20
17
  }
21
18
  return result.stdout.trim();
22
19
  };
23
- export const createPostgresDatabaseProvider = (executor = sshExecutor) => ({
24
- read: async (inputs, ctx) => {
25
- if (hasPendingRef(inputs, "instanceHost", "instancePort")) {
26
- return undefined;
27
- }
28
- const parsed = parse(inputs);
29
- let session;
30
- try {
31
- session = await executor.connect(sshTarget(parsed));
32
- }
33
- catch (error) {
34
- ctx.log(`postgres-database "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
35
- return undefined;
36
- }
37
- try {
38
- const cid = await containerId(session, parsed.instance);
39
- if (cid === "") {
40
- return undefined;
41
- }
42
- const exists = await psql(session, cid, `SELECT 1 FROM pg_database WHERE datname=${sqlLiteral(parsed.database)}`);
43
- return exists === "1" ? { outputs: { url: url(parsed) } } : undefined;
44
- }
45
- finally {
46
- await session.dispose();
47
- }
20
+ const databaseExists = async (session, cid, parsed) => (await psql(session, cid, `SELECT 1 FROM pg_database WHERE datname=${sqlLiteral(parsed.database)}`)) === "1";
21
+ export const createPostgresDatabaseProvider = (executor = sshExecutor) => createInstanceBindingProvider({
22
+ kind: "postgres-database",
23
+ schema: databaseSchema,
24
+ pendingRefs: ["instanceHost", "instancePort"],
25
+ present: async (session, cid, parsed) => ((await databaseExists(session, cid, parsed)) ? { url: url(parsed) } : undefined),
26
+ create: async (session, cid, parsed) => {
27
+ const roleExists = await psql(session, cid, `SELECT 1 FROM pg_roles WHERE rolname=${sqlLiteral(parsed.role)}`);
28
+ const verb = roleExists === "1" ? "ALTER" : "CREATE";
29
+ await psql(session, cid, `${verb} ROLE ${sqlIdentifier(parsed.role)} LOGIN PASSWORD ${sqlLiteral(parsed.password)}`);
30
+ if (!(await databaseExists(session, cid, parsed))) {
31
+ await psql(session, cid, `CREATE DATABASE ${sqlIdentifier(parsed.database)} OWNER ${sqlIdentifier(parsed.role)}`);
32
+ }
33
+ return { url: url(parsed) };
48
34
  },
49
- diff: () => ({ action: "noop" }),
50
- apply: async (inputs, _observed, ctx) => {
51
- const parsed = parse(inputs);
52
- const session = await executor.connect(sshTarget(parsed));
53
- try {
54
- const cid = await containerId(session, parsed.instance);
55
- if (cid === "") {
56
- throw new Error(`postgres-database "${ctx.id}": instance "${parsed.instance}" is not running`);
57
- }
58
- const roleExists = await psql(session, cid, `SELECT 1 FROM pg_roles WHERE rolname=${sqlLiteral(parsed.role)}`);
59
- if (roleExists !== "1") {
60
- await psql(session, cid, `CREATE ROLE ${sqlIdentifier(parsed.role)} LOGIN PASSWORD ${sqlLiteral(parsed.password)}`);
61
- }
62
- else {
63
- await psql(session, cid, `ALTER ROLE ${sqlIdentifier(parsed.role)} LOGIN PASSWORD ${sqlLiteral(parsed.password)}`);
64
- }
65
- const dbExists = await psql(session, cid, `SELECT 1 FROM pg_database WHERE datname=${sqlLiteral(parsed.database)}`);
66
- if (dbExists !== "1") {
67
- await psql(session, cid, `CREATE DATABASE ${sqlIdentifier(parsed.database)} OWNER ${sqlIdentifier(parsed.role)}`);
68
- }
69
- return { url: url(parsed) };
70
- }
71
- finally {
72
- await session.dispose();
73
- }
35
+ drop: async (session, cid, parsed) => {
36
+ await psql(session, cid, `DROP DATABASE IF EXISTS ${sqlIdentifier(parsed.database)}`);
37
+ await psql(session, cid, `DROP ROLE IF EXISTS ${sqlIdentifier(parsed.role)}`);
74
38
  },
75
- delete: async (inputs, ctx) => {
76
- const parsed = parse(inputs);
77
- const session = await executor.connect(sshTarget(parsed));
78
- try {
79
- const cid = await containerId(session, parsed.instance);
80
- if (cid === "") {
81
- ctx.log(`postgres-database "${ctx.id}": instance "${parsed.instance}" already gone; nothing to drop`);
82
- return;
83
- }
84
- await psql(session, cid, `DROP DATABASE IF EXISTS ${sqlIdentifier(parsed.database)}`);
85
- await psql(session, cid, `DROP ROLE IF EXISTS ${sqlIdentifier(parsed.role)}`);
86
- }
87
- finally {
88
- await session.dispose();
89
- }
90
- },
91
- });
39
+ }, executor);
92
40
  //# sourceMappingURL=postgres-database.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-database.js","sourceRoot":"","sources":["../../src/backings/postgres-database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-database.js","sourceRoot":"","sources":["../../src/backings/postgres-database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC;IAExC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IAExB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH,MAAM,GAAG,GAAG,CAAC,MAAsB,EAAU,EAAE,CAC3C,cAAc,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;AAIpH,MAAM,IAAI,GAAG,KAAK,EAAE,OAAmB,EAAE,GAAW,EAAE,GAAW,EAAmB,EAAE;IAIlF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,0BAA0B,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,OAAmB,EAAE,GAAW,EAAE,MAAsB,EAAoB,EAAE,CACxG,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,2CAA2C,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;AAMjH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,QAAQ,GAAgB,WAAW,EAAY,EAAE,CAC5F,6BAA6B,CACzB;IACI,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1H,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,wCAAwC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAG/G,MAAM,IAAI,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrD,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,SAAS,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrH,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,mBAAmB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,2BAA2B,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,uBAAuB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;CACJ,EACD,QAAQ,CACX,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createPostgresProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=postgres.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/backings/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAOjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAmEhF,eAAO,MAAM,sBAAsB,cAAc,WAAW,KAAiB,QAuE3E,CAAC"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/backings/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAsClD,eAAO,MAAM,sBAAsB,cAAc,WAAW,KAAiB,QAgBxE,CAAC"}
@@ -1,25 +1,12 @@
1
- import { HASH_KEY } from "@intentic/graph";
2
- import { envLine, shellQuote } from "@intentic/sandbox-run/quote";
3
1
  import { z } from "zod";
4
- import { composeDown, composeUp, containerImage, containerLabel, restampBacking, stateDir, waitReady } from "../core/backing-ssh.js";
5
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
6
- import { listStampedContainers } from "../core/list-stamped.js";
2
+ import { backingSchema, createBackingProvider } from "../core/backing-provider.js";
3
+ import { execProbe, stampLabels } from "../core/backing-ssh.js";
7
4
  import { sshExecutor } from "../core/ssh.js";
8
5
  const KIND = "postgres";
9
- const READY_TIMEOUT_MS = 120_000;
10
- const postgresSchema = sshSchema.extend({
11
- internalIp: z.string(),
12
- publishPort: z.number(),
6
+ const postgresSchema = backingSchema.extend({
13
7
  adminPassword: z.string(),
14
- image: z.string(),
15
- protect: z.boolean().default(false),
16
8
  });
17
- const parse = (inputs) => parseInputs(postgresSchema, inputs, KIND);
18
- const outputsFor = (parsed) => ({
19
- internalHost: parsed.internalIp,
20
- port: String(parsed.publishPort),
21
- });
22
- const composeYaml = (id, hash, parsed) => [
9
+ const composeYaml = (parsed, id, hash) => [
23
10
  "services:",
24
11
  " postgres:",
25
12
  ` image: ${parsed.image}`,
@@ -27,7 +14,7 @@ const composeYaml = (id, hash, parsed) => [
27
14
  " environment: { POSTGRES_USER: postgres, POSTGRES_PASSWORD: $POSTGRES_PASSWORD, POSTGRES_DB: postgres }",
28
15
  " volumes: [ data:/var/lib/postgresql ]",
29
16
  ` ports: [ "${parsed.publishPort}:5432" ]`,
30
- ` labels: [ "intentic.id=${id}", "intentic.type=${KIND}", "intentic.hash=${hash}"${parsed.protect ? ', "intentic.protect=true"' : ""} ]`,
17
+ stampLabels(KIND, id, hash, parsed.protect),
31
18
  " healthcheck:",
32
19
  " test: [ CMD-SHELL, pg_isready -U postgres ]",
33
20
  " interval: 10s",
@@ -36,84 +23,14 @@ const composeYaml = (id, hash, parsed) => [
36
23
  "volumes: { data: {} }",
37
24
  "",
38
25
  ].join("\n");
39
- const ensureFiles = async (session, id, hash, parsed) => {
40
- const dir = stateDir(KIND, id);
41
- await session.exec(`mkdir -p ${dir}`);
42
- await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, hash, parsed)}COMPOSE_EOF`);
43
- const line = shellQuote(envLine("POSTGRES_PASSWORD", parsed.adminPassword));
44
- await session.exec(`test -f ${dir}/.env || { printf '%s' ${line} > ${dir}/.env && chmod 600 ${dir}/.env; }`);
45
- };
46
- const readyProbe = (id) => `cid=$(docker ps -q --filter "label=intentic.id=${id}"); [ -n "$cid" ] && docker exec "$cid" pg_isready -U postgres -q`;
47
- export const createPostgresProvider = (executor = sshExecutor) => ({
48
- read: async (inputs, ctx) => {
49
- if (hasPendingRef(inputs, "internalIp")) {
50
- return undefined;
51
- }
52
- const parsed = parse(inputs);
53
- let session;
54
- try {
55
- session = await executor.connect(sshTarget(parsed));
56
- }
57
- catch (error) {
58
- ctx.log(`postgres "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
59
- return undefined;
60
- }
61
- try {
62
- const probe = await session.exec(readyProbe(ctx.id));
63
- if (probe.code !== 0) {
64
- return undefined;
65
- }
66
- const stampHash = await containerLabel(session, ctx.id, HASH_KEY);
67
- return {
68
- outputs: outputsFor(parsed),
69
- detail: { image: await containerImage(session, ctx.id) },
70
- ...(stampHash === "" ? {} : { stampHash }),
71
- };
72
- }
73
- finally {
74
- await session.dispose();
75
- }
76
- },
77
- diff: (inputs, observed) => {
78
- const parsed = parse(inputs);
79
- const image = (observed.detail?.["image"] ?? "");
80
- return image === parsed.image
81
- ? { action: "noop" }
82
- : { action: "update", reason: `postgres image differs (running ${image}, want ${parsed.image})` };
83
- },
84
- apply: async (inputs, _observed, ctx) => {
85
- const parsed = parse(inputs);
86
- const session = await executor.connect(sshTarget(parsed));
87
- try {
88
- await ensureFiles(session, ctx.id, ctx.inputsHash ?? "", parsed);
89
- await composeUp(session, KIND, ctx.id);
90
- await waitReady(session, KIND, ctx.id, readyProbe(ctx.id), READY_TIMEOUT_MS);
91
- return outputsFor(parsed);
92
- }
93
- finally {
94
- await session.dispose();
95
- }
96
- },
97
- delete: async (inputs, ctx) => {
98
- const session = await executor.connect(sshTarget(parseInputs(sshSchema, inputs, KIND)));
99
- try {
100
- await composeDown(session, KIND, ctx.id);
101
- }
102
- finally {
103
- await session.dispose();
104
- }
105
- },
106
- list: (sources, ctx) => listStampedContainers(executor, KIND, sources, ctx.log),
107
- restamp: async (oldId, inputs, ctx) => {
108
- const target = sshTarget(parseInputs(sshSchema, inputs, KIND));
109
- const image = typeof inputs["image"] === "string" ? inputs["image"] : "busybox";
110
- const session = await executor.connect(target);
111
- try {
112
- await restampBacking(session, KIND, oldId, ctx.id, image);
113
- }
114
- finally {
115
- await session.dispose();
116
- }
117
- },
118
- });
26
+ export const createPostgresProvider = (executor = sshExecutor) => createBackingProvider({
27
+ kind: KIND,
28
+ schema: postgresSchema,
29
+ readyTimeoutMs: 120_000,
30
+ outputs: (parsed) => ({ internalHost: parsed.internalIp, port: String(parsed.publishPort) }),
31
+ files: (parsed, id, hash) => ({ "compose.yaml": composeYaml(parsed, id, hash) }),
32
+ env: (parsed) => [{ key: "POSTGRES_PASSWORD", value: parsed.adminPassword }],
33
+ probe: (_parsed, id) => execProbe(id, "pg_isready -U postgres -q"),
34
+ restamp: true,
35
+ }, executor);
119
36
  //# sourceMappingURL=postgres.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/backings/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/backings/postgres.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,IAAI,GAAG,UAAU,CAAC;AAExB,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC;IAGxC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC5B,CAAC,CAAC;AAMH,MAAM,WAAW,GAAG,CAAC,MAAsB,EAAE,EAAU,EAAE,IAAY,EAAU,EAAE,CAC7E;IACI,WAAW;IACX,aAAa;IACb,cAAc,MAAM,CAAC,KAAK,EAAE;IAC5B,6BAA6B;IAC7B,4GAA4G;IAC5G,2CAA2C;IAC3C,iBAAiB,MAAM,CAAC,WAAW,UAAU;IAC7C,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3C,kBAAkB;IAClB,mDAAmD;IACnD,qBAAqB;IACrB,mBAAmB;IACnB,mBAAmB;IACnB,uBAAuB;IACvB,EAAE;CACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAMjB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,GAAgB,WAAW,EAAY,EAAE,CACpF,qBAAqB,CACjB;IACI,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,cAAc;IACtB,cAAc,EAAE,OAAO;IACvB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5F,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;IAGhF,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;IAC5E,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,2BAA2B,CAAC;IAElE,OAAO,EAAE,IAAI;CAChB,EACD,QAAQ,CACX,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createValkeyNamespaceProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=valkey-namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"valkey-namespace.d.ts","sourceRoot":"","sources":["../../src/backings/valkey-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAmChF,eAAO,MAAM,6BAA6B,cAAc,WAAW,KAAiB,QAwDlF,CAAC"}
1
+ {"version":3,"file":"valkey-namespace.d.ts","sourceRoot":"","sources":["../../src/backings/valkey-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAkC9D,eAAO,MAAM,6BAA6B,cAAc,WAAW,KAAiB,QAoB/E,CAAC"}
@@ -1,10 +1,8 @@
1
1
  import { shellQuote } from "@intentic/sandbox-run/quote";
2
2
  import { z } from "zod";
3
- import { containerId } from "../core/backing-ssh.js";
4
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
3
+ import { bindingSchema, createInstanceBindingProvider } from "../core/instance-binding.js";
5
4
  import { sshExecutor } from "../core/ssh.js";
6
- const namespaceSchema = sshSchema.extend({
7
- instance: z.string(),
5
+ const namespaceSchema = bindingSchema.extend({
8
6
  instanceHost: z.string(),
9
7
  instancePort: z.string(),
10
8
  adminPassword: z.string(),
@@ -12,7 +10,6 @@ const namespaceSchema = sshSchema.extend({
12
10
  password: z.string(),
13
11
  keyPrefix: z.string(),
14
12
  });
15
- const parse = (inputs) => parseInputs(namespaceSchema, inputs, "valkey-namespace");
16
13
  const url = (parsed) => `redis://${parsed.username}:${parsed.password}@${parsed.instanceHost}:${parsed.instancePort}/0`;
17
14
  const cli = async (session, cid, parsed, args) => {
18
15
  const result = await session.exec(`docker exec ${cid} valkey-cli -a ${shellQuote(parsed.adminPassword)} --no-auth-warning ${args}`);
@@ -21,62 +18,20 @@ const cli = async (session, cid, parsed, args) => {
21
18
  }
22
19
  return result.stdout.trim();
23
20
  };
24
- export const createValkeyNamespaceProvider = (executor = sshExecutor) => ({
25
- read: async (inputs, ctx) => {
26
- if (hasPendingRef(inputs, "instanceHost", "instancePort")) {
27
- return undefined;
28
- }
29
- const parsed = parse(inputs);
30
- let session;
31
- try {
32
- session = await executor.connect(sshTarget(parsed));
33
- }
34
- catch (error) {
35
- ctx.log(`valkey-namespace "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
36
- return undefined;
37
- }
38
- try {
39
- const cid = await containerId(session, parsed.instance);
40
- if (cid === "") {
41
- return undefined;
42
- }
43
- const user = await cli(session, cid, parsed, `ACL GETUSER ${parsed.username}`);
44
- return user === "" ? undefined : { outputs: { url: url(parsed) } };
45
- }
46
- finally {
47
- await session.dispose();
48
- }
21
+ export const createValkeyNamespaceProvider = (executor = sshExecutor) => createInstanceBindingProvider({
22
+ kind: "valkey-namespace",
23
+ schema: namespaceSchema,
24
+ pendingRefs: ["instanceHost", "instancePort"],
25
+ present: async (session, cid, parsed) => {
26
+ const user = await cli(session, cid, parsed, `ACL GETUSER ${parsed.username}`);
27
+ return user === "" ? undefined : { url: url(parsed) };
49
28
  },
50
- diff: () => ({ action: "noop" }),
51
- apply: async (inputs, _observed, ctx) => {
52
- const parsed = parse(inputs);
53
- const session = await executor.connect(sshTarget(parsed));
54
- try {
55
- const cid = await containerId(session, parsed.instance);
56
- if (cid === "") {
57
- throw new Error(`valkey-namespace "${ctx.id}": instance "${parsed.instance}" is not running`);
58
- }
59
- await cli(session, cid, parsed, `ACL SETUSER ${parsed.username} on '>${parsed.password}' '~${parsed.keyPrefix}:*' +@all`);
60
- return { url: url(parsed) };
61
- }
62
- finally {
63
- await session.dispose();
64
- }
29
+ create: async (session, cid, parsed) => {
30
+ await cli(session, cid, parsed, `ACL SETUSER ${parsed.username} on '>${parsed.password}' '~${parsed.keyPrefix}:*' +@all`);
31
+ return { url: url(parsed) };
65
32
  },
66
- delete: async (inputs, ctx) => {
67
- const parsed = parse(inputs);
68
- const session = await executor.connect(sshTarget(parsed));
69
- try {
70
- const cid = await containerId(session, parsed.instance);
71
- if (cid === "") {
72
- ctx.log(`valkey-namespace "${ctx.id}": instance "${parsed.instance}" already gone; nothing to drop`);
73
- return;
74
- }
75
- await cli(session, cid, parsed, `ACL DELUSER ${parsed.username}`);
76
- }
77
- finally {
78
- await session.dispose();
79
- }
33
+ drop: async (session, cid, parsed) => {
34
+ await cli(session, cid, parsed, `ACL DELUSER ${parsed.username}`);
80
35
  },
81
- });
36
+ }, executor);
82
37
  //# sourceMappingURL=valkey-namespace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"valkey-namespace.js","sourceRoot":"","sources":["../../src/backings/valkey-namespace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"valkey-namespace.js","sourceRoot":"","sources":["../../src/backings/valkey-namespace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC;IACzC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IAExB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IAEzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAGH,MAAM,GAAG,GAAG,CAAC,MAAuB,EAAU,EAAE,CAAC,WAAW,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC;AAIjJ,MAAM,GAAG,GAAG,KAAK,EAAE,OAAmB,EAAE,GAAW,EAAE,MAAuB,EAAE,IAAY,EAAmB,EAAE;IAI3G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,kBAAkB,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;IACpI,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAQ,GAAgB,WAAW,EAAY,EAAE,CAC3F,6BAA6B,CACzB;IACI,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,eAAe;IACvB,WAAW,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAEnC,MAAM,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,QAAQ,OAAO,MAAM,CAAC,SAAS,WAAW,CAAC,CAAC;QAC1H,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;CACJ,EACD,QAAQ,CACX,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createValkeyProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=valkey.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"valkey.d.ts","sourceRoot":"","sources":["../../src/backings/valkey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAMjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AA8DhF,eAAO,MAAM,oBAAoB,cAAc,WAAW,KAAiB,QAuEzE,CAAC"}
1
+ {"version":3,"file":"valkey.d.ts","sourceRoot":"","sources":["../../src/backings/valkey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAsClD,eAAO,MAAM,oBAAoB,cAAc,WAAW,KAAiB,QAgBtE,CAAC"}
@@ -1,25 +1,13 @@
1
- import { HASH_KEY } from "@intentic/graph";
1
+ import { shellQuote } from "@intentic/sandbox-run/quote";
2
2
  import { z } from "zod";
3
- import { composeDown, composeUp, containerImage, containerLabel, restampBacking, stateDir, waitReady } from "../core/backing-ssh.js";
4
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
5
- import { listStampedContainers } from "../core/list-stamped.js";
3
+ import { backingSchema, createBackingProvider } from "../core/backing-provider.js";
4
+ import { execProbe, stampLabels } from "../core/backing-ssh.js";
6
5
  import { sshExecutor } from "../core/ssh.js";
7
- import { shellQuote } from "@intentic/sandbox-run/quote";
8
6
  const KIND = "valkey";
9
- const READY_TIMEOUT_MS = 60_000;
10
- const valkeySchema = sshSchema.extend({
11
- internalIp: z.string(),
12
- publishPort: z.number(),
7
+ const valkeySchema = backingSchema.extend({
13
8
  adminPassword: z.string(),
14
- image: z.string(),
15
- protect: z.boolean().default(false),
16
9
  });
17
- const parse = (inputs) => parseInputs(valkeySchema, inputs, KIND);
18
- const outputsFor = (parsed) => ({
19
- internalHost: parsed.internalIp,
20
- port: String(parsed.publishPort),
21
- });
22
- const composeYaml = (id, hash, parsed) => [
10
+ const composeYaml = (parsed, id, hash) => [
23
11
  "services:",
24
12
  " valkey:",
25
13
  ` image: ${parsed.image}`,
@@ -29,89 +17,21 @@ const composeYaml = (id, hash, parsed) => [
29
17
  " - data:/data",
30
18
  " - ./valkey.conf:/etc/valkey/valkey.conf:ro",
31
19
  ` ports: [ "${parsed.publishPort}:6379" ]`,
32
- ` labels: [ "intentic.id=${id}", "intentic.type=${KIND}", "intentic.hash=${hash}"${parsed.protect ? ', "intentic.protect=true"' : ""} ]`,
20
+ stampLabels(KIND, id, hash, parsed.protect),
33
21
  "volumes: { data: {} }",
34
22
  "",
35
23
  ].join("\n");
36
24
  const valkeyConf = (parsed) => [`requirepass ${parsed.adminPassword}`, "appendonly yes", ""].join("\n");
37
- const ensureFiles = async (session, id, hash, parsed) => {
38
- const dir = stateDir(KIND, id);
39
- await session.exec(`mkdir -p ${dir}`);
40
- await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, hash, parsed)}COMPOSE_EOF`);
41
- await session.exec(`cat > ${dir}/valkey.conf <<'CONF_EOF'\n${valkeyConf(parsed)}CONF_EOF`);
42
- await session.exec(`chmod 600 ${dir}/valkey.conf`);
43
- };
44
- const readyProbe = (id, parsed) => `cid=$(docker ps -q --filter "label=intentic.id=${id}"); [ -n "$cid" ] && docker exec "$cid" valkey-cli -a ${shellQuote(parsed.adminPassword)} ping | grep -q PONG`;
45
- export const createValkeyProvider = (executor = sshExecutor) => ({
46
- read: async (inputs, ctx) => {
47
- if (hasPendingRef(inputs, "internalIp")) {
48
- return undefined;
49
- }
50
- const parsed = parse(inputs);
51
- let session;
52
- try {
53
- session = await executor.connect(sshTarget(parsed));
54
- }
55
- catch (error) {
56
- ctx.log(`valkey "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
57
- return undefined;
58
- }
59
- try {
60
- const probe = await session.exec(readyProbe(ctx.id, parsed));
61
- if (probe.code !== 0) {
62
- return undefined;
63
- }
64
- const stampHash = await containerLabel(session, ctx.id, HASH_KEY);
65
- return {
66
- outputs: outputsFor(parsed),
67
- detail: { image: await containerImage(session, ctx.id) },
68
- ...(stampHash === "" ? {} : { stampHash }),
69
- };
70
- }
71
- finally {
72
- await session.dispose();
73
- }
74
- },
75
- diff: (inputs, observed) => {
76
- const parsed = parse(inputs);
77
- const image = (observed.detail?.["image"] ?? "");
78
- return image === parsed.image
79
- ? { action: "noop" }
80
- : { action: "update", reason: `valkey image differs (running ${image}, want ${parsed.image})` };
81
- },
82
- apply: async (inputs, _observed, ctx) => {
83
- const parsed = parse(inputs);
84
- const session = await executor.connect(sshTarget(parsed));
85
- try {
86
- await ensureFiles(session, ctx.id, ctx.inputsHash ?? "", parsed);
87
- await composeUp(session, KIND, ctx.id);
88
- await waitReady(session, KIND, ctx.id, readyProbe(ctx.id, parsed), READY_TIMEOUT_MS);
89
- return outputsFor(parsed);
90
- }
91
- finally {
92
- await session.dispose();
93
- }
94
- },
95
- delete: async (inputs, ctx) => {
96
- const session = await executor.connect(sshTarget(parseInputs(sshSchema, inputs, KIND)));
97
- try {
98
- await composeDown(session, KIND, ctx.id);
99
- }
100
- finally {
101
- await session.dispose();
102
- }
103
- },
104
- list: (sources, ctx) => listStampedContainers(executor, KIND, sources, ctx.log),
105
- restamp: async (oldId, inputs, ctx) => {
106
- const target = sshTarget(parseInputs(sshSchema, inputs, KIND));
107
- const image = typeof inputs["image"] === "string" ? inputs["image"] : "busybox";
108
- const session = await executor.connect(target);
109
- try {
110
- await restampBacking(session, KIND, oldId, ctx.id, image);
111
- }
112
- finally {
113
- await session.dispose();
114
- }
115
- },
116
- });
25
+ export const createValkeyProvider = (executor = sshExecutor) => createBackingProvider({
26
+ kind: KIND,
27
+ schema: valkeySchema,
28
+ readyTimeoutMs: 60_000,
29
+ outputs: (parsed) => ({ internalHost: parsed.internalIp, port: String(parsed.publishPort) }),
30
+ files: (parsed, id, hash) => ({
31
+ "compose.yaml": composeYaml(parsed, id, hash),
32
+ "valkey.conf": { content: valkeyConf(parsed), secret: true },
33
+ }),
34
+ probe: (parsed, id) => execProbe(id, `valkey-cli -a ${shellQuote(parsed.adminPassword)} ping | grep -q PONG`),
35
+ restamp: true,
36
+ }, executor);
117
37
  //# sourceMappingURL=valkey.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"valkey.js","sourceRoot":"","sources":["../../src/backings/valkey.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"valkey.js","sourceRoot":"","sources":["../../src/backings/valkey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,IAAI,GAAG,QAAQ,CAAC;AAEtB,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;IAGtC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC5B,CAAC,CAAC;AAMH,MAAM,WAAW,GAAG,CAAC,MAAoB,EAAE,EAAU,EAAE,IAAY,EAAU,EAAE,CAC3E;IACI,WAAW;IACX,WAAW;IACX,cAAc,MAAM,CAAC,KAAK,EAAE;IAC5B,6BAA6B;IAC7B,yDAAyD;IACzD,cAAc;IACd,oBAAoB;IACpB,kDAAkD;IAClD,iBAAiB,MAAM,CAAC,WAAW,UAAU;IAC7C,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3C,uBAAuB;IACvB,EAAE;CACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAIjB,MAAM,UAAU,GAAG,CAAC,MAAoB,EAAU,EAAE,CAAC,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAK9H,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,GAAgB,WAAW,EAAY,EAAE,CAClF,qBAAqB,CACjB;IACI,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,YAAY;IACpB,cAAc,EAAE,MAAM;IACtB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5F,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC;QAC7C,aAAa,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;KAC/D,CAAC;IACF,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,iBAAiB,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC;IAE7G,OAAO,EAAE,IAAI;CAChB,EACD,QAAQ,CACX,CAAC"}