hackwriter 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/AgentExecutor.d.ts.map +1 -1
- package/dist/agent/AgentExecutor.js +19 -4
- package/dist/agent/AgentExecutor.js.map +1 -1
- package/dist/cli.js +87 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +4 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/config/ConfigSchema.d.ts +6 -4
- package/dist/config/ConfigSchema.d.ts.map +1 -1
- package/dist/config/ConfigSchema.js +3 -2
- package/dist/config/ConfigSchema.js.map +1 -1
- package/dist/config/Configuration.d.ts +2 -1
- package/dist/config/Configuration.d.ts.map +1 -1
- package/dist/config/ConfigurationLoader.d.ts.map +1 -1
- package/dist/config/ConfigurationLoader.js +27 -14
- package/dist/config/ConfigurationLoader.js.map +1 -1
- package/dist/config/ProviderRegistry.d.ts.map +1 -1
- package/dist/config/ProviderRegistry.js +1 -11
- package/dist/config/ProviderRegistry.js.map +1 -1
- package/dist/config/constants.d.ts +22 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +30 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/mcp/MCPClient.d.ts +56 -0
- package/dist/mcp/MCPClient.d.ts.map +1 -0
- package/dist/mcp/MCPClient.js +134 -0
- package/dist/mcp/MCPClient.js.map +1 -0
- package/dist/mcp/MCPToolAdapter.d.ts +28 -0
- package/dist/mcp/MCPToolAdapter.d.ts.map +1 -0
- package/dist/mcp/MCPToolAdapter.js +91 -0
- package/dist/mcp/MCPToolAdapter.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/session/SessionManager.d.ts.map +1 -1
- package/dist/session/SessionManager.js +2 -1
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/tools/base/ToolRegistry.d.ts +13 -4
- package/dist/tools/base/ToolRegistry.d.ts.map +1 -1
- package/dist/tools/base/ToolRegistry.js.map +1 -1
- package/dist/tools/file/ListFilesTool.d.ts.map +1 -1
- package/dist/tools/file/ListFilesTool.js +19 -3
- 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 +20 -0
- 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 +15 -0
- package/dist/tools/file/WriteFileTool.js.map +1 -1
- package/dist/tools/hackmd/CreateNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/CreateNoteTool.js +22 -3
- package/dist/tools/hackmd/CreateNoteTool.js.map +1 -1
- package/dist/tools/hackmd/DeleteNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/DeleteNoteTool.js +16 -6
- package/dist/tools/hackmd/DeleteNoteTool.js.map +1 -1
- package/dist/tools/hackmd/UpdateNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/UpdateNoteTool.js +29 -10
- package/dist/tools/hackmd/UpdateNoteTool.js.map +1 -1
- package/dist/tools/hackmd/index.d.ts.map +1 -1
- package/dist/tools/hackmd/index.js +0 -13
- package/dist/tools/hackmd/index.js.map +1 -1
- package/dist/ui/shell/CommandRegistry.d.ts +1 -0
- package/dist/ui/shell/CommandRegistry.d.ts.map +1 -1
- package/dist/ui/shell/CommandRegistry.js +97 -0
- package/dist/ui/shell/CommandRegistry.js.map +1 -1
- package/dist/ui/shell/InteractiveShell.d.ts +9 -0
- package/dist/ui/shell/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/shell/InteractiveShell.js +33 -0
- package/dist/ui/shell/InteractiveShell.js.map +1 -1
- package/dist/utils/RateLimiter.d.ts +36 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +62 -0
- package/dist/utils/RateLimiter.js.map +1 -0
- package/dist/utils/retry.d.ts +55 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +97 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Logger } from './Logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rate limiter using sliding window algorithm
|
|
4
|
+
* Prevents excessive API calls within a time window
|
|
5
|
+
*/
|
|
6
|
+
export class RateLimiter {
|
|
7
|
+
maxRequests;
|
|
8
|
+
windowMs;
|
|
9
|
+
requests = [];
|
|
10
|
+
/**
|
|
11
|
+
* @param maxRequests - Maximum number of requests allowed
|
|
12
|
+
* @param windowMs - Time window in milliseconds
|
|
13
|
+
*/
|
|
14
|
+
constructor(maxRequests, windowMs) {
|
|
15
|
+
this.maxRequests = maxRequests;
|
|
16
|
+
this.windowMs = windowMs;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Acquire permission to make a request
|
|
20
|
+
* Will wait if rate limit is exceeded
|
|
21
|
+
*/
|
|
22
|
+
async acquire() {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
// Remove requests outside the current window
|
|
25
|
+
this.requests = this.requests.filter(t => now - t < this.windowMs);
|
|
26
|
+
if (this.requests.length >= this.maxRequests) {
|
|
27
|
+
const oldestRequest = this.requests[0];
|
|
28
|
+
const waitTime = this.windowMs - (now - oldestRequest);
|
|
29
|
+
Logger.debug('RateLimiter', `Rate limit reached, waiting ${waitTime}ms`, { maxRequests: this.maxRequests, windowMs: this.windowMs });
|
|
30
|
+
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
31
|
+
return this.acquire(); // Retry after waiting
|
|
32
|
+
}
|
|
33
|
+
this.requests.push(now);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if a request can be made without waiting
|
|
37
|
+
*/
|
|
38
|
+
canAcquire() {
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
this.requests = this.requests.filter(t => now - t < this.windowMs);
|
|
41
|
+
return this.requests.length < this.maxRequests;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get current usage statistics
|
|
45
|
+
*/
|
|
46
|
+
getStats() {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
this.requests = this.requests.filter(t => now - t < this.windowMs);
|
|
49
|
+
return {
|
|
50
|
+
current: this.requests.length,
|
|
51
|
+
max: this.maxRequests,
|
|
52
|
+
windowMs: this.windowMs,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reset the rate limiter
|
|
57
|
+
*/
|
|
58
|
+
reset() {
|
|
59
|
+
this.requests = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/utils/RateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,OAAO,WAAW;IAQZ;IACA;IARF,QAAQ,GAAa,EAAE,CAAC;IAEhC;;;OAGG;IACH,YACU,WAAmB,EACnB,QAAgB;QADhB,gBAAW,GAAX,WAAW,CAAQ;QACnB,aAAQ,GAAR,QAAQ,CAAQ;IACvB,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,6CAA6C;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;YAEvD,MAAM,CAAC,KAAK,CACV,aAAa,EACb,+BAA+B,QAAQ,IAAI,EAC3C,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC3D,CAAC;YAEF,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,sBAAsB;QAC/C,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC7B,GAAG,EAAE,IAAI,CAAC,WAAW;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Maximum number of retry attempts (default: 3)
|
|
4
|
+
*/
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
/**
|
|
7
|
+
* Initial delay in milliseconds (default: 1000)
|
|
8
|
+
*/
|
|
9
|
+
delayMs?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Whether to use exponential backoff (default: true)
|
|
12
|
+
*/
|
|
13
|
+
backoff?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Maximum delay in milliseconds for exponential backoff (default: 30000)
|
|
16
|
+
*/
|
|
17
|
+
maxDelayMs?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Function to determine if error is retryable (default: all errors are retryable)
|
|
20
|
+
*/
|
|
21
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Callback called before each retry
|
|
24
|
+
*/
|
|
25
|
+
onRetry?: (error: unknown, attempt: number) => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute a function with automatic retry on failure
|
|
29
|
+
*
|
|
30
|
+
* @param fn - The async function to execute
|
|
31
|
+
* @param options - Retry configuration options
|
|
32
|
+
* @returns Promise resolving to the function result
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const result = await withRetry(
|
|
37
|
+
* () => fetch('https://api.example.com/data'),
|
|
38
|
+
* { maxRetries: 3, backoff: true }
|
|
39
|
+
* );
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if an error is a network error that should be retried
|
|
45
|
+
*/
|
|
46
|
+
export declare function isNetworkError(error: unknown): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Check if an HTTP status code is retryable
|
|
49
|
+
*/
|
|
50
|
+
export declare function isRetryableStatusCode(status: number): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Create a retry predicate for HTTP errors
|
|
53
|
+
*/
|
|
54
|
+
export declare function shouldRetryHttpError(error: unknown): boolean;
|
|
55
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAE1C;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAqDZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAS7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgB5D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Logger } from './Logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute a function with automatic retry on failure
|
|
4
|
+
*
|
|
5
|
+
* @param fn - The async function to execute
|
|
6
|
+
* @param options - Retry configuration options
|
|
7
|
+
* @returns Promise resolving to the function result
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const result = await withRetry(
|
|
12
|
+
* () => fetch('https://api.example.com/data'),
|
|
13
|
+
* { maxRetries: 3, backoff: true }
|
|
14
|
+
* );
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export async function withRetry(fn, options = {}) {
|
|
18
|
+
const { maxRetries = 3, delayMs = 1000, backoff = true, maxDelayMs = 30000, shouldRetry = () => true, onRetry, } = options;
|
|
19
|
+
let lastError;
|
|
20
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
21
|
+
try {
|
|
22
|
+
return await fn();
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
lastError = error;
|
|
26
|
+
// Check if we should retry this error
|
|
27
|
+
if (!shouldRetry(error)) {
|
|
28
|
+
Logger.debug('Retry', 'Error is not retryable, throwing immediately');
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
// If this was the last attempt, throw the error
|
|
32
|
+
if (attempt === maxRetries) {
|
|
33
|
+
Logger.debug('Retry', `Max retries (${maxRetries}) reached, throwing error`);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
// Calculate delay with exponential backoff
|
|
37
|
+
const delay = backoff
|
|
38
|
+
? Math.min(delayMs * Math.pow(2, attempt), maxDelayMs)
|
|
39
|
+
: delayMs;
|
|
40
|
+
Logger.debug('Retry', `Attempt ${attempt + 1}/${maxRetries} failed, retrying in ${delay}ms`, { error: error instanceof Error ? error.message : String(error) });
|
|
41
|
+
// Call onRetry callback if provided
|
|
42
|
+
if (onRetry) {
|
|
43
|
+
onRetry(error, attempt + 1);
|
|
44
|
+
}
|
|
45
|
+
// Wait before retrying
|
|
46
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// This should never be reached, but TypeScript needs it
|
|
50
|
+
throw lastError;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if an error is a network error that should be retried
|
|
54
|
+
*/
|
|
55
|
+
export function isNetworkError(error) {
|
|
56
|
+
if (error instanceof Error) {
|
|
57
|
+
const message = error.message.toLowerCase();
|
|
58
|
+
return (message.includes('network') ||
|
|
59
|
+
message.includes('timeout') ||
|
|
60
|
+
message.includes('econnrefused') ||
|
|
61
|
+
message.includes('enotfound') ||
|
|
62
|
+
message.includes('etimedout'));
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if an HTTP status code is retryable
|
|
68
|
+
*/
|
|
69
|
+
export function isRetryableStatusCode(status) {
|
|
70
|
+
// Retry on:
|
|
71
|
+
// - 408 Request Timeout
|
|
72
|
+
// - 429 Too Many Requests
|
|
73
|
+
// - 500 Internal Server Error
|
|
74
|
+
// - 502 Bad Gateway
|
|
75
|
+
// - 503 Service Unavailable
|
|
76
|
+
// - 504 Gateway Timeout
|
|
77
|
+
return [408, 429, 500, 502, 503, 504].includes(status);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a retry predicate for HTTP errors
|
|
81
|
+
*/
|
|
82
|
+
export function shouldRetryHttpError(error) {
|
|
83
|
+
// Check for network errors
|
|
84
|
+
if (isNetworkError(error)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
// Check for HTTP status codes
|
|
88
|
+
if (error && typeof error === 'object' && 'response' in error) {
|
|
89
|
+
const response = error.response;
|
|
90
|
+
if (response?.status) {
|
|
91
|
+
return isRetryableStatusCode(response.status);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Don't retry by default for unknown errors
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hackwriter",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Writing agent for HackMD",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"@ai-sdk/openai": "^3.0.12",
|
|
33
33
|
"@hackmd/api": "^2.5.0",
|
|
34
34
|
"@inquirer/prompts": "^8.0.1",
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
35
36
|
"ai": "^6.0.39",
|
|
36
37
|
"chalk": "^5.6.2",
|
|
37
38
|
"commander": "^14.0.2",
|