codingbuddy 0.0.0-canary.20260106040415.4cf6472 → 0.0.0-canary.20260106054923.4f8ffd9
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/src/config/config.schema.d.ts +2 -0
- package/dist/src/config/config.schema.js +1 -0
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/keyword/keyword.module.js +39 -4
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.d.ts +9 -1
- package/dist/src/keyword/keyword.service.js +64 -48
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/keyword.types.d.ts +12 -0
- package/dist/src/keyword/primary-agent-resolver.d.ts +26 -0
- package/dist/src/keyword/primary-agent-resolver.js +210 -0
- package/dist/src/keyword/primary-agent-resolver.js.map +1 -0
- package/dist/src/rules/agent.schema.d.ts +11 -0
- package/dist/src/rules/agent.schema.js +2 -0
- package/dist/src/rules/agent.schema.js.map +1 -1
- package/dist/src/shared/agent.utils.d.ts +1 -0
- package/dist/src/shared/agent.utils.js +14 -0
- package/dist/src/shared/agent.utils.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -133,6 +133,7 @@ export declare const TestStrategyConfigSchema: z.ZodObject<{
|
|
|
133
133
|
}, z.core.$strip>;
|
|
134
134
|
export declare const AIConfigSchema: z.ZodObject<{
|
|
135
135
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
136
|
+
primaryAgent: z.ZodOptional<z.ZodString>;
|
|
136
137
|
}, z.core.$strip>;
|
|
137
138
|
export declare const CodingBuddyConfigSchema: z.ZodObject<{
|
|
138
139
|
language: z.ZodOptional<z.ZodString>;
|
|
@@ -231,6 +232,7 @@ export declare const CodingBuddyConfigSchema: z.ZodObject<{
|
|
|
231
232
|
}, z.core.$strip>>;
|
|
232
233
|
ai: z.ZodOptional<z.ZodObject<{
|
|
233
234
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
235
|
+
primaryAgent: z.ZodOptional<z.ZodString>;
|
|
234
236
|
}, z.core.$strip>>;
|
|
235
237
|
keyFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
236
238
|
avoid: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -61,6 +61,7 @@ exports.TestStrategyConfigSchema = zod_1.z.object({
|
|
|
61
61
|
});
|
|
62
62
|
exports.AIConfigSchema = zod_1.z.object({
|
|
63
63
|
defaultModel: zod_1.z.string().optional(),
|
|
64
|
+
primaryAgent: zod_1.z.string().optional(),
|
|
64
65
|
});
|
|
65
66
|
exports.CodingBuddyConfigSchema = zod_1.z.object({
|
|
66
67
|
language: zod_1.z.string().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../../src/config/config.schema.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../../src/config/config.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,20 +8,25 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.KeywordModule = exports.KEYWORD_SERVICE = void 0;
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
|
+
const config_module_1 = require("../config/config.module");
|
|
12
|
+
const config_service_1 = require("../config/config.service");
|
|
11
13
|
const rules_module_1 = require("../rules/rules.module");
|
|
12
14
|
const rules_service_1 = require("../rules/rules.service");
|
|
15
|
+
const agent_utils_1 = require("../shared/agent.utils");
|
|
13
16
|
const keyword_service_1 = require("./keyword.service");
|
|
17
|
+
const primary_agent_resolver_1 = require("./primary-agent-resolver");
|
|
14
18
|
exports.KEYWORD_SERVICE = 'KEYWORD_SERVICE';
|
|
15
19
|
let KeywordModule = class KeywordModule {
|
|
16
20
|
};
|
|
17
21
|
exports.KeywordModule = KeywordModule;
|
|
18
22
|
exports.KeywordModule = KeywordModule = __decorate([
|
|
19
23
|
(0, common_1.Module)({
|
|
20
|
-
imports: [rules_module_1.RulesModule],
|
|
24
|
+
imports: [rules_module_1.RulesModule, config_module_1.CodingBuddyConfigModule],
|
|
21
25
|
providers: [
|
|
22
26
|
{
|
|
23
27
|
provide: exports.KEYWORD_SERVICE,
|
|
24
|
-
useFactory: (rulesService) => {
|
|
28
|
+
useFactory: (rulesService, configService) => {
|
|
29
|
+
const logger = new common_1.Logger('KeywordModule');
|
|
25
30
|
const loadConfig = async () => {
|
|
26
31
|
const content = await rulesService.getRuleContent('keyword-modes.json');
|
|
27
32
|
return JSON.parse(content);
|
|
@@ -32,9 +37,39 @@ exports.KeywordModule = KeywordModule = __decorate([
|
|
|
32
37
|
const loadAgent = async (agentName) => {
|
|
33
38
|
return rulesService.getAgent(agentName);
|
|
34
39
|
};
|
|
35
|
-
|
|
40
|
+
const getProjectConfig = async () => {
|
|
41
|
+
try {
|
|
42
|
+
const settings = await configService.getSettings();
|
|
43
|
+
if (settings.ai?.primaryAgent) {
|
|
44
|
+
return { primaryAgent: settings.ai.primaryAgent };
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logger.debug(`Failed to load project config: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const listPrimaryAgents = async () => {
|
|
54
|
+
const agentNames = await rulesService.listAgents();
|
|
55
|
+
const primaryAgents = [];
|
|
56
|
+
for (const name of agentNames) {
|
|
57
|
+
try {
|
|
58
|
+
const agent = await rulesService.getAgent(name);
|
|
59
|
+
const role = agent.role;
|
|
60
|
+
if (role?.type === 'primary') {
|
|
61
|
+
primaryAgents.push((0, agent_utils_1.normalizeAgentName)(agent.name));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return primaryAgents;
|
|
68
|
+
};
|
|
69
|
+
const primaryAgentResolver = new primary_agent_resolver_1.PrimaryAgentResolver(getProjectConfig, listPrimaryAgents);
|
|
70
|
+
return new keyword_service_1.KeywordService(loadConfig, loadRule, loadAgent, primaryAgentResolver);
|
|
36
71
|
},
|
|
37
|
-
inject: [rules_service_1.RulesService],
|
|
72
|
+
inject: [rules_service_1.RulesService, config_service_1.ConfigService],
|
|
38
73
|
},
|
|
39
74
|
],
|
|
40
75
|
exports: [exports.KEYWORD_SERVICE],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyword.module.js","sourceRoot":"","sources":["../../../src/keyword/keyword.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"keyword.module.js","sourceRoot":"","sources":["../../../src/keyword/keyword.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import { type Mode, type RuleContent, type ParseModeResult, type KeywordModesConfig } from './keyword.types';
|
|
2
|
+
import { PrimaryAgentResolver } from './primary-agent-resolver';
|
|
2
3
|
export declare class KeywordService {
|
|
3
4
|
private readonly loadConfigFn;
|
|
4
5
|
private readonly loadRuleFn;
|
|
5
6
|
private readonly loadAgentInfoFn?;
|
|
7
|
+
private readonly logger;
|
|
6
8
|
private configCache;
|
|
7
|
-
|
|
9
|
+
private readonly primaryAgentResolver?;
|
|
10
|
+
constructor(loadConfigFn: () => Promise<KeywordModesConfig>, loadRuleFn: (path: string) => Promise<string>, loadAgentInfoFn?: ((agentName: string) => Promise<unknown>) | undefined, primaryAgentResolver?: PrimaryAgentResolver);
|
|
8
11
|
parseMode(prompt: string): Promise<ParseModeResult>;
|
|
12
|
+
private extractModeFromPrompt;
|
|
13
|
+
private checkForMultipleKeywords;
|
|
14
|
+
private checkForEmptyContent;
|
|
15
|
+
private buildParseModeResult;
|
|
9
16
|
private getParallelAgentsRecommendation;
|
|
10
17
|
loadModeConfig(): Promise<KeywordModesConfig>;
|
|
11
18
|
getRulesForMode(mode: Mode): Promise<RuleContent[]>;
|
|
12
19
|
private getAgentInfo;
|
|
20
|
+
private resolvePrimaryAgent;
|
|
13
21
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KeywordService = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
4
5
|
const keyword_types_1 = require("./keyword.types");
|
|
5
6
|
const DEFAULT_CONFIG = {
|
|
6
7
|
modes: {
|
|
@@ -9,7 +10,6 @@ const DEFAULT_CONFIG = {
|
|
|
9
10
|
instructions: 'Design first approach. Define test cases from TDD perspective. Review architecture before implementation.',
|
|
10
11
|
rules: ['rules/core.md', 'rules/augmented-coding.md'],
|
|
11
12
|
agent: keyword_types_1.MODE_AGENTS[0],
|
|
12
|
-
delegates_to: 'frontend-developer',
|
|
13
13
|
defaultSpecialists: [
|
|
14
14
|
'architecture-specialist',
|
|
15
15
|
'test-strategy-specialist',
|
|
@@ -20,7 +20,6 @@ const DEFAULT_CONFIG = {
|
|
|
20
20
|
instructions: 'Follow Red-Green-Refactor cycle. Implement minimally then improve incrementally. Verify quality standards.',
|
|
21
21
|
rules: ['rules/core.md', 'rules/project.md', 'rules/augmented-coding.md'],
|
|
22
22
|
agent: keyword_types_1.MODE_AGENTS[1],
|
|
23
|
-
delegates_to: 'frontend-developer',
|
|
24
23
|
defaultSpecialists: [
|
|
25
24
|
'code-quality-specialist',
|
|
26
25
|
'test-strategy-specialist',
|
|
@@ -43,64 +42,63 @@ const DEFAULT_CONFIG = {
|
|
|
43
42
|
defaultMode: 'PLAN',
|
|
44
43
|
};
|
|
45
44
|
class KeywordService {
|
|
46
|
-
constructor(loadConfigFn, loadRuleFn, loadAgentInfoFn) {
|
|
45
|
+
constructor(loadConfigFn, loadRuleFn, loadAgentInfoFn, primaryAgentResolver) {
|
|
47
46
|
this.loadConfigFn = loadConfigFn;
|
|
48
47
|
this.loadRuleFn = loadRuleFn;
|
|
49
48
|
this.loadAgentInfoFn = loadAgentInfoFn;
|
|
49
|
+
this.logger = new common_1.Logger(KeywordService.name);
|
|
50
50
|
this.configCache = null;
|
|
51
|
+
this.primaryAgentResolver = primaryAgentResolver;
|
|
51
52
|
}
|
|
52
53
|
async parseMode(prompt) {
|
|
53
54
|
const config = await this.loadModeConfig();
|
|
55
|
+
const { mode, originalPrompt, warnings } = this.extractModeFromPrompt(prompt, config.defaultMode);
|
|
56
|
+
const modeConfig = config.modes[mode];
|
|
57
|
+
const rules = await this.getRulesForMode(mode);
|
|
58
|
+
return this.buildParseModeResult(mode, originalPrompt, warnings, modeConfig, rules, config);
|
|
59
|
+
}
|
|
60
|
+
extractModeFromPrompt(prompt, defaultMode) {
|
|
54
61
|
const warnings = [];
|
|
55
62
|
const trimmed = prompt.trim();
|
|
56
63
|
const parts = trimmed.split(/\s+/);
|
|
57
64
|
const firstWord = parts[0] ?? '';
|
|
58
65
|
const firstWordUpper = firstWord.toUpperCase();
|
|
59
|
-
let mode;
|
|
60
|
-
let originalPrompt;
|
|
61
66
|
const isEnglishKeyword = keyword_types_1.KEYWORDS.includes(firstWordUpper);
|
|
62
67
|
const localizedMode = keyword_types_1.LOCALIZED_KEYWORD_MAP[firstWord] ?? keyword_types_1.LOCALIZED_KEYWORD_MAP[firstWordUpper];
|
|
63
68
|
if (isEnglishKeyword) {
|
|
64
|
-
mode = firstWordUpper;
|
|
65
|
-
originalPrompt = trimmed.slice(firstWord.length).trim();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const isSecondKeyword = keyword_types_1.KEYWORDS.includes(secondWordUpper) ||
|
|
70
|
-
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWord] !== undefined ||
|
|
71
|
-
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWordUpper] !== undefined;
|
|
72
|
-
if (isSecondKeyword) {
|
|
73
|
-
warnings.push('Multiple keywords found, using first');
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (originalPrompt === '') {
|
|
77
|
-
warnings.push('No prompt content after keyword');
|
|
78
|
-
}
|
|
69
|
+
const mode = firstWordUpper;
|
|
70
|
+
const originalPrompt = trimmed.slice(firstWord.length).trim();
|
|
71
|
+
this.checkForMultipleKeywords(parts, warnings);
|
|
72
|
+
this.checkForEmptyContent(originalPrompt, warnings);
|
|
73
|
+
return { mode, originalPrompt, warnings };
|
|
79
74
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const secondWordUpper = secondWord.toUpperCase();
|
|
86
|
-
const isSecondKeyword = keyword_types_1.KEYWORDS.includes(secondWordUpper) ||
|
|
87
|
-
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWord] !== undefined ||
|
|
88
|
-
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWordUpper] !== undefined;
|
|
89
|
-
if (isSecondKeyword) {
|
|
90
|
-
warnings.push('Multiple keywords found, using first');
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (originalPrompt === '') {
|
|
94
|
-
warnings.push('No prompt content after keyword');
|
|
95
|
-
}
|
|
75
|
+
if (localizedMode) {
|
|
76
|
+
const originalPrompt = trimmed.slice(firstWord.length).trim();
|
|
77
|
+
this.checkForMultipleKeywords(parts, warnings);
|
|
78
|
+
this.checkForEmptyContent(originalPrompt, warnings);
|
|
79
|
+
return { mode: localizedMode, originalPrompt, warnings };
|
|
96
80
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
81
|
+
warnings.push('No keyword found, defaulting to PLAN');
|
|
82
|
+
return { mode: defaultMode, originalPrompt: trimmed, warnings };
|
|
83
|
+
}
|
|
84
|
+
checkForMultipleKeywords(parts, warnings) {
|
|
85
|
+
if (parts.length <= 1)
|
|
86
|
+
return;
|
|
87
|
+
const secondWord = parts[1];
|
|
88
|
+
const secondWordUpper = secondWord.toUpperCase();
|
|
89
|
+
const isSecondKeyword = keyword_types_1.KEYWORDS.includes(secondWordUpper) ||
|
|
90
|
+
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWord] !== undefined ||
|
|
91
|
+
keyword_types_1.LOCALIZED_KEYWORD_MAP[secondWordUpper] !== undefined;
|
|
92
|
+
if (isSecondKeyword) {
|
|
93
|
+
warnings.push('Multiple keywords found, using first');
|
|
101
94
|
}
|
|
102
|
-
|
|
103
|
-
|
|
95
|
+
}
|
|
96
|
+
checkForEmptyContent(originalPrompt, warnings) {
|
|
97
|
+
if (originalPrompt === '') {
|
|
98
|
+
warnings.push('No prompt content after keyword');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async buildParseModeResult(mode, originalPrompt, warnings, modeConfig, rules, config) {
|
|
104
102
|
const result = {
|
|
105
103
|
mode,
|
|
106
104
|
originalPrompt,
|
|
@@ -111,9 +109,11 @@ class KeywordService {
|
|
|
111
109
|
if (modeConfig.agent) {
|
|
112
110
|
result.agent = modeConfig.agent;
|
|
113
111
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
112
|
+
const resolvedAgent = await this.resolvePrimaryAgent(mode, originalPrompt, modeConfig.delegates_to);
|
|
113
|
+
if (resolvedAgent) {
|
|
114
|
+
result.delegates_to = resolvedAgent.agentName;
|
|
115
|
+
result.primary_agent_source = resolvedAgent.source;
|
|
116
|
+
const delegateAgentInfo = await this.getAgentInfo(resolvedAgent.agentName);
|
|
117
117
|
if (delegateAgentInfo) {
|
|
118
118
|
result.delegate_agent_info = delegateAgentInfo;
|
|
119
119
|
}
|
|
@@ -143,7 +143,8 @@ class KeywordService {
|
|
|
143
143
|
this.configCache = await this.loadConfigFn();
|
|
144
144
|
return this.configCache;
|
|
145
145
|
}
|
|
146
|
-
catch {
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.logger.debug(`Failed to load mode config, using defaults: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
147
148
|
this.configCache = DEFAULT_CONFIG;
|
|
148
149
|
return DEFAULT_CONFIG;
|
|
149
150
|
}
|
|
@@ -157,7 +158,8 @@ class KeywordService {
|
|
|
157
158
|
const content = await this.loadRuleFn(rulePath);
|
|
158
159
|
rules.push({ name: rulePath, content });
|
|
159
160
|
}
|
|
160
|
-
catch {
|
|
161
|
+
catch (error) {
|
|
162
|
+
this.logger.debug(`Skipping rule file '${rulePath}': ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
161
163
|
}
|
|
162
164
|
}
|
|
163
165
|
return rules;
|
|
@@ -179,10 +181,24 @@ class KeywordService {
|
|
|
179
181
|
expertise: Array.isArray(role?.expertise) ? role.expertise : [],
|
|
180
182
|
};
|
|
181
183
|
}
|
|
182
|
-
catch {
|
|
184
|
+
catch (error) {
|
|
185
|
+
this.logger.debug(`Failed to load agent info for '${agentName}': ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
183
186
|
return undefined;
|
|
184
187
|
}
|
|
185
188
|
}
|
|
189
|
+
async resolvePrimaryAgent(mode, prompt, staticDelegatesTo, context) {
|
|
190
|
+
if (this.primaryAgentResolver) {
|
|
191
|
+
const result = await this.primaryAgentResolver.resolve(mode, prompt, context);
|
|
192
|
+
return { agentName: result.agentName, source: result.source };
|
|
193
|
+
}
|
|
194
|
+
if (staticDelegatesTo) {
|
|
195
|
+
return { agentName: staticDelegatesTo, source: 'default' };
|
|
196
|
+
}
|
|
197
|
+
if (mode !== 'EVAL') {
|
|
198
|
+
return { agentName: 'frontend-developer', source: 'default' };
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
186
202
|
}
|
|
187
203
|
exports.KeywordService = KeywordService;
|
|
188
204
|
//# sourceMappingURL=keyword.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyword.service.js","sourceRoot":"","sources":["../../../src/keyword/keyword.service.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"keyword.service.js","sourceRoot":"","sources":["../../../src/keyword/keyword.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,17 @@ export interface ParallelAgentRecommendation {
|
|
|
17
17
|
specialists: string[];
|
|
18
18
|
hint: string;
|
|
19
19
|
}
|
|
20
|
+
export type PrimaryAgentSource = 'explicit' | 'config' | 'intent' | 'context' | 'default';
|
|
21
|
+
export interface PrimaryAgentResolutionResult {
|
|
22
|
+
agentName: string;
|
|
23
|
+
source: PrimaryAgentSource;
|
|
24
|
+
confidence: number;
|
|
25
|
+
reason: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolutionContext {
|
|
28
|
+
filePath?: string;
|
|
29
|
+
projectType?: string;
|
|
30
|
+
}
|
|
20
31
|
export interface ParseModeResult {
|
|
21
32
|
mode: Mode;
|
|
22
33
|
originalPrompt: string;
|
|
@@ -26,6 +37,7 @@ export interface ParseModeResult {
|
|
|
26
37
|
agent?: string;
|
|
27
38
|
delegates_to?: string;
|
|
28
39
|
delegate_agent_info?: AgentInfo;
|
|
40
|
+
primary_agent_source?: PrimaryAgentSource;
|
|
29
41
|
parallelAgentsRecommendation?: ParallelAgentRecommendation;
|
|
30
42
|
}
|
|
31
43
|
export interface ModeConfig {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Mode, type PrimaryAgentResolutionResult, type ResolutionContext } from './keyword.types';
|
|
2
|
+
interface ProjectConfig {
|
|
3
|
+
primaryAgent?: string;
|
|
4
|
+
}
|
|
5
|
+
type GetProjectConfigFn = () => Promise<ProjectConfig | null>;
|
|
6
|
+
type ListPrimaryAgentsFn = () => Promise<string[]>;
|
|
7
|
+
export declare class PrimaryAgentResolver {
|
|
8
|
+
private readonly getProjectConfig;
|
|
9
|
+
private readonly listPrimaryAgents;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private static readonly DEFAULT_AGENT;
|
|
12
|
+
private static readonly EVAL_AGENT;
|
|
13
|
+
private static readonly DEFAULT_FALLBACK_AGENTS;
|
|
14
|
+
private static readonly EXPLICIT_PATTERNS;
|
|
15
|
+
private static readonly CONTEXT_PATTERNS;
|
|
16
|
+
private static readonly INTENT_PATTERNS;
|
|
17
|
+
constructor(getProjectConfig: GetProjectConfigFn, listPrimaryAgents: ListPrimaryAgentsFn);
|
|
18
|
+
resolve(mode: Mode, prompt: string, context?: ResolutionContext): Promise<PrimaryAgentResolutionResult>;
|
|
19
|
+
private parseExplicitRequest;
|
|
20
|
+
private getFromProjectConfig;
|
|
21
|
+
private inferFromContext;
|
|
22
|
+
private analyzeIntent;
|
|
23
|
+
private safeListPrimaryAgents;
|
|
24
|
+
private createResult;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrimaryAgentResolver = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
class PrimaryAgentResolver {
|
|
6
|
+
constructor(getProjectConfig, listPrimaryAgents) {
|
|
7
|
+
this.getProjectConfig = getProjectConfig;
|
|
8
|
+
this.listPrimaryAgents = listPrimaryAgents;
|
|
9
|
+
this.logger = new common_1.Logger(PrimaryAgentResolver.name);
|
|
10
|
+
}
|
|
11
|
+
async resolve(mode, prompt, context) {
|
|
12
|
+
if (mode === 'EVAL') {
|
|
13
|
+
return this.createResult(PrimaryAgentResolver.EVAL_AGENT, 'default', 1.0, 'EVAL mode always uses code-reviewer');
|
|
14
|
+
}
|
|
15
|
+
const availableAgents = await this.safeListPrimaryAgents();
|
|
16
|
+
const explicit = this.parseExplicitRequest(prompt, availableAgents);
|
|
17
|
+
if (explicit) {
|
|
18
|
+
return explicit;
|
|
19
|
+
}
|
|
20
|
+
const fromConfig = await this.getFromProjectConfig(availableAgents);
|
|
21
|
+
if (fromConfig) {
|
|
22
|
+
return fromConfig;
|
|
23
|
+
}
|
|
24
|
+
const fromIntent = this.analyzeIntent(prompt, availableAgents);
|
|
25
|
+
if (fromIntent && fromIntent.confidence >= 0.8) {
|
|
26
|
+
return fromIntent;
|
|
27
|
+
}
|
|
28
|
+
if (context) {
|
|
29
|
+
const fromContext = this.inferFromContext(context, availableAgents);
|
|
30
|
+
if (fromContext && fromContext.confidence >= 0.8) {
|
|
31
|
+
return fromContext;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return this.createResult(PrimaryAgentResolver.DEFAULT_AGENT, 'default', 1.0, 'No explicit preference, using default frontend-developer');
|
|
35
|
+
}
|
|
36
|
+
parseExplicitRequest(prompt, availableAgents) {
|
|
37
|
+
for (const pattern of PrimaryAgentResolver.EXPLICIT_PATTERNS) {
|
|
38
|
+
const match = prompt.match(pattern);
|
|
39
|
+
if (match?.[1]) {
|
|
40
|
+
const agentName = match[1].toLowerCase();
|
|
41
|
+
if (availableAgents.includes(agentName)) {
|
|
42
|
+
return this.createResult(agentName, 'explicit', 1.0, `Explicit request for ${agentName} in prompt`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
async getFromProjectConfig(availableAgents) {
|
|
49
|
+
try {
|
|
50
|
+
const config = await this.getProjectConfig();
|
|
51
|
+
if (config?.primaryAgent) {
|
|
52
|
+
const agentName = config.primaryAgent.toLowerCase();
|
|
53
|
+
if (availableAgents.includes(agentName)) {
|
|
54
|
+
return this.createResult(agentName, 'config', 1.0, `Configured in project: ${agentName}`);
|
|
55
|
+
}
|
|
56
|
+
this.logger.warn(`Configured agent '${config.primaryAgent}' not found in registry. ` +
|
|
57
|
+
`Available: ${availableAgents.join(', ')}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
this.logger.warn(`Failed to load project config for agent resolution: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
inferFromContext(context, availableAgents) {
|
|
66
|
+
if (context.filePath) {
|
|
67
|
+
for (const { pattern, agent, confidence, } of PrimaryAgentResolver.CONTEXT_PATTERNS) {
|
|
68
|
+
if (pattern.test(context.filePath)) {
|
|
69
|
+
if (availableAgents.includes(agent)) {
|
|
70
|
+
return this.createResult(agent, 'context', confidence, `Inferred from file path: ${context.filePath}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (context.projectType === 'infrastructure') {
|
|
76
|
+
if (availableAgents.includes('devops-engineer')) {
|
|
77
|
+
return this.createResult('devops-engineer', 'context', 0.85, `Inferred from project type: ${context.projectType}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
analyzeIntent(prompt, availableAgents) {
|
|
83
|
+
if (!prompt || !prompt.trim()) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
let bestMatch = null;
|
|
87
|
+
for (const { pattern, agent, confidence, category, } of PrimaryAgentResolver.INTENT_PATTERNS) {
|
|
88
|
+
if (pattern.test(prompt) && availableAgents.includes(agent)) {
|
|
89
|
+
if (!bestMatch || confidence > bestMatch.confidence) {
|
|
90
|
+
bestMatch = { agent, confidence, category };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (bestMatch && bestMatch.confidence >= 0.8) {
|
|
95
|
+
return this.createResult(bestMatch.agent, 'intent', bestMatch.confidence, `Intent detected: ${bestMatch.category} task`);
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
async safeListPrimaryAgents() {
|
|
100
|
+
try {
|
|
101
|
+
const agents = await this.listPrimaryAgents();
|
|
102
|
+
if (agents.length === 0) {
|
|
103
|
+
this.logger.debug('No primary agents found in registry, using default fallback list');
|
|
104
|
+
return [...PrimaryAgentResolver.DEFAULT_FALLBACK_AGENTS];
|
|
105
|
+
}
|
|
106
|
+
return agents;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
this.logger.warn(`Failed to list primary agents: ${error instanceof Error ? error.message : 'Unknown error'}. ` +
|
|
110
|
+
`Using fallback list.`);
|
|
111
|
+
return [...PrimaryAgentResolver.DEFAULT_FALLBACK_AGENTS];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
createResult(agentName, source, confidence, reason) {
|
|
115
|
+
return { agentName, source, confidence, reason };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.PrimaryAgentResolver = PrimaryAgentResolver;
|
|
119
|
+
PrimaryAgentResolver.DEFAULT_AGENT = 'frontend-developer';
|
|
120
|
+
PrimaryAgentResolver.EVAL_AGENT = 'code-reviewer';
|
|
121
|
+
PrimaryAgentResolver.DEFAULT_FALLBACK_AGENTS = [
|
|
122
|
+
'frontend-developer',
|
|
123
|
+
'backend-developer',
|
|
124
|
+
'code-reviewer',
|
|
125
|
+
'solution-architect',
|
|
126
|
+
'technical-planner',
|
|
127
|
+
];
|
|
128
|
+
PrimaryAgentResolver.EXPLICIT_PATTERNS = [
|
|
129
|
+
/(\w+-\w+)(?:로|으로)\s*(?:작업|개발|해)/i,
|
|
130
|
+
/(?:use|using)\s+(\w+-\w+)(?:\s+agent)?/i,
|
|
131
|
+
/as\s+(\w+-\w+)/i,
|
|
132
|
+
/(\w+-\w+)\s+agent(?:로|으로)/i,
|
|
133
|
+
];
|
|
134
|
+
PrimaryAgentResolver.CONTEXT_PATTERNS = [
|
|
135
|
+
{
|
|
136
|
+
pattern: /Dockerfile|docker-compose/i,
|
|
137
|
+
agent: 'devops-engineer',
|
|
138
|
+
confidence: 0.9,
|
|
139
|
+
},
|
|
140
|
+
{ pattern: /\.go$/i, agent: 'backend-developer', confidence: 0.85 },
|
|
141
|
+
{ pattern: /\.py$/i, agent: 'backend-developer', confidence: 0.85 },
|
|
142
|
+
{ pattern: /\.java$/i, agent: 'backend-developer', confidence: 0.85 },
|
|
143
|
+
{ pattern: /\.rs$/i, agent: 'backend-developer', confidence: 0.85 },
|
|
144
|
+
{ pattern: /\.tsx?$/i, agent: 'frontend-developer', confidence: 0.7 },
|
|
145
|
+
{ pattern: /\.jsx?$/i, agent: 'frontend-developer', confidence: 0.7 },
|
|
146
|
+
{ pattern: /agents?.*\.json$/i, agent: 'agent-architect', confidence: 0.8 },
|
|
147
|
+
];
|
|
148
|
+
PrimaryAgentResolver.INTENT_PATTERNS = [
|
|
149
|
+
{
|
|
150
|
+
pattern: /아키텍처|architecture|시스템\s*설계|system\s*design/i,
|
|
151
|
+
agent: 'solution-architect',
|
|
152
|
+
confidence: 0.85,
|
|
153
|
+
category: 'architecture',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
pattern: /기술\s*선택|technology\s*selection|스택\s*선택/i,
|
|
157
|
+
agent: 'solution-architect',
|
|
158
|
+
confidence: 0.8,
|
|
159
|
+
category: 'architecture',
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
pattern: /전체\s*구조|overall\s*structure|설계\s*방향/i,
|
|
163
|
+
agent: 'solution-architect',
|
|
164
|
+
confidence: 0.85,
|
|
165
|
+
category: 'architecture',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
pattern: /구조\s*설계|structural\s*design|API\s*설계|API\s*design/i,
|
|
169
|
+
agent: 'solution-architect',
|
|
170
|
+
confidence: 0.8,
|
|
171
|
+
category: 'architecture',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
pattern: /마이크로서비스|microservice|서비스\s*분리|service\s*decomposition/i,
|
|
175
|
+
agent: 'solution-architect',
|
|
176
|
+
confidence: 0.85,
|
|
177
|
+
category: 'architecture',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
pattern: /구현\s*계획|implementation\s*plan|작업\s*분해/i,
|
|
181
|
+
agent: 'technical-planner',
|
|
182
|
+
confidence: 0.85,
|
|
183
|
+
category: 'planning',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
pattern: /태스크|task\s*breakdown|단계별|step.?by.?step/i,
|
|
187
|
+
agent: 'technical-planner',
|
|
188
|
+
confidence: 0.8,
|
|
189
|
+
category: 'planning',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
pattern: /TDD\s*계획|TDD\s*plan|테스트\s*먼저|test.?first/i,
|
|
193
|
+
agent: 'technical-planner',
|
|
194
|
+
confidence: 0.85,
|
|
195
|
+
category: 'planning',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
pattern: /실행\s*계획|execution\s*plan|개발\s*계획|development\s*plan/i,
|
|
199
|
+
agent: 'technical-planner',
|
|
200
|
+
confidence: 0.8,
|
|
201
|
+
category: 'planning',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
pattern: /리팩토링\s*계획|refactoring\s*plan|work\s*breakdown/i,
|
|
205
|
+
agent: 'technical-planner',
|
|
206
|
+
confidence: 0.8,
|
|
207
|
+
category: 'planning',
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
//# sourceMappingURL=primary-agent-resolver.js.map
|