@burtson-labs/agent-core 1.6.45 → 1.6.47
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/suggestions.d.ts +38 -0
- package/dist/suggestions.d.ts.map +1 -0
- package/dist/suggestions.js +119 -0
- package/dist/suggestions.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface CreateAgentRuntimeOptions extends Partial<Omit<AgentRuntimeOpti
|
|
|
13
13
|
export declare const createAgentRuntime: (options?: CreateAgentRuntimeOptions) => AgentRuntime;
|
|
14
14
|
export * from './tools';
|
|
15
15
|
export * from './graph';
|
|
16
|
+
export * from './suggestions';
|
|
16
17
|
export * from './mcp';
|
|
17
18
|
export { redactSecrets, redactSecretsString, BUILTIN_SECRET_PATTERNS, type SecretPattern, type RedactionResult } from './security/secretPatterns';
|
|
18
19
|
export { TelemetryExporter, resolveTelemetryConfig, TTFT_BUCKETS, DURATION_BUCKETS, type TelemetryConfig } from './telemetry/otlpExporter';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,yBAA0B,SAAQ,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAC/F,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAS,yBAA8B,KAAG,YAO5E,CAAC;AAGF,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,yBAA0B,SAAQ,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAC/F,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAS,yBAA8B,KAAG,YAO5E,CAAC;AAGF,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC;AAExB,cAAc,eAAe,CAAC;AAK9B,cAAc,OAAO,CAAC;AAKtB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAInC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,8 @@ __exportStar(require("./tools"), exports);
|
|
|
41
41
|
// Graph runtime (DAG of loop-wrapping nodes). Nothing in the framework
|
|
42
42
|
// consumes it yet — hosts opt in explicitly; zero behavior change until then.
|
|
43
43
|
__exportStar(require("./graph"), exports);
|
|
44
|
+
// Next-prompt prediction (composer "what's next?" suggestions).
|
|
45
|
+
__exportStar(require("./suggestions"), exports);
|
|
44
46
|
// MCP — Model Context Protocol client (Phase 1: groundwork). See
|
|
45
47
|
// docs/integration-playlist/mcp-roadmap.md. Off by default — hosts
|
|
46
48
|
// that don't construct an McpClientPool get zero behavior change.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,yDAAsD;AACtD,+EAAiF;AAGjF,gDAA8B;AAC9B,gDAA8B;AAC9B,uCAAkD;AAAzC,0GAAA,iBAAiB,OAAA;AAE1B,+DAIqC;AADnC,oHAAA,iBAAiB,OAAA;AAGnB,6EAG4C;AAF1C,qIAAA,2BAA2B,OAAA;AAI7B,uDAUgC;AAT9B,4GAAA,YAAY,OAAA;AAeP,MAAM,kBAAkB,GAAG,CAAC,UAAqC,EAAE,EAAgB,EAAE;IAC1F,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,IAAI,oDAA2B,EAAE,CAAC;IACvE,OAAO,IAAI,2BAAY,CAAC;QACtB,QAAQ;QACR,GAAI,IAA8C;KACnD,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEF,cAAc;AACd,0CAAwB;AACxB,uEAAuE;AACvE,8EAA8E;AAC9E,0CAAwB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,yDAAsD;AACtD,+EAAiF;AAGjF,gDAA8B;AAC9B,gDAA8B;AAC9B,uCAAkD;AAAzC,0GAAA,iBAAiB,OAAA;AAE1B,+DAIqC;AADnC,oHAAA,iBAAiB,OAAA;AAGnB,6EAG4C;AAF1C,qIAAA,2BAA2B,OAAA;AAI7B,uDAUgC;AAT9B,4GAAA,YAAY,OAAA;AAeP,MAAM,kBAAkB,GAAG,CAAC,UAAqC,EAAE,EAAgB,EAAE;IAC1F,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,IAAI,oDAA2B,EAAE,CAAC;IACvE,OAAO,IAAI,2BAAY,CAAC;QACtB,QAAQ;QACR,GAAI,IAA8C;KACnD,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEF,cAAc;AACd,0CAAwB;AACxB,uEAAuE;AACvE,8EAA8E;AAC9E,0CAAwB;AACxB,gEAAgE;AAChE,gDAA8B;AAE9B,iEAAiE;AACjE,mEAAmE;AACnE,kEAAkE;AAClE,wCAAsB;AAEtB,wDAAwD;AACxD,mEAAmE;AACnE,4CAA4C;AAC5C,4DAMmC;AALjC,+GAAA,aAAa,OAAA;AACb,qHAAA,mBAAmB,OAAA;AACnB,yHAAA,uBAAuB,OAAA;AAKzB,iFAAiF;AACjF,iFAAiF;AACjF,yDAMkC;AALhC,iHAAA,iBAAiB,OAAA;AACjB,sHAAA,sBAAsB,OAAA;AACtB,4GAAA,YAAY,OAAA;AACZ,gHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next-prompt prediction — the "what will you ask next?" composer feature.
|
|
3
|
+
*
|
|
4
|
+
* After a turn completes, a host may make ONE cheap, separate model call to
|
|
5
|
+
* suggest the user's likely next prompts, rendered as selectable chips (IDE)
|
|
6
|
+
* or a hint line (CLI). This module is the shared, host-agnostic core: it
|
|
7
|
+
* builds the (small) prompt and parses the reply. The host owns the model
|
|
8
|
+
* call + rendering, so CLI and extension share identical behavior.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the planner's split (buildPlannerPrompt / parseGraphProposal): pure
|
|
11
|
+
* functions, no IO, fully unit-testable. Deliberately tiny — this is a
|
|
12
|
+
* latency- and token-sensitive path that runs after every eligible turn, so
|
|
13
|
+
* the prompt is short and the reply is capped.
|
|
14
|
+
*
|
|
15
|
+
* Cost-gating is the host's job and defaults OFF (an extra call per turn is
|
|
16
|
+
* exactly the kind of opt-in cost the framework keeps off by default).
|
|
17
|
+
*/
|
|
18
|
+
export interface SuggestionTurn {
|
|
19
|
+
role: 'user' | 'assistant';
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
export interface SuggestionPromptOptions {
|
|
23
|
+
/** How many suggestions to ask for. Default 3; clamped to 1..5. */
|
|
24
|
+
count?: number;
|
|
25
|
+
/** Recently touched files, to bias suggestions toward the actual work. */
|
|
26
|
+
recentFiles?: string[];
|
|
27
|
+
/** Max chars of each turn we include (keeps the prompt cheap). Default 600. */
|
|
28
|
+
perTurnChars?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Build the suggestion prompt from the tail of the conversation. */
|
|
31
|
+
export declare function buildSuggestionsPrompt(conversation: SuggestionTurn[], opts?: SuggestionPromptOptions): string;
|
|
32
|
+
/**
|
|
33
|
+
* Parse suggestions from the model reply. Accepts a ```json fence or a bare
|
|
34
|
+
* array; tolerates prose around it. Never throws — returns [] on anything
|
|
35
|
+
* unparseable, deduped, trimmed, and capped.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseSuggestions(text: string, max?: number): string[];
|
|
38
|
+
//# sourceMappingURL=suggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../src/suggestions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,cAAc,EAAE,EAC9B,IAAI,GAAE,uBAA4B,GACjC,MAAM,CAuBR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,MAAM,EAAE,CAyBhE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Next-prompt prediction — the "what will you ask next?" composer feature.
|
|
4
|
+
*
|
|
5
|
+
* After a turn completes, a host may make ONE cheap, separate model call to
|
|
6
|
+
* suggest the user's likely next prompts, rendered as selectable chips (IDE)
|
|
7
|
+
* or a hint line (CLI). This module is the shared, host-agnostic core: it
|
|
8
|
+
* builds the (small) prompt and parses the reply. The host owns the model
|
|
9
|
+
* call + rendering, so CLI and extension share identical behavior.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors the planner's split (buildPlannerPrompt / parseGraphProposal): pure
|
|
12
|
+
* functions, no IO, fully unit-testable. Deliberately tiny — this is a
|
|
13
|
+
* latency- and token-sensitive path that runs after every eligible turn, so
|
|
14
|
+
* the prompt is short and the reply is capped.
|
|
15
|
+
*
|
|
16
|
+
* Cost-gating is the host's job and defaults OFF (an extra call per turn is
|
|
17
|
+
* exactly the kind of opt-in cost the framework keeps off by default).
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.buildSuggestionsPrompt = buildSuggestionsPrompt;
|
|
21
|
+
exports.parseSuggestions = parseSuggestions;
|
|
22
|
+
/** Build the suggestion prompt from the tail of the conversation. */
|
|
23
|
+
function buildSuggestionsPrompt(conversation, opts = {}) {
|
|
24
|
+
const count = Math.min(5, Math.max(1, opts.count ?? 3));
|
|
25
|
+
const perTurnChars = opts.perTurnChars ?? 600;
|
|
26
|
+
// Only the last few turns matter for "what's next"; keep it small.
|
|
27
|
+
const tail = conversation.slice(-4).map((t) => {
|
|
28
|
+
const body = t.content.length > perTurnChars ? t.content.slice(0, perTurnChars) + '…' : t.content;
|
|
29
|
+
return `${t.role === 'user' ? 'User' : 'Assistant'}: ${body}`;
|
|
30
|
+
});
|
|
31
|
+
const filesLine = opts.recentFiles?.length
|
|
32
|
+
? `\nRecently touched: ${opts.recentFiles.slice(0, 8).join(', ')}`
|
|
33
|
+
: '';
|
|
34
|
+
return [
|
|
35
|
+
`You suggest the user's likely NEXT prompts in a coding assistant. Based on the exchange below, output ${count} short, concrete follow-ups the user would plausibly type next — the natural next steps (run the tests, commit, explain a change, handle an edge case, etc.).`,
|
|
36
|
+
'',
|
|
37
|
+
'Rules:',
|
|
38
|
+
`- Each suggestion is an imperative the USER would type (e.g. "run the tests", "commit with a message", "add error handling to the parser"). Not questions you'd ask them.`,
|
|
39
|
+
'- Short: 3-8 words. Specific to what just happened, not generic.',
|
|
40
|
+
`- Output ONLY a JSON array of ${count} strings in a \`\`\`json fence. Nothing else.`,
|
|
41
|
+
filesLine,
|
|
42
|
+
'',
|
|
43
|
+
'Recent exchange:',
|
|
44
|
+
...tail,
|
|
45
|
+
].join('\n');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse suggestions from the model reply. Accepts a ```json fence or a bare
|
|
49
|
+
* array; tolerates prose around it. Never throws — returns [] on anything
|
|
50
|
+
* unparseable, deduped, trimmed, and capped.
|
|
51
|
+
*/
|
|
52
|
+
function parseSuggestions(text, max = 5) {
|
|
53
|
+
const raw = extractJsonArray(text);
|
|
54
|
+
if (!raw)
|
|
55
|
+
return [];
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = JSON.parse(raw);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
if (!Array.isArray(parsed))
|
|
64
|
+
return [];
|
|
65
|
+
const seen = new Set();
|
|
66
|
+
const out = [];
|
|
67
|
+
for (const item of parsed) {
|
|
68
|
+
if (typeof item !== 'string')
|
|
69
|
+
continue;
|
|
70
|
+
const s = item.trim().replace(/^["'`]|["'`]$/g, '').trim();
|
|
71
|
+
// Drop empties, over-long entries, and question-shaped items (we want
|
|
72
|
+
// user imperatives, not the model interviewing the user).
|
|
73
|
+
if (!s || s.length > 80)
|
|
74
|
+
continue;
|
|
75
|
+
const key = s.toLowerCase();
|
|
76
|
+
if (seen.has(key))
|
|
77
|
+
continue;
|
|
78
|
+
seen.add(key);
|
|
79
|
+
out.push(s);
|
|
80
|
+
if (out.length >= max)
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
/** First ```json (or ```) fenced array, else the first bracket-balanced [...]. */
|
|
86
|
+
function extractJsonArray(text) {
|
|
87
|
+
const fence = /```(?:json)?\s*(\[[\s\S]*?\])\s*```/.exec(text);
|
|
88
|
+
if (fence)
|
|
89
|
+
return fence[1].trim();
|
|
90
|
+
const start = text.indexOf('[');
|
|
91
|
+
if (start === -1)
|
|
92
|
+
return null;
|
|
93
|
+
let depth = 0;
|
|
94
|
+
let inString = false;
|
|
95
|
+
let escaped = false;
|
|
96
|
+
for (let i = start; i < text.length; i++) {
|
|
97
|
+
const ch = text[i];
|
|
98
|
+
if (inString) {
|
|
99
|
+
if (escaped)
|
|
100
|
+
escaped = false;
|
|
101
|
+
else if (ch === '\\')
|
|
102
|
+
escaped = true;
|
|
103
|
+
else if (ch === '"')
|
|
104
|
+
inString = false;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (ch === '"')
|
|
108
|
+
inString = true;
|
|
109
|
+
else if (ch === '[')
|
|
110
|
+
depth += 1;
|
|
111
|
+
else if (ch === ']') {
|
|
112
|
+
depth -= 1;
|
|
113
|
+
if (depth === 0)
|
|
114
|
+
return text.slice(start, i + 1);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../src/suggestions.ts"],"names":[],"mappings":"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"}
|