claudia-orchestrator 0.1.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/LICENSE +201 -0
- package/README.md +109 -0
- package/dist/cli-parser.d.ts +11 -0
- package/dist/cli-parser.d.ts.map +1 -0
- package/dist/cli-parser.js +57 -0
- package/dist/cli-parser.js.map +1 -0
- package/dist/cui-server.d.ts +69 -0
- package/dist/cui-server.d.ts.map +1 -0
- package/dist/cui-server.js +705 -0
- package/dist/cui-server.js.map +1 -0
- package/dist/mcp-server/claudia-tools.d.ts +15 -0
- package/dist/mcp-server/claudia-tools.d.ts.map +1 -0
- package/dist/mcp-server/claudia-tools.js +366 -0
- package/dist/mcp-server/claudia-tools.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +176 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +18 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +136 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors-setup.d.ts +7 -0
- package/dist/middleware/cors-setup.d.ts.map +1 -0
- package/dist/middleware/cors-setup.js +8 -0
- package/dist/middleware/cors-setup.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +4 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +27 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/query-parser.d.ts +11 -0
- package/dist/middleware/query-parser.d.ts.map +1 -0
- package/dist/middleware/query-parser.js +68 -0
- package/dist/middleware/query-parser.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +4 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +29 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/process-daemon/index.d.ts +14 -0
- package/dist/process-daemon/index.d.ts.map +1 -0
- package/dist/process-daemon/index.js +51 -0
- package/dist/process-daemon/index.js.map +1 -0
- package/dist/process-daemon/process-daemon.d.ts +78 -0
- package/dist/process-daemon/process-daemon.d.ts.map +1 -0
- package/dist/process-daemon/process-daemon.js +568 -0
- package/dist/process-daemon/process-daemon.js.map +1 -0
- package/dist/process-daemon/process-manager-client.d.ts +108 -0
- package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-client.js +314 -0
- package/dist/process-daemon/process-manager-client.js.map +1 -0
- package/dist/process-daemon/process-manager-interface.d.ts +47 -0
- package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-interface.js +8 -0
- package/dist/process-daemon/process-manager-interface.js.map +1 -0
- package/dist/process-daemon/test-daemon.d.ts +12 -0
- package/dist/process-daemon/test-daemon.d.ts.map +1 -0
- package/dist/process-daemon/test-daemon.js +81 -0
- package/dist/process-daemon/test-daemon.js.map +1 -0
- package/dist/process-daemon/types.d.ts +85 -0
- package/dist/process-daemon/types.d.ts.map +1 -0
- package/dist/process-daemon/types.js +8 -0
- package/dist/process-daemon/types.js.map +1 -0
- package/dist/routes/claudia.routes.d.ts +10 -0
- package/dist/routes/claudia.routes.d.ts.map +1 -0
- package/dist/routes/claudia.routes.js +123 -0
- package/dist/routes/claudia.routes.js.map +1 -0
- package/dist/routes/config.routes.d.ts +4 -0
- package/dist/routes/config.routes.d.ts.map +1 -0
- package/dist/routes/config.routes.js +27 -0
- package/dist/routes/config.routes.js.map +1 -0
- package/dist/routes/conversation.routes.d.ts +8 -0
- package/dist/routes/conversation.routes.d.ts.map +1 -0
- package/dist/routes/conversation.routes.js +870 -0
- package/dist/routes/conversation.routes.js.map +1 -0
- package/dist/routes/filesystem.routes.d.ts +4 -0
- package/dist/routes/filesystem.routes.d.ts.map +1 -0
- package/dist/routes/filesystem.routes.js +86 -0
- package/dist/routes/filesystem.routes.js.map +1 -0
- package/dist/routes/gemini.routes.d.ts +4 -0
- package/dist/routes/gemini.routes.d.ts.map +1 -0
- package/dist/routes/gemini.routes.js +93 -0
- package/dist/routes/gemini.routes.js.map +1 -0
- package/dist/routes/insights.routes.d.ts +17 -0
- package/dist/routes/insights.routes.d.ts.map +1 -0
- package/dist/routes/insights.routes.js +417 -0
- package/dist/routes/insights.routes.js.map +1 -0
- package/dist/routes/license.routes.d.ts +3 -0
- package/dist/routes/license.routes.d.ts.map +1 -0
- package/dist/routes/license.routes.js +111 -0
- package/dist/routes/license.routes.js.map +1 -0
- package/dist/routes/log.routes.d.ts +3 -0
- package/dist/routes/log.routes.d.ts.map +1 -0
- package/dist/routes/log.routes.js +65 -0
- package/dist/routes/log.routes.js.map +1 -0
- package/dist/routes/notifications.routes.d.ts +4 -0
- package/dist/routes/notifications.routes.d.ts.map +1 -0
- package/dist/routes/notifications.routes.js +71 -0
- package/dist/routes/notifications.routes.js.map +1 -0
- package/dist/routes/permission.routes.d.ts +4 -0
- package/dist/routes/permission.routes.d.ts.map +1 -0
- package/dist/routes/permission.routes.js +116 -0
- package/dist/routes/permission.routes.js.map +1 -0
- package/dist/routes/question.routes.d.ts +8 -0
- package/dist/routes/question.routes.d.ts.map +1 -0
- package/dist/routes/question.routes.js +82 -0
- package/dist/routes/question.routes.js.map +1 -0
- package/dist/routes/streaming.routes.d.ts +4 -0
- package/dist/routes/streaming.routes.d.ts.map +1 -0
- package/dist/routes/streaming.routes.js +28 -0
- package/dist/routes/streaming.routes.js.map +1 -0
- package/dist/routes/system.routes.d.ts +5 -0
- package/dist/routes/system.routes.d.ts.map +1 -0
- package/dist/routes/system.routes.js +103 -0
- package/dist/routes/system.routes.js.map +1 -0
- package/dist/routes/working-directories.routes.d.ts +4 -0
- package/dist/routes/working-directories.routes.d.ts.map +1 -0
- package/dist/routes/working-directories.routes.js +25 -0
- package/dist/routes/working-directories.routes.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/services/ToolMetricsService.d.ts +53 -0
- package/dist/services/ToolMetricsService.d.ts.map +1 -0
- package/dist/services/ToolMetricsService.js +230 -0
- package/dist/services/ToolMetricsService.js.map +1 -0
- package/dist/services/anthropic-service.d.ts +186 -0
- package/dist/services/anthropic-service.d.ts.map +1 -0
- package/dist/services/anthropic-service.js +1132 -0
- package/dist/services/anthropic-service.js.map +1 -0
- package/dist/services/claude-history-reader.d.ts +126 -0
- package/dist/services/claude-history-reader.d.ts.map +1 -0
- package/dist/services/claude-history-reader.js +717 -0
- package/dist/services/claude-history-reader.js.map +1 -0
- package/dist/services/claude-process-manager.d.ts +108 -0
- package/dist/services/claude-process-manager.d.ts.map +1 -0
- package/dist/services/claude-process-manager.js +909 -0
- package/dist/services/claude-process-manager.js.map +1 -0
- package/dist/services/claude-router-service.d.ts +19 -0
- package/dist/services/claude-router-service.d.ts.map +1 -0
- package/dist/services/claude-router-service.js +160 -0
- package/dist/services/claude-router-service.js.map +1 -0
- package/dist/services/claudia-service.d.ts +77 -0
- package/dist/services/claudia-service.d.ts.map +1 -0
- package/dist/services/claudia-service.js +194 -0
- package/dist/services/claudia-service.js.map +1 -0
- package/dist/services/commands-service.d.ts +18 -0
- package/dist/services/commands-service.d.ts.map +1 -0
- package/dist/services/commands-service.js +76 -0
- package/dist/services/commands-service.js.map +1 -0
- package/dist/services/config-service.d.ts +68 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +429 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/conversation-cache.d.ts +86 -0
- package/dist/services/conversation-cache.d.ts.map +1 -0
- package/dist/services/conversation-cache.js +235 -0
- package/dist/services/conversation-cache.js.map +1 -0
- package/dist/services/conversation-status-manager.d.ts +98 -0
- package/dist/services/conversation-status-manager.d.ts.map +1 -0
- package/dist/services/conversation-status-manager.js +295 -0
- package/dist/services/conversation-status-manager.js.map +1 -0
- package/dist/services/cost-tracker.d.ts +87 -0
- package/dist/services/cost-tracker.d.ts.map +1 -0
- package/dist/services/cost-tracker.js +335 -0
- package/dist/services/cost-tracker.js.map +1 -0
- package/dist/services/file-system-service.d.ts +61 -0
- package/dist/services/file-system-service.d.ts.map +1 -0
- package/dist/services/file-system-service.js +348 -0
- package/dist/services/file-system-service.js.map +1 -0
- package/dist/services/gemini-service.d.ts +72 -0
- package/dist/services/gemini-service.d.ts.map +1 -0
- package/dist/services/gemini-service.js +431 -0
- package/dist/services/gemini-service.js.map +1 -0
- package/dist/services/insight-queue.d.ts +99 -0
- package/dist/services/insight-queue.d.ts.map +1 -0
- package/dist/services/insight-queue.js +277 -0
- package/dist/services/insight-queue.js.map +1 -0
- package/dist/services/insights-service.d.ts +102 -0
- package/dist/services/insights-service.d.ts.map +1 -0
- package/dist/services/insights-service.js +1152 -0
- package/dist/services/insights-service.js.map +1 -0
- package/dist/services/json-lines-parser.d.ts +19 -0
- package/dist/services/json-lines-parser.d.ts.map +1 -0
- package/dist/services/json-lines-parser.js +56 -0
- package/dist/services/json-lines-parser.js.map +1 -0
- package/dist/services/license-service.d.ts +69 -0
- package/dist/services/license-service.d.ts.map +1 -0
- package/dist/services/license-service.js +330 -0
- package/dist/services/license-service.js.map +1 -0
- package/dist/services/log-formatter.d.ts +5 -0
- package/dist/services/log-formatter.d.ts.map +1 -0
- package/dist/services/log-formatter.js +77 -0
- package/dist/services/log-formatter.js.map +1 -0
- package/dist/services/log-stream-buffer.d.ts +11 -0
- package/dist/services/log-stream-buffer.d.ts.map +1 -0
- package/dist/services/log-stream-buffer.js +36 -0
- package/dist/services/log-stream-buffer.js.map +1 -0
- package/dist/services/logger.d.ts +71 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +215 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/mcp-config-generator.d.ts +32 -0
- package/dist/services/mcp-config-generator.d.ts.map +1 -0
- package/dist/services/mcp-config-generator.js +126 -0
- package/dist/services/mcp-config-generator.js.map +1 -0
- package/dist/services/message-filter.d.ts +22 -0
- package/dist/services/message-filter.d.ts.map +1 -0
- package/dist/services/message-filter.js +57 -0
- package/dist/services/message-filter.js.map +1 -0
- package/dist/services/notification-service.d.ts +45 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/permission-tracker.d.ts +67 -0
- package/dist/services/permission-tracker.d.ts.map +1 -0
- package/dist/services/permission-tracker.js +161 -0
- package/dist/services/permission-tracker.js.map +1 -0
- package/dist/services/process-manager-factory.d.ts +81 -0
- package/dist/services/process-manager-factory.d.ts.map +1 -0
- package/dist/services/process-manager-factory.js +211 -0
- package/dist/services/process-manager-factory.js.map +1 -0
- package/dist/services/question-tracker.d.ts +47 -0
- package/dist/services/question-tracker.d.ts.map +1 -0
- package/dist/services/question-tracker.js +105 -0
- package/dist/services/question-tracker.js.map +1 -0
- package/dist/services/session-activity-watcher.d.ts +33 -0
- package/dist/services/session-activity-watcher.d.ts.map +1 -0
- package/dist/services/session-activity-watcher.js +194 -0
- package/dist/services/session-activity-watcher.js.map +1 -0
- package/dist/services/session-info-service.d.ts +228 -0
- package/dist/services/session-info-service.d.ts.map +1 -0
- package/dist/services/session-info-service.js +920 -0
- package/dist/services/session-info-service.js.map +1 -0
- package/dist/services/session-insights-service.d.ts +119 -0
- package/dist/services/session-insights-service.d.ts.map +1 -0
- package/dist/services/session-insights-service.js +889 -0
- package/dist/services/session-insights-service.js.map +1 -0
- package/dist/services/stream-manager.d.ts +62 -0
- package/dist/services/stream-manager.d.ts.map +1 -0
- package/dist/services/stream-manager.js +239 -0
- package/dist/services/stream-manager.js.map +1 -0
- package/dist/services/web-push-service.d.ts +48 -0
- package/dist/services/web-push-service.d.ts.map +1 -0
- package/dist/services/web-push-service.js +186 -0
- package/dist/services/web-push-service.js.map +1 -0
- package/dist/services/working-directories-service.d.ts +19 -0
- package/dist/services/working-directories-service.d.ts.map +1 -0
- package/dist/services/working-directories-service.js +103 -0
- package/dist/services/working-directories-service.js.map +1 -0
- package/dist/types/config.d.ts +111 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +14 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/express.d.ts +5 -0
- package/dist/types/express.d.ts.map +1 -0
- package/dist/types/express.js +2 -0
- package/dist/types/express.js.map +1 -0
- package/dist/types/index.d.ts +325 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/insights.d.ts +99 -0
- package/dist/types/insights.d.ts.map +1 -0
- package/dist/types/insights.js +7 -0
- package/dist/types/insights.js.map +1 -0
- package/dist/types/license.d.ts +70 -0
- package/dist/types/license.d.ts.map +1 -0
- package/dist/types/license.js +5 -0
- package/dist/types/license.js.map +1 -0
- package/dist/types/router-config.d.ts +13 -0
- package/dist/types/router-config.d.ts.map +1 -0
- package/dist/types/router-config.js +2 -0
- package/dist/types/router-config.js.map +1 -0
- package/dist/utils/constants.d.ts +26 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +28 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/machine-id.d.ts +7 -0
- package/dist/utils/machine-id.d.ts.map +1 -0
- package/dist/utils/machine-id.js +76 -0
- package/dist/utils/machine-id.js.map +1 -0
- package/dist/utils/server-startup.d.ts +13 -0
- package/dist/utils/server-startup.d.ts.map +1 -0
- package/dist/utils/server-startup.js +20 -0
- package/dist/utils/server-startup.js.map +1 -0
- package/dist/web/assets/main-DAc2rjJ2.css +1 -0
- package/dist/web/assets/main-DvlZ02mT.js +137 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/favicon.svg +22 -0
- package/dist/web/icon-192x192.png +0 -0
- package/dist/web/icon-512x512.png +0 -0
- package/dist/web/index.html +36 -0
- package/dist/web/manifest.json +61 -0
- package/package.json +174 -0
- package/scripts/postinstall.js +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-service.js","sourceRoot":"","sources":["../../src/services/commands-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CUIConfig } from '../types/config.js';
|
|
2
|
+
/**
|
|
3
|
+
* ConfigService manages Claudia configuration
|
|
4
|
+
* Loads from ~/.claudia/config.json
|
|
5
|
+
* Creates default config on first run
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConfigService {
|
|
8
|
+
private static instance;
|
|
9
|
+
private config;
|
|
10
|
+
private logger;
|
|
11
|
+
private configPath;
|
|
12
|
+
private configDir;
|
|
13
|
+
private emitter;
|
|
14
|
+
private watcher?;
|
|
15
|
+
private debounceTimer?;
|
|
16
|
+
private lastLoadedRaw?;
|
|
17
|
+
private pollInterval?;
|
|
18
|
+
private constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Get singleton instance
|
|
21
|
+
*/
|
|
22
|
+
static getInstance(): ConfigService;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize configuration
|
|
25
|
+
* Creates config file if it doesn't exist
|
|
26
|
+
* Throws error if initialization fails
|
|
27
|
+
*/
|
|
28
|
+
initialize(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get current configuration
|
|
31
|
+
* Throws if not initialized
|
|
32
|
+
*/
|
|
33
|
+
getConfig(): CUIConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Create default configuration
|
|
36
|
+
*/
|
|
37
|
+
private createDefaultConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Load configuration from file
|
|
40
|
+
*/
|
|
41
|
+
private loadConfig;
|
|
42
|
+
/**
|
|
43
|
+
* Update configuration
|
|
44
|
+
*/
|
|
45
|
+
updateConfig(updates: Partial<CUIConfig>): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Subscribe to configuration changes
|
|
48
|
+
*/
|
|
49
|
+
onChange(listener: (newConfig: CUIConfig, previous: CUIConfig | null, source: 'internal' | 'external') => void): void;
|
|
50
|
+
/**
|
|
51
|
+
* Validate provided fields in a partial config. Throws on incompatible values.
|
|
52
|
+
*/
|
|
53
|
+
private validateProvidedFields;
|
|
54
|
+
/**
|
|
55
|
+
* Validate a complete merged config before using it. Throws on error.
|
|
56
|
+
*/
|
|
57
|
+
private validateCompleteConfig;
|
|
58
|
+
private assertServerConfig;
|
|
59
|
+
private assertInterfaceConfig;
|
|
60
|
+
private assertRouterConfig;
|
|
61
|
+
private startWatching;
|
|
62
|
+
private handleExternalChange;
|
|
63
|
+
/**
|
|
64
|
+
* Reset singleton instance (for testing)
|
|
65
|
+
*/
|
|
66
|
+
static resetInstance(): void;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAiD,MAAM,mBAAmB,CAAC;AAO7F;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAAC,CAAyB;IACzC,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAiB;IAEtC,OAAO;IAMP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;OAGG;IACH,SAAS,IAAI,SAAS;IAOtB;;OAEG;YACW,mBAAmB;IAyCjC;;OAEG;YACW,UAAU;IAmDxB;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+D9D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,KAAK,IAAI,GAAG,IAAI;IAIrH;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,oBAAoB;IAwC5B;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;CAI7B"}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { DEFAULT_CONFIG } from '../types/config.js';
|
|
5
|
+
import { generateMachineId } from '../utils/machine-id.js';
|
|
6
|
+
import { CONFIG_DIR } from '../utils/constants.js';
|
|
7
|
+
import { createLogger } from './logger.js';
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
/**
|
|
10
|
+
* ConfigService manages Claudia configuration
|
|
11
|
+
* Loads from ~/.claudia/config.json
|
|
12
|
+
* Creates default config on first run
|
|
13
|
+
*/
|
|
14
|
+
export class ConfigService {
|
|
15
|
+
static instance;
|
|
16
|
+
config = null;
|
|
17
|
+
logger;
|
|
18
|
+
configPath;
|
|
19
|
+
configDir;
|
|
20
|
+
emitter = new EventEmitter();
|
|
21
|
+
watcher;
|
|
22
|
+
debounceTimer;
|
|
23
|
+
lastLoadedRaw;
|
|
24
|
+
pollInterval;
|
|
25
|
+
constructor() {
|
|
26
|
+
this.logger = createLogger('ConfigService');
|
|
27
|
+
this.configDir = CONFIG_DIR;
|
|
28
|
+
this.configPath = path.join(this.configDir, 'config.json');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get singleton instance
|
|
32
|
+
*/
|
|
33
|
+
static getInstance() {
|
|
34
|
+
if (!ConfigService.instance) {
|
|
35
|
+
ConfigService.instance = new ConfigService();
|
|
36
|
+
}
|
|
37
|
+
return ConfigService.instance;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Initialize configuration
|
|
41
|
+
* Creates config file if it doesn't exist
|
|
42
|
+
* Throws error if initialization fails
|
|
43
|
+
*/
|
|
44
|
+
async initialize() {
|
|
45
|
+
this.logger.info('Initializing configuration', { configPath: this.configPath });
|
|
46
|
+
try {
|
|
47
|
+
// Check if config exists
|
|
48
|
+
if (!fs.existsSync(this.configPath)) {
|
|
49
|
+
await this.createDefaultConfig();
|
|
50
|
+
}
|
|
51
|
+
// Load and validate config
|
|
52
|
+
await this.loadConfig();
|
|
53
|
+
// Start watching for external changes
|
|
54
|
+
this.startWatching();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
this.logger.error('Failed to initialize configuration', error);
|
|
58
|
+
throw new Error(`Configuration initialization failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get current configuration
|
|
63
|
+
* Throws if not initialized
|
|
64
|
+
*/
|
|
65
|
+
getConfig() {
|
|
66
|
+
if (!this.config) {
|
|
67
|
+
throw new Error('Configuration not initialized. Call initialize() first.');
|
|
68
|
+
}
|
|
69
|
+
return this.config;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create default configuration
|
|
73
|
+
*/
|
|
74
|
+
async createDefaultConfig() {
|
|
75
|
+
this.logger.info('Creating default configuration');
|
|
76
|
+
try {
|
|
77
|
+
// Ensure config directory exists
|
|
78
|
+
if (!fs.existsSync(this.configDir)) {
|
|
79
|
+
fs.mkdirSync(this.configDir, { recursive: true });
|
|
80
|
+
this.logger.debug('Created config directory', { dir: this.configDir });
|
|
81
|
+
}
|
|
82
|
+
// Generate machine ID
|
|
83
|
+
const machineId = await generateMachineId();
|
|
84
|
+
this.logger.debug('Generated machine ID', { machineId });
|
|
85
|
+
// Generate crypto-secure auth token
|
|
86
|
+
const authToken = crypto.randomBytes(16).toString('hex'); // 32 character hex string
|
|
87
|
+
this.logger.debug('Generated auth token', { tokenLength: authToken.length });
|
|
88
|
+
// Create default config
|
|
89
|
+
const config = {
|
|
90
|
+
machine_id: machineId,
|
|
91
|
+
authToken,
|
|
92
|
+
...DEFAULT_CONFIG
|
|
93
|
+
};
|
|
94
|
+
// Write config file
|
|
95
|
+
fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
96
|
+
this.logger.info('Default configuration created', {
|
|
97
|
+
path: this.configPath,
|
|
98
|
+
machineId: config.machine_id
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new Error(`Failed to create default config: ${error instanceof Error ? error.message : String(error)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Load configuration from file
|
|
107
|
+
*/
|
|
108
|
+
async loadConfig() {
|
|
109
|
+
try {
|
|
110
|
+
const configData = fs.readFileSync(this.configPath, 'utf-8');
|
|
111
|
+
let fileConfig;
|
|
112
|
+
try {
|
|
113
|
+
fileConfig = JSON.parse(configData);
|
|
114
|
+
}
|
|
115
|
+
catch (_parseError) {
|
|
116
|
+
// Corrupted JSON should fail startup
|
|
117
|
+
throw new Error('Invalid JSON in configuration file');
|
|
118
|
+
}
|
|
119
|
+
// Validate provided fields (strict for provided keys, allow missing)
|
|
120
|
+
this.validateProvidedFields(fileConfig);
|
|
121
|
+
// Merge with defaults for missing sections while preserving all existing fields (e.g., router)
|
|
122
|
+
let updated = false;
|
|
123
|
+
const merged = {
|
|
124
|
+
// Start with defaults
|
|
125
|
+
...DEFAULT_CONFIG,
|
|
126
|
+
// Bring over everything from file (including optional fields like router, gemini)
|
|
127
|
+
...fileConfig,
|
|
128
|
+
// Ensure required identifiers are set from file
|
|
129
|
+
machine_id: fileConfig.machine_id || (await generateMachineId()),
|
|
130
|
+
authToken: fileConfig.authToken || crypto.randomBytes(16).toString('hex'),
|
|
131
|
+
// Deep-merge known nested sections to ensure defaults are filled without dropping user values
|
|
132
|
+
server: { ...DEFAULT_CONFIG.server, ...(fileConfig.server || {}) },
|
|
133
|
+
interface: { ...DEFAULT_CONFIG.interface, ...(fileConfig.interface || {}) }
|
|
134
|
+
};
|
|
135
|
+
// Determine if we added any defaults and need to persist back to disk
|
|
136
|
+
if (!fileConfig.server || JSON.stringify(merged.server) !== JSON.stringify(fileConfig.server))
|
|
137
|
+
updated = true;
|
|
138
|
+
if (!fileConfig.interface || JSON.stringify(merged.interface) !== JSON.stringify(fileConfig.interface))
|
|
139
|
+
updated = true;
|
|
140
|
+
if (!fileConfig.machine_id)
|
|
141
|
+
updated = true;
|
|
142
|
+
if (!fileConfig.authToken)
|
|
143
|
+
updated = true;
|
|
144
|
+
// Final validation on fully merged config
|
|
145
|
+
this.validateCompleteConfig(merged);
|
|
146
|
+
this.config = merged;
|
|
147
|
+
this.lastLoadedRaw = JSON.stringify(this.config, null, 2);
|
|
148
|
+
if (updated) {
|
|
149
|
+
fs.writeFileSync(this.configPath, this.lastLoadedRaw, 'utf-8');
|
|
150
|
+
this.logger.info('Configuration updated with defaults');
|
|
151
|
+
}
|
|
152
|
+
this.logger.debug('Configuration loaded successfully');
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
throw new Error(`Failed to load config: ${error instanceof Error ? error.message : String(error)}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Update configuration
|
|
160
|
+
*/
|
|
161
|
+
async updateConfig(updates) {
|
|
162
|
+
if (!this.config) {
|
|
163
|
+
throw new Error('Configuration not initialized');
|
|
164
|
+
}
|
|
165
|
+
this.logger.info('Updating configuration', { updates });
|
|
166
|
+
// Create a new config via deep-merge semantics so unrelated options are preserved
|
|
167
|
+
const current = this.config;
|
|
168
|
+
const mergedServer = updates.server ? { ...current.server, ...updates.server } : current.server;
|
|
169
|
+
const mergedInterface = updates.interface
|
|
170
|
+
? {
|
|
171
|
+
...current.interface,
|
|
172
|
+
...updates.interface,
|
|
173
|
+
// Deep-merge nested notifications object if provided
|
|
174
|
+
notifications: updates.interface.notifications !== undefined
|
|
175
|
+
? { ...(current.interface.notifications || {}), ...updates.interface.notifications }
|
|
176
|
+
: current.interface.notifications
|
|
177
|
+
}
|
|
178
|
+
: current.interface;
|
|
179
|
+
const mergedRouter = updates.router
|
|
180
|
+
? { ...(current.router || {}), ...updates.router }
|
|
181
|
+
: current.router;
|
|
182
|
+
const mergedGemini = updates.gemini
|
|
183
|
+
? { ...(current.gemini || {}), ...updates.gemini }
|
|
184
|
+
: current.gemini;
|
|
185
|
+
const mergedAnthropic = updates.anthropic
|
|
186
|
+
? { ...(current.anthropic || {}), ...updates.anthropic }
|
|
187
|
+
: current.anthropic;
|
|
188
|
+
// Preserve machine_id and authToken regardless of updates
|
|
189
|
+
const newConfig = {
|
|
190
|
+
...current,
|
|
191
|
+
server: mergedServer,
|
|
192
|
+
interface: mergedInterface,
|
|
193
|
+
gemini: mergedGemini,
|
|
194
|
+
anthropic: mergedAnthropic,
|
|
195
|
+
router: mergedRouter
|
|
196
|
+
};
|
|
197
|
+
// Update in-memory config
|
|
198
|
+
const prev = this.config;
|
|
199
|
+
this.config = newConfig;
|
|
200
|
+
// Write to file
|
|
201
|
+
try {
|
|
202
|
+
this.lastLoadedRaw = JSON.stringify(this.config, null, 2);
|
|
203
|
+
fs.writeFileSync(this.configPath, this.lastLoadedRaw, 'utf-8');
|
|
204
|
+
this.logger.info('Configuration updated successfully');
|
|
205
|
+
// Emit change event for internal updates
|
|
206
|
+
this.emitter.emit('config-changed', this.config, prev, 'internal');
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
this.logger.error('Failed to update configuration', error);
|
|
210
|
+
throw new Error(`Failed to update config: ${error instanceof Error ? error.message : String(error)}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Subscribe to configuration changes
|
|
215
|
+
*/
|
|
216
|
+
onChange(listener) {
|
|
217
|
+
this.emitter.on('config-changed', listener);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Validate provided fields in a partial config. Throws on incompatible values.
|
|
221
|
+
*/
|
|
222
|
+
validateProvidedFields(partial) {
|
|
223
|
+
// server
|
|
224
|
+
if (partial.server) {
|
|
225
|
+
this.assertServerConfig(partial.server);
|
|
226
|
+
}
|
|
227
|
+
// interface
|
|
228
|
+
if (partial.interface) {
|
|
229
|
+
this.assertInterfaceConfig(partial.interface);
|
|
230
|
+
}
|
|
231
|
+
// router
|
|
232
|
+
if (partial.router) {
|
|
233
|
+
this.assertRouterConfig(partial.router);
|
|
234
|
+
}
|
|
235
|
+
// gemini (optional)
|
|
236
|
+
if (partial.gemini) {
|
|
237
|
+
if (partial.gemini.apiKey !== undefined && typeof partial.gemini.apiKey !== 'string') {
|
|
238
|
+
throw new Error('Invalid config: gemini.apiKey must be a string');
|
|
239
|
+
}
|
|
240
|
+
if (partial.gemini.model !== undefined && typeof partial.gemini.model !== 'string') {
|
|
241
|
+
throw new Error('Invalid config: gemini.model must be a string');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// anthropic (optional)
|
|
245
|
+
if (partial.anthropic) {
|
|
246
|
+
if (partial.anthropic.apiKey !== undefined && typeof partial.anthropic.apiKey !== 'string') {
|
|
247
|
+
throw new Error('Invalid config: anthropic.apiKey must be a string');
|
|
248
|
+
}
|
|
249
|
+
if (partial.anthropic.model !== undefined && typeof partial.anthropic.model !== 'string') {
|
|
250
|
+
throw new Error('Invalid config: anthropic.model must be a string');
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// machine_id/authToken if present must be strings
|
|
254
|
+
if (partial.machine_id !== undefined && typeof partial.machine_id !== 'string') {
|
|
255
|
+
throw new Error('Invalid config: machine_id must be a string');
|
|
256
|
+
}
|
|
257
|
+
if (partial.authToken !== undefined && typeof partial.authToken !== 'string') {
|
|
258
|
+
throw new Error('Invalid config: authToken must be a string');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Validate a complete merged config before using it. Throws on error.
|
|
263
|
+
*/
|
|
264
|
+
validateCompleteConfig(config) {
|
|
265
|
+
// Required top-level values
|
|
266
|
+
if (!config.machine_id || typeof config.machine_id !== 'string') {
|
|
267
|
+
throw new Error('Invalid config: missing machine_id');
|
|
268
|
+
}
|
|
269
|
+
this.assertServerConfig(config.server);
|
|
270
|
+
if (!config.authToken || typeof config.authToken !== 'string') {
|
|
271
|
+
throw new Error('Invalid config: missing authToken');
|
|
272
|
+
}
|
|
273
|
+
if (config.interface) {
|
|
274
|
+
this.assertInterfaceConfig(config.interface);
|
|
275
|
+
}
|
|
276
|
+
if (config.router) {
|
|
277
|
+
this.assertRouterConfig(config.router);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
assertServerConfig(server) {
|
|
281
|
+
if (server.host !== undefined && typeof server.host !== 'string') {
|
|
282
|
+
throw new Error('Invalid config: server.host must be a string');
|
|
283
|
+
}
|
|
284
|
+
if (server.port !== undefined && typeof server.port !== 'number') {
|
|
285
|
+
throw new Error('Invalid config: server.port must be a number');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
assertInterfaceConfig(iface) {
|
|
289
|
+
if (iface.colorScheme !== undefined && !['light', 'dark', 'system'].includes(iface.colorScheme)) {
|
|
290
|
+
throw new Error("Invalid config: interface.colorScheme must be 'light' | 'dark' | 'system'");
|
|
291
|
+
}
|
|
292
|
+
if (iface.language !== undefined && typeof iface.language !== 'string') {
|
|
293
|
+
throw new Error('Invalid config: interface.language must be a string');
|
|
294
|
+
}
|
|
295
|
+
if (iface.notifications !== undefined) {
|
|
296
|
+
const n = iface.notifications;
|
|
297
|
+
if (n && typeof n.enabled !== 'boolean') {
|
|
298
|
+
throw new Error('Invalid config: interface.notifications.enabled must be a boolean');
|
|
299
|
+
}
|
|
300
|
+
if (n && n.ntfyUrl !== undefined && typeof n.ntfyUrl !== 'string') {
|
|
301
|
+
throw new Error('Invalid config: interface.notifications.ntfyUrl must be a string');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
assertRouterConfig(router) {
|
|
306
|
+
if (router.enabled !== undefined && typeof router.enabled !== 'boolean') {
|
|
307
|
+
throw new Error('Invalid config: router.enabled must be a boolean');
|
|
308
|
+
}
|
|
309
|
+
if (router.providers !== undefined) {
|
|
310
|
+
if (!Array.isArray(router.providers)) {
|
|
311
|
+
throw new Error('Invalid config: router.providers must be an array');
|
|
312
|
+
}
|
|
313
|
+
for (const p of router.providers) {
|
|
314
|
+
if (p.name !== undefined && typeof p.name !== 'string')
|
|
315
|
+
throw new Error('Invalid config: router.providers[].name must be a string');
|
|
316
|
+
if (p.api_base_url !== undefined && typeof p.api_base_url !== 'string')
|
|
317
|
+
throw new Error('Invalid config: router.providers[].api_base_url must be a string');
|
|
318
|
+
if (p.api_key !== undefined && typeof p.api_key !== 'string')
|
|
319
|
+
throw new Error('Invalid config: router.providers[].api_key must be a string');
|
|
320
|
+
if (p.models !== undefined && !Array.isArray(p.models))
|
|
321
|
+
throw new Error('Invalid config: router.providers[].models must be an array of strings');
|
|
322
|
+
if (Array.isArray(p.models)) {
|
|
323
|
+
for (const m of p.models) {
|
|
324
|
+
if (typeof m !== 'string')
|
|
325
|
+
throw new Error('Invalid config: router.providers[].models must contain strings');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (router.rules !== undefined) {
|
|
331
|
+
if (typeof router.rules !== 'object' || router.rules === null || Array.isArray(router.rules)) {
|
|
332
|
+
throw new Error('Invalid config: router.rules must be an object of string values');
|
|
333
|
+
}
|
|
334
|
+
for (const [k, v] of Object.entries(router.rules)) {
|
|
335
|
+
if (typeof v !== 'string')
|
|
336
|
+
throw new Error(`Invalid config: router.rules['${k}'] must be a string`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
startWatching() {
|
|
341
|
+
// Avoid multiple watchers in tests
|
|
342
|
+
if (this.watcher)
|
|
343
|
+
return;
|
|
344
|
+
try {
|
|
345
|
+
// Increase listeners to avoid noisy warnings in tests with many server instances
|
|
346
|
+
this.emitter.setMaxListeners(0);
|
|
347
|
+
if (process.env.NODE_ENV === 'test') {
|
|
348
|
+
// Use active polling in tests to avoid fs watcher flakiness with fake timers
|
|
349
|
+
this.pollInterval = setInterval(() => {
|
|
350
|
+
try {
|
|
351
|
+
const raw = fs.readFileSync(this.configPath, 'utf-8');
|
|
352
|
+
if (!this.lastLoadedRaw || raw !== this.lastLoadedRaw) {
|
|
353
|
+
// Debounce within polling
|
|
354
|
+
if (this.debounceTimer)
|
|
355
|
+
clearTimeout(this.debounceTimer);
|
|
356
|
+
this.debounceTimer = setTimeout(() => this.handleExternalChange(), 10);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
// ignore
|
|
361
|
+
}
|
|
362
|
+
}, 50);
|
|
363
|
+
this.logger.debug('Started interval polling for configuration changes (test mode)');
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
this.watcher = fs.watch(this.configPath, { persistent: false }, (eventType) => {
|
|
367
|
+
if (eventType !== 'change' && eventType !== 'rename')
|
|
368
|
+
return;
|
|
369
|
+
if (this.debounceTimer)
|
|
370
|
+
clearTimeout(this.debounceTimer);
|
|
371
|
+
this.debounceTimer = setTimeout(() => this.handleExternalChange(), 250);
|
|
372
|
+
});
|
|
373
|
+
this.logger.debug('Started watching configuration file for changes');
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
this.logger.warn('Failed to start file watcher for configuration', error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
handleExternalChange() {
|
|
381
|
+
try {
|
|
382
|
+
const newRaw = fs.readFileSync(this.configPath, 'utf-8');
|
|
383
|
+
if (this.lastLoadedRaw && newRaw === this.lastLoadedRaw) {
|
|
384
|
+
return; // No effective change
|
|
385
|
+
}
|
|
386
|
+
let parsed;
|
|
387
|
+
try {
|
|
388
|
+
parsed = JSON.parse(newRaw);
|
|
389
|
+
}
|
|
390
|
+
catch (_e) {
|
|
391
|
+
this.logger.error('Ignoring external config change due to invalid JSON');
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
// Validate provided fields strictly
|
|
395
|
+
this.validateProvidedFields(parsed);
|
|
396
|
+
// Merge and validate complete
|
|
397
|
+
const current = this.config || { ...DEFAULT_CONFIG, machine_id: '', authToken: '' };
|
|
398
|
+
const merged = {
|
|
399
|
+
...DEFAULT_CONFIG,
|
|
400
|
+
...current,
|
|
401
|
+
...parsed,
|
|
402
|
+
server: { ...DEFAULT_CONFIG.server, ...(current.server || {}), ...(parsed.server || {}) },
|
|
403
|
+
interface: { ...DEFAULT_CONFIG.interface, ...(current.interface || {}), ...(parsed.interface || {}) },
|
|
404
|
+
router: parsed.router !== undefined ? parsed.router : current.router,
|
|
405
|
+
gemini: parsed.gemini !== undefined ? parsed.gemini : current.gemini,
|
|
406
|
+
anthropic: parsed.anthropic !== undefined ? parsed.anthropic : current.anthropic,
|
|
407
|
+
machine_id: parsed.machine_id || current.machine_id,
|
|
408
|
+
authToken: parsed.authToken || current.authToken
|
|
409
|
+
};
|
|
410
|
+
this.validateCompleteConfig(merged);
|
|
411
|
+
const prev = this.config;
|
|
412
|
+
this.config = merged;
|
|
413
|
+
this.lastLoadedRaw = JSON.stringify(merged, null, 2);
|
|
414
|
+
this.logger.info('Configuration reloaded from external change');
|
|
415
|
+
this.emitter.emit('config-changed', this.config, prev || null, 'external');
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
this.logger.error('Failed to handle external configuration change', error);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Reset singleton instance (for testing)
|
|
423
|
+
*/
|
|
424
|
+
static resetInstance() {
|
|
425
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
426
|
+
ConfigService.instance = null;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=config-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ConversationMessage } from '../types/index.js';
|
|
2
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
3
|
+
export interface ConversationChain {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
messages: ConversationMessage[];
|
|
6
|
+
projectPath: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
updatedAt: string;
|
|
10
|
+
totalDuration: number;
|
|
11
|
+
model: string;
|
|
12
|
+
}
|
|
13
|
+
interface RawJsonEntry {
|
|
14
|
+
type: string;
|
|
15
|
+
uuid?: string;
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
parentUuid?: string;
|
|
18
|
+
timestamp?: string;
|
|
19
|
+
message?: Anthropic.Message | Anthropic.MessageParam;
|
|
20
|
+
cwd?: string;
|
|
21
|
+
durationMs?: number;
|
|
22
|
+
isSidechain?: boolean;
|
|
23
|
+
userType?: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
summary?: string;
|
|
26
|
+
leafUuid?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Service for managing conversation cache with file modification tracking
|
|
30
|
+
*/
|
|
31
|
+
export declare class ConversationCache {
|
|
32
|
+
private cache;
|
|
33
|
+
private logger;
|
|
34
|
+
private parsingPromises;
|
|
35
|
+
constructor();
|
|
36
|
+
/**
|
|
37
|
+
* Clear the conversation cache to force a refresh on next read
|
|
38
|
+
*/
|
|
39
|
+
clear(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get cached file entries, combining cached and newly parsed entries
|
|
42
|
+
*/
|
|
43
|
+
getCachedFileEntries(currentFileModTimes: Map<string, number>, parseFileFunction: (filePath: string) => Promise<RawJsonEntry[]>, getSourceProject: (filePath: string) => string): Promise<(RawJsonEntry & {
|
|
44
|
+
sourceProject: string;
|
|
45
|
+
})[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Update a specific file's cache entry
|
|
48
|
+
*/
|
|
49
|
+
updateFileCache(filePath: string, entries: RawJsonEntry[], mtime: number, sourceProject: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Clear cache entry for a specific file
|
|
52
|
+
*/
|
|
53
|
+
clearFileCache(filePath: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a specific file's cache entry is valid
|
|
56
|
+
*/
|
|
57
|
+
isFileCacheValid(filePath: string, currentMtime: number): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get or parse conversations with file-level caching and concurrency protection
|
|
60
|
+
*/
|
|
61
|
+
getOrParseConversations(currentFileModTimes: Map<string, number>, parseFileFunction: (filePath: string) => Promise<RawJsonEntry[]>, getSourceProject: (filePath: string) => string, processAllEntries: (allEntries: (RawJsonEntry & {
|
|
62
|
+
sourceProject: string;
|
|
63
|
+
})[]) => ConversationChain[]): Promise<ConversationChain[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Execute file-based parsing with proper logging
|
|
66
|
+
*/
|
|
67
|
+
private executeFileBasedParsing;
|
|
68
|
+
/**
|
|
69
|
+
* Get cache statistics for monitoring
|
|
70
|
+
*/
|
|
71
|
+
getStats(): {
|
|
72
|
+
isLoaded: boolean;
|
|
73
|
+
cachedFileCount: number;
|
|
74
|
+
totalCachedEntries: number;
|
|
75
|
+
lastCacheTime: number | null;
|
|
76
|
+
cacheAge: number | null;
|
|
77
|
+
isCurrentlyParsing: boolean;
|
|
78
|
+
fileCacheDetails: {
|
|
79
|
+
filePath: string;
|
|
80
|
+
entryCount: number;
|
|
81
|
+
mtime: string;
|
|
82
|
+
}[];
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=conversation-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-cache.d.ts","sourceRoot":"","sources":["../../src/services/conversation-cache.ts"],"names":[],"mappings":"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"}
|