codingbuddy 2.3.3 → 2.4.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/config/config.schema.d.ts +11 -0
- package/dist/src/config/config.schema.js +7 -1
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/config/config.service.d.ts +4 -0
- package/dist/src/config/config.service.js +7 -0
- package/dist/src/config/config.service.js.map +1 -1
- package/dist/src/context/context-document.service.d.ts +24 -0
- package/dist/src/context/context-document.service.js +212 -0
- package/dist/src/context/context-document.service.js.map +1 -0
- package/dist/src/context/context-document.types.d.ts +89 -0
- package/dist/src/context/context-document.types.js +53 -0
- package/dist/src/context/context-document.types.js.map +1 -0
- package/dist/src/context/context-parser.utils.d.ts +10 -0
- package/dist/src/context/context-parser.utils.js +214 -0
- package/dist/src/context/context-parser.utils.js.map +1 -0
- package/dist/src/context/context-serializer.utils.d.ts +16 -0
- package/dist/src/context/context-serializer.utils.js +130 -0
- package/dist/src/context/context-serializer.utils.js.map +1 -0
- package/dist/src/context/context.module.js +5 -3
- package/dist/src/context/context.module.js.map +1 -1
- package/dist/src/keyword/keyword.module.js +5 -2
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.js +20 -10
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/primary-agent-resolver.d.ts +4 -0
- package/dist/src/keyword/primary-agent-resolver.js +80 -16
- package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
- package/dist/src/mcp/handlers/context-document.handler.d.ts +13 -0
- package/dist/src/mcp/handlers/context-document.handler.js +232 -0
- package/dist/src/mcp/handlers/context-document.handler.js.map +1 -0
- package/dist/src/mcp/handlers/index.d.ts +1 -0
- package/dist/src/mcp/handlers/index.js +3 -1
- package/dist/src/mcp/handlers/index.js.map +1 -1
- package/dist/src/mcp/handlers/mode.handler.d.ts +20 -1
- package/dist/src/mcp/handlers/mode.handler.js +223 -4
- package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
- package/dist/src/mcp/mcp.module.js +3 -0
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/rules/rules.service.js +17 -1
- package/dist/src/rules/rules.service.js.map +1 -1
- package/dist/src/rules/rules.types.d.ts +7 -0
- package/dist/src/session/session.service.d.ts +10 -0
- package/dist/src/session/session.service.js +262 -58
- package/dist/src/session/session.service.js.map +1 -1
- package/dist/src/session/session.types.d.ts +11 -0
- package/dist/src/shared/async.utils.d.ts +12 -0
- package/dist/src/shared/async.utils.js +50 -0
- package/dist/src/shared/async.utils.js.map +1 -1
- package/dist/src/shared/slug.utils.d.ts +2 -0
- package/dist/src/shared/slug.utils.js +20 -0
- package/dist/src/shared/slug.utils.js.map +1 -0
- package/dist/src/state/index.d.ts +3 -0
- package/dist/src/state/index.js +12 -0
- package/dist/src/state/index.js.map +1 -0
- package/dist/src/state/state.module.d.ts +2 -0
- package/dist/src/state/state.module.js +23 -0
- package/dist/src/state/state.module.js.map +1 -0
- package/dist/src/state/state.service.d.ts +21 -0
- package/dist/src/state/state.service.js +214 -0
- package/dist/src/state/state.service.js.map +1 -0
- package/dist/src/state/state.types.d.ts +34 -0
- package/dist/src/state/state.types.js +10 -0
- package/dist/src/state/state.types.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeoutError = void 0;
|
|
3
4
|
exports.asyncWithFallback = asyncWithFallback;
|
|
5
|
+
exports.getConfiguredTimeout = getConfiguredTimeout;
|
|
6
|
+
exports.resetTimeoutCache = resetTimeoutCache;
|
|
7
|
+
exports.withTimeout = withTimeout;
|
|
4
8
|
async function asyncWithFallback(options) {
|
|
5
9
|
const { fn, fallback, errorMessage, logger } = options;
|
|
6
10
|
try {
|
|
@@ -15,4 +19,50 @@ async function asyncWithFallback(options) {
|
|
|
15
19
|
return fallback;
|
|
16
20
|
}
|
|
17
21
|
}
|
|
22
|
+
const DEFAULT_FILE_OPERATION_TIMEOUT_MS = 5000;
|
|
23
|
+
const MAX_TIMEOUT_MS = 300000;
|
|
24
|
+
let cachedTimeout = null;
|
|
25
|
+
function getConfiguredTimeout() {
|
|
26
|
+
if (cachedTimeout !== null) {
|
|
27
|
+
return cachedTimeout;
|
|
28
|
+
}
|
|
29
|
+
const envTimeout = process.env.CODINGBUDDY_FILE_TIMEOUT_MS;
|
|
30
|
+
if (envTimeout) {
|
|
31
|
+
const parsed = parseInt(envTimeout, 10);
|
|
32
|
+
if (!isNaN(parsed) && parsed > 0 && parsed <= MAX_TIMEOUT_MS) {
|
|
33
|
+
cachedTimeout = parsed;
|
|
34
|
+
return cachedTimeout;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
cachedTimeout = DEFAULT_FILE_OPERATION_TIMEOUT_MS;
|
|
38
|
+
return cachedTimeout;
|
|
39
|
+
}
|
|
40
|
+
function resetTimeoutCache() {
|
|
41
|
+
cachedTimeout = null;
|
|
42
|
+
}
|
|
43
|
+
class TimeoutError extends Error {
|
|
44
|
+
constructor(message, operationName, timeoutMs) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = 'TimeoutError';
|
|
47
|
+
this.operationName = operationName || 'unknown';
|
|
48
|
+
this.timeoutMs = timeoutMs || 0;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.TimeoutError = TimeoutError;
|
|
52
|
+
async function withTimeout(promise, options = {}) {
|
|
53
|
+
const configuredTimeout = getConfiguredTimeout();
|
|
54
|
+
const { timeoutMs = configuredTimeout, operationName = 'operation' } = options;
|
|
55
|
+
let timeoutId;
|
|
56
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
57
|
+
timeoutId = setTimeout(() => {
|
|
58
|
+
reject(new TimeoutError(`${operationName} timed out after ${timeoutMs}ms`, operationName, timeoutMs));
|
|
59
|
+
}, timeoutMs);
|
|
60
|
+
});
|
|
61
|
+
try {
|
|
62
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(timeoutId);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
18
68
|
//# sourceMappingURL=async.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.utils.js","sourceRoot":"","sources":["../../../src/shared/async.utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"async.utils.js","sourceRoot":"","sources":["../../../src/shared/async.utils.ts"],"names":[],"mappings":";;;AA8CA,8CAiBC;AAkBD,oDAgBC;AAOD,8CAEC;AAiDD,kCA2BC;AAxIM,KAAK,UAAU,iBAAiB,CACrC,OAAoC;IAEpC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEvD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC3E,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAE5D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAGD,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAG/C,MAAM,cAAc,GAAG,MAAM,CAAC;AAG9B,IAAI,aAAa,GAAkB,IAAI,CAAC;AASxC,SAAgB,oBAAoB;IAClC,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAC3D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,cAAc,EAAE,CAAC;YAC7D,aAAa,GAAG,MAAM,CAAC;YACvB,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,aAAa,GAAG,iCAAiC,CAAC;IAClD,OAAO,aAAa,CAAC;AACvB,CAAC;AAOD,SAAgB,iBAAiB;IAC/B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAMD,MAAa,YAAa,SAAQ,KAAK;IAMrC,YAAY,OAAe,EAAE,aAAsB,EAAE,SAAkB;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,SAAS,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC;IAClC,CAAC;CACF;AAZD,oCAYC;AA+BM,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,UAA8B,EAAE;IAEhC,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,EAAE,SAAS,GAAG,iBAAiB,EAAE,aAAa,GAAG,WAAW,EAAE,GAClE,OAAO,CAAC;IAEV,IAAI,SAAwC,CAAC;IAE7C,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACtD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,MAAM,CACJ,IAAI,YAAY,CACd,GAAG,aAAa,oBAAoB,SAAS,IAAI,EACjD,aAAa,EACb,SAAS,CACV,CACF,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAU,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateSlug = generateSlug;
|
|
4
|
+
exports.generateSessionTitle = generateSessionTitle;
|
|
5
|
+
const DEFAULT_MAX_LENGTH = 50;
|
|
6
|
+
function generateSlug(text, maxLength = DEFAULT_MAX_LENGTH) {
|
|
7
|
+
const truncated = text.slice(0, maxLength).trim();
|
|
8
|
+
const slug = truncated
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replace(/[^a-z0-9\p{Script=Han}\p{Script=Hangul}\p{Script=Hiragana}\p{Script=Katakana}\u30FC\s-]/gu, '')
|
|
11
|
+
.replace(/\s+/g, '-')
|
|
12
|
+
.replace(/^-+|-+$/g, '');
|
|
13
|
+
return slug || 'untitled';
|
|
14
|
+
}
|
|
15
|
+
function generateSessionTitle(text, maxLength = DEFAULT_MAX_LENGTH) {
|
|
16
|
+
const datePrefix = new Date().toISOString().slice(0, 10);
|
|
17
|
+
const slug = generateSlug(text, maxLength);
|
|
18
|
+
return `${datePrefix}-${slug}`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=slug.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.utils.js","sourceRoot":"","sources":["../../../src/shared/slug.utils.ts"],"names":[],"mappings":";;AAoCA,oCAqBC;AAeD,oDAOC;AArED,MAAM,kBAAkB,GAAG,EAAE,CAAC;AA0B9B,SAAgB,YAAY,CAC1B,IAAY,EACZ,YAAoB,kBAAkB;IAGtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAGlD,MAAM,IAAI,GAAG,SAAS;SACnB,WAAW,EAAE;SAEb,OAAO,CACN,2FAA2F,EAC3F,EAAE,CACH;SAEA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SAEpB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,OAAO,IAAI,IAAI,UAAU,CAAC;AAC5B,CAAC;AAeD,SAAgB,oBAAoB,CAClC,IAAY,EACZ,YAAoB,kBAAkB;IAEtC,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { StateModule } from './state.module';
|
|
2
|
+
export { StateService } from './state.service';
|
|
3
|
+
export { STATE_DIR_NAME, STATE_FILES, STATE_SCHEMA_VERSION, type StateDocument, type ProjectMetadata, type ModeConfigSnapshot, type StateFileMeta, type StateOperationResult, } from './state.types';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STATE_SCHEMA_VERSION = exports.STATE_FILES = exports.STATE_DIR_NAME = exports.StateService = exports.StateModule = void 0;
|
|
4
|
+
var state_module_1 = require("./state.module");
|
|
5
|
+
Object.defineProperty(exports, "StateModule", { enumerable: true, get: function () { return state_module_1.StateModule; } });
|
|
6
|
+
var state_service_1 = require("./state.service");
|
|
7
|
+
Object.defineProperty(exports, "StateService", { enumerable: true, get: function () { return state_service_1.StateService; } });
|
|
8
|
+
var state_types_1 = require("./state.types");
|
|
9
|
+
Object.defineProperty(exports, "STATE_DIR_NAME", { enumerable: true, get: function () { return state_types_1.STATE_DIR_NAME; } });
|
|
10
|
+
Object.defineProperty(exports, "STATE_FILES", { enumerable: true, get: function () { return state_types_1.STATE_FILES; } });
|
|
11
|
+
Object.defineProperty(exports, "STATE_SCHEMA_VERSION", { enumerable: true, get: function () { return state_types_1.STATE_SCHEMA_VERSION; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/state/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,6CASuB;AARrB,6GAAA,cAAc,OAAA;AACd,0GAAA,WAAW,OAAA;AACX,mHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.StateModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const state_service_1 = require("./state.service");
|
|
12
|
+
const config_module_1 = require("../config/config.module");
|
|
13
|
+
let StateModule = class StateModule {
|
|
14
|
+
};
|
|
15
|
+
exports.StateModule = StateModule;
|
|
16
|
+
exports.StateModule = StateModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [config_module_1.CodingBuddyConfigModule],
|
|
19
|
+
providers: [state_service_1.StateService],
|
|
20
|
+
exports: [state_service_1.StateService],
|
|
21
|
+
})
|
|
22
|
+
], StateModule);
|
|
23
|
+
//# sourceMappingURL=state.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.module.js","sourceRoot":"","sources":["../../../src/state/state.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mDAA+C;AAC/C,2DAAkE;AAO3D,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IALvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uCAAuB,CAAC;QAClC,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;GACW,WAAW,CAAG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConfigService } from '../config/config.service';
|
|
2
|
+
import type { Mode } from '../keyword/keyword.types';
|
|
3
|
+
import { type ProjectMetadata, type StateOperationResult, type ModeConfigSnapshot } from './state.types';
|
|
4
|
+
export declare class StateService {
|
|
5
|
+
private readonly configService;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
constructor(configService: ConfigService);
|
|
8
|
+
getStateDir(): string;
|
|
9
|
+
private ensureStateDir;
|
|
10
|
+
private getStateFilePath;
|
|
11
|
+
saveProjectMetadata(metadata: ProjectMetadata): Promise<StateOperationResult>;
|
|
12
|
+
loadProjectMetadata(): Promise<ProjectMetadata | null>;
|
|
13
|
+
private loadStateDocument;
|
|
14
|
+
updateLastMode(mode: Mode): Promise<StateOperationResult>;
|
|
15
|
+
updateLastSession(sessionId: string): Promise<StateOperationResult>;
|
|
16
|
+
saveModeConfigSnapshot(snapshot: ModeConfigSnapshot): Promise<StateOperationResult>;
|
|
17
|
+
loadModeConfigSnapshot(): Promise<ModeConfigSnapshot | null>;
|
|
18
|
+
clearState(): Promise<StateOperationResult>;
|
|
19
|
+
getLastMode(): Promise<Mode | null>;
|
|
20
|
+
getLastSessionId(): Promise<string | null>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
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 StateService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.StateService = 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 state_types_1 = require("./state.types");
|
|
20
|
+
let StateService = StateService_1 = class StateService {
|
|
21
|
+
constructor(configService) {
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
this.logger = new common_1.Logger(StateService_1.name);
|
|
24
|
+
}
|
|
25
|
+
getStateDir() {
|
|
26
|
+
const projectRoot = this.configService.getProjectRoot();
|
|
27
|
+
return path.join(projectRoot, state_types_1.STATE_DIR_NAME);
|
|
28
|
+
}
|
|
29
|
+
ensureStateDir() {
|
|
30
|
+
const stateDir = this.getStateDir();
|
|
31
|
+
if (!(0, fs_1.existsSync)(stateDir)) {
|
|
32
|
+
(0, fs_1.mkdirSync)(stateDir, { recursive: true });
|
|
33
|
+
this.logger.log(`Created state directory: ${stateDir}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getStateFilePath(fileName) {
|
|
37
|
+
return path.join(this.getStateDir(), fileName);
|
|
38
|
+
}
|
|
39
|
+
async saveProjectMetadata(metadata) {
|
|
40
|
+
try {
|
|
41
|
+
this.ensureStateDir();
|
|
42
|
+
const doc = {
|
|
43
|
+
version: state_types_1.STATE_SCHEMA_VERSION,
|
|
44
|
+
project: metadata,
|
|
45
|
+
updatedAt: new Date().toISOString(),
|
|
46
|
+
};
|
|
47
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.PROJECT_METADATA);
|
|
48
|
+
await fs.writeFile(filePath, JSON.stringify(doc, null, 2), 'utf-8');
|
|
49
|
+
this.logger.debug(`Saved project metadata to ${filePath}`);
|
|
50
|
+
return { success: true, message: 'Project metadata saved' };
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
54
|
+
this.logger.error(`Failed to save project metadata: ${message}`);
|
|
55
|
+
return { success: false, error: message };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async loadProjectMetadata() {
|
|
59
|
+
try {
|
|
60
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.PROJECT_METADATA);
|
|
61
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
62
|
+
this.logger.debug('Project metadata file not found');
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
66
|
+
const doc = JSON.parse(content);
|
|
67
|
+
if (doc.version !== state_types_1.STATE_SCHEMA_VERSION) {
|
|
68
|
+
this.logger.warn(`State schema version mismatch: expected ${state_types_1.STATE_SCHEMA_VERSION}, got ${doc.version}`);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return doc.project;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
75
|
+
this.logger.error(`Failed to load project metadata: ${message}`);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async loadStateDocument() {
|
|
80
|
+
try {
|
|
81
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.PROJECT_METADATA);
|
|
82
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
86
|
+
const doc = JSON.parse(content);
|
|
87
|
+
if (doc.version !== state_types_1.STATE_SCHEMA_VERSION) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return doc;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async updateLastMode(mode) {
|
|
97
|
+
try {
|
|
98
|
+
const existing = await this.loadStateDocument();
|
|
99
|
+
if (existing) {
|
|
100
|
+
existing.project.lastMode = mode;
|
|
101
|
+
existing.updatedAt = new Date().toISOString();
|
|
102
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.PROJECT_METADATA);
|
|
103
|
+
await fs.writeFile(filePath, JSON.stringify(existing, null, 2), 'utf-8');
|
|
104
|
+
this.logger.debug(`Updated lastMode to ${mode}`);
|
|
105
|
+
return { success: true, message: `Last mode updated to ${mode}` };
|
|
106
|
+
}
|
|
107
|
+
const projectRoot = this.configService.getProjectRoot();
|
|
108
|
+
return this.saveProjectMetadata({
|
|
109
|
+
projectRoot,
|
|
110
|
+
detectedAt: new Date().toISOString(),
|
|
111
|
+
lastMode: mode,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
116
|
+
this.logger.error(`Failed to update last mode: ${message}`);
|
|
117
|
+
return { success: false, error: message };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async updateLastSession(sessionId) {
|
|
121
|
+
try {
|
|
122
|
+
const existing = await this.loadStateDocument();
|
|
123
|
+
if (existing) {
|
|
124
|
+
existing.project.lastSessionId = sessionId;
|
|
125
|
+
existing.updatedAt = new Date().toISOString();
|
|
126
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.PROJECT_METADATA);
|
|
127
|
+
await fs.writeFile(filePath, JSON.stringify(existing, null, 2), 'utf-8');
|
|
128
|
+
this.logger.debug(`Updated lastSessionId to ${sessionId}`);
|
|
129
|
+
return {
|
|
130
|
+
success: true,
|
|
131
|
+
message: `Last session updated to ${sessionId}`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const projectRoot = this.configService.getProjectRoot();
|
|
135
|
+
return this.saveProjectMetadata({
|
|
136
|
+
projectRoot,
|
|
137
|
+
detectedAt: new Date().toISOString(),
|
|
138
|
+
lastSessionId: sessionId,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
143
|
+
this.logger.error(`Failed to update last session: ${message}`);
|
|
144
|
+
return { success: false, error: message };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async saveModeConfigSnapshot(snapshot) {
|
|
148
|
+
try {
|
|
149
|
+
this.ensureStateDir();
|
|
150
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.MODE_CONFIG);
|
|
151
|
+
await fs.writeFile(filePath, JSON.stringify(snapshot, null, 2), 'utf-8');
|
|
152
|
+
this.logger.debug(`Saved mode config snapshot to ${filePath}`);
|
|
153
|
+
return { success: true, message: 'Mode config snapshot saved' };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
157
|
+
this.logger.error(`Failed to save mode config snapshot: ${message}`);
|
|
158
|
+
return { success: false, error: message };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async loadModeConfigSnapshot() {
|
|
162
|
+
try {
|
|
163
|
+
const filePath = this.getStateFilePath(state_types_1.STATE_FILES.MODE_CONFIG);
|
|
164
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
168
|
+
return JSON.parse(content);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
172
|
+
this.logger.error(`Failed to load mode config snapshot: ${message}`);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async clearState() {
|
|
177
|
+
try {
|
|
178
|
+
const stateDir = this.getStateDir();
|
|
179
|
+
const files = Object.values(state_types_1.STATE_FILES);
|
|
180
|
+
for (const fileName of files) {
|
|
181
|
+
const filePath = path.join(stateDir, fileName);
|
|
182
|
+
try {
|
|
183
|
+
await fs.unlink(filePath);
|
|
184
|
+
this.logger.debug(`Deleted state file: ${filePath}`);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (error.code !== 'ENOENT') {
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { success: true, message: 'State cleared' };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
196
|
+
this.logger.error(`Failed to clear state: ${message}`);
|
|
197
|
+
return { success: false, error: message };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async getLastMode() {
|
|
201
|
+
const metadata = await this.loadProjectMetadata();
|
|
202
|
+
return metadata?.lastMode ?? null;
|
|
203
|
+
}
|
|
204
|
+
async getLastSessionId() {
|
|
205
|
+
const metadata = await this.loadProjectMetadata();
|
|
206
|
+
return metadata?.lastSessionId ?? null;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
exports.StateService = StateService;
|
|
210
|
+
exports.StateService = StateService = StateService_1 = __decorate([
|
|
211
|
+
(0, common_1.Injectable)(),
|
|
212
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
213
|
+
], StateService);
|
|
214
|
+
//# sourceMappingURL=state.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.service.js","sourceRoot":"","sources":["../../../src/state/state.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Mode, KeywordModesConfig } from '../keyword/keyword.types';
|
|
2
|
+
export interface ModeConfigSnapshot {
|
|
3
|
+
config: KeywordModesConfig;
|
|
4
|
+
capturedAt: string;
|
|
5
|
+
source?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ProjectMetadata {
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
detectedAt: string;
|
|
10
|
+
configFile?: string;
|
|
11
|
+
lastMode?: Mode;
|
|
12
|
+
lastSessionId?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface StateDocument {
|
|
15
|
+
version: number;
|
|
16
|
+
project: ProjectMetadata;
|
|
17
|
+
modeConfig?: ModeConfigSnapshot;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface StateFileMeta {
|
|
21
|
+
path: string;
|
|
22
|
+
mtime: number;
|
|
23
|
+
}
|
|
24
|
+
export interface StateOperationResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
message?: string;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const STATE_SCHEMA_VERSION = 1;
|
|
30
|
+
export declare const STATE_DIR_NAME = ".codingbuddy/state";
|
|
31
|
+
export declare const STATE_FILES: {
|
|
32
|
+
readonly PROJECT_METADATA: "project-metadata.json";
|
|
33
|
+
readonly MODE_CONFIG: "mode-config-snapshot.json";
|
|
34
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STATE_FILES = exports.STATE_DIR_NAME = exports.STATE_SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.STATE_SCHEMA_VERSION = 1;
|
|
5
|
+
exports.STATE_DIR_NAME = '.codingbuddy/state';
|
|
6
|
+
exports.STATE_FILES = {
|
|
7
|
+
PROJECT_METADATA: 'project-metadata.json',
|
|
8
|
+
MODE_CONFIG: 'mode-config-snapshot.json',
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=state.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.types.js","sourceRoot":"","sources":["../../../src/state/state.types.ts"],"names":[],"mappings":";;;AAwEa,QAAA,oBAAoB,GAAG,CAAC,CAAC;AAKzB,QAAA,cAAc,GAAG,oBAAoB,CAAC;AAKtC,QAAA,WAAW,GAAG;IACzB,gBAAgB,EAAE,uBAAuB;IACzC,WAAW,EAAE,2BAA2B;CAChC,CAAC"}
|