@ankhorage/studio 0.0.21 → 0.1.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 (188) hide show
  1. package/README.md +1 -2
  2. package/dist/cli/index.d.ts +4 -4
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +81 -66
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/hooks/useProjects.js +1 -1
  7. package/dist/hooks/useProjects.js.map +1 -1
  8. package/dist/host/createStudioHost.d.ts +13 -0
  9. package/dist/host/createStudioHost.d.ts.map +1 -0
  10. package/dist/host/createStudioHost.js +16 -0
  11. package/dist/host/createStudioHost.js.map +1 -0
  12. package/dist/host/http/security.d.ts +2 -0
  13. package/dist/host/http/security.d.ts.map +1 -0
  14. package/dist/host/http/security.js +55 -0
  15. package/dist/host/http/security.js.map +1 -0
  16. package/dist/host/http/server.d.ts +16 -0
  17. package/dist/host/http/server.d.ts.map +1 -0
  18. package/dist/host/http/server.js +549 -0
  19. package/dist/host/http/server.js.map +1 -0
  20. package/dist/host/layout/auth/resolveAuthLayoutPlan.d.ts +38 -0
  21. package/dist/host/layout/auth/resolveAuthLayoutPlan.d.ts.map +1 -0
  22. package/dist/host/layout/auth/resolveAuthLayoutPlan.js +262 -0
  23. package/dist/host/layout/auth/resolveAuthLayoutPlan.js.map +1 -0
  24. package/dist/host/layout/layoutGenerator.d.ts +19 -0
  25. package/dist/host/layout/layoutGenerator.d.ts.map +1 -0
  26. package/dist/host/layout/layoutGenerator.js +418 -0
  27. package/dist/host/layout/layoutGenerator.js.map +1 -0
  28. package/dist/host/layout/templates/auth/adapter.d.ts +6 -0
  29. package/dist/host/layout/templates/auth/adapter.d.ts.map +1 -0
  30. package/dist/host/layout/templates/auth/adapter.js +94 -0
  31. package/dist/host/layout/templates/auth/adapter.js.map +1 -0
  32. package/dist/host/layout/templates/auth/screen.d.ts +12 -0
  33. package/dist/host/layout/templates/auth/screen.d.ts.map +1 -0
  34. package/dist/host/layout/templates/auth/screen.js +648 -0
  35. package/dist/host/layout/templates/auth/screen.js.map +1 -0
  36. package/dist/host/layout/templates/auth/session.d.ts +2 -0
  37. package/dist/host/layout/templates/auth/session.d.ts.map +1 -0
  38. package/dist/host/layout/templates/auth/session.js +326 -0
  39. package/dist/host/layout/templates/auth/session.js.map +1 -0
  40. package/dist/host/layout/templates/auth/signOut.d.ts +2 -0
  41. package/dist/host/layout/templates/auth/signOut.d.ts.map +1 -0
  42. package/dist/host/layout/templates/auth/signOut.js +43 -0
  43. package/dist/host/layout/templates/auth/signOut.js.map +1 -0
  44. package/dist/host/layout/templates/index.d.ts +11 -0
  45. package/dist/host/layout/templates/index.d.ts.map +1 -0
  46. package/dist/host/layout/templates/index.js +10 -0
  47. package/dist/host/layout/templates/index.js.map +1 -0
  48. package/dist/host/layout/templates/navigation.d.ts +16 -0
  49. package/dist/host/layout/templates/navigation.d.ts.map +1 -0
  50. package/dist/host/layout/templates/navigation.js +332 -0
  51. package/dist/host/layout/templates/navigation.js.map +1 -0
  52. package/dist/host/layout/templates/nestedLayout.d.ts +7 -0
  53. package/dist/host/layout/templates/nestedLayout.d.ts.map +1 -0
  54. package/dist/host/layout/templates/nestedLayout.js +56 -0
  55. package/dist/host/layout/templates/nestedLayout.js.map +1 -0
  56. package/dist/host/layout/templates/redirect.d.ts +2 -0
  57. package/dist/host/layout/templates/redirect.d.ts.map +1 -0
  58. package/dist/host/layout/templates/redirect.js +10 -0
  59. package/dist/host/layout/templates/redirect.js.map +1 -0
  60. package/dist/host/layout/templates/rootLayout.d.ts +28 -0
  61. package/dist/host/layout/templates/rootLayout.d.ts.map +1 -0
  62. package/dist/host/layout/templates/rootLayout.js +507 -0
  63. package/dist/host/layout/templates/rootLayout.js.map +1 -0
  64. package/dist/host/layout/templates/screen.d.ts +6 -0
  65. package/dist/host/layout/templates/screen.d.ts.map +1 -0
  66. package/dist/host/layout/templates/screen.js +94 -0
  67. package/dist/host/layout/templates/screen.js.map +1 -0
  68. package/dist/host/layout/templates/utils/routes.d.ts +3 -0
  69. package/dist/host/layout/templates/utils/routes.d.ts.map +1 -0
  70. package/dist/host/layout/templates/utils/routes.js +15 -0
  71. package/dist/host/layout/templates/utils/routes.js.map +1 -0
  72. package/dist/host/layout/templates/utils/strings.d.ts +3 -0
  73. package/dist/host/layout/templates/utils/strings.d.ts.map +1 -0
  74. package/dist/host/layout/templates/utils/strings.js +7 -0
  75. package/dist/host/layout/templates/utils/strings.js.map +1 -0
  76. package/dist/host/layout/utils/escapeStringLiteral.d.ts +2 -0
  77. package/dist/host/layout/utils/escapeStringLiteral.d.ts.map +1 -0
  78. package/dist/host/layout/utils/escapeStringLiteral.js +8 -0
  79. package/dist/host/layout/utils/escapeStringLiteral.js.map +1 -0
  80. package/dist/host/manifestSystem/auth/index.d.ts +2 -0
  81. package/dist/host/manifestSystem/auth/index.d.ts.map +1 -0
  82. package/dist/host/manifestSystem/auth/index.js +2 -0
  83. package/dist/host/manifestSystem/auth/index.js.map +1 -0
  84. package/dist/host/manifestSystem/auth/shared/global.auth.system.tpl.d.ts +4 -0
  85. package/dist/host/manifestSystem/auth/shared/global.auth.system.tpl.d.ts.map +1 -0
  86. package/dist/host/manifestSystem/auth/shared/global.auth.system.tpl.js +7 -0
  87. package/dist/host/manifestSystem/auth/shared/global.auth.system.tpl.js.map +1 -0
  88. package/dist/host/manifestSystem/auth/shared/index.d.ts +3 -0
  89. package/dist/host/manifestSystem/auth/shared/index.d.ts.map +1 -0
  90. package/dist/host/manifestSystem/auth/shared/index.js +8 -0
  91. package/dist/host/manifestSystem/auth/shared/index.js.map +1 -0
  92. package/dist/host/manifestSystem/index.d.ts +5 -0
  93. package/dist/host/manifestSystem/index.d.ts.map +1 -0
  94. package/dist/host/manifestSystem/index.js +23 -0
  95. package/dist/host/manifestSystem/index.js.map +1 -0
  96. package/dist/host/manifestSystem/types.d.ts +8 -0
  97. package/dist/host/manifestSystem/types.d.ts.map +1 -0
  98. package/dist/host/manifestSystem/types.js +2 -0
  99. package/dist/host/manifestSystem/types.js.map +1 -0
  100. package/dist/host/modules/catalog.d.ts +40 -0
  101. package/dist/host/modules/catalog.d.ts.map +1 -0
  102. package/dist/host/modules/catalog.js +112 -0
  103. package/dist/host/modules/catalog.js.map +1 -0
  104. package/dist/host/modules/layout.d.ts +7 -0
  105. package/dist/host/modules/layout.d.ts.map +1 -0
  106. package/dist/host/modules/layout.js +2 -0
  107. package/dist/host/modules/layout.js.map +1 -0
  108. package/dist/host/modules/runtime/LocalFsTargetAdapter.d.ts +34 -0
  109. package/dist/host/modules/runtime/LocalFsTargetAdapter.d.ts.map +1 -0
  110. package/dist/host/modules/runtime/LocalFsTargetAdapter.js +85 -0
  111. package/dist/host/modules/runtime/LocalFsTargetAdapter.js.map +1 -0
  112. package/dist/host/orchestrator/generatedAppFiles.d.ts +8 -0
  113. package/dist/host/orchestrator/generatedAppFiles.d.ts.map +1 -0
  114. package/dist/host/orchestrator/generatedAppFiles.js +125 -0
  115. package/dist/host/orchestrator/generatedAppFiles.js.map +1 -0
  116. package/dist/host/orchestrator/generatedRouteCleanup.d.ts +5 -0
  117. package/dist/host/orchestrator/generatedRouteCleanup.d.ts.map +1 -0
  118. package/dist/host/orchestrator/generatedRouteCleanup.js +117 -0
  119. package/dist/host/orchestrator/generatedRouteCleanup.js.map +1 -0
  120. package/dist/host/orchestrator/infraGenerator.d.ts +35 -0
  121. package/dist/host/orchestrator/infraGenerator.d.ts.map +1 -0
  122. package/dist/host/orchestrator/infraGenerator.js +135 -0
  123. package/dist/host/orchestrator/infraGenerator.js.map +1 -0
  124. package/dist/host/orchestrator/infraRuntime.d.ts +38 -0
  125. package/dist/host/orchestrator/infraRuntime.d.ts.map +1 -0
  126. package/dist/host/orchestrator/infraRuntime.js +227 -0
  127. package/dist/host/orchestrator/infraRuntime.js.map +1 -0
  128. package/dist/host/orchestrator/infraValidation.d.ts +3 -0
  129. package/dist/host/orchestrator/infraValidation.d.ts.map +1 -0
  130. package/dist/host/orchestrator/infraValidation.js +59 -0
  131. package/dist/host/orchestrator/infraValidation.js.map +1 -0
  132. package/dist/host/orchestrator/moduleManager.d.ts +86 -0
  133. package/dist/host/orchestrator/moduleManager.d.ts.map +1 -0
  134. package/dist/host/orchestrator/moduleManager.js +312 -0
  135. package/dist/host/orchestrator/moduleManager.js.map +1 -0
  136. package/dist/host/orchestrator/projectDeletion.d.ts +27 -0
  137. package/dist/host/orchestrator/projectDeletion.d.ts.map +1 -0
  138. package/dist/host/orchestrator/projectDeletion.js +242 -0
  139. package/dist/host/orchestrator/projectDeletion.js.map +1 -0
  140. package/dist/host/orchestrator/projectManager.d.ts +87 -0
  141. package/dist/host/orchestrator/projectManager.d.ts.map +1 -0
  142. package/dist/host/orchestrator/projectManager.js +371 -0
  143. package/dist/host/orchestrator/projectManager.js.map +1 -0
  144. package/dist/host/orchestrator/projectPaths.d.ts +4 -0
  145. package/dist/host/orchestrator/projectPaths.d.ts.map +1 -0
  146. package/dist/host/orchestrator/projectPaths.js +25 -0
  147. package/dist/host/orchestrator/projectPaths.js.map +1 -0
  148. package/dist/host/orchestrator/projectStore.d.ts +24 -0
  149. package/dist/host/orchestrator/projectStore.d.ts.map +1 -0
  150. package/dist/host/orchestrator/projectStore.js +155 -0
  151. package/dist/host/orchestrator/projectStore.js.map +1 -0
  152. package/dist/host/orchestrator/resolveMutations.d.ts +3 -0
  153. package/dist/host/orchestrator/resolveMutations.d.ts.map +1 -0
  154. package/dist/host/orchestrator/resolveMutations.js +12 -0
  155. package/dist/host/orchestrator/resolveMutations.js.map +1 -0
  156. package/dist/host/orchestrator/scaffolder.d.ts +33 -0
  157. package/dist/host/orchestrator/scaffolder.d.ts.map +1 -0
  158. package/dist/host/orchestrator/scaffolder.js +246 -0
  159. package/dist/host/orchestrator/scaffolder.js.map +1 -0
  160. package/dist/host/orchestrator/templates.d.ts +83 -0
  161. package/dist/host/orchestrator/templates.d.ts.map +1 -0
  162. package/dist/host/orchestrator/templates.js +355 -0
  163. package/dist/host/orchestrator/templates.js.map +1 -0
  164. package/dist/host/orchestrator/workspaceRuntime.d.ts +2 -0
  165. package/dist/host/orchestrator/workspaceRuntime.d.ts.map +1 -0
  166. package/dist/host/orchestrator/workspaceRuntime.js +82 -0
  167. package/dist/host/orchestrator/workspaceRuntime.js.map +1 -0
  168. package/dist/host/templateRegistry/index.d.ts +16 -0
  169. package/dist/host/templateRegistry/index.d.ts.map +1 -0
  170. package/dist/host/templateRegistry/index.js +74 -0
  171. package/dist/host/templateRegistry/index.js.map +1 -0
  172. package/dist/host/utils/requirementsInference.d.ts +4 -0
  173. package/dist/host/utils/requirementsInference.d.ts.map +1 -0
  174. package/dist/host/utils/requirementsInference.js +49 -0
  175. package/dist/host/utils/requirementsInference.js.map +1 -0
  176. package/dist/host/utils/trimOutput.d.ts +7 -0
  177. package/dist/host/utils/trimOutput.d.ts.map +1 -0
  178. package/dist/host/utils/trimOutput.js +32 -0
  179. package/dist/host/utils/trimOutput.js.map +1 -0
  180. package/dist/host/utils/workspaceRoot.d.ts +2 -0
  181. package/dist/host/utils/workspaceRoot.d.ts.map +1 -0
  182. package/dist/host/utils/workspaceRoot.js +33 -0
  183. package/dist/host/utils/workspaceRoot.js.map +1 -0
  184. package/dist/host/zoraExtensions/index.d.ts +11 -0
  185. package/dist/host/zoraExtensions/index.d.ts.map +1 -0
  186. package/dist/host/zoraExtensions/index.js +54 -0
  187. package/dist/host/zoraExtensions/index.js.map +1 -0
  188. package/package.json +16 -3
@@ -0,0 +1,117 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ const ROUTE_LEDGER_REL_PATH = '.ankh/route-ledger.json';
4
+ const ROUTE_ROOT_REL_PATH = 'src/app';
5
+ export async function syncGeneratedRouteFiles(args) {
6
+ const { projectPath, generatedPaths } = args;
7
+ const nextFiles = new Set(generatedPaths.map((filePath) => normalizeRel(filePath)));
8
+ const previousLedger = await readRouteLedger(projectPath);
9
+ const previousFiles = new Set((previousLedger?.files ?? []).map((filePath) => normalizeRel(filePath)));
10
+ if (previousLedger) {
11
+ const staleFiles = new Set([...previousFiles].filter((filePath) => !nextFiles.has(filePath)));
12
+ await removeFiles(projectPath, staleFiles);
13
+ }
14
+ else {
15
+ await removeOrphanedGeneratedScreenFiles(projectPath, nextFiles);
16
+ }
17
+ await writeRouteLedger(projectPath, {
18
+ schemaVersion: 1,
19
+ generatedAt: new Date().toISOString(),
20
+ files: [...nextFiles].sort(),
21
+ });
22
+ }
23
+ async function removeOrphanedGeneratedScreenFiles(projectPath, generatedFiles) {
24
+ const appRoot = resolveProjectFile(projectPath, ROUTE_ROOT_REL_PATH);
25
+ if (!(await exists(appRoot)))
26
+ return;
27
+ const routeFiles = await listFilesRecursively(appRoot);
28
+ for (const absPath of routeFiles) {
29
+ if (!absPath.endsWith('.tsx'))
30
+ continue;
31
+ const relPath = normalizeRel(path.relative(projectPath, absPath));
32
+ if (generatedFiles.has(relPath))
33
+ continue;
34
+ const content = await fs.readFile(absPath, 'utf8');
35
+ if (!looksLikeGeneratedScreenFile(content))
36
+ continue;
37
+ await fs.rm(absPath, { force: true });
38
+ }
39
+ }
40
+ async function listFilesRecursively(absDir) {
41
+ const entries = await fs.readdir(absDir, { withFileTypes: true });
42
+ const files = [];
43
+ for (const entry of entries) {
44
+ const absPath = path.join(absDir, entry.name);
45
+ if (entry.isDirectory()) {
46
+ files.push(...(await listFilesRecursively(absPath)));
47
+ }
48
+ else if (entry.isFile()) {
49
+ files.push(absPath);
50
+ }
51
+ }
52
+ return files;
53
+ }
54
+ function looksLikeGeneratedScreenFile(content) {
55
+ return (content.includes("import ankhConfig from '@root/ankh.config.json';") &&
56
+ content.includes('useOptionalManifestContext') &&
57
+ content.includes('RuntimeRenderer') &&
58
+ content.includes('currentScreenId') &&
59
+ content.includes('Screen configuration not found for ID:'));
60
+ }
61
+ async function readRouteLedger(projectPath) {
62
+ const ledgerPath = resolveProjectFile(projectPath, ROUTE_LEDGER_REL_PATH);
63
+ try {
64
+ const raw = await fs.readFile(ledgerPath, 'utf8');
65
+ const parsed = JSON.parse(raw);
66
+ if (parsed.schemaVersion !== 1 || !Array.isArray(parsed.files)) {
67
+ return null;
68
+ }
69
+ return {
70
+ schemaVersion: 1,
71
+ generatedAt: typeof parsed.generatedAt === 'string' ? parsed.generatedAt : '',
72
+ files: parsed.files.filter((file) => typeof file === 'string'),
73
+ };
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ async function writeRouteLedger(projectPath, ledger) {
80
+ const ledgerPath = resolveProjectFile(projectPath, ROUTE_LEDGER_REL_PATH);
81
+ await fs.mkdir(path.dirname(ledgerPath), { recursive: true });
82
+ await fs.writeFile(ledgerPath, JSON.stringify(ledger, null, 2), 'utf8');
83
+ }
84
+ async function removeFiles(projectPath, files) {
85
+ for (const relPath of files) {
86
+ const absPath = resolveProjectFile(projectPath, relPath);
87
+ try {
88
+ await fs.rm(absPath, { force: true });
89
+ }
90
+ catch {
91
+ // Best-effort cleanup of stale generated route files.
92
+ }
93
+ }
94
+ }
95
+ function resolveProjectFile(projectPath, relPath) {
96
+ const root = path.resolve(projectPath);
97
+ const absPath = path.resolve(root, relPath);
98
+ const relative = path.relative(root, absPath);
99
+ const isInsideProject = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
100
+ if (!isInsideProject) {
101
+ throw new Error(`Invalid route path outside project root: ${relPath}`);
102
+ }
103
+ return absPath;
104
+ }
105
+ function normalizeRel(filePath) {
106
+ return filePath.replace(/\\/g, '/');
107
+ }
108
+ async function exists(absPath) {
109
+ try {
110
+ await fs.access(absPath);
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ //# sourceMappingURL=generatedRouteCleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatedRouteCleanup.js","sourceRoot":"","sources":["../../../src/host/orchestrator/generatedRouteCleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { AppManifest } from '@ankhorage/contracts';
2
+ import { generateInfrastructure } from '@ankhorage/infra';
3
+ type InfrastructureGenerator = typeof generateInfrastructure;
4
+ export interface InfraSyncResult {
5
+ generated: number;
6
+ removed: number;
7
+ warnings: string[];
8
+ skipped?: {
9
+ reason: string;
10
+ };
11
+ }
12
+ export interface InfraStatusResult {
13
+ target: string | null;
14
+ hasDeployment: boolean;
15
+ hasLedger: boolean;
16
+ trackedFiles: number;
17
+ generatedAt: string | null;
18
+ warnings: string[];
19
+ skipped?: {
20
+ reason: string;
21
+ };
22
+ }
23
+ export declare function syncProjectInfrastructure(args: {
24
+ projectId: string;
25
+ projectPath: string;
26
+ manifest: AppManifest;
27
+ generateInfrastructureImpl?: InfrastructureGenerator;
28
+ }): Promise<InfraSyncResult>;
29
+ export declare function getProjectInfrastructureStatus(args: {
30
+ projectId: string;
31
+ projectPath: string;
32
+ manifest: AppManifest;
33
+ }): Promise<InfraStatusResult>;
34
+ export {};
35
+ //# sourceMappingURL=infraGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infraGenerator.d.ts","sourceRoot":"","sources":["../../../src/host/orchestrator/infraGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAQ1D,KAAK,uBAAuB,GAAG,OAAO,sBAAsB,CAAC;AAU7D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,0BAA0B,CAAC,EAAE,uBAAuB,CAAC;CACtD,GAAG,OAAO,CAAC,eAAe,CAAC,CAyD3B;AAED,wBAAsB,8BAA8B,CAAC,IAAI,EAAE;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4B7B"}
@@ -0,0 +1,135 @@
1
+ import { generateInfrastructure } from '@ankhorage/infra';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import { validateInfraSupport } from './infraValidation';
5
+ const INFRA_LEDGER_REL_PATH = '.ankh/infra-ledger.json';
6
+ const STUDIO_PROJECT_ID = 'studio';
7
+ export async function syncProjectInfrastructure(args) {
8
+ const { projectId, projectPath, manifest, generateInfrastructureImpl } = args;
9
+ const supportWarnings = validateInfraSupport(manifest.infra);
10
+ if (projectId === STUDIO_PROJECT_ID) {
11
+ return {
12
+ generated: 0,
13
+ removed: 0,
14
+ warnings: supportWarnings,
15
+ skipped: {
16
+ reason: 'apps/studio is the dashboard and is not a generated app target.',
17
+ },
18
+ };
19
+ }
20
+ const previousLedger = await readInfraLedger(projectPath);
21
+ const previousFiles = new Set(previousLedger?.files ?? []);
22
+ if (!manifest.infra.deployment) {
23
+ const removed = await removeFiles(projectPath, previousFiles);
24
+ await removeInfraLedger(projectPath);
25
+ return { generated: 0, removed, warnings: supportWarnings };
26
+ }
27
+ const generated = (generateInfrastructureImpl ?? generateInfrastructure)(manifest.infra, {
28
+ namespaceHint: projectId,
29
+ appManifest: manifest,
30
+ });
31
+ const combinedWarnings = unique([...supportWarnings, ...generated.warnings]);
32
+ const nextFiles = new Set();
33
+ for (const file of generated.files) {
34
+ const absPath = resolveProjectFile(projectPath, file.path);
35
+ await fs.mkdir(path.dirname(absPath), { recursive: true });
36
+ await fs.writeFile(absPath, file.content, 'utf8');
37
+ if (file.executable) {
38
+ await fs.chmod(absPath, 0o755);
39
+ }
40
+ nextFiles.add(file.path);
41
+ }
42
+ const staleFiles = new Set([...previousFiles].filter((f) => !nextFiles.has(f)));
43
+ const removed = await removeFiles(projectPath, staleFiles);
44
+ await writeInfraLedger(projectPath, {
45
+ schemaVersion: 1,
46
+ generatedAt: new Date().toISOString(),
47
+ target: generated.meta.target,
48
+ files: [...nextFiles].sort(),
49
+ warnings: combinedWarnings,
50
+ });
51
+ return {
52
+ generated: generated.files.length,
53
+ removed,
54
+ warnings: combinedWarnings,
55
+ };
56
+ }
57
+ export async function getProjectInfrastructureStatus(args) {
58
+ const { projectId, projectPath, manifest } = args;
59
+ const supportWarnings = validateInfraSupport(manifest.infra);
60
+ if (projectId === STUDIO_PROJECT_ID) {
61
+ return {
62
+ target: null,
63
+ hasDeployment: false,
64
+ hasLedger: false,
65
+ trackedFiles: 0,
66
+ generatedAt: null,
67
+ warnings: supportWarnings,
68
+ skipped: {
69
+ reason: 'apps/studio is the dashboard and is not a generated app target.',
70
+ },
71
+ };
72
+ }
73
+ const ledger = await readInfraLedger(projectPath);
74
+ return {
75
+ target: manifest.infra.deployment?.target ?? ledger?.target ?? null,
76
+ hasDeployment: manifest.infra.deployment !== undefined,
77
+ hasLedger: ledger !== null,
78
+ trackedFiles: ledger?.files.length ?? 0,
79
+ generatedAt: ledger?.generatedAt ?? null,
80
+ warnings: unique([...supportWarnings, ...(ledger?.warnings ?? [])]),
81
+ };
82
+ }
83
+ function resolveProjectFile(projectPath, filePath) {
84
+ const root = path.resolve(projectPath);
85
+ const resolved = path.resolve(root, filePath);
86
+ const relative = path.relative(root, resolved);
87
+ if (relative.startsWith('..') || path.isAbsolute(relative)) {
88
+ throw new Error(`Invalid infra output path outside project root: ${filePath}`);
89
+ }
90
+ return resolved;
91
+ }
92
+ async function readInfraLedger(projectPath) {
93
+ const ledgerPath = path.join(projectPath, INFRA_LEDGER_REL_PATH);
94
+ try {
95
+ const raw = await fs.readFile(ledgerPath, 'utf8');
96
+ const parsed = JSON.parse(raw);
97
+ if (!isInfraLedger(parsed)) {
98
+ return null;
99
+ }
100
+ return parsed;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ async function writeInfraLedger(projectPath, ledger) {
107
+ const ledgerPath = path.join(projectPath, INFRA_LEDGER_REL_PATH);
108
+ await fs.mkdir(path.dirname(ledgerPath), { recursive: true });
109
+ await fs.writeFile(ledgerPath, `${JSON.stringify(ledger, null, 2)}\n`, 'utf8');
110
+ }
111
+ async function removeInfraLedger(projectPath) {
112
+ await fs.rm(path.join(projectPath, INFRA_LEDGER_REL_PATH), { force: true });
113
+ }
114
+ async function removeFiles(projectPath, files) {
115
+ let removed = 0;
116
+ for (const file of files) {
117
+ await fs.rm(resolveProjectFile(projectPath, file), { force: true });
118
+ removed += 1;
119
+ }
120
+ return removed;
121
+ }
122
+ function isInfraLedger(value) {
123
+ return (typeof value === 'object' &&
124
+ value !== null &&
125
+ !Array.isArray(value) &&
126
+ value.schemaVersion === 1 &&
127
+ typeof value.generatedAt === 'string' &&
128
+ typeof value.target === 'string' &&
129
+ Array.isArray(value.files) &&
130
+ Array.isArray(value.warnings));
131
+ }
132
+ function unique(values) {
133
+ return [...new Set(values)];
134
+ }
135
+ //# sourceMappingURL=infraGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infraGenerator.js","sourceRoot":"","sources":["../../../src/host/orchestrator/infraGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAgCnC,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAK/C;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAAC;IAC9E,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE7D,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO;YACL,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,iEAAiE;aAC1E;SACF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAE3D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC9D,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,0BAA0B,IAAI,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE;QACvF,aAAa,EAAE,SAAS;QACxB,WAAW,EAAE,QAAQ;KACtB,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAE3D,MAAM,gBAAgB,CAAC,WAAW,EAAE;QAClC,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM;QAC7B,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE;QAC5B,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;QACjC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAIpD;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAClD,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE7D,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,KAAK;YACpB,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,iEAAiE;aAC1E;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,IAAI,IAAI;QACnE,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;QACtD,SAAS,EAAE,MAAM,KAAK,IAAI;QAC1B,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;QACvC,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,IAAI;QACxC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,QAAgB;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAmB;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,KAA0B;IACxE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAA8B,CAAC,aAAa,KAAK,CAAC;QACnD,OAAQ,KAA8B,CAAC,WAAW,KAAK,QAAQ;QAC/D,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ;QAC1D,KAAK,CAAC,OAAO,CAAE,KAA8B,CAAC,KAAK,CAAC;QACpD,KAAK,CAAC,OAAO,CAAE,KAA8B,CAAC,QAAQ,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,MAAyB;IACvC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,38 @@
1
+ export type InfraLifecycleScript = 'up' | 'down' | 'status' | 'port-forward';
2
+ export interface InfraScriptOutput {
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ export declare class InfraScriptExecutionError extends Error {
7
+ readonly stdout: string;
8
+ readonly stderr: string;
9
+ readonly exitCode: number | null;
10
+ constructor(args: {
11
+ message: string;
12
+ stdout: string;
13
+ stderr: string;
14
+ exitCode: number | null;
15
+ });
16
+ }
17
+ export declare function runProjectInfraScript(args: {
18
+ rootPath: string;
19
+ projectId: string;
20
+ target: string;
21
+ script: InfraLifecycleScript;
22
+ }): Promise<void>;
23
+ export declare function runProjectInfraScriptCapture(args: {
24
+ rootPath: string;
25
+ projectId: string;
26
+ target: string;
27
+ script: InfraLifecycleScript;
28
+ }): Promise<InfraScriptOutput>;
29
+ export declare function ensureProjectInfraPortForward(args: {
30
+ rootPath: string;
31
+ projectId: string;
32
+ target: string;
33
+ }): Promise<{
34
+ url: string;
35
+ started: boolean;
36
+ }>;
37
+ export declare function stopAllProjectInfraPortForwards(): Promise<void>;
38
+ //# sourceMappingURL=infraRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infraRuntime.d.ts","sourceRoot":"","sources":["../../../src/host/orchestrator/infraRuntime.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAO/F;AAcD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B,iBAUA;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B,8BAUA;AAED,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA4C7C;AAED,wBAAsB,+BAA+B,kBAgBpD"}
@@ -0,0 +1,227 @@
1
+ import { spawn } from 'child_process';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import { getProjectPath } from './projectPaths';
5
+ const PORT_FORWARD_STARTUP_TIMEOUT_MS = 1_000;
6
+ const portForwardSessions = new Map();
7
+ export class InfraScriptExecutionError extends Error {
8
+ stdout;
9
+ stderr;
10
+ exitCode;
11
+ constructor(args) {
12
+ super(args.message);
13
+ this.name = 'InfraScriptExecutionError';
14
+ this.stdout = args.stdout;
15
+ this.stderr = args.stderr;
16
+ this.exitCode = args.exitCode;
17
+ }
18
+ }
19
+ function resolveProjectInfraScriptPath(args) {
20
+ const { rootPath, projectId, target, script } = args;
21
+ const projectPath = getProjectPath(rootPath, projectId);
22
+ return path.join(projectPath, getInfraScriptsDir(target), `${script}.sh`);
23
+ }
24
+ export async function runProjectInfraScript(args) {
25
+ const scriptPath = resolveProjectInfraScriptPath(args);
26
+ if (!(await exists(scriptPath))) {
27
+ throw new Error(`Infra script not found: ${scriptPath}. Run 'ankh infra:regenerate ${args.projectId}' first.`);
28
+ }
29
+ await runShellScript(scriptPath, 'inherit');
30
+ }
31
+ export async function runProjectInfraScriptCapture(args) {
32
+ const scriptPath = resolveProjectInfraScriptPath(args);
33
+ if (!(await exists(scriptPath))) {
34
+ throw new Error(`Infra script not found: ${scriptPath}. Run 'ankh infra:regenerate ${args.projectId}' first.`);
35
+ }
36
+ return runShellScript(scriptPath, 'capture');
37
+ }
38
+ export async function ensureProjectInfraPortForward(args) {
39
+ const scriptPath = resolveProjectInfraScriptPath({ ...args, script: 'port-forward' });
40
+ if (!(await exists(scriptPath))) {
41
+ throw new Error(`Infra script not found: ${scriptPath}. Run 'ankh infra:regenerate ${args.projectId}' first.`);
42
+ }
43
+ const sessionKey = `${args.rootPath}:${args.projectId}:${args.target}`;
44
+ const existing = portForwardSessions.get(sessionKey);
45
+ if (existing?.child.exitCode === null && !existing.child.killed) {
46
+ return {
47
+ url: existing.url,
48
+ started: false,
49
+ };
50
+ }
51
+ portForwardSessions.delete(sessionKey);
52
+ const localPort = await resolveProjectPortForwardLocalPort(args);
53
+ const url = `http://127.0.0.1:${localPort}`;
54
+ const child = spawn('bash', [scriptPath], {
55
+ cwd: path.dirname(scriptPath),
56
+ stdio: ['ignore', 'pipe', 'pipe'],
57
+ env: process.env,
58
+ });
59
+ const session = { child, url };
60
+ portForwardSessions.set(sessionKey, session);
61
+ child.once('close', () => {
62
+ portForwardSessions.delete(sessionKey);
63
+ });
64
+ child.once('error', () => {
65
+ portForwardSessions.delete(sessionKey);
66
+ });
67
+ await waitForPortForwardStartup({ child, scriptPath });
68
+ return {
69
+ url,
70
+ started: true,
71
+ };
72
+ }
73
+ export async function stopAllProjectInfraPortForwards() {
74
+ const sessions = [...portForwardSessions.values()];
75
+ portForwardSessions.clear();
76
+ await Promise.all(sessions.map(async ({ child }) => {
77
+ if (child.exitCode !== null || child.killed)
78
+ return;
79
+ await new Promise((resolve) => {
80
+ const timer = setTimeout(resolve, 1_000);
81
+ child.once('close', () => {
82
+ clearTimeout(timer);
83
+ resolve();
84
+ });
85
+ child.kill('SIGTERM');
86
+ });
87
+ }));
88
+ }
89
+ function getInfraScriptsDir(target) {
90
+ switch (target) {
91
+ case 'minikube':
92
+ return 'infra/minikube/scripts';
93
+ default:
94
+ throw new Error(`Unsupported deployment target for infra scripts: ${target}`);
95
+ }
96
+ }
97
+ async function resolveProjectPortForwardLocalPort(args) {
98
+ const projectPath = getProjectPath(args.rootPath, args.projectId);
99
+ const infraRoot = path.join(projectPath, 'infra', args.target);
100
+ const envPath = path.join(infraRoot, '.env');
101
+ const fallbackEnvPath = path.join(infraRoot, '.env.example');
102
+ const envMap = await readSimpleEnvMap((await exists(envPath)) ? envPath : fallbackEnvPath);
103
+ const localPortRaw = envMap.get('APP_PORT_FORWARD_LOCAL_PORT');
104
+ const parsedPort = parsePositivePort(localPortRaw);
105
+ return parsedPort ?? 18080;
106
+ }
107
+ async function readSimpleEnvMap(filePath) {
108
+ const out = new Map();
109
+ if (!(await exists(filePath)))
110
+ return out;
111
+ const content = await fs.readFile(filePath, 'utf8');
112
+ const lines = content.split(/\r?\n/u);
113
+ for (const line of lines) {
114
+ const trimmed = line.trim();
115
+ if (!trimmed || trimmed.startsWith('#'))
116
+ continue;
117
+ const idx = trimmed.indexOf('=');
118
+ if (idx <= 0)
119
+ continue;
120
+ const key = trimmed.slice(0, idx).trim();
121
+ const value = trimmed
122
+ .slice(idx + 1)
123
+ .trim()
124
+ .replace(/^['"]|['"]$/g, '');
125
+ out.set(key, value);
126
+ }
127
+ return out;
128
+ }
129
+ function parsePositivePort(value) {
130
+ if (!value)
131
+ return null;
132
+ const parsed = Number.parseInt(value, 10);
133
+ if (!Number.isInteger(parsed))
134
+ return null;
135
+ if (parsed < 1 || parsed > 65535)
136
+ return null;
137
+ return parsed;
138
+ }
139
+ function waitForPortForwardStartup(args) {
140
+ const { child, scriptPath } = args;
141
+ return new Promise((resolve, reject) => {
142
+ let settled = false;
143
+ let stderr = '';
144
+ child.stderr?.setEncoding('utf8');
145
+ child.stderr?.on('data', (chunk) => {
146
+ stderr += chunk;
147
+ if (stderr.length > 8_000) {
148
+ stderr = stderr.slice(stderr.length - 8_000);
149
+ }
150
+ });
151
+ const completeResolve = () => {
152
+ if (settled)
153
+ return;
154
+ settled = true;
155
+ clearTimeout(timer);
156
+ resolve();
157
+ };
158
+ const completeReject = (error) => {
159
+ if (settled)
160
+ return;
161
+ settled = true;
162
+ clearTimeout(timer);
163
+ reject(error);
164
+ };
165
+ const timer = setTimeout(() => {
166
+ completeResolve();
167
+ }, PORT_FORWARD_STARTUP_TIMEOUT_MS);
168
+ child.once('error', (err) => {
169
+ completeReject(new Error(`Failed to start infra script '${scriptPath}': ${err.message}`));
170
+ });
171
+ child.once('close', (code) => {
172
+ if (code === 0) {
173
+ completeResolve();
174
+ return;
175
+ }
176
+ const stderrSnippet = stderr.trim();
177
+ const suffix = stderrSnippet ? ` stderr: ${stderrSnippet}` : '';
178
+ completeReject(new Error(`Infra script '${scriptPath}' exited with code ${code ?? 'unknown'}.${suffix}`));
179
+ });
180
+ });
181
+ }
182
+ function runShellScript(scriptPath, mode) {
183
+ return new Promise((resolve, reject) => {
184
+ const child = spawn('bash', [scriptPath], {
185
+ cwd: path.dirname(scriptPath),
186
+ stdio: mode === 'inherit' ? 'inherit' : 'pipe',
187
+ env: process.env,
188
+ });
189
+ let stdout = '';
190
+ let stderr = '';
191
+ if (mode === 'capture') {
192
+ child.stdout?.setEncoding('utf8');
193
+ child.stderr?.setEncoding('utf8');
194
+ child.stdout?.on('data', (chunk) => {
195
+ stdout += chunk;
196
+ });
197
+ child.stderr?.on('data', (chunk) => {
198
+ stderr += chunk;
199
+ });
200
+ }
201
+ child.once('error', (err) => {
202
+ reject(new Error(`Failed to start infra script '${scriptPath}': ${err.message}`));
203
+ });
204
+ child.once('close', (code) => {
205
+ if (code === 0) {
206
+ resolve({ stdout, stderr });
207
+ return;
208
+ }
209
+ reject(new InfraScriptExecutionError({
210
+ message: `Infra script '${scriptPath}' exited with code ${code ?? 'unknown'}.`,
211
+ stdout,
212
+ stderr,
213
+ exitCode: code,
214
+ }));
215
+ });
216
+ });
217
+ }
218
+ async function exists(p) {
219
+ try {
220
+ await fs.access(p);
221
+ return true;
222
+ }
223
+ catch {
224
+ return false;
225
+ }
226
+ }
227
+ //# sourceMappingURL=infraRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infraRuntime.js","sourceRoot":"","sources":["../../../src/host/orchestrator/infraRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type InfraManifest } from '@ankhorage/contracts';
2
+ export declare function validateInfraSupport(manifest: InfraManifest): string[];
3
+ //# sourceMappingURL=infraValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infraValidation.d.ts","sourceRoot":"","sources":["../../../src/host/orchestrator/infraValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,EAAE,CA2DtE"}