@relkit/supervisor 0.0.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/candidate-output.d.ts +4 -0
  4. package/dist/candidate-output.d.ts.map +1 -0
  5. package/dist/candidate-output.js +60 -0
  6. package/dist/candidate-output.js.map +1 -0
  7. package/dist/candidate-process.d.ts +19 -0
  8. package/dist/candidate-process.d.ts.map +1 -0
  9. package/dist/candidate-process.js +105 -0
  10. package/dist/candidate-process.js.map +1 -0
  11. package/dist/candidate-types.d.ts +56 -0
  12. package/dist/candidate-types.d.ts.map +1 -0
  13. package/dist/candidate-types.js +2 -0
  14. package/dist/candidate-types.js.map +1 -0
  15. package/dist/candidate.d.ts +10 -0
  16. package/dist/candidate.d.ts.map +1 -0
  17. package/dist/candidate.js +116 -0
  18. package/dist/candidate.js.map +1 -0
  19. package/dist/drain-cleanup.d.ts +8 -0
  20. package/dist/drain-cleanup.d.ts.map +1 -0
  21. package/dist/drain-cleanup.js +28 -0
  22. package/dist/drain-cleanup.js.map +1 -0
  23. package/dist/drain-state.d.ts +4 -0
  24. package/dist/drain-state.d.ts.map +1 -0
  25. package/dist/drain-state.js +26 -0
  26. package/dist/drain-state.js.map +1 -0
  27. package/dist/drain-types.d.ts +61 -0
  28. package/dist/drain-types.d.ts.map +1 -0
  29. package/dist/drain-types.js +2 -0
  30. package/dist/drain-types.js.map +1 -0
  31. package/dist/drain.d.ts +35 -0
  32. package/dist/drain.d.ts.map +1 -0
  33. package/dist/drain.js +178 -0
  34. package/dist/drain.js.map +1 -0
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +9 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/observability-records.d.ts +9 -0
  40. package/dist/observability-records.d.ts.map +1 -0
  41. package/dist/observability-records.js +71 -0
  42. package/dist/observability-records.js.map +1 -0
  43. package/dist/observability-types.d.ts +18 -0
  44. package/dist/observability-types.d.ts.map +1 -0
  45. package/dist/observability-types.js +2 -0
  46. package/dist/observability-types.js.map +1 -0
  47. package/dist/observability.d.ts +5 -0
  48. package/dist/observability.d.ts.map +1 -0
  49. package/dist/observability.js +46 -0
  50. package/dist/observability.js.map +1 -0
  51. package/dist/proxy-forward.d.ts +5 -0
  52. package/dist/proxy-forward.d.ts.map +1 -0
  53. package/dist/proxy-forward.js +43 -0
  54. package/dist/proxy-forward.js.map +1 -0
  55. package/dist/proxy.d.ts +45 -0
  56. package/dist/proxy.d.ts.map +1 -0
  57. package/dist/proxy.js +125 -0
  58. package/dist/proxy.js.map +1 -0
  59. package/dist/state-machine-telemetry.d.ts +14 -0
  60. package/dist/state-machine-telemetry.d.ts.map +1 -0
  61. package/dist/state-machine-telemetry.js +79 -0
  62. package/dist/state-machine-telemetry.js.map +1 -0
  63. package/dist/state-machine-types.d.ts +53 -0
  64. package/dist/state-machine-types.d.ts.map +1 -0
  65. package/dist/state-machine-types.js +30 -0
  66. package/dist/state-machine-types.js.map +1 -0
  67. package/dist/state-machine.d.ts +36 -0
  68. package/dist/state-machine.d.ts.map +1 -0
  69. package/dist/state-machine.js +144 -0
  70. package/dist/state-machine.js.map +1 -0
  71. package/dist/verification-http.d.ts +4 -0
  72. package/dist/verification-http.d.ts.map +1 -0
  73. package/dist/verification-http.js +49 -0
  74. package/dist/verification-http.js.map +1 -0
  75. package/dist/verification-probe.d.ts +12 -0
  76. package/dist/verification-probe.d.ts.map +1 -0
  77. package/dist/verification-probe.js +106 -0
  78. package/dist/verification-probe.js.map +1 -0
  79. package/dist/verification-types.d.ts +40 -0
  80. package/dist/verification-types.d.ts.map +1 -0
  81. package/dist/verification-types.js +11 -0
  82. package/dist/verification-types.js.map +1 -0
  83. package/dist/verification.d.ts +5 -0
  84. package/dist/verification.d.ts.map +1 -0
  85. package/dist/verification.js +54 -0
  86. package/dist/verification.js.map +1 -0
  87. package/dist/watcher.d.ts +48 -0
  88. package/dist/watcher.d.ts.map +1 -0
  89. package/dist/watcher.js +135 -0
  90. package/dist/watcher.js.map +1 -0
  91. package/package.json +40 -0
package/dist/proxy.js ADDED
@@ -0,0 +1,125 @@
1
+ import { drainResponse, forwardProxyRequest } from "./proxy-forward.js";
2
+ import { validateSupervisorToken } from "./state-machine-telemetry.js";
3
+ export { forwardProxyRequest } from "./proxy-forward.js";
4
+ export const DEFAULT_SUPERVISOR_HOSTNAME = "127.0.0.1";
5
+ export const DEFAULT_SUPERVISOR_PORT = 3_000;
6
+ /** Stable development listener that synchronously selects one active target per request. */
7
+ export class SupervisorProxy {
8
+ hostname;
9
+ configuredPort;
10
+ targetHostname;
11
+ fetcher;
12
+ track;
13
+ server;
14
+ stopping;
15
+ target;
16
+ constructor(options = {}) {
17
+ this.hostname = options.hostname ?? DEFAULT_SUPERVISOR_HOSTNAME;
18
+ this.configuredPort = validatePort(options.port ?? DEFAULT_SUPERVISOR_PORT, true);
19
+ this.targetHostname = options.targetHostname ?? DEFAULT_SUPERVISOR_HOSTNAME;
20
+ validateHostname(this.hostname, "hostname");
21
+ validateHostname(this.targetHostname, "targetHostname");
22
+ this.fetcher = options.fetch ?? fetch;
23
+ this.track = options.track;
24
+ }
25
+ get port() {
26
+ return this.server?.port ?? this.configuredPort;
27
+ }
28
+ get url() {
29
+ return this.server?.url;
30
+ }
31
+ get activeTarget() {
32
+ return this.target;
33
+ }
34
+ async listen() {
35
+ if (this.server !== undefined)
36
+ return this;
37
+ if (this.stopping !== undefined)
38
+ await this.stopping;
39
+ this.server = Bun.serve({
40
+ hostname: this.hostname,
41
+ port: this.configuredPort,
42
+ fetch: (request) => this.handle(request),
43
+ });
44
+ return this;
45
+ }
46
+ /** Replaces the target only when the expected active token still matches. */
47
+ compareAndSwitch(expected, next) {
48
+ if (this.stopping !== undefined)
49
+ return false;
50
+ const current = this.target;
51
+ if (!sameToken(current?.token, expected))
52
+ return false;
53
+ const normalized = normalizeTarget(next, this.targetHostname);
54
+ if (current !== undefined &&
55
+ (normalized.token.sourceToken <= current.token.sourceToken ||
56
+ normalized.token.generationToken <= current.token.generationToken))
57
+ return false;
58
+ this.target = normalized;
59
+ return true;
60
+ }
61
+ switchTarget(next, expected = this.target?.token) {
62
+ return this.compareAndSwitch(expected, next);
63
+ }
64
+ /** Reads the active reference before awaiting, so switched traffic cannot select a retired target. */
65
+ handle(request) {
66
+ const target = this.target;
67
+ if (target === undefined)
68
+ return Promise.resolve(new Response(JSON.stringify({ error: "No active RelKit generation." }), {
69
+ status: 503,
70
+ headers: { "cache-control": "no-store", "content-type": "application/json" },
71
+ }));
72
+ const lease = this.track?.(target.token);
73
+ if (this.track !== undefined && lease === undefined)
74
+ return Promise.resolve(drainResponse());
75
+ try {
76
+ return forwardProxyRequest(request, target, this.fetcher, lease).finally(() => lease?.release());
77
+ }
78
+ catch (error) {
79
+ lease?.release();
80
+ return Promise.reject(error);
81
+ }
82
+ }
83
+ stop() {
84
+ this.target = undefined;
85
+ const server = this.server;
86
+ this.server = undefined;
87
+ if (server === undefined)
88
+ return this.stopping ?? Promise.resolve();
89
+ this.stopping = server.stop().finally(() => {
90
+ this.stopping = undefined;
91
+ });
92
+ return this.stopping;
93
+ }
94
+ }
95
+ export function createSupervisorProxy(options = {}) {
96
+ return new SupervisorProxy(options);
97
+ }
98
+ function normalizeTarget(target, defaultHostname) {
99
+ validateSupervisorToken(target.token);
100
+ const port = validatePort(target.port, false);
101
+ const hostname = target.hostname ?? defaultHostname;
102
+ validateHostname(hostname, "target hostname");
103
+ return Object.freeze({
104
+ token: Object.freeze({ ...target.token }),
105
+ hostname,
106
+ port,
107
+ });
108
+ }
109
+ function sameToken(current, expected) {
110
+ return current === undefined
111
+ ? expected === undefined
112
+ : expected !== undefined &&
113
+ current.sourceToken === expected.sourceToken &&
114
+ current.generationToken === expected.generationToken;
115
+ }
116
+ function validatePort(port, allowZero) {
117
+ if (!Number.isSafeInteger(port) || port < (allowZero ? 0 : 1) || port > 65_535)
118
+ throw new RangeError("Supervisor proxy ports must be between 1 and 65535.");
119
+ return port;
120
+ }
121
+ function validateHostname(hostname, name) {
122
+ if (hostname.trim() === "" || /[\s/:]/.test(hostname))
123
+ throw new TypeError(`Supervisor proxy ${name} must be a hostname.`);
124
+ }
125
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SupervisorCandidateToken, SupervisorOutcomeName, SupervisorPhase, SupervisorState, SupervisorTelemetry, SupervisorTelemetryListener } from "./state-machine-types.js";
2
+ export declare class SupervisorTelemetryLog {
3
+ private sequence;
4
+ private readonly events;
5
+ private readonly listeners;
6
+ constructor(listener?: SupervisorTelemetryListener);
7
+ get records(): readonly SupervisorTelemetry[];
8
+ subscribe(listener: SupervisorTelemetryListener): () => void;
9
+ transition(from: SupervisorState, to: SupervisorState, token: SupervisorCandidateToken): void;
10
+ outcome(phase: SupervisorPhase, outcome: SupervisorOutcomeName, token: SupervisorCandidateToken, reason?: unknown, returnState?: SupervisorState, previousGeneration?: SupervisorCandidateToken): void;
11
+ private emit;
12
+ }
13
+ export declare function validateSupervisorToken(token: SupervisorCandidateToken): void;
14
+ //# sourceMappingURL=state-machine-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-telemetry.d.ts","sourceRoot":"","sources":["../src/state-machine-telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EAErB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAElC,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;gBAExD,QAAQ,CAAC,EAAE,2BAA2B;IAIlD,IAAI,OAAO,IAAI,SAAS,mBAAmB,EAAE,CAE5C;IAED,SAAS,CAAC,QAAQ,EAAE,2BAA2B,GAAG,MAAM,IAAI;IAK5D,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,wBAAwB,GAAG,IAAI;IAW7F,OAAO,CACL,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,wBAAwB,EAC/B,MAAM,CAAC,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,eAAe,EAC7B,kBAAkB,CAAC,EAAE,wBAAwB,GAC5C,IAAI;IAgBP,OAAO,CAAC,IAAI;CAUb;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAO7E"}
@@ -0,0 +1,79 @@
1
+ export class SupervisorTelemetryLog {
2
+ sequence = 0;
3
+ events = [];
4
+ listeners = new Set();
5
+ constructor(listener) {
6
+ if (listener !== undefined)
7
+ this.listeners.add(listener);
8
+ }
9
+ get records() {
10
+ return this.events.slice();
11
+ }
12
+ subscribe(listener) {
13
+ this.listeners.add(listener);
14
+ return () => this.listeners.delete(listener);
15
+ }
16
+ transition(from, to, token) {
17
+ this.emit({
18
+ type: "transition",
19
+ sequence: ++this.sequence,
20
+ from,
21
+ to,
22
+ sourceToken: token.sourceToken,
23
+ generationToken: token.generationToken,
24
+ });
25
+ }
26
+ outcome(phase, outcome, token, reason, returnState, previousGeneration) {
27
+ const error = reason === undefined ? undefined : errorDetails(reason);
28
+ const event = {
29
+ type: "outcome",
30
+ sequence: ++this.sequence,
31
+ phase,
32
+ outcome,
33
+ sourceToken: token.sourceToken,
34
+ generationToken: token.generationToken,
35
+ ...(previousGeneration === undefined ? {} : { previousGeneration }),
36
+ ...(returnState === undefined ? {} : { returnState }),
37
+ ...(error === undefined ? {} : { error }),
38
+ };
39
+ this.emit(event);
40
+ }
41
+ emit(event) {
42
+ this.events.push(Object.freeze(event));
43
+ for (const listener of this.listeners) {
44
+ try {
45
+ listener(event);
46
+ }
47
+ catch {
48
+ // Telemetry consumers must not change lifecycle behavior.
49
+ }
50
+ }
51
+ }
52
+ }
53
+ export function validateSupervisorToken(token) {
54
+ if (!Number.isSafeInteger(token.sourceToken) || token.sourceToken < 1) {
55
+ throw new TypeError("Supervisor source tokens must be positive safe integers.");
56
+ }
57
+ if (!Number.isSafeInteger(token.generationToken) || token.generationToken < 1) {
58
+ throw new TypeError("Supervisor generation tokens must be positive safe integers.");
59
+ }
60
+ }
61
+ function errorDetails(reason) {
62
+ if (reason instanceof Error) {
63
+ const code = "code" in reason && typeof reason.code === "string" ? reason.code : undefined;
64
+ return { ...(code === undefined ? {} : { code }), message: reason.message };
65
+ }
66
+ if (typeof reason === "string")
67
+ return { message: reason };
68
+ if (typeof reason === "object" && reason !== null && "message" in reason) {
69
+ const value = reason;
70
+ if (typeof value.message === "string") {
71
+ return {
72
+ ...(typeof value.code === "string" ? { code: value.code } : {}),
73
+ message: value.message,
74
+ };
75
+ }
76
+ }
77
+ return { message: "Candidate lifecycle operation failed." };
78
+ }
79
+ //# sourceMappingURL=state-machine-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-telemetry.js","sourceRoot":"","sources":["../src/state-machine-telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export declare const SUPERVISOR_STATES: readonly ["idle", "compiling-candidate", "starting-candidate", "verifying-hash-and-readiness", "switching", "draining-previous", "active"];
2
+ export type SupervisorState = (typeof SUPERVISOR_STATES)[number];
3
+ export type SupervisorPhase = "compile" | "start" | "verification" | "switch" | "drain";
4
+ export type SupervisorOutcomeName = "compile-succeeded" | "compile-failed" | "start-succeeded" | "start-failed" | "verification-succeeded" | "verification-failed" | "switch-succeeded" | "switch-failed" | "drain-succeeded" | "drain-failed" | "candidate-stale";
5
+ export interface SupervisorCandidateToken {
6
+ readonly sourceToken: number;
7
+ readonly generationToken: number;
8
+ }
9
+ export interface SupervisorTransitionTelemetry {
10
+ readonly type: "transition";
11
+ readonly sequence: number;
12
+ readonly from: SupervisorState;
13
+ readonly to: SupervisorState;
14
+ readonly sourceToken: number;
15
+ readonly generationToken: number;
16
+ }
17
+ export interface SupervisorOutcomeTelemetry {
18
+ readonly type: "outcome";
19
+ readonly sequence: number;
20
+ readonly phase: SupervisorPhase;
21
+ readonly outcome: SupervisorOutcomeName;
22
+ readonly sourceToken: number;
23
+ readonly generationToken: number;
24
+ readonly previousGeneration?: SupervisorCandidateToken;
25
+ readonly returnState?: SupervisorState;
26
+ readonly error?: {
27
+ readonly code?: string;
28
+ readonly message: string;
29
+ };
30
+ }
31
+ export type SupervisorTelemetry = SupervisorTransitionTelemetry | SupervisorOutcomeTelemetry;
32
+ export type SupervisorTelemetryListener = (event: SupervisorTelemetry) => void;
33
+ export interface SupervisorStateSnapshot {
34
+ readonly state: SupervisorState;
35
+ readonly sourceToken: number;
36
+ readonly generationToken: number;
37
+ readonly candidate: SupervisorCandidateToken | undefined;
38
+ readonly activeGeneration: SupervisorCandidateToken | undefined;
39
+ readonly previousGeneration: SupervisorCandidateToken | undefined;
40
+ }
41
+ export interface SupervisorStateMachineOptions {
42
+ readonly activeGeneration?: SupervisorCandidateToken;
43
+ readonly onTelemetry?: SupervisorTelemetryListener;
44
+ }
45
+ export type SupervisorCandidatePhase = Exclude<SupervisorPhase, "switch" | "drain">;
46
+ export interface SupervisorCandidateStep {
47
+ readonly expected: SupervisorState;
48
+ readonly next: SupervisorState;
49
+ readonly success: SupervisorOutcomeName;
50
+ readonly failure: SupervisorOutcomeName;
51
+ }
52
+ export declare const SUPERVISOR_CANDIDATE_STEPS: Record<SupervisorCandidatePhase, SupervisorCandidateStep>;
53
+ //# sourceMappingURL=state-machine-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-types.d.ts","sourceRoot":"","sources":["../src/state-machine-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,4IAQpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AACxF,MAAM,MAAM,qBAAqB,GAC7B,mBAAmB,GACnB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,wBAAwB,GACxB,qBAAqB,GACrB,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,cAAc,GACd,iBAAiB,CAAC;AAEtB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IACvD,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,MAAM,MAAM,mBAAmB,GAAG,6BAA6B,GAAG,0BAA0B,CAAC;AAC7F,MAAM,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,kBAAkB,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACnE;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC;CACpD;AAED,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,eAAe,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;AACpF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;CACzC;AACD,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,wBAAwB,EAAE,uBAAuB,CAoB9F,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const SUPERVISOR_STATES = [
2
+ "idle",
3
+ "compiling-candidate",
4
+ "starting-candidate",
5
+ "verifying-hash-and-readiness",
6
+ "switching",
7
+ "draining-previous",
8
+ "active",
9
+ ];
10
+ export const SUPERVISOR_CANDIDATE_STEPS = {
11
+ compile: {
12
+ expected: "compiling-candidate",
13
+ next: "starting-candidate",
14
+ success: "compile-succeeded",
15
+ failure: "compile-failed",
16
+ },
17
+ start: {
18
+ expected: "starting-candidate",
19
+ next: "verifying-hash-and-readiness",
20
+ success: "start-succeeded",
21
+ failure: "start-failed",
22
+ },
23
+ verification: {
24
+ expected: "verifying-hash-and-readiness",
25
+ next: "switching",
26
+ success: "verification-succeeded",
27
+ failure: "verification-failed",
28
+ },
29
+ };
30
+ //# sourceMappingURL=state-machine-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-types.js","sourceRoot":"","sources":["../src/state-machine-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,qBAAqB;IACrB,oBAAoB;IACpB,8BAA8B;IAC9B,WAAW;IACX,mBAAmB;IACnB,QAAQ;CACA,CAAC;AAmEX,MAAM,CAAC,MAAM,0BAA0B,GACrC;IACE,OAAO,EAAE;QACP,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,gBAAgB;KAC1B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,oBAAoB;QAC9B,IAAI,EAAE,8BAA8B;QACpC,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,cAAc;KACxB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,8BAA8B;QACxC,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE,qBAAqB;KAC/B;CACF,CAAC"}
@@ -0,0 +1,36 @@
1
+ export * from "./state-machine-types.js";
2
+ import { type SupervisorCandidateToken, type SupervisorState, type SupervisorStateMachineOptions, type SupervisorStateSnapshot, type SupervisorTelemetry, type SupervisorTelemetryListener } from "./state-machine-types.js";
3
+ /** Pure lifecycle state and token coordination for candidate activation. */
4
+ export declare class SupervisorStateMachine {
5
+ private currentState;
6
+ private sourceSequence;
7
+ private generationSequence;
8
+ private candidate;
9
+ private activeGeneration;
10
+ private previousGeneration;
11
+ private readonly telemetryLog;
12
+ constructor(options?: SupervisorStateMachineOptions);
13
+ get state(): SupervisorState;
14
+ get sourceToken(): number;
15
+ get generationToken(): number;
16
+ get telemetry(): readonly SupervisorTelemetry[];
17
+ snapshot(): SupervisorStateSnapshot;
18
+ subscribe(listener: SupervisorTelemetryListener): () => void;
19
+ requestSourceChange(): SupervisorCandidateToken;
20
+ compileSucceeded(token: SupervisorCandidateToken): boolean;
21
+ compileFailed(token: SupervisorCandidateToken, reason: unknown): boolean;
22
+ startSucceeded(token: SupervisorCandidateToken): boolean;
23
+ startFailed(token: SupervisorCandidateToken, reason: unknown): boolean;
24
+ verificationSucceeded(token: SupervisorCandidateToken): boolean;
25
+ verificationFailed(token: SupervisorCandidateToken, reason: unknown): boolean;
26
+ switchSucceeded(token: SupervisorCandidateToken): boolean;
27
+ switchFailed(token: SupervisorCandidateToken, reason: unknown): boolean;
28
+ drainSucceeded(token: SupervisorCandidateToken): boolean;
29
+ drainFailed(token: SupervisorCandidateToken, reason: unknown): boolean;
30
+ private finishCandidate;
31
+ private finishDrain;
32
+ private check;
33
+ private transition;
34
+ }
35
+ export declare function createSupervisorStateMachine(options?: SupervisorStateMachineOptions): SupervisorStateMachine;
36
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,KAAK,wBAAwB,EAI7B,KAAK,eAAe,EACpB,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAIlC,4EAA4E;AAC5E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;gBAE1C,OAAO,GAAE,6BAAkC;IAYvD,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,SAAS,IAAI,SAAS,mBAAmB,EAAE,CAE9C;IAED,QAAQ,IAAI,uBAAuB;IAWnC,SAAS,CAAC,QAAQ,EAAE,2BAA2B,GAAG,MAAM,IAAI;IAI5D,mBAAmB,IAAI,wBAAwB;IAU/C,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO;IAI1D,aAAa,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAIxE,cAAc,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO;IAIxD,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAItE,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO;IAI/D,kBAAkB,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAI7E,eAAe,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO;IAWzD,YAAY,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAIvE,cAAc,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO;IAIxD,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAItE,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,KAAK;IAuBb,OAAO,CAAC,UAAU;CAKnB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,CAExB"}
@@ -0,0 +1,144 @@
1
+ export * from "./state-machine-types.js";
2
+ import {} from "./state-machine-types.js";
3
+ import { SUPERVISOR_CANDIDATE_STEPS } from "./state-machine-types.js";
4
+ import { SupervisorTelemetryLog, validateSupervisorToken } from "./state-machine-telemetry.js";
5
+ /** Pure lifecycle state and token coordination for candidate activation. */
6
+ export class SupervisorStateMachine {
7
+ currentState;
8
+ sourceSequence = 0;
9
+ generationSequence = 0;
10
+ candidate;
11
+ activeGeneration;
12
+ previousGeneration;
13
+ telemetryLog;
14
+ constructor(options = {}) {
15
+ const active = options.activeGeneration;
16
+ if (active !== undefined) {
17
+ validateSupervisorToken(active);
18
+ this.activeGeneration = Object.freeze({ ...active });
19
+ this.sourceSequence = active.sourceToken;
20
+ this.generationSequence = active.generationToken;
21
+ }
22
+ this.currentState = this.activeGeneration === undefined ? "idle" : "active";
23
+ this.telemetryLog = new SupervisorTelemetryLog(options.onTelemetry);
24
+ }
25
+ get state() {
26
+ return this.currentState;
27
+ }
28
+ get sourceToken() {
29
+ return this.sourceSequence;
30
+ }
31
+ get generationToken() {
32
+ return this.generationSequence;
33
+ }
34
+ get telemetry() {
35
+ return this.telemetryLog.records;
36
+ }
37
+ snapshot() {
38
+ return Object.freeze({
39
+ state: this.currentState,
40
+ sourceToken: this.sourceSequence,
41
+ generationToken: this.generationSequence,
42
+ candidate: this.candidate,
43
+ activeGeneration: this.activeGeneration,
44
+ previousGeneration: this.previousGeneration,
45
+ });
46
+ }
47
+ subscribe(listener) {
48
+ return this.telemetryLog.subscribe(listener);
49
+ }
50
+ requestSourceChange() {
51
+ const token = Object.freeze({
52
+ sourceToken: ++this.sourceSequence,
53
+ generationToken: ++this.generationSequence,
54
+ });
55
+ this.candidate = token;
56
+ this.transition("compiling-candidate", token);
57
+ return token;
58
+ }
59
+ compileSucceeded(token) {
60
+ return this.finishCandidate(token, "compile", true);
61
+ }
62
+ compileFailed(token, reason) {
63
+ return this.finishCandidate(token, "compile", false, reason);
64
+ }
65
+ startSucceeded(token) {
66
+ return this.finishCandidate(token, "start", true);
67
+ }
68
+ startFailed(token, reason) {
69
+ return this.finishCandidate(token, "start", false, reason);
70
+ }
71
+ verificationSucceeded(token) {
72
+ return this.finishCandidate(token, "verification", true);
73
+ }
74
+ verificationFailed(token, reason) {
75
+ return this.finishCandidate(token, "verification", false, reason);
76
+ }
77
+ switchSucceeded(token) {
78
+ if (!this.check(token, "switching", "switch"))
79
+ return false;
80
+ const previous = this.activeGeneration;
81
+ this.telemetryLog.outcome("switch", "switch-succeeded", token, undefined, undefined, previous);
82
+ this.activeGeneration = token;
83
+ this.candidate = undefined;
84
+ this.previousGeneration = previous;
85
+ this.transition(previous === undefined ? "active" : "draining-previous", token);
86
+ return true;
87
+ }
88
+ switchFailed(token, reason) {
89
+ return this.finishCandidate(token, "switch", false, reason);
90
+ }
91
+ drainSucceeded(token) {
92
+ return this.finishDrain(token, "drain-succeeded");
93
+ }
94
+ drainFailed(token, reason) {
95
+ return this.finishDrain(token, "drain-failed", reason);
96
+ }
97
+ finishCandidate(token, phase, success, reason) {
98
+ const step = phase === "switch" ? undefined : SUPERVISOR_CANDIDATE_STEPS[phase];
99
+ const expected = step?.expected ?? "switching";
100
+ if (!this.check(token, expected, phase))
101
+ return false;
102
+ const next = success
103
+ ? (step?.next ?? "active")
104
+ : this.activeGeneration === undefined
105
+ ? "idle"
106
+ : "active";
107
+ this.telemetryLog.outcome(phase, success ? (step?.success ?? "switch-succeeded") : (step?.failure ?? "switch-failed"), token, reason, success ? undefined : next);
108
+ if (!success)
109
+ this.candidate = undefined;
110
+ this.transition(next, token);
111
+ return true;
112
+ }
113
+ finishDrain(token, outcome, reason) {
114
+ if (!this.check(token, "draining-previous", "drain", "active"))
115
+ return false;
116
+ const previous = this.previousGeneration;
117
+ this.telemetryLog.outcome("drain", outcome, token, reason, undefined, previous);
118
+ this.previousGeneration = undefined;
119
+ this.transition("active", token);
120
+ return true;
121
+ }
122
+ check(token, expected, phase, owner = "candidate") {
123
+ validateSupervisorToken(token);
124
+ const current = owner === "candidate" ? this.candidate : this.activeGeneration;
125
+ if (current?.sourceToken !== token.sourceToken ||
126
+ current.generationToken !== token.generationToken) {
127
+ this.telemetryLog.outcome(phase, "candidate-stale", token);
128
+ return false;
129
+ }
130
+ if (this.currentState !== expected) {
131
+ throw new Error(`Supervisor cannot transition from ${this.currentState}; expected ${expected}.`);
132
+ }
133
+ return true;
134
+ }
135
+ transition(to, token) {
136
+ const from = this.currentState;
137
+ this.currentState = to;
138
+ this.telemetryLog.transition(from, to, token);
139
+ }
140
+ }
141
+ export function createSupervisorStateMachine(options) {
142
+ return new SupervisorStateMachine(options);
143
+ }
144
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CandidateProbeResponse, CandidateVerificationOptions } from "./verification-types.js";
2
+ /** Performs one bounded v1 probe without allowing a stalled backend to block activation. */
3
+ export declare function requestProbe(options: CandidateVerificationOptions, path: string, deadline: number): Promise<CandidateProbeResponse | undefined>;
4
+ //# sourceMappingURL=verification-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-http.d.ts","sourceRoot":"","sources":["../src/verification-http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAGpG,4FAA4F;AAC5F,wBAAsB,YAAY,CAChC,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAwC7C"}
@@ -0,0 +1,49 @@
1
+ import { API_BASE_PATH } from "@relkit/contracts";
2
+ import { CandidateVerificationError } from "./verification-types.js";
3
+ /** Performs one bounded v1 probe without allowing a stalled backend to block activation. */
4
+ export async function requestProbe(options, path, deadline) {
5
+ if (options.signal?.aborted)
6
+ throw options.signal.reason ?? new Error("Verification was aborted.");
7
+ const remaining = deadline - Date.now();
8
+ if (remaining <= 0)
9
+ return undefined;
10
+ const controller = new AbortController();
11
+ const forwardAbort = () => controller.abort(options.signal?.reason);
12
+ options.signal?.addEventListener("abort", forwardAbort, { once: true });
13
+ let timer;
14
+ const fetcher = options.fetch ?? fetch;
15
+ const url = `http://${options.hostname ?? "127.0.0.1"}:${options.candidate.port}${API_BASE_PATH}${path}`;
16
+ const responsePromise = fetcher(url, {
17
+ signal: controller.signal,
18
+ })
19
+ .then(async (response) => {
20
+ const payload = await response.json();
21
+ if (!isRecord(payload))
22
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_RESPONSE_INVALID", "Candidate health response must be a JSON object.");
23
+ return { response, payload };
24
+ })
25
+ .catch((error) => {
26
+ if (error instanceof CandidateVerificationError)
27
+ throw error;
28
+ return undefined;
29
+ });
30
+ const timeoutPromise = new Promise((resolve) => {
31
+ timer = setTimeout(() => {
32
+ controller.abort();
33
+ resolve(undefined);
34
+ }, remaining);
35
+ });
36
+ try {
37
+ return await Promise.race([responsePromise, timeoutPromise]);
38
+ }
39
+ finally {
40
+ if (timer !== undefined)
41
+ clearTimeout(timer);
42
+ options.signal?.removeEventListener("abort", forwardAbort);
43
+ controller.abort();
44
+ }
45
+ }
46
+ function isRecord(value) {
47
+ return value !== null && typeof value === "object" && !Array.isArray(value);
48
+ }
49
+ //# sourceMappingURL=verification-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-http.js","sourceRoot":"","sources":["../src/verification-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAqC,EACrC,IAAY,EACZ,QAAgB;IAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;QACzB,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,KAAgD,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU,OAAO,CAAC,QAAQ,IAAI,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,EAAE,CAAC;IACzG,MAAM,eAAe,GAAgD,OAAO,CAAC,GAAG,EAAE;QAChF,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;SACC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAA+C,EAAE;QACpE,MAAM,OAAO,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpB,MAAM,IAAI,0BAA0B,CAClC,mCAAmC,EACnC,kDAAkD,CACnD,CAAC;QACJ,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,YAAY,0BAA0B;YAAE,MAAM,KAAK,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IACL,MAAM,cAAc,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACxD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3D,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type CandidateProbeResponse, type CandidateVerificationOptions, type CandidateVerificationResult } from "./verification-types.js";
2
+ import type { SupervisorCandidateToken } from "./state-machine-types.js";
3
+ export declare function requiredProbe(options: CandidateVerificationOptions, path: string, deadline: number): Promise<CandidateProbeResponse>;
4
+ export declare function pollHealth(options: CandidateVerificationOptions, path: "/health/live" | "/health/ready", deadline: number, accepts: (probe: CandidateProbeResponse) => boolean): Promise<CandidateProbeResponse>;
5
+ export declare function assertEnvelope(probe: CandidateProbeResponse): void;
6
+ export declare function verifyIdentity(payload: Record<string, unknown>, expected: SupervisorCandidateToken): boolean;
7
+ export declare function verifyGraph(payload: Record<string, unknown>, options: CandidateVerificationOptions): Omit<CandidateVerificationResult, "token" | "apiVersion" | "environmentReady" | "providerReady">;
8
+ export declare function readinessState(payload: Record<string, unknown>): {
9
+ readonly environmentReady: boolean;
10
+ readonly providerReady: boolean;
11
+ };
12
+ //# sourceMappingURL=verification-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-probe.d.ts","sourceRoot":"","sources":["../src/verification-probe.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGzE,wBAAsB,aAAa,CACjC,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CAUjC;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,cAAc,GAAG,eAAe,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,GAClD,OAAO,CAAC,sBAAsB,CAAC,CAyBjC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAWlE;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,wBAAwB,GACjC,OAAO,CAUT;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,4BAA4B,GACpC,IAAI,CACL,2BAA2B,EAC3B,OAAO,GAAG,YAAY,GAAG,kBAAkB,GAAG,eAAe,CAC9D,CAmDA;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAChE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC,CAWA"}