@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
@@ -0,0 +1,106 @@
1
+ import { API_VERSION, GENERATOR_VERSION, GRAPH_VERSION, MANIFEST_VERSION } from "@relkit/contracts";
2
+ import { CandidateVerificationError, } from "./verification-types.js";
3
+ import { requestProbe } from "./verification-http.js";
4
+ export async function requiredProbe(options, path, deadline) {
5
+ const probe = await requestProbe(options, path, deadline);
6
+ if (probe === undefined)
7
+ throw timeoutError();
8
+ assertEnvelope(probe);
9
+ if (!probe.response.ok)
10
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_API_VERSION_UNSUPPORTED", "Candidate does not expose the required internal endpoint.");
11
+ return probe;
12
+ }
13
+ export async function pollHealth(options, path, deadline, accepts) {
14
+ let last;
15
+ while (Date.now() < deadline) {
16
+ const probe = await requestProbe(options, path, deadline);
17
+ if (probe !== undefined) {
18
+ assertEnvelope(probe);
19
+ last = probe;
20
+ if (accepts(probe))
21
+ return probe;
22
+ }
23
+ await delay(Math.min(10, Math.max(1, deadline - Date.now())));
24
+ }
25
+ if (path === "/health/ready" && last !== undefined) {
26
+ const readiness = readinessState(last.payload);
27
+ if (!readiness.environmentReady)
28
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_ENVIRONMENT_NOT_READY", "Candidate environment is not ready.");
29
+ if (!readiness.providerReady)
30
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_PROVIDER_NOT_READY", "Candidate providers are not ready.");
31
+ }
32
+ throw timeoutError();
33
+ }
34
+ export function assertEnvelope(probe) {
35
+ if (probe.payload.protocol !== "relkit.inspector" ||
36
+ probe.payload.version !== API_VERSION ||
37
+ (probe.response.headers.get("x-relkit-api-version") ?? String(API_VERSION)) !==
38
+ String(API_VERSION))
39
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_API_VERSION_UNSUPPORTED", "Candidate does not expose the supported v1 internal API.");
40
+ }
41
+ export function verifyIdentity(payload, expected) {
42
+ const sourceToken = payload.sourceToken;
43
+ const generationToken = payload.generationToken;
44
+ if (sourceToken === undefined && generationToken === undefined)
45
+ return false;
46
+ if (sourceToken !== expected.sourceToken || generationToken !== expected.generationToken)
47
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_GENERATION_MISMATCH", "Candidate health responses identify a different generation.");
48
+ return true;
49
+ }
50
+ export function verifyGraph(payload, options) {
51
+ const graphHash = stringValue(payload.graphHash);
52
+ const manifestGraphHash = stringValue(payload.manifestGraphHash ?? payload.manifestHash);
53
+ if (graphHash !== options.graphHash || manifestGraphHash !== options.graphHash)
54
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_GRAPH_HASH_MISMATCH", "Candidate graph and manifest hashes do not match the expected graph.");
55
+ if (graphHash !== manifestGraphHash)
56
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_GRAPH_HASH_MISMATCH", "Candidate graph and manifest hashes differ.");
57
+ const graphContractVersion = numberValue(payload.graphContractVersion ?? payload.graphVersion);
58
+ const manifestContractVersion = numberValue(payload.manifestContractVersion ?? payload.manifestVersion);
59
+ const manifestGeneratorVersion = numberValue(payload.manifestGeneratorVersion ?? payload.generatorVersion);
60
+ if (graphContractVersion === undefined ||
61
+ graphContractVersion !== (options.graphContractVersion ?? GRAPH_VERSION))
62
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_GRAPH_VERSION_UNSUPPORTED", "Candidate graph contract version is unsupported.");
63
+ if (manifestContractVersion === undefined ||
64
+ manifestContractVersion !== (options.manifestContractVersion ?? MANIFEST_VERSION))
65
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_MANIFEST_VERSION_UNSUPPORTED", "Candidate manifest contract version is unsupported.");
66
+ if (manifestGeneratorVersion === undefined ||
67
+ manifestGeneratorVersion !== (options.manifestGeneratorVersion ?? GENERATOR_VERSION))
68
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_GENERATOR_VERSION_UNSUPPORTED", "Candidate manifest generator version is unsupported.");
69
+ return {
70
+ graphHash,
71
+ manifestGraphHash,
72
+ graphContractVersion,
73
+ manifestContractVersion,
74
+ manifestGeneratorVersion,
75
+ };
76
+ }
77
+ export function readinessState(payload) {
78
+ const environmentReady = readinessValue(payload.environmentReady ?? payload.environment);
79
+ const providerReady = readinessValue(payload.providerReady ?? payload.providersReady ?? payload.providers);
80
+ if (environmentReady === undefined || providerReady === undefined)
81
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_RESPONSE_INVALID", "Candidate readiness did not report environment and provider status.");
82
+ return { environmentReady, providerReady };
83
+ }
84
+ function readinessValue(value) {
85
+ if (typeof value === "boolean")
86
+ return value;
87
+ return isRecord(value) && typeof value.ready === "boolean" ? value.ready : undefined;
88
+ }
89
+ function stringValue(value) {
90
+ if (typeof value !== "string" || value.trim() === "")
91
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_RESPONSE_INVALID", "Candidate health metadata contains an invalid hash.");
92
+ return value;
93
+ }
94
+ function numberValue(value) {
95
+ return typeof value === "number" && Number.isSafeInteger(value) ? value : undefined;
96
+ }
97
+ function isRecord(value) {
98
+ return value !== null && typeof value === "object" && !Array.isArray(value);
99
+ }
100
+ function timeoutError() {
101
+ return new CandidateVerificationError("RELKIT_CANDIDATE_HEALTH_TIMEOUT", "Candidate health checks did not complete before the timeout.");
102
+ }
103
+ function delay(milliseconds) {
104
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
105
+ }
106
+ //# sourceMappingURL=verification-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-probe.js","sourceRoot":"","sources":["../src/verification-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EACL,0BAA0B,GAI3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAqC,EACrC,IAAY,EACZ,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,YAAY,EAAE,CAAC;IAC9C,cAAc,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACpB,MAAM,IAAI,0BAA0B,CAClC,0CAA0C,EAC1C,2DAA2D,CAC5D,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAqC,EACrC,IAAsC,EACtC,QAAgB,EAChB,OAAmD;IAEnD,IAAI,IAAwC,CAAC;IAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,GAAG,KAAK,CAAC;YACb,IAAI,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,gBAAgB;YAC7B,MAAM,IAAI,0BAA0B,CAClC,wCAAwC,EACxC,qCAAqC,CACtC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,aAAa;YAC1B,MAAM,IAAI,0BAA0B,CAClC,qCAAqC,EACrC,oCAAoC,CACrC,CAAC;IACN,CAAC;IACD,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA6B;IAC1D,IACE,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,kBAAkB;QAC7C,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,WAAW;QACrC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;YACzE,MAAM,CAAC,WAAW,CAAC;QAErB,MAAM,IAAI,0BAA0B,CAClC,0CAA0C,EAC1C,0DAA0D,CAC3D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgC,EAChC,QAAkC;IAElC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAChD,IAAI,WAAW,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,WAAW,KAAK,QAAQ,CAAC,WAAW,IAAI,eAAe,KAAK,QAAQ,CAAC,eAAe;QACtF,MAAM,IAAI,0BAA0B,CAClC,sCAAsC,EACtC,6DAA6D,CAC9D,CAAC;IACJ,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAgC,EAChC,OAAqC;IAKrC,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACzF,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,iBAAiB,KAAK,OAAO,CAAC,SAAS;QAC5E,MAAM,IAAI,0BAA0B,CAClC,sCAAsC,EACtC,sEAAsE,CACvE,CAAC;IACJ,IAAI,SAAS,KAAK,iBAAiB;QACjC,MAAM,IAAI,0BAA0B,CAClC,sCAAsC,EACtC,6CAA6C,CAC9C,CAAC;IACJ,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/F,MAAM,uBAAuB,GAAG,WAAW,CACzC,OAAO,CAAC,uBAAuB,IAAI,OAAO,CAAC,eAAe,CAC3D,CAAC;IACF,MAAM,wBAAwB,GAAG,WAAW,CAC1C,OAAO,CAAC,wBAAwB,IAAI,OAAO,CAAC,gBAAgB,CAC7D,CAAC;IACF,IACE,oBAAoB,KAAK,SAAS;QAClC,oBAAoB,KAAK,CAAC,OAAO,CAAC,oBAAoB,IAAI,aAAa,CAAC;QAExE,MAAM,IAAI,0BAA0B,CAClC,4CAA4C,EAC5C,kDAAkD,CACnD,CAAC;IACJ,IACE,uBAAuB,KAAK,SAAS;QACrC,uBAAuB,KAAK,CAAC,OAAO,CAAC,uBAAuB,IAAI,gBAAgB,CAAC;QAEjF,MAAM,IAAI,0BAA0B,CAClC,+CAA+C,EAC/C,qDAAqD,CACtD,CAAC;IACJ,IACE,wBAAwB,KAAK,SAAS;QACtC,wBAAwB,KAAK,CAAC,OAAO,CAAC,wBAAwB,IAAI,iBAAiB,CAAC;QAEpF,MAAM,IAAI,0BAA0B,CAClC,gDAAgD,EAChD,sDAAsD,CACvD,CAAC;IACJ,OAAO;QACL,SAAS;QACT,iBAAiB;QACjB,oBAAoB;QACpB,uBAAuB;QACvB,wBAAwB;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgC;IAI7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,cAAc,CAClC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,SAAS,CACrE,CAAC;IACF,IAAI,gBAAgB,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;QAC/D,MAAM,IAAI,0BAA0B,CAClC,mCAAmC,EACnC,qEAAqE,CACtE,CAAC;IACJ,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAClD,MAAM,IAAI,0BAA0B,CAClC,mCAAmC,EACnC,qDAAqD,CACtD,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,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;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,0BAA0B,CACnC,iCAAiC,EACjC,8DAA8D,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { API_VERSION } from "@relkit/contracts";
2
+ import type { SupervisorCandidateToken } from "./state-machine-types.js";
3
+ export declare const DEFAULT_CANDIDATE_HEALTH_TIMEOUT_MS = 10000;
4
+ export type CandidateVerificationCode = "RELKIT_CANDIDATE_API_VERSION_UNSUPPORTED" | "RELKIT_CANDIDATE_GENERATION_MISMATCH" | "RELKIT_CANDIDATE_GRAPH_VERSION_UNSUPPORTED" | "RELKIT_CANDIDATE_MANIFEST_VERSION_UNSUPPORTED" | "RELKIT_CANDIDATE_GENERATOR_VERSION_UNSUPPORTED" | "RELKIT_CANDIDATE_GRAPH_HASH_MISMATCH" | "RELKIT_CANDIDATE_ENVIRONMENT_NOT_READY" | "RELKIT_CANDIDATE_PROVIDER_NOT_READY" | "RELKIT_CANDIDATE_RESPONSE_INVALID" | "RELKIT_CANDIDATE_HEALTH_TIMEOUT";
5
+ export declare class CandidateVerificationError extends Error {
6
+ readonly code: CandidateVerificationCode;
7
+ constructor(code: CandidateVerificationCode, message: string);
8
+ }
9
+ export interface CandidateVerificationCandidate {
10
+ readonly port: number;
11
+ readonly token: SupervisorCandidateToken;
12
+ readonly dispose?: () => Promise<void>;
13
+ }
14
+ export interface CandidateVerificationOptions {
15
+ readonly candidate: CandidateVerificationCandidate;
16
+ readonly graphHash: string;
17
+ readonly graphContractVersion?: number;
18
+ readonly manifestContractVersion?: number;
19
+ readonly manifestGeneratorVersion?: number;
20
+ readonly hostname?: string;
21
+ readonly healthTimeoutMs?: number;
22
+ readonly signal?: AbortSignal;
23
+ readonly fetch?: typeof fetch;
24
+ }
25
+ export interface CandidateVerificationResult {
26
+ readonly token: SupervisorCandidateToken;
27
+ readonly graphHash: string;
28
+ readonly manifestGraphHash: string;
29
+ readonly graphContractVersion: number;
30
+ readonly manifestContractVersion: number;
31
+ readonly manifestGeneratorVersion: number;
32
+ readonly apiVersion: typeof API_VERSION;
33
+ readonly environmentReady: true;
34
+ readonly providerReady: true;
35
+ }
36
+ export interface CandidateProbeResponse {
37
+ readonly response: Response;
38
+ readonly payload: Record<string, unknown>;
39
+ }
40
+ //# sourceMappingURL=verification-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-types.d.ts","sourceRoot":"","sources":["../src/verification-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAE1D,MAAM,MAAM,yBAAyB,GACjC,0CAA0C,GAC1C,sCAAsC,GACtC,4CAA4C,GAC5C,+CAA+C,GAC/C,gDAAgD,GAChD,sCAAsC,GACtC,wCAAwC,GACxC,qCAAqC,GACrC,mCAAmC,GACnC,iCAAiC,CAAC;AAEtC,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;gBAE7B,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM;CAK7D;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,OAAO,WAAW,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,11 @@
1
+ import { API_VERSION } from "@relkit/contracts";
2
+ export const DEFAULT_CANDIDATE_HEALTH_TIMEOUT_MS = 10_000;
3
+ export class CandidateVerificationError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(`${code}: ${message}`);
7
+ this.name = "CandidateVerificationError";
8
+ this.code = code;
9
+ }
10
+ }
11
+ //# sourceMappingURL=verification-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-types.js","sourceRoot":"","sources":["../src/verification-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,MAAM,mCAAmC,GAAG,MAAM,CAAC;AAc1D,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,CAA4B;IAEzC,YAAY,IAA+B,EAAE,OAAe;QAC1D,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { type CandidateVerificationOptions, type CandidateVerificationResult } from "./verification-types.js";
2
+ export * from "./verification-types.js";
3
+ /** Verifies a started candidate before the state machine is allowed to switch it in. */
4
+ export declare function verifyCandidate(options: CandidateVerificationOptions): Promise<CandidateVerificationResult>;
5
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAC;AAEjC,cAAc,yBAAyB,CAAC;AAExC,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CA2CtC"}
@@ -0,0 +1,54 @@
1
+ import { API_VERSION } from "@relkit/contracts";
2
+ import { pollHealth, readinessState, requiredProbe, verifyGraph, verifyIdentity, } from "./verification-probe.js";
3
+ import { CandidateVerificationError, DEFAULT_CANDIDATE_HEALTH_TIMEOUT_MS, } from "./verification-types.js";
4
+ export * from "./verification-types.js";
5
+ /** Verifies a started candidate before the state machine is allowed to switch it in. */
6
+ export async function verifyCandidate(options) {
7
+ const timeout = options.healthTimeoutMs ?? DEFAULT_CANDIDATE_HEALTH_TIMEOUT_MS;
8
+ validateOptions(options, timeout);
9
+ const deadline = Date.now() + timeout;
10
+ let identitySeen = false;
11
+ try {
12
+ const live = await pollHealth(options, "/health/live", deadline, (probe) => {
13
+ identitySeen ||= verifyIdentity(probe.payload, options.candidate.token);
14
+ return probe.response.ok && probe.payload.status === "ok";
15
+ });
16
+ identitySeen ||= verifyIdentity(live.payload, options.candidate.token);
17
+ const graph = await requiredProbe(options, "/graph", deadline);
18
+ identitySeen ||= verifyIdentity(graph.payload, options.candidate.token);
19
+ const graphValues = verifyGraph(graph.payload, options);
20
+ const ready = await pollHealth(options, "/health/ready", deadline, (probe) => {
21
+ identitySeen ||= verifyIdentity(probe.payload, options.candidate.token);
22
+ const readiness = readinessState(probe.payload);
23
+ return (probe.response.ok &&
24
+ probe.payload.status === "ready" &&
25
+ readiness.environmentReady &&
26
+ readiness.providerReady);
27
+ });
28
+ identitySeen ||= verifyIdentity(ready.payload, options.candidate.token);
29
+ if (!identitySeen)
30
+ throw new CandidateVerificationError("RELKIT_CANDIDATE_RESPONSE_INVALID", "Candidate health responses did not identify their generation.");
31
+ return Object.freeze({
32
+ token: options.candidate.token,
33
+ ...graphValues,
34
+ apiVersion: API_VERSION,
35
+ environmentReady: true,
36
+ providerReady: true,
37
+ });
38
+ }
39
+ catch (error) {
40
+ await options.candidate.dispose?.().catch(() => undefined);
41
+ throw error;
42
+ }
43
+ }
44
+ function validateOptions(options, timeout) {
45
+ if (!Number.isSafeInteger(options.candidate.port) || options.candidate.port < 1)
46
+ throw new TypeError("Candidate verification requires a valid backend port.");
47
+ if (options.graphHash.trim() === "")
48
+ throw new TypeError("Candidate graph hash is required.");
49
+ if (!Number.isSafeInteger(timeout) || timeout < 1)
50
+ throw new RangeError("healthTimeoutMs must be a positive safe integer.");
51
+ if (options.signal?.aborted)
52
+ throw options.signal.reason ?? new Error("Verification was aborted.");
53
+ }
54
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { SupervisorCandidateToken } from "./state-machine-types.js";
2
+ import type { SupervisorStateMachine } from "./state-machine.js";
3
+ export interface SupervisorSourceChange {
4
+ readonly version: number;
5
+ readonly changedFiles?: readonly string[];
6
+ }
7
+ export interface SupervisorCompileRequest {
8
+ readonly token: SupervisorCandidateToken;
9
+ readonly version: number;
10
+ readonly changedFiles: readonly string[];
11
+ readonly signal: AbortSignal;
12
+ readonly isCurrent: () => boolean;
13
+ }
14
+ export type SupervisorCompile = (request: SupervisorCompileRequest) => void | PromiseLike<void>;
15
+ export interface SupervisorWatcherOptions {
16
+ readonly compile: SupervisorCompile;
17
+ readonly debounceMs?: number;
18
+ readonly stateMachine?: SupervisorStateMachine;
19
+ }
20
+ /** Coalesces source changes and protects the state machine from stale compiles. */
21
+ export declare class SupervisorWatcher {
22
+ readonly stateMachine: SupervisorStateMachine;
23
+ private readonly compile;
24
+ private readonly debounceMs;
25
+ private latestVersion;
26
+ private pending;
27
+ private active;
28
+ private activeRun;
29
+ private timer;
30
+ private disposed;
31
+ constructor(options: SupervisorWatcherOptions);
32
+ get version(): number | undefined;
33
+ /** Accepts a source version and schedules only the newest accepted batch. */
34
+ notify(change: SupervisorSourceChange): SupervisorCandidateToken | undefined;
35
+ sourceChanged(change: SupervisorSourceChange): SupervisorCandidateToken | undefined;
36
+ /** Starts pending work immediately and waits for superseded work to settle. */
37
+ flush(): Promise<void>;
38
+ /** Aborts current compilation and makes its token unable to complete successfully. */
39
+ dispose(): void;
40
+ private schedule;
41
+ private startPending;
42
+ private runCompile;
43
+ private isCurrent;
44
+ private clearTimer;
45
+ private assertOpen;
46
+ }
47
+ export declare function createSupervisorWatcher(options: SupervisorWatcherOptions): SupervisorWatcher;
48
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;CAChD;AAaD,mFAAmF;AACnF,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,wBAAwB;IAS7C,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,wBAAwB,GAAG,SAAS;IAiB5E,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,wBAAwB,GAAG,SAAS;IAInF,+EAA+E;IACzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,sFAAsF;IACtF,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,QAAQ;YAQF,YAAY;YAYZ,UAAU;IAoBxB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;CAGnB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAE5F"}
@@ -0,0 +1,135 @@
1
+ import { createSupervisorStateMachine } from "./state-machine.js";
2
+ /** Coalesces source changes and protects the state machine from stale compiles. */
3
+ export class SupervisorWatcher {
4
+ stateMachine;
5
+ compile;
6
+ debounceMs;
7
+ latestVersion;
8
+ pending;
9
+ active;
10
+ activeRun;
11
+ timer;
12
+ disposed = false;
13
+ constructor(options) {
14
+ if (!Number.isFinite(options.debounceMs ?? 0) || (options.debounceMs ?? 0) < 0) {
15
+ throw new RangeError("Supervisor watcher debounce must be a non-negative number.");
16
+ }
17
+ this.stateMachine = options.stateMachine ?? createSupervisorStateMachine();
18
+ this.compile = options.compile;
19
+ this.debounceMs = options.debounceMs ?? 0;
20
+ }
21
+ get version() {
22
+ return this.latestVersion;
23
+ }
24
+ /** Accepts a source version and schedules only the newest accepted batch. */
25
+ notify(change) {
26
+ this.assertOpen();
27
+ validateVersion(change.version);
28
+ if (this.latestVersion !== undefined && change.version < this.latestVersion)
29
+ return undefined;
30
+ const token = this.stateMachine.requestSourceChange();
31
+ this.latestVersion = change.version;
32
+ this.pending = {
33
+ token,
34
+ version: change.version,
35
+ changedFiles: mergeFiles(this.pending?.changedFiles, change.changedFiles),
36
+ };
37
+ this.active?.controller.abort(new Error("Source changed before compilation completed."));
38
+ this.schedule();
39
+ return token;
40
+ }
41
+ sourceChanged(change) {
42
+ return this.notify(change);
43
+ }
44
+ /** Starts pending work immediately and waits for superseded work to settle. */
45
+ async flush() {
46
+ this.clearTimer();
47
+ while (!this.disposed && (this.pending !== undefined || this.activeRun !== undefined)) {
48
+ if (this.activeRun !== undefined)
49
+ await this.activeRun;
50
+ if (this.activeRun === undefined && this.pending !== undefined)
51
+ await this.startPending();
52
+ }
53
+ }
54
+ /** Aborts current compilation and makes its token unable to complete successfully. */
55
+ dispose() {
56
+ if (this.disposed)
57
+ return;
58
+ this.disposed = true;
59
+ this.clearTimer();
60
+ const token = this.pending?.token ?? this.active?.token;
61
+ if (token !== undefined)
62
+ this.stateMachine.compileFailed(token, "Supervisor watcher disposed.");
63
+ this.pending = undefined;
64
+ this.active?.controller.abort(new Error("Supervisor watcher disposed."));
65
+ }
66
+ schedule() {
67
+ this.clearTimer();
68
+ this.timer = setTimeout(() => {
69
+ this.timer = undefined;
70
+ void this.startPending();
71
+ }, this.debounceMs);
72
+ }
73
+ async startPending() {
74
+ if (this.disposed || this.active !== undefined || this.pending === undefined)
75
+ return;
76
+ const pending = this.pending;
77
+ this.pending = undefined;
78
+ const controller = new AbortController();
79
+ const active = { token: pending.token, controller };
80
+ this.active = active;
81
+ const run = this.runCompile(pending, controller);
82
+ this.activeRun = run;
83
+ await run;
84
+ }
85
+ async runCompile(pending, controller) {
86
+ try {
87
+ await this.compile({
88
+ token: pending.token,
89
+ version: pending.version,
90
+ changedFiles: pending.changedFiles,
91
+ signal: controller.signal,
92
+ isCurrent: () => this.isCurrent(pending),
93
+ });
94
+ this.stateMachine.compileSucceeded(pending.token);
95
+ }
96
+ catch (error) {
97
+ this.stateMachine.compileFailed(pending.token, error);
98
+ }
99
+ finally {
100
+ if (this.active?.token === pending.token) {
101
+ this.active = undefined;
102
+ this.activeRun = undefined;
103
+ }
104
+ }
105
+ }
106
+ isCurrent(pending) {
107
+ const candidate = this.stateMachine.snapshot().candidate;
108
+ return (!this.disposed &&
109
+ this.latestVersion === pending.version &&
110
+ candidate?.sourceToken === pending.token.sourceToken &&
111
+ candidate.generationToken === pending.token.generationToken);
112
+ }
113
+ clearTimer() {
114
+ if (this.timer === undefined)
115
+ return;
116
+ clearTimeout(this.timer);
117
+ this.timer = undefined;
118
+ }
119
+ assertOpen() {
120
+ if (this.disposed)
121
+ throw new Error("Supervisor watcher is disposed.");
122
+ }
123
+ }
124
+ export function createSupervisorWatcher(options) {
125
+ return new SupervisorWatcher(options);
126
+ }
127
+ function validateVersion(version) {
128
+ if (!Number.isSafeInteger(version) || version < 0) {
129
+ throw new TypeError("Supervisor source versions must be non-negative safe integers.");
130
+ }
131
+ }
132
+ function mergeFiles(previous, current) {
133
+ return Object.freeze([...new Set([...(previous ?? []), ...(current ?? [])])]);
134
+ }
135
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@relkit/supervisor",
3
+ "version": "0.0.0",
4
+ "description": "Unsupported internal RELKIT process supervisor; use @relkit/cli.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/rel-kit/relkit.git",
9
+ "directory": "packages/supervisor"
10
+ },
11
+ "homepage": "https://github.com/rel-kit/relkit#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/rel-kit/relkit/issues"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "engines": {
22
+ "bun": ">=1.3.10"
23
+ },
24
+ "type": "module",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "dependencies": {
32
+ "@relkit/contracts": "0.0.0",
33
+ "@relkit/observability": "0.0.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -b",
37
+ "check": "tsc -b --pretty false",
38
+ "typecheck": "tsc -b --pretty false"
39
+ }
40
+ }