akribes 0.21.17

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 (100) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +160 -0
  4. package/dist/client.d.ts +240 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +272 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/errors.d.ts +196 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/errors.js +274 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/execution/index.d.ts +3 -0
  13. package/dist/execution/index.d.ts.map +1 -0
  14. package/dist/execution/index.js +3 -0
  15. package/dist/execution/index.js.map +1 -0
  16. package/dist/execution/replay.d.ts +37 -0
  17. package/dist/execution/replay.d.ts.map +1 -0
  18. package/dist/execution/replay.js +59 -0
  19. package/dist/execution/replay.js.map +1 -0
  20. package/dist/execution/steps.d.ts +327 -0
  21. package/dist/execution/steps.d.ts.map +1 -0
  22. package/dist/execution/steps.js +1068 -0
  23. package/dist/execution/steps.js.map +1 -0
  24. package/dist/http.d.ts +53 -0
  25. package/dist/http.d.ts.map +1 -0
  26. package/dist/http.js +141 -0
  27. package/dist/http.js.map +1 -0
  28. package/dist/index.d.ts +36 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +38 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/runStream.d.ts +176 -0
  33. package/dist/runStream.d.ts.map +1 -0
  34. package/dist/runStream.js +408 -0
  35. package/dist/runStream.js.map +1 -0
  36. package/dist/sse.d.ts +46 -0
  37. package/dist/sse.d.ts.map +1 -0
  38. package/dist/sse.js +218 -0
  39. package/dist/sse.js.map +1 -0
  40. package/dist/sub/bench.d.ts +182 -0
  41. package/dist/sub/bench.d.ts.map +1 -0
  42. package/dist/sub/bench.js +420 -0
  43. package/dist/sub/bench.js.map +1 -0
  44. package/dist/sub/channels.d.ts +22 -0
  45. package/dist/sub/channels.d.ts.map +1 -0
  46. package/dist/sub/channels.js +32 -0
  47. package/dist/sub/channels.js.map +1 -0
  48. package/dist/sub/clients.d.ts +79 -0
  49. package/dist/sub/clients.d.ts.map +1 -0
  50. package/dist/sub/clients.js +190 -0
  51. package/dist/sub/clients.js.map +1 -0
  52. package/dist/sub/documents.d.ts +113 -0
  53. package/dist/sub/documents.d.ts.map +1 -0
  54. package/dist/sub/documents.js +329 -0
  55. package/dist/sub/documents.js.map +1 -0
  56. package/dist/sub/evals.d.ts +71 -0
  57. package/dist/sub/evals.d.ts.map +1 -0
  58. package/dist/sub/evals.js +86 -0
  59. package/dist/sub/evals.js.map +1 -0
  60. package/dist/sub/events.d.ts +65 -0
  61. package/dist/sub/events.d.ts.map +1 -0
  62. package/dist/sub/events.js +154 -0
  63. package/dist/sub/events.js.map +1 -0
  64. package/dist/sub/executions.d.ts +255 -0
  65. package/dist/sub/executions.d.ts.map +1 -0
  66. package/dist/sub/executions.js +322 -0
  67. package/dist/sub/executions.js.map +1 -0
  68. package/dist/sub/mcp.d.ts +51 -0
  69. package/dist/sub/mcp.d.ts.map +1 -0
  70. package/dist/sub/mcp.js +42 -0
  71. package/dist/sub/mcp.js.map +1 -0
  72. package/dist/sub/projects.d.ts +73 -0
  73. package/dist/sub/projects.d.ts.map +1 -0
  74. package/dist/sub/projects.js +101 -0
  75. package/dist/sub/projects.js.map +1 -0
  76. package/dist/sub/scripts.d.ts +58 -0
  77. package/dist/sub/scripts.d.ts.map +1 -0
  78. package/dist/sub/scripts.js +82 -0
  79. package/dist/sub/scripts.js.map +1 -0
  80. package/dist/sub/tokens.d.ts +126 -0
  81. package/dist/sub/tokens.d.ts.map +1 -0
  82. package/dist/sub/tokens.js +105 -0
  83. package/dist/sub/tokens.js.map +1 -0
  84. package/dist/sub/versions.d.ts +29 -0
  85. package/dist/sub/versions.d.ts.map +1 -0
  86. package/dist/sub/versions.js +52 -0
  87. package/dist/sub/versions.js.map +1 -0
  88. package/dist/tokenSafety.d.ts +15 -0
  89. package/dist/tokenSafety.d.ts.map +1 -0
  90. package/dist/tokenSafety.js +24 -0
  91. package/dist/tokenSafety.js.map +1 -0
  92. package/dist/types.d.ts +1147 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +132 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/workflowEvents.d.ts +297 -0
  97. package/dist/workflowEvents.d.ts.map +1 -0
  98. package/dist/workflowEvents.js +612 -0
  99. package/dist/workflowEvents.js.map +1 -0
  100. package/package.json +57 -0
package/dist/sse.js ADDED
@@ -0,0 +1,218 @@
1
+ /** Parse a complete SSE message block (lines between blank-line delimiters). */
2
+ export function parseSseMessage(block) {
3
+ let event = '';
4
+ let data = '';
5
+ let id;
6
+ for (const line of block.split('\n')) {
7
+ if (line.startsWith('data: ')) {
8
+ if (data)
9
+ data += '\n';
10
+ data += line.slice(6);
11
+ }
12
+ else if (line.startsWith('data:')) {
13
+ if (data)
14
+ data += '\n';
15
+ data += line.slice(5);
16
+ }
17
+ else if (line.startsWith('event: ')) {
18
+ event = line.slice(7);
19
+ }
20
+ else if (line.startsWith('event:')) {
21
+ event = line.slice(6);
22
+ }
23
+ else if (line.startsWith('id: ')) {
24
+ id = line.slice(4);
25
+ }
26
+ else if (line.startsWith('id:')) {
27
+ id = line.slice(3);
28
+ }
29
+ // retry: field is still ignored
30
+ }
31
+ if (!data)
32
+ return null;
33
+ return id !== undefined ? { event, data, id } : { event, data };
34
+ }
35
+ /**
36
+ * Open an SSE connection with proper message parsing and auto-reconnection.
37
+ * Uses EventSource when available, fetch-based ReadableStream otherwise.
38
+ *
39
+ * On reconnect the connector sends `Last-Event-ID: <lastSeenId>` per the
40
+ * SSE spec — the server-side replay layer can use it to resume from the
41
+ * gap. EventSource handles this natively; the fetch fallback wires it
42
+ * through the request headers.
43
+ *
44
+ * Returns a dispose function.
45
+ */
46
+ export function connectSse(options) {
47
+ const { url, headers, onMessage, onError, onOpen, reconnect = true, reconnectDelayMs = 1000, reconnectMaxDelayMs = 30000, } = options;
48
+ // Merged abort controller: combines external signal + internal dispose
49
+ const internal = new AbortController();
50
+ const disposed = () => internal.signal.aborted || options.signal?.aborted;
51
+ const resolveUrl = async () => typeof url === 'function' ? await url() : url;
52
+ // `Last-Event-ID` tracking: every message with an `id:` line updates this
53
+ // cursor. On reconnect we replay it as the header so the server can backfill
54
+ // events emitted during the gap. The cursor is captured by every parser
55
+ // path (EventSource native + fetch-fallback parseSseMessage).
56
+ let lastEventId;
57
+ const wrappedOnMessage = (msg) => {
58
+ if (msg.id !== undefined)
59
+ lastEventId = msg.id;
60
+ onMessage(msg);
61
+ };
62
+ // Reconnect backoff state. Exponential with full jitter, base 1s, cap 30s
63
+ // (the SDK-wide canonical curve — see #1182).
64
+ let attempt = 0;
65
+ const nextDelay = () => {
66
+ attempt += 1;
67
+ const exp = Math.min(reconnectDelayMs * 2 ** (attempt - 1), reconnectMaxDelayMs);
68
+ return Math.random() * exp;
69
+ };
70
+ const resetBackoff = () => { attempt = 0; };
71
+ // EventSource cannot set custom request headers, so it is only useful
72
+ // when the caller authenticates via a URL-embedded credential (e.g.
73
+ // `?token=…`). When the caller has supplied an Authorization header,
74
+ // we deliberately skip EventSource and use the fetch-fallback instead:
75
+ // the header path keeps long-lived tokens out of reverse-proxy access
76
+ // logs and OTel `http.url` span attributes.
77
+ const hasAuthHeader = headers && (headers['Authorization'] || headers['authorization']);
78
+ if (typeof globalThis.EventSource !== 'undefined' && !hasAuthHeader) {
79
+ // EventSource has no public API for replacing the URL on reconnect, so
80
+ // when the URL is dynamic we fall back to a manual reconnect loop: tear
81
+ // down the current EventSource on error, build a fresh URL, and open a
82
+ // new one. EventSource's native reconnect also sends `Last-Event-ID`
83
+ // automatically — but only on the same instance, not after we tear it
84
+ // down and re-open. So we track + replay it explicitly.
85
+ let es = null;
86
+ let reconnecting = false;
87
+ const open = async () => {
88
+ if (disposed() || reconnecting)
89
+ return;
90
+ reconnecting = true;
91
+ try {
92
+ let resolved = await resolveUrl();
93
+ if (disposed())
94
+ return;
95
+ if (lastEventId !== undefined) {
96
+ // EventSource does not let callers set headers, so we encode the
97
+ // last-event-id in the query string for the fallback path on the
98
+ // server. Browsers that ALSO send the native `Last-Event-ID`
99
+ // header in this scenario are fine — the server reads whichever
100
+ // it finds first. (See server `sse.rs`.)
101
+ const u = new URL(resolved);
102
+ u.searchParams.set('last_event_id', lastEventId);
103
+ resolved = u.toString();
104
+ }
105
+ es = new EventSource(resolved);
106
+ es.onopen = () => { resetBackoff(); onOpen?.(); };
107
+ es.addEventListener('batch', (e) => {
108
+ wrappedOnMessage({ event: 'batch', data: e.data, id: e.lastEventId });
109
+ });
110
+ es.onmessage = (e) => {
111
+ wrappedOnMessage({ event: '', data: e.data, id: e.lastEventId });
112
+ };
113
+ es.onerror = () => {
114
+ if (disposed())
115
+ return;
116
+ onError?.(new Error('EventSource connection error'));
117
+ if (typeof url === 'function' && reconnect) {
118
+ try {
119
+ es?.close();
120
+ }
121
+ catch { /* ignore */ }
122
+ setTimeout(() => { if (!disposed())
123
+ open(); }, nextDelay());
124
+ }
125
+ };
126
+ }
127
+ finally {
128
+ reconnecting = false;
129
+ }
130
+ };
131
+ open();
132
+ const dispose = () => { internal.abort(); if (es)
133
+ try {
134
+ es.close();
135
+ }
136
+ catch { /* ignore */ } };
137
+ options.signal?.addEventListener('abort', dispose, { once: true });
138
+ return dispose;
139
+ }
140
+ // Fetch-based fallback with reconnection
141
+ const run = async () => {
142
+ while (!disposed()) {
143
+ try {
144
+ const resolved = await resolveUrl();
145
+ if (disposed())
146
+ return;
147
+ const reqHeaders = { 'Accept': 'text/event-stream', ...headers };
148
+ if (lastEventId !== undefined) {
149
+ reqHeaders['Last-Event-ID'] = lastEventId;
150
+ }
151
+ const res = await fetch(resolved, {
152
+ headers: reqHeaders,
153
+ signal: internal.signal,
154
+ });
155
+ if (!res.ok || !res.body)
156
+ return;
157
+ // Subscribe-before-POST hand-off: the server has accepted the GET
158
+ // (and thus attached its broadcast subscriber) the moment fetch
159
+ // resolves with a 2xx response and a body. Fire `onOpen` before
160
+ // we start parsing so callers waiting on the ready signal can
161
+ // proceed to issue their dependent POST.
162
+ resetBackoff();
163
+ onOpen?.();
164
+ const reader = res.body.getReader();
165
+ const decoder = new TextDecoder();
166
+ let buf = '';
167
+ while (!disposed()) {
168
+ const { value, done } = await reader.read();
169
+ if (done)
170
+ break;
171
+ buf += decoder.decode(value, { stream: true });
172
+ // Process complete SSE messages delimited by blank lines.
173
+ // Per the SSE spec, \n\n, \r\n\r\n, and \r\r are all valid
174
+ // separators — servers or intermediaries may emit any of them.
175
+ while (true) {
176
+ const split = findSseDelimiter(buf);
177
+ if (!split)
178
+ break;
179
+ const block = buf.slice(0, split.pos);
180
+ buf = buf.slice(split.pos + split.len);
181
+ const msg = parseSseMessage(block);
182
+ if (msg)
183
+ wrappedOnMessage(msg);
184
+ }
185
+ }
186
+ }
187
+ catch (e) {
188
+ if (disposed() || (e instanceof Error && e.name === 'AbortError'))
189
+ return;
190
+ onError?.(e instanceof Error ? e : new Error(String(e)));
191
+ }
192
+ if (!reconnect || disposed())
193
+ return;
194
+ await new Promise(r => setTimeout(r, nextDelay()));
195
+ }
196
+ };
197
+ run();
198
+ options.signal?.addEventListener('abort', () => internal.abort(), { once: true });
199
+ return () => internal.abort();
200
+ }
201
+ /** Find the earliest SSE message delimiter in `buf`. Returns its position
202
+ * and length, or `null` if no complete delimiter is present yet. */
203
+ function findSseDelimiter(buf) {
204
+ const delimiters = [
205
+ ['\r\n\r\n', 4],
206
+ ['\n\n', 2],
207
+ ['\r\r', 2],
208
+ ];
209
+ let best = null;
210
+ for (const [d, len] of delimiters) {
211
+ const pos = buf.indexOf(d);
212
+ if (pos !== -1 && (best === null || pos < best.pos)) {
213
+ best = { pos, len };
214
+ }
215
+ }
216
+ return best;
217
+ }
218
+ //# 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,182 @@
1
+ /**
2
+ * Sub-client for the akribes-server bench substrate.
3
+ *
4
+ * Mirrors `crates/akribes-sdk-rust/src/sub/bench.rs`. Two surfaces glued onto
5
+ * one TypeScript class for ergonomic Studio consumption:
6
+ *
7
+ * - Project-scoped operations live under
8
+ * `/projects/{id}/scripts/{name}/bench/...`. The `projectId` is captured
9
+ * at construction (`new AkribesClient({ projectId })`) and the script
10
+ * name is the first argument to each method.
11
+ * - Run-scoped + case-id-keyed operations live under `/bench-runs/{id}/...`
12
+ * and `/cases/{id}` and aren't tied to a project (the server resolves
13
+ * the owning project from the row). These are exposed on the same class
14
+ * so studios don't juggle two client instances.
15
+ *
16
+ * Typed errors:
17
+ * - 404 with a `{"error": ...}` body → `AkribesNotFoundError`.
18
+ * - 400 `{"error": "case_type_mismatch", "field_errors": [...]}` →
19
+ * `CaseTypeMismatchError`.
20
+ * - 400 with a `Judge contract mismatch: ...` prefix → `JudgeContractError`
21
+ * (with the trailing `breaks` list parsed when present).
22
+ * - 409 with `error_type: "..._already_exists"` → `AkribesAlreadyExistsError`
23
+ * (handled by the shared `fetchOk`).
24
+ * - All other 4xx/5xx → `AkribesHttpError`.
25
+ */
26
+ import type { HttpClient } from '../http';
27
+ import type { Bench, BenchCase, BenchResult, BenchRun, BenchRunEventsPage, BenchRunTagSessionResponse, CompareReport, ContractPreview, CreateBenchCaseRequest, CreateOrUpdateBenchRequest, DriftReport, PatchBenchCaseRequest, ProjectBenchSummary, PromoteExecutionRequest, ScriptSignature, TriggerBenchRunRequest } from '../types';
28
+ export declare class BenchClient {
29
+ private http;
30
+ private projectId;
31
+ constructor(http: HttpClient, projectId: number);
32
+ private benchPath;
33
+ private scriptOnlyPath;
34
+ private runUrl;
35
+ private caseUrl;
36
+ /** `GET /projects/{id}/scripts/{name}/bench` — 404 → `null`. Other 4xx/5xx
37
+ * surface via {@link AkribesHttpError}. */
38
+ get(scriptName: string, opts?: {
39
+ signal?: AbortSignal;
40
+ }): Promise<Bench | null>;
41
+ /** `POST /projects/{id}/scripts/{name}/bench` — create or update. The
42
+ * server upserts on `(script_id)`, so this is idempotent w.r.t. an
43
+ * existing bench config. */
44
+ save(scriptName: string, req: CreateOrUpdateBenchRequest, opts?: {
45
+ signal?: AbortSignal;
46
+ }): Promise<Bench>;
47
+ /** `DELETE /projects/{id}/scripts/{name}/bench`. The server emits a
48
+ * `{"deleted": true}` body either way; we discard it. */
49
+ delete(scriptName: string, opts?: {
50
+ signal?: AbortSignal;
51
+ }): Promise<void>;
52
+ /** `GET /projects/{id}/benches` — one row per script with a bench
53
+ * configured, joined with the latest run's summary. Backs the project-
54
+ * level evals landing page. */
55
+ listProjectSummaries(opts?: {
56
+ signal?: AbortSignal;
57
+ }): Promise<ProjectBenchSummary[]>;
58
+ /** `GET /projects/{id}/scripts/{name}/signature` — parsed script inputs +
59
+ * outputs + named type defs. Used by the case-builder modal. */
60
+ getSignature(scriptName: string, opts?: {
61
+ signal?: AbortSignal;
62
+ }): Promise<ScriptSignature>;
63
+ /** `GET /projects/{id}/scripts/{name}/bench/contract-preview` — workflow
64
+ * + judge signature pair plus the structured `breaks` list. Used by the
65
+ * judge-picker UI to surface incompatibilities before a save. */
66
+ contractPreview(scriptName: string, args: {
67
+ judgeScriptId: number;
68
+ channel?: string;
69
+ }, opts?: {
70
+ signal?: AbortSignal;
71
+ }): Promise<ContractPreview>;
72
+ /** `GET /projects/{id}/scripts/{name}/bench/cases`. 404 (no bench
73
+ * configured) → empty list. */
74
+ listCases(scriptName: string, opts?: {
75
+ signal?: AbortSignal;
76
+ }): Promise<BenchCase[]>;
77
+ /** `POST /projects/{id}/scripts/{name}/bench/cases` — form-builder create.
78
+ * Throws {@link CaseTypeMismatchError} on a 400 `case_type_mismatch`
79
+ * envelope so form layers can surface per-field violations. */
80
+ createCase(scriptName: string, req: CreateBenchCaseRequest, opts?: {
81
+ signal?: AbortSignal;
82
+ }): Promise<BenchCase>;
83
+ /** `GET /projects/{id}/scripts/{name}/bench/cases/contract-drift`. Returns
84
+ * an empty drift report when the endpoint 404s (script never published). */
85
+ caseContractDrift(scriptName: string, opts?: {
86
+ signal?: AbortSignal;
87
+ }): Promise<DriftReport>;
88
+ /** `PATCH /cases/{id}` — sparse update. */
89
+ patchCase(caseId: string, req: PatchBenchCaseRequest, opts?: {
90
+ signal?: AbortSignal;
91
+ }): Promise<BenchCase>;
92
+ /** `DELETE /cases/{id}`. The server emits `{"deleted": true}`; we discard
93
+ * it for an idiomatic `void` return. */
94
+ deleteCase(caseId: string, opts?: {
95
+ signal?: AbortSignal;
96
+ }): Promise<void>;
97
+ /** `POST /executions/{exec_id}/promote-to-case` — promote a completed
98
+ * execution into a bench case, with an optional `edits` overlay. Lives
99
+ * on `/executions` rather than `/bench-runs` but is the natural
100
+ * counterpart to the case-builder flow, so it lives on this client. */
101
+ promoteExecution(executionId: string, req?: PromoteExecutionRequest, opts?: {
102
+ signal?: AbortSignal;
103
+ }): Promise<BenchCase>;
104
+ /** `GET /projects/{id}/scripts/{name}/bench/runs` — paginated via
105
+ * `limit` / `offset`. 404 → empty list. */
106
+ listRuns(scriptName: string, params?: {
107
+ limit?: number;
108
+ offset?: number;
109
+ }, opts?: {
110
+ signal?: AbortSignal;
111
+ }): Promise<BenchRun[]>;
112
+ /** `POST /projects/{id}/scripts/{name}/bench/runs` — trigger a run.
113
+ * `case_ids` constrains the fan-out to a subset. Throws
114
+ * {@link JudgeContractError} on the contract pre-flight 400. */
115
+ triggerRun(scriptName: string, req: TriggerBenchRunRequest, opts?: {
116
+ signal?: AbortSignal;
117
+ }): Promise<BenchRun>;
118
+ /** `GET /bench-runs/{id}` — 404 → `null`. */
119
+ getRun(runId: number, opts?: {
120
+ signal?: AbortSignal;
121
+ }): Promise<BenchRun | null>;
122
+ /** `DELETE /bench-runs/{id}`. Cancels first (best-effort) before
123
+ * dropping. The server emits a JSON receipt; we discard it. */
124
+ deleteRun(runId: number, opts?: {
125
+ signal?: AbortSignal;
126
+ }): Promise<void>;
127
+ /** `GET /bench-runs/{id}/results`. 404 → empty list. */
128
+ listResults(runId: number, opts?: {
129
+ signal?: AbortSignal;
130
+ }): Promise<BenchResult[]>;
131
+ /** `POST /bench-runs/{id}/cancel`. Flips the cancel token; in-flight cases
132
+ * complete naturally. Returns the run row as it stands. */
133
+ cancelRun(runId: number, opts?: {
134
+ signal?: AbortSignal;
135
+ }): Promise<BenchRun>;
136
+ /** `GET /bench-runs/{a}/compare/{b}` — diff two runs of the same bench. */
137
+ compareRuns(runA: number, runB: number, opts?: {
138
+ signal?: AbortSignal;
139
+ }): Promise<CompareReport>;
140
+ /** `GET /bench-runs/{id}/events?after_id=N` — JSON-page form of the
141
+ * bench-run event stream. Use for MCP-style polling; for live UI prefer
142
+ * {@link BenchClient.subscribeRunEvents}. */
143
+ runEvents(runId: number, params?: {
144
+ afterId?: number;
145
+ }, opts?: {
146
+ signal?: AbortSignal;
147
+ }): Promise<BenchRunEventsPage>;
148
+ /** `PATCH /bench-runs/{id}/tag-session` — attribute the run to an MCP
149
+ * session id so the coordinator's finalize step writes the cost into
150
+ * `mcp_session_cost`. */
151
+ tagSession(runId: number, mcpSessionId: string, opts?: {
152
+ signal?: AbortSignal;
153
+ }): Promise<BenchRunTagSessionResponse>;
154
+ /**
155
+ * Subscribe to a bench run's live result stream via SSE.
156
+ *
157
+ * The server emits two event types on `/bench-runs/{id}/events`:
158
+ * - `result` — a new {@link BenchResult} row.
159
+ * - `lagged` — broadcast-stream lag report (`{ dropped: N }`).
160
+ *
161
+ * Built on the shared {@link connectSse} helper, which uses
162
+ * {@link EventSource} in browsers and a fetch-based reader in Node / Bun.
163
+ * Auth rides on the Authorization header from the SDK's `HttpClient`.
164
+ * Older revisions also appended `opts.token` to the URL as a `?token=`
165
+ * fallback so EventSource (which can't set headers) would authenticate;
166
+ * that leaked long-lived service-token secrets into reverse-proxy
167
+ * access logs. `sse.ts` now skips EventSource whenever an Authorization
168
+ * header is present and uses the fetch-fallback path instead — so the
169
+ * `opts.token` URL fallback is no longer needed. `opts.token` is kept
170
+ * on the API for now (a no-op) to avoid breaking compiled callers.
171
+ * Returns an unsubscribe function.
172
+ */
173
+ subscribeRunEvents(runId: number, handlers: {
174
+ onResult?: (result: BenchResult) => void;
175
+ onLagged?: (dropped: number) => void;
176
+ onError?: (error: Error) => void;
177
+ }, opts?: {
178
+ token?: string;
179
+ signal?: AbortSignal;
180
+ }): () => void;
181
+ }
182
+ //# sourceMappingURL=bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../src/sub/bench.ts"],"names":[],"mappings":"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"}