bernard-agent 0.5.2 → 0.6.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.
Files changed (63) hide show
  1. package/README.md +163 -39
  2. package/dist/agent.d.ts +20 -2
  3. package/dist/agent.js +224 -9
  4. package/dist/agent.js.map +1 -1
  5. package/dist/config.d.ts +10 -2
  6. package/dist/config.js +36 -11
  7. package/dist/config.js.map +1 -1
  8. package/dist/context.d.ts +4 -2
  9. package/dist/context.js +9 -6
  10. package/dist/context.js.map +1 -1
  11. package/dist/domains.js +35 -0
  12. package/dist/domains.js.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/output.d.ts +27 -0
  16. package/dist/output.js +97 -5
  17. package/dist/output.js.map +1 -1
  18. package/dist/paths.d.ts +2 -0
  19. package/dist/paths.js +3 -1
  20. package/dist/paths.js.map +1 -1
  21. package/dist/rag-worker.js +16 -0
  22. package/dist/rag-worker.js.map +1 -1
  23. package/dist/repl.js +378 -18
  24. package/dist/repl.js.map +1 -1
  25. package/dist/reserved-names.d.ts +5 -0
  26. package/dist/reserved-names.js +32 -0
  27. package/dist/reserved-names.js.map +1 -0
  28. package/dist/routines.js +10 -19
  29. package/dist/routines.js.map +1 -1
  30. package/dist/specialist-candidates.d.ts +45 -0
  31. package/dist/specialist-candidates.js +154 -0
  32. package/dist/specialist-candidates.js.map +1 -0
  33. package/dist/specialist-detector.d.ts +12 -0
  34. package/dist/specialist-detector.js +124 -0
  35. package/dist/specialist-detector.js.map +1 -0
  36. package/dist/specialist-matcher.d.ts +15 -0
  37. package/dist/specialist-matcher.js +192 -0
  38. package/dist/specialist-matcher.js.map +1 -0
  39. package/dist/specialists.d.ts +50 -0
  40. package/dist/specialists.js +173 -0
  41. package/dist/specialists.js.map +1 -0
  42. package/dist/tools/agent-pool.d.ts +20 -0
  43. package/dist/tools/agent-pool.js +41 -0
  44. package/dist/tools/agent-pool.js.map +1 -0
  45. package/dist/tools/index.d.ts +2 -1
  46. package/dist/tools/index.js +3 -1
  47. package/dist/tools/index.js.map +1 -1
  48. package/dist/tools/specialist-run.d.ts +39 -0
  49. package/dist/tools/specialist-run.js +123 -0
  50. package/dist/tools/specialist-run.js.map +1 -0
  51. package/dist/tools/specialist.d.ts +40 -0
  52. package/dist/tools/specialist.js +107 -0
  53. package/dist/tools/specialist.js.map +1 -0
  54. package/dist/tools/subagent.d.ts +1 -1
  55. package/dist/tools/subagent.js +8 -11
  56. package/dist/tools/subagent.js.map +1 -1
  57. package/dist/tools/task.d.ts +45 -0
  58. package/dist/tools/task.js +155 -0
  59. package/dist/tools/task.js.map +1 -0
  60. package/dist/update.d.ts +7 -0
  61. package/dist/update.js +16 -2
  62. package/dist/update.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-detector.js","sourceRoot":"","sources":["../src/specialist-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SpecialistSummary } from './specialists.js';
2
+ export interface SpecialistMatch {
3
+ id: string;
4
+ name: string;
5
+ score: number;
6
+ }
7
+ /**
8
+ * Tokenizes text: lowercase, split on non-alphanumeric, remove stop words and short/numeric tokens.
9
+ */
10
+ export declare function tokenize(text: string): string[];
11
+ /**
12
+ * Scores user input against specialist metadata and returns matches with score >= 0.4.
13
+ * Results are sorted by score descending.
14
+ */
15
+ export declare function matchSpecialists(input: string, specialists: SpecialistSummary[]): SpecialistMatch[];
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenize = tokenize;
4
+ exports.matchSpecialists = matchSpecialists;
5
+ const STOP_WORDS = new Set([
6
+ 'the',
7
+ 'a',
8
+ 'an',
9
+ 'is',
10
+ 'are',
11
+ 'was',
12
+ 'were',
13
+ 'be',
14
+ 'been',
15
+ 'being',
16
+ 'for',
17
+ 'to',
18
+ 'of',
19
+ 'in',
20
+ 'on',
21
+ 'at',
22
+ 'by',
23
+ 'with',
24
+ 'and',
25
+ 'or',
26
+ 'but',
27
+ 'not',
28
+ 'no',
29
+ 'nor',
30
+ 'so',
31
+ 'yet',
32
+ 'this',
33
+ 'that',
34
+ 'these',
35
+ 'those',
36
+ 'my',
37
+ 'me',
38
+ 'i',
39
+ 'you',
40
+ 'your',
41
+ 'he',
42
+ 'she',
43
+ 'it',
44
+ 'we',
45
+ 'they',
46
+ 'his',
47
+ 'her',
48
+ 'its',
49
+ 'our',
50
+ 'their',
51
+ 'them',
52
+ 'us',
53
+ 'do',
54
+ 'does',
55
+ 'did',
56
+ 'has',
57
+ 'have',
58
+ 'had',
59
+ 'will',
60
+ 'would',
61
+ 'could',
62
+ 'should',
63
+ 'can',
64
+ 'may',
65
+ 'might',
66
+ 'shall',
67
+ 'must',
68
+ 'if',
69
+ 'then',
70
+ 'else',
71
+ 'when',
72
+ 'where',
73
+ 'how',
74
+ 'what',
75
+ 'which',
76
+ 'who',
77
+ 'whom',
78
+ 'why',
79
+ 'all',
80
+ 'each',
81
+ 'every',
82
+ 'both',
83
+ 'few',
84
+ 'more',
85
+ 'most',
86
+ 'some',
87
+ 'any',
88
+ 'about',
89
+ 'up',
90
+ 'out',
91
+ 'just',
92
+ 'also',
93
+ 'than',
94
+ 'very',
95
+ 'too',
96
+ 'from',
97
+ 'into',
98
+ 'over',
99
+ 'after',
100
+ 'before',
101
+ 'between',
102
+ 'under',
103
+ 'again',
104
+ 'there',
105
+ 'here',
106
+ 'once',
107
+ 'please',
108
+ 'help',
109
+ 'want',
110
+ 'need',
111
+ 'like',
112
+ 'get',
113
+ 'got',
114
+ 'make',
115
+ 'made',
116
+ ]);
117
+ /**
118
+ * Tokenizes text: lowercase, split on non-alphanumeric, remove stop words and short/numeric tokens.
119
+ */
120
+ function tokenize(text) {
121
+ return text
122
+ .toLowerCase()
123
+ .split(/[^a-z0-9]+/)
124
+ .filter((t) => t.length >= 2 && !STOP_WORDS.has(t) && !/^\d+$/.test(t));
125
+ }
126
+ /**
127
+ * Stem-prefix match: exact match for any length, prefix matching requires both tokens >= 3 chars.
128
+ * This means 2-char tokens like "pr" only match exactly, while "review" can prefix-match "reviewer".
129
+ */
130
+ function stemMatch(a, b) {
131
+ if (a === b)
132
+ return true;
133
+ const minLen = 3;
134
+ if (a.length < minLen || b.length < minLen)
135
+ return false;
136
+ return a.startsWith(b) || b.startsWith(a);
137
+ }
138
+ /**
139
+ * Scores user input against specialist metadata and returns matches with score >= 0.4.
140
+ * Results are sorted by score descending.
141
+ */
142
+ function matchSpecialists(input, specialists) {
143
+ if (!input || specialists.length === 0)
144
+ return [];
145
+ const inputTokens = tokenize(input);
146
+ if (inputTokens.length === 0)
147
+ return [];
148
+ const matches = [];
149
+ for (const spec of specialists) {
150
+ // Build identity tokens from id segments + name (stop-word filtered to match tokenize behavior)
151
+ const idSegments = spec.id
152
+ .split('-')
153
+ .filter((s) => s.length >= 2 && !/^\d+$/.test(s) && !STOP_WORDS.has(s));
154
+ const nameTokens = tokenize(spec.name);
155
+ const identityTokens = [...new Set([...idSegments, ...nameTokens])];
156
+ if (identityTokens.length === 0)
157
+ continue;
158
+ // Build description tokens
159
+ const descTokens = tokenize(spec.description);
160
+ // Count identity hits
161
+ let identityHits = 0;
162
+ for (const idToken of identityTokens) {
163
+ for (const inputToken of inputTokens) {
164
+ if (stemMatch(idToken, inputToken)) {
165
+ identityHits++;
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ // Primary score from identity match
171
+ let score = identityHits / identityTokens.length;
172
+ // Description boost: up to 0.15 bonus for description overlap
173
+ if (descTokens.length > 0 && score > 0) {
174
+ let descHits = 0;
175
+ for (const descToken of descTokens) {
176
+ for (const inputToken of inputTokens) {
177
+ if (stemMatch(descToken, inputToken)) {
178
+ descHits++;
179
+ break;
180
+ }
181
+ }
182
+ }
183
+ const descRatio = descHits / descTokens.length;
184
+ score = Math.min(1, score + descRatio * 0.15);
185
+ }
186
+ if (score >= 0.4) {
187
+ matches.push({ id: spec.id, name: spec.name, score });
188
+ }
189
+ }
190
+ return matches.sort((a, b) => b.score - a.score);
191
+ }
192
+ //# sourceMappingURL=specialist-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-matcher.js","sourceRoot":"","sources":["../src/specialist-matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface Specialist {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ systemPrompt: string;
6
+ guidelines: string[];
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ }
10
+ export interface SpecialistSummary {
11
+ id: string;
12
+ name: string;
13
+ description: string;
14
+ }
15
+ /**
16
+ * Disk-backed store for named specialists (reusable expert profiles).
17
+ *
18
+ * Each specialist is stored as a separate JSON file under `SPECIALISTS_DIR`.
19
+ * All writes use atomic rename to prevent partial-read corruption.
20
+ */
21
+ export declare class SpecialistStore {
22
+ constructor();
23
+ /**
24
+ * Validates a specialist ID.
25
+ * @returns An error message if invalid, or `null` if valid.
26
+ */
27
+ validateId(id: string): string | null;
28
+ /** Returns all specialists sorted alphabetically by ID, skipping corrupt files. */
29
+ list(): Specialist[];
30
+ /** Returns a single specialist by ID, or `undefined` if not found. */
31
+ get(id: string): Specialist | undefined;
32
+ /** Returns true if a specialist with the given ID exists on disk. */
33
+ exists(id: string): boolean;
34
+ /**
35
+ * Creates a new specialist and persists it.
36
+ * @throws {Error} If the ID is invalid, reserved, already taken, or the max limit is reached.
37
+ */
38
+ create(id: string, name: string, description: string, systemPrompt: string, guidelines?: string[]): Specialist;
39
+ /**
40
+ * Updates an existing specialist with partial fields.
41
+ * @returns The updated specialist, or `undefined` if not found.
42
+ */
43
+ update(id: string, updates: Partial<Pick<Specialist, 'name' | 'description' | 'systemPrompt' | 'guidelines'>>): Specialist | undefined;
44
+ /** Removes a specialist by ID. Returns `true` if it existed and was deleted. */
45
+ delete(id: string): boolean;
46
+ /** Returns id + name + description for all specialists, for system prompt injection. */
47
+ getSummaries(): SpecialistSummary[];
48
+ /** Writes data to a `.tmp` file then renames it into place for crash-safe persistence. */
49
+ private atomicWrite;
50
+ }
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SpecialistStore = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const paths_js_1 = require("./paths.js");
40
+ const reserved_names_js_1 = require("./reserved-names.js");
41
+ const MAX_SPECIALISTS = 50;
42
+ const ID_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,58}[a-z0-9])?$/;
43
+ /**
44
+ * Disk-backed store for named specialists (reusable expert profiles).
45
+ *
46
+ * Each specialist is stored as a separate JSON file under `SPECIALISTS_DIR`.
47
+ * All writes use atomic rename to prevent partial-read corruption.
48
+ */
49
+ class SpecialistStore {
50
+ constructor() {
51
+ fs.mkdirSync(paths_js_1.SPECIALISTS_DIR, { recursive: true });
52
+ }
53
+ /**
54
+ * Validates a specialist ID.
55
+ * @returns An error message if invalid, or `null` if valid.
56
+ */
57
+ validateId(id) {
58
+ if (!id)
59
+ return 'Specialist ID cannot be empty.';
60
+ if (!ID_PATTERN.test(id))
61
+ return 'Specialist ID must be 1–60 characters, lowercase alphanumeric and hyphens, cannot start or end with a hyphen.';
62
+ if (reserved_names_js_1.RESERVED_NAMES.has(id))
63
+ return `"${id}" is a reserved command name.`;
64
+ return null;
65
+ }
66
+ /** Returns all specialists sorted alphabetically by ID, skipping corrupt files. */
67
+ list() {
68
+ if (!fs.existsSync(paths_js_1.SPECIALISTS_DIR))
69
+ return [];
70
+ const files = fs.readdirSync(paths_js_1.SPECIALISTS_DIR).filter((f) => f.endsWith('.json'));
71
+ const specialists = [];
72
+ for (const file of files) {
73
+ try {
74
+ const raw = fs.readFileSync(path.join(paths_js_1.SPECIALISTS_DIR, file), 'utf-8');
75
+ specialists.push(JSON.parse(raw));
76
+ }
77
+ catch {
78
+ // skip corrupt files
79
+ }
80
+ }
81
+ return specialists.sort((a, b) => a.id.localeCompare(b.id));
82
+ }
83
+ /** Returns a single specialist by ID, or `undefined` if not found. */
84
+ get(id) {
85
+ if (!ID_PATTERN.test(id))
86
+ return undefined;
87
+ const filePath = path.join(paths_js_1.SPECIALISTS_DIR, `${id}.json`);
88
+ if (!fs.existsSync(filePath))
89
+ return undefined;
90
+ try {
91
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ /** Returns true if a specialist with the given ID exists on disk. */
98
+ exists(id) {
99
+ if (!ID_PATTERN.test(id))
100
+ return false;
101
+ return fs.existsSync(path.join(paths_js_1.SPECIALISTS_DIR, `${id}.json`));
102
+ }
103
+ /**
104
+ * Creates a new specialist and persists it.
105
+ * @throws {Error} If the ID is invalid, reserved, already taken, or the max limit is reached.
106
+ */
107
+ create(id, name, description, systemPrompt, guidelines = []) {
108
+ const idError = this.validateId(id);
109
+ if (idError)
110
+ throw new Error(idError);
111
+ if (this.exists(id))
112
+ throw new Error(`Specialist "${id}" already exists.`);
113
+ const count = this.list().length;
114
+ if (count >= MAX_SPECIALISTS)
115
+ throw new Error(`Maximum of ${MAX_SPECIALISTS} specialists reached.`);
116
+ const now = new Date().toISOString();
117
+ const specialist = {
118
+ id,
119
+ name,
120
+ description,
121
+ systemPrompt,
122
+ guidelines,
123
+ createdAt: now,
124
+ updatedAt: now,
125
+ };
126
+ this.atomicWrite(path.join(paths_js_1.SPECIALISTS_DIR, `${id}.json`), JSON.stringify(specialist, null, 2));
127
+ return specialist;
128
+ }
129
+ /**
130
+ * Updates an existing specialist with partial fields.
131
+ * @returns The updated specialist, or `undefined` if not found.
132
+ */
133
+ update(id, updates) {
134
+ if (!ID_PATTERN.test(id))
135
+ return undefined;
136
+ const specialist = this.get(id);
137
+ if (!specialist)
138
+ return undefined;
139
+ if (updates.name !== undefined)
140
+ specialist.name = updates.name;
141
+ if (updates.description !== undefined)
142
+ specialist.description = updates.description;
143
+ if (updates.systemPrompt !== undefined)
144
+ specialist.systemPrompt = updates.systemPrompt;
145
+ if (updates.guidelines !== undefined)
146
+ specialist.guidelines = updates.guidelines;
147
+ specialist.updatedAt = new Date().toISOString();
148
+ this.atomicWrite(path.join(paths_js_1.SPECIALISTS_DIR, `${id}.json`), JSON.stringify(specialist, null, 2));
149
+ return specialist;
150
+ }
151
+ /** Removes a specialist by ID. Returns `true` if it existed and was deleted. */
152
+ delete(id) {
153
+ if (!ID_PATTERN.test(id))
154
+ return false;
155
+ const filePath = path.join(paths_js_1.SPECIALISTS_DIR, `${id}.json`);
156
+ if (!fs.existsSync(filePath))
157
+ return false;
158
+ fs.unlinkSync(filePath);
159
+ return true;
160
+ }
161
+ /** Returns id + name + description for all specialists, for system prompt injection. */
162
+ getSummaries() {
163
+ return this.list().map(({ id, name, description }) => ({ id, name, description }));
164
+ }
165
+ /** Writes data to a `.tmp` file then renames it into place for crash-safe persistence. */
166
+ atomicWrite(filePath, data) {
167
+ const tmp = filePath + '.tmp';
168
+ fs.writeFileSync(tmp, data, 'utf-8');
169
+ fs.renameSync(tmp, filePath);
170
+ }
171
+ }
172
+ exports.SpecialistStore = SpecialistStore;
173
+ //# sourceMappingURL=specialists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialists.js","sourceRoot":"","sources":["../src/specialists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const MAX_CONCURRENT_AGENTS = 4;
2
+ /**
3
+ * Attempts to acquire a slot in the shared agent/task concurrency pool.
4
+ * @returns The assigned agent ID, or `null` if the pool is at capacity.
5
+ */
6
+ export declare function acquireSlot(): {
7
+ id: number;
8
+ } | null;
9
+ /** Releases a slot back to the concurrency pool. */
10
+ export declare function releaseSlot(): void;
11
+ /**
12
+ * Returns the number of currently active agents/tasks.
13
+ * @internal Exported for testing only.
14
+ */
15
+ export declare function getActiveCount(): number;
16
+ /**
17
+ * Resets the pool state (active count and ID sequence).
18
+ * @internal Exported for testing only.
19
+ */
20
+ export declare function _resetPool(): void;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_CONCURRENT_AGENTS = void 0;
4
+ exports.acquireSlot = acquireSlot;
5
+ exports.releaseSlot = releaseSlot;
6
+ exports.getActiveCount = getActiveCount;
7
+ exports._resetPool = _resetPool;
8
+ exports.MAX_CONCURRENT_AGENTS = 4;
9
+ let activeAgentCount = 0;
10
+ let nextAgentId = 1;
11
+ /**
12
+ * Attempts to acquire a slot in the shared agent/task concurrency pool.
13
+ * @returns The assigned agent ID, or `null` if the pool is at capacity.
14
+ */
15
+ function acquireSlot() {
16
+ if (activeAgentCount >= exports.MAX_CONCURRENT_AGENTS)
17
+ return null;
18
+ activeAgentCount++;
19
+ return { id: nextAgentId++ };
20
+ }
21
+ /** Releases a slot back to the concurrency pool. */
22
+ function releaseSlot() {
23
+ if (activeAgentCount > 0)
24
+ activeAgentCount--;
25
+ }
26
+ /**
27
+ * Returns the number of currently active agents/tasks.
28
+ * @internal Exported for testing only.
29
+ */
30
+ function getActiveCount() {
31
+ return activeAgentCount;
32
+ }
33
+ /**
34
+ * Resets the pool state (active count and ID sequence).
35
+ * @internal Exported for testing only.
36
+ */
37
+ function _resetPool() {
38
+ activeAgentCount = 0;
39
+ nextAgentId = 1;
40
+ }
41
+ //# sourceMappingURL=agent-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pool.js","sourceRoot":"","sources":["../../src/tools/agent-pool.ts"],"names":[],"mappings":";;;AASA,kCAIC;AAGD,kCAEC;AAMD,wCAEC;AAMD,gCAGC;AAnCY,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAEvC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB;;;GAGG;AACH,SAAgB,WAAW;IACzB,IAAI,gBAAgB,IAAI,6BAAqB;QAAE,OAAO,IAAI,CAAC;IAC3D,gBAAgB,EAAE,CAAC;IACnB,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,oDAAoD;AACpD,SAAgB,WAAW;IACzB,IAAI,gBAAgB,GAAG,CAAC;QAAE,gBAAgB,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc;IAC5B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU;IACxB,gBAAgB,GAAG,CAAC,CAAC;IACrB,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { ToolOptions } from './types.js';
2
2
  import type { MemoryStore } from '../memory.js';
3
3
  import type { RoutineStore } from '../routines.js';
4
+ import type { SpecialistStore } from '../specialists.js';
4
5
  export type { ToolOptions } from './types.js';
5
6
  /**
6
7
  * Assembles the complete tool registry for the agent.
@@ -10,4 +11,4 @@ export type { ToolOptions } from './types.js';
10
11
  * @param mcpTools - Optional MCP-provided tools to merge into the registry.
11
12
  * @returns A flat record of all available AI SDK tools keyed by tool name.
12
13
  */
13
- export declare function createTools(options: ToolOptions, memoryStore: MemoryStore, mcpTools?: Record<string, any>, routineStore?: RoutineStore): Record<string, any>;
14
+ export declare function createTools(options: ToolOptions, memoryStore: MemoryStore, mcpTools?: Record<string, any>, routineStore?: RoutineStore, specialistStore?: SpecialistStore): Record<string, any>;
@@ -12,6 +12,7 @@ const mcp_url_js_1 = require("./mcp-url.js");
12
12
  const web_js_1 = require("./web.js");
13
13
  const wait_js_1 = require("./wait.js");
14
14
  const routine_js_1 = require("./routine.js");
15
+ const specialist_js_1 = require("./specialist.js");
15
16
  /**
16
17
  * Assembles the complete tool registry for the agent.
17
18
  *
@@ -20,12 +21,13 @@ const routine_js_1 = require("./routine.js");
20
21
  * @param mcpTools - Optional MCP-provided tools to merge into the registry.
21
22
  * @returns A flat record of all available AI SDK tools keyed by tool name.
22
23
  */
23
- function createTools(options, memoryStore, mcpTools, routineStore) {
24
+ function createTools(options, memoryStore, mcpTools, routineStore, specialistStore) {
24
25
  return {
25
26
  shell: (0, shell_js_1.createShellTool)(options),
26
27
  memory: (0, memory_js_1.createMemoryTool)(memoryStore),
27
28
  scratch: (0, memory_js_1.createScratchTool)(memoryStore),
28
29
  routine: (0, routine_js_1.createRoutineTool)(routineStore),
30
+ specialist: (0, specialist_js_1.createSpecialistTool)(specialistStore),
29
31
  datetime: (0, datetime_js_1.createDateTimeTool)(),
30
32
  ...(0, cron_js_1.createCronTools)(),
31
33
  ...(0, cron_logs_js_1.createCronLogTools)(),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;AAyBA,kCAqBC;AA9CD,yCAA6C;AAC7C,2CAAkE;AAClE,+CAAmD;AACnD,uCAA4C;AAC5C,iDAAoD;AACpD,uCAA4C;AAC5C,qCAA+C;AAC/C,6CAAmD;AACnD,qCAA6C;AAC7C,uCAA2C;AAC3C,6CAAiD;AAOjD;;;;;;;GAOG;AACH,SAAgB,WAAW,CACzB,OAAoB,EACpB,WAAwB,EACxB,QAA8B,EAC9B,YAA2B;IAE3B,OAAO;QACL,KAAK,EAAE,IAAA,0BAAe,EAAC,OAAO,CAAC;QAC/B,MAAM,EAAE,IAAA,4BAAgB,EAAC,WAAW,CAAC;QACrC,OAAO,EAAE,IAAA,6BAAiB,EAAC,WAAW,CAAC;QACvC,OAAO,EAAE,IAAA,8BAAiB,EAAC,YAAY,CAAC;QACxC,QAAQ,EAAE,IAAA,gCAAkB,GAAE;QAC9B,GAAG,IAAA,yBAAe,GAAE;QACpB,GAAG,IAAA,iCAAkB,GAAE;QACvB,GAAG,IAAA,yBAAe,GAAE;QACpB,UAAU,EAAE,IAAA,4BAAmB,GAAE;QACjC,WAAW,EAAE,IAAA,gCAAmB,GAAE;QAClC,QAAQ,EAAE,IAAA,0BAAiB,GAAE;QAC7B,IAAI,EAAE,IAAA,wBAAc,GAAE;QACtB,GAAG,QAAQ;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;AA2BA,kCAuBC;AAlDD,yCAA6C;AAC7C,2CAAkE;AAClE,+CAAmD;AACnD,uCAA4C;AAC5C,iDAAoD;AACpD,uCAA4C;AAC5C,qCAA+C;AAC/C,6CAAmD;AACnD,qCAA6C;AAC7C,uCAA2C;AAC3C,6CAAiD;AACjD,mDAAuD;AAQvD;;;;;;;GAOG;AACH,SAAgB,WAAW,CACzB,OAAoB,EACpB,WAAwB,EACxB,QAA8B,EAC9B,YAA2B,EAC3B,eAAiC;IAEjC,OAAO;QACL,KAAK,EAAE,IAAA,0BAAe,EAAC,OAAO,CAAC;QAC/B,MAAM,EAAE,IAAA,4BAAgB,EAAC,WAAW,CAAC;QACrC,OAAO,EAAE,IAAA,6BAAiB,EAAC,WAAW,CAAC;QACvC,OAAO,EAAE,IAAA,8BAAiB,EAAC,YAAY,CAAC;QACxC,UAAU,EAAE,IAAA,oCAAoB,EAAC,eAAe,CAAC;QACjD,QAAQ,EAAE,IAAA,gCAAkB,GAAE;QAC9B,GAAG,IAAA,yBAAe,GAAE;QACpB,GAAG,IAAA,iCAAkB,GAAE;QACvB,GAAG,IAAA,yBAAe,GAAE;QACpB,UAAU,EAAE,IAAA,4BAAmB,GAAE;QACjC,WAAW,EAAE,IAAA,gCAAmB,GAAE;QAClC,QAAQ,EAAE,IAAA,0BAAiB,GAAE;QAC7B,IAAI,EAAE,IAAA,wBAAc,GAAE;QACtB,GAAG,QAAQ;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { type ToolOptions } from './index.js';
3
+ import type { BernardConfig } from '../config.js';
4
+ import type { MemoryStore } from '../memory.js';
5
+ import type { RAGStore } from '../rag.js';
6
+ import type { SpecialistStore } from '../specialists.js';
7
+ /**
8
+ * Creates the specialist execution tool for running tasks through a saved specialist profile.
9
+ *
10
+ * Each specialist run receives its own `generateText` loop with a 10-step budget
11
+ * and no conversation history. The specialist's system prompt and guidelines are
12
+ * used as the persona. Shares the concurrency pool with sub-agents and tasks.
13
+ *
14
+ * @param config - Bernard configuration (provider, model, token limits).
15
+ * @param options - Shell execution options forwarded to child tool sets.
16
+ * @param memoryStore - Shared memory store for persistent/scratch context.
17
+ * @param specialistStore - Store for looking up specialist profiles.
18
+ * @param mcpTools - Optional MCP-provided tools available to specialist runs.
19
+ * @param ragStore - Optional RAG store for retrieval-augmented context.
20
+ */
21
+ export declare function createSpecialistRunTool(config: BernardConfig, options: ToolOptions, memoryStore: MemoryStore, specialistStore: SpecialistStore, mcpTools?: Record<string, any>, ragStore?: RAGStore): import("ai").Tool<z.ZodObject<{
22
+ specialistId: z.ZodString;
23
+ task: z.ZodString;
24
+ context: z.ZodOptional<z.ZodString>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ task: string;
27
+ specialistId: string;
28
+ context?: string | undefined;
29
+ }, {
30
+ task: string;
31
+ specialistId: string;
32
+ context?: string | undefined;
33
+ }>, string> & {
34
+ execute: (args: {
35
+ task: string;
36
+ specialistId: string;
37
+ context?: string | undefined;
38
+ }, options: import("ai").ToolExecutionOptions) => PromiseLike<string>;
39
+ };