@intentic/state-resolver 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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/emit/emit-github.d.ts +4 -0
  4. package/dist/emit/emit-github.d.ts.map +1 -0
  5. package/dist/emit/emit-github.js +92 -0
  6. package/dist/emit/emit-github.js.map +1 -0
  7. package/dist/emit/emit-gitlab.d.ts +4 -0
  8. package/dist/emit/emit-gitlab.d.ts.map +1 -0
  9. package/dist/emit/emit-gitlab.js +100 -0
  10. package/dist/emit/emit-gitlab.js.map +1 -0
  11. package/dist/emit/emit.d.ts +7 -0
  12. package/dist/emit/emit.d.ts.map +1 -0
  13. package/dist/emit/emit.js +222 -0
  14. package/dist/emit/emit.js.map +1 -0
  15. package/dist/index.d.ts +19 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +16 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/catalog.d.ts +13 -0
  20. package/dist/lib/catalog.d.ts.map +1 -0
  21. package/dist/lib/catalog.js +32 -0
  22. package/dist/lib/catalog.js.map +1 -0
  23. package/dist/lib/ids.d.ts +34 -0
  24. package/dist/lib/ids.d.ts.map +1 -0
  25. package/dist/lib/ids.js +43 -0
  26. package/dist/lib/ids.js.map +1 -0
  27. package/dist/lib/images.d.ts +28 -0
  28. package/dist/lib/images.d.ts.map +1 -0
  29. package/dist/lib/images.js +28 -0
  30. package/dist/lib/images.js.map +1 -0
  31. package/dist/lib/ssh.d.ts +3 -0
  32. package/dist/lib/ssh.d.ts.map +1 -0
  33. package/dist/lib/ssh.js +8 -0
  34. package/dist/lib/ssh.js.map +1 -0
  35. package/dist/lib/zone.d.ts +4 -0
  36. package/dist/lib/zone.d.ts.map +1 -0
  37. package/dist/lib/zone.js +33 -0
  38. package/dist/lib/zone.js.map +1 -0
  39. package/dist/resolvers/app-github.d.ts +9 -0
  40. package/dist/resolvers/app-github.d.ts.map +1 -0
  41. package/dist/resolvers/app-github.js +64 -0
  42. package/dist/resolvers/app-github.js.map +1 -0
  43. package/dist/resolvers/app-gitlab.d.ts +9 -0
  44. package/dist/resolvers/app-gitlab.d.ts.map +1 -0
  45. package/dist/resolvers/app-gitlab.js +76 -0
  46. package/dist/resolvers/app-gitlab.js.map +1 -0
  47. package/dist/resolvers/app.d.ts +13 -0
  48. package/dist/resolvers/app.d.ts.map +1 -0
  49. package/dist/resolvers/app.js +108 -0
  50. package/dist/resolvers/app.js.map +1 -0
  51. package/dist/resolvers/backing.d.ts +11 -0
  52. package/dist/resolvers/backing.d.ts.map +1 -0
  53. package/dist/resolvers/backing.js +142 -0
  54. package/dist/resolvers/backing.js.map +1 -0
  55. package/dist/resolvers/backup.d.ts +6 -0
  56. package/dist/resolvers/backup.d.ts.map +1 -0
  57. package/dist/resolvers/backup.js +26 -0
  58. package/dist/resolvers/backup.js.map +1 -0
  59. package/dist/resolvers/identity.d.ts +5 -0
  60. package/dist/resolvers/identity.d.ts.map +1 -0
  61. package/dist/resolvers/identity.js +112 -0
  62. package/dist/resolvers/identity.js.map +1 -0
  63. package/dist/resolvers/platform.d.ts +20 -0
  64. package/dist/resolvers/platform.d.ts.map +1 -0
  65. package/dist/resolvers/platform.js +77 -0
  66. package/dist/resolvers/platform.js.map +1 -0
  67. package/dist/resolvers/route.d.ts +12 -0
  68. package/dist/resolvers/route.d.ts.map +1 -0
  69. package/dist/resolvers/route.js +17 -0
  70. package/dist/resolvers/route.js.map +1 -0
  71. package/dist/resolvers/service.d.ts +13 -0
  72. package/dist/resolvers/service.d.ts.map +1 -0
  73. package/dist/resolvers/service.js +88 -0
  74. package/dist/resolvers/service.js.map +1 -0
  75. package/dist/resolvers/workspace.d.ts +14 -0
  76. package/dist/resolvers/workspace.d.ts.map +1 -0
  77. package/dist/resolvers/workspace.js +46 -0
  78. package/dist/resolvers/workspace.js.map +1 -0
  79. package/dist/state.d.ts +5 -0
  80. package/dist/state.d.ts.map +1 -0
  81. package/dist/state.js +20 -0
  82. package/dist/state.js.map +1 -0
  83. package/package.json +49 -0
@@ -0,0 +1,142 @@
1
+ import { generated, makeRef } from "@intentic/graph";
2
+ import { appSlug, backingPort, bindingId, bucketName, cacheUser, dbName, secretKey } from "../lib/ids.js";
3
+ import { IMAGES } from "../lib/images.js";
4
+ import { sshOf } from "../lib/ssh.js";
5
+ import { exposeRoute, routeId } from "./route.js";
6
+ const catalog = {
7
+ database: { type: "postgres", bindingType: "postgres-database", image: IMAGES.postgres, routes: false },
8
+ cache: { type: "valkey", bindingType: "valkey-namespace", image: IMAGES.valkey, routes: false },
9
+ auth: { type: "authentik", bindingType: "authentik-client", image: IMAGES.authentik, routes: true },
10
+ "object-storage": { type: "garage", bindingType: "garage-bucket", image: IMAGES.garage, routes: false },
11
+ };
12
+ const envContract = {
13
+ database: [["DATABASE_URL", "url"]],
14
+ cache: [
15
+ ["VALKEY_URL", "url"],
16
+ ["REDIS_URL", "url"],
17
+ ],
18
+ auth: [
19
+ ["OIDC_ISSUER", "issuer"],
20
+ ["OIDC_CLIENT_ID", "clientId"],
21
+ ["OIDC_CLIENT_SECRET", "clientSecret"],
22
+ ],
23
+ "object-storage": [
24
+ ["S3_ENDPOINT", "endpoint"],
25
+ ["S3_ACCESS_KEY", "accessKey"],
26
+ ["S3_SECRET_KEY", "secretKey"],
27
+ ["S3_BUCKET", "bucket"],
28
+ ],
29
+ };
30
+ const adminSecretKey = (capability, instanceId) => secretKey(capability === "database" ? "POSTGRES_ADMIN_PASSWORD" : "VALKEY_ADMIN_PASSWORD", instanceId);
31
+ const authBootstrapTokenKey = (instanceId) => secretKey("AUTHENTIK_BOOTSTRAP_TOKEN", instanceId);
32
+ const instanceExtra = (intent) => {
33
+ switch (intent.capability) {
34
+ case "database":
35
+ case "cache":
36
+ return { adminPassword: generated(adminSecretKey(intent.capability, intent.id)) };
37
+ case "auth":
38
+ return {
39
+ domain: intent.domain,
40
+ secretKey: generated(secretKey("AUTHENTIK_SECRET_KEY", intent.id)),
41
+ bootstrapToken: generated(authBootstrapTokenKey(intent.id)),
42
+ bootstrapPassword: generated(secretKey("AUTHENTIK_BOOTSTRAP_PASSWORD", intent.id)),
43
+ dbPassword: generated(secretKey("AUTHENTIK_DB_PASSWORD", intent.id)),
44
+ pgImage: IMAGES.postgres,
45
+ redisImage: IMAGES.valkey,
46
+ };
47
+ case "object-storage":
48
+ return {
49
+ region: "garage",
50
+ ...(intent.domain !== undefined ? { domain: intent.domain } : {}),
51
+ };
52
+ }
53
+ };
54
+ export const resolveBacking = (intent, host, apiToken) => {
55
+ const spec = catalog[intent.capability];
56
+ const node = {
57
+ id: intent.id,
58
+ type: spec.type,
59
+ inputs: {
60
+ server: makeRef(intent.on),
61
+ ...sshOf(host),
62
+ internalIp: makeRef(intent.on, "internalIp"),
63
+ publishPort: backingPort(intent.id),
64
+ image: spec.image,
65
+ ...instanceExtra(intent),
66
+ },
67
+ explicitDependsOn: [intent.on],
68
+ };
69
+ const nodes = [node];
70
+ const ingress = [];
71
+ if (spec.routes || intent.domain !== undefined) {
72
+ if (intent.domain === undefined || intent.expose === undefined) {
73
+ throw new Error(`backing "${intent.id}" (${intent.capability}) must be exposed with a domain; declare it with { expose, domain }`);
74
+ }
75
+ const exposure = exposeRoute(intent.expose, intent.on, intent.domain, backingPort(intent.id), apiToken);
76
+ nodes.push(exposure.route);
77
+ ingress.push(exposure.ingress);
78
+ }
79
+ return { nodes, ingress };
80
+ };
81
+ export const resolveBinding = (appId, intent, host, appDomains) => {
82
+ const spec = catalog[intent.capability];
83
+ const id = bindingId(appId, intent.id);
84
+ const shared = { ...sshOf(host), instance: intent.id };
85
+ const node = (inputs) => ({ id, type: spec.bindingType, inputs, explicitDependsOn: [intent.id] });
86
+ switch (intent.capability) {
87
+ case "database":
88
+ return node({
89
+ ...shared,
90
+ instanceHost: makeRef(intent.id, "internalHost"),
91
+ instancePort: makeRef(intent.id, "port"),
92
+ database: dbName(appId),
93
+ role: dbName(appId),
94
+ password: generated(secretKey("APP_DATABASE_PASSWORD", id)),
95
+ });
96
+ case "cache":
97
+ return node({
98
+ ...shared,
99
+ instanceHost: makeRef(intent.id, "internalHost"),
100
+ instancePort: makeRef(intent.id, "port"),
101
+ adminPassword: generated(adminSecretKey("cache", intent.id)),
102
+ username: cacheUser(appId),
103
+ password: generated(secretKey("APP_CACHE_PASSWORD", id)),
104
+ keyPrefix: cacheUser(appId),
105
+ });
106
+ case "auth": {
107
+ if (intent.domain === undefined || intent.expose === undefined) {
108
+ throw new Error(`auth backing "${intent.id}" must be exposed with a domain; declare it with i.want.auth({ expose, domain })`);
109
+ }
110
+ return {
111
+ id,
112
+ type: spec.bindingType,
113
+ inputs: {
114
+ authentikUrl: `https://${intent.domain}`,
115
+ bootstrapToken: generated(authBootstrapTokenKey(intent.id)),
116
+ domain: intent.domain,
117
+ slug: appSlug(appId),
118
+ clientId: generated(secretKey("OIDC_CLIENT_ID", id)),
119
+ clientSecret: generated(secretKey("OIDC_CLIENT_SECRET", id)),
120
+ redirectDomains: appDomains,
121
+ },
122
+ explicitDependsOn: [intent.id, routeId(intent.expose, intent.domain)],
123
+ };
124
+ }
125
+ case "object-storage":
126
+ return node({
127
+ ...shared,
128
+ endpoint: makeRef(intent.id, "internalEndpoint"),
129
+ bucket: bucketName(appId),
130
+ keyName: bucketName(appId),
131
+ });
132
+ }
133
+ };
134
+ export const bindingEnv = (appId, intent) => {
135
+ const id = bindingId(appId, intent.id);
136
+ const env = {};
137
+ for (const [name, output] of envContract[intent.capability]) {
138
+ env[name] = makeRef(id, output);
139
+ }
140
+ return env;
141
+ };
142
+ //# sourceMappingURL=backing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backing.js","sourceRoot":"","sources":["../../src/resolvers/backing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { BackupInput, HostInput } from "@intentic/need-resolver";
2
+ import type { ResolvedNode } from "@intentic/resources";
3
+ export declare const DEFAULT_BACKUP_REPO = "/repo";
4
+ export declare const defaultBackupInput: () => BackupInput;
5
+ export declare const resolveBackup: (hostId: string, host: HostInput, input: BackupInput, signozServiceId: string | undefined) => ResolvedNode;
6
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/resolvers/backup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAO,WAAsF,CAAC;AAQ7H,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,MAAM,SAAS,EAAE,OAAO,WAAW,EAAE,iBAAiB,MAAM,GAAG,SAAS,KAAG,YAkBxH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { generated } from "@intentic/graph";
2
+ import { backupId, forgejoId, komodoId } from "../lib/ids.js";
3
+ import { IMAGES } from "../lib/images.js";
4
+ import { sshOf } from "../lib/ssh.js";
5
+ export const DEFAULT_BACKUP_REPO = "/repo";
6
+ export const defaultBackupInput = () => ({ repo: DEFAULT_BACKUP_REPO, password: generated("RESTIC_PASSWORD") });
7
+ export const resolveBackup = (hostId, host, input, signozServiceId) => {
8
+ const ssh = sshOf(host);
9
+ const signoz = input.signoz === true && signozServiceId !== undefined;
10
+ return {
11
+ id: backupId(hostId),
12
+ type: "backup",
13
+ inputs: {
14
+ ...ssh,
15
+ repo: input.repo,
16
+ password: input.password,
17
+ signoz,
18
+ image: IMAGES.backup,
19
+ ...(input.credentials !== undefined ? { credentials: input.credentials } : {}),
20
+ ...(input.schedule !== undefined ? { schedule: input.schedule } : {}),
21
+ ...(input.retention !== undefined ? { retention: input.retention } : {}),
22
+ },
23
+ explicitDependsOn: [forgejoId(hostId), komodoId(hostId), ...(signoz ? [signozServiceId] : [])],
24
+ };
25
+ };
26
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/resolvers/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAOtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAQ7H,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,IAAe,EAAE,KAAkB,EAAE,eAAmC,EAAgB,EAAE;IACpI,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,CAAC;IACtE,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACJ,GAAG,GAAG;YACN,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E;QACD,iBAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACjG,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { IntentSet } from "@intentic/need-resolver";
2
+ import type { ResolvedNode } from "@intentic/resources";
3
+ import type { PlatformRefs } from "./platform.js";
4
+ export declare const resolveIdentities: (intent: IntentSet, platform: PlatformRefs, hostId: string) => ResolvedNode[];
5
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/resolvers/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,SAAS,EAAc,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA4BlD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,UAAU,YAAY,EAAE,QAAQ,MAAM,KAAG,YAAY,EAuHzG,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { generated, makeRef } from "@intentic/graph";
2
+ import { adminUsername, deploymentId, forgejoOrgId, forgejoTeamId, forgejoUserId, komodoUserId, orgName, repoId, userPasswordKey, } from "../lib/ids.js";
3
+ const TEAM_NAME = "members";
4
+ const forgejoRoleRank = { read: 1, write: 2, admin: 3 };
5
+ const strongerForgejoRole = (a, b) => (forgejoRoleRank[a] >= forgejoRoleRank[b] ? a : b);
6
+ const komodoLevel = { read: "Read", execute: "Execute", admin: "Write" };
7
+ const komodoLevelRank = { Read: 1, Execute: 2, Write: 3 };
8
+ export const resolveIdentities = (intent, platform, hostId) => {
9
+ const forgejoUrl = makeRef(platform.forgejo, "url");
10
+ const komodoUrl = makeRef(platform.deploy, "url");
11
+ const forgejoAdmin = { adminUser: adminUsername, adminPassword: generated("FORGEJO_ADMIN_PASSWORD") };
12
+ const komodoAdmin = { adminUser: adminUsername, adminPassword: generated("KOMODO_ADMIN_PASSWORD") };
13
+ const userById = new Map(intent.users.map((user) => [user.id, user.input]));
14
+ const teamById = new Map(intent.teams.map((team) => [team.id, team.input]));
15
+ for (const team of intent.teams) {
16
+ for (const member of team.input.members) {
17
+ if (!userById.has(member)) {
18
+ throw new Error(`team "${team.id}" references unknown user "${member}"; declare it with i.want.user`);
19
+ }
20
+ }
21
+ }
22
+ for (const app of intent.apps) {
23
+ for (const grant of app.teams ?? []) {
24
+ if (!teamById.has(grant.team)) {
25
+ throw new Error(`app "${app.id}" grants unknown team "${grant.team}"; declare it with i.want.team`);
26
+ }
27
+ }
28
+ }
29
+ const teamPermission = new Map();
30
+ const teamRepos = new Map();
31
+ const userGrants = new Map();
32
+ const teamMembers = (teamId) => teamById.get(teamId)?.members ?? [];
33
+ for (const app of intent.apps) {
34
+ const grants = app.teams ?? [];
35
+ const ownerGrant = grants[0];
36
+ if (ownerGrant === undefined) {
37
+ continue;
38
+ }
39
+ const owner = orgName(ownerGrant.team);
40
+ const deployments = Object.keys(app.environments).map((environment) => deploymentId(app.id, environment));
41
+ for (const grant of grants) {
42
+ const current = teamPermission.get(grant.team);
43
+ teamPermission.set(grant.team, current === undefined ? grant.role : strongerForgejoRole(current, grant.role));
44
+ const repos = teamRepos.get(grant.team) ?? [];
45
+ repos.push({ owner, name: app.id });
46
+ teamRepos.set(grant.team, repos);
47
+ const level = komodoLevel[teamById.get(grant.team)?.komodo ?? "read"];
48
+ for (const member of teamMembers(grant.team)) {
49
+ const grantsForUser = userGrants.get(member) ?? new Map();
50
+ for (const deployment of deployments) {
51
+ const existing = grantsForUser.get(deployment);
52
+ if (existing === undefined || komodoLevelRank[level] > komodoLevelRank[existing]) {
53
+ grantsForUser.set(deployment, level);
54
+ }
55
+ }
56
+ userGrants.set(member, grantsForUser);
57
+ }
58
+ }
59
+ }
60
+ const nodes = [];
61
+ for (const user of intent.users) {
62
+ const grants = [...(userGrants.get(user.id) ?? new Map()).entries()].map(([deployment, level]) => ({ deployment, level }));
63
+ nodes.push({
64
+ id: forgejoUserId(hostId, user.id),
65
+ type: "forgejo-user",
66
+ inputs: {
67
+ forgejoUrl,
68
+ ...forgejoAdmin,
69
+ username: user.input.username,
70
+ email: user.input.email,
71
+ accountPassword: generated(userPasswordKey(user.id)),
72
+ },
73
+ explicitDependsOn: [platform.forgejo, platform.gitRoute],
74
+ });
75
+ nodes.push({
76
+ id: komodoUserId(hostId, user.id),
77
+ type: "komodo-user",
78
+ inputs: { komodoUrl, ...komodoAdmin, username: user.input.username, password: generated(userPasswordKey(user.id)), grants },
79
+ explicitDependsOn: [platform.deploy, platform.deployRoute, ...grants.map((grant) => grant.deployment)],
80
+ });
81
+ }
82
+ for (const team of intent.teams) {
83
+ const org = orgName(team.id);
84
+ const repos = teamRepos.get(team.id) ?? [];
85
+ nodes.push({
86
+ id: forgejoOrgId(hostId, team.id),
87
+ type: "forgejo-org",
88
+ inputs: { forgejoUrl, ...forgejoAdmin, org },
89
+ explicitDependsOn: [platform.forgejo, platform.gitRoute],
90
+ });
91
+ nodes.push({
92
+ id: forgejoTeamId(hostId, team.id),
93
+ type: "forgejo-team",
94
+ inputs: {
95
+ forgejoUrl,
96
+ ...forgejoAdmin,
97
+ org,
98
+ name: TEAM_NAME,
99
+ permission: teamPermission.get(team.id) ?? "read",
100
+ members: team.input.members.map((member) => userById.get(member)?.username ?? member),
101
+ repos,
102
+ },
103
+ explicitDependsOn: [
104
+ forgejoOrgId(hostId, team.id),
105
+ ...team.input.members.map((member) => forgejoUserId(hostId, member)),
106
+ ...repos.map((repo) => repoId(repo.name)),
107
+ ],
108
+ });
109
+ }
110
+ return nodes;
111
+ };
112
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/resolvers/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SecretRef } from "@intentic/graph";
2
+ import type { HostInput } from "@intentic/need-resolver";
3
+ import type { ResolvedNode } from "@intentic/resources";
4
+ import type { IngressPair } from "./route.js";
5
+ export interface PlatformRefs {
6
+ readonly forgejo: string;
7
+ readonly deploy: string;
8
+ readonly gitRoute: string;
9
+ readonly deployRoute: string;
10
+ }
11
+ export interface GuardConfig {
12
+ readonly repo: string;
13
+ readonly resticImage: string;
14
+ }
15
+ export declare const resolvePlatform: (hostId: string, cloudflareId: string, zone: string, apiToken: SecretRef, host: HostInput, guard: GuardConfig | undefined) => {
16
+ nodes: ResolvedNode[];
17
+ refs: PlatformRefs;
18
+ ingress: IngressPair[];
19
+ };
20
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/resolvers/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAcD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,GACxB,QAAQ,MAAM,EACd,cAAc,MAAM,EACpB,MAAM,MAAM,EACZ,UAAU,SAAS,EACnB,MAAM,SAAS,EACf,OAAO,WAAW,GAAG,SAAS,KAC/B;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CA+ErE,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { generated, httpOk, makeRef } from "@intentic/graph";
2
+ import { adminUsername, deployDomain, forgejoId, gitDomain, komodoId, registryAuthority, runnerId } from "../lib/ids.js";
3
+ import { IMAGES } from "../lib/images.js";
4
+ import { sshOf } from "../lib/ssh.js";
5
+ import { exposeRoute } from "./route.js";
6
+ const FORGEJO_PORT = 3000;
7
+ const KOMODO_PORT = 9120;
8
+ export const resolvePlatform = (hostId, cloudflareId, zone, apiToken, host, guard) => {
9
+ const guarded = guard !== undefined ? { guardRepo: guard.repo, resticImage: guard.resticImage } : {};
10
+ const forgejo = forgejoId(hostId);
11
+ const deploy = komodoId(hostId);
12
+ const server = makeRef(hostId);
13
+ const ssh = sshOf(host);
14
+ const internalIp = makeRef(hostId, "internalIp");
15
+ const git = exposeRoute(cloudflareId, hostId, gitDomain(zone), FORGEJO_PORT, apiToken);
16
+ const komodo = exposeRoute(cloudflareId, hostId, deployDomain(zone), KOMODO_PORT, apiToken);
17
+ const nodes = [
18
+ {
19
+ id: forgejo,
20
+ type: "forgejo",
21
+ inputs: {
22
+ server,
23
+ ...ssh,
24
+ internalIp,
25
+ domain: gitDomain(zone),
26
+ adminUser: adminUsername,
27
+ adminPassword: generated("FORGEJO_ADMIN_PASSWORD"),
28
+ image: IMAGES.forgejo,
29
+ ...guarded,
30
+ },
31
+ explicitDependsOn: [],
32
+ readyWhen: httpOk(makeRef(forgejo, "internalUrl"), { timeout: "120s" }),
33
+ },
34
+ {
35
+ id: runnerId(hostId),
36
+ type: "forgejo-runner",
37
+ inputs: {
38
+ server,
39
+ ...ssh,
40
+ instanceUrl: makeRef(forgejo, "internalUrl"),
41
+ token: makeRef(forgejo, "runnerToken"),
42
+ image: IMAGES.forgejoRunner,
43
+ jobImage: IMAGES.forgejoRunnerJob,
44
+ },
45
+ explicitDependsOn: [],
46
+ },
47
+ {
48
+ id: deploy,
49
+ type: "komodo",
50
+ inputs: {
51
+ server,
52
+ ...ssh,
53
+ internalIp,
54
+ domain: deployDomain(zone),
55
+ forgejoUrl: makeRef(forgejo, "internalUrl"),
56
+ runnerToken: makeRef(forgejo, "runnerToken"),
57
+ adminUser: adminUsername,
58
+ adminPassword: generated("KOMODO_ADMIN_PASSWORD"),
59
+ gitAccount: adminUsername,
60
+ gitToken: makeRef(forgejo, "gitToken"),
61
+ registry: registryAuthority(zone),
62
+ packagesToken: makeRef(forgejo, "packagesToken"),
63
+ coreImage: IMAGES.komodoCore,
64
+ peripheryImage: IMAGES.komodoPeriphery,
65
+ ferretdbImage: IMAGES.ferretdb,
66
+ postgresImage: IMAGES.postgresDocumentdb,
67
+ ...guarded,
68
+ },
69
+ explicitDependsOn: [],
70
+ readyWhen: httpOk(makeRef(deploy, "internalUrl"), { timeout: "90s" }),
71
+ },
72
+ git.route,
73
+ komodo.route,
74
+ ];
75
+ return { nodes, refs: { forgejo, deploy, gitRoute: git.route.id, deployRoute: komodo.route.id }, ingress: [git.ingress, komodo.ingress] };
76
+ };
77
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/resolvers/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SecretRef } from "@intentic/graph";
2
+ import type { ResolvedNode } from "@intentic/resources";
3
+ export declare const routeId: (cloudflareId: string, hostname: string) => string;
4
+ export interface IngressPair {
5
+ readonly hostname: string;
6
+ readonly port: number;
7
+ }
8
+ export declare const exposeRoute: (cloudflareId: string, hostId: string, hostname: string, port: number, apiToken: SecretRef) => {
9
+ route: ResolvedNode;
10
+ ingress: IngressPair;
11
+ };
12
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/resolvers/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,eAAO,MAAM,OAAO,GAAI,cAAc,MAAM,EAAE,UAAU,MAAM,KAAG,MAA6C,CAAC;AAK/G,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAKD,eAAO,MAAM,WAAW,GACpB,cAAc,MAAM,EACpB,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,MAAM,MAAM,EACZ,UAAU,SAAS,KACpB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAQ5C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { makeRef } from "@intentic/graph";
2
+ import { tunnelId } from "../lib/ids.js";
3
+ const slug = (hostname) => hostname
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9]+/g, "-")
6
+ .replace(/^-+|-+$/g, "");
7
+ export const routeId = (cloudflareId, hostname) => `${cloudflareId}-${slug(hostname)}`;
8
+ export const exposeRoute = (cloudflareId, hostId, hostname, port, apiToken) => ({
9
+ route: {
10
+ id: routeId(cloudflareId, hostname),
11
+ type: "cf-route",
12
+ inputs: { hostname, zoneId: makeRef(cloudflareId, "zoneId"), apiToken, cname: makeRef(tunnelId(hostId), "cname") },
13
+ explicitDependsOn: [cloudflareId, tunnelId(hostId)],
14
+ },
15
+ ingress: { hostname, port },
16
+ });
17
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/resolvers/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAU,EAAE,CACtC,QAAQ;KACH,WAAW,EAAE;KACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;KAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAGjC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,YAAoB,EAAE,QAAgB,EAAU,EAAE,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAa/G,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,YAAoB,EACpB,MAAc,EACd,QAAgB,EAChB,IAAY,EACZ,QAAmB,EAC0B,EAAE,CAAC,CAAC;IACjD,KAAK,EAAE;QACH,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;QACnC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE;QAClH,iBAAiB,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;KACtD;IACD,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;CAC9B,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SecretRef } from "@intentic/graph";
2
+ import type { HostInput, ServiceIntent, ServiceKind } from "@intentic/need-resolver";
3
+ import type { ResolvedNode } from "@intentic/resources";
4
+ import type { IngressPair } from "./route.js";
5
+ export declare const serviceMcp: (kind: ServiceKind) => {
6
+ readonly path: string;
7
+ readonly tokenSecret: string;
8
+ } | undefined;
9
+ export declare const resolveService: (intent: ServiceIntent, host: HostInput, zone: string, apiToken: SecretRef) => {
10
+ nodes: ResolvedNode[];
11
+ ingress: IngressPair[];
12
+ };
13
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/resolvers/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgF9C,eAAO,MAAM,UAAU,GAAI,MAAM,WAAW,KAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAA8B,CAAC;AAUxI,eAAO,MAAM,cAAc,GACvB,QAAQ,aAAa,EACrB,MAAM,SAAS,EACf,MAAM,MAAM,EACZ,UAAU,SAAS,KACpB;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAuCjD,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { generated, httpOk, makeRef } from "@intentic/graph";
2
+ import { IMAGES } from "../lib/images.js";
3
+ import { sshOf } from "../lib/ssh.js";
4
+ import { exposeRoute } from "./route.js";
5
+ const catalog = {
6
+ signoz: {
7
+ type: "signoz",
8
+ port: 8080,
9
+ images: {
10
+ clickhouseImage: IMAGES.clickhouse,
11
+ signozImage: IMAGES.signoz,
12
+ otelImage: IMAGES.signozOtelCollector,
13
+ zookeeperImage: IMAGES.signozZookeeper,
14
+ },
15
+ mcp: { path: "/mcp", tokenSecret: "SIGNOZ_MCP_TOKEN" },
16
+ },
17
+ outline: {
18
+ type: "outline",
19
+ port: 3210,
20
+ authPort: 5556,
21
+ images: {
22
+ outlineImage: IMAGES.outline,
23
+ postgresImage: IMAGES.postgres,
24
+ valkeyImage: IMAGES.valkey,
25
+ dexImage: IMAGES.dex,
26
+ },
27
+ },
28
+ paperless: {
29
+ type: "paperless",
30
+ port: 8000,
31
+ images: { paperlessImage: IMAGES.paperless, valkeyImage: IMAGES.valkey },
32
+ },
33
+ openproject: {
34
+ type: "openproject",
35
+ port: 8082,
36
+ adminLogin: "admin",
37
+ readyTimeout: "600s",
38
+ images: { openprojectImage: IMAGES.openproject },
39
+ },
40
+ invoiceninja: {
41
+ type: "invoiceninja",
42
+ port: 8083,
43
+ readyTimeout: "600s",
44
+ images: { invoiceninjaImage: IMAGES.invoiceninja, mariadbImage: IMAGES.mariadb, valkeyImage: IMAGES.valkey },
45
+ },
46
+ infisical: {
47
+ type: "infisical",
48
+ port: 8084,
49
+ images: { infisicalImage: IMAGES.infisical, postgresImage: IMAGES.postgres, valkeyImage: IMAGES.valkey },
50
+ },
51
+ };
52
+ export const serviceMcp = (kind) => catalog[kind].mcp;
53
+ const serviceAdminEmail = (zone) => `intentic@${zone}`;
54
+ export const resolveService = (intent, host, zone, apiToken) => {
55
+ const spec = catalog[intent.kind];
56
+ const ssh = sshOf(host);
57
+ const exposure = exposeRoute(intent.expose, intent.on, intent.domain, spec.port, apiToken);
58
+ const authDomain = spec.authPort === undefined
59
+ ? undefined
60
+ : intent.domain === zone
61
+ ? `auth.${zone}`
62
+ : `${intent.domain.slice(0, -(zone.length + 1))}-auth.${zone}`;
63
+ const authExposure = spec.authPort === undefined || authDomain === undefined
64
+ ? undefined
65
+ : exposeRoute(intent.expose, intent.on, authDomain, spec.authPort, apiToken);
66
+ const nodes = [
67
+ {
68
+ id: intent.id,
69
+ type: spec.type,
70
+ inputs: {
71
+ server: makeRef(intent.on),
72
+ ...ssh,
73
+ internalIp: makeRef(intent.on, "internalIp"),
74
+ domain: intent.domain,
75
+ ...(authDomain === undefined ? {} : { authDomain }),
76
+ adminUser: spec.adminLogin ?? serviceAdminEmail(zone),
77
+ adminPassword: generated(`${intent.kind.toUpperCase()}_ADMIN_PASSWORD`),
78
+ ...spec.images,
79
+ },
80
+ explicitDependsOn: [],
81
+ readyWhen: httpOk(makeRef(intent.id, "internalUrl"), { timeout: spec.readyTimeout ?? "180s" }),
82
+ },
83
+ exposure.route,
84
+ ...(authExposure === undefined ? [] : [authExposure.route]),
85
+ ];
86
+ return { nodes, ingress: [exposure.ingress, ...(authExposure === undefined ? [] : [authExposure.ingress])] };
87
+ };
88
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/resolvers/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SecretRef } from "@intentic/graph";
2
+ import type { HostInput, ServiceKind, WorkspaceIntent } from "@intentic/need-resolver";
3
+ import type { ResolvedNode } from "@intentic/resources";
4
+ import type { IngressPair } from "./route.js";
5
+ export interface WorkspaceTool {
6
+ readonly id: string;
7
+ readonly kind: ServiceKind;
8
+ readonly domain: string;
9
+ }
10
+ export declare const resolveWorkspace: (intent: WorkspaceIntent, host: HostInput, zone: string, apiToken: SecretRef, tools: readonly WorkspaceTool[]) => {
11
+ nodes: ResolvedNode[];
12
+ ingress: IngressPair[];
13
+ };
14
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/resolvers/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAgBD,eAAO,MAAM,gBAAgB,GACzB,QAAQ,eAAe,EACvB,MAAM,SAAS,EACf,MAAM,MAAM,EACZ,UAAU,SAAS,EACnB,OAAO,SAAS,aAAa,EAAE,KAChC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CA4CjD,CAAC"}