hackwriter 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -59
- package/dist/agent/CompactionPrompt.d.ts +0 -7
- package/dist/agent/CompactionPrompt.d.ts.map +1 -1
- package/dist/agent/CompactionPrompt.js +1 -1
- package/dist/agent/CompactionPrompt.js.map +1 -1
- package/dist/agent/ConversationContext.d.ts +9 -0
- package/dist/agent/ConversationContext.d.ts.map +1 -1
- package/dist/agent/ConversationContext.js +16 -1
- package/dist/agent/ConversationContext.js.map +1 -1
- package/dist/agent/ModelFactory.d.ts.map +1 -1
- package/dist/agent/ModelFactory.js +4 -1
- package/dist/agent/ModelFactory.js.map +1 -1
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +73 -22
- package/dist/commands/setup.js.map +1 -1
- package/dist/config/ConfigSchema.d.ts +2 -36
- package/dist/config/ConfigSchema.d.ts.map +1 -1
- package/dist/config/ConfigSchema.js +5 -11
- package/dist/config/ConfigSchema.js.map +1 -1
- package/dist/config/ConfigurationLoader.d.ts.map +1 -1
- package/dist/config/ConfigurationLoader.js +41 -6
- package/dist/config/ConfigurationLoader.js.map +1 -1
- package/dist/config/HackMDConfigLoader.d.ts +20 -0
- package/dist/config/HackMDConfigLoader.d.ts.map +1 -0
- package/dist/config/HackMDConfigLoader.js +51 -0
- package/dist/config/HackMDConfigLoader.js.map +1 -0
- package/dist/config/OpenAIDiscovery.d.ts.map +1 -1
- package/dist/config/OpenAIDiscovery.js +4 -1
- package/dist/config/OpenAIDiscovery.js.map +1 -1
- package/dist/config/ProviderRegistry.d.ts +2 -3
- package/dist/config/ProviderRegistry.d.ts.map +1 -1
- package/dist/config/ProviderRegistry.js +0 -6
- package/dist/config/ProviderRegistry.js.map +1 -1
- package/dist/config/constants.d.ts +6 -6
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +7 -8
- package/dist/config/constants.js.map +1 -1
- package/dist/mcp/MCPClient.d.ts +13 -2
- package/dist/mcp/MCPClient.d.ts.map +1 -1
- package/dist/mcp/MCPClient.js +58 -7
- package/dist/mcp/MCPClient.js.map +1 -1
- package/dist/mcp/MCPToolAdapter.d.ts +2 -1
- package/dist/mcp/MCPToolAdapter.d.ts.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/messaging/MessageBus.d.ts +6 -1
- package/dist/messaging/MessageBus.d.ts.map +1 -1
- package/dist/messaging/MessageBus.js +6 -0
- package/dist/messaging/MessageBus.js.map +1 -1
- package/dist/tools/base/Tool.d.ts +0 -1
- package/dist/tools/base/Tool.d.ts.map +1 -1
- package/dist/tools/base/Tool.js.map +1 -1
- package/dist/tools/file/ListFilesTool.d.ts.map +1 -1
- package/dist/tools/file/ListFilesTool.js +10 -8
- package/dist/tools/file/ListFilesTool.js.map +1 -1
- package/dist/tools/file/ReadFileTool.d.ts.map +1 -1
- package/dist/tools/file/ReadFileTool.js +9 -8
- package/dist/tools/file/ReadFileTool.js.map +1 -1
- package/dist/tools/file/WriteFileTool.d.ts.map +1 -1
- package/dist/tools/file/WriteFileTool.js +9 -7
- package/dist/tools/file/WriteFileTool.js.map +1 -1
- package/dist/ui/shell/InteractiveShell.d.ts +6 -1
- package/dist/ui/shell/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/shell/InteractiveShell.js +10 -0
- package/dist/ui/shell/InteractiveShell.js.map +1 -1
- package/dist/utils/AsyncPackageLoader.d.ts +29 -0
- package/dist/utils/AsyncPackageLoader.d.ts.map +1 -0
- package/dist/utils/AsyncPackageLoader.js +56 -0
- package/dist/utils/AsyncPackageLoader.js.map +1 -0
- package/dist/utils/BatchWriter.d.ts +42 -0
- package/dist/utils/BatchWriter.d.ts.map +1 -0
- package/dist/utils/BatchWriter.js +130 -0
- package/dist/utils/BatchWriter.js.map +1 -0
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +14 -4
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/PathValidator.d.ts +35 -0
- package/dist/utils/PathValidator.d.ts.map +1 -0
- package/dist/utils/PathValidator.js +70 -0
- package/dist/utils/PathValidator.js.map +1 -0
- package/dist/utils/RateLimiter.d.ts +3 -1
- package/dist/utils/RateLimiter.d.ts.map +1 -1
- package/dist/utils/RateLimiter.js +9 -24
- package/dist/utils/RateLimiter.js.map +1 -1
- package/dist/utils/ResourceManager.d.ts +7 -0
- package/dist/utils/ResourceManager.d.ts.map +1 -0
- package/dist/utils/ResourceManager.js +2 -0
- package/dist/utils/ResourceManager.js.map +1 -0
- package/dist/utils/RetryPolicy.d.ts +29 -0
- package/dist/utils/RetryPolicy.d.ts.map +1 -0
- package/dist/utils/RetryPolicy.js +73 -0
- package/dist/utils/RetryPolicy.js.map +1 -0
- package/dist/utils/SensitiveDataRedactor.d.ts +40 -0
- package/dist/utils/SensitiveDataRedactor.d.ts.map +1 -0
- package/dist/utils/SensitiveDataRedactor.js +122 -0
- package/dist/utils/SensitiveDataRedactor.js.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts +36 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +74 -0
- package/dist/utils/SlidingWindowRateLimiter.js.map +1 -0
- package/package.json +5 -3
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
import type { AgentMessage } from './MessageTypes.js';
|
|
3
|
-
|
|
3
|
+
import type { Disposable } from '../utils/ResourceManager.js';
|
|
4
|
+
export declare class MessageBus extends EventEmitter implements Disposable {
|
|
4
5
|
private static instance;
|
|
5
6
|
static getInstance(): MessageBus;
|
|
6
7
|
publish(message: AgentMessage): void;
|
|
7
8
|
subscribe(handler: (message: AgentMessage) => void): void;
|
|
8
9
|
unsubscribe(handler: (message: AgentMessage) => void): void;
|
|
9
10
|
clear(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Dispose of resources (implements Disposable interface)
|
|
13
|
+
*/
|
|
14
|
+
dispose(): void;
|
|
10
15
|
}
|
|
11
16
|
//# sourceMappingURL=MessageBus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageBus.d.ts","sourceRoot":"","sources":["../../src/messaging/MessageBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageBus.d.ts","sourceRoot":"","sources":["../../src/messaging/MessageBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,qBAAa,UAAW,SAAQ,YAAa,YAAW,UAAU;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAa;IAEpC,MAAM,CAAC,WAAW,IAAI,UAAU;IAOhC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIpC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAIzD,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI3D,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -19,5 +19,11 @@ export class MessageBus extends EventEmitter {
|
|
|
19
19
|
clear() {
|
|
20
20
|
this.removeAllListeners();
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Dispose of resources (implements Disposable interface)
|
|
24
|
+
*/
|
|
25
|
+
dispose() {
|
|
26
|
+
this.removeAllListeners();
|
|
27
|
+
}
|
|
22
28
|
}
|
|
23
29
|
//# sourceMappingURL=MessageBus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageBus.js","sourceRoot":"","sources":["../../src/messaging/MessageBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageBus.js","sourceRoot":"","sources":["../../src/messaging/MessageBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,OAAO,UAAW,SAAQ,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAa;IAEpC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,OAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,OAAwC;QAChD,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,OAAwC;QAClD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tool.d.ts","sourceRoot":"","sources":["../../../src/tools/base/Tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,
|
|
1
|
+
{"version":3,"file":"Tool.d.ts","sourceRoot":"","sources":["../../../src/tools/base/Tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC;AAErC,8BAAsB,IAAI,CACxB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAE1C,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAE7C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU;IAI1E,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU;IAI5E,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;CAM9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tool.js","sourceRoot":"","sources":["../../../src/tools/base/Tool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Tool.js","sourceRoot":"","sources":["../../../src/tools/base/Tool.ts"],"names":[],"mappings":"AAYA,MAAM,OAAgB,IAAI;IASd,EAAE,CAAC,MAAc,EAAE,OAAgB,EAAE,KAAc;QAC3D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAES,KAAK,CAAC,MAAc,EAAE,OAAe,EAAE,KAAc;QAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAES,WAAW,CAAC,KAAc;QAClC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListFilesTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ListFilesTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIzE,UAAU,eAAe;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,IAAI,CAAC,eAAe,CAAC;IACtD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,qCAAqC;IACzD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAiB9B;IAEI,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;YAmE1C,SAAS;IAmCvB,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { join, relative
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
3
|
import { Tool } from '../base/Tool.js';
|
|
4
4
|
import { MAX_FILES_DISPLAY } from '../../config/constants.js';
|
|
5
|
+
import { PathValidator, SecurityError } from '../../utils/PathValidator.js';
|
|
5
6
|
export class ListFilesTool extends Tool {
|
|
6
7
|
name = 'list_files';
|
|
7
8
|
description = 'List files in a local directory';
|
|
@@ -24,14 +25,15 @@ export class ListFilesTool extends Tool {
|
|
|
24
25
|
required: ['directoryPath'],
|
|
25
26
|
};
|
|
26
27
|
async call(params) {
|
|
27
|
-
// Validate directory path
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// Validate directory path using PathValidator
|
|
29
|
+
try {
|
|
30
|
+
PathValidator.validate(params.directoryPath);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof SecurityError) {
|
|
34
|
+
return this.error(error.message, `Security violation: ${error.violation}`, 'Security error');
|
|
35
|
+
}
|
|
36
|
+
return this.error('Invalid directory path', 'Directory path validation failed', 'Invalid path');
|
|
35
37
|
}
|
|
36
38
|
try {
|
|
37
39
|
const files = await this.listFiles(params.directoryPath, params.recursive ?? false, params.pattern);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListFilesTool.js","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAc,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"ListFilesTool.js","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKzE,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,IAAI,CAAC,cAAc,CAAC;IACpD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,sCAAsC;IAC1D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAS9B;IAEI,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ReadFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKzE,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,IAAI,CAAC,cAAc,CAAC;IACpD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,sCAAsC;IAC1D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAS9B;IAEI,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CAyDxD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Tool } from '../base/Tool.js';
|
|
2
2
|
import { promises as fs } from 'node:fs';
|
|
3
|
-
import { dirname } from 'node:path';
|
|
4
3
|
import { MAX_FILE_DISPLAY_SIZE } from '../../config/constants.js';
|
|
4
|
+
import { PathValidator, SecurityError } from '../../utils/PathValidator.js';
|
|
5
5
|
export class ReadFileTool extends Tool {
|
|
6
6
|
name = 'read_file';
|
|
7
7
|
description = 'Read the content of a local file';
|
|
@@ -16,14 +16,15 @@ export class ReadFileTool extends Tool {
|
|
|
16
16
|
required: ['filePath'],
|
|
17
17
|
};
|
|
18
18
|
async call(params) {
|
|
19
|
-
// Validate file path
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
// Validate file path using PathValidator
|
|
20
|
+
try {
|
|
21
|
+
PathValidator.validate(params.filePath);
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof SecurityError) {
|
|
25
|
+
return this.error(error.message, `Security violation: ${error.violation}`, 'Security error');
|
|
26
|
+
}
|
|
27
|
+
return this.error('Invalid file path', 'File path validation failed', 'Invalid path');
|
|
27
28
|
}
|
|
28
29
|
try {
|
|
29
30
|
const content = await fs.readFile(params.filePath, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ReadFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAO5E,MAAM,OAAO,YAAa,SAAQ,IAAoB;IAC3C,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,kCAAkC,CAAC;IACjD,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0BAA0B;aACxC;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,yCAAyC;QACzC,IAAI,CAAC;YACH,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,KAAK,CACf,KAAK,CAAC,OAAO,EACb,uBAAuB,KAAK,CAAC,SAAS,EAAE,EACxC,gBAAgB,CACjB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CACf,mBAAmB,EACnB,6BAA6B,EAC7B,cAAc,CACf,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE7C,6BAA6B;YAC7B,IAAI,KAAK,CAAC,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC,EAAE,CACZ,0BAA0B,MAAM,SAAS;oBACzC,aAAa,MAAM,CAAC,QAAQ,IAAI;oBAChC,aAAa,KAAK,CAAC,IAAI,UAAU;oBACjC,iBAAiB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM;oBACnD,4CAA4C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,4BAA4B,EAC/G,0BAA0B,MAAM,CAAC,QAAQ,EAAE,EAC3C,kBAAkB,CACnB,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GACV,aAAa,MAAM,CAAC,QAAQ,IAAI;gBAChC,aAAa,KAAK,CAAC,IAAI,UAAU;gBACjC,iBAAiB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM;gBACnD,yBAAyB,OAAO,UAAU,CAAC;YAE7C,OAAO,IAAI,CAAC,EAAE,CACZ,MAAM,EACN,2BAA2B,MAAM,CAAC,QAAQ,EAAE,EAC5C,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,wBAAwB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,KAAK,CACf,QAAQ,EACR,QAAQ,EACR,aAAa,CACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"WriteFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMtE,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,IAAI,CAAC,eAAe,CAAC;IAsB1C,OAAO,CAAC,eAAe;IArBnC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAiB9B;gBAEkB,eAAe,EAAE,eAAe;IAI9C,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;CAyEzD"}
|
|
@@ -2,6 +2,7 @@ import { Tool } from '../base/Tool.js';
|
|
|
2
2
|
import { promises as fs } from 'node:fs';
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { MAX_FILE_SIZE } from '../../config/constants.js';
|
|
5
|
+
import { PathValidator, SecurityError } from '../../utils/PathValidator.js';
|
|
5
6
|
export class WriteFileTool extends Tool {
|
|
6
7
|
approvalManager;
|
|
7
8
|
name = 'write_file';
|
|
@@ -29,14 +30,15 @@ export class WriteFileTool extends Tool {
|
|
|
29
30
|
this.approvalManager = approvalManager;
|
|
30
31
|
}
|
|
31
32
|
async call(params) {
|
|
32
|
-
// Validate file path
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Validate file path using PathValidator
|
|
34
|
+
try {
|
|
35
|
+
PathValidator.validate(params.filePath);
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof SecurityError) {
|
|
39
|
+
return this.error(error.message, `Security violation: ${error.violation}`, 'Security error');
|
|
40
|
+
}
|
|
41
|
+
return this.error('Invalid file path', 'File path validation failed', 'Invalid path');
|
|
40
42
|
}
|
|
41
43
|
// Check content size
|
|
42
44
|
if (params.content.length > MAX_FILE_SIZE) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoC,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"WriteFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { AgentExecutor } from "../../agent/AgentExecutor.js";
|
|
|
3
3
|
import type { Configuration } from "../../config/Configuration.js";
|
|
4
4
|
import type { ConversationContext } from "../../agent/ConversationContext.js";
|
|
5
5
|
import type { ToolRegistry } from "../../tools/base/ToolRegistry.js";
|
|
6
|
+
import type { Disposable } from "../../utils/ResourceManager.js";
|
|
6
7
|
export interface ModelContext {
|
|
7
8
|
currentModelName: string;
|
|
8
9
|
config: Configuration;
|
|
@@ -10,7 +11,7 @@ export interface ModelContext {
|
|
|
10
11
|
toolRegistry: ToolRegistry;
|
|
11
12
|
systemPrompt: string;
|
|
12
13
|
}
|
|
13
|
-
export declare class InteractiveShell {
|
|
14
|
+
export declare class InteractiveShell implements Disposable {
|
|
14
15
|
private executor;
|
|
15
16
|
private renderer;
|
|
16
17
|
private commandRegistry;
|
|
@@ -38,5 +39,9 @@ export declare class InteractiveShell {
|
|
|
38
39
|
*/
|
|
39
40
|
recreateReadline(): void;
|
|
40
41
|
private printWelcome;
|
|
42
|
+
/**
|
|
43
|
+
* Dispose of resources (implements Disposable interface)
|
|
44
|
+
*/
|
|
45
|
+
dispose(): void;
|
|
41
46
|
}
|
|
42
47
|
//# sourceMappingURL=InteractiveShell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractiveShell.d.ts","sourceRoot":"","sources":["../../../src/ui/shell/InteractiveShell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"InteractiveShell.d.ts","sourceRoot":"","sources":["../../../src/ui/shell/InteractiveShell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAMrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAe;gBAEvB,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY;IAazD,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAsCrC,WAAW;IAuBzB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,iBAAiB;IAYzB,eAAe,IAAI,YAAY;IAI/B,WAAW,IAAI,aAAa;IAI5B,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAK1C,IAAI,IAAI,IAAI;IAMZ,WAAW,IAAI,QAAQ,CAAC,SAAS;IAIjC;;;OAGG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAyBxB,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -153,5 +153,15 @@ export class InteractiveShell {
|
|
|
153
153
|
console.log(chalk.gray("Writing agent for HackMD"));
|
|
154
154
|
console.log(chalk.gray("Type /help for commands or /exit to quit\n"));
|
|
155
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Dispose of resources (implements Disposable interface)
|
|
158
|
+
*/
|
|
159
|
+
dispose() {
|
|
160
|
+
Logger.debug("InteractiveShell", "Disposing resources");
|
|
161
|
+
if (!this.isClosed) {
|
|
162
|
+
this.rl.close();
|
|
163
|
+
this.isClosed = true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
156
166
|
}
|
|
157
167
|
//# sourceMappingURL=InteractiveShell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractiveShell.js","sourceRoot":"","sources":["../../../src/ui/shell/InteractiveShell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"InteractiveShell.js","sourceRoot":"","sources":["../../../src/ui/shell/InteractiveShell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface PackageJson {
|
|
2
|
+
version: string;
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* AsyncPackageLoader loads package.json files asynchronously to avoid blocking the event loop.
|
|
7
|
+
* Caches loaded package data to avoid repeated file reads.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AsyncPackageLoader {
|
|
10
|
+
private static cache;
|
|
11
|
+
/**
|
|
12
|
+
* Load package.json asynchronously
|
|
13
|
+
* @param packagePath - Path to package.json file
|
|
14
|
+
* @returns Package data with at least a version field
|
|
15
|
+
*/
|
|
16
|
+
static load(packagePath: string): Promise<PackageJson>;
|
|
17
|
+
/**
|
|
18
|
+
* Get cached package data if available
|
|
19
|
+
* @param packagePath - Path to package.json file
|
|
20
|
+
* @returns Cached package data or null if not cached
|
|
21
|
+
*/
|
|
22
|
+
static getCached(packagePath: string): PackageJson | null;
|
|
23
|
+
/**
|
|
24
|
+
* Clear the cache (useful for testing)
|
|
25
|
+
*/
|
|
26
|
+
static clearCache(): void;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=AsyncPackageLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncPackageLoader.d.ts","sourceRoot":"","sources":["../../src/utils/AsyncPackageLoader.ts"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAkC;IAEtD;;;;OAIG;WACU,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgC5D;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIzD;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
|
+
import { Logger } from "./Logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* AsyncPackageLoader loads package.json files asynchronously to avoid blocking the event loop.
|
|
5
|
+
* Caches loaded package data to avoid repeated file reads.
|
|
6
|
+
*/
|
|
7
|
+
export class AsyncPackageLoader {
|
|
8
|
+
static cache = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Load package.json asynchronously
|
|
11
|
+
* @param packagePath - Path to package.json file
|
|
12
|
+
* @returns Package data with at least a version field
|
|
13
|
+
*/
|
|
14
|
+
static async load(packagePath) {
|
|
15
|
+
// Check cache first
|
|
16
|
+
const cached = this.cache.get(packagePath);
|
|
17
|
+
if (cached) {
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const content = await fs.readFile(packagePath, "utf-8");
|
|
22
|
+
const packageData = JSON.parse(content);
|
|
23
|
+
// Validate that version exists
|
|
24
|
+
if (!packageData.version) {
|
|
25
|
+
Logger.warn("AsyncPackageLoader", `Package at ${packagePath} missing version field`);
|
|
26
|
+
packageData.version = "unknown";
|
|
27
|
+
}
|
|
28
|
+
// Cache the result
|
|
29
|
+
this.cache.set(packagePath, packageData);
|
|
30
|
+
return packageData;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
Logger.error("AsyncPackageLoader", `Failed to load package.json from ${packagePath}`, {
|
|
34
|
+
error: error instanceof Error ? error.message : String(error),
|
|
35
|
+
});
|
|
36
|
+
// Return a default package with unknown version
|
|
37
|
+
const defaultPackage = { version: "unknown" };
|
|
38
|
+
return defaultPackage;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get cached package data if available
|
|
43
|
+
* @param packagePath - Path to package.json file
|
|
44
|
+
* @returns Cached package data or null if not cached
|
|
45
|
+
*/
|
|
46
|
+
static getCached(packagePath) {
|
|
47
|
+
return this.cache.get(packagePath) ?? null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Clear the cache (useful for testing)
|
|
51
|
+
*/
|
|
52
|
+
static clearCache() {
|
|
53
|
+
this.cache.clear();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=AsyncPackageLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncPackageLoader.js","sourceRoot":"","sources":["../../src/utils/AsyncPackageLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAmB;QACnC,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;YAEvD,+BAA+B;YAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,cAAc,WAAW,wBAAwB,CAAC,CAAC;gBACrF,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC;YAClC,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAEzC,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,oCAAoC,WAAW,EAAE,EAAE;gBACpF,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YAEH,gDAAgD;YAChD,MAAM,cAAc,GAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAC3D,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,WAAmB;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface BatchWriterOptions {
|
|
2
|
+
maxBatchSize?: number;
|
|
3
|
+
flushIntervalMs?: number;
|
|
4
|
+
maxFlushDelayMs?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* BatchWriter buffers write operations to reduce I/O overhead
|
|
8
|
+
* Automatically flushes based on size and time constraints
|
|
9
|
+
*/
|
|
10
|
+
export declare class BatchWriter {
|
|
11
|
+
private filePath;
|
|
12
|
+
private buffer;
|
|
13
|
+
private flushTimer;
|
|
14
|
+
private isClosed;
|
|
15
|
+
private readonly maxBatchSize;
|
|
16
|
+
private readonly flushIntervalMs;
|
|
17
|
+
private readonly maxFlushDelayMs;
|
|
18
|
+
constructor(filePath: string, options?: BatchWriterOptions);
|
|
19
|
+
/**
|
|
20
|
+
* Add data to write buffer
|
|
21
|
+
* Automatically flushes if buffer reaches maxBatchSize
|
|
22
|
+
*/
|
|
23
|
+
write(data: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Force flush pending writes to disk
|
|
26
|
+
*/
|
|
27
|
+
flush(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Close writer and flush remaining data
|
|
30
|
+
*/
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get unflushed data (for recovery)
|
|
34
|
+
*/
|
|
35
|
+
getUnflushedData(): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Schedule auto-flush based on idle time
|
|
38
|
+
*/
|
|
39
|
+
private scheduleFlush;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=BatchWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchWriter.d.ts","sourceRoot":"","sources":["../../src/utils/BatchWriter.ts"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAO1D;;;OAGG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,OAAO,CAAC,aAAa;CAsBtB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { Logger } from './Logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* BatchWriter buffers write operations to reduce I/O overhead
|
|
5
|
+
* Automatically flushes based on size and time constraints
|
|
6
|
+
*/
|
|
7
|
+
export class BatchWriter {
|
|
8
|
+
filePath;
|
|
9
|
+
buffer = [];
|
|
10
|
+
flushTimer = null;
|
|
11
|
+
isClosed = false;
|
|
12
|
+
maxBatchSize;
|
|
13
|
+
flushIntervalMs;
|
|
14
|
+
maxFlushDelayMs;
|
|
15
|
+
constructor(filePath, options) {
|
|
16
|
+
this.filePath = filePath;
|
|
17
|
+
this.maxBatchSize = options?.maxBatchSize ?? 50;
|
|
18
|
+
this.flushIntervalMs = options?.flushIntervalMs ?? 1000;
|
|
19
|
+
this.maxFlushDelayMs = options?.maxFlushDelayMs ?? 100;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add data to write buffer
|
|
23
|
+
* Automatically flushes if buffer reaches maxBatchSize
|
|
24
|
+
*/
|
|
25
|
+
async write(data) {
|
|
26
|
+
if (this.isClosed) {
|
|
27
|
+
throw new Error('BatchWriter is closed');
|
|
28
|
+
}
|
|
29
|
+
this.buffer.push({
|
|
30
|
+
data,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
});
|
|
33
|
+
// Flush immediately if buffer is full
|
|
34
|
+
if (this.buffer.length >= this.maxBatchSize) {
|
|
35
|
+
await this.flush();
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Schedule auto-flush
|
|
39
|
+
this.scheduleFlush();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Force flush pending writes to disk
|
|
44
|
+
*/
|
|
45
|
+
async flush() {
|
|
46
|
+
if (this.buffer.length === 0) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Clear any pending flush timer
|
|
50
|
+
if (this.flushTimer) {
|
|
51
|
+
clearTimeout(this.flushTimer);
|
|
52
|
+
this.flushTimer = null;
|
|
53
|
+
}
|
|
54
|
+
const recordsToFlush = this.buffer.splice(0);
|
|
55
|
+
try {
|
|
56
|
+
// Skip file operations for memory mode
|
|
57
|
+
if (this.filePath === ':memory:') {
|
|
58
|
+
Logger.debug('BatchWriter', `Flushed ${recordsToFlush.length} records (memory mode)`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Combine all records into single write
|
|
62
|
+
const content = recordsToFlush.map(r => r.data).join('');
|
|
63
|
+
// Use appendFile for atomic writes
|
|
64
|
+
await fs.appendFile(this.filePath, content, 'utf-8');
|
|
65
|
+
Logger.debug('BatchWriter', `Flushed ${recordsToFlush.length} records to ${this.filePath}`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// On error, put records back in buffer for retry
|
|
69
|
+
this.buffer.unshift(...recordsToFlush);
|
|
70
|
+
Logger.error('BatchWriter', 'Flush failed, records preserved in buffer', error);
|
|
71
|
+
// Retry once
|
|
72
|
+
try {
|
|
73
|
+
const retryContent = recordsToFlush.map(r => r.data).join('');
|
|
74
|
+
await fs.appendFile(this.filePath, retryContent, 'utf-8');
|
|
75
|
+
// Remove from buffer on successful retry
|
|
76
|
+
this.buffer.splice(0, recordsToFlush.length);
|
|
77
|
+
Logger.debug('BatchWriter', 'Retry flush succeeded');
|
|
78
|
+
}
|
|
79
|
+
catch (retryError) {
|
|
80
|
+
Logger.error('BatchWriter', 'Retry flush also failed', retryError);
|
|
81
|
+
throw retryError;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Close writer and flush remaining data
|
|
87
|
+
*/
|
|
88
|
+
async close() {
|
|
89
|
+
if (this.isClosed) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.isClosed = true;
|
|
93
|
+
// Clear any pending timer
|
|
94
|
+
if (this.flushTimer) {
|
|
95
|
+
clearTimeout(this.flushTimer);
|
|
96
|
+
this.flushTimer = null;
|
|
97
|
+
}
|
|
98
|
+
// Flush remaining data
|
|
99
|
+
await this.flush();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get unflushed data (for recovery)
|
|
103
|
+
*/
|
|
104
|
+
getUnflushedData() {
|
|
105
|
+
return this.buffer.map(r => r.data);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Schedule auto-flush based on idle time
|
|
109
|
+
*/
|
|
110
|
+
scheduleFlush() {
|
|
111
|
+
// Don't schedule if already scheduled
|
|
112
|
+
if (this.flushTimer) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.flushTimer = setTimeout(() => {
|
|
116
|
+
this.flushTimer = null;
|
|
117
|
+
// Check if oldest record exceeds max delay
|
|
118
|
+
if (this.buffer.length > 0) {
|
|
119
|
+
const oldestTimestamp = this.buffer[0].timestamp;
|
|
120
|
+
const age = Date.now() - oldestTimestamp;
|
|
121
|
+
if (age >= this.maxFlushDelayMs) {
|
|
122
|
+
void this.flush().catch(error => {
|
|
123
|
+
Logger.error('BatchWriter', 'Auto-flush failed', error);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}, this.flushIntervalMs);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=BatchWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchWriter.js","sourceRoot":"","sources":["../../src/utils/BatchWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"AAGA,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5C,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAsB;IAE1C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAItC,MAAM,CAAC,QAAQ,IAAI,QAAQ;IAI3B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAWrE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAWpE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAWpE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IA+BtE,OAAO,CAAC,MAAM,CAAC,GAAG;CAuBnB"}
|