@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,31 @@
1
+ export type DurabilityPhase = "prepare" | "apply" | "metadata" | "recovery" | "bootstrap";
2
+ export type DurabilityOperation = "write" | "file-sync" | "rename" | "directory-sync";
3
+ export type DurabilityPathCategory = "journal" | "preimage" | "target" | "lock" | "evidence" | "directory";
4
+ export type DurabilityResult = "succeeded" | "failed";
5
+ export type DurabilityTraceEvent = Readonly<{
6
+ schemaVersion: 1;
7
+ eventId: string;
8
+ phase: DurabilityPhase;
9
+ operation: DurabilityOperation;
10
+ pathCategory: DurabilityPathCategory;
11
+ bytes: number;
12
+ barrierId: string;
13
+ startedMonotonicNs: string;
14
+ completedMonotonicNs: string;
15
+ result: DurabilityResult;
16
+ errorCategory?: string;
17
+ }>;
18
+ export type DurabilityTraceSink = (event: DurabilityTraceEvent) => void | Promise<void>;
19
+ export type DurabilityTraceContext = Readonly<{
20
+ phase: DurabilityPhase;
21
+ pathCategory: DurabilityPathCategory;
22
+ barrierId: string;
23
+ sink?: DurabilityTraceSink;
24
+ }>;
25
+ export declare function traceDurabilityOperation<T>(input: {
26
+ context: DurabilityTraceContext | undefined;
27
+ operation: DurabilityOperation;
28
+ bytes?: number;
29
+ run: () => Promise<T>;
30
+ }): Promise<T>;
31
+ //# sourceMappingURL=durability-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durability-trace.d.ts","sourceRoot":"","sources":["../src/durability-trace.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAC1F,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AACtF,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,UAAU,GACV,QAAQ,GACR,MAAM,GACN,UAAU,GACV,WAAW,CAAC;AAChB,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,YAAY,EAAE,sBAAsB,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAExF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,sBAAsB,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B,CAAC,CAAC;AAOH,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,KAAK,EAAE;IACvD,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC5C,SAAS,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;CACvB,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBb"}
@@ -0,0 +1,45 @@
1
+ import { canonicalize, sha256Digest } from "./integrity.js";
2
+ function safeErrorCategory(error) {
3
+ const code = error?.code;
4
+ return typeof code === "string" && /^[A-Z0-9_]+$/.test(code) ? code : "UNKNOWN";
5
+ }
6
+ export async function traceDurabilityOperation(input) {
7
+ const started = process.hrtime.bigint();
8
+ try {
9
+ const result = await input.run();
10
+ await emit(input.context, input.operation, input.bytes ?? 0, started, "succeeded");
11
+ return result;
12
+ }
13
+ catch (error) {
14
+ await emit(input.context, input.operation, input.bytes ?? 0, started, "failed", safeErrorCategory(error));
15
+ throw error;
16
+ }
17
+ }
18
+ async function emit(context, operation, bytes, started, result, errorCategory) {
19
+ if (context?.sink === undefined)
20
+ return;
21
+ const completed = process.hrtime.bigint();
22
+ const content = {
23
+ schemaVersion: 1,
24
+ phase: context.phase,
25
+ operation,
26
+ pathCategory: context.pathCategory,
27
+ bytes,
28
+ barrierId: context.barrierId,
29
+ startedMonotonicNs: started.toString(),
30
+ completedMonotonicNs: completed.toString(),
31
+ result,
32
+ ...(errorCategory === undefined ? {} : { errorCategory }),
33
+ };
34
+ const event = Object.freeze({
35
+ ...content,
36
+ eventId: sha256Digest(canonicalize(content)),
37
+ });
38
+ try {
39
+ await context.sink(event);
40
+ }
41
+ catch {
42
+ // Diagnostics must never change transaction durability or recovery semantics.
43
+ }
44
+ }
45
+ //# sourceMappingURL=durability-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durability-trace.js","sourceRoot":"","sources":["../src/durability-trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoC5D,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI,CAAC;IAChE,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAI,KAKjD;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,CACR,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,IAAI,CAAC,EAChB,OAAO,EACP,QAAQ,EACR,iBAAiB,CAAC,KAAK,CAAC,CACzB,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,OAA2C,EAC3C,SAA8B,EAC9B,KAAa,EACb,OAAe,EACf,MAAwB,EACxB,aAAsB;IAEtB,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS;QAAE,OAAO;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAU;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;QACT,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,kBAAkB,EAAE,OAAO,CAAC,QAAQ,EAAE;QACtC,oBAAoB,EAAE,SAAS,CAAC,QAAQ,EAAE;QAC1C,MAAM;QACN,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;KAC1D,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1B,GAAG,OAAO;QACV,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;KAC7C,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ export type EngineeringOperationPlane = "change" | "quality" | "delivery";
2
+ export type EngineeringOperationState = "queued" | "running" | "succeeded" | "failed" | "outcome-unknown" | "cancelled";
3
+ export type EngineeringOperationFact = Readonly<{
4
+ id: string;
5
+ projectId: string;
6
+ projectName: string;
7
+ operation: string;
8
+ state: EngineeringOperationState;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ correlationId?: string;
12
+ summary?: string;
13
+ }>;
14
+ export type EngineeringOperationFilter = Readonly<{
15
+ plane: EngineeringOperationPlane;
16
+ projectId?: string;
17
+ state?: EngineeringOperationState;
18
+ kind?: string;
19
+ from?: string;
20
+ to?: string;
21
+ limit?: number;
22
+ }>;
23
+ export declare function engineeringOperationsProjection(facts: readonly EngineeringOperationFact[], filter: EngineeringOperationFilter): Readonly<{
24
+ schemaVersion: 1;
25
+ plane: EngineeringOperationPlane;
26
+ summary: Readonly<{
27
+ total: number;
28
+ running: number;
29
+ succeeded: number;
30
+ attention: number;
31
+ }>;
32
+ facets: Readonly<{
33
+ projects: readonly {
34
+ id: string;
35
+ name: string;
36
+ }[];
37
+ states: readonly EngineeringOperationState[];
38
+ kinds: readonly string[];
39
+ }>;
40
+ items: readonly Readonly<unknown>[];
41
+ hasMore: boolean;
42
+ }>;
43
+ //# sourceMappingURL=engineering-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering-operations.d.ts","sourceRoot":"","sources":["../src/engineering-operations.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAC1E,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,iBAAiB,GAAG,WAAW,CAAC;AACxH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAC,MAAM,CAAC;IAAC,SAAS,EAAC,MAAM,CAAC;IAAC,WAAW,EAAC,MAAM,CAAC;IAAC,SAAS,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,yBAAyB,CAAC;IAAC,SAAS,EAAC,MAAM,CAAC;IAAC,SAAS,EAAC,MAAM,CAAC;IAAC,aAAa,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAA;CAAE,CAAC,CAAC;AACpO,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAC,yBAAyB,CAAC;IAAC,SAAS,CAAC,EAAC,MAAM,CAAC;IAAC,KAAK,CAAC,EAAC,yBAAyB,CAAC;IAAC,IAAI,CAAC,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,MAAM,CAAC;IAAC,EAAE,CAAC,EAAC,MAAM,CAAC;IAAC,KAAK,CAAC,EAAC,MAAM,CAAA;CAAE,CAAC,CAAC;AASnM,wBAAgB,+BAA+B,CAAC,KAAK,EAAC,SAAS,wBAAwB,EAAE,EAAC,MAAM,EAAC,0BAA0B;;;;;;;;;;;;;;;;;;;GAS1H"}
@@ -0,0 +1,19 @@
1
+ const planeOperations = {
2
+ change: new Set(["plan", "apply", "upgrade", "recover", "baseline-next", "add-package", "add-application", "add-feature"]),
3
+ quality: new Set(["inspect", "verify", "doctor", "maintenance", "test", "build"]),
4
+ delivery: new Set(["package", "delivery-plan", "delivery-apply", "delivery-inspect"]),
5
+ };
6
+ const states = new Set(["queued", "running", "succeeded", "failed", "outcome-unknown", "cancelled"]);
7
+ export function engineeringOperationsProjection(facts, filter) {
8
+ if (!planeOperations[filter.plane] || filter.state && !states.has(filter.state) || filter.limit !== undefined && (!Number.isSafeInteger(filter.limit) || filter.limit < 1 || filter.limit > 200))
9
+ throw new Error("OPERATION_FILTER_INVALID");
10
+ const accepted = planeOperations[filter.plane], from = filter.from ? Date.parse(filter.from) : null, to = filter.to ? Date.parse(filter.to) : null;
11
+ if (from !== null && Number.isNaN(from) || to !== null && Number.isNaN(to) || from !== null && to !== null && from > to)
12
+ throw new Error("OPERATION_FILTER_INVALID");
13
+ const all = facts.filter(item => accepted.has(item.operation));
14
+ const projects = [...new Map(all.map(item => [item.projectId, { id: item.projectId, name: item.projectName }])).values()].sort((a, b) => a.name.localeCompare(b.name));
15
+ const filtered = all.filter(item => (!filter.projectId || item.projectId === filter.projectId) && (!filter.state || item.state === filter.state) && (!filter.kind || item.operation === filter.kind) && (from === null || Date.parse(item.createdAt) >= from) && (to === null || Date.parse(item.createdAt) <= to)).sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
16
+ const summary = { total: filtered.length, running: filtered.filter(item => item.state === "running" || item.state === "queued").length, succeeded: filtered.filter(item => item.state === "succeeded").length, attention: filtered.filter(item => item.state === "failed" || item.state === "outcome-unknown").length };
17
+ return Object.freeze({ schemaVersion: 1, plane: filter.plane, summary: Object.freeze(summary), facets: Object.freeze({ projects: Object.freeze(projects), states: Object.freeze([...states]), kinds: Object.freeze([...accepted]) }), items: Object.freeze(filtered.slice(0, filter.limit ?? 50).map(Object.freeze)), hasMore: filtered.length > (filter.limit ?? 50) });
18
+ }
19
+ //# sourceMappingURL=engineering-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering-operations.js","sourceRoot":"","sources":["../src/engineering-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ import { type ErrorObject } from "ajv/dist/2020.js";
2
+ export type EngineeringTemplateRelease = {
3
+ schemaVersion: 1;
4
+ templateId: string;
5
+ version: string;
6
+ integrity: string;
7
+ title: string;
8
+ summary: string;
9
+ status: "candidate" | "recommended" | "deprecated";
10
+ profile: {
11
+ id: string;
12
+ capability: string;
13
+ };
14
+ parameters: Array<{
15
+ id: string;
16
+ required: boolean;
17
+ description: string;
18
+ }>;
19
+ commands: Partial<Record<"dev" | "build" | "test" | "package", string>>;
20
+ technology: Array<{
21
+ id: string;
22
+ version: string;
23
+ policy: "recommended" | "allowed";
24
+ verifiedAt: string;
25
+ rationale: string;
26
+ alternative: string;
27
+ exit: string;
28
+ }>;
29
+ support: {
30
+ owner: string;
31
+ tier: "production";
32
+ supportedFrom: string;
33
+ supportedUntil: string;
34
+ upgradeCadence: string;
35
+ eolNoticeDays: number;
36
+ };
37
+ integration: {
38
+ prerequisites: string[];
39
+ createCommand: string;
40
+ result: string;
41
+ };
42
+ metrics: string[];
43
+ };
44
+ export declare const engineeringTemplateReleaseSchema: {
45
+ readonly $id: "https://schemas.dyyto.dev/platform/engineering-template-release-v1.json";
46
+ readonly type: "object";
47
+ readonly additionalProperties: false;
48
+ readonly required: readonly ["schemaVersion", "templateId", "version", "integrity", "title", "summary", "status", "profile", "parameters", "commands", "technology", "support", "integration", "metrics"];
49
+ readonly properties: {
50
+ readonly schemaVersion: {
51
+ readonly const: 1;
52
+ };
53
+ readonly templateId: {
54
+ readonly type: "string";
55
+ readonly pattern: "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$";
56
+ };
57
+ readonly version: {
58
+ readonly type: "string";
59
+ readonly minLength: 1;
60
+ readonly maxLength: 128;
61
+ };
62
+ readonly integrity: {
63
+ readonly type: "string";
64
+ readonly pattern: "^sha256:[a-f0-9]{64}$";
65
+ };
66
+ readonly title: {
67
+ readonly type: "string";
68
+ readonly minLength: 1;
69
+ readonly maxLength: 80;
70
+ };
71
+ readonly summary: {
72
+ readonly type: "string";
73
+ readonly minLength: 1;
74
+ readonly maxLength: 240;
75
+ };
76
+ readonly status: {
77
+ readonly enum: readonly ["candidate", "recommended", "deprecated"];
78
+ };
79
+ readonly profile: {
80
+ readonly type: "object";
81
+ readonly additionalProperties: false;
82
+ readonly required: readonly ["id", "capability"];
83
+ readonly properties: {
84
+ readonly id: {
85
+ readonly type: "string";
86
+ readonly pattern: "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$";
87
+ };
88
+ readonly capability: {
89
+ readonly type: "string";
90
+ readonly pattern: `${string}@[0-9]+\\.[0-9]+\\.[0-9]+$`;
91
+ };
92
+ };
93
+ };
94
+ readonly parameters: {
95
+ readonly type: "array";
96
+ readonly minItems: 0;
97
+ readonly maxItems: 32;
98
+ readonly items: {
99
+ readonly type: "object";
100
+ readonly additionalProperties: false;
101
+ readonly required: readonly ["id", "required", "description"];
102
+ readonly properties: {
103
+ readonly id: {
104
+ readonly type: "string";
105
+ readonly pattern: "^[a-z][A-Za-z0-9]*$";
106
+ };
107
+ readonly required: {
108
+ readonly type: "boolean";
109
+ };
110
+ readonly description: {
111
+ readonly type: "string";
112
+ readonly minLength: 1;
113
+ readonly maxLength: 160;
114
+ };
115
+ };
116
+ };
117
+ };
118
+ readonly commands: {
119
+ readonly type: "object";
120
+ readonly minProperties: 1;
121
+ readonly additionalProperties: false;
122
+ readonly properties: {
123
+ readonly dev: {
124
+ readonly type: "string";
125
+ readonly pattern: "^[a-z][a-z0-9.:-]*$";
126
+ };
127
+ readonly build: {
128
+ readonly type: "string";
129
+ readonly pattern: "^[a-z][a-z0-9.:-]*$";
130
+ };
131
+ readonly test: {
132
+ readonly type: "string";
133
+ readonly pattern: "^[a-z][a-z0-9.:-]*$";
134
+ };
135
+ readonly package: {
136
+ readonly type: "string";
137
+ readonly pattern: "^[a-z][a-z0-9.:-]*$";
138
+ };
139
+ };
140
+ };
141
+ readonly technology: {
142
+ readonly type: "array";
143
+ readonly minItems: 1;
144
+ readonly maxItems: 32;
145
+ readonly items: {
146
+ readonly type: "object";
147
+ readonly additionalProperties: false;
148
+ readonly required: readonly ["id", "version", "policy", "verifiedAt", "rationale", "alternative", "exit"];
149
+ readonly properties: {
150
+ readonly id: {
151
+ readonly type: "string";
152
+ readonly pattern: "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$";
153
+ };
154
+ readonly version: {
155
+ readonly type: "string";
156
+ readonly minLength: 1;
157
+ readonly maxLength: 64;
158
+ };
159
+ readonly policy: {
160
+ readonly enum: readonly ["recommended", "allowed"];
161
+ };
162
+ readonly verifiedAt: {
163
+ readonly type: "string";
164
+ readonly format: "date";
165
+ };
166
+ readonly rationale: {
167
+ readonly type: "string";
168
+ readonly minLength: 1;
169
+ readonly maxLength: 240;
170
+ };
171
+ readonly alternative: {
172
+ readonly type: "string";
173
+ readonly minLength: 1;
174
+ readonly maxLength: 160;
175
+ };
176
+ readonly exit: {
177
+ readonly type: "string";
178
+ readonly minLength: 1;
179
+ readonly maxLength: 240;
180
+ };
181
+ };
182
+ };
183
+ };
184
+ readonly support: {
185
+ readonly type: "object";
186
+ readonly additionalProperties: false;
187
+ readonly required: readonly ["owner", "tier", "supportedFrom", "supportedUntil", "upgradeCadence", "eolNoticeDays"];
188
+ readonly properties: {
189
+ readonly owner: {
190
+ readonly type: "string";
191
+ readonly pattern: "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$";
192
+ };
193
+ readonly tier: {
194
+ readonly const: "production";
195
+ };
196
+ readonly supportedFrom: {
197
+ readonly type: "string";
198
+ readonly format: "date";
199
+ };
200
+ readonly supportedUntil: {
201
+ readonly type: "string";
202
+ readonly format: "date";
203
+ };
204
+ readonly upgradeCadence: {
205
+ readonly type: "string";
206
+ readonly minLength: 1;
207
+ readonly maxLength: 80;
208
+ };
209
+ readonly eolNoticeDays: {
210
+ readonly type: "integer";
211
+ readonly minimum: 30;
212
+ readonly maximum: 730;
213
+ };
214
+ };
215
+ };
216
+ readonly integration: {
217
+ readonly type: "object";
218
+ readonly additionalProperties: false;
219
+ readonly required: readonly ["prerequisites", "createCommand", "result"];
220
+ readonly properties: {
221
+ readonly prerequisites: {
222
+ readonly type: "array";
223
+ readonly minItems: 1;
224
+ readonly maxItems: 16;
225
+ readonly items: {
226
+ readonly type: "string";
227
+ readonly minLength: 1;
228
+ readonly maxLength: 200;
229
+ };
230
+ };
231
+ readonly createCommand: {
232
+ readonly type: "string";
233
+ readonly minLength: 1;
234
+ readonly maxLength: 2000;
235
+ };
236
+ readonly result: {
237
+ readonly type: "string";
238
+ readonly minLength: 1;
239
+ readonly maxLength: 400;
240
+ };
241
+ };
242
+ };
243
+ readonly metrics: {
244
+ readonly type: "array";
245
+ readonly minItems: 1;
246
+ readonly uniqueItems: true;
247
+ readonly items: {
248
+ readonly enum: readonly ["time-to-green-build", "time-to-first-business-commit", "manual-engineering-edits", "upgrade-conflicts"];
249
+ };
250
+ };
251
+ };
252
+ };
253
+ export declare class EngineeringTemplateError extends Error {
254
+ readonly code: "TEMPLATE_INVALID" | "TEMPLATE_INTEGRITY_MISMATCH" | "TEMPLATE_SUPPORT_EXPIRED";
255
+ readonly issues: ErrorObject[];
256
+ constructor(code: "TEMPLATE_INVALID" | "TEMPLATE_INTEGRITY_MISMATCH" | "TEMPLATE_SUPPORT_EXPIRED", issues?: ErrorObject[]);
257
+ }
258
+ export declare function calculateEngineeringTemplateIntegrity(value: Omit<EngineeringTemplateRelease, "integrity">): string;
259
+ export declare function parseEngineeringTemplateRelease(value: unknown): EngineeringTemplateRelease;
260
+ export declare function loadEngineeringTemplateRelease(directoryInput: string, now?: Date): Promise<EngineeringTemplateRelease>;
261
+ //# sourceMappingURL=engineering-product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering-product.d.ts","sourceRoot":"","sources":["../src/engineering-product.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI7D,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,EAAE,CAAC,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;IACnD,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChK,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7I,WAAW,EAAE;QAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAenC,CAAC;AAGX,qBAAa,wBAAyB,SAAQ,KAAK;IAAe,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,6BAA6B,GAAG,0BAA0B;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE;gBAArH,IAAI,EAAE,kBAAkB,GAAG,6BAA6B,GAAG,0BAA0B,EAAW,MAAM,GAAE,WAAW,EAAO;CAAoB;AACzN,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,GAAG,MAAM,CAA8C;AACjK,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAM1F;AACD,wBAAsB,8BAA8B,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAOlI"}
@@ -0,0 +1,61 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Ajv2020 } from "ajv/dist/2020.js";
4
+ import { capabilityIdPattern, sha256Pattern } from "./contracts.js";
5
+ import { canonicalize, sha256Digest } from "./integrity.js";
6
+ export const engineeringTemplateReleaseSchema = {
7
+ $id: "https://schemas.dyyto.dev/platform/engineering-template-release-v1.json",
8
+ type: "object", additionalProperties: false,
9
+ required: ["schemaVersion", "templateId", "version", "integrity", "title", "summary", "status", "profile", "parameters", "commands", "technology", "support", "integration", "metrics"],
10
+ properties: {
11
+ schemaVersion: { const: 1 }, templateId: { type: "string", pattern: capabilityIdPattern }, version: { type: "string", minLength: 1, maxLength: 128 }, integrity: { type: "string", pattern: sha256Pattern },
12
+ title: { type: "string", minLength: 1, maxLength: 80 }, summary: { type: "string", minLength: 1, maxLength: 240 }, status: { enum: ["candidate", "recommended", "deprecated"] },
13
+ profile: { type: "object", additionalProperties: false, required: ["id", "capability"], properties: { id: { type: "string", pattern: capabilityIdPattern }, capability: { type: "string", pattern: `${capabilityIdPattern.slice(1, -1)}@[0-9]+\\.[0-9]+\\.[0-9]+$` } } },
14
+ parameters: { type: "array", minItems: 0, maxItems: 32, items: { type: "object", additionalProperties: false, required: ["id", "required", "description"], properties: { id: { type: "string", pattern: "^[a-z][A-Za-z0-9]*$" }, required: { type: "boolean" }, description: { type: "string", minLength: 1, maxLength: 160 } } } },
15
+ commands: { type: "object", minProperties: 1, additionalProperties: false, properties: { dev: { type: "string", pattern: "^[a-z][a-z0-9.:-]*$" }, build: { type: "string", pattern: "^[a-z][a-z0-9.:-]*$" }, test: { type: "string", pattern: "^[a-z][a-z0-9.:-]*$" }, package: { type: "string", pattern: "^[a-z][a-z0-9.:-]*$" } } },
16
+ technology: { type: "array", minItems: 1, maxItems: 32, items: { type: "object", additionalProperties: false, required: ["id", "version", "policy", "verifiedAt", "rationale", "alternative", "exit"], properties: { id: { type: "string", pattern: capabilityIdPattern }, version: { type: "string", minLength: 1, maxLength: 64 }, policy: { enum: ["recommended", "allowed"] }, verifiedAt: { type: "string", format: "date" }, rationale: { type: "string", minLength: 1, maxLength: 240 }, alternative: { type: "string", minLength: 1, maxLength: 160 }, exit: { type: "string", minLength: 1, maxLength: 240 } } } },
17
+ support: { type: "object", additionalProperties: false, required: ["owner", "tier", "supportedFrom", "supportedUntil", "upgradeCadence", "eolNoticeDays"], properties: { owner: { type: "string", pattern: capabilityIdPattern }, tier: { const: "production" }, supportedFrom: { type: "string", format: "date" }, supportedUntil: { type: "string", format: "date" }, upgradeCadence: { type: "string", minLength: 1, maxLength: 80 }, eolNoticeDays: { type: "integer", minimum: 30, maximum: 730 } } },
18
+ integration: { type: "object", additionalProperties: false, required: ["prerequisites", "createCommand", "result"], properties: { prerequisites: { type: "array", minItems: 1, maxItems: 16, items: { type: "string", minLength: 1, maxLength: 200 } }, createCommand: { type: "string", minLength: 1, maxLength: 2000 }, result: { type: "string", minLength: 1, maxLength: 400 } } },
19
+ metrics: { type: "array", minItems: 1, uniqueItems: true, items: { enum: ["time-to-green-build", "time-to-first-business-commit", "manual-engineering-edits", "upgrade-conflicts"] } },
20
+ },
21
+ };
22
+ const validate = new Ajv2020({ allErrors: true, strict: true, formats: { date: /^\d{4}-\d{2}-\d{2}$/ } }).compile(engineeringTemplateReleaseSchema);
23
+ export class EngineeringTemplateError extends Error {
24
+ code;
25
+ issues;
26
+ constructor(code, issues = []) {
27
+ super(code);
28
+ this.code = code;
29
+ this.issues = issues;
30
+ }
31
+ }
32
+ export function calculateEngineeringTemplateIntegrity(value) { return sha256Digest(canonicalize(value)); }
33
+ export function parseEngineeringTemplateRelease(value) {
34
+ if (!validate(value))
35
+ throw new EngineeringTemplateError("TEMPLATE_INVALID", validate.errors ?? []);
36
+ const release = value;
37
+ if (new Set(release.parameters.map((item) => item.id)).size !== release.parameters.length || new Set(release.technology.map((item) => item.id)).size !== release.technology.length)
38
+ throw new EngineeringTemplateError("TEMPLATE_INVALID");
39
+ if (Date.parse(release.support.supportedUntil) <= Date.parse(release.support.supportedFrom))
40
+ throw new EngineeringTemplateError("TEMPLATE_INVALID");
41
+ return release;
42
+ }
43
+ export async function loadEngineeringTemplateRelease(directoryInput, now = new Date()) {
44
+ const directory = await realpath(path.resolve(directoryInput));
45
+ let release;
46
+ try {
47
+ release = parseEngineeringTemplateRelease(JSON.parse(await readFile(path.join(directory, "template.json"), "utf8")));
48
+ }
49
+ catch (error) {
50
+ if (error instanceof EngineeringTemplateError)
51
+ throw error;
52
+ throw new EngineeringTemplateError("TEMPLATE_INVALID");
53
+ }
54
+ const { integrity, ...content } = release;
55
+ if (calculateEngineeringTemplateIntegrity(content) !== integrity)
56
+ throw new EngineeringTemplateError("TEMPLATE_INTEGRITY_MISMATCH");
57
+ if (release.status === "recommended" && Date.parse(release.support.supportedUntil) < now.getTime())
58
+ throw new EngineeringTemplateError("TEMPLATE_SUPPORT_EXPIRED");
59
+ return release;
60
+ }
61
+ //# sourceMappingURL=engineering-product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering-product.js","sourceRoot":"","sources":["../src/engineering-product.ts"],"names":[],"mappings":"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"}