@noodleseed/one 0.38.0 → 0.39.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 (175) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/billing-apply-ops.d.ts +2 -0
  5. package/dist/commands/billing-apply-ops.d.ts.map +1 -0
  6. package/dist/commands/billing-apply-ops.js +224 -0
  7. package/dist/commands/billing-apply-ops.js.map +1 -0
  8. package/dist/commands/billing-migration-files.d.ts +13 -0
  9. package/dist/commands/billing-migration-files.d.ts.map +1 -0
  10. package/dist/commands/billing-migration-files.js +84 -0
  11. package/dist/commands/billing-migration-files.js.map +1 -0
  12. package/dist/commands/billing-ops.d.ts +3 -0
  13. package/dist/commands/billing-ops.d.ts.map +1 -0
  14. package/dist/commands/billing-ops.js +121 -0
  15. package/dist/commands/billing-ops.js.map +1 -0
  16. package/dist/commands/catalog-data-resources.d.ts.map +1 -1
  17. package/dist/commands/catalog-data-resources.js +19 -0
  18. package/dist/commands/catalog-data-resources.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/widget-scaffold-template.d.ts.map +1 -1
  23. package/dist/widget-scaffold-template.js +9 -0
  24. package/dist/widget-scaffold-template.js.map +1 -1
  25. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
  26. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  27. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
  28. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +3 -3
  29. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  30. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  31. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  32. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  33. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.d.ts.map +1 -1
  34. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +28 -0
  35. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -1
  36. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -1
  37. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +5 -0
  38. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
  39. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  40. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +44 -0
  41. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts.map +1 -1
  42. package/node_modules/@noodle-borg/authoring/dist/assistant.js.map +1 -1
  43. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -1
  44. package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -1
  45. package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -1
  46. package/node_modules/@noodle-borg/authoring/dist/server.js +6 -1
  47. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  48. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +83 -0
  49. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
  50. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +82 -14
  51. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
  52. package/node_modules/@noodle-borg/module-audit/dist/index.d.ts +2 -1
  53. package/node_modules/@noodle-borg/module-audit/dist/index.d.ts.map +1 -1
  54. package/node_modules/@noodle-borg/module-audit/dist/index.js +1 -1
  55. package/node_modules/@noodle-borg/module-audit/dist/index.js.map +1 -1
  56. package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.d.ts +12 -3
  57. package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.d.ts.map +1 -1
  58. package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.js +30 -20
  59. package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.js.map +1 -1
  60. package/node_modules/@noodle-borg/service/dist/billing/in-memory-serialization.d.ts +6 -0
  61. package/node_modules/@noodle-borg/service/dist/billing/in-memory-serialization.d.ts.map +1 -0
  62. package/node_modules/@noodle-borg/service/dist/billing/in-memory-serialization.js +23 -0
  63. package/node_modules/@noodle-borg/service/dist/billing/in-memory-serialization.js.map +1 -0
  64. package/node_modules/@noodle-borg/service/dist/billing/in-memory.d.ts +32 -0
  65. package/node_modules/@noodle-borg/service/dist/billing/in-memory.d.ts.map +1 -0
  66. package/node_modules/@noodle-borg/service/dist/billing/in-memory.js +185 -0
  67. package/node_modules/@noodle-borg/service/dist/billing/in-memory.js.map +1 -0
  68. package/node_modules/@noodle-borg/service/dist/billing/migration-apply.d.ts +98 -0
  69. package/node_modules/@noodle-borg/service/dist/billing/migration-apply.d.ts.map +1 -0
  70. package/node_modules/@noodle-borg/service/dist/billing/migration-apply.js +194 -0
  71. package/node_modules/@noodle-borg/service/dist/billing/migration-apply.js.map +1 -0
  72. package/node_modules/@noodle-borg/service/dist/billing/migration-contract.d.ts +79 -0
  73. package/node_modules/@noodle-borg/service/dist/billing/migration-contract.d.ts.map +1 -0
  74. package/node_modules/@noodle-borg/service/dist/billing/migration-contract.js +86 -0
  75. package/node_modules/@noodle-borg/service/dist/billing/migration-contract.js.map +1 -0
  76. package/node_modules/@noodle-borg/service/dist/billing/migration.d.ts +13 -0
  77. package/node_modules/@noodle-borg/service/dist/billing/migration.d.ts.map +1 -0
  78. package/node_modules/@noodle-borg/service/dist/billing/migration.js +246 -0
  79. package/node_modules/@noodle-borg/service/dist/billing/migration.js.map +1 -0
  80. package/node_modules/@noodle-borg/service/dist/billing/model.d.ts +85 -0
  81. package/node_modules/@noodle-borg/service/dist/billing/model.d.ts.map +1 -0
  82. package/node_modules/@noodle-borg/service/dist/billing/model.js +134 -0
  83. package/node_modules/@noodle-borg/service/dist/billing/model.js.map +1 -0
  84. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration-support.d.ts +36 -0
  85. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration-support.d.ts.map +1 -0
  86. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration-support.js +122 -0
  87. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration-support.js.map +1 -0
  88. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.d.ts +9 -0
  89. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.d.ts.map +1 -0
  90. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js +265 -0
  91. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js.map +1 -0
  92. package/node_modules/@noodle-borg/service/dist/billing/postgres-records.d.ts +66 -0
  93. package/node_modules/@noodle-borg/service/dist/billing/postgres-records.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/service/dist/billing/postgres-records.js +163 -0
  95. package/node_modules/@noodle-borg/service/dist/billing/postgres-records.js.map +1 -0
  96. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.d.ts +4 -0
  97. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js +211 -0
  99. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js.map +1 -0
  100. package/node_modules/@noodle-borg/service/dist/billing/postgres.d.ts +33 -0
  101. package/node_modules/@noodle-borg/service/dist/billing/postgres.d.ts.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/billing/postgres.js +285 -0
  103. package/node_modules/@noodle-borg/service/dist/billing/postgres.js.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/billing/store.d.ts +27 -0
  105. package/node_modules/@noodle-borg/service/dist/billing/store.d.ts.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/billing/store.js +2 -0
  107. package/node_modules/@noodle-borg/service/dist/billing/store.js.map +1 -0
  108. package/node_modules/@noodle-borg/service/dist/index.d.ts +4 -0
  109. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  110. package/node_modules/@noodle-borg/service/dist/index.js +3 -0
  111. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  112. package/node_modules/@noodle-borg/service/dist/modules/host.js +3 -0
  113. package/node_modules/@noodle-borg/service/dist/modules/host.js.map +1 -1
  114. package/node_modules/@noodle-borg/service/dist/options.d.ts +17 -5
  115. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  116. package/node_modules/@noodle-borg/service/dist/routes/billing.d.ts +23 -0
  117. package/node_modules/@noodle-borg/service/dist/routes/billing.d.ts.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/routes/billing.js +165 -0
  119. package/node_modules/@noodle-borg/service/dist/routes/billing.js.map +1 -0
  120. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts +28 -0
  121. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts.map +1 -0
  122. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js +77 -0
  123. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js.map +1 -0
  124. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  125. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +17 -0
  126. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  127. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  128. package/node_modules/@noodle-borg/service/dist/serve.js +28 -6
  129. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  130. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  131. package/node_modules/@noodle-borg/service/dist/service.js +23 -30
  132. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  133. package/node_modules/@noodle-borg/service/dist/store/audit.d.ts +8 -0
  134. package/node_modules/@noodle-borg/service/dist/store/audit.d.ts.map +1 -1
  135. package/node_modules/@noodle-borg/service/dist/store/audit.js +15 -0
  136. package/node_modules/@noodle-borg/service/dist/store/audit.js.map +1 -1
  137. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts +2 -1
  138. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
  139. package/node_modules/@noodle-borg/service/dist/store/control-plane.js +81 -48
  140. package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
  141. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.d.ts +4 -2
  142. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.d.ts.map +1 -1
  143. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.js.map +1 -1
  144. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts +11 -0
  145. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js +17 -0
  147. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +1 -1
  149. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
  150. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +18 -6
  151. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
  152. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  153. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +4 -0
  154. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  155. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.d.ts +14 -1
  156. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.d.ts.map +1 -1
  157. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js +28 -0
  158. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js.map +1 -1
  159. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +2 -2
  160. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  161. package/node_modules/@noodle-borg/service/dist/store/postgres.js +9 -5
  162. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  163. package/node_modules/@noodle-borg/service/dist/store/validate.d.ts +4 -0
  164. package/node_modules/@noodle-borg/service/dist/store/validate.d.ts.map +1 -1
  165. package/node_modules/@noodle-borg/service/dist/store/validate.js +13 -0
  166. package/node_modules/@noodle-borg/service/dist/store/validate.js.map +1 -1
  167. package/node_modules/@noodle-borg/service/dist/store.d.ts +5 -2
  168. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
  169. package/node_modules/@noodle-borg/service/dist/store.js +1 -1
  170. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
  171. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +3 -2
  172. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts.map +1 -1
  173. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js +3 -2
  174. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js.map +1 -1
  175. package/package.json +1 -1
@@ -32,6 +32,33 @@ export async function ensureAuditSchema(pool) {
32
32
  ON audit_events (org_slug, app_slug, environment, seq DESC)
33
33
  `);
34
34
  }
35
+ /**
36
+ * Insert one canonical, redacted audit row through either a pool or an already-open transaction client.
37
+ * This helper deliberately does not manage a transaction: callers using a `PoolClient` keep the audit
38
+ * evidence in the same commit boundary as the state change it records.
39
+ */
40
+ export async function insertAuditEvent(queryable, input, options = {}) {
41
+ const details = redactDetails(input.details);
42
+ await queryable.query(`INSERT INTO audit_events
43
+ (id, event_type, org_slug, app_slug, environment, deployment_id, actor_subject, actor_email,
44
+ decision, status, reason_code, schema_version, details, created_at)
45
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)`, [
46
+ (options.id ?? randomUUID)(),
47
+ input.eventType,
48
+ input.org,
49
+ input.app ?? null,
50
+ input.env ?? null,
51
+ input.deploymentId ?? null,
52
+ input.actorSubject ?? null,
53
+ input.actorEmail ?? null,
54
+ input.decision ?? null,
55
+ input.status !== undefined ? String(input.status) : null,
56
+ input.reasonCode ?? null,
57
+ AUDIT_SCHEMA_VERSION,
58
+ details !== undefined ? JSON.stringify(details) : null,
59
+ (options.now ?? (() => new Date()))(),
60
+ ]);
61
+ }
35
62
  /**
36
63
  * Relational system of record for {@link AuditEvent}s (parallels {@link InMemoryAuditStore}). The `pg.Pool`
37
64
  * is injected; this class is pure SQL and unit-testable against any local Postgres.
@@ -39,34 +66,17 @@ export async function ensureAuditSchema(pool) {
39
66
  export class PostgresAuditStore {
40
67
  #pool;
41
68
  #now;
69
+ #id;
42
70
  constructor(pool, options = {}) {
43
71
  this.#pool = pool;
44
72
  this.#now = options.now ?? (() => new Date());
73
+ this.#id = options.id ?? randomUUID;
45
74
  }
46
75
  ensureSchema() {
47
76
  return ensureAuditSchema(this.#pool);
48
77
  }
49
78
  async emit(input) {
50
- const details = redactDetails(input.details);
51
- await this.#pool.query(`INSERT INTO audit_events
52
- (id, event_type, org_slug, app_slug, environment, deployment_id, actor_subject, actor_email,
53
- decision, status, reason_code, schema_version, details, created_at)
54
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)`, [
55
- randomUUID(),
56
- input.eventType,
57
- input.org,
58
- input.app ?? null,
59
- input.env ?? null,
60
- input.deploymentId ?? null,
61
- input.actorSubject ?? null,
62
- input.actorEmail ?? null,
63
- input.decision ?? null,
64
- input.status !== undefined ? String(input.status) : null,
65
- input.reasonCode ?? null,
66
- AUDIT_SCHEMA_VERSION,
67
- details !== undefined ? JSON.stringify(details) : null,
68
- this.#now(),
69
- ]);
79
+ await insertAuditEvent(this.#pool, input, { now: this.#now, id: this.#id });
70
80
  }
71
81
  async list(filter) {
72
82
  const org = validateSlug('org', filter.org);
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-audit.js","sourceRoot":"","sources":["../src/postgres-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-audit.js","sourceRoot":"","sources":["../src/postgres-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Small per-key queue used only to give the in-memory adapter database-like bootstrap semantics. */
2
+ export declare class InMemorySerialQueue {
3
+ #private;
4
+ run<T>(key: string, operation: () => T | Promise<T>): Promise<T>;
5
+ }
6
+ //# sourceMappingURL=in-memory-serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-serialization.d.ts","sourceRoot":"","sources":["../../src/billing/in-memory-serialization.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,qBAAa,mBAAmB;;IAGxB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAgBvE"}
@@ -0,0 +1,23 @@
1
+ /** Small per-key queue used only to give the in-memory adapter database-like bootstrap semantics. */
2
+ export class InMemorySerialQueue {
3
+ #tails = new Map();
4
+ async run(key, operation) {
5
+ const previous = this.#tails.get(key) ?? Promise.resolve();
6
+ let release = () => undefined;
7
+ const turn = new Promise((resolve) => {
8
+ release = resolve;
9
+ });
10
+ const tail = previous.then(() => turn);
11
+ this.#tails.set(key, tail);
12
+ await previous;
13
+ try {
14
+ return await operation();
15
+ }
16
+ finally {
17
+ release();
18
+ if (this.#tails.get(key) === tail)
19
+ this.#tails.delete(key);
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=in-memory-serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-serialization.js","sourceRoot":"","sources":["../../src/billing/in-memory-serialization.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,OAAO,mBAAmB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnD,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAA+B;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3D,IAAI,OAAO,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACzC,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import { type BillingAccountMemberRecord, type BillingAccountRecord, type BillingIdentityRef, type EntitlementSnapshotRecord, type OrgBillingLinkRecord, type PlanVersionRecord } from './model.js';
2
+ import type { BillingAccountStore, EnsureDefaultBillingAccountInput, EnsureOrgBillingLinkInput } from './store.js';
3
+ export declare abstract class InMemoryBillingAccountStore implements BillingAccountStore {
4
+ #private;
5
+ protected constructor(options: {
6
+ readonly now?: () => Date;
7
+ readonly orgExists: (org: string) => boolean;
8
+ readonly isOrgOwner: (org: string, subject: string) => boolean;
9
+ });
10
+ /** Commit the in-memory default-account + initial org-link tuple without an async visibility gap. */
11
+ protected ensureDefaultAccountAndOrgLinkAtomic(input: {
12
+ readonly org: string;
13
+ readonly owner: {
14
+ readonly identityIssuer?: string;
15
+ readonly subject: string;
16
+ readonly email: string;
17
+ };
18
+ readonly reason: string;
19
+ }, createdAt: string): void;
20
+ ensureDefaultBillingAccount(input: EnsureDefaultBillingAccountInput): Promise<BillingAccountRecord>;
21
+ getBillingAccount(id: string): Promise<BillingAccountRecord | undefined>;
22
+ getDefaultBillingAccount(identity: BillingIdentityRef): Promise<BillingAccountRecord | undefined>;
23
+ listBillingAccountMembers(id: string): Promise<readonly BillingAccountMemberRecord[]>;
24
+ removeBillingAccountMember(input: BillingIdentityRef & {
25
+ readonly billingAccountId: string;
26
+ }): Promise<boolean>;
27
+ getPlanVersion(id: string): Promise<PlanVersionRecord | undefined>;
28
+ getActiveEntitlementSnapshot(billingAccountId: string): Promise<EntitlementSnapshotRecord | undefined>;
29
+ ensureOrgBillingLink(input: EnsureOrgBillingLinkInput): Promise<OrgBillingLinkRecord>;
30
+ getOrgBillingLink(org: string): Promise<OrgBillingLinkRecord | undefined>;
31
+ }
32
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../src/billing/in-memory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EAIvB,KAAK,yBAAyB,EAK9B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,mBAAmB,EACnB,gCAAgC,EAChC,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,8BAAsB,2BAA4B,YAAW,mBAAmB;;IAW9E,SAAS,aAAa,OAAO,EAAE;QAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;QAC1B,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAC7C,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;KAChE;IAMD,qGAAqG;IACrG,SAAS,CAAC,oCAAoC,CAC5C,KAAK,EAAE;QACL,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,KAAK,EAAE;YACd,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;YACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,EACD,SAAS,EAAE,MAAM,GAChB,IAAI;IAuCD,2BAA2B,CAC/B,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,oBAAoB,CAAC;IA6ChC,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAIxE,wBAAwB,CACtB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAK5C,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,0BAA0B,EAAE,CAAC;IAc/E,0BAA0B,CAC9B,KAAK,EAAE,kBAAkB,GAAG;QAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,GAChE,OAAO,CAAC,OAAO,CAAC;IAoBnB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIlE,4BAA4B,CAC1B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAM3C,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0D3F,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;CAG1E"}
@@ -0,0 +1,185 @@
1
+ import { validateSlug } from '../store/validate.js';
2
+ import { billingIdentityKey, billingMemberKey, createDefaultFreeBillingRecords, FREE_PLAN_VERSION, GOOGLE_CONTROL_PLANE_ISSUER, normalizeBillingEmail, normalizeBillingIdentity, validateBillingAccountId, validateBillingLinkReason, } from './model.js';
3
+ export class InMemoryBillingAccountStore {
4
+ #accounts = new Map();
5
+ #defaults = new Map();
6
+ #members = new Map();
7
+ #snapshots = new Map();
8
+ #activeSnapshots = new Map();
9
+ #orgLinks = new Map();
10
+ #now;
11
+ #orgExists;
12
+ #isOrgOwner;
13
+ constructor(options) {
14
+ this.#now = options.now ?? (() => new Date());
15
+ this.#orgExists = options.orgExists;
16
+ this.#isOrgOwner = options.isOrgOwner;
17
+ }
18
+ /** Commit the in-memory default-account + initial org-link tuple without an async visibility gap. */
19
+ ensureDefaultAccountAndOrgLinkAtomic(input, createdAt) {
20
+ const identity = normalizeBillingIdentity({
21
+ identityIssuer: input.owner.identityIssuer ?? GOOGLE_CONTROL_PLANE_ISSUER,
22
+ subject: input.owner.subject,
23
+ });
24
+ const accounts = new Map(this.#accounts);
25
+ const defaults = new Map(this.#defaults);
26
+ const members = new Map(this.#members);
27
+ const snapshots = new Map(this.#snapshots);
28
+ const activeSnapshots = new Map(this.#activeSnapshots);
29
+ const orgLinks = new Map(this.#orgLinks);
30
+ try {
31
+ const account = this.#ensureDefaultBillingAccount({ ...identity, email: input.owner.email }, () => createdAt);
32
+ this.#ensureOrgBillingLink({
33
+ org: input.org,
34
+ billingAccountId: account.id,
35
+ homeFreeBillingAccountId: account.id,
36
+ homeOwner: identity,
37
+ linkedBy: identity,
38
+ reason: input.reason,
39
+ }, () => createdAt, true);
40
+ }
41
+ catch (error) {
42
+ restoreMap(this.#accounts, accounts);
43
+ restoreMap(this.#defaults, defaults);
44
+ restoreMap(this.#members, members);
45
+ restoreMap(this.#snapshots, snapshots);
46
+ restoreMap(this.#activeSnapshots, activeSnapshots);
47
+ restoreMap(this.#orgLinks, orgLinks);
48
+ throw error;
49
+ }
50
+ }
51
+ async ensureDefaultBillingAccount(input) {
52
+ return this.#ensureDefaultBillingAccount(input, () => this.#now().toISOString());
53
+ }
54
+ #ensureDefaultBillingAccount(input, createdAt) {
55
+ const identity = normalizeBillingIdentity(input);
56
+ const identityKey = billingIdentityKey(identity);
57
+ const existingId = this.#defaults.get(identityKey);
58
+ if (existingId !== undefined) {
59
+ const account = this.#accounts.get(existingId);
60
+ const snapshotId = this.#activeSnapshots.get(existingId);
61
+ const memberKey = billingMemberKey({ billingAccountId: existingId, ...identity });
62
+ const member = this.#members.get(memberKey);
63
+ if (account === undefined ||
64
+ snapshotId === undefined ||
65
+ !this.#snapshots.has(snapshotId) ||
66
+ member?.role !== 'owner') {
67
+ throw new Error('default billing account is incomplete');
68
+ }
69
+ this.#members.set(memberKey, { ...member, email: normalizeBillingEmail(input.email) });
70
+ return account;
71
+ }
72
+ const created = createDefaultFreeBillingRecords({
73
+ identity,
74
+ email: input.email,
75
+ ...(input.displayName !== undefined ? { displayName: input.displayName } : {}),
76
+ createdAt: createdAt(),
77
+ });
78
+ this.#accounts.set(created.account.id, created.account);
79
+ this.#defaults.set(identityKey, created.account.id);
80
+ this.#members.set(billingMemberKey({ billingAccountId: created.account.id, ...identity }), created.member);
81
+ this.#snapshots.set(created.snapshot.id, created.snapshot);
82
+ this.#activeSnapshots.set(created.account.id, created.snapshot.id);
83
+ return created.account;
84
+ }
85
+ getBillingAccount(id) {
86
+ return Promise.resolve(this.#accounts.get(validateBillingAccountId(id)));
87
+ }
88
+ getDefaultBillingAccount(identity) {
89
+ const id = this.#defaults.get(billingIdentityKey(normalizeBillingIdentity(identity)));
90
+ return Promise.resolve(id === undefined ? undefined : this.#accounts.get(id));
91
+ }
92
+ listBillingAccountMembers(id) {
93
+ const billingAccountId = validateBillingAccountId(id);
94
+ return Promise.resolve([...this.#members.values()]
95
+ .filter((member) => member.billingAccountId === billingAccountId)
96
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt) ||
97
+ a.identityIssuer.localeCompare(b.identityIssuer) ||
98
+ a.subject.localeCompare(b.subject)));
99
+ }
100
+ async removeBillingAccountMember(input) {
101
+ const billingAccountId = validateBillingAccountId(input.billingAccountId);
102
+ const identity = normalizeBillingIdentity(input);
103
+ const key = billingMemberKey({ billingAccountId, ...identity });
104
+ const existing = this.#members.get(key);
105
+ if (existing === undefined)
106
+ return false;
107
+ if (existing.role === 'owner') {
108
+ // Keep the owner-count check and delete in the same synchronous turn. Awaiting the public list
109
+ // method here lets two removals observe the same pre-delete owner set.
110
+ const ownerCount = [...this.#members.values()].filter((member) => member.billingAccountId === billingAccountId && member.role === 'owner').length;
111
+ if (ownerCount <= 1)
112
+ throw new Error('cannot remove the last billing owner');
113
+ }
114
+ if (this.#defaults.get(billingIdentityKey(identity)) === billingAccountId) {
115
+ throw new Error('cannot remove the default billing owner without an atomic default transfer');
116
+ }
117
+ return this.#members.delete(key);
118
+ }
119
+ getPlanVersion(id) {
120
+ return Promise.resolve(id === FREE_PLAN_VERSION.id ? FREE_PLAN_VERSION : undefined);
121
+ }
122
+ getActiveEntitlementSnapshot(billingAccountId) {
123
+ const id = validateBillingAccountId(billingAccountId);
124
+ const snapshotId = this.#activeSnapshots.get(id);
125
+ return Promise.resolve(snapshotId === undefined ? undefined : this.#snapshots.get(snapshotId));
126
+ }
127
+ async ensureOrgBillingLink(input) {
128
+ return this.#ensureOrgBillingLink(input, () => this.#now().toISOString());
129
+ }
130
+ #ensureOrgBillingLink(input, linkedAt, pendingOrg = false) {
131
+ const org = validateSlug('org', input.org);
132
+ if (!pendingOrg && !this.#orgExists(org)) {
133
+ throw new Error('organization not found');
134
+ }
135
+ const reason = validateBillingLinkReason(input.reason);
136
+ const accountId = validateBillingAccountId(input.billingAccountId);
137
+ const homeFreeAccountId = validateBillingAccountId(input.homeFreeBillingAccountId);
138
+ if (accountId !== homeFreeAccountId) {
139
+ throw new Error('initial billing-account link must use the organization home Free account');
140
+ }
141
+ if (!this.#accounts.has(accountId))
142
+ throw new Error('billing account not found');
143
+ const homeOwner = normalizeBillingIdentity(input.homeOwner);
144
+ const ownerDefaultId = this.#defaults.get(billingIdentityKey(homeOwner));
145
+ const ownerMember = this.#members.get(billingMemberKey({ billingAccountId: homeFreeAccountId, ...homeOwner }));
146
+ if (ownerDefaultId !== homeFreeAccountId || ownerMember?.role !== 'owner') {
147
+ throw new Error('organization home Free account must be the home owner default account');
148
+ }
149
+ if (!pendingOrg && !this.#isOrgOwner(org, homeOwner.subject)) {
150
+ throw new Error('organization home Free owner must be a current organization owner');
151
+ }
152
+ const linkedBy = normalizeBillingIdentity(input.linkedBy);
153
+ const existing = this.#orgLinks.get(org);
154
+ if (existing !== undefined) {
155
+ if (existing.billingAccountId !== accountId ||
156
+ existing.homeFreeBillingAccountId !== homeFreeAccountId) {
157
+ throw new Error('organization already has an active billing-account link');
158
+ }
159
+ return existing;
160
+ }
161
+ const record = {
162
+ orgSlug: org,
163
+ billingAccountId: accountId,
164
+ homeFreeBillingAccountId: homeFreeAccountId,
165
+ homeOwner,
166
+ fallbackBillingAccountId: homeFreeAccountId,
167
+ version: 1,
168
+ active: true,
169
+ linkedAt: linkedAt(),
170
+ linkedBy,
171
+ reason,
172
+ };
173
+ this.#orgLinks.set(org, record);
174
+ return record;
175
+ }
176
+ getOrgBillingLink(org) {
177
+ return Promise.resolve(this.#orgLinks.get(validateSlug('org', org)));
178
+ }
179
+ }
180
+ function restoreMap(target, source) {
181
+ target.clear();
182
+ for (const [key, value] of source)
183
+ target.set(key, value);
184
+ }
185
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/billing/in-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { AuditEventInput } from '@noodle-borg/module';
2
+ import type { ControlPlaneIdentity } from '../auth/deploy-gate.js';
3
+ import { type LegacyBillingMigrationMapping } from './migration.js';
4
+ export interface LegacyBillingPlanEvidence {
5
+ readonly schemaVersion: 1;
6
+ readonly service: string;
7
+ readonly capturedAt: string;
8
+ readonly authoritativeOrganizationCount: number;
9
+ readonly projections: readonly {
10
+ readonly org: string;
11
+ readonly response: {
12
+ readonly ok: true;
13
+ readonly service: string;
14
+ readonly plan: {
15
+ readonly org: string;
16
+ readonly plan: 'free';
17
+ readonly state: 'active';
18
+ readonly source: 'default';
19
+ };
20
+ };
21
+ }[];
22
+ readonly reconciliation: {
23
+ readonly complete: true;
24
+ readonly treatment: 'preserve_as_free';
25
+ readonly counts: {
26
+ readonly freeActiveDefault: number;
27
+ readonly exceptions: 0;
28
+ };
29
+ };
30
+ }
31
+ export interface LegacyBillingMigrationApplyRequest {
32
+ readonly schemaVersion: 1;
33
+ readonly mode: 'shadow';
34
+ readonly mappings: readonly LegacyBillingMigrationMapping[];
35
+ readonly expectedPreviewChecksum: string;
36
+ readonly legacyPlanEvidence: LegacyBillingPlanEvidence;
37
+ readonly idempotencyKey: string;
38
+ readonly reason: string;
39
+ readonly confirmed: true;
40
+ }
41
+ export interface LegacyBillingMigrationApplyResult {
42
+ readonly schemaVersion: 1;
43
+ readonly migrationId: string;
44
+ readonly mode: 'shadow';
45
+ readonly state: 'prepared';
46
+ readonly replayed: boolean;
47
+ readonly preparedAt: string;
48
+ readonly enforcementMode: 'legacy_unchanged';
49
+ readonly meteringMode: 'not_started';
50
+ readonly grantMode: 'pending_activation';
51
+ readonly mappingChecksum: string;
52
+ readonly previewChecksum: string;
53
+ readonly planEvidenceChecksum: string;
54
+ readonly counts: {
55
+ readonly organizations: number;
56
+ readonly accountsCreated: number;
57
+ readonly accountsReused: number;
58
+ readonly linksCreated: number;
59
+ readonly linksPreserved: number;
60
+ readonly productionApps: number;
61
+ readonly grantCandidateFundingSets: number;
62
+ };
63
+ readonly fundingSets: readonly {
64
+ readonly billingAccountId: string;
65
+ readonly accountDisposition: 'created' | 'existing';
66
+ readonly snapshotId: string;
67
+ readonly organizations: number;
68
+ readonly productionApps: number;
69
+ readonly grantCandidate: boolean;
70
+ }[];
71
+ readonly links: readonly {
72
+ readonly org: string;
73
+ readonly billingAccountId: string;
74
+ readonly version: number;
75
+ readonly disposition: 'created' | 'preserved';
76
+ }[];
77
+ }
78
+ export interface LegacyBillingMigrationStore {
79
+ /** PostgreSQL stores persist success audit events in-transaction; callers then fan out mirrors only. */
80
+ readonly successAuditMode?: 'transactional';
81
+ prepareLegacyBillingMigration(input: {
82
+ readonly request: LegacyBillingMigrationApplyRequest;
83
+ readonly actor: ControlPlaneIdentity;
84
+ readonly service: string;
85
+ }): Promise<LegacyBillingMigrationApplyResult>;
86
+ }
87
+ export type LegacyBillingMigrationConflictCode = 'preview_not_ready' | 'preview_checksum_mismatch' | 'legacy_plan_evidence_drift' | 'incomplete_billing_destination' | 'idempotency_key_conflict' | 'migration_already_prepared' | 'serialization_conflict';
88
+ export declare class LegacyBillingMigrationConflictError extends Error {
89
+ readonly code: LegacyBillingMigrationConflictCode;
90
+ constructor(code: LegacyBillingMigrationConflictCode, message: string);
91
+ }
92
+ export declare function parseLegacyBillingMigrationPlanEvidence(value: unknown): LegacyBillingPlanEvidence;
93
+ export declare function parseLegacyBillingMigrationApplyRequest(value: unknown): LegacyBillingMigrationApplyRequest;
94
+ export declare function legacyBillingMigrationPlanEvidenceChecksum(evidence: LegacyBillingPlanEvidence): string;
95
+ export declare function legacyBillingMigrationRequestFingerprint(request: LegacyBillingMigrationApplyRequest, actor: Pick<ControlPlaneIdentity, 'subject' | 'email'>, service: string): string;
96
+ export declare function legacyBillingMigrationSuccessAudit(result: LegacyBillingMigrationApplyResult, actor: Pick<ControlPlaneIdentity, 'subject' | 'email'>): AuditEventInput;
97
+ export declare function normalizeBillingMigrationServiceUrl(value: string): string;
98
+ //# sourceMappingURL=migration-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-apply.d.ts","sourceRoot":"","sources":["../../src/billing/migration-apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,KAAK,6BAA6B,EAInC,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,QAAQ,EAAE;YACjB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;YAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,IAAI,EAAE;gBACb,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;aAC5B,CAAC;SACH,CAAC;KACH,EAAE,CAAC;IACJ,QAAQ,CAAC,cAAc,EAAE;QACvB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACvC,QAAQ,CAAC,MAAM,EAAE;YACf,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;YACnC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;SACxB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC5D,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,GAAG,UAAU,CAAC;QACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;KAClC,EAAE,CAAC;IACJ,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,GAAG,WAAW,CAAC;KAC/C,EAAE,CAAC;CACL;AAED,MAAM,WAAW,2BAA2B;IAC1C,wGAAwG;IACxG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC;IAC5C,6BAA6B,CAAC,KAAK,EAAE;QACnC,QAAQ,CAAC,OAAO,EAAE,kCAAkC,CAAC;QACrD,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;QACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,kCAAkC,GAC1C,mBAAmB,GACnB,2BAA2B,GAC3B,4BAA4B,GAC5B,gCAAgC,GAChC,0BAA0B,GAC1B,4BAA4B,GAC5B,wBAAwB,CAAC;AAE7B,qBAAa,mCAAoC,SAAQ,KAAK;IAC5D,QAAQ,CAAC,IAAI,EAAE,kCAAkC,CAAC;gBAEtC,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM;CAKtE;AA2DD,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,CA4CjG;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,GACb,kCAAkC,CA4BpC;AAED,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,yBAAyB,GAClC,MAAM,CAKR;AAED,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,kCAAkC,EAC3C,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,OAAO,CAAC,EACtD,OAAO,EAAE,MAAM,GACd,MAAM,CAYR;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,iCAAiC,EACzC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,OAAO,CAAC,GACrD,eAAe,CAwBjB;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAazE"}