@mako10k/shell-server 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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/backoffice/index.d.ts +2 -0
  4. package/dist/backoffice/index.d.ts.map +1 -0
  5. package/dist/backoffice/index.js +47 -0
  6. package/dist/backoffice/index.js.map +1 -0
  7. package/dist/backoffice/server.d.ts +45 -0
  8. package/dist/backoffice/server.d.ts.map +1 -0
  9. package/dist/backoffice/server.js +610 -0
  10. package/dist/backoffice/server.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +525 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/core/config-manager.d.ts +80 -0
  16. package/dist/core/config-manager.d.ts.map +1 -0
  17. package/dist/core/config-manager.js +218 -0
  18. package/dist/core/config-manager.js.map +1 -0
  19. package/dist/core/enhanced-history-manager.d.ts +84 -0
  20. package/dist/core/enhanced-history-manager.d.ts.map +1 -0
  21. package/dist/core/enhanced-history-manager.js +319 -0
  22. package/dist/core/enhanced-history-manager.js.map +1 -0
  23. package/dist/core/file-manager.d.ts +79 -0
  24. package/dist/core/file-manager.d.ts.map +1 -0
  25. package/dist/core/file-manager.js +338 -0
  26. package/dist/core/file-manager.js.map +1 -0
  27. package/dist/core/file-storage-subscriber.d.ts +38 -0
  28. package/dist/core/file-storage-subscriber.d.ts.map +1 -0
  29. package/dist/core/file-storage-subscriber.js +132 -0
  30. package/dist/core/file-storage-subscriber.js.map +1 -0
  31. package/dist/core/monitoring-manager.d.ts +32 -0
  32. package/dist/core/monitoring-manager.d.ts.map +1 -0
  33. package/dist/core/monitoring-manager.js +296 -0
  34. package/dist/core/monitoring-manager.js.map +1 -0
  35. package/dist/core/process-manager.d.ts +105 -0
  36. package/dist/core/process-manager.d.ts.map +1 -0
  37. package/dist/core/process-manager.js +1374 -0
  38. package/dist/core/process-manager.js.map +1 -0
  39. package/dist/core/realtime-stream-subscriber.d.ts +93 -0
  40. package/dist/core/realtime-stream-subscriber.d.ts.map +1 -0
  41. package/dist/core/realtime-stream-subscriber.js +200 -0
  42. package/dist/core/realtime-stream-subscriber.js.map +1 -0
  43. package/dist/core/remote-http-client.d.ts +15 -0
  44. package/dist/core/remote-http-client.d.ts.map +1 -0
  45. package/dist/core/remote-http-client.js +60 -0
  46. package/dist/core/remote-http-client.js.map +1 -0
  47. package/dist/core/remote-process-service.d.ts +50 -0
  48. package/dist/core/remote-process-service.d.ts.map +1 -0
  49. package/dist/core/remote-process-service.js +20 -0
  50. package/dist/core/remote-process-service.js.map +1 -0
  51. package/dist/core/server-manager.d.ts +71 -0
  52. package/dist/core/server-manager.d.ts.map +1 -0
  53. package/dist/core/server-manager.js +680 -0
  54. package/dist/core/server-manager.js.map +1 -0
  55. package/dist/core/stream-publisher.d.ts +75 -0
  56. package/dist/core/stream-publisher.d.ts.map +1 -0
  57. package/dist/core/stream-publisher.js +127 -0
  58. package/dist/core/stream-publisher.js.map +1 -0
  59. package/dist/core/streaming-pipeline-reader.d.ts +67 -0
  60. package/dist/core/streaming-pipeline-reader.d.ts.map +1 -0
  61. package/dist/core/streaming-pipeline-reader.js +191 -0
  62. package/dist/core/streaming-pipeline-reader.js.map +1 -0
  63. package/dist/core/terminal-manager.d.ts +96 -0
  64. package/dist/core/terminal-manager.d.ts.map +1 -0
  65. package/dist/core/terminal-manager.js +515 -0
  66. package/dist/core/terminal-manager.js.map +1 -0
  67. package/dist/daemon/server.d.ts +8 -0
  68. package/dist/daemon/server.d.ts.map +1 -0
  69. package/dist/daemon/server.js +416 -0
  70. package/dist/daemon/server.js.map +1 -0
  71. package/dist/daemon/uds-transport.d.ts +31 -0
  72. package/dist/daemon/uds-transport.d.ts.map +1 -0
  73. package/dist/daemon/uds-transport.js +149 -0
  74. package/dist/daemon/uds-transport.js.map +1 -0
  75. package/dist/executor/server.d.ts +20 -0
  76. package/dist/executor/server.d.ts.map +1 -0
  77. package/dist/executor/server.js +375 -0
  78. package/dist/executor/server.js.map +1 -0
  79. package/dist/index.d.ts +2 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +73 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/runtime/daemon-runtime.d.ts +4 -0
  84. package/dist/runtime/daemon-runtime.d.ts.map +1 -0
  85. package/dist/runtime/daemon-runtime.js +4 -0
  86. package/dist/runtime/daemon-runtime.js.map +1 -0
  87. package/dist/runtime/index.d.ts +3 -0
  88. package/dist/runtime/index.d.ts.map +1 -0
  89. package/dist/runtime/index.js +3 -0
  90. package/dist/runtime/index.js.map +1 -0
  91. package/dist/runtime/tool-runtime.d.ts +52 -0
  92. package/dist/runtime/tool-runtime.d.ts.map +1 -0
  93. package/dist/runtime/tool-runtime.js +161 -0
  94. package/dist/runtime/tool-runtime.js.map +1 -0
  95. package/dist/security/chat-completion-adapter.d.ts +443 -0
  96. package/dist/security/chat-completion-adapter.d.ts.map +1 -0
  97. package/dist/security/chat-completion-adapter.js +475 -0
  98. package/dist/security/chat-completion-adapter.js.map +1 -0
  99. package/dist/security/enhanced-evaluator.d.ts +139 -0
  100. package/dist/security/enhanced-evaluator.d.ts.map +1 -0
  101. package/dist/security/enhanced-evaluator.js +1208 -0
  102. package/dist/security/enhanced-evaluator.js.map +1 -0
  103. package/dist/security/evaluator-types.d.ts +614 -0
  104. package/dist/security/evaluator-types.d.ts.map +1 -0
  105. package/dist/security/evaluator-types.js +124 -0
  106. package/dist/security/evaluator-types.js.map +1 -0
  107. package/dist/security/manager.d.ts +76 -0
  108. package/dist/security/manager.d.ts.map +1 -0
  109. package/dist/security/manager.js +445 -0
  110. package/dist/security/manager.js.map +1 -0
  111. package/dist/security/security-llm-prompt-generator.d.ts +105 -0
  112. package/dist/security/security-llm-prompt-generator.d.ts.map +1 -0
  113. package/dist/security/security-llm-prompt-generator.js +323 -0
  114. package/dist/security/security-llm-prompt-generator.js.map +1 -0
  115. package/dist/security/security-tools.d.ts +174 -0
  116. package/dist/security/security-tools.d.ts.map +1 -0
  117. package/dist/security/security-tools.js +159 -0
  118. package/dist/security/security-tools.js.map +1 -0
  119. package/dist/security/validator-criteria-manager.d.ts +47 -0
  120. package/dist/security/validator-criteria-manager.d.ts.map +1 -0
  121. package/dist/security/validator-criteria-manager.js +169 -0
  122. package/dist/security/validator-criteria-manager.js.map +1 -0
  123. package/dist/tools/shell-tools.d.ts +474 -0
  124. package/dist/tools/shell-tools.d.ts.map +1 -0
  125. package/dist/tools/shell-tools.js +861 -0
  126. package/dist/tools/shell-tools.js.map +1 -0
  127. package/dist/types/enhanced-security.d.ts +529 -0
  128. package/dist/types/enhanced-security.d.ts.map +1 -0
  129. package/dist/types/enhanced-security.js +286 -0
  130. package/dist/types/enhanced-security.js.map +1 -0
  131. package/dist/types/index.d.ts +282 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +158 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/types/quick-schemas.d.ts +177 -0
  136. package/dist/types/quick-schemas.d.ts.map +1 -0
  137. package/dist/types/quick-schemas.js +113 -0
  138. package/dist/types/quick-schemas.js.map +1 -0
  139. package/dist/types/response-schemas.d.ts +41 -0
  140. package/dist/types/response-schemas.d.ts.map +1 -0
  141. package/dist/types/response-schemas.js +41 -0
  142. package/dist/types/response-schemas.js.map +1 -0
  143. package/dist/types/schemas.d.ts +578 -0
  144. package/dist/types/schemas.d.ts.map +1 -0
  145. package/dist/types/schemas.js +498 -0
  146. package/dist/types/schemas.js.map +1 -0
  147. package/dist/utils/criteria-manager.d.ts +47 -0
  148. package/dist/utils/criteria-manager.d.ts.map +1 -0
  149. package/dist/utils/criteria-manager.js +228 -0
  150. package/dist/utils/criteria-manager.js.map +1 -0
  151. package/dist/utils/errors.d.ts +27 -0
  152. package/dist/utils/errors.d.ts.map +1 -0
  153. package/dist/utils/errors.js +67 -0
  154. package/dist/utils/errors.js.map +1 -0
  155. package/dist/utils/helpers.d.ts +85 -0
  156. package/dist/utils/helpers.d.ts.map +1 -0
  157. package/dist/utils/helpers.js +400 -0
  158. package/dist/utils/helpers.js.map +1 -0
  159. package/dist/utils/json-repair.d.ts +23 -0
  160. package/dist/utils/json-repair.d.ts.map +1 -0
  161. package/dist/utils/json-repair.js +208 -0
  162. package/dist/utils/json-repair.js.map +1 -0
  163. package/dist/utils/process-utils.d.ts +31 -0
  164. package/dist/utils/process-utils.d.ts.map +1 -0
  165. package/dist/utils/process-utils.js +217 -0
  166. package/dist/utils/process-utils.js.map +1 -0
  167. package/dist/utils/server-helpers.d.ts +4 -0
  168. package/dist/utils/server-helpers.d.ts.map +1 -0
  169. package/dist/utils/server-helpers.js +10 -0
  170. package/dist/utils/server-helpers.js.map +1 -0
  171. package/dist/utils/sse.d.ts +2 -0
  172. package/dist/utils/sse.d.ts.map +1 -0
  173. package/dist/utils/sse.js +6 -0
  174. package/dist/utils/sse.js.map +1 -0
  175. package/package.json +47 -0
@@ -0,0 +1,79 @@
1
+ import { FileInfo, OutputType } from '../types/index.js';
2
+ export declare class FileManager {
3
+ private files;
4
+ private readonly baseDir;
5
+ private readonly maxFiles;
6
+ constructor(baseDir?: string, maxFiles?: number);
7
+ private initializeBaseDirectorySync;
8
+ registerFile(filePath: string, outputType: OutputType, executionId?: string, customName?: string): Promise<string>;
9
+ createOutputFile(content: string, executionId?: string): Promise<string>;
10
+ createLogFile(content: string, executionId?: string): Promise<string>;
11
+ createTempFile(content: string, extension?: string): Promise<string>;
12
+ getFile(outputId: string): FileInfo;
13
+ readFile(outputId: string, offset?: number, size?: number, encoding?: BufferEncoding): Promise<{
14
+ output_id: string;
15
+ content: string;
16
+ size: number;
17
+ total_size: number;
18
+ is_truncated: boolean;
19
+ encoding: string;
20
+ }>;
21
+ listFiles(filter?: {
22
+ outputType?: OutputType | 'all';
23
+ executionId?: string;
24
+ namePattern?: string;
25
+ limit?: number;
26
+ }): {
27
+ files: FileInfo[];
28
+ total_count: number;
29
+ };
30
+ deleteFiles(outputIds: string[], confirm: boolean): Promise<{
31
+ deleted_files: string[];
32
+ failed_files: string[];
33
+ total_deleted: number;
34
+ }>;
35
+ private cleanupOldFiles;
36
+ deleteExecutionFiles(executionId: string): Promise<number>;
37
+ getUsageStats(): {
38
+ total_files: number;
39
+ files_by_type: Record<OutputType, number>;
40
+ total_size_bytes: number;
41
+ average_file_size: number;
42
+ };
43
+ cleanup(): Promise<void>;
44
+ /**
45
+ * Issue #13: output_idから実行IDを取得
46
+ */
47
+ getExecutionIdByOutputId(outputId: string): string | undefined;
48
+ /**
49
+ * Issue #15: ディレクトリサイズベースのクリーンアップ提案
50
+ */
51
+ getCleanupSuggestions(options?: {
52
+ maxSizeMB?: number;
53
+ maxAgeHours?: number;
54
+ includeWarnings?: boolean;
55
+ }): Promise<{
56
+ current_directory_size_mb: number;
57
+ current_file_count: number;
58
+ recommendations?: {
59
+ warning?: string;
60
+ suggested_action?: string;
61
+ cleanup_candidates: string[];
62
+ estimated_savings_mb: number;
63
+ };
64
+ }>;
65
+ /**
66
+ * Issue #15: 年齢ベースの自動クリーンアップ
67
+ */
68
+ performAutoCleanup(options?: {
69
+ maxAgeHours?: number;
70
+ dryRun?: boolean;
71
+ preserveRecent?: number;
72
+ }): Promise<{
73
+ deleted_files: string[];
74
+ preserved_files: string[];
75
+ space_freed_mb: number;
76
+ dry_run: boolean;
77
+ }>;
78
+ }
79
+ //# sourceMappingURL=file-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.d.ts","sourceRoot":"","sources":["../../src/core/file-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { generateId, getCurrentTimestamp, getFileSize, safeReadFile, ensureDirectorySync, } from '../utils/helpers.js';
4
+ import { ResourceNotFoundError } from '../utils/errors.js';
5
+ export class FileManager {
6
+ files = new Map();
7
+ baseDir;
8
+ maxFiles;
9
+ constructor(baseDir = '/tmp/mcp-shell-files', maxFiles = 10000) {
10
+ this.baseDir = baseDir;
11
+ this.maxFiles = maxFiles;
12
+ this.initializeBaseDirectorySync();
13
+ }
14
+ initializeBaseDirectorySync() {
15
+ ensureDirectorySync(this.baseDir);
16
+ ensureDirectorySync(path.join(this.baseDir, 'output'));
17
+ ensureDirectorySync(path.join(this.baseDir, 'log'));
18
+ ensureDirectorySync(path.join(this.baseDir, 'temp'));
19
+ }
20
+ async registerFile(filePath, outputType, executionId, customName) {
21
+ // ファイル数の制限チェック
22
+ if (this.files.size >= this.maxFiles) {
23
+ // 古いファイルを自動削除
24
+ await this.cleanupOldFiles(100);
25
+ }
26
+ const outputId = generateId();
27
+ const size = await getFileSize(filePath);
28
+ const fileName = customName || path.basename(filePath);
29
+ const fileInfo = {
30
+ output_id: outputId,
31
+ output_type: outputType,
32
+ name: fileName,
33
+ size,
34
+ created_at: getCurrentTimestamp(),
35
+ path: filePath,
36
+ };
37
+ if (executionId) {
38
+ fileInfo.execution_id = executionId;
39
+ }
40
+ this.files.set(outputId, fileInfo);
41
+ return outputId;
42
+ }
43
+ async createOutputFile(content, executionId) {
44
+ const outputId = generateId();
45
+ const fileName = `output_${outputId}.txt`;
46
+ const filePath = path.join(this.baseDir, 'output', fileName);
47
+ await fs.writeFile(filePath, content, 'utf-8');
48
+ return await this.registerFile(filePath, 'combined', executionId, fileName);
49
+ }
50
+ async createLogFile(content, executionId) {
51
+ const outputId = generateId();
52
+ const fileName = `log_${outputId}.log`;
53
+ const filePath = path.join(this.baseDir, 'log', fileName);
54
+ await fs.writeFile(filePath, content, 'utf-8');
55
+ return await this.registerFile(filePath, 'log', executionId, fileName);
56
+ }
57
+ async createTempFile(content, extension = '.tmp') {
58
+ const outputId = generateId();
59
+ const fileName = `temp_${outputId}${extension}`;
60
+ const filePath = path.join(this.baseDir, 'temp', fileName);
61
+ await fs.writeFile(filePath, content, 'utf-8');
62
+ return await this.registerFile(filePath, 'log', undefined, fileName);
63
+ }
64
+ getFile(outputId) {
65
+ const fileInfo = this.files.get(outputId);
66
+ if (!fileInfo) {
67
+ throw new ResourceNotFoundError('file', outputId);
68
+ }
69
+ return { ...fileInfo };
70
+ }
71
+ async readFile(outputId, offset = 0, size = 8192, encoding = 'utf-8') {
72
+ const fileInfo = this.getFile(outputId);
73
+ try {
74
+ const { content, totalSize, isTruncated } = await safeReadFile(fileInfo.path, offset, size, encoding);
75
+ return {
76
+ output_id: outputId,
77
+ content,
78
+ size: content.length,
79
+ total_size: totalSize,
80
+ is_truncated: isTruncated,
81
+ encoding,
82
+ };
83
+ }
84
+ catch (error) {
85
+ throw new Error(`Failed to read file ${outputId}: ${error}`);
86
+ }
87
+ }
88
+ listFiles(filter) {
89
+ let files = Array.from(this.files.values());
90
+ // フィルタリング
91
+ if (filter) {
92
+ if (filter.outputType && filter.outputType !== 'all') {
93
+ files = files.filter((file) => file.output_type === filter.outputType);
94
+ }
95
+ if (filter.executionId) {
96
+ files = files.filter((file) => file.execution_id === filter.executionId);
97
+ }
98
+ if (filter.namePattern) {
99
+ const pattern = new RegExp(filter.namePattern, 'i');
100
+ files = files.filter((file) => pattern.test(file.name));
101
+ }
102
+ }
103
+ const totalCount = files.length;
104
+ // 制限
105
+ if (filter?.limit) {
106
+ files = files.slice(0, filter.limit);
107
+ }
108
+ // 作成日時でソート(新しい順)
109
+ files.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
110
+ return {
111
+ files: files.map((file) => ({ ...file })),
112
+ total_count: totalCount,
113
+ };
114
+ }
115
+ async deleteFiles(outputIds, confirm) {
116
+ if (!confirm) {
117
+ throw new Error('Deletion must be confirmed');
118
+ }
119
+ const deletedFiles = [];
120
+ const failedFiles = [];
121
+ for (const outputId of outputIds) {
122
+ try {
123
+ const fileInfo = this.files.get(outputId);
124
+ if (!fileInfo) {
125
+ failedFiles.push(outputId);
126
+ continue;
127
+ }
128
+ // ファイルシステムからファイルを削除
129
+ await fs.unlink(fileInfo.path);
130
+ // マップから削除
131
+ this.files.delete(outputId);
132
+ deletedFiles.push(outputId);
133
+ }
134
+ catch (error) {
135
+ // エラーログを内部ログに記録(標準出力を避ける)
136
+ // console.error(`Failed to delete file ${outputId}:`, error);
137
+ failedFiles.push(outputId);
138
+ }
139
+ }
140
+ return {
141
+ deleted_files: deletedFiles,
142
+ failed_files: failedFiles,
143
+ total_deleted: deletedFiles.length,
144
+ };
145
+ }
146
+ async cleanupOldFiles(deleteCount) {
147
+ const files = Array.from(this.files.entries());
148
+ // 作成日時でソート(古い順)
149
+ files.sort(([, a], [, b]) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
150
+ const filesToDelete = files.slice(0, deleteCount);
151
+ for (const [fileId, fileInfo] of filesToDelete) {
152
+ try {
153
+ await fs.unlink(fileInfo.path);
154
+ this.files.delete(fileId);
155
+ }
156
+ catch (error) {
157
+ // エラーログを内部ログに記録(標準出力を避ける)
158
+ // console.error(`Failed to cleanup file ${fileId}:`, error);
159
+ }
160
+ }
161
+ }
162
+ // 実行IDに関連するファイルを削除
163
+ async deleteExecutionFiles(executionId) {
164
+ const filesToDelete = Array.from(this.files.entries())
165
+ .filter(([, file]) => file.execution_id === executionId)
166
+ .map(([fileId]) => fileId);
167
+ if (filesToDelete.length === 0) {
168
+ return 0;
169
+ }
170
+ const result = await this.deleteFiles(filesToDelete, true);
171
+ return result.total_deleted;
172
+ }
173
+ // 使用統計の取得
174
+ getUsageStats() {
175
+ const files = Array.from(this.files.values());
176
+ const totalFiles = files.length;
177
+ const filesByType = {
178
+ stdout: 0,
179
+ stderr: 0,
180
+ combined: 0,
181
+ log: 0,
182
+ all: 0,
183
+ };
184
+ let totalSize = 0;
185
+ for (const file of files) {
186
+ if (file.output_type !== 'all') {
187
+ filesByType[file.output_type]++;
188
+ }
189
+ totalSize += file.size;
190
+ }
191
+ return {
192
+ total_files: totalFiles,
193
+ files_by_type: filesByType,
194
+ total_size_bytes: totalSize,
195
+ average_file_size: totalFiles > 0 ? totalSize / totalFiles : 0,
196
+ };
197
+ }
198
+ async cleanup() {
199
+ // 全てのファイルを削除
200
+ const allOutputIds = Array.from(this.files.keys());
201
+ try {
202
+ await this.deleteFiles(allOutputIds, true);
203
+ }
204
+ catch (error) {
205
+ // エラーログを内部ログに記録(標準出力を避ける)
206
+ // console.error('Failed to cleanup files:', error);
207
+ }
208
+ this.files.clear();
209
+ }
210
+ /**
211
+ * Issue #13: output_idから実行IDを取得
212
+ */
213
+ getExecutionIdByOutputId(outputId) {
214
+ const fileInfo = this.files.get(outputId);
215
+ return fileInfo?.execution_id;
216
+ }
217
+ /**
218
+ * Issue #15: ディレクトリサイズベースのクリーンアップ提案
219
+ */
220
+ async getCleanupSuggestions(options) {
221
+ const maxSizeMB = options?.maxSizeMB || 50; // Default: 50MB threshold
222
+ const maxAgeHours = options?.maxAgeHours || 24; // Default: 24 hours
223
+ const includeWarnings = options?.includeWarnings ?? true;
224
+ // 現在のディレクトリサイズと情報を取得
225
+ const stats = this.getUsageStats();
226
+ const currentSizeMB = stats.total_size_bytes / (1024 * 1024);
227
+ const currentTime = Date.now();
228
+ const result = {
229
+ current_directory_size_mb: Math.round(currentSizeMB * 100) / 100,
230
+ current_file_count: stats.total_files,
231
+ };
232
+ // 閾値チェックとクリーンアップ候補の特定
233
+ if (includeWarnings && (currentSizeMB > maxSizeMB || stats.total_files > 1000)) {
234
+ const cleanupCandidates = [];
235
+ let estimatedSavings = 0;
236
+ // 古いファイルを特定
237
+ for (const [outputId, fileInfo] of this.files) {
238
+ const fileAge = currentTime - new Date(fileInfo.created_at).getTime();
239
+ const fileAgeHours = fileAge / (1000 * 60 * 60);
240
+ if (fileAgeHours > maxAgeHours) {
241
+ cleanupCandidates.push(outputId);
242
+ estimatedSavings += fileInfo.size;
243
+ }
244
+ }
245
+ // 大きなファイルも候補に追加(サイズが平均の3倍以上)
246
+ if (cleanupCandidates.length < 10 && stats.average_file_size > 0) {
247
+ const largeSizeThreshold = stats.average_file_size * 3;
248
+ for (const [outputId, fileInfo] of this.files) {
249
+ if (fileInfo.size > largeSizeThreshold && !cleanupCandidates.includes(outputId)) {
250
+ cleanupCandidates.push(outputId);
251
+ estimatedSavings += fileInfo.size;
252
+ }
253
+ }
254
+ }
255
+ if (cleanupCandidates.length > 0) {
256
+ const estimatedSavingsMB = Math.round((estimatedSavings / (1024 * 1024)) * 100) / 100;
257
+ let warning;
258
+ if (currentSizeMB > maxSizeMB) {
259
+ warning = `Output directory size: ${result.current_directory_size_mb}MB exceeds threshold (${maxSizeMB}MB). Consider cleanup.`;
260
+ }
261
+ else {
262
+ warning = `High file count: ${result.current_file_count} files. Consider cleanup for better performance.`;
263
+ }
264
+ return {
265
+ ...result,
266
+ recommendations: {
267
+ warning,
268
+ suggested_action: 'Use delete_execution_outputs with cleanup_candidates for automatic cleanup',
269
+ cleanup_candidates: cleanupCandidates.slice(0, 20), // Limit to top 20 candidates
270
+ estimated_savings_mb: estimatedSavingsMB,
271
+ },
272
+ };
273
+ }
274
+ }
275
+ return result;
276
+ }
277
+ /**
278
+ * Issue #15: 年齢ベースの自動クリーンアップ
279
+ */
280
+ async performAutoCleanup(options) {
281
+ const maxAgeHours = options?.maxAgeHours || 24;
282
+ const dryRun = options?.dryRun ?? true; // Default to dry run for safety
283
+ const preserveRecent = options?.preserveRecent || 10; // Keep at least 10 recent files
284
+ const currentTime = Date.now();
285
+ const deleteCandidates = [];
286
+ const preserveCandidates = [];
287
+ let spaceFeed = 0;
288
+ // ファイルを作成時間でソート(新しい順)
289
+ const sortedFiles = Array.from(this.files.entries()).sort(([, a], [, b]) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
290
+ // 最新のN個は保持、残りは年齢でチェック
291
+ for (let i = 0; i < sortedFiles.length; i++) {
292
+ const entry = sortedFiles[i];
293
+ if (!entry)
294
+ continue;
295
+ const [outputId, fileInfo] = entry;
296
+ if (i < preserveRecent) {
297
+ // 最新のN個は保持
298
+ preserveCandidates.push(outputId);
299
+ }
300
+ else {
301
+ // 古いファイルかチェック
302
+ const fileAge = currentTime - new Date(fileInfo.created_at).getTime();
303
+ const fileAgeHours = fileAge / (1000 * 60 * 60);
304
+ if (fileAgeHours > maxAgeHours) {
305
+ deleteCandidates.push(outputId);
306
+ spaceFeed += fileInfo.size;
307
+ }
308
+ else {
309
+ preserveCandidates.push(outputId);
310
+ }
311
+ }
312
+ }
313
+ const spaceFreedMB = Math.round((spaceFeed / (1024 * 1024)) * 100) / 100;
314
+ // 実際の削除実行(dryRunでない場合)
315
+ if (!dryRun && deleteCandidates.length > 0) {
316
+ try {
317
+ await this.deleteFiles(deleteCandidates, true);
318
+ }
319
+ catch (error) {
320
+ console.error('Auto cleanup failed:', error);
321
+ // エラーの場合は削除されなかった扱い
322
+ return {
323
+ deleted_files: [],
324
+ preserved_files: Array.from(this.files.keys()),
325
+ space_freed_mb: 0,
326
+ dry_run: dryRun,
327
+ };
328
+ }
329
+ }
330
+ return {
331
+ deleted_files: deleteCandidates,
332
+ preserved_files: preserveCandidates,
333
+ space_freed_mb: spaceFreedMB,
334
+ dry_run: dryRun,
335
+ };
336
+ }
337
+ }
338
+ //# sourceMappingURL=file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.js","sourceRoot":"","sources":["../../src/core/file-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Issue #13: FileManager Subscriber実装
3
+ * 既存のFileManagerをStreamSubscriberパターンに拡張
4
+ */
5
+ import { StreamSubscriber } from './stream-publisher.js';
6
+ import { FileManager } from './file-manager.js';
7
+ /**
8
+ * FileManager の Subscriber ラッパー
9
+ * プロセス出力をファイルに保存するSubscriber
10
+ */
11
+ export declare class FileStorageSubscriber implements StreamSubscriber {
12
+ private fileManager;
13
+ private baseDir;
14
+ readonly id: string;
15
+ private fileStreams;
16
+ private filePaths;
17
+ constructor(fileManager: FileManager, baseDir?: string);
18
+ onProcessStart(executionId: string, _command: string): Promise<void>;
19
+ onOutputData(executionId: string, data: string, isStderr?: boolean): Promise<void>;
20
+ onProcessEnd(executionId: string, _exitCode: number | null): Promise<void>;
21
+ onError(executionId: string, error: Error): Promise<void>;
22
+ /**
23
+ * FileManagerの情報を最終的なファイルサイズで更新
24
+ */
25
+ private updateFileManagerInfo;
26
+ /**
27
+ * 指定された実行の出力ファイルパスを取得
28
+ */
29
+ getFilePaths(executionId: string): {
30
+ stdout: string;
31
+ stderr: string;
32
+ } | undefined;
33
+ /**
34
+ * アクティブなファイルストリーム数を取得(デバッグ用)
35
+ */
36
+ getActiveStreamsCount(): number;
37
+ }
38
+ //# sourceMappingURL=file-storage-subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-subscriber.d.ts","sourceRoot":"","sources":["../../src/core/file-storage-subscriber.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAM1D,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IANjB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,SAAS,CAA8D;gBAGrE,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,MAAiC;IAK9C,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BpE,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAezF,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1E,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D;;OAEG;YACW,qBAAqB;IAqBnC;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAIjF;;OAEG;IACH,qBAAqB,IAAI,MAAM;CAGhC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Issue #13: FileManager Subscriber実装
3
+ * 既存のFileManagerをStreamSubscriberパターンに拡張
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { generateId, getCurrentTimestamp } from '../utils/helpers.js';
8
+ /**
9
+ * FileManager の Subscriber ラッパー
10
+ * プロセス出力をファイルに保存するSubscriber
11
+ */
12
+ export class FileStorageSubscriber {
13
+ fileManager;
14
+ baseDir;
15
+ id;
16
+ fileStreams = new Map();
17
+ filePaths = new Map();
18
+ constructor(fileManager, baseDir = '/tmp/mcp-shell-outputs') {
19
+ this.fileManager = fileManager;
20
+ this.baseDir = baseDir;
21
+ this.id = `file-storage-${generateId()}`;
22
+ }
23
+ async onProcessStart(executionId, _command) {
24
+ // 出力ファイルのパスを準備
25
+ const timestamp = getCurrentTimestamp().replace(/[:.]/g, '-');
26
+ const stdoutPath = path.join(this.baseDir, `${executionId}-stdout-${timestamp}.txt`);
27
+ const stderrPath = path.join(this.baseDir, `${executionId}-stderr-${timestamp}.txt`);
28
+ this.filePaths.set(executionId, {
29
+ stdout: stdoutPath,
30
+ stderr: stderrPath,
31
+ });
32
+ // ファイルハンドルを開く(書き込み用)
33
+ try {
34
+ const stdoutHandle = await fs.open(stdoutPath, 'w');
35
+ const stderrHandle = await fs.open(stderrPath, 'w');
36
+ this.fileStreams.set(`${executionId}-stdout`, stdoutHandle);
37
+ this.fileStreams.set(`${executionId}-stderr`, stderrHandle);
38
+ // FileManagerに登録(まだ0サイズ)
39
+ await this.fileManager.registerFile(stdoutPath, 'stdout', executionId);
40
+ await this.fileManager.registerFile(stderrPath, 'stderr', executionId);
41
+ }
42
+ catch (error) {
43
+ console.error(`FileStorageSubscriber: Failed to create output files for ${executionId}:`, error);
44
+ throw error;
45
+ }
46
+ }
47
+ async onOutputData(executionId, data, isStderr = false) {
48
+ const streamKey = `${executionId}-${isStderr ? 'stderr' : 'stdout'}`;
49
+ const fileHandle = this.fileStreams.get(streamKey);
50
+ if (fileHandle) {
51
+ try {
52
+ await fileHandle.write(data);
53
+ // すぐにフラッシュして、他のプロセスからも読み取り可能にする
54
+ await fileHandle.sync();
55
+ }
56
+ catch (error) {
57
+ console.error(`FileStorageSubscriber: Failed to write data for ${executionId}:`, error);
58
+ }
59
+ }
60
+ }
61
+ async onProcessEnd(executionId, _exitCode) {
62
+ // ファイルハンドルを閉じる
63
+ const stdoutHandle = this.fileStreams.get(`${executionId}-stdout`);
64
+ const stderrHandle = this.fileStreams.get(`${executionId}-stderr`);
65
+ try {
66
+ if (stdoutHandle) {
67
+ await stdoutHandle.close();
68
+ this.fileStreams.delete(`${executionId}-stdout`);
69
+ }
70
+ if (stderrHandle) {
71
+ await stderrHandle.close();
72
+ this.fileStreams.delete(`${executionId}-stderr`);
73
+ }
74
+ // FileManagerの情報を更新(最終ファイルサイズなど)
75
+ const filePaths = this.filePaths.get(executionId);
76
+ if (filePaths) {
77
+ await this.updateFileManagerInfo(executionId, filePaths);
78
+ this.filePaths.delete(executionId);
79
+ }
80
+ }
81
+ catch (error) {
82
+ console.error(`FileStorageSubscriber: Error closing files for ${executionId}:`, error);
83
+ }
84
+ }
85
+ async onError(executionId, error) {
86
+ // エラー時もファイルを適切に閉じる
87
+ await this.onProcessEnd(executionId, -1);
88
+ // エラーログを stderr ファイルに書き込む
89
+ const filePaths = this.filePaths.get(executionId);
90
+ if (filePaths) {
91
+ try {
92
+ const errorMessage = `\n[ERROR] Process failed: ${error.message}\n`;
93
+ await fs.appendFile(filePaths.stderr, errorMessage);
94
+ }
95
+ catch (writeError) {
96
+ console.error(`FileStorageSubscriber: Failed to write error to stderr file:`, writeError);
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * FileManagerの情報を最終的なファイルサイズで更新
102
+ */
103
+ async updateFileManagerInfo(executionId, filePaths) {
104
+ try {
105
+ // ファイルサイズを取得してFileManagerを更新
106
+ // この部分は FileManager の内部実装に依存するため、
107
+ // FileManager に updateFileSize メソッドを追加する必要があるかもしれません
108
+ // 現在は console.error でログ出力のみ
109
+ const stdoutStat = await fs.stat(filePaths.stdout);
110
+ const stderrStat = await fs.stat(filePaths.stderr);
111
+ console.error(`FileStorageSubscriber: Files updated for ${executionId}:`);
112
+ console.error(` stdout: ${filePaths.stdout} (${stdoutStat.size} bytes)`);
113
+ console.error(` stderr: ${filePaths.stderr} (${stderrStat.size} bytes)`);
114
+ }
115
+ catch (error) {
116
+ console.error(`FileStorageSubscriber: Failed to update file info for ${executionId}:`, error);
117
+ }
118
+ }
119
+ /**
120
+ * 指定された実行の出力ファイルパスを取得
121
+ */
122
+ getFilePaths(executionId) {
123
+ return this.filePaths.get(executionId);
124
+ }
125
+ /**
126
+ * アクティブなファイルストリーム数を取得(デバッグ用)
127
+ */
128
+ getActiveStreamsCount() {
129
+ return this.fileStreams.size;
130
+ }
131
+ }
132
+ //# sourceMappingURL=file-storage-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-subscriber.js","sourceRoot":"","sources":["../../src/core/file-storage-subscriber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { MonitorInfo, SystemStats } from '../types/index.js';
2
+ export declare class MonitoringManager {
3
+ private monitors;
4
+ private intervals;
5
+ private processMetrics;
6
+ private readonly maxMetricsHistory;
7
+ constructor();
8
+ /**
9
+ * プロセス情報取得用の exec コマンド実行ヘルパー
10
+ */
11
+ private getExecAsync;
12
+ startProcessMonitor(processId: number, intervalMs?: number, includeMetrics?: string[]): MonitorInfo;
13
+ private collectProcessMetrics;
14
+ private getCpuUsage;
15
+ private getLinuxCpuUsage;
16
+ private getMacOsCpuUsage;
17
+ private getMemoryUsage;
18
+ private getLinuxMemoryUsage;
19
+ private getMacOsMemoryUsage;
20
+ private getIoStats;
21
+ private getNetworkStats;
22
+ private storeProcessMetrics;
23
+ stopProcessMonitor(monitorId: string): boolean;
24
+ getMonitor(monitorId: string): MonitorInfo;
25
+ listMonitors(): MonitorInfo[];
26
+ getSystemStats(_timeRangeMinutes?: number): SystemStats;
27
+ private getActiveProcessCount;
28
+ private startSystemMonitoring;
29
+ private logSystemStats;
30
+ cleanup(): void;
31
+ }
32
+ //# sourceMappingURL=monitoring-manager.d.ts.map