@intentic/providers 1.0.2

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/auth/authentik-api.d.ts +23 -0
  4. package/dist/auth/authentik-api.d.ts.map +1 -0
  5. package/dist/auth/authentik-api.js +67 -0
  6. package/dist/auth/authentik-api.js.map +1 -0
  7. package/dist/auth/authentik-client.d.ts +4 -0
  8. package/dist/auth/authentik-client.d.ts.map +1 -0
  9. package/dist/auth/authentik-client.js +50 -0
  10. package/dist/auth/authentik-client.js.map +1 -0
  11. package/dist/auth/authentik.d.ts +4 -0
  12. package/dist/auth/authentik.d.ts.map +1 -0
  13. package/dist/auth/authentik.js +132 -0
  14. package/dist/auth/authentik.js.map +1 -0
  15. package/dist/backup/backup-restore.d.ts +15 -0
  16. package/dist/backup/backup-restore.d.ts.map +1 -0
  17. package/dist/backup/backup-restore.js +51 -0
  18. package/dist/backup/backup-restore.js.map +1 -0
  19. package/dist/backup/backup.d.ts +6 -0
  20. package/dist/backup/backup.d.ts.map +1 -0
  21. package/dist/backup/backup.js +154 -0
  22. package/dist/backup/backup.js.map +1 -0
  23. package/dist/backup/migrate-host.d.ts +6 -0
  24. package/dist/backup/migrate-host.d.ts.map +1 -0
  25. package/dist/backup/migrate-host.js +46 -0
  26. package/dist/backup/migrate-host.js.map +1 -0
  27. package/dist/core/backing-ssh.d.ts +9 -0
  28. package/dist/core/backing-ssh.d.ts.map +1 -0
  29. package/dist/core/backing-ssh.js +67 -0
  30. package/dist/core/backing-ssh.js.map +1 -0
  31. package/dist/core/ci-yaml.d.ts +3 -0
  32. package/dist/core/ci-yaml.d.ts.map +1 -0
  33. package/dist/core/ci-yaml.js +15 -0
  34. package/dist/core/ci-yaml.js.map +1 -0
  35. package/dist/core/guarded-update.d.ts +14 -0
  36. package/dist/core/guarded-update.d.ts.map +1 -0
  37. package/dist/core/guarded-update.js +25 -0
  38. package/dist/core/guarded-update.js.map +1 -0
  39. package/dist/core/inputs.d.ts +27 -0
  40. package/dist/core/inputs.d.ts.map +1 -0
  41. package/dist/core/inputs.js +36 -0
  42. package/dist/core/inputs.js.map +1 -0
  43. package/dist/core/ssh-probe.d.ts +5 -0
  44. package/dist/core/ssh-probe.d.ts.map +1 -0
  45. package/dist/core/ssh-probe.js +22 -0
  46. package/dist/core/ssh-probe.js.map +1 -0
  47. package/dist/core/ssh.d.ts +31 -0
  48. package/dist/core/ssh.d.ts.map +1 -0
  49. package/dist/core/ssh.js +186 -0
  50. package/dist/core/ssh.js.map +1 -0
  51. package/dist/data/garage-bucket.d.ts +4 -0
  52. package/dist/data/garage-bucket.d.ts.map +1 -0
  53. package/dist/data/garage-bucket.js +92 -0
  54. package/dist/data/garage-bucket.js.map +1 -0
  55. package/dist/data/garage.d.ts +4 -0
  56. package/dist/data/garage.d.ts.map +1 -0
  57. package/dist/data/garage.js +124 -0
  58. package/dist/data/garage.js.map +1 -0
  59. package/dist/data/postgres-database.d.ts +4 -0
  60. package/dist/data/postgres-database.d.ts.map +1 -0
  61. package/dist/data/postgres-database.js +88 -0
  62. package/dist/data/postgres-database.js.map +1 -0
  63. package/dist/data/postgres.d.ts +4 -0
  64. package/dist/data/postgres.d.ts.map +1 -0
  65. package/dist/data/postgres.js +106 -0
  66. package/dist/data/postgres.js.map +1 -0
  67. package/dist/data/valkey-namespace.d.ts +4 -0
  68. package/dist/data/valkey-namespace.d.ts.map +1 -0
  69. package/dist/data/valkey-namespace.js +78 -0
  70. package/dist/data/valkey-namespace.js.map +1 -0
  71. package/dist/data/valkey.d.ts +4 -0
  72. package/dist/data/valkey.d.ts.map +1 -0
  73. package/dist/data/valkey.js +105 -0
  74. package/dist/data/valkey.js.map +1 -0
  75. package/dist/forgejo/ci.d.ts +4 -0
  76. package/dist/forgejo/ci.d.ts.map +1 -0
  77. package/dist/forgejo/ci.js +138 -0
  78. package/dist/forgejo/ci.js.map +1 -0
  79. package/dist/forgejo/forgejo-api.d.ts +209 -0
  80. package/dist/forgejo/forgejo-api.d.ts.map +1 -0
  81. package/dist/forgejo/forgejo-api.fake.d.ts +3 -0
  82. package/dist/forgejo/forgejo-api.fake.d.ts.map +1 -0
  83. package/dist/forgejo/forgejo-api.fake.js +31 -0
  84. package/dist/forgejo/forgejo-api.fake.js.map +1 -0
  85. package/dist/forgejo/forgejo-api.js +181 -0
  86. package/dist/forgejo/forgejo-api.js.map +1 -0
  87. package/dist/forgejo/forgejo-notify.d.ts +4 -0
  88. package/dist/forgejo/forgejo-notify.d.ts.map +1 -0
  89. package/dist/forgejo/forgejo-notify.js +103 -0
  90. package/dist/forgejo/forgejo-notify.js.map +1 -0
  91. package/dist/forgejo/forgejo-org.d.ts +4 -0
  92. package/dist/forgejo/forgejo-org.d.ts.map +1 -0
  93. package/dist/forgejo/forgejo-org.js +43 -0
  94. package/dist/forgejo/forgejo-org.js.map +1 -0
  95. package/dist/forgejo/forgejo-runner.d.ts +4 -0
  96. package/dist/forgejo/forgejo-runner.d.ts.map +1 -0
  97. package/dist/forgejo/forgejo-runner.js +111 -0
  98. package/dist/forgejo/forgejo-runner.js.map +1 -0
  99. package/dist/forgejo/forgejo-team.d.ts +4 -0
  100. package/dist/forgejo/forgejo-team.d.ts.map +1 -0
  101. package/dist/forgejo/forgejo-team.js +68 -0
  102. package/dist/forgejo/forgejo-team.js.map +1 -0
  103. package/dist/forgejo/forgejo-user.d.ts +4 -0
  104. package/dist/forgejo/forgejo-user.d.ts.map +1 -0
  105. package/dist/forgejo/forgejo-user.js +50 -0
  106. package/dist/forgejo/forgejo-user.js.map +1 -0
  107. package/dist/forgejo/forgejo.d.ts +4 -0
  108. package/dist/forgejo/forgejo.d.ts.map +1 -0
  109. package/dist/forgejo/forgejo.js +169 -0
  110. package/dist/forgejo/forgejo.js.map +1 -0
  111. package/dist/forgejo/repo.d.ts +4 -0
  112. package/dist/forgejo/repo.d.ts.map +1 -0
  113. package/dist/forgejo/repo.js +80 -0
  114. package/dist/forgejo/repo.js.map +1 -0
  115. package/dist/github/gh-ci.d.ts +4 -0
  116. package/dist/github/gh-ci.d.ts.map +1 -0
  117. package/dist/github/gh-ci.js +140 -0
  118. package/dist/github/gh-ci.js.map +1 -0
  119. package/dist/github/gh-deployment.d.ts +4 -0
  120. package/dist/github/gh-deployment.d.ts.map +1 -0
  121. package/dist/github/gh-deployment.js +92 -0
  122. package/dist/github/gh-deployment.js.map +1 -0
  123. package/dist/github/gh-repo.d.ts +4 -0
  124. package/dist/github/gh-repo.d.ts.map +1 -0
  125. package/dist/github/gh-repo.js +52 -0
  126. package/dist/github/gh-repo.js.map +1 -0
  127. package/dist/github/github-api.d.ts +70 -0
  128. package/dist/github/github-api.d.ts.map +1 -0
  129. package/dist/github/github-api.js +120 -0
  130. package/dist/github/github-api.js.map +1 -0
  131. package/dist/github/github.d.ts +4 -0
  132. package/dist/github/github.d.ts.map +1 -0
  133. package/dist/github/github.js +34 -0
  134. package/dist/github/github.js.map +1 -0
  135. package/dist/gitlab/gitlab-api.d.ts +77 -0
  136. package/dist/gitlab/gitlab-api.d.ts.map +1 -0
  137. package/dist/gitlab/gitlab-api.js +124 -0
  138. package/dist/gitlab/gitlab-api.js.map +1 -0
  139. package/dist/gitlab/gitlab.d.ts +4 -0
  140. package/dist/gitlab/gitlab.d.ts.map +1 -0
  141. package/dist/gitlab/gitlab.js +34 -0
  142. package/dist/gitlab/gitlab.js.map +1 -0
  143. package/dist/gitlab/gl-ci.d.ts +4 -0
  144. package/dist/gitlab/gl-ci.d.ts.map +1 -0
  145. package/dist/gitlab/gl-ci.js +130 -0
  146. package/dist/gitlab/gl-ci.js.map +1 -0
  147. package/dist/gitlab/gl-deployment.d.ts +4 -0
  148. package/dist/gitlab/gl-deployment.d.ts.map +1 -0
  149. package/dist/gitlab/gl-deployment.js +93 -0
  150. package/dist/gitlab/gl-deployment.js.map +1 -0
  151. package/dist/gitlab/gl-repo.d.ts +4 -0
  152. package/dist/gitlab/gl-repo.d.ts.map +1 -0
  153. package/dist/gitlab/gl-repo.js +61 -0
  154. package/dist/gitlab/gl-repo.js.map +1 -0
  155. package/dist/host/host.d.ts +4 -0
  156. package/dist/host/host.d.ts.map +1 -0
  157. package/dist/host/host.js +48 -0
  158. package/dist/host/host.js.map +1 -0
  159. package/dist/host/workspace.d.ts +4 -0
  160. package/dist/host/workspace.d.ts.map +1 -0
  161. package/dist/host/workspace.js +152 -0
  162. package/dist/host/workspace.js.map +1 -0
  163. package/dist/index.d.ts +51 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +43 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/integrations/discord-api.d.ts +31 -0
  168. package/dist/integrations/discord-api.d.ts.map +1 -0
  169. package/dist/integrations/discord-api.js +85 -0
  170. package/dist/integrations/discord-api.js.map +1 -0
  171. package/dist/integrations/discord.d.ts +4 -0
  172. package/dist/integrations/discord.d.ts.map +1 -0
  173. package/dist/integrations/discord.js +133 -0
  174. package/dist/integrations/discord.js.map +1 -0
  175. package/dist/integrations/stripe-api.d.ts +8 -0
  176. package/dist/integrations/stripe-api.d.ts.map +1 -0
  177. package/dist/integrations/stripe-api.js +16 -0
  178. package/dist/integrations/stripe-api.js.map +1 -0
  179. package/dist/integrations/stripe.d.ts +4 -0
  180. package/dist/integrations/stripe.d.ts.map +1 -0
  181. package/dist/integrations/stripe.js +28 -0
  182. package/dist/integrations/stripe.js.map +1 -0
  183. package/dist/komodo/deployment.d.ts +4 -0
  184. package/dist/komodo/deployment.d.ts.map +1 -0
  185. package/dist/komodo/deployment.js +103 -0
  186. package/dist/komodo/deployment.js.map +1 -0
  187. package/dist/komodo/komodo-api.d.ts +150 -0
  188. package/dist/komodo/komodo-api.d.ts.map +1 -0
  189. package/dist/komodo/komodo-api.js +104 -0
  190. package/dist/komodo/komodo-api.js.map +1 -0
  191. package/dist/komodo/komodo-notify.d.ts +4 -0
  192. package/dist/komodo/komodo-notify.d.ts.map +1 -0
  193. package/dist/komodo/komodo-notify.js +88 -0
  194. package/dist/komodo/komodo-notify.js.map +1 -0
  195. package/dist/komodo/komodo-periphery.d.ts +4 -0
  196. package/dist/komodo/komodo-periphery.d.ts.map +1 -0
  197. package/dist/komodo/komodo-periphery.js +92 -0
  198. package/dist/komodo/komodo-periphery.js.map +1 -0
  199. package/dist/komodo/komodo-server.d.ts +4 -0
  200. package/dist/komodo/komodo-server.d.ts.map +1 -0
  201. package/dist/komodo/komodo-server.js +54 -0
  202. package/dist/komodo/komodo-server.js.map +1 -0
  203. package/dist/komodo/komodo-user.d.ts +4 -0
  204. package/dist/komodo/komodo-user.d.ts.map +1 -0
  205. package/dist/komodo/komodo-user.js +66 -0
  206. package/dist/komodo/komodo-user.js.map +1 -0
  207. package/dist/komodo/komodo.d.ts +4 -0
  208. package/dist/komodo/komodo.d.ts.map +1 -0
  209. package/dist/komodo/komodo.js +222 -0
  210. package/dist/komodo/komodo.js.map +1 -0
  211. package/dist/network/cf-route.d.ts +5 -0
  212. package/dist/network/cf-route.d.ts.map +1 -0
  213. package/dist/network/cf-route.js +74 -0
  214. package/dist/network/cf-route.js.map +1 -0
  215. package/dist/network/cloudflare-api.d.ts +85 -0
  216. package/dist/network/cloudflare-api.d.ts.map +1 -0
  217. package/dist/network/cloudflare-api.js +110 -0
  218. package/dist/network/cloudflare-api.js.map +1 -0
  219. package/dist/network/cloudflare.d.ts +4 -0
  220. package/dist/network/cloudflare.d.ts.map +1 -0
  221. package/dist/network/cloudflare.js +29 -0
  222. package/dist/network/cloudflare.js.map +1 -0
  223. package/dist/network/tunnel.d.ts +5 -0
  224. package/dist/network/tunnel.d.ts.map +1 -0
  225. package/dist/network/tunnel.js +127 -0
  226. package/dist/network/tunnel.js.map +1 -0
  227. package/dist/observability/signoz.d.ts +4 -0
  228. package/dist/observability/signoz.d.ts.map +1 -0
  229. package/dist/observability/signoz.js +391 -0
  230. package/dist/observability/signoz.js.map +1 -0
  231. package/dist/providers.d.ts +25 -0
  232. package/dist/providers.d.ts.map +1 -0
  233. package/dist/providers.js +110 -0
  234. package/dist/providers.js.map +1 -0
  235. package/dist/services/compose-service.d.ts +34 -0
  236. package/dist/services/compose-service.d.ts.map +1 -0
  237. package/dist/services/compose-service.js +150 -0
  238. package/dist/services/compose-service.js.map +1 -0
  239. package/dist/services/infisical.d.ts +4 -0
  240. package/dist/services/infisical.d.ts.map +1 -0
  241. package/dist/services/infisical.js +72 -0
  242. package/dist/services/infisical.js.map +1 -0
  243. package/dist/services/invoiceninja.d.ts +4 -0
  244. package/dist/services/invoiceninja.d.ts.map +1 -0
  245. package/dist/services/invoiceninja.js +116 -0
  246. package/dist/services/invoiceninja.js.map +1 -0
  247. package/dist/services/openproject.d.ts +4 -0
  248. package/dist/services/openproject.d.ts.map +1 -0
  249. package/dist/services/openproject.js +45 -0
  250. package/dist/services/openproject.js.map +1 -0
  251. package/dist/services/outline.d.ts +4 -0
  252. package/dist/services/outline.d.ts.map +1 -0
  253. package/dist/services/outline.js +121 -0
  254. package/dist/services/outline.js.map +1 -0
  255. package/dist/services/paperless.d.ts +4 -0
  256. package/dist/services/paperless.d.ts.map +1 -0
  257. package/dist/services/paperless.js +48 -0
  258. package/dist/services/paperless.js.map +1 -0
  259. package/package.json +54 -0
@@ -0,0 +1,66 @@
1
+ import { z } from "zod";
2
+ import { parseInputs } from "../core/inputs.js";
3
+ import { komodoApi } from "./komodo-api.js";
4
+ const komodoUserSchema = z.object({
5
+ komodoUrl: z.string(),
6
+ adminUser: z.string(),
7
+ adminPassword: z.string(),
8
+ username: z.string(),
9
+ password: z.string(),
10
+ grants: z.array(z.object({ deployment: z.string(), level: z.enum(["Read", "Execute", "Write"]) })),
11
+ });
12
+ const parse = (inputs) => parseInputs(komodoUserSchema, inputs, "komodo-user");
13
+ export const createKomodoUserProvider = (api = komodoApi) => ({
14
+ read: async (inputs, ctx) => {
15
+ if (typeof inputs["komodoUrl"] !== "string") {
16
+ return undefined;
17
+ }
18
+ const parsed = parse(inputs);
19
+ try {
20
+ const jwt = await api.login({ baseUrl: parsed.komodoUrl, username: parsed.adminUser, password: parsed.adminPassword });
21
+ const user = (await api.listUsers({ baseUrl: parsed.komodoUrl, jwt })).find((candidate) => candidate.username === parsed.username);
22
+ return user === undefined ? undefined : { outputs: {}, detail: { enabled: user.enabled } };
23
+ }
24
+ catch (error) {
25
+ ctx.log(`komodo-user "${ctx.id}": komodo not reachable yet, treating as not-yet-created: ${String(error)}`);
26
+ return undefined;
27
+ }
28
+ },
29
+ diff: (_inputs, observed) => {
30
+ if (observed.detail?.["enabled"] !== true) {
31
+ return { action: "update", reason: "komodo user is not enabled" };
32
+ }
33
+ return { action: "noop" };
34
+ },
35
+ apply: async (inputs) => {
36
+ const parsed = parse(inputs);
37
+ const jwt = await api.login({ baseUrl: parsed.komodoUrl, username: parsed.adminUser, password: parsed.adminPassword });
38
+ const find = async () => (await api.listUsers({ baseUrl: parsed.komodoUrl, jwt })).find((candidate) => candidate.username === parsed.username)?.id;
39
+ let userId = await find();
40
+ if (userId === undefined) {
41
+ await api.createUser({ baseUrl: parsed.komodoUrl, jwt, username: parsed.username, password: parsed.password });
42
+ userId = await find();
43
+ }
44
+ if (userId === undefined) {
45
+ throw new Error(`komodo user "${parsed.username}" was not found after creation`);
46
+ }
47
+ await api.enableUser({ baseUrl: parsed.komodoUrl, jwt, userId });
48
+ for (const grant of parsed.grants) {
49
+ await api.setPermissionOnTarget({ baseUrl: parsed.komodoUrl, jwt, userId, deployment: grant.deployment, level: grant.level });
50
+ }
51
+ return {};
52
+ },
53
+ delete: async (inputs) => {
54
+ if (typeof inputs["komodoUrl"] !== "string") {
55
+ return;
56
+ }
57
+ const parsed = parse(inputs);
58
+ const jwt = await api.login({ baseUrl: parsed.komodoUrl, username: parsed.adminUser, password: parsed.adminPassword });
59
+ const user = (await api.listUsers({ baseUrl: parsed.komodoUrl, jwt })).find((candidate) => candidate.username === parsed.username);
60
+ if (user === undefined) {
61
+ return;
62
+ }
63
+ await api.deleteUser({ baseUrl: parsed.komodoUrl, jwt, userId: user.id });
64
+ },
65
+ });
66
+ //# sourceMappingURL=komodo-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"komodo-user.js","sourceRoot":"","sources":["../../src/komodo/komodo-user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import { type SshExecutor } from "../core/ssh.js";
3
+ export declare const createKomodoProvider: (executor?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=komodo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"komodo.d.ts","sourceRoot":"","sources":["../../src/komodo/komodo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAsM/D,eAAO,MAAM,oBAAoB,GAAI,WAAU,WAAyB,KAAG,QAgGzE,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { z } from "zod";
2
+ import { guardedUpdate } from "../core/guarded-update.js";
3
+ import { gitProvider, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
4
+ import { sshExecutor } from "../core/ssh.js";
5
+ const komodoSchema = sshSchema.extend({
6
+ internalIp: z.string(),
7
+ domain: z.string(),
8
+ forgejoUrl: z.string(),
9
+ runnerToken: z.string(),
10
+ adminUser: z.string(),
11
+ adminPassword: z.string(),
12
+ gitAccount: z.string(),
13
+ gitToken: z.string(),
14
+ registry: z.string(),
15
+ packagesToken: z.string(),
16
+ coreImage: z.string(),
17
+ peripheryImage: z.string(),
18
+ ferretdbImage: z.string(),
19
+ postgresImage: z.string(),
20
+ guardRepo: z.string().optional(),
21
+ resticImage: z.string().optional(),
22
+ });
23
+ const parse = (inputs) => parseInputs(komodoSchema, inputs, "komodo");
24
+ const CORE = "intentic-komodo-core";
25
+ const CORE_PORT = 9120;
26
+ const STATE_DIR = "/opt/intentic/komodo";
27
+ const READY_TIMEOUT_MS = 90_000;
28
+ const READY_INTERVAL_MS = 3_000;
29
+ const internalUrl = (parsed) => `http://${parsed.internalIp}:${CORE_PORT}`;
30
+ const outputsFor = (parsed) => ({ url: `https://${parsed.domain}`, internalUrl: internalUrl(parsed) });
31
+ const running = async (session) => {
32
+ const result = await session.exec(`docker ps --filter "label=intentic.id=${CORE}" --format '{{.Names}}'`);
33
+ return result.stdout.trim() !== "";
34
+ };
35
+ const PROJECT = "komodo";
36
+ const runningImages = async (session) => {
37
+ const result = await session.exec(`ids=$(docker ps -q --filter "label=com.docker.compose.project=${PROJECT}"); ` +
38
+ `[ -n "$ids" ] && docker inspect --format '{{index .Config.Labels "com.docker.compose.service"}}={{.Config.Image}}' $ids || true`);
39
+ const images = {};
40
+ for (const line of result.stdout.trim().split("\n")) {
41
+ const eq = line.indexOf("=");
42
+ if (eq > 0) {
43
+ images[line.slice(0, eq)] = line.slice(eq + 1);
44
+ }
45
+ }
46
+ return images;
47
+ };
48
+ const desiredImages = (parsed) => ({
49
+ postgres: parsed.postgresImage,
50
+ ferretdb: parsed.ferretdbImage,
51
+ core: parsed.coreImage,
52
+ periphery: parsed.peripheryImage,
53
+ });
54
+ const composeYaml = (images) => [
55
+ "services:",
56
+ " postgres:",
57
+ ` image: ${images["postgres"]}`,
58
+ " restart: unless-stopped",
59
+ " environment: { POSTGRES_USER: $KOMODO_DATABASE_USERNAME, POSTGRES_PASSWORD: $KOMODO_DATABASE_PASSWORD, POSTGRES_DB: postgres }",
60
+ " volumes: [ postgres-data:/var/lib/postgresql/data ]",
61
+ " ferretdb:",
62
+ ` image: ${images["ferretdb"]}`,
63
+ " restart: unless-stopped",
64
+ " depends_on: [ postgres ]",
65
+ " environment: { FERRETDB_POSTGRESQL_URL: postgres://$KOMODO_DATABASE_USERNAME:$KOMODO_DATABASE_PASSWORD@postgres:5432/postgres }",
66
+ " volumes: [ ferretdb-state:/state ]",
67
+ " core:",
68
+ ` image: ${images["core"]}`,
69
+ " restart: unless-stopped",
70
+ " depends_on: [ ferretdb ]",
71
+ ` ports: [ "${CORE_PORT}:9120" ]`,
72
+ " env_file: ./.env",
73
+ " volumes: [ keys:/config/keys, ./config.toml:/config/config.toml:ro ]",
74
+ ` labels: [ "intentic.id=${CORE}" ]`,
75
+ " periphery:",
76
+ ` image: ${images["periphery"]}`,
77
+ " restart: unless-stopped",
78
+ " volumes: [ /var/run/docker.sock:/var/run/docker.sock, /proc:/proc, keys:/config/keys ]",
79
+ "volumes: { postgres-data: {}, ferretdb-state: {}, keys: {} }",
80
+ "",
81
+ ].join("\n");
82
+ const configToml = (parsed) => {
83
+ const git = gitProvider(parsed.forgejoUrl);
84
+ return [
85
+ "[[git_provider]]",
86
+ `domain = "${git.domain}"`,
87
+ `https = ${git.https}`,
88
+ `accounts = [{ username = "${parsed.gitAccount}", token = "${parsed.gitToken}" }]`,
89
+ "",
90
+ "[[docker_registry]]",
91
+ `domain = "${parsed.registry}"`,
92
+ `accounts = [{ username = "${parsed.adminUser}", token = "${parsed.packagesToken}" }]`,
93
+ "",
94
+ ].join("\n");
95
+ };
96
+ const ensureFiles = async (session, parsed, images) => {
97
+ await session.exec(`mkdir -p ${STATE_DIR}`);
98
+ await session.exec(`cat > ${STATE_DIR}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(images)}COMPOSE_EOF`);
99
+ await session.exec(`cat > ${STATE_DIR}/config.toml <<'CONFIG_EOF'\n${configToml(parsed)}CONFIG_EOF`);
100
+ const staticEnv = [
101
+ "TZ=Etc/UTC",
102
+ "KOMODO_LOCAL_AUTH=true",
103
+ "KOMODO_CONFIG_PATH=/config/config.toml",
104
+ `KOMODO_INIT_ADMIN_USERNAME=${parsed.adminUser}`,
105
+ "KOMODO_DATABASE_ADDRESS=ferretdb:27017",
106
+ "KOMODO_FIRST_SERVER_NAME=Local",
107
+ "KOMODO_FIRST_SERVER_ADDRESS=https://periphery:8120",
108
+ "KOMODO_RESOURCE_POLL_INTERVAL=1-min",
109
+ ]
110
+ .map((line) => `'${line}'`)
111
+ .join(" ");
112
+ const generated = [
113
+ `echo "KOMODO_HOST=https://${parsed.domain}"`,
114
+ `echo "KOMODO_INIT_ADMIN_PASSWORD=${parsed.adminPassword}"`,
115
+ `echo "KOMODO_PASSKEY=$(openssl rand -hex 32)"`,
116
+ `echo "KOMODO_JWT_SECRET=$(openssl rand -hex 32)"`,
117
+ 'echo "KOMODO_DATABASE_USERNAME=komodo"',
118
+ `echo "KOMODO_DATABASE_PASSWORD=$(openssl rand -hex 16)"`,
119
+ ].join("; ");
120
+ await session.exec(`test -f ${STATE_DIR}/.env || { printf '%s\\n' ${staticEnv} > ${STATE_DIR}/.env; { ${generated}; } >> ${STATE_DIR}/.env; }`);
121
+ };
122
+ const healthy = async (session, parsed) => {
123
+ const result = await session.exec(`wget -q -O /dev/null ${internalUrl(parsed)}`);
124
+ return result.code === 0;
125
+ };
126
+ const waitHealthy = async (session, parsed) => {
127
+ const deadline = Date.now() + READY_TIMEOUT_MS;
128
+ for (;;) {
129
+ if (await healthy(session, parsed)) {
130
+ return;
131
+ }
132
+ if (Date.now() >= deadline) {
133
+ throw new Error(`komodo did not become healthy within ${READY_TIMEOUT_MS}ms`);
134
+ }
135
+ await new Promise((resolve) => setTimeout(resolve, READY_INTERVAL_MS));
136
+ }
137
+ };
138
+ export const createKomodoProvider = (executor = sshExecutor) => ({
139
+ read: async (inputs, ctx) => {
140
+ const parsed = parse(inputs);
141
+ let session;
142
+ try {
143
+ session = await executor.connect(sshTarget(parsed));
144
+ }
145
+ catch (error) {
146
+ ctx.log(`komodo "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
147
+ return undefined;
148
+ }
149
+ try {
150
+ if (!(await running(session)) || !(await healthy(session, parsed))) {
151
+ return undefined;
152
+ }
153
+ return { outputs: outputsFor(parsed), detail: { images: await runningImages(session) } };
154
+ }
155
+ finally {
156
+ await session.dispose();
157
+ }
158
+ },
159
+ diff: (inputs, observed) => {
160
+ const parsed = parse(inputs);
161
+ const images = (observed.detail?.["images"] ?? {});
162
+ for (const [service, desired] of Object.entries(desiredImages(parsed))) {
163
+ if (images[service] !== desired) {
164
+ return { action: "update", reason: `komodo ${service} image differs (running ${String(images[service])}, want ${desired})` };
165
+ }
166
+ }
167
+ return { action: "noop" };
168
+ },
169
+ apply: async (inputs, observed, ctx) => {
170
+ const parsed = parse(inputs);
171
+ const session = await executor.connect(sshTarget(parsed));
172
+ try {
173
+ const bringUp = async (images) => {
174
+ await ensureFiles(session, parsed, images);
175
+ const up = await session.exec(`docker compose -p komodo --project-directory ${STATE_DIR} --env-file ${STATE_DIR}/.env -f ${STATE_DIR}/compose.yaml up -d`);
176
+ if (up.code !== 0) {
177
+ throw new Error(`failed to bring up komodo stack: exited ${up.code}: ${up.stderr.trim()}`);
178
+ }
179
+ await waitHealthy(session, parsed);
180
+ };
181
+ const oldImages = observed?.detail?.["images"];
182
+ if (observed !== undefined &&
183
+ parsed.guardRepo !== undefined &&
184
+ parsed.resticImage !== undefined &&
185
+ typeof oldImages === "object" &&
186
+ oldImages !== null) {
187
+ await guardedUpdate({
188
+ session,
189
+ repo: parsed.guardRepo,
190
+ resticImage: parsed.resticImage,
191
+ volumes: ["komodo_postgres-data", "komodo_keys", "komodo_ferretdb-state"],
192
+ tag: `intentic-preupdate-${CORE}`,
193
+ recreate: () => bringUp(desiredImages(parsed)),
194
+ stop: async () => {
195
+ await session.exec('ids=$(docker ps -aq -f label=com.docker.compose.project=komodo); [ -n "$ids" ] && docker rm -f $ids || true');
196
+ },
197
+ rollback: () => bringUp(oldImages),
198
+ log: ctx.log,
199
+ });
200
+ }
201
+ else {
202
+ await bringUp(desiredImages(parsed));
203
+ }
204
+ return outputsFor(parsed);
205
+ }
206
+ finally {
207
+ await session.dispose();
208
+ }
209
+ },
210
+ delete: async (inputs) => {
211
+ const parsed = parse(inputs);
212
+ const session = await executor.connect(sshTarget(parsed));
213
+ try {
214
+ await session.exec(`docker compose -p komodo --project-directory ${STATE_DIR} --env-file ${STATE_DIR}/.env -f ${STATE_DIR}/compose.yaml down -v 2>/dev/null || true`);
215
+ await session.exec(`rm -rf ${STATE_DIR}`);
216
+ }
217
+ finally {
218
+ await session.dispose();
219
+ }
220
+ },
221
+ });
222
+ //# sourceMappingURL=komodo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"komodo.js","sourceRoot":"","sources":["../../src/komodo/komodo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { CloudflareApi } from "./cloudflare-api.js";
3
+ export type DnsPropagationWait = (hostname: string, log: (message: string) => void) => Promise<void>;
4
+ export declare const createCfRouteProvider: (api?: CloudflareApi, awaitPropagation?: DnsPropagationWait) => Provider;
5
+ //# sourceMappingURL=cf-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-route.d.ts","sourceRoot":"","sources":["../../src/network/cf-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAIjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAazD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAoCrG,eAAO,MAAM,qBAAqB,GAC9B,MAAK,aAA6B,EAClC,mBAAkB,kBAA0C,KAC7D,QAqCD,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { formatStamp } from "@intentic/graph";
2
+ import { z } from "zod";
3
+ import { parseInputs } from "../core/inputs.js";
4
+ import { cloudflareApi } from "./cloudflare-api.js";
5
+ const cfRouteSchema = z.object({ hostname: z.string(), zoneId: z.string(), apiToken: z.string(), cname: z.string() });
6
+ const parse = (inputs) => parseInputs(cfRouteSchema, inputs, "cf-route");
7
+ const dohResolves = async (hostname) => {
8
+ try {
9
+ const response = await fetch(`https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(hostname)}&type=A`, {
10
+ headers: { accept: "application/dns-json" },
11
+ });
12
+ if (!response.ok) {
13
+ return false;
14
+ }
15
+ const body = (await response.json());
16
+ return body.Status === 0 && Array.isArray(body.Answer) && body.Answer.length > 0;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ };
22
+ const waitForDnsPropagation = async (hostname, log) => {
23
+ const deadline = Date.now() + 90_000;
24
+ for (;;) {
25
+ if (await dohResolves(hostname)) {
26
+ return;
27
+ }
28
+ if (Date.now() >= deadline) {
29
+ log(`cf-route: ${hostname} not yet observable via DoH after 90s; proceeding (downstream calls may need a retry)`);
30
+ return;
31
+ }
32
+ await new Promise((resolve) => setTimeout(resolve, 2000));
33
+ }
34
+ };
35
+ export const createCfRouteProvider = (api = cloudflareApi, awaitPropagation = waitForDnsPropagation) => ({
36
+ read: async (inputs) => {
37
+ const { hostname, zoneId, apiToken } = parse(inputs);
38
+ const record = await api.findDnsRecord({ apiToken, zoneId, name: hostname });
39
+ if (record === undefined) {
40
+ return undefined;
41
+ }
42
+ return { outputs: { url: `https://${hostname}` }, detail: { content: record.content } };
43
+ },
44
+ diff: (inputs, observed) => {
45
+ const { cname } = parse(inputs);
46
+ const content = observed.detail?.["content"];
47
+ if (content === cname) {
48
+ return { action: "noop" };
49
+ }
50
+ return { action: "update", reason: `CNAME target "${String(content)}" differs from "${cname}"` };
51
+ },
52
+ apply: async (inputs, _observed, ctx) => {
53
+ const { hostname, zoneId, apiToken, cname } = parse(inputs);
54
+ const comment = formatStamp(ctx.id);
55
+ const record = await api.findDnsRecord({ apiToken, zoneId, name: hostname });
56
+ if (record === undefined) {
57
+ await api.createDnsRecord({ apiToken, zoneId, name: hostname, content: cname, comment });
58
+ }
59
+ else {
60
+ await api.updateDnsRecord({ apiToken, zoneId, recordId: record.id, name: hostname, content: cname, comment });
61
+ }
62
+ await awaitPropagation(hostname, ctx.log);
63
+ return { url: `https://${hostname}` };
64
+ },
65
+ delete: async (inputs) => {
66
+ const { hostname, zoneId, apiToken } = parse(inputs);
67
+ const record = await api.findDnsRecord({ apiToken, zoneId, name: hostname });
68
+ if (record === undefined) {
69
+ return;
70
+ }
71
+ await api.deleteDnsRecord({ apiToken, zoneId, recordId: record.id });
72
+ },
73
+ });
74
+ //# sourceMappingURL=cf-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-route.js","sourceRoot":"","sources":["../../src/network/cf-route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ export interface IngressRule {
2
+ readonly hostname?: string;
3
+ readonly service: string;
4
+ }
5
+ export interface CloudflareApi {
6
+ readonly getZone: (args: {
7
+ readonly apiToken: string;
8
+ readonly zone: string;
9
+ }) => Promise<{
10
+ readonly id: string;
11
+ readonly accountId: string;
12
+ } | undefined>;
13
+ readonly listZones: (args: {
14
+ readonly apiToken: string;
15
+ }) => Promise<{
16
+ readonly id: string;
17
+ readonly name: string;
18
+ readonly accountId: string;
19
+ }[]>;
20
+ readonly findTunnel: (args: {
21
+ readonly accountId: string;
22
+ readonly apiToken: string;
23
+ readonly name: string;
24
+ }) => Promise<{
25
+ readonly id: string;
26
+ } | undefined>;
27
+ readonly createTunnel: (args: {
28
+ readonly accountId: string;
29
+ readonly apiToken: string;
30
+ readonly name: string;
31
+ }) => Promise<{
32
+ readonly id: string;
33
+ }>;
34
+ readonly getTunnelToken: (args: {
35
+ readonly accountId: string;
36
+ readonly apiToken: string;
37
+ readonly tunnelId: string;
38
+ }) => Promise<string>;
39
+ readonly getTunnelIngress: (args: {
40
+ readonly accountId: string;
41
+ readonly apiToken: string;
42
+ readonly tunnelId: string;
43
+ }) => Promise<IngressRule[] | undefined>;
44
+ readonly putTunnelIngress: (args: {
45
+ readonly accountId: string;
46
+ readonly apiToken: string;
47
+ readonly tunnelId: string;
48
+ readonly ingress: readonly IngressRule[];
49
+ }) => Promise<void>;
50
+ readonly findDnsRecord: (args: {
51
+ readonly apiToken: string;
52
+ readonly zoneId: string;
53
+ readonly name: string;
54
+ }) => Promise<{
55
+ readonly id: string;
56
+ readonly content: string;
57
+ } | undefined>;
58
+ readonly createDnsRecord: (args: {
59
+ readonly apiToken: string;
60
+ readonly zoneId: string;
61
+ readonly name: string;
62
+ readonly content: string;
63
+ readonly comment: string;
64
+ }) => Promise<void>;
65
+ readonly updateDnsRecord: (args: {
66
+ readonly apiToken: string;
67
+ readonly zoneId: string;
68
+ readonly recordId: string;
69
+ readonly name: string;
70
+ readonly content: string;
71
+ readonly comment: string;
72
+ }) => Promise<void>;
73
+ readonly deleteTunnel: (args: {
74
+ readonly accountId: string;
75
+ readonly apiToken: string;
76
+ readonly tunnelId: string;
77
+ }) => Promise<void>;
78
+ readonly deleteDnsRecord: (args: {
79
+ readonly apiToken: string;
80
+ readonly zoneId: string;
81
+ readonly recordId: string;
82
+ }) => Promise<void>;
83
+ }
84
+ export declare const cloudflareApi: CloudflareApi;
85
+ //# sourceMappingURL=cloudflare-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-api.d.ts","sourceRoot":"","sources":["../../src/network/cloudflare-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ import { parseResponse } from "../core/inputs.js";
3
+ const ingressRuleSchema = z.object({ hostname: z.string().optional(), service: z.string() });
4
+ const BASE = "https://api.cloudflare.com/client/v4";
5
+ const envelopeSchema = z.object({
6
+ success: z.boolean(),
7
+ errors: z.array(z.object({ code: z.number(), message: z.string() })),
8
+ result: z.unknown(),
9
+ result_info: z.unknown().optional(),
10
+ });
11
+ const request = async (apiToken, path, init) => {
12
+ const label = `Cloudflare API ${init?.method ?? "GET"} ${path}`;
13
+ const response = await fetch(`${BASE}${path}`, {
14
+ ...init,
15
+ headers: {
16
+ Authorization: `Bearer ${apiToken}`,
17
+ ...(init?.body !== undefined ? { "Content-Type": "application/json" } : {}),
18
+ },
19
+ });
20
+ const envelope = parseResponse(envelopeSchema, await response.json(), label);
21
+ if (!response.ok || !envelope.success) {
22
+ const detail = envelope.errors.map((error) => `${error.code} ${error.message}`).join("; ");
23
+ throw new Error(`${label} failed (HTTP ${response.status}): ${detail}`);
24
+ }
25
+ return envelope;
26
+ };
27
+ const call = async (apiToken, path, resultSchema, init) => {
28
+ const envelope = await request(apiToken, path, init);
29
+ return parseResponse(resultSchema, envelope.result, `Cloudflare API ${init?.method ?? "GET"} ${path}`);
30
+ };
31
+ export const cloudflareApi = {
32
+ getZone: async ({ apiToken, zone }) => {
33
+ const zones = await call(apiToken, `/zones?name=${encodeURIComponent(zone)}`, z.array(z.object({ id: z.string(), account: z.object({ id: z.string() }) })));
34
+ const found = zones[0];
35
+ if (found === undefined) {
36
+ return undefined;
37
+ }
38
+ return { id: found.id, accountId: found.account.id };
39
+ },
40
+ listZones: async ({ apiToken }) => {
41
+ const zones = [];
42
+ let page = 1;
43
+ let totalPages = 1;
44
+ do {
45
+ const envelope = await request(apiToken, `/zones?per_page=50&page=${page}`);
46
+ const parsed = parseResponse(z.array(z.object({ id: z.string(), name: z.string(), account: z.object({ id: z.string() }) })), envelope.result, `Cloudflare API GET /zones?per_page=50&page=${page}`);
47
+ for (const zone of parsed) {
48
+ zones.push({ id: zone.id, name: zone.name, accountId: zone.account.id });
49
+ }
50
+ totalPages = z.object({ total_pages: z.number() }).safeParse(envelope.result_info).data?.total_pages ?? 1;
51
+ page += 1;
52
+ } while (page <= totalPages);
53
+ return zones;
54
+ },
55
+ findTunnel: async ({ accountId, apiToken, name }) => {
56
+ const tunnels = await call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel?name=${encodeURIComponent(name)}&is_deleted=false`, z.array(z.object({ id: z.string() })));
57
+ const found = tunnels[0];
58
+ if (found === undefined) {
59
+ return undefined;
60
+ }
61
+ return { id: found.id };
62
+ },
63
+ createTunnel: ({ accountId, apiToken, name }) => call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel`, z.object({ id: z.string() }), {
64
+ method: "POST",
65
+ body: JSON.stringify({ name, config_src: "cloudflare" }),
66
+ }),
67
+ getTunnelToken: ({ accountId, apiToken, tunnelId }) => call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel/${encodeURIComponent(tunnelId)}/token`, z.string()),
68
+ getTunnelIngress: async ({ accountId, apiToken, tunnelId }) => {
69
+ const config = await call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel/${encodeURIComponent(tunnelId)}/configurations`, z.object({ config: z.object({ ingress: z.array(ingressRuleSchema).optional() }).optional() }).nullable());
70
+ const ingress = config?.config?.ingress;
71
+ return ingress?.map((rule) => (rule.hostname === undefined ? { service: rule.service } : { hostname: rule.hostname, service: rule.service }));
72
+ },
73
+ putTunnelIngress: async ({ accountId, apiToken, tunnelId, ingress }) => {
74
+ await call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel/${encodeURIComponent(tunnelId)}/configurations`, z.unknown(), {
75
+ method: "PUT",
76
+ body: JSON.stringify({ config: { ingress } }),
77
+ });
78
+ },
79
+ findDnsRecord: async ({ apiToken, zoneId, name }) => {
80
+ const records = await call(apiToken, `/zones/${encodeURIComponent(zoneId)}/dns_records?type=CNAME&name=${encodeURIComponent(name)}`, z.array(z.object({ id: z.string(), content: z.string() })));
81
+ const found = records[0];
82
+ if (found === undefined) {
83
+ return undefined;
84
+ }
85
+ return { id: found.id, content: found.content };
86
+ },
87
+ createDnsRecord: async ({ apiToken, zoneId, name, content, comment }) => {
88
+ await call(apiToken, `/zones/${encodeURIComponent(zoneId)}/dns_records`, z.unknown(), {
89
+ method: "POST",
90
+ body: JSON.stringify({ type: "CNAME", name, content, proxied: true, comment }),
91
+ });
92
+ },
93
+ updateDnsRecord: async ({ apiToken, zoneId, recordId, name, content, comment }) => {
94
+ await call(apiToken, `/zones/${encodeURIComponent(zoneId)}/dns_records/${encodeURIComponent(recordId)}`, z.unknown(), {
95
+ method: "PUT",
96
+ body: JSON.stringify({ type: "CNAME", name, content, proxied: true, comment }),
97
+ });
98
+ },
99
+ deleteTunnel: async ({ accountId, apiToken, tunnelId }) => {
100
+ await call(apiToken, `/accounts/${encodeURIComponent(accountId)}/cfd_tunnel/${encodeURIComponent(tunnelId)}`, z.unknown(), {
101
+ method: "DELETE",
102
+ });
103
+ },
104
+ deleteDnsRecord: async ({ apiToken, zoneId, recordId }) => {
105
+ await call(apiToken, `/zones/${encodeURIComponent(zoneId)}/dns_records/${encodeURIComponent(recordId)}`, z.unknown(), {
106
+ method: "DELETE",
107
+ });
108
+ },
109
+ };
110
+ //# sourceMappingURL=cloudflare-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-api.js","sourceRoot":"","sources":["../../src/network/cloudflare-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { CloudflareApi } from "./cloudflare-api.js";
3
+ export declare const createCloudflareProvider: (api?: CloudflareApi) => Provider;
4
+ //# sourceMappingURL=cloudflare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/network/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWzD,eAAO,MAAM,wBAAwB,GAAI,MAAK,aAA6B,KAAG,QAuB5E,CAAC"}