@seanhogg/builderforce-memory 2026.9.29 → 2026.9.31

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 (118) hide show
  1. package/dist/bridges/AnthropicBridge.d.ts.map +1 -1
  2. package/dist/bridges/AnthropicBridge.js +24 -65
  3. package/dist/bridges/AnthropicBridge.js.map +1 -1
  4. package/dist/bridges/FetchBridge.d.ts +12 -5
  5. package/dist/bridges/FetchBridge.d.ts.map +1 -1
  6. package/dist/bridges/FetchBridge.js +6 -4
  7. package/dist/bridges/FetchBridge.js.map +1 -1
  8. package/dist/bridges/OpenAIBridge.d.ts +17 -4
  9. package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
  10. package/dist/bridges/OpenAIBridge.js +71 -94
  11. package/dist/bridges/OpenAIBridge.js.map +1 -1
  12. package/dist/bridges/TransformerBridge.d.ts +6 -0
  13. package/dist/bridges/TransformerBridge.d.ts.map +1 -1
  14. package/dist/bridges/VertexAIBridge.d.ts.map +1 -1
  15. package/dist/bridges/VertexAIBridge.js +3 -34
  16. package/dist/bridges/VertexAIBridge.js.map +1 -1
  17. package/dist/distillation/DistillationEngine.d.ts +71 -54
  18. package/dist/distillation/DistillationEngine.d.ts.map +1 -1
  19. package/dist/distillation/DistillationEngine.js +112 -95
  20. package/dist/distillation/DistillationEngine.js.map +1 -1
  21. package/dist/distillation/index.d.ts +7 -1
  22. package/dist/distillation/index.d.ts.map +1 -1
  23. package/dist/distillation/index.js +5 -0
  24. package/dist/distillation/index.js.map +1 -1
  25. package/dist/distillation/ports.d.ts +43 -0
  26. package/dist/distillation/ports.d.ts.map +1 -0
  27. package/dist/distillation/ports.js +29 -0
  28. package/dist/distillation/ports.js.map +1 -0
  29. package/dist/eval/EvalHarness.d.ts +2 -1
  30. package/dist/eval/EvalHarness.d.ts.map +1 -1
  31. package/dist/eval/EvalHarness.js +13 -1
  32. package/dist/eval/EvalHarness.js.map +1 -1
  33. package/dist/eval/baseline.d.ts +33 -0
  34. package/dist/eval/baseline.d.ts.map +1 -0
  35. package/dist/eval/baseline.js +41 -0
  36. package/dist/eval/baseline.js.map +1 -0
  37. package/dist/eval/index.d.ts +1 -0
  38. package/dist/eval/index.d.ts.map +1 -1
  39. package/dist/eval/index.js +1 -0
  40. package/dist/eval/index.js.map +1 -1
  41. package/dist/eval/types.d.ts +7 -0
  42. package/dist/eval/types.d.ts.map +1 -1
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/rag/EnterpriseRetriever.d.ts.map +1 -1
  48. package/dist/rag/EnterpriseRetriever.js +2 -1
  49. package/dist/rag/EnterpriseRetriever.js.map +1 -1
  50. package/dist/retrieval/HybridRetriever.d.ts.map +1 -1
  51. package/dist/retrieval/HybridRetriever.js +2 -1
  52. package/dist/retrieval/HybridRetriever.js.map +1 -1
  53. package/dist/retrieval/decay.d.ts +24 -0
  54. package/dist/retrieval/decay.d.ts.map +1 -0
  55. package/dist/retrieval/decay.js +29 -0
  56. package/dist/retrieval/decay.js.map +1 -0
  57. package/dist/retrieval/fusion.d.ts +13 -19
  58. package/dist/retrieval/fusion.d.ts.map +1 -1
  59. package/dist/retrieval/fusion.js +17 -44
  60. package/dist/retrieval/fusion.js.map +1 -1
  61. package/dist/retrieval/index.d.ts +13 -6
  62. package/dist/retrieval/index.d.ts.map +1 -1
  63. package/dist/retrieval/index.js +10 -5
  64. package/dist/retrieval/index.js.map +1 -1
  65. package/dist/retrieval/mmr.d.ts +60 -0
  66. package/dist/retrieval/mmr.d.ts.map +1 -0
  67. package/dist/retrieval/mmr.js +94 -0
  68. package/dist/retrieval/mmr.js.map +1 -0
  69. package/dist/retrieval/weightedFusion.d.ts +64 -0
  70. package/dist/retrieval/weightedFusion.d.ts.map +1 -0
  71. package/dist/retrieval/weightedFusion.js +80 -0
  72. package/dist/retrieval/weightedFusion.js.map +1 -0
  73. package/dist/similarity/index.d.ts +6 -4
  74. package/dist/similarity/index.d.ts.map +1 -1
  75. package/dist/similarity/index.js +5 -3
  76. package/dist/similarity/index.js.map +1 -1
  77. package/dist/wire/chatClient.d.ts +100 -0
  78. package/dist/wire/chatClient.d.ts.map +1 -0
  79. package/dist/wire/chatClient.js +123 -0
  80. package/dist/wire/chatClient.js.map +1 -0
  81. package/dist/wire/index.d.ts +20 -0
  82. package/dist/wire/index.d.ts.map +1 -0
  83. package/dist/wire/index.js +18 -0
  84. package/dist/wire/index.js.map +1 -0
  85. package/dist/wire/sse.d.ts +37 -0
  86. package/dist/wire/sse.d.ts.map +1 -0
  87. package/dist/wire/sse.js +104 -0
  88. package/dist/wire/sse.js.map +1 -0
  89. package/dist/wire/usage.d.ts +46 -0
  90. package/dist/wire/usage.d.ts.map +1 -0
  91. package/dist/wire/usage.js +78 -0
  92. package/dist/wire/usage.js.map +1 -0
  93. package/package.json +11 -3
  94. package/src/bridges/AnthropicBridge.ts +24 -68
  95. package/src/bridges/FetchBridge.ts +15 -6
  96. package/src/bridges/OpenAIBridge.ts +84 -113
  97. package/src/bridges/TransformerBridge.ts +6 -0
  98. package/src/bridges/VertexAIBridge.ts +3 -32
  99. package/src/distillation/DistillationEngine.ts +176 -141
  100. package/src/distillation/index.ts +15 -1
  101. package/src/distillation/ports.ts +55 -0
  102. package/src/eval/EvalHarness.ts +12 -1
  103. package/src/eval/baseline.ts +51 -0
  104. package/src/eval/index.ts +1 -0
  105. package/src/eval/types.ts +7 -0
  106. package/src/index.ts +5 -2
  107. package/src/rag/EnterpriseRetriever.ts +2 -1
  108. package/src/retrieval/HybridRetriever.ts +2 -1
  109. package/src/retrieval/decay.ts +29 -0
  110. package/src/retrieval/fusion.ts +19 -52
  111. package/src/retrieval/index.ts +24 -6
  112. package/src/retrieval/mmr.ts +126 -0
  113. package/src/retrieval/weightedFusion.ts +101 -0
  114. package/src/similarity/index.ts +6 -4
  115. package/src/wire/chatClient.ts +196 -0
  116. package/src/wire/index.ts +20 -0
  117. package/src/wire/sse.ts +96 -0
  118. package/src/wire/usage.ts +95 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/similarity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,CAAc,EAAE,CAAc;IAC5D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,YAAY,EAAE,CAAC;IACrC,CAAC;IACD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;IAC7C,OAAO,YAAY,GAAG,KAAK,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,EAAE,IAAK,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,EAAE,IAAK,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/similarity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,CAAc,EAAE,CAAc;IAC5D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,YAAY,EAAE,CAAC;IACrC,CAAC;IACD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;IAC7C,OAAO,YAAY,GAAG,KAAK,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAoB,EAAE,CAAoB;IACvE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,EAAE,IAAK,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,EAAE,IAAK,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACzC,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The OpenAI-compatible chat-completions client — ONE request builder, error mapping
3
+ * and stream reader for every caller that speaks `/chat/completions`: this package's
4
+ * `OpenAIBridge` / `FetchBridge`, and any host that reaches models through an
5
+ * OpenAI-compatible gateway (tools, streamed tool-call deltas, vendor extras).
6
+ *
7
+ * The body carries exactly what the request states — no sampling defaults are added
8
+ * here, so a routing gateway that picks the model and limits can be called with none.
9
+ * Callers that want defaults (the bridges) state them.
10
+ *
11
+ * Zero-dependency and engine-free (part of the `/wire` subpath).
12
+ */
13
+ /** An OpenAI-compatible chat message. */
14
+ export interface ChatMessage {
15
+ role: 'system' | 'user' | 'assistant' | 'tool';
16
+ /** Text, or an OpenAI multi-part array (text + `image_url`, …). */
17
+ content?: string | null | unknown[];
18
+ tool_calls?: unknown;
19
+ tool_call_id?: string;
20
+ [k: string]: unknown;
21
+ }
22
+ /** An OpenAI-compatible function-tool schema. */
23
+ export interface ChatToolSchema {
24
+ type: 'function';
25
+ function: {
26
+ name: string;
27
+ description: string;
28
+ parameters: Record<string, unknown>;
29
+ };
30
+ }
31
+ export interface ChatRequest {
32
+ messages: ChatMessage[];
33
+ tools?: ChatToolSchema[];
34
+ model?: string;
35
+ maxTokens?: number;
36
+ temperature?: number;
37
+ topP?: number;
38
+ /**
39
+ * On a stream, ask for the closing usage block (`stream_options.include_usage`).
40
+ * Opt-in: not every OpenAI-compatible server accepts the field.
41
+ */
42
+ includeUsage?: boolean;
43
+ /** Vendor extras merged into the body last (a routing `provider`, `response_format`, …). */
44
+ extra?: Record<string, unknown>;
45
+ }
46
+ export interface ChatToolCall {
47
+ id?: string;
48
+ type?: string;
49
+ function?: {
50
+ name?: string;
51
+ arguments?: string;
52
+ };
53
+ }
54
+ export interface ChatResult {
55
+ /** The reply text ('' when there was none — e.g. a tool-call-only turn). */
56
+ content: string;
57
+ /** True when the server sent text content (a string), false when it sent none. */
58
+ hasTextContent: boolean;
59
+ toolCalls: ChatToolCall[];
60
+ finishReason?: string;
61
+ /** The model the server reports having used. */
62
+ model?: string;
63
+ /** The raw `usage` object, when the server sent one — read it with `readUsageFields`. */
64
+ usage?: unknown;
65
+ }
66
+ /** Incremental events of a streamed completion. */
67
+ export type ChatStreamEvent = {
68
+ type: 'text-delta';
69
+ delta: string;
70
+ } | {
71
+ type: 'tool-call';
72
+ index: number;
73
+ id?: string;
74
+ name?: string;
75
+ argsDelta?: string;
76
+ } | {
77
+ type: 'done';
78
+ result: ChatResult;
79
+ };
80
+ export interface ChatClient {
81
+ /** The OpenAI-style base, e.g. `https://api.openai.com/v1`; `/chat/completions` is appended. */
82
+ baseUrl: string;
83
+ apiKey: string;
84
+ /** Abort a request after this long. Default: no limit beyond the caller's signal. */
85
+ timeoutMs?: number;
86
+ }
87
+ /** A non-2xx answer, with the status and (bounded) body kept apart for the caller's message. */
88
+ export declare class ChatCompletionError extends Error {
89
+ readonly status: number;
90
+ readonly body: string;
91
+ constructor(status: number, body: string);
92
+ }
93
+ /** One non-streamed completion. Throws {@link ChatCompletionError} on a non-2xx answer. */
94
+ export declare function chatComplete(client: ChatClient, req: ChatRequest, signal?: AbortSignal): Promise<ChatResult>;
95
+ /**
96
+ * A streamed completion as events: text and tool-call deltas as they arrive, then one
97
+ * `done` carrying the assembled result (tool-call arguments concatenated per index).
98
+ */
99
+ export declare function chatStream(client: ChatClient, req: ChatRequest, signal?: AbortSignal): AsyncGenerator<ChatStreamEvent>;
100
+ //# sourceMappingURL=chatClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatClient.d.ts","sourceRoot":"","sources":["../../src/wire/chatClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The OpenAI-compatible chat-completions client — ONE request builder, error mapping
3
+ * and stream reader for every caller that speaks `/chat/completions`: this package's
4
+ * `OpenAIBridge` / `FetchBridge`, and any host that reaches models through an
5
+ * OpenAI-compatible gateway (tools, streamed tool-call deltas, vendor extras).
6
+ *
7
+ * The body carries exactly what the request states — no sampling defaults are added
8
+ * here, so a routing gateway that picks the model and limits can be called with none.
9
+ * Callers that want defaults (the bridges) state them.
10
+ *
11
+ * Zero-dependency and engine-free (part of the `/wire` subpath).
12
+ */
13
+ import { readSseDataFrames } from './sse.js';
14
+ /** A non-2xx answer, with the status and (bounded) body kept apart for the caller's message. */
15
+ export class ChatCompletionError extends Error {
16
+ status;
17
+ body;
18
+ constructor(status, body) {
19
+ super(`chat completion failed with HTTP ${status}: ${body}`);
20
+ this.status = status;
21
+ this.body = body;
22
+ this.name = 'ChatCompletionError';
23
+ }
24
+ }
25
+ const ERROR_BODY_CHARS = 300;
26
+ function chatBody(req, stream) {
27
+ return JSON.stringify({
28
+ ...(req.model ? { model: req.model } : {}),
29
+ messages: req.messages,
30
+ ...(req.tools?.length ? { tools: req.tools, tool_choice: 'auto' } : {}),
31
+ ...(typeof req.maxTokens === 'number' ? { max_tokens: req.maxTokens } : {}),
32
+ ...(typeof req.temperature === 'number' ? { temperature: req.temperature } : {}),
33
+ ...(typeof req.topP === 'number' ? { top_p: req.topP } : {}),
34
+ ...(stream ? { stream: true } : {}),
35
+ // Without include_usage a streamed response carries no usage block at all.
36
+ ...(stream && req.includeUsage ? { stream_options: { include_usage: true } } : {}),
37
+ ...(req.extra ?? {}),
38
+ });
39
+ }
40
+ async function post(client, req, stream, signal) {
41
+ const timeout = client.timeoutMs ? AbortSignal.timeout(client.timeoutMs) : undefined;
42
+ const res = await fetch(`${client.baseUrl.replace(/\/$/, '')}/chat/completions`, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json',
46
+ Authorization: `Bearer ${client.apiKey}`,
47
+ ...(stream ? { Accept: 'text/event-stream' } : {}),
48
+ },
49
+ body: chatBody(req, stream),
50
+ signal: signal && timeout ? AbortSignal.any([signal, timeout]) : (signal ?? timeout),
51
+ });
52
+ if (!res.ok || (stream && !res.body)) {
53
+ const body = await res.text().catch(() => '');
54
+ throw new ChatCompletionError(res.status, body.slice(0, ERROR_BODY_CHARS));
55
+ }
56
+ return res;
57
+ }
58
+ /** One non-streamed completion. Throws {@link ChatCompletionError} on a non-2xx answer. */
59
+ export async function chatComplete(client, req, signal) {
60
+ const res = await post(client, req, false, signal);
61
+ const json = (await res.json().catch(() => null));
62
+ const choice = json?.choices?.[0];
63
+ const msg = choice?.message;
64
+ return {
65
+ content: typeof msg?.content === 'string' ? msg.content : '',
66
+ hasTextContent: typeof msg?.content === 'string',
67
+ toolCalls: Array.isArray(msg?.tool_calls) ? msg.tool_calls : [],
68
+ finishReason: choice?.finish_reason,
69
+ ...(typeof json?.model === 'string' ? { model: json.model } : {}),
70
+ ...(json?.usage !== undefined ? { usage: json.usage } : {}),
71
+ };
72
+ }
73
+ /**
74
+ * A streamed completion as events: text and tool-call deltas as they arrive, then one
75
+ * `done` carrying the assembled result (tool-call arguments concatenated per index).
76
+ */
77
+ export async function* chatStream(client, req, signal) {
78
+ const res = await post(client, req, true, signal);
79
+ let content = '';
80
+ let finishReason;
81
+ let model;
82
+ let usage;
83
+ const calls = [];
84
+ for await (const frame of readSseDataFrames(res.body)) {
85
+ const chunk = frame;
86
+ if (typeof chunk.model === 'string')
87
+ model = chunk.model;
88
+ if (chunk.usage)
89
+ usage = chunk.usage;
90
+ const choice = chunk.choices?.[0];
91
+ if (!choice)
92
+ continue;
93
+ if (choice.finish_reason)
94
+ finishReason = choice.finish_reason;
95
+ const delta = choice.delta;
96
+ if (typeof delta?.content === 'string' && delta.content) {
97
+ content += delta.content;
98
+ yield { type: 'text-delta', delta: delta.content };
99
+ }
100
+ for (const tc of Array.isArray(delta?.tool_calls) ? delta.tool_calls : []) {
101
+ const index = typeof tc.index === 'number' ? tc.index : 0;
102
+ const acc = (calls[index] ??= { args: '' });
103
+ if (tc.id)
104
+ acc.id = tc.id;
105
+ if (tc.function?.name)
106
+ acc.name = tc.function.name;
107
+ const argsDelta = tc.function?.arguments;
108
+ if (typeof argsDelta === 'string')
109
+ acc.args += argsDelta;
110
+ yield { type: 'tool-call', index, id: tc.id, name: tc.function?.name, argsDelta };
111
+ }
112
+ }
113
+ const result = {
114
+ content,
115
+ hasTextContent: content !== '',
116
+ finishReason,
117
+ toolCalls: calls.filter(Boolean).map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: t.args } })),
118
+ ...(model ? { model } : {}),
119
+ ...(usage !== undefined ? { usage } : {}),
120
+ };
121
+ yield { type: 'done', result };
122
+ }
123
+ //# sourceMappingURL=chatClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatClient.js","sourceRoot":"","sources":["../../src/wire/chatClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * LLM wire primitives — the protocol-level pieces every client of an
3
+ * OpenAI/Anthropic/Gemini-style HTTP API needs, in ONE place:
4
+ *
5
+ * • Server-Sent-Events `data:` framing — one line rule ({@link parseSseDataLine}),
6
+ * applied to a whole buffered body ({@link parseSseDataFrames}) or to a live
7
+ * byte stream ({@link readSseDataFrames});
8
+ * • token-usage field reading across vendor shapes ({@link readUsageFields}) and
9
+ * the Anthropic streaming usage fold ({@link AnthropicStreamUsage}).
10
+ *
11
+ * The package's bridges and the Builderforce gateway both frame and meter with
12
+ * these, so a fix to the line rule (a spaceless `data:{…}` frame, say) lands once.
13
+ * Zero-dependency and engine-free: the `@seanhogg/builderforce-memory/wire` subpath.
14
+ */
15
+ export { sseDataPayload, parseSseDataLine, parseSseDataFrames, readSseDataPayloads, readSseDataFrames, isSseDoneLine } from './sse.js';
16
+ export { finiteNumber, readUsageFields, AnthropicStreamUsage } from './usage.js';
17
+ export type { UsageFields, AnthropicUsageTotals } from './usage.js';
18
+ export { chatComplete, chatStream, ChatCompletionError } from './chatClient.js';
19
+ export type { ChatClient, ChatMessage, ChatToolSchema, ChatRequest, ChatToolCall, ChatResult, ChatStreamEvent } from './chatClient.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wire/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACjF,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAChF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * LLM wire primitives — the protocol-level pieces every client of an
3
+ * OpenAI/Anthropic/Gemini-style HTTP API needs, in ONE place:
4
+ *
5
+ * • Server-Sent-Events `data:` framing — one line rule ({@link parseSseDataLine}),
6
+ * applied to a whole buffered body ({@link parseSseDataFrames}) or to a live
7
+ * byte stream ({@link readSseDataFrames});
8
+ * • token-usage field reading across vendor shapes ({@link readUsageFields}) and
9
+ * the Anthropic streaming usage fold ({@link AnthropicStreamUsage}).
10
+ *
11
+ * The package's bridges and the Builderforce gateway both frame and meter with
12
+ * these, so a fix to the line rule (a spaceless `data:{…}` frame, say) lands once.
13
+ * Zero-dependency and engine-free: the `@seanhogg/builderforce-memory/wire` subpath.
14
+ */
15
+ export { sseDataPayload, parseSseDataLine, parseSseDataFrames, readSseDataPayloads, readSseDataFrames, isSseDoneLine } from './sse.js';
16
+ export { finiteNumber, readUsageFields, AnthropicStreamUsage } from './usage.js';
17
+ export { chatComplete, chatStream, ChatCompletionError } from './chatClient.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wire/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Server-Sent-Events `data:` framing.
3
+ *
4
+ * Every consumer of an SSE LLM stream does the same line-level dance: trim the line,
5
+ * keep only `data:` frames, and stop at the `[DONE]` sentinel, which ends an
6
+ * OpenAI-style stream (anything after it is not part of the response). JSON streams
7
+ * then parse each payload and skip empty or malformed ones.
8
+ *
9
+ * The line rule is `slice(5).trim()`, which accepts both `data: {…}` and the
10
+ * spaceless `data:{…}` some providers emit — `slice(6)` silently drops the latter.
11
+ *
12
+ * Two levels, one rule: {@link readSseDataPayloads} yields payload TEXT (for callers
13
+ * whose frames are not all JSON, or that parse per wire shape), and
14
+ * {@link readSseDataFrames} yields parsed JSON on top of it.
15
+ *
16
+ * Pure and defensive: a malformed frame is skipped, never thrown.
17
+ */
18
+ /** The payload text of a `data:` line, or `undefined` for any other line. */
19
+ export declare function sseDataPayload(line: string): string | undefined;
20
+ /** True for the `data: [DONE]` line that ends an OpenAI-style stream. */
21
+ export declare function isSseDoneLine(line: string): boolean;
22
+ /**
23
+ * One SSE line's decoded JSON payload, or `undefined` when the line is not a usable
24
+ * data frame (not a `data:` line, the `[DONE]` sentinel, empty, or malformed JSON).
25
+ */
26
+ export declare function parseSseDataLine(line: string): unknown | undefined;
27
+ /** Every parsed `data:` frame of a whole, already-buffered SSE body, up to `[DONE]`. */
28
+ export declare function parseSseDataFrames(raw: string): Generator<unknown>;
29
+ /**
30
+ * Every `data:` payload of a live SSE byte stream, as text, as it arrives, up to
31
+ * `[DONE]`. A line split across chunks is held until its newline arrives; the reader
32
+ * lock is released however iteration ends. A missing body yields nothing.
33
+ */
34
+ export declare function readSseDataPayloads(body: ReadableStream<Uint8Array> | null | undefined): AsyncGenerator<string>;
35
+ /** Every parsed JSON `data:` frame of a live SSE byte stream, up to `[DONE]`. */
36
+ export declare function readSseDataFrames(body: ReadableStream<Uint8Array> | null | undefined): AsyncGenerator<unknown>;
37
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/wire/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI/D;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAQlE;AAED,wFAAwF;AACxF,wBAAiB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAMnE;AAED;;;;GAIG;AACH,wBAAuB,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAyBtH;AAED,iFAAiF;AACjF,wBAAuB,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CASrH"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Server-Sent-Events `data:` framing.
3
+ *
4
+ * Every consumer of an SSE LLM stream does the same line-level dance: trim the line,
5
+ * keep only `data:` frames, and stop at the `[DONE]` sentinel, which ends an
6
+ * OpenAI-style stream (anything after it is not part of the response). JSON streams
7
+ * then parse each payload and skip empty or malformed ones.
8
+ *
9
+ * The line rule is `slice(5).trim()`, which accepts both `data: {…}` and the
10
+ * spaceless `data:{…}` some providers emit — `slice(6)` silently drops the latter.
11
+ *
12
+ * Two levels, one rule: {@link readSseDataPayloads} yields payload TEXT (for callers
13
+ * whose frames are not all JSON, or that parse per wire shape), and
14
+ * {@link readSseDataFrames} yields parsed JSON on top of it.
15
+ *
16
+ * Pure and defensive: a malformed frame is skipped, never thrown.
17
+ */
18
+ /** The payload text of a `data:` line, or `undefined` for any other line. */
19
+ export function sseDataPayload(line) {
20
+ const trimmed = line.trim();
21
+ if (!trimmed.startsWith('data:'))
22
+ return undefined;
23
+ return trimmed.slice(5).trim();
24
+ }
25
+ /** True for the `data: [DONE]` line that ends an OpenAI-style stream. */
26
+ export function isSseDoneLine(line) {
27
+ return sseDataPayload(line) === '[DONE]';
28
+ }
29
+ /**
30
+ * One SSE line's decoded JSON payload, or `undefined` when the line is not a usable
31
+ * data frame (not a `data:` line, the `[DONE]` sentinel, empty, or malformed JSON).
32
+ */
33
+ export function parseSseDataLine(line) {
34
+ const data = sseDataPayload(line);
35
+ if (!data || data === '[DONE]')
36
+ return undefined;
37
+ try {
38
+ return JSON.parse(data);
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ /** Every parsed `data:` frame of a whole, already-buffered SSE body, up to `[DONE]`. */
45
+ export function* parseSseDataFrames(raw) {
46
+ for (const line of raw.split('\n')) {
47
+ if (isSseDoneLine(line))
48
+ return;
49
+ const parsed = parseSseDataLine(line);
50
+ if (parsed !== undefined)
51
+ yield parsed;
52
+ }
53
+ }
54
+ /**
55
+ * Every `data:` payload of a live SSE byte stream, as text, as it arrives, up to
56
+ * `[DONE]`. A line split across chunks is held until its newline arrives; the reader
57
+ * lock is released however iteration ends. A missing body yields nothing.
58
+ */
59
+ export async function* readSseDataPayloads(body) {
60
+ if (!body)
61
+ return;
62
+ const reader = body.getReader();
63
+ const decoder = new TextDecoder();
64
+ let buffer = '';
65
+ try {
66
+ while (true) {
67
+ const { done, value } = await reader.read();
68
+ if (done)
69
+ break;
70
+ buffer += decoder.decode(value, { stream: true });
71
+ const lines = buffer.split('\n');
72
+ buffer = lines.pop(); // split() always yields ≥1 element
73
+ for (const line of lines) {
74
+ const data = sseDataPayload(line);
75
+ if (data === undefined)
76
+ continue;
77
+ if (data === '[DONE]')
78
+ return;
79
+ yield data;
80
+ }
81
+ }
82
+ buffer += decoder.decode();
83
+ const tail = sseDataPayload(buffer);
84
+ if (tail !== undefined && tail !== '[DONE]')
85
+ yield tail;
86
+ }
87
+ finally {
88
+ reader.releaseLock();
89
+ }
90
+ }
91
+ /** Every parsed JSON `data:` frame of a live SSE byte stream, up to `[DONE]`. */
92
+ export async function* readSseDataFrames(body) {
93
+ for await (const data of readSseDataPayloads(body)) {
94
+ if (!data)
95
+ continue;
96
+ try {
97
+ yield JSON.parse(data);
98
+ }
99
+ catch {
100
+ // Skip malformed SSE frames rather than failing the stream.
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/wire/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Token-usage reading across vendor shapes.
3
+ *
4
+ * Two wire shapes reach a client: OpenAI-style `prompt_tokens`/`completion_tokens`
5
+ * (cached reads under `prompt_tokens_details.cached_tokens`, INCLUDED in
6
+ * `prompt_tokens`) and Anthropic-style `input_tokens`/`output_tokens` (cache reads
7
+ * and writes as separate top-level fields, EXCLUDED from `input_tokens`).
8
+ * {@link readUsageFields} reads either into one set of optional fields, keeping
9
+ * "absent" distinct from 0; each consumer then maps them to its own accounting.
10
+ *
11
+ * Streaming Anthropic responses split usage across events — input and cache on
12
+ * `message_start.message.usage`, output accumulating on `message_delta.usage` — and
13
+ * every count is cumulative, so {@link AnthropicStreamUsage} keeps the largest seen.
14
+ */
15
+ /** A finite number, or `undefined` for null/undefined/non-numeric input. */
16
+ export declare function finiteNumber(v: unknown): number | undefined;
17
+ /** Usage as the vendor reported it. Every field is absent when the vendor omitted it. */
18
+ export interface UsageFields {
19
+ /** `prompt_tokens`, else `input_tokens`. */
20
+ promptTokens?: number;
21
+ /** `completion_tokens`, else `output_tokens`. */
22
+ completionTokens?: number;
23
+ totalTokens?: number;
24
+ /** `cache_read_input_tokens`, else `prompt_tokens_details.cached_tokens`. */
25
+ cacheReadTokens?: number;
26
+ /** `cache_creation_input_tokens`. */
27
+ cacheCreationTokens?: number;
28
+ }
29
+ /** Reads a vendor `usage` object of either shape. Anything that is not an object reads as empty. */
30
+ export declare function readUsageFields(u: unknown): UsageFields;
31
+ /** The totals of one Anthropic stream. Input excludes both cache counts. */
32
+ export interface AnthropicUsageTotals {
33
+ inputTokens: number;
34
+ outputTokens: number;
35
+ cacheReadTokens: number;
36
+ cacheCreationTokens: number;
37
+ /** `message_start.message.model`, when the stream named it. */
38
+ model?: string;
39
+ }
40
+ /** Folds the usage events of one Anthropic Messages stream. Feed it every parsed frame. */
41
+ export declare class AnthropicStreamUsage {
42
+ private readonly totals;
43
+ observe(frame: unknown): void;
44
+ result(): AnthropicUsageTotals;
45
+ }
46
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI3D;AAED,yFAAyF;AACzF,MAAM,WAAW,WAAW;IACxB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,CAoBvD;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyG;IAEhI,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAmB7B,MAAM,IAAI,oBAAoB;CAGjC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Token-usage reading across vendor shapes.
3
+ *
4
+ * Two wire shapes reach a client: OpenAI-style `prompt_tokens`/`completion_tokens`
5
+ * (cached reads under `prompt_tokens_details.cached_tokens`, INCLUDED in
6
+ * `prompt_tokens`) and Anthropic-style `input_tokens`/`output_tokens` (cache reads
7
+ * and writes as separate top-level fields, EXCLUDED from `input_tokens`).
8
+ * {@link readUsageFields} reads either into one set of optional fields, keeping
9
+ * "absent" distinct from 0; each consumer then maps them to its own accounting.
10
+ *
11
+ * Streaming Anthropic responses split usage across events — input and cache on
12
+ * `message_start.message.usage`, output accumulating on `message_delta.usage` — and
13
+ * every count is cumulative, so {@link AnthropicStreamUsage} keeps the largest seen.
14
+ */
15
+ /** A finite number, or `undefined` for null/undefined/non-numeric input. */
16
+ export function finiteNumber(v) {
17
+ if (v === null || v === undefined)
18
+ return undefined;
19
+ const n = Number(v);
20
+ return Number.isFinite(n) ? n : undefined;
21
+ }
22
+ /** Reads a vendor `usage` object of either shape. Anything that is not an object reads as empty. */
23
+ export function readUsageFields(u) {
24
+ const out = {};
25
+ if (!u || typeof u !== 'object')
26
+ return out;
27
+ const usage = u;
28
+ const prompt = finiteNumber(usage['prompt_tokens'] ?? usage['input_tokens']);
29
+ const completion = finiteNumber(usage['completion_tokens'] ?? usage['output_tokens']);
30
+ const total = finiteNumber(usage['total_tokens']);
31
+ if (prompt !== undefined)
32
+ out.promptTokens = prompt;
33
+ if (completion !== undefined)
34
+ out.completionTokens = completion;
35
+ if (total !== undefined)
36
+ out.totalTokens = total;
37
+ const details = usage['prompt_tokens_details'];
38
+ const cachedFromDetails = details && typeof details === 'object'
39
+ ? finiteNumber(details['cached_tokens'])
40
+ : undefined;
41
+ const cacheRead = finiteNumber(usage['cache_read_input_tokens']) ?? cachedFromDetails;
42
+ const cacheCreation = finiteNumber(usage['cache_creation_input_tokens']);
43
+ if (cacheRead !== undefined)
44
+ out.cacheReadTokens = cacheRead;
45
+ if (cacheCreation !== undefined)
46
+ out.cacheCreationTokens = cacheCreation;
47
+ return out;
48
+ }
49
+ /** Folds the usage events of one Anthropic Messages stream. Feed it every parsed frame. */
50
+ export class AnthropicStreamUsage {
51
+ totals = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 };
52
+ observe(frame) {
53
+ if (!frame || typeof frame !== 'object')
54
+ return;
55
+ const ev = frame;
56
+ let usage;
57
+ if (ev.type === 'message_start') {
58
+ usage = ev.message?.usage;
59
+ if (typeof ev.message?.model === 'string')
60
+ this.totals.model = ev.message.model;
61
+ }
62
+ else if (ev.type === 'message_delta') {
63
+ usage = ev.usage;
64
+ }
65
+ if (!usage || typeof usage !== 'object')
66
+ return;
67
+ const u = usage;
68
+ const keep = (current, v) => Math.max(current, finiteNumber(v) ?? 0);
69
+ this.totals.inputTokens = keep(this.totals.inputTokens, u['input_tokens']);
70
+ this.totals.outputTokens = keep(this.totals.outputTokens, u['output_tokens']);
71
+ this.totals.cacheReadTokens = keep(this.totals.cacheReadTokens, u['cache_read_input_tokens']);
72
+ this.totals.cacheCreationTokens = keep(this.totals.cacheCreationTokens, u['cache_creation_input_tokens']);
73
+ }
74
+ result() {
75
+ return { ...this.totals };
76
+ }
77
+ }
78
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanhogg/builderforce-memory",
3
- "version": "2026.9.29",
3
+ "version": "2026.9.31",
4
4
  "description": "BuilderForce Agent Memory — runtime layer. SSM execution, Transformer orchestration, online distillation, enterprise RAG (ingestion pipelines, vector-store adapters, tenant/ACL-scoped hybrid retrieval), multi-agent graph orchestration, LLM telemetry and cost accounting, and persistent agent memory for BuilderForce.ai agents.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -14,6 +14,14 @@
14
14
  "types": "./dist/retrieval/index.d.ts",
15
15
  "import": "./dist/retrieval/index.js"
16
16
  },
17
+ "./wire": {
18
+ "types": "./dist/wire/index.d.ts",
19
+ "import": "./dist/wire/index.js"
20
+ },
21
+ "./distillation": {
22
+ "types": "./dist/distillation/index.d.ts",
23
+ "import": "./dist/distillation/index.js"
24
+ },
17
25
  "./telemetry": {
18
26
  "types": "./dist/telemetry/index.d.ts",
19
27
  "import": "./dist/telemetry/index.js"
@@ -87,7 +95,7 @@
87
95
  },
88
96
  "homepage": "https://github.com/SeanHogg/builderforce-memory/tree/main/packages/memory#readme",
89
97
  "peerDependencies": {
90
- "@seanhogg/builderforce-memory-engine": "^2026.9.29"
98
+ "@seanhogg/builderforce-memory-engine": "^2026.9.31"
91
99
  },
92
100
  "devDependencies": {
93
101
  "@jest/globals": "^29.7.0",
@@ -101,7 +109,7 @@
101
109
  "ts-jest": "^29.2.0",
102
110
  "typescript": "^6.0.3",
103
111
  "@typescript/native-preview": "7.0.0-dev.20260627.2",
104
- "@seanhogg/builderforce-memory-engine": "2026.9.29"
112
+ "@seanhogg/builderforce-memory-engine": "2026.9.31"
105
113
  },
106
114
  "jest": {
107
115
  "preset": "ts-jest/presets/default-esm",