vibe-coding-mcp 2.7.0 → 2.12.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 +105 -4
- package/dist/__tests__/git.test.d.ts +2 -0
- package/dist/__tests__/git.test.d.ts.map +1 -0
- package/dist/__tests__/git.test.js +282 -0
- package/dist/__tests__/git.test.js.map +1 -0
- package/dist/core/schemas.d.ts +345 -0
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +128 -0
- package/dist/core/schemas.js.map +1 -1
- package/dist/stdio.js +32 -2
- package/dist/stdio.js.map +1 -1
- package/dist/tools/autoTag.d.ts +145 -0
- package/dist/tools/autoTag.d.ts.map +1 -0
- package/dist/tools/autoTag.js +475 -0
- package/dist/tools/autoTag.js.map +1 -0
- package/dist/tools/batch.d.ts +119 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +459 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/git.d.ts +226 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +493 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/sessionStats.d.ts +129 -0
- package/dist/tools/sessionStats.d.ts.map +1 -0
- package/dist/tools/sessionStats.js +554 -0
- package/dist/tools/sessionStats.js.map +1 -0
- package/dist/tools/template.d.ts +127 -0
- package/dist/tools/template.d.ts.map +1 -0
- package/dist/tools/template.js +617 -0
- package/dist/tools/template.js.map +1 -0
- package/dist/utils/gitExecutor.d.ts +34 -0
- package/dist/utils/gitExecutor.d.ts.map +1 -0
- package/dist/utils/gitExecutor.js +95 -0
- package/dist/utils/gitExecutor.js.map +1 -0
- package/dist/utils/gitParsers.d.ts +90 -0
- package/dist/utils/gitParsers.d.ts.map +1 -0
- package/dist/utils/gitParsers.js +286 -0
- package/dist/utils/gitParsers.js.map +1 -0
- package/package.json +3 -2
package/dist/stdio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO;AACP,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,8BAA8B,EAC9B,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Auto-tagging Tool (v2.10)
|
|
3
|
+
* Automatically suggests and applies tags to sessions based on content analysis
|
|
4
|
+
*/
|
|
5
|
+
import type { AutoTagInput } from '../core/schemas.js';
|
|
6
|
+
export type AutoTagAction = 'suggest' | 'apply' | 'train' | 'config';
|
|
7
|
+
interface TagSuggestion {
|
|
8
|
+
tag: string;
|
|
9
|
+
confidence: number;
|
|
10
|
+
reason: string;
|
|
11
|
+
category?: string;
|
|
12
|
+
}
|
|
13
|
+
interface TagConfig {
|
|
14
|
+
enableAutoTag: boolean;
|
|
15
|
+
defaultCategories: string[];
|
|
16
|
+
customPatterns: Array<{
|
|
17
|
+
pattern: string;
|
|
18
|
+
tags: string[];
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface AutoTagOutput {
|
|
22
|
+
success: boolean;
|
|
23
|
+
action: AutoTagAction;
|
|
24
|
+
suggestions?: TagSuggestion[];
|
|
25
|
+
appliedTags?: string[];
|
|
26
|
+
sessionId?: string;
|
|
27
|
+
trained?: boolean;
|
|
28
|
+
patternsAdded?: number;
|
|
29
|
+
config?: TagConfig;
|
|
30
|
+
usedAI: boolean;
|
|
31
|
+
message?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function autoTagTool(input: AutoTagInput): Promise<AutoTagOutput>;
|
|
35
|
+
export declare const autoTagSchema: {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
inputSchema: {
|
|
39
|
+
type: string;
|
|
40
|
+
properties: {
|
|
41
|
+
action: {
|
|
42
|
+
type: string;
|
|
43
|
+
enum: string[];
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
sessionId: {
|
|
47
|
+
type: string;
|
|
48
|
+
description: string;
|
|
49
|
+
};
|
|
50
|
+
content: {
|
|
51
|
+
type: string;
|
|
52
|
+
description: string;
|
|
53
|
+
};
|
|
54
|
+
codeBlocks: {
|
|
55
|
+
type: string;
|
|
56
|
+
items: {
|
|
57
|
+
type: string;
|
|
58
|
+
properties: {
|
|
59
|
+
language: {
|
|
60
|
+
type: string;
|
|
61
|
+
};
|
|
62
|
+
code: {
|
|
63
|
+
type: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
description: string;
|
|
68
|
+
};
|
|
69
|
+
maxTags: {
|
|
70
|
+
type: string;
|
|
71
|
+
description: string;
|
|
72
|
+
};
|
|
73
|
+
minConfidence: {
|
|
74
|
+
type: string;
|
|
75
|
+
description: string;
|
|
76
|
+
};
|
|
77
|
+
includeExisting: {
|
|
78
|
+
type: string;
|
|
79
|
+
description: string;
|
|
80
|
+
};
|
|
81
|
+
categories: {
|
|
82
|
+
type: string;
|
|
83
|
+
items: {
|
|
84
|
+
type: string;
|
|
85
|
+
};
|
|
86
|
+
description: string;
|
|
87
|
+
};
|
|
88
|
+
examples: {
|
|
89
|
+
type: string;
|
|
90
|
+
items: {
|
|
91
|
+
type: string;
|
|
92
|
+
properties: {
|
|
93
|
+
content: {
|
|
94
|
+
type: string;
|
|
95
|
+
};
|
|
96
|
+
tags: {
|
|
97
|
+
type: string;
|
|
98
|
+
items: {
|
|
99
|
+
type: string;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
required: string[];
|
|
104
|
+
};
|
|
105
|
+
description: string;
|
|
106
|
+
};
|
|
107
|
+
enableAutoTag: {
|
|
108
|
+
type: string;
|
|
109
|
+
description: string;
|
|
110
|
+
};
|
|
111
|
+
defaultCategories: {
|
|
112
|
+
type: string;
|
|
113
|
+
items: {
|
|
114
|
+
type: string;
|
|
115
|
+
};
|
|
116
|
+
description: string;
|
|
117
|
+
};
|
|
118
|
+
customPatterns: {
|
|
119
|
+
type: string;
|
|
120
|
+
items: {
|
|
121
|
+
type: string;
|
|
122
|
+
properties: {
|
|
123
|
+
pattern: {
|
|
124
|
+
type: string;
|
|
125
|
+
};
|
|
126
|
+
tags: {
|
|
127
|
+
type: string;
|
|
128
|
+
items: {
|
|
129
|
+
type: string;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
description: string;
|
|
135
|
+
};
|
|
136
|
+
useAI: {
|
|
137
|
+
type: string;
|
|
138
|
+
description: string;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
required: string[];
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
export {};
|
|
145
|
+
//# sourceMappingURL=autoTag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoTag.d.ts","sourceRoot":"","sources":["../../src/tools/autoTag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IAGtB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAGnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2LD,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAuP7E;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFzB,CAAC"}
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Auto-tagging Tool (v2.10)
|
|
3
|
+
* Automatically suggests and applies tags to sessions based on content analysis
|
|
4
|
+
*/
|
|
5
|
+
import { createToolLogger } from '../core/logger.js';
|
|
6
|
+
import { getSession, updateSession } from '../core/sessionStorage.js';
|
|
7
|
+
import { isAIAvailable, getAnthropicClient } from '../core/ai.js';
|
|
8
|
+
const logger = createToolLogger('autoTag');
|
|
9
|
+
// Default patterns for tag detection
|
|
10
|
+
const DEFAULT_PATTERNS = [
|
|
11
|
+
// Language patterns
|
|
12
|
+
{ patterns: [/typescript|\.ts\b/i], tags: ['typescript'], category: 'language' },
|
|
13
|
+
{ patterns: [/javascript|\.js\b/i], tags: ['javascript'], category: 'language' },
|
|
14
|
+
{ patterns: [/python|\.py\b/i], tags: ['python'], category: 'language' },
|
|
15
|
+
{ patterns: [/go\s+|golang|\.go\b/i], tags: ['go'], category: 'language' },
|
|
16
|
+
{ patterns: [/rust|\.rs\b/i], tags: ['rust'], category: 'language' },
|
|
17
|
+
{ patterns: [/react|jsx|tsx/i], tags: ['react'], category: 'framework' },
|
|
18
|
+
{ patterns: [/vue|\.vue\b/i], tags: ['vue'], category: 'framework' },
|
|
19
|
+
{ patterns: [/angular/i], tags: ['angular'], category: 'framework' },
|
|
20
|
+
{ patterns: [/next\.?js|nextjs/i], tags: ['nextjs'], category: 'framework' },
|
|
21
|
+
{ patterns: [/express/i], tags: ['express'], category: 'framework' },
|
|
22
|
+
{ patterns: [/fastapi/i], tags: ['fastapi'], category: 'framework' },
|
|
23
|
+
// Concept patterns
|
|
24
|
+
{ patterns: [/auth|authentication|login|oauth|jwt/i], tags: ['authentication'], category: 'feature' },
|
|
25
|
+
{ patterns: [/api|endpoint|rest|graphql/i], tags: ['api'], category: 'feature' },
|
|
26
|
+
{ patterns: [/database|sql|mongodb|postgres|mysql/i], tags: ['database'], category: 'feature' },
|
|
27
|
+
{ patterns: [/test|testing|jest|pytest|unittest/i], tags: ['testing'], category: 'practice' },
|
|
28
|
+
{ patterns: [/deploy|ci\/cd|docker|kubernetes/i], tags: ['devops'], category: 'practice' },
|
|
29
|
+
{ patterns: [/security|vulnerability|xss|csrf|injection/i], tags: ['security'], category: 'concern' },
|
|
30
|
+
{ patterns: [/performance|optimization|cache|speed/i], tags: ['performance'], category: 'concern' },
|
|
31
|
+
{ patterns: [/refactor|clean\s*code|improve/i], tags: ['refactoring'], category: 'activity' },
|
|
32
|
+
{ patterns: [/bug|fix|issue|error|debug/i], tags: ['bugfix'], category: 'activity' },
|
|
33
|
+
{ patterns: [/feature|implement|add|new/i], tags: ['feature'], category: 'activity' },
|
|
34
|
+
{ patterns: [/design|architecture|pattern|structure/i], tags: ['design'], category: 'activity' },
|
|
35
|
+
{ patterns: [/documentation|readme|docs/i], tags: ['documentation'], category: 'activity' },
|
|
36
|
+
// Korean patterns
|
|
37
|
+
{ patterns: [/인증|로그인|OAuth/i], tags: ['authentication'], category: 'feature' },
|
|
38
|
+
{ patterns: [/데이터베이스|DB|쿼리/i], tags: ['database'], category: 'feature' },
|
|
39
|
+
{ patterns: [/테스트|검증/i], tags: ['testing'], category: 'practice' },
|
|
40
|
+
{ patterns: [/배포|CI\/CD/i], tags: ['devops'], category: 'practice' },
|
|
41
|
+
{ patterns: [/보안|취약점/i], tags: ['security'], category: 'concern' },
|
|
42
|
+
{ patterns: [/성능|최적화|캐시/i], tags: ['performance'], category: 'concern' },
|
|
43
|
+
{ patterns: [/리팩토링|개선/i], tags: ['refactoring'], category: 'activity' },
|
|
44
|
+
{ patterns: [/버그|수정|오류/i], tags: ['bugfix'], category: 'activity' },
|
|
45
|
+
{ patterns: [/기능|구현|추가/i], tags: ['feature'], category: 'activity' },
|
|
46
|
+
{ patterns: [/설계|아키텍처|패턴/i], tags: ['design'], category: 'activity' },
|
|
47
|
+
];
|
|
48
|
+
// In-memory config storage (in real implementation, this would be persisted)
|
|
49
|
+
let tagConfig = {
|
|
50
|
+
enableAutoTag: true,
|
|
51
|
+
defaultCategories: ['language', 'framework', 'feature', 'practice', 'concern', 'activity'],
|
|
52
|
+
customPatterns: [],
|
|
53
|
+
};
|
|
54
|
+
// Pattern-based tag detection
|
|
55
|
+
function detectTagsFromContent(content, codeBlocks, categories) {
|
|
56
|
+
const suggestions = [];
|
|
57
|
+
const foundTags = new Set();
|
|
58
|
+
// Combine all text for analysis
|
|
59
|
+
let fullText = content;
|
|
60
|
+
if (codeBlocks) {
|
|
61
|
+
codeBlocks.forEach((cb) => {
|
|
62
|
+
if (cb.language)
|
|
63
|
+
fullText += ` ${cb.language}`;
|
|
64
|
+
if (cb.code)
|
|
65
|
+
fullText += ` ${cb.code}`;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Check default patterns
|
|
69
|
+
DEFAULT_PATTERNS.forEach(({ patterns, tags, category }) => {
|
|
70
|
+
if (categories && !categories.includes(category))
|
|
71
|
+
return;
|
|
72
|
+
patterns.forEach((pattern) => {
|
|
73
|
+
if (pattern.test(fullText)) {
|
|
74
|
+
tags.forEach((tag) => {
|
|
75
|
+
if (!foundTags.has(tag)) {
|
|
76
|
+
foundTags.add(tag);
|
|
77
|
+
suggestions.push({
|
|
78
|
+
tag,
|
|
79
|
+
confidence: 0.8,
|
|
80
|
+
reason: `Detected from pattern: ${pattern.source}`,
|
|
81
|
+
category,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
// Check custom patterns
|
|
89
|
+
tagConfig.customPatterns.forEach(({ pattern, tags }) => {
|
|
90
|
+
try {
|
|
91
|
+
const regex = new RegExp(pattern, 'i');
|
|
92
|
+
if (regex.test(fullText)) {
|
|
93
|
+
tags.forEach((tag) => {
|
|
94
|
+
if (!foundTags.has(tag)) {
|
|
95
|
+
foundTags.add(tag);
|
|
96
|
+
suggestions.push({
|
|
97
|
+
tag,
|
|
98
|
+
confidence: 0.9,
|
|
99
|
+
reason: `Matched custom pattern: ${pattern}`,
|
|
100
|
+
category: 'custom',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Invalid regex, skip
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// Detect languages from code blocks
|
|
111
|
+
if (codeBlocks) {
|
|
112
|
+
codeBlocks.forEach((cb) => {
|
|
113
|
+
if (cb.language && !foundTags.has(cb.language)) {
|
|
114
|
+
foundTags.add(cb.language);
|
|
115
|
+
suggestions.push({
|
|
116
|
+
tag: cb.language,
|
|
117
|
+
confidence: 1.0,
|
|
118
|
+
reason: 'Detected from code block language',
|
|
119
|
+
category: 'language',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return suggestions.sort((a, b) => b.confidence - a.confidence);
|
|
125
|
+
}
|
|
126
|
+
// AI-based tag suggestion
|
|
127
|
+
async function suggestTagsWithAI(content, codeBlocks, maxTags = 5) {
|
|
128
|
+
const client = getAnthropicClient();
|
|
129
|
+
if (!client) {
|
|
130
|
+
throw new Error('AI client not available');
|
|
131
|
+
}
|
|
132
|
+
// Prepare context
|
|
133
|
+
let context = `Content: ${content.slice(0, 2000)}`;
|
|
134
|
+
if (codeBlocks && codeBlocks.length > 0) {
|
|
135
|
+
context += `\n\nCode blocks (${codeBlocks.length} total):\n`;
|
|
136
|
+
codeBlocks.slice(0, 3).forEach((cb, i) => {
|
|
137
|
+
context += `\n${i + 1}. Language: ${cb.language || 'unknown'}\n`;
|
|
138
|
+
context += `Code snippet: ${cb.code?.slice(0, 500) || 'N/A'}...\n`;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const response = await client.messages.create({
|
|
142
|
+
model: 'claude-sonnet-4-20250514',
|
|
143
|
+
max_tokens: 1024,
|
|
144
|
+
messages: [
|
|
145
|
+
{
|
|
146
|
+
role: 'user',
|
|
147
|
+
content: `Analyze this coding session content and suggest up to ${maxTags} relevant tags.
|
|
148
|
+
|
|
149
|
+
${context}
|
|
150
|
+
|
|
151
|
+
Return ONLY a JSON array of tag suggestions with this format:
|
|
152
|
+
[{"tag": "tag-name", "confidence": 0.9, "reason": "brief reason", "category": "category-name"}]
|
|
153
|
+
|
|
154
|
+
Categories: language, framework, feature, practice, concern, activity, library, pattern
|
|
155
|
+
Confidence: 0.0 to 1.0
|
|
156
|
+
Keep tags lowercase, single words or hyphenated.`,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
// Parse response
|
|
161
|
+
const text = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
162
|
+
const jsonMatch = text.match(/\[[\s\S]*?\]/);
|
|
163
|
+
if (!jsonMatch) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
168
|
+
return parsed.slice(0, maxTags);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Main tool function
|
|
175
|
+
export async function autoTagTool(input) {
|
|
176
|
+
const { action, sessionId, content, codeBlocks, maxTags = 5, minConfidence = 0.7, includeExisting = true, categories, examples, enableAutoTag, defaultCategories, customPatterns, useAI = false, } = input;
|
|
177
|
+
logger.info('Auto-tag requested', { action, sessionId, useAI });
|
|
178
|
+
try {
|
|
179
|
+
switch (action) {
|
|
180
|
+
case 'suggest': {
|
|
181
|
+
let textContent = content || '';
|
|
182
|
+
let blocks = codeBlocks;
|
|
183
|
+
// If sessionId provided, get session content
|
|
184
|
+
if (sessionId) {
|
|
185
|
+
const session = await getSession(sessionId);
|
|
186
|
+
if (!session) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
action,
|
|
190
|
+
usedAI: false,
|
|
191
|
+
error: `Session not found: ${sessionId}`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
textContent = `${session.title}\n${session.summary}`;
|
|
195
|
+
if (session.codeContexts) {
|
|
196
|
+
blocks = [];
|
|
197
|
+
session.codeContexts.forEach((ctx) => {
|
|
198
|
+
if (ctx.codeBlocks) {
|
|
199
|
+
blocks.push(...ctx.codeBlocks);
|
|
200
|
+
}
|
|
201
|
+
textContent += `\n${ctx.conversationSummary}`;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (!textContent && (!blocks || blocks.length === 0)) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
action,
|
|
209
|
+
usedAI: false,
|
|
210
|
+
error: 'No content provided for tagging. Provide content, codeBlocks, or sessionId.',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
let suggestions;
|
|
214
|
+
let usedAIForSuggestion = false;
|
|
215
|
+
if (useAI && isAIAvailable()) {
|
|
216
|
+
try {
|
|
217
|
+
suggestions = await suggestTagsWithAI(textContent, blocks, maxTags);
|
|
218
|
+
usedAIForSuggestion = true;
|
|
219
|
+
// Supplement with pattern-based if AI returned few results
|
|
220
|
+
if (suggestions.length < maxTags) {
|
|
221
|
+
const patternSuggestions = detectTagsFromContent(textContent, blocks, categories);
|
|
222
|
+
const existingTags = new Set(suggestions.map((s) => s.tag));
|
|
223
|
+
patternSuggestions.forEach((ps) => {
|
|
224
|
+
if (!existingTags.has(ps.tag) && suggestions.length < maxTags) {
|
|
225
|
+
suggestions.push(ps);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (aiError) {
|
|
231
|
+
logger.warn('AI tagging failed, falling back to patterns', { error: aiError });
|
|
232
|
+
suggestions = detectTagsFromContent(textContent, blocks, categories);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
suggestions = detectTagsFromContent(textContent, blocks, categories);
|
|
237
|
+
}
|
|
238
|
+
// Filter by confidence
|
|
239
|
+
suggestions = suggestions
|
|
240
|
+
.filter((s) => s.confidence >= minConfidence)
|
|
241
|
+
.slice(0, maxTags);
|
|
242
|
+
return {
|
|
243
|
+
success: true,
|
|
244
|
+
action,
|
|
245
|
+
suggestions,
|
|
246
|
+
sessionId,
|
|
247
|
+
usedAI: usedAIForSuggestion,
|
|
248
|
+
message: `Found ${suggestions.length} tag suggestions`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
case 'apply': {
|
|
252
|
+
if (!sessionId) {
|
|
253
|
+
return {
|
|
254
|
+
success: false,
|
|
255
|
+
action,
|
|
256
|
+
usedAI: false,
|
|
257
|
+
error: 'sessionId is required for apply action',
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const session = await getSession(sessionId);
|
|
261
|
+
if (!session) {
|
|
262
|
+
return {
|
|
263
|
+
success: false,
|
|
264
|
+
action,
|
|
265
|
+
usedAI: false,
|
|
266
|
+
error: `Session not found: ${sessionId}`,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
// Get suggestions first
|
|
270
|
+
let textContent = `${session.title}\n${session.summary}`;
|
|
271
|
+
const blocks = [];
|
|
272
|
+
if (session.codeContexts) {
|
|
273
|
+
session.codeContexts.forEach((ctx) => {
|
|
274
|
+
if (ctx.codeBlocks) {
|
|
275
|
+
blocks.push(...ctx.codeBlocks);
|
|
276
|
+
}
|
|
277
|
+
textContent += `\n${ctx.conversationSummary}`;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
let suggestions;
|
|
281
|
+
let usedAIForSuggestion = false;
|
|
282
|
+
if (useAI && isAIAvailable()) {
|
|
283
|
+
try {
|
|
284
|
+
suggestions = await suggestTagsWithAI(textContent, blocks, maxTags);
|
|
285
|
+
usedAIForSuggestion = true;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
suggestions = detectTagsFromContent(textContent, blocks, categories);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
suggestions = detectTagsFromContent(textContent, blocks, categories);
|
|
293
|
+
}
|
|
294
|
+
// Filter and get tags to apply
|
|
295
|
+
const newTags = suggestions
|
|
296
|
+
.filter((s) => s.confidence >= minConfidence)
|
|
297
|
+
.slice(0, maxTags)
|
|
298
|
+
.map((s) => s.tag);
|
|
299
|
+
// Merge with existing tags if requested
|
|
300
|
+
const existingTags = session.tags || [];
|
|
301
|
+
const allTags = includeExisting
|
|
302
|
+
? [...new Set([...existingTags, ...newTags])]
|
|
303
|
+
: [...new Set(newTags)];
|
|
304
|
+
// Update session
|
|
305
|
+
await updateSession(sessionId, { tags: allTags });
|
|
306
|
+
return {
|
|
307
|
+
success: true,
|
|
308
|
+
action,
|
|
309
|
+
suggestions,
|
|
310
|
+
appliedTags: allTags,
|
|
311
|
+
sessionId,
|
|
312
|
+
usedAI: usedAIForSuggestion,
|
|
313
|
+
message: `Applied ${newTags.length} new tags to session`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
case 'train': {
|
|
317
|
+
if (!examples || examples.length === 0) {
|
|
318
|
+
return {
|
|
319
|
+
success: false,
|
|
320
|
+
action,
|
|
321
|
+
usedAI: false,
|
|
322
|
+
error: 'examples are required for train action',
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
// Convert examples to patterns
|
|
326
|
+
let patternsAdded = 0;
|
|
327
|
+
examples.forEach(({ content: exContent, tags }) => {
|
|
328
|
+
// Extract keywords from content
|
|
329
|
+
const words = exContent
|
|
330
|
+
.toLowerCase()
|
|
331
|
+
.split(/\s+/)
|
|
332
|
+
.filter((w) => w.length > 3)
|
|
333
|
+
.slice(0, 5);
|
|
334
|
+
if (words.length > 0) {
|
|
335
|
+
const pattern = words.join('|');
|
|
336
|
+
tagConfig.customPatterns.push({ pattern, tags });
|
|
337
|
+
patternsAdded++;
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
return {
|
|
341
|
+
success: true,
|
|
342
|
+
action,
|
|
343
|
+
trained: true,
|
|
344
|
+
patternsAdded,
|
|
345
|
+
usedAI: false,
|
|
346
|
+
message: `Added ${patternsAdded} new patterns from ${examples.length} examples`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
case 'config': {
|
|
350
|
+
// Update config if values provided
|
|
351
|
+
if (enableAutoTag !== undefined) {
|
|
352
|
+
tagConfig.enableAutoTag = enableAutoTag;
|
|
353
|
+
}
|
|
354
|
+
if (defaultCategories) {
|
|
355
|
+
tagConfig.defaultCategories = defaultCategories;
|
|
356
|
+
}
|
|
357
|
+
if (customPatterns) {
|
|
358
|
+
tagConfig.customPatterns = customPatterns;
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
success: true,
|
|
362
|
+
action,
|
|
363
|
+
config: { ...tagConfig },
|
|
364
|
+
usedAI: false,
|
|
365
|
+
message: 'Configuration updated successfully',
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
default:
|
|
369
|
+
return {
|
|
370
|
+
success: false,
|
|
371
|
+
action,
|
|
372
|
+
usedAI: false,
|
|
373
|
+
error: `Unknown action: ${action}`,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
logger.error('Auto-tag failed', error);
|
|
379
|
+
return {
|
|
380
|
+
success: false,
|
|
381
|
+
action,
|
|
382
|
+
usedAI: false,
|
|
383
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Schema for MCP registration
|
|
388
|
+
export const autoTagSchema = {
|
|
389
|
+
name: 'muse_auto_tag',
|
|
390
|
+
description: 'Automatically suggests and applies tags to sessions. Actions: suggest (recommend tags), apply (add tags to session), train (learn from examples), config (configure tagging behavior).',
|
|
391
|
+
inputSchema: {
|
|
392
|
+
type: 'object',
|
|
393
|
+
properties: {
|
|
394
|
+
action: {
|
|
395
|
+
type: 'string',
|
|
396
|
+
enum: ['suggest', 'apply', 'train', 'config'],
|
|
397
|
+
description: 'Action to perform',
|
|
398
|
+
},
|
|
399
|
+
sessionId: {
|
|
400
|
+
type: 'string',
|
|
401
|
+
description: 'Session ID to analyze or update (for suggest/apply)',
|
|
402
|
+
},
|
|
403
|
+
content: {
|
|
404
|
+
type: 'string',
|
|
405
|
+
description: 'Text content to analyze for tags',
|
|
406
|
+
},
|
|
407
|
+
codeBlocks: {
|
|
408
|
+
type: 'array',
|
|
409
|
+
items: {
|
|
410
|
+
type: 'object',
|
|
411
|
+
properties: {
|
|
412
|
+
language: { type: 'string' },
|
|
413
|
+
code: { type: 'string' },
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
description: 'Code blocks to analyze',
|
|
417
|
+
},
|
|
418
|
+
maxTags: {
|
|
419
|
+
type: 'number',
|
|
420
|
+
description: 'Maximum number of tags to suggest (default: 5)',
|
|
421
|
+
},
|
|
422
|
+
minConfidence: {
|
|
423
|
+
type: 'number',
|
|
424
|
+
description: 'Minimum confidence threshold 0-1 (default: 0.7)',
|
|
425
|
+
},
|
|
426
|
+
includeExisting: {
|
|
427
|
+
type: 'boolean',
|
|
428
|
+
description: 'Include existing tags when applying (default: true)',
|
|
429
|
+
},
|
|
430
|
+
categories: {
|
|
431
|
+
type: 'array',
|
|
432
|
+
items: { type: 'string' },
|
|
433
|
+
description: 'Filter suggestions by category',
|
|
434
|
+
},
|
|
435
|
+
examples: {
|
|
436
|
+
type: 'array',
|
|
437
|
+
items: {
|
|
438
|
+
type: 'object',
|
|
439
|
+
properties: {
|
|
440
|
+
content: { type: 'string' },
|
|
441
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
442
|
+
},
|
|
443
|
+
required: ['content', 'tags'],
|
|
444
|
+
},
|
|
445
|
+
description: 'Training examples for train action',
|
|
446
|
+
},
|
|
447
|
+
enableAutoTag: {
|
|
448
|
+
type: 'boolean',
|
|
449
|
+
description: 'Enable/disable auto-tagging (for config)',
|
|
450
|
+
},
|
|
451
|
+
defaultCategories: {
|
|
452
|
+
type: 'array',
|
|
453
|
+
items: { type: 'string' },
|
|
454
|
+
description: 'Default categories to use (for config)',
|
|
455
|
+
},
|
|
456
|
+
customPatterns: {
|
|
457
|
+
type: 'array',
|
|
458
|
+
items: {
|
|
459
|
+
type: 'object',
|
|
460
|
+
properties: {
|
|
461
|
+
pattern: { type: 'string' },
|
|
462
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
description: 'Custom patterns for tag detection (for config)',
|
|
466
|
+
},
|
|
467
|
+
useAI: {
|
|
468
|
+
type: 'boolean',
|
|
469
|
+
description: 'Use AI for tag suggestions (default: false)',
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
required: ['action'],
|
|
473
|
+
},
|
|
474
|
+
};
|
|
475
|
+
//# sourceMappingURL=autoTag.js.map
|