@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/sse.js ADDED
@@ -0,0 +1,156 @@
1
+ export class SseDecoder {
2
+ decoder = new TextDecoder();
3
+ buffer = "";
4
+ data = [];
5
+ eventName;
6
+ eventId;
7
+ lastEventId;
8
+ retry;
9
+ push(chunk) {
10
+ const text = typeof chunk === "string"
11
+ ? this.decoder.decode() + chunk
12
+ : this.decoder.decode(chunk, { stream: true });
13
+ return this.consume(text, false);
14
+ }
15
+ finish() {
16
+ const tail = this.decoder.decode();
17
+ const events = this.consume(tail, true);
18
+ // A final data line without an empty-line delimiter is an incomplete SSE
19
+ // frame and must not be reported as a completed event.
20
+ this.resetFrame();
21
+ return events;
22
+ }
23
+ consume(text, final) {
24
+ this.buffer += text;
25
+ const events = [];
26
+ let lineStart = 0;
27
+ let cursor = 0;
28
+ while (cursor < this.buffer.length) {
29
+ const char = this.buffer[cursor];
30
+ if (char === "\r") {
31
+ if (cursor + 1 === this.buffer.length && !final)
32
+ break;
33
+ const line = this.buffer.slice(lineStart, cursor);
34
+ if (this.buffer[cursor + 1] === "\n")
35
+ cursor += 1;
36
+ events.push(...this.processLine(line));
37
+ cursor += 1;
38
+ lineStart = cursor;
39
+ }
40
+ else if (char === "\n") {
41
+ events.push(...this.processLine(this.buffer.slice(lineStart, cursor)));
42
+ cursor += 1;
43
+ lineStart = cursor;
44
+ }
45
+ else {
46
+ cursor += 1;
47
+ }
48
+ }
49
+ this.buffer = this.buffer.slice(lineStart);
50
+ if (final && this.buffer.length > 0) {
51
+ events.push(...this.processLine(this.buffer));
52
+ this.buffer = "";
53
+ }
54
+ return events;
55
+ }
56
+ processLine(line) {
57
+ if (line.length === 0) {
58
+ if (this.data.length === 0) {
59
+ this.resetFrame();
60
+ return [];
61
+ }
62
+ const event = {
63
+ data: this.data.join("\n"),
64
+ ...(this.eventName ? { event: this.eventName } : {}),
65
+ ...(this.eventId ?? this.lastEventId
66
+ ? { id: this.eventId ?? this.lastEventId }
67
+ : {}),
68
+ ...(this.retry === undefined ? {} : { retry: this.retry }),
69
+ };
70
+ this.resetFrame();
71
+ return [event];
72
+ }
73
+ if (line.startsWith(":"))
74
+ return [];
75
+ const separator = line.indexOf(":");
76
+ const field = separator === -1 ? line : line.slice(0, separator);
77
+ let value = separator === -1 ? "" : line.slice(separator + 1);
78
+ if (value.startsWith(" "))
79
+ value = value.slice(1);
80
+ switch (field) {
81
+ case "data":
82
+ this.data.push(value);
83
+ break;
84
+ case "event":
85
+ this.eventName = value;
86
+ break;
87
+ case "id":
88
+ if (!value.includes("\0")) {
89
+ this.eventId = value;
90
+ this.lastEventId = value;
91
+ }
92
+ break;
93
+ case "retry":
94
+ if (/^\d+$/.test(value))
95
+ this.retry = Number(value);
96
+ break;
97
+ }
98
+ return [];
99
+ }
100
+ resetFrame() {
101
+ this.data = [];
102
+ this.eventName = undefined;
103
+ this.eventId = undefined;
104
+ this.retry = undefined;
105
+ }
106
+ }
107
+ export async function* iterateSse(stream, signal) {
108
+ const reader = stream.getReader();
109
+ const decoder = new SseDecoder();
110
+ let abortListener;
111
+ let ended = false;
112
+ try {
113
+ if (signal?.aborted) {
114
+ throw signal.reason ?? Object.assign(new Error("The stream was aborted"), { name: "AbortError" });
115
+ }
116
+ if (signal) {
117
+ abortListener = () => {
118
+ void reader.cancel(signal.reason).catch(() => { });
119
+ };
120
+ signal.addEventListener("abort", abortListener, { once: true });
121
+ }
122
+ while (true) {
123
+ const next = await reader.read();
124
+ if (signal?.aborted) {
125
+ throw signal.reason ?? Object.assign(new Error("The stream was aborted"), { name: "AbortError" });
126
+ }
127
+ if (next.done) {
128
+ ended = true;
129
+ break;
130
+ }
131
+ for (const event of decoder.push(next.value))
132
+ yield event;
133
+ }
134
+ for (const event of decoder.finish())
135
+ yield event;
136
+ }
137
+ finally {
138
+ if (signal && abortListener)
139
+ signal.removeEventListener("abort", abortListener);
140
+ if (!ended) {
141
+ try {
142
+ await reader.cancel(signal?.reason);
143
+ }
144
+ catch {
145
+ // Preserve the original abort or consumer error.
146
+ }
147
+ }
148
+ try {
149
+ reader.releaseLock();
150
+ }
151
+ catch {
152
+ // The stream may still be resolving a cancelled read.
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type QortexCostFrameID = "qortex-cost" | "qlex-cost";
2
+ export type QortexUsageFrameID = "qortex-stream" | "qlex-stream";
3
+ /**
4
+ * A tagged result. `text` is literal model output, and `json` is a structured
5
+ * frame the host must adapt. The host must not treat `json` as text by accident.
6
+ */
7
+ export type QortexStreamPayload = {
8
+ kind: "empty";
9
+ } | {
10
+ kind: "text";
11
+ text: string;
12
+ } | {
13
+ kind: "json";
14
+ value: Record<string, unknown>;
15
+ } | {
16
+ kind: "usage";
17
+ id: QortexUsageFrameID;
18
+ usage: Record<string, unknown>;
19
+ finishReason?: string;
20
+ } | {
21
+ kind: "cost";
22
+ id: QortexCostFrameID;
23
+ final: boolean;
24
+ frame: Record<string, unknown>;
25
+ } | {
26
+ kind: "control";
27
+ control: "routing-status";
28
+ status: "free-fallback";
29
+ } | {
30
+ kind: "done";
31
+ } | {
32
+ kind: "error";
33
+ message: string;
34
+ code?: string;
35
+ requestId?: string;
36
+ };
37
+ /** Classify one SSE data payload. Pure: the same input always yields the same result. */
38
+ export declare function classifyQortexStreamPayload(data: string): QortexStreamPayload;
39
+ //# sourceMappingURL=stream-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-payload.d.ts","sourceRoot":"","sources":["../src/stream-payload.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,WAAW,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,aAAa,CAAC;AAEjE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAwC1E,yFAAyF;AACzF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAqC7E"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Classifies one reassembled Qortex SSE data payload. The caller frames the
3
+ * stream with `SseDecoder` or `iterateSse`, which joins multi-line `data:` values
4
+ * before this function sees them.
5
+ *
6
+ * Classification is pure and separate from product behavior. It does not convert
7
+ * OpenAI chunks, flatten tool calls, choose finish reasons, update accounting,
8
+ * settle reservations, or decide that a stream completed successfully. Terminal
9
+ * success stays with the host, and an unterminated stream remains incomplete.
10
+ */
11
+ import { redactSensitiveText } from "./redaction.js";
12
+ const COST_FRAME_IDS = new Set(["qortex-cost", "qlex-cost"]);
13
+ const USAGE_FRAME_IDS = new Set(["qortex-stream", "qlex-stream"]);
14
+ const DEFAULT_STREAM_ERROR = "Qortex stream error";
15
+ const MAX_ERROR_MESSAGE_LENGTH = 512;
16
+ const ERROR_CODE = /^([A-Z][A-Z0-9_]{1,63})(?:\s+[—-]\s+|$)([\s\S]*)$/;
17
+ const ERROR_REFERENCE = /\s*\(ref:\s*([A-Za-z0-9_.:-]{1,160})\)\s*$/;
18
+ function isRecord(value) {
19
+ return value !== null && typeof value === "object" && !Array.isArray(value);
20
+ }
21
+ /**
22
+ * Parse a `[ERROR] <CODE> — <message> (ref: <id>)` detail. The code and reference
23
+ * are kept only when they match the safe identifier shape. The message is bounded
24
+ * and redacted before it leaves this module.
25
+ */
26
+ function parseStreamError(detail) {
27
+ const coded = ERROR_CODE.exec(detail);
28
+ const remainder = coded ? coded[2] : detail;
29
+ const reference = ERROR_REFERENCE.exec(remainder);
30
+ const message = redactSensitiveText((reference ? remainder.slice(0, reference.index) : remainder).trim(), MAX_ERROR_MESSAGE_LENGTH);
31
+ return {
32
+ message: message || DEFAULT_STREAM_ERROR,
33
+ ...(coded ? { code: coded[1] } : {}),
34
+ ...(reference ? { requestId: reference[1] } : {}),
35
+ };
36
+ }
37
+ function finishReasonOf(frame) {
38
+ const choices = frame.choices;
39
+ if (!Array.isArray(choices) || !isRecord(choices[0]))
40
+ return undefined;
41
+ const reason = choices[0].finish_reason;
42
+ return typeof reason === "string" ? reason : undefined;
43
+ }
44
+ /** Classify one SSE data payload. Pure: the same input always yields the same result. */
45
+ export function classifyQortexStreamPayload(data) {
46
+ if (data === "")
47
+ return { kind: "empty" };
48
+ if (data === "[DONE]")
49
+ return { kind: "done" };
50
+ if (data.startsWith("[ERROR]"))
51
+ return { kind: "error", ...parseStreamError(data.slice("[ERROR]".length).trim()) };
52
+ // Only payloads that begin like a JSON object or array are parsed. Plain tokens are
53
+ // the most common frame, and they must not pay for a thrown parse on every chunk.
54
+ const first = data.charCodeAt(0);
55
+ const mayBeObject = first === 123 || first === 91 || first === 32 || first === 9 || first === 10 || first === 13;
56
+ if (!mayBeObject)
57
+ return { kind: "text", text: data };
58
+ let parsed;
59
+ try {
60
+ parsed = JSON.parse(data);
61
+ }
62
+ catch {
63
+ return { kind: "text", text: data };
64
+ }
65
+ // Arrays and JSON primitives are not frames. They stay literal text, as they did before.
66
+ if (!isRecord(parsed))
67
+ return { kind: "text", text: data };
68
+ const id = parsed.id;
69
+ if (typeof id === "string" && COST_FRAME_IDS.has(id)) {
70
+ return { kind: "cost", id: id, final: parsed.final === true, frame: parsed };
71
+ }
72
+ if (typeof id === "string" && USAGE_FRAME_IDS.has(id) && isRecord(parsed.usage)) {
73
+ const finishReason = finishReasonOf(parsed);
74
+ return {
75
+ kind: "usage",
76
+ id: id,
77
+ usage: parsed.usage,
78
+ ...(finishReason === undefined ? {} : { finishReason }),
79
+ };
80
+ }
81
+ if (id === "qortex-routing" && parsed.object === "qortex.routing.status" && parsed.status === "free-fallback") {
82
+ return { kind: "control", control: "routing-status", status: "free-fallback" };
83
+ }
84
+ return { kind: "json", value: parsed };
85
+ }
86
+ //# sourceMappingURL=stream-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-payload.js","sourceRoot":"","sources":["../src/stream-payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { QortexHttpError } from "./errors.js";
2
+ import { type QortexRecoveryStatus } from "./recovery-status.js";
3
+ import { type QortexRecoveryCapabilities } from "./recovery-capabilities.js";
4
+ export interface QortexClientOptions {
5
+ baseUrl: string | URL;
6
+ fetch?: typeof globalThis.fetch;
7
+ defaultHeaders?: HeadersInit;
8
+ timeoutMs?: number;
9
+ }
10
+ export interface QortexRequestPolicy {
11
+ signal?: AbortSignal;
12
+ timeoutMs?: number;
13
+ }
14
+ export interface QortexJsonResult<T> {
15
+ data: T;
16
+ status: number;
17
+ headers: Headers;
18
+ requestId?: string;
19
+ }
20
+ export declare class QortexClient {
21
+ private readonly baseUrl;
22
+ private readonly fetchImpl;
23
+ private readonly defaultHeaders?;
24
+ private readonly defaultTimeoutMs?;
25
+ constructor(options: QortexClientOptions);
26
+ request(target: RequestInfo | URL, init?: RequestInit, policy?: QortexRequestPolicy): Promise<Response>;
27
+ requestJson<T = unknown>(target: RequestInfo | URL, init?: RequestInit, policy?: QortexRequestPolicy): Promise<QortexJsonResult<T>>;
28
+ getRequestStatus<T = unknown>(requestId: string, policy?: QortexRequestPolicy & {
29
+ headers?: HeadersInit;
30
+ }): Promise<QortexJsonResult<T>>;
31
+ /** Read route execution/result state; this is not billing evidence. */
32
+ getRecoveryStatus(requestId: string, policy?: QortexRequestPolicy & {
33
+ headers?: HeadersInit;
34
+ }): Promise<QortexJsonResult<QortexRecoveryStatus>>;
35
+ /** Read route recovery guarantees separately from billing and execution status. */
36
+ getRecoveryCapabilities(policy?: QortexRequestPolicy & {
37
+ headers?: HeadersInit;
38
+ }): Promise<QortexJsonResult<QortexRecoveryCapabilities>>;
39
+ openStream(target: RequestInfo | URL, init?: RequestInit, policy?: QortexRequestPolicy): Promise<Response>;
40
+ }
41
+ export declare function createQortexClient(options: QortexClientOptions): QortexClient;
42
+ export declare function unwrapSuccessEnvelope(value: unknown): unknown;
43
+ export declare function isQortexHttpError(error: unknown): error is QortexHttpError;
44
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAKhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqJD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAS;gBAE/B,OAAO,EAAE,mBAAmB;IAgBlC,OAAO,CACX,MAAM,EAAE,WAAW,GAAG,GAAG,EACzB,IAAI,GAAE,WAAgB,EACtB,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,QAAQ,CAAC;IA+Cd,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3B,MAAM,EAAE,WAAW,GAAG,GAAG,EACzB,IAAI,GAAE,WAAgB,EACtB,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAwBzB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAChC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,mBAAmB,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAO,GAC3D,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAS/B,uEAAuE;IACjE,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,mBAAmB,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAO,GAC3D,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAyBlD,mFAAmF;IAC7E,uBAAuB,CAC3B,MAAM,GAAE,mBAAmB,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAO,GAC3D,OAAO,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IAkBxD,UAAU,CACR,MAAM,EAAE,WAAW,GAAG,GAAG,EACzB,IAAI,GAAE,WAAgB,EACtB,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,QAAQ,CAAC;CAGrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW7D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E"}
@@ -0,0 +1,260 @@
1
+ import { QortexHttpError, QortexProtocolError, QortexTimeoutError, QortexTransportError, qortexHttpError, } from "./errors.js";
2
+ import { parseRecoveryStatus } from "./recovery-status.js";
3
+ import { parseRecoveryCapabilities, } from "./recovery-capabilities.js";
4
+ function makeAbortScope(signals, timeoutMs) {
5
+ if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)) {
6
+ throw new RangeError("timeoutMs must be a positive finite number");
7
+ }
8
+ const controller = new AbortController();
9
+ const removers = [];
10
+ let expired = false;
11
+ let timer;
12
+ for (const signal of new Set(signals.filter((item) => Boolean(item)))) {
13
+ if (signal.aborted) {
14
+ controller.abort(signal.reason);
15
+ continue;
16
+ }
17
+ const onAbort = () => controller.abort(signal.reason);
18
+ signal.addEventListener("abort", onAbort, { once: true });
19
+ removers.push(() => signal.removeEventListener("abort", onAbort));
20
+ }
21
+ if (timeoutMs !== undefined && !controller.signal.aborted) {
22
+ timer = setTimeout(() => {
23
+ expired = true;
24
+ const timeout = new Error("Qortex request timed out");
25
+ timeout.name = "TimeoutError";
26
+ controller.abort(timeout);
27
+ }, timeoutMs);
28
+ }
29
+ return {
30
+ signal: controller.signal,
31
+ timedOut: () => expired,
32
+ timeoutError: (cause) => new QortexTimeoutError(timeoutMs ?? 0, { cause }),
33
+ dispose() {
34
+ if (timer !== undefined)
35
+ clearTimeout(timer);
36
+ for (const remove of removers)
37
+ remove();
38
+ },
39
+ };
40
+ }
41
+ function resolveTarget(target, baseUrl) {
42
+ if (target instanceof Request)
43
+ return target;
44
+ return new URL(target.toString(), baseUrl);
45
+ }
46
+ function targetUrl(target) {
47
+ return new URL(target instanceof Request ? target.url : target.toString());
48
+ }
49
+ function mergeHeaders(defaults, requestHeaders, initHeaders) {
50
+ const merged = new Headers(defaults);
51
+ for (const source of [requestHeaders, initHeaders]) {
52
+ new Headers(source).forEach((value, key) => merged.set(key, value));
53
+ }
54
+ return merged;
55
+ }
56
+ function getRequestId(headers) {
57
+ const value = headers.get("x-request-id") ??
58
+ headers.get("request-id") ??
59
+ headers.get("x-qlex-request-id");
60
+ return value && /^[A-Za-z0-9_.:-]{1,160}$/.test(value) ? value : undefined;
61
+ }
62
+ function withBodyLifecycle(response, scope) {
63
+ if (!response.body) {
64
+ scope.dispose();
65
+ return response;
66
+ }
67
+ const reader = response.body.getReader();
68
+ let finished = false;
69
+ const finish = () => {
70
+ if (finished)
71
+ return;
72
+ finished = true;
73
+ scope.dispose();
74
+ try {
75
+ reader.releaseLock();
76
+ }
77
+ catch {
78
+ // A pending read owns the lock until its promise settles.
79
+ }
80
+ };
81
+ const body = new ReadableStream({
82
+ async pull(controller) {
83
+ try {
84
+ const next = await reader.read();
85
+ if (next.done) {
86
+ finish();
87
+ controller.close();
88
+ return;
89
+ }
90
+ controller.enqueue(next.value);
91
+ }
92
+ catch (error) {
93
+ finish();
94
+ controller.error(scope.timedOut() ? scope.timeoutError(error) : error);
95
+ }
96
+ },
97
+ async cancel(reason) {
98
+ try {
99
+ await reader.cancel(reason);
100
+ }
101
+ finally {
102
+ finish();
103
+ }
104
+ },
105
+ });
106
+ return new Response(body, {
107
+ status: response.status,
108
+ statusText: response.statusText,
109
+ headers: response.headers,
110
+ });
111
+ }
112
+ function parseResponseBody(text) {
113
+ if (text.length === 0)
114
+ return undefined;
115
+ try {
116
+ return JSON.parse(text);
117
+ }
118
+ catch {
119
+ return text;
120
+ }
121
+ }
122
+ function isErrorEnvelope(value) {
123
+ return (value !== null &&
124
+ typeof value === "object" &&
125
+ !Array.isArray(value) &&
126
+ value.success === false);
127
+ }
128
+ export class QortexClient {
129
+ baseUrl;
130
+ fetchImpl;
131
+ defaultHeaders;
132
+ defaultTimeoutMs;
133
+ constructor(options) {
134
+ this.baseUrl = new URL(options.baseUrl);
135
+ const host = this.baseUrl.hostname.replace(/^\[|\]$/g, "");
136
+ const loopback = host === "localhost" || host === "127.0.0.1" || host === "::1";
137
+ if (this.baseUrl.protocol !== "https:" && !loopback) {
138
+ throw new TypeError("Qortex baseUrl must use HTTPS outside localhost");
139
+ }
140
+ if (!this.baseUrl.pathname.endsWith("/"))
141
+ this.baseUrl.pathname += "/";
142
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
143
+ if (typeof this.fetchImpl !== "function") {
144
+ throw new TypeError("A fetch implementation is required");
145
+ }
146
+ this.defaultHeaders = options.defaultHeaders;
147
+ this.defaultTimeoutMs = options.timeoutMs;
148
+ }
149
+ async request(target, init = {}, policy = {}) {
150
+ const resolved = resolveTarget(target, this.baseUrl);
151
+ if (targetUrl(resolved).origin !== this.baseUrl.origin) {
152
+ throw new TypeError("Qortex requests must stay on the configured base URL origin");
153
+ }
154
+ const requestSignal = target instanceof Request ? target.signal : undefined;
155
+ const scope = makeAbortScope([requestSignal, init.signal, policy.signal], policy.timeoutMs ?? this.defaultTimeoutMs);
156
+ const headers = mergeHeaders(this.defaultHeaders, requestSignal ? target.headers : undefined, init.headers);
157
+ try {
158
+ if (scope.signal.aborted) {
159
+ if (scope.timedOut()) {
160
+ throw scope.timeoutError();
161
+ }
162
+ throw scope.signal.reason ?? Object.assign(new Error("The request was aborted"), { name: "AbortError" });
163
+ }
164
+ const response = await this.fetchImpl(resolved, {
165
+ ...init,
166
+ headers,
167
+ signal: scope.signal,
168
+ });
169
+ if (scope.signal.aborted) {
170
+ if (scope.timedOut()) {
171
+ throw scope.timeoutError();
172
+ }
173
+ throw scope.signal.reason ?? Object.assign(new Error("The request was aborted"), { name: "AbortError" });
174
+ }
175
+ return withBodyLifecycle(response, scope);
176
+ }
177
+ catch (error) {
178
+ scope.dispose();
179
+ if (scope.timedOut()) {
180
+ throw new QortexTimeoutError(policy.timeoutMs ?? this.defaultTimeoutMs ?? 0, {
181
+ cause: error,
182
+ });
183
+ }
184
+ if (scope.signal.aborted)
185
+ throw error;
186
+ throw new QortexTransportError({ cause: error });
187
+ }
188
+ }
189
+ async requestJson(target, init = {}, policy = {}) {
190
+ const response = await this.request(target, init, policy);
191
+ const text = await response.text();
192
+ const data = parseResponseBody(text);
193
+ if (!response.ok || isErrorEnvelope(data)) {
194
+ throw qortexHttpError(response.status, data, response.headers);
195
+ }
196
+ if (text.length > 0 && typeof data === "string" && response.ok) {
197
+ throw new QortexProtocolError("Qortex returned a non-JSON response where JSON was expected", response.status, getRequestId(response.headers));
198
+ }
199
+ return {
200
+ data: data,
201
+ status: response.status,
202
+ headers: new Headers(response.headers),
203
+ ...(getRequestId(response.headers)
204
+ ? { requestId: getRequestId(response.headers) }
205
+ : {}),
206
+ };
207
+ }
208
+ async getRequestStatus(requestId, policy = {}) {
209
+ if (!requestId.trim())
210
+ throw new TypeError("requestId must not be empty");
211
+ const url = new URL(`/auth/usage/v1/requests/${encodeURIComponent(requestId)}`, this.baseUrl.origin);
212
+ return this.requestJson(url, { method: "GET", headers: policy.headers }, policy);
213
+ }
214
+ /** Read route execution/result state; this is not billing evidence. */
215
+ async getRecoveryStatus(requestId, policy = {}) {
216
+ if (typeof requestId !== "string" || !requestId.trim() || requestId.length > 256) {
217
+ throw new TypeError("requestId must contain between 1 and 256 characters");
218
+ }
219
+ const canonicalRequestId = requestId.trim();
220
+ const url = new URL(`/auth/recovery/v1/requests/${encodeURIComponent(canonicalRequestId)}`, this.baseUrl.origin);
221
+ const result = await this.requestJson(url, { method: "GET", headers: policy.headers }, policy);
222
+ try {
223
+ return { ...result, data: parseRecoveryStatus(result.data, canonicalRequestId) };
224
+ }
225
+ catch {
226
+ throw new QortexProtocolError("Qortex returned a malformed recovery-status response", result.status, result.requestId);
227
+ }
228
+ }
229
+ /** Read route recovery guarantees separately from billing and execution status. */
230
+ async getRecoveryCapabilities(policy = {}) {
231
+ const url = new URL("/auth/recovery/v1/capabilities", this.baseUrl.origin);
232
+ const result = await this.requestJson(url, { method: "GET", headers: policy.headers }, policy);
233
+ try {
234
+ return { ...result, data: parseRecoveryCapabilities(result.data) };
235
+ }
236
+ catch {
237
+ throw new QortexProtocolError("Qortex returned a malformed recovery-capabilities response", result.status, result.requestId);
238
+ }
239
+ }
240
+ openStream(target, init = {}, policy = {}) {
241
+ return this.request(target, init, policy);
242
+ }
243
+ }
244
+ export function createQortexClient(options) {
245
+ return new QortexClient(options);
246
+ }
247
+ export function unwrapSuccessEnvelope(value) {
248
+ if (value !== null &&
249
+ typeof value === "object" &&
250
+ !Array.isArray(value) &&
251
+ value.success === true &&
252
+ Object.hasOwn(value, "data")) {
253
+ return value.data;
254
+ }
255
+ return value;
256
+ }
257
+ export function isQortexHttpError(error) {
258
+ return error instanceof QortexHttpError;
259
+ }
260
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}