@aipt/platform-kernel 0.1.5

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 (182) hide show
  1. package/README.md +25 -0
  2. package/dist/adoption-contracts.d.ts +140 -0
  3. package/dist/adoption-contracts.d.ts.map +1 -0
  4. package/dist/adoption-contracts.js +2 -0
  5. package/dist/adoption-contracts.js.map +1 -0
  6. package/dist/adoption-metadata.d.ts +72 -0
  7. package/dist/adoption-metadata.d.ts.map +1 -0
  8. package/dist/adoption-metadata.js +408 -0
  9. package/dist/adoption-metadata.js.map +1 -0
  10. package/dist/adoption-schemas.d.ts +1608 -0
  11. package/dist/adoption-schemas.d.ts.map +1 -0
  12. package/dist/adoption-schemas.js +319 -0
  13. package/dist/adoption-schemas.js.map +1 -0
  14. package/dist/application-config-binding.d.ts +54 -0
  15. package/dist/application-config-binding.d.ts.map +1 -0
  16. package/dist/application-config-binding.js +139 -0
  17. package/dist/application-config-binding.js.map +1 -0
  18. package/dist/application-config-contract.d.ts +159 -0
  19. package/dist/application-config-contract.d.ts.map +1 -0
  20. package/dist/application-config-contract.js +142 -0
  21. package/dist/application-config-contract.js.map +1 -0
  22. package/dist/blank-profile.d.ts +60 -0
  23. package/dist/blank-profile.d.ts.map +1 -0
  24. package/dist/blank-profile.js +182 -0
  25. package/dist/blank-profile.js.map +1 -0
  26. package/dist/catalog-source.d.ts +167 -0
  27. package/dist/catalog-source.d.ts.map +1 -0
  28. package/dist/catalog-source.js +252 -0
  29. package/dist/catalog-source.js.map +1 -0
  30. package/dist/code-module-publication.d.ts +113 -0
  31. package/dist/code-module-publication.d.ts.map +1 -0
  32. package/dist/code-module-publication.js +71 -0
  33. package/dist/code-module-publication.js.map +1 -0
  34. package/dist/contracts.d.ts +150 -0
  35. package/dist/contracts.d.ts.map +1 -0
  36. package/dist/contracts.js +3 -0
  37. package/dist/contracts.js.map +1 -0
  38. package/dist/delivery.d.ts +201 -0
  39. package/dist/delivery.d.ts.map +1 -0
  40. package/dist/delivery.js +364 -0
  41. package/dist/delivery.js.map +1 -0
  42. package/dist/dependency-resolution.d.ts +46 -0
  43. package/dist/dependency-resolution.d.ts.map +1 -0
  44. package/dist/dependency-resolution.js +35 -0
  45. package/dist/dependency-resolution.js.map +1 -0
  46. package/dist/doctor.d.ts +50 -0
  47. package/dist/doctor.d.ts.map +1 -0
  48. package/dist/doctor.js +62 -0
  49. package/dist/doctor.js.map +1 -0
  50. package/dist/durability-trace.d.ts +31 -0
  51. package/dist/durability-trace.d.ts.map +1 -0
  52. package/dist/durability-trace.js +45 -0
  53. package/dist/durability-trace.js.map +1 -0
  54. package/dist/engineering-operations.d.ts +43 -0
  55. package/dist/engineering-operations.d.ts.map +1 -0
  56. package/dist/engineering-operations.js +19 -0
  57. package/dist/engineering-operations.js.map +1 -0
  58. package/dist/engineering-product.d.ts +261 -0
  59. package/dist/engineering-product.d.ts.map +1 -0
  60. package/dist/engineering-product.js +61 -0
  61. package/dist/engineering-product.js.map +1 -0
  62. package/dist/example-recipe.d.ts +147 -0
  63. package/dist/example-recipe.d.ts.map +1 -0
  64. package/dist/example-recipe.js +58 -0
  65. package/dist/example-recipe.js.map +1 -0
  66. package/dist/feature-planner.d.ts +59 -0
  67. package/dist/feature-planner.d.ts.map +1 -0
  68. package/dist/feature-planner.js +160 -0
  69. package/dist/feature-planner.js.map +1 -0
  70. package/dist/filesystem-contracts.d.ts +77 -0
  71. package/dist/filesystem-contracts.d.ts.map +1 -0
  72. package/dist/filesystem-contracts.js +2 -0
  73. package/dist/filesystem-contracts.js.map +1 -0
  74. package/dist/filesystem-transaction.d.ts +52 -0
  75. package/dist/filesystem-transaction.d.ts.map +1 -0
  76. package/dist/filesystem-transaction.js +749 -0
  77. package/dist/filesystem-transaction.js.map +1 -0
  78. package/dist/index.d.ts +44 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +42 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/integrity.d.ts +3 -0
  83. package/dist/integrity.d.ts.map +1 -0
  84. package/dist/integrity.js +17 -0
  85. package/dist/integrity.js.map +1 -0
  86. package/dist/local-artifact-registry.d.ts +55 -0
  87. package/dist/local-artifact-registry.d.ts.map +1 -0
  88. package/dist/local-artifact-registry.js +87 -0
  89. package/dist/local-artifact-registry.js.map +1 -0
  90. package/dist/locked-repository-state.d.ts +21 -0
  91. package/dist/locked-repository-state.d.ts.map +1 -0
  92. package/dist/locked-repository-state.js +62 -0
  93. package/dist/locked-repository-state.js.map +1 -0
  94. package/dist/managed-region.d.ts +11 -0
  95. package/dist/managed-region.d.ts.map +1 -0
  96. package/dist/managed-region.js +45 -0
  97. package/dist/managed-region.js.map +1 -0
  98. package/dist/package-adoption.d.ts +179 -0
  99. package/dist/package-adoption.d.ts.map +1 -0
  100. package/dist/package-adoption.js +332 -0
  101. package/dist/package-adoption.js.map +1 -0
  102. package/dist/package-release.d.ts +42 -0
  103. package/dist/package-release.d.ts.map +1 -0
  104. package/dist/package-release.js +85 -0
  105. package/dist/package-release.js.map +1 -0
  106. package/dist/plan-state.d.ts +10 -0
  107. package/dist/plan-state.d.ts.map +1 -0
  108. package/dist/plan-state.js +33 -0
  109. package/dist/plan-state.js.map +1 -0
  110. package/dist/planner.d.ts +19 -0
  111. package/dist/planner.d.ts.map +1 -0
  112. package/dist/planner.js +111 -0
  113. package/dist/planner.js.map +1 -0
  114. package/dist/platform-package-sources.d.ts +49 -0
  115. package/dist/platform-package-sources.d.ts.map +1 -0
  116. package/dist/platform-package-sources.js +98 -0
  117. package/dist/platform-package-sources.js.map +1 -0
  118. package/dist/project-bootstrap.d.ts +42 -0
  119. package/dist/project-bootstrap.d.ts.map +1 -0
  120. package/dist/project-bootstrap.js +270 -0
  121. package/dist/project-bootstrap.js.map +1 -0
  122. package/dist/project-control.d.ts +149 -0
  123. package/dist/project-control.d.ts.map +1 -0
  124. package/dist/project-control.js +46 -0
  125. package/dist/project-control.js.map +1 -0
  126. package/dist/project-maintenance.d.ts +30 -0
  127. package/dist/project-maintenance.d.ts.map +1 -0
  128. package/dist/project-maintenance.js +29 -0
  129. package/dist/project-maintenance.js.map +1 -0
  130. package/dist/project-recovery.d.ts +31 -0
  131. package/dist/project-recovery.d.ts.map +1 -0
  132. package/dist/project-recovery.js +80 -0
  133. package/dist/project-recovery.js.map +1 -0
  134. package/dist/recovery-override.d.ts +20 -0
  135. package/dist/recovery-override.d.ts.map +1 -0
  136. package/dist/recovery-override.js +27 -0
  137. package/dist/recovery-override.js.map +1 -0
  138. package/dist/release-loader.d.ts +9 -0
  139. package/dist/release-loader.d.ts.map +1 -0
  140. package/dist/release-loader.js +86 -0
  141. package/dist/release-loader.js.map +1 -0
  142. package/dist/resolution-evidence.d.ts +67 -0
  143. package/dist/resolution-evidence.d.ts.map +1 -0
  144. package/dist/resolution-evidence.js +98 -0
  145. package/dist/resolution-evidence.js.map +1 -0
  146. package/dist/resolution-worker-build.d.ts +33 -0
  147. package/dist/resolution-worker-build.d.ts.map +1 -0
  148. package/dist/resolution-worker-build.js +42 -0
  149. package/dist/resolution-worker-build.js.map +1 -0
  150. package/dist/runtime-observability.d.ts +147 -0
  151. package/dist/runtime-observability.d.ts.map +1 -0
  152. package/dist/runtime-observability.js +264 -0
  153. package/dist/runtime-observability.js.map +1 -0
  154. package/dist/schemas.d.ts +740 -0
  155. package/dist/schemas.d.ts.map +1 -0
  156. package/dist/schemas.js +348 -0
  157. package/dist/schemas.js.map +1 -0
  158. package/dist/solution-catalog.d.ts +169 -0
  159. package/dist/solution-catalog.d.ts.map +1 -0
  160. package/dist/solution-catalog.js +60 -0
  161. package/dist/solution-catalog.js.map +1 -0
  162. package/dist/standalone-npm-profile.d.ts +146 -0
  163. package/dist/standalone-npm-profile.d.ts.map +1 -0
  164. package/dist/standalone-npm-profile.js +425 -0
  165. package/dist/standalone-npm-profile.js.map +1 -0
  166. package/dist/testing.d.ts +5 -0
  167. package/dist/testing.d.ts.map +1 -0
  168. package/dist/testing.js +3 -0
  169. package/dist/testing.js.map +1 -0
  170. package/dist/upgrade-planner.d.ts +45 -0
  171. package/dist/upgrade-planner.d.ts.map +1 -0
  172. package/dist/upgrade-planner.js +207 -0
  173. package/dist/upgrade-planner.js.map +1 -0
  174. package/dist/workspace-publication.d.ts +18 -0
  175. package/dist/workspace-publication.d.ts.map +1 -0
  176. package/dist/workspace-publication.js +33 -0
  177. package/dist/workspace-publication.js.map +1 -0
  178. package/dist/workspace-topology.d.ts +22 -0
  179. package/dist/workspace-topology.d.ts.map +1 -0
  180. package/dist/workspace-topology.js +117 -0
  181. package/dist/workspace-topology.js.map +1 -0
  182. package/package.json +46 -0
@@ -0,0 +1,159 @@
1
+ import { type ErrorObject } from "ajv/dist/2020.js";
2
+ import type { ProjectManifest } from "./contracts.js";
3
+ export declare const deployableApplicationProfiles: readonly ["workspace-node-application", "workspace-web-application", "nextjs-full-stack-application"];
4
+ export type DeployableApplicationProfile = (typeof deployableApplicationProfiles)[number];
5
+ export type ApplicationConfigBinding = Readonly<{
6
+ name: string;
7
+ kind: "value";
8
+ required: boolean;
9
+ default?: string;
10
+ }> | Readonly<{
11
+ name: string;
12
+ kind: "secret-file" | "certificate-file";
13
+ required: boolean;
14
+ file: string;
15
+ }>;
16
+ export type ApplicationConfigContract = Readonly<{
17
+ $schema: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json";
18
+ schemaVersion: 1;
19
+ kind: "ApplicationConfigContract";
20
+ application: Readonly<{
21
+ id: string;
22
+ profile: DeployableApplicationProfile;
23
+ }>;
24
+ configDirectory: Readonly<{
25
+ rootEnvironmentVariable: "IDP_CONFIG_DIR";
26
+ relativeDirectory: string;
27
+ environmentFile: ".env";
28
+ materializationOwner: "external-deployment-control-plane";
29
+ }>;
30
+ bindings: readonly ApplicationConfigBinding[];
31
+ }>;
32
+ export declare const applicationConfigContractSchema: {
33
+ readonly $id: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json";
34
+ readonly type: "object";
35
+ readonly additionalProperties: false;
36
+ readonly required: readonly ["$schema", "schemaVersion", "kind", "application", "configDirectory", "bindings"];
37
+ readonly properties: {
38
+ readonly $schema: {
39
+ readonly const: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json";
40
+ };
41
+ readonly schemaVersion: {
42
+ readonly const: 1;
43
+ };
44
+ readonly kind: {
45
+ readonly const: "ApplicationConfigContract";
46
+ };
47
+ readonly application: {
48
+ readonly type: "object";
49
+ readonly additionalProperties: false;
50
+ readonly required: readonly ["id", "profile"];
51
+ readonly properties: {
52
+ readonly id: {
53
+ readonly type: "string";
54
+ readonly pattern: "^[a-z0-9][a-z0-9._-]{0,127}$";
55
+ };
56
+ readonly profile: {
57
+ readonly enum: readonly ["workspace-node-application", "workspace-web-application", "nextjs-full-stack-application"];
58
+ };
59
+ };
60
+ };
61
+ readonly configDirectory: {
62
+ readonly type: "object";
63
+ readonly additionalProperties: false;
64
+ readonly required: readonly ["rootEnvironmentVariable", "relativeDirectory", "environmentFile", "materializationOwner"];
65
+ readonly properties: {
66
+ readonly rootEnvironmentVariable: {
67
+ readonly const: "IDP_CONFIG_DIR";
68
+ };
69
+ readonly relativeDirectory: {
70
+ readonly type: "string";
71
+ readonly pattern: "^applications/[a-z0-9][a-z0-9._-]{0,127}$";
72
+ };
73
+ readonly environmentFile: {
74
+ readonly const: ".env";
75
+ };
76
+ readonly materializationOwner: {
77
+ readonly const: "external-deployment-control-plane";
78
+ };
79
+ };
80
+ };
81
+ readonly bindings: {
82
+ readonly type: "array";
83
+ readonly maxItems: 128;
84
+ readonly items: {
85
+ readonly oneOf: readonly [{
86
+ readonly type: "object";
87
+ readonly additionalProperties: false;
88
+ readonly required: readonly ["name", "kind", "required"];
89
+ readonly properties: {
90
+ readonly name: {
91
+ readonly type: "string";
92
+ readonly pattern: "^[A-Z][A-Z0-9_]{0,127}$";
93
+ };
94
+ readonly kind: {
95
+ readonly const: "value";
96
+ };
97
+ readonly required: {
98
+ readonly type: "boolean";
99
+ };
100
+ readonly default: {
101
+ readonly type: "string";
102
+ readonly maxLength: 1024;
103
+ };
104
+ };
105
+ }, {
106
+ readonly type: "object";
107
+ readonly additionalProperties: false;
108
+ readonly required: readonly ["name", "kind", "required", "file"];
109
+ readonly properties: {
110
+ readonly name: {
111
+ readonly type: "string";
112
+ readonly pattern: "^[A-Z][A-Z0-9_]{0,127}$";
113
+ };
114
+ readonly kind: {
115
+ readonly const: "secret-file";
116
+ };
117
+ readonly required: {
118
+ readonly type: "boolean";
119
+ };
120
+ readonly file: {
121
+ readonly type: "string";
122
+ readonly maxLength: 512;
123
+ readonly pattern: "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f]).+$";
124
+ };
125
+ };
126
+ }, {
127
+ readonly type: "object";
128
+ readonly additionalProperties: false;
129
+ readonly required: readonly ["name", "kind", "required", "file"];
130
+ readonly properties: {
131
+ readonly name: {
132
+ readonly type: "string";
133
+ readonly pattern: "^[A-Z][A-Z0-9_]{0,127}$";
134
+ };
135
+ readonly kind: {
136
+ readonly const: "certificate-file";
137
+ };
138
+ readonly required: {
139
+ readonly type: "boolean";
140
+ };
141
+ readonly file: {
142
+ readonly type: "string";
143
+ readonly maxLength: 512;
144
+ readonly pattern: "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f]).+$";
145
+ };
146
+ };
147
+ }];
148
+ };
149
+ };
150
+ };
151
+ };
152
+ export declare class ApplicationConfigContractError extends Error {
153
+ readonly code: "APPLICATION_CONFIG_CONTRACT_INVALID" | "APPLICATION_CONFIG_IDENTITY_MISMATCH" | "APPLICATION_CONFIG_SECRET_LITERAL_FORBIDDEN";
154
+ readonly issues: readonly ErrorObject[];
155
+ constructor(code: "APPLICATION_CONFIG_CONTRACT_INVALID" | "APPLICATION_CONFIG_IDENTITY_MISMATCH" | "APPLICATION_CONFIG_SECRET_LITERAL_FORBIDDEN", message: string, issues?: readonly ErrorObject[]);
156
+ }
157
+ export declare function parseApplicationConfigContract(value: unknown, manifestInput?: unknown): ApplicationConfigContract;
158
+ export declare function renderApplicationConfigContract(manifestInput: ProjectManifest | unknown): Uint8Array;
159
+ //# sourceMappingURL=application-config-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-config-contract.d.ts","sourceRoot":"","sources":["../src/application-config-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,eAAO,MAAM,6BAA6B,uGAIhC,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1F,MAAM,MAAM,wBAAwB,GAChC,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9E,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1G,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,OAAO,EAAE,wEAAwE,CAAC;IAClF,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,2BAA2B,CAAC;IAClC,WAAW,EAAE,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,4BAA4B,CAAA;KAAE,CAAC,CAAC;IAC7E,eAAe,EAAE,QAAQ,CAAC;QACxB,uBAAuB,EAAE,gBAAgB,CAAC;QAC1C,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,oBAAoB,EAAE,mCAAmC,CAAC;KAC3D,CAAC,CAAC;IACH,QAAQ,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC/C,CAAC,CAAC;AAMH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ClC,CAAC;AAMX,qBAAa,8BAA+B,SAAQ,KAAK;IAErD,QAAQ,CAAC,IAAI,EAAE,qCAAqC,GAAG,sCAAsC,GAAG,6CAA6C;IAE7I,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE;gBAF9B,IAAI,EAAE,qCAAqC,GAAG,sCAAsC,GAAG,6CAA6C,EAC7I,OAAO,EAAE,MAAM,EACN,MAAM,GAAE,SAAS,WAAW,EAAO;CAE/C;AAgBD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAoCjH;AAED,wBAAgB,+BAA+B,CAAC,aAAa,EAAE,eAAe,GAAG,OAAO,GAAG,UAAU,CAoBpG"}
@@ -0,0 +1,142 @@
1
+ import { Ajv2020 } from "ajv/dist/2020.js";
2
+ import { parseProjectManifest } from "./schemas.js";
3
+ export const deployableApplicationProfiles = [
4
+ "workspace-node-application",
5
+ "workspace-web-application",
6
+ "nextjs-full-stack-application",
7
+ ];
8
+ const applicationIdPattern = "^[a-z0-9][a-z0-9._-]{0,127}$";
9
+ const environmentNamePattern = "^[A-Z][A-Z0-9_]{0,127}$";
10
+ const safeRelativeFilePattern = "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f]).+$";
11
+ export const applicationConfigContractSchema = {
12
+ $id: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json",
13
+ type: "object",
14
+ additionalProperties: false,
15
+ required: ["$schema", "schemaVersion", "kind", "application", "configDirectory", "bindings"],
16
+ properties: {
17
+ $schema: { const: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json" },
18
+ schemaVersion: { const: 1 },
19
+ kind: { const: "ApplicationConfigContract" },
20
+ application: {
21
+ type: "object", additionalProperties: false, required: ["id", "profile"],
22
+ properties: { id: { type: "string", pattern: applicationIdPattern }, profile: { enum: deployableApplicationProfiles } },
23
+ },
24
+ configDirectory: {
25
+ type: "object", additionalProperties: false,
26
+ required: ["rootEnvironmentVariable", "relativeDirectory", "environmentFile", "materializationOwner"],
27
+ properties: {
28
+ rootEnvironmentVariable: { const: "IDP_CONFIG_DIR" },
29
+ relativeDirectory: { type: "string", pattern: "^applications/[a-z0-9][a-z0-9._-]{0,127}$" },
30
+ environmentFile: { const: ".env" },
31
+ materializationOwner: { const: "external-deployment-control-plane" },
32
+ },
33
+ },
34
+ bindings: {
35
+ type: "array", maxItems: 128,
36
+ items: {
37
+ oneOf: [
38
+ {
39
+ type: "object", additionalProperties: false, required: ["name", "kind", "required"],
40
+ properties: { name: { type: "string", pattern: environmentNamePattern }, kind: { const: "value" }, required: { type: "boolean" }, default: { type: "string", maxLength: 1024 } },
41
+ },
42
+ {
43
+ type: "object", additionalProperties: false, required: ["name", "kind", "required", "file"],
44
+ properties: { name: { type: "string", pattern: environmentNamePattern }, kind: { const: "secret-file" }, required: { type: "boolean" }, file: { type: "string", maxLength: 512, pattern: safeRelativeFilePattern } },
45
+ },
46
+ {
47
+ type: "object", additionalProperties: false, required: ["name", "kind", "required", "file"],
48
+ properties: { name: { type: "string", pattern: environmentNamePattern }, kind: { const: "certificate-file" }, required: { type: "boolean" }, file: { type: "string", maxLength: 512, pattern: safeRelativeFilePattern } },
49
+ },
50
+ ],
51
+ },
52
+ },
53
+ },
54
+ };
55
+ const validate = new Ajv2020({ allErrors: true, strict: true }).compile(applicationConfigContractSchema);
56
+ const sensitiveName = /(?:^|_)(?:PASSWORD|PASSWD|TOKEN|SECRET|PRIVATE_KEY|ACCESS_KEY|API_KEY|DATABASE_URL|CONNECTION_STRING|DSN|AUTHORIZATION|CREDENTIALS?)(?:_|$)/u;
57
+ const privateCertificateMaterialName = /(?:^|_)(?:PRIVATE_KEY|PRIVATE|KEYPAIR|KEYSTORE|PKCS12|P12|PFX|KEY)(?:_|$)/u;
58
+ export class ApplicationConfigContractError extends Error {
59
+ code;
60
+ issues;
61
+ constructor(code, message, issues = []) {
62
+ super(message);
63
+ this.code = code;
64
+ this.issues = issues;
65
+ }
66
+ }
67
+ function applicationIdentity(manifestInput) {
68
+ const manifest = parseProjectManifest(manifestInput);
69
+ const profile = manifest.profile?.id;
70
+ if (!deployableApplicationProfiles.includes(profile)) {
71
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", "环境配置契约只支持可部署 Application Profile。");
72
+ }
73
+ const parameters = manifest.profile?.parameters ?? {};
74
+ const id = parameters.name;
75
+ if (Object.keys(parameters).length !== 1 || typeof id !== "string" || !new RegExp(applicationIdPattern, "u").test(id)) {
76
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", "Application Manifest 必须包含唯一且合法的 name 参数。");
77
+ }
78
+ return { id, profile: profile };
79
+ }
80
+ export function parseApplicationConfigContract(value, manifestInput) {
81
+ if (!validate(value)) {
82
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", "Application ConfigContract 不符合 v1 Schema。", validate.errors ?? []);
83
+ }
84
+ const contract = value;
85
+ if (contract.configDirectory.relativeDirectory !== `applications/${contract.application.id}`) {
86
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", "Config Dir 相对目录必须由 Application identity 唯一确定。");
87
+ }
88
+ const names = new Set();
89
+ const files = new Set();
90
+ for (const binding of contract.bindings) {
91
+ if (names.has(binding.name))
92
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", `环境 Binding 名称重复:${binding.name}`);
93
+ names.add(binding.name);
94
+ if (binding.kind === "value") {
95
+ if (sensitiveName.test(binding.name))
96
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_SECRET_LITERAL_FORBIDDEN", `敏感配置 ${binding.name} 必须使用文件 Binding,禁止在仓库中声明值。`);
97
+ continue;
98
+ }
99
+ if (!binding.name.endsWith("_FILE"))
100
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", `文件 Binding ${binding.name} 必须以 _FILE 结尾。`);
101
+ const requiredDirectory = binding.kind === "secret-file" ? "secrets/" : "certs/";
102
+ if (binding.kind === "certificate-file" && (sensitiveName.test(binding.name) || privateCertificateMaterialName.test(binding.name))) {
103
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", `${binding.name} 包含私密材料语义,必须使用 secret-file 并放入 secrets/;certificate-file 只允许公开证书。`);
104
+ }
105
+ const pathSegments = binding.file.split("/");
106
+ if (!binding.file.startsWith(requiredDirectory) || pathSegments.some((segment) => segment === "" || segment === "." || segment === "..")) {
107
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", `${binding.name} 必须位于 ${requiredDirectory} 下的具体文件。`);
108
+ }
109
+ if (files.has(binding.file))
110
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_CONTRACT_INVALID", `配置文件 Binding 路径重复:${binding.file}`);
111
+ files.add(binding.file);
112
+ }
113
+ if (manifestInput !== undefined) {
114
+ const expected = applicationIdentity(manifestInput);
115
+ if (contract.application.id !== expected.id || contract.application.profile !== expected.profile) {
116
+ throw new ApplicationConfigContractError("APPLICATION_CONFIG_IDENTITY_MISMATCH", "ConfigContract 的应用身份或 Profile 与 Project Manifest 不一致。");
117
+ }
118
+ }
119
+ return contract;
120
+ }
121
+ export function renderApplicationConfigContract(manifestInput) {
122
+ const application = applicationIdentity(manifestInput);
123
+ const bindings = application.profile === "workspace-web-application"
124
+ ? []
125
+ : [{ name: "PORT", kind: "value", required: false, default: "3000" }];
126
+ const contract = {
127
+ $schema: "https://schemas.dyyto.dev/platform/application-config-contract-v1.json",
128
+ schemaVersion: 1,
129
+ kind: "ApplicationConfigContract",
130
+ application,
131
+ configDirectory: {
132
+ rootEnvironmentVariable: "IDP_CONFIG_DIR",
133
+ relativeDirectory: `applications/${application.id}`,
134
+ environmentFile: ".env",
135
+ materializationOwner: "external-deployment-control-plane",
136
+ },
137
+ bindings,
138
+ };
139
+ parseApplicationConfigContract(contract, manifestInput);
140
+ return Buffer.from(`${JSON.stringify(contract, null, 2)}\n`);
141
+ }
142
+ //# sourceMappingURL=application-config-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-config-contract.js","sourceRoot":"","sources":["../src/application-config-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { LoadedCapabilityRelease } from "./adoption-contracts.js";
2
+ import type { ChangePlan, ProjectManifest, PlannedOperation } from "./contracts.js";
3
+ export declare class BlankProfileError extends Error {
4
+ readonly code: "RELEASE_NOT_FOUND" | "CONSUMER_PROFILE_UNSUPPORTED" | "PROJECT_STATE_INVALID";
5
+ readonly assetPath?: string | undefined;
6
+ constructor(code: "RELEASE_NOT_FOUND" | "CONSUMER_PROFILE_UNSUPPORTED" | "PROJECT_STATE_INVALID", message: string, assetPath?: string | undefined);
7
+ }
8
+ export type BlankProjectInspection = {
9
+ state: "planned" | "applied-unverified" | "adopted" | "drifted";
10
+ operations: PlannedOperation[];
11
+ };
12
+ export declare function inspectBlankProject(input: {
13
+ projectRoot: string;
14
+ release: LoadedCapabilityRelease;
15
+ currentLock?: unknown;
16
+ generatedAt: string;
17
+ expiresAt: string;
18
+ }): Promise<BlankProjectInspection>;
19
+ export type BlankAdoptionPlan = {
20
+ manifest: ProjectManifest;
21
+ release: LoadedCapabilityRelease;
22
+ plan: ChangePlan;
23
+ desiredContents: ReadonlyMap<string, Uint8Array>;
24
+ };
25
+ export declare function captureReleaseProjectState(input: {
26
+ projectRoot: string;
27
+ release: LoadedCapabilityRelease["release"];
28
+ }): Promise<{
29
+ assets: Array<{
30
+ path: string;
31
+ digest: string;
32
+ }>;
33
+ projectStateDigest: string;
34
+ }>;
35
+ export declare function captureExpectedProjectState(input: {
36
+ projectRoot: string;
37
+ expectedAssets: Array<{
38
+ path: string;
39
+ digest: string;
40
+ ownership?: "owned-file" | "managed-region" | "seed-file";
41
+ regionId?: string;
42
+ }>;
43
+ }): Promise<{
44
+ assets: Array<{
45
+ path: string;
46
+ digest: string;
47
+ ownership?: "owned-file" | "managed-region" | "seed-file";
48
+ regionId?: string;
49
+ }>;
50
+ projectStateDigest: string;
51
+ }>;
52
+ export declare function planBlankAdoption(input: {
53
+ projectRoot: string;
54
+ manifest: unknown;
55
+ release: LoadedCapabilityRelease;
56
+ currentLock?: unknown;
57
+ generatedAt: string;
58
+ expiresAt: string;
59
+ }): Promise<BlankAdoptionPlan>;
60
+ //# sourceMappingURL=blank-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blank-profile.d.ts","sourceRoot":"","sources":["../src/blank-profile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAEV,UAAU,EAEV,eAAe,EAEf,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAOxB,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,IAAI,EACT,mBAAmB,GACnB,8BAA8B,GAC9B,uBAAuB;IAE3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM;gBALlB,IAAI,EACT,mBAAmB,GACnB,8BAA8B,GAC9B,uBAAuB,EAC3B,OAAO,EAAE,MAAM,EACN,SAAS,CAAC,EAAE,MAAM,YAAA;CAI9B;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,SAAS,GAAG,oBAAoB,GAAG,SAAS,GAAG,SAAS,CAAC;IAChE,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkDlC;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAClD,CAAC;AAsBF,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;CAC7C,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAe3F;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,GAAG,gBAAgB,GAAG,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvI,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,GAAG,gBAAgB,GAAG,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBzK;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiF7B"}
@@ -0,0 +1,182 @@
1
+ import { lstat, readFile, realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { canonicalize, sha256Digest } from "./integrity.js";
4
+ import { readMarkdownManagedRegion } from "./managed-region.js";
5
+ import { buildChangePlan } from "./planner.js";
6
+ import { parseProjectManifest } from "./schemas.js";
7
+ import { parseProjectAdoptionLock } from "./adoption-schemas.js";
8
+ export class BlankProfileError extends Error {
9
+ code;
10
+ assetPath;
11
+ constructor(code, message, assetPath) {
12
+ super(message);
13
+ this.code = code;
14
+ this.assetPath = assetPath;
15
+ }
16
+ }
17
+ export async function inspectBlankProject(input) {
18
+ if (input.currentLock !== undefined) {
19
+ const planned = await planBlankAdoption({
20
+ ...input,
21
+ manifest: {
22
+ schemaVersion: 1,
23
+ capabilities: [
24
+ {
25
+ capabilityId: input.release.release.capabilityId,
26
+ version: input.release.release.version,
27
+ },
28
+ ],
29
+ },
30
+ });
31
+ return {
32
+ state: planned.plan.state === "conflicted" ? "drifted" : "adopted",
33
+ operations: planned.plan.operations,
34
+ };
35
+ }
36
+ const projectRoot = await realpath(path.resolve(input.projectRoot));
37
+ const operations = [];
38
+ let present = 0;
39
+ let exact = 0;
40
+ for (const asset of input.release.release.assets) {
41
+ const observed = await readObservedAsset(projectRoot, asset.path);
42
+ if (observed.exists)
43
+ present += 1;
44
+ if (observed.digest === asset.digest)
45
+ exact += 1;
46
+ operations.push({
47
+ path: asset.path,
48
+ kind: "create",
49
+ ownership: asset.ownership,
50
+ desiredDigest: asset.ownership === "seed-file" && observed.digest ? observed.digest : asset.digest,
51
+ disposition: !observed.exists
52
+ ? "ready"
53
+ : asset.ownership === "seed-file"
54
+ ? "noop"
55
+ : observed.digest === asset.digest
56
+ ? "noop"
57
+ : "conflict",
58
+ ...(observed.exists && observed.digest !== asset.digest
59
+ ? { conflictCode: "UNEXPECTED_EXISTING" }
60
+ : {}),
61
+ });
62
+ }
63
+ if (present === 0)
64
+ return { state: "planned", operations };
65
+ if (exact === input.release.release.assets.length) {
66
+ return { state: "applied-unverified", operations };
67
+ }
68
+ return { state: "drifted", operations };
69
+ }
70
+ async function readObservedAsset(projectRoot, assetPath) {
71
+ const target = path.join(projectRoot, ...assetPath.split("/"));
72
+ try {
73
+ const targetStat = await lstat(target);
74
+ if (!targetStat.isFile() || targetStat.isSymbolicLink()) {
75
+ throw new BlankProfileError("PROJECT_STATE_INVALID", "Blank profile target must be a regular file", assetPath);
76
+ }
77
+ return { path: assetPath, exists: true, digest: sha256Digest(await readFile(target)) };
78
+ }
79
+ catch (error) {
80
+ if (error.code === "ENOENT") {
81
+ return { path: assetPath, exists: false };
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ export async function captureReleaseProjectState(input) {
87
+ const projectRoot = await realpath(path.resolve(input.projectRoot));
88
+ const assets = [];
89
+ for (const asset of input.release.assets) {
90
+ const observed = await readObservedAsset(projectRoot, asset.path);
91
+ if (!observed.exists || observed.digest === undefined) {
92
+ throw new BlankProfileError("PROJECT_STATE_INVALID", "A release asset is missing from the project", asset.path);
93
+ }
94
+ assets.push({ path: asset.path, digest: observed.digest });
95
+ }
96
+ return { assets, projectStateDigest: sha256Digest(canonicalize(assets)) };
97
+ }
98
+ export async function captureExpectedProjectState(input) {
99
+ const projectRoot = await realpath(path.resolve(input.projectRoot));
100
+ const assets = [];
101
+ for (const expected of input.expectedAssets) {
102
+ const observed = await readObservedAsset(projectRoot, expected.path);
103
+ let matches = observed.exists && observed.digest === expected.digest;
104
+ if (expected.ownership === "managed-region" && expected.regionId !== undefined && observed.exists) {
105
+ try {
106
+ matches = sha256Digest(readMarkdownManagedRegion(await readFile(path.join(projectRoot, ...expected.path.split("/")), "utf8"), expected.regionId)) === expected.digest;
107
+ }
108
+ catch {
109
+ matches = false;
110
+ }
111
+ }
112
+ if (!matches) {
113
+ throw new BlankProfileError("PROJECT_STATE_INVALID", "A managed project asset does not match the approved plan", expected.path);
114
+ }
115
+ assets.push({ path: expected.path, digest: expected.digest, ...(expected.ownership === undefined ? {} : { ownership: expected.ownership }), ...(expected.regionId === undefined ? {} : { regionId: expected.regionId }) });
116
+ }
117
+ return { assets, projectStateDigest: sha256Digest(canonicalize(assets)) };
118
+ }
119
+ export async function planBlankAdoption(input) {
120
+ const manifest = parseProjectManifest(input.manifest);
121
+ const selected = manifest.capabilities.filter((capability) => capability.capabilityId === input.release.release.capabilityId &&
122
+ capability.version === input.release.release.version);
123
+ if (selected.length !== 1 || manifest.capabilities.length !== 1) {
124
+ throw new BlankProfileError("RELEASE_NOT_FOUND", "Manifest must select exactly the loaded M3 capability release");
125
+ }
126
+ const currentLock = input.currentLock === undefined ? undefined : parseProjectAdoptionLock(input.currentLock);
127
+ const lockedCapability = currentLock?.capabilities.find((capability) => capability.capabilityId === input.release.release.capabilityId);
128
+ if (lockedCapability !== undefined &&
129
+ (lockedCapability.version !== input.release.release.version ||
130
+ lockedCapability.integrity !== input.release.release.integrity)) {
131
+ throw new BlankProfileError("CONSUMER_PROFILE_UNSUPPORTED", "M3 does not support upgrading a different locked release");
132
+ }
133
+ const projectRoot = await realpath(path.resolve(input.projectRoot));
134
+ const observedAssets = [];
135
+ const changes = [];
136
+ const desiredContents = new Map(input.release.contents);
137
+ for (const asset of input.release.release.assets) {
138
+ const observed = await readObservedAsset(projectRoot, asset.path);
139
+ observedAssets.push(observed);
140
+ if (observed.exists && lockedCapability === undefined && asset.ownership !== "seed-file") {
141
+ throw new BlankProfileError("CONSUMER_PROFILE_UNSUPPORTED", "Blank profile cannot adopt over an existing file without a lock", asset.path);
142
+ }
143
+ const desiredDigest = asset.ownership === "seed-file" && observed.digest ? observed.digest : asset.digest;
144
+ if (asset.ownership === "seed-file" && observed.exists)
145
+ desiredContents.set(asset.path, await readFile(path.join(projectRoot, ...asset.path.split("/"))));
146
+ changes.push({
147
+ path: asset.path,
148
+ kind: "create",
149
+ ownership: asset.ownership,
150
+ desiredDigest,
151
+ });
152
+ }
153
+ const capability = {
154
+ schemaVersion: 1,
155
+ capabilityId: input.release.release.capabilityId,
156
+ version: input.release.release.version,
157
+ integrity: input.release.release.integrity,
158
+ assets: input.release.release.assets.map((asset) => ({
159
+ path: asset.path,
160
+ ownership: asset.ownership,
161
+ desiredDigest: asset.digest,
162
+ })),
163
+ verifiers: input.release.release.verifiers.map((verifier) => ({
164
+ id: verifier.id,
165
+ kind: "command",
166
+ })),
167
+ };
168
+ return {
169
+ manifest,
170
+ release: input.release,
171
+ plan: buildChangePlan({
172
+ action: "adopt",
173
+ capability,
174
+ changes,
175
+ observedAssets,
176
+ generatedAt: input.generatedAt,
177
+ expiresAt: input.expiresAt,
178
+ }),
179
+ desiredContents,
180
+ };
181
+ }
182
+ //# sourceMappingURL=blank-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blank-profile.js","sourceRoot":"","sources":["../src/blank-profile.ts"],"names":[],"mappings":"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"}