@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,130 @@
1
+ import { z } from "zod";
2
+ import { normalize, starterDockerfile } from "../core/ci-yaml.js";
3
+ import { parseInputs, registryImage } from "../core/inputs.js";
4
+ import { gitlabApi } from "./gitlab-api.js";
5
+ const glCiEnvSchema = z.object({
6
+ name: z.string(),
7
+ branch: z.string(),
8
+ tag: z.string(),
9
+ deploymentId: z.string(),
10
+ port: z.coerce.number(),
11
+ env: z.record(z.string(), z.unknown()).default({}),
12
+ });
13
+ const glCiSchema = z.object({
14
+ url: z.string(),
15
+ owner: z.string(),
16
+ repoName: z.string(),
17
+ token: z.string(),
18
+ registry: z.string(),
19
+ hostAddress: z.string(),
20
+ hostUser: z.string(),
21
+ hostSshKey: z.string(),
22
+ environments: z.array(glCiEnvSchema),
23
+ });
24
+ const parse = (inputs) => parseInputs(glCiSchema, inputs, "gl-ci");
25
+ const CI_FILE_PATH = ".gitlab-ci.yml";
26
+ const DOCKERFILE_PATH = "Dockerfile";
27
+ const VAR_SSH_KEY = "INTENTIC_HOST_SSH_KEY";
28
+ const VAR_HOST_ADDRESS = "INTENTIC_HOST_ADDRESS";
29
+ const VAR_HOST_USER = "INTENTIC_HOST_USER";
30
+ const shellQuote = (value) => `'${value.replace(/'/g, "'\\''")}'`;
31
+ const scriptLine = (command) => ` - ${JSON.stringify(command)}`;
32
+ const jobYaml = (parsed, environment) => {
33
+ const image = registryImage({ registry: parsed.registry, owner: parsed.owner, repoName: parsed.repoName, tag: environment.tag });
34
+ const shaImage = `${parsed.registry}/${parsed.owner}/${parsed.repoName}:$CI_COMMIT_SHA`;
35
+ const envFlags = Object.entries(environment.env)
36
+ .map(([key, value]) => `-e ${key}='${String(value)}'`)
37
+ .join(" ");
38
+ const envStr = envFlags.length > 0 ? ` ${envFlags}` : "";
39
+ const remote = [
40
+ `docker pull ${image}`,
41
+ `docker stop ${environment.deploymentId} || true`,
42
+ `docker rm ${environment.deploymentId} || true`,
43
+ `docker run -d --name ${environment.deploymentId} --restart unless-stopped -p ${environment.port}:${environment.port}${envStr} ${image}`,
44
+ ].join(" && ");
45
+ return [
46
+ `deploy-${environment.name}:`,
47
+ " stage: deploy",
48
+ " image: docker:27",
49
+ " services:",
50
+ " - docker:27-dind",
51
+ " rules:",
52
+ ` - if: '$CI_COMMIT_BRANCH == "${environment.branch}"'`,
53
+ " before_script:",
54
+ scriptLine('docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"'),
55
+ scriptLine("apk add --no-cache openssh-client"),
56
+ " script:",
57
+ scriptLine(`docker build -t ${image} -t ${shaImage} .`),
58
+ scriptLine(`docker push ${image}`),
59
+ scriptLine(`docker push ${shaImage}`),
60
+ scriptLine('mkdir -p ~/.ssh && printf \'%s\\n\' "$INTENTIC_HOST_SSH_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa'),
61
+ scriptLine(`ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa "$INTENTIC_HOST_USER@$INTENTIC_HOST_ADDRESS" ${shellQuote(remote)}`),
62
+ ].join("\n");
63
+ };
64
+ const gitlabCiYaml = (parsed) => [
65
+ "# Generated by intentic: build → push to the GitLab Container Registry → deploy via SSH.",
66
+ "stages:",
67
+ " - deploy",
68
+ "",
69
+ ...parsed.environments.map((environment) => jobYaml(parsed, environment)),
70
+ "",
71
+ ].join("\n");
72
+ export const createGlCiProvider = (api = gitlabApi) => ({
73
+ read: async (inputs, ctx) => {
74
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
75
+ return undefined;
76
+ }
77
+ const parsed = parse(inputs);
78
+ try {
79
+ const file = await api.readFile({
80
+ url: parsed.url,
81
+ token: parsed.token,
82
+ owner: parsed.owner,
83
+ name: parsed.repoName,
84
+ path: CI_FILE_PATH,
85
+ branch: parsed.environments[0]?.branch ?? "main",
86
+ });
87
+ if (file === undefined) {
88
+ return undefined;
89
+ }
90
+ return { outputs: {}, detail: { ci: file.content } };
91
+ }
92
+ catch (error) {
93
+ ctx.log(`gl-ci "${ctx.id}": GitLab not reachable yet: ${String(error)}`);
94
+ return undefined;
95
+ }
96
+ },
97
+ diff: (inputs, observed) => {
98
+ const ci = observed.detail?.["ci"];
99
+ if (typeof ci !== "string" || normalize(ci) !== normalize(gitlabCiYaml(parse(inputs)))) {
100
+ return { action: "update", reason: ".gitlab-ci.yml differs from desired" };
101
+ }
102
+ return { action: "noop" };
103
+ },
104
+ apply: async (inputs) => {
105
+ const parsed = parse(inputs);
106
+ const common = { url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.repoName };
107
+ const branch = parsed.environments[0]?.branch ?? "main";
108
+ await api.setCiVariable({ ...common, key: VAR_SSH_KEY, value: parsed.hostSshKey });
109
+ await api.setCiVariable({ ...common, key: VAR_HOST_ADDRESS, value: parsed.hostAddress });
110
+ await api.setCiVariable({ ...common, key: VAR_HOST_USER, value: parsed.hostUser });
111
+ const dockerfile = await api.readFile({ ...common, path: DOCKERFILE_PATH, branch });
112
+ if (dockerfile === undefined) {
113
+ await api.commitFile({ ...common, path: DOCKERFILE_PATH, content: starterDockerfile(), branch, message: "intentic: starter Dockerfile" });
114
+ }
115
+ await api.commitFile({ ...common, path: CI_FILE_PATH, content: gitlabCiYaml(parsed), branch, message: "intentic: GitLab CI pipeline" });
116
+ return {};
117
+ },
118
+ delete: async (inputs) => {
119
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
120
+ return;
121
+ }
122
+ const parsed = parse(inputs);
123
+ const common = { url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.repoName };
124
+ await api.deleteFile({ ...common, path: CI_FILE_PATH, branch: parsed.environments[0]?.branch ?? "main", message: "intentic: remove CI pipeline" });
125
+ await api.deleteCiVariable({ ...common, key: VAR_SSH_KEY });
126
+ await api.deleteCiVariable({ ...common, key: VAR_HOST_ADDRESS });
127
+ await api.deleteCiVariable({ ...common, key: VAR_HOST_USER });
128
+ },
129
+ });
130
+ //# sourceMappingURL=gl-ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-ci.js","sourceRoot":"","sources":["../../src/gitlab/gl-ci.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 createGlDeploymentProvider: (ssh?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=gl-deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-deployment.d.ts","sourceRoot":"","sources":["../../src/gitlab/gl-deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8BlD,eAAO,MAAM,0BAA0B,GAAI,MAAK,WAAyB,KAAG,QAmE1E,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ import { parseInputs, registryImage, sshSchema, sshTarget } from "../core/inputs.js";
3
+ import { sshExecutor } from "../core/ssh.js";
4
+ const glDeploymentSchema = z
5
+ .object({
6
+ owner: z.string(),
7
+ repoName: z.string(),
8
+ tag: z.string(),
9
+ registry: z.string(),
10
+ domain: z.string(),
11
+ internalIp: z.string(),
12
+ port: z.coerce.number(),
13
+ env: z.record(z.string(), z.unknown()).default({}),
14
+ })
15
+ .merge(sshSchema);
16
+ const parse = (inputs) => parseInputs(glDeploymentSchema, inputs, "gl-deployment");
17
+ const containerName = (ctx) => ctx.id;
18
+ const glImage = (parsed) => registryImage({ registry: parsed.registry, owner: parsed.owner, repoName: parsed.repoName, tag: parsed.tag });
19
+ const outputsFor = (parsed) => ({
20
+ url: `https://${parsed.domain}`,
21
+ internalUrl: `http://${parsed.internalIp}:${parsed.port}`,
22
+ });
23
+ export const createGlDeploymentProvider = (ssh = sshExecutor) => ({
24
+ read: async (inputs, ctx) => {
25
+ if (typeof inputs["address"] !== "string") {
26
+ return undefined;
27
+ }
28
+ const parsed = parse(inputs);
29
+ const name = containerName(ctx);
30
+ try {
31
+ const session = await ssh.connect(sshTarget(parsed));
32
+ try {
33
+ const result = await session.exec(`docker inspect --format '{{.State.Running}}' ${name} 2>/dev/null || echo "not-found"`);
34
+ const output = result.stdout.trim();
35
+ if (output === "not-found" || output === "") {
36
+ return undefined;
37
+ }
38
+ return { outputs: outputsFor(parsed), detail: { running: output === "true" } };
39
+ }
40
+ finally {
41
+ await session.dispose();
42
+ }
43
+ }
44
+ catch (error) {
45
+ ctx.log(`gl-deployment "${ctx.id}": host not reachable yet: ${String(error)}`);
46
+ return undefined;
47
+ }
48
+ },
49
+ diff: (inputs, observed) => {
50
+ if (observed.detail?.["running"] !== true) {
51
+ return { action: "update", reason: "container is not running" };
52
+ }
53
+ return { action: "noop" };
54
+ },
55
+ apply: async (inputs, _observed, ctx) => {
56
+ const parsed = parse(inputs);
57
+ const name = containerName(ctx);
58
+ const img = glImage(parsed);
59
+ const envFlags = Object.entries(parsed.env)
60
+ .map(([key, value]) => `-e ${key}='${String(value)}'`)
61
+ .join(" ");
62
+ const envStr = envFlags.length > 0 ? ` ${envFlags}` : "";
63
+ const script = [
64
+ `docker pull ${img}`,
65
+ `docker stop ${name} 2>/dev/null || true`,
66
+ `docker rm ${name} 2>/dev/null || true`,
67
+ `docker run -d --name ${name} --restart unless-stopped -p ${parsed.port}:${parsed.port}${envStr} ${img}`,
68
+ ].join(" && ");
69
+ const session = await ssh.connect(sshTarget(parsed));
70
+ try {
71
+ await session.exec(script);
72
+ }
73
+ finally {
74
+ await session.dispose();
75
+ }
76
+ return outputsFor(parsed);
77
+ },
78
+ delete: async (inputs, ctx) => {
79
+ if (typeof inputs["address"] !== "string") {
80
+ return;
81
+ }
82
+ const parsed = parse(inputs);
83
+ const name = containerName(ctx);
84
+ const session = await ssh.connect(sshTarget(parsed));
85
+ try {
86
+ await session.exec(`docker stop ${name} 2>/dev/null || true && docker rm ${name} 2>/dev/null || true`);
87
+ }
88
+ finally {
89
+ await session.dispose();
90
+ }
91
+ },
92
+ });
93
+ //# sourceMappingURL=gl-deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-deployment.js","sourceRoot":"","sources":["../../src/gitlab/gl-deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { GitLabApi } from "./gitlab-api.js";
3
+ export declare const createGlRepoProvider: (api?: GitLabApi) => Provider;
4
+ //# sourceMappingURL=gl-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-repo.d.ts","sourceRoot":"","sources":["../../src/gitlab/gl-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwBjD,eAAO,MAAM,oBAAoB,GAAI,MAAK,SAAqB,KAAG,QA0ChE,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { parseInputs } from "../core/inputs.js";
3
+ import { gitlabApi } from "./gitlab-api.js";
4
+ const glRepoSchema = z.object({
5
+ name: z.string(),
6
+ owner: z.string(),
7
+ private: z.boolean(),
8
+ url: z.string(),
9
+ token: z.string(),
10
+ });
11
+ const parse = (inputs) => parseInputs(glRepoSchema, inputs, "gl-repo");
12
+ const hostOf = (url) => url.replace(/^https?:\/\//, "").replace(/\/+$/, "");
13
+ const outputsFor = (parsed) => ({
14
+ cloneUrl: `https://${hostOf(parsed.url)}/${parsed.owner}/${parsed.name}.git`,
15
+ sshUrl: `git@${hostOf(parsed.url)}:${parsed.owner}/${parsed.name}.git`,
16
+ });
17
+ export const createGlRepoProvider = (api = gitlabApi) => ({
18
+ read: async (inputs, ctx) => {
19
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
20
+ return undefined;
21
+ }
22
+ const parsed = parse(inputs);
23
+ try {
24
+ const project = await api.findProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
25
+ if (project === undefined) {
26
+ return undefined;
27
+ }
28
+ return { outputs: outputsFor(parsed) };
29
+ }
30
+ catch (error) {
31
+ ctx.log(`gl-repo "${ctx.id}": GitLab not reachable yet: ${String(error)}`);
32
+ return undefined;
33
+ }
34
+ },
35
+ diff: () => ({ action: "noop" }),
36
+ apply: async (inputs) => {
37
+ const parsed = parse(inputs);
38
+ const existing = await api.findProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
39
+ if (existing === undefined) {
40
+ const user = await api.getAuthenticatedUser({ url: parsed.url, token: parsed.token });
41
+ const ownerIsGroup = parsed.owner !== user.username;
42
+ await api.createProject({
43
+ url: parsed.url,
44
+ token: parsed.token,
45
+ owner: parsed.owner,
46
+ name: parsed.name,
47
+ private: parsed.private,
48
+ ownerIsGroup,
49
+ });
50
+ }
51
+ return outputsFor(parsed);
52
+ },
53
+ delete: async (inputs) => {
54
+ if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
55
+ return;
56
+ }
57
+ const parsed = parse(inputs);
58
+ await api.deleteProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
59
+ },
60
+ });
61
+ //# sourceMappingURL=gl-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-repo.js","sourceRoot":"","sources":["../../src/gitlab/gl-repo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAgB,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAIrG,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5F,MAAM,UAAU,GAAG,CAAC,MAAoB,EAA2B,EAAE,CAAC,CAAC;IACnE,QAAQ,EAAE,WAAW,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM;IAC5E,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM;CACzE,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiB,SAAS,EAAY,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACxH,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,gCAAgC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzH,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtF,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;YACpD,MAAM,GAAG,CAAC,aAAa,CAAC;gBACpB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY;aACf,CAAC,CAAC;QACP,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACrB,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO;QACX,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9G,CAAC;CACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
+ export declare const createHostProvider: (executor?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAyB9D,eAAO,MAAM,kBAAkB,GAAI,WAAU,WAAyB,KAAG,QA+BvE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
2
+ import { sshExecutor } from "../core/ssh.js";
3
+ const parse = (inputs) => parseInputs(sshSchema, inputs, "host");
4
+ const gather = async (session, address) => {
5
+ const docker = await session.exec("docker version --format '{{.Server.Version}}'");
6
+ if (docker.code !== 0) {
7
+ throw new Error(`host is not Docker-ready: \`docker version\` exited ${docker.code}: ${docker.stderr.trim()}`);
8
+ }
9
+ const route = await session.exec("ip -4 -o route get 1.1.1.1 | awk '{print $7; exit}'");
10
+ if (route.code !== 0) {
11
+ throw new Error(`failed to read host internal ip: exited ${route.code}: ${route.stderr.trim()}`);
12
+ }
13
+ return { internalIp: route.stdout.trim(), publicIp: address };
14
+ };
15
+ export const createHostProvider = (executor = sshExecutor) => ({
16
+ read: async (inputs, ctx) => {
17
+ const parsed = parse(inputs);
18
+ let session;
19
+ try {
20
+ session = await executor.connect(sshTarget(parsed));
21
+ }
22
+ catch (error) {
23
+ ctx.log(`host "${ctx.id}" is not reachable over SSH, treating as not-yet-created: ${String(error)}`);
24
+ return undefined;
25
+ }
26
+ try {
27
+ return { outputs: await gather(session, parsed.address) };
28
+ }
29
+ finally {
30
+ await session.dispose();
31
+ }
32
+ },
33
+ diff: () => ({ action: "noop" }),
34
+ apply: async (inputs) => {
35
+ const parsed = parse(inputs);
36
+ const session = await executor.connect(sshTarget(parsed));
37
+ try {
38
+ return await gather(session, parsed.address);
39
+ }
40
+ finally {
41
+ await session.dispose();
42
+ }
43
+ },
44
+ delete: async (_inputs, ctx) => {
45
+ ctx.log(`host "${ctx.id}" removed from desired state — owned infra is never torn down by intentic`);
46
+ },
47
+ });
48
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAc,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAK7F,MAAM,MAAM,GAAG,KAAK,EAAE,OAAmB,EAAE,OAAe,EAAoC,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACnF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAwB,WAAW,EAAY,EAAE,CAAC,CAAC;IAClF,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,6DAA6D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAGD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC3B,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,2EAA2E,CAAC,CAAC;IACxG,CAAC;CACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from "@intentic/engine";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
+ export declare const createWorkspaceProvider: (executor?: SshExecutor) => Provider;
4
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/host/workspace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAsG9D,eAAO,MAAM,uBAAuB,GAAI,WAAU,WAAyB,KAAG,QA6G5E,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
4
+ import { sshExecutor } from "../core/ssh.js";
5
+ const toolSchema = z.object({ name: z.string(), url: z.string(), token: z.string() });
6
+ const workspaceSchema = sshSchema.extend({
7
+ internalIp: z.string(),
8
+ domain: z.string(),
9
+ zone: z.string(),
10
+ previewPort: z.coerce.number(),
11
+ daemonPort: z.coerce.number(),
12
+ network: z.string(),
13
+ image: z.string(),
14
+ agentBaseUrl: z.string().optional(),
15
+ tools: z.array(toolSchema).optional(),
16
+ dockerfile: z.string().optional(),
17
+ });
18
+ const parse = (inputs) => parseInputs(workspaceSchema, inputs, "workspace");
19
+ const CONTAINER = "intentic-sandbox-workspace";
20
+ const WORKSPACE_VOLUME = "intentic-workspace-workspace";
21
+ const toolsDigest = (tools) => tools === undefined || tools.length === 0 ? "" : createHash("sha256").update(JSON.stringify(tools)).digest("hex").slice(0, 16);
22
+ const environmentDigest = (dockerfile) => createHash("sha256").update(dockerfile).digest("hex");
23
+ const desiredImage = (parsed) => parsed.dockerfile === undefined ? parsed.image : `intentic-sandbox-env:${environmentDigest(parsed.dockerfile).slice(0, 12)}`;
24
+ const RUNTIME_ALLOWLIST = new Set(["--device=/dev/net/tun", "--cap-add=NET_ADMIN"]);
25
+ const RUNTIME_DIRECTIVE = "# intentic:runtime ";
26
+ const runtimeFlags = (dockerfile) => {
27
+ if (dockerfile === undefined) {
28
+ return "";
29
+ }
30
+ const flags = new Set();
31
+ for (const line of dockerfile.split("\n")) {
32
+ if (!line.startsWith(RUNTIME_DIRECTIVE)) {
33
+ continue;
34
+ }
35
+ for (const token of line.slice(RUNTIME_DIRECTIVE.length).trim().split(/\s+/)) {
36
+ if (!RUNTIME_ALLOWLIST.has(token)) {
37
+ throw new Error(`unsupported runtime directive in the workspace overlay: ${token}`);
38
+ }
39
+ flags.add(token);
40
+ }
41
+ }
42
+ return flags.size === 0 ? "" : `${[...flags].join(" ")} `;
43
+ };
44
+ const internalUrl = (parsed) => `http://${parsed.internalIp}:${parsed.daemonPort}`;
45
+ const outputsFor = (parsed) => ({
46
+ internalUrl: internalUrl(parsed),
47
+ healthUrl: `${internalUrl(parsed)}/health`,
48
+ previewBase: parsed.zone,
49
+ });
50
+ const running = async (session) => {
51
+ const result = await session.exec(`docker ps --filter "name=^${CONTAINER}$" --format '{{.Names}}'`);
52
+ return result.stdout.trim() === CONTAINER;
53
+ };
54
+ const runningImage = async (session) => {
55
+ const result = await session.exec(`docker inspect --format '{{.Config.Image}}' ${CONTAINER} 2>/dev/null || true`);
56
+ return result.stdout.trim();
57
+ };
58
+ const runningToolsDigest = async (session) => {
59
+ const result = await session.exec(`docker inspect --format '{{index .Config.Labels "intentic.tools"}}' ${CONTAINER} 2>/dev/null || true`);
60
+ return result.stdout.trim();
61
+ };
62
+ export const createWorkspaceProvider = (executor = sshExecutor) => ({
63
+ read: async (inputs, ctx) => {
64
+ const parsed = parse(inputs);
65
+ let session;
66
+ try {
67
+ session = await executor.connect(sshTarget(parsed));
68
+ }
69
+ catch (error) {
70
+ ctx.log(`workspace "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
71
+ return undefined;
72
+ }
73
+ try {
74
+ if (!(await running(session))) {
75
+ return undefined;
76
+ }
77
+ return { outputs: outputsFor(parsed), detail: { image: await runningImage(session), tools: await runningToolsDigest(session) } };
78
+ }
79
+ finally {
80
+ await session.dispose();
81
+ }
82
+ },
83
+ diff: (inputs, observed) => {
84
+ const parsed = parse(inputs);
85
+ const image = desiredImage(parsed);
86
+ if (observed.detail?.["image"] !== image) {
87
+ return {
88
+ action: "update",
89
+ reason: `workspace sandbox image differs (running ${String(observed.detail?.["image"])}, want ${image})`,
90
+ };
91
+ }
92
+ const wantTools = toolsDigest(parsed.tools);
93
+ if (observed.detail?.["tools"] !== wantTools) {
94
+ return {
95
+ action: "update",
96
+ reason: `workspace agent tools changed (running ${String(observed.detail?.["tools"])}, want ${wantTools})`,
97
+ };
98
+ }
99
+ return { action: "noop" };
100
+ },
101
+ apply: async (inputs, _observed, ctx) => {
102
+ const parsed = parse(inputs);
103
+ const runtime = runtimeFlags(parsed.dockerfile);
104
+ const session = await executor.connect(sshTarget(parsed));
105
+ try {
106
+ const image = desiredImage(parsed);
107
+ let environmentEnv = ``;
108
+ if (parsed.dockerfile !== undefined) {
109
+ const build = await session.exec(`printf '%s' ${Buffer.from(parsed.dockerfile).toString("base64")} | base64 -d | docker build -t ${image} -`);
110
+ if (build.code !== 0) {
111
+ throw new Error(`failed to build the workspace overlay image on host: exited ${build.code}: ${build.stderr.trim()}`);
112
+ }
113
+ environmentEnv = ` -e SANDBOX_ENVIRONMENT_HASH=${environmentDigest(parsed.dockerfile)}`;
114
+ }
115
+ await session.exec(`docker network inspect ${parsed.network} >/dev/null 2>&1 || docker network create ${parsed.network}`);
116
+ const agentEnv = parsed.agentBaseUrl !== undefined ? ` -e ANTHROPIC_BASE_URL=${parsed.agentBaseUrl}` : ``;
117
+ const digest = toolsDigest(parsed.tools);
118
+ const toolsEnv = parsed.tools !== undefined && parsed.tools.length > 0
119
+ ? ` -e INTENTIC_AGENT_TOOLS=${Buffer.from(JSON.stringify(parsed.tools)).toString("base64")}`
120
+ : ``;
121
+ const run = await session.exec(`(docker logs --tail 2000 ${CONTAINER} > /opt/intentic/workspace-previous.log 2>&1 || true) && ` +
122
+ `(docker rm -f ${CONTAINER} 2>/dev/null || true) && ` +
123
+ `docker run -d --restart unless-stopped --name ${CONTAINER} --label intentic.id=${ctx.id} --label intentic.tools=${digest} ` +
124
+ `--network ${parsed.network} --add-host host.docker.internal:host-gateway ` +
125
+ `--log-opt max-size=10m --log-opt max-file=3 ` +
126
+ runtime +
127
+ `-p ${parsed.internalIp}:${parsed.previewPort}:${parsed.previewPort} -p ${parsed.internalIp}:${parsed.daemonPort}:${parsed.daemonPort} ` +
128
+ `-v ${WORKSPACE_VOLUME}:/work ` +
129
+ `-e WORKSPACE_ROOT=/work -e SANDBOX_HOST=0.0.0.0 -e SANDBOX_PORT=${parsed.daemonPort} ` +
130
+ `-e PREVIEW_PORT=${parsed.previewPort} ` +
131
+ `-e SANDBOX_NAME=${CONTAINER} -e SANDBOX_IMAGE=${image}${environmentEnv}${agentEnv}${toolsEnv} ${image}`);
132
+ if (run.code !== 0) {
133
+ throw new Error(`failed to start workspace sandbox on host: exited ${run.code}: ${run.stderr.trim()}`);
134
+ }
135
+ return outputsFor(parsed);
136
+ }
137
+ finally {
138
+ await session.dispose();
139
+ }
140
+ },
141
+ delete: async (inputs) => {
142
+ const parsed = parse(inputs);
143
+ const session = await executor.connect(sshTarget(parsed));
144
+ try {
145
+ await session.exec(`docker rm -f ${CONTAINER} 2>/dev/null || true`);
146
+ }
147
+ finally {
148
+ await session.dispose();
149
+ }
150
+ },
151
+ });
152
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/host/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export { createAuthentikProvider } from "./auth/authentik.js";
2
+ export { type AuthentikApi, authentikApi } from "./auth/authentik-api.js";
3
+ export { createAuthentikClientProvider } from "./auth/authentik-client.js";
4
+ export { createBackupProvider, isLocalRepo } from "./backup/backup.js";
5
+ export { type RestoreArgs, type RestoreScope, restoreBackup } from "./backup/backup-restore.js";
6
+ export { managedContainers, quiesceHost, snapshotNow, streamRepoVolume } from "./backup/migrate-host.js";
7
+ export { parseInputs, sshSchema, sshTarget } from "./core/inputs.js";
8
+ export type { HostKeyStore, SshExecutor, SshResult, SshSession, SshTarget } from "./core/ssh.js";
9
+ export { createSshExecutor, inMemoryHostKeyStore, sshExecutor, verifyHostKey } from "./core/ssh.js";
10
+ export { createSshProbe, hostTarget } from "./core/ssh-probe.js";
11
+ export { createGarageProvider } from "./data/garage.js";
12
+ export { createGarageBucketProvider } from "./data/garage-bucket.js";
13
+ export { createCiProvider } from "./forgejo/ci.js";
14
+ export { createForgejoProvider } from "./forgejo/forgejo.js";
15
+ export { fakeForgejoApi } from "./forgejo/forgejo-api.fake.js";
16
+ export type { ForgejoApi, ForgejoHook, ForgejoRepo } from "./forgejo/forgejo-api.js";
17
+ export { forgejoApi } from "./forgejo/forgejo-api.js";
18
+ export { createForgejoNotifyProvider } from "./forgejo/forgejo-notify.js";
19
+ export { createForgejoRunnerProvider } from "./forgejo/forgejo-runner.js";
20
+ export { createRepoProvider } from "./forgejo/repo.js";
21
+ export { createGhCiProvider } from "./github/gh-ci.js";
22
+ export { createGhDeploymentProvider } from "./github/gh-deployment.js";
23
+ export { createGhRepoProvider } from "./github/gh-repo.js";
24
+ export { createGitHubProvider } from "./github/github.js";
25
+ export type { GitHubApi } from "./github/github-api.js";
26
+ export { githubApi } from "./github/github-api.js";
27
+ export { createGlCiProvider } from "./gitlab/gl-ci.js";
28
+ export { createGlDeploymentProvider } from "./gitlab/gl-deployment.js";
29
+ export { createGlRepoProvider } from "./gitlab/gl-repo.js";
30
+ export { createGitLabProvider } from "./gitlab/gitlab.js";
31
+ export type { GitLabApi } from "./gitlab/gitlab-api.js";
32
+ export { gitlabApi } from "./gitlab/gitlab-api.js";
33
+ export { createHostProvider } from "./host/host.js";
34
+ export { createDiscordProvider } from "./integrations/discord.js";
35
+ export type { DiscordApi, DiscordChannel, DiscordGuild, DiscordWebhook } from "./integrations/discord-api.js";
36
+ export { discordApi } from "./integrations/discord-api.js";
37
+ export { createStripeProvider } from "./integrations/stripe.js";
38
+ export { type StripeAccount, type StripeApi, stripeApi } from "./integrations/stripe-api.js";
39
+ export { createDeploymentProvider } from "./komodo/deployment.js";
40
+ export { createKomodoProvider } from "./komodo/komodo.js";
41
+ export type { AlerterConfig, AlerterEndpoint, DeploymentConfig, KomodoApi, KomodoResource, ResourceTarget } from "./komodo/komodo-api.js";
42
+ export { komodoApi } from "./komodo/komodo-api.js";
43
+ export { createKomodoNotifyProvider } from "./komodo/komodo-notify.js";
44
+ export { createCfRouteProvider } from "./network/cf-route.js";
45
+ export { createCloudflareProvider } from "./network/cloudflare.js";
46
+ export type { CloudflareApi, IngressRule } from "./network/cloudflare-api.js";
47
+ export { cloudflareApi } from "./network/cloudflare-api.js";
48
+ export { createTunnelProvider } from "./network/tunnel.js";
49
+ export type { ProviderDeps } from "./providers.js";
50
+ export { createProviders } from "./providers.js";
51
+ //# sourceMappingURL=index.d.ts.map