human-to-code 0.0.1 → 0.1.2

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 (134) hide show
  1. package/Readme.md +368 -38
  2. package/SECURITY.md +175 -11
  3. package/dist/adapters/general.d.ts +30 -0
  4. package/dist/adapters/general.d.ts.map +1 -0
  5. package/dist/adapters/general.js +77 -0
  6. package/dist/adapters/general.js.map +1 -0
  7. package/dist/adapters/node.d.ts +8 -0
  8. package/dist/adapters/node.d.ts.map +1 -0
  9. package/dist/adapters/node.js +1071 -0
  10. package/dist/adapters/node.js.map +1 -0
  11. package/dist/adapters/python.d.ts +7 -0
  12. package/dist/adapters/python.d.ts.map +1 -0
  13. package/dist/adapters/python.js +540 -0
  14. package/dist/adapters/python.js.map +1 -0
  15. package/dist/adapters/rust.d.ts +7 -0
  16. package/dist/adapters/rust.d.ts.map +1 -0
  17. package/dist/adapters/rust.js +517 -0
  18. package/dist/adapters/rust.js.map +1 -0
  19. package/dist/analyzer-types.d.ts +161 -0
  20. package/dist/analyzer-types.d.ts.map +1 -0
  21. package/dist/analyzer-types.js +8 -0
  22. package/dist/analyzer-types.js.map +1 -0
  23. package/dist/analyzer-utils.d.ts +40 -0
  24. package/dist/analyzer-utils.d.ts.map +1 -0
  25. package/dist/analyzer-utils.js +591 -0
  26. package/dist/analyzer-utils.js.map +1 -0
  27. package/dist/analyzer.d.ts +21 -0
  28. package/dist/analyzer.d.ts.map +1 -0
  29. package/dist/analyzer.js +111 -0
  30. package/dist/analyzer.js.map +1 -0
  31. package/dist/certification.d.ts +102 -0
  32. package/dist/certification.d.ts.map +1 -0
  33. package/dist/certification.js +193 -0
  34. package/dist/certification.js.map +1 -0
  35. package/dist/cli.d.ts +4 -0
  36. package/dist/cli.d.ts.map +1 -0
  37. package/dist/cli.js +566 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/compiler-skills.d.ts +25 -0
  40. package/dist/compiler-skills.d.ts.map +1 -0
  41. package/dist/compiler-skills.js +158 -0
  42. package/dist/compiler-skills.js.map +1 -0
  43. package/dist/compiler-tools.d.ts +29 -0
  44. package/dist/compiler-tools.d.ts.map +1 -0
  45. package/dist/compiler-tools.js +337 -0
  46. package/dist/compiler-tools.js.map +1 -0
  47. package/dist/config.d.ts +122 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +704 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/context.d.ts +153 -0
  52. package/dist/context.d.ts.map +1 -0
  53. package/dist/context.js +772 -0
  54. package/dist/context.js.map +1 -0
  55. package/dist/contracts.d.ts +196 -0
  56. package/dist/contracts.d.ts.map +1 -0
  57. package/dist/contracts.js +721 -0
  58. package/dist/contracts.js.map +1 -0
  59. package/dist/discovery.d.ts +34 -0
  60. package/dist/discovery.d.ts.map +1 -0
  61. package/dist/discovery.js +312 -0
  62. package/dist/discovery.js.map +1 -0
  63. package/dist/documentation.d.ts +44 -0
  64. package/dist/documentation.d.ts.map +1 -0
  65. package/dist/documentation.js +418 -0
  66. package/dist/documentation.js.map +1 -0
  67. package/dist/index.d.ts +23 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +21 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/patch.d.ts +71 -0
  72. package/dist/patch.d.ts.map +1 -0
  73. package/dist/patch.js +394 -0
  74. package/dist/patch.js.map +1 -0
  75. package/dist/pinned-http.d.ts +15 -0
  76. package/dist/pinned-http.d.ts.map +1 -0
  77. package/dist/pinned-http.js +170 -0
  78. package/dist/pinned-http.js.map +1 -0
  79. package/dist/planner.d.ts +30 -0
  80. package/dist/planner.d.ts.map +1 -0
  81. package/dist/planner.js +228 -0
  82. package/dist/planner.js.map +1 -0
  83. package/dist/provider.d.ts +168 -0
  84. package/dist/provider.d.ts.map +1 -0
  85. package/dist/provider.js +512 -0
  86. package/dist/provider.js.map +1 -0
  87. package/dist/providers.d.ts +41 -0
  88. package/dist/providers.d.ts.map +1 -0
  89. package/dist/providers.js +954 -0
  90. package/dist/providers.js.map +1 -0
  91. package/dist/run-store.d.ts +24 -0
  92. package/dist/run-store.d.ts.map +1 -0
  93. package/dist/run-store.js +285 -0
  94. package/dist/run-store.js.map +1 -0
  95. package/dist/schemas.d.ts +18 -0
  96. package/dist/schemas.d.ts.map +1 -0
  97. package/dist/schemas.js +228 -0
  98. package/dist/schemas.js.map +1 -0
  99. package/dist/secret-scan.d.ts +30 -0
  100. package/dist/secret-scan.d.ts.map +1 -0
  101. package/dist/secret-scan.js +122 -0
  102. package/dist/secret-scan.js.map +1 -0
  103. package/dist/snapshot.d.ts +33 -0
  104. package/dist/snapshot.d.ts.map +1 -0
  105. package/dist/snapshot.js +136 -0
  106. package/dist/snapshot.js.map +1 -0
  107. package/dist/support-matrix.d.ts +23 -0
  108. package/dist/support-matrix.d.ts.map +1 -0
  109. package/dist/support-matrix.js +199 -0
  110. package/dist/support-matrix.js.map +1 -0
  111. package/dist/types.d.ts +63 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +8 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/validation.d.ts +25 -0
  116. package/dist/validation.d.ts.map +1 -0
  117. package/dist/validation.js +388 -0
  118. package/dist/validation.js.map +1 -0
  119. package/dist/workflow.d.ts +65 -0
  120. package/dist/workflow.d.ts.map +1 -0
  121. package/dist/workflow.js +1636 -0
  122. package/dist/workflow.js.map +1 -0
  123. package/package.json +36 -9
  124. package/.claude/settings.local.json +0 -12
  125. package/.github/workflows/ci.yml +0 -18
  126. package/CONTRIBUTING.md +0 -40
  127. package/src/cli.ts +0 -218
  128. package/src/config.ts +0 -186
  129. package/src/discovery.ts +0 -186
  130. package/src/index.ts +0 -22
  131. package/src/types.ts +0 -74
  132. package/test/config.test.ts +0 -97
  133. package/test/discovery.test.ts +0 -91
  134. package/tsconfig.json +0 -17
@@ -0,0 +1,512 @@
1
+ /** Provider-neutral generation, budgets, schema gates, and retry policy. */
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { ArtifactValidationError, canonicalJson, } from "./contracts.js";
4
+ import { scanSecrets } from "./context.js";
5
+ function deepFreeze(value) {
6
+ if (typeof value === "object" && value !== null && !Object.isFrozen(value)) {
7
+ for (const child of Object.values(value))
8
+ deepFreeze(child);
9
+ Object.freeze(value);
10
+ }
11
+ return value;
12
+ }
13
+ export const CONTEXT_REQUEST_TOOL = deepFreeze({
14
+ name: "request_context",
15
+ description: "Request bounded additional project evidence. The host validates, authorizes, and counts every request.",
16
+ inputSchema: {
17
+ type: "object",
18
+ additionalProperties: false,
19
+ required: ["schemaVersion", "requestId", "kind", "workspace", "query", "reason", "maxItems", "path"],
20
+ properties: {
21
+ schemaVersion: { const: 1 },
22
+ requestId: { type: "string", minLength: 1, maxLength: 128 },
23
+ kind: { type: "string", enum: ["symbol", "file", "dependency-doc", "diagnostic"] },
24
+ workspace: { type: "string", minLength: 1, maxLength: 4096 },
25
+ query: { type: "string", minLength: 1, maxLength: 4096 },
26
+ reason: { type: "string", minLength: 1, maxLength: 4096 },
27
+ maxItems: { type: "integer", minimum: 1, maximum: 20 },
28
+ path: { type: ["string", "null"], minLength: 1, maxLength: 4096 },
29
+ },
30
+ },
31
+ });
32
+ export const COMPILER_CONTEXT_TOOLS = deepFreeze([
33
+ CONTEXT_REQUEST_TOOL,
34
+ ]);
35
+ const RETRYABLE_CODES = new Set([
36
+ "timeout",
37
+ "rate_limit",
38
+ "server",
39
+ ]);
40
+ export class ProviderError extends Error {
41
+ code;
42
+ options;
43
+ retryable;
44
+ constructor(code, message, options = {}) {
45
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
46
+ this.name = "ProviderError";
47
+ this.code = code;
48
+ this.options = options;
49
+ this.retryable = RETRYABLE_CODES.has(code);
50
+ }
51
+ }
52
+ function numericStatus(error) {
53
+ const value = error.statusCode ?? error.status;
54
+ return typeof value === "number" && Number.isInteger(value) ? value : undefined;
55
+ }
56
+ /** Normalize SDK/HTTP errors without treating arbitrary network failures as retry-safe. */
57
+ export function normalizeProviderError(error) {
58
+ if (error instanceof ProviderError)
59
+ return error;
60
+ if (error instanceof ArtifactValidationError) {
61
+ return new ProviderError("schema", "Provider output failed local schema validation.", { cause: error });
62
+ }
63
+ if (typeof error === "object" && error !== null) {
64
+ const record = error;
65
+ const name = typeof record.name === "string" ? record.name : "";
66
+ const code = typeof record.code === "string" ? record.code : "";
67
+ const statusCode = numericStatus(record);
68
+ const requestId = typeof record.requestId === "string" ? record.requestId : undefined;
69
+ if (name === "AbortError" || code === "ABORT_ERR") {
70
+ return new ProviderError("cancelled", "Provider request was cancelled.", { requestId, cause: error });
71
+ }
72
+ if (["ETIMEDOUT", "ESOCKETTIMEDOUT"].includes(code) || /timeout/iu.test(name)) {
73
+ return new ProviderError("timeout", "Provider request timed out.", { statusCode, requestId, cause: error });
74
+ }
75
+ if (statusCode === 401 || statusCode === 403) {
76
+ return new ProviderError("authentication", "Provider authentication or authorization failed.", { statusCode, requestId, cause: error });
77
+ }
78
+ if (statusCode === 429) {
79
+ return new ProviderError("rate_limit", "Provider rate limit was reached.", { statusCode, requestId, cause: error });
80
+ }
81
+ if (statusCode !== undefined && statusCode >= 500 && statusCode <= 599) {
82
+ return new ProviderError("server", "Provider server failed the request.", { statusCode, requestId, cause: error });
83
+ }
84
+ if (["ECONNREFUSED", "ECONNRESET", "ENOTFOUND", "EAI_AGAIN"].includes(code)) {
85
+ return new ProviderError("network", "Provider network connection failed.", { statusCode, requestId, cause: error });
86
+ }
87
+ }
88
+ return new ProviderError("internal", "Provider request failed unexpectedly.", { cause: error });
89
+ }
90
+ export const DEFAULT_PROVIDER_BUDGETS = Object.freeze({
91
+ maxInputTokens: 250_000,
92
+ maxOutputTokens: 32_000,
93
+ maxRequests: 12,
94
+ maxRepairs: 2,
95
+ maxCostUsd: 25,
96
+ maxElapsedMs: 15 * 60_000,
97
+ });
98
+ function assertFiniteNonNegative(value, name) {
99
+ if (!Number.isFinite(value) || value < 0) {
100
+ throw new RangeError(`${name} must be a non-negative finite number.`);
101
+ }
102
+ }
103
+ export class ProviderBudgetTracker {
104
+ limits;
105
+ #startedAt;
106
+ #clock;
107
+ #inputTokens = 0;
108
+ #outputTokens = 0;
109
+ #requests = 0;
110
+ #repairs = 0;
111
+ #costUsd = 0;
112
+ #activeRequestReservations = new Set();
113
+ constructor(limits = DEFAULT_PROVIDER_BUDGETS, clock = Date.now) {
114
+ for (const key of ["maxInputTokens", "maxOutputTokens", "maxRequests", "maxRepairs", "maxElapsedMs"]) {
115
+ if (!Number.isSafeInteger(limits[key]) || limits[key] < 0)
116
+ throw new RangeError(`${key} must be a non-negative safe integer.`);
117
+ }
118
+ if (limits.maxRequests < 1)
119
+ throw new RangeError("maxRequests must be at least 1.");
120
+ if (limits.maxRepairs > 2)
121
+ throw new RangeError("maxRepairs cannot exceed the hard limit of 2.");
122
+ if (limits.maxElapsedMs < 1)
123
+ throw new RangeError("maxElapsedMs must be at least 1.");
124
+ assertFiniteNonNegative(limits.maxCostUsd, "maxCostUsd");
125
+ this.limits = Object.freeze({ ...limits });
126
+ this.#clock = clock;
127
+ this.#startedAt = clock();
128
+ }
129
+ #elapsed() {
130
+ return Math.max(0, this.#clock() - this.#startedAt);
131
+ }
132
+ assertCanRequest(estimatedInputTokens, maximumOutputTokens) {
133
+ if (!Number.isSafeInteger(estimatedInputTokens) || estimatedInputTokens < 0
134
+ || !Number.isSafeInteger(maximumOutputTokens) || maximumOutputTokens < 1) {
135
+ throw new ProviderError("budget", "Token estimates must be non-negative integers and output allowance must be positive.");
136
+ }
137
+ if (this.#elapsed() >= this.limits.maxElapsedMs)
138
+ throw new ProviderError("budget", "Provider elapsed-time budget is exhausted.");
139
+ if (this.#requests + 1 > this.limits.maxRequests)
140
+ throw new ProviderError("budget", "Provider request budget is exhausted.");
141
+ if (this.#inputTokens + estimatedInputTokens > this.limits.maxInputTokens)
142
+ throw new ProviderError("budget", "Provider input-token budget would be exceeded.");
143
+ if (this.#outputTokens + maximumOutputTokens > this.limits.maxOutputTokens)
144
+ throw new ProviderError("budget", "Provider output-token budget would be exceeded.");
145
+ }
146
+ beginRequest(conservativeInputTokens, maximumOutputTokens, maximumCostUsd) {
147
+ this.assertCanRequest(conservativeInputTokens, maximumOutputTokens);
148
+ assertFiniteNonNegative(maximumCostUsd, "maximum request cost");
149
+ if (this.#costUsd + maximumCostUsd > this.limits.maxCostUsd) {
150
+ throw new ProviderError("budget", "Provider request would exceed the cumulative USD budget.");
151
+ }
152
+ const reservation = Object.freeze({
153
+ inputTokens: conservativeInputTokens,
154
+ outputTokens: maximumOutputTokens,
155
+ maximumCostUsd,
156
+ });
157
+ this.#activeRequestReservations.add(reservation);
158
+ // Persistable usage is pessimistically charged before transmission. A
159
+ // crash can therefore reduce future capacity, but can never reset it.
160
+ this.#requests += 1;
161
+ this.#inputTokens += conservativeInputTokens;
162
+ this.#outputTokens += maximumOutputTokens;
163
+ this.#costUsd += maximumCostUsd;
164
+ return reservation;
165
+ }
166
+ #consumeReservation(reservation) {
167
+ if (reservation === undefined)
168
+ return undefined;
169
+ if (!this.#activeRequestReservations.delete(reservation)) {
170
+ throw new ProviderError("internal", "Provider request reservation is stale or was already consumed.");
171
+ }
172
+ return reservation;
173
+ }
174
+ cancelRequest(reservation) {
175
+ const active = this.#consumeReservation(reservation);
176
+ if (!active)
177
+ return;
178
+ this.#requests -= 1;
179
+ this.#inputTokens -= active.inputTokens;
180
+ this.#outputTokens -= active.outputTokens;
181
+ this.#costUsd -= active.maximumCostUsd;
182
+ }
183
+ recordUsage(usage, reservation) {
184
+ const active = this.#consumeReservation(reservation);
185
+ if (!Number.isSafeInteger(usage.inputTokens) || usage.inputTokens < 0
186
+ || !Number.isSafeInteger(usage.outputTokens) || usage.outputTokens < 0) {
187
+ throw new ProviderError("schema", "Provider returned invalid token usage.");
188
+ }
189
+ const cost = usage.costUsd ?? (active === undefined || active.maximumCostUsd === 0 ? 0 : Number.NaN);
190
+ if (!Number.isFinite(cost) || cost < 0) {
191
+ throw new ProviderError("schema", "Remote provider returned no enforceable cost usage.");
192
+ }
193
+ if (active === undefined) {
194
+ this.#requests += 1;
195
+ this.#inputTokens += usage.inputTokens;
196
+ this.#outputTokens += usage.outputTokens;
197
+ this.#costUsd += cost;
198
+ }
199
+ else {
200
+ this.#inputTokens += usage.inputTokens - active.inputTokens;
201
+ this.#outputTokens += usage.outputTokens - active.outputTokens;
202
+ this.#costUsd += cost - active.maximumCostUsd;
203
+ }
204
+ if (active !== undefined && (usage.inputTokens > active.inputTokens
205
+ || usage.outputTokens > active.outputTokens
206
+ || cost > active.maximumCostUsd + Number.EPSILON)) {
207
+ throw new ProviderError("budget", "Provider usage exceeded its pre-request conservative reservation.");
208
+ }
209
+ if (this.#requests > this.limits.maxRequests
210
+ || this.#inputTokens > this.limits.maxInputTokens
211
+ || this.#outputTokens > this.limits.maxOutputTokens
212
+ || this.#costUsd > this.limits.maxCostUsd
213
+ || this.#elapsed() > this.limits.maxElapsedMs) {
214
+ throw new ProviderError("budget", "Provider response exceeded a cumulative run budget.");
215
+ }
216
+ }
217
+ /** Count a failed attempt even when the provider returned no usage data. */
218
+ recordFailedRequest(reservation) {
219
+ const active = this.#consumeReservation(reservation);
220
+ if (active === undefined)
221
+ this.#requests += 1;
222
+ if (this.#requests > this.limits.maxRequests
223
+ || this.#costUsd > this.limits.maxCostUsd
224
+ || this.#elapsed() > this.limits.maxElapsedMs) {
225
+ throw new ProviderError("budget", "Provider request or elapsed-time budget is exhausted.");
226
+ }
227
+ }
228
+ recordRepair() {
229
+ if (this.#repairs + 1 > this.limits.maxRepairs || this.#repairs + 1 > 2) {
230
+ throw new ProviderError("budget", "Repair attempt budget is exhausted.");
231
+ }
232
+ this.#repairs += 1;
233
+ }
234
+ get usage() {
235
+ return {
236
+ inputTokens: this.#inputTokens,
237
+ outputTokens: this.#outputTokens,
238
+ requests: this.#requests,
239
+ repairs: this.#repairs,
240
+ costUsd: this.#costUsd,
241
+ elapsedMs: this.#elapsed(),
242
+ };
243
+ }
244
+ get remainingOutputTokens() {
245
+ return Math.max(0, this.limits.maxOutputTokens - this.#outputTokens);
246
+ }
247
+ get remainingRequests() {
248
+ return Math.max(0, this.limits.maxRequests - this.#requests);
249
+ }
250
+ get remainingElapsedMs() {
251
+ return Math.max(0, this.limits.maxElapsedMs - this.#elapsed());
252
+ }
253
+ }
254
+ export function estimateProviderInputTokens(request) {
255
+ const messageBytes = request.messages.reduce((sum, message) => sum + Buffer.byteLength(message.content, "utf8"), 0);
256
+ const schemaBytes = Buffer.byteLength(canonicalJson(request.responseSchema), "utf8");
257
+ const toolBytes = Buffer.byteLength(canonicalJson(request.tools ?? []), "utf8");
258
+ const bytes = messageBytes + schemaBytes + toolBytes + 256;
259
+ return Math.ceil(bytes / 4);
260
+ }
261
+ /**
262
+ * A tokenizer-independent upper bound for byte-level model tokenizers. It is
263
+ * intentionally pessimistic and includes host/API framing headroom.
264
+ */
265
+ export function conservativeProviderInputTokenUpperBound(request) {
266
+ const envelope = canonicalJson({
267
+ operation: request.operation,
268
+ model: request.model,
269
+ messages: request.messages,
270
+ responseSchema: request.responseSchema,
271
+ tools: request.tools ?? [],
272
+ });
273
+ return Buffer.byteLength(envelope, "utf8") + 4096;
274
+ }
275
+ function validateProviderRequest(request) {
276
+ if (!request.model.trim())
277
+ throw new ProviderError("configuration", "An explicit provider model is required.");
278
+ if (!Array.isArray(request.messages) || request.messages.length === 0)
279
+ throw new ProviderError("configuration", "Provider request requires at least one message.");
280
+ if (!Number.isSafeInteger(request.timeoutMs) || request.timeoutMs < 1 || request.timeoutMs > 60 * 60_000)
281
+ throw new ProviderError("configuration", "Provider timeout is invalid.");
282
+ if (!Number.isSafeInteger(request.maxOutputTokens) || request.maxOutputTokens < 1)
283
+ throw new ProviderError("configuration", "Provider output limit is invalid.");
284
+ if (request.temperature !== undefined && (!Number.isFinite(request.temperature) || request.temperature < 0 || request.temperature > 2))
285
+ throw new ProviderError("configuration", "Provider temperature must be from 0 to 2.");
286
+ let totalMessageBytes = 0;
287
+ request.messages.forEach((message) => {
288
+ if (!["system", "user", "assistant", "tool"].includes(message.role)
289
+ || typeof message.content !== "string" || message.content.includes("\0")
290
+ || (message.name !== undefined && (typeof message.name !== "string" || message.name.length === 0 || message.name.length > 128))) {
291
+ throw new ProviderError("configuration", "Provider message is invalid.");
292
+ }
293
+ const bytes = Buffer.byteLength(message.content, "utf8");
294
+ totalMessageBytes += bytes;
295
+ if (bytes > 4 * 1024 * 1024 || totalMessageBytes > 8 * 1024 * 1024) {
296
+ throw new ProviderError("budget", "Provider messages exceed the bounded request size.");
297
+ }
298
+ if (scanSecrets(message.content).length > 0) {
299
+ throw new ProviderError("safety", "Credential-like content is blocked at the provider boundary.");
300
+ }
301
+ });
302
+ try {
303
+ canonicalJson(request.responseSchema);
304
+ for (const tool of request.tools ?? [])
305
+ canonicalJson(tool.inputSchema);
306
+ }
307
+ catch (error) {
308
+ throw new ProviderError("configuration", "Provider response/tool schema is not canonical JSON.", { cause: error });
309
+ }
310
+ const toolNames = new Set();
311
+ for (const tool of request.tools ?? []) {
312
+ if (!/^[A-Za-z][A-Za-z0-9_-]{0,63}$/u.test(tool.name)
313
+ || typeof tool.description !== "string" || tool.description.length === 0 || tool.description.length > 4096
314
+ || toolNames.has(tool.name)) {
315
+ throw new ProviderError("configuration", "Provider tool definition is invalid or duplicated.");
316
+ }
317
+ toolNames.add(tool.name);
318
+ }
319
+ }
320
+ function outputContainsSecret(value, seen = new Set()) {
321
+ if (typeof value === "string")
322
+ return scanSecrets(value).length > 0;
323
+ if (typeof value !== "object" || value === null || seen.has(value))
324
+ return false;
325
+ seen.add(value);
326
+ if (Array.isArray(value))
327
+ return value.some((item) => outputContainsSecret(item, seen));
328
+ return Object.values(value).some((item) => outputContainsSecret(item, seen));
329
+ }
330
+ /**
331
+ * The mandatory schema gate around every adapter. Native JSON-schema support
332
+ * improves generation quality but never replaces this local validator.
333
+ */
334
+ export async function generateValidated(adapter, request, validator, options = {}) {
335
+ validateProviderRequest(request);
336
+ if (request.signal?.aborted)
337
+ throw new ProviderError("cancelled", "Provider request was cancelled.");
338
+ const remainingOutput = options.budget?.remainingOutputTokens;
339
+ const remainingElapsed = options.budget?.remainingElapsedMs;
340
+ const effectiveRequest = {
341
+ ...request,
342
+ maxOutputTokens: remainingOutput === undefined ? request.maxOutputTokens : Math.min(request.maxOutputTokens, remainingOutput),
343
+ timeoutMs: remainingElapsed === undefined ? request.timeoutMs : Math.min(request.timeoutMs, remainingElapsed),
344
+ };
345
+ const conservativeInput = conservativeProviderInputTokenUpperBound(effectiveRequest);
346
+ let requestReservation;
347
+ if (options.budget) {
348
+ const maximumCost = adapter.maximumRequestCostUsd?.(effectiveRequest);
349
+ if (adapter.capabilities.remote && maximumCost === undefined) {
350
+ throw new ProviderError("configuration", "Remote provider has no conservative cost-accounting policy; the request was not sent.");
351
+ }
352
+ requestReservation = options.budget.beginRequest(conservativeInput, effectiveRequest.maxOutputTokens, maximumCost ?? 0);
353
+ try {
354
+ await options.onBeforeRequest?.();
355
+ }
356
+ catch (error) {
357
+ options.budget.cancelRequest(requestReservation);
358
+ throw new ProviderError("internal", "Provider request checkpoint could not be persisted; the request was not sent.", { cause: error });
359
+ }
360
+ }
361
+ let result;
362
+ try {
363
+ result = await adapter.generate(effectiveRequest);
364
+ }
365
+ catch (error) {
366
+ options.budget?.recordFailedRequest(requestReservation);
367
+ throw normalizeProviderError(error);
368
+ }
369
+ if (!result || typeof result !== "object") {
370
+ options.budget?.recordFailedRequest(requestReservation);
371
+ throw new ProviderError("schema", "Provider returned an invalid result envelope.");
372
+ }
373
+ if (!result.resolvedModelId?.trim() || !result.requestId?.trim()) {
374
+ options.budget?.recordFailedRequest(requestReservation);
375
+ throw new ProviderError("schema", "Provider omitted resolved model or request identity.");
376
+ }
377
+ if (!["stop", "tool_call", "length", "refusal", "other"].includes(result.finishReason)
378
+ || !Number.isSafeInteger(result.usage?.inputTokens) || result.usage.inputTokens < 0
379
+ || !Number.isSafeInteger(result.usage?.outputTokens) || result.usage.outputTokens < 0
380
+ || (result.usage.costUsd !== undefined && (!Number.isFinite(result.usage.costUsd) || result.usage.costUsd < 0))) {
381
+ options.budget?.recordFailedRequest(requestReservation);
382
+ throw new ProviderError("schema", "Provider returned invalid finish or usage metadata.", { requestId: result.requestId });
383
+ }
384
+ // Usage is charged for refusals, truncation, and malformed structured output too.
385
+ options.budget?.recordUsage(result.usage, requestReservation);
386
+ if (result.usage.outputTokens > effectiveRequest.maxOutputTokens) {
387
+ throw new ProviderError("budget", "Provider exceeded the enforced per-request output-token limit.", { requestId: result.requestId });
388
+ }
389
+ if (result.finishReason === "refusal")
390
+ throw new ProviderError("refusal", "Provider refused the request.", { requestId: result.requestId });
391
+ if (result.finishReason === "length")
392
+ throw new ProviderError("budget", "Provider output was truncated by its output limit.", { requestId: result.requestId });
393
+ let detachedOutput;
394
+ try {
395
+ detachedOutput = structuredClone(result.output);
396
+ }
397
+ catch (error) {
398
+ throw new ProviderError("schema", "Provider output is not cloneable structured data.", { requestId: result.requestId, cause: error });
399
+ }
400
+ if (outputContainsSecret(detachedOutput)) {
401
+ throw new ProviderError("safety", "Credential-like content in provider output was blocked before persistence.", { requestId: result.requestId });
402
+ }
403
+ let value;
404
+ try {
405
+ value = validator(detachedOutput);
406
+ }
407
+ catch (error) {
408
+ throw new ProviderError("schema", "Provider output failed local schema validation.", { requestId: result.requestId, cause: error });
409
+ }
410
+ return {
411
+ value,
412
+ result: {
413
+ output: detachedOutput,
414
+ resolvedModelId: result.resolvedModelId,
415
+ requestId: result.requestId,
416
+ usage: { ...result.usage },
417
+ finishReason: result.finishReason,
418
+ },
419
+ };
420
+ }
421
+ /** Retry only timeout, rate-limit, and 5xx failures; never more than twice. */
422
+ export async function withProviderRetries(operation, options) {
423
+ const retries = options.maxRetries ?? 2;
424
+ if (!Number.isSafeInteger(retries) || retries < 0 || retries > 2)
425
+ throw new RangeError("maxRetries must be an integer from 0 to 2.");
426
+ if (!Number.isSafeInteger(options.maxElapsedMs) || options.maxElapsedMs < 1)
427
+ throw new RangeError("maxElapsedMs must be a positive integer.");
428
+ const clock = options.clock ?? Date.now;
429
+ const started = clock();
430
+ for (let attempt = 1;; attempt += 1) {
431
+ if (options.signal?.aborted)
432
+ throw new ProviderError("cancelled", "Provider request was cancelled.");
433
+ try {
434
+ const result = await operation(attempt);
435
+ if (clock() - started > options.maxElapsedMs) {
436
+ throw new ProviderError("budget", "Provider retry operation exceeded its total elapsed-time budget.");
437
+ }
438
+ return result;
439
+ }
440
+ catch (raw) {
441
+ const error = normalizeProviderError(raw);
442
+ const retry = attempt;
443
+ if (!error.retryable || retry > retries || clock() - started >= options.maxElapsedMs)
444
+ throw error;
445
+ await options.onRetry?.(retry, error);
446
+ const wait = options.backoffMs?.(retry, error) ?? 250 * 2 ** (retry - 1);
447
+ if (!Number.isFinite(wait) || wait < 0 || wait > 60_000)
448
+ throw new RangeError("Retry backoff must be from 0 to 60000 ms.");
449
+ if (clock() - started + wait >= options.maxElapsedMs)
450
+ throw error;
451
+ if (wait > 0) {
452
+ try {
453
+ await delay(wait, undefined, { signal: options.signal });
454
+ }
455
+ catch {
456
+ throw new ProviderError("cancelled", "Provider retry wait was cancelled.");
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ /** A no-network provider for deterministic unit/integration and CI runs. */
463
+ export class DeterministicMockProvider {
464
+ name = "mock";
465
+ capabilities;
466
+ #resolvedModelId;
467
+ #steps;
468
+ #sequence = 0;
469
+ constructor(options) {
470
+ this.#resolvedModelId = options.resolvedModelId ?? "mock-v1";
471
+ this.#steps = [...options.steps];
472
+ this.capabilities = Object.freeze({
473
+ nativeStructuredOutput: options.nativeStructuredOutput ?? false,
474
+ toolCalling: true,
475
+ cancellation: true,
476
+ tokenCounting: "estimated",
477
+ usageReporting: true,
478
+ remote: false,
479
+ maxContextTokens: 1_000_000,
480
+ });
481
+ }
482
+ async generate(request) {
483
+ if (request.signal?.aborted)
484
+ throw new ProviderError("cancelled", "Mock request was cancelled.");
485
+ const sequence = ++this.#sequence;
486
+ const step = this.#steps[sequence - 1];
487
+ if (step === undefined)
488
+ throw new ProviderError("internal", "Deterministic mock response queue is exhausted.");
489
+ if (step instanceof Error)
490
+ throw step;
491
+ const response = typeof step === "function" ? await step(request, sequence) : step;
492
+ const outputText = (() => {
493
+ try {
494
+ return canonicalJson(response.output);
495
+ }
496
+ catch {
497
+ return String(response.output);
498
+ }
499
+ })();
500
+ return {
501
+ output: structuredClone(response.output),
502
+ resolvedModelId: this.#resolvedModelId,
503
+ requestId: response.requestId ?? `mock-${sequence}`,
504
+ usage: response.usage ?? {
505
+ inputTokens: estimateProviderInputTokens(request),
506
+ outputTokens: Math.ceil(Buffer.byteLength(outputText, "utf8") / 4),
507
+ },
508
+ finishReason: response.finishReason ?? "stop",
509
+ };
510
+ }
511
+ }
512
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Concrete, dependency-free HTTP providers.
3
+ *
4
+ * Provider responses are parsed here, but their JSON-schema contract is still
5
+ * enforced by `generateValidated` in provider.ts. Network redirects are
6
+ * manual, credentials are endpoint-bound, and response bodies are bounded
7
+ * before parsing.
8
+ */
9
+ import { type ProviderConfigV1 } from "./config.ts";
10
+ import { type ProviderAdapter, type ProviderCapabilitiesV1, type ProviderGenerationRequestV1, type ProviderGenerationResultV1 } from "./provider.ts";
11
+ export type ProviderFetch = (url: string, init: RequestInit) => Promise<Response>;
12
+ export type ProviderHostnameResolver = (hostname: string) => Promise<readonly string[]>;
13
+ export interface HttpProviderRuntimeOptions {
14
+ /** Trusted test seam. Production uses the DNS-pinned HTTP(S) transport. */
15
+ fetch?: ProviderFetch;
16
+ /** Injected in tests; production resolves every destination before use. */
17
+ resolveHostname?: ProviderHostnameResolver;
18
+ /** A credential source. Values are never persisted or placed in errors. */
19
+ env?: Readonly<Record<string, string | undefined>>;
20
+ requestIdFactory?: () => string;
21
+ maxResponseBytes?: number;
22
+ }
23
+ export declare class OpenAIResponsesProvider implements ProviderAdapter {
24
+ #private;
25
+ readonly name = "openai";
26
+ readonly capabilities: Readonly<ProviderCapabilitiesV1>;
27
+ constructor(config: ProviderConfigV1, runtimeOptions?: HttpProviderRuntimeOptions);
28
+ maximumRequestCostUsd(request: ProviderGenerationRequestV1): number;
29
+ generate(request: ProviderGenerationRequestV1): Promise<ProviderGenerationResultV1>;
30
+ }
31
+ export declare class OllamaProvider implements ProviderAdapter {
32
+ #private;
33
+ readonly name = "ollama";
34
+ readonly capabilities: Readonly<ProviderCapabilitiesV1>;
35
+ constructor(config: ProviderConfigV1, runtimeOptions?: HttpProviderRuntimeOptions);
36
+ maximumRequestCostUsd(request: ProviderGenerationRequestV1): number;
37
+ generate(request: ProviderGenerationRequestV1): Promise<ProviderGenerationResultV1>;
38
+ }
39
+ export declare function createOpenAIProvider(config: ProviderConfigV1, runtimeOptions?: HttpProviderRuntimeOptions): OpenAIResponsesProvider;
40
+ export declare function createOllamaProvider(config: ProviderConfigV1, runtimeOptions?: HttpProviderRuntimeOptions): OllamaProvider;
41
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAE3B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAGhC,MAAM,eAAe,CAAC;AAevB,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,wBAAwB,GAAG,CACrC,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAEhC,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,2EAA2E;IAC3E,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAs8BD,qBAAa,uBAAwB,YAAW,eAAe;;IAC7D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAOpD;gBAQD,MAAM,EAAE,gBAAgB,EACxB,cAAc,GAAE,0BAA+B;IA4BjD,qBAAqB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM;IAK7D,QAAQ,CACZ,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC;CA+CvC;AAgDD,qBAAa,cAAe,YAAW,eAAe;;IACpD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;gBAStD,MAAM,EAAE,gBAAgB,EACxB,cAAc,GAAE,0BAA+B;IA4CjD,qBAAqB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM;IAK7D,QAAQ,CACZ,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC;CA+DvC;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,cAAc,GAAE,0BAA+B,GAC9C,uBAAuB,CAEzB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,cAAc,GAAE,0BAA+B,GAC9C,cAAc,CAEhB"}