bernard-agent 0.8.1 → 0.9.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 +80 -44
- package/dist/agent.d.ts +14 -3
- package/dist/agent.js +228 -38
- package/dist/agent.js.map +1 -1
- package/dist/builtin-specialists/correction-agent.json +32 -0
- package/dist/builtin-specialists/file-wrapper.json +43 -0
- package/dist/builtin-specialists/shell-wrapper.json +50 -0
- package/dist/builtin-specialists/specialist-creator.json +32 -0
- package/dist/builtin-specialists/web-wrapper.json +38 -0
- package/dist/candidate-bootstrap.d.ts +18 -0
- package/dist/candidate-bootstrap.js +61 -0
- package/dist/candidate-bootstrap.js.map +1 -0
- package/dist/config.d.ts +126 -10
- package/dist/config.js +222 -45
- package/dist/config.js.map +1 -1
- package/dist/context.js +23 -6
- package/dist/context.js.map +1 -1
- package/dist/correction-candidates.d.ts +54 -0
- package/dist/correction-candidates.js +138 -0
- package/dist/correction-candidates.js.map +1 -0
- package/dist/correction.d.ts +67 -0
- package/dist/correction.js +138 -0
- package/dist/correction.js.map +1 -0
- package/dist/critic.js +2 -1
- package/dist/critic.js.map +1 -1
- package/dist/cron/notes-store.d.ts +41 -0
- package/dist/cron/notes-store.js +134 -0
- package/dist/cron/notes-store.js.map +1 -0
- package/dist/cron/runner.js +25 -3
- package/dist/cron/runner.js.map +1 -1
- package/dist/cron/scoped-notes-tools.d.ts +24 -0
- package/dist/cron/scoped-notes-tools.js +50 -0
- package/dist/cron/scoped-notes-tools.js.map +1 -0
- package/dist/custom-providers.d.ts +80 -0
- package/dist/custom-providers.js +238 -0
- package/dist/custom-providers.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +44 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/history.js +3 -1
- package/dist/history.js.map +1 -1
- package/dist/image.d.ts +59 -0
- package/dist/image.js +228 -0
- package/dist/image.js.map +1 -0
- package/dist/index.js +72 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts +13 -0
- package/dist/memory.js +45 -4
- package/dist/memory.js.map +1 -1
- package/dist/menu.d.ts +97 -0
- package/dist/menu.js +338 -0
- package/dist/menu.js.map +1 -0
- package/dist/os-info.d.ts +22 -0
- package/dist/os-info.js +111 -0
- package/dist/os-info.js.map +1 -0
- package/dist/output.d.ts +35 -1
- package/dist/output.js +256 -45
- package/dist/output.js.map +1 -1
- package/dist/pac.d.ts +14 -2
- package/dist/pac.js +5 -5
- package/dist/pac.js.map +1 -1
- package/dist/paths.d.ts +5 -0
- package/dist/paths.js +6 -1
- package/dist/paths.js.map +1 -1
- package/dist/plan-store.d.ts +47 -0
- package/dist/plan-store.js +94 -0
- package/dist/plan-store.js.map +1 -0
- package/dist/prompt-rewriter.d.ts +29 -0
- package/dist/prompt-rewriter.js +155 -0
- package/dist/prompt-rewriter.js.map +1 -0
- package/dist/providers/index.d.ts +56 -4
- package/dist/providers/index.js +86 -5
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/profiles.d.ts +37 -0
- package/dist/providers/profiles.js +110 -0
- package/dist/providers/profiles.js.map +1 -0
- package/dist/providers/types.d.ts +11 -2
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -1
- package/dist/rag-query.js +15 -1
- package/dist/rag-query.js.map +1 -1
- package/dist/react.d.ts +38 -0
- package/dist/react.js +116 -0
- package/dist/react.js.map +1 -0
- package/dist/reasoning-log.d.ts +30 -0
- package/dist/reasoning-log.js +102 -0
- package/dist/reasoning-log.js.map +1 -0
- package/dist/reference-resolver.d.ts +47 -0
- package/dist/reference-resolver.js +316 -0
- package/dist/reference-resolver.js.map +1 -0
- package/dist/reference-tool-lookup.d.ts +37 -0
- package/dist/reference-tool-lookup.js +318 -0
- package/dist/reference-tool-lookup.js.map +1 -0
- package/dist/repl.js +1038 -371
- package/dist/repl.js.map +1 -1
- package/dist/setup.js +2 -1
- package/dist/setup.js.map +1 -1
- package/dist/specialist-detector.js +2 -1
- package/dist/specialist-detector.js.map +1 -1
- package/dist/specialists.d.ts +74 -3
- package/dist/specialists.js +152 -20
- package/dist/specialists.js.map +1 -1
- package/dist/structured-output.d.ts +58 -0
- package/dist/structured-output.js +138 -0
- package/dist/structured-output.js.map +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +18 -12
- package/dist/theme.js.map +1 -1
- package/dist/tool-call-repair.d.ts +29 -0
- package/dist/tool-call-repair.js +99 -0
- package/dist/tool-call-repair.js.map +1 -0
- package/dist/tool-profiles.d.ts +70 -0
- package/dist/tool-profiles.js +385 -0
- package/dist/tool-profiles.js.map +1 -0
- package/dist/tools/activity-summary.d.ts +15 -0
- package/dist/tools/activity-summary.js +44 -0
- package/dist/tools/activity-summary.js.map +1 -0
- package/dist/tools/ask-user.d.ts +49 -0
- package/dist/tools/ask-user.js +52 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/augment.d.ts +17 -0
- package/dist/tools/augment.js +102 -0
- package/dist/tools/augment.js.map +1 -0
- package/dist/tools/cron-logs.js +7 -0
- package/dist/tools/cron-logs.js.map +1 -1
- package/dist/tools/cron-notes.d.ts +52 -0
- package/dist/tools/cron-notes.js +105 -0
- package/dist/tools/cron-notes.js.map +1 -0
- package/dist/tools/datetime.d.ts +7 -0
- package/dist/tools/datetime.js +29 -3
- package/dist/tools/datetime.js.map +1 -1
- package/dist/tools/evaluate.d.ts +20 -0
- package/dist/tools/evaluate.js +29 -0
- package/dist/tools/evaluate.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.d.ts +3 -3
- package/dist/tools/plan.d.ts +81 -0
- package/dist/tools/plan.js +108 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/result-cap.d.ts +24 -0
- package/dist/tools/result-cap.js +44 -0
- package/dist/tools/result-cap.js.map +1 -0
- package/dist/tools/routine.d.ts +3 -3
- package/dist/tools/shell.d.ts +14 -1
- package/dist/tools/shell.js +86 -4
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/specialist-run.d.ts +5 -3
- package/dist/tools/specialist-run.js +115 -24
- package/dist/tools/specialist-run.js.map +1 -1
- package/dist/tools/specialist.d.ts +83 -3
- package/dist/tools/specialist.js +83 -3
- package/dist/tools/specialist.js.map +1 -1
- package/dist/tools/subagent.js +32 -14
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task.d.ts +5 -5
- package/dist/tools/task.js +9 -42
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/think.d.ts +18 -0
- package/dist/tools/think.js +25 -0
- package/dist/tools/think.js.map +1 -0
- package/dist/tools/tool-wrapper-run.d.ts +121 -0
- package/dist/tools/tool-wrapper-run.js +382 -0
- package/dist/tools/tool-wrapper-run.js.map +1 -0
- package/dist/tools/types.d.ts +28 -2
- package/dist/tools/web-search.d.ts +31 -0
- package/dist/tools/web-search.js +172 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/wrap-with-specialist.d.ts +55 -0
- package/dist/tools/wrap-with-specialist.js +137 -0
- package/dist/tools/wrap-with-specialist.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RAG_SOURCE_KEY = void 0;
|
|
4
|
+
exports.deriveKeyFromReference = deriveKeyFromReference;
|
|
5
|
+
exports.stripToolResolvableTokens = stripToolResolvableTokens;
|
|
6
|
+
exports.shouldSkipResolver = shouldSkipResolver;
|
|
7
|
+
exports.buildRecentTurnsBlock = buildRecentTurnsBlock;
|
|
8
|
+
exports.validateAgainstMemory = validateAgainstMemory;
|
|
9
|
+
exports.resolveReferences = resolveReferences;
|
|
10
|
+
exports.renderResolvedBlock = renderResolvedBlock;
|
|
11
|
+
const ai_1 = require("ai");
|
|
12
|
+
const index_js_1 = require("./providers/index.js");
|
|
13
|
+
const logger_js_1 = require("./logger.js");
|
|
14
|
+
const memory_js_1 = require("./memory.js");
|
|
15
|
+
/** Sentinel sourceKey used for resolutions drawn from the RAG knowledge base. */
|
|
16
|
+
exports.RAG_SOURCE_KEY = 'rag';
|
|
17
|
+
/**
|
|
18
|
+
* Derive a memory key from a natural-language reference phrase.
|
|
19
|
+
* Strips a leading possessive/demonstrative and replaces internal spaces with dashes.
|
|
20
|
+
*
|
|
21
|
+
* Examples: "my brother" → "brother", "the car" → "car", "my brother Tom" → "brother-tom".
|
|
22
|
+
*/
|
|
23
|
+
function deriveKeyFromReference(reference) {
|
|
24
|
+
const stripped = reference
|
|
25
|
+
.toLowerCase()
|
|
26
|
+
.trim()
|
|
27
|
+
.replace(/^(my|our|the|her|his|their|that|this)\s+/, '');
|
|
28
|
+
return (0, memory_js_1.sanitizeKey)(stripped.replace(/\s+/g, '-'));
|
|
29
|
+
}
|
|
30
|
+
const RESOLVER_MAX_TOKENS = 512;
|
|
31
|
+
const RESOLVER_SYSTEM_PROMPT = `You resolve references in a user's request against their stored personal memory and knowledge base.
|
|
32
|
+
You DO NOT retrieve facts unprompted. You only resolve phrases the user already wrote.
|
|
33
|
+
|
|
34
|
+
Given the user's input, a list of available memory entries, and (optionally) relevant facts from the knowledge base, identify every phrase that refers to a specific person, thing, routine, or plan.
|
|
35
|
+
|
|
36
|
+
For each phrase:
|
|
37
|
+
- If exactly ONE memory entry unambiguously matches the reference, include it in \`entries\` with its memory key as \`sourceKey\`.
|
|
38
|
+
- If no memory entry matches but a fact in "## Relevant known facts" unambiguously identifies the person or thing, include it in \`entries\` with \`sourceKey: "rag"\`. Draw \`resolvedTo\` from the fact text.
|
|
39
|
+
- Prefer a memory entry over a RAG fact when both match the same phrase.
|
|
40
|
+
- If MULTIPLE memory entries plausibly match, stop and return status \`ambiguous\` for the FIRST ambiguous reference with 2-4 candidates. Do not guess.
|
|
41
|
+
- If the phrase clearly names a specific person, organization, or concrete thing (e.g. "my brother", "my dentist", "the car", "aaron") AND neither memory nor known facts match AND the reference was NOT already introduced in "## Recent conversation" AND resolving it is necessary to complete the request, stop and return status \`unknown\` for the FIRST such reference. The caller will prompt the user.
|
|
42
|
+
- If the reference was already introduced or clarified in "## Recent conversation" (e.g. the user or assistant named the person/thing earlier in this session), return \`noop\` for that phrase. The downstream agent has full history access and can resolve it without our help.
|
|
43
|
+
- Generic words ("the file", "this code", "the bug", "the PR", "my response", "my email") that don't point at a stored entity are NOT references — omit and prefer \`noop\`.
|
|
44
|
+
- Tool-resolvable identifiers (URLs like \`https://github.com/...\`, PR/issue numbers like \`#3802\` or \`PR 3802\`, file paths like \`/home/user/foo.md\`, commit hashes, package names, API endpoints) are NOT references — the downstream agent will fetch them with \`shell\`, \`gh\`, \`web_read\`, or similar tools. Omit them and prefer \`noop\`. Example: for "review PR https://github.com/foo/bar/pull/123", return \`{"status":"noop"}\`.
|
|
45
|
+
|
|
46
|
+
Output strict JSON matching one of these shapes and nothing else:
|
|
47
|
+
{"status":"noop"}
|
|
48
|
+
{"status":"resolved","entries":[{"phrase":"...","resolvedTo":"...","sourceKey":"..."}]}
|
|
49
|
+
{"status":"ambiguous","reference":"...","candidates":[{"label":"...","sourceKey":"...","preview":"..."}]}
|
|
50
|
+
{"status":"unknown","reference":"..."}
|
|
51
|
+
|
|
52
|
+
Rules:
|
|
53
|
+
- Be conservative. Prefer \`noop\` over guessing.
|
|
54
|
+
- Only one \`unknown\` or \`ambiguous\` per turn — pick the most important reference.
|
|
55
|
+
- For memory-sourced entries, use only keys from the provided memory list. For knowledge-base-sourced entries, use the literal string \`"rag"\`.
|
|
56
|
+
- \`resolvedTo\` is a short human-readable expansion drawn from the source content (not a raw dump).
|
|
57
|
+
- \`preview\` in candidates is a short one-line summary (~60 chars) distinguishing candidates.`;
|
|
58
|
+
const POSSESSIVE_PRESCAN = /\b(my|our|her|his|their)\s+\w+/i;
|
|
59
|
+
// Require 2+ words after "the/this/that" to avoid generic "the bug" / "this code" false-positives.
|
|
60
|
+
const DEMONSTRATIVE_PRESCAN = /\b(the|this|that)\s+\w+\s+\w+/i;
|
|
61
|
+
const URL_RE = /https?:\/\/\S+/gi;
|
|
62
|
+
const GH_REF_RE = /\b(?:PR|issue|pull|issues)[\s#]*\d+\b|#\d+\b/gi;
|
|
63
|
+
const FILE_PATH_RE = /(?<!\S)(?:~|\.{1,2})?\/[\w./\-]+/g;
|
|
64
|
+
const COMMIT_HASH_RE = /\b[a-f0-9]{7,40}\b/gi;
|
|
65
|
+
/**
|
|
66
|
+
* Remove tokens that the main agent can resolve with tools (URLs, PR/issue refs,
|
|
67
|
+
* file paths, commit hashes) before the reference resolver sees the input.
|
|
68
|
+
* Mirrors {@link ./image.ts:stripImagePaths} in shape and intent.
|
|
69
|
+
*/
|
|
70
|
+
function stripToolResolvableTokens(text) {
|
|
71
|
+
return text
|
|
72
|
+
.replace(URL_RE, ' ')
|
|
73
|
+
.replace(GH_REF_RE, ' ')
|
|
74
|
+
.replace(FILE_PATH_RE, ' ')
|
|
75
|
+
.replace(COMMIT_HASH_RE, ' ')
|
|
76
|
+
.replace(/\s+/g, ' ')
|
|
77
|
+
.trim();
|
|
78
|
+
}
|
|
79
|
+
function shouldSkipResolver(userInput) {
|
|
80
|
+
// Run the resolver when the prompt contains a strong reference signal (possessive, or a
|
|
81
|
+
// multi-word demonstrative phrase). Even when memory is empty the resolver may return
|
|
82
|
+
// `unknown` and prompt the user to fill in the missing entity.
|
|
83
|
+
return !(POSSESSIVE_PRESCAN.test(userInput) || DEMONSTRATIVE_PRESCAN.test(userInput));
|
|
84
|
+
}
|
|
85
|
+
function buildHintsBlock(hints) {
|
|
86
|
+
if (!hints || hints.size === 0)
|
|
87
|
+
return '';
|
|
88
|
+
const lines = ['## Persisted hints (honor these first, do not re-ask)'];
|
|
89
|
+
for (const [phrase, sourceKey] of hints.entries()) {
|
|
90
|
+
lines.push(`- "${phrase}" → ${sourceKey}`);
|
|
91
|
+
}
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
const MAX_MEMORY_ENTRIES_IN_PROMPT = 40;
|
|
95
|
+
const MAX_MEMORY_PREVIEW_CHARS = 140;
|
|
96
|
+
const MAX_RAG_FACTS_IN_PROMPT = 12;
|
|
97
|
+
const MAX_RAG_FACT_CHARS = 240;
|
|
98
|
+
const RECENT_TURNS_IN_PROMPT = 4;
|
|
99
|
+
const MAX_TURN_PREVIEW_CHARS = 300;
|
|
100
|
+
function extractMessageText(msg) {
|
|
101
|
+
if (typeof msg.content === 'string')
|
|
102
|
+
return msg.content;
|
|
103
|
+
if (!Array.isArray(msg.content))
|
|
104
|
+
return '';
|
|
105
|
+
const parts = [];
|
|
106
|
+
for (const part of msg.content) {
|
|
107
|
+
if (part.type === 'text' && typeof part.text === 'string') {
|
|
108
|
+
parts.push(part.text);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return parts.join(' ');
|
|
112
|
+
}
|
|
113
|
+
function buildRecentTurnsBlock(history) {
|
|
114
|
+
if (history.length === 0)
|
|
115
|
+
return '';
|
|
116
|
+
const turns = [];
|
|
117
|
+
for (let i = history.length - 1; i >= 0 && turns.length < RECENT_TURNS_IN_PROMPT; i--) {
|
|
118
|
+
const msg = history[i];
|
|
119
|
+
if (msg.role !== 'user' && msg.role !== 'assistant')
|
|
120
|
+
continue;
|
|
121
|
+
const text = extractMessageText(msg).trim().replace(/\s+/g, ' ');
|
|
122
|
+
if (text.length === 0)
|
|
123
|
+
continue;
|
|
124
|
+
const preview = text.length > MAX_TURN_PREVIEW_CHARS ? text.slice(0, MAX_TURN_PREVIEW_CHARS) + '…' : text;
|
|
125
|
+
turns.unshift({ role: msg.role, text: preview });
|
|
126
|
+
}
|
|
127
|
+
if (turns.length === 0)
|
|
128
|
+
return '';
|
|
129
|
+
const lines = ['## Recent conversation'];
|
|
130
|
+
for (const t of turns) {
|
|
131
|
+
lines.push(`- ${t.role}: ${t.text}`);
|
|
132
|
+
}
|
|
133
|
+
return lines.join('\n');
|
|
134
|
+
}
|
|
135
|
+
function buildRagBlock(facts) {
|
|
136
|
+
if (facts.length === 0)
|
|
137
|
+
return '';
|
|
138
|
+
const lines = ['## Relevant known facts'];
|
|
139
|
+
const selected = facts.slice(0, MAX_RAG_FACTS_IN_PROMPT);
|
|
140
|
+
for (const f of selected) {
|
|
141
|
+
const trimmed = f.fact.trim().replace(/\s+/g, ' ');
|
|
142
|
+
const preview = trimmed.length > MAX_RAG_FACT_CHARS ? trimmed.slice(0, MAX_RAG_FACT_CHARS) + '…' : trimmed;
|
|
143
|
+
lines.push(`- ${preview}`);
|
|
144
|
+
}
|
|
145
|
+
return lines.join('\n');
|
|
146
|
+
}
|
|
147
|
+
function buildMemoryBlock(contents) {
|
|
148
|
+
const lines = ['## Available memory entries'];
|
|
149
|
+
const entries = Array.from(contents.entries());
|
|
150
|
+
const selected = entries.slice(0, MAX_MEMORY_ENTRIES_IN_PROMPT);
|
|
151
|
+
for (const [key, content] of selected) {
|
|
152
|
+
const trimmed = content.trim().replace(/\s+/g, ' ');
|
|
153
|
+
const preview = trimmed.length > MAX_MEMORY_PREVIEW_CHARS
|
|
154
|
+
? trimmed.slice(0, MAX_MEMORY_PREVIEW_CHARS) + '…'
|
|
155
|
+
: trimmed;
|
|
156
|
+
lines.push(`- ${key}: ${preview}`);
|
|
157
|
+
}
|
|
158
|
+
const omitted = entries.length - selected.length;
|
|
159
|
+
if (omitted > 0) {
|
|
160
|
+
lines.push(`- … ${omitted} more entr${omitted === 1 ? 'y' : 'ies'} omitted for brevity`);
|
|
161
|
+
}
|
|
162
|
+
return lines.join('\n');
|
|
163
|
+
}
|
|
164
|
+
function parseResolverResponse(text) {
|
|
165
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
166
|
+
if (!match)
|
|
167
|
+
return null;
|
|
168
|
+
try {
|
|
169
|
+
const parsed = JSON.parse(match[0]);
|
|
170
|
+
if (parsed?.status === 'noop')
|
|
171
|
+
return { status: 'noop' };
|
|
172
|
+
if (parsed?.status === 'resolved' && Array.isArray(parsed.entries)) {
|
|
173
|
+
const entries = parsed.entries
|
|
174
|
+
.filter((e) => e &&
|
|
175
|
+
typeof e.phrase === 'string' &&
|
|
176
|
+
typeof e.resolvedTo === 'string' &&
|
|
177
|
+
typeof e.sourceKey === 'string')
|
|
178
|
+
.map((e) => ({ phrase: e.phrase, resolvedTo: e.resolvedTo, sourceKey: e.sourceKey }));
|
|
179
|
+
if (entries.length === 0)
|
|
180
|
+
return { status: 'noop' };
|
|
181
|
+
return { status: 'resolved', entries };
|
|
182
|
+
}
|
|
183
|
+
if (parsed?.status === 'ambiguous' &&
|
|
184
|
+
typeof parsed.reference === 'string' &&
|
|
185
|
+
Array.isArray(parsed.candidates)) {
|
|
186
|
+
const candidates = parsed.candidates
|
|
187
|
+
.filter((c) => c &&
|
|
188
|
+
typeof c.label === 'string' &&
|
|
189
|
+
typeof c.sourceKey === 'string' &&
|
|
190
|
+
typeof c.preview === 'string')
|
|
191
|
+
.slice(0, 4)
|
|
192
|
+
.map((c) => ({ label: c.label, sourceKey: c.sourceKey, preview: c.preview }));
|
|
193
|
+
if (candidates.length < 2)
|
|
194
|
+
return { status: 'noop' };
|
|
195
|
+
return { status: 'ambiguous', reference: parsed.reference, candidates };
|
|
196
|
+
}
|
|
197
|
+
if (parsed?.status === 'unknown' &&
|
|
198
|
+
typeof parsed.reference === 'string' &&
|
|
199
|
+
parsed.reference.trim().length > 0) {
|
|
200
|
+
return { status: 'unknown', reference: parsed.reference.trim() };
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function validateAgainstMemory(result, memoryKeys, ragAvailable = false) {
|
|
209
|
+
const isValidSource = (key) => (ragAvailable && key === exports.RAG_SOURCE_KEY) || memoryKeys.has(key);
|
|
210
|
+
if (result.status === 'resolved') {
|
|
211
|
+
const safe = result.entries.filter((e) => isValidSource(e.sourceKey));
|
|
212
|
+
return safe.length === 0 ? { status: 'noop' } : { status: 'resolved', entries: safe };
|
|
213
|
+
}
|
|
214
|
+
if (result.status === 'ambiguous') {
|
|
215
|
+
const safe = result.candidates.filter((c) => isValidSource(c.sourceKey));
|
|
216
|
+
return safe.length < 2
|
|
217
|
+
? { status: 'noop' }
|
|
218
|
+
: { status: 'ambiguous', reference: result.reference, candidates: safe };
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
async function resolveReferences(userInput, memoryStore, config, hints, abortSignal, ragStore, recentHistory) {
|
|
223
|
+
const contents = memoryStore.getAllMemoryContents();
|
|
224
|
+
contents.delete(memory_js_1.REWRITER_HINTS_KEY);
|
|
225
|
+
const memoryKeys = Array.from(contents.keys());
|
|
226
|
+
if (shouldSkipResolver(userInput)) {
|
|
227
|
+
(0, logger_js_1.debugLog)('reference-resolver:skip', {
|
|
228
|
+
reason: 'no-reference-tokens',
|
|
229
|
+
prompt: userInput,
|
|
230
|
+
});
|
|
231
|
+
return { status: 'noop' };
|
|
232
|
+
}
|
|
233
|
+
let ragFacts = [];
|
|
234
|
+
if (ragStore) {
|
|
235
|
+
try {
|
|
236
|
+
ragFacts = await ragStore.search(userInput);
|
|
237
|
+
(0, logger_js_1.debugLog)('reference-resolver:rag-hits', { count: ragFacts.length });
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
(0, logger_js_1.debugLog)('reference-resolver:rag-error', err instanceof Error ? err.message : String(err));
|
|
241
|
+
ragFacts = [];
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const historyBlock = recentHistory ? buildRecentTurnsBlock(recentHistory) : '';
|
|
245
|
+
const userMessage = [
|
|
246
|
+
`## User request\n${userInput}`,
|
|
247
|
+
historyBlock,
|
|
248
|
+
buildMemoryBlock(contents),
|
|
249
|
+
buildRagBlock(ragFacts),
|
|
250
|
+
buildHintsBlock(hints),
|
|
251
|
+
]
|
|
252
|
+
.filter((s) => s.length > 0)
|
|
253
|
+
.join('\n\n');
|
|
254
|
+
(0, logger_js_1.debugLog)('reference-resolver:request', {
|
|
255
|
+
prompt: userInput,
|
|
256
|
+
memoryKeys,
|
|
257
|
+
ragFactCount: ragFacts.length,
|
|
258
|
+
recentTurnCount: historyBlock ? historyBlock.split('\n').length - 1 : 0,
|
|
259
|
+
hints: hints ? Array.from(hints.entries()) : [],
|
|
260
|
+
});
|
|
261
|
+
try {
|
|
262
|
+
const result = await (0, ai_1.generateText)({
|
|
263
|
+
model: (0, index_js_1.getModelForConfig)(config, config.provider, config.model),
|
|
264
|
+
providerOptions: (0, index_js_1.getProviderOptionsForConfig)(config, config.provider),
|
|
265
|
+
system: RESOLVER_SYSTEM_PROMPT,
|
|
266
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
267
|
+
maxSteps: 1,
|
|
268
|
+
maxTokens: RESOLVER_MAX_TOKENS,
|
|
269
|
+
abortSignal,
|
|
270
|
+
});
|
|
271
|
+
if (!result.text) {
|
|
272
|
+
(0, logger_js_1.debugLog)('reference-resolver:empty-response', null);
|
|
273
|
+
return { status: 'noop' };
|
|
274
|
+
}
|
|
275
|
+
(0, logger_js_1.debugLog)('reference-resolver:response', result.text.slice(0, 200));
|
|
276
|
+
const parsed = parseResolverResponse(result.text);
|
|
277
|
+
if (!parsed) {
|
|
278
|
+
(0, logger_js_1.debugLog)('reference-resolver:parse-failed', result.text.slice(0, 200));
|
|
279
|
+
return { status: 'noop' };
|
|
280
|
+
}
|
|
281
|
+
const validated = validateAgainstMemory(parsed, new Set(memoryKeys), ragFacts.length > 0);
|
|
282
|
+
(0, logger_js_1.debugLog)('reference-resolver:result', validated);
|
|
283
|
+
return validated;
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
(0, logger_js_1.debugLog)('reference-resolver:error', err instanceof Error ? err.message : String(err));
|
|
287
|
+
return { status: 'noop' };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const MAX_RENDERED_FIELD_CHARS = 200;
|
|
291
|
+
function oneLine(value, max = MAX_RENDERED_FIELD_CHARS) {
|
|
292
|
+
const flat = value
|
|
293
|
+
.replace(/[\r\n\t]+/g, ' ')
|
|
294
|
+
.replace(/\s+/g, ' ')
|
|
295
|
+
.trim();
|
|
296
|
+
return flat.length > max ? flat.slice(0, max) + '…' : flat;
|
|
297
|
+
}
|
|
298
|
+
function renderResolvedBlock(entries) {
|
|
299
|
+
if (entries.length === 0)
|
|
300
|
+
return '';
|
|
301
|
+
const lines = ['## Resolved References'];
|
|
302
|
+
lines.push("These references resolve phrases in the user's request from stored memory or the knowledge base. Treat as hints, not rules. If a resolution seems wrong for the current task, cross-check with the memory tool or ask.");
|
|
303
|
+
for (const e of entries) {
|
|
304
|
+
const phrase = oneLine(e.phrase, 80);
|
|
305
|
+
const resolvedTo = oneLine(e.resolvedTo);
|
|
306
|
+
if (e.sourceKey === exports.RAG_SOURCE_KEY) {
|
|
307
|
+
lines.push(`- "${phrase}" → ${resolvedTo} (from knowledge base)`);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const sourceKey = (0, memory_js_1.sanitizeKey)(e.sourceKey);
|
|
311
|
+
lines.push(`- "${phrase}" → ${resolvedTo} (from memory: ${sourceKey})`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return lines.join('\n');
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=reference-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-resolver.js","sourceRoot":"","sources":["../src/reference-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BernardConfig } from './config.js';
|
|
2
|
+
export type ReferenceLookupResult = {
|
|
3
|
+
status: 'none';
|
|
4
|
+
} | {
|
|
5
|
+
status: 'found';
|
|
6
|
+
resolvedTo: string;
|
|
7
|
+
toolName: string;
|
|
8
|
+
} | {
|
|
9
|
+
status: 'ambiguous';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Returns true when the named tool is safe for the resolver lookup pass.
|
|
13
|
+
*
|
|
14
|
+
* An MCP tool is identified by `__` in its name (the `@ai-sdk/mcp` convention).
|
|
15
|
+
* MCP tools must additionally match {@link READONLY_SUFFIX_RE}. Built-in tools
|
|
16
|
+
* are restricted to {@link ALWAYS_ALLOWED_BUILTINS} unless explicitly extended
|
|
17
|
+
* via `extraAllowed` (sourced from `BERNARD_LOOKUP_TOOLS`).
|
|
18
|
+
*/
|
|
19
|
+
export declare function isAllowedLookupTool(name: string, extraAllowed?: string[]): boolean;
|
|
20
|
+
interface ToolDescriptor {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
schema?: unknown;
|
|
24
|
+
}
|
|
25
|
+
interface SelectResult {
|
|
26
|
+
toolName: string;
|
|
27
|
+
args: unknown;
|
|
28
|
+
}
|
|
29
|
+
export declare function selectLookupTool(reference: string, candidates: ToolDescriptor[], config: BernardConfig, abortSignal?: AbortSignal): Promise<SelectResult | null>;
|
|
30
|
+
export declare function executeLookupTool(toolName: string, args: unknown, tools: Record<string, any>, abortSignal?: AbortSignal): Promise<string | null>;
|
|
31
|
+
export declare function interpretLookupResult(reference: string, toolName: string, toolResult: string, config: BernardConfig, abortSignal?: AbortSignal): Promise<ReferenceLookupResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Runs select → execute → interpret. Fail-open: any error yields
|
|
34
|
+
* `{ status: 'none' }` so the caller falls through to the user-prompt path.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runReferenceLookup(reference: string, tools: Record<string, any>, config: BernardConfig, abortSignal?: AbortSignal): Promise<ReferenceLookupResult>;
|
|
37
|
+
export {};
|