bernard-agent 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -50
- package/dist/agent.d.ts +7 -4
- package/dist/agent.js +88 -127
- package/dist/agent.js.map +1 -1
- package/dist/config.d.ts +13 -1
- package/dist/config.js +66 -4
- package/dist/config.js.map +1 -1
- package/dist/critic.d.ts +32 -0
- package/dist/critic.js +118 -0
- package/dist/critic.js.map +1 -0
- package/dist/cron/runner.js +54 -34
- package/dist/cron/runner.js.map +1 -1
- package/dist/output.d.ts +6 -4
- package/dist/output.js +31 -10
- package/dist/output.js.map +1 -1
- package/dist/overlap-checker.d.ts +61 -0
- package/dist/overlap-checker.js +106 -0
- package/dist/overlap-checker.js.map +1 -0
- package/dist/pac.d.ts +37 -0
- package/dist/pac.js +69 -0
- package/dist/pac.js.map +1 -0
- package/dist/rag-query.js +2 -1
- package/dist/rag-query.js.map +1 -1
- package/dist/rag-worker.js +4 -3
- package/dist/rag-worker.js.map +1 -1
- package/dist/repl.js +160 -4
- package/dist/repl.js.map +1 -1
- package/dist/specialist-candidates.d.ts +13 -0
- package/dist/specialist-candidates.js.map +1 -1
- package/dist/specialist-detector.d.ts +20 -5
- package/dist/specialist-detector.js +72 -9
- package/dist/specialist-detector.js.map +1 -1
- package/dist/specialist-matcher.d.ts +5 -0
- package/dist/specialist-matcher.js +1 -0
- package/dist/specialist-matcher.js.map +1 -1
- package/dist/tools/datetime.d.ts +6 -0
- package/dist/tools/datetime.js +38 -1
- package/dist/tools/datetime.js.map +1 -1
- package/dist/tools/mcp-url.js +1 -1
- package/dist/tools/mcp-url.js.map +1 -1
- package/dist/tools/specialist-run.js +37 -12
- package/dist/tools/specialist-run.js.map +1 -1
- package/dist/tools/subagent.js +37 -12
- package/dist/tools/subagent.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ exports.detectSpecialistCandidate = detectSpecialistCandidate;
|
|
|
5
5
|
const ai_1 = require("ai");
|
|
6
6
|
const index_js_1 = require("./providers/index.js");
|
|
7
7
|
const logger_js_1 = require("./logger.js");
|
|
8
|
+
const overlap_checker_js_1 = require("./overlap-checker.js");
|
|
8
9
|
/** Minimum conversation length (chars) to bother analyzing. */
|
|
9
10
|
const MIN_CONVERSATION_LENGTH = 500;
|
|
10
11
|
/** Minimum confidence threshold to accept a candidate. */
|
|
@@ -24,9 +25,15 @@ Do NOT suggest a specialist for:
|
|
|
24
25
|
- Simple tool usage without behavioral customization
|
|
25
26
|
- Patterns already covered by an existing specialist
|
|
26
27
|
|
|
28
|
+
If a candidate significantly overlaps with an existing specialist:
|
|
29
|
+
- Set shouldCreate to false and shouldEnhance to true
|
|
30
|
+
- In enhancementTarget, specify which specialist to enhance and what to add
|
|
31
|
+
- Include merged guidelines that combine the existing specialist's strengths with the new pattern
|
|
32
|
+
|
|
27
33
|
Respond with a JSON object (no markdown fences):
|
|
28
34
|
{
|
|
29
35
|
"shouldCreate": boolean,
|
|
36
|
+
"shouldEnhance": boolean,
|
|
30
37
|
"candidate": {
|
|
31
38
|
"draftId": "kebab-case-id",
|
|
32
39
|
"name": "Display Name",
|
|
@@ -35,6 +42,12 @@ Respond with a JSON object (no markdown fences):
|
|
|
35
42
|
"guidelines": ["Rule 1", "Rule 2"],
|
|
36
43
|
"confidence": 0.0-1.0,
|
|
37
44
|
"reasoning": "Why this specialist was proposed"
|
|
45
|
+
} | null,
|
|
46
|
+
"enhancementTarget": {
|
|
47
|
+
"existingSpecialistId": "string",
|
|
48
|
+
"mergedGuidelines": ["rule1", "rule2"],
|
|
49
|
+
"mergedDescription": "enhanced description",
|
|
50
|
+
"reasoning": "Why this should be merged"
|
|
38
51
|
} | null
|
|
39
52
|
}
|
|
40
53
|
|
|
@@ -44,8 +57,7 @@ Be conservative — only suggest specialists for clear, recurring patterns with
|
|
|
44
57
|
* Analyze a serialized conversation for recurring delegation patterns
|
|
45
58
|
* that would benefit from a saved specialist agent.
|
|
46
59
|
*
|
|
47
|
-
* Returns a candidate
|
|
48
|
-
* if no strong pattern was detected.
|
|
60
|
+
* Returns a discriminated union: a new candidate, an enhancement suggestion, or null.
|
|
49
61
|
*/
|
|
50
62
|
async function detectSpecialistCandidate(serializedText, config, existingSpecialists, pendingCandidates) {
|
|
51
63
|
// Skip trivial conversations
|
|
@@ -75,6 +87,21 @@ async function detectSpecialistCandidate(serializedText, config, existingSpecial
|
|
|
75
87
|
// Parse JSON — handle markdown code fences
|
|
76
88
|
const jsonStr = text.replace(/^```(?:json)?\s*/m, '').replace(/\s*```$/m, '');
|
|
77
89
|
const parsed = JSON.parse(jsonStr);
|
|
90
|
+
// Handle enhancement suggestion
|
|
91
|
+
if (parsed.shouldEnhance && parsed.enhancementTarget) {
|
|
92
|
+
const { existingSpecialistId, mergedGuidelines, mergedDescription, reasoning } = parsed.enhancementTarget;
|
|
93
|
+
if (existingSpecialistId && Array.isArray(mergedGuidelines)) {
|
|
94
|
+
return {
|
|
95
|
+
type: 'enhance-existing',
|
|
96
|
+
enhancement: {
|
|
97
|
+
existingSpecialistId,
|
|
98
|
+
mergedGuidelines,
|
|
99
|
+
mergedDescription,
|
|
100
|
+
reasoning: reasoning || '',
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
78
105
|
if (!parsed.shouldCreate || !parsed.candidate)
|
|
79
106
|
return null;
|
|
80
107
|
if (parsed.candidate.confidence < MIN_CONFIDENCE)
|
|
@@ -83,7 +110,31 @@ async function detectSpecialistCandidate(serializedText, config, existingSpecial
|
|
|
83
110
|
// Validate required fields
|
|
84
111
|
if (!draftId || !name || !systemPrompt)
|
|
85
112
|
return null;
|
|
86
|
-
//
|
|
113
|
+
// Run overlap check against existing specialists and pending candidates
|
|
114
|
+
const overlapResult = (0, overlap_checker_js_1.checkOverlaps)({
|
|
115
|
+
name,
|
|
116
|
+
description: description || '',
|
|
117
|
+
systemPrompt,
|
|
118
|
+
guidelines: Array.isArray(guidelines) ? guidelines : [],
|
|
119
|
+
}, existingSpecialists.map((s) => ({
|
|
120
|
+
id: s.id,
|
|
121
|
+
name: s.name,
|
|
122
|
+
description: s.description,
|
|
123
|
+
systemPrompt: 'systemPrompt' in s ? s.systemPrompt : undefined,
|
|
124
|
+
guidelines: 'guidelines' in s ? s.guidelines : undefined,
|
|
125
|
+
})), pendingCandidates.map((c) => ({
|
|
126
|
+
draftId: c.draftId,
|
|
127
|
+
name: c.name,
|
|
128
|
+
description: c.description,
|
|
129
|
+
systemPrompt: c.systemPrompt,
|
|
130
|
+
guidelines: c.guidelines,
|
|
131
|
+
})));
|
|
132
|
+
// If overlap exceeds threshold, reject the candidate
|
|
133
|
+
if (overlapResult.maxScore > overlap_checker_js_1.OVERLAP_THRESHOLD) {
|
|
134
|
+
(0, logger_js_1.debugLog)('specialist-detector', `Overlap detected: "${draftId}" overlaps with ${overlapResult.details} (score: ${overlapResult.maxScore.toFixed(2)} > threshold ${overlap_checker_js_1.OVERLAP_THRESHOLD})`);
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// Duplicate check against existing specialists (strict ID/name match)
|
|
87
138
|
const normalizedName = name.toLowerCase();
|
|
88
139
|
const normalizedDraftId = draftId.toLowerCase();
|
|
89
140
|
for (const s of existingSpecialists) {
|
|
@@ -106,14 +157,26 @@ async function detectSpecialistCandidate(serializedText, config, existingSpecial
|
|
|
106
157
|
return null;
|
|
107
158
|
}
|
|
108
159
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
name,
|
|
112
|
-
description: description || '',
|
|
160
|
+
// Compute composite confidence using overlap data
|
|
161
|
+
const compositeConfidence = (0, overlap_checker_js_1.computeConfidence)(confidence, overlapResult.maxScore, {
|
|
113
162
|
systemPrompt,
|
|
114
163
|
guidelines: Array.isArray(guidelines) ? guidelines : [],
|
|
115
|
-
|
|
116
|
-
|
|
164
|
+
description: description || '',
|
|
165
|
+
draftId,
|
|
166
|
+
}, serializedText.length);
|
|
167
|
+
return {
|
|
168
|
+
type: 'new-candidate',
|
|
169
|
+
candidate: {
|
|
170
|
+
draftId,
|
|
171
|
+
name,
|
|
172
|
+
description: description || '',
|
|
173
|
+
systemPrompt,
|
|
174
|
+
guidelines: Array.isArray(guidelines) ? guidelines : [],
|
|
175
|
+
confidence: compositeConfidence,
|
|
176
|
+
reasoning: reasoning || '',
|
|
177
|
+
overlapScore: overlapResult.maxScore,
|
|
178
|
+
overlapsWithId: overlapResult.bestMatch?.id,
|
|
179
|
+
},
|
|
117
180
|
};
|
|
118
181
|
}
|
|
119
182
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialist-detector.js","sourceRoot":"","sources":["../src/specialist-detector.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"specialist-detector.js","sourceRoot":"","sources":["../src/specialist-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,11 @@ export interface SpecialistMatch {
|
|
|
8
8
|
* Tokenizes text: lowercase, split on non-alphanumeric, remove stop words and short/numeric tokens.
|
|
9
9
|
*/
|
|
10
10
|
export declare function tokenize(text: string): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Stem-prefix match: exact match for any length, prefix matching requires both tokens >= 3 chars.
|
|
13
|
+
* This means 2-char tokens like "pr" only match exactly, while "review" can prefix-match "reviewer".
|
|
14
|
+
*/
|
|
15
|
+
export declare function stemMatch(a: string, b: string): boolean;
|
|
11
16
|
/**
|
|
12
17
|
* Scores user input against specialist metadata and returns matches with score >= 0.4.
|
|
13
18
|
* Results are sorted by score descending.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialist-matcher.js","sourceRoot":"","sources":["../src/specialist-matcher.ts"],"names":[],"mappings":";;AA4HA,4BAKC;
|
|
1
|
+
{"version":3,"file":"specialist-matcher.js","sourceRoot":"","sources":["../src/specialist-matcher.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/datetime.d.ts
CHANGED
|
@@ -3,3 +3,9 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare function createDateTimeTool(): import("ai").Tool<z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>, string> & {
|
|
4
4
|
execute: (args: {}, options: import("ai").ToolExecutionOptions) => PromiseLike<string>;
|
|
5
5
|
};
|
|
6
|
+
/** Returns a human-readable date+time string for use in system prompts. */
|
|
7
|
+
export declare function formatCurrentDateTime(): string;
|
|
8
|
+
/** Wraps user input with a local ISO 8601 timestamp prefix. */
|
|
9
|
+
export declare function timestampUserMessage(userInput: string): string;
|
|
10
|
+
/** Strips a leading [ISO-timestamp] prefix from a message string. */
|
|
11
|
+
export declare function stripTimestamp(text: string): string;
|
package/dist/tools/datetime.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createDateTimeTool = createDateTimeTool;
|
|
4
|
+
exports.formatCurrentDateTime = formatCurrentDateTime;
|
|
5
|
+
exports.timestampUserMessage = timestampUserMessage;
|
|
6
|
+
exports.stripTimestamp = stripTimestamp;
|
|
4
7
|
const ai_1 = require("ai");
|
|
5
8
|
const zod_1 = require("zod");
|
|
9
|
+
/** Regex matching the [ISO-8601] prefix produced by timestampUserMessage. */
|
|
10
|
+
const TIMESTAMP_PREFIX_RE = /^\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}\] /;
|
|
6
11
|
/** Creates a tool that returns the current local date and time as a human-readable string. */
|
|
7
12
|
function createDateTimeTool() {
|
|
8
13
|
return (0, ai_1.tool)({
|
|
9
|
-
description: 'Get the current date and time including hours and minutes.
|
|
14
|
+
description: 'Get the current date and time including hours and minutes. Timestamps are automatically attached to user messages, so use this only when you need a precise mid-turn timestamp (e.g., after a long-running tool call).',
|
|
10
15
|
parameters: zod_1.z.object({}),
|
|
11
16
|
execute: async () => {
|
|
12
17
|
const now = new Date();
|
|
@@ -23,4 +28,36 @@ function createDateTimeTool() {
|
|
|
23
28
|
},
|
|
24
29
|
});
|
|
25
30
|
}
|
|
31
|
+
/** Returns a human-readable date+time string for use in system prompts. */
|
|
32
|
+
function formatCurrentDateTime() {
|
|
33
|
+
const now = new Date();
|
|
34
|
+
const date = now.toLocaleDateString('en-US', {
|
|
35
|
+
weekday: 'long',
|
|
36
|
+
year: 'numeric',
|
|
37
|
+
month: 'long',
|
|
38
|
+
day: 'numeric',
|
|
39
|
+
});
|
|
40
|
+
const time = now.toLocaleTimeString('en-US', {
|
|
41
|
+
hour: 'numeric',
|
|
42
|
+
minute: '2-digit',
|
|
43
|
+
timeZoneName: 'short',
|
|
44
|
+
});
|
|
45
|
+
return `${date} at ${time}`;
|
|
46
|
+
}
|
|
47
|
+
/** Wraps user input with a local ISO 8601 timestamp prefix. */
|
|
48
|
+
function timestampUserMessage(userInput) {
|
|
49
|
+
const now = new Date();
|
|
50
|
+
const tzOffset = -now.getTimezoneOffset();
|
|
51
|
+
const sign = tzOffset >= 0 ? '+' : '-';
|
|
52
|
+
const hh = String(Math.floor(Math.abs(tzOffset) / 60)).padStart(2, '0');
|
|
53
|
+
const mm = String(Math.abs(tzOffset) % 60).padStart(2, '0');
|
|
54
|
+
const localISO = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}` +
|
|
55
|
+
`T${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}` +
|
|
56
|
+
`${sign}${hh}:${mm}`;
|
|
57
|
+
return `[${localISO}] ${userInput}`;
|
|
58
|
+
}
|
|
59
|
+
/** Strips a leading [ISO-timestamp] prefix from a message string. */
|
|
60
|
+
function stripTimestamp(text) {
|
|
61
|
+
return text.replace(TIMESTAMP_PREFIX_RE, '');
|
|
62
|
+
}
|
|
26
63
|
//# sourceMappingURL=datetime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../src/tools/datetime.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../src/tools/datetime.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/mcp-url.js
CHANGED
|
@@ -19,7 +19,7 @@ function createMCPAddUrlTool() {
|
|
|
19
19
|
}),
|
|
20
20
|
execute: async ({ key, url }) => {
|
|
21
21
|
try {
|
|
22
|
-
const type = url.endsWith('/sse') ? 'sse' : '
|
|
22
|
+
const type = url.endsWith('/sse') ? 'sse' : 'http';
|
|
23
23
|
(0, mcp_js_1.addMCPUrlServer)(key, url, type);
|
|
24
24
|
return `MCP server added:\n Key: ${key}\n URL: ${url}\n Transport: ${type}\n\nRestart Bernard for the server to connect.`;
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-url.js","sourceRoot":"","sources":["../../src/tools/mcp-url.ts"],"names":[],"mappings":";;AAUA,kDAmBC;AA7BD,2BAA0B;AAC1B,6BAAwB;AACxB,sCAA4C;AAE5C;;;;;GAKG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,SAAI,EAAC;QACV,WAAW,EACT,yIAAyI;QAC3I,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACtE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;SACrF,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAmB,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,KAAe,CAAC,CAAC,CAAE,
|
|
1
|
+
{"version":3,"file":"mcp-url.js","sourceRoot":"","sources":["../../src/tools/mcp-url.ts"],"names":[],"mappings":";;AAUA,kDAmBC;AA7BD,2BAA0B;AAC1B,6BAAwB;AACxB,sCAA4C;AAE5C;;;;;GAKG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,SAAI,EAAC;QACV,WAAW,EACT,yIAAyI;QAC3I,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACtE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;SACrF,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAmB,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,KAAe,CAAC,CAAC,CAAE,MAAgB,CAAC;gBACzE,IAAA,wBAAe,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChC,OAAO,6BAA6B,GAAG,YAAY,GAAG,kBAAkB,IAAI,gDAAgD,CAAC;YAC/H,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,wBAAwB,GAAG,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -10,6 +10,7 @@ const logger_js_1 = require("../logger.js");
|
|
|
10
10
|
const memory_context_js_1 = require("../memory-context.js");
|
|
11
11
|
const agent_pool_js_1 = require("./agent-pool.js");
|
|
12
12
|
const config_js_1 = require("../config.js");
|
|
13
|
+
const pac_js_1 = require("../pac.js");
|
|
13
14
|
const SPECIALIST_EXECUTION_RULES = `
|
|
14
15
|
|
|
15
16
|
Rules:
|
|
@@ -109,26 +110,50 @@ function createSpecialistRunTool(config, options, memoryStore, specialistStore,
|
|
|
109
110
|
ragResults,
|
|
110
111
|
includeScratch: true,
|
|
111
112
|
});
|
|
113
|
+
const onStepFinish = ({ text, toolCalls, toolResults }) => {
|
|
114
|
+
for (const tc of toolCalls ?? []) {
|
|
115
|
+
(0, output_js_1.printToolCall)(tc.toolName, tc.args, prefix);
|
|
116
|
+
}
|
|
117
|
+
for (const tr of toolResults ?? []) {
|
|
118
|
+
(0, output_js_1.printToolResult)(tr.toolName, tr.result, prefix);
|
|
119
|
+
}
|
|
120
|
+
if (text) {
|
|
121
|
+
(0, output_js_1.printAssistantText)(text, prefix);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
112
124
|
const result = await (0, ai_1.generateText)({
|
|
113
125
|
model: (0, index_js_1.getModel)(resolvedProvider, resolvedModel),
|
|
114
126
|
tools: baseTools,
|
|
115
|
-
maxSteps:
|
|
127
|
+
maxSteps: Math.ceil(config.maxSteps * 0.5),
|
|
116
128
|
maxTokens: config.maxTokens,
|
|
117
129
|
system: systemPrompt,
|
|
118
130
|
messages: [{ role: 'user', content: userMessage }],
|
|
119
131
|
abortSignal: execOptions.abortSignal,
|
|
120
|
-
onStepFinish
|
|
121
|
-
for (const tc of toolCalls) {
|
|
122
|
-
(0, output_js_1.printToolCall)(tc.toolName, tc.args, prefix);
|
|
123
|
-
}
|
|
124
|
-
for (const tr of toolResults) {
|
|
125
|
-
(0, output_js_1.printToolResult)(tr.toolName, tr.result, prefix);
|
|
126
|
-
}
|
|
127
|
-
if (text) {
|
|
128
|
-
(0, output_js_1.printAssistantText)(text, prefix);
|
|
129
|
-
}
|
|
130
|
-
},
|
|
132
|
+
onStepFinish,
|
|
131
133
|
});
|
|
134
|
+
if (config.criticMode) {
|
|
135
|
+
const pacResult = await (0, pac_js_1.runPACLoop)({
|
|
136
|
+
config,
|
|
137
|
+
userInput: userMessage,
|
|
138
|
+
initialResult: result,
|
|
139
|
+
regenerate: async (extraMessages) => {
|
|
140
|
+
return (0, ai_1.generateText)({
|
|
141
|
+
model: (0, index_js_1.getModel)(resolvedProvider, resolvedModel),
|
|
142
|
+
tools: baseTools,
|
|
143
|
+
maxSteps: 10,
|
|
144
|
+
maxTokens: config.maxTokens,
|
|
145
|
+
system: systemPrompt,
|
|
146
|
+
messages: [{ role: 'user', content: userMessage }, ...extraMessages],
|
|
147
|
+
abortSignal: execOptions.abortSignal,
|
|
148
|
+
onStepFinish,
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
prefix,
|
|
152
|
+
abortSignal: execOptions.abortSignal,
|
|
153
|
+
});
|
|
154
|
+
(0, output_js_1.printSpecialistEnd)(id);
|
|
155
|
+
return pacResult.finalText;
|
|
156
|
+
}
|
|
132
157
|
(0, output_js_1.printSpecialistEnd)(id);
|
|
133
158
|
return result.text;
|
|
134
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialist-run.js","sourceRoot":"","sources":["../../src/tools/specialist-run.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"specialist-run.js","sourceRoot":"","sources":["../../src/tools/specialist-run.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/subagent.js
CHANGED
|
@@ -11,6 +11,7 @@ const logger_js_1 = require("../logger.js");
|
|
|
11
11
|
const memory_context_js_1 = require("../memory-context.js");
|
|
12
12
|
const agent_pool_js_1 = require("./agent-pool.js");
|
|
13
13
|
const config_js_1 = require("../config.js");
|
|
14
|
+
const pac_js_1 = require("../pac.js");
|
|
14
15
|
const SUB_AGENT_SYSTEM_PROMPT = `You are a sub-agent of Bernard, a CLI AI assistant. You have been delegated a specific, scoped task.
|
|
15
16
|
|
|
16
17
|
Objective: Complete the assigned task efficiently and return a concise report to the main agent.
|
|
@@ -105,26 +106,50 @@ function createSubAgentTool(config, options, memoryStore, mcpTools, ragStore) {
|
|
|
105
106
|
ragResults,
|
|
106
107
|
includeScratch: true,
|
|
107
108
|
});
|
|
109
|
+
const onStepFinish = ({ text, toolCalls, toolResults }) => {
|
|
110
|
+
for (const tc of toolCalls ?? []) {
|
|
111
|
+
(0, output_js_1.printToolCall)(tc.toolName, tc.args, prefix);
|
|
112
|
+
}
|
|
113
|
+
for (const tr of toolResults ?? []) {
|
|
114
|
+
(0, output_js_1.printToolResult)(tr.toolName, tr.result, prefix);
|
|
115
|
+
}
|
|
116
|
+
if (text) {
|
|
117
|
+
(0, output_js_1.printAssistantText)(text, prefix);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
108
120
|
const result = await (0, ai_1.generateText)({
|
|
109
121
|
model: (0, index_js_1.getModel)(resolvedProvider, resolvedModel),
|
|
110
122
|
tools: baseTools,
|
|
111
|
-
maxSteps:
|
|
123
|
+
maxSteps: Math.ceil(config.maxSteps * 0.5),
|
|
112
124
|
maxTokens: config.maxTokens,
|
|
113
125
|
system: enrichedPrompt,
|
|
114
126
|
messages: [{ role: 'user', content: userMessage }],
|
|
115
127
|
abortSignal: execOptions.abortSignal,
|
|
116
|
-
onStepFinish
|
|
117
|
-
for (const tc of toolCalls) {
|
|
118
|
-
(0, output_js_1.printToolCall)(tc.toolName, tc.args, prefix);
|
|
119
|
-
}
|
|
120
|
-
for (const tr of toolResults) {
|
|
121
|
-
(0, output_js_1.printToolResult)(tr.toolName, tr.result, prefix);
|
|
122
|
-
}
|
|
123
|
-
if (text) {
|
|
124
|
-
(0, output_js_1.printAssistantText)(text, prefix);
|
|
125
|
-
}
|
|
126
|
-
},
|
|
128
|
+
onStepFinish,
|
|
127
129
|
});
|
|
130
|
+
if (config.criticMode) {
|
|
131
|
+
const pacResult = await (0, pac_js_1.runPACLoop)({
|
|
132
|
+
config,
|
|
133
|
+
userInput: userMessage,
|
|
134
|
+
initialResult: result,
|
|
135
|
+
regenerate: async (extraMessages) => {
|
|
136
|
+
return (0, ai_1.generateText)({
|
|
137
|
+
model: (0, index_js_1.getModel)(resolvedProvider, resolvedModel),
|
|
138
|
+
tools: baseTools,
|
|
139
|
+
maxSteps: 10,
|
|
140
|
+
maxTokens: config.maxTokens,
|
|
141
|
+
system: enrichedPrompt,
|
|
142
|
+
messages: [{ role: 'user', content: userMessage }, ...extraMessages],
|
|
143
|
+
abortSignal: execOptions.abortSignal,
|
|
144
|
+
onStepFinish,
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
prefix,
|
|
148
|
+
abortSignal: execOptions.abortSignal,
|
|
149
|
+
});
|
|
150
|
+
(0, output_js_1.printSubAgentEnd)(id);
|
|
151
|
+
return pacResult.finalText;
|
|
152
|
+
}
|
|
128
153
|
(0, output_js_1.printSubAgentEnd)(id);
|
|
129
154
|
return result.text;
|
|
130
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
|