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.
Files changed (80) hide show
  1. package/dist/agent/AgentExecutor.d.ts.map +1 -1
  2. package/dist/agent/AgentExecutor.js +19 -4
  3. package/dist/agent/AgentExecutor.js.map +1 -1
  4. package/dist/cli.js +87 -22
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/setup.d.ts.map +1 -1
  7. package/dist/commands/setup.js +4 -3
  8. package/dist/commands/setup.js.map +1 -1
  9. package/dist/config/ConfigSchema.d.ts +6 -4
  10. package/dist/config/ConfigSchema.d.ts.map +1 -1
  11. package/dist/config/ConfigSchema.js +3 -2
  12. package/dist/config/ConfigSchema.js.map +1 -1
  13. package/dist/config/Configuration.d.ts +2 -1
  14. package/dist/config/Configuration.d.ts.map +1 -1
  15. package/dist/config/ConfigurationLoader.d.ts.map +1 -1
  16. package/dist/config/ConfigurationLoader.js +27 -14
  17. package/dist/config/ConfigurationLoader.js.map +1 -1
  18. package/dist/config/ProviderRegistry.d.ts.map +1 -1
  19. package/dist/config/ProviderRegistry.js +1 -11
  20. package/dist/config/ProviderRegistry.js.map +1 -1
  21. package/dist/config/constants.d.ts +22 -0
  22. package/dist/config/constants.d.ts.map +1 -0
  23. package/dist/config/constants.js +30 -0
  24. package/dist/config/constants.js.map +1 -0
  25. package/dist/mcp/MCPClient.d.ts +56 -0
  26. package/dist/mcp/MCPClient.d.ts.map +1 -0
  27. package/dist/mcp/MCPClient.js +134 -0
  28. package/dist/mcp/MCPClient.js.map +1 -0
  29. package/dist/mcp/MCPToolAdapter.d.ts +28 -0
  30. package/dist/mcp/MCPToolAdapter.d.ts.map +1 -0
  31. package/dist/mcp/MCPToolAdapter.js +91 -0
  32. package/dist/mcp/MCPToolAdapter.js.map +1 -0
  33. package/dist/mcp/index.d.ts +3 -0
  34. package/dist/mcp/index.d.ts.map +1 -0
  35. package/dist/mcp/index.js +3 -0
  36. package/dist/mcp/index.js.map +1 -0
  37. package/dist/session/SessionManager.d.ts.map +1 -1
  38. package/dist/session/SessionManager.js +2 -1
  39. package/dist/session/SessionManager.js.map +1 -1
  40. package/dist/tools/base/ToolRegistry.d.ts +13 -4
  41. package/dist/tools/base/ToolRegistry.d.ts.map +1 -1
  42. package/dist/tools/base/ToolRegistry.js.map +1 -1
  43. package/dist/tools/file/ListFilesTool.d.ts.map +1 -1
  44. package/dist/tools/file/ListFilesTool.js +19 -3
  45. package/dist/tools/file/ListFilesTool.js.map +1 -1
  46. package/dist/tools/file/ReadFileTool.d.ts.map +1 -1
  47. package/dist/tools/file/ReadFileTool.js +20 -0
  48. package/dist/tools/file/ReadFileTool.js.map +1 -1
  49. package/dist/tools/file/WriteFileTool.d.ts.map +1 -1
  50. package/dist/tools/file/WriteFileTool.js +15 -0
  51. package/dist/tools/file/WriteFileTool.js.map +1 -1
  52. package/dist/tools/hackmd/CreateNoteTool.d.ts.map +1 -1
  53. package/dist/tools/hackmd/CreateNoteTool.js +22 -3
  54. package/dist/tools/hackmd/CreateNoteTool.js.map +1 -1
  55. package/dist/tools/hackmd/DeleteNoteTool.d.ts.map +1 -1
  56. package/dist/tools/hackmd/DeleteNoteTool.js +16 -6
  57. package/dist/tools/hackmd/DeleteNoteTool.js.map +1 -1
  58. package/dist/tools/hackmd/UpdateNoteTool.d.ts.map +1 -1
  59. package/dist/tools/hackmd/UpdateNoteTool.js +29 -10
  60. package/dist/tools/hackmd/UpdateNoteTool.js.map +1 -1
  61. package/dist/tools/hackmd/index.d.ts.map +1 -1
  62. package/dist/tools/hackmd/index.js +0 -13
  63. package/dist/tools/hackmd/index.js.map +1 -1
  64. package/dist/ui/shell/CommandRegistry.d.ts +1 -0
  65. package/dist/ui/shell/CommandRegistry.d.ts.map +1 -1
  66. package/dist/ui/shell/CommandRegistry.js +97 -0
  67. package/dist/ui/shell/CommandRegistry.js.map +1 -1
  68. package/dist/ui/shell/InteractiveShell.d.ts +9 -0
  69. package/dist/ui/shell/InteractiveShell.d.ts.map +1 -1
  70. package/dist/ui/shell/InteractiveShell.js +33 -0
  71. package/dist/ui/shell/InteractiveShell.js.map +1 -1
  72. package/dist/utils/RateLimiter.d.ts +36 -0
  73. package/dist/utils/RateLimiter.d.ts.map +1 -0
  74. package/dist/utils/RateLimiter.js +62 -0
  75. package/dist/utils/RateLimiter.js.map +1 -0
  76. package/dist/utils/retry.d.ts +55 -0
  77. package/dist/utils/retry.d.ts.map +1 -0
  78. package/dist/utils/retry.js +97 -0
  79. package/dist/utils/retry.js.map +1 -0
  80. 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.7",
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",