@intentic/providers 1.18.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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/app.d.ts +4 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +72 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/authentik-api.d.ts +23 -0
  8. package/dist/authentik-api.d.ts.map +1 -0
  9. package/dist/authentik-api.js +67 -0
  10. package/dist/authentik-api.js.map +1 -0
  11. package/dist/authentik-client.d.ts +4 -0
  12. package/dist/authentik-client.d.ts.map +1 -0
  13. package/dist/authentik-client.js +50 -0
  14. package/dist/authentik-client.js.map +1 -0
  15. package/dist/authentik.d.ts +4 -0
  16. package/dist/authentik.d.ts.map +1 -0
  17. package/dist/authentik.js +132 -0
  18. package/dist/authentik.js.map +1 -0
  19. package/dist/backing-ssh.d.ts +8 -0
  20. package/dist/backing-ssh.d.ts.map +1 -0
  21. package/dist/backing-ssh.js +44 -0
  22. package/dist/backing-ssh.js.map +1 -0
  23. package/dist/backup-restore.d.ts +15 -0
  24. package/dist/backup-restore.d.ts.map +1 -0
  25. package/dist/backup-restore.js +49 -0
  26. package/dist/backup-restore.js.map +1 -0
  27. package/dist/backup.d.ts +4 -0
  28. package/dist/backup.d.ts.map +1 -0
  29. package/dist/backup.js +150 -0
  30. package/dist/backup.js.map +1 -0
  31. package/dist/cf-route.d.ts +5 -0
  32. package/dist/cf-route.d.ts.map +1 -0
  33. package/dist/cf-route.js +74 -0
  34. package/dist/cf-route.js.map +1 -0
  35. package/dist/ci.d.ts +4 -0
  36. package/dist/ci.d.ts.map +1 -0
  37. package/dist/ci.js +151 -0
  38. package/dist/ci.js.map +1 -0
  39. package/dist/cloudflare-api.d.ts +85 -0
  40. package/dist/cloudflare-api.d.ts.map +1 -0
  41. package/dist/cloudflare-api.js +110 -0
  42. package/dist/cloudflare-api.js.map +1 -0
  43. package/dist/cloudflare.d.ts +4 -0
  44. package/dist/cloudflare.d.ts.map +1 -0
  45. package/dist/cloudflare.js +29 -0
  46. package/dist/cloudflare.js.map +1 -0
  47. package/dist/deploy-hook.d.ts +4 -0
  48. package/dist/deploy-hook.d.ts.map +1 -0
  49. package/dist/deploy-hook.js +79 -0
  50. package/dist/deploy-hook.js.map +1 -0
  51. package/dist/deployment.d.ts +4 -0
  52. package/dist/deployment.d.ts.map +1 -0
  53. package/dist/deployment.js +103 -0
  54. package/dist/deployment.js.map +1 -0
  55. package/dist/discord-api.d.ts +31 -0
  56. package/dist/discord-api.d.ts.map +1 -0
  57. package/dist/discord-api.js +85 -0
  58. package/dist/discord-api.js.map +1 -0
  59. package/dist/discord.d.ts +4 -0
  60. package/dist/discord.d.ts.map +1 -0
  61. package/dist/discord.js +133 -0
  62. package/dist/discord.js.map +1 -0
  63. package/dist/forgejo-api.d.ts +209 -0
  64. package/dist/forgejo-api.d.ts.map +1 -0
  65. package/dist/forgejo-api.fake.d.ts +3 -0
  66. package/dist/forgejo-api.fake.d.ts.map +1 -0
  67. package/dist/forgejo-api.fake.js +31 -0
  68. package/dist/forgejo-api.fake.js.map +1 -0
  69. package/dist/forgejo-api.js +181 -0
  70. package/dist/forgejo-api.js.map +1 -0
  71. package/dist/forgejo-notify.d.ts +4 -0
  72. package/dist/forgejo-notify.d.ts.map +1 -0
  73. package/dist/forgejo-notify.js +103 -0
  74. package/dist/forgejo-notify.js.map +1 -0
  75. package/dist/forgejo-org.d.ts +4 -0
  76. package/dist/forgejo-org.d.ts.map +1 -0
  77. package/dist/forgejo-org.js +43 -0
  78. package/dist/forgejo-org.js.map +1 -0
  79. package/dist/forgejo-runner.d.ts +4 -0
  80. package/dist/forgejo-runner.d.ts.map +1 -0
  81. package/dist/forgejo-runner.js +111 -0
  82. package/dist/forgejo-runner.js.map +1 -0
  83. package/dist/forgejo-team.d.ts +4 -0
  84. package/dist/forgejo-team.d.ts.map +1 -0
  85. package/dist/forgejo-team.js +68 -0
  86. package/dist/forgejo-team.js.map +1 -0
  87. package/dist/forgejo-user.d.ts +4 -0
  88. package/dist/forgejo-user.d.ts.map +1 -0
  89. package/dist/forgejo-user.js +50 -0
  90. package/dist/forgejo-user.js.map +1 -0
  91. package/dist/forgejo.d.ts +4 -0
  92. package/dist/forgejo.d.ts.map +1 -0
  93. package/dist/forgejo.js +169 -0
  94. package/dist/forgejo.js.map +1 -0
  95. package/dist/garage-bucket.d.ts +4 -0
  96. package/dist/garage-bucket.d.ts.map +1 -0
  97. package/dist/garage-bucket.js +92 -0
  98. package/dist/garage-bucket.js.map +1 -0
  99. package/dist/garage.d.ts +4 -0
  100. package/dist/garage.d.ts.map +1 -0
  101. package/dist/garage.js +124 -0
  102. package/dist/garage.js.map +1 -0
  103. package/dist/gh-ci.d.ts +4 -0
  104. package/dist/gh-ci.d.ts.map +1 -0
  105. package/dist/gh-ci.js +153 -0
  106. package/dist/gh-ci.js.map +1 -0
  107. package/dist/gh-deployment.d.ts +4 -0
  108. package/dist/gh-deployment.d.ts.map +1 -0
  109. package/dist/gh-deployment.js +92 -0
  110. package/dist/gh-deployment.js.map +1 -0
  111. package/dist/gh-repo.d.ts +4 -0
  112. package/dist/gh-repo.d.ts.map +1 -0
  113. package/dist/gh-repo.js +52 -0
  114. package/dist/gh-repo.js.map +1 -0
  115. package/dist/github-api.d.ts +70 -0
  116. package/dist/github-api.d.ts.map +1 -0
  117. package/dist/github-api.js +120 -0
  118. package/dist/github-api.js.map +1 -0
  119. package/dist/github.d.ts +4 -0
  120. package/dist/github.d.ts.map +1 -0
  121. package/dist/github.js +34 -0
  122. package/dist/github.js.map +1 -0
  123. package/dist/guarded-update.d.ts +14 -0
  124. package/dist/guarded-update.d.ts.map +1 -0
  125. package/dist/guarded-update.js +25 -0
  126. package/dist/guarded-update.js.map +1 -0
  127. package/dist/host.d.ts +4 -0
  128. package/dist/host.d.ts.map +1 -0
  129. package/dist/host.js +48 -0
  130. package/dist/host.js.map +1 -0
  131. package/dist/index.d.ts +42 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +35 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/inputs.d.ts +23 -0
  136. package/dist/inputs.d.ts.map +1 -0
  137. package/dist/inputs.js +34 -0
  138. package/dist/inputs.js.map +1 -0
  139. package/dist/komodo-api.d.ts +150 -0
  140. package/dist/komodo-api.d.ts.map +1 -0
  141. package/dist/komodo-api.js +104 -0
  142. package/dist/komodo-api.js.map +1 -0
  143. package/dist/komodo-notify.d.ts +4 -0
  144. package/dist/komodo-notify.d.ts.map +1 -0
  145. package/dist/komodo-notify.js +88 -0
  146. package/dist/komodo-notify.js.map +1 -0
  147. package/dist/komodo-periphery.d.ts +4 -0
  148. package/dist/komodo-periphery.d.ts.map +1 -0
  149. package/dist/komodo-periphery.js +92 -0
  150. package/dist/komodo-periphery.js.map +1 -0
  151. package/dist/komodo-server.d.ts +4 -0
  152. package/dist/komodo-server.d.ts.map +1 -0
  153. package/dist/komodo-server.js +54 -0
  154. package/dist/komodo-server.js.map +1 -0
  155. package/dist/komodo-user.d.ts +4 -0
  156. package/dist/komodo-user.d.ts.map +1 -0
  157. package/dist/komodo-user.js +66 -0
  158. package/dist/komodo-user.js.map +1 -0
  159. package/dist/komodo.d.ts +4 -0
  160. package/dist/komodo.d.ts.map +1 -0
  161. package/dist/komodo.js +222 -0
  162. package/dist/komodo.js.map +1 -0
  163. package/dist/postgres-database.d.ts +4 -0
  164. package/dist/postgres-database.d.ts.map +1 -0
  165. package/dist/postgres-database.js +88 -0
  166. package/dist/postgres-database.js.map +1 -0
  167. package/dist/postgres.d.ts +4 -0
  168. package/dist/postgres.d.ts.map +1 -0
  169. package/dist/postgres.js +95 -0
  170. package/dist/postgres.js.map +1 -0
  171. package/dist/providers.d.ts +21 -0
  172. package/dist/providers.d.ts.map +1 -0
  173. package/dist/providers.js +86 -0
  174. package/dist/providers.js.map +1 -0
  175. package/dist/repo.d.ts +4 -0
  176. package/dist/repo.d.ts.map +1 -0
  177. package/dist/repo.js +80 -0
  178. package/dist/repo.js.map +1 -0
  179. package/dist/signoz.d.ts +4 -0
  180. package/dist/signoz.d.ts.map +1 -0
  181. package/dist/signoz.js +386 -0
  182. package/dist/signoz.js.map +1 -0
  183. package/dist/ssh-probe.d.ts +5 -0
  184. package/dist/ssh-probe.d.ts.map +1 -0
  185. package/dist/ssh-probe.js +22 -0
  186. package/dist/ssh-probe.js.map +1 -0
  187. package/dist/ssh.d.ts +27 -0
  188. package/dist/ssh.d.ts.map +1 -0
  189. package/dist/ssh.js +79 -0
  190. package/dist/ssh.js.map +1 -0
  191. package/dist/tunnel.d.ts +5 -0
  192. package/dist/tunnel.d.ts.map +1 -0
  193. package/dist/tunnel.js +126 -0
  194. package/dist/tunnel.js.map +1 -0
  195. package/dist/valkey-namespace.d.ts +4 -0
  196. package/dist/valkey-namespace.d.ts.map +1 -0
  197. package/dist/valkey-namespace.js +78 -0
  198. package/dist/valkey-namespace.js.map +1 -0
  199. package/dist/valkey.d.ts +4 -0
  200. package/dist/valkey.d.ts.map +1 -0
  201. package/dist/valkey.js +94 -0
  202. package/dist/valkey.js.map +1 -0
  203. package/dist/workspace.d.ts +4 -0
  204. package/dist/workspace.d.ts.map +1 -0
  205. package/dist/workspace.js +97 -0
  206. package/dist/workspace.js.map +1 -0
  207. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garage-bucket.js","sourceRoot":"","sources":["../src/garage-bucket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import { type SshExecutor } from "./ssh.js";
3
+ export declare const createGarageProvider: (executor?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=garage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garage.d.ts","sourceRoot":"","sources":["../src/garage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,UAAU,CAAC;AA4FzD,eAAO,MAAM,oBAAoB,GAAI,WAAU,WAAyB,KAAG,QAiDzE,CAAC"}
package/dist/garage.js ADDED
@@ -0,0 +1,124 @@
1
+ import { z } from "zod";
2
+ import { composeDown, composeUp, containerId, containerImage, stateDir, waitReady } from "./backing-ssh.js";
3
+ import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
4
+ import { sshExecutor } from "./ssh.js";
5
+ const KIND = "garage";
6
+ const READY_TIMEOUT_MS = 120_000;
7
+ const BIN = "/garage";
8
+ const garageSchema = sshSchema.extend({
9
+ internalIp: z.string(),
10
+ publishPort: z.number(),
11
+ region: z.string(),
12
+ image: z.string(),
13
+ domain: z.string().optional(),
14
+ });
15
+ const parse = (inputs) => parseInputs(garageSchema, inputs, KIND);
16
+ const internalEndpoint = (parsed) => `http://${parsed.internalIp}:${parsed.publishPort}`;
17
+ const outputsFor = (parsed) => ({
18
+ internalEndpoint: internalEndpoint(parsed),
19
+ endpoint: parsed.domain !== undefined ? `https://${parsed.domain}` : internalEndpoint(parsed),
20
+ });
21
+ const composeYaml = (id, parsed) => [
22
+ "services:",
23
+ " garage:",
24
+ ` image: ${parsed.image}`,
25
+ " restart: unless-stopped",
26
+ " volumes:",
27
+ " - meta:/var/lib/garage/meta",
28
+ " - data:/var/lib/garage/data",
29
+ " - ./garage.toml:/etc/garage.toml:ro",
30
+ " - ./rpc_secret:/etc/garage/rpc_secret:ro",
31
+ ` ports: [ "${parsed.publishPort}:3900" ]`,
32
+ ` labels: [ "intentic.id=${id}" ]`,
33
+ "volumes: { meta: {}, data: {} }",
34
+ "",
35
+ ].join("\n");
36
+ const garageToml = (parsed) => [
37
+ 'metadata_dir = "/var/lib/garage/meta"',
38
+ 'data_dir = "/var/lib/garage/data"',
39
+ 'db_engine = "sqlite"',
40
+ "replication_factor = 1",
41
+ 'rpc_bind_addr = "[::]:3901"',
42
+ 'rpc_secret_file = "/etc/garage/rpc_secret"',
43
+ "[s3_api]",
44
+ `s3_region = "${parsed.region}"`,
45
+ 'api_bind_addr = "[::]:3900"',
46
+ "",
47
+ ].join("\n");
48
+ const ensureFiles = async (session, id, parsed) => {
49
+ const dir = stateDir(KIND, id);
50
+ await session.exec(`mkdir -p ${dir}`);
51
+ await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, parsed)}COMPOSE_EOF`);
52
+ await session.exec(`cat > ${dir}/garage.toml <<'GARAGE_EOF'\n${garageToml(parsed)}GARAGE_EOF`);
53
+ await session.exec(`test -f ${dir}/.env || printf 'TZ=Etc/UTC\\n' > ${dir}/.env`);
54
+ await session.exec(`test -f ${dir}/rpc_secret || { openssl rand -hex 32 > ${dir}/rpc_secret && chmod 600 ${dir}/rpc_secret; }`);
55
+ };
56
+ const readyProbe = (id) => `cid=$(docker ps -q --filter "label=intentic.id=${id}"); [ -n "$cid" ] && docker exec "$cid" ${BIN} status`;
57
+ const ensureLayout = async (session, id) => {
58
+ const cid = await containerId(session, id);
59
+ const nodeId = (await session.exec(`docker exec ${cid} ${BIN} node id -q`)).stdout.trim().split("@")[0] ?? "";
60
+ if (nodeId === "") {
61
+ throw new Error(`garage "${id}": could not read node id`);
62
+ }
63
+ const layout = await session.exec(`docker exec ${cid} ${BIN} layout show`);
64
+ if (layout.stdout.includes(nodeId)) {
65
+ return;
66
+ }
67
+ await session.exec(`docker exec ${cid} ${BIN} layout assign -z dc1 -c 1G ${nodeId}`);
68
+ await session.exec(`docker exec ${cid} ${BIN} layout apply --version 1`);
69
+ };
70
+ export const createGarageProvider = (executor = sshExecutor) => ({
71
+ read: async (inputs, ctx) => {
72
+ const parsed = parse(inputs);
73
+ let session;
74
+ try {
75
+ session = await executor.connect(sshTarget(parsed));
76
+ }
77
+ catch (error) {
78
+ ctx.log(`garage "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
79
+ return undefined;
80
+ }
81
+ try {
82
+ const probe = await session.exec(readyProbe(ctx.id));
83
+ if (probe.code !== 0) {
84
+ return undefined;
85
+ }
86
+ return { outputs: outputsFor(parsed), detail: { image: await containerImage(session, ctx.id) } };
87
+ }
88
+ finally {
89
+ await session.dispose();
90
+ }
91
+ },
92
+ diff: (inputs, observed) => {
93
+ const parsed = parse(inputs);
94
+ const image = (observed.detail?.["image"] ?? "");
95
+ return image === parsed.image
96
+ ? { action: "noop" }
97
+ : { action: "update", reason: `garage image differs (running ${image}, want ${parsed.image})` };
98
+ },
99
+ apply: async (inputs, _observed, ctx) => {
100
+ const parsed = parse(inputs);
101
+ const session = await executor.connect(sshTarget(parsed));
102
+ try {
103
+ await ensureFiles(session, ctx.id, parsed);
104
+ await composeUp(session, KIND, ctx.id);
105
+ await waitReady(session, KIND, ctx.id, readyProbe(ctx.id), READY_TIMEOUT_MS);
106
+ await ensureLayout(session, ctx.id);
107
+ return outputsFor(parsed);
108
+ }
109
+ finally {
110
+ await session.dispose();
111
+ }
112
+ },
113
+ delete: async (inputs, ctx) => {
114
+ const parsed = parse(inputs);
115
+ const session = await executor.connect(sshTarget(parsed));
116
+ try {
117
+ await composeDown(session, KIND, ctx.id);
118
+ }
119
+ finally {
120
+ await session.dispose();
121
+ }
122
+ },
123
+ });
124
+ //# sourceMappingURL=garage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garage.js","sourceRoot":"","sources":["../src/garage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { GitHubApi } from "./github-api.js";
3
+ export declare const createGhCiProvider: (api?: GitHubApi) => Provider;
4
+ //# sourceMappingURL=gh-ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-ci.d.ts","sourceRoot":"","sources":["../src/gh-ci.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAkGjD,eAAO,MAAM,kBAAkB,GAAI,MAAK,SAAqB,KAAG,QA0E9D,CAAC"}
package/dist/gh-ci.js ADDED
@@ -0,0 +1,153 @@
1
+ import { z } from "zod";
2
+ import { githubApi } from "./github-api.js";
3
+ import { parseInputs } from "./inputs.js";
4
+ const ghCiSchema = z.object({
5
+ owner: z.string(),
6
+ repoName: z.string(),
7
+ branch: z.string(),
8
+ tag: z.string(),
9
+ token: z.string(),
10
+ hostAddress: z.string(),
11
+ deploymentId: z.string(),
12
+ port: z.coerce.number(),
13
+ env: z.record(z.string(), z.unknown()).default({}),
14
+ });
15
+ const parse = (inputs) => parseInputs(ghCiSchema, inputs, "gh-ci");
16
+ const workflowPath = (tag) => `.github/workflows/deploy-${tag}.yml`;
17
+ const DOCKERFILE_PATH = "Dockerfile";
18
+ const SECRET_SSH_KEY = "INTENTIC_HOST_SSH_KEY";
19
+ const SECRET_HOST_ADDRESS = "INTENTIC_HOST_ADDRESS";
20
+ const SECRET_HOST_USER = "INTENTIC_HOST_USER";
21
+ const starterDockerfile = () => [
22
+ "# intentic starter Dockerfile — replace with your app's real build.",
23
+ "FROM busybox",
24
+ "RUN mkdir -p /www && printf '%s' 'intentic: replace this Dockerfile with your app' > /www/index.html",
25
+ "ENV PORT=8080",
26
+ "EXPOSE 8080",
27
+ 'CMD ["sh","-c","httpd -f -v -p $PORT -h /www"]',
28
+ "",
29
+ ].join("\n");
30
+ const workflowYaml = (parsed) => {
31
+ const image = `ghcr.io/${parsed.owner}/${parsed.repoName}`;
32
+ const envLines = Object.entries(parsed.env)
33
+ .map(([key, value]) => `-e ${key}='${String(value)}'`)
34
+ .join(" \\\n ");
35
+ const envFlag = envLines.length > 0 ? ` \\\n ${envLines}` : "";
36
+ return [
37
+ "# Generated by intentic: build → push to GHCR → deploy via SSH.",
38
+ `name: deploy-${parsed.tag}`,
39
+ "on:",
40
+ " push:",
41
+ ` branches: ["${parsed.branch}"]`,
42
+ "jobs:",
43
+ " deploy:",
44
+ " runs-on: ubuntu-latest",
45
+ " permissions:",
46
+ " contents: read",
47
+ " packages: write",
48
+ " steps:",
49
+ " - uses: actions/checkout@v4",
50
+ " - uses: docker/login-action@v3",
51
+ " with:",
52
+ " registry: ghcr.io",
53
+ " username: ${{ github.actor }}",
54
+ " password: ${{ secrets.GITHUB_TOKEN }}",
55
+ " - uses: docker/build-push-action@v6",
56
+ " with:",
57
+ " context: .",
58
+ " push: true",
59
+ " tags: |",
60
+ ` ${image}:${parsed.tag}`,
61
+ ` ${image}:$\{{ github.sha }}`,
62
+ " - name: deploy to host",
63
+ " uses: appleboy/ssh-action@v1",
64
+ " with:",
65
+ ` host: \${{ secrets.${SECRET_HOST_ADDRESS} }}`,
66
+ ` username: \${{ secrets.${SECRET_HOST_USER} }}`,
67
+ ` key: \${{ secrets.${SECRET_SSH_KEY} }}`,
68
+ " script: |",
69
+ ` docker pull ${image}:${parsed.tag}`,
70
+ ` docker stop ${parsed.deploymentId} || true`,
71
+ ` docker rm ${parsed.deploymentId} || true`,
72
+ ` docker run -d --name ${parsed.deploymentId} --restart unless-stopped \\`,
73
+ ` -p ${parsed.port}:${parsed.port}${envFlag} \\`,
74
+ ` ${image}:${parsed.tag}`,
75
+ "",
76
+ ].join("\n");
77
+ };
78
+ const normalize = (yaml) => yaml
79
+ .split("\n")
80
+ .map((line) => line.replace(/\s+$/, ""))
81
+ .join("\n")
82
+ .trim();
83
+ export const createGhCiProvider = (api = githubApi) => ({
84
+ read: async (inputs, ctx) => {
85
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
86
+ return undefined;
87
+ }
88
+ const parsed = parse(inputs);
89
+ try {
90
+ const file = await api.readFile({
91
+ token: parsed.token,
92
+ owner: parsed.owner,
93
+ repo: parsed.repoName,
94
+ path: workflowPath(parsed.tag),
95
+ branch: parsed.branch,
96
+ });
97
+ if (file === undefined) {
98
+ return undefined;
99
+ }
100
+ return { outputs: {}, detail: { workflow: file.content } };
101
+ }
102
+ catch (error) {
103
+ ctx.log(`gh-ci "${ctx.id}": GitHub not reachable yet: ${String(error)}`);
104
+ return undefined;
105
+ }
106
+ },
107
+ diff: (inputs, observed) => {
108
+ const workflow = observed.detail?.["workflow"];
109
+ if (typeof workflow !== "string" || normalize(workflow) !== normalize(workflowYaml(parse(inputs)))) {
110
+ return { action: "update", reason: "GitHub Actions workflow differs from desired" };
111
+ }
112
+ return { action: "noop" };
113
+ },
114
+ apply: async (inputs) => {
115
+ const parsed = parse(inputs);
116
+ const common = { token: parsed.token, owner: parsed.owner, repo: parsed.repoName };
117
+ await api.setRepoSecret({ ...common, secretName: SECRET_SSH_KEY, value: "placeholder-ssh-key" });
118
+ await api.setRepoSecret({ ...common, secretName: SECRET_HOST_ADDRESS, value: parsed.hostAddress });
119
+ await api.setRepoSecret({ ...common, secretName: SECRET_HOST_USER, value: "deploy" });
120
+ const dockerfile = await api.readFile({ ...common, path: DOCKERFILE_PATH, branch: parsed.branch });
121
+ if (dockerfile === undefined) {
122
+ await api.commitFile({
123
+ ...common,
124
+ path: DOCKERFILE_PATH,
125
+ content: starterDockerfile(),
126
+ branch: parsed.branch,
127
+ message: "intentic: starter Dockerfile",
128
+ });
129
+ }
130
+ const existing = await api.readFile({ ...common, path: workflowPath(parsed.tag), branch: parsed.branch });
131
+ await api.commitFile({
132
+ ...common,
133
+ path: workflowPath(parsed.tag),
134
+ content: workflowYaml(parsed),
135
+ branch: parsed.branch,
136
+ message: "intentic: GitHub Actions workflow",
137
+ ...(existing !== undefined ? { sha: existing.sha } : {}),
138
+ });
139
+ return {};
140
+ },
141
+ delete: async (inputs) => {
142
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
143
+ return;
144
+ }
145
+ const parsed = parse(inputs);
146
+ const common = { token: parsed.token, owner: parsed.owner, repo: parsed.repoName };
147
+ await api.deleteFile({ ...common, path: workflowPath(parsed.tag), branch: parsed.branch, message: "intentic: remove workflow" });
148
+ await api.deleteRepoSecret({ ...common, secretName: SECRET_SSH_KEY });
149
+ await api.deleteRepoSecret({ ...common, secretName: SECRET_HOST_ADDRESS });
150
+ await api.deleteRepoSecret({ ...common, secretName: SECRET_HOST_USER });
151
+ },
152
+ });
153
+ //# sourceMappingURL=gh-ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-ci.js","sourceRoot":"","sources":["../src/gh-ci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { SshExecutor } from "./ssh.js";
3
+ export declare const createGhDeploymentProvider: (ssh?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=gh-deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-deployment.d.ts","sourceRoot":"","sources":["../src/gh-deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA4B5C,eAAO,MAAM,0BAA0B,GAAI,MAAK,WAAyB,KAAG,QAmE1E,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+ import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
3
+ import { sshExecutor } from "./ssh.js";
4
+ const ghDeploymentSchema = z
5
+ .object({
6
+ owner: z.string(),
7
+ repoName: z.string(),
8
+ tag: z.string(),
9
+ domain: z.string(),
10
+ internalIp: z.string(),
11
+ port: z.coerce.number(),
12
+ env: z.record(z.string(), z.unknown()).default({}),
13
+ })
14
+ .merge(sshSchema);
15
+ const parse = (inputs) => parseInputs(ghDeploymentSchema, inputs, "gh-deployment");
16
+ const containerName = (ctx) => ctx.id;
17
+ const ghcrImage = (parsed) => `ghcr.io/${parsed.owner}/${parsed.repoName}:${parsed.tag}`;
18
+ const outputsFor = (parsed) => ({
19
+ url: `https://${parsed.domain}`,
20
+ internalUrl: `http://${parsed.internalIp}:${parsed.port}`,
21
+ });
22
+ export const createGhDeploymentProvider = (ssh = sshExecutor) => ({
23
+ read: async (inputs, ctx) => {
24
+ if (typeof inputs["address"] !== "string") {
25
+ return undefined;
26
+ }
27
+ const parsed = parse(inputs);
28
+ const name = containerName(ctx);
29
+ try {
30
+ const session = await ssh.connect(sshTarget(parsed));
31
+ try {
32
+ const result = await session.exec(`docker inspect --format '{{.State.Running}}' ${name} 2>/dev/null || echo "not-found"`);
33
+ const output = result.stdout.trim();
34
+ if (output === "not-found" || output === "") {
35
+ return undefined;
36
+ }
37
+ return { outputs: outputsFor(parsed), detail: { running: output === "true" } };
38
+ }
39
+ finally {
40
+ await session.dispose();
41
+ }
42
+ }
43
+ catch (error) {
44
+ ctx.log(`gh-deployment "${ctx.id}": host not reachable yet: ${String(error)}`);
45
+ return undefined;
46
+ }
47
+ },
48
+ diff: (inputs, observed) => {
49
+ if (observed.detail?.["running"] !== true) {
50
+ return { action: "update", reason: "container is not running" };
51
+ }
52
+ return { action: "noop" };
53
+ },
54
+ apply: async (inputs, _observed, ctx) => {
55
+ const parsed = parse(inputs);
56
+ const name = containerName(ctx);
57
+ const img = ghcrImage(parsed);
58
+ const envFlags = Object.entries(parsed.env)
59
+ .map(([key, value]) => `-e ${key}='${String(value)}'`)
60
+ .join(" ");
61
+ const envStr = envFlags.length > 0 ? ` ${envFlags}` : "";
62
+ const script = [
63
+ `docker pull ${img}`,
64
+ `docker stop ${name} 2>/dev/null || true`,
65
+ `docker rm ${name} 2>/dev/null || true`,
66
+ `docker run -d --name ${name} --restart unless-stopped -p ${parsed.port}:${parsed.port}${envStr} ${img}`,
67
+ ].join(" && ");
68
+ const session = await ssh.connect(sshTarget(parsed));
69
+ try {
70
+ await session.exec(script);
71
+ }
72
+ finally {
73
+ await session.dispose();
74
+ }
75
+ return outputsFor(parsed);
76
+ },
77
+ delete: async (inputs, ctx) => {
78
+ if (typeof inputs["address"] !== "string") {
79
+ return;
80
+ }
81
+ const parsed = parse(inputs);
82
+ const name = containerName(ctx);
83
+ const session = await ssh.connect(sshTarget(parsed));
84
+ try {
85
+ await session.exec(`docker stop ${name} 2>/dev/null || true && docker rm ${name} 2>/dev/null || true`);
86
+ }
87
+ finally {
88
+ await session.dispose();
89
+ }
90
+ },
91
+ });
92
+ //# sourceMappingURL=gh-deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-deployment.js","sourceRoot":"","sources":["../src/gh-deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { GitHubApi } from "./github-api.js";
3
+ export declare const createGhRepoProvider: (api?: GitHubApi) => Provider;
4
+ //# sourceMappingURL=gh-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-repo.d.ts","sourceRoot":"","sources":["../src/gh-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoBjD,eAAO,MAAM,oBAAoB,GAAI,MAAK,SAAqB,KAAG,QAoChE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ import { githubApi } from "./github-api.js";
3
+ import { parseInputs } from "./inputs.js";
4
+ const ghRepoSchema = z.object({
5
+ name: z.string(),
6
+ owner: z.string(),
7
+ private: z.boolean(),
8
+ token: z.string(),
9
+ });
10
+ const parse = (inputs) => parseInputs(ghRepoSchema, inputs, "gh-repo");
11
+ const outputsFor = (parsed) => ({
12
+ cloneUrl: `https://github.com/${parsed.owner}/${parsed.name}.git`,
13
+ sshUrl: `git@github.com:${parsed.owner}/${parsed.name}.git`,
14
+ });
15
+ export const createGhRepoProvider = (api = githubApi) => ({
16
+ read: async (inputs, ctx) => {
17
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
18
+ return undefined;
19
+ }
20
+ const parsed = parse(inputs);
21
+ try {
22
+ const repo = await api.findRepo({ token: parsed.token, owner: parsed.owner, name: parsed.name });
23
+ if (repo === undefined) {
24
+ return undefined;
25
+ }
26
+ return { outputs: outputsFor(parsed) };
27
+ }
28
+ catch (error) {
29
+ ctx.log(`gh-repo "${ctx.id}": GitHub not reachable yet: ${String(error)}`);
30
+ return undefined;
31
+ }
32
+ },
33
+ diff: () => ({ action: "noop" }),
34
+ apply: async (inputs) => {
35
+ const parsed = parse(inputs);
36
+ const existing = await api.findRepo({ token: parsed.token, owner: parsed.owner, name: parsed.name });
37
+ if (existing === undefined) {
38
+ const user = await api.getAuthenticatedUser({ token: parsed.token });
39
+ const ownerIsOrg = parsed.owner !== user.login;
40
+ await api.createRepo({ token: parsed.token, owner: parsed.owner, name: parsed.name, private: parsed.private, ownerIsOrg });
41
+ }
42
+ return outputsFor(parsed);
43
+ },
44
+ delete: async (inputs) => {
45
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
46
+ return;
47
+ }
48
+ const parsed = parse(inputs);
49
+ await api.deleteRepo({ token: parsed.token, owner: parsed.owner, name: parsed.name });
50
+ },
51
+ });
52
+ //# sourceMappingURL=gh-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-repo.js","sourceRoot":"","sources":["../src/gh-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export interface GitHubApi {
2
+ getAuthenticatedUser(params: {
3
+ token: string;
4
+ }): Promise<{
5
+ login: string;
6
+ }>;
7
+ findRepo(params: {
8
+ token: string;
9
+ owner: string;
10
+ name: string;
11
+ }): Promise<{
12
+ cloneUrl: string;
13
+ sshUrl: string;
14
+ } | undefined>;
15
+ createRepo(params: {
16
+ token: string;
17
+ owner: string;
18
+ name: string;
19
+ private: boolean;
20
+ ownerIsOrg: boolean;
21
+ }): Promise<void>;
22
+ deleteRepo(params: {
23
+ token: string;
24
+ owner: string;
25
+ name: string;
26
+ }): Promise<void>;
27
+ readFile(params: {
28
+ token: string;
29
+ owner: string;
30
+ repo: string;
31
+ path: string;
32
+ branch: string;
33
+ }): Promise<{
34
+ content: string;
35
+ sha: string;
36
+ } | undefined>;
37
+ commitFile(params: {
38
+ token: string;
39
+ owner: string;
40
+ repo: string;
41
+ path: string;
42
+ content: string;
43
+ branch: string;
44
+ message: string;
45
+ sha?: string;
46
+ }): Promise<void>;
47
+ deleteFile(params: {
48
+ token: string;
49
+ owner: string;
50
+ repo: string;
51
+ path: string;
52
+ branch: string;
53
+ message: string;
54
+ }): Promise<void>;
55
+ setRepoSecret(params: {
56
+ token: string;
57
+ owner: string;
58
+ repo: string;
59
+ secretName: string;
60
+ value: string;
61
+ }): Promise<void>;
62
+ deleteRepoSecret(params: {
63
+ token: string;
64
+ owner: string;
65
+ repo: string;
66
+ secretName: string;
67
+ }): Promise<void>;
68
+ }
69
+ export declare const githubApi: GitHubApi;
70
+ //# sourceMappingURL=github-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-api.d.ts","sourceRoot":"","sources":["../src/github-api.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,SAAS;IACtB,oBAAoB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC5H,UAAU,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzH,UAAU,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,MAAM,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC1D,UAAU,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,UAAU,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjI,aAAa,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxH,gBAAgB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/G;AAID,eAAO,MAAM,SAAS,EAAE,SAuHvB,CAAC"}