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.
Files changed (104) hide show
  1. package/README.md +29 -59
  2. package/dist/agent/CompactionPrompt.d.ts +0 -7
  3. package/dist/agent/CompactionPrompt.d.ts.map +1 -1
  4. package/dist/agent/CompactionPrompt.js +1 -1
  5. package/dist/agent/CompactionPrompt.js.map +1 -1
  6. package/dist/agent/ConversationContext.d.ts +9 -0
  7. package/dist/agent/ConversationContext.d.ts.map +1 -1
  8. package/dist/agent/ConversationContext.js +16 -1
  9. package/dist/agent/ConversationContext.js.map +1 -1
  10. package/dist/agent/ModelFactory.d.ts.map +1 -1
  11. package/dist/agent/ModelFactory.js +4 -1
  12. package/dist/agent/ModelFactory.js.map +1 -1
  13. package/dist/cli.js +38 -0
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/setup.d.ts.map +1 -1
  16. package/dist/commands/setup.js +73 -22
  17. package/dist/commands/setup.js.map +1 -1
  18. package/dist/config/ConfigSchema.d.ts +2 -36
  19. package/dist/config/ConfigSchema.d.ts.map +1 -1
  20. package/dist/config/ConfigSchema.js +5 -11
  21. package/dist/config/ConfigSchema.js.map +1 -1
  22. package/dist/config/ConfigurationLoader.d.ts.map +1 -1
  23. package/dist/config/ConfigurationLoader.js +41 -6
  24. package/dist/config/ConfigurationLoader.js.map +1 -1
  25. package/dist/config/HackMDConfigLoader.d.ts +20 -0
  26. package/dist/config/HackMDConfigLoader.d.ts.map +1 -0
  27. package/dist/config/HackMDConfigLoader.js +51 -0
  28. package/dist/config/HackMDConfigLoader.js.map +1 -0
  29. package/dist/config/OpenAIDiscovery.d.ts.map +1 -1
  30. package/dist/config/OpenAIDiscovery.js +4 -1
  31. package/dist/config/OpenAIDiscovery.js.map +1 -1
  32. package/dist/config/ProviderRegistry.d.ts +2 -3
  33. package/dist/config/ProviderRegistry.d.ts.map +1 -1
  34. package/dist/config/ProviderRegistry.js +0 -6
  35. package/dist/config/ProviderRegistry.js.map +1 -1
  36. package/dist/config/constants.d.ts +6 -6
  37. package/dist/config/constants.d.ts.map +1 -1
  38. package/dist/config/constants.js +7 -8
  39. package/dist/config/constants.js.map +1 -1
  40. package/dist/mcp/MCPClient.d.ts +13 -2
  41. package/dist/mcp/MCPClient.d.ts.map +1 -1
  42. package/dist/mcp/MCPClient.js +58 -7
  43. package/dist/mcp/MCPClient.js.map +1 -1
  44. package/dist/mcp/MCPToolAdapter.d.ts +2 -1
  45. package/dist/mcp/MCPToolAdapter.d.ts.map +1 -1
  46. package/dist/mcp/index.d.ts +1 -1
  47. package/dist/mcp/index.d.ts.map +1 -1
  48. package/dist/mcp/index.js.map +1 -1
  49. package/dist/messaging/MessageBus.d.ts +6 -1
  50. package/dist/messaging/MessageBus.d.ts.map +1 -1
  51. package/dist/messaging/MessageBus.js +6 -0
  52. package/dist/messaging/MessageBus.js.map +1 -1
  53. package/dist/tools/base/Tool.d.ts +0 -1
  54. package/dist/tools/base/Tool.d.ts.map +1 -1
  55. package/dist/tools/base/Tool.js.map +1 -1
  56. package/dist/tools/file/ListFilesTool.d.ts.map +1 -1
  57. package/dist/tools/file/ListFilesTool.js +10 -8
  58. package/dist/tools/file/ListFilesTool.js.map +1 -1
  59. package/dist/tools/file/ReadFileTool.d.ts.map +1 -1
  60. package/dist/tools/file/ReadFileTool.js +9 -8
  61. package/dist/tools/file/ReadFileTool.js.map +1 -1
  62. package/dist/tools/file/WriteFileTool.d.ts.map +1 -1
  63. package/dist/tools/file/WriteFileTool.js +9 -7
  64. package/dist/tools/file/WriteFileTool.js.map +1 -1
  65. package/dist/ui/shell/InteractiveShell.d.ts +6 -1
  66. package/dist/ui/shell/InteractiveShell.d.ts.map +1 -1
  67. package/dist/ui/shell/InteractiveShell.js +10 -0
  68. package/dist/ui/shell/InteractiveShell.js.map +1 -1
  69. package/dist/utils/AsyncPackageLoader.d.ts +29 -0
  70. package/dist/utils/AsyncPackageLoader.d.ts.map +1 -0
  71. package/dist/utils/AsyncPackageLoader.js +56 -0
  72. package/dist/utils/AsyncPackageLoader.js.map +1 -0
  73. package/dist/utils/BatchWriter.d.ts +42 -0
  74. package/dist/utils/BatchWriter.d.ts.map +1 -0
  75. package/dist/utils/BatchWriter.js +130 -0
  76. package/dist/utils/BatchWriter.js.map +1 -0
  77. package/dist/utils/Logger.d.ts.map +1 -1
  78. package/dist/utils/Logger.js +14 -4
  79. package/dist/utils/Logger.js.map +1 -1
  80. package/dist/utils/PathValidator.d.ts +35 -0
  81. package/dist/utils/PathValidator.d.ts.map +1 -0
  82. package/dist/utils/PathValidator.js +70 -0
  83. package/dist/utils/PathValidator.js.map +1 -0
  84. package/dist/utils/RateLimiter.d.ts +3 -1
  85. package/dist/utils/RateLimiter.d.ts.map +1 -1
  86. package/dist/utils/RateLimiter.js +9 -24
  87. package/dist/utils/RateLimiter.js.map +1 -1
  88. package/dist/utils/ResourceManager.d.ts +7 -0
  89. package/dist/utils/ResourceManager.d.ts.map +1 -0
  90. package/dist/utils/ResourceManager.js +2 -0
  91. package/dist/utils/ResourceManager.js.map +1 -0
  92. package/dist/utils/RetryPolicy.d.ts +29 -0
  93. package/dist/utils/RetryPolicy.d.ts.map +1 -0
  94. package/dist/utils/RetryPolicy.js +73 -0
  95. package/dist/utils/RetryPolicy.js.map +1 -0
  96. package/dist/utils/SensitiveDataRedactor.d.ts +40 -0
  97. package/dist/utils/SensitiveDataRedactor.d.ts.map +1 -0
  98. package/dist/utils/SensitiveDataRedactor.js +122 -0
  99. package/dist/utils/SensitiveDataRedactor.js.map +1 -0
  100. package/dist/utils/SlidingWindowRateLimiter.d.ts +36 -0
  101. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  102. package/dist/utils/SlidingWindowRateLimiter.js +74 -0
  103. package/dist/utils/SlidingWindowRateLimiter.js.map +1 -0
  104. package/package.json +5 -3
@@ -0,0 +1,74 @@
1
+ import { Logger } from './Logger.js';
2
+ /**
3
+ * Optimized rate limiter using sliding window algorithm
4
+ * More efficient than filtering entire array on every request
5
+ */
6
+ export class SlidingWindowRateLimiter {
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
+ const windowStart = now - this.windowMs;
25
+ // Remove expired entries from the front (O(1) amortized)
26
+ while (this.requests.length > 0 && this.requests[0] < windowStart) {
27
+ this.requests.shift();
28
+ }
29
+ if (this.requests.length >= this.maxRequests) {
30
+ const oldestRequest = this.requests[0];
31
+ const waitTime = this.windowMs - (now - oldestRequest);
32
+ Logger.debug('SlidingWindowRateLimiter', `Rate limit reached, waiting ${waitTime}ms`, { maxRequests: this.maxRequests, windowMs: this.windowMs });
33
+ await new Promise(resolve => setTimeout(resolve, waitTime));
34
+ return this.acquire(); // Retry after waiting
35
+ }
36
+ // Add new request timestamp (maintains chronological order)
37
+ this.requests.push(now);
38
+ }
39
+ /**
40
+ * Check if a request can be made without waiting
41
+ */
42
+ canAcquire() {
43
+ const now = Date.now();
44
+ const windowStart = now - this.windowMs;
45
+ // Remove expired entries
46
+ while (this.requests.length > 0 && this.requests[0] < windowStart) {
47
+ this.requests.shift();
48
+ }
49
+ return this.requests.length < this.maxRequests;
50
+ }
51
+ /**
52
+ * Get current usage statistics
53
+ */
54
+ getStats() {
55
+ const now = Date.now();
56
+ const windowStart = now - this.windowMs;
57
+ // Remove expired entries
58
+ while (this.requests.length > 0 && this.requests[0] < windowStart) {
59
+ this.requests.shift();
60
+ }
61
+ return {
62
+ current: this.requests.length,
63
+ max: this.maxRequests,
64
+ windowMs: this.windowMs,
65
+ };
66
+ }
67
+ /**
68
+ * Reset the rate limiter
69
+ */
70
+ reset() {
71
+ this.requests = [];
72
+ }
73
+ }
74
+ //# sourceMappingURL=SlidingWindowRateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlidingWindowRateLimiter.js","sourceRoot":"","sources":["../../src/utils/SlidingWindowRateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAQzB;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;QACvB,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExC,yDAAyD;QACzD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,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,0BAA0B,EAC1B,+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,4DAA4D;QAC5D,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,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExC,yBAAyB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,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,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExC,yBAAyB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackwriter",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "Writing agent for HackMD",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
@@ -38,7 +38,6 @@
38
38
  "commander": "^14.0.2",
39
39
  "ollama-ai-provider-v2": "^3.0.1",
40
40
  "ora": "^9.0.0",
41
- "uuid": "^13.0.0",
42
41
  "zod": "^4.1.13"
43
42
  },
44
43
  "devDependencies": {
@@ -48,6 +47,7 @@
48
47
  "@vitest/coverage-v8": "^4.0.13",
49
48
  "@vitest/ui": "^4.0.13",
50
49
  "eslint": "^9.39.1",
50
+ "knip": "^5.82.1",
51
51
  "tsx": "^4.20.6",
52
52
  "typescript": "^5.9.3",
53
53
  "typescript-eslint": "^8.47.0",
@@ -61,8 +61,10 @@
61
61
  "dev": "tsx src/cli.ts",
62
62
  "start": "node dist/cli.js",
63
63
  "typecheck": "tsc --noEmit",
64
+ "lint": "eslint --fix",
65
+ "knip": "knip --fix",
64
66
  "test": "vitest run",
65
- "lint": "eslint . --fix",
67
+ "check": "pnpm run typecheck && pnpm run lint && pnpm run knip",
66
68
  "release": "pnpx standard-version && git push --follow-tags && pnpm publish"
67
69
  }
68
70
  }