@jxburros/ai-nugget 0.4.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +158 -382
  2. package/UPGRADING.md +182 -0
  3. package/dist/adapters/engines/anthropic.d.ts +7 -1
  4. package/dist/adapters/engines/anthropic.js +82 -37
  5. package/dist/adapters/engines/base.d.ts +29 -2
  6. package/dist/adapters/engines/base.js +52 -8
  7. package/dist/adapters/engines/google.d.ts +7 -1
  8. package/dist/adapters/engines/google.js +80 -29
  9. package/dist/adapters/engines/ollama.d.ts +2 -1
  10. package/dist/adapters/engines/ollama.js +57 -15
  11. package/dist/adapters/engines/openaiChat.d.ts +8 -1
  12. package/dist/adapters/engines/openaiChat.js +109 -29
  13. package/dist/adapters/profiles.d.ts +21 -1
  14. package/dist/adapters/profiles.js +12 -2
  15. package/dist/agent/loop.d.ts +45 -1
  16. package/dist/agent/loop.js +117 -12
  17. package/dist/cjs/adapters/engines/anthropic.js +326 -0
  18. package/dist/cjs/adapters/engines/base.js +147 -0
  19. package/dist/cjs/adapters/engines/google.js +291 -0
  20. package/dist/cjs/adapters/engines/ollama.js +205 -0
  21. package/dist/cjs/adapters/engines/openaiChat.js +312 -0
  22. package/dist/cjs/adapters/index.js +22 -0
  23. package/dist/cjs/adapters/profiles.js +125 -0
  24. package/dist/cjs/agent/index.js +18 -0
  25. package/dist/cjs/agent/loop.js +373 -0
  26. package/dist/cjs/agent/tools.js +51 -0
  27. package/dist/cjs/connect.js +27 -0
  28. package/dist/cjs/errors.js +110 -0
  29. package/dist/cjs/handler.js +586 -0
  30. package/dist/cjs/index.js +28 -0
  31. package/dist/cjs/json.js +121 -0
  32. package/dist/cjs/keys.js +81 -0
  33. package/dist/cjs/package.json +3 -0
  34. package/dist/cjs/policy.js +42 -0
  35. package/dist/cjs/reasoning.js +159 -0
  36. package/dist/cjs/redact.js +78 -0
  37. package/dist/cjs/tokens.js +22 -0
  38. package/dist/cjs/transport.js +172 -0
  39. package/dist/cjs/types.js +6 -0
  40. package/dist/cjs/util.js +126 -0
  41. package/dist/errors.js +25 -1
  42. package/dist/handler.d.ts +67 -1
  43. package/dist/handler.js +266 -61
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.js +1 -0
  46. package/dist/reasoning.d.ts +45 -0
  47. package/dist/reasoning.js +154 -0
  48. package/dist/redact.d.ts +18 -0
  49. package/dist/redact.js +29 -1
  50. package/dist/transport.d.ts +3 -1
  51. package/dist/transport.js +21 -1
  52. package/dist/types.d.ts +112 -2
  53. package/dist/util.d.ts +22 -0
  54. package/dist/util.js +59 -0
  55. package/nugget/VERSION.txt +2 -2
  56. package/nugget/dist/adapters/engines/anthropic.d.ts +14 -0
  57. package/nugget/dist/adapters/engines/anthropic.d.ts.map +1 -0
  58. package/nugget/dist/adapters/engines/anthropic.js +323 -0
  59. package/nugget/dist/adapters/engines/anthropic.js.map +1 -0
  60. package/nugget/dist/adapters/engines/base.d.ts +50 -0
  61. package/nugget/dist/adapters/engines/base.d.ts.map +1 -0
  62. package/nugget/dist/adapters/engines/base.js +137 -0
  63. package/nugget/dist/adapters/engines/base.js.map +1 -0
  64. package/nugget/dist/adapters/engines/google.d.ts +24 -0
  65. package/nugget/dist/adapters/engines/google.d.ts.map +1 -0
  66. package/nugget/dist/adapters/engines/google.js +288 -0
  67. package/nugget/dist/adapters/engines/google.js.map +1 -0
  68. package/nugget/dist/adapters/engines/ollama.d.ts +11 -0
  69. package/nugget/dist/adapters/engines/ollama.d.ts.map +1 -0
  70. package/nugget/dist/adapters/engines/ollama.js +202 -0
  71. package/nugget/dist/adapters/engines/ollama.js.map +1 -0
  72. package/nugget/dist/adapters/engines/openaiChat.d.ts +22 -0
  73. package/nugget/dist/adapters/engines/openaiChat.d.ts.map +1 -0
  74. package/nugget/dist/adapters/engines/openaiChat.js +308 -0
  75. package/nugget/dist/adapters/engines/openaiChat.js.map +1 -0
  76. package/nugget/dist/adapters/index.d.ts +5 -0
  77. package/nugget/dist/adapters/index.d.ts.map +1 -0
  78. package/nugget/dist/adapters/index.js +17 -0
  79. package/nugget/dist/adapters/index.js.map +1 -0
  80. package/nugget/dist/adapters/profiles.d.ts +62 -0
  81. package/nugget/dist/adapters/profiles.d.ts.map +1 -0
  82. package/nugget/dist/adapters/profiles.js +121 -0
  83. package/nugget/dist/adapters/profiles.js.map +1 -0
  84. package/nugget/dist/agent/index.d.ts +3 -0
  85. package/nugget/dist/agent/index.d.ts.map +1 -0
  86. package/nugget/dist/agent/index.js +3 -0
  87. package/nugget/dist/agent/index.js.map +1 -0
  88. package/nugget/dist/agent/loop.d.ts +114 -0
  89. package/nugget/dist/agent/loop.d.ts.map +1 -0
  90. package/nugget/dist/agent/loop.js +371 -0
  91. package/nugget/dist/agent/loop.js.map +1 -0
  92. package/nugget/dist/agent/tools.d.ts +29 -0
  93. package/nugget/dist/agent/tools.d.ts.map +1 -0
  94. package/nugget/dist/agent/tools.js +48 -0
  95. package/nugget/dist/agent/tools.js.map +1 -0
  96. package/nugget/dist/cjs/adapters/engines/anthropic.js +326 -0
  97. package/nugget/dist/cjs/adapters/engines/base.js +147 -0
  98. package/nugget/dist/cjs/adapters/engines/google.js +291 -0
  99. package/nugget/dist/cjs/adapters/engines/ollama.js +205 -0
  100. package/nugget/dist/cjs/adapters/engines/openaiChat.js +312 -0
  101. package/nugget/dist/cjs/adapters/index.js +22 -0
  102. package/nugget/dist/cjs/adapters/profiles.js +125 -0
  103. package/nugget/dist/cjs/agent/index.js +18 -0
  104. package/nugget/dist/cjs/agent/loop.js +373 -0
  105. package/nugget/dist/cjs/agent/tools.js +51 -0
  106. package/nugget/dist/cjs/connect.js +27 -0
  107. package/nugget/dist/cjs/errors.js +110 -0
  108. package/nugget/dist/cjs/handler.js +586 -0
  109. package/nugget/dist/cjs/index.js +28 -0
  110. package/nugget/dist/cjs/json.js +121 -0
  111. package/nugget/dist/cjs/keys.js +81 -0
  112. package/nugget/dist/cjs/package.json +3 -0
  113. package/nugget/dist/cjs/policy.js +42 -0
  114. package/nugget/dist/cjs/reasoning.js +159 -0
  115. package/nugget/dist/cjs/redact.js +78 -0
  116. package/nugget/dist/cjs/tokens.js +22 -0
  117. package/nugget/dist/cjs/transport.js +172 -0
  118. package/nugget/dist/cjs/types.js +6 -0
  119. package/nugget/dist/cjs/util.js +126 -0
  120. package/nugget/dist/connect.d.ts +31 -0
  121. package/nugget/dist/connect.d.ts.map +1 -0
  122. package/nugget/dist/connect.js +25 -0
  123. package/nugget/dist/connect.js.map +1 -0
  124. package/nugget/dist/errors.d.ts +22 -0
  125. package/nugget/dist/errors.d.ts.map +1 -0
  126. package/nugget/dist/errors.js +104 -0
  127. package/nugget/dist/errors.js.map +1 -0
  128. package/nugget/dist/handler.d.ts +114 -0
  129. package/nugget/dist/handler.d.ts.map +1 -0
  130. package/nugget/dist/handler.js +582 -0
  131. package/nugget/dist/handler.js.map +1 -0
  132. package/nugget/dist/index.d.ts +13 -0
  133. package/nugget/dist/index.d.ts.map +1 -0
  134. package/nugget/dist/index.js +13 -0
  135. package/nugget/dist/index.js.map +1 -0
  136. package/nugget/dist/json.d.ts +7 -0
  137. package/nugget/dist/json.d.ts.map +1 -0
  138. package/nugget/dist/json.js +114 -0
  139. package/nugget/dist/json.js.map +1 -0
  140. package/nugget/dist/keys.d.ts +7 -0
  141. package/nugget/dist/keys.d.ts.map +1 -0
  142. package/nugget/dist/keys.js +75 -0
  143. package/nugget/dist/keys.js.map +1 -0
  144. package/nugget/dist/policy.d.ts +6 -0
  145. package/nugget/dist/policy.d.ts.map +1 -0
  146. package/nugget/dist/policy.js +37 -0
  147. package/nugget/dist/policy.js.map +1 -0
  148. package/nugget/dist/reasoning.d.ts +45 -0
  149. package/nugget/dist/reasoning.d.ts.map +1 -0
  150. package/nugget/dist/reasoning.js +154 -0
  151. package/nugget/dist/reasoning.js.map +1 -0
  152. package/nugget/dist/redact.d.ts +26 -0
  153. package/nugget/dist/redact.d.ts.map +1 -0
  154. package/nugget/dist/redact.js +74 -0
  155. package/nugget/dist/redact.js.map +1 -0
  156. package/nugget/dist/tokens.d.ts +5 -0
  157. package/nugget/dist/tokens.d.ts.map +1 -0
  158. package/nugget/dist/tokens.js +18 -0
  159. package/nugget/dist/tokens.js.map +1 -0
  160. package/nugget/dist/transport.d.ts +30 -0
  161. package/nugget/dist/transport.d.ts.map +1 -0
  162. package/nugget/dist/transport.js +165 -0
  163. package/nugget/dist/transport.js.map +1 -0
  164. package/nugget/dist/types.d.ts +301 -0
  165. package/nugget/dist/types.d.ts.map +1 -0
  166. package/nugget/dist/types.js +4 -0
  167. package/nugget/dist/types.js.map +1 -0
  168. package/nugget/dist/util.d.ts +31 -0
  169. package/nugget/dist/util.d.ts.map +1 -0
  170. package/nugget/dist/util.js +114 -0
  171. package/nugget/dist/util.js.map +1 -0
  172. package/nugget/src/adapters/engines/anthropic.ts +78 -37
  173. package/nugget/src/adapters/engines/base.ts +50 -7
  174. package/nugget/src/adapters/engines/google.ts +79 -29
  175. package/nugget/src/adapters/engines/ollama.ts +56 -17
  176. package/nugget/src/adapters/engines/openaiChat.ts +104 -30
  177. package/nugget/src/adapters/profiles.ts +53 -3
  178. package/nugget/src/agent/loop.ts +156 -13
  179. package/nugget/src/errors.ts +25 -1
  180. package/nugget/src/handler.ts +308 -59
  181. package/nugget/src/index.ts +1 -0
  182. package/nugget/src/reasoning.ts +174 -0
  183. package/nugget/src/redact.ts +32 -1
  184. package/nugget/src/transport.ts +20 -1
  185. package/nugget/src/types.ts +113 -1
  186. package/nugget/src/util.ts +64 -0
  187. package/package.json +18 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,OAAO;QACL,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC;QACtC,YAAY,EAAE,cAAc,CAAC,UAAU,CAAC;QACxC,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAQ,EAAE,CAAQ;IAC3C,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;QACxD,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;QAC3D,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ export declare function withTimeout(ms: number, external?: AbortSignal, idleMs?: number): {
2
+ signal: AbortSignal;
3
+ done(): void;
4
+ timedOut(): boolean;
5
+ /** Reset the idle timer. No-op unless `idleMs` was supplied. Call on each chunk. */
6
+ bump(): void;
7
+ };
8
+ export declare function fetchJson(url: string, init: RequestInit & {
9
+ timeoutMs: number;
10
+ provider?: string;
11
+ }): Promise<{
12
+ data: unknown;
13
+ status: number;
14
+ totalMs: number;
15
+ }>;
16
+ /**
17
+ * POST a JSON body and return the raw {@link Response} for streaming.
18
+ *
19
+ * The caller owns the abort/timeout `signal` and is responsible for keeping it
20
+ * alive until the response body has been fully consumed — passing a
21
+ * `withTimeout()` signal here and cleaning it up only after the stream ends is
22
+ * what lets external cancellation and the timeout apply for the *whole* stream,
23
+ * not merely the connection handshake. Non-2xx responses are classified and
24
+ * thrown before the body is handed back.
25
+ */
26
+ export declare function postResponse(url: string, body: unknown, headers: Record<string, string>, signal: AbortSignal, provider: string): Promise<Response>;
27
+ export declare function sseLines(res: Response): AsyncIterable<string>;
28
+ export declare function ndjsonLines(res: Response): AsyncIterable<unknown>;
29
+ export declare function textLines(res: Response): AsyncIterable<string>;
30
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAChF,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC;IACb,QAAQ,IAAI,OAAO,CAAC;IACpB,oFAAoF;IACpF,IAAI,IAAI,IAAI,CAAC;CACd,CAuCA;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAClH,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAcD;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED,wBAAuB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CASpE;AAED,wBAAuB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAUxE;AAED,wBAAuB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CA+BrE"}
@@ -0,0 +1,165 @@
1
+ import { AIError, classify, fromUnknown } from './errors.js';
2
+ export function withTimeout(ms, external, idleMs) {
3
+ const controller = new AbortController();
4
+ let didTimeOut = false;
5
+ const timer = setTimeout(() => {
6
+ didTimeOut = true;
7
+ controller.abort(new AIError(`Request timed out after ${ms}ms`, { kind: 'timeout' }));
8
+ }, ms);
9
+ // Optional idle timeout: aborts only when no chunk has arrived for `idleMs`,
10
+ // rearmed on every `bump()`. Keeps a long but healthy stream alive while the
11
+ // total `ms` ceiling still bounds a truly stuck call.
12
+ let idleTimer;
13
+ const armIdle = () => {
14
+ if (idleMs === undefined)
15
+ return;
16
+ if (idleTimer)
17
+ clearTimeout(idleTimer);
18
+ idleTimer = setTimeout(() => {
19
+ didTimeOut = true;
20
+ controller.abort(new AIError(`Request idle for ${idleMs}ms`, { kind: 'timeout' }));
21
+ }, idleMs);
22
+ };
23
+ const onAbort = () => controller.abort(external?.reason);
24
+ if (external) {
25
+ if (external.aborted)
26
+ onAbort();
27
+ else
28
+ external.addEventListener('abort', onAbort, { once: true });
29
+ }
30
+ armIdle();
31
+ return {
32
+ signal: controller.signal,
33
+ done() {
34
+ clearTimeout(timer);
35
+ if (idleTimer)
36
+ clearTimeout(idleTimer);
37
+ external?.removeEventListener('abort', onAbort);
38
+ },
39
+ timedOut() {
40
+ return didTimeOut;
41
+ },
42
+ bump() {
43
+ armIdle();
44
+ },
45
+ };
46
+ }
47
+ export async function fetchJson(url, init) {
48
+ const timeout = withTimeout(init.timeoutMs, init.signal ?? undefined);
49
+ const started = Date.now();
50
+ try {
51
+ const res = await fetch(url, { ...init, signal: timeout.signal });
52
+ const raw = await res.text().catch(() => '');
53
+ if (!res.ok)
54
+ throw classify(res.status, raw, init.provider, res.headers);
55
+ return { data: raw.trim() ? tolerantJson(raw) : null, status: res.status, totalMs: Date.now() - started };
56
+ }
57
+ catch (error) {
58
+ if (timeout.timedOut())
59
+ throw new AIError(`Request timed out after ${init.timeoutMs}ms`, { kind: 'timeout', provider: init.provider });
60
+ throw fromUnknown(error, init.provider);
61
+ }
62
+ finally {
63
+ timeout.done();
64
+ }
65
+ }
66
+ /**
67
+ * POST a JSON body and return the raw {@link Response} for streaming.
68
+ *
69
+ * The caller owns the abort/timeout `signal` and is responsible for keeping it
70
+ * alive until the response body has been fully consumed — passing a
71
+ * `withTimeout()` signal here and cleaning it up only after the stream ends is
72
+ * what lets external cancellation and the timeout apply for the *whole* stream,
73
+ * not merely the connection handshake. Non-2xx responses are classified and
74
+ * thrown before the body is handed back.
75
+ */
76
+ export async function postResponse(url, body, headers, signal, provider) {
77
+ let res;
78
+ try {
79
+ res = await fetch(url, {
80
+ method: 'POST',
81
+ headers: { 'content-type': 'application/json', ...headers },
82
+ body: JSON.stringify(body),
83
+ signal,
84
+ });
85
+ }
86
+ catch (error) {
87
+ throw fromUnknown(error, provider);
88
+ }
89
+ if (!res.ok) {
90
+ const raw = await res.text().catch(() => '');
91
+ throw classify(res.status, raw, provider, res.headers);
92
+ }
93
+ return res;
94
+ }
95
+ export async function* sseLines(res) {
96
+ for await (const line of textLines(res)) {
97
+ const trimmed = line.trim();
98
+ if (!trimmed || trimmed.startsWith(':'))
99
+ continue;
100
+ if (!trimmed.startsWith('data:'))
101
+ continue;
102
+ const data = trimmed.slice(5).trim();
103
+ if (!data || data === '[DONE]')
104
+ continue;
105
+ yield data;
106
+ }
107
+ }
108
+ export async function* ndjsonLines(res) {
109
+ for await (const line of textLines(res)) {
110
+ const trimmed = line.trim();
111
+ if (!trimmed)
112
+ continue;
113
+ try {
114
+ yield JSON.parse(trimmed);
115
+ }
116
+ catch {
117
+ throw new AIError('Provider returned malformed NDJSON', { kind: 'invalid_response' });
118
+ }
119
+ }
120
+ }
121
+ export async function* textLines(res) {
122
+ if (!res.body) {
123
+ const raw = await res.text().catch(() => '');
124
+ for (const line of raw.split(/\r?\n/))
125
+ yield line;
126
+ return;
127
+ }
128
+ const reader = res.body.getReader();
129
+ const decoder = new TextDecoder();
130
+ let buffer = '';
131
+ let completed = false;
132
+ try {
133
+ for (;;) {
134
+ const { value, done } = await reader.read();
135
+ if (done) {
136
+ completed = true;
137
+ break;
138
+ }
139
+ buffer += decoder.decode(value, { stream: true });
140
+ let newlineIndex;
141
+ while ((newlineIndex = buffer.indexOf('\n')) >= 0) {
142
+ const line = buffer.slice(0, newlineIndex);
143
+ buffer = buffer.slice(newlineIndex + 1);
144
+ yield line;
145
+ }
146
+ }
147
+ buffer += decoder.decode();
148
+ if (buffer.trim())
149
+ yield buffer;
150
+ }
151
+ finally {
152
+ if (!completed)
153
+ await reader.cancel().catch(() => undefined);
154
+ reader.releaseLock();
155
+ }
156
+ }
157
+ function tolerantJson(raw) {
158
+ try {
159
+ return JSON.parse(raw);
160
+ }
161
+ catch {
162
+ return { text: raw };
163
+ }
164
+ }
165
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,301 @@
1
+ import type { KnownProvider } from './adapters/profiles.js';
2
+ export type { KnownProvider };
3
+ export type Role = 'system' | 'user' | 'assistant' | 'tool';
4
+ export interface ContentPart {
5
+ type: 'text' | 'image';
6
+ text?: string;
7
+ imageBase64?: string;
8
+ mimeType?: string;
9
+ }
10
+ export interface ChatMessage {
11
+ role: Role;
12
+ content: string | ContentPart[];
13
+ toolCalls?: ToolCall[];
14
+ toolCallId?: string;
15
+ name?: string;
16
+ }
17
+ export interface ToolCall {
18
+ id: string;
19
+ name: string;
20
+ arguments: unknown;
21
+ raw?: string;
22
+ }
23
+ export interface ToolSchema {
24
+ name: string;
25
+ description: string;
26
+ parameters: object;
27
+ }
28
+ /**
29
+ * How hard a reasoning-capable model should think before answering. The nugget
30
+ * maps one vocabulary onto each provider's own knob (see `docs/providers.md`,
31
+ * "Reasoning effort"): OpenAI `reasoning_effort`, Anthropic `thinking`
32
+ * (`budget_tokens` tiers), Google `generationConfig.thinkingConfig.thinkingBudget`,
33
+ * Ollama `think`. `'none'` disables reasoning where the provider allows it.
34
+ * Unset means the provider's own default — the nugget never sends the knob
35
+ * unasked, because non-reasoning models reject it.
36
+ */
37
+ export type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high';
38
+ export interface ChatRequest {
39
+ model: string;
40
+ messages: ChatMessage[];
41
+ temperature?: number;
42
+ maxTokens?: number;
43
+ topP?: number;
44
+ /**
45
+ * Reasoning effort for thinking-capable models — see {@link ReasoningEffort}.
46
+ * A provider-native value in `providerOptions` (e.g. `reasoning_effort`,
47
+ * `thinking`, `thinkingConfig`, `think`) wins over this on collision.
48
+ */
49
+ reasoningEffort?: ReasoningEffort;
50
+ responseFormat?: {
51
+ type: 'text';
52
+ } | {
53
+ type: 'json';
54
+ schema?: object;
55
+ };
56
+ tools?: ToolSchema[];
57
+ toolChoice?: 'auto' | 'none' | {
58
+ name: string;
59
+ };
60
+ stopSequences?: string[];
61
+ signal?: AbortSignal;
62
+ metadata?: Record<string, unknown>;
63
+ /**
64
+ * Provider-native request fields the nugget does not model as first-class
65
+ * options — an escape hatch so a caller can reach a capability without waiting
66
+ * for a library release. Merged into the outgoing provider request body:
67
+ * shallow at the top level, and one level deep into the provider's own nested
68
+ * option container (Ollama `options`, Google `generationConfig`). Examples:
69
+ * `{ options: { num_ctx: 8192 }, keep_alive: '30m' }` (Ollama),
70
+ * `{ reasoning_effort: 'high' }` (OpenAI), `{ thinking: { type: 'enabled' } }`
71
+ * (Anthropic), `{ safetySettings: [...] }` (Google). Values here win over the
72
+ * nugget's own fields on a key collision, so use with care.
73
+ */
74
+ providerOptions?: Record<string, unknown>;
75
+ }
76
+ export interface Connection {
77
+ id: string;
78
+ /**
79
+ * A provider with a profile in the table, or any other string — an unknown
80
+ * key with a `baseUrl` resolves through the `openai-compat` escape hatch.
81
+ * The union is there for autocomplete and typo-catching; the `string & {}`
82
+ * arm keeps the escape hatch open.
83
+ */
84
+ provider: KnownProvider | (string & {});
85
+ baseUrl?: string;
86
+ keyRef?: KeyRef;
87
+ timeoutMs?: number;
88
+ headers?: Record<string, string>;
89
+ /**
90
+ * Idle timeout for streaming calls: aborts the stream only if no bytes arrive
91
+ * for this many milliseconds, resetting on every chunk. Distinct from
92
+ * `timeoutMs`, which bounds the total call lifetime. Set this (and a generous
93
+ * `timeoutMs`) for long local generations that stream slowly but healthily.
94
+ */
95
+ idleTimeoutMs?: number;
96
+ }
97
+ export type KeyRef = {
98
+ kind: 'none';
99
+ } | {
100
+ kind: 'env';
101
+ name: string;
102
+ } | {
103
+ kind: 'literal';
104
+ value: string;
105
+ } | {
106
+ kind: 'stored';
107
+ ref: string;
108
+ } | {
109
+ kind: 'brokered';
110
+ ref: string;
111
+ };
112
+ export interface KeySource {
113
+ resolve(ref: KeyRef): Promise<{
114
+ ok: true;
115
+ apiKey: string | null;
116
+ } | {
117
+ ok: false;
118
+ reason: 'missing' | 'locked' | 'denied';
119
+ }>;
120
+ }
121
+ export interface ResolvedConnection extends Connection {
122
+ baseUrl: string;
123
+ apiKey: string | null;
124
+ headers: Record<string, string>;
125
+ }
126
+ export interface Usage {
127
+ inputTokens?: number;
128
+ outputTokens?: number;
129
+ estimated: boolean;
130
+ }
131
+ export interface ChatResult {
132
+ text: string;
133
+ toolCalls?: ToolCall[];
134
+ finishReason: 'stop' | 'length' | 'tool' | 'content_filter' | 'error' | 'canceled';
135
+ usage: Usage;
136
+ timing: {
137
+ firstTokenMs: number | null;
138
+ totalMs: number;
139
+ };
140
+ model: string;
141
+ source: ModelSource;
142
+ raw?: unknown;
143
+ }
144
+ export interface ModelSource {
145
+ provider: string;
146
+ connectionId: string;
147
+ baseUrl?: string;
148
+ }
149
+ export interface EmbedRequest {
150
+ model: string;
151
+ /** One string, or a batch of strings embedded in a single call. */
152
+ input: string | string[];
153
+ signal?: AbortSignal;
154
+ metadata?: Record<string, unknown>;
155
+ /** Provider-native passthrough, same contract as {@link ChatRequest.providerOptions}. */
156
+ providerOptions?: Record<string, unknown>;
157
+ }
158
+ export interface EmbedResult {
159
+ /** One vector per input, in input order. */
160
+ embeddings: number[][];
161
+ model: string;
162
+ usage: Usage;
163
+ source: ModelSource;
164
+ raw?: unknown;
165
+ }
166
+ export declare function modelRef(source: ModelSource, model: string): string;
167
+ export type AIErrorKind = 'auth' | 'rate_limit' | 'timeout' | 'network' | 'server' | 'invalid_request' | 'invalid_response'
168
+ /** 404/410 — endpoint, deployment, or model not found (wrong baseUrl/model, or a misrouted edge). */
169
+ | 'not_found' | 'context_length' | 'canceled' | 'policy_blocked' | 'key_unavailable' | 'tool_error' | 'budget_exceeded';
170
+ export type StreamEvent = {
171
+ type: 'start';
172
+ callId: string;
173
+ provider: string;
174
+ model: string;
175
+ } | {
176
+ type: 'delta';
177
+ text: string;
178
+ } | {
179
+ type: 'reasoning';
180
+ text: string;
181
+ } | {
182
+ type: 'tool_call';
183
+ call: ToolCall;
184
+ } | {
185
+ type: 'context';
186
+ kind: string;
187
+ data: unknown;
188
+ } | {
189
+ type: 'retry';
190
+ attempt: number;
191
+ reason: AIErrorKind;
192
+ delayMs: number;
193
+ } | {
194
+ type: 'done';
195
+ result: ChatResult;
196
+ } | {
197
+ type: 'error';
198
+ error: import('./errors.js').AIError;
199
+ };
200
+ export interface ProviderAdapter {
201
+ readonly provider: string;
202
+ chat(conn: ResolvedConnection, req: ChatRequest): Promise<ChatResult>;
203
+ stream(conn: ResolvedConnection, req: ChatRequest): AsyncIterable<StreamEvent>;
204
+ listModels?(conn: ResolvedConnection): Promise<ModelInfo[]>;
205
+ health?(conn: ResolvedConnection): Promise<{
206
+ ok: boolean;
207
+ detail?: string;
208
+ }>;
209
+ embed?(conn: ResolvedConnection, req: EmbedRequest): Promise<EmbedResult>;
210
+ }
211
+ export interface ModelInfo {
212
+ id: string;
213
+ source: ModelSource;
214
+ contextWindow?: number;
215
+ capabilities?: string[];
216
+ }
217
+ export interface GovernancePolicy {
218
+ checkModel(provider: string, model: string): {
219
+ allowed: true;
220
+ } | {
221
+ allowed: false;
222
+ reason: string;
223
+ };
224
+ }
225
+ export interface Redactor {
226
+ redact(text: string): string;
227
+ }
228
+ export interface TelemetrySink {
229
+ record(r: CallRecord): void | Promise<void>;
230
+ }
231
+ export interface CallInfo {
232
+ callId: string;
233
+ connection: Connection;
234
+ provider: string;
235
+ model: string;
236
+ metadata?: Record<string, unknown>;
237
+ /**
238
+ * The fully resolved connection for this call — base URL defaulted from the
239
+ * provider profile and auth headers applied. Present whenever `beforeCall`
240
+ * runs after resolution (chat/stream and probes), letting a hook validate the
241
+ * *effective* endpoint (e.g. a request-time SSRF/DNS-rebinding re-check on the
242
+ * resolved `baseUrl`) without duplicating profile logic. The resolved
243
+ * `apiKey` is intentionally not exposed here.
244
+ */
245
+ resolved?: Omit<ResolvedConnection, 'apiKey'>;
246
+ }
247
+ export interface CallRecord {
248
+ callId: string;
249
+ connectionId: string;
250
+ provider: string;
251
+ model: string;
252
+ startedAt: number;
253
+ timing: ChatResult['timing'];
254
+ usage: Usage;
255
+ finishReason: ChatResult['finishReason'];
256
+ error?: {
257
+ kind: AIErrorKind;
258
+ status?: number;
259
+ message: string;
260
+ };
261
+ attempts: number;
262
+ metadata?: Record<string, unknown>;
263
+ promptChars: number;
264
+ responseChars: number;
265
+ /**
266
+ * Estimated cost of this call in USD, computed by the optional `pricing` hook
267
+ * passed to the handler. Undefined when no pricing hook is configured or the
268
+ * hook returns nothing for this provider/model.
269
+ */
270
+ costUsd?: number;
271
+ }
272
+ /**
273
+ * Minimal [Standard Schema](https://standardschema.dev) validator surface. Any
274
+ * Zod / Valibot / ArkType schema (v1+) satisfies this via its `~standard`
275
+ * property, so `chatParsed` can validate model output against a schema the app
276
+ * already owns — with zero dependency added to this library.
277
+ */
278
+ export interface StandardSchemaV1<Output = unknown> {
279
+ readonly '~standard': {
280
+ readonly version: 1;
281
+ readonly vendor: string;
282
+ readonly validate: (value: unknown) => StandardSchemaResult<Output> | Promise<StandardSchemaResult<Output>>;
283
+ };
284
+ }
285
+ export type StandardSchemaResult<Output> = {
286
+ readonly value: Output;
287
+ readonly issues?: undefined;
288
+ } | {
289
+ readonly issues: ReadonlyArray<{
290
+ readonly message: string;
291
+ readonly path?: ReadonlyArray<PropertyKey | {
292
+ readonly key: PropertyKey;
293
+ }>;
294
+ }>;
295
+ };
296
+ /** Output of {@link AIHandler.chatParsed}: the validated value plus the raw chat result. */
297
+ export interface ParsedResult<T> {
298
+ data: T;
299
+ result: ChatResult;
300
+ }
301
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CAEf;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX;;;;;OAKG;IACH,QAAQ,EAAE,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACzB;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GACnC;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;KAAE,CACzD,CAAC;CACH;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,KAAK;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,gBAAgB,GAAG,OAAO,GAAG,UAAU,CAAC;IACnF,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,YAAY,GACZ,SAAS,GACT,SAAS,GACT,QAAQ,GACR,iBAAiB,GACjB,kBAAkB;AACpB,qGAAqG;GACnG,WAAW,GACX,gBAAgB,GAChB,UAAU,GACV,gBAAgB,GAChB,iBAAiB,GACjB,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAK/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC/E,UAAU,CAAC,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrG;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,MAAM,GAAG,OAAO;IAChD,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,oBAAoB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7G,CAAC;CACH;AAED,MAAM,MAAM,oBAAoB,CAAC,MAAM,IACnC;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG;YAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAEjJ,4FAA4F;AAC5F,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,UAAU,CAAC;CACpB"}
@@ -0,0 +1,4 @@
1
+ export function modelRef(source, model) {
2
+ return `${source.provider}/${model}`;
3
+ }
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkKA,MAAM,UAAU,QAAQ,CAAC,MAAmB,EAAE,KAAa;IACzD,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { ChatMessage } from './types.js';
2
+ export declare function asRecord(value: unknown): Record<string, unknown> | undefined;
3
+ export declare function asString(value: unknown): string | undefined;
4
+ export declare function asNumber(value: unknown): number | undefined;
5
+ export declare function promptChars(messages: ChatMessage[]): number;
6
+ export declare function textFromMessages(messages: ChatMessage[]): string;
7
+ export declare function globalEnv(): Record<string, string | undefined>;
8
+ /**
9
+ * Merges app-supplied {@link ChatRequest.providerOptions} into a provider
10
+ * request body: shallow at the top level, and one level deep for each key in
11
+ * `nestedKeys` where both sides are plain objects (Ollama `options`, Google
12
+ * `generationConfig`). Values in `providerOptions` win on collision.
13
+ */
14
+ export declare function applyProviderOptions(body: Record<string, unknown>, providerOptions: Record<string, unknown> | undefined, nestedKeys?: readonly string[]): Record<string, unknown>;
15
+ /** Joins a base URL and path without producing a double slash, even if `base` ends with `/`. */
16
+ export declare function joinUrl(base: string, path: string): string;
17
+ /**
18
+ * Runs `fn` over `items` with at most `limit` in flight at once, preserving
19
+ * input order in the returned array. Used to probe many local models
20
+ * concurrently without opening an unbounded number of sockets.
21
+ */
22
+ export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
23
+ export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
24
+ /**
25
+ * Token budgets behind the {@link ReasoningEffort} tiers for providers that
26
+ * express effort as a thinking-token budget (Anthropic `budget_tokens`, Google
27
+ * `thinkingBudget`). `'none'` is 0. Deliberately conservative: they are floors
28
+ * a model may stop under, not ceilings it fills.
29
+ */
30
+ export declare const REASONING_BUDGET_TOKENS: Record<'none' | 'minimal' | 'low' | 'medium' | 'high', number>;
31
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAE5E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAK3D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAKhE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACpD,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB;AAED,gGAAgG;AAChG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAc3I;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrE;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE,MAAM,CAMlG,CAAC"}