codingbuddy 3.1.2 → 4.0.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/dist/src/main.js +0 -0
- package/dist/src/mcp/handlers/session.handler.d.ts +15 -0
- package/dist/src/mcp/handlers/session.handler.js +238 -0
- package/dist/src/mcp/handlers/session.handler.js.map +1 -0
- package/dist/src/session/__tests__/session-test.utils.d.ts +5 -0
- package/dist/src/session/__tests__/session-test.utils.js +59 -0
- package/dist/src/session/__tests__/session-test.utils.js.map +1 -0
- package/dist/src/session/index.d.ts +3 -0
- package/dist/src/session/index.js +8 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/session/session.cache.d.ts +19 -0
- package/dist/src/session/session.cache.js +83 -0
- package/dist/src/session/session.cache.js.map +1 -0
- package/dist/src/session/session.module.d.ts +2 -0
- package/dist/src/session/session.module.js +23 -0
- package/dist/src/session/session.module.js.map +1 -0
- package/dist/src/session/session.parser.d.ts +22 -0
- package/dist/src/session/session.parser.js +273 -0
- package/dist/src/session/session.parser.js.map +1 -0
- package/dist/src/session/session.serializer.d.ts +6 -0
- package/dist/src/session/session.serializer.js +84 -0
- package/dist/src/session/session.serializer.js.map +1 -0
- package/dist/src/session/session.service.d.ts +24 -0
- package/dist/src/session/session.service.js +309 -0
- package/dist/src/session/session.service.js.map +1 -0
- package/dist/src/session/session.types.d.ts +52 -0
- package/dist/src/session/session.types.js +3 -0
- package/dist/src/session/session.types.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var SessionService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.SessionService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const fs = require("fs/promises");
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path = require("path");
|
|
18
|
+
const config_service_1 = require("../config/config.service");
|
|
19
|
+
const slug_utils_1 = require("../shared/slug.utils");
|
|
20
|
+
const async_utils_1 = require("../shared/async.utils");
|
|
21
|
+
const session_parser_1 = require("./session.parser");
|
|
22
|
+
const session_serializer_1 = require("./session.serializer");
|
|
23
|
+
const session_cache_1 = require("./session.cache");
|
|
24
|
+
const SESSIONS_DIR_NAME = 'docs/codingbuddy/sessions';
|
|
25
|
+
const SESSION_FILE_TIMEOUT_MS = 5000;
|
|
26
|
+
const SESSION_ID_PATTERN = /^[a-z0-9가-힣-]+$/;
|
|
27
|
+
const MAX_SESSION_TITLE_LENGTH = 200;
|
|
28
|
+
const MAX_SLUG_LENGTH = 100;
|
|
29
|
+
const MAX_SESSION_ID_LENGTH = 150;
|
|
30
|
+
let SessionService = SessionService_1 = class SessionService {
|
|
31
|
+
constructor(configService) {
|
|
32
|
+
this.configService = configService;
|
|
33
|
+
this.logger = new common_1.Logger(SessionService_1.name);
|
|
34
|
+
this.cache = new session_cache_1.SessionCache();
|
|
35
|
+
}
|
|
36
|
+
getSessionsDir() {
|
|
37
|
+
const projectRoot = this.configService.getProjectRoot();
|
|
38
|
+
return path.join(projectRoot, SESSIONS_DIR_NAME);
|
|
39
|
+
}
|
|
40
|
+
ensureSessionsDir() {
|
|
41
|
+
const sessionsDir = this.getSessionsDir();
|
|
42
|
+
if (!(0, fs_1.existsSync)(sessionsDir)) {
|
|
43
|
+
(0, fs_1.mkdirSync)(sessionsDir, { recursive: true });
|
|
44
|
+
this.logger.log(`Created sessions directory: ${sessionsDir}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
validateSessionId(sessionId) {
|
|
48
|
+
if (!sessionId || sessionId.length === 0) {
|
|
49
|
+
this.logger.warn(`Session ID is empty: rejected`);
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (sessionId.length > MAX_SESSION_ID_LENGTH) {
|
|
53
|
+
this.logger.warn(`Session ID exceeds maximum length: rejected`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (sessionId.includes('\x00')) {
|
|
57
|
+
this.logger.warn(`Session ID contains null byte: rejected`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (sessionId.includes('..') ||
|
|
61
|
+
sessionId.includes('/') ||
|
|
62
|
+
sessionId.includes('\\')) {
|
|
63
|
+
this.logger.warn(`Session ID contains path traversal: rejected`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (!SESSION_ID_PATTERN.test(sessionId)) {
|
|
67
|
+
this.logger.warn(`Session ID contains invalid characters: rejected`);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
getSessionFilePath(sessionId) {
|
|
73
|
+
if (!this.validateSessionId(sessionId)) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const filePath = path.join(this.getSessionsDir(), `${sessionId}.md`);
|
|
77
|
+
const resolvedPath = path.resolve(filePath);
|
|
78
|
+
const resolvedSessionsDir = path.resolve(this.getSessionsDir());
|
|
79
|
+
if (!resolvedPath.startsWith(resolvedSessionsDir + path.sep)) {
|
|
80
|
+
this.logger.warn(`Session path escaped sessions directory: ${resolvedPath}`);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return filePath;
|
|
84
|
+
}
|
|
85
|
+
validateTitle(title) {
|
|
86
|
+
if (!title || title.trim().length === 0) {
|
|
87
|
+
return 'Title cannot be empty';
|
|
88
|
+
}
|
|
89
|
+
if (title.length > MAX_SESSION_TITLE_LENGTH) {
|
|
90
|
+
return `Title exceeds maximum length of ${MAX_SESSION_TITLE_LENGTH} characters`;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
generateFilename(title) {
|
|
95
|
+
const date = new Date().toISOString().split('T')[0];
|
|
96
|
+
const slug = (0, slug_utils_1.generateSlug)(title, MAX_SLUG_LENGTH);
|
|
97
|
+
return `${date}-${slug}.md`;
|
|
98
|
+
}
|
|
99
|
+
async createSession(options) {
|
|
100
|
+
try {
|
|
101
|
+
const titleError = this.validateTitle(options.title);
|
|
102
|
+
if (titleError) {
|
|
103
|
+
return { success: false, error: titleError };
|
|
104
|
+
}
|
|
105
|
+
this.ensureSessionsDir();
|
|
106
|
+
const filename = this.generateFilename(options.title);
|
|
107
|
+
const filePath = path.join(this.getSessionsDir(), filename);
|
|
108
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
109
|
+
return {
|
|
110
|
+
success: true,
|
|
111
|
+
sessionId: filename.replace('.md', ''),
|
|
112
|
+
filePath,
|
|
113
|
+
message: `Session already exists: ${filename}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
const metadata = {
|
|
118
|
+
id: filename.replace('.md', ''),
|
|
119
|
+
title: options.title,
|
|
120
|
+
createdAt: now,
|
|
121
|
+
updatedAt: now,
|
|
122
|
+
status: 'active',
|
|
123
|
+
};
|
|
124
|
+
const document = {
|
|
125
|
+
metadata,
|
|
126
|
+
sections: [],
|
|
127
|
+
};
|
|
128
|
+
const language = (await this.configService.getLanguage()) || 'en';
|
|
129
|
+
const content = (0, session_serializer_1.serializeDocument)(document, language);
|
|
130
|
+
await (0, async_utils_1.withTimeout)(fs.writeFile(filePath, content, 'utf-8'), {
|
|
131
|
+
timeoutMs: SESSION_FILE_TIMEOUT_MS,
|
|
132
|
+
operationName: 'write session file',
|
|
133
|
+
});
|
|
134
|
+
this.cache.invalidateActiveSession();
|
|
135
|
+
this.logger.log(`Created session: ${filename}`);
|
|
136
|
+
return {
|
|
137
|
+
success: true,
|
|
138
|
+
sessionId: metadata.id,
|
|
139
|
+
filePath,
|
|
140
|
+
message: `Session created: ${filename}`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
145
|
+
this.logger.error(`Failed to create session: ${message}`);
|
|
146
|
+
return { success: false, error: message };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async getSession(sessionId) {
|
|
150
|
+
try {
|
|
151
|
+
const cached = this.cache.get(sessionId);
|
|
152
|
+
if (cached) {
|
|
153
|
+
return cached;
|
|
154
|
+
}
|
|
155
|
+
const filePath = this.getSessionFilePath(sessionId);
|
|
156
|
+
if (!filePath) {
|
|
157
|
+
this.logger.debug(`Invalid session ID: ${sessionId}`);
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
161
|
+
this.logger.debug(`Session not found: ${sessionId}`);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const content = await (0, async_utils_1.withTimeout)(fs.readFile(filePath, 'utf-8'), {
|
|
165
|
+
timeoutMs: SESSION_FILE_TIMEOUT_MS,
|
|
166
|
+
operationName: 'read session file',
|
|
167
|
+
});
|
|
168
|
+
const session = (0, session_parser_1.parseDocument)(content, sessionId);
|
|
169
|
+
this.cache.set(sessionId, session);
|
|
170
|
+
return session;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
this.logger.error(`Failed to read session ${sessionId}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async getActiveSession() {
|
|
178
|
+
try {
|
|
179
|
+
const cachedId = this.cache.getActiveSessionId();
|
|
180
|
+
if (cachedId) {
|
|
181
|
+
const session = await this.getSession(cachedId);
|
|
182
|
+
if (session && session.metadata.status === 'active') {
|
|
183
|
+
return session;
|
|
184
|
+
}
|
|
185
|
+
this.cache.invalidateActiveSession();
|
|
186
|
+
}
|
|
187
|
+
const sessionsDir = this.getSessionsDir();
|
|
188
|
+
if (!(0, fs_1.existsSync)(sessionsDir)) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const files = await fs.readdir(sessionsDir);
|
|
192
|
+
const mdFiles = files
|
|
193
|
+
.filter(f => f.endsWith('.md'))
|
|
194
|
+
.sort()
|
|
195
|
+
.reverse();
|
|
196
|
+
for (const file of mdFiles) {
|
|
197
|
+
const sessionId = file.replace('.md', '');
|
|
198
|
+
const session = await this.getSession(sessionId);
|
|
199
|
+
if (session && session.metadata.status === 'active') {
|
|
200
|
+
this.cache.setActiveSessionId(sessionId);
|
|
201
|
+
return session;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
this.logger.error(`Failed to get active session: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async updateSession(options) {
|
|
212
|
+
try {
|
|
213
|
+
const session = await this.getSession(options.sessionId);
|
|
214
|
+
if (!session) {
|
|
215
|
+
return {
|
|
216
|
+
success: false,
|
|
217
|
+
error: `Session not found: ${options.sessionId}`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const now = new Date().toISOString();
|
|
221
|
+
const language = (await this.configService.getLanguage()) || 'en';
|
|
222
|
+
const locale = session_serializer_1.LANGUAGE_TO_LOCALE[language] || 'en-US';
|
|
223
|
+
const timestamp = new Date().toLocaleString(locale, {
|
|
224
|
+
hour: '2-digit',
|
|
225
|
+
minute: '2-digit',
|
|
226
|
+
hour12: false,
|
|
227
|
+
});
|
|
228
|
+
const existingIndex = session.sections.findIndex(s => s.mode === options.section.mode);
|
|
229
|
+
const newSection = {
|
|
230
|
+
...options.section,
|
|
231
|
+
timestamp: options.section.timestamp || timestamp,
|
|
232
|
+
};
|
|
233
|
+
if (existingIndex >= 0) {
|
|
234
|
+
const existing = session.sections[existingIndex];
|
|
235
|
+
session.sections[existingIndex] = this.mergeSection(existing, newSection);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
session.sections.push(newSection);
|
|
239
|
+
}
|
|
240
|
+
session.metadata.updatedAt = now;
|
|
241
|
+
const filePath = this.getSessionFilePath(options.sessionId);
|
|
242
|
+
if (!filePath) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
error: `Invalid session ID: ${options.sessionId}`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const content = (0, session_serializer_1.serializeDocument)(session, language);
|
|
249
|
+
await (0, async_utils_1.withTimeout)(fs.writeFile(filePath, content, 'utf-8'), {
|
|
250
|
+
timeoutMs: SESSION_FILE_TIMEOUT_MS,
|
|
251
|
+
operationName: 'update session file',
|
|
252
|
+
});
|
|
253
|
+
this.cache.invalidate(options.sessionId);
|
|
254
|
+
this.logger.log(`Updated session ${options.sessionId}: ${options.section.mode} section`);
|
|
255
|
+
return {
|
|
256
|
+
success: true,
|
|
257
|
+
sessionId: options.sessionId,
|
|
258
|
+
filePath,
|
|
259
|
+
message: `Session updated: ${options.section.mode} section`,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
264
|
+
this.logger.error(`Failed to update session: ${message}`);
|
|
265
|
+
return { success: false, error: message };
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
mergeSection(existing, newSection) {
|
|
269
|
+
const mergedDecisions = this.mergeArrays(existing.decisions, newSection.decisions);
|
|
270
|
+
const mergedNotes = this.mergeArrays(existing.notes, newSection.notes);
|
|
271
|
+
return {
|
|
272
|
+
...existing,
|
|
273
|
+
...newSection,
|
|
274
|
+
decisions: mergedDecisions.length > 0 ? mergedDecisions : undefined,
|
|
275
|
+
notes: mergedNotes.length > 0 ? mergedNotes : undefined,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
mergeArrays(existing, newItems) {
|
|
279
|
+
const existingSet = new Set(existing || []);
|
|
280
|
+
const newArray = [...existingSet];
|
|
281
|
+
for (const item of newItems || []) {
|
|
282
|
+
if (!existingSet.has(item)) {
|
|
283
|
+
newArray.push(item);
|
|
284
|
+
existingSet.add(item);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return newArray;
|
|
288
|
+
}
|
|
289
|
+
async getRecommendedActAgent(sessionId) {
|
|
290
|
+
const session = await this.getSession(sessionId);
|
|
291
|
+
if (!session) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
const planSection = session.sections.find(s => s.mode === 'PLAN');
|
|
295
|
+
if (planSection?.recommendedActAgent) {
|
|
296
|
+
return {
|
|
297
|
+
agent: planSection.recommendedActAgent,
|
|
298
|
+
confidence: planSection.recommendedActAgentConfidence || 0,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
exports.SessionService = SessionService;
|
|
305
|
+
exports.SessionService = SessionService = SessionService_1 = __decorate([
|
|
306
|
+
(0, common_1.Injectable)(),
|
|
307
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
308
|
+
], SessionService);
|
|
309
|
+
//# sourceMappingURL=session.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../../src/session/session.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Mode } from '../keyword/keyword.types';
|
|
2
|
+
export interface SessionSection {
|
|
3
|
+
mode: Mode;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
primaryAgent?: string;
|
|
6
|
+
recommendedActAgent?: string;
|
|
7
|
+
recommendedActAgentConfidence?: number;
|
|
8
|
+
specialists?: string[];
|
|
9
|
+
task?: string;
|
|
10
|
+
decisions?: string[];
|
|
11
|
+
notes?: string[];
|
|
12
|
+
status?: 'in_progress' | 'completed' | 'blocked';
|
|
13
|
+
}
|
|
14
|
+
export interface SessionMetadata {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
status: 'active' | 'completed' | 'archived';
|
|
20
|
+
}
|
|
21
|
+
export interface SessionDocument {
|
|
22
|
+
metadata: SessionMetadata;
|
|
23
|
+
sections: SessionSection[];
|
|
24
|
+
}
|
|
25
|
+
export interface CreateSessionOptions {
|
|
26
|
+
title: string;
|
|
27
|
+
task?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface UpdateSessionOptions {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
section: Partial<SessionSection> & {
|
|
32
|
+
mode: Mode;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export interface SessionOperationResult {
|
|
36
|
+
success: boolean;
|
|
37
|
+
sessionId?: string;
|
|
38
|
+
filePath?: string;
|
|
39
|
+
message?: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface SessionContext {
|
|
43
|
+
sessionId: string;
|
|
44
|
+
title: string;
|
|
45
|
+
previousSections: SessionSection[];
|
|
46
|
+
recommendedActAgent?: {
|
|
47
|
+
agent: string;
|
|
48
|
+
confidence: number;
|
|
49
|
+
};
|
|
50
|
+
allDecisions: string[];
|
|
51
|
+
allNotes: string[];
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.types.js","sourceRoot":"","sources":["../../../src/session/session.types.ts"],"names":[],"mappings":""}
|