@qitqode/qitqore 0.0.0-stage → 0.2.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -2
  3. package/dist/device-authorization.d.ts +67 -0
  4. package/dist/device-authorization.d.ts.map +1 -0
  5. package/dist/device-authorization.js +122 -0
  6. package/dist/device-authorization.js.map +1 -0
  7. package/dist/errors.d.ts +77 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +254 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +13 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +13 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/recovery-capabilities.d.ts +26 -0
  16. package/dist/recovery-capabilities.d.ts.map +1 -0
  17. package/dist/recovery-capabilities.js +113 -0
  18. package/dist/recovery-capabilities.js.map +1 -0
  19. package/dist/recovery-directive.d.ts +20 -0
  20. package/dist/recovery-directive.d.ts.map +1 -0
  21. package/dist/recovery-directive.js +116 -0
  22. package/dist/recovery-directive.js.map +1 -0
  23. package/dist/recovery-lease.d.ts +80 -0
  24. package/dist/recovery-lease.d.ts.map +1 -0
  25. package/dist/recovery-lease.js +257 -0
  26. package/dist/recovery-lease.js.map +1 -0
  27. package/dist/recovery-status.d.ts +22 -0
  28. package/dist/recovery-status.d.ts.map +1 -0
  29. package/dist/recovery-status.js +113 -0
  30. package/dist/recovery-status.js.map +1 -0
  31. package/dist/recovery.d.ts +48 -0
  32. package/dist/recovery.d.ts.map +1 -0
  33. package/dist/recovery.js +145 -0
  34. package/dist/recovery.js.map +1 -0
  35. package/dist/redaction.d.ts +64 -0
  36. package/dist/redaction.d.ts.map +1 -0
  37. package/dist/redaction.js +154 -0
  38. package/dist/redaction.js.map +1 -0
  39. package/dist/route-contract.d.ts +36 -0
  40. package/dist/route-contract.d.ts.map +1 -0
  41. package/dist/route-contract.js +89 -0
  42. package/dist/route-contract.js.map +1 -0
  43. package/dist/sse.d.ts +22 -0
  44. package/dist/sse.d.ts.map +1 -0
  45. package/dist/sse.js +156 -0
  46. package/dist/sse.js.map +1 -0
  47. package/dist/stream-payload.d.ts +39 -0
  48. package/dist/stream-payload.d.ts.map +1 -0
  49. package/dist/stream-payload.js +86 -0
  50. package/dist/stream-payload.js.map +1 -0
  51. package/dist/transport.d.ts +44 -0
  52. package/dist/transport.d.ts.map +1 -0
  53. package/dist/transport.js +260 -0
  54. package/dist/transport.js.map +1 -0
  55. package/package.json +38 -4
package/dist/errors.js ADDED
@@ -0,0 +1,254 @@
1
+ import { parseRecoveryDirective } from "./recovery-directive.js";
2
+ import { redactSensitiveText } from "./redaction.js";
3
+ const SAFE_CODE = /^[A-Za-z0-9_.:-]{1,128}$/;
4
+ const SAFE_REQUEST_ID = /^[A-Za-z0-9_.:-]{1,160}$/;
5
+ const ACCEPTANCE_STATES = new Set(["unknown", "not-accepted", "accepted"]);
6
+ const REPLAY_FLAGS = ["accepted", "partialOutput", "sideEffectStarted"];
7
+ function record(value) {
8
+ return value !== null && typeof value === "object" && !Array.isArray(value)
9
+ ? value
10
+ : undefined;
11
+ }
12
+ function boundedText(value, maxLength) {
13
+ if (typeof value !== "string")
14
+ return undefined;
15
+ return redactSensitiveText(value, maxLength) || undefined;
16
+ }
17
+ function safeCode(value) {
18
+ if (typeof value !== "string")
19
+ return undefined;
20
+ const candidate = value.trim();
21
+ if (!SAFE_CODE.test(candidate))
22
+ return undefined;
23
+ // Error codes are useful evidence, but long unstructured identifiers can be
24
+ // API keys or tokens echoed into a server's code field.
25
+ if (candidate.length > 32 &&
26
+ !/^(?:ERR|E_|QORTEX|QLEX|AUTH|GATEWAY|VALIDATION|RATE_LIMIT|HTTP_)/i.test(candidate)) {
27
+ return undefined;
28
+ }
29
+ return candidate;
30
+ }
31
+ function safeRequestId(value) {
32
+ const candidate = value?.trim();
33
+ return candidate && SAFE_REQUEST_ID.test(candidate) ? candidate : undefined;
34
+ }
35
+ /** The first safe request ID named in an error body, read from the documented envelope locations. */
36
+ export function qortexErrorRequestId(payload) {
37
+ return envelopeRecords(payload)
38
+ .map((item) => safeRequestId(typeof item.requestId === "string" ? item.requestId : undefined))
39
+ .find((value) => value !== undefined);
40
+ }
41
+ /**
42
+ * The error envelope may appear at the top level, under `error`, or under
43
+ * `details`. Those are the documented locations, and each is read once here,
44
+ * before the raw payload is discarded.
45
+ */
46
+ function envelopeRecords(payload) {
47
+ const outer = record(payload);
48
+ if (!outer)
49
+ return [];
50
+ return [outer, record(outer.error), record(outer.details)].filter((item) => item !== undefined);
51
+ }
52
+ function replayEvidence(records) {
53
+ const evidence = {};
54
+ for (const flag of REPLAY_FLAGS) {
55
+ // Any value other than an explicit `false` is ambiguous, and ambiguity blocks replay.
56
+ if (records.some((item) => item[flag] != null && item[flag] !== false))
57
+ evidence[flag] = true;
58
+ }
59
+ const reported = records.map((item) => item.acceptance).filter((value) => value != null);
60
+ if (reported.some((value) => value !== "not-accepted"))
61
+ evidence.accepted = true;
62
+ if (reported.length === 0)
63
+ return evidence;
64
+ if (reported.includes("accepted"))
65
+ evidence.acceptance = "accepted";
66
+ else if (reported.includes("unknown"))
67
+ evidence.acceptance = "unknown";
68
+ else if (reported.every((value) => value === "not-accepted"))
69
+ evidence.acceptance = "not-accepted";
70
+ return evidence;
71
+ }
72
+ /**
73
+ * Read only the bounded evidence from an error payload. Raw strings, unknown
74
+ * fields, and credentials are never copied into the result.
75
+ */
76
+ export function qortexErrorEvidence(payload) {
77
+ const records = envelopeRecords(payload);
78
+ if (records.length === 0)
79
+ return { contractVersion: 1, replayEvidenceAvailable: false };
80
+ const directiveSource = records.map((item) => item.recoveryDirective).find((value) => value !== undefined);
81
+ const directive = directiveSource === undefined ? undefined : parseDirectiveSafely(directiveSource);
82
+ const retryable = explicitRetryable(records, directive);
83
+ return {
84
+ contractVersion: 1,
85
+ replayEvidenceAvailable: true,
86
+ ...replayEvidence(records),
87
+ ...(directive === undefined ? {} : { recoveryDirective: directive }),
88
+ ...(retryable === undefined ? {} : { retryable }),
89
+ };
90
+ }
91
+ /**
92
+ * The server's own verdict. An explicit `false` is terminal. Otherwise a valid
93
+ * directive decides, and then an explicit `true` from the envelope.
94
+ */
95
+ function explicitRetryable(records, directive) {
96
+ const verdicts = records
97
+ .map((item) => item.retryable)
98
+ .filter((value) => typeof value === "boolean");
99
+ if (verdicts.includes(false))
100
+ return false;
101
+ if (directive !== undefined)
102
+ return directive.retryable;
103
+ if (verdicts.includes(true))
104
+ return true;
105
+ return undefined;
106
+ }
107
+ function parseDirectiveSafely(value) {
108
+ // A malformed or future directive is omitted rather than reflected to the caller.
109
+ try {
110
+ return parseRecoveryDirective(value);
111
+ }
112
+ catch {
113
+ return undefined;
114
+ }
115
+ }
116
+ /** True when any server evidence forbids replaying the failed attempt. */
117
+ export function hasReplayBlockingEvidence(evidence) {
118
+ return (evidence !== undefined &&
119
+ (evidence.accepted === true ||
120
+ evidence.partialOutput === true ||
121
+ evidence.sideEffectStarted === true ||
122
+ (evidence.acceptance !== undefined && evidence.acceptance !== "not-accepted")));
123
+ }
124
+ /** The server's explicit verdict wins. Otherwise the HTTP status decides. */
125
+ function resolveRetryable(status, evidence) {
126
+ if (evidence.retryable !== undefined)
127
+ return evidence.retryable;
128
+ return status === 408 || status === 425 || status === 429 || status >= 500;
129
+ }
130
+ export class QortexError extends Error {
131
+ category;
132
+ code;
133
+ status;
134
+ requestId;
135
+ retryable;
136
+ evidence;
137
+ constructor(details, options = {}) {
138
+ super(details.message, options.cause === undefined ? undefined : { cause: options.cause });
139
+ this.name = "QortexError";
140
+ this.category = details.category;
141
+ this.code = details.code;
142
+ this.status = details.status;
143
+ this.requestId = details.requestId;
144
+ this.retryable = details.retryable;
145
+ this.evidence = details.evidence;
146
+ }
147
+ toJSON() {
148
+ return {
149
+ category: this.category,
150
+ message: this.message,
151
+ ...(this.code ? { code: this.code } : {}),
152
+ ...(this.status === undefined ? {} : { status: this.status }),
153
+ ...(this.requestId ? { requestId: this.requestId } : {}),
154
+ retryable: this.retryable,
155
+ ...(this.evidence ? { evidence: this.evidence } : {}),
156
+ };
157
+ }
158
+ }
159
+ export class QortexHttpError extends QortexError {
160
+ constructor(details, options = {}) {
161
+ super(details, options);
162
+ this.name = "QortexHttpError";
163
+ }
164
+ }
165
+ export class QortexTimeoutError extends QortexError {
166
+ constructor(timeoutMs, options = {}) {
167
+ super({
168
+ category: "timeout",
169
+ code: "QORTEX_REQUEST_TIMEOUT",
170
+ message: `Qortex did not complete the request within ${timeoutMs}ms`,
171
+ retryable: true,
172
+ }, options);
173
+ this.name = "QortexTimeoutError";
174
+ }
175
+ }
176
+ export class QortexTransportError extends QortexError {
177
+ constructor(options = {}) {
178
+ super({
179
+ category: "transport",
180
+ code: "QORTEX_TRANSPORT_ERROR",
181
+ message: "The Qortex request failed before a response was received",
182
+ retryable: true,
183
+ }, options);
184
+ this.name = "QortexTransportError";
185
+ }
186
+ }
187
+ export class QortexProtocolError extends QortexError {
188
+ constructor(message, status, requestId) {
189
+ super({
190
+ category: "protocol",
191
+ code: "QORTEX_PROTOCOL_ERROR",
192
+ message: boundedText(message, 512) ?? "Qortex returned an invalid response",
193
+ ...(status === undefined ? {} : { status }),
194
+ ...(requestId ? { requestId } : {}),
195
+ retryable: false,
196
+ });
197
+ this.name = "QortexProtocolError";
198
+ }
199
+ }
200
+ export function qortexHttpError(status, payload, headers) {
201
+ const outer = record(payload);
202
+ const nested = record(outer?.error);
203
+ const evidence = qortexErrorEvidence(payload);
204
+ const code = safeCode(outer?.code) ??
205
+ safeCode(nested?.code) ??
206
+ (typeof outer?.error === "string" ? safeCode(outer.error) : undefined) ??
207
+ `QORTEX_HTTP_${status}`;
208
+ const message = boundedText(outer?.message, 512) ??
209
+ boundedText(outer?.error_description, 512) ??
210
+ boundedText(nested?.message, 512) ??
211
+ (typeof outer?.error === "string" ? boundedText(outer.error, 512) : undefined) ??
212
+ `Qortex returned HTTP ${status}`;
213
+ const requestHeaders = new Headers(headers);
214
+ const requestId = safeRequestId(requestHeaders.get("x-request-id")) ??
215
+ safeRequestId(requestHeaders.get("request-id")) ??
216
+ safeRequestId(requestHeaders.get("x-qlex-request-id")) ??
217
+ qortexErrorRequestId(payload);
218
+ const envelopeFailure = outer?.success === false;
219
+ let category;
220
+ if (envelopeFailure && status < 400)
221
+ category = "protocol";
222
+ else if (status === 401 ||
223
+ (status === 403 && /credential|authentication|unauthori[sz]ed/i.test(code))) {
224
+ category = "credentials";
225
+ }
226
+ else if (status === 403)
227
+ category = "authorization";
228
+ else if (/gateway|routing|upstream/i.test(code))
229
+ category = "gateway";
230
+ else if (status === 400 || status === 422)
231
+ category = "validation";
232
+ else if (status === 429)
233
+ category = "rate-limit";
234
+ else if (status === 502 || status === 503 || status === 504)
235
+ category = "gateway";
236
+ else if (status >= 500)
237
+ category = "server";
238
+ else
239
+ category = "http";
240
+ return new QortexHttpError({
241
+ category,
242
+ message,
243
+ code,
244
+ status,
245
+ ...(requestId ? { requestId } : {}),
246
+ retryable: resolveRetryable(status, evidence),
247
+ evidence,
248
+ });
249
+ }
250
+ export function isAbortError(error) {
251
+ return ((error instanceof Error && error.name === "AbortError") ||
252
+ (error instanceof Error && error.name === "TimeoutError"));
253
+ }
254
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { QortexError, QortexHttpError, QortexProtocolError, QortexTimeoutError, QortexTransportError, hasReplayBlockingEvidence, isAbortError, qortexErrorEvidence, qortexErrorRequestId, qortexHttpError, type QortexAcceptanceState, type QortexErrorCategory, type QortexErrorDetails, type QortexErrorEvidence, } from "./errors.js";
2
+ export { classifyQortexStreamPayload, type QortexCostFrameID, type QortexStreamPayload, type QortexUsageFrameID, } from "./stream-payload.js";
3
+ export { createSecretRedactor, secretEncodings, type SecretRedactionStream, type SecretRedactor, type SecretRedactorOptions, } from "./redaction.js";
4
+ export { DeviceAuthorizationProtocolError, classifyDeviceTokenPoll, deviceAuthorizationExpired, parseDeviceAuthorizationStart, type DeviceAuthorizationStart, type DeviceTokenPollOutcome, } from "./device-authorization.js";
5
+ export { QortexClient, createQortexClient, isQortexHttpError, unwrapSuccessEnvelope, type QortexClientOptions, type QortexJsonResult, type QortexRequestPolicy, } from "./transport.js";
6
+ export { SseDecoder, iterateSse, type QortexSseEvent, } from "./sse.js";
7
+ export { parseRecoveryStatus, type QortexExecutionState, type QortexRecoveryStatus, type QortexResultRecovery, } from "./recovery-status.js";
8
+ export { parseRecoveryCapabilities, parseRecoveryCapability, type QortexRecoveryCapabilities, type QortexRecoveryCapability, type QortexRecoveryMode, type QortexRecoveryRetry, type QortexRecoveryReplay, type QortexRecoveryResume, type QortexRecoveryReconciliation, } from "./recovery-capabilities.js";
9
+ export { parseRecoveryDirective, type QortexRecoveryDirective, type QortexRecoveryFailureLayer, type QortexRecoveryFailureCategory, type QortexRecommendedRecoveryAction, } from "./recovery-directive.js";
10
+ export { MAX_RECOVERY_ADDITIONAL_WORK, MAX_RECOVERY_ROOT_REMAINING_MS, QORTEX_RECOVERY_CONTROL_HEADER, decodeRecoveryControlHeader, encodeRecoveryControlEnvelope, parseRecoveryControlEnvelope, parseRecoveryLeaseUsage, withRecoveryControlHeader, type QortexRecoveryAction, type QortexRecoveryAdditionalWorkAction, type QortexRecoveryConsumedWork, type QortexRecoveryControlEnvelope, type QortexRecoveryControlOperation, type QortexRecoveryLeaseUsage, } from "./recovery-lease.js";
11
+ export { qortexModuleEndpoint, qortexRequestHeaders, recoveryRouteID, } from "./route-contract.js";
12
+ export { abortableDelay, runWithRecovery, type AttemptOutcome, type QortexAttemptContext, type RecoveryAttemptOutcomeContext, type RecoveryOptions, type RemoteAcceptance, type ReplayAuthorizationContext, } from "./recovery.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,UAAU,EACV,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,GACrC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,EAC9B,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,EAClC,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,GAChC,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { QortexError, QortexHttpError, QortexProtocolError, QortexTimeoutError, QortexTransportError, hasReplayBlockingEvidence, isAbortError, qortexErrorEvidence, qortexErrorRequestId, qortexHttpError, } from "./errors.js";
2
+ export { classifyQortexStreamPayload, } from "./stream-payload.js";
3
+ export { createSecretRedactor, secretEncodings, } from "./redaction.js";
4
+ export { DeviceAuthorizationProtocolError, classifyDeviceTokenPoll, deviceAuthorizationExpired, parseDeviceAuthorizationStart, } from "./device-authorization.js";
5
+ export { QortexClient, createQortexClient, isQortexHttpError, unwrapSuccessEnvelope, } from "./transport.js";
6
+ export { SseDecoder, iterateSse, } from "./sse.js";
7
+ export { parseRecoveryStatus, } from "./recovery-status.js";
8
+ export { parseRecoveryCapabilities, parseRecoveryCapability, } from "./recovery-capabilities.js";
9
+ export { parseRecoveryDirective, } from "./recovery-directive.js";
10
+ export { MAX_RECOVERY_ADDITIONAL_WORK, MAX_RECOVERY_ROOT_REMAINING_MS, QORTEX_RECOVERY_CONTROL_HEADER, decodeRecoveryControlHeader, encodeRecoveryControlEnvelope, parseRecoveryControlEnvelope, parseRecoveryLeaseUsage, withRecoveryControlHeader, } from "./recovery-lease.js";
11
+ export { qortexModuleEndpoint, qortexRequestHeaders, recoveryRouteID, } from "./route-contract.js";
12
+ export { abortableDelay, runWithRecovery, } from "./recovery.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAKhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,GAG9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GAItB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,UAAU,GAEX,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,GAIpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GAQxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,GAKvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,EAC9B,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,GAO1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,eAAe,GAOhB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ export type QortexRecoveryMode = "buffered" | "streaming" | "async_job" | "utility";
2
+ export type QortexRecoveryRetry = "pre_execution_only" | "safe_observation" | "unsupported";
3
+ export type QortexRecoveryReplay = "retained_result" | "unsupported";
4
+ export type QortexRecoveryResume = "supported" | "unsupported";
5
+ export type QortexRecoveryReconciliation = "recovery_status" | "billing_status_only" | "job_status" | "unsupported";
6
+ export interface QortexRecoveryCapability {
7
+ contractVersion: 1;
8
+ routeID: string;
9
+ mode: QortexRecoveryMode;
10
+ retry: QortexRecoveryRetry;
11
+ replay: QortexRecoveryReplay;
12
+ resume: QortexRecoveryResume;
13
+ reconciliation: QortexRecoveryReconciliation;
14
+ requiresIdempotencyKey: boolean;
15
+ retentionMs?: number;
16
+ maxBackendAdditionalWork: number;
17
+ }
18
+ export interface QortexRecoveryCapabilities {
19
+ contractVersion: 1;
20
+ capabilities: QortexRecoveryCapability[];
21
+ }
22
+ /** Parse one route capability. Unrecognized fields are rejected rather than forwarded. */
23
+ export declare function parseRecoveryCapability(value: unknown): QortexRecoveryCapability;
24
+ /** Parse only bounded route facts; never pass through unrecognized server metadata. */
25
+ export declare function parseRecoveryCapabilities(value: unknown): QortexRecoveryCapabilities;
26
+ //# sourceMappingURL=recovery-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-capabilities.d.ts","sourceRoot":"","sources":["../src/recovery-capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAC5F,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AACrE,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,aAAa,CAAC;AAC/D,MAAM,MAAM,4BAA4B,GACpC,iBAAiB,GACjB,qBAAqB,GACrB,YAAY,GACZ,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,cAAc,EAAE,4BAA4B,CAAC;IAC7C,sBAAsB,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,CAAC,CAAC;IACnB,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAsCD,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,wBAAwB,CAqDhF;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAyBpF"}
@@ -0,0 +1,113 @@
1
+ const MODES = new Set(["buffered", "streaming", "async_job", "utility"]);
2
+ const RETRIES = new Set(["pre_execution_only", "safe_observation", "unsupported"]);
3
+ const REPLAYS = new Set(["retained_result", "unsupported"]);
4
+ const RESUMES = new Set(["supported", "unsupported"]);
5
+ const RECONCILIATIONS = new Set([
6
+ "recovery_status",
7
+ "billing_status_only",
8
+ "job_status",
9
+ "unsupported",
10
+ ]);
11
+ const MANIFEST_FIELDS = new Set(["success", "contractVersion", "capabilities"]);
12
+ const CAPABILITY_FIELDS = new Set([
13
+ "contractVersion",
14
+ "routeID",
15
+ "mode",
16
+ "retry",
17
+ "replay",
18
+ "resume",
19
+ "reconciliation",
20
+ "requiresIdempotencyKey",
21
+ "retentionMs",
22
+ "maxBackendAdditionalWork",
23
+ ]);
24
+ const MAX_CAPABILITIES = 512;
25
+ function isRecord(value) {
26
+ return value !== null && typeof value === "object" && !Array.isArray(value);
27
+ }
28
+ function boundedString(value, field, maxLength) {
29
+ if (typeof value !== "string" || value.length === 0 || value.length > maxLength) {
30
+ throw new TypeError(`Qortex recovery capabilities have an invalid ${field}`);
31
+ }
32
+ return value;
33
+ }
34
+ /** Parse one route capability. Unrecognized fields are rejected rather than forwarded. */
35
+ export function parseRecoveryCapability(value) {
36
+ if (!isRecord(value))
37
+ throw new TypeError("Qortex recovery capability must be an object");
38
+ for (const key of Object.keys(value)) {
39
+ if (!CAPABILITY_FIELDS.has(key)) {
40
+ throw new TypeError("Qortex recovery capability contains an unsupported field");
41
+ }
42
+ }
43
+ if (value.contractVersion !== 1) {
44
+ throw new TypeError("Qortex recovery capability uses an unsupported contract version");
45
+ }
46
+ if (typeof value.mode !== "string" || !MODES.has(value.mode)) {
47
+ throw new TypeError("Qortex recovery capability has an invalid mode");
48
+ }
49
+ if (typeof value.retry !== "string" || !RETRIES.has(value.retry)) {
50
+ throw new TypeError("Qortex recovery capability has an invalid retry policy");
51
+ }
52
+ if (typeof value.replay !== "string" || !REPLAYS.has(value.replay)) {
53
+ throw new TypeError("Qortex recovery capability has an invalid replay policy");
54
+ }
55
+ if (typeof value.resume !== "string" || !RESUMES.has(value.resume)) {
56
+ throw new TypeError("Qortex recovery capability has an invalid resume policy");
57
+ }
58
+ if (typeof value.reconciliation !== "string" || !RECONCILIATIONS.has(value.reconciliation)) {
59
+ throw new TypeError("Qortex recovery capability has an invalid reconciliation policy");
60
+ }
61
+ if (typeof value.requiresIdempotencyKey !== "boolean") {
62
+ throw new TypeError("Qortex recovery capability has an invalid idempotency requirement");
63
+ }
64
+ if (!Number.isSafeInteger(value.maxBackendAdditionalWork) ||
65
+ value.maxBackendAdditionalWork < 0) {
66
+ throw new TypeError("Qortex recovery capability has an invalid additional-work limit");
67
+ }
68
+ if (value.retentionMs !== undefined &&
69
+ (!Number.isSafeInteger(value.retentionMs) || value.retentionMs <= 0)) {
70
+ throw new TypeError("Qortex recovery capability has an invalid retention period");
71
+ }
72
+ return {
73
+ contractVersion: 1,
74
+ routeID: boundedString(value.routeID, "routeID", 256),
75
+ mode: value.mode,
76
+ retry: value.retry,
77
+ replay: value.replay,
78
+ resume: value.resume,
79
+ reconciliation: value.reconciliation,
80
+ requiresIdempotencyKey: value.requiresIdempotencyKey,
81
+ ...(value.retentionMs === undefined ? {} : { retentionMs: value.retentionMs }),
82
+ maxBackendAdditionalWork: value.maxBackendAdditionalWork,
83
+ };
84
+ }
85
+ /** Parse only bounded route facts; never pass through unrecognized server metadata. */
86
+ export function parseRecoveryCapabilities(value) {
87
+ if (!isRecord(value))
88
+ throw new TypeError("Qortex recovery capabilities must be an object");
89
+ let candidate = value;
90
+ if (value.success === true && Object.hasOwn(value, "data"))
91
+ candidate = value.data;
92
+ if (!isRecord(candidate))
93
+ throw new TypeError("Qortex recovery capabilities data must be an object");
94
+ for (const key of Object.keys(candidate)) {
95
+ if (!MANIFEST_FIELDS.has(key)) {
96
+ throw new TypeError("Qortex recovery capabilities contain an unsupported field");
97
+ }
98
+ }
99
+ if (candidate.success !== undefined && candidate.success !== true) {
100
+ throw new TypeError("Qortex recovery capabilities have an invalid success marker");
101
+ }
102
+ if (candidate.contractVersion !== 1) {
103
+ throw new TypeError("Qortex recovery capabilities use an unsupported contract version");
104
+ }
105
+ if (!Array.isArray(candidate.capabilities) || candidate.capabilities.length > MAX_CAPABILITIES) {
106
+ throw new TypeError("Qortex recovery capabilities have an invalid capability list");
107
+ }
108
+ return {
109
+ contractVersion: 1,
110
+ capabilities: candidate.capabilities.map(parseRecoveryCapability),
111
+ };
112
+ }
113
+ //# sourceMappingURL=recovery-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-capabilities.js","sourceRoot":"","sources":["../src/recovery-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { QortexExecutionState } from "./recovery-status.js";
2
+ export type QortexRecoveryFailureLayer = "client" | "qortex_transport" | "qortex_auth" | "qortex_harness" | "omniquery_inference" | "tool" | "verification" | "capability";
3
+ export type QortexRecoveryFailureCategory = "backend_unavailable" | "authentication_rejected" | "backend_harness_failed" | "inference_failed" | "tool_failed" | "tool_running" | "verification_failed" | "unsupported_capability" | "rate_limited" | "operation_budget_exhausted" | "operation_deadline_expired" | "effect_outcome_unknown" | "cancelled" | "invalid_request" | "internal_failure";
4
+ export type QortexRecommendedRecoveryAction = "retry_same_work" | "replay_retained_result" | "continue_partial" | "change_approach" | "reconcile" | "wait" | "reauthenticate" | "stop";
5
+ export interface QortexRecoveryDirective {
6
+ contractVersion: 1;
7
+ policyVersion: string;
8
+ category: QortexRecoveryFailureCategory;
9
+ layer: QortexRecoveryFailureLayer;
10
+ stage: string;
11
+ executionState: QortexExecutionState | "accepted" | "cancelled";
12
+ recommendedAction: QortexRecommendedRecoveryAction;
13
+ retryable: boolean;
14
+ reasonCode: string;
15
+ requestID?: string;
16
+ retryAfterMs?: number;
17
+ }
18
+ /** Parse the public directive without retaining unrecognized provider or server fields. */
19
+ export declare function parseRecoveryDirective(value: unknown): QortexRecoveryDirective;
20
+ //# sourceMappingURL=recovery-directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-directive.d.ts","sourceRoot":"","sources":["../src/recovery-directive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,kBAAkB,GAClB,aAAa,GACb,gBAAgB,GAChB,qBAAqB,GACrB,MAAM,GACN,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,6BAA6B,GACrC,qBAAqB,GACrB,yBAAyB,GACzB,wBAAwB,GACxB,kBAAkB,GAClB,aAAa,GACb,cAAc,GACd,qBAAqB,GACrB,wBAAwB,GACxB,cAAc,GACd,4BAA4B,GAC5B,4BAA4B,GAC5B,wBAAwB,GACxB,WAAW,GACX,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,+BAA+B,GACvC,iBAAiB,GACjB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,GACjB,WAAW,GACX,MAAM,GACN,gBAAgB,GAChB,MAAM,CAAC;AAEX,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,6BAA6B,CAAC;IACxC,KAAK,EAAE,0BAA0B,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,oBAAoB,GAAG,UAAU,GAAG,WAAW,CAAC;IAChE,iBAAiB,EAAE,+BAA+B,CAAC;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8DD,2FAA2F;AAC3F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAyD9E"}
@@ -0,0 +1,116 @@
1
+ const CATEGORIES = new Set([
2
+ "backend_unavailable",
3
+ "authentication_rejected",
4
+ "backend_harness_failed",
5
+ "inference_failed",
6
+ "tool_failed",
7
+ "tool_running",
8
+ "verification_failed",
9
+ "unsupported_capability",
10
+ "rate_limited",
11
+ "operation_budget_exhausted",
12
+ "operation_deadline_expired",
13
+ "effect_outcome_unknown",
14
+ "cancelled",
15
+ "invalid_request",
16
+ "internal_failure",
17
+ ]);
18
+ const LAYERS = new Set([
19
+ "client",
20
+ "qortex_transport",
21
+ "qortex_auth",
22
+ "qortex_harness",
23
+ "omniquery_inference",
24
+ "tool",
25
+ "verification",
26
+ "capability",
27
+ ]);
28
+ const ACTIONS = new Set([
29
+ "retry_same_work",
30
+ "replay_retained_result",
31
+ "continue_partial",
32
+ "change_approach",
33
+ "reconcile",
34
+ "wait",
35
+ "reauthenticate",
36
+ "stop",
37
+ ]);
38
+ const EXECUTION_STATES = new Set(["not_started", "accepted", "running", "succeeded", "failed", "unknown", "cancelled"]);
39
+ const FIELDS = new Set([
40
+ "contractVersion",
41
+ "policyVersion",
42
+ "category",
43
+ "layer",
44
+ "stage",
45
+ "executionState",
46
+ "recommendedAction",
47
+ "retryable",
48
+ "reasonCode",
49
+ "requestID",
50
+ "retryAfterMs",
51
+ ]);
52
+ function isRecord(value) {
53
+ return value !== null && typeof value === "object" && !Array.isArray(value);
54
+ }
55
+ function matches(value, pattern) {
56
+ return typeof value === "string" && pattern.test(value);
57
+ }
58
+ /** Parse the public directive without retaining unrecognized provider or server fields. */
59
+ export function parseRecoveryDirective(value) {
60
+ if (!isRecord(value))
61
+ throw new TypeError("Qortex recovery directive must be an object");
62
+ for (const key of Object.keys(value)) {
63
+ if (!FIELDS.has(key))
64
+ throw new TypeError("Qortex recovery directive contains an unsupported field");
65
+ }
66
+ if (value.contractVersion !== 1) {
67
+ throw new TypeError("Qortex recovery directive uses an unsupported contract version");
68
+ }
69
+ if (!matches(value.policyVersion, /^[A-Za-z0-9_.:-]{1,256}$/)) {
70
+ throw new TypeError("Qortex recovery directive has an invalid policyVersion");
71
+ }
72
+ if (typeof value.category !== "string" || !CATEGORIES.has(value.category)) {
73
+ throw new TypeError("Qortex recovery directive has an invalid category");
74
+ }
75
+ if (typeof value.layer !== "string" || !LAYERS.has(value.layer)) {
76
+ throw new TypeError("Qortex recovery directive has an invalid layer");
77
+ }
78
+ if (!matches(value.stage, /^[A-Za-z0-9_.:-]{1,128}$/)) {
79
+ throw new TypeError("Qortex recovery directive has an invalid stage");
80
+ }
81
+ if (typeof value.executionState !== "string" || !EXECUTION_STATES.has(value.executionState)) {
82
+ throw new TypeError("Qortex recovery directive has an invalid executionState");
83
+ }
84
+ if (typeof value.recommendedAction !== "string" || !ACTIONS.has(value.recommendedAction)) {
85
+ throw new TypeError("Qortex recovery directive has an invalid recommendedAction");
86
+ }
87
+ if (typeof value.retryable !== "boolean") {
88
+ throw new TypeError("Qortex recovery directive has an invalid retryable flag");
89
+ }
90
+ if (!matches(value.reasonCode, /^[a-z0-9_:-]{1,256}$/)) {
91
+ throw new TypeError("Qortex recovery directive has an invalid reasonCode");
92
+ }
93
+ if (value.requestID !== undefined && !matches(value.requestID, /^[A-Za-z0-9_.:/-]{1,256}$/)) {
94
+ throw new TypeError("Qortex recovery directive has an invalid requestID");
95
+ }
96
+ if (value.retryAfterMs !== undefined &&
97
+ (!Number.isSafeInteger(value.retryAfterMs) ||
98
+ value.retryAfterMs < 0 ||
99
+ value.retryAfterMs > 86_400_000)) {
100
+ throw new TypeError("Qortex recovery directive has an invalid retryAfterMs");
101
+ }
102
+ return {
103
+ contractVersion: 1,
104
+ policyVersion: value.policyVersion,
105
+ category: value.category,
106
+ layer: value.layer,
107
+ stage: value.stage,
108
+ executionState: value.executionState,
109
+ recommendedAction: value.recommendedAction,
110
+ retryable: value.retryable,
111
+ reasonCode: value.reasonCode,
112
+ ...(value.requestID === undefined ? {} : { requestID: value.requestID }),
113
+ ...(value.retryAfterMs === undefined ? {} : { retryAfterMs: value.retryAfterMs }),
114
+ };
115
+ }
116
+ //# sourceMappingURL=recovery-directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-directive.js","sourceRoot":"","sources":["../src/recovery-directive.ts"],"names":[],"mappings":"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"}