@holokai/holo-sdk 1.4.1
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.
- package/LICENSE +21 -0
- package/README.md +264 -0
- package/dist/client/builder.d.ts +82 -0
- package/dist/client/builder.d.ts.map +1 -0
- package/dist/client/builder.js +207 -0
- package/dist/client/builder.js.map +1 -0
- package/dist/client/client.d.ts +148 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +309 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/errors.d.ts +20 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +36 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/merge.d.ts +28 -0
- package/dist/client/merge.d.ts.map +1 -0
- package/dist/client/merge.js +185 -0
- package/dist/client/merge.js.map +1 -0
- package/dist/client/output.d.ts +26 -0
- package/dist/client/output.d.ts.map +1 -0
- package/dist/client/output.js +75 -0
- package/dist/client/output.js.map +1 -0
- package/dist/client/runner.d.ts +92 -0
- package/dist/client/runner.d.ts.map +1 -0
- package/dist/client/runner.js +121 -0
- package/dist/client/runner.js.map +1 -0
- package/dist/client/sse.d.ts +3 -0
- package/dist/client/sse.d.ts.map +1 -0
- package/dist/client/sse.js +72 -0
- package/dist/client/sse.js.map +1 -0
- package/dist/client/stream.d.ts +60 -0
- package/dist/client/stream.d.ts.map +1 -0
- package/dist/client/stream.js +137 -0
- package/dist/client/stream.js.map +1 -0
- package/dist/client/transport.d.ts +42 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +129 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/types.d.ts +41 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/core/async-event-queue.d.ts +11 -0
- package/dist/core/async-event-queue.d.ts.map +1 -0
- package/dist/core/async-event-queue.js +38 -0
- package/dist/core/async-event-queue.js.map +1 -0
- package/dist/core/binary.d.ts +3 -0
- package/dist/core/binary.d.ts.map +1 -0
- package/dist/core/binary.js +11 -0
- package/dist/core/binary.js.map +1 -0
- package/dist/core/errors.d.ts +11 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +24 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/headers.d.ts +3 -0
- package/dist/core/headers.d.ts.map +1 -0
- package/dist/core/headers.js +42 -0
- package/dist/core/headers.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +37 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +73 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/pick-defined.d.ts +9 -0
- package/dist/core/pick-defined.d.ts.map +1 -0
- package/dist/core/pick-defined.js +79 -0
- package/dist/core/pick-defined.js.map +1 -0
- package/dist/core/safe-parse.d.ts +2 -0
- package/dist/core/safe-parse.d.ts.map +1 -0
- package/dist/core/safe-parse.js +11 -0
- package/dist/core/safe-parse.js.map +1 -0
- package/dist/core/sanitize.object.d.ts +2 -0
- package/dist/core/sanitize.object.d.ts.map +1 -0
- package/dist/core/sanitize.object.js +10 -0
- package/dist/core/sanitize.object.js.map +1 -0
- package/dist/core/stable-id.d.ts +2 -0
- package/dist/core/stable-id.d.ts.map +1 -0
- package/dist/core/stable-id.js +11 -0
- package/dist/core/stable-id.js.map +1 -0
- package/dist/core/stringify-any.d.ts +2 -0
- package/dist/core/stringify-any.d.ts.map +1 -0
- package/dist/core/stringify-any.js +4 -0
- package/dist/core/stringify-any.js.map +1 -0
- package/dist/core/time-utils.d.ts +2 -0
- package/dist/core/time-utils.d.ts.map +1 -0
- package/dist/core/time-utils.js +2 -0
- package/dist/core/time-utils.js.map +1 -0
- package/dist/core/tokenizer.d.ts +2 -0
- package/dist/core/tokenizer.d.ts.map +1 -0
- package/dist/core/tokenizer.js +12 -0
- package/dist/core/tokenizer.js.map +1 -0
- package/dist/holo/content.d.ts +9 -0
- package/dist/holo/content.d.ts.map +1 -0
- package/dist/holo/content.js +22 -0
- package/dist/holo/content.js.map +1 -0
- package/dist/holo/factories/index.d.ts +2 -0
- package/dist/holo/factories/index.d.ts.map +1 -0
- package/dist/holo/factories/index.js +2 -0
- package/dist/holo/factories/index.js.map +1 -0
- package/dist/holo/factories/request-factory.d.ts +3 -0
- package/dist/holo/factories/request-factory.d.ts.map +1 -0
- package/dist/holo/factories/request-factory.js +8 -0
- package/dist/holo/factories/request-factory.js.map +1 -0
- package/dist/holo/index.d.ts +3 -0
- package/dist/holo/index.d.ts.map +1 -0
- package/dist/holo/index.js +3 -0
- package/dist/holo/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/matching/index.d.ts +3 -0
- package/dist/matching/index.d.ts.map +1 -0
- package/dist/matching/index.js +2 -0
- package/dist/matching/index.js.map +1 -0
- package/dist/matching/normalize.d.ts +19 -0
- package/dist/matching/normalize.d.ts.map +1 -0
- package/dist/matching/normalize.js +169 -0
- package/dist/matching/normalize.js.map +1 -0
- package/dist/notification/index.d.ts +4 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/index.js +4 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/notification/service.d.ts +8 -0
- package/dist/notification/service.d.ts.map +1 -0
- package/dist/notification/service.js +16 -0
- package/dist/notification/service.js.map +1 -0
- package/dist/notification/store.d.ts +2 -0
- package/dist/notification/store.d.ts.map +1 -0
- package/dist/notification/store.js +2 -0
- package/dist/notification/store.js.map +1 -0
- package/dist/notification/types.d.ts +11 -0
- package/dist/notification/types.d.ts.map +1 -0
- package/dist/notification/types.js +63 -0
- package/dist/notification/types.js.map +1 -0
- package/dist/plugin/base.d.ts +29 -0
- package/dist/plugin/base.d.ts.map +1 -0
- package/dist/plugin/base.js +105 -0
- package/dist/plugin/base.js.map +1 -0
- package/dist/plugin/errors.d.ts +9 -0
- package/dist/plugin/errors.d.ts.map +1 -0
- package/dist/plugin/errors.js +15 -0
- package/dist/plugin/errors.js.map +1 -0
- package/dist/plugin/index.d.ts +5 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +5 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/loader.d.ts +14 -0
- package/dist/plugin/loader.d.ts.map +1 -0
- package/dist/plugin/loader.js +67 -0
- package/dist/plugin/loader.js.map +1 -0
- package/dist/plugin/normalize.d.ts +3 -0
- package/dist/plugin/normalize.d.ts.map +1 -0
- package/dist/plugin/normalize.js +160 -0
- package/dist/plugin/normalize.js.map +1 -0
- package/dist/provider/auditor/base.d.ts +47 -0
- package/dist/provider/auditor/base.d.ts.map +1 -0
- package/dist/provider/auditor/base.js +254 -0
- package/dist/provider/auditor/base.js.map +1 -0
- package/dist/provider/auditor/index.d.ts +2 -0
- package/dist/provider/auditor/index.d.ts.map +1 -0
- package/dist/provider/auditor/index.js +2 -0
- package/dist/provider/auditor/index.js.map +1 -0
- package/dist/provider/base.d.ts +36 -0
- package/dist/provider/base.d.ts.map +1 -0
- package/dist/provider/base.js +185 -0
- package/dist/provider/base.js.map +1 -0
- package/dist/provider/event-processor.d.ts +13 -0
- package/dist/provider/event-processor.d.ts.map +1 -0
- package/dist/provider/event-processor.js +22 -0
- package/dist/provider/event-processor.js.map +1 -0
- package/dist/provider/index.d.ts +7 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +7 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/translator/base.d.ts +15 -0
- package/dist/provider/translator/base.d.ts.map +1 -0
- package/dist/provider/translator/base.js +33 -0
- package/dist/provider/translator/base.js.map +1 -0
- package/dist/provider/translator/index.d.ts +3 -0
- package/dist/provider/translator/index.d.ts.map +1 -0
- package/dist/provider/translator/index.js +3 -0
- package/dist/provider/translator/index.js.map +1 -0
- package/dist/provider/translator/stream.d.ts +24 -0
- package/dist/provider/translator/stream.d.ts.map +1 -0
- package/dist/provider/translator/stream.js +50 -0
- package/dist/provider/translator/stream.js.map +1 -0
- package/dist/provider/wire/base.d.ts +39 -0
- package/dist/provider/wire/base.d.ts.map +1 -0
- package/dist/provider/wire/base.js +106 -0
- package/dist/provider/wire/base.js.map +1 -0
- package/dist/provider/wire/holo.wire.adapter.d.ts +33 -0
- package/dist/provider/wire/holo.wire.adapter.d.ts.map +1 -0
- package/dist/provider/wire/holo.wire.adapter.js +220 -0
- package/dist/provider/wire/holo.wire.adapter.js.map +1 -0
- package/dist/provider/wire/index.d.ts +3 -0
- package/dist/provider/wire/index.d.ts.map +1 -0
- package/dist/provider/wire/index.js +3 -0
- package/dist/provider/wire/index.js.map +1 -0
- package/dist/provider/worker-request-factory.d.ts +23 -0
- package/dist/provider/worker-request-factory.d.ts.map +1 -0
- package/dist/provider/worker-request-factory.js +38 -0
- package/dist/provider/worker-request-factory.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { HoloResponse, HoloStreamEvent } from '@holokai/holo-types/holo';
|
|
2
|
+
type EventHandler<T> = (data: T) => void;
|
|
3
|
+
interface ToolCallDelta {
|
|
4
|
+
id?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
arguments_delta?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Async-iterable stream of {@link HoloStreamEvent} objects from a streaming chat request.
|
|
10
|
+
*
|
|
11
|
+
* Can be consumed in three ways:
|
|
12
|
+
* 1. **`for await`** — iterate over raw events
|
|
13
|
+
* 2. **`.on()`** — register typed event handlers, then iterate or call a terminal method
|
|
14
|
+
* 3. **`.text()` / `.finalResponse()`** — convenience methods that consume the stream and return the result
|
|
15
|
+
*
|
|
16
|
+
* @remarks A `HoloStream` can only be iterated once. Call {@link abort} to cancel an in-flight stream.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const stream = await client.chat.stream({
|
|
21
|
+
* model: 'gpt-4o',
|
|
22
|
+
* messages: [{ role: 'user', content: 'Hello' }],
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* for await (const event of stream) {
|
|
26
|
+
* if (event.type === 'response.output_text.delta') {
|
|
27
|
+
* process.stdout.write(event.delta ?? '');
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @see {@link HoloStreamEvent} for the event payload shape.
|
|
33
|
+
* @see {@link HoloStreamAccumulator} for the underlying delta-merging logic.
|
|
34
|
+
*/
|
|
35
|
+
export declare class HoloStream implements AsyncIterable<HoloStreamEvent> {
|
|
36
|
+
private readonly events;
|
|
37
|
+
private readonly abortController;
|
|
38
|
+
private readonly accumulator;
|
|
39
|
+
private completedResponse?;
|
|
40
|
+
private failedError?;
|
|
41
|
+
private iterationStarted;
|
|
42
|
+
private eventHandlers;
|
|
43
|
+
constructor(events: AsyncGenerator<HoloStreamEvent>, abortController: AbortController);
|
|
44
|
+
[Symbol.asyncIterator](): AsyncIterator<HoloStreamEvent>;
|
|
45
|
+
on(event: 'response.output_text.delta', fn: EventHandler<string>): this;
|
|
46
|
+
on(event: 'response.tool_call.delta', fn: EventHandler<ToolCallDelta>): this;
|
|
47
|
+
on(event: 'response.reasoning.delta', fn: EventHandler<string>): this;
|
|
48
|
+
on(event: 'response.completed', fn: EventHandler<HoloResponse>): this;
|
|
49
|
+
on(event: 'response.failed', fn: EventHandler<Error>): this;
|
|
50
|
+
/** Consume the entire stream and return the concatenated text output. */
|
|
51
|
+
text(): Promise<string>;
|
|
52
|
+
/** Consume the entire stream and return the assembled {@link HoloResponse}. */
|
|
53
|
+
finalResponse(): Promise<HoloResponse>;
|
|
54
|
+
/** Cancel the in-flight stream. */
|
|
55
|
+
abort(): void;
|
|
56
|
+
private consume;
|
|
57
|
+
private dispatchEvent;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/client/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAI5E,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEzC,UAAU,aAAa;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,UAAW,YAAW,aAAa,CAAC,eAAe,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,iBAAiB,CAAC,CAAe;IACzC,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAA+C;gBAExD,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,eAAe;IAKrF,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,eAAe,CAAC;IA4BxD,EAAE,CAAC,KAAK,EAAE,4BAA4B,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IACvE,EAAE,CAAC,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI;IAC5E,EAAE,CAAC,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IACrE,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI;IACrE,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI;IAS3D,yEAAyE;IACnE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAM7B,+EAA+E;IACzE,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC;IAgB5C,mCAAmC;IACnC,KAAK,IAAI,IAAI;YAIC,OAAO;IAQrB,OAAO,CAAC,aAAa;CAsBxB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { HoloStreamAccumulator } from './merge';
|
|
2
|
+
import { HoloStreamError } from './errors';
|
|
3
|
+
/**
|
|
4
|
+
* Async-iterable stream of {@link HoloStreamEvent} objects from a streaming chat request.
|
|
5
|
+
*
|
|
6
|
+
* Can be consumed in three ways:
|
|
7
|
+
* 1. **`for await`** — iterate over raw events
|
|
8
|
+
* 2. **`.on()`** — register typed event handlers, then iterate or call a terminal method
|
|
9
|
+
* 3. **`.text()` / `.finalResponse()`** — convenience methods that consume the stream and return the result
|
|
10
|
+
*
|
|
11
|
+
* @remarks A `HoloStream` can only be iterated once. Call {@link abort} to cancel an in-flight stream.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const stream = await client.chat.stream({
|
|
16
|
+
* model: 'gpt-4o',
|
|
17
|
+
* messages: [{ role: 'user', content: 'Hello' }],
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* for await (const event of stream) {
|
|
21
|
+
* if (event.type === 'response.output_text.delta') {
|
|
22
|
+
* process.stdout.write(event.delta ?? '');
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @see {@link HoloStreamEvent} for the event payload shape.
|
|
28
|
+
* @see {@link HoloStreamAccumulator} for the underlying delta-merging logic.
|
|
29
|
+
*/
|
|
30
|
+
export class HoloStream {
|
|
31
|
+
events;
|
|
32
|
+
abortController;
|
|
33
|
+
accumulator = new HoloStreamAccumulator();
|
|
34
|
+
completedResponse;
|
|
35
|
+
failedError;
|
|
36
|
+
iterationStarted = false;
|
|
37
|
+
eventHandlers = new Map();
|
|
38
|
+
constructor(events, abortController) {
|
|
39
|
+
this.events = events;
|
|
40
|
+
this.abortController = abortController;
|
|
41
|
+
}
|
|
42
|
+
[Symbol.asyncIterator]() {
|
|
43
|
+
if (this.iterationStarted) {
|
|
44
|
+
throw new Error('HoloStream can only be iterated once');
|
|
45
|
+
}
|
|
46
|
+
this.iterationStarted = true;
|
|
47
|
+
const self = this;
|
|
48
|
+
return {
|
|
49
|
+
async next() {
|
|
50
|
+
const result = await self.events.next();
|
|
51
|
+
if (result.done)
|
|
52
|
+
return { done: true, value: undefined };
|
|
53
|
+
const event = result.value;
|
|
54
|
+
self.accumulator.push(event);
|
|
55
|
+
self.dispatchEvent(event);
|
|
56
|
+
if (event.type === 'response.completed' && event.response) {
|
|
57
|
+
self.completedResponse = event.response;
|
|
58
|
+
}
|
|
59
|
+
if (event.type === 'response.failed') {
|
|
60
|
+
self.failedError = new HoloStreamError(event.error?.message ?? 'Stream failed', event);
|
|
61
|
+
}
|
|
62
|
+
return { done: false, value: event };
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Register an event handler. Handlers fire during iteration (either explicit or via terminal methods). */
|
|
67
|
+
on(event, fn) {
|
|
68
|
+
const handlers = this.eventHandlers.get(event) ?? [];
|
|
69
|
+
handlers.push(fn);
|
|
70
|
+
this.eventHandlers.set(event, handlers);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
/** Consume the entire stream and return the concatenated text output. */
|
|
74
|
+
async text() {
|
|
75
|
+
await this.consume();
|
|
76
|
+
if (this.failedError)
|
|
77
|
+
throw this.failedError;
|
|
78
|
+
return this.accumulator.getText();
|
|
79
|
+
}
|
|
80
|
+
/** Consume the entire stream and return the assembled {@link HoloResponse}. */
|
|
81
|
+
async finalResponse() {
|
|
82
|
+
await this.consume();
|
|
83
|
+
if (this.failedError)
|
|
84
|
+
throw this.failedError;
|
|
85
|
+
const accumulated = this.accumulator.toResponse();
|
|
86
|
+
// If the server says tool_calls but the completedResponse is missing them, use accumulator
|
|
87
|
+
if (this.completedResponse?.finish_reason === 'tool_calls') {
|
|
88
|
+
const hasToolCalls = this.completedResponse.output?.some((m) => m.tool_calls?.length || (Array.isArray(m.content) && m.content.some((b) => b.type === 'tool_call')));
|
|
89
|
+
if (!hasToolCalls && accumulated.output?.length)
|
|
90
|
+
return accumulated;
|
|
91
|
+
}
|
|
92
|
+
if (this.completedResponse?.output?.length)
|
|
93
|
+
return this.completedResponse;
|
|
94
|
+
if (accumulated.output.length)
|
|
95
|
+
return accumulated;
|
|
96
|
+
return this.completedResponse ?? accumulated;
|
|
97
|
+
}
|
|
98
|
+
/** Cancel the in-flight stream. */
|
|
99
|
+
abort() {
|
|
100
|
+
this.abortController.abort();
|
|
101
|
+
}
|
|
102
|
+
async consume() {
|
|
103
|
+
if (this.completedResponse || this.failedError)
|
|
104
|
+
return;
|
|
105
|
+
for await (const _event of this) {
|
|
106
|
+
// iteration handles accumulation via [Symbol.asyncIterator]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
dispatchEvent(event) {
|
|
110
|
+
const handlers = this.eventHandlers.get(event.type);
|
|
111
|
+
if (!handlers?.length)
|
|
112
|
+
return;
|
|
113
|
+
switch (event.type) {
|
|
114
|
+
case 'response.output_text.delta':
|
|
115
|
+
for (const h of handlers)
|
|
116
|
+
h(event.delta ?? '');
|
|
117
|
+
break;
|
|
118
|
+
case 'response.reasoning.delta':
|
|
119
|
+
for (const h of handlers)
|
|
120
|
+
h(event.delta ?? '');
|
|
121
|
+
break;
|
|
122
|
+
case 'response.tool_call.delta':
|
|
123
|
+
for (const h of handlers)
|
|
124
|
+
h(event.tool_call_delta ?? {});
|
|
125
|
+
break;
|
|
126
|
+
case 'response.completed':
|
|
127
|
+
for (const h of handlers)
|
|
128
|
+
h(event.response ?? this.accumulator.toResponse());
|
|
129
|
+
break;
|
|
130
|
+
case 'response.failed':
|
|
131
|
+
for (const h of handlers)
|
|
132
|
+
h(new HoloStreamError(event.error?.message ?? 'Stream failed', event));
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/client/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface TransportRequestOptions {
|
|
2
|
+
method: string;
|
|
3
|
+
path: string;
|
|
4
|
+
body?: unknown | undefined;
|
|
5
|
+
signal?: AbortSignal | undefined;
|
|
6
|
+
headers?: Record<string, string> | undefined;
|
|
7
|
+
}
|
|
8
|
+
interface TransportStreamOptions {
|
|
9
|
+
path: string;
|
|
10
|
+
body: unknown;
|
|
11
|
+
signal?: AbortSignal | undefined;
|
|
12
|
+
headers?: Record<string, string> | undefined;
|
|
13
|
+
}
|
|
14
|
+
interface TransportStreamResult {
|
|
15
|
+
body: ReadableStream<Uint8Array>;
|
|
16
|
+
response: Response;
|
|
17
|
+
}
|
|
18
|
+
interface HoloTransport {
|
|
19
|
+
request<T>(options: TransportRequestOptions): Promise<T>;
|
|
20
|
+
streamRequest(options: TransportStreamOptions): Promise<TransportStreamResult>;
|
|
21
|
+
}
|
|
22
|
+
declare class FetchTransport implements HoloTransport {
|
|
23
|
+
private readonly baseUrl;
|
|
24
|
+
private readonly token;
|
|
25
|
+
private readonly _fetch;
|
|
26
|
+
private readonly timeout?;
|
|
27
|
+
private readonly userAgent;
|
|
28
|
+
constructor(options: {
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
token: string;
|
|
31
|
+
fetch?: typeof globalThis.fetch | undefined;
|
|
32
|
+
timeout?: number | undefined;
|
|
33
|
+
});
|
|
34
|
+
request<T>(options: TransportRequestOptions): Promise<T>;
|
|
35
|
+
streamRequest(options: TransportStreamOptions): Promise<TransportStreamResult>;
|
|
36
|
+
private handleErrorResponse;
|
|
37
|
+
private applyTimeout;
|
|
38
|
+
private classifyAbortError;
|
|
39
|
+
}
|
|
40
|
+
export { FetchTransport };
|
|
41
|
+
export type { HoloTransport, TransportRequestOptions, TransportStreamOptions, TransportStreamResult };
|
|
42
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAEA,UAAU,uBAAuB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAChD;AAED,UAAU,sBAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAChD;AAED,UAAU,qBAAqB;IAC3B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;CACtB;AAKD,UAAU,aAAa;IACnB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzD,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAClF;AAeD,cAAM,cAAe,YAAW,aAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;QAC5C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC;IAQK,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC;IA4BxD,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAgCtE,mBAAmB;IAwBjC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,kBAAkB;CAa7B;AAED,OAAO,EAAC,cAAc,EAAC,CAAC;AACxB,YAAY,EAAC,aAAa,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,qBAAqB,EAAC,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { HoloApiError, HoloTimeoutError } from './errors';
|
|
2
|
+
function getUserAgent() {
|
|
3
|
+
const base = 'holo-sdk-js';
|
|
4
|
+
try {
|
|
5
|
+
const { createRequire } = require('module');
|
|
6
|
+
const require_ = createRequire(import.meta.url);
|
|
7
|
+
const pkg = require_('../../../package.json');
|
|
8
|
+
if (pkg.version)
|
|
9
|
+
return `${base}/${pkg.version}`;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// Bundler or browser — silently degrade
|
|
13
|
+
}
|
|
14
|
+
return base;
|
|
15
|
+
}
|
|
16
|
+
class FetchTransport {
|
|
17
|
+
baseUrl;
|
|
18
|
+
token;
|
|
19
|
+
_fetch;
|
|
20
|
+
timeout;
|
|
21
|
+
userAgent;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, '');
|
|
24
|
+
this.token = options.token;
|
|
25
|
+
this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
26
|
+
if (options.timeout !== undefined)
|
|
27
|
+
this.timeout = options.timeout;
|
|
28
|
+
this.userAgent = getUserAgent();
|
|
29
|
+
}
|
|
30
|
+
async request(options) {
|
|
31
|
+
const url = `${this.baseUrl}/holo/api/v1${options.path}`;
|
|
32
|
+
const headers = {
|
|
33
|
+
'Authorization': `Bearer ${this.token}`,
|
|
34
|
+
'User-Agent': this.userAgent,
|
|
35
|
+
...options.headers,
|
|
36
|
+
};
|
|
37
|
+
if (options.body)
|
|
38
|
+
headers['Content-Type'] = 'application/json';
|
|
39
|
+
const init = { method: options.method, headers };
|
|
40
|
+
if (options.body)
|
|
41
|
+
init.body = JSON.stringify(options.body);
|
|
42
|
+
const effectiveSignal = this.applyTimeout(options.signal);
|
|
43
|
+
if (effectiveSignal)
|
|
44
|
+
init.signal = effectiveSignal;
|
|
45
|
+
try {
|
|
46
|
+
const response = await this._fetch(url, init);
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
await this.handleErrorResponse(response);
|
|
49
|
+
}
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
throw this.classifyAbortError(e, options.signal);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async streamRequest(options) {
|
|
57
|
+
const url = `${this.baseUrl}/holo/api/v1${options.path}`;
|
|
58
|
+
const headers = {
|
|
59
|
+
'Authorization': `Bearer ${this.token}`,
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
'Accept': 'text/event-stream',
|
|
62
|
+
'User-Agent': this.userAgent,
|
|
63
|
+
...options.headers,
|
|
64
|
+
};
|
|
65
|
+
const init = { method: 'POST', headers, body: JSON.stringify(options.body) };
|
|
66
|
+
const effectiveSignal = this.applyTimeout(options.signal);
|
|
67
|
+
if (effectiveSignal)
|
|
68
|
+
init.signal = effectiveSignal;
|
|
69
|
+
try {
|
|
70
|
+
const response = await this._fetch(url, init);
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
await this.handleErrorResponse(response);
|
|
73
|
+
}
|
|
74
|
+
if (!response.body) {
|
|
75
|
+
throw new HoloApiError('No response body for stream', 500);
|
|
76
|
+
}
|
|
77
|
+
return { body: response.body, response };
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
throw this.classifyAbortError(e, options.signal);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async handleErrorResponse(response) {
|
|
84
|
+
let errorBody;
|
|
85
|
+
let code;
|
|
86
|
+
const text = await response.text();
|
|
87
|
+
try {
|
|
88
|
+
errorBody = JSON.parse(text);
|
|
89
|
+
const body = errorBody;
|
|
90
|
+
if (typeof body === 'object' && body !== null) {
|
|
91
|
+
code = typeof body.code === 'string' ? body.code
|
|
92
|
+
: typeof body.error === 'object' && body.error !== null
|
|
93
|
+
? String(body.error.code ?? '')
|
|
94
|
+
: undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
errorBody = text;
|
|
99
|
+
}
|
|
100
|
+
throw new HoloApiError(`HTTP ${response.status}: ${response.statusText}`, response.status, code || undefined, errorBody);
|
|
101
|
+
}
|
|
102
|
+
applyTimeout(externalSignal) {
|
|
103
|
+
if (!this.timeout && !externalSignal)
|
|
104
|
+
return undefined;
|
|
105
|
+
if (!this.timeout)
|
|
106
|
+
return externalSignal;
|
|
107
|
+
const timeoutSignal = AbortSignal.timeout(this.timeout);
|
|
108
|
+
if (!externalSignal)
|
|
109
|
+
return timeoutSignal;
|
|
110
|
+
return AbortSignal.any([externalSignal, timeoutSignal]);
|
|
111
|
+
}
|
|
112
|
+
classifyAbortError(e, externalSignal) {
|
|
113
|
+
if (e instanceof HoloApiError || e instanceof HoloTimeoutError)
|
|
114
|
+
return e;
|
|
115
|
+
if (e instanceof DOMException && e.name === 'AbortError') {
|
|
116
|
+
if (externalSignal?.aborted)
|
|
117
|
+
return e;
|
|
118
|
+
if (this.timeout)
|
|
119
|
+
return new HoloTimeoutError(this.timeout);
|
|
120
|
+
}
|
|
121
|
+
if (e instanceof DOMException && e.name === 'TimeoutError') {
|
|
122
|
+
if (this.timeout)
|
|
123
|
+
return new HoloTimeoutError(this.timeout);
|
|
124
|
+
}
|
|
125
|
+
return e;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export { FetchTransport };
|
|
129
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { HoloApplicationInfo, HoloCountTokensParams, HoloCountTokensResponse, HoloEmbedParams, HoloEmbedResponse, HoloGenerateParams, HoloMessage, HoloModelInfo, HoloModelListParams, HoloRequest, HoloRequestMetadata } from '@holokai/holo-types/holo';
|
|
2
|
+
/** Parameters accepted by {@link ChatNamespace.create} and {@link ChatNamespace.stream}. */
|
|
3
|
+
export interface HoloChatParams {
|
|
4
|
+
model?: string;
|
|
5
|
+
messages: HoloMessage[];
|
|
6
|
+
temperature?: number;
|
|
7
|
+
max_tokens?: number;
|
|
8
|
+
top_p?: number;
|
|
9
|
+
top_k?: number;
|
|
10
|
+
frequency_penalty?: number;
|
|
11
|
+
presence_penalty?: number;
|
|
12
|
+
seed?: number;
|
|
13
|
+
stop_sequences?: string[];
|
|
14
|
+
tools?: HoloRequest['tools'];
|
|
15
|
+
tool_choice?: HoloRequest['tool_choice'];
|
|
16
|
+
response_format?: HoloRequest['response_format'];
|
|
17
|
+
metadata?: HoloRequestMetadata | null;
|
|
18
|
+
service_tier?: HoloRequest['service_tier'];
|
|
19
|
+
provider?: string;
|
|
20
|
+
application?: string;
|
|
21
|
+
thread_id?: string;
|
|
22
|
+
branch?: string;
|
|
23
|
+
protocol?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Configuration options for {@link HoloClient}. */
|
|
26
|
+
export interface HoloClientOptions {
|
|
27
|
+
/** Base URL of the Holo API (e.g. `'https://holo.example.com'`). Trailing slashes are stripped. */
|
|
28
|
+
baseUrl: string;
|
|
29
|
+
/** Bearer token for authentication (JWT or HoloToken). */
|
|
30
|
+
token: string;
|
|
31
|
+
/** Model identifier used when no model is specified per-request. */
|
|
32
|
+
defaultModel?: string;
|
|
33
|
+
/** Application slug used when no application is specified per-request. */
|
|
34
|
+
defaultApplication?: string;
|
|
35
|
+
/** Custom `fetch` implementation (defaults to `globalThis.fetch`). Useful for testing or custom transports. */
|
|
36
|
+
fetch?: typeof globalThis.fetch;
|
|
37
|
+
/** Request timeout in milliseconds. */
|
|
38
|
+
timeout?: number;
|
|
39
|
+
}
|
|
40
|
+
export type { HoloModelInfo, HoloApplicationInfo, HoloRequest, HoloGenerateParams, HoloEmbedParams, HoloEmbedResponse, HoloCountTokensParams, HoloCountTokensResponse, HoloModelListParams, };
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACtB,MAAM,0BAA0B,CAAC;AAElC,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAC9B,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+GAA+G;IAC/G,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY,EACR,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAC/C,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EACtD,qBAAqB,EAAE,uBAAuB,EAAE,mBAAmB,GACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class AsyncEventQueue<T> implements AsyncIterable<T> {
|
|
2
|
+
private q;
|
|
3
|
+
private pending;
|
|
4
|
+
private ended;
|
|
5
|
+
private err;
|
|
6
|
+
push(item: T): void;
|
|
7
|
+
end(): void;
|
|
8
|
+
fail(e: any): void;
|
|
9
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=async-event-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-event-queue.d.ts","sourceRoot":"","sources":["../../src/core/async-event-queue.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC,CAAW;IACpB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAa;IAExB,IAAI,CAAC,IAAI,EAAE,CAAC;IAOZ,GAAG;IAKH,IAAI,CAAC,CAAC,EAAE,GAAG;IAKX,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;CAU7C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class AsyncEventQueue {
|
|
2
|
+
q = [];
|
|
3
|
+
pending = [];
|
|
4
|
+
ended = false;
|
|
5
|
+
err = null;
|
|
6
|
+
push(item) {
|
|
7
|
+
if (this.ended)
|
|
8
|
+
return;
|
|
9
|
+
const r = this.pending.shift();
|
|
10
|
+
if (r)
|
|
11
|
+
r({ value: item, done: false });
|
|
12
|
+
else
|
|
13
|
+
this.q.push(item);
|
|
14
|
+
}
|
|
15
|
+
end() {
|
|
16
|
+
this.ended = true;
|
|
17
|
+
while (this.pending.length)
|
|
18
|
+
this.pending.shift()({ value: undefined, done: true });
|
|
19
|
+
}
|
|
20
|
+
fail(e) {
|
|
21
|
+
this.err = e;
|
|
22
|
+
this.end();
|
|
23
|
+
}
|
|
24
|
+
[Symbol.asyncIterator]() {
|
|
25
|
+
return {
|
|
26
|
+
next: () => {
|
|
27
|
+
if (this.err)
|
|
28
|
+
return Promise.reject(this.err);
|
|
29
|
+
if (this.q.length)
|
|
30
|
+
return Promise.resolve({ value: this.q.shift(), done: false });
|
|
31
|
+
if (this.ended)
|
|
32
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
33
|
+
return new Promise(resolve => this.pending.push(resolve));
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=async-event-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-event-queue.js","sourceRoot":"","sources":["../../src/core/async-event-queue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAChB,CAAC,GAAQ,EAAE,CAAC;IACZ,OAAO,GAAuC,EAAE,CAAC;IACjD,KAAK,GAAG,KAAK,CAAC;IACd,GAAG,GAAQ,IAAI,CAAC;IAExB,IAAI,CAAC,IAAO;QACR,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAE,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;;YAChC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG;QACC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,EAAC,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,CAAM;QACP,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC;QAClB,OAAO;YACH,IAAI,EAAE,GAAG,EAAE;gBACP,IAAI,IAAI,CAAC,GAAG;oBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM;oBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;gBACjF,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAC,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC9E,OAAO,IAAI,OAAO,CAAoB,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACjF,CAAC;SACJ,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/core/binary.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,SAAc,GAAG,MAAM,CAE5E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,UAAU,CAM5D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function uint8ToDataUrl(bytes, mime = "image/png") {
|
|
2
|
+
return `data:${mime};base64,${Buffer.from(bytes).toString("base64")}`;
|
|
3
|
+
}
|
|
4
|
+
export function isUint8Array(value) {
|
|
5
|
+
return value &&
|
|
6
|
+
typeof value === 'object' &&
|
|
7
|
+
typeof value.byteLength === 'number' &&
|
|
8
|
+
typeof value.buffer === 'object' &&
|
|
9
|
+
value.constructor?.name === 'Uint8Array';
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../src/core/binary.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,IAAI,GAAG,WAAW;IAChE,OAAO,QAAQ,IAAI,WAAW,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAU;IACnC,OAAO,KAAK;QACR,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,YAAY,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { HoloErrorCode } from '@holokai/holo-types/holo';
|
|
2
|
+
export declare class HoloError extends Error {
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
readonly code: HoloErrorCode;
|
|
5
|
+
constructor(statusCode: number, message: string, code?: HoloErrorCode);
|
|
6
|
+
static notFound(resource: string): HoloError;
|
|
7
|
+
static badRequest(message: string): HoloError;
|
|
8
|
+
static unauthorized(message?: string): HoloError;
|
|
9
|
+
static forbidden(message?: string): HoloError;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEvD,qBAAa,SAAU,SAAQ,KAAK;aAEZ,UAAU,EAAE,MAAM;aAElB,IAAI,EAAE,aAAa;gBAFnB,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM,EACC,IAAI,GAAE,aAA4C;IAMtE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAI5C,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI7C,MAAM,CAAC,YAAY,CAAC,OAAO,SAAiB,GAAG,SAAS;IAIxD,MAAM,CAAC,SAAS,CAAC,OAAO,SAAc,GAAG,SAAS;CAGrD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HoloErrorCode } from '@holokai/holo-types/holo';
|
|
2
|
+
export class HoloError extends Error {
|
|
3
|
+
statusCode;
|
|
4
|
+
code;
|
|
5
|
+
constructor(statusCode, message, code = HoloErrorCode.INTERNAL_ERROR) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = 'HoloError';
|
|
10
|
+
}
|
|
11
|
+
static notFound(resource) {
|
|
12
|
+
return new HoloError(404, `${resource} not found`, HoloErrorCode.NOT_FOUND);
|
|
13
|
+
}
|
|
14
|
+
static badRequest(message) {
|
|
15
|
+
return new HoloError(400, message, HoloErrorCode.VALIDATION_ERROR);
|
|
16
|
+
}
|
|
17
|
+
static unauthorized(message = 'Unauthorized') {
|
|
18
|
+
return new HoloError(401, message, HoloErrorCode.UNAUTHORIZED);
|
|
19
|
+
}
|
|
20
|
+
static forbidden(message = 'Forbidden') {
|
|
21
|
+
return new HoloError(403, message, HoloErrorCode.FORBIDDEN);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEvD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEZ;IAEA;IAHpB,YACoB,UAAkB,EAClC,OAAe,EACC,OAAsB,aAAa,CAAC,cAAc;QAElE,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,eAAU,GAAV,UAAU,CAAQ;QAElB,SAAI,GAAJ,IAAI,CAA8C;QAGlE,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAgB;QAC5B,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,QAAQ,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,OAAe;QAC7B,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAO,GAAG,cAAc;QACxC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW;QAClC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACJ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function pickHeadersByPrefix(headers: Record<string, string | string[] | undefined>, prefixes?: string[]): Record<string, string>;
|
|
2
|
+
export declare function filterForwardableHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string>;
|
|
3
|
+
//# sourceMappingURL=headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/core/headers.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACtD,QAAQ,GAAE,MAAM,EAAmB,GACpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAcD,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACvD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function pickHeadersByPrefix(headers, prefixes = ["anthropic-"]) {
|
|
2
|
+
if (!headers)
|
|
3
|
+
return {};
|
|
4
|
+
const lowerPrefixes = prefixes.map(p => p.toLowerCase());
|
|
5
|
+
const out = {};
|
|
6
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
7
|
+
if (v == null)
|
|
8
|
+
continue;
|
|
9
|
+
const keyLower = k.toLowerCase();
|
|
10
|
+
const matches = lowerPrefixes.some(p => keyLower.startsWith(p));
|
|
11
|
+
if (!matches)
|
|
12
|
+
continue;
|
|
13
|
+
out[k] = Array.isArray(v) ? v.join(",") : String(v);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
const BLOCKED_HEADERS = new Set([
|
|
18
|
+
'host',
|
|
19
|
+
'connection',
|
|
20
|
+
'keep-alive',
|
|
21
|
+
'transfer-encoding',
|
|
22
|
+
'upgrade',
|
|
23
|
+
'proxy-authenticate',
|
|
24
|
+
'proxy-authorization',
|
|
25
|
+
'te',
|
|
26
|
+
'trailer',
|
|
27
|
+
]);
|
|
28
|
+
export function filterForwardableHeaders(headers) {
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
31
|
+
if (v == null)
|
|
32
|
+
continue;
|
|
33
|
+
const keyLower = k.toLowerCase();
|
|
34
|
+
if (BLOCKED_HEADERS.has(keyLower))
|
|
35
|
+
continue;
|
|
36
|
+
if (keyLower.startsWith('proxy-'))
|
|
37
|
+
continue;
|
|
38
|
+
out[k] = Array.isArray(v) ? v.join(",") : String(v);
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/core/headers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAC/B,OAAsD,EACtD,WAAqB,CAAC,YAAY,CAAC;IAEnC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI;YAAE,SAAS;QAExB,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,SAAS;IACT,oBAAoB;IACpB,qBAAqB;IACrB,IAAI;IACJ,SAAS;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CACpC,OAAsD;IAEtD,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI;YAAE,SAAS;QAExB,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjC,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAE5C,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC"}
|