@substrat-run/contract-tests 0.158.0 → 0.160.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 (67) hide show
  1. package/dist/attachment-bytes-suite.d.ts +9 -0
  2. package/dist/attachment-bytes-suite.d.ts.map +1 -0
  3. package/dist/attachment-bytes-suite.js +97 -0
  4. package/dist/attachment-bytes-suite.js.map +1 -0
  5. package/dist/connector-fixture.d.ts +2 -2
  6. package/dist/connector-fixture.d.ts.map +1 -1
  7. package/dist/directory-audit-suite.d.ts +17 -0
  8. package/dist/directory-audit-suite.d.ts.map +1 -0
  9. package/dist/directory-audit-suite.js +345 -0
  10. package/dist/directory-audit-suite.js.map +1 -0
  11. package/dist/directory-restore-suite.d.ts.map +1 -1
  12. package/dist/directory-restore-suite.js +99 -0
  13. package/dist/directory-restore-suite.js.map +1 -1
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +10 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/many-migrations-suite.d.ts +9 -0
  19. package/dist/many-migrations-suite.d.ts.map +1 -0
  20. package/dist/many-migrations-suite.js +76 -0
  21. package/dist/many-migrations-suite.js.map +1 -0
  22. package/dist/many-migrations.d.ts +16 -0
  23. package/dist/many-migrations.d.ts.map +1 -0
  24. package/dist/many-migrations.js +50 -0
  25. package/dist/many-migrations.js.map +1 -0
  26. package/dist/membership-executor-suite.d.ts.map +1 -1
  27. package/dist/membership-executor-suite.js +8 -5
  28. package/dist/membership-executor-suite.js.map +1 -1
  29. package/dist/modules.d.ts.map +1 -1
  30. package/dist/modules.js +10 -0
  31. package/dist/modules.js.map +1 -1
  32. package/dist/reserved-role-suite.d.ts +6 -0
  33. package/dist/reserved-role-suite.d.ts.map +1 -1
  34. package/dist/reserved-role-suite.js +176 -8
  35. package/dist/reserved-role-suite.js.map +1 -1
  36. package/dist/role-state-suite.d.ts +17 -0
  37. package/dist/role-state-suite.d.ts.map +1 -0
  38. package/dist/role-state-suite.js +80 -0
  39. package/dist/role-state-suite.js.map +1 -0
  40. package/dist/schedule-platform-requests-suite.d.ts +7 -1
  41. package/dist/schedule-platform-requests-suite.d.ts.map +1 -1
  42. package/dist/schedule-platform-requests-suite.js +349 -2
  43. package/dist/schedule-platform-requests-suite.js.map +1 -1
  44. package/dist/schedule-purge-request-module.d.ts +88 -0
  45. package/dist/schedule-purge-request-module.d.ts.map +1 -0
  46. package/dist/schedule-purge-request-module.js +114 -0
  47. package/dist/schedule-purge-request-module.js.map +1 -0
  48. package/dist/schedule-purge-two-module.d.ts +141 -0
  49. package/dist/schedule-purge-two-module.d.ts.map +1 -0
  50. package/dist/schedule-purge-two-module.js +153 -0
  51. package/dist/schedule-purge-two-module.js.map +1 -0
  52. package/dist/scope-host-suite.d.ts.map +1 -1
  53. package/dist/scope-host-suite.js +1177 -7
  54. package/dist/scope-host-suite.js.map +1 -1
  55. package/dist/size-reads-suite.d.ts +20 -0
  56. package/dist/size-reads-suite.d.ts.map +1 -0
  57. package/dist/size-reads-suite.js +77 -0
  58. package/dist/size-reads-suite.js.map +1 -0
  59. package/dist/stored-vertical-copy-suite.d.ts +15 -0
  60. package/dist/stored-vertical-copy-suite.d.ts.map +1 -0
  61. package/dist/stored-vertical-copy-suite.js +68 -0
  62. package/dist/stored-vertical-copy-suite.js.map +1 -0
  63. package/dist/unreadable-scope-row-suite.d.ts +16 -0
  64. package/dist/unreadable-scope-row-suite.d.ts.map +1 -0
  65. package/dist/unreadable-scope-row-suite.js +152 -0
  66. package/dist/unreadable-scope-row-suite.js.map +1 -0
  67. package/package.json +3 -3
@@ -0,0 +1,9 @@
1
+ import type { ScopeHostFixture } from './scope-host-suite.js';
2
+ /**
3
+ * A scope's attachment bytes (#2501), held to their producer: files go in through the attachment
4
+ * surface a vertical's users upload through, and the bytes come back as the co-located read
5
+ * (`HostAdmin.scopeAttachmentBytes`) and as the storage gauge's `attachments` on `/meters`. What is
6
+ * counted is what the scope's attachment rows record: a removed file stops counting.
7
+ */
8
+ export declare function attachmentBytesContractSuite(adapterName: string, makeFixture: () => Promise<ScopeHostFixture>): void;
9
+ //# sourceMappingURL=attachment-bytes-suite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-bytes-suite.d.ts","sourceRoot":"","sources":["../src/attachment-bytes-suite.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAS9D;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAqFpH"}
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import { permissionKey, platformActorId, principalId, scopeId as scopeIdSchema, tenantId, } from '@substrat-run/contracts';
3
+ import { runPlatformSweep, ulid } from '@substrat-run/kernel';
4
+ import { connectorTestFetch } from './connector-fixture.js';
5
+ import { permMod } from './modules.js';
6
+ const PERM_READ = permissionKey.parse('perm:read');
7
+ const PERM_USE = permissionKey.parse('perm:use');
8
+ const item = (id) => ({ entityType: 'item', entityId: id });
9
+ const bytes = (n) => new Uint8Array(n).fill(97);
10
+ /**
11
+ * A scope's attachment bytes (#2501), held to their producer: files go in through the attachment
12
+ * surface a vertical's users upload through, and the bytes come back as the co-located read
13
+ * (`HostAdmin.scopeAttachmentBytes`) and as the storage gauge's `attachments` on `/meters`. What is
14
+ * counted is what the scope's attachment rows record: a removed file stops counting.
15
+ */
16
+ export function attachmentBytesContractSuite(adapterName, makeFixture) {
17
+ describe(`attachment bytes beside the storage gauge (#2501): ${adapterName}`, () => {
18
+ let fixture;
19
+ let host;
20
+ const t = tenantId.parse(ulid());
21
+ const staff = platformActorId.parse(ulid());
22
+ const editor = principalId.parse(ulid());
23
+ beforeAll(async () => {
24
+ fixture = await makeFixture();
25
+ host = fixture.host;
26
+ host.registerModule(permMod);
27
+ await host.admin.createTenant(staff, { id: t, slug: `att-bytes-${t.toLowerCase()}`, name: 'Attachment bytes' });
28
+ await host.admin.grantEntitlement(staff, t, 'perm');
29
+ await host.provisionBlobStore(staff, { tenantId: t, vertical: 'docs', binding: 'ATTACHMENTS' });
30
+ await host.admin.defineRole(staff, t, { key: 'editor', permissions: [PERM_READ, PERM_USE], source: 'vertical' });
31
+ await host.admin.assignRole(staff, { principalId: editor, roleKey: 'editor', node: { tenantId: t, scopeId: null } });
32
+ });
33
+ afterAll(async () => {
34
+ await fixture.cleanup();
35
+ });
36
+ const newScope = async () => {
37
+ const s = scopeIdSchema.parse(ulid());
38
+ await host.provisionScope(staff, { tenantId: t, scopeId: s, vertical: 'docs' });
39
+ await host.admin.activateScope(staff, t, s);
40
+ return s;
41
+ };
42
+ const upload = async (s, size) => (await host.attachments(editor, t, s)).upload({
43
+ entity: item('i'),
44
+ filename: `f-${size}.txt`,
45
+ contentType: 'text/plain',
46
+ visibility: 'internal',
47
+ body: bytes(size),
48
+ });
49
+ it('reads what the uploaded files sum to, and a removed file stops counting', async () => {
50
+ const s = await newScope();
51
+ expect(await host.admin.scopeAttachmentBytes(staff, t, s)).toBe(0);
52
+ const kept = await upload(s, 5);
53
+ const removed = await upload(s, 11);
54
+ expect([kept.size, removed.size]).toEqual([5, 11]);
55
+ expect(await host.admin.scopeAttachmentBytes(staff, t, s)).toBe(16);
56
+ await (await host.attachments(editor, t, s)).remove(removed.id);
57
+ expect(await host.admin.scopeAttachmentBytes(staff, t, s)).toBe(5);
58
+ // K-24: the read wakes a scope, so it is attributable like the database size.
59
+ const reads = await host.admin.accessLog(staff, { method: 'scopeAttachmentBytes' });
60
+ expect(reads.some((r) => r.scopeId === s && r.tenantId === t)).toBe(true);
61
+ // A scope the directory does not hold under the tenant is refused, not read as 0.
62
+ await expect(host.admin.scopeAttachmentBytes(staff, t, scopeIdSchema.parse(ulid()))).rejects.toThrow();
63
+ });
64
+ it('the storage phase samples them beside the database, and /meters serves them apart from its bytes', async () => {
65
+ const [s1, s2] = [await newScope(), await newScope()];
66
+ await upload(s1, 7);
67
+ await upload(s1, 3);
68
+ await upload(s2, 4);
69
+ const report = await runPlatformSweep(host, {
70
+ actor: staff,
71
+ fetch: connectorTestFetch,
72
+ sweepers: {},
73
+ storageGauge: {
74
+ read: (scope) => host.admin.scopeDatabaseSize(staff, scope.tenantId, scope.id),
75
+ readAttachments: (scope) => host.admin.scopeAttachmentBytes(staff, scope.tenantId, scope.id),
76
+ batch: 10_000,
77
+ },
78
+ });
79
+ expect(report.errors.filter((e) => e.kind === 'storage')).toEqual([]);
80
+ const storage = (await host.admin.readMeters(staff, { tenantId: t })).perTenant[0].storage;
81
+ // Every scope of the tenant was sampled: these two, and any an earlier case left.
82
+ const scopes = await host.admin.listScopes(staff, { tenantId: t, status: 'active' });
83
+ let expected = 0;
84
+ for (const scope of scopes)
85
+ expected += await host.admin.scopeAttachmentBytes(staff, t, scope.id);
86
+ expect(expected).toBeGreaterThanOrEqual(14);
87
+ expect(storage.attachments).toEqual({ bytes: expected, sampled: scopes.length });
88
+ // `bytes` stays the scope databases, and says attachments are not in it.
89
+ expect(storage.basis).toBe('scope-databases');
90
+ expect(storage.excluded).toContain('attachments');
91
+ expect(storage.bytes).toBeGreaterThan(0);
92
+ // A whole storage pass, and on workerd every read wakes a scope DO: past vitest's 5 s
93
+ // default on a loaded machine, though it finishes in about one.
94
+ }, 30_000);
95
+ });
96
+ }
97
+ //# sourceMappingURL=attachment-bytes-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-bytes-suite.js","sourceRoot":"","sources":["../src/attachment-bytes-suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EACL,aAAa,EACb,eAAe,EACf,WAAW,EACX,OAAO,IAAI,aAAa,EACxB,QAAQ,GAIT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAkB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACjD,MAAM,IAAI,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/E,MAAM,KAAK,GAAG,CAAC,CAAS,EAAc,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAmB,EAAE,WAA4C;IAC5G,QAAQ,CAAC,sDAAsD,WAAW,EAAE,EAAE,GAAG,EAAE;QACjF,IAAI,OAAyB,CAAC;QAC9B,IAAI,IAAe,CAAC;QACpB,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAgB,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtD,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAChH,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YAChG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACjH,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACvH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,KAAK,IAAsB,EAAE;YAC5C,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,EAAE,CAAU,EAAE,IAAY,EAAE,EAAE,CAChD,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;YACjB,QAAQ,EAAE,KAAK,IAAI,MAAM;YACzB,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;SAClB,CAAC,CAAC;QAEL,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,8EAA8E;YAC9E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1E,kFAAkF;YAClF,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;YAChH,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC;YACtD,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE;gBAC1C,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE;oBACZ,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC9E,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC7F,KAAK,EAAE,MAAM;iBACd;aACF,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,OAAQ,CAAC;YAC7F,kFAAkF;YAClF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrF,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,QAAQ,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACnG,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,yEAAyE;YACzE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,sFAAsF;YACtF,gEAAgE;QAClE,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { FetchLike } from '@substrat-run/kernel';
1
+ import type { ConnectorRequestInit, FetchLike } from '@substrat-run/kernel';
2
2
  /**
3
3
  * An in-memory provider, so a connector can be exercised end to end without any
4
4
  * real API credentials.
@@ -16,7 +16,7 @@ export interface ConnectorCall {
16
16
  url: string;
17
17
  method: string | undefined;
18
18
  auth: string | undefined;
19
- body: string | Uint8Array | undefined;
19
+ body: ConnectorRequestInit['body'];
20
20
  }
21
21
  export declare const connectorCalls: ConnectorCall[];
22
22
  export declare const resetConnectorCalls: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"connector-fixture.d.ts","sourceRoot":"","sources":["../src/connector-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACvC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,EAAO,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAO,IAEtC,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,EAAE,SAiBhC,CAAC"}
1
+ {"version":3,"file":"connector-fixture.d.ts","sourceRoot":"","sources":["../src/connector-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,EAAO,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAO,IAEtC,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,EAAE,SAiBhC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ScopeHost } from '@substrat-run/kernel';
2
+ /**
3
+ * #2479: what a directory audit suite needs of an adapter — its host, and one statement run
4
+ * against the directory its admin log lives in, so a fault is a trigger in the real store.
5
+ */
6
+ export interface DirectoryAuditFixture {
7
+ host: ScopeHost;
8
+ directorySql(sql: string): Promise<void>;
9
+ cleanup(): Promise<void>;
10
+ }
11
+ /**
12
+ * #2479: every tenant and vertical directory write commits with its admin row. A fault in the
13
+ * audit insert leaves the state as it was and no row; a fault in the state write leaves no row;
14
+ * the retry writes the state and exactly one row, fields as the adapters have always written them.
15
+ */
16
+ export declare function directoryAdminAuditTransactionSuite(adapterName: string, makeFixture: () => Promise<DirectoryAuditFixture>): void;
17
+ //# sourceMappingURL=directory-audit-suite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-audit-suite.d.ts","sourceRoot":"","sources":["../src/directory-audit-suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG5D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AA+QD;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CA6FhI"}
@@ -0,0 +1,345 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { platformActorId, scopeId, tenantId } from '@substrat-run/contracts';
3
+ import { ulid } from '@substrat-run/kernel';
4
+ import { heldMigrations } from './held-migrations.js';
5
+ /** A trigger refusing one admin action's row, or one kind of write to a directory table. */
6
+ function refusal(name, on, when = '') {
7
+ return {
8
+ create: `CREATE TRIGGER ${name} BEFORE ${on} ${when}
9
+ BEGIN SELECT RAISE(ABORT, 'refused by ${name} (test fault)'); END`,
10
+ drop: `DROP TRIGGER IF EXISTS ${name}`,
11
+ };
12
+ }
13
+ const slugOf = () => `audit-${ulid().toLowerCase()}`;
14
+ const newTenant = async (host, staff, name = 'Audit directory test') => {
15
+ const t = tenantId.parse(ulid());
16
+ await host.admin.createTenant(staff, { id: t, slug: slugOf(), name });
17
+ return t;
18
+ };
19
+ const newVertical = async (host, staff) => {
20
+ const slug = slugOf();
21
+ await host.admin.registerVertical(staff, { slug, name: 'Audit directory test', source: 'builtin' });
22
+ return slug;
23
+ };
24
+ const publish = async (host, staff, slug) => {
25
+ const id = ulid();
26
+ await host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
27
+ manifestDigest: 'm', permissionDigest: 'p', migrationDigest: 'g', deploymentRef: null });
28
+ return id;
29
+ };
30
+ const verticalOf = async (host, staff, slug) => (await host.admin.listVerticals(staff)).find((v) => v.slug === slug);
31
+ /** #2501: how many of the slug's ownership periods are open (at most one). */
32
+ const openPeriodsOf = async (host, staff, slug) => (await host.admin.listVerticalOwners(staff, slug)).filter((p) => p.until === null).length;
33
+ /** One vertical flag flipped by staff: the case is the same shape for each. */
34
+ const flagCase = (action, field) => ({
35
+ action,
36
+ write: { table: 'verticals', verb: 'UPDATE' },
37
+ arrange: async (host, staff) => {
38
+ const slug = await newVertical(host, staff);
39
+ return {
40
+ call: () => host.admin[action](staff, slug, true),
41
+ state: async () => (await verticalOf(host, staff, slug))?.[field],
42
+ changed: true,
43
+ row: { before: { [field]: false }, after: { [field]: true } },
44
+ };
45
+ },
46
+ });
47
+ const CASES = [
48
+ {
49
+ action: 'createTenant',
50
+ write: { table: 'tenants', verb: 'INSERT' },
51
+ arrange: async (host, staff) => {
52
+ const t = tenantId.parse(ulid());
53
+ const slug = slugOf();
54
+ return {
55
+ call: () => host.admin.createTenant(staff, { id: t, slug, name: 'Created' }),
56
+ state: async () => (await host.admin.getTenant(staff, t))?.status ?? null,
57
+ changed: 'active',
58
+ row: { before: null, after: expect.objectContaining({ id: t, slug, name: 'Created', status: 'active' }) },
59
+ };
60
+ },
61
+ },
62
+ {
63
+ action: 'setTenantStatus',
64
+ write: { table: 'tenants', verb: 'UPDATE' },
65
+ arrange: async (host, staff) => {
66
+ const t = await newTenant(host, staff);
67
+ return {
68
+ call: () => host.admin.setTenantStatus(staff, t, 'suspended'),
69
+ state: async () => (await host.admin.getTenant(staff, t))?.status,
70
+ changed: 'suspended',
71
+ row: { before: { status: 'active' }, after: { status: 'suspended' } },
72
+ };
73
+ },
74
+ },
75
+ {
76
+ action: 'setTenantName',
77
+ write: { table: 'tenants', verb: 'UPDATE' },
78
+ arrange: async (host, staff) => {
79
+ const t = await newTenant(host, staff, 'Before');
80
+ return {
81
+ call: () => host.admin.setTenantName(staff, t, 'After'),
82
+ state: async () => (await host.admin.getTenant(staff, t))?.name,
83
+ changed: 'After',
84
+ row: { before: { name: 'Before' }, after: { name: 'After' } },
85
+ };
86
+ },
87
+ },
88
+ {
89
+ action: 'reapTenant',
90
+ write: { table: 'tenants', verb: 'UPDATE' },
91
+ arrange: async (host, staff) => {
92
+ const t = await newTenant(host, staff);
93
+ await host.admin.grantEntitlement(staff, t, 'audit-entitlement');
94
+ await host.admin.setTenantStatus(staff, t, 'deleting');
95
+ return {
96
+ call: () => host.admin.reapTenant(staff, t),
97
+ // The rows a reap clears go back with the flip: the entitlement is the witness.
98
+ state: async () => [(await host.admin.getTenant(staff, t))?.status, (await host.admin.listEntitlements(staff, t)).length],
99
+ changed: ['reaped', 0],
100
+ row: { before: { status: 'deleting' }, after: { status: 'reaped' } },
101
+ };
102
+ },
103
+ },
104
+ {
105
+ action: 'registerVertical',
106
+ write: { table: 'verticals', verb: 'INSERT' },
107
+ arrange: async (host, staff) => {
108
+ const slug = slugOf();
109
+ return {
110
+ call: () => host.admin.registerVertical(staff, { slug, name: 'Registered', source: 'builtin' }),
111
+ // #2501: the ownership period opens in the same unit as the row and its admin entry.
112
+ state: async () => [(await verticalOf(host, staff, slug))?.name ?? null, await openPeriodsOf(host, staff, slug)],
113
+ changed: ['Registered', 1],
114
+ row: { before: null, after: expect.objectContaining({ slug, name: 'Registered', source: 'builtin' }) },
115
+ };
116
+ },
117
+ },
118
+ {
119
+ action: 'publishVersion',
120
+ write: { table: 'vertical_versions', verb: 'INSERT' },
121
+ arrange: async (host, staff) => {
122
+ const slug = await newVertical(host, staff);
123
+ const id = ulid();
124
+ return {
125
+ call: () => host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
126
+ manifestDigest: 'm', permissionDigest: 'p', migrationDigest: 'g', deploymentRef: null }),
127
+ state: async () => (await host.admin.getVersion(staff, id))?.admission ?? null,
128
+ changed: 'pending',
129
+ row: { before: null, after: expect.objectContaining({ id, verticalSlug: slug, admission: 'pending' }) },
130
+ };
131
+ },
132
+ },
133
+ flagCase('setVerticalListed', 'listed'),
134
+ {
135
+ action: 'requestPublish',
136
+ write: { table: 'verticals', verb: 'UPDATE' },
137
+ arrange: async (host, staff) => {
138
+ const slug = await newVertical(host, staff);
139
+ return {
140
+ call: () => host.admin.requestPublish(staff, slug),
141
+ state: async () => (await verticalOf(host, staff, slug))?.publishRequestedAt != null,
142
+ changed: true,
143
+ row: { before: null, after: { slug } },
144
+ };
145
+ },
146
+ },
147
+ flagCase('setVerticalInstallsBlocked', 'installsBlocked'),
148
+ flagCase('setVerticalTenantProvisioner', 'tenantProvisioner'),
149
+ flagCase('setVerticalEmailSender', 'emailSender'),
150
+ {
151
+ action: 'deleteVertical',
152
+ write: { table: 'verticals', verb: 'DELETE' },
153
+ arrange: async (host, staff) => {
154
+ const slug = await newVertical(host, staff);
155
+ const version = await publish(host, staff, slug);
156
+ return {
157
+ call: () => host.admin.deleteVertical(staff, slug),
158
+ // The versions it deletes first go back with the row, and so does the closing of its
159
+ // ownership period (#2501).
160
+ state: async () => [
161
+ (await verticalOf(host, staff, slug)) !== undefined,
162
+ (await host.admin.getVersion(staff, version)) !== undefined,
163
+ await openPeriodsOf(host, staff, slug),
164
+ ],
165
+ changed: [false, false, 0],
166
+ row: { before: { slug, source: 'builtin', ownerTenant: null }, after: null },
167
+ };
168
+ },
169
+ },
170
+ {
171
+ action: 'admitVersion',
172
+ write: { table: 'vertical_versions', verb: 'UPDATE' },
173
+ arrange: async (host, staff) => {
174
+ const version = await publish(host, staff, await newVertical(host, staff));
175
+ return {
176
+ call: () => host.admin.admitVersion(staff, version),
177
+ state: async () => (await host.admin.getVersion(staff, version))?.admission,
178
+ changed: 'admitted',
179
+ row: { before: { admission: 'pending' }, after: { admission: 'admitted' } },
180
+ };
181
+ },
182
+ },
183
+ {
184
+ action: 'rejectVersion',
185
+ write: { table: 'vertical_versions', verb: 'UPDATE' },
186
+ arrange: async (host, staff) => {
187
+ const version = await publish(host, staff, await newVertical(host, staff));
188
+ return {
189
+ call: () => host.admin.rejectVersion(staff, version, 'not this one'),
190
+ state: async () => (await host.admin.getVersion(staff, version))?.admission,
191
+ changed: 'rejected',
192
+ row: { before: { admission: 'pending' }, after: { admission: 'rejected', note: 'not this one' } },
193
+ };
194
+ },
195
+ },
196
+ {
197
+ action: 'promoteVersion',
198
+ write: { table: 'vertical_channels', verb: 'INSERT' },
199
+ arrange: async (host, staff) => {
200
+ const slug = await newVertical(host, staff);
201
+ const version = await publish(host, staff, slug);
202
+ await host.admin.admitVersion(staff, version);
203
+ return {
204
+ call: () => host.admin.promoteVersion(staff, slug, 'prod', version),
205
+ state: async () => (await host.admin.listChannels(staff, slug))[0]?.versionId ?? null,
206
+ changed: version,
207
+ row: { before: null, after: expect.objectContaining({ channel: 'prod', versionId: version }) },
208
+ };
209
+ },
210
+ },
211
+ {
212
+ action: 'setVerticalServing',
213
+ write: { table: 'verticals', verb: 'UPDATE' },
214
+ arrange: async (host, staff) => {
215
+ const slug = await newVertical(host, staff);
216
+ const version = await publish(host, staff, slug);
217
+ const ref = `serving-${ulid().toLowerCase()}`;
218
+ return {
219
+ call: () => host.admin.setVerticalServing(staff, slug, { ref, versionId: version, doClasses: [], migrationTag: 'g' }),
220
+ state: async () => (await host.admin.verticalServing(staff, slug))?.versionId ?? null,
221
+ changed: version,
222
+ row: { before: null, after: { vertical: slug, ref, versionId: version } },
223
+ };
224
+ },
225
+ },
226
+ {
227
+ // RFC wire-signing §7 (Q8): the capability record of one upload.
228
+ action: 'recordWireAuth',
229
+ write: { table: 'vertical_wire_auth', verb: 'INSERT' },
230
+ arrange: async (host, staff) => {
231
+ const slug = slugOf();
232
+ const deploymentRef = `${slug}-serving`;
233
+ const record = {
234
+ envelope: 1, entrySkipped: null, state: 'dual', audience: deploymentRef,
235
+ routerKids: ['If4x36FUomE'], platformKids: ['OfcT0KZEJT8'], withheld: null,
236
+ };
237
+ return {
238
+ call: () => host.admin.recordWireAuth(staff, { deploymentRef, verticalSlug: slug, versionId: 'v1', record, recordedAt: '2026-10-24T10:00:00.000Z' }),
239
+ state: async () => (await host.admin.listWireAuth(staff, { reach: { fleet: true }, limit: 1, verticalSlug: slug }))[0]?.record ?? null,
240
+ changed: record,
241
+ row: { before: null, after: { vertical: slug, deploymentRef, versionId: 'v1', record } },
242
+ };
243
+ },
244
+ },
245
+ ];
246
+ /**
247
+ * #2479: every tenant and vertical directory write commits with its admin row. A fault in the
248
+ * audit insert leaves the state as it was and no row; a fault in the state write leaves no row;
249
+ * the retry writes the state and exactly one row, fields as the adapters have always written them.
250
+ */
251
+ export function directoryAdminAuditTransactionSuite(adapterName, makeFixture) {
252
+ describe(`HostAdmin tenant and vertical directory audit transaction: ${adapterName}`, () => {
253
+ const run = async (c, fault) => {
254
+ const fixture = await makeFixture();
255
+ const { host } = fixture;
256
+ const staff = platformActorId.parse(ulid());
257
+ const tag = `${c.action.toLowerCase()}_${ulid().toLowerCase()}`;
258
+ const trigger = fault === 'audit'
259
+ ? refusal(`test_refuse_audit_${tag}`, 'INSERT ON _substrat_admin_log', `WHEN NEW.action = '${c.action}'`)
260
+ : refusal(`test_refuse_write_${tag}`, `${c.write.verb} ON ${c.write.table}`);
261
+ let lifted = true;
262
+ try {
263
+ const { call, state, changed, row } = await c.arrange(host, staff);
264
+ const since = new Date().toISOString();
265
+ const rows = () => host.admin.auditLog(staff, { action: [c.action], since });
266
+ const before = await state();
267
+ expect(before).not.toEqual(changed);
268
+ await fixture.directorySql(trigger.create);
269
+ lifted = false;
270
+ await expect(call()).rejects.toThrow(/test fault/);
271
+ expect(await state()).toEqual(before);
272
+ expect(await rows()).toEqual([]);
273
+ await fixture.directorySql(trigger.drop);
274
+ lifted = true;
275
+ await call();
276
+ expect(await state()).toEqual(changed);
277
+ expect((await rows()).map((r) => ({ before: r.before, after: r.after }))).toEqual([row]);
278
+ }
279
+ finally {
280
+ if (!lifted)
281
+ await fixture.directorySql(trigger.drop);
282
+ await fixture.cleanup();
283
+ }
284
+ };
285
+ it.each(CASES.map((c) => [c.action, c]))('%s rolls back when its audit row is refused, and writes one on retry', async (_, c) => {
286
+ await run(c, 'audit');
287
+ });
288
+ it.each(CASES.map((c) => [c.action, c]))('%s records no audit row when its state write is refused', async (_, c) => {
289
+ await run(c, 'write');
290
+ });
291
+ it('a no-op rename records nothing, and the rename before it one row', async () => {
292
+ const fixture = await makeFixture();
293
+ const { host } = fixture;
294
+ const staff = platformActorId.parse(ulid());
295
+ try {
296
+ const t = await newTenant(host, staff, 'Before');
297
+ await host.admin.setTenantName(staff, t, 'After');
298
+ await host.admin.setTenantName(staff, t, 'After');
299
+ expect((await host.admin.auditLog(staff, { tenantId: t, action: ['setTenantName'] })).map((r) => r.after))
300
+ .toEqual([{ name: 'After' }]);
301
+ }
302
+ finally {
303
+ await fixture.cleanup();
304
+ }
305
+ });
306
+ // The promote's own row commits with the channel move, so it lands ahead of the rebinds a
307
+ // private promote makes afterwards, each of which records its own row.
308
+ it('a private promote records its own row before the scope rebinds it causes', async () => {
309
+ const fixture = await makeFixture();
310
+ const { host } = fixture;
311
+ const staff = platformActorId.parse(ulid());
312
+ try {
313
+ const owner = await newTenant(host, staff);
314
+ const scope = scopeId.parse(ulid());
315
+ const slug = `tenant-a/${slugOf()}`;
316
+ await host.admin.registerVertical(staff, { slug, name: 'Audit promote order', source: 'cli', ownerTenant: owner });
317
+ const release = async () => {
318
+ const id = ulid();
319
+ await host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
320
+ manifestDigest: 'm', permissionDigest: 'p', ...(await heldMigrations('g')), deploymentRef: null });
321
+ return id;
322
+ };
323
+ const first = await release();
324
+ const second = await release();
325
+ await host.provisionScope(staff, { tenantId: owner, scopeId: scope, vertical: slug });
326
+ await host.admin.activateScope(staff, owner, scope);
327
+ await host.admin.bindScopeVersion(staff, owner, scope, first);
328
+ await host.admin.promoteVersion(staff, slug, 'prod', first);
329
+ await host.admin.promoteVersion(staff, slug, 'prod', second);
330
+ // In id order, which is the order they were written.
331
+ const rows = (await host.admin.auditLog(staff, { action: ['promoteVersion', 'bindScopeVersion'] }))
332
+ .filter((r) => (r.vertical === slug || r.scopeId === scope) && r.after.versionId === second);
333
+ expect(rows.map((r) => [r.action, r.after.versionId])).toEqual([
334
+ ['promoteVersion', second],
335
+ ['bindScopeVersion', second],
336
+ ]);
337
+ expect((await host.admin.getScopeRecord(staff, owner, scope))?.verticalVersionId).toBe(second);
338
+ }
339
+ finally {
340
+ await fixture.cleanup();
341
+ }
342
+ });
343
+ });
344
+ }
345
+ //# sourceMappingURL=directory-audit-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-audit-suite.js","sourceRoot":"","sources":["../src/directory-audit-suite.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"directory-restore-suite.d.ts","sourceRoot":"","sources":["../src/directory-restore-suite.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG/E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,uCAAuC;IACvC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,2FAA2F;IAC3F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,+FAA+F;IAC/F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtC;AA8FD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CA2W1F"}
1
+ {"version":3,"file":"directory-restore-suite.d.ts","sourceRoot":"","sources":["../src/directory-restore-suite.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG/E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,uCAAuC;IACvC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,2FAA2F;IAC3F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,+FAA+F;IAC/F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtC;AA8FD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAge1F"}