@pipeline-builder/ai-core 3.4.125 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,7 +31,7 @@ Providers and their env vars: Anthropic (`ANTHROPIC_API_KEY`), OpenAI (`OPENAI_A
31
31
  ```typescript
32
32
  import { resolveModel, generateText } from '@pipeline-builder/ai-core';
33
33
 
34
- const model = resolveModel('anthropic', 'claude-sonnet-4-20250514');
34
+ const model = resolveModel('anthropic', 'claude-sonnet-5');
35
35
  const { text } = await generateText({ model, prompt: 'Generate a pipeline spec…' });
36
36
  ```
37
37
 
@@ -0,0 +1,42 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { GroundingIndex, GroundingHit } from './grounding.js';
3
+ /** A source the answer was grounded in, for attribution / deep-linking. */
4
+ export interface AskSource {
5
+ id: string;
6
+ title?: string;
7
+ url?: string;
8
+ }
9
+ export interface AnswerHowToOptions {
10
+ model: LanguageModel;
11
+ /** The user's question. */
12
+ query: string;
13
+ /** Documentation index to ground against. */
14
+ index: GroundingIndex;
15
+ /** How many chunks to retrieve (default 5). */
16
+ topK?: number;
17
+ /** Optional prior turns for multi-turn context (client-held in v1). */
18
+ history?: Array<{
19
+ role: 'user' | 'assistant';
20
+ content: string;
21
+ }>;
22
+ /** Aborts the provider call when the client disconnects (avoids wasted spend). */
23
+ abortSignal?: AbortSignal;
24
+ }
25
+ /** Assemble the retrieved chunks into a labelled context block for the model. */
26
+ export declare function buildGroundingContext(hits: GroundingHit[]): string;
27
+ /**
28
+ * Answer a how-to question, grounded in the docs index. Returns the full text plus
29
+ * the sources it was grounded in.
30
+ */
31
+ export declare function answerHowTo(opts: AnswerHowToOptions): Promise<{
32
+ text: string;
33
+ sources: AskSource[];
34
+ }>;
35
+ /**
36
+ * Streaming variant — returns the retrieved `sources` immediately (so the UI can show
37
+ * them while tokens arrive) and the live `textStream`.
38
+ */
39
+ export declare function streamHowTo(opts: AnswerHowToOptions): {
40
+ sources: AskSource[];
41
+ textStream: AsyncIterable<string>;
42
+ };
@@ -0,0 +1,68 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // The "Ask" agent's read-only "Explain" brain: retrieval-augmented how-to answers.
4
+ //
5
+ // `answerHowTo` / `streamHowTo` retrieve the most relevant documentation chunks from
6
+ // a GroundingIndex and ask the model to answer using ONLY that context, citing the
7
+ // sections it used. This is the Phase 1 (read-only) core — no write tools, nothing
8
+ // mutated. The HTTP service wires a model (via the provider registry) + a docs index
9
+ // to these functions and streams the result over SSE.
10
+ import { generateText, streamText } from 'ai';
11
+ const SYSTEM_PROMPT = [
12
+ 'You are the Pipeline Builder "Ask" assistant. You help users understand and use the',
13
+ 'platform. Answer the question using ONLY the documentation context provided below.',
14
+ '',
15
+ 'Rules:',
16
+ '- If the answer is not in the context, say you do not have documentation covering it and',
17
+ ' suggest the closest relevant area — do NOT invent commands, env vars, or endpoints.',
18
+ '- Be concise and concrete. Prefer steps and exact names from the context.',
19
+ '- When you use a section, cite it by its title so the user can find it.',
20
+ '- This is a read-only assistant: never claim to have changed anything.',
21
+ ].join('\n');
22
+ /** Assemble the retrieved chunks into a labelled context block for the model. */
23
+ export function buildGroundingContext(hits) {
24
+ if (hits.length === 0)
25
+ return '(no matching documentation found)';
26
+ return hits
27
+ .map((h, i) => {
28
+ const label = h.doc.title ? `${h.doc.title} [${h.doc.id}]` : h.doc.id;
29
+ return `### Source ${i + 1}: ${label}\n${h.doc.text}`;
30
+ })
31
+ .join('\n\n');
32
+ }
33
+ function toSources(hits) {
34
+ return hits.map((h) => ({ id: h.doc.id, title: h.doc.title, url: h.doc.url }));
35
+ }
36
+ /** Retrieve, build the grounded messages, and derive the sources — shared prelude. */
37
+ function prepare(opts) {
38
+ const hits = opts.index.search(opts.query, opts.topK ?? 5);
39
+ const context = buildGroundingContext(hits);
40
+ return { messages: buildMessages(opts, context), sources: toSources(hits) };
41
+ }
42
+ /** Build the messages array (system grounding + optional history + question). */
43
+ function buildMessages(opts, context) {
44
+ return [
45
+ { role: 'system', content: `${SYSTEM_PROMPT}\n\n## Documentation context\n\n${context}` },
46
+ ...(opts.history ?? []),
47
+ { role: 'user', content: opts.query },
48
+ ];
49
+ }
50
+ /**
51
+ * Answer a how-to question, grounded in the docs index. Returns the full text plus
52
+ * the sources it was grounded in.
53
+ */
54
+ export async function answerHowTo(opts) {
55
+ const { messages, sources } = prepare(opts);
56
+ const result = await generateText({ model: opts.model, messages, abortSignal: opts.abortSignal });
57
+ return { text: result.text, sources };
58
+ }
59
+ /**
60
+ * Streaming variant — returns the retrieved `sources` immediately (so the UI can show
61
+ * them while tokens arrive) and the live `textStream`.
62
+ */
63
+ export function streamHowTo(opts) {
64
+ const { messages, sources } = prepare(opts);
65
+ const result = streamText({ model: opts.model, messages, abortSignal: opts.abortSignal });
66
+ return { sources, textStream: result.textStream };
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLWFnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Fzay1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLG1GQUFtRjtBQUNuRixFQUFFO0FBQ0YscUZBQXFGO0FBQ3JGLG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYscUZBQXFGO0FBQ3JGLHNEQUFzRDtBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztBQTBCOUMsTUFBTSxhQUFhLEdBQUc7SUFDcEIscUZBQXFGO0lBQ3JGLG9GQUFvRjtJQUNwRixFQUFFO0lBQ0YsUUFBUTtJQUNSLDBGQUEwRjtJQUMxRix1RkFBdUY7SUFDdkYsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSx3RUFBd0U7Q0FDekUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFYixpRkFBaUY7QUFDakYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQW9CO0lBQ3hELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxtQ0FBbUMsQ0FBQztJQUNsRSxPQUFPLElBQUk7U0FDUixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDWixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4RCxDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQW9CO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsU0FBUyxPQUFPLENBQUMsSUFBd0I7SUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDOUUsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLGFBQWEsQ0FBQyxJQUF3QixFQUFFLE9BQWU7SUFDOUQsT0FBTztRQUNMLEVBQUUsSUFBSSxFQUFFLFFBQWlCLEVBQUUsT0FBTyxFQUFFLEdBQUcsYUFBYSxtQ0FBbUMsT0FBTyxFQUFFLEVBQUU7UUFDbEcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3ZCLEVBQUUsSUFBSSxFQUFFLE1BQWUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtLQUMvQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQXdCO0lBQ3hELE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNsRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBd0I7SUFDbEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vLyBUaGUgXCJBc2tcIiBhZ2VudCdzIHJlYWQtb25seSBcIkV4cGxhaW5cIiBicmFpbjogcmV0cmlldmFsLWF1Z21lbnRlZCBob3ctdG8gYW5zd2Vycy5cbi8vXG4vLyBgYW5zd2VySG93VG9gIC8gYHN0cmVhbUhvd1RvYCByZXRyaWV2ZSB0aGUgbW9zdCByZWxldmFudCBkb2N1bWVudGF0aW9uIGNodW5rcyBmcm9tXG4vLyBhIEdyb3VuZGluZ0luZGV4IGFuZCBhc2sgdGhlIG1vZGVsIHRvIGFuc3dlciB1c2luZyBPTkxZIHRoYXQgY29udGV4dCwgY2l0aW5nIHRoZVxuLy8gc2VjdGlvbnMgaXQgdXNlZC4gVGhpcyBpcyB0aGUgUGhhc2UgMSAocmVhZC1vbmx5KSBjb3JlIOKAlCBubyB3cml0ZSB0b29scywgbm90aGluZ1xuLy8gbXV0YXRlZC4gVGhlIEhUVFAgc2VydmljZSB3aXJlcyBhIG1vZGVsICh2aWEgdGhlIHByb3ZpZGVyIHJlZ2lzdHJ5KSArIGEgZG9jcyBpbmRleFxuLy8gdG8gdGhlc2UgZnVuY3Rpb25zIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgb3ZlciBTU0UuXG5cbmltcG9ydCB7IGdlbmVyYXRlVGV4dCwgc3RyZWFtVGV4dCB9IGZyb20gJ2FpJztcbmltcG9ydCB0eXBlIHsgTGFuZ3VhZ2VNb2RlbCB9IGZyb20gJ2FpJztcblxuaW1wb3J0IHR5cGUgeyBHcm91bmRpbmdJbmRleCwgR3JvdW5kaW5nSGl0IH0gZnJvbSAnLi9ncm91bmRpbmcuanMnO1xuXG4vKiogQSBzb3VyY2UgdGhlIGFuc3dlciB3YXMgZ3JvdW5kZWQgaW4sIGZvciBhdHRyaWJ1dGlvbiAvIGRlZXAtbGlua2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrU291cmNlIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbnN3ZXJIb3dUb09wdGlvbnMge1xuICBtb2RlbDogTGFuZ3VhZ2VNb2RlbDtcbiAgLyoqIFRoZSB1c2VyJ3MgcXVlc3Rpb24uICovXG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIC8qKiBEb2N1bWVudGF0aW9uIGluZGV4IHRvIGdyb3VuZCBhZ2FpbnN0LiAqL1xuICBpbmRleDogR3JvdW5kaW5nSW5kZXg7XG4gIC8qKiBIb3cgbWFueSBjaHVua3MgdG8gcmV0cmlldmUgKGRlZmF1bHQgNSkuICovXG4gIHRvcEs/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCBwcmlvciB0dXJucyBmb3IgbXVsdGktdHVybiBjb250ZXh0IChjbGllbnQtaGVsZCBpbiB2MSkuICovXG4gIGhpc3Rvcnk/OiBBcnJheTx7IHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnOyBjb250ZW50OiBzdHJpbmcgfT47XG4gIC8qKiBBYm9ydHMgdGhlIHByb3ZpZGVyIGNhbGwgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIChhdm9pZHMgd2FzdGVkIHNwZW5kKS4gKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuY29uc3QgU1lTVEVNX1BST01QVCA9IFtcbiAgJ1lvdSBhcmUgdGhlIFBpcGVsaW5lIEJ1aWxkZXIgXCJBc2tcIiBhc3Npc3RhbnQuIFlvdSBoZWxwIHVzZXJzIHVuZGVyc3RhbmQgYW5kIHVzZSB0aGUnLFxuICAncGxhdGZvcm0uIEFuc3dlciB0aGUgcXVlc3Rpb24gdXNpbmcgT05MWSB0aGUgZG9jdW1lbnRhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJlbG93LicsXG4gICcnLFxuICAnUnVsZXM6JyxcbiAgJy0gSWYgdGhlIGFuc3dlciBpcyBub3QgaW4gdGhlIGNvbnRleHQsIHNheSB5b3UgZG8gbm90IGhhdmUgZG9jdW1lbnRhdGlvbiBjb3ZlcmluZyBpdCBhbmQnLFxuICAnICBzdWdnZXN0IHRoZSBjbG9zZXN0IHJlbGV2YW50IGFyZWEg4oCUIGRvIE5PVCBpbnZlbnQgY29tbWFuZHMsIGVudiB2YXJzLCBvciBlbmRwb2ludHMuJyxcbiAgJy0gQmUgY29uY2lzZSBhbmQgY29uY3JldGUuIFByZWZlciBzdGVwcyBhbmQgZXhhY3QgbmFtZXMgZnJvbSB0aGUgY29udGV4dC4nLFxuICAnLSBXaGVuIHlvdSB1c2UgYSBzZWN0aW9uLCBjaXRlIGl0IGJ5IGl0cyB0aXRsZSBzbyB0aGUgdXNlciBjYW4gZmluZCBpdC4nLFxuICAnLSBUaGlzIGlzIGEgcmVhZC1vbmx5IGFzc2lzdGFudDogbmV2ZXIgY2xhaW0gdG8gaGF2ZSBjaGFuZ2VkIGFueXRoaW5nLicsXG5dLmpvaW4oJ1xcbicpO1xuXG4vKiogQXNzZW1ibGUgdGhlIHJldHJpZXZlZCBjaHVua3MgaW50byBhIGxhYmVsbGVkIGNvbnRleHQgYmxvY2sgZm9yIHRoZSBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdyb3VuZGluZ0NvbnRleHQoaGl0czogR3JvdW5kaW5nSGl0W10pOiBzdHJpbmcge1xuICBpZiAoaGl0cy5sZW5ndGggPT09IDApIHJldHVybiAnKG5vIG1hdGNoaW5nIGRvY3VtZW50YXRpb24gZm91bmQpJztcbiAgcmV0dXJuIGhpdHNcbiAgICAubWFwKChoLCBpKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IGguZG9jLnRpdGxlID8gYCR7aC5kb2MudGl0bGV9IFske2guZG9jLmlkfV1gIDogaC5kb2MuaWQ7XG4gICAgICByZXR1cm4gYCMjIyBTb3VyY2UgJHtpICsgMX06ICR7bGFiZWx9XFxuJHtoLmRvYy50ZXh0fWA7XG4gICAgfSlcbiAgICAuam9pbignXFxuXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHRvU291cmNlcyhoaXRzOiBHcm91bmRpbmdIaXRbXSk6IEFza1NvdXJjZVtdIHtcbiAgcmV0dXJuIGhpdHMubWFwKChoKSA9PiAoeyBpZDogaC5kb2MuaWQsIHRpdGxlOiBoLmRvYy50aXRsZSwgdXJsOiBoLmRvYy51cmwgfSkpO1xufVxuXG4vKiogUmV0cmlldmUsIGJ1aWxkIHRoZSBncm91bmRlZCBtZXNzYWdlcywgYW5kIGRlcml2ZSB0aGUgc291cmNlcyDigJQgc2hhcmVkIHByZWx1ZGUuICovXG5mdW5jdGlvbiBwcmVwYXJlKG9wdHM6IEFuc3dlckhvd1RvT3B0aW9ucyk6IHsgbWVzc2FnZXM6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkTWVzc2FnZXM+OyBzb3VyY2VzOiBBc2tTb3VyY2VbXSB9IHtcbiAgY29uc3QgaGl0cyA9IG9wdHMuaW5kZXguc2VhcmNoKG9wdHMucXVlcnksIG9wdHMudG9wSyA/PyA1KTtcbiAgY29uc3QgY29udGV4dCA9IGJ1aWxkR3JvdW5kaW5nQ29udGV4dChoaXRzKTtcbiAgcmV0dXJuIHsgbWVzc2FnZXM6IGJ1aWxkTWVzc2FnZXMob3B0cywgY29udGV4dCksIHNvdXJjZXM6IHRvU291cmNlcyhoaXRzKSB9O1xufVxuXG4vKiogQnVpbGQgdGhlIG1lc3NhZ2VzIGFycmF5IChzeXN0ZW0gZ3JvdW5kaW5nICsgb3B0aW9uYWwgaGlzdG9yeSArIHF1ZXN0aW9uKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkTWVzc2FnZXMob3B0czogQW5zd2VySG93VG9PcHRpb25zLCBjb250ZXh0OiBzdHJpbmcpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHJvbGU6ICdzeXN0ZW0nIGFzIGNvbnN0LCBjb250ZW50OiBgJHtTWVNURU1fUFJPTVBUfVxcblxcbiMjIERvY3VtZW50YXRpb24gY29udGV4dFxcblxcbiR7Y29udGV4dH1gIH0sXG4gICAgLi4uKG9wdHMuaGlzdG9yeSA/PyBbXSksXG4gICAgeyByb2xlOiAndXNlcicgYXMgY29uc3QsIGNvbnRlbnQ6IG9wdHMucXVlcnkgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBBbnN3ZXIgYSBob3ctdG8gcXVlc3Rpb24sIGdyb3VuZGVkIGluIHRoZSBkb2NzIGluZGV4LiBSZXR1cm5zIHRoZSBmdWxsIHRleHQgcGx1c1xuICogdGhlIHNvdXJjZXMgaXQgd2FzIGdyb3VuZGVkIGluLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5zd2VySG93VG8ob3B0czogQW5zd2VySG93VG9PcHRpb25zKTogUHJvbWlzZTx7IHRleHQ6IHN0cmluZzsgc291cmNlczogQXNrU291cmNlW10gfT4ge1xuICBjb25zdCB7IG1lc3NhZ2VzLCBzb3VyY2VzIH0gPSBwcmVwYXJlKG9wdHMpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZVRleHQoeyBtb2RlbDogb3B0cy5tb2RlbCwgbWVzc2FnZXMsIGFib3J0U2lnbmFsOiBvcHRzLmFib3J0U2lnbmFsIH0pO1xuICByZXR1cm4geyB0ZXh0OiByZXN1bHQudGV4dCwgc291cmNlcyB9O1xufVxuXG4vKipcbiAqIFN0cmVhbWluZyB2YXJpYW50IOKAlCByZXR1cm5zIHRoZSByZXRyaWV2ZWQgYHNvdXJjZXNgIGltbWVkaWF0ZWx5IChzbyB0aGUgVUkgY2FuIHNob3dcbiAqIHRoZW0gd2hpbGUgdG9rZW5zIGFycml2ZSkgYW5kIHRoZSBsaXZlIGB0ZXh0U3RyZWFtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbUhvd1RvKG9wdHM6IEFuc3dlckhvd1RvT3B0aW9ucyk6IHsgc291cmNlczogQXNrU291cmNlW107IHRleHRTdHJlYW06IEFzeW5jSXRlcmFibGU8c3RyaW5nPiB9IHtcbiAgY29uc3QgeyBtZXNzYWdlcywgc291cmNlcyB9ID0gcHJlcGFyZShvcHRzKTtcbiAgY29uc3QgcmVzdWx0ID0gc3RyZWFtVGV4dCh7IG1vZGVsOiBvcHRzLm1vZGVsLCBtZXNzYWdlcywgYWJvcnRTaWduYWw6IG9wdHMuYWJvcnRTaWduYWwgfSk7XG4gIHJldHVybiB7IHNvdXJjZXMsIHRleHRTdHJlYW06IHJlc3VsdC50ZXh0U3RyZWFtIH07XG59XG4iXX0=
@@ -0,0 +1,62 @@
1
+ /** A retrievable documentation chunk. */
2
+ export interface GroundingDoc {
3
+ /** Stable identifier, e.g. `deployment.md#in-cluster-alertmanager`. */
4
+ id: string;
5
+ /** The chunk text (heading + body) that gets searched and shown to the model. */
6
+ text: string;
7
+ /** Human-readable section title, for source attribution. */
8
+ title?: string;
9
+ /** Deep-link the answer can cite (dashboard path or docs URL). */
10
+ url?: string;
11
+ }
12
+ /** A scored retrieval result. */
13
+ export interface GroundingHit {
14
+ doc: GroundingDoc;
15
+ score: number;
16
+ }
17
+ /** A built, queryable index. */
18
+ export interface GroundingIndex {
19
+ search(query: string, k?: number): GroundingHit[];
20
+ readonly size: number;
21
+ }
22
+ /** Lowercase, split on non-alphanumerics, drop stopwords and 1-char tokens. */
23
+ export declare function tokenize(text: string): string[];
24
+ /**
25
+ * Split a Markdown document into heading-scoped chunks. Content before the first
26
+ * heading becomes an intro chunk; each subsequent chunk spans a heading and its body
27
+ * up to the next heading of any level. Front-matter (`--- ... ---`) is stripped.
28
+ *
29
+ * @param markdown - Raw Markdown source
30
+ * @param meta - `id` prefix (e.g. the file's base name) and optional base `url`
31
+ * @returns One GroundingDoc per section (empty sections skipped)
32
+ */
33
+ export declare function chunkMarkdown(markdown: string, meta: {
34
+ id: string;
35
+ url?: string;
36
+ }): GroundingDoc[];
37
+ /** A source documentation file to be chunked and indexed. */
38
+ export interface DocFile {
39
+ /** Id prefix for the file's chunks, e.g. `deployment.md`. */
40
+ id: string;
41
+ /** Raw Markdown contents. */
42
+ content: string;
43
+ /** Optional base deep-link the chunks can cite. */
44
+ url?: string;
45
+ }
46
+ /**
47
+ * Convenience: chunk a set of Markdown files and build one combined index. The HTTP
48
+ * service reads `docs/*.md` from disk and passes the contents here — the fs access
49
+ * stays in the service so this module remains pure and testable.
50
+ *
51
+ * @param files - Markdown files to index
52
+ * @returns A queryable index over every file's chunks
53
+ */
54
+ export declare function buildDocsIndexFromFiles(files: DocFile[]): GroundingIndex;
55
+ /**
56
+ * Build a BM25 index over the given chunks. BM25 params are the standard
57
+ * k1=1.5, b=0.75. Search is case-insensitive and stopword-filtered.
58
+ *
59
+ * @param docs - Chunks to index
60
+ * @returns A queryable {@link GroundingIndex}
61
+ */
62
+ export declare function buildGroundingIndex(docs: GroundingDoc[]): GroundingIndex;
@@ -0,0 +1,147 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // A small English stopword set — dropping these sharpens BM25 on short how-to
4
+ // queries ("how do I ...") without needing a full NLP dependency.
5
+ const STOPWORDS = new Set([
6
+ 'a', 'an', 'the', 'and', 'or', 'but', 'if', 'then', 'else', 'of', 'to', 'in', 'on',
7
+ 'for', 'with', 'as', 'by', 'at', 'from', 'is', 'are', 'be', 'do', 'does', 'did',
8
+ 'how', 'what', 'when', 'where', 'which', 'who', 'why', 'can', 'i', 'you', 'my', 'me',
9
+ 'it', 'this', 'that', 'these', 'those', 'we', 'our', 'us', 'so', 'up', 'out',
10
+ ]);
11
+ /** Lowercase, split on non-alphanumerics, drop stopwords and 1-char tokens. */
12
+ export function tokenize(text) {
13
+ const tokens = text.toLowerCase().match(/[a-z0-9]+/g) ?? [];
14
+ return tokens.filter((t) => t.length > 1 && !STOPWORDS.has(t));
15
+ }
16
+ /** Slugify a heading for use in a chunk id / anchor. */
17
+ function slugify(heading) {
18
+ return heading
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9]+/g, '-')
21
+ .replace(/^-+|-+$/g, '');
22
+ }
23
+ /**
24
+ * Split a Markdown document into heading-scoped chunks. Content before the first
25
+ * heading becomes an intro chunk; each subsequent chunk spans a heading and its body
26
+ * up to the next heading of any level. Front-matter (`--- ... ---`) is stripped.
27
+ *
28
+ * @param markdown - Raw Markdown source
29
+ * @param meta - `id` prefix (e.g. the file's base name) and optional base `url`
30
+ * @returns One GroundingDoc per section (empty sections skipped)
31
+ */
32
+ export function chunkMarkdown(markdown, meta) {
33
+ // Strip YAML front-matter if present.
34
+ const body = markdown.replace(/^---\n[\s\S]*?\n---\n?/, '');
35
+ const lines = body.split('\n');
36
+ const chunks = [];
37
+ let heading = '';
38
+ let buf = [];
39
+ const flush = () => {
40
+ const text = buf.join('\n').trim();
41
+ buf = [];
42
+ if (!text)
43
+ return;
44
+ const anchor = heading ? slugify(heading) : `intro-${chunks.length}`;
45
+ chunks.push({
46
+ id: `${meta.id}#${anchor}`,
47
+ text: heading ? `${heading}\n${text}` : text,
48
+ title: heading || meta.id,
49
+ url: meta.url,
50
+ });
51
+ };
52
+ // Track fenced code blocks (``` or ~~~) so shell/YAML comment lines starting with
53
+ // `#` inside a fence are NOT mistaken for Markdown headings (which would split a
54
+ // runnable example across chunks and fabricate bogus section titles).
55
+ let inFence = false;
56
+ for (const line of lines) {
57
+ if (/^\s*(```|~~~)/.test(line)) {
58
+ inFence = !inFence;
59
+ buf.push(line);
60
+ continue;
61
+ }
62
+ const m = inFence ? null : /^#{1,6}\s+(.*)$/.exec(line);
63
+ if (m) {
64
+ flush();
65
+ heading = m[1].trim();
66
+ }
67
+ else {
68
+ buf.push(line);
69
+ }
70
+ }
71
+ flush();
72
+ return chunks;
73
+ }
74
+ /**
75
+ * Convenience: chunk a set of Markdown files and build one combined index. The HTTP
76
+ * service reads `docs/*.md` from disk and passes the contents here — the fs access
77
+ * stays in the service so this module remains pure and testable.
78
+ *
79
+ * @param files - Markdown files to index
80
+ * @returns A queryable index over every file's chunks
81
+ */
82
+ export function buildDocsIndexFromFiles(files) {
83
+ const chunks = files.flatMap((f) => chunkMarkdown(f.content, { id: f.id, url: f.url }));
84
+ return buildGroundingIndex(chunks);
85
+ }
86
+ /**
87
+ * Build a BM25 index over the given chunks. BM25 params are the standard
88
+ * k1=1.5, b=0.75. Search is case-insensitive and stopword-filtered.
89
+ *
90
+ * @param docs - Chunks to index
91
+ * @returns A queryable {@link GroundingIndex}
92
+ */
93
+ export function buildGroundingIndex(docs) {
94
+ const k1 = 1.5;
95
+ const b = 0.75;
96
+ const postings = docs.map((doc) => {
97
+ const terms = tokenize(doc.text);
98
+ const freq = new Map();
99
+ for (const t of terms)
100
+ freq.set(t, (freq.get(t) ?? 0) + 1);
101
+ return { doc, freq, length: terms.length };
102
+ });
103
+ // Document frequency per term.
104
+ const df = new Map();
105
+ for (const p of postings) {
106
+ for (const term of p.freq.keys())
107
+ df.set(term, (df.get(term) ?? 0) + 1);
108
+ }
109
+ const N = postings.length;
110
+ const avgdl = N > 0 ? postings.reduce((s, p) => s + p.length, 0) / N : 0;
111
+ const idf = (term) => {
112
+ const n = df.get(term) ?? 0;
113
+ if (n === 0)
114
+ return 0;
115
+ // BM25 idf with +1 to keep it non-negative.
116
+ return Math.log(1 + (N - n + 0.5) / (n + 0.5));
117
+ };
118
+ return {
119
+ size: N,
120
+ search(query, k = 5) {
121
+ const qterms = tokenize(query);
122
+ if (qterms.length === 0 || N === 0)
123
+ return [];
124
+ // Compute idf once per distinct query term (not once per posting).
125
+ const qidf = new Map();
126
+ for (const term of qterms)
127
+ if (!qidf.has(term))
128
+ qidf.set(term, idf(term));
129
+ const hits = [];
130
+ for (const p of postings) {
131
+ let score = 0;
132
+ for (const term of qterms) {
133
+ const f = p.freq.get(term);
134
+ if (!f)
135
+ continue;
136
+ const denom = f + k1 * (1 - b + (b * p.length) / (avgdl || 1));
137
+ score += (qidf.get(term) ?? 0) * ((f * (k1 + 1)) / denom);
138
+ }
139
+ if (score > 0)
140
+ hits.push({ doc: p.doc, score });
141
+ }
142
+ hits.sort((a, b2) => b2.score - a.score);
143
+ return hits.slice(0, k);
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdW5kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dyb3VuZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa0N0Qyw4RUFBOEU7QUFDOUUsa0VBQWtFO0FBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3hCLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7SUFDbEYsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLO0lBQy9FLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUNwRixJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSztDQUM3RSxDQUFDLENBQUM7QUFFSCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFZO0lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFD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QUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxDQUFDO3dCQUFFLFNBQVM7b0JBQ2pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvRCxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztnQkFDRCxJQUFJLEtBQUssR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy8gR3JvdW5kaW5nIC8gcmV0cmlldmFsIGZvciB0aGUgXCJBc2tcIiBhZ2VudCdzIGhvdy10byBhbnN3ZXJzLlxuLy9cbi8vIEEgZGVwZW5kZW5jeS1mcmVlIEJNMjUgaW5kZXggb3ZlciBkb2N1bWVudGF0aW9uIGNodW5rcy4gVGhlIHNlcnZpY2UgbGF5ZXIgbG9hZHNcbi8vIGBkb2NzLyoubWRgLCBzcGxpdHMgZWFjaCBmaWxlIGludG8gaGVhZGluZy1zY29wZWQgY2h1bmtzIHZpYSBgY2h1bmtNYXJrZG93bmAsIGFuZFxuLy8gYnVpbGRzIGFuIGluZGV4IHdpdGggYGJ1aWxkR3JvdW5kaW5nSW5kZXhgOyBgYW5zd2VyLWhvdy10b2AgcmV0cmlldmVzIHRoZSB0b3Bcbi8vIGNodW5rcyB0byBncm91bmQgdGhlIG1vZGVsLiBLZXB0IHB1cmUgKG5vIGZzIC8gbm8gbmV0d29yaykgc28gaXQgaXMgdW5pdC10ZXN0YWJsZVxuLy8gYW5kIHJldXNhYmxlIGFjcm9zcyB0aGUgc2VydmljZSBhbmQgdGVzdHMuXG5cbi8qKiBBIHJldHJpZXZhYmxlIGRvY3VtZW50YXRpb24gY2h1bmsuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VuZGluZ0RvYyB7XG4gIC8qKiBTdGFibGUgaWRlbnRpZmllciwgZS5nLiBgZGVwbG95bWVudC5tZCNpbi1jbHVzdGVyLWFsZXJ0bWFuYWdlcmAuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY2h1bmsgdGV4dCAoaGVhZGluZyArIGJvZHkpIHRoYXQgZ2V0cyBzZWFyY2hlZCBhbmQgc2hvd24gdG8gdGhlIG1vZGVsLiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzZWN0aW9uIHRpdGxlLCBmb3Igc291cmNlIGF0dHJpYnV0aW9uLiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIERlZXAtbGluayB0aGUgYW5zd2VyIGNhbiBjaXRlIChkYXNoYm9hcmQgcGF0aCBvciBkb2NzIFVSTCkuICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqIEEgc2NvcmVkIHJldHJpZXZhbCByZXN1bHQuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VuZGluZ0hpdCB7XG4gIGRvYzogR3JvdW5kaW5nRG9jO1xuICBzY29yZTogbnVtYmVyO1xufVxuXG4vKiogQSBidWlsdCwgcXVlcnlhYmxlIGluZGV4LiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcm91bmRpbmdJbmRleCB7XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBrPzogbnVtYmVyKTogR3JvdW5kaW5nSGl0W107XG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbn1cblxuLy8gQSBzbWFsbCBFbmdsaXNoIHN0b3B3b3JkIHNldCDigJQgZHJvcHBpbmcgdGhlc2Ugc2hhcnBlbnMgQk0yNSBvbiBzaG9ydCBob3ctdG9cbi8vIHF1ZXJpZXMgKFwiaG93IGRvIEkgLi4uXCIpIHdpdGhvdXQgbmVlZGluZyBhIGZ1bGwgTkxQIGRlcGVuZGVuY3kuXG5jb25zdCBTVE9QV09SRFMgPSBuZXcgU2V0KFtcbiAgJ2EnLCAnYW4nLCAndGhlJywgJ2FuZCcsICdvcicsICdidXQnLCAnaWYnLCAndGhlbicsICdlbHNlJywgJ29mJywgJ3RvJywgJ2luJywgJ29uJyxcbiAgJ2ZvcicsICd3aXRoJywgJ2FzJywgJ2J5JywgJ2F0JywgJ2Zyb20nLCAnaXMnLCAnYXJlJywgJ2JlJywgJ2RvJywgJ2RvZXMnLCAnZGlkJyxcbiAgJ2hvdycsICd3aGF0JywgJ3doZW4nLCAnd2hlcmUnLCAnd2hpY2gnLCAnd2hvJywgJ3doeScsICdjYW4nLCAnaScsICd5b3UnLCAnbXknLCAnbWUnLFxuICAnaXQnLCAndGhpcycsICd0aGF0JywgJ3RoZXNlJywgJ3Rob3NlJywgJ3dlJywgJ291cicsICd1cycsICdzbycsICd1cCcsICdvdXQnLFxuXSk7XG5cbi8qKiBMb3dlcmNhc2UsIHNwbGl0IG9uIG5vbi1hbHBoYW51bWVyaWNzLCBkcm9wIHN0b3B3b3JkcyBhbmQgMS1jaGFyIHRva2Vucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2VucyA9IHRleHQudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICByZXR1cm4gdG9rZW5zLmZpbHRlcigodCkgPT4gdC5sZW5ndGggPiAxICYmICFTVE9QV09SRFMuaGFzKHQpKTtcbn1cblxuLyoqIFNsdWdpZnkgYSBoZWFkaW5nIGZvciB1c2UgaW4gYSBjaHVuayBpZCAvIGFuY2hvci4gKi9cbmZ1bmN0aW9uIHNsdWdpZnkoaGVhZGluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhlYWRpbmdcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCAnJyk7XG59XG5cbi8qKlxuICogU3BsaXQgYSBNYXJrZG93biBkb2N1bWVudCBpbnRvIGhlYWRpbmctc2NvcGVkIGNodW5rcy4gQ29udGVudCBiZWZvcmUgdGhlIGZpcnN0XG4gKiBoZWFkaW5nIGJlY29tZXMgYW4gaW50cm8gY2h1bms7IGVhY2ggc3Vic2VxdWVudCBjaHVuayBzcGFucyBhIGhlYWRpbmcgYW5kIGl0cyBib2R5XG4gKiB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9mIGFueSBsZXZlbC4gRnJvbnQtbWF0dGVyIChgLS0tIC4uLiAtLS1gKSBpcyBzdHJpcHBlZC5cbiAqXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBSYXcgTWFya2Rvd24gc291cmNlXG4gKiBAcGFyYW0gbWV0YSAtIGBpZGAgcHJlZml4IChlLmcuIHRoZSBmaWxlJ3MgYmFzZSBuYW1lKSBhbmQgb3B0aW9uYWwgYmFzZSBgdXJsYFxuICogQHJldHVybnMgT25lIEdyb3VuZGluZ0RvYyBwZXIgc2VjdGlvbiAoZW1wdHkgc2VjdGlvbnMgc2tpcHBlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNodW5rTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgbWV0YTogeyBpZDogc3RyaW5nOyB1cmw/OiBzdHJpbmcgfSk6IEdyb3VuZGluZ0RvY1tdIHtcbiAgLy8gU3RyaXAgWUFNTCBmcm9udC1tYXR0ZXIgaWYgcHJlc2VudC5cbiAgY29uc3QgYm9keSA9IG1hcmtkb3duLnJlcGxhY2UoL14tLS1cXG5bXFxzXFxTXSo/XFxuLS0tXFxuPy8sICcnKTtcbiAgY29uc3QgbGluZXMgPSBib2R5LnNwbGl0KCdcXG4nKTtcblxuICBjb25zdCBjaHVua3M6IEdyb3VuZGluZ0RvY1tdID0gW107XG4gIGxldCBoZWFkaW5nID0gJyc7XG4gIGxldCBidWY6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgZmx1c2ggPSAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IGJ1Zi5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgYnVmID0gW107XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgY29uc3QgYW5jaG9yID0gaGVhZGluZyA/IHNsdWdpZnkoaGVhZGluZykgOiBgaW50cm8tJHtjaHVua3MubGVuZ3RofWA7XG4gICAgY2h1bmtzLnB1c2goe1xuICAgICAgaWQ6IGAke21ldGEuaWR9IyR7YW5jaG9yfWAsXG4gICAgICB0ZXh0OiBoZWFkaW5nID8gYCR7aGVhZGluZ31cXG4ke3RleHR9YCA6IHRleHQsXG4gICAgICB0aXRsZTogaGVhZGluZyB8fCBtZXRhLmlkLFxuICAgICAgdXJsOiBtZXRhLnVybCxcbiAgICB9KTtcbiAgfTtcblxuICAvLyBUcmFjayBmZW5jZWQgY29kZSBibG9ja3MgKGBgYCBvciB+fn4pIHNvIHNoZWxsL1lBTUwgY29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoXG4gIC8vIGAjYCBpbnNpZGUgYSBmZW5jZSBhcmUgTk9UIG1pc3Rha2VuIGZvciBNYXJrZG93biBoZWFkaW5ncyAod2hpY2ggd291bGQgc3BsaXQgYVxuICAvLyBydW5uYWJsZSBleGFtcGxlIGFjcm9zcyBjaHVua3MgYW5kIGZhYnJpY2F0ZSBib2d1cyBzZWN0aW9uIHRpdGxlcykuXG4gIGxldCBpbkZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmICgvXlxccyooYGBgfH5+fikvLnRlc3QobGluZSkpIHtcbiAgICAgIGluRmVuY2UgPSAhaW5GZW5jZTtcbiAgICAgIGJ1Zi5wdXNoKGxpbmUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG0gPSBpbkZlbmNlID8gbnVsbCA6IC9eI3sxLDZ9XFxzKyguKikkLy5leGVjKGxpbmUpO1xuICAgIGlmIChtKSB7XG4gICAgICBmbHVzaCgpO1xuICAgICAgaGVhZGluZyA9IG1bMV0udHJpbSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWYucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgZmx1c2goKTtcbiAgcmV0dXJuIGNodW5rcztcbn1cblxuLyoqIEEgc291cmNlIGRvY3VtZW50YXRpb24gZmlsZSB0byBiZSBjaHVua2VkIGFuZCBpbmRleGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NGaWxlIHtcbiAgLyoqIElkIHByZWZpeCBmb3IgdGhlIGZpbGUncyBjaHVua3MsIGUuZy4gYGRlcGxveW1lbnQubWRgLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogUmF3IE1hcmtkb3duIGNvbnRlbnRzLiAqL1xuICBjb250ZW50OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBiYXNlIGRlZXAtbGluayB0aGUgY2h1bmtzIGNhbiBjaXRlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2U6IGNodW5rIGEgc2V0IG9mIE1hcmtkb3duIGZpbGVzIGFuZCBidWlsZCBvbmUgY29tYmluZWQgaW5kZXguIFRoZSBIVFRQXG4gKiBzZXJ2aWNlIHJlYWRzIGBkb2NzLyoubWRgIGZyb20gZGlzayBhbmQgcGFzc2VzIHRoZSBjb250ZW50cyBoZXJlIOKAlCB0aGUgZnMgYWNjZXNzXG4gKiBzdGF5cyBpbiB0aGUgc2VydmljZSBzbyB0aGlzIG1vZHVsZSByZW1haW5zIHB1cmUgYW5kIHRlc3RhYmxlLlxuICpcbiAqIEBwYXJhbSBmaWxlcyAtIE1hcmtkb3duIGZpbGVzIHRvIGluZGV4XG4gKiBAcmV0dXJucyBBIHF1ZXJ5YWJsZSBpbmRleCBvdmVyIGV2ZXJ5IGZpbGUncyBjaHVua3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRG9jc0luZGV4RnJvbUZpbGVzKGZpbGVzOiBEb2NGaWxlW10pOiBHcm91bmRpbmdJbmRleCB7XG4gIGNvbnN0IGNodW5rcyA9IGZpbGVzLmZsYXRNYXAoKGYpID0+IGNodW5rTWFya2Rvd24oZi5jb250ZW50LCB7IGlkOiBmLmlkLCB1cmw6IGYudXJsIH0pKTtcbiAgcmV0dXJuIGJ1aWxkR3JvdW5kaW5nSW5kZXgoY2h1bmtzKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIEJNMjUgaW5kZXggb3ZlciB0aGUgZ2l2ZW4gY2h1bmtzLiBCTTI1IHBhcmFtcyBhcmUgdGhlIHN0YW5kYXJkXG4gKiBrMT0xLjUsIGI9MC43NS4gU2VhcmNoIGlzIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHN0b3B3b3JkLWZpbHRlcmVkLlxuICpcbiAqIEBwYXJhbSBkb2NzIC0gQ2h1bmtzIHRvIGluZGV4XG4gKiBAcmV0dXJucyBBIHF1ZXJ5YWJsZSB7QGxpbmsgR3JvdW5kaW5nSW5kZXh9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdyb3VuZGluZ0luZGV4KGRvY3M6IEdyb3VuZGluZ0RvY1tdKTogR3JvdW5kaW5nSW5kZXgge1xuICBjb25zdCBrMSA9IDEuNTtcbiAgY29uc3QgYiA9IDAuNzU7XG5cbiAgY29uc3QgcG9zdGluZ3MgPSBkb2NzLm1hcCgoZG9jKSA9PiB7XG4gICAgY29uc3QgdGVybXMgPSB0b2tlbml6ZShkb2MudGV4dCk7XG4gICAgY29uc3QgZnJlcSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCB0IG9mIHRlcm1zKSBmcmVxLnNldCh0LCAoZnJlcS5nZXQodCkgPz8gMCkgKyAxKTtcbiAgICByZXR1cm4geyBkb2MsIGZyZXEsIGxlbmd0aDogdGVybXMubGVuZ3RoIH07XG4gIH0pO1xuXG4gIC8vIERvY3VtZW50IGZyZXF1ZW5jeSBwZXIgdGVybS5cbiAgY29uc3QgZGYgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcG9zdGluZ3MpIHtcbiAgICBmb3IgKGNvbnN0IHRlcm0gb2YgcC5mcmVxLmtleXMoKSkgZGYuc2V0KHRlcm0sIChkZi5nZXQodGVybSkgPz8gMCkgKyAxKTtcbiAgfVxuXG4gIGNvbnN0IE4gPSBwb3N0aW5ncy5sZW5ndGg7XG4gIGNvbnN0IGF2Z2RsID0gTiA+IDAgPyBwb3N0aW5ncy5yZWR1Y2UoKHMsIHApID0+IHMgKyBwLmxlbmd0aCwgMCkgLyBOIDogMDtcblxuICBjb25zdCBpZGYgPSAodGVybTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBuID0gZGYuZ2V0KHRlcm0pID8/IDA7XG4gICAgaWYgKG4gPT09IDApIHJldHVybiAwO1xuICAgIC8vIEJNMjUgaWRmIHdpdGggKzEgdG8ga2VlcCBpdCBub24tbmVnYXRpdmUuXG4gICAgcmV0dXJuIE1hdGgubG9nKDEgKyAoTiAtIG4gKyAwLjUpIC8gKG4gKyAwLjUpKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNpemU6IE4sXG4gICAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIGsgPSA1KTogR3JvdW5kaW5nSGl0W10ge1xuICAgICAgY29uc3QgcXRlcm1zID0gdG9rZW5pemUocXVlcnkpO1xuICAgICAgaWYgKHF0ZXJtcy5sZW5ndGggPT09IDAgfHwgTiA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gQ29tcHV0ZSBpZGYgb25jZSBwZXIgZGlzdGluY3QgcXVlcnkgdGVybSAobm90IG9uY2UgcGVyIHBvc3RpbmcpLlxuICAgICAgY29uc3QgcWlkZiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IHRlcm0gb2YgcXRlcm1zKSBpZiAoIXFpZGYuaGFzKHRlcm0pKSBxaWRmLnNldCh0ZXJtLCBpZGYodGVybSkpO1xuICAgICAgY29uc3QgaGl0czogR3JvdW5kaW5nSGl0W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwb3N0aW5ncykge1xuICAgICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHRlcm0gb2YgcXRlcm1zKSB7XG4gICAgICAgICAgY29uc3QgZiA9IHAuZnJlcS5nZXQodGVybSk7XG4gICAgICAgICAgaWYgKCFmKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBkZW5vbSA9IGYgKyBrMSAqICgxIC0gYiArIChiICogcC5sZW5ndGgpIC8gKGF2Z2RsIHx8IDEpKTtcbiAgICAgICAgICBzY29yZSArPSAocWlkZi5nZXQodGVybSkgPz8gMCkgKiAoKGYgKiAoazEgKyAxKSkgLyBkZW5vbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3JlID4gMCkgaGl0cy5wdXNoKHsgZG9jOiBwLmRvYywgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgICBoaXRzLnNvcnQoKGEsIGIyKSA9PiBiMi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgayk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  export { getAvailableProviders, getProviderModels, resolveModel, createModelWithKey, } from './provider-registry.js';
2
2
  export type { ProviderEntry } from './provider-registry.js';
3
- export type { LanguageModel } from 'ai';
4
- export { generateText, streamText, Output } from 'ai';
3
+ export { tokenize, chunkMarkdown, buildGroundingIndex, buildDocsIndexFromFiles, } from './grounding.js';
4
+ export type { GroundingDoc, GroundingHit, GroundingIndex, DocFile } from './grounding.js';
5
+ export { answerHowTo, streamHowTo, buildGroundingContext, } from './ask-agent.js';
6
+ export type { AskSource, AnswerHowToOptions } from './ask-agent.js';
7
+ export type { LanguageModel, Tool, ToolSet } from 'ai';
8
+ export { generateText, streamText, Output, tool, generateObject, stepCountIs } from 'ai';
package/lib/index.js CHANGED
@@ -1,5 +1,11 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export { getAvailableProviders, getProviderModels, resolveModel, createModelWithKey, } from './provider-registry.js';
4
- export { generateText, streamText, Output } from 'ai';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osa0JBQWtCLEdBQ25CLE1BQU0sd0JBQXdCLENBQUM7QUFNaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIGdldEF2YWlsYWJsZVByb3ZpZGVycyxcbiAgZ2V0UHJvdmlkZXJNb2RlbHMsXG4gIHJlc29sdmVNb2RlbCxcbiAgY3JlYXRlTW9kZWxXaXRoS2V5LFxufSBmcm9tICcuL3Byb3ZpZGVyLXJlZ2lzdHJ5LmpzJztcblxuZXhwb3J0IHR5cGUgeyBQcm92aWRlckVudHJ5IH0gZnJvbSAnLi9wcm92aWRlci1yZWdpc3RyeS5qcyc7XG5cbi8vIFJlLWV4cG9ydCBBSSBTREsgdHlwZXMgY29uc3VtZXJzIGNvbW1vbmx5IG5lZWRcbmV4cG9ydCB0eXBlIHsgTGFuZ3VhZ2VNb2RlbCB9IGZyb20gJ2FpJztcbmV4cG9ydCB7IGdlbmVyYXRlVGV4dCwgc3RyZWFtVGV4dCwgT3V0cHV0IH0gZnJvbSAnYWknO1xuIl19
4
+ // Grounding / retrieval for the "Ask" agent
5
+ export { tokenize, chunkMarkdown, buildGroundingIndex, buildDocsIndexFromFiles, } from './grounding.js';
6
+ // "Ask" agent — read-only how-to (RAG) core
7
+ export { answerHowTo, streamHowTo, buildGroundingContext, } from './ask-agent.js';
8
+ // generateText/streamText/Output for generation; tool/generateObject/stepCountIs
9
+ // for the agent tool-calling loop (Phase 2 write tools).
10
+ export { generateText, streamText, Output, tool, generateObject, stepCountIs } from 'ai';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osa0JBQWtCLEdBQ25CLE1BQU0sd0JBQXdCLENBQUM7QUFJaEMsNENBQTRDO0FBQzVDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLG1CQUFtQixFQUNuQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4Qiw0Q0FBNEM7QUFDNUMsT0FBTyxFQUNMLFdBQVcsRUFDWCxXQUFXLEVBQ1gscUJBQXFCLEdBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFLeEIsaUZBQWlGO0FBQ2pGLHlEQUF5RDtBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0IHtcbiAgZ2V0QXZhaWxhYmxlUHJvdmlkZXJzLFxuICBnZXRQcm92aWRlck1vZGVscyxcbiAgcmVzb2x2ZU1vZGVsLFxuICBjcmVhdGVNb2RlbFdpdGhLZXksXG59IGZyb20gJy4vcHJvdmlkZXItcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgdHlwZSB7IFByb3ZpZGVyRW50cnkgfSBmcm9tICcuL3Byb3ZpZGVyLXJlZ2lzdHJ5LmpzJztcblxuLy8gR3JvdW5kaW5nIC8gcmV0cmlldmFsIGZvciB0aGUgXCJBc2tcIiBhZ2VudFxuZXhwb3J0IHtcbiAgdG9rZW5pemUsXG4gIGNodW5rTWFya2Rvd24sXG4gIGJ1aWxkR3JvdW5kaW5nSW5kZXgsXG4gIGJ1aWxkRG9jc0luZGV4RnJvbUZpbGVzLFxufSBmcm9tICcuL2dyb3VuZGluZy5qcyc7XG5leHBvcnQgdHlwZSB7IEdyb3VuZGluZ0RvYywgR3JvdW5kaW5nSGl0LCBHcm91bmRpbmdJbmRleCwgRG9jRmlsZSB9IGZyb20gJy4vZ3JvdW5kaW5nLmpzJztcblxuLy8gXCJBc2tcIiBhZ2VudCDigJQgcmVhZC1vbmx5IGhvdy10byAoUkFHKSBjb3JlXG5leHBvcnQge1xuICBhbnN3ZXJIb3dUbyxcbiAgc3RyZWFtSG93VG8sXG4gIGJ1aWxkR3JvdW5kaW5nQ29udGV4dCxcbn0gZnJvbSAnLi9hc2stYWdlbnQuanMnO1xuZXhwb3J0IHR5cGUgeyBBc2tTb3VyY2UsIEFuc3dlckhvd1RvT3B0aW9ucyB9IGZyb20gJy4vYXNrLWFnZW50LmpzJztcblxuLy8gUmUtZXhwb3J0IEFJIFNESyB0eXBlcyBjb25zdW1lcnMgY29tbW9ubHkgbmVlZFxuZXhwb3J0IHR5cGUgeyBMYW5ndWFnZU1vZGVsLCBUb29sLCBUb29sU2V0IH0gZnJvbSAnYWknO1xuLy8gZ2VuZXJhdGVUZXh0L3N0cmVhbVRleHQvT3V0cHV0IGZvciBnZW5lcmF0aW9uOyB0b29sL2dlbmVyYXRlT2JqZWN0L3N0ZXBDb3VudElzXG4vLyBmb3IgdGhlIGFnZW50IHRvb2wtY2FsbGluZyBsb29wIChQaGFzZSAyIHdyaXRlIHRvb2xzKS5cbmV4cG9ydCB7IGdlbmVyYXRlVGV4dCwgc3RyZWFtVGV4dCwgT3V0cHV0LCB0b29sLCBnZW5lcmF0ZU9iamVjdCwgc3RlcENvdW50SXMgfSBmcm9tICdhaSc7XG4iXX0=
@@ -4,8 +4,9 @@ import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock';
4
4
  import { createAnthropic } from '@ai-sdk/anthropic';
5
5
  import { createGoogleGenerativeAI } from '@ai-sdk/google';
6
6
  import { createOpenAI } from '@ai-sdk/openai';
7
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
7
8
  import { createXai } from '@ai-sdk/xai';
8
- import { AI_PROVIDER_CATALOG, AI_PROVIDER_ENV_VARS, getAIProviderModels, } from '@pipeline-builder/api-core';
9
+ import { AI_PROVIDER_CATALOG, AI_PROVIDER_ENV_VARS, OPENAI_COMPATIBLE_PROVIDER_ID, getAIProviderModels, getOpenAICompatibleProvider, } from '@pipeline-builder/api-core';
9
10
  const registry = new Map();
10
11
  let initialized = false;
11
12
  // Provider → model-factory map. `key` is optional so keyless providers (Bedrock,
@@ -17,6 +18,21 @@ const PROVIDER_FACTORIES = {
17
18
  'google': (key) => createGoogleGenerativeAI({ apiKey: key }),
18
19
  'xai': (key) => createXai({ apiKey: key }),
19
20
  'amazon-bedrock': () => createAmazonBedrock(),
21
+ // Self-hosted OpenAI-compatible endpoint (Docker model image / Ollama / vLLM).
22
+ // The endpoint is deployment-defined via OPENAI_COMPATIBLE_BASE_URL; local servers
23
+ // usually ignore the key, so a placeholder is sent when none is configured.
24
+ [OPENAI_COMPATIBLE_PROVIDER_ID]: (key) => {
25
+ const baseURL = process.env.OPENAI_COMPATIBLE_BASE_URL;
26
+ if (!baseURL) {
27
+ throw new Error('OPENAI_COMPATIBLE_BASE_URL is not set; cannot build the local (OpenAI-compatible) provider.');
28
+ }
29
+ const provider = createOpenAICompatible({
30
+ name: OPENAI_COMPATIBLE_PROVIDER_ID,
31
+ baseURL,
32
+ apiKey: key ?? process.env.OPENAI_COMPATIBLE_API_KEY ?? 'not-needed',
33
+ });
34
+ return (modelId) => provider(modelId);
35
+ },
20
36
  };
21
37
  /** Providers that authenticate WITHOUT an API key (Bedrock uses the IAM role). */
22
38
  const KEYLESS_PROVIDERS = new Set(['amazon-bedrock']);
@@ -49,6 +65,16 @@ function initRegistry() {
49
65
  registry.set(id, { info, createModel: factory(apiKey) });
50
66
  }
51
67
  }
68
+ // The OpenAI-compatible (local / self-hosted) provider is not in the static
69
+ // catalog — its endpoint and models are deployment-defined. Register it when a
70
+ // base URL is configured; its "is configured" signal is the base URL, not a key.
71
+ const compat = getOpenAICompatibleProvider();
72
+ if (compat) {
73
+ registry.set(compat.id, {
74
+ info: compat,
75
+ createModel: PROVIDER_FACTORIES[OPENAI_COMPATIBLE_PROVIDER_ID](process.env.OPENAI_COMPATIBLE_API_KEY),
76
+ });
77
+ }
52
78
  }
53
79
  /**
54
80
  * Returns the list of providers that have API keys configured via env vars.
@@ -121,4 +147,4 @@ export function createModelWithKey(providerId, modelId, apiKey) {
121
147
  }
122
148
  return factory(apiKey)(modelId);
123
149
  }
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXItcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBR3BCLE1BQU0sNEJBQTRCLENBQUM7QUFXcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7QUFDbEQsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBRXhCLGlGQUFpRjtBQUNqRixrRkFBa0Y7QUFDbEYsaUVBQWlFO0FBQ2pFLE1BQU0sa0JBQWtCLEdBQXlFO0lBQy9GLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2hELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDNUQsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7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QUFPLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUFtYXpvbkJlZHJvY2sgfSBmcm9tICdAYWktc2RrL2FtYXpvbi1iZWRyb2NrJztcbmltcG9ydCB7IGNyZWF0ZUFudGhyb3BpYyB9IGZyb20gJ0BhaS1zZGsvYW50aHJvcGljJztcbmltcG9ydCB7IGNyZWF0ZUdvb2dsZUdlbmVyYXRpdmVBSSB9IGZyb20gJ0BhaS1zZGsvZ29vZ2xlJztcbmltcG9ydCB7IGNyZWF0ZU9wZW5BSSB9IGZyb20gJ0BhaS1zZGsvb3BlbmFpJztcbmltcG9ydCB7IGNyZWF0ZVhhaSB9IGZyb20gJ0BhaS1zZGsveGFpJztcbmltcG9ydCB7XG4gIEFJX1BST1ZJREVSX0NBVEFMT0csXG4gIEFJX1BST1ZJREVSX0VOVl9WQVJTLFxuICBnZXRBSVByb3ZpZGVyTW9kZWxzLFxuICB0eXBlIEFJUHJvdmlkZXJJbmZvLFxuICB0eXBlIEFJTW9kZWxJbmZvLFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlTW9kZWwgfSBmcm9tICdhaSc7XG5cbi8vIFByb3ZpZGVyIFJlZ2lzdHJ5XG5cbi8qKiBSZWdpc3RlcmVkIHByb3ZpZGVyIHdpdGggbW9kZWwgZmFjdG9yeSBmdW5jdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJFbnRyeSB7XG4gIGluZm86IEFJUHJvdmlkZXJJbmZvO1xuICBjcmVhdGVNb2RlbDogKG1vZGVsSWQ6IHN0cmluZykgPT4gTGFuZ3VhZ2VNb2RlbDtcbn1cblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgUHJvdmlkZXJFbnRyeT4oKTtcbmxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4vLyBQcm92aWRlciDihpIgbW9kZWwtZmFjdG9yeSBtYXAuIGBrZXlgIGlzIG9wdGlvbmFsIHNvIGtleWxlc3MgcHJvdmlkZXJzIChCZWRyb2NrLFxuLy8gdmlhIHRoZSBydW50aW1lIElBTSByb2xlKSBhbmQga2V5LWJhc2VkIHByb3ZpZGVycyBzaGFyZSBvbmUgc2lnbmF0dXJlLiBEZWNsYXJlZFxuLy8gb25jZSBhbmQgY29uc3VtZWQgYnkgQk9USCBpbml0UmVnaXN0cnkgYW5kIGNyZWF0ZU1vZGVsV2l0aEtleS5cbmNvbnN0IFBST1ZJREVSX0ZBQ1RPUklFUzogUmVjb3JkPHN0cmluZywgKGtleT86IHN0cmluZykgPT4gKG1vZGVsSWQ6IHN0cmluZykgPT4gTGFuZ3VhZ2VNb2RlbD4gPSB7XG4gICdhbnRocm9waWMnOiAoa2V5KSA9PiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXk6IGtleSB9KSxcbiAgJ29wZW5haSc6IChrZXkpID0+IGNyZWF0ZU9wZW5BSSh7IGFwaUtleToga2V5IH0pLFxuICAnZ29vZ2xlJzogKGtleSkgPT4gY3JlYXRlR29vZ2xlR2VuZXJhdGl2ZUFJKHsgYXBpS2V5OiBrZXkgfSksXG4gICd4YWknOiAoa2V5KSA9PiBjcmVhdGVYYWkoeyBhcGlLZXk6IGtleSB9KSxcbiAgJ2FtYXpvbi1iZWRyb2NrJzogKCkgPT4gY3JlYXRlQW1hem9uQmVkcm9jaygpLFxufTtcblxuLyoqIFByb3ZpZGVycyB0aGF0IGF1dGhlbnRpY2F0ZSBXSVRIT1VUIGFuIEFQSSBrZXkgKEJlZHJvY2sgdXNlcyB0aGUgSUFNIHJvbGUpLiAqL1xuY29uc3QgS0VZTEVTU19QUk9WSURFUlMgPSBuZXcgU2V0KFsnYW1hem9uLWJlZHJvY2snXSk7XG5cbi8qKlxuICogV2hldGhlciBhIGtleWxlc3MgcHJvdmlkZXIgKEJlZHJvY2spIHNob3VsZCBiZSBhZHZlcnRpc2VkLiBJdCBhdXRocyB2aWEgdGhlXG4gKiBydW50aW1lIElBTSByb2xlIChubyBBUEkga2V5KSwgc28gYW4gQVdTIHJlZ2lvbiDigJQgc2V0IGJ5IGV2ZXJ5IEFXUyBydW50aW1lIOKAlCBpc1xuICogdGhlIFwicnVubmluZyBpbiAvIGNvbmZpZ3VyZWQgZm9yIEFXU1wiIHNpZ25hbC4gR2F0aW5nIGl0IG9uIEFXU19BQ0NFU1NfS0VZX0lEXG4gKiAod2hpY2ggaXQgbmV2ZXIgdXNlcykgbGVmdCBpdCBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZSBkZXNwaXRlIHZhbGlkIElBTSBjcmVkcztcbiAqIGFkdmVydGlzaW5nIGl0IHdpdGggbm8gQVdTIGNvbnRleHQgYXQgYWxsIHdvdWxkIGp1c3QgZmFpbCBhdCBtb2RlbC1jYWxsIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIGtleWxlc3NQcm92aWRlckF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhKHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OKTtcbn1cblxuLyoqXG4gKiBMYXppbHkgaW5pdGlhbGl6ZSB0aGUgcHJvdmlkZXIgcmVnaXN0cnkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEtleS1iYXNlZFxuICogcHJvdmlkZXJzIHJlZ2lzdGVyIG9ubHkgd2hlbiB0aGVpciBrZXkgaXMgc2V0OyBrZXlsZXNzIHByb3ZpZGVycyAoQmVkcm9jaylcbiAqIHJlZ2lzdGVyIHdoZW4gYW4gQVdTIHJlZ2lvbiBpcyBjb25maWd1cmVkLlxuICovXG5mdW5jdGlvbiBpbml0UmVnaXN0cnkoKTogdm9pZCB7XG4gIGlmIChpbml0aWFsaXplZCkgcmV0dXJuO1xuICBpbml0aWFsaXplZCA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKEFJX1BST1ZJREVSX0NBVEFMT0cpKSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IFBST1ZJREVSX0ZBQ1RPUklFU1tpZF07XG4gICAgaWYgKCFmYWN0b3J5KSBjb250aW51ZTtcbiAgICBjb25zdCBlbnZWYXIgPSBBSV9QUk9WSURFUl9FTlZfVkFSU1tpZF07XG4gICAgY29uc3QgYXBpS2V5ID0gZW52VmFyID8gcHJvY2Vzcy5lbnZbZW52VmFyXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoYXBpS2V5IHx8IChLRVlMRVNTX1BST1ZJREVSUy5oYXMoaWQpICYmIGtleWxlc3NQcm92aWRlckF2YWlsYWJsZSgpKSkge1xuICAgICAgcmVnaXN0cnkuc2V0KGlkLCB7IGluZm8sIGNyZWF0ZU1vZGVsOiBmYWN0b3J5KGFwaUtleSkgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBoYXZlIEFQSSBrZXlzIGNvbmZpZ3VyZWQgdmlhIGVudiB2YXJzLlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIGNvbmZpZ3VyZWQgcHJvdmlkZXIgaW5mbyB3aXRoIG1vZGVsIGxpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQcm92aWRlcnMoKTogQUlQcm92aWRlckluZm9bXSB7XG4gIGluaXRSZWdpc3RyeSgpO1xuICByZXR1cm4gQXJyYXkuZnJvbShyZWdpc3RyeS52YWx1ZXMoKSkubWFwKChlKSA9PiBlLmluZm8pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZGVsIGxpc3QgZm9yIGEgZ2l2ZW4gcHJvdmlkZXIgSUQgKHJlZ2FyZGxlc3Mgb2YgZW52IHZhciBjb25maWcpLlxuICpcbiAqIEBwYXJhbSBwcm92aWRlcklkIC0gUHJvdmlkZXIgaWRlbnRpZmllclxuICogQHJldHVybnMgQXJyYXkgb2YgbW9kZWxzLCBvciBlbXB0eSBhcnJheSBpZiBwcm92aWRlciBpcyB1bmtub3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlck1vZGVscyhwcm92aWRlcklkOiBzdHJpbmcpOiBBSU1vZGVsSW5mb1tdIHtcbiAgcmV0dXJuIGdldEFJUHJvdmlkZXJNb2RlbHMocHJvdmlkZXJJZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIExhbmd1YWdlTW9kZWwgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIGEgY29uZmlndXJlZCBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAqIEBwYXJhbSBtb2RlbElkIC0gTW9kZWwgaWRlbnRpZmllclxuICogQHJldHVybnMgTGFuZ3VhZ2VNb2RlbCBpbnN0YW5jZVxuICogQHRocm93cyBFcnJvciBpZiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZCBvciBtb2RlbCBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWwocHJvdmlkZXJJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpOiBMYW5ndWFnZU1vZGVsIHtcbiAgaW5pdFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnkuZ2V0KHByb3ZpZGVySWQpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBSSBwcm92aWRlciBcIiR7cHJvdmlkZXJJZH1cIiBpcyBub3QgY29uZmlndXJlZC4gU2V0IHRoZSBjb3JyZXNwb25kaW5nIEFQSSBrZXkgZW52aXJvbm1lbnQgdmFyaWFibGUuYCk7XG4gIH1cbiAgaWYgKCFlbnRyeS5pbmZvLm1vZGVscy5zb21lKChtKSA9PiBtLmlkID09PSBtb2RlbElkKSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGVudHJ5LmluZm8ubW9kZWxzLm1hcCgobSkgPT4gbS5pZCkuam9pbignLCAnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbElkfVwiIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiLiBBdmFpbGFibGUgbW9kZWxzOiAke2F2YWlsYWJsZX1gKTtcbiAgfVxuICByZXR1cm4gZW50cnkuY3JlYXRlTW9kZWwobW9kZWxJZCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVtcG9yYXJ5IExhbmd1YWdlTW9kZWwgdXNpbmcgYSBjdXN0b20gQVBJIGtleSAobm90IGNhY2hlZCBpbiByZWdpc3RyeSkuXG4gKlxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0gbW9kZWxJZCAtIE1vZGVsIGlkZW50aWZpZXJcbiAqIEBwYXJhbSBhcGlLZXkgLSBDdXN0b20gQVBJIGtleVxuICogQHJldHVybnMgTGFuZ3VhZ2VNb2RlbCBpbnN0YW5jZVxuICogQHRocm93cyBFcnJvciBpZiBwcm92aWRlciBvciBtb2RlbCBpcyB1bmtub3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFdpdGhLZXkocHJvdmlkZXJJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcsIGFwaUtleTogc3RyaW5nKTogTGFuZ3VhZ2VNb2RlbCB7XG4gIGNvbnN0IG1vZGVscyA9IGdldEFJUHJvdmlkZXJNb2RlbHMocHJvdmlkZXJJZCk7XG4gIGlmIChtb2RlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEFJIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiLiBTdXBwb3J0ZWQ6ICR7T2JqZWN0LmtleXMoQUlfUFJPVklERVJfQ0FUQUxPRykuam9pbignLCAnKX1gKTtcbiAgfVxuICBpZiAoIW1vZGVscy5zb21lKChtKSA9PiBtLmlkID09PSBtb2RlbElkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgXCIke21vZGVsSWR9XCIgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvdmlkZXIgXCIke3Byb3ZpZGVySWR9XCIuIEF2YWlsYWJsZTogJHttb2RlbHMubWFwKChtKSA9PiBtLmlkKS5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IFBST1ZJREVSX0ZBQ1RPUklFU1twcm92aWRlcklkXTtcbiAgaWYgKCFmYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFJIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiYCk7XG5cbiAgLy8gS2V5bGVzcyBwcm92aWRlcnMgKEJlZHJvY2spIGF1dGhlbnRpY2F0ZSB2aWEgdGhlIHJ1bnRpbWUgSUFNIHJvbGUgYW5kIElHTk9SRSBhXG4gIC8vIHN1cHBsaWVkIGtleS4gU2lsZW50bHkgZHJvcHBpbmcgdGhlIGtleSBhbmQgcmV0dXJuaW5nIGEgbW9kZWwgd291bGQgZGVmZXIgdGhlXG4gIC8vIGZhaWx1cmUgdG8gbW9kZWwtY2FsbCB0aW1lIHdoZW4gdGhlIElBTSByb2xlL3JlZ2lvbiBpc24ndCBjb25maWd1cmVkOyBndWFyZCBpdFxuICAvLyBoZXJlIHNvIHRoZSBmYWlsdXJlIGlzIGNsZWFyIGF0IGNvbmZpZyB0aW1lIChtaXJyb3JzIHJlc29sdmVNb2RlbCdzIGdhdGUpLlxuICBpZiAoS0VZTEVTU19QUk9WSURFUlMuaGFzKHByb3ZpZGVySWQpKSB7XG4gICAgaWYgKCFrZXlsZXNzUHJvdmlkZXJBdmFpbGFibGUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQUkgcHJvdmlkZXIgXCIke3Byb3ZpZGVySWR9XCIgYXV0aGVudGljYXRlcyB2aWEgdGhlIEFXUyBJQU0gcm9sZSAodGhlIEFQSSBrZXkgaXMgaWdub3JlZCk7IGAgK1xuICAgICAgICAgICdzZXQgQVdTX1JFR0lPTiAob3IgQVdTX0RFRkFVTFRfUkVHSU9OKSBzbyB0aGUgcnVudGltZSBjcmVkZW50aWFscyBjYW4gYmUgcmVzb2x2ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWN0b3J5KCkobW9kZWxJZCk7XG4gIH1cbiAgcmV0dXJuIGZhY3RvcnkoYXBpS2V5KShtb2RlbElkKTtcbn1cbiJdfQ==
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXItcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsNkJBQTZCLEVBQzdCLG1CQUFtQixFQUNuQiwyQkFBMkIsR0FHNUIsTUFBTSw0QkFBNEIsQ0FBQztBQVdwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztBQUNsRCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFFeEIsaUZBQWlGO0FBQ2pGLGtGQUFrRjtBQUNsRixpRUFBaUU7QUFDakUsTUFBTSxrQkFBa0IsR0FBeUU7SUFDL0YsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdEQsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEQsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUM1RCxLQUFL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dCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlQW1hem9uQmVkcm9jayB9IGZyb20gJ0BhaS1zZGsvYW1hem9uLWJlZHJvY2snO1xuaW1wb3J0IHsgY3JlYXRlQW50aHJvcGljIH0gZnJvbSAnQGFpLXNkay9hbnRocm9waWMnO1xuaW1wb3J0IHsgY3JlYXRlR29vZ2xlR2VuZXJhdGl2ZUFJIH0gZnJvbSAnQGFpLXNkay9nb29nbGUnO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJIH0gZnJvbSAnQGFpLXNkay9vcGVuYWknO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSB9IGZyb20gJ0BhaS1zZGsvb3BlbmFpLWNvbXBhdGlibGUnO1xuaW1wb3J0IHsgY3JlYXRlWGFpIH0gZnJvbSAnQGFpLXNkay94YWknO1xuaW1wb3J0IHtcbiAgQUlfUFJPVklERVJfQ0FUQUxPRyxcbiAgQUlfUFJPVklERVJfRU5WX1ZBUlMsXG4gIE9QRU5BSV9DT01QQVRJQkxFX1BST1ZJREVSX0lELFxuICBnZXRBSVByb3ZpZGVyTW9kZWxzLFxuICBnZXRPcGVuQUlDb21wYXRpYmxlUHJvdmlkZXIsXG4gIHR5cGUgQUlQcm92aWRlckluZm8sXG4gIHR5cGUgQUlNb2RlbEluZm8sXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgTGFuZ3VhZ2VNb2RlbCB9IGZyb20gJ2FpJztcblxuLy8gUHJvdmlkZXIgUmVnaXN0cnlcblxuLyoqIFJlZ2lzdGVyZWQgcHJvdmlkZXIgd2l0aCBtb2RlbCBmYWN0b3J5IGZ1bmN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckVudHJ5IHtcbiAgaW5mbzogQUlQcm92aWRlckluZm87XG4gIGNyZWF0ZU1vZGVsOiAobW9kZWxJZDogc3RyaW5nKSA9PiBMYW5ndWFnZU1vZGVsO1xufVxuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBQcm92aWRlckVudHJ5PigpO1xubGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbi8vIFByb3ZpZGVyIOKGkiBtb2RlbC1mYWN0b3J5IG1hcC4gYGtleWAgaXMgb3B0aW9uYWwgc28ga2V5bGVzcyBwcm92aWRlcnMgKEJlZHJvY2ssXG4vLyB2aWEgdGhlIHJ1bnRpbWUgSUFNIHJvbGUpIGFuZCBrZXktYmFzZWQgcHJvdmlkZXJzIHNoYXJlIG9uZSBzaWduYXR1cmUuIERlY2xhcmVkXG4vLyBvbmNlIGFuZCBjb25zdW1lZCBieSBCT1RIIGluaXRSZWdpc3RyeSBhbmQgY3JlYXRlTW9kZWxXaXRoS2V5LlxuY29uc3QgUFJPVklERVJfRkFDVE9SSUVTOiBSZWNvcmQ8c3RyaW5nLCAoa2V5Pzogc3RyaW5nKSA9PiAobW9kZWxJZDogc3RyaW5nKSA9PiBMYW5ndWFnZU1vZGVsPiA9IHtcbiAgJ2FudGhyb3BpYyc6IChrZXkpID0+IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleToga2V5IH0pLFxuICAnb3BlbmFpJzogKGtleSkgPT4gY3JlYXRlT3BlbkFJKHsgYXBpS2V5OiBrZXkgfSksXG4gICdnb29nbGUnOiAoa2V5KSA9PiBjcmVhdGVHb29nbGVHZW5lcmF0aXZlQUkoeyBhcGlLZXk6IGtleSB9KSxcbiAgJ3hhaSc6IChrZXkpID0+IGNyZWF0ZVhhaSh7IGFwaUtleToga2V5IH0pLFxuICAnYW1hem9uLWJlZHJvY2snOiAoKSA9PiBjcmVhdGVBbWF6b25CZWRyb2NrKCksXG4gIC8vIFNlbGYtaG9zdGVkIE9wZW5BSS1jb21wYXRpYmxlIGVuZHBvaW50IChEb2NrZXIgbW9kZWwgaW1hZ2UgLyBPbGxhbWEgLyB2TExNKS5cbiAgLy8gVGhlIGVuZHBvaW50IGlzIGRlcGxveW1lbnQtZGVmaW5lZCB2aWEgT1BFTkFJX0NPTVBBVElCTEVfQkFTRV9VUkw7IGxvY2FsIHNlcnZlcnNcbiAgLy8gdXN1YWxseSBpZ25vcmUgdGhlIGtleSwgc28gYSBwbGFjZWhvbGRlciBpcyBzZW50IHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICBbT1BFTkFJX0NPTVBBVElCTEVfUFJPVklERVJfSURdOiAoa2V5KSA9PiB7XG4gICAgY29uc3QgYmFzZVVSTCA9IHByb2Nlc3MuZW52Lk9QRU5BSV9DT01QQVRJQkxFX0JBU0VfVVJMO1xuICAgIGlmICghYmFzZVVSTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPUEVOQUlfQ09NUEFUSUJMRV9CQVNFX1VSTCBpcyBub3Qgc2V0OyBjYW5ub3QgYnVpbGQgdGhlIGxvY2FsIChPcGVuQUktY29tcGF0aWJsZSkgcHJvdmlkZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHByb3ZpZGVyID0gY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSh7XG4gICAgICBuYW1lOiBPUEVOQUlfQ09NUEFUSUJMRV9QUk9WSURFUl9JRCxcbiAgICAgIGJhc2VVUkwsXG4gICAgICBhcGlLZXk6IGtleSA/PyBwcm9jZXNzLmVudi5PUEVOQUlfQ09NUEFUSUJMRV9BUElfS0VZID8/ICdub3QtbmVlZGVkJyxcbiAgICB9KTtcbiAgICByZXR1cm4gKG1vZGVsSWQ6IHN0cmluZykgPT4gcHJvdmlkZXIobW9kZWxJZCk7XG4gIH0sXG59O1xuXG4vKiogUHJvdmlkZXJzIHRoYXQgYXV0aGVudGljYXRlIFdJVEhPVVQgYW4gQVBJIGtleSAoQmVkcm9jayB1c2VzIHRoZSBJQU0gcm9sZSkuICovXG5jb25zdCBLRVlMRVNTX1BST1ZJREVSUyA9IG5ldyBTZXQoWydhbWF6b24tYmVkcm9jayddKTtcblxuLyoqXG4gKiBXaGV0aGVyIGEga2V5bGVzcyBwcm92aWRlciAoQmVkcm9jaykgc2hvdWxkIGJlIGFkdmVydGlzZWQuIEl0IGF1dGhzIHZpYSB0aGVcbiAqIHJ1bnRpbWUgSUFNIHJvbGUgKG5vIEFQSSBrZXkpLCBzbyBhbiBBV1MgcmVnaW9uIOKAlCBzZXQgYnkgZXZlcnkgQVdTIHJ1bnRpbWUg4oCUIGlzXG4gKiB0aGUgXCJydW5uaW5nIGluIC8gY29uZmlndXJlZCBmb3IgQVdTXCIgc2lnbmFsLiBHYXRpbmcgaXQgb24gQVdTX0FDQ0VTU19LRVlfSURcbiAqICh3aGljaCBpdCBuZXZlciB1c2VzKSBsZWZ0IGl0IHBlcm1hbmVudGx5IHVuYXZhaWxhYmxlIGRlc3BpdGUgdmFsaWQgSUFNIGNyZWRzO1xuICogYWR2ZXJ0aXNpbmcgaXQgd2l0aCBubyBBV1MgY29udGV4dCBhdCBhbGwgd291bGQganVzdCBmYWlsIGF0IG1vZGVsLWNhbGwgdGltZS5cbiAqL1xuZnVuY3Rpb24ga2V5bGVzc1Byb3ZpZGVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEocHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04pO1xufVxuXG4vKipcbiAqIExhemlseSBpbml0aWFsaXplIHRoZSBwcm92aWRlciByZWdpc3RyeSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4gS2V5LWJhc2VkXG4gKiBwcm92aWRlcnMgcmVnaXN0ZXIgb25seSB3aGVuIHRoZWlyIGtleSBpcyBzZXQ7IGtleWxlc3MgcHJvdmlkZXJzIChCZWRyb2NrKVxuICogcmVnaXN0ZXIgd2hlbiBhbiBBV1MgcmVnaW9uIGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmZ1bmN0aW9uIGluaXRSZWdpc3RyeSgpOiB2b2lkIHtcbiAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47XG4gIGluaXRpYWxpemVkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IFtpZCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoQUlfUFJPVklERVJfQ0FUQUxPRykpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gUFJPVklERVJfRkFDVE9SSUVTW2lkXTtcbiAgICBpZiAoIWZhY3RvcnkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGVudlZhciA9IEFJX1BST1ZJREVSX0VOVl9WQVJTW2lkXTtcbiAgICBjb25zdCBhcGlLZXkgPSBlbnZWYXIgPyBwcm9jZXNzLmVudltlbnZWYXJdIDogdW5kZWZpbmVkO1xuICAgIGlmIChhcGlLZXkgfHwgKEtFWUxFU1NfUFJPVklERVJTLmhhcyhpZCkgJiYga2V5bGVzc1Byb3ZpZGVyQXZhaWxhYmxlKCkpKSB7XG4gICAgICByZWdpc3RyeS5zZXQoaWQsIHsgaW5mbywgY3JlYXRlTW9kZWw6IGZhY3RvcnkoYXBpS2V5KSB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgT3BlbkFJLWNvbXBhdGlibGUgKGxvY2FsIC8gc2VsZi1ob3N0ZWQpIHByb3ZpZGVyIGlzIG5vdCBpbiB0aGUgc3RhdGljXG4gIC8vIGNhdGFsb2cg4oCUIGl0cyBlbmRwb2ludCBhbmQgbW9kZWxzIGFyZSBkZXBsb3ltZW50LWRlZmluZWQuIFJlZ2lzdGVyIGl0IHdoZW4gYVxuICAvLyBiYXNlIFVSTCBpcyBjb25maWd1cmVkOyBpdHMgXCJpcyBjb25maWd1cmVkXCIgc2lnbmFsIGlzIHRoZSBiYXNlIFVSTCwgbm90IGEga2V5LlxuICBjb25zdCBjb21wYXQgPSBnZXRPcGVuQUlDb21wYXRpYmxlUHJvdmlkZXIoKTtcbiAgaWYgKGNvbXBhdCkge1xuICAgIHJlZ2lzdHJ5LnNldChjb21wYXQuaWQsIHtcbiAgICAgIGluZm86IGNvbXBhdCxcbiAgICAgIGNyZWF0ZU1vZGVsOiBQUk9WSURFUl9GQUNUT1JJRVNbT1BFTkFJX0NPTVBBVElCTEVfUFJPVklERVJfSURdKHByb2Nlc3MuZW52Lk9QRU5BSV9DT01QQVRJQkxFX0FQSV9LRVkpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBoYXZlIEFQSSBrZXlzIGNvbmZpZ3VyZWQgdmlhIGVudiB2YXJzLlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIGNvbmZpZ3VyZWQgcHJvdmlkZXIgaW5mbyB3aXRoIG1vZGVsIGxpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQcm92aWRlcnMoKTogQUlQcm92aWRlckluZm9bXSB7XG4gIGluaXRSZWdpc3RyeSgpO1xuICByZXR1cm4gQXJyYXkuZnJvbShyZWdpc3RyeS52YWx1ZXMoKSkubWFwKChlKSA9PiBlLmluZm8pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZGVsIGxpc3QgZm9yIGEgZ2l2ZW4gcHJvdmlkZXIgSUQgKHJlZ2FyZGxlc3Mgb2YgZW52IHZhciBjb25maWcpLlxuICpcbiAqIEBwYXJhbSBwcm92aWRlcklkIC0gUHJvdmlkZXIgaWRlbnRpZmllclxuICogQHJldHVybnMgQXJyYXkgb2YgbW9kZWxzLCBvciBlbXB0eSBhcnJheSBpZiBwcm92aWRlciBpcyB1bmtub3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlck1vZGVscyhwcm92aWRlcklkOiBzdHJpbmcpOiBBSU1vZGVsSW5mb1tdIHtcbiAgcmV0dXJuIGdldEFJUHJvdmlkZXJNb2RlbHMocHJvdmlkZXJJZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIExhbmd1YWdlTW9kZWwgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIGEgY29uZmlndXJlZCBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAqIEBwYXJhbSBtb2RlbElkIC0gTW9kZWwgaWRlbnRpZmllclxuICogQHJldHVybnMgTGFuZ3VhZ2VNb2RlbCBpbnN0YW5jZVxuICogQHRocm93cyBFcnJvciBpZiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZCBvciBtb2RlbCBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWwocHJvdmlkZXJJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpOiBMYW5ndWFnZU1vZGVsIHtcbiAgaW5pdFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnkuZ2V0KHByb3ZpZGVySWQpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBSSBwcm92aWRlciBcIiR7cHJvdmlkZXJJZH1cIiBpcyBub3QgY29uZmlndXJlZC4gU2V0IHRoZSBjb3JyZXNwb25kaW5nIEFQSSBrZXkgZW52aXJvbm1lbnQgdmFyaWFibGUuYCk7XG4gIH1cbiAgaWYgKCFlbnRyeS5pbmZvLm1vZGVscy5zb21lKChtKSA9PiBtLmlkID09PSBtb2RlbElkKSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGVudHJ5LmluZm8ubW9kZWxzLm1hcCgobSkgPT4gbS5pZCkuam9pbignLCAnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbElkfVwiIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiLiBBdmFpbGFibGUgbW9kZWxzOiAke2F2YWlsYWJsZX1gKTtcbiAgfVxuICByZXR1cm4gZW50cnkuY3JlYXRlTW9kZWwobW9kZWxJZCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVtcG9yYXJ5IExhbmd1YWdlTW9kZWwgdXNpbmcgYSBjdXN0b20gQVBJIGtleSAobm90IGNhY2hlZCBpbiByZWdpc3RyeSkuXG4gKlxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0gbW9kZWxJZCAtIE1vZGVsIGlkZW50aWZpZXJcbiAqIEBwYXJhbSBhcGlLZXkgLSBDdXN0b20gQVBJIGtleVxuICogQHJldHVybnMgTGFuZ3VhZ2VNb2RlbCBpbnN0YW5jZVxuICogQHRocm93cyBFcnJvciBpZiBwcm92aWRlciBvciBtb2RlbCBpcyB1bmtub3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFdpdGhLZXkocHJvdmlkZXJJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcsIGFwaUtleTogc3RyaW5nKTogTGFuZ3VhZ2VNb2RlbCB7XG4gIGNvbnN0IG1vZGVscyA9IGdldEFJUHJvdmlkZXJNb2RlbHMocHJvdmlkZXJJZCk7XG4gIGlmIChtb2RlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEFJIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiLiBTdXBwb3J0ZWQ6ICR7T2JqZWN0LmtleXMoQUlfUFJPVklERVJfQ0FUQUxPRykuam9pbignLCAnKX1gKTtcbiAgfVxuICBpZiAoIW1vZGVscy5zb21lKChtKSA9PiBtLmlkID09PSBtb2RlbElkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgXCIke21vZGVsSWR9XCIgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvdmlkZXIgXCIke3Byb3ZpZGVySWR9XCIuIEF2YWlsYWJsZTogJHttb2RlbHMubWFwKChtKSA9PiBtLmlkKS5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IFBST1ZJREVSX0ZBQ1RPUklFU1twcm92aWRlcklkXTtcbiAgaWYgKCFmYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFJIHByb3ZpZGVyIFwiJHtwcm92aWRlcklkfVwiYCk7XG5cbiAgLy8gS2V5bGVzcyBwcm92aWRlcnMgKEJlZHJvY2spIGF1dGhlbnRpY2F0ZSB2aWEgdGhlIHJ1bnRpbWUgSUFNIHJvbGUgYW5kIElHTk9SRSBhXG4gIC8vIHN1cHBsaWVkIGtleS4gU2lsZW50bHkgZHJvcHBpbmcgdGhlIGtleSBhbmQgcmV0dXJuaW5nIGEgbW9kZWwgd291bGQgZGVmZXIgdGhlXG4gIC8vIGZhaWx1cmUgdG8gbW9kZWwtY2FsbCB0aW1lIHdoZW4gdGhlIElBTSByb2xlL3JlZ2lvbiBpc24ndCBjb25maWd1cmVkOyBndWFyZCBpdFxuICAvLyBoZXJlIHNvIHRoZSBmYWlsdXJlIGlzIGNsZWFyIGF0IGNvbmZpZyB0aW1lIChtaXJyb3JzIHJlc29sdmVNb2RlbCdzIGdhdGUpLlxuICBpZiAoS0VZTEVTU19QUk9WSURFUlMuaGFzKHByb3ZpZGVySWQpKSB7XG4gICAgaWYgKCFrZXlsZXNzUHJvdmlkZXJBdmFpbGFibGUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQUkgcHJvdmlkZXIgXCIke3Byb3ZpZGVySWR9XCIgYXV0aGVudGljYXRlcyB2aWEgdGhlIEFXUyBJQU0gcm9sZSAodGhlIEFQSSBrZXkgaXMgaWdub3JlZCk7IGAgK1xuICAgICAgICAgICdzZXQgQVdTX1JFR0lPTiAob3IgQVdTX0RFRkFVTFRfUkVHSU9OKSBzbyB0aGUgcnVudGltZSBjcmVkZW50aWFscyBjYW4gYmUgcmVzb2x2ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWN0b3J5KCkobW9kZWxJZCk7XG4gIH1cbiAgcmV0dXJuIGZhY3RvcnkoYXBpS2V5KShtb2RlbElkKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -21,14 +21,14 @@
21
21
  "typescript": "npm:@typescript/typescript6@^6.0.2"
22
22
  },
23
23
  "dependencies": {
24
- "@ai-sdk/amazon-bedrock": "5.0.40",
25
- "@ai-sdk/anthropic": "4.0.27",
26
- "@ai-sdk/google": "4.0.31",
27
- "@ai-sdk/openai": "4.0.27",
28
- "@ai-sdk/openai-compatible": "3.0.20",
29
- "@ai-sdk/xai": "4.0.25",
30
- "ai": "7.0.48",
31
- "@pipeline-builder/api-core": "3.4.125"
24
+ "@ai-sdk/amazon-bedrock": "5.0.62",
25
+ "@ai-sdk/anthropic": "4.0.42",
26
+ "@ai-sdk/google": "4.0.51",
27
+ "@ai-sdk/openai": "4.0.47",
28
+ "@ai-sdk/openai-compatible": "3.0.37",
29
+ "@ai-sdk/xai": "4.0.44",
30
+ "ai": "7.0.79",
31
+ "@pipeline-builder/api-core": "4.0.1"
32
32
  },
33
33
  "keywords": [
34
34
  "ci-cd",
@@ -84,7 +84,7 @@
84
84
  "access": "public",
85
85
  "registry": "https://registry.npmjs.org/"
86
86
  },
87
- "version": "3.4.125",
87
+ "version": "4.0.1",
88
88
  "bugs": {
89
89
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
90
90
  },