@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 +1 -1
- package/lib/ask-agent.d.ts +42 -0
- package/lib/ask-agent.js +68 -0
- package/lib/grounding.d.ts +62 -0
- package/lib/grounding.js +147 -0
- package/lib/index.d.ts +6 -2
- package/lib/index.js +8 -2
- package/lib/provider-registry.js +28 -2
- package/package.json +9 -9
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-
|
|
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
|
+
};
|
package/lib/ask-agent.js
ADDED
|
@@ -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;
|
package/lib/grounding.js
ADDED
|
@@ -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
|
|
4
|
-
export {
|
|
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
|
-
|
|
5
|
-
|
|
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=
|
package/lib/provider-registry.js
CHANGED
|
@@ -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.
|
|
25
|
-
"@ai-sdk/anthropic": "4.0.
|
|
26
|
-
"@ai-sdk/google": "4.0.
|
|
27
|
-
"@ai-sdk/openai": "4.0.
|
|
28
|
-
"@ai-sdk/openai-compatible": "3.0.
|
|
29
|
-
"@ai-sdk/xai": "4.0.
|
|
30
|
-
"ai": "7.0.
|
|
31
|
-
"@pipeline-builder/api-core": "
|
|
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": "
|
|
87
|
+
"version": "4.0.1",
|
|
88
88
|
"bugs": {
|
|
89
89
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
90
90
|
},
|