@cotal-ai/core 0.90.0 → 0.91.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 (140) hide show
  1. package/dist/agent-file.d.ts +2 -1
  2. package/dist/agent-file.d.ts.map +1 -1
  3. package/dist/agent-file.js +5 -3
  4. package/dist/agent-file.js.map +1 -1
  5. package/dist/auth-provider.d.ts +144 -1
  6. package/dist/auth-provider.d.ts.map +1 -1
  7. package/dist/auth-provider.js +24 -0
  8. package/dist/auth-provider.js.map +1 -1
  9. package/dist/authority-store-config.d.ts +31 -0
  10. package/dist/authority-store-config.d.ts.map +1 -0
  11. package/dist/authority-store-config.js +45 -0
  12. package/dist/authority-store-config.js.map +1 -0
  13. package/dist/backup-config.d.ts +32 -1
  14. package/dist/backup-config.d.ts.map +1 -1
  15. package/dist/backup-config.js +11 -0
  16. package/dist/backup-config.js.map +1 -1
  17. package/dist/broker-identity.d.ts +24 -0
  18. package/dist/broker-identity.d.ts.map +1 -0
  19. package/dist/broker-identity.js +36 -0
  20. package/dist/broker-identity.js.map +1 -0
  21. package/dist/browser-control.d.ts +1 -0
  22. package/dist/browser-control.d.ts.map +1 -1
  23. package/dist/browser-control.js +1 -0
  24. package/dist/browser-control.js.map +1 -1
  25. package/dist/browser-validators-build.d.ts +1 -0
  26. package/dist/browser-validators-build.d.ts.map +1 -1
  27. package/dist/channels.d.ts +14 -0
  28. package/dist/channels.d.ts.map +1 -1
  29. package/dist/channels.js +19 -5
  30. package/dist/channels.js.map +1 -1
  31. package/dist/command.d.ts +57 -0
  32. package/dist/command.d.ts.map +1 -1
  33. package/dist/command.js +49 -2
  34. package/dist/command.js.map +1 -1
  35. package/dist/connector-setup.d.ts +6 -0
  36. package/dist/connector-setup.d.ts.map +1 -1
  37. package/dist/connector.d.ts +3 -0
  38. package/dist/connector.d.ts.map +1 -1
  39. package/dist/connector.js.map +1 -1
  40. package/dist/endpoint-binding.d.ts +66 -1
  41. package/dist/endpoint-binding.d.ts.map +1 -1
  42. package/dist/endpoint-binding.js +167 -118
  43. package/dist/endpoint-binding.js.map +1 -1
  44. package/dist/endpoint-call.js +1 -1
  45. package/dist/endpoint-call.js.map +1 -1
  46. package/dist/endpoint-caller.d.ts +2 -0
  47. package/dist/endpoint-caller.d.ts.map +1 -1
  48. package/dist/endpoint-caller.js.map +1 -1
  49. package/dist/endpoint-grants.d.ts +7 -1
  50. package/dist/endpoint-grants.d.ts.map +1 -1
  51. package/dist/endpoint-grants.js +9 -1
  52. package/dist/endpoint-grants.js.map +1 -1
  53. package/dist/endpoint-invoke.d.ts +9 -0
  54. package/dist/endpoint-invoke.d.ts.map +1 -1
  55. package/dist/endpoint-invoke.js +7 -0
  56. package/dist/endpoint-invoke.js.map +1 -1
  57. package/dist/endpoint-schema-diff.d.ts +20 -0
  58. package/dist/endpoint-schema-diff.d.ts.map +1 -0
  59. package/dist/endpoint-schema-diff.js +15 -0
  60. package/dist/endpoint-schema-diff.js.map +1 -0
  61. package/dist/endpoint.d.ts +90 -5
  62. package/dist/endpoint.d.ts.map +1 -1
  63. package/dist/endpoint.js +329 -31
  64. package/dist/endpoint.js.map +1 -1
  65. package/dist/identity.d.ts +18 -0
  66. package/dist/identity.d.ts.map +1 -1
  67. package/dist/identity.js +28 -1
  68. package/dist/identity.js.map +1 -1
  69. package/dist/index.d.ts +12 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +12 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/issued-authority.d.ts +25 -1
  74. package/dist/issued-authority.d.ts.map +1 -1
  75. package/dist/issued-authority.js +24 -7
  76. package/dist/issued-authority.js.map +1 -1
  77. package/dist/membership-feed.d.ts +16 -12
  78. package/dist/membership-feed.d.ts.map +1 -1
  79. package/dist/membership-feed.js +143 -12
  80. package/dist/membership-feed.js.map +1 -1
  81. package/dist/one-line.d.ts +5 -4
  82. package/dist/one-line.d.ts.map +1 -1
  83. package/dist/one-line.js +6 -5
  84. package/dist/one-line.js.map +1 -1
  85. package/dist/provision.d.ts +4 -1
  86. package/dist/provision.d.ts.map +1 -1
  87. package/dist/provision.js +35 -16
  88. package/dist/provision.js.map +1 -1
  89. package/dist/registry.d.ts +8 -4
  90. package/dist/registry.d.ts.map +1 -1
  91. package/dist/registry.js +58 -20
  92. package/dist/registry.js.map +1 -1
  93. package/dist/run-admission.d.ts +18 -1
  94. package/dist/run-admission.d.ts.map +1 -1
  95. package/dist/run-admission.js +18 -3
  96. package/dist/run-admission.js.map +1 -1
  97. package/dist/sealed-reply.d.ts +21 -0
  98. package/dist/sealed-reply.d.ts.map +1 -0
  99. package/dist/sealed-reply.js +75 -0
  100. package/dist/sealed-reply.js.map +1 -0
  101. package/dist/secret-fs.d.ts +29 -6
  102. package/dist/secret-fs.d.ts.map +1 -1
  103. package/dist/secret-fs.js +107 -18
  104. package/dist/secret-fs.js.map +1 -1
  105. package/dist/space-deletion-targets.d.ts +4 -0
  106. package/dist/space-deletion-targets.d.ts.map +1 -0
  107. package/dist/space-deletion-targets.js +15 -0
  108. package/dist/space-deletion-targets.js.map +1 -0
  109. package/dist/space-initialization-diff.d.ts +47 -0
  110. package/dist/space-initialization-diff.d.ts.map +1 -0
  111. package/dist/space-initialization-diff.js +100 -0
  112. package/dist/space-initialization-diff.js.map +1 -0
  113. package/dist/space-initialization-observation.d.ts +52 -0
  114. package/dist/space-initialization-observation.d.ts.map +1 -0
  115. package/dist/space-initialization-observation.js +133 -0
  116. package/dist/space-initialization-observation.js.map +1 -0
  117. package/dist/space-resource-definitions.d.ts +86 -0
  118. package/dist/space-resource-definitions.d.ts.map +1 -0
  119. package/dist/space-resource-definitions.js +133 -0
  120. package/dist/space-resource-definitions.js.map +1 -0
  121. package/dist/space-schema-diff.d.ts +45 -0
  122. package/dist/space-schema-diff.d.ts.map +1 -0
  123. package/dist/space-schema-diff.js +204 -0
  124. package/dist/space-schema-diff.js.map +1 -0
  125. package/dist/space-schema-observation.d.ts +45 -0
  126. package/dist/space-schema-observation.d.ts.map +1 -0
  127. package/dist/space-schema-observation.js +78 -0
  128. package/dist/space-schema-observation.js.map +1 -0
  129. package/dist/spaces.d.ts.map +1 -1
  130. package/dist/spaces.js +5 -25
  131. package/dist/spaces.js.map +1 -1
  132. package/dist/stream-schema-diff.d.ts +31 -0
  133. package/dist/stream-schema-diff.d.ts.map +1 -0
  134. package/dist/stream-schema-diff.js +45 -0
  135. package/dist/stream-schema-diff.js.map +1 -0
  136. package/dist/streams.d.ts +30 -1
  137. package/dist/streams.d.ts.map +1 -1
  138. package/dist/streams.js +41 -18
  139. package/dist/streams.js.map +1 -1
  140. package/package.json +2 -2
@@ -0,0 +1,100 @@
1
+ import { canonicalJson } from "./canonical.js";
2
+ import { validateChannelConfig, validateChannelDefaults } from "./channels.js";
3
+ import { CHANNEL_DEFAULTS_KEY } from "./subjects.js";
4
+ import { spaceInitializationDefinitions } from "./space-resource-definitions.js";
5
+ import { validateSpaceInitializationInputs } from "./space-initialization-observation.js";
6
+ const DEFAULT_FIELDS = { replay: true, replayWindow: true, deliveryClass: true };
7
+ const CHANNEL_FIELDS = { ...DEFAULT_FIELDS, description: true, instructions: true };
8
+ /** Reject unmodeled fields instead of dropping them from a proposed value. Native validators
9
+ * retain their existing compatibility behavior; this closed policy belongs to inspection. */
10
+ function registryValue(value, key) {
11
+ let unmodeledFieldCount = 0;
12
+ try {
13
+ const encoded = canonicalJson(value);
14
+ if (value === null || typeof value !== "object" || Array.isArray(value) || new TextEncoder().encode(encoded).byteLength > 65536)
15
+ return { valid: false, unmodeledFieldCount };
16
+ const fields = key === CHANNEL_DEFAULTS_KEY ? DEFAULT_FIELDS : CHANNEL_FIELDS;
17
+ unmodeledFieldCount = Object.keys(value).filter((field) => !Object.hasOwn(fields, field)).length;
18
+ if (unmodeledFieldCount)
19
+ return { valid: false, unmodeledFieldCount };
20
+ if (key === CHANNEL_DEFAULTS_KEY)
21
+ validateChannelDefaults(value);
22
+ else
23
+ validateChannelConfig(value);
24
+ return { valid: true, unmodeledFieldCount };
25
+ }
26
+ catch {
27
+ return { valid: false, unmodeledFieldCount };
28
+ }
29
+ }
30
+ /** Compare native seed-before-profile semantics against observed existing rows. Only present,
31
+ * closed, valid values receive a private candidate pinned to their observed revision. Missing,
32
+ * deleted, unreadable or unvisited rows never become empty values or create requests. This
33
+ * pure result carries no connection, current authority, accepted write plan or apply port. */
34
+ export function diffSpaceInitialization(space, deliveryClass, observed, seed) {
35
+ validateSpaceInitializationInputs(deliveryClass, seed);
36
+ const definitions = spaceInitializationDefinitions(space, deliveryClass, seed);
37
+ if (observed.space !== space || observed.registry.bucket !== definitions.registry.bucket || observed.registry.stream !== definitions.registry.stream)
38
+ throw new Error("initialization comparison requires observations of the selected registry; no different target was adopted");
39
+ const patches = new Map(definitions.seed.entries.map((entry) => [entry.key, entry.patch]));
40
+ const keys = [...new Set([...patches.keys(), definitions.profileDefault.key])];
41
+ const requested = new Set(keys), observations = new Map();
42
+ for (const row of observed.observations) {
43
+ if (!requested.has(row.key) || observations.has(row.key) || row.operation !== "kv-get")
44
+ throw new Error("initialization comparison requires unique native observations of the requested keys; no foreign or duplicate row was adopted");
45
+ observations.set(row.key, row);
46
+ }
47
+ const rows = keys.map((key) => {
48
+ const observation = observations.get(key), patch = patches.get(key);
49
+ const row = {
50
+ key, state: observation?.state ?? "not-observed", observedRevision: null,
51
+ seedRequested: patches.has(key), profileDefault: key === CHANNEL_DEFAULTS_KEY ? "not-established" : "not-applicable",
52
+ changedFields: [], unmodeledFieldCount: 0, candidate: null,
53
+ };
54
+ if (!observation)
55
+ return row;
56
+ if ("revision" in observation) {
57
+ if (!Number.isSafeInteger(observation.revision) || observation.revision <= 0)
58
+ return { ...row, state: "observation-failed" };
59
+ row.observedRevision = observation.revision;
60
+ }
61
+ if (observation.state !== "present")
62
+ return row;
63
+ const currentPolicy = registryValue(observation.value, key), patchPolicy = registryValue(patch ?? {}, key);
64
+ row.unmodeledFieldCount = currentPolicy.unmodeledFieldCount + patchPolicy.unmodeledFieldCount;
65
+ if (!currentPolicy.valid || !patchPolicy.valid)
66
+ return { ...row, state: "field-policy-required" };
67
+ const current = observation.value;
68
+ const value = { ...observation.value, ...patch };
69
+ if (key === CHANNEL_DEFAULTS_KEY) {
70
+ if (value.deliveryClass === undefined) {
71
+ Object.assign(value, definitions.profileDefault.patch);
72
+ row.profileDefault = "propose-profile";
73
+ }
74
+ else
75
+ row.profileDefault = "preserve-explicit";
76
+ }
77
+ if (!registryValue(value, key).valid)
78
+ return { ...row, state: "field-policy-required" };
79
+ const next = value;
80
+ row.changedFields = Object.keys(key === CHANNEL_DEFAULTS_KEY ? DEFAULT_FIELDS : CHANNEL_FIELDS).filter((field) => {
81
+ const before = Object.hasOwn(current, field), after = Object.hasOwn(next, field);
82
+ return before !== after || (before && after && canonicalJson(current[field]) !== canonicalJson(next[field]));
83
+ });
84
+ if (row.changedFields.length === 0)
85
+ return { ...row, state: "observed-fields-match" };
86
+ return { ...row, state: "patch-differs", candidate: { expectedRevision: observation.revision, value } };
87
+ });
88
+ return {
89
+ kind: "space-initialization-diff",
90
+ space, registry: definitions.registry, rows,
91
+ scope: "existing-row native seed/profile comparison; private revision candidates are not accepted write plans",
92
+ registryFieldPolicy: "closed-native-fields",
93
+ revisionGuardsApplied: false,
94
+ connectionAuthorityChecked: false,
95
+ absenceAuthoritativelyProven: false,
96
+ applyPermitted: false,
97
+ writes: [],
98
+ };
99
+ }
100
+ //# sourceMappingURL=space-initialization-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-initialization-diff.js","sourceRoot":"","sources":["../src/space-initialization-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type KvEntry } from "@nats-io/kv";
2
+ import type { NatsConnection } from "@nats-io/transport-node";
3
+ import { type ChannelRegistryFile } from "./channels.js";
4
+ import type { ChannelConfig, ChannelDefaults, DeliveryClass } from "./types.js";
5
+ export interface SpaceInitializationReadPort {
6
+ readonly bucket: string;
7
+ readonly stream: string;
8
+ readonly get: (key: string) => Promise<KvEntry | null>;
9
+ }
10
+ /** Bind the selected existing registry on this connection through the public native API.
11
+ * No bucket creation or stream override. Names are not server/account or write authority. */
12
+ export declare function spaceInitializationReadPort(nc: NatsConnection, space: string): Promise<SpaceInitializationReadPort>;
13
+ /** Values are private planning data and can contain model-facing text. Never serialize these
14
+ * rows wholesale into public diagnostics, operation receipts or an authority artifact. */
15
+ export type SpaceInitializationObservation = {
16
+ key: string;
17
+ operation: "kv-get";
18
+ } & ({
19
+ state: "present";
20
+ revision: number;
21
+ value: ChannelConfig | ChannelDefaults;
22
+ } | {
23
+ state: "observed-tombstone";
24
+ revision: number;
25
+ marker: "DEL" | "PURGE";
26
+ } | {
27
+ state: "reported-not-found" | "registry-unavailable" | "permission-denied" | "target-mismatch" | "observation-failed" | "not-observed-budget";
28
+ });
29
+ export declare function validateSpaceInitializationInputs(deliveryClass: DeliveryClass, seed?: ChannelRegistryFile): void;
30
+ /** Observe only the requested seed keys and defaults. Native validation precedes reads. The
31
+ * five-second/8 MiB budget leaves unvisited rows explicit; expiry does not cancel an in-flight
32
+ * request. The caller retains connection custody. No row absence authorizes creation. */
33
+ export declare function observeSpaceInitialization(reads: SpaceInitializationReadPort, space: string, deliveryClass: DeliveryClass, seed?: ChannelRegistryFile): Promise<{
34
+ kind: "space-initialization-observations";
35
+ space: string;
36
+ registry: {
37
+ bucket: string;
38
+ stream: string;
39
+ };
40
+ observations: SpaceInitializationObservation[];
41
+ scope: "provided registry handle and requested keys; observations can be stale and are not a revision-guarded write plan";
42
+ byteBudget: number;
43
+ deadlineMs: number;
44
+ deadlineReached: boolean;
45
+ fullFieldPolicyApplied: false;
46
+ readerRequestCancellationEstablished: false;
47
+ connectionAuthorityChecked: false;
48
+ absenceAuthoritativelyProven: false;
49
+ applyPermitted: false;
50
+ writes: readonly [];
51
+ }>;
52
+ //# sourceMappingURL=space-initialization-observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-initialization-observation.d.ts","sourceRoot":"","sources":["../src/space-initialization-observation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAkD,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACxD;AAED;8FAC8F;AAC9F,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAIzH;AAED;2FAC2F;AAC3F,MAAM,MAAM,8BAA8B,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,CAAA;CAAE,GAAG,CAChF;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CAAA;CAAE,GAC9E;IAAE,KAAK,EAAE,oBAAoB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,oBAAoB,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,qBAAqB,CAAA;CAAE,CACpJ,CAAC;AAMF,wBAAgB,iCAAiC,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAkBhH;AAED;;0FAE0F;AAC1F,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;GAgD3J"}
@@ -0,0 +1,133 @@
1
+ import { Kvm } from "@nats-io/kv";
2
+ import { CHANNEL_DEFAULTS_KEY, channelBucket, isConcreteChannel } from "./subjects.js";
3
+ import { validateChannelConfig, validateChannelDefaults } from "./channels.js";
4
+ import { spaceInitializationDefinitions } from "./space-resource-definitions.js";
5
+ import { spaceSchemaReadFailure } from "./space-schema-observation.js";
6
+ /** Bind the selected existing registry on this connection through the public native API.
7
+ * No bucket creation or stream override. Names are not server/account or write authority. */
8
+ export async function spaceInitializationReadPort(nc, space) {
9
+ const bucket = channelBucket(space), stream = `KV_${bucket}`;
10
+ const kv = await new Kvm(nc).open(bucket);
11
+ return Object.freeze({ bucket, stream, get: (key) => kv.get(key) });
12
+ }
13
+ function object(value) {
14
+ return value !== null && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+ export function validateSpaceInitializationInputs(deliveryClass, seed) {
17
+ try {
18
+ if (deliveryClass !== "live" && deliveryClass !== "durable")
19
+ throw new Error();
20
+ validateChannelDefaults({ deliveryClass });
21
+ if (seed === undefined)
22
+ return;
23
+ if (!object(seed) || Object.keys(seed).some((key) => key !== "defaults" && key !== "channels"))
24
+ throw new Error();
25
+ if (seed.defaults !== undefined) {
26
+ if (!object(seed.defaults))
27
+ throw new Error();
28
+ validateChannelDefaults(seed.defaults);
29
+ }
30
+ if (seed.channels !== undefined) {
31
+ if (!object(seed.channels) || Object.keys(seed.channels).length > 1024)
32
+ throw new Error();
33
+ for (const [key, patch] of Object.entries(seed.channels)) {
34
+ if (key === CHANNEL_DEFAULTS_KEY || !isConcreteChannel(key) || !object(patch))
35
+ throw new Error();
36
+ validateChannelConfig(patch);
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ throw new Error("initialization observation requires valid native profile/patch inputs and at most 1024 concrete nonreserved channel keys; no registry read was attempted");
42
+ }
43
+ }
44
+ /** Observe only the requested seed keys and defaults. Native validation precedes reads. The
45
+ * five-second/8 MiB budget leaves unvisited rows explicit; expiry does not cancel an in-flight
46
+ * request. The caller retains connection custody. No row absence authorizes creation. */
47
+ export async function observeSpaceInitialization(reads, space, deliveryClass, seed) {
48
+ validateSpaceInitializationInputs(deliveryClass, seed);
49
+ const definitions = spaceInitializationDefinitions(space, deliveryClass, seed);
50
+ if (reads.bucket !== definitions.registry.bucket || reads.stream !== definitions.registry.stream)
51
+ throw new Error("initialization read-port target does not match the selected registry; no key was read");
52
+ const keys = [...new Set([...definitions.seed.entries.map((entry) => entry.key), definitions.profileDefault.key])];
53
+ const observations = [];
54
+ const deadline = performance.now() + 5000, decoder = new TextDecoder("utf-8", { fatal: true });
55
+ let bytes = 0, deadlineReached = false;
56
+ for (const key of keys) {
57
+ const row = { key, operation: "kv-get" }, remaining = deadline - performance.now();
58
+ if (remaining <= 0)
59
+ deadlineReached = true;
60
+ if (deadlineReached || bytes >= 8 * 1024 * 1024) {
61
+ observations.push({ ...row, state: "not-observed-budget" });
62
+ continue;
63
+ }
64
+ let timer;
65
+ try {
66
+ const result = await Promise.race([
67
+ reads.get(key).then((entry) => ({ kind: "read", entry })),
68
+ new Promise((resolve) => { timer = setTimeout(() => resolve({ kind: "deadline" }), remaining); }),
69
+ ]);
70
+ if (result.kind === "deadline") {
71
+ deadlineReached = true;
72
+ observations.push({ ...row, state: "observation-failed" });
73
+ continue;
74
+ }
75
+ const entry = result.entry;
76
+ if (entry === null) {
77
+ observations.push({ ...row, state: "reported-not-found" });
78
+ continue;
79
+ }
80
+ if (entry.bucket !== reads.bucket || entry.key !== key) {
81
+ observations.push({ ...row, state: "target-mismatch" });
82
+ continue;
83
+ }
84
+ if (!Number.isSafeInteger(entry.revision) || entry.revision <= 0) {
85
+ observations.push({ ...row, state: "observation-failed" });
86
+ continue;
87
+ }
88
+ if (entry.operation === "DEL" || entry.operation === "PURGE") {
89
+ observations.push({ ...row, state: "observed-tombstone", revision: entry.revision, marker: entry.operation });
90
+ continue;
91
+ }
92
+ if (entry.operation !== "PUT" || !(entry.value instanceof Uint8Array)) {
93
+ observations.push({ ...row, state: "observation-failed" });
94
+ continue;
95
+ }
96
+ bytes += entry.value.byteLength;
97
+ if (entry.value.byteLength > 65536 || bytes > 8 * 1024 * 1024) {
98
+ observations.push({ ...row, state: "observation-failed" });
99
+ continue;
100
+ }
101
+ const value = JSON.parse(decoder.decode(entry.value));
102
+ if (!object(value)) {
103
+ observations.push({ ...row, state: "observation-failed" });
104
+ continue;
105
+ }
106
+ if (key === CHANNEL_DEFAULTS_KEY)
107
+ validateChannelDefaults(value);
108
+ else
109
+ validateChannelConfig(value);
110
+ observations.push({ ...row, state: "present", revision: entry.revision, value });
111
+ }
112
+ catch (error) {
113
+ const state = spaceSchemaReadFailure(error);
114
+ observations.push({ ...row, state: state === "reported-not-found" ? "registry-unavailable" : state });
115
+ }
116
+ finally {
117
+ clearTimeout(timer);
118
+ }
119
+ }
120
+ return {
121
+ kind: "space-initialization-observations",
122
+ space, registry: definitions.registry, observations,
123
+ scope: "provided registry handle and requested keys; observations can be stale and are not a revision-guarded write plan",
124
+ byteBudget: 8 * 1024 * 1024, deadlineMs: 5000, deadlineReached,
125
+ fullFieldPolicyApplied: false,
126
+ readerRequestCancellationEstablished: false,
127
+ connectionAuthorityChecked: false,
128
+ absenceAuthoritativelyProven: false,
129
+ applyPermitted: false,
130
+ writes: [],
131
+ };
132
+ }
133
+ //# sourceMappingURL=space-initialization-observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-initialization-observation.js","sourceRoot":"","sources":["../src/space-initialization-observation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { type StreamConfig } from "@nats-io/jetstream";
2
+ import { type Kvm } from "@nats-io/kv";
3
+ import type { Objm } from "@nats-io/obj";
4
+ import { type ChannelRegistryFile } from "./channels.js";
5
+ import type { DeliveryClass } from "./types.js";
6
+ import { type EndpointStreamOptions } from "./endpoint-binding.js";
7
+ export type SpaceResourceDefinition = {
8
+ kind: "stream";
9
+ stream: string;
10
+ config: Partial<StreamConfig> & {
11
+ name: string;
12
+ };
13
+ verification: "canonical-backup" | "declared-fields" | "contract";
14
+ } | {
15
+ kind: "kv";
16
+ stream: string;
17
+ bucket: string;
18
+ createOptions: NonNullable<Parameters<Kvm["create"]>[1]>;
19
+ hardenAfterCreate?: Partial<StreamConfig>;
20
+ verification: "native-runtime-check-required" | "records" | "auth" | "sessions" | "issued" | "admission";
21
+ } | {
22
+ kind: "object-store";
23
+ stream: string;
24
+ bucket: string;
25
+ createOptions: NonNullable<Parameters<Objm["create"]>[1]>;
26
+ verification: "artifact";
27
+ };
28
+ /** Project only explicit public KV/object option fields used by native bootstrap. No SDK
29
+ * default, private constructor or unspecified option is expanded into an observed fact. */
30
+ export declare function explicitSpaceResourceFields(resource: SpaceResourceDefinition): {
31
+ config: Partial<StreamConfig> & {
32
+ name: string;
33
+ };
34
+ unexpanded: string[];
35
+ };
36
+ /** Only public scalar KV input defaults. No constructor, server feature probe or effective
37
+ * stream-default expansion is performed. Unsupported public defaults fail closed. */
38
+ export declare function nativeKvScalarInputDefaults(): Partial<StreamConfig>;
39
+ /** Desired first-party configuration for one explicit native STREAM.CREATE. Store subjects,
40
+ * public scalar options and hardening share the bootstrap definitions; hardening is present at
41
+ * creation, not applied after adopting an existing bucket. This is never a repair/update plan. */
42
+ export declare function spaceResourceCreationConfig(resource: SpaceResourceDefinition): Partial<StreamConfig> & {
43
+ name: string;
44
+ };
45
+ /** Collect the native bootstrap inputs without opening a connection or deriving SDK defaults.
46
+ * Definitions describe creation, not safe updates: authority and artifact verifiers still own
47
+ * their guards. Neither this value nor its hardening fields authorize provisioning or repair. */
48
+ export declare function spaceResourceDefinitions(space: string, options?: EndpointStreamOptions): {
49
+ kind: "native-space-resource-definitions";
50
+ space: string;
51
+ resources: SpaceResourceDefinition[];
52
+ scope: "native creation inputs; not an ordered mutation plan or full effective schema";
53
+ pendingPolicy: readonly ["full-effective-field-policy", "registry-seed", "default-delivery", "observation-classification", "reconciliation-allowlist", "privileged-apply"];
54
+ completeSpaceSchema: false;
55
+ sdkDefaultsExpanded: false;
56
+ connectionAuthorityChecked: false;
57
+ absenceAuthoritativelyProven: false;
58
+ applyPermitted: false;
59
+ writes: readonly [];
60
+ };
61
+ /** Describe native seed/profile precedence without deciding that any row may be written.
62
+ * The caller supplies the deployment profile; no missing daemon or credential selects it.
63
+ * Revision-bound observation, validation and guarded application remain separate work. */
64
+ export declare function spaceInitializationDefinitions(space: string, deliveryClass: DeliveryClass, seed?: ChannelRegistryFile): {
65
+ kind: "native-space-initialization-definitions";
66
+ space: string;
67
+ registry: {
68
+ bucket: string;
69
+ stream: string;
70
+ };
71
+ seed: {
72
+ entries: import("./channels.js").ChannelRegistrySeedEntry[];
73
+ merge: "specified-fields-overwrite-existing";
74
+ };
75
+ profileDefault: {
76
+ key: string;
77
+ patch: import("./types.js").ChannelDefaults;
78
+ condition: "deliveryClass-is-absent";
79
+ };
80
+ order: "seed-before-profile-default; explicit-existing-class-wins";
81
+ scope: "native patch inputs and precedence; not observed rows or a revision-bound write plan";
82
+ observationsComplete: false;
83
+ applyPermitted: false;
84
+ writes: readonly [];
85
+ };
86
+ //# sourceMappingURL=space-resource-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-resource-definitions.d.ts","sourceRoot":"","sources":["../src/space-resource-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAqB,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAA2D,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAW/B,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,YAAY,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,UAAU,CAAA;CAAE,GACvJ;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAAC,YAAY,EAAE,+BAA+B,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAA;CAAE,GAC7P;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,YAAY,EAAE,UAAU,CAAA;CAAE,CAAC;AAElJ;4FAC4F;AAC5F,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,uBAAuB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBzJ;AAGD;sFACsF;AACtF,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,YAAY,CAAC,CAInE;AAED;;mGAEmG;AACnG,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAUvH;AAED;;kGAEkG;AAClG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B;;;;;;;;;;;;EAmC1F;AAED;;2FAE2F;AAC3F,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;EAarH"}
@@ -0,0 +1,133 @@
1
+ import { DiscardPolicy } from "@nats-io/jetstream";
2
+ import { defaultBucketOpts } from "@nats-io/kv";
3
+ import { nanos } from "@nats-io/transport-node";
4
+ import { spaceStreamCreationBase } from "./backup-config.js";
5
+ import { CHANNEL_DEFAULTS_KEY, channelBucket, objectStoreStream } from "./subjects.js";
6
+ import { channelDeliveryDefaultPatch, channelRegistrySeedEntries } from "./channels.js";
7
+ import { endpointAuthorityStoreDefinitions, endpointContractStreamConfig, endpointDataStreamConfigs, endpointSessionStoreDefinition, } from "./endpoint-binding.js";
8
+ import { issuedStoreDefinitions } from "./issued-authority.js";
9
+ import { admissionStoreDefinition } from "./run-admission.js";
10
+ import { artifactStoreDefinition, membershipStoreDefinition, spaceMessageStreamConfigs, spaceRegistryStreamConfigs, ttlBuckets, } from "./streams.js";
11
+ /** Project only explicit public KV/object option fields used by native bootstrap. No SDK
12
+ * default, private constructor or unspecified option is expanded into an observed fact. */
13
+ export function explicitSpaceResourceFields(resource) {
14
+ if (resource.kind === "stream")
15
+ return { config: resource.config, unexpanded: [] };
16
+ const config = { name: resource.stream, subjects: resource.kind === "kv" ? [`$KV.${resource.bucket}.>`] : [`$O.${resource.bucket}.C.>`, `$O.${resource.bucket}.M.>`] };
17
+ const unexpanded = [];
18
+ for (const [field, value] of Object.entries(resource.createOptions)) {
19
+ if (value === undefined)
20
+ continue;
21
+ if (field === "max_bytes" && typeof value === "number" && Number.isFinite(value)) {
22
+ config.max_bytes = value;
23
+ continue;
24
+ }
25
+ if (resource.kind === "kv") {
26
+ if (field === "allow_direct" && typeof value === "boolean") {
27
+ config.allow_direct = value;
28
+ continue;
29
+ }
30
+ if (field === "storage" && (value === "file" || value === "memory")) {
31
+ config.storage = value;
32
+ continue;
33
+ }
34
+ if (field === "history" && typeof value === "number" && Number.isSafeInteger(value) && value > 0) {
35
+ config.max_msgs_per_subject = value;
36
+ continue;
37
+ }
38
+ if (field === "ttl" && typeof value === "number" && Number.isSafeInteger(value) && value >= 0) {
39
+ config.max_age = nanos(value);
40
+ continue;
41
+ }
42
+ if (field === "markerTTL" && typeof value === "number" && Number.isSafeInteger(value) && value > 0) {
43
+ config.allow_msg_ttl = true;
44
+ config.subject_delete_marker_ttl = nanos(value);
45
+ continue;
46
+ }
47
+ }
48
+ unexpanded.push(field);
49
+ }
50
+ return { config: { ...config, ...(resource.kind === "kv" ? resource.hardenAfterCreate : {}), name: resource.stream }, unexpanded };
51
+ }
52
+ /** Only public scalar KV input defaults. No constructor, server feature probe or effective
53
+ * stream-default expansion is performed. Unsupported public defaults fail closed. */
54
+ export function nativeKvScalarInputDefaults() {
55
+ const defaults = defaultBucketOpts();
56
+ if (typeof defaults.history !== "number" || !Number.isSafeInteger(defaults.history) || defaults.history <= 0 || typeof defaults.replicas !== "number" || !Number.isSafeInteger(defaults.replicas) || defaults.replicas <= 0 || typeof defaults.maxValueSize !== "number" || !Number.isFinite(defaults.maxValueSize) || typeof defaults.max_bytes !== "number" || !Number.isFinite(defaults.max_bytes) || defaults.storage !== "file" && defaults.storage !== "memory")
57
+ throw new Error("native KV input defaults do not supply the required supported scalar fields");
58
+ return { max_msgs_per_subject: defaults.history, num_replicas: defaults.replicas, max_msg_size: defaults.maxValueSize, max_bytes: defaults.max_bytes, storage: defaults.storage };
59
+ }
60
+ /** Desired first-party configuration for one explicit native STREAM.CREATE. Store subjects,
61
+ * public scalar options and hardening share the bootstrap definitions; hardening is present at
62
+ * creation, not applied after adopting an existing bucket. This is never a repair/update plan. */
63
+ export function spaceResourceCreationConfig(resource) {
64
+ const fields = explicitSpaceResourceFields(resource);
65
+ if (fields.unexpanded.length || fields.config.name !== resource.stream || !Array.isArray(fields.config.subjects))
66
+ throw new Error("resource creation requires fully mapped native inputs; no unknown option was ignored");
67
+ const base = spaceStreamCreationBase(resource.stream, fields.config.subjects);
68
+ const config = resource.kind === "stream" ? { ...base, ...fields.config }
69
+ : { ...base, discard: DiscardPolicy.New, allow_direct: true, allow_rollup_hdrs: true, ...(resource.kind === "kv" ? nativeKvScalarInputDefaults() : {}), ...fields.config };
70
+ const age = config.max_age, window = config.duplicate_window;
71
+ if (typeof age !== "number" || !Number.isFinite(age) || age < 0 || typeof window !== "number" || !Number.isFinite(window) || window < 0)
72
+ throw new Error("resource creation requires explicit valid age and duplicate-window fields");
73
+ if (age > 0)
74
+ config.duplicate_window = Math.min(window, age);
75
+ return config;
76
+ }
77
+ /** Collect the native bootstrap inputs without opening a connection or deriving SDK defaults.
78
+ * Definitions describe creation, not safe updates: authority and artifact verifiers still own
79
+ * their guards. Neither this value nor its hardening fields authorize provisioning or repair. */
80
+ export function spaceResourceDefinitions(space, options = {}) {
81
+ const streams = [
82
+ ...[...spaceMessageStreamConfigs(space), ...spaceRegistryStreamConfigs(space)].map((config) => ({ config, verification: "canonical-backup" })),
83
+ ...endpointDataStreamConfigs(space, options).map((config) => ({ config, verification: "declared-fields" })),
84
+ { config: endpointContractStreamConfig(space), verification: "contract" },
85
+ ];
86
+ const authority = endpointAuthorityStoreDefinitions(space);
87
+ const buckets = [
88
+ ...ttlBuckets(space).map(([bucket, ttl, storage]) => ({ bucket, createOptions: { ttl, storage }, verification: "native-runtime-check-required" })),
89
+ { ...membershipStoreDefinition(space), verification: "native-runtime-check-required" },
90
+ { ...authority.records, verification: "records" },
91
+ { ...authority.auth, verification: "auth" },
92
+ ...issuedStoreDefinitions(space).map((definition) => ({ ...definition, verification: "issued" })),
93
+ { ...admissionStoreDefinition(space), verification: "admission" },
94
+ { ...endpointSessionStoreDefinition(space), verification: "sessions" },
95
+ ];
96
+ const artifact = artifactStoreDefinition(space);
97
+ const resources = [
98
+ ...streams.map(({ config, verification }) => ({ kind: "stream", stream: config.name, config, verification })),
99
+ ...buckets.map((definition) => ({ kind: "kv", stream: `KV_${definition.bucket}`, ...definition })),
100
+ { kind: "object-store", stream: objectStoreStream(artifact.bucket), ...artifact, verification: "artifact" },
101
+ ];
102
+ return {
103
+ kind: "native-space-resource-definitions",
104
+ space,
105
+ resources,
106
+ scope: "native creation inputs; not an ordered mutation plan or full effective schema",
107
+ pendingPolicy: ["full-effective-field-policy", "registry-seed", "default-delivery", "observation-classification", "reconciliation-allowlist", "privileged-apply"],
108
+ completeSpaceSchema: false,
109
+ sdkDefaultsExpanded: false,
110
+ connectionAuthorityChecked: false,
111
+ absenceAuthoritativelyProven: false,
112
+ applyPermitted: false,
113
+ writes: [],
114
+ };
115
+ }
116
+ /** Describe native seed/profile precedence without deciding that any row may be written.
117
+ * The caller supplies the deployment profile; no missing daemon or credential selects it.
118
+ * Revision-bound observation, validation and guarded application remain separate work. */
119
+ export function spaceInitializationDefinitions(space, deliveryClass, seed) {
120
+ return {
121
+ kind: "native-space-initialization-definitions",
122
+ space,
123
+ registry: { bucket: channelBucket(space), stream: `KV_${channelBucket(space)}` },
124
+ seed: { entries: channelRegistrySeedEntries(seed ?? {}), merge: "specified-fields-overwrite-existing" },
125
+ profileDefault: { key: CHANNEL_DEFAULTS_KEY, patch: channelDeliveryDefaultPatch(deliveryClass), condition: "deliveryClass-is-absent" },
126
+ order: "seed-before-profile-default; explicit-existing-class-wins",
127
+ scope: "native patch inputs and precedence; not observed rows or a revision-bound write plan",
128
+ observationsComplete: false,
129
+ applyPermitted: false,
130
+ writes: [],
131
+ };
132
+ }
133
+ //# sourceMappingURL=space-resource-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-resource-definitions.js","sourceRoot":"","sources":["../src/space-resource-definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type SpaceResourceDefinition } from "./space-resource-definitions.js";
2
+ import { type EndpointStreamOptions } from "./endpoint-binding.js";
3
+ import type { SpaceSchemaObservation } from "./space-schema-observation.js";
4
+ import { type StreamSchemaRow } from "./stream-schema-diff.js";
5
+ export interface SpaceSchemaDiffRow extends Omit<StreamSchemaRow, "state" | "uninspectedFields"> {
6
+ kind: SpaceResourceDefinition["kind"];
7
+ state: StreamSchemaRow["state"] | "native-store-verification-required" | "native-store-invariants-match" | "native-store-verification-unconfirmed" | "unclassified-stream-settings" | "creation-options-policy-required";
8
+ /** Outside the declarative field comparison; a separate native check can inspect more fields. */
9
+ uncomparedFields: string[];
10
+ /** A match covers that native check, not complete effective schema or connection authority. */
11
+ nativeVerification: "not-checked" | "invariants-match" | "not-confirmed";
12
+ nativeInvariantFields: readonly string[];
13
+ unexpandedCreationOptions: readonly string[];
14
+ reconciliation: {
15
+ state: "not-evaluated" | "no-declared-change" | "native-guard-required" | "migration-required";
16
+ nativeGuard: "ttl-enforcement" | "artifact-legacy-cap" | "contract-shadow" | null;
17
+ fields: readonly string[];
18
+ nonAllowlistedFields: readonly string[];
19
+ };
20
+ observedExtraFields: {
21
+ status: "checked" | "not-modeled" | "failed";
22
+ matchesPolicy: string[];
23
+ nondefaultUndeclared: string[];
24
+ unmodeled: string[];
25
+ };
26
+ }
27
+ /** Compare only explicit native stream fields and post-create hardening. KV/object-store
28
+ * creation options are not expanded into guessed SDK/server defaults. Pure native invariant
29
+ * checks run where declared; runtime checks and complete field policy stay separate. No
30
+ * mutating create-or-verify helper, canary, repair or migration is invoked. */
31
+ export declare function diffSpaceResources(space: string, observations: readonly SpaceSchemaObservation[], options?: EndpointStreamOptions): {
32
+ kind: "space-resource-schema-diff";
33
+ space: string;
34
+ rows: SpaceSchemaDiffRow[];
35
+ scope: "explicit stream/public store-option fields, hardening and pure native invariants; unspecified SDK defaults, runtime checks and full field policy remain unestablished";
36
+ pendingPolicy: readonly ["full-effective-field-policy", "registry-seed", "default-delivery", "observation-classification", "reconciliation-allowlist", "privileged-apply"];
37
+ completeSpaceSchema: false;
38
+ sdkDefaultsExpanded: false;
39
+ sdkInputDefaultsUsedForReadPolicy: true;
40
+ connectionAuthorityChecked: false;
41
+ absenceAuthoritativelyProven: false;
42
+ applyPermitted: false;
43
+ writes: readonly [];
44
+ };
45
+ //# sourceMappingURL=space-schema-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-schema-diff.d.ts","sourceRoot":"","sources":["../src/space-schema-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsF,KAAK,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AACnK,OAAO,EAAyG,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAQ1K,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAA2D,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAExH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,mBAAmB,CAAC;IAC9F,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,oCAAoC,GAAG,+BAA+B,GAAG,uCAAuC,GAAG,8BAA8B,GAAG,kCAAkC,CAAC;IACzN,iGAAiG;IACjG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,+FAA+F;IAC/F,kBAAkB,EAAE,aAAa,GAAG,kBAAkB,GAAG,eAAe,CAAC;IACzE,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,cAAc,EAAE;QACd,KAAK,EAAE,eAAe,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;QAC/F,WAAW,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,IAAI,CAAC;QAClF,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1B,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;KACzC,CAAC;IACF,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;QAC7C,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAkGD;;;gFAGgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,sBAAsB,EAAE,EAAE,OAAO,GAAE,qBAA0B;;;;;;;;;;;;;EAgDrI"}